ab_admin 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (419) hide show
  1. checksums.yaml +7 -0
  2. data/{LICENSE.txt → MIT-LICENSE} +2 -4
  3. data/README.md +3 -3
  4. data/Rakefile +21 -3
  5. data/app/assets/images/admin/flags/b_de.png +0 -0
  6. data/app/assets/images/admin/flags/b_es.png +0 -0
  7. data/app/assets/images/admin/flags/b_fr.png +0 -0
  8. data/app/assets/images/admin/flags/flag_de.gif +0 -0
  9. data/app/assets/images/admin/flags/flag_de_nonact.gif +0 -0
  10. data/app/assets/images/admin/flags/flag_es.gif +0 -0
  11. data/app/assets/images/admin/flags/flag_es_nonact.gif +0 -0
  12. data/app/assets/images/admin/flags/flag_fr.gif +0 -0
  13. data/app/assets/images/admin/flags/flag_fr_nonact.gif +0 -0
  14. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +50 -60
  15. data/app/assets/javascripts/ab_admin/components/base_assets.js.coffee +86 -0
  16. data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +4 -4
  17. data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +5 -0
  18. data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +0 -1
  19. data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +7 -3
  20. data/app/assets/javascripts/ab_admin/components/locator.js.coffee +1 -1
  21. data/app/assets/javascripts/ab_admin/components/select2_bridge.js.coffee +152 -0
  22. data/app/assets/javascripts/ab_admin/components/sortable_tree.js.coffee +1 -1
  23. data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +5 -4
  24. data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +4 -11
  25. data/app/assets/javascripts/ab_admin/core/confirmation.js.coffee +4 -43
  26. data/app/assets/javascripts/ab_admin/core/deprecated_utils.js.coffee +44 -0
  27. data/app/assets/javascripts/ab_admin/core/init.js.coffee +8 -25
  28. data/app/assets/javascripts/ab_admin/core/pjax.js.coffee +18 -4
  29. data/app/assets/javascripts/ab_admin/core/search_form.js.coffee +5 -5
  30. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +15 -86
  31. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +38 -51
  32. data/app/assets/javascripts/ab_admin/core/view_layout.js.coffee +1 -1
  33. data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +16 -18
  34. data/app/assets/javascripts/ab_admin/main.js +7 -7
  35. data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.css.scss +21 -8
  36. data/app/assets/stylesheets/ab_admin/components/_admin_comments.css.scss +17 -5
  37. data/app/assets/stylesheets/ab_admin/components/_base.css.scss +4 -0
  38. data/app/assets/stylesheets/ab_admin/components/_colored_tabs.css.scss +1 -4
  39. data/app/assets/stylesheets/ab_admin/components/_columns_hider.css.scss +5 -0
  40. data/app/assets/stylesheets/ab_admin/components/_form.css.scss +45 -16
  41. data/app/assets/stylesheets/ab_admin/components/_grid_view.css.scss +11 -0
  42. data/app/assets/stylesheets/ab_admin/components/_locale_tabs.css.scss +1 -1
  43. data/app/assets/stylesheets/ab_admin/components/_navigation.css.scss +11 -9
  44. data/app/assets/stylesheets/ab_admin/components/_table_view.css.scss +1 -1
  45. data/app/assets/stylesheets/ab_admin/components/_translations.css.scss +1 -0
  46. data/app/assets/stylesheets/ab_admin/components/{_sortable_tree.css.scss → _tree_view.css.scss} +8 -3
  47. data/app/assets/stylesheets/ab_admin/fileupload.css.scss +51 -43
  48. data/app/assets/stylesheets/ab_admin/main.css.scss +1 -3
  49. data/app/controllers/admin/admin_comments_controller.rb +14 -4
  50. data/app/controllers/admin/assets_controller.rb +44 -35
  51. data/app/controllers/admin/base_controller.rb +93 -38
  52. data/app/controllers/admin/locators_controller.rb +3 -2
  53. data/app/controllers/admin/manager_controller.rb +20 -9
  54. data/app/controllers/admin/structures_controller.rb +9 -1
  55. data/app/controllers/admin/users_controller.rb +1 -2
  56. data/app/views/ab_admin/devise/sessions/new.html.slim +1 -1
  57. data/app/views/admin/admin_comments/_comment.html.slim +21 -7
  58. data/app/views/admin/admin_comments/_comments.html.slim +1 -1
  59. data/app/views/admin/admin_comments/_form.html.slim +8 -3
  60. data/app/views/admin/admin_comments/_list_block.html.slim +7 -0
  61. data/app/views/admin/admin_comments/create.js.erb +3 -2
  62. data/app/views/admin/admin_comments/destroy.js.erb +1 -1
  63. data/app/views/admin/admin_comments/index.js.erb +14 -0
  64. data/app/views/admin/assets/batch_edit.html.slim +14 -0
  65. data/app/views/admin/base/_modal_form_layout.html.slim +12 -0
  66. data/app/views/admin/base/_search_layout.html.slim +4 -3
  67. data/app/views/admin/base/_table.html.slim +2 -2
  68. data/app/views/admin/base/create.js.erb +13 -8
  69. data/app/views/admin/base/history.html.slim +18 -0
  70. data/app/views/admin/base/index.html.slim +3 -3
  71. data/app/views/admin/base/new.js.erb +14 -8
  72. data/app/views/admin/base/show.html.slim +1 -2
  73. data/app/views/admin/base/show.js.erb +7 -0
  74. data/app/views/admin/fileupload/_asset_templates.html.slim +29 -0
  75. data/app/views/admin/fileupload/_container.html.slim +13 -12
  76. data/app/views/admin/fileupload/_file.html.slim +2 -2
  77. data/app/views/admin/fileupload/_image.html.slim +8 -0
  78. data/app/views/admin/fileupload/_video.html.slim +2 -2
  79. data/app/views/admin/headers/_form.html.slim +2 -0
  80. data/app/views/admin/locators/edit.html.slim +1 -1
  81. data/app/views/admin/locators/show.html.slim +1 -2
  82. data/app/views/admin/manager/_form.html.slim +17 -3
  83. data/app/views/admin/manager/_modal_form.html.slim +19 -0
  84. data/app/views/admin/manager/_table.html.slim +3 -3
  85. data/app/views/admin/manager/show.html.slim +1 -0
  86. data/app/views/admin/shared/_content_actions.html.slim +39 -0
  87. data/app/views/admin/shared/_locale_tabs.html.slim +3 -3
  88. data/app/views/admin/shared/inputs/_checkbox_tree.html.slim +9 -3
  89. data/app/views/admin/structures/_form.html.slim +4 -7
  90. data/app/views/admin/users/_form.html.slim +2 -4
  91. data/app/views/admin/users/_search_form.html.slim +0 -1
  92. data/app/views/admin/users/_table.html.slim +8 -10
  93. data/app/views/layouts/admin/_footer.html.slim +3 -4
  94. data/app/views/layouts/admin/_navigation.html.slim +2 -2
  95. data/app/views/layouts/admin/application.html.slim +7 -9
  96. data/app/views/layouts/admin/devise.html.slim +3 -4
  97. data/config/locales/de.yml +319 -0
  98. data/config/locales/en.devise.yml +44 -31
  99. data/config/locales/en.yml +166 -143
  100. data/config/locales/it.devise.yml +54 -41
  101. data/config/locales/it.yml +178 -163
  102. data/config/locales/ru.devise.yml +70 -56
  103. data/config/locales/ru.yml +280 -264
  104. data/config/routes.rb +6 -3
  105. data/db/migrate/20130101000001_create_users.rb +7 -11
  106. data/db/migrate/20130101000003_create_assets.rb +5 -5
  107. data/db/migrate/20130101000004_create_headers.rb +2 -6
  108. data/db/migrate/20130101000005_create_static_pages.rb +1 -5
  109. data/db/migrate/20130101000006_create_structures.rb +5 -9
  110. data/db/migrate/20130101000007_base_translations.rb +3 -1
  111. data/db/migrate/20130101000008_create_admin_comments.rb +5 -5
  112. data/db/migrate/20130101000009_create_tracks.rb +20 -0
  113. data/lib/ab_admin.rb +36 -4
  114. data/lib/ab_admin/abstract_resource.rb +28 -7
  115. data/lib/ab_admin/carrierwave/base_uploader.rb +85 -5
  116. data/lib/ab_admin/carrierwave/glue.rb +6 -1
  117. data/lib/ab_admin/concerns/admin_addition.rb +26 -9
  118. data/lib/ab_admin/concerns/asset_human_names.rb +23 -0
  119. data/lib/ab_admin/concerns/fileuploads.rb +102 -0
  120. data/lib/ab_admin/concerns/has_tracking.rb +32 -0
  121. data/lib/ab_admin/concerns/nested_set.rb +9 -9
  122. data/lib/ab_admin/concerns/silencer.rb +5 -5
  123. data/lib/ab_admin/concerns/utilities.rb +28 -16
  124. data/lib/ab_admin/concerns/validations.rb +1 -1
  125. data/lib/ab_admin/config/base.rb +10 -2
  126. data/lib/ab_admin/controllers/callbacks.rb +2 -2
  127. data/lib/ab_admin/controllers/can_can_manager_resource.rb +3 -2
  128. data/lib/ab_admin/controllers/fv.rb +16 -0
  129. data/lib/ab_admin/controllers/head_options.rb +6 -4
  130. data/lib/ab_admin/core_ext/hash.rb +25 -70
  131. data/lib/ab_admin/core_ext/string.rb +17 -4
  132. data/lib/ab_admin/engine.rb +2 -8
  133. data/lib/ab_admin/hooks.rb +8 -3
  134. data/lib/ab_admin/hooks/active_model_hooks.rb +1 -1
  135. data/lib/ab_admin/hooks/globalize_hooks.rb +35 -0
  136. data/lib/ab_admin/hooks/paginate_hooks.rb +3 -1
  137. data/lib/ab_admin/i18n_tools/model_translator.rb +1 -1
  138. data/lib/ab_admin/menu/abstract_builder.rb +14 -0
  139. data/lib/ab_admin/menu/base_group.rb +26 -0
  140. data/lib/ab_admin/menu/builder.rb +16 -0
  141. data/lib/ab_admin/menu/group.rb +24 -0
  142. data/lib/ab_admin/menu/item.rb +23 -0
  143. data/lib/ab_admin/models/admin_comment.rb +68 -0
  144. data/lib/ab_admin/models/asset.rb +30 -19
  145. data/lib/ab_admin/models/attachment_file.rb +2 -1
  146. data/lib/ab_admin/models/header.rb +15 -0
  147. data/lib/ab_admin/models/locator.rb +1 -3
  148. data/lib/ab_admin/models/settings.rb +10 -10
  149. data/lib/ab_admin/models/structure.rb +20 -9
  150. data/lib/ab_admin/models/track.rb +61 -0
  151. data/lib/ab_admin/models/type_model.rb +30 -17
  152. data/lib/ab_admin/models/user.rb +18 -49
  153. data/lib/ab_admin/utils.rb +16 -7
  154. data/lib/ab_admin/utils/logger.rb +11 -7
  155. data/lib/ab_admin/utils/mysql.rb +10 -0
  156. data/lib/ab_admin/version.rb +1 -1
  157. data/lib/ab_admin/views/admin_helpers.rb +20 -9
  158. data/lib/ab_admin/views/admin_navigation_helpers.rb +44 -21
  159. data/lib/ab_admin/views/content_only_wrapper.rb +14 -0
  160. data/lib/ab_admin/views/form_builder.rb +27 -89
  161. data/lib/ab_admin/views/helpers.rb +1 -28
  162. data/lib/ab_admin/views/inputs/capture_block_input.rb +16 -0
  163. data/lib/ab_admin/views/inputs/date_time_picker_input.rb +45 -0
  164. data/lib/ab_admin/views/inputs/token_input.rb +2 -1
  165. data/lib/ab_admin/views/inputs/uploader_input.rb +101 -0
  166. data/lib/ab_admin/views/manager_helpers.rb +12 -0
  167. data/lib/ab_admin/views/search_form_builder.rb +36 -13
  168. data/lib/generators/ab_admin/ckeditor_assets/ckeditor_assets_generator.rb +1 -1
  169. data/lib/generators/ab_admin/install/install_generator.rb +3 -2
  170. data/lib/generators/ab_admin/install/templates/config/ab_admin.rb.erb +1 -1
  171. data/lib/generators/ab_admin/install/templates/config/admin_menu.rb +1 -1
  172. data/lib/generators/ab_admin/install/templates/config/i18n-js.yml +1 -1
  173. data/lib/generators/ab_admin/install/templates/config/nginx.conf +22 -9
  174. data/lib/generators/ab_admin/install/templates/config/robots.txt +7 -0
  175. data/lib/generators/ab_admin/install/templates/config/seeds.rb +2 -1
  176. data/lib/generators/ab_admin/install/templates/models/ability.rb +2 -7
  177. data/lib/generators/ab_admin/install/templates/models/admin_comment.rb +3 -28
  178. data/lib/generators/ab_admin/install/templates/models/asset.rb +4 -2
  179. data/lib/generators/ab_admin/install/templates/models/attachment_file.rb +1 -1
  180. data/lib/generators/ab_admin/install/templates/models/avatar.rb +2 -2
  181. data/lib/generators/ab_admin/install/templates/models/gender_type.rb +1 -1
  182. data/lib/generators/ab_admin/install/templates/models/header.rb +2 -2
  183. data/lib/generators/ab_admin/install/templates/models/locator.rb +0 -1
  184. data/lib/generators/ab_admin/install/templates/models/picture.rb +1 -1
  185. data/lib/generators/ab_admin/install/templates/models/settings.rb +1 -1
  186. data/lib/generators/ab_admin/install/templates/models/structure.rb +6 -8
  187. data/lib/generators/ab_admin/install/templates/models/track.rb +5 -0
  188. data/lib/generators/ab_admin/install/templates/models/user.rb +2 -3
  189. data/lib/generators/ab_admin/install/templates/script/unicorn.sh +0 -2
  190. data/lib/generators/ab_admin/install/templates/spec/factories/user_factory.rb +1 -2
  191. data/lib/generators/ab_admin/install/templates/uploaders/attachment_file_uploader.rb +1 -1
  192. data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +1 -1
  193. data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +1 -1
  194. data/lib/generators/ab_admin/model/templates/resource.erb +1 -1
  195. data/lib/generators/ab_admin/resource/templates/_form.slim.erb +49 -45
  196. data/lib/generators/ab_admin/resource/templates/_table.slim.erb +1 -1
  197. data/lib/generators/template.rb +32 -56
  198. data/lib/tasks/assets.rake +1 -0
  199. metadata +197 -698
  200. data/.gitignore +0 -41
  201. data/Gemfile +0 -77
  202. data/Guardfile +0 -35
  203. data/TODO +0 -4
  204. data/ab_admin.gemspec +0 -59
  205. data/app/views/admin/fileupload/_asset.html.slim +0 -8
  206. data/app/views/admin/fileupload/_ftmpl.html.slim +0 -6
  207. data/app/views/admin/fileupload/_tmpl.html.slim +0 -9
  208. data/app/views/admin/fileupload/_vtmpl.html.slim +0 -10
  209. data/app/views/admin/shared/_batch_actions.html.slim +0 -27
  210. data/cucumber.yml +0 -10
  211. data/features/dsl/action_items.feature +0 -79
  212. data/features/dsl/admin_comments.feature +0 -30
  213. data/features/dsl/batch_actions.feature +0 -69
  214. data/features/dsl/config.feature +0 -44
  215. data/features/dsl/custom_actions.feature +0 -62
  216. data/features/dsl/export.feature +0 -42
  217. data/features/dsl/form.feature +0 -77
  218. data/features/dsl/in_place_edit.feature +0 -26
  219. data/features/dsl/list_edit.feature +0 -46
  220. data/features/dsl/parent_resource.feature +0 -18
  221. data/features/dsl/resource_action_items.feature +0 -40
  222. data/features/dsl/search.feature +0 -41
  223. data/features/dsl/show.feature +0 -37
  224. data/features/dsl/table.feature +0 -71
  225. data/features/dsl/tree.feature +0 -37
  226. data/features/index_views/table.feature +0 -20
  227. data/features/locators.feature +0 -40
  228. data/features/menu.feature +0 -35
  229. data/features/settings.feature +0 -36
  230. data/features/step_definitions/configuration_steps.rb +0 -94
  231. data/features/step_definitions/dsl/action_items_steps.rb +0 -13
  232. data/features/step_definitions/dsl/admin_comments_steps.rb +0 -12
  233. data/features/step_definitions/dsl/batch_actions_steps.rb +0 -27
  234. data/features/step_definitions/dsl/in_place_edit_steps.rb +0 -7
  235. data/features/step_definitions/dsl/parent_resource_steps.rb +0 -8
  236. data/features/step_definitions/dsl/resource_action_items_steps.rb +0 -14
  237. data/features/step_definitions/dsl/show_steps.rb +0 -8
  238. data/features/step_definitions/dsl/table_steps.rb +0 -38
  239. data/features/step_definitions/dsl/tree_steps.rb +0 -28
  240. data/features/step_definitions/menu_steps.rb +0 -20
  241. data/features/step_definitions/settings_steps.rb +0 -7
  242. data/features/step_definitions/structure_steps.rb +0 -7
  243. data/features/step_definitions/table_steps.rb +0 -23
  244. data/features/step_definitions/user_steps.rb +0 -72
  245. data/features/step_definitions/web_steps/browsing_steps.rb +0 -108
  246. data/features/step_definitions/web_steps/debug_steps.rb +0 -6
  247. data/features/step_definitions/web_steps/form_steps.rb +0 -190
  248. data/features/step_definitions/web_steps/i18n_steps.rb +0 -8
  249. data/features/step_definitions/web_steps/step_scoper.rb +0 -9
  250. data/features/step_definitions/web_steps/transforms_steps.rb +0 -3
  251. data/features/structure/tree.feature +0 -21
  252. data/features/support/capybara_helpers.rb +0 -15
  253. data/features/support/carrierwave.rb +0 -21
  254. data/features/support/env.rb +0 -40
  255. data/features/support/paths.rb +0 -55
  256. data/features/support/selector_helpers.rb +0 -9
  257. data/features/support/selectors.rb +0 -43
  258. data/features/support/tolerance_for_selenium_sync_issues.rb +0 -27
  259. data/features/user/sign_in.feature +0 -27
  260. data/features/user/sign_out.feature +0 -11
  261. data/features/user/user_edit.feature +0 -19
  262. data/features/user/user_show.feature +0 -9
  263. data/lib/ab_admin/hooks/quiet_scope_page.rb +0 -16
  264. data/lib/ab_admin/hooks/simple_form_hooks.rb +0 -31
  265. data/lib/ab_admin/menu_builder.rb +0 -89
  266. data/lib/ab_admin/views/inputs/date_time_input.rb +0 -65
  267. data/lib/generators/ab_admin/install/templates/models/user_state.rb +0 -6
  268. data/lib/generators/ab_admin/resource/templates/_form.haml.erb +0 -71
  269. data/lib/generators/ab_admin/resource/templates/_search_form.haml.erb +0 -35
  270. data/lib/generators/ab_admin/resource/templates/_table.haml.erb +0 -33
  271. data/spec/ab_admin_spec.rb +0 -23
  272. data/spec/dummy/Rakefile +0 -7
  273. data/spec/dummy/app/assets/images/rails.png +0 -0
  274. data/spec/dummy/app/assets/javascripts/application.js +0 -15
  275. data/spec/dummy/app/assets/stylesheets/application.css +0 -13
  276. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  277. data/spec/dummy/app/controllers/products_controller.rb +0 -5
  278. data/spec/dummy/app/controllers/welcome_controller.rb +0 -5
  279. data/spec/dummy/app/mailers/.gitkeep +0 -0
  280. data/spec/dummy/app/models/ab_admin/ab_admin_catalogue.rb +0 -5
  281. data/spec/dummy/app/models/ab_admin/ab_admin_collection.rb +0 -35
  282. data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +0 -74
  283. data/spec/dummy/app/models/admin_menu.rb +0 -18
  284. data/spec/dummy/app/models/catalogue.rb +0 -10
  285. data/spec/dummy/app/models/ckeditor/asset.rb +0 -7
  286. data/spec/dummy/app/models/ckeditor/attachment_file.rb +0 -7
  287. data/spec/dummy/app/models/ckeditor/picture.rb +0 -7
  288. data/spec/dummy/app/models/collection.rb +0 -20
  289. data/spec/dummy/app/models/product.rb +0 -32
  290. data/spec/dummy/app/uploaders/ckeditor_attachment_file_uploader.rb +0 -42
  291. data/spec/dummy/app/uploaders/ckeditor_picture_uploader.rb +0 -53
  292. data/spec/dummy/app/views/admin/collections/_form.html.slim +0 -24
  293. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  294. data/spec/dummy/app/views/products/show.html.erb +0 -2
  295. data/spec/dummy/app/views/welcome/index.html.erb +0 -2
  296. data/spec/dummy/config.ru +0 -4
  297. data/spec/dummy/config/application.rb +0 -82
  298. data/spec/dummy/config/boot.rb +0 -10
  299. data/spec/dummy/config/database.yml +0 -26
  300. data/spec/dummy/config/environment.rb +0 -5
  301. data/spec/dummy/config/environments/development.rb +0 -37
  302. data/spec/dummy/config/environments/production.rb +0 -67
  303. data/spec/dummy/config/environments/test.rb +0 -37
  304. data/spec/dummy/config/i18n-js.yml +0 -21
  305. data/spec/dummy/config/initializers/ab_admin.rb +0 -15
  306. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  307. data/spec/dummy/config/initializers/ckeditor.rb +0 -18
  308. data/spec/dummy/config/initializers/devise.rb +0 -232
  309. data/spec/dummy/config/initializers/inflections.rb +0 -15
  310. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  311. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  312. data/spec/dummy/config/initializers/session_store.rb +0 -8
  313. data/spec/dummy/config/initializers/simple_form.rb +0 -142
  314. data/spec/dummy/config/initializers/simple_form_bootstrap.rb +0 -45
  315. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  316. data/spec/dummy/config/locales/devise.en.yml +0 -60
  317. data/spec/dummy/config/locales/en.yml +0 -5
  318. data/spec/dummy/config/locales/simple_form.en.yml +0 -26
  319. data/spec/dummy/config/routes.rb +0 -14
  320. data/spec/dummy/config/settings/development.local.yml +0 -9
  321. data/spec/dummy/config/settings/development.yml +0 -7
  322. data/spec/dummy/db/migrate/20130129151853_create_ckeditor_assets.rb +0 -26
  323. data/spec/dummy/db/migrate/20130130161853_create_collections.rb +0 -10
  324. data/spec/dummy/db/migrate/20130130162046_create_products.rb +0 -13
  325. data/spec/dummy/db/migrate/20130130175446_create_globalize_collection_product.rb +0 -11
  326. data/spec/dummy/db/migrate/20130207224516_create_catalogues.rb +0 -16
  327. data/spec/dummy/db/migrate/20130209223506_add_lat_lon_zoom_to_products.rb +0 -7
  328. data/spec/dummy/db/seeds.rb +0 -46
  329. data/spec/dummy/lib/assets/.gitkeep +0 -0
  330. data/spec/dummy/lib/capybara_irb.rb +0 -42
  331. data/spec/dummy/lib/tasks/.gitkeep +0 -0
  332. data/spec/dummy/lib/tasks/cucumber.rake +0 -65
  333. data/spec/dummy/lib/templates/slim/scaffold/_form.html.slim +0 -10
  334. data/spec/dummy/log/.gitkeep +0 -0
  335. data/spec/dummy/public/404.html +0 -26
  336. data/spec/dummy/public/422.html +0 -26
  337. data/spec/dummy/public/500.html +0 -25
  338. data/spec/dummy/public/favicon.ico +0 -0
  339. data/spec/dummy/script/cucumber +0 -10
  340. data/spec/dummy/script/rails +0 -6
  341. data/spec/factories/assets.rb +0 -52
  342. data/spec/factories/catalogues.rb +0 -7
  343. data/spec/factories/collections.rb +0 -8
  344. data/spec/factories/files/rails.png +0 -0
  345. data/spec/factories/products.rb +0 -17
  346. data/spec/factories/sequences.rb +0 -7
  347. data/spec/factories/structures.rb +0 -17
  348. data/spec/factories/users.rb +0 -30
  349. data/spec/generators/ckeditor_assets_generator_spec.rb +0 -19
  350. data/spec/generators/install_generator_spec.rb +0 -48
  351. data/spec/generators/model_generator_spec.rb +0 -31
  352. data/spec/generators/resource_generator_spec.rb +0 -36
  353. data/spec/models/ab_admin/abstract_resource_spec.rb +0 -5
  354. data/spec/models/avatar_spec.rb +0 -162
  355. data/spec/models/picture_uploader_spec.rb +0 -49
  356. data/spec/models/structure_spec.rb +0 -69
  357. data/spec/models/user_spec.rb +0 -159
  358. data/spec/shared_behaviors/concerns.rb +0 -20
  359. data/spec/spec_helper.rb +0 -96
  360. data/spec/support/controller_macros.rb +0 -52
  361. data/spec/support/custom_capybara_matchers.rb +0 -58
  362. data/spec/support/mailer_macros.rb +0 -17
  363. data/spec/support/shared_connection.rb +0 -11
  364. data/vendor/assets/images/ab_admin/clear.png +0 -0
  365. data/vendor/assets/images/ab_admin/loading.gif +0 -0
  366. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/core.js +0 -899
  367. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/index.js +0 -2
  368. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.bg.js +0 -14
  369. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.br.js +0 -13
  370. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.cs.js +0 -14
  371. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.da.js +0 -14
  372. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.de.js +0 -14
  373. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.es.js +0 -14
  374. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.fi.js +0 -14
  375. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.fr.js +0 -14
  376. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.id.js +0 -13
  377. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.is.js +0 -14
  378. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.it.js +0 -14
  379. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ja.js +0 -13
  380. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.kr.js +0 -13
  381. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.lt.js +0 -15
  382. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.lv.js +0 -16
  383. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ms.js +0 -14
  384. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.nb.js +0 -14
  385. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.nl.js +0 -14
  386. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.pl.js +0 -14
  387. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.pt-BR.js +0 -14
  388. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.pt.js +0 -14
  389. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ro.js +0 -15
  390. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ru.js +0 -14
  391. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.sk.js +0 -14
  392. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.sl.js +0 -14
  393. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.sv.js +0 -14
  394. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.th.js +0 -14
  395. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.tr.js +0 -15
  396. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.js +0 -14
  397. data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.zh-TW.js +0 -13
  398. data/vendor/assets/javascripts/ab_admin/bootstrap-editable-inline.js +0 -2895
  399. data/vendor/assets/javascripts/ab_admin/bootstrap-editable.js +0 -4523
  400. data/vendor/assets/javascripts/ab_admin/bootstrap-tab-multi.js +0 -135
  401. data/vendor/assets/javascripts/ab_admin/bootstrap-timepicker.js +0 -377
  402. data/vendor/assets/javascripts/ab_admin/fileupload/admin-fileuploader.js.coffee +0 -111
  403. data/vendor/assets/javascripts/ab_admin/fileupload/fileuploader.js +0 -1301
  404. data/vendor/assets/javascripts/ab_admin/jquery.Jcrop.js +0 -1083
  405. data/vendor/assets/javascripts/ab_admin/jquery_nested_form.js.coffee +0 -66
  406. data/vendor/assets/javascripts/bootstrap-wysihtml5/locales/ru.js +0 -48
  407. data/vendor/assets/javascripts/handlebars.min.js +0 -1
  408. data/vendor/assets/javascripts/jquery.cookie.js +0 -42
  409. data/vendor/assets/javascripts/jquery.hotkeys.js +0 -106
  410. data/vendor/assets/javascripts/jquery.pjax.js +0 -688
  411. data/vendor/assets/javascripts/jquery.tmpl.min.js +0 -10
  412. data/vendor/assets/javascripts/jquery.ui.nestedSortable.js +0 -356
  413. data/vendor/assets/javascripts/jquery/jquery-ui.min.js +0 -15
  414. data/vendor/assets/javascripts/jquery/jquery.min.js +0 -4
  415. data/vendor/assets/javascripts/underscore.min.js +0 -5
  416. data/vendor/assets/stylesheets/ab_admin/bootstrap-datepicker.css.scss +0 -274
  417. data/vendor/assets/stylesheets/ab_admin/bootstrap-editable.scss +0 -461
  418. data/vendor/assets/stylesheets/ab_admin/bootstrap-timepicker.css.scss +0 -88
  419. data/vendor/assets/stylesheets/ab_admin/jquery.Jcrop.min.css.scss +0 -28
@@ -1,58 +0,0 @@
1
- #RSpec::Matchers.define :have_widget_elements_for do |widget|
2
- # match do |actual|
3
- # order_pattern = begin
4
- # lines = actual.collect { |line| line.gsub(/\s+/, ' ') }.collect(&:strip).reject(&:blank?)
5
- # pattern = lines.collect(&Regexp.method(:quote)).join('.*?')
6
- # Regexp.compile(pattern)
7
- # end
8
- # page.find('body').text.gsub(/\s+/, ' ') =~ order_pattern
9
- # end
10
- #
11
- # failure_message_for_should do |actual|
12
- # "expected 2 but got '#{actual}'"
13
- # end
14
- #
15
- # failure_message_for_should_not do |actual|
16
- # "expected something else then 2 but got '#{actual}'"
17
- # end
18
- #end
19
-
20
- #module CustomCapybaraMatchers
21
- # class HaveOrderedList
22
- #
23
- # def matches?(actual)
24
- # @actual = wrap(actual)
25
- # @actual.text.gsub(/\s+/, ' ') =~ order_pattern
26
- # end
27
- #
28
- # def order_pattern
29
- # lines = @actual.collect { |line| line.gsub(/\s+/, ' ') }.collect(&:strip).reject(&:blank?)
30
- # pattern = lines.collect(&Regexp.method(:quote)).join('.*?')
31
- # Regexp.compile(pattern)
32
- # end
33
- #
34
- # def failure_message
35
- # "expected 2 but got '#{@actual}'"
36
- # end
37
- #
38
- # def negative_failure_message
39
- # "expected something else then 2 but got '#{@actual}'"
40
- # end
41
- #
42
- # def wrap(actual)
43
- # if actual.respond_to?("has_selector?")
44
- # actual
45
- # else
46
- # Capybara.string(actual.to_s)
47
- # end
48
- # end
49
- #
50
- # def format(text)
51
- # text = Capybara::Helpers.normalize_whitespace(text) unless text.is_a? Regexp
52
- # text.inspect
53
- # end
54
- #
55
- # end
56
- #
57
- #end
58
-
@@ -1,17 +0,0 @@
1
- module MailerMacros
2
- def last_email
3
- ActionMailer::Base.deliveries.last
4
- end
5
-
6
- def reset_email
7
- ActionMailer::Base.deliveries = []
8
- end
9
-
10
- def email_count
11
- ActionMailer::Base.deliveries.size
12
- end
13
-
14
- def deliveries
15
- ActionMailer::Base.deliveries
16
- end
17
- end
@@ -1,11 +0,0 @@
1
- class ActiveRecord::Base
2
- mattr_accessor :shared_connection
3
- @@shared_connection = nil
4
-
5
- def self.connection
6
- @@shared_connection || ConnectionPool::Wrapper.new(size: 1) { retrieve_connection }
7
- #@@shared_connection || retrieve_connection end
8
- end
9
- end
10
-
11
- ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
@@ -1,899 +0,0 @@
1
- /* =========================================================
2
- * bootstrap-datepicker.js
3
- * http://www.eyecon.ro/bootstrap-datepicker
4
- * =========================================================
5
- * Copyright 2012 Stefan Petre
6
- * Improvements by Andrew Rowls
7
- *
8
- * Licensed under the Apache License, Version 2.0 (the "License");
9
- * you may not use this file except in compliance with the License.
10
- * You may obtain a copy of the License at
11
- *
12
- * http://www.apache.org/licenses/LICENSE-2.0
13
- *
14
- * Unless required by applicable law or agreed to in writing, software
15
- * distributed under the License is distributed on an "AS IS" BASIS,
16
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- * See the License for the specific language governing permissions and
18
- * limitations under the License.
19
- * ========================================================= */
20
-
21
- !function( $ ) {
22
-
23
- function UTCDate(){
24
- return new Date(Date.UTC.apply(Date, arguments));
25
- }
26
- function UTCToday(){
27
- var today = new Date();
28
- return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate());
29
- }
30
-
31
- // Picker object
32
-
33
- var Datepicker = function(element, options) {
34
- var that = this;
35
-
36
- this.element = $(element);
37
- this.language = options.language||this.element.data('date-language')||"en";
38
- this.language = this.language in dates ? this.language : "en";
39
- this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy');
40
- this.picker = $(DPGlobal.template)
41
- .appendTo('body')
42
- .on({
43
- click: $.proxy(this.click, this)
44
- });
45
- this.isInput = this.element.is('input');
46
- this.component = this.element.is('.date') ? this.element.find('.add-on') : false;
47
- this.hasInput = this.component && this.element.find('input').length;
48
- if(this.component && this.component.length === 0)
49
- this.component = false;
50
-
51
- this._attachEvents();
52
-
53
- this.forceParse = true;
54
- if ('forceParse' in options) {
55
- this.forceParse = options.forceParse;
56
- } else if ('dateForceParse' in this.element.data()) {
57
- this.forceParse = this.element.data('date-force-parse');
58
- }
59
-
60
- $(document).on('mousedown', function (e) {
61
- // Clicked outside the datepicker, hide it
62
- if ($(e.target).closest('.datepicker').length == 0) {
63
- that.hide();
64
- }
65
- });
66
-
67
- this.autoclose = false;
68
- if ('autoclose' in options) {
69
- this.autoclose = options.autoclose;
70
- } else if ('dateAutoclose' in this.element.data()) {
71
- this.autoclose = this.element.data('date-autoclose');
72
- }
73
-
74
- this.keyboardNavigation = true;
75
- if ('keyboardNavigation' in options) {
76
- this.keyboardNavigation = options.keyboardNavigation;
77
- } else if ('dateKeyboardNavigation' in this.element.data()) {
78
- this.keyboardNavigation = this.element.data('date-keyboard-navigation');
79
- }
80
-
81
- switch(options.startView || this.element.data('date-start-view')){
82
- case 2:
83
- case 'decade':
84
- this.viewMode = this.startViewMode = 2;
85
- break;
86
- case 1:
87
- case 'year':
88
- this.viewMode = this.startViewMode = 1;
89
- break;
90
- case 0:
91
- case 'month':
92
- default:
93
- this.viewMode = this.startViewMode = 0;
94
- break;
95
- }
96
-
97
- this.todayBtn = (options.todayBtn||this.element.data('date-today-btn')||false);
98
- this.todayHighlight = (options.todayHighlight||this.element.data('date-today-highlight')||false);
99
-
100
- this.weekStart = ((options.weekStart||this.element.data('date-weekstart')||dates[this.language].weekStart||0) % 7);
101
- this.weekEnd = ((this.weekStart + 6) % 7);
102
- this.startDate = -Infinity;
103
- this.endDate = Infinity;
104
- this.daysOfWeekDisabled = [];
105
- this.setStartDate(options.startDate||this.element.data('date-startdate'));
106
- this.setEndDate(options.endDate||this.element.data('date-enddate'));
107
- this.setDaysOfWeekDisabled(options.daysOfWeekDisabled||this.element.data('date-days-of-week-disabled'));
108
- this.fillDow();
109
- this.fillMonths();
110
- this.update();
111
- this.showMode();
112
- };
113
-
114
- Datepicker.prototype = {
115
- constructor: Datepicker,
116
-
117
- _events: [],
118
- _attachEvents: function(){
119
- this._detachEvents();
120
- if (this.isInput) {
121
- this._events = [
122
- [this.element, {
123
- focus: $.proxy(this.show, this),
124
- keyup: $.proxy(this.update, this),
125
- keydown: $.proxy(this.keydown, this)
126
- }]
127
- ];
128
- }
129
- else if (this.component && this.hasInput){
130
- this._events = [
131
- // For components that are not readonly, allow keyboard nav
132
- [this.element.find('input'), {
133
- focus: $.proxy(this.show, this),
134
- keyup: $.proxy(this.update, this),
135
- keydown: $.proxy(this.keydown, this)
136
- }],
137
- [this.component, {
138
- click: $.proxy(this.show, this)
139
- }]
140
- ];
141
- }
142
- else {
143
- this._events = [
144
- [this.element, {
145
- click: $.proxy(this.show, this)
146
- }]
147
- ];
148
- }
149
- for (var i=0, el, ev; i<this._events.length; i++){
150
- el = this._events[i][0];
151
- ev = this._events[i][1];
152
- el.on(ev);
153
- }
154
- },
155
- _detachEvents: function(){
156
- for (var i=0, el, ev; i<this._events.length; i++){
157
- el = this._events[i][0];
158
- ev = this._events[i][1];
159
- el.off(ev);
160
- }
161
- this._events = [];
162
- },
163
-
164
- show: function(e) {
165
- this.picker.show();
166
- this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
167
- this.update();
168
- this.place();
169
- $(window).on('resize', $.proxy(this.place, this));
170
- if (e ) {
171
- e.stopPropagation();
172
- e.preventDefault();
173
- }
174
- this.element.trigger({
175
- type: 'show',
176
- date: this.date
177
- });
178
- },
179
-
180
- hide: function(e){
181
- this.picker.hide();
182
- $(window).off('resize', this.place);
183
- this.viewMode = this.startViewMode;
184
- this.showMode();
185
- if (!this.isInput) {
186
- $(document).off('mousedown', this.hide);
187
- }
188
-
189
- if (
190
- this.forceParse &&
191
- (
192
- this.isInput && this.element.val() ||
193
- this.hasInput && this.element.find('input').val()
194
- )
195
- )
196
- this.setValue();
197
- this.element.trigger({
198
- type: 'hide',
199
- date: this.date
200
- });
201
- },
202
-
203
- remove: function() {
204
- this._detachEvents();
205
- this.picker.remove();
206
- delete this.element.data().datepicker;
207
- },
208
-
209
- getDate: function() {
210
- var d = this.getUTCDate();
211
- return new Date(d.getTime() + (d.getTimezoneOffset()*60000))
212
- },
213
-
214
- getUTCDate: function() {
215
- return this.date;
216
- },
217
-
218
- setDate: function(d) {
219
- this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset()*60000)));
220
- },
221
-
222
- setUTCDate: function(d) {
223
- this.date = d;
224
- this.setValue();
225
- },
226
-
227
- setValue: function() {
228
- var formatted = DPGlobal.formatDate(this.date, this.format, this.language);
229
- if (!this.isInput) {
230
- if (this.component){
231
- this.element.find('input').prop('value', formatted);
232
- }
233
- this.element.data('date', formatted);
234
- } else {
235
- this.element.prop('value', formatted);
236
- }
237
- },
238
-
239
- setStartDate: function(startDate){
240
- this.startDate = startDate||-Infinity;
241
- if (this.startDate !== -Infinity) {
242
- this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language);
243
- }
244
- this.update();
245
- this.updateNavArrows();
246
- },
247
-
248
- setEndDate: function(endDate){
249
- this.endDate = endDate||Infinity;
250
- if (this.endDate !== Infinity) {
251
- this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language);
252
- }
253
- this.update();
254
- this.updateNavArrows();
255
- },
256
-
257
- setDaysOfWeekDisabled: function(daysOfWeekDisabled){
258
- this.daysOfWeekDisabled = daysOfWeekDisabled||[];
259
- if (!$.isArray(this.daysOfWeekDisabled)) {
260
- this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/);
261
- }
262
- this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function (d) {
263
- return parseInt(d, 10);
264
- });
265
- this.update();
266
- this.updateNavArrows();
267
- },
268
-
269
- place: function(){
270
- var zIndex = parseInt(this.element.parents().filter(function() {
271
- return $(this).css('z-index') != 'auto';
272
- }).first().css('z-index'))+10;
273
- var offset = this.component ? this.component.offset() : this.element.offset();
274
- this.picker.css({
275
- top: offset.top + this.height,
276
- left: offset.left,
277
- zIndex: zIndex
278
- });
279
- },
280
-
281
- update: function(){
282
- this.date = DPGlobal.parseDate(
283
- this.isInput ? this.element.prop('value') : this.element.data('date') || this.element.find('input').prop('value'),
284
- this.format, this.language
285
- );
286
- if (this.date < this.startDate) {
287
- this.viewDate = new Date(this.startDate);
288
- } else if (this.date > this.endDate) {
289
- this.viewDate = new Date(this.endDate);
290
- } else {
291
- this.viewDate = new Date(this.date);
292
- }
293
- this.fill();
294
- },
295
-
296
- fillDow: function(){
297
- var dowCnt = this.weekStart;
298
- var html = '<tr>';
299
- while (dowCnt < this.weekStart + 7) {
300
- html += '<th class="dow">'+dates[this.language].daysMin[(dowCnt++)%7]+'</th>';
301
- }
302
- html += '</tr>';
303
- this.picker.find('.datepicker-days thead').append(html);
304
- },
305
-
306
- fillMonths: function(){
307
- var html = '';
308
- var i = 0
309
- while (i < 12) {
310
- html += '<span class="month">'+dates[this.language].monthsShort[i++]+'</span>';
311
- }
312
- this.picker.find('.datepicker-months td').html(html);
313
- },
314
-
315
- fill: function() {
316
- var d = new Date(this.viewDate),
317
- year = d.getUTCFullYear(),
318
- month = d.getUTCMonth(),
319
- startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity,
320
- startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity,
321
- endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity,
322
- endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity,
323
- currentDate = this.date.valueOf(),
324
- today = new Date();
325
- this.picker.find('.datepicker-days thead th:eq(1)')
326
- .text(dates[this.language].months[month]+' '+year);
327
- this.picker.find('tfoot th.today')
328
- .text(dates[this.language].today)
329
- .toggle(this.todayBtn !== false);
330
- this.updateNavArrows();
331
- this.fillMonths();
332
- var prevMonth = UTCDate(year, month-1, 28,0,0,0,0),
333
- day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
334
- prevMonth.setUTCDate(day);
335
- prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7)%7);
336
- var nextMonth = new Date(prevMonth);
337
- nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
338
- nextMonth = nextMonth.valueOf();
339
- var html = [];
340
- var clsName;
341
- while(prevMonth.valueOf() < nextMonth) {
342
- if (prevMonth.getUTCDay() == this.weekStart) {
343
- html.push('<tr>');
344
- }
345
- clsName = '';
346
- if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) {
347
- clsName += ' old';
348
- } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) {
349
- clsName += ' new';
350
- }
351
- // Compare internal UTC date with local today, not UTC today
352
- if (this.todayHighlight &&
353
- prevMonth.getUTCFullYear() == today.getFullYear() &&
354
- prevMonth.getUTCMonth() == today.getMonth() &&
355
- prevMonth.getUTCDate() == today.getDate()) {
356
- clsName += ' today';
357
- }
358
- if (prevMonth.valueOf() == currentDate) {
359
- clsName += ' active';
360
- }
361
- if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate ||
362
- $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1) {
363
- clsName += ' disabled';
364
- }
365
- html.push('<td class="day'+clsName+'">'+prevMonth.getUTCDate() + '</td>');
366
- if (prevMonth.getUTCDay() == this.weekEnd) {
367
- html.push('</tr>');
368
- }
369
- prevMonth.setUTCDate(prevMonth.getUTCDate()+1);
370
- }
371
- this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
372
- var currentYear = this.date.getUTCFullYear();
373
-
374
- var months = this.picker.find('.datepicker-months')
375
- .find('th:eq(1)')
376
- .text(year)
377
- .end()
378
- .find('span').removeClass('active');
379
- if (currentYear == year) {
380
- months.eq(this.date.getUTCMonth()).addClass('active');
381
- }
382
- if (year < startYear || year > endYear) {
383
- months.addClass('disabled');
384
- }
385
- if (year == startYear) {
386
- months.slice(0, startMonth).addClass('disabled');
387
- }
388
- if (year == endYear) {
389
- months.slice(endMonth+1).addClass('disabled');
390
- }
391
-
392
- html = '';
393
- year = parseInt(year/10, 10) * 10;
394
- var yearCont = this.picker.find('.datepicker-years')
395
- .find('th:eq(1)')
396
- .text(year + '-' + (year + 9))
397
- .end()
398
- .find('td');
399
- year -= 1;
400
- for (var i = -1; i < 11; i++) {
401
- html += '<span class="year'+(i == -1 || i == 10 ? ' old' : '')+(currentYear == year ? ' active' : '')+(year < startYear || year > endYear ? ' disabled' : '')+'">'+year+'</span>';
402
- year += 1;
403
- }
404
- yearCont.html(html);
405
- },
406
-
407
- updateNavArrows: function() {
408
- var d = new Date(this.viewDate),
409
- year = d.getUTCFullYear(),
410
- month = d.getUTCMonth();
411
- switch (this.viewMode) {
412
- case 0:
413
- if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth()) {
414
- this.picker.find('.prev').css({visibility: 'hidden'});
415
- } else {
416
- this.picker.find('.prev').css({visibility: 'visible'});
417
- }
418
- if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth()) {
419
- this.picker.find('.next').css({visibility: 'hidden'});
420
- } else {
421
- this.picker.find('.next').css({visibility: 'visible'});
422
- }
423
- break;
424
- case 1:
425
- case 2:
426
- if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) {
427
- this.picker.find('.prev').css({visibility: 'hidden'});
428
- } else {
429
- this.picker.find('.prev').css({visibility: 'visible'});
430
- }
431
- if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()) {
432
- this.picker.find('.next').css({visibility: 'hidden'});
433
- } else {
434
- this.picker.find('.next').css({visibility: 'visible'});
435
- }
436
- break;
437
- }
438
- },
439
-
440
- click: function(e) {
441
- e.stopPropagation();
442
- e.preventDefault();
443
- var target = $(e.target).closest('span, td, th');
444
- if (target.length == 1) {
445
- switch(target[0].nodeName.toLowerCase()) {
446
- case 'th':
447
- switch(target[0].className) {
448
- case 'switch':
449
- this.showMode(1);
450
- break;
451
- case 'prev':
452
- case 'next':
453
- var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1);
454
- switch(this.viewMode){
455
- case 0:
456
- this.viewDate = this.moveMonth(this.viewDate, dir);
457
- break;
458
- case 1:
459
- case 2:
460
- this.viewDate = this.moveYear(this.viewDate, dir);
461
- break;
462
- }
463
- this.fill();
464
- break;
465
- case 'today':
466
- var date = new Date();
467
- date.setUTCHours(0);
468
- date.setUTCMinutes(0);
469
- date.setUTCSeconds(0);
470
- date.setUTCMilliseconds(0);
471
-
472
- this.showMode(-2);
473
- var which = this.todayBtn == 'linked' ? null : 'view';
474
- this._setDate(date, which);
475
- break;
476
- }
477
- break;
478
- case 'span':
479
- if (!target.is('.disabled')) {
480
- this.viewDate.setUTCDate(1);
481
- if (target.is('.month')) {
482
- var month = target.parent().find('span').index(target);
483
- this.viewDate.setUTCMonth(month);
484
- this.element.trigger({
485
- type: 'changeMonth',
486
- date: this.viewDate
487
- });
488
- } else {
489
- var year = parseInt(target.text(), 10)||0;
490
- this.viewDate.setUTCFullYear(year);
491
- this.element.trigger({
492
- type: 'changeYear',
493
- date: this.viewDate
494
- });
495
- }
496
- this.showMode(-1);
497
- this.fill();
498
- }
499
- break;
500
- case 'td':
501
- if (target.is('.day') && !target.is('.disabled')){
502
- var day = parseInt(target.text(), 10)||1;
503
- var year = this.viewDate.getUTCFullYear(),
504
- month = this.viewDate.getUTCMonth();
505
- if (target.is('.old')) {
506
- if (month == 0) {
507
- month = 11;
508
- year -= 1;
509
- } else {
510
- month -= 1;
511
- }
512
- } else if (target.is('.new')) {
513
- if (month == 11) {
514
- month = 0;
515
- year += 1;
516
- } else {
517
- month += 1;
518
- }
519
- }
520
- this._setDate(UTCDate(year, month, day,0,0,0,0));
521
- }
522
- break;
523
- }
524
- }
525
- },
526
-
527
- _setDate: function(date, which){
528
- if (!which || which == 'date')
529
- this.date = date;
530
- if (!which || which == 'view')
531
- this.viewDate = date;
532
- this.fill();
533
- this.setValue();
534
- this.element.trigger({
535
- type: 'changeDate',
536
- date: this.date
537
- });
538
- var element;
539
- if (this.isInput) {
540
- element = this.element;
541
- } else if (this.component){
542
- element = this.element.find('input');
543
- }
544
- if (element) {
545
- element.change();
546
- if (this.autoclose) {
547
- this.hide();
548
- }
549
- }
550
- },
551
-
552
- moveMonth: function(date, dir){
553
- if (!dir) return date;
554
- var new_date = new Date(date.valueOf()),
555
- day = new_date.getUTCDate(),
556
- month = new_date.getUTCMonth(),
557
- mag = Math.abs(dir),
558
- new_month, test;
559
- dir = dir > 0 ? 1 : -1;
560
- if (mag == 1){
561
- test = dir == -1
562
- // If going back one month, make sure month is not current month
563
- // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
564
- ? function(){ return new_date.getUTCMonth() == month; }
565
- // If going forward one month, make sure month is as expected
566
- // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
567
- : function(){ return new_date.getUTCMonth() != new_month; };
568
- new_month = month + dir;
569
- new_date.setUTCMonth(new_month);
570
- // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
571
- if (new_month < 0 || new_month > 11)
572
- new_month = (new_month + 12) % 12;
573
- } else {
574
- // For magnitudes >1, move one month at a time...
575
- for (var i=0; i<mag; i++)
576
- // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
577
- new_date = this.moveMonth(new_date, dir);
578
- // ...then reset the day, keeping it in the new month
579
- new_month = new_date.getUTCMonth();
580
- new_date.setUTCDate(day);
581
- test = function(){ return new_month != new_date.getUTCMonth(); };
582
- }
583
- // Common date-resetting loop -- if date is beyond end of month, make it
584
- // end of month
585
- while (test()){
586
- new_date.setUTCDate(--day);
587
- new_date.setUTCMonth(new_month);
588
- }
589
- return new_date;
590
- },
591
-
592
- moveYear: function(date, dir){
593
- return this.moveMonth(date, dir*12);
594
- },
595
-
596
- dateWithinRange: function(date){
597
- return date >= this.startDate && date <= this.endDate;
598
- },
599
-
600
- keydown: function(e){
601
- if (this.picker.is(':not(:visible)')){
602
- if (e.keyCode == 27) // allow escape to hide and re-show picker
603
- this.show();
604
- return;
605
- }
606
- var dateChanged = false,
607
- dir, day, month,
608
- newDate, newViewDate;
609
- switch(e.keyCode){
610
- case 27: // escape
611
- this.hide();
612
- e.preventDefault();
613
- break;
614
- case 37: // left
615
- case 39: // right
616
- if (!this.keyboardNavigation) break;
617
- dir = e.keyCode == 37 ? -1 : 1;
618
- if (e.ctrlKey){
619
- newDate = this.moveYear(this.date, dir);
620
- newViewDate = this.moveYear(this.viewDate, dir);
621
- } else if (e.shiftKey){
622
- newDate = this.moveMonth(this.date, dir);
623
- newViewDate = this.moveMonth(this.viewDate, dir);
624
- } else {
625
- newDate = new Date(this.date);
626
- newDate.setUTCDate(this.date.getUTCDate() + dir);
627
- newViewDate = new Date(this.viewDate);
628
- newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir);
629
- }
630
- if (this.dateWithinRange(newDate)){
631
- this.date = newDate;
632
- this.viewDate = newViewDate;
633
- this.setValue();
634
- this.update();
635
- e.preventDefault();
636
- dateChanged = true;
637
- }
638
- break;
639
- case 38: // up
640
- case 40: // down
641
- if (!this.keyboardNavigation) break;
642
- dir = e.keyCode == 38 ? -1 : 1;
643
- if (e.ctrlKey){
644
- newDate = this.moveYear(this.date, dir);
645
- newViewDate = this.moveYear(this.viewDate, dir);
646
- } else if (e.shiftKey){
647
- newDate = this.moveMonth(this.date, dir);
648
- newViewDate = this.moveMonth(this.viewDate, dir);
649
- } else {
650
- newDate = new Date(this.date);
651
- newDate.setUTCDate(this.date.getUTCDate() + dir * 7);
652
- newViewDate = new Date(this.viewDate);
653
- newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir * 7);
654
- }
655
- if (this.dateWithinRange(newDate)){
656
- this.date = newDate;
657
- this.viewDate = newViewDate;
658
- this.setValue();
659
- this.update();
660
- e.preventDefault();
661
- dateChanged = true;
662
- }
663
- break;
664
- case 13: // enter
665
- this.hide();
666
- e.preventDefault();
667
- break;
668
- case 9: // tab
669
- this.hide();
670
- break;
671
- }
672
- if (dateChanged){
673
- this.element.trigger({
674
- type: 'changeDate',
675
- date: this.date
676
- });
677
- var element;
678
- if (this.isInput) {
679
- element = this.element;
680
- } else if (this.component){
681
- element = this.element.find('input');
682
- }
683
- if (element) {
684
- element.change();
685
- }
686
- }
687
- },
688
-
689
- showMode: function(dir) {
690
- if (dir) {
691
- this.viewMode = Math.max(0, Math.min(2, this.viewMode + dir));
692
- }
693
- this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
694
- this.updateNavArrows();
695
- }
696
- };
697
-
698
- $.fn.datepicker = function ( option ) {
699
- var args = Array.apply(null, arguments);
700
- args.shift();
701
- return this.each(function () {
702
- var $this = $(this),
703
- data = $this.data('datepicker'),
704
- options = typeof option == 'object' && option;
705
- if (!data) {
706
- $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options))));
707
- }
708
- if (typeof option == 'string' && typeof data[option] == 'function') {
709
- data[option].apply(data, args);
710
- }
711
- });
712
- };
713
-
714
- $.fn.datepicker.defaults = {
715
- };
716
- $.fn.datepicker.Constructor = Datepicker;
717
- var dates = $.fn.datepicker.dates = {
718
- en: {
719
- days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
720
- daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
721
- daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
722
- months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
723
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
724
- today: "Today"
725
- }
726
- }
727
-
728
- var DPGlobal = {
729
- modes: [
730
- {
731
- clsName: 'days',
732
- navFnc: 'Month',
733
- navStep: 1
734
- },
735
- {
736
- clsName: 'months',
737
- navFnc: 'FullYear',
738
- navStep: 1
739
- },
740
- {
741
- clsName: 'years',
742
- navFnc: 'FullYear',
743
- navStep: 10
744
- }],
745
- isLeapYear: function (year) {
746
- return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
747
- },
748
- getDaysInMonth: function (year, month) {
749
- return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
750
- },
751
- validParts: /dd?|mm?|MM?|yy(?:yy)?/g,
752
- nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\r]+/g,
753
- parseFormat: function(format){
754
- // IE treats \0 as a string end in inputs (truncating the value),
755
- // so it's a bad format delimiter, anyway
756
- var separators = format.replace(this.validParts, '\0').split('\0'),
757
- parts = format.match(this.validParts);
758
- if (!separators || !separators.length || !parts || parts.length == 0){
759
- throw new Error("Invalid date format.");
760
- }
761
- return {separators: separators, parts: parts};
762
- },
763
- parseDate: function(date, format, language) {
764
- if (date instanceof Date) return date;
765
- if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) {
766
- var part_re = /([-+]\d+)([dmwy])/,
767
- parts = date.match(/([-+]\d+)([dmwy])/g),
768
- part, dir;
769
- date = new Date();
770
- for (var i=0; i<parts.length; i++) {
771
- part = part_re.exec(parts[i]);
772
- dir = parseInt(part[1]);
773
- switch(part[2]){
774
- case 'd':
775
- date.setUTCDate(date.getUTCDate() + dir);
776
- break;
777
- case 'm':
778
- date = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);
779
- break;
780
- case 'w':
781
- date.setUTCDate(date.getUTCDate() + dir * 7);
782
- break;
783
- case 'y':
784
- date = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);
785
- break;
786
- }
787
- }
788
- return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);
789
- }
790
- var parts = date && date.match(this.nonpunctuation) || [],
791
- date = new Date(),
792
- parsed = {},
793
- setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
794
- setters_map = {
795
- yyyy: function(d,v){ return d.setUTCFullYear(v); },
796
- yy: function(d,v){ return d.setUTCFullYear(2000+v); },
797
- m: function(d,v){
798
- v -= 1;
799
- while (v<0) v += 12;
800
- v %= 12;
801
- d.setUTCMonth(v);
802
- while (d.getUTCMonth() != v)
803
- d.setUTCDate(d.getUTCDate()-1);
804
- return d;
805
- },
806
- d: function(d,v){ return d.setUTCDate(v); }
807
- },
808
- val, filtered, part;
809
- setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
810
- setters_map['dd'] = setters_map['d'];
811
- date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
812
- if (parts.length == format.parts.length) {
813
- for (var i=0, cnt = format.parts.length; i < cnt; i++) {
814
- val = parseInt(parts[i], 10);
815
- part = format.parts[i];
816
- if (isNaN(val)) {
817
- switch(part) {
818
- case 'MM':
819
- filtered = $(dates[language].months).filter(function(){
820
- var m = this.slice(0, parts[i].length),
821
- p = parts[i].slice(0, m.length);
822
- return m == p;
823
- });
824
- val = $.inArray(filtered[0], dates[language].months) + 1;
825
- break;
826
- case 'M':
827
- filtered = $(dates[language].monthsShort).filter(function(){
828
- var m = this.slice(0, parts[i].length),
829
- p = parts[i].slice(0, m.length);
830
- return m == p;
831
- });
832
- val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
833
- break;
834
- }
835
- }
836
- parsed[part] = val;
837
- }
838
- for (var i=0, s; i<setters_order.length; i++){
839
- s = setters_order[i];
840
- if (s in parsed && !isNaN(parsed[s]))
841
- setters_map[s](date, parsed[s])
842
- }
843
- }
844
- return date;
845
- },
846
- formatDate: function(date, format, language){
847
- var val = {
848
- d: date.getUTCDate(),
849
- m: date.getUTCMonth() + 1,
850
- M: dates[language].monthsShort[date.getUTCMonth()],
851
- MM: dates[language].months[date.getUTCMonth()],
852
- yy: date.getUTCFullYear().toString().substring(2),
853
- yyyy: date.getUTCFullYear()
854
- };
855
- val.dd = (val.d < 10 ? '0' : '') + val.d;
856
- val.mm = (val.m < 10 ? '0' : '') + val.m;
857
- var date = [],
858
- seps = $.extend([], format.separators);
859
- for (var i=0, cnt = format.parts.length; i < cnt; i++) {
860
- if (seps.length)
861
- date.push(seps.shift())
862
- date.push(val[format.parts[i]]);
863
- }
864
- return date.join('');
865
- },
866
- headTemplate: '<thead>'+
867
- '<tr>'+
868
- '<th class="prev"><i class="icon-arrow-left"/></th>'+
869
- '<th colspan="5" class="switch"></th>'+
870
- '<th class="next"><i class="icon-arrow-right"/></th>'+
871
- '</tr>'+
872
- '</thead>',
873
- contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
874
- footTemplate: '<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'
875
- };
876
- DPGlobal.template = '<div class="datepicker dropdown-menu">'+
877
- '<div class="datepicker-days">'+
878
- '<table class=" table-condensed">'+
879
- DPGlobal.headTemplate+
880
- '<tbody></tbody>'+
881
- DPGlobal.footTemplate+
882
- '</table>'+
883
- '</div>'+
884
- '<div class="datepicker-months">'+
885
- '<table class="table-condensed">'+
886
- DPGlobal.headTemplate+
887
- DPGlobal.contTemplate+
888
- DPGlobal.footTemplate+
889
- '</table>'+
890
- '</div>'+
891
- '<div class="datepicker-years">'+
892
- '<table class="table-condensed">'+
893
- DPGlobal.headTemplate+
894
- DPGlobal.contTemplate+
895
- DPGlobal.footTemplate+
896
- '</table>'+
897
- '</div>'+
898
- '</div>';
899
- }( window.jQuery );