backlog 0.37.2 → 0.41.4

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 (568) hide show
  1. checksums.yaml +7 -0
  2. data/History.txt +128 -0
  3. data/README.txt +4 -2
  4. data/bin/backlog +1 -1
  5. data/lib/array_helper.rb +4 -4
  6. data/{vendor/plugins → lib}/backlog_jira/README +0 -0
  7. data/{vendor/plugins → lib}/backlog_jira/Rakefile +0 -0
  8. data/{vendor/plugins → lib}/backlog_jira/generators/backlog_jira/backlog_jira_generator.rb +0 -0
  9. data/{vendor/plugins → lib}/backlog_jira/generators/backlog_jira/templates/migration.rb +0 -0
  10. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/history_model_generator.rb +0 -0
  11. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/fixtures.yml +0 -0
  12. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/functional_test.rb +0 -0
  13. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/model.rb +0 -0
  14. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/unit_test.rb +0 -0
  15. data/lib/backlog_jira/init.rb +66 -0
  16. data/{vendor/plugins → lib}/backlog_jira/install.rb +0 -0
  17. data/{vendor/plugins → lib}/backlog_jira/lib/backlog_jira.rb +0 -0
  18. data/{vendor/plugins → lib}/backlog_jira/lib/tasks/backlog_jira_tasks.rake +0 -0
  19. data/{vendor/plugins → lib}/backlog_jira/test/backlog_jira_test.rb +0 -0
  20. data/{vendor/plugins → lib}/backlog_jira/uninstall.rb +0 -0
  21. data/lib/big_decimal_yaml_fix.rb +16 -25
  22. data/lib/tasks/backup.rake +18 -18
  23. data/lib/time_extras.rb +6 -6
  24. data/lib/user_system.rb +41 -38
  25. data/lib/version_from_history.rb +2 -2
  26. metadata +196 -749
  27. data/Capfile +0 -2
  28. data/Gemfile +0 -34
  29. data/Gemfile.lock +0 -139
  30. data/MODIFICATIONS.txt +0 -13
  31. data/Manifest.txt +0 -0
  32. data/README_LOGIN_SUGAR +0 -194
  33. data/Rakefile +0 -73
  34. data/Rakefile~ +0 -73
  35. data/Screenshot.png +0 -0
  36. data/app/controllers/absences_controller.rb +0 -67
  37. data/app/controllers/application_controller.rb +0 -185
  38. data/app/controllers/application_controller.rb.rails2 +0 -186
  39. data/app/controllers/customers_controller.rb +0 -51
  40. data/app/controllers/dashboard_controller.rb +0 -17
  41. data/app/controllers/estimates_controller.rb +0 -49
  42. data/app/controllers/groups_controller.rb +0 -65
  43. data/app/controllers/parties_controller.rb +0 -33
  44. data/app/controllers/periods_controller.rb +0 -242
  45. data/app/controllers/projects_controller.rb +0 -185
  46. data/app/controllers/public_holidays_controller.rb +0 -70
  47. data/app/controllers/search_controller.rb +0 -15
  48. data/app/controllers/task_files_controller.rb +0 -19
  49. data/app/controllers/tasks_controller.rb +0 -305
  50. data/app/controllers/user_controller.rb +0 -251
  51. data/app/controllers/welcome_controller.rb +0 -29
  52. data/app/controllers/work_locks_controller.rb +0 -88
  53. data/app/controllers/works_controller.rb +0 -383
  54. data/app/helpers/absences_helper.rb +0 -2
  55. data/app/helpers/application_helper.rb +0 -119
  56. data/app/helpers/application_helper.rb.rails2 +0 -118
  57. data/app/helpers/customers_helper.rb +0 -2
  58. data/app/helpers/dashboard_helper.rb +0 -2
  59. data/app/helpers/estimates_helper.rb +0 -2
  60. data/app/helpers/groups_helper.rb +0 -2
  61. data/app/helpers/parties_helper.rb +0 -2
  62. data/app/helpers/periods_helper.rb +0 -57
  63. data/app/helpers/projects_helper.rb +0 -74
  64. data/app/helpers/public_holidays_helper.rb +0 -2
  65. data/app/helpers/search_helper.rb +0 -2
  66. data/app/helpers/task_files_helper.rb +0 -2
  67. data/app/helpers/tasks_helper.rb +0 -2
  68. data/app/helpers/user_helper.rb +0 -53
  69. data/app/helpers/welcome_helper.rb +0 -2
  70. data/app/helpers/work_locks_helper.rb +0 -2
  71. data/app/helpers/works_helper.rb +0 -5
  72. data/app/mailers/user_notify.rb +0 -76
  73. data/app/models/absence.rb +0 -27
  74. data/app/models/chart.rb +0 -5
  75. data/app/models/clock.rb +0 -14
  76. data/app/models/configuration.rb +0 -2
  77. data/app/models/customer.rb +0 -2
  78. data/app/models/estimate.rb +0 -17
  79. data/app/models/group.rb +0 -16
  80. data/app/models/party.rb +0 -27
  81. data/app/models/period.rb +0 -251
  82. data/app/models/project.rb +0 -49
  83. data/app/models/public_holiday.rb +0 -13
  84. data/app/models/report_filter.rb +0 -29
  85. data/app/models/search_result.rb +0 -8
  86. data/app/models/sidebar.rb +0 -41
  87. data/app/models/task.rb +0 -425
  88. data/app/models/task_file.rb +0 -7
  89. data/app/models/task_notify.rb +0 -27
  90. data/app/models/user.rb +0 -146
  91. data/app/models/work.rb +0 -191
  92. data/app/models/work_lock.rb +0 -11
  93. data/app/models/work_lock_nagger.rb +0 -60
  94. data/app/models/work_lock_notify.rb +0 -43
  95. data/app/models/works_report_filter.rb +0 -27
  96. data/app/views/absences/_form.rhtml +0 -10
  97. data/app/views/absences/edit.rhtml +0 -9
  98. data/app/views/absences/list.rhtml +0 -25
  99. data/app/views/absences/new.rhtml +0 -8
  100. data/app/views/absences/show.rhtml +0 -8
  101. data/app/views/customers/_form.rhtml +0 -7
  102. data/app/views/customers/_name_list.rhtml +0 -5
  103. data/app/views/customers/edit.rhtml +0 -9
  104. data/app/views/customers/list.rhtml +0 -28
  105. data/app/views/customers/new.rhtml +0 -8
  106. data/app/views/customers/show.rhtml +0 -8
  107. data/app/views/dashboard/show.rhtml +0 -24
  108. data/app/views/display_notice.rjs +0 -1
  109. data/app/views/groups/_form.rhtml +0 -7
  110. data/app/views/groups/edit.rhtml +0 -57
  111. data/app/views/groups/list.rhtml +0 -26
  112. data/app/views/groups/new.rhtml +0 -7
  113. data/app/views/groups/set_member.rjs +0 -1
  114. data/app/views/layouts/_headers.rhtml +0 -24
  115. data/app/views/layouts/_left_top.rhtml +0 -33
  116. data/app/views/layouts/_notice.rhtml +0 -12
  117. data/app/views/layouts/_shortcuts.rhtml +0 -22
  118. data/app/views/layouts/_shortcuts_js.rhtml +0 -19
  119. data/app/views/layouts/mwrt002.html.erb +0 -44
  120. data/app/views/layouts/wide.rhtml +0 -23
  121. data/app/views/periods/_burn_down_chart.rhtml +0 -9
  122. data/app/views/periods/_form.rhtml +0 -74
  123. data/app/views/periods/_link.rhtml +0 -3
  124. data/app/views/periods/_show_active.rhtml +0 -61
  125. data/app/views/periods/_sidebar_block.rhtml +0 -11
  126. data/app/views/periods/_title.rhtml +0 -18
  127. data/app/views/periods/edit.rhtml +0 -10
  128. data/app/views/periods/finish_task.rjs +0 -4
  129. data/app/views/periods/move_task_to_period.rjs +0 -4
  130. data/app/views/periods/new.rhtml +0 -9
  131. data/app/views/periods/order.rjs +0 -0
  132. data/app/views/periods/reopen_task.rjs +0 -6
  133. data/app/views/periods/show.rhtml +0 -56
  134. data/app/views/projects/_buttons.rhtml +0 -4
  135. data/app/views/projects/_form.rhtml +0 -44
  136. data/app/views/projects/_name_list.rhtml +0 -5
  137. data/app/views/projects/edit.rhtml +0 -14
  138. data/app/views/projects/finish_task.rjs +0 -3
  139. data/app/views/projects/list.rhtml +0 -16
  140. data/app/views/projects/move_task_to_period.rjs +0 -3
  141. data/app/views/projects/new.rhtml +0 -11
  142. data/app/views/projects/reopen_task.rjs +0 -3
  143. data/app/views/projects/show.rhtml +0 -39
  144. data/app/views/public_holidays/_form.rhtml +0 -7
  145. data/app/views/public_holidays/edit.rhtml +0 -9
  146. data/app/views/public_holidays/list.rhtml +0 -25
  147. data/app/views/public_holidays/new.rhtml +0 -8
  148. data/app/views/public_holidays/show.rhtml +0 -8
  149. data/app/views/redirect.rjs +0 -1
  150. data/app/views/search/results.rhtml +0 -40
  151. data/app/views/task_notify/invite.en.html.erb +0 -13
  152. data/app/views/task_notify/invite.no.html.erb +0 -13
  153. data/app/views/tasks/_backlog_header.rhtml +0 -17
  154. data/app/views/tasks/_completed.rhtml +0 -18
  155. data/app/views/tasks/_fields_header.rhtml +0 -13
  156. data/app/views/tasks/_form.rhtml +0 -125
  157. data/app/views/tasks/_invite.rjs +0 -1
  158. data/app/views/tasks/_period_header.rhtml +0 -1
  159. data/app/views/tasks/_task.rhtml +0 -116
  160. data/app/views/tasks/_update.rjs +0 -2
  161. data/app/views/tasks/edit.rhtml +0 -81
  162. data/app/views/tasks/grab.rhtml +0 -9
  163. data/app/views/tasks/invite.rhtml +0 -9
  164. data/app/views/tasks/list.rhtml +0 -77
  165. data/app/views/tasks/list_started.rhtml +0 -62
  166. data/app/views/tasks/new.rhtml +0 -10
  167. data/app/views/tasks/notes.rhtml +0 -12
  168. data/app/views/tasks/start_work.rjs +0 -1
  169. data/app/views/tasks/update_estimate.rjs +0 -3
  170. data/app/views/user/_edit.rhtml +0 -31
  171. data/app/views/user/_password.rhtml +0 -21
  172. data/app/views/user/change_password.rhtml +0 -19
  173. data/app/views/user/delete.rhtml +0 -14
  174. data/app/views/user/edit.rhtml +0 -154
  175. data/app/views/user/forgot_password.rhtml +0 -19
  176. data/app/views/user/login.rhtml +0 -33
  177. data/app/views/user/logout.rhtml +0 -8
  178. data/app/views/user/set_group.rjs +0 -1
  179. data/app/views/user/signup.rhtml +0 -15
  180. data/app/views/user/toggle_work_lock_monitoring.rjs +0 -2
  181. data/app/views/user/welcome.rhtml +0 -8
  182. data/app/views/user_notify/change_password.en.html.erb +0 -10
  183. data/app/views/user_notify/change_password.no.html.erb +0 -10
  184. data/app/views/user_notify/forgot_password.en.html.erb +0 -11
  185. data/app/views/user_notify/forgot_password.no.html.erb +0 -11
  186. data/app/views/user_notify/monitoring.en.html.erb +0 -3
  187. data/app/views/user_notify/monitoring.no.html.erb +0 -3
  188. data/app/views/user_notify/monitoring_invitation.en.html.erb +0 -7
  189. data/app/views/user_notify/monitoring_invitation.no.html.erb +0 -7
  190. data/app/views/user_notify/signup.en.html.erb +0 -12
  191. data/app/views/user_notify/signup.no.html.erb +0 -12
  192. data/app/views/work_lock_notify/lock.en.html.erb +0 -7
  193. data/app/views/work_lock_notify/lock.no.html.erb +0 -7
  194. data/app/views/work_lock_notify/nag.en.html.erb +0 -6
  195. data/app/views/work_lock_notify/nag.no.html.erb +0 -7
  196. data/app/views/work_locks/_form.rhtml +0 -10
  197. data/app/views/work_locks/edit.rhtml +0 -9
  198. data/app/views/work_locks/list.rhtml +0 -25
  199. data/app/views/work_locks/new.rhtml +0 -8
  200. data/app/views/work_locks/show.rhtml +0 -8
  201. data/app/views/works/_buttons.rhtml +0 -2
  202. data/app/views/works/_description_list.rhtml +0 -5
  203. data/app/views/works/_form.rhtml +0 -107
  204. data/app/views/works/_new_row.rhtml +0 -141
  205. data/app/views/works/_row.rhtml +0 -115
  206. data/app/views/works/_row_field.rhtml +0 -17
  207. data/app/views/works/_task_id_list.rhtml +0 -5
  208. data/app/views/works/_weekly_work_sheet_buttons.rhtml +0 -22
  209. data/app/views/works/daily_work_sheet.rhtml +0 -108
  210. data/app/views/works/edit.rhtml +0 -11
  211. data/app/views/works/list.rhtml +0 -148
  212. data/app/views/works/list_excel.rhtml +0 -114
  213. data/app/views/works/new.rhtml +0 -12
  214. data/app/views/works/show.rhtml +0 -10
  215. data/app/views/works/timeliste.rhtml +0 -884
  216. data/app/views/works/update_new_row.rjs +0 -28
  217. data/app/views/works/update_row.rjs +0 -18
  218. data/app/views/works/update_time.rjs +0 -3
  219. data/app/views/works/weekly_work_sheet.rhtml +0 -64
  220. data/app/views/works/weekly_work_sheet_details.rhtml +0 -102
  221. data/backlog.gemspec +0 -44
  222. data/config.ru +0 -4
  223. data/config/application.rb +0 -11
  224. data/config/boot.rb +0 -13
  225. data/config/database.yml +0 -15
  226. data/config/database.yml~ +0 -17
  227. data/config/environment.rb +0 -100
  228. data/config/environments/development.rb +0 -30
  229. data/config/environments/development.rb.rails2 +0 -26
  230. data/config/environments/production.rb +0 -33
  231. data/config/environments/test.rb +0 -24
  232. data/config/environments/user_environment.rb +0 -21
  233. data/config/initializers/backtrace_silencers.rb +0 -7
  234. data/config/initializers/inflections.rb +0 -10
  235. data/config/initializers/jdbc.rb +0 -7
  236. data/config/initializers/mime_types.rb +0 -5
  237. data/config/initializers/secret_token.rb +0 -7
  238. data/config/initializers/session_store.rb +0 -8
  239. data/config/locales/en.yml +0 -200
  240. data/config/locales/no.yml +0 -193
  241. data/config/mime_types.yaml +0 -1
  242. data/config/routes.rb +0 -5
  243. data/config/war.rb +0 -27
  244. data/config/warble.rb +0 -84
  245. data/cruise_build.sh +0 -14
  246. data/cruise_config.rb +0 -5
  247. data/db/migrate/001_create_tasks.rb +0 -22
  248. data/db/migrate/003_add_estimation_points.rb +0 -16
  249. data/db/migrate/004_add_period.rb +0 -63
  250. data/db/migrate/005_add_field_work_started_at.rb +0 -9
  251. data/db/migrate/006_works_data_fix.rb +0 -13
  252. data/db/migrate/007_add_task_created_at.rb +0 -23
  253. data/db/migrate/008_add_backlog_options.rb +0 -13
  254. data/db/migrate/009_add_subtasks.rb +0 -29
  255. data/db/migrate/010_add_work_start.rb +0 -9
  256. data/db/migrate/011_login_sugar.rb +0 -21
  257. data/db/migrate/012_add_resolution.rb +0 -12
  258. data/db/migrate/013_create_estimates.rb +0 -20
  259. data/db/migrate/014_add_customer_option.rb +0 -11
  260. data/db/migrate/015_add_user_option.rb +0 -33
  261. data/db/migrate/016_add_invoicable_flag.rb +0 -11
  262. data/db/migrate/017_increase_backlog_name_limit.rb +0 -10
  263. data/db/migrate/018_create_groups.rb +0 -118
  264. data/db/migrate/019_remove_unique_index_for_period_position.rb +0 -9
  265. data/db/migrate/020_create_task_files.rb +0 -17
  266. data/db/migrate/021_create_work_accounts.rb +0 -111
  267. data/db/migrate/022_remove_track_done_flag.rb +0 -9
  268. data/db/migrate/023_add_indices_for_burn_down_chart.rb +0 -13
  269. data/db/migrate/024_add_sprint_option.rb +0 -10
  270. data/db/migrate/025_add_simple_auditing_of_tasks.rb +0 -11
  271. data/db/migrate/026_add_users_to_tasks.rb +0 -14
  272. data/db/migrate/027_create_work_locks.rb +0 -25
  273. data/db/migrate/028_create_absences.rb +0 -34
  274. data/db/migrate/029_add_work_comments.rb +0 -9
  275. data/db/migrate/030_create_public_holidays.rb +0 -11
  276. data/db/migrate/031_expand_work_done_precision.rb +0 -9
  277. data/db/migrate/20100720124707_merge_work_account_into_backlog.rb +0 -74
  278. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb +0 -22
  279. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb~ +0 -22
  280. data/db/schema.rb +0 -159
  281. data/db/seeds.rb +0 -7
  282. data/db/test.db +0 -0
  283. data/etc/backlog.conf +0 -32
  284. data/ext/mkrf_conf.rb +0 -26
  285. data/lib/class_table_inheritance.rb +0 -224
  286. data/lib/postgresql-8.2-504.jdbc4.jar +0 -0
  287. data/lib/tasks/jdbc.rake +0 -8
  288. data/lib/url_for_fix.rb +0 -30
  289. data/nbproject/private/config.properties +0 -0
  290. data/nbproject/private/private.properties +0 -1
  291. data/nbproject/private/private.xml +0 -4
  292. data/nbproject/private/rake-t.txt +0 -95
  293. data/nbproject/project.properties +0 -4
  294. data/nbproject/project.xml +0 -9
  295. data/public/404.html +0 -26
  296. data/public/422.html +0 -26
  297. data/public/500.html +0 -26
  298. data/public/Frav/303/246rsskjema.xls +0 -0
  299. data/public/applets/bsf.jar +0 -0
  300. data/public/applets/jruby.jar +0 -0
  301. data/public/favicon.ico +0 -0
  302. data/public/images/add.png +0 -0
  303. data/public/images/add.svg +0 -70
  304. data/public/images/ajax-loading.gif +0 -0
  305. data/public/images/appunti_architetto_franc_01.svg +0 -92
  306. data/public/images/arrow-down.gif +0 -0
  307. data/public/images/arrow-up.gif +0 -0
  308. data/public/images/arrow07_2.png +0 -0
  309. data/public/images/arrow07_4.png +0 -0
  310. data/public/images/arrow_down.png +0 -0
  311. data/public/images/arrow_down.svg +0 -59
  312. data/public/images/arrow_left.png +0 -0
  313. data/public/images/arrow_left.svg +0 -59
  314. data/public/images/arrow_right.png +0 -0
  315. data/public/images/arrow_right.svg +0 -59
  316. data/public/images/arrow_up.png +0 -0
  317. data/public/images/arrow_up.svg +0 -59
  318. data/public/images/black-70.png +0 -0
  319. data/public/images/black.png +0 -0
  320. data/public/images/blank.jpg +0 -0
  321. data/public/images/blank.png +0 -0
  322. data/public/images/cestino_pieno_architetto_01.svg +0 -470
  323. data/public/images/checkmark.png +0 -0
  324. data/public/images/checkmark_org.png +0 -0
  325. data/public/images/clipboard.png +0 -0
  326. data/public/images/clipboard.svg +0 -62
  327. data/public/images/construction_hammer_jon__01.svg +0 -116
  328. data/public/images/delete.png +0 -0
  329. data/public/images/email.png +0 -0
  330. data/public/images/email_grey.png +0 -0
  331. data/public/images/eraser.png +0 -0
  332. data/public/images/eraser_org.png +0 -0
  333. data/public/images/ernes_stop.png +0 -0
  334. data/public/images/ernes_stop_org.png +0 -0
  335. data/public/images/flag_red.png +0 -0
  336. data/public/images/flag_yellow.png +0 -0
  337. data/public/images/grab.png +0 -0
  338. data/public/images/grab_gray.png +0 -0
  339. data/public/images/group.png +0 -0
  340. data/public/images/hammer.png +0 -0
  341. data/public/images/header.jpg +0 -0
  342. data/public/images/nextlabel.gif +0 -0
  343. data/public/images/pagebak.jpg +0 -0
  344. data/public/images/paper3.svg +0 -54
  345. data/public/images/period.png +0 -0
  346. data/public/images/period_org.png +0 -0
  347. data/public/images/person.org.png +0 -0
  348. data/public/images/prevlabel.gif +0 -0
  349. data/public/images/question.svg +0 -56
  350. data/public/images/rails.png +0 -0
  351. data/public/images/refresh.png +0 -0
  352. data/public/images/rmagick.gif +0 -0
  353. data/public/images/rmagick_270.gif +0 -0
  354. data/public/images/tabella_architetto_franc_01.svg +0 -105
  355. data/public/images/task.png +0 -0
  356. data/public/images/text-x-generic.png +0 -0
  357. data/public/images/user group.png +0 -0
  358. data/public/images/user.png +0 -0
  359. data/public/images/view_fullscreen.png +0 -0
  360. data/public/images/work_account.png +0 -0
  361. data/public/javascripts/application.js +0 -2
  362. data/public/javascripts/builder.js +0 -136
  363. data/public/javascripts/controls.js +0 -965
  364. data/public/javascripts/dragdrop.js +0 -974
  365. data/public/javascripts/effects.js +0 -1123
  366. data/public/javascripts/lightwindow.js +0 -1921
  367. data/public/javascripts/prototype.js +0 -6001
  368. data/public/javascripts/rails.js +0 -175
  369. data/public/javascripts/ruby.js +0 -46
  370. data/public/javascripts/scriptaculous.js +0 -58
  371. data/public/javascripts/slider.js +0 -275
  372. data/public/javascripts/sound.js +0 -55
  373. data/public/javascripts/unittest.js +0 -568
  374. data/public/javascripts/zapatec/utils/transport.js +0 -2217
  375. data/public/javascripts/zapatec/utils/utils.js +0 -1799
  376. data/public/javascripts/zapatec/utils/zapatec.js +0 -90
  377. data/public/javascripts/zapatec/utils/zpeventdriven.js +0 -212
  378. data/public/javascripts/zapatec/utils/zpwidget.js +0 -729
  379. data/public/javascripts/zapatec/zpcal/lang/calendar-no.js +0 -124
  380. data/public/javascripts/zapatec/zpcal/src/calendar-core.js +0 -2878
  381. data/public/javascripts/zapatec/zpcal/src/calendar-date-core.js +0 -348
  382. data/public/javascripts/zapatec/zpcal/src/calendar-setup.js +0 -360
  383. data/public/javascripts/zapatec/zpcal/src/calendar.js +0 -35
  384. data/public/robots.txt +0 -5
  385. data/public/stylesheets/backlog.css +0 -135
  386. data/public/stylesheets/lightwindow.css +0 -376
  387. data/public/stylesheets/mwrt002.css +0 -54
  388. data/public/stylesheets/mwrt002MAC.css +0 -3
  389. data/public/stylesheets/mwrt002NN.css +0 -3
  390. data/public/stylesheets/scaffold.css +0 -74
  391. data/public/stylesheets/user.css +0 -74
  392. data/public/stylesheets/zpcal/themes/green.css +0 -153
  393. data/public/stylesheets/zpcal/themes/layouts/layout-2d.css +0 -134
  394. data/public/stylesheets/zpcal/themes/layouts/layout-common.css +0 -74
  395. data/public/stylesheets/zpcal/themes/menuarrow.gif +0 -0
  396. data/public/stylesheets/zpcal/themes/scroller-down.gif +0 -0
  397. data/public/stylesheets/zpcal/themes/scroller-up.gif +0 -0
  398. data/script/rails +0 -6
  399. data/test/client/login.rb +0 -23
  400. data/test/client/login_test.rb +0 -64
  401. data/test/client/setup.rb +0 -25
  402. data/test/fixtures/absences.yml +0 -11
  403. data/test/fixtures/configurations.yml +0 -5
  404. data/test/fixtures/customers.yml +0 -7
  405. data/test/fixtures/estimates.yml +0 -10
  406. data/test/fixtures/groups.yml +0 -6
  407. data/test/fixtures/groups_users.yml +0 -3
  408. data/test/fixtures/parties.yml +0 -32
  409. data/test/fixtures/periods.yml +0 -24
  410. data/test/fixtures/projects.yml +0 -8
  411. data/test/fixtures/public_holidays.yml +0 -7
  412. data/test/fixtures/task_files.yml +0 -13
  413. data/test/fixtures/tasks.yml +0 -82
  414. data/test/fixtures/users.yml +0 -59
  415. data/test/fixtures/work_lock_subscriptions.yml +0 -7
  416. data/test/fixtures/work_locks.yml +0 -11
  417. data/test/fixtures/works.yml +0 -47
  418. data/test/functional/absences_controller_test.rb +0 -93
  419. data/test/functional/customers_controller_test.rb +0 -93
  420. data/test/functional/dashboard_controller_test.rb +0 -18
  421. data/test/functional/estimates_controller_test.rb +0 -40
  422. data/test/functional/groups_controller_test.rb +0 -120
  423. data/test/functional/parties_controller_test.rb +0 -35
  424. data/test/functional/periods_controller_test.rb +0 -297
  425. data/test/functional/projects_controller_test.rb +0 -152
  426. data/test/functional/public_holidays_controller_test.rb +0 -93
  427. data/test/functional/search_controller_test.rb +0 -24
  428. data/test/functional/task_files_controller_test.rb +0 -29
  429. data/test/functional/tasks_controller_test.rb +0 -229
  430. data/test/functional/user_controller_test.rb +0 -261
  431. data/test/functional/welcome_controller_test.rb +0 -62
  432. data/test/functional/work_locks_controller_test.rb +0 -93
  433. data/test/functional/works_controller_test.rb +0 -220
  434. data/test/integration/user_system_test.rb +0 -95
  435. data/test/mocks/test/clock.rb +0 -14
  436. data/test/performance/browsing_test.rb +0 -9
  437. data/test/performance/common.rb +0 -91
  438. data/test/performance/jetty_test.rb +0 -15
  439. data/test/performance/server_test.rb +0 -17
  440. data/test/test_helper.rb +0 -119
  441. data/test/test_helper.rb~ +0 -121
  442. data/test/unit/absence_test.rb +0 -29
  443. data/test/unit/big_decimal_yaml_fix_test.rb +0 -15
  444. data/test/unit/configuration_test.rb +0 -10
  445. data/test/unit/customer_test.rb +0 -10
  446. data/test/unit/estimate_test.rb +0 -10
  447. data/test/unit/group_test.rb +0 -10
  448. data/test/unit/party_test.rb +0 -10
  449. data/test/unit/period_test.rb +0 -9
  450. data/test/unit/public_holiday_test.rb +0 -10
  451. data/test/unit/task_file_test.rb +0 -10
  452. data/test/unit/task_test.rb +0 -73
  453. data/test/unit/time_of_day_test.rb +0 -23
  454. data/test/unit/user_test.rb +0 -148
  455. data/test/unit/work_lock_subscription_test.rb +0 -10
  456. data/test/unit/work_lock_test.rb +0 -10
  457. data/test/unit/work_test.rb +0 -81
  458. data/vendor/plugins/acts_as_list/README +0 -23
  459. data/vendor/plugins/acts_as_list/init.rb +0 -3
  460. data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +0 -256
  461. data/vendor/plugins/acts_as_list/test/list_test.rb +0 -332
  462. data/vendor/plugins/acts_as_tree/README +0 -26
  463. data/vendor/plugins/acts_as_tree/Rakefile +0 -22
  464. data/vendor/plugins/acts_as_tree/init.rb +0 -1
  465. data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +0 -96
  466. data/vendor/plugins/acts_as_tree/test/abstract_unit.rb +0 -0
  467. data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +0 -219
  468. data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
  469. data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
  470. data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
  471. data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
  472. data/vendor/plugins/assert_cookie/MIT-LICENSE +0 -7
  473. data/vendor/plugins/assert_cookie/README +0 -6
  474. data/vendor/plugins/assert_cookie/Rakefile +0 -21
  475. data/vendor/plugins/assert_cookie/init.rb +0 -1
  476. data/vendor/plugins/assert_cookie/lib/assert_cookie.rb +0 -73
  477. data/vendor/plugins/assert_cookie/meta.yml +0 -7
  478. data/vendor/plugins/assert_cookie/test/test_assert_cookie.rb +0 -124
  479. data/vendor/plugins/assert_cookie/test/test_helper.rb +0 -31
  480. data/vendor/plugins/auto_complete/README +0 -23
  481. data/vendor/plugins/auto_complete/Rakefile +0 -22
  482. data/vendor/plugins/auto_complete/init.rb +0 -2
  483. data/vendor/plugins/auto_complete/lib/auto_complete.rb +0 -47
  484. data/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb +0 -143
  485. data/vendor/plugins/auto_complete/test/auto_complete_test.rb +0 -67
  486. data/vendor/plugins/backlog_jira/init.rb +0 -66
  487. data/vendor/plugins/dynamic_form/MIT-LICENSE +0 -20
  488. data/vendor/plugins/dynamic_form/README +0 -13
  489. data/vendor/plugins/dynamic_form/Rakefile +0 -10
  490. data/vendor/plugins/dynamic_form/dynamic_form.gemspec +0 -12
  491. data/vendor/plugins/dynamic_form/init.rb +0 -1
  492. data/vendor/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb +0 -300
  493. data/vendor/plugins/dynamic_form/lib/action_view/locale/en.yml +0 -8
  494. data/vendor/plugins/dynamic_form/lib/dynamic_form.rb +0 -5
  495. data/vendor/plugins/dynamic_form/test/dynamic_form_i18n_test.rb +0 -42
  496. data/vendor/plugins/dynamic_form/test/dynamic_form_test.rb +0 -370
  497. data/vendor/plugins/dynamic_form/test/test_helper.rb +0 -9
  498. data/vendor/plugins/has_history/README +0 -12
  499. data/vendor/plugins/has_history/Rakefile +0 -22
  500. data/vendor/plugins/has_history/generators/history_migration/history_migration_generator.rb +0 -30
  501. data/vendor/plugins/has_history/generators/history_migration/templates/migration.rb +0 -14
  502. data/vendor/plugins/has_history/generators/history_model/history_model_generator.rb +0 -39
  503. data/vendor/plugins/has_history/generators/history_model/templates/fixtures.yml +0 -17
  504. data/vendor/plugins/has_history/generators/history_model/templates/functional_test.rb +0 -129
  505. data/vendor/plugins/has_history/generators/history_model/templates/migration.rb +0 -14
  506. data/vendor/plugins/has_history/generators/history_model/templates/model.rb +0 -4
  507. data/vendor/plugins/has_history/generators/history_model/templates/unit_test.rb +0 -75
  508. data/vendor/plugins/has_history/init.rb +0 -5
  509. data/vendor/plugins/has_history/install.rb +0 -1
  510. data/vendor/plugins/has_history/lib/has_history.rb +0 -178
  511. data/vendor/plugins/has_history/lib/tasks/has_history_tasks.rake +0 -4
  512. data/vendor/plugins/has_history/test/has_history_test.rb +0 -31
  513. data/vendor/plugins/has_history/test/ignorant_master.rb +0 -3
  514. data/vendor/plugins/has_history/test/ignorant_master_history.rb +0 -4
  515. data/vendor/plugins/has_history/test/lone_master.rb +0 -42
  516. data/vendor/plugins/has_history/test/paired_master.rb +0 -5
  517. data/vendor/plugins/has_history/test/paired_master_history.rb +0 -5
  518. data/vendor/plugins/has_history/test/test_helper.rb +0 -154
  519. data/vendor/plugins/has_history/uninstall.rb +0 -1
  520. data/vendor/plugins/prototype_legacy_helper/lib/prototype_legacy_helper.rb +0 -432
  521. data/vendor/plugins/prototype_legacy_helper/test/test_prototype_helper.rb +0 -297
  522. data/vendor/plugins/rails_time/MIT-LICENSE +0 -20
  523. data/vendor/plugins/rails_time/README +0 -28
  524. data/vendor/plugins/rails_time/init.rb +0 -2
  525. data/vendor/plugins/rails_time/lib/activerecord_time_extension.rb +0 -28
  526. data/vendor/plugins/rails_time/lib/time_of_day.rb +0 -88
  527. data/vendor/plugins/rails_time/test/database.yml +0 -18
  528. data/vendor/plugins/rails_time/test/debug.log +0 -1
  529. data/vendor/plugins/rails_time/test/rails_time_test.rb +0 -122
  530. data/vendor/plugins/rails_time/test/schema.rb +0 -10
  531. data/vendor/plugins/rails_time/test/test_helper.rb +0 -17
  532. data/vendor/plugins/verification/MIT-LICENSE +0 -20
  533. data/vendor/plugins/verification/README +0 -34
  534. data/vendor/plugins/verification/Rakefile +0 -22
  535. data/vendor/plugins/verification/init.rb +0 -3
  536. data/vendor/plugins/verification/lib/action_controller/verification.rb +0 -132
  537. data/vendor/plugins/verification/test/test_helper.rb +0 -18
  538. data/vendor/plugins/verification/test/verification_test.rb +0 -270
  539. data/vendor/plugins/will_paginate/LICENSE +0 -18
  540. data/vendor/plugins/will_paginate/README +0 -138
  541. data/vendor/plugins/will_paginate/Rakefile +0 -27
  542. data/vendor/plugins/will_paginate/init.rb +0 -4
  543. data/vendor/plugins/will_paginate/lib/will_paginate.rb +0 -61
  544. data/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +0 -132
  545. data/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +0 -80
  546. data/vendor/plugins/will_paginate/lib/will_paginate/finder.rb +0 -181
  547. data/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +0 -206
  548. data/vendor/plugins/will_paginate/test/array_pagination_test.rb +0 -131
  549. data/vendor/plugins/will_paginate/test/boot.rb +0 -23
  550. data/vendor/plugins/will_paginate/test/console +0 -9
  551. data/vendor/plugins/will_paginate/test/finder_test.rb +0 -290
  552. data/vendor/plugins/will_paginate/test/fixtures/admin.rb +0 -3
  553. data/vendor/plugins/will_paginate/test/fixtures/developer.rb +0 -11
  554. data/vendor/plugins/will_paginate/test/fixtures/developers_projects.yml +0 -13
  555. data/vendor/plugins/will_paginate/test/fixtures/project.rb +0 -15
  556. data/vendor/plugins/will_paginate/test/fixtures/projects.yml +0 -7
  557. data/vendor/plugins/will_paginate/test/fixtures/replies.yml +0 -34
  558. data/vendor/plugins/will_paginate/test/fixtures/reply.rb +0 -5
  559. data/vendor/plugins/will_paginate/test/fixtures/schema.rb +0 -38
  560. data/vendor/plugins/will_paginate/test/fixtures/topic.rb +0 -4
  561. data/vendor/plugins/will_paginate/test/fixtures/topics.yml +0 -30
  562. data/vendor/plugins/will_paginate/test/fixtures/user.rb +0 -2
  563. data/vendor/plugins/will_paginate/test/fixtures/users.yml +0 -35
  564. data/vendor/plugins/will_paginate/test/helper.rb +0 -25
  565. data/vendor/plugins/will_paginate/test/lib/activerecord_test_case.rb +0 -23
  566. data/vendor/plugins/will_paginate/test/lib/activerecord_test_connector.rb +0 -67
  567. data/vendor/plugins/will_paginate/test/lib/load_fixtures.rb +0 -13
  568. data/vendor/plugins/will_paginate/test/pagination_test.rb +0 -240
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :has_history do
3
- # # Task goes here
4
- # end
@@ -1,31 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
- require 'test/unit'
3
-
4
- class HasHistoryTest < Test::Unit::TestCase
5
- def setup
6
- @lone_master = LoneMaster.new
7
- reset_connection
8
- end
9
-
10
- def test_create
11
- master = PairedMaster.create!
12
- assert_equal 1, inserts.size
13
- assert_equal 0, updates.size
14
- end
15
-
16
- def test_update
17
- master = PairedMaster.create!
18
- master.a = 'b'
19
- master.save!
20
- assert_equal 2, inserts.size, "\n" + inserts.join("\n")
21
- assert_equal 1, updates.size, updates.inspect
22
- end
23
-
24
- def test_no_record_on_no_change_update
25
- master = PairedMaster.create!
26
- master.save!
27
- assert_equal 1, inserts.size, "\n" + inserts.join("\n")
28
- assert_equal 1, updates.size, updates.inspect
29
- end
30
-
31
- end
@@ -1,3 +0,0 @@
1
- class IgnorantMaster < ActiveRecord::Base
2
- abstract_class = true
3
- end
@@ -1,4 +0,0 @@
1
- class IgnorantMasterHistory < ActiveRecord::Base
2
- abstract_class = true
3
- acts_as_history :inject_trigger => true
4
- end
@@ -1,42 +0,0 @@
1
- class LoneMaster < ActiveRecord::Base
2
- abstract_class = true
3
- has_history :generate_model => true
4
- has_one :other_model, :class_name => 'ModelStub'
5
- has_many :other_models, :class_name => 'ModelStub'
6
- attr_accessor :a, :b, :c, :d
7
-
8
- def other_model=(val)
9
- @other_model = val
10
- end
11
- def other_model
12
- @other_model || nil
13
- end
14
-
15
- def other_models=(val)
16
- @other_models = val
17
- end
18
- def other_models
19
- @other_models || []
20
- end
21
-
22
- def self.columns
23
- @columns ||= [
24
- ActiveRecord::ConnectionAdapters::Column.new(:a, ''),
25
- ActiveRecord::ConnectionAdapters::Column.new(:b, ''),
26
- ActiveRecord::ConnectionAdapters::Column.new(:c, ''),
27
- ActiveRecord::ConnectionAdapters::Column.new(:d, '')
28
- ]
29
- end
30
-
31
- def self.columns_hash
32
- @columns_hash ||= columns.inject({}) { |hash, column| hash[column.name.to_s] = column; hash }
33
- end
34
-
35
- # column-level security methods, used for testing
36
- def self.a_authorized_for_bar?(user)
37
- true
38
- end
39
- def self.b_authorized?(user)
40
- false
41
- end
42
- end
@@ -1,5 +0,0 @@
1
- class PairedMaster < ActiveRecord::Base
2
- abstract_class = true
3
- require File.dirname(__FILE__) + '/paired_master_history'
4
- has_history
5
- end
@@ -1,5 +0,0 @@
1
- class PairedMasterHistory < ActiveRecord::Base
2
- abstract_class = true
3
- require File.dirname(__FILE__) + '/paired_master'
4
- acts_as_history
5
- end
@@ -1,154 +0,0 @@
1
- require 'test/unit'
2
-
3
- require File.expand_path(File.join(File.dirname(__FILE__), '../../../../config/environment.rb'))
4
-
5
- require File.dirname(__FILE__) + '/lone_master'
6
- require File.dirname(__FILE__) + '/paired_master'
7
- require File.dirname(__FILE__) + '/paired_master_history'
8
- require File.dirname(__FILE__) + '/ignorant_master'
9
- require File.dirname(__FILE__) + '/ignorant_master_history'
10
-
11
- LoneMaster.connection.instance_eval do
12
- SEQUENCE_COLUMNS = [
13
- ActiveRecord::ConnectionAdapters::Column.new('value', nil, translate_field_type('INTEGER'), false)
14
- ]
15
- MASTER_COLUMNS = [
16
- ActiveRecord::ConnectionAdapters::Column.new('id', nil, translate_field_type('INTEGER'), false),
17
- ActiveRecord::ConnectionAdapters::Column.new('created_at', nil, translate_field_type('TIMESTAMP'), false),
18
- ActiveRecord::ConnectionAdapters::Column.new('updated_at', nil, translate_field_type('TIMESTAMP'), false),
19
- ActiveRecord::ConnectionAdapters::Column.new('a', nil, translate_field_type('VARCHAR(1)'), false),
20
- ActiveRecord::ConnectionAdapters::Column.new('b', nil, translate_field_type('BOOLEAN'), false),
21
- ActiveRecord::ConnectionAdapters::Column.new('c', nil, translate_field_type('INTEGER'), false),
22
- ActiveRecord::ConnectionAdapters::Column.new('d', nil, translate_field_type('FLOAT'), false),
23
- ]
24
- HISTORY_COLUMNS = [
25
- ActiveRecord::ConnectionAdapters::Column.new('id', nil, translate_field_type('INTEGER'), false),
26
- ActiveRecord::ConnectionAdapters::Column.new('paired_master_id', nil, translate_field_type('INTEGER'), false),
27
- ActiveRecord::ConnectionAdapters::Column.new('created_at', nil, translate_field_type('TIMESTAMP'), false),
28
- ActiveRecord::ConnectionAdapters::Column.new('valid_from', nil, translate_field_type('TIMESTAMP'), false),
29
- ActiveRecord::ConnectionAdapters::Column.new('a', nil, translate_field_type('VARCHAR(1)'), false),
30
- ActiveRecord::ConnectionAdapters::Column.new('b', nil, translate_field_type('BOOLEAN'), false),
31
- ActiveRecord::ConnectionAdapters::Column.new('c', nil, translate_field_type('INTEGER'), false),
32
- ActiveRecord::ConnectionAdapters::Column.new('d', nil, translate_field_type('FLOAT'), false),
33
- ]
34
- TABLES = {
35
- 'lone_masters' => {:columns => MASTER_COLUMNS},
36
- 'paired_masters' => {:columns => MASTER_COLUMNS},
37
- 'paired_master_histories' => {:columns => HISTORY_COLUMNS},
38
- }
39
-
40
- def statements
41
- @statements
42
- end
43
-
44
- def inserts
45
- @statements.select {|s| s =~ /^INSERT INTO /}
46
- end
47
-
48
- def updates
49
- @statements.select {|s| s =~ /^UPDATE /}
50
- end
51
-
52
- def reset
53
- @statements = []
54
- @stored_rows = {}
55
- end
56
-
57
- def execute(sql, name = nil)
58
- @statements << sql
59
- case sql
60
- when /BEGIN|COMMIT|ROLLBACK/
61
- return
62
- when /^SELECT currval/
63
- return MockResult.new(SEQUENCE_COLUMNS, [['1']])
64
- when /^INSERT INTO (.*) \((.*)\) VALUES\s*\((.*)\)$/
65
- table_name, fields, values = $1, $2, $3
66
- fields = fields.gsub('"', '').split(', ')
67
- values = values.split(', ').map {|v| v == 'NULL' ? nil : v}
68
-
69
- @stored_rows[table_name] ||= []
70
- id = @stored_rows[table_name].size + 1
71
- @stored_rows[table_name][id] = {}
72
- fields.each_with_index do |field_name, i|
73
- @stored_rows[table_name][id][fields[i]] = values[i]
74
- end
75
- return
76
- when /^SELECT (.*) FROM (.*) WHERE \(.*\."id" = (\d*)\)/
77
- fields, table_name, id = $1, $2, $3.to_i
78
- raise "Oooops" unless fields == '*'
79
- raise "Invalid ID" unless id >= 1
80
- columns = (table_name =~ /_history/ ? HISTORY_COLUMNS : MASTER_COLUMNS)
81
- row = [id] + columns[1..-1].map {|c| @stored_rows[table_name][id][c.name] }
82
- return MockResult.new(columns, [row])
83
- when /UPDATE (.*) SET (.*) WHERE "id" = (\d+)/
84
- table_name, change_str, id = $1, $2, $3.to_i
85
- raise "Invalid ID" unless id >= 1
86
- changes_array = change_str.split(', ')
87
- changes = {}
88
- changes_array.each {|c| c =~ /"(.*)" = (.*)/ ; changes[$1] = $2 }
89
- @stored_rows[table_name][id].update(changes)
90
- return MockResult.new([], [1])
91
- end
92
- raise "Unknown SQL: '#{sql}'"
93
- end
94
-
95
- def columns(table_name, name = nil)
96
- raise "Unknown table '#{table_name}'" unless TABLES[table_name]
97
- TABLES[table_name][:columns]
98
- end
99
-
100
- end
101
-
102
- class MockResult
103
- attr_reader :fields
104
-
105
- def initialize(columns, rows)
106
- @fields = columns.map {|c| c.name}
107
- @types = columns.map {|c| c.type}
108
- @rows = rows
109
- end
110
-
111
- def type(i)
112
- @types[i]
113
- end
114
-
115
- def result
116
- @rows
117
- end
118
-
119
- def cmdtuples
120
- @rows.size
121
- end
122
-
123
- def clear
124
- @fields = nil
125
- @types = nil
126
- @rows = nil
127
- end
128
-
129
- end
130
-
131
- class Test::Unit::TestCase
132
- def statements
133
- connection.statements
134
- end
135
-
136
- def inserts
137
- connection.inserts
138
- end
139
-
140
- def updates
141
- connection.updates
142
- end
143
-
144
- def reset_connection
145
- connection.reset
146
- end
147
-
148
- private
149
-
150
- def connection
151
- ActiveRecord::Base.connection
152
- end
153
-
154
- end
@@ -1 +0,0 @@
1
- # Uninstall hook code here
@@ -1,432 +0,0 @@
1
- module PrototypeHelper
2
- # Creates a button with an onclick event which calls a remote action
3
- # via XMLHttpRequest
4
- # The options for specifying the target with :url
5
- # and defining callbacks is the same as link_to_remote.
6
- def button_to_remote(name, options = {}, html_options = {})
7
- button_to_function(name, remote_function(options), html_options)
8
- end
9
-
10
- # Returns a button input tag with the element name of +name+ and a value (i.e., display text) of +value+
11
- # that will submit form using XMLHttpRequest in the background instead of a regular POST request that
12
- # reloads the page.
13
- #
14
- # # Create a button that submits to the create action
15
- # #
16
- # # Generates: <input name="create_btn" onclick="new Ajax.Request('/testing/create',
17
- # # {asynchronous:true, evalScripts:true, parameters:Form.serialize(this.form)});
18
- # # return false;" type="button" value="Create" />
19
- # <%= submit_to_remote 'create_btn', 'Create', :url => { :action => 'create' } %>
20
- #
21
- # # Submit to the remote action update and update the DIV succeed or fail based
22
- # # on the success or failure of the request
23
- # #
24
- # # Generates: <input name="update_btn" onclick="new Ajax.Updater({success:'succeed',failure:'fail'},
25
- # # '/testing/update', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this.form)});
26
- # # return false;" type="button" value="Update" />
27
- # <%= submit_to_remote 'update_btn', 'Update', :url => { :action => 'update' },
28
- # :update => { :success => "succeed", :failure => "fail" }
29
- #
30
- # <tt>options</tt> argument is the same as in form_remote_tag.
31
- def submit_to_remote(name, value, options = {})
32
- options[:with] ||= 'Form.serialize(this.form)'
33
-
34
- html_options = options.delete(:html) || {}
35
- html_options[:name] = name
36
-
37
- button_to_remote(value, options, html_options)
38
- end
39
-
40
- # Returns a link to a remote action defined by <tt>options[:url]</tt>
41
- # (using the url_for format) that's called in the background using
42
- # XMLHttpRequest. The result of that request can then be inserted into a
43
- # DOM object whose id can be specified with <tt>options[:update]</tt>.
44
- # Usually, the result would be a partial prepared by the controller with
45
- # render :partial.
46
- #
47
- # Examples:
48
- # # Generates: <a href="#" onclick="new Ajax.Updater('posts', '/blog/destroy/3', {asynchronous:true, evalScripts:true});
49
- # # return false;">Delete this post</a>
50
- # link_to_remote "Delete this post", :update => "posts",
51
- # :url => { :action => "destroy", :id => post.id }
52
- #
53
- # # Generates: <a href="#" onclick="new Ajax.Updater('emails', '/mail/list_emails', {asynchronous:true, evalScripts:true});
54
- # # return false;"><img alt="Refresh" src="/images/refresh.png?" /></a>
55
- # link_to_remote(image_tag("refresh"), :update => "emails",
56
- # :url => { :action => "list_emails" })
57
- #
58
- # You can override the generated HTML options by specifying a hash in
59
- # <tt>options[:html]</tt>.
60
- #
61
- # link_to_remote "Delete this post", :update => "posts",
62
- # :url => post_url(@post), :method => :delete,
63
- # :html => { :class => "destructive" }
64
- #
65
- # You can also specify a hash for <tt>options[:update]</tt> to allow for
66
- # easy redirection of output to an other DOM element if a server-side
67
- # error occurs:
68
- #
69
- # Example:
70
- # # Generates: <a href="#" onclick="new Ajax.Updater({success:'posts',failure:'error'}, '/blog/destroy/5',
71
- # # {asynchronous:true, evalScripts:true}); return false;">Delete this post</a>
72
- # link_to_remote "Delete this post",
73
- # :url => { :action => "destroy", :id => post.id },
74
- # :update => { :success => "posts", :failure => "error" }
75
- #
76
- # Optionally, you can use the <tt>options[:position]</tt> parameter to
77
- # influence how the target DOM element is updated. It must be one of
78
- # <tt>:before</tt>, <tt>:top</tt>, <tt>:bottom</tt>, or <tt>:after</tt>.
79
- #
80
- # The method used is by default POST. You can also specify GET or you
81
- # can simulate PUT or DELETE over POST. All specified with <tt>options[:method]</tt>
82
- #
83
- # Example:
84
- # # Generates: <a href="#" onclick="new Ajax.Request('/person/4', {asynchronous:true, evalScripts:true, method:'delete'});
85
- # # return false;">Destroy</a>
86
- # link_to_remote "Destroy", :url => person_url(:id => person), :method => :delete
87
- #
88
- # By default, these remote requests are processed asynchronous during
89
- # which various JavaScript callbacks can be triggered (for progress
90
- # indicators and the likes). All callbacks get access to the
91
- # <tt>request</tt> object, which holds the underlying XMLHttpRequest.
92
- #
93
- # To access the server response, use <tt>request.responseText</tt>, to
94
- # find out the HTTP status, use <tt>request.status</tt>.
95
- #
96
- # Example:
97
- # # Generates: <a href="#" onclick="new Ajax.Request('/words/undo?n=33', {asynchronous:true, evalScripts:true,
98
- # # onComplete:function(request){undoRequestCompleted(request)}}); return false;">hello</a>
99
- # word = 'hello'
100
- # link_to_remote word,
101
- # :url => { :action => "undo", :n => word_counter },
102
- # :complete => "undoRequestCompleted(request)"
103
- #
104
- # The callbacks that may be specified are (in order):
105
- #
106
- # <tt>:loading</tt>:: Called when the remote document is being
107
- # loaded with data by the browser.
108
- # <tt>:loaded</tt>:: Called when the browser has finished loading
109
- # the remote document.
110
- # <tt>:interactive</tt>:: Called when the user can interact with the
111
- # remote document, even though it has not
112
- # finished loading.
113
- # <tt>:success</tt>:: Called when the XMLHttpRequest is completed,
114
- # and the HTTP status code is in the 2XX range.
115
- # <tt>:failure</tt>:: Called when the XMLHttpRequest is completed,
116
- # and the HTTP status code is not in the 2XX
117
- # range.
118
- # <tt>:complete</tt>:: Called when the XMLHttpRequest is complete
119
- # (fires after success/failure if they are
120
- # present).
121
- #
122
- # You can further refine <tt>:success</tt> and <tt>:failure</tt> by
123
- # adding additional callbacks for specific status codes.
124
- #
125
- # Example:
126
- # # Generates: <a href="#" onclick="new Ajax.Request('/testing/action', {asynchronous:true, evalScripts:true,
127
- # # on404:function(request){alert('Not found...? Wrong URL...?')},
128
- # # onFailure:function(request){alert('HTTP Error ' + request.status + '!')}}); return false;">hello</a>
129
- # link_to_remote word,
130
- # :url => { :action => "action" },
131
- # 404 => "alert('Not found...? Wrong URL...?')",
132
- # :failure => "alert('HTTP Error ' + request.status + '!')"
133
- #
134
- # A status code callback overrides the success/failure handlers if
135
- # present.
136
- #
137
- # If you for some reason or another need synchronous processing (that'll
138
- # block the browser while the request is happening), you can specify
139
- # <tt>options[:type] = :synchronous</tt>.
140
- #
141
- # You can customize further browser side call logic by passing in
142
- # JavaScript code snippets via some optional parameters. In their order
143
- # of use these are:
144
- #
145
- # <tt>:confirm</tt>:: Adds confirmation dialog.
146
- # <tt>:condition</tt>:: Perform remote request conditionally
147
- # by this expression. Use this to
148
- # describe browser-side conditions when
149
- # request should not be initiated.
150
- # <tt>:before</tt>:: Called before request is initiated.
151
- # <tt>:after</tt>:: Called immediately after request was
152
- # initiated and before <tt>:loading</tt>.
153
- # <tt>:submit</tt>:: Specifies the DOM element ID that's used
154
- # as the parent of the form elements. By
155
- # default this is the current form, but
156
- # it could just as well be the ID of a
157
- # table row or any other DOM element.
158
- # <tt>:with</tt>:: A JavaScript expression specifying
159
- # the parameters for the XMLHttpRequest.
160
- # Any expressions should return a valid
161
- # URL query string.
162
- #
163
- # Example:
164
- #
165
- # :with => "'name=' + $('name').value"
166
- #
167
- # You can generate a link that uses AJAX in the general case, while
168
- # degrading gracefully to plain link behavior in the absence of
169
- # JavaScript by setting <tt>html_options[:href]</tt> to an alternate URL.
170
- # Note the extra curly braces around the <tt>options</tt> hash separate
171
- # it as the second parameter from <tt>html_options</tt>, the third.
172
- #
173
- # Example:
174
- # link_to_remote "Delete this post",
175
- # { :update => "posts", :url => { :action => "destroy", :id => post.id } },
176
- # :href => url_for(:action => "destroy", :id => post.id)
177
- def link_to_remote(name, options = {}, html_options = nil)
178
- link_to_function(name, remote_function(options), html_options || options.delete(:html))
179
- end
180
-
181
- # Returns a form tag that will submit using XMLHttpRequest in the
182
- # background instead of the regular reloading POST arrangement. Even
183
- # though it's using JavaScript to serialize the form elements, the form
184
- # submission will work just like a regular submission as viewed by the
185
- # receiving side (all elements available in <tt>params</tt>). The options for
186
- # specifying the target with <tt>:url</tt> and defining callbacks is the same as
187
- # +link_to_remote+.
188
- #
189
- # A "fall-through" target for browsers that doesn't do JavaScript can be
190
- # specified with the <tt>:action</tt>/<tt>:method</tt> options on <tt>:html</tt>.
191
- #
192
- # Example:
193
- # # Generates:
194
- # # <form action="/some/place" method="post" onsubmit="new Ajax.Request('',
195
- # # {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;">
196
- # form_remote_tag :html => { :action =>
197
- # url_for(:controller => "some", :action => "place") }
198
- #
199
- # The Hash passed to the <tt>:html</tt> key is equivalent to the options (2nd)
200
- # argument in the FormTagHelper.form_tag method.
201
- #
202
- # By default the fall-through action is the same as the one specified in
203
- # the <tt>:url</tt> (and the default method is <tt>:post</tt>).
204
- #
205
- # form_remote_tag also takes a block, like form_tag:
206
- # # Generates:
207
- # # <form action="/" method="post" onsubmit="new Ajax.Request('/',
208
- # # {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)});
209
- # # return false;"> <div><input name="commit" type="submit" value="Save" /></div>
210
- # # </form>
211
- # <% form_remote_tag :url => '/posts' do -%>
212
- # <div><%= submit_tag 'Save' %></div>
213
- # <% end -%>
214
- def form_remote_tag(options = {}, &block)
215
- options[:form] = true
216
-
217
- options[:html] ||= {}
218
- options[:html][:onsubmit] =
219
- (options[:html][:onsubmit] ? options[:html][:onsubmit] + "; " : "") +
220
- "#{remote_function(options)}; return false;"
221
-
222
- form_tag(options[:html].delete(:action) || url_for(options[:url]), options[:html], &block)
223
- end
224
-
225
- # Creates a form that will submit using XMLHttpRequest in the background
226
- # instead of the regular reloading POST arrangement and a scope around a
227
- # specific resource that is used as a base for questioning about
228
- # values for the fields.
229
- #
230
- # === Resource
231
- #
232
- # Example:
233
- # <% remote_form_for(@post) do |f| %>
234
- # ...
235
- # <% end %>
236
- #
237
- # This will expand to be the same as:
238
- #
239
- # <% remote_form_for :post, @post, :url => post_path(@post), :html => { :method => :put, :class => "edit_post", :id => "edit_post_45" } do |f| %>
240
- # ...
241
- # <% end %>
242
- #
243
- # === Nested Resource
244
- #
245
- # Example:
246
- # <% remote_form_for([@post, @comment]) do |f| %>
247
- # ...
248
- # <% end %>
249
- #
250
- # This will expand to be the same as:
251
- #
252
- # <% remote_form_for :comment, @comment, :url => post_comment_path(@post, @comment), :html => { :method => :put, :class => "edit_comment", :id => "edit_comment_45" } do |f| %>
253
- # ...
254
- # <% end %>
255
- #
256
- # If you don't need to attach a form to a resource, then check out form_remote_tag.
257
- #
258
- # See FormHelper#form_for for additional semantics.
259
- def remote_form_for(record_or_name_or_array, *args, &proc)
260
- options = args.extract_options!
261
-
262
- case record_or_name_or_array
263
- when String, Symbol
264
- object_name = record_or_name_or_array
265
- when Array
266
- object = record_or_name_or_array.last
267
- object_name = ActiveModel::Naming.singular(object)
268
- apply_form_for_options!(record_or_name_or_array, options)
269
- args.unshift object
270
- else
271
- object = record_or_name_or_array
272
- object_name = ActiveModel::Naming.singular(record_or_name_or_array)
273
- apply_form_for_options!(object, options)
274
- args.unshift object
275
- end
276
-
277
- form_remote_tag options do
278
- fields_for object_name, *(args << options), &proc
279
- end
280
- end
281
- alias_method :form_remote_for, :remote_form_for
282
-
283
- # Returns '<tt>eval(request.responseText)</tt>' which is the JavaScript function
284
- # that +form_remote_tag+ can call in <tt>:complete</tt> to evaluate a multiple
285
- # update return document using +update_element_function+ calls.
286
- def evaluate_remote_response
287
- "eval(request.responseText)"
288
- end
289
-
290
- # Observes the field with the DOM ID specified by +field_id+ and calls a
291
- # callback when its contents have changed. The default callback is an
292
- # Ajax call. By default the value of the observed field is sent as a
293
- # parameter with the Ajax call.
294
- #
295
- # Example:
296
- # # Generates: new Form.Element.Observer('suggest', 0.25, function(element, value) {new Ajax.Updater('suggest',
297
- # # '/testing/find_suggestion', {asynchronous:true, evalScripts:true, parameters:'q=' + value})})
298
- # <%= observe_field :suggest, :url => { :action => :find_suggestion },
299
- # :frequency => 0.25,
300
- # :update => :suggest,
301
- # :with => 'q'
302
- # %>
303
- #
304
- # Required +options+ are either of:
305
- # <tt>:url</tt>:: +url_for+-style options for the action to call
306
- # when the field has changed.
307
- # <tt>:function</tt>:: Instead of making a remote call to a URL, you
308
- # can specify javascript code to be called instead.
309
- # Note that the value of this option is used as the
310
- # *body* of the javascript function, a function definition
311
- # with parameters named element and value will be generated for you
312
- # for example:
313
- # observe_field("glass", :frequency => 1, :function => "alert('Element changed')")
314
- # will generate:
315
- # new Form.Element.Observer('glass', 1, function(element, value) {alert('Element changed')})
316
- # The element parameter is the DOM element being observed, and the value is its value at the
317
- # time the observer is triggered.
318
- #
319
- # Additional options are:
320
- # <tt>:frequency</tt>:: The frequency (in seconds) at which changes to
321
- # this field will be detected. Not setting this
322
- # option at all or to a value equal to or less than
323
- # zero will use event based observation instead of
324
- # time based observation.
325
- # <tt>:update</tt>:: Specifies the DOM ID of the element whose
326
- # innerHTML should be updated with the
327
- # XMLHttpRequest response text.
328
- # <tt>:with</tt>:: A JavaScript expression specifying the parameters
329
- # for the XMLHttpRequest. The default is to send the
330
- # key and value of the observed field. Any custom
331
- # expressions should return a valid URL query string.
332
- # The value of the field is stored in the JavaScript
333
- # variable +value+.
334
- #
335
- # Examples
336
- #
337
- # :with => "'my_custom_key=' + value"
338
- # :with => "'person[name]=' + prompt('New name')"
339
- # :with => "Form.Element.serialize('other-field')"
340
- #
341
- # Finally
342
- # :with => 'name'
343
- # is shorthand for
344
- # :with => "'name=' + value"
345
- # This essentially just changes the key of the parameter.
346
- #
347
- # Additionally, you may specify any of the options documented in the
348
- # <em>Common options</em> section at the top of this document.
349
- #
350
- # Example:
351
- #
352
- # # Sends params: {:title => 'Title of the book'} when the book_title input
353
- # # field is changed.
354
- # observe_field 'book_title',
355
- # :url => 'http://example.com/books/edit/1',
356
- # :with => 'title'
357
- #
358
- #
359
- def observe_field(field_id, options = {})
360
- if options[:frequency] && options[:frequency] > 0
361
- build_observer('Form.Element.Observer', field_id, options)
362
- else
363
- build_observer('Form.Element.EventObserver', field_id, options)
364
- end
365
- end
366
-
367
- # Observes the form with the DOM ID specified by +form_id+ and calls a
368
- # callback when its contents have changed. The default callback is an
369
- # Ajax call. By default all fields of the observed field are sent as
370
- # parameters with the Ajax call.
371
- #
372
- # The +options+ for +observe_form+ are the same as the options for
373
- # +observe_field+. The JavaScript variable +value+ available to the
374
- # <tt>:with</tt> option is set to the serialized form by default.
375
- def observe_form(form_id, options = {})
376
- if options[:frequency]
377
- build_observer('Form.Observer', form_id, options)
378
- else
379
- build_observer('Form.EventObserver', form_id, options)
380
- end
381
- end
382
-
383
- # Periodically calls the specified url (<tt>options[:url]</tt>) every
384
- # <tt>options[:frequency]</tt> seconds (default is 10). Usually used to
385
- # update a specified div (<tt>options[:update]</tt>) with the results
386
- # of the remote call. The options for specifying the target with <tt>:url</tt>
387
- # and defining callbacks is the same as link_to_remote.
388
- # Examples:
389
- # # Call get_averages and put its results in 'avg' every 10 seconds
390
- # # Generates:
391
- # # new PeriodicalExecuter(function() {new Ajax.Updater('avg', '/grades/get_averages',
392
- # # {asynchronous:true, evalScripts:true})}, 10)
393
- # periodically_call_remote(:url => { :action => 'get_averages' }, :update => 'avg')
394
- #
395
- # # Call invoice every 10 seconds with the id of the customer
396
- # # If it succeeds, update the invoice DIV; if it fails, update the error DIV
397
- # # Generates:
398
- # # new PeriodicalExecuter(function() {new Ajax.Updater({success:'invoice',failure:'error'},
399
- # # '/testing/invoice/16', {asynchronous:true, evalScripts:true})}, 10)
400
- # periodically_call_remote(:url => { :action => 'invoice', :id => customer.id },
401
- # :update => { :success => "invoice", :failure => "error" }
402
- #
403
- # # Call update every 20 seconds and update the new_block DIV
404
- # # Generates:
405
- # # new PeriodicalExecuter(function() {new Ajax.Updater('news_block', 'update', {asynchronous:true, evalScripts:true})}, 20)
406
- # periodically_call_remote(:url => 'update', :frequency => '20', :update => 'news_block')
407
- #
408
- def periodically_call_remote(options = {})
409
- frequency = options[:frequency] || 10 # every ten seconds by default
410
- code = "new PeriodicalExecuter(function() {#{remote_function(options)}}, #{frequency})"
411
- javascript_tag(code)
412
- end
413
-
414
- protected
415
- def build_observer(klass, name, options = {})
416
- if options[:with] && (options[:with] !~ /[\{=(.]/)
417
- options[:with] = "'#{options[:with]}=' + encodeURIComponent(value)"
418
- else
419
- options[:with] ||= 'value' unless options[:function]
420
- end
421
-
422
- callback = options[:function] || remote_function(options)
423
- javascript = "new #{klass}('#{name}', "
424
- javascript << "#{options[:frequency]}, " if options[:frequency]
425
- javascript << "function(element, value) {"
426
- javascript << "#{callback}}"
427
- javascript << ")"
428
- javascript_tag(javascript)
429
- end
430
- end
431
-
432
- ActionController::Base.helper PrototypeHelper