rails_admin 2.1.0 → 3.0.0.beta

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.

Potentially problematic release.


This version of rails_admin might be problematic. Click here for more details.

Files changed (343) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -11
  3. data/README.md +37 -31
  4. data/Rakefile +2 -2
  5. data/app/assets/javascripts/rails_admin.js +21 -0
  6. data/app/assets/stylesheets/rails_admin/custom/mixins.scss +1 -1
  7. data/app/assets/stylesheets/rails_admin/custom/variables.scss +1 -1
  8. data/app/assets/stylesheets/rails_admin.scss.erb +76 -0
  9. data/app/controllers/rails_admin/application_controller.rb +4 -3
  10. data/app/controllers/rails_admin/main_controller.rb +43 -24
  11. data/app/helpers/rails_admin/application_helper.rb +69 -52
  12. data/app/helpers/rails_admin/form_builder.rb +7 -4
  13. data/app/helpers/rails_admin/main_helper.rb +27 -43
  14. data/app/views/kaminari/ra-twitter-bootstrap/_gap.html.erb +5 -0
  15. data/app/views/kaminari/ra-twitter-bootstrap/_next_page.html.erb +9 -0
  16. data/app/views/kaminari/ra-twitter-bootstrap/_page.html.erb +9 -0
  17. data/app/views/kaminari/ra-twitter-bootstrap/_paginator.html.erb +13 -0
  18. data/app/views/kaminari/ra-twitter-bootstrap/_prev_page.html.erb +9 -0
  19. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_next_page.html.erb +9 -0
  20. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_paginator.html.erb +6 -0
  21. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_prev_page.html.erb +9 -0
  22. data/app/views/layouts/rails_admin/_head.html.erb +17 -0
  23. data/app/views/layouts/rails_admin/_navigation.html.erb +21 -0
  24. data/app/views/layouts/rails_admin/_secondary_navigation.html.erb +24 -0
  25. data/app/views/layouts/rails_admin/_sidebar_navigation.html.erb +9 -0
  26. data/app/views/layouts/rails_admin/application.html.erb +27 -0
  27. data/app/views/layouts/rails_admin/modal.js.erb +7 -0
  28. data/app/views/layouts/rails_admin/pjax.html.erb +20 -0
  29. data/app/views/rails_admin/main/_dashboard_history.html.erb +45 -0
  30. data/app/views/rails_admin/main/_delete_notice.html.erb +35 -0
  31. data/app/views/rails_admin/main/_form_action_text.html.erb +7 -0
  32. data/app/views/rails_admin/main/_form_boolean.html.erb +16 -0
  33. data/app/views/rails_admin/main/{_form_ck_editor.html.haml → _form_ck_editor.html.erb} +3 -3
  34. data/app/views/rails_admin/main/_form_code_mirror.html.erb +9 -0
  35. data/app/views/rails_admin/main/_form_colorpicker.html.erb +1 -0
  36. data/app/views/rails_admin/main/_form_datetime.html.erb +9 -0
  37. data/app/views/rails_admin/main/_form_enumeration.html.erb +21 -0
  38. data/app/views/rails_admin/main/_form_field.html.erb +1 -0
  39. data/app/views/rails_admin/main/_form_file_upload.html.erb +17 -0
  40. data/app/views/rails_admin/main/{_form_filtering_multiselect.html.haml → _form_filtering_multiselect.html.erb} +11 -11
  41. data/app/views/rails_admin/main/{_form_filtering_select.html.haml → _form_filtering_select.html.erb} +13 -12
  42. data/app/views/rails_admin/main/_form_froala.html.erb +8 -0
  43. data/app/views/rails_admin/main/_form_multiple_file_upload.html.erb +20 -0
  44. data/app/views/rails_admin/main/_form_nested_many.html.erb +21 -0
  45. data/app/views/rails_admin/main/_form_nested_one.html.erb +21 -0
  46. data/app/views/rails_admin/main/_form_polymorphic_association.html.erb +27 -0
  47. data/app/views/rails_admin/main/_form_simple_mde.html.erb +8 -0
  48. data/app/views/rails_admin/main/_form_text.html.erb +1 -0
  49. data/app/views/rails_admin/main/_form_wysihtml5.html.erb +8 -0
  50. data/app/views/rails_admin/main/_submit_buttons.html.erb +25 -0
  51. data/app/views/rails_admin/main/bulk_delete.html.erb +19 -0
  52. data/app/views/rails_admin/main/dashboard.html.erb +64 -0
  53. data/app/views/rails_admin/main/delete.html.erb +21 -0
  54. data/app/views/rails_admin/main/edit.html.erb +3 -0
  55. data/app/views/rails_admin/main/export.html.erb +146 -0
  56. data/app/views/rails_admin/main/history.html.erb +78 -0
  57. data/app/views/rails_admin/main/index.html.erb +193 -0
  58. data/app/views/rails_admin/main/new.html.erb +3 -0
  59. data/app/views/rails_admin/main/show.html.erb +28 -0
  60. data/config/initializers/active_record_extensions.rb +3 -1
  61. data/config/initializers/mongoid_extensions.rb +1 -1
  62. data/config/locales/rails_admin.en.yml +6 -1
  63. data/lib/generators/rails_admin/install_generator.rb +51 -3
  64. data/lib/generators/rails_admin/templates/environment.js +6 -0
  65. data/lib/generators/rails_admin/templates/initializer.erb +2 -1
  66. data/lib/generators/rails_admin/templates/rails_admin.js.erb +2 -0
  67. data/lib/generators/rails_admin/templates/rails_admin.scss +1 -0
  68. data/lib/generators/rails_admin/templates/webpack.config.js +32 -0
  69. data/lib/rails_admin/abstract_model.rb +24 -10
  70. data/lib/rails_admin/adapters/active_record/association.rb +20 -1
  71. data/lib/rails_admin/adapters/active_record/object_extension.rb +29 -0
  72. data/lib/rails_admin/adapters/active_record/property.rb +1 -1
  73. data/lib/rails_admin/adapters/active_record.rb +27 -23
  74. data/lib/rails_admin/adapters/mongoid/association.rb +38 -9
  75. data/lib/rails_admin/adapters/mongoid/bson.rb +4 -5
  76. data/lib/rails_admin/adapters/mongoid/extension.rb +3 -1
  77. data/lib/rails_admin/adapters/mongoid/object_extension.rb +32 -0
  78. data/lib/rails_admin/adapters/mongoid/property.rb +2 -2
  79. data/lib/rails_admin/adapters/mongoid.rb +27 -19
  80. data/lib/rails_admin/config/actions/base.rb +7 -2
  81. data/lib/rails_admin/config/actions/bulk_delete.rb +2 -2
  82. data/lib/rails_admin/config/actions/dashboard.rb +4 -3
  83. data/lib/rails_admin/config/actions/delete.rb +5 -9
  84. data/lib/rails_admin/config/actions/edit.rb +7 -7
  85. data/lib/rails_admin/config/actions/export.rb +2 -2
  86. data/lib/rails_admin/config/actions/history_index.rb +2 -2
  87. data/lib/rails_admin/config/actions/history_show.rb +2 -2
  88. data/lib/rails_admin/config/actions/index.rb +5 -7
  89. data/lib/rails_admin/config/actions/new.rb +9 -9
  90. data/lib/rails_admin/config/actions/show.rb +1 -1
  91. data/lib/rails_admin/config/actions/show_in_app.rb +6 -2
  92. data/lib/rails_admin/config/actions.rb +4 -4
  93. data/lib/rails_admin/config/configurable.rb +2 -2
  94. data/lib/rails_admin/config/fields/association.rb +15 -12
  95. data/lib/rails_admin/config/fields/base.rb +44 -24
  96. data/lib/rails_admin/config/fields/factories/active_storage.rb +1 -0
  97. data/lib/rails_admin/config/fields/factories/association.rb +6 -8
  98. data/lib/rails_admin/config/fields/factories/carrierwave.rb +2 -1
  99. data/lib/rails_admin/config/fields/factories/devise.rb +2 -1
  100. data/lib/rails_admin/config/fields/factories/dragonfly.rb +2 -1
  101. data/lib/rails_admin/config/fields/factories/paperclip.rb +2 -1
  102. data/lib/rails_admin/config/fields/factories/shrine.rb +1 -1
  103. data/lib/rails_admin/config/fields/group.rb +1 -2
  104. data/lib/rails_admin/config/fields/types/active_record_enum.rb +2 -0
  105. data/lib/rails_admin/config/fields/types/active_storage.rb +9 -7
  106. data/lib/rails_admin/config/fields/types/all.rb +1 -0
  107. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +4 -12
  108. data/lib/rails_admin/config/fields/types/boolean.rb +32 -8
  109. data/lib/rails_admin/config/fields/types/carrierwave.rb +1 -0
  110. data/lib/rails_admin/config/fields/types/citext.rb +13 -0
  111. data/lib/rails_admin/config/fields/types/color.rb +6 -2
  112. data/lib/rails_admin/config/fields/types/date.rb +5 -8
  113. data/lib/rails_admin/config/fields/types/datetime.rb +18 -21
  114. data/lib/rails_admin/config/fields/types/decimal.rb +9 -2
  115. data/lib/rails_admin/config/fields/types/dragonfly.rb +3 -1
  116. data/lib/rails_admin/config/fields/types/enum.rb +1 -1
  117. data/lib/rails_admin/config/fields/types/file_upload.rb +4 -3
  118. data/lib/rails_admin/config/fields/types/float.rb +9 -2
  119. data/lib/rails_admin/config/fields/types/has_many_association.rb +1 -5
  120. data/lib/rails_admin/config/fields/types/has_one_association.rb +1 -13
  121. data/lib/rails_admin/config/fields/types/integer.rb +2 -6
  122. data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +8 -6
  123. data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +1 -0
  124. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +4 -3
  125. data/lib/rails_admin/config/fields/types/numeric.rb +18 -0
  126. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +3 -2
  127. data/lib/rails_admin/config/fields/types/string.rb +1 -1
  128. data/lib/rails_admin/config/fields/types/time.rb +1 -4
  129. data/lib/rails_admin/config/fields/types/timestamp.rb +0 -4
  130. data/lib/rails_admin/config/fields/types.rb +1 -1
  131. data/lib/rails_admin/config/fields.rb +3 -1
  132. data/lib/rails_admin/config/has_fields.rb +5 -6
  133. data/lib/rails_admin/config/hideable.rb +1 -1
  134. data/lib/rails_admin/config/inspectable.rb +1 -3
  135. data/lib/rails_admin/config/model.rb +10 -10
  136. data/lib/rails_admin/config/sections/base.rb +2 -3
  137. data/lib/rails_admin/config/sections/list.rb +4 -15
  138. data/lib/rails_admin/config/sections.rb +1 -1
  139. data/lib/rails_admin/config.rb +73 -38
  140. data/lib/rails_admin/engine.rb +36 -23
  141. data/lib/rails_admin/extension.rb +6 -14
  142. data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +4 -2
  143. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +13 -8
  144. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +6 -7
  145. data/lib/rails_admin/support/csv_converter.rb +12 -13
  146. data/lib/rails_admin/support/datetime.rb +40 -74
  147. data/lib/rails_admin/support/esmodule_preprocessor.rb +32 -0
  148. data/lib/rails_admin/support/hash_helper.rb +6 -5
  149. data/lib/rails_admin/version.rb +7 -3
  150. data/lib/rails_admin.rb +1 -4
  151. data/lib/tasks/rails_admin.rake +3 -3
  152. data/package.json +28 -0
  153. data/src/rails_admin/base.js +21 -0
  154. data/src/rails_admin/filter-box.js +405 -0
  155. data/src/rails_admin/filtering-multiselect.js +394 -0
  156. data/src/rails_admin/filtering-select.js +302 -0
  157. data/src/rails_admin/i18n.js +19 -0
  158. data/src/rails_admin/nested-form-hooks.js +100 -0
  159. data/src/rails_admin/remote-form.js +190 -0
  160. data/src/rails_admin/sidescroll.js +20 -0
  161. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/README.txt +0 -0
  162. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/mixins.scss +0 -0
  163. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/theming.scss +93 -34
  164. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/variables.scss +0 -0
  165. data/src/rails_admin/styles/base.scss +64 -0
  166. data/src/rails_admin/styles/filtering-multiselect.scss +53 -0
  167. data/src/rails_admin/styles/filtering-select.scss +70 -0
  168. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/cerulean/mixins.scss +0 -0
  169. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/cerulean/theming.scss +23 -21
  170. data/src/rails_admin/styles/themes/cerulean/variables.scss +830 -0
  171. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/default/mixins.scss +1 -1
  172. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/default/theming.scss +0 -0
  173. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/default/variables.scss +1 -1
  174. data/src/rails_admin/styles/widgets.scss +35 -0
  175. data/src/rails_admin/ui.js +172 -0
  176. data/src/rails_admin/vendor/jquery.pjax.js +899 -0
  177. data/src/rails_admin/vendor/jquery_nested_form.js +122 -0
  178. data/src/rails_admin/widgets.js +512 -0
  179. data/vendor/assets/fonts/rails_admin/fa-solid-900.eot +0 -0
  180. data/vendor/assets/fonts/rails_admin/fa-solid-900.svg +5034 -0
  181. data/vendor/assets/fonts/rails_admin/fa-solid-900.ttf +0 -0
  182. data/vendor/assets/fonts/rails_admin/fa-solid-900.woff +0 -0
  183. data/vendor/assets/fonts/rails_admin/fa-solid-900.woff2 +0 -0
  184. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-affix.js +50 -28
  185. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-alert.js +10 -7
  186. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-button.js +35 -20
  187. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-carousel.js +48 -25
  188. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-collapse.js +70 -28
  189. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-dropdown.js +56 -42
  190. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-modal.js +118 -40
  191. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-popover.js +26 -16
  192. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-scrollspy.js +29 -27
  193. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-tab.js +46 -19
  194. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-tooltip.js +280 -60
  195. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-transition.js +5 -5
  196. data/vendor/assets/javascripts/rails_admin/bootstrap-datetimepicker.js +317 -150
  197. data/vendor/assets/javascripts/rails_admin/jquery-ui/data.js +41 -0
  198. data/vendor/assets/javascripts/rails_admin/jquery-ui/effect.js +1637 -0
  199. data/vendor/assets/javascripts/rails_admin/jquery-ui/ie.js +17 -0
  200. data/vendor/assets/javascripts/rails_admin/jquery-ui/keycode.js +47 -0
  201. data/vendor/assets/javascripts/rails_admin/jquery-ui/position.js +500 -0
  202. data/vendor/assets/javascripts/rails_admin/jquery-ui/safe-active-element.js +42 -0
  203. data/vendor/assets/javascripts/rails_admin/jquery-ui/scroll-parent.js +47 -0
  204. data/vendor/assets/javascripts/rails_admin/jquery-ui/unique-id.js +51 -0
  205. data/vendor/assets/javascripts/rails_admin/jquery-ui/version.js +17 -0
  206. data/vendor/assets/javascripts/rails_admin/jquery-ui/widget.js +735 -0
  207. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/autocomplete.js +689 -0
  208. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/menu.js +680 -0
  209. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/mouse.js +230 -0
  210. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/sortable.js +1561 -0
  211. data/vendor/assets/javascripts/rails_admin/jquery.pjax.js +317 -160
  212. data/vendor/assets/javascripts/rails_admin/jquery3.js +10872 -0
  213. data/vendor/assets/javascripts/rails_admin/moment-with-locales.js +11210 -9290
  214. data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +4476 -2216
  215. metadata +118 -262
  216. data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
  217. data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
  218. data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
  219. data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
  220. data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  221. data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  222. data/app/assets/images/rails_admin/bullet_black.png +0 -0
  223. data/app/assets/images/rails_admin/bullet_white.png +0 -0
  224. data/app/assets/images/rails_admin/calendar.png +0 -0
  225. data/app/assets/images/rails_admin/clock.png +0 -0
  226. data/app/assets/images/rails_admin/logo.png +0 -0
  227. data/app/assets/images/rails_admin/magnifier.png +0 -0
  228. data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
  229. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
  230. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
  231. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
  232. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
  233. data/app/assets/javascripts/rails_admin/jquery-ui.js.erb +0 -8
  234. data/app/assets/javascripts/rails_admin/ra.filter-box.js +0 -248
  235. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +0 -331
  236. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +0 -294
  237. data/app/assets/javascripts/rails_admin/ra.i18n.js +0 -28
  238. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.js +0 -59
  239. data/app/assets/javascripts/rails_admin/ra.remote-form.js +0 -155
  240. data/app/assets/javascripts/rails_admin/ra.sidescroll.js +0 -31
  241. data/app/assets/javascripts/rails_admin/ra.widgets.js +0 -379
  242. data/app/assets/javascripts/rails_admin/rails_admin.js +0 -20
  243. data/app/assets/javascripts/rails_admin/ui.js +0 -135
  244. data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
  245. data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
  246. data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
  247. data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
  248. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  249. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  250. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss +0 -733
  251. data/app/assets/stylesheets/rails_admin/base/font-awesome-4-compability.scss +0 -153
  252. data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.scss +0 -88
  253. data/app/assets/stylesheets/rails_admin/ra.sidescroll.scss +0 -29
  254. data/app/assets/stylesheets/rails_admin/ra.widgets.scss +0 -17
  255. data/app/assets/stylesheets/rails_admin/rails_admin.scss.erb +0 -110
  256. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.scss +0 -857
  257. data/app/views/kaminari/ra-twitter-bootstrap/_gap.html.haml +0 -2
  258. data/app/views/kaminari/ra-twitter-bootstrap/_next_page.html.haml +0 -4
  259. data/app/views/kaminari/ra-twitter-bootstrap/_page.html.haml +0 -4
  260. data/app/views/kaminari/ra-twitter-bootstrap/_paginator.html.haml +0 -9
  261. data/app/views/kaminari/ra-twitter-bootstrap/_prev_page.html.haml +0 -4
  262. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_next_page.html.haml +0 -4
  263. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_paginator.html.haml +0 -4
  264. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_prev_page.html.haml +0 -4
  265. data/app/views/layouts/rails_admin/_head.html.haml +0 -7
  266. data/app/views/layouts/rails_admin/_navigation.html.haml +0 -12
  267. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +0 -10
  268. data/app/views/layouts/rails_admin/_sidebar_navigation.html.haml +0 -3
  269. data/app/views/layouts/rails_admin/application.html.haml +0 -16
  270. data/app/views/layouts/rails_admin/pjax.html.haml +0 -12
  271. data/app/views/rails_admin/main/_dashboard_history.html.haml +0 -21
  272. data/app/views/rails_admin/main/_delete_notice.html.haml +0 -24
  273. data/app/views/rails_admin/main/_form_action_text.html.haml +0 -7
  274. data/app/views/rails_admin/main/_form_boolean.html.haml +0 -3
  275. data/app/views/rails_admin/main/_form_code_mirror.html.haml +0 -9
  276. data/app/views/rails_admin/main/_form_colorpicker.html.haml +0 -1
  277. data/app/views/rails_admin/main/_form_datetime.html.haml +0 -5
  278. data/app/views/rails_admin/main/_form_enumeration.html.haml +0 -19
  279. data/app/views/rails_admin/main/_form_field.html.haml +0 -1
  280. data/app/views/rails_admin/main/_form_file_upload.html.haml +0 -17
  281. data/app/views/rails_admin/main/_form_froala.html.haml +0 -8
  282. data/app/views/rails_admin/main/_form_multiple_file_upload.html.haml +0 -16
  283. data/app/views/rails_admin/main/_form_nested_many.html.haml +0 -15
  284. data/app/views/rails_admin/main/_form_nested_one.html.haml +0 -17
  285. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +0 -26
  286. data/app/views/rails_admin/main/_form_simple_mde.haml +0 -8
  287. data/app/views/rails_admin/main/_form_text.html.haml +0 -1
  288. data/app/views/rails_admin/main/_form_wysihtml5.html.haml +0 -8
  289. data/app/views/rails_admin/main/_submit_buttons.html.haml +0 -16
  290. data/app/views/rails_admin/main/bulk_delete.html.haml +0 -11
  291. data/app/views/rails_admin/main/dashboard.html.haml +0 -34
  292. data/app/views/rails_admin/main/delete.html.haml +0 -18
  293. data/app/views/rails_admin/main/edit.html.haml +0 -2
  294. data/app/views/rails_admin/main/export.html.haml +0 -92
  295. data/app/views/rails_admin/main/history.html.haml +0 -51
  296. data/app/views/rails_admin/main/index.html.haml +0 -126
  297. data/app/views/rails_admin/main/new.html.haml +0 -2
  298. data/app/views/rails_admin/main/show.html.haml +0 -15
  299. data/config/initializers/devise_patch.rb +0 -9
  300. data/config/initializers/haml.rb +0 -5
  301. data/lib/rails_admin/adapters/active_record/abstract_object.rb +0 -32
  302. data/lib/rails_admin/adapters/mongoid/abstract_object.rb +0 -42
  303. data/lib/rails_admin/bootstrap-sass/compass_functions.rb +0 -28
  304. data/lib/rails_admin/bootstrap-sass/sass_functions.rb +0 -16
  305. data/lib/rails_admin/bootstrap-sass.rb +0 -49
  306. data/lib/rails_admin/config/lazy_model.rb +0 -68
  307. data/lib/rails_admin/extensions/history/auditing_adapter.rb +0 -37
  308. data/lib/rails_admin/extensions/history/history.rb +0 -44
  309. data/lib/rails_admin/extensions/history.rb +0 -3
  310. data/lib/rails_admin/support/i18n.rb +0 -43
  311. data/vendor/assets/fonts/rails_admin/FontAwesome.otf +0 -0
  312. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.eot +0 -0
  313. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.svg +0 -2671
  314. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.ttf +0 -0
  315. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff +0 -0
  316. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff2 +0 -0
  317. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  318. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  319. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  320. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  321. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  322. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  323. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  324. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  325. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  326. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  327. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  328. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  329. data/vendor/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  330. data/vendor/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  331. data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  332. data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  333. data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  334. data/vendor/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  335. data/vendor/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  336. data/vendor/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  337. data/vendor/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  338. data/vendor/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  339. data/vendor/assets/images/rails_admin/colorpicker/select.png +0 -0
  340. data/vendor/assets/images/rails_admin/colorpicker/select2.png +0 -0
  341. data/vendor/assets/images/rails_admin/colorpicker/slider.png +0 -0
  342. data/vendor/assets/javascripts/rails_admin/jquery.colorpicker.js +0 -484
  343. data/vendor/assets/stylesheets/rails_admin/jquery.colorpicker.scss +0 -182
@@ -1,33 +1,8 @@
1
- /*! version : 4.14.30
2
- =========================================================
3
- bootstrap-datetimejs
4
- https://github.com/Eonasdan/bootstrap-datetimepicker
5
- Copyright (c) 2015 Jonathan Peterson
6
- =========================================================
7
- */
8
- /*
9
- The MIT License (MIT)
10
-
11
- Copyright (c) 2015 Jonathan Peterson
12
-
13
- Permission is hereby granted, free of charge, to any person obtaining a copy
14
- of this software and associated documentation files (the "Software"), to deal
15
- in the Software without restriction, including without limitation the rights
16
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
- copies of the Software, and to permit persons to whom the Software is
18
- furnished to do so, subject to the following conditions:
19
-
20
- The above copyright notice and this permission notice shall be included in
21
- all copies or substantial portions of the Software.
22
-
23
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29
- THE SOFTWARE.
30
- */
1
+ /*!
2
+ * Bootstrap Datetime Picker v4.17.49
3
+ * Copyright 2015-2020 Jonathan Peterson
4
+ * Licensed under MIT (https://github.com/Eonasdan/bootstrap-datetimepicker/blob/master/LICENSE)
5
+ */
31
6
  /*global define:false */
32
7
  /*global exports:false */
33
8
  /*global require:false */
@@ -39,7 +14,7 @@
39
14
  // AMD is used - Register as an anonymous module.
40
15
  define(['jquery', 'moment'], factory);
41
16
  } else if (typeof exports === 'object') {
42
- factory(require('jquery'), require('moment'));
17
+ module.exports = factory(require('jquery'), require('moment'));
43
18
  } else {
44
19
  // Neither AMD nor CommonJS used. Use global variables.
45
20
  if (typeof jQuery === 'undefined') {
@@ -58,8 +33,8 @@
58
33
 
59
34
  var dateTimePicker = function (element, options) {
60
35
  var picker = {},
61
- date = moment().startOf('d'),
62
- viewDate = date.clone(),
36
+ date,
37
+ viewDate,
63
38
  unset = true,
64
39
  input,
65
40
  component = false,
@@ -132,6 +107,34 @@
132
107
  * Private functions
133
108
  *
134
109
  ********************************************************************************/
110
+
111
+ hasTimeZone = function () {
112
+ return moment.tz !== undefined && options.timeZone !== undefined && options.timeZone !== null && options.timeZone !== '';
113
+ },
114
+
115
+ getMoment = function (d) {
116
+ var returnMoment;
117
+
118
+ if (d === undefined || d === null) {
119
+ returnMoment = moment(); //TODO should this use format? and locale?
120
+ } else if (moment.isDate(d) || moment.isMoment(d)) {
121
+ // If the date that is passed in is already a Date() or moment() object,
122
+ // pass it directly to moment.
123
+ returnMoment = moment(d);
124
+ } else if (hasTimeZone()) { // There is a string to parse and a default time zone
125
+ // parse with the tz function which takes a default time zone if it is not in the format string
126
+ returnMoment = moment.tz(d, parseFormats, options.useStrict, options.timeZone);
127
+ } else {
128
+ returnMoment = moment(d, parseFormats, options.useStrict);
129
+ }
130
+
131
+ if (hasTimeZone()) {
132
+ returnMoment.tz(options.timeZone);
133
+ }
134
+
135
+ return returnMoment;
136
+ },
137
+
135
138
  isEnabled = function (granularity) {
136
139
  if (typeof granularity !== 'string' || granularity.length > 1) {
137
140
  throw new TypeError('isEnabled expects a single character string parameter');
@@ -154,6 +157,7 @@
154
157
  return false;
155
158
  }
156
159
  },
160
+
157
161
  hasTime = function () {
158
162
  return (isEnabled('h') || isEnabled('m') || isEnabled('s'));
159
163
  },
@@ -209,13 +213,11 @@
209
213
 
210
214
  if (isEnabled('h')) {
211
215
  topRow.append($('<td>')
212
- .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Increment Hour'}).addClass('btn').attr('data-action', 'incrementHours')
213
- .append($('<span>').addClass(options.icons.up))));
216
+ .append($('<a>').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.incrementHour }).addClass('btn').attr('data-action', 'incrementHours').append($('<span>').addClass(options.icons.up))));
214
217
  middleRow.append($('<td>')
215
- .append($('<span>').addClass('timepicker-hour').attr({'data-time-component':'hours', 'title':'Pick Hour'}).attr('data-action', 'showHours')));
218
+ .append($('<span>').addClass('timepicker-hour').attr({ 'data-time-component': 'hours', 'title': options.tooltips.pickHour }).attr('data-action', 'showHours')));
216
219
  bottomRow.append($('<td>')
217
- .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Decrement Hour'}).addClass('btn').attr('data-action', 'decrementHours')
218
- .append($('<span>').addClass(options.icons.down))));
220
+ .append($('<a>').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.decrementHour }).addClass('btn').attr('data-action', 'decrementHours').append($('<span>').addClass(options.icons.down))));
219
221
  }
220
222
  if (isEnabled('m')) {
221
223
  if (isEnabled('h')) {
@@ -224,12 +226,12 @@
224
226
  bottomRow.append($('<td>').addClass('separator'));
225
227
  }
226
228
  topRow.append($('<td>')
227
- .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Increment Minute'}).addClass('btn').attr('data-action', 'incrementMinutes')
229
+ .append($('<a>').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.incrementMinute }).addClass('btn').attr('data-action', 'incrementMinutes')
228
230
  .append($('<span>').addClass(options.icons.up))));
229
231
  middleRow.append($('<td>')
230
- .append($('<span>').addClass('timepicker-minute').attr({'data-time-component': 'minutes', 'title':'Pick Minute'}).attr('data-action', 'showMinutes')));
232
+ .append($('<span>').addClass('timepicker-minute').attr({ 'data-time-component': 'minutes', 'title': options.tooltips.pickMinute }).attr('data-action', 'showMinutes')));
231
233
  bottomRow.append($('<td>')
232
- .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Decrement Minute'}).addClass('btn').attr('data-action', 'decrementMinutes')
234
+ .append($('<a>').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.decrementMinute }).addClass('btn').attr('data-action', 'decrementMinutes')
233
235
  .append($('<span>').addClass(options.icons.down))));
234
236
  }
235
237
  if (isEnabled('s')) {
@@ -239,19 +241,19 @@
239
241
  bottomRow.append($('<td>').addClass('separator'));
240
242
  }
241
243
  topRow.append($('<td>')
242
- .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Increment Second'}).addClass('btn').attr('data-action', 'incrementSeconds')
244
+ .append($('<a>').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.incrementSecond }).addClass('btn').attr('data-action', 'incrementSeconds')
243
245
  .append($('<span>').addClass(options.icons.up))));
244
246
  middleRow.append($('<td>')
245
- .append($('<span>').addClass('timepicker-second').attr({'data-time-component': 'seconds', 'title':'Pick Second'}).attr('data-action', 'showSeconds')));
247
+ .append($('<span>').addClass('timepicker-second').attr({ 'data-time-component': 'seconds', 'title': options.tooltips.pickSecond }).attr('data-action', 'showSeconds')));
246
248
  bottomRow.append($('<td>')
247
- .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Decrement Second'}).addClass('btn').attr('data-action', 'decrementSeconds')
249
+ .append($('<a>').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.decrementSecond }).addClass('btn').attr('data-action', 'decrementSeconds')
248
250
  .append($('<span>').addClass(options.icons.down))));
249
251
  }
250
252
 
251
253
  if (!use24Hours) {
252
254
  topRow.append($('<td>').addClass('separator'));
253
255
  middleRow.append($('<td>')
254
- .append($('<button>').addClass('btn btn-primary').attr({'data-action': 'togglePeriod', tabindex: '-1', 'title':'Toggle Period'})));
256
+ .append($('<button>').addClass('btn btn-primary').attr({ 'data-action': 'togglePeriod', tabindex: '-1', 'title': options.tooltips.togglePeriod })));
255
257
  bottomRow.append($('<td>').addClass('separator'));
256
258
  }
257
259
 
@@ -285,16 +287,16 @@
285
287
  getToolbar = function () {
286
288
  var row = [];
287
289
  if (options.showTodayButton) {
288
- row.push($('<td>').append($('<a>').attr({'data-action':'today', 'title':'Go to today'}).append($('<span>').addClass(options.icons.today))));
290
+ row.push($('<td>').append($('<a>').attr({ 'data-action': 'today', 'title': options.tooltips.today }).append($('<span>').addClass(options.icons.today))));
289
291
  }
290
292
  if (!options.sideBySide && hasDate() && hasTime()) {
291
- row.push($('<td>').append($('<a>').attr({'data-action':'togglePicker', 'title':'Select Time'}).append($('<span>').addClass(options.icons.time))));
293
+ row.push($('<td>').append($('<a>').attr({ 'data-action': 'togglePicker', 'title': options.tooltips.selectTime }).append($('<span>').addClass(options.icons.time))));
292
294
  }
293
295
  if (options.showClear) {
294
- row.push($('<td>').append($('<a>').attr({'data-action':'clear', 'title':'Clear selection'}).append($('<span>').addClass(options.icons.clear))));
296
+ row.push($('<td>').append($('<a>').attr({ 'data-action': 'clear', 'title': options.tooltips.clear }).append($('<span>').addClass(options.icons.clear))));
295
297
  }
296
298
  if (options.showClose) {
297
- row.push($('<td>').append($('<a>').attr({'data-action':'close', 'title':'Close the picker'}).append($('<span>').addClass(options.icons.close))));
299
+ row.push($('<td>').append($('<a>').attr({ 'data-action': 'close', 'title': options.tooltips.close }).append($('<span>').addClass(options.icons.close))));
298
300
  }
299
301
  return $('<table>').addClass('table-condensed').append($('<tbody>').append($('<tr>').append(row)));
300
302
  },
@@ -313,17 +315,24 @@
313
315
  if (use24Hours) {
314
316
  template.addClass('usetwentyfour');
315
317
  }
318
+
316
319
  if (isEnabled('s') && !use24Hours) {
317
320
  template.addClass('wider');
318
321
  }
322
+
319
323
  if (options.sideBySide && hasDate() && hasTime()) {
320
324
  template.addClass('timepicker-sbs');
325
+ if (options.toolbarPlacement === 'top') {
326
+ template.append(toolbar);
327
+ }
321
328
  template.append(
322
329
  $('<div>').addClass('row')
323
- .append(dateView.addClass('col-sm-6'))
324
- .append(timeView.addClass('col-sm-6'))
330
+ .append(dateView.addClass('col-md-6'))
331
+ .append(timeView.addClass('col-md-6'))
325
332
  );
326
- template.append(toolbar);
333
+ if (options.toolbarPlacement === 'bottom') {
334
+ template.append(toolbar);
335
+ }
327
336
  return template;
328
337
  }
329
338
 
@@ -419,20 +428,20 @@
419
428
  widget.removeClass('pull-right');
420
429
  }
421
430
 
422
- // find the first parent element that has a relative css positioning
423
- if (parent.css('position') !== 'relative') {
431
+ // find the first parent element that has a non-static css positioning
432
+ if (parent.css('position') === 'static') {
424
433
  parent = parent.parents().filter(function () {
425
- return $(this).css('position') === 'relative';
434
+ return $(this).css('position') !== 'static';
426
435
  }).first();
427
436
  }
428
437
 
429
438
  if (parent.length === 0) {
430
- throw new Error('datetimepicker component should be placed within a relative positioned container');
439
+ throw new Error('datetimepicker component should be placed within a non-static positioned container');
431
440
  }
432
441
 
433
442
  widget.css({
434
443
  top: vertical === 'top' ? 'auto' : position.top + element.outerHeight(),
435
- bottom: vertical === 'top' ? position.top + element.outerHeight() : 'auto',
444
+ bottom: vertical === 'top' ? parent.outerHeight() - (parent === element ? 0 : position.top) : 'auto',
436
445
  left: horizontal === 'left' ? (parent === element ? 0 : position.left) : 'auto',
437
446
  right: horizontal === 'left' ? 'auto' : parent.outerWidth() - element.outerWidth() - (parent === element ? 0 : position.left)
438
447
  });
@@ -552,9 +561,9 @@
552
561
  monthsViewHeader = monthsView.find('th'),
553
562
  months = monthsView.find('tbody').find('span');
554
563
 
555
- monthsViewHeader.eq(0).find('span').attr('title', 'Previous Year');
556
- monthsViewHeader.eq(1).attr('title', 'Select Year');
557
- monthsViewHeader.eq(2).find('span').attr('title', 'Next Year');
564
+ monthsViewHeader.eq(0).find('span').attr('title', options.tooltips.prevYear);
565
+ monthsViewHeader.eq(1).attr('title', options.tooltips.selectYear);
566
+ monthsViewHeader.eq(2).find('span').attr('title', options.tooltips.nextYear);
558
567
 
559
568
  monthsView.find('.disabled').removeClass('disabled');
560
569
 
@@ -587,9 +596,9 @@
587
596
  endYear = viewDate.clone().add(6, 'y'),
588
597
  html = '';
589
598
 
590
- yearsViewHeader.eq(0).find('span').attr('title', 'Previous Decade');
591
- yearsViewHeader.eq(1).attr('title', 'Select Decade');
592
- yearsViewHeader.eq(2).find('span').attr('title', 'Next Decade');
599
+ yearsViewHeader.eq(0).find('span').attr('title', options.tooltips.prevDecade);
600
+ yearsViewHeader.eq(1).attr('title', options.tooltips.selectDecade);
601
+ yearsViewHeader.eq(2).find('span').attr('title', options.tooltips.nextDecade);
593
602
 
594
603
  yearsView.find('.disabled').removeClass('disabled');
595
604
 
@@ -614,33 +623,41 @@
614
623
  updateDecades = function () {
615
624
  var decadesView = widget.find('.datepicker-decades'),
616
625
  decadesViewHeader = decadesView.find('th'),
617
- startDecade = viewDate.isBefore(moment({y: 1999})) ? moment({y: 1899}) : moment({y: 1999}),
626
+ startDecade = moment({ y: viewDate.year() - (viewDate.year() % 100) - 1 }),
618
627
  endDecade = startDecade.clone().add(100, 'y'),
628
+ startedAt = startDecade.clone(),
629
+ minDateDecade = false,
630
+ maxDateDecade = false,
631
+ endDecadeYear,
619
632
  html = '';
620
633
 
621
- decadesViewHeader.eq(0).find('span').attr('title', 'Previous Century');
622
- decadesViewHeader.eq(2).find('span').attr('title', 'Next Century');
634
+ decadesViewHeader.eq(0).find('span').attr('title', options.tooltips.prevCentury);
635
+ decadesViewHeader.eq(2).find('span').attr('title', options.tooltips.nextCentury);
623
636
 
624
637
  decadesView.find('.disabled').removeClass('disabled');
625
638
 
626
- if (startDecade.isSame(moment({y: 1900})) || (options.minDate && options.minDate.isAfter(startDecade, 'y'))) {
639
+ if (startDecade.isSame(moment({ y: 1900 })) || (options.minDate && options.minDate.isAfter(startDecade, 'y'))) {
627
640
  decadesViewHeader.eq(0).addClass('disabled');
628
641
  }
629
642
 
630
643
  decadesViewHeader.eq(1).text(startDecade.year() + '-' + endDecade.year());
631
644
 
632
- if (startDecade.isSame(moment({y: 2000})) || (options.maxDate && options.maxDate.isBefore(endDecade, 'y'))) {
645
+ if (startDecade.isSame(moment({ y: 2000 })) || (options.maxDate && options.maxDate.isBefore(endDecade, 'y'))) {
633
646
  decadesViewHeader.eq(2).addClass('disabled');
634
647
  }
635
648
 
636
649
  while (!startDecade.isAfter(endDecade, 'y')) {
637
- html += '<span data-action="selectDecade" class="decade' + (startDecade.isSame(date, 'y') ? ' active' : '') +
638
- (!isValid(startDecade, 'y') ? ' disabled' : '') + '" data-selection="' + (startDecade.year() + 6) + '">' + (startDecade.year() + 1) + ' - ' + (startDecade.year() + 12) + '</span>';
650
+ endDecadeYear = startDecade.year() + 12;
651
+ minDateDecade = options.minDate && options.minDate.isAfter(startDecade, 'y') && options.minDate.year() <= endDecadeYear;
652
+ maxDateDecade = options.maxDate && options.maxDate.isAfter(startDecade, 'y') && options.maxDate.year() <= endDecadeYear;
653
+ html += '<span data-action="selectDecade" class="decade' + (date.isAfter(startDecade) && date.year() <= endDecadeYear ? ' active' : '') +
654
+ (!isValid(startDecade, 'y') && !minDateDecade && !maxDateDecade ? ' disabled' : '') + '" data-selection="' + (startDecade.year() + 6) + '">' + (startDecade.year() + 1) + ' - ' + (startDecade.year() + 12) + '</span>';
639
655
  startDecade.add(12, 'y');
640
656
  }
641
657
  html += '<span></span><span></span><span></span>'; //push the dangling block over, at least this way it's even
642
658
 
643
659
  decadesView.find('td').html(html);
660
+ decadesViewHeader.eq(1).text((startedAt.year() + 1) + '-' + (startDecade.year()));
644
661
  },
645
662
 
646
663
  fillDate = function () {
@@ -649,16 +666,16 @@
649
666
  currentDate,
650
667
  html = [],
651
668
  row,
652
- clsName,
669
+ clsNames = [],
653
670
  i;
654
671
 
655
672
  if (!hasDate()) {
656
673
  return;
657
674
  }
658
675
 
659
- daysViewHeader.eq(0).find('span').attr('title', 'Previous Month');
660
- daysViewHeader.eq(1).attr('title', 'Select Month');
661
- daysViewHeader.eq(2).find('span').attr('title', 'Next Month');
676
+ daysViewHeader.eq(0).find('span').attr('title', options.tooltips.prevMonth);
677
+ daysViewHeader.eq(1).attr('title', options.tooltips.selectMonth);
678
+ daysViewHeader.eq(2).find('span').attr('title', options.tooltips.nextMonth);
662
679
 
663
680
  daysView.find('.disabled').removeClass('disabled');
664
681
  daysViewHeader.eq(1).text(viewDate.format(options.dayViewHeaderFormat));
@@ -680,26 +697,31 @@
680
697
  }
681
698
  html.push(row);
682
699
  }
683
- clsName = '';
700
+ clsNames = ['day'];
684
701
  if (currentDate.isBefore(viewDate, 'M')) {
685
- clsName += ' old';
702
+ clsNames.push('old');
686
703
  }
687
704
  if (currentDate.isAfter(viewDate, 'M')) {
688
- clsName += ' new';
705
+ clsNames.push('new');
689
706
  }
690
707
  if (currentDate.isSame(date, 'd') && !unset) {
691
- clsName += ' active';
708
+ clsNames.push('active');
692
709
  }
693
710
  if (!isValid(currentDate, 'd')) {
694
- clsName += ' disabled';
711
+ clsNames.push('disabled');
695
712
  }
696
- if (currentDate.isSame(moment(), 'd')) {
697
- clsName += ' today';
713
+ if (currentDate.isSame(getMoment(), 'd')) {
714
+ clsNames.push('today');
698
715
  }
699
716
  if (currentDate.day() === 0 || currentDate.day() === 6) {
700
- clsName += ' weekend';
717
+ clsNames.push('weekend');
701
718
  }
702
- row.append('<td data-action="selectDay" data-day="' + currentDate.format('L') + '" class="day' + clsName + '">' + currentDate.date() + '</td>');
719
+ notifyEvent({
720
+ type: 'dp.classify',
721
+ date: currentDate,
722
+ classNames: clsNames
723
+ });
724
+ row.append('<td data-action="selectDay" data-day="' + currentDate.format('L') + '" class="' + clsNames.join(' ') + '">' + currentDate.date() + '</td>');
703
725
  currentDate.add(1, 'd');
704
726
  }
705
727
 
@@ -819,8 +841,16 @@
819
841
 
820
842
  targetMoment = targetMoment.clone().locale(options.locale);
821
843
 
844
+ if (hasTimeZone()) {
845
+ targetMoment.tz(options.timeZone);
846
+ }
847
+
822
848
  if (options.stepping !== 1) {
823
- targetMoment.minutes((Math.round(targetMoment.minutes() / options.stepping) * options.stepping) % 60).seconds(0);
849
+ targetMoment.minutes((Math.round(targetMoment.minutes() / options.stepping) * options.stepping)).seconds(0);
850
+
851
+ while (options.minDate && targetMoment.isBefore(options.minDate)) {
852
+ targetMoment.add(options.stepping, 'minutes');
853
+ }
824
854
  }
825
855
 
826
856
  if (isValid(targetMoment)) {
@@ -838,16 +868,25 @@
838
868
  } else {
839
869
  if (!options.keepInvalid) {
840
870
  input.val(unset ? '' : date.format(actualFormat));
871
+ } else {
872
+ notifyEvent({
873
+ type: 'dp.change',
874
+ date: targetMoment,
875
+ oldDate: oldDate
876
+ });
841
877
  }
842
878
  notifyEvent({
843
879
  type: 'dp.error',
844
- date: targetMoment
880
+ date: targetMoment,
881
+ oldDate: oldDate
845
882
  });
846
883
  }
847
884
  },
848
885
 
886
+ /**
887
+ * Hides the widget. Possibly will emit dp.hide
888
+ */
849
889
  hide = function () {
850
- ///<summary>Hides the widget. Possibly will emit dp.hide</summary>
851
890
  var transitioning = false;
852
891
  if (!widget) {
853
892
  return picker;
@@ -880,6 +919,11 @@
880
919
  type: 'dp.hide',
881
920
  date: date.clone()
882
921
  });
922
+
923
+ input.blur();
924
+
925
+ viewDate = date.clone();
926
+
883
927
  return picker;
884
928
  },
885
929
 
@@ -887,6 +931,18 @@
887
931
  setValue(null);
888
932
  },
889
933
 
934
+ parseInputDate = function (inputDate) {
935
+ if (options.parseInputDate === undefined) {
936
+ if (!moment.isMoment(inputDate) || inputDate instanceof Date) {
937
+ inputDate = getMoment(inputDate);
938
+ }
939
+ } else {
940
+ inputDate = options.parseInputDate(inputDate);
941
+ }
942
+ //inputDate.locale(options.locale);
943
+ return inputDate;
944
+ },
945
+
890
946
  /********************************************************************************
891
947
  *
892
948
  * Widget UI interaction functions
@@ -1099,8 +1155,9 @@
1099
1155
  clear: clear,
1100
1156
 
1101
1157
  today: function () {
1102
- if (isValid(moment(), 'd')) {
1103
- setValue(moment());
1158
+ var todaysDate = getMoment();
1159
+ if (isValid(todaysDate, 'd')) {
1160
+ setValue(todaysDate);
1104
1161
  }
1105
1162
  },
1106
1163
 
@@ -1115,8 +1172,10 @@
1115
1172
  return false;
1116
1173
  },
1117
1174
 
1175
+ /**
1176
+ * Shows the widget. Possibly will emit dp.show and dp.change
1177
+ */
1118
1178
  show = function () {
1119
- ///<summary>Shows the widget. Possibly will emit dp.show and dp.change</summary>
1120
1179
  var currentMoment,
1121
1180
  useCurrentGranularity = {
1122
1181
  'year': function (m) {
@@ -1141,14 +1200,13 @@
1141
1200
  }
1142
1201
  if (input.val() !== undefined && input.val().trim().length !== 0) {
1143
1202
  setValue(parseInputDate(input.val().trim()));
1144
- } else if (options.useCurrent && unset && ((input.is('input') && input.val().trim().length === 0) || options.inline)) {
1145
- currentMoment = moment();
1203
+ } else if (unset && options.useCurrent && (options.inline || (input.is('input') && input.val().trim().length === 0))) {
1204
+ currentMoment = getMoment();
1146
1205
  if (typeof options.useCurrent === 'string') {
1147
1206
  currentMoment = useCurrentGranularity[options.useCurrent](currentMoment);
1148
1207
  }
1149
1208
  setValue(currentMoment);
1150
1209
  }
1151
-
1152
1210
  widget = getTemplate();
1153
1211
 
1154
1212
  fillDow();
@@ -1168,9 +1226,8 @@
1168
1226
  if (component && component.hasClass('btn')) {
1169
1227
  component.toggleClass('active');
1170
1228
  }
1171
- widget.show();
1172
1229
  place();
1173
-
1230
+ widget.show();
1174
1231
  if (options.focusOnShow && !input.is(':focus')) {
1175
1232
  input.focus();
1176
1233
  }
@@ -1181,25 +1238,13 @@
1181
1238
  return picker;
1182
1239
  },
1183
1240
 
1241
+ /**
1242
+ * Shows or hides the widget
1243
+ */
1184
1244
  toggle = function () {
1185
- /// <summary>Shows or hides the widget</summary>
1186
1245
  return (widget ? hide() : show());
1187
1246
  },
1188
1247
 
1189
- parseInputDate = function (inputDate) {
1190
- if (options.parseInputDate === undefined) {
1191
- if (moment.isMoment(inputDate) || inputDate instanceof Date) {
1192
- inputDate = moment(inputDate);
1193
- } else {
1194
- inputDate = moment(inputDate, parseFormats, options.useStrict);
1195
- }
1196
- } else {
1197
- inputDate = options.parseInputDate(inputDate);
1198
- }
1199
- inputDate.locale(options.locale);
1200
- return inputDate;
1201
- },
1202
-
1203
1248
  keydown = function (e) {
1204
1249
  var handler = null,
1205
1250
  index,
@@ -1284,7 +1329,7 @@
1284
1329
  detachDatePickerElementEvents = function () {
1285
1330
  input.off({
1286
1331
  'change': change,
1287
- 'blur': hide,
1332
+ 'blur': blur,
1288
1333
  'keydown': keydown,
1289
1334
  'keyup': keyup,
1290
1335
  'focus': options.allowInputToggle ? hide : ''
@@ -1467,7 +1512,7 @@
1467
1512
  }
1468
1513
 
1469
1514
  if ((typeof newFormat !== 'string') && ((typeof newFormat !== 'boolean') || (newFormat !== false))) {
1470
- throw new TypeError('format() expects a sting or boolean:false parameter ' + newFormat);
1515
+ throw new TypeError('format() expects a string or boolean:false parameter ' + newFormat);
1471
1516
  }
1472
1517
 
1473
1518
  options.format = newFormat;
@@ -1477,6 +1522,20 @@
1477
1522
  return picker;
1478
1523
  };
1479
1524
 
1525
+ picker.timeZone = function (newZone) {
1526
+ if (arguments.length === 0) {
1527
+ return options.timeZone;
1528
+ }
1529
+
1530
+ if (typeof newZone !== 'string') {
1531
+ throw new TypeError('newZone() expects a string parameter');
1532
+ }
1533
+
1534
+ options.timeZone = newZone;
1535
+
1536
+ return picker;
1537
+ };
1538
+
1480
1539
  picker.dayViewHeaderFormat = function (newFormat) {
1481
1540
  if (arguments.length === 0) {
1482
1541
  return options.dayViewHeaderFormat;
@@ -1589,8 +1648,8 @@
1589
1648
  var tries = 0;
1590
1649
  while (!isValid(date, 'd')) {
1591
1650
  date.add(1, 'd');
1592
- if (tries === 7) {
1593
- throw 'Tried 7 times to find a valid date';
1651
+ if (tries === 31) {
1652
+ throw 'Tried 31 times to find a valid date';
1594
1653
  }
1595
1654
  tries++;
1596
1655
  }
@@ -1613,7 +1672,7 @@
1613
1672
 
1614
1673
  if (typeof maxDate === 'string') {
1615
1674
  if (maxDate === 'now' || maxDate === 'moment') {
1616
- maxDate = moment();
1675
+ maxDate = getMoment();
1617
1676
  }
1618
1677
  }
1619
1678
 
@@ -1630,7 +1689,7 @@
1630
1689
  setValue(options.maxDate);
1631
1690
  }
1632
1691
  if (viewDate.isAfter(parsedDate)) {
1633
- viewDate = parsedDate.clone();
1692
+ viewDate = parsedDate.clone().subtract(options.stepping, 'm');
1634
1693
  }
1635
1694
  update();
1636
1695
  return picker;
@@ -1649,7 +1708,7 @@
1649
1708
 
1650
1709
  if (typeof minDate === 'string') {
1651
1710
  if (minDate === 'now' || minDate === 'moment') {
1652
- minDate = moment();
1711
+ minDate = getMoment();
1653
1712
  }
1654
1713
  }
1655
1714
 
@@ -1666,7 +1725,7 @@
1666
1725
  setValue(options.minDate);
1667
1726
  }
1668
1727
  if (viewDate.isBefore(parsedDate)) {
1669
- viewDate = parsedDate.clone();
1728
+ viewDate = parsedDate.clone().add(options.stepping, 'm');
1670
1729
  }
1671
1730
  update();
1672
1731
  return picker;
@@ -1691,7 +1750,9 @@
1691
1750
 
1692
1751
  if (typeof defaultDate === 'string') {
1693
1752
  if (defaultDate === 'now' || defaultDate === 'moment') {
1694
- defaultDate = moment();
1753
+ defaultDate = getMoment();
1754
+ } else {
1755
+ defaultDate = getMoment(defaultDate);
1695
1756
  }
1696
1757
  }
1697
1758
 
@@ -1705,7 +1766,7 @@
1705
1766
 
1706
1767
  options.defaultDate = parsedDate;
1707
1768
 
1708
- if (options.defaultDate && options.inline || (input.val().trim() === '' && input.attr('placeholder') === undefined)) {
1769
+ if ((options.defaultDate && options.inline) || input.val().trim() === '') {
1709
1770
  setValue(options.defaultDate);
1710
1771
  }
1711
1772
  return picker;
@@ -1798,6 +1859,22 @@
1798
1859
  return picker;
1799
1860
  };
1800
1861
 
1862
+ picker.tooltips = function (tooltips) {
1863
+ if (arguments.length === 0) {
1864
+ return $.extend({}, options.tooltips);
1865
+ }
1866
+
1867
+ if (!(tooltips instanceof Object)) {
1868
+ throw new TypeError('tooltips() expects parameter to be an Object');
1869
+ }
1870
+ $.extend(options.tooltips, tooltips);
1871
+ if (widget) {
1872
+ hide();
1873
+ show();
1874
+ }
1875
+ return picker;
1876
+ };
1877
+
1801
1878
  picker.useStrict = function (useStrict) {
1802
1879
  if (arguments.length === 0) {
1803
1880
  return options.useStrict;
@@ -2012,10 +2089,18 @@
2012
2089
  };
2013
2090
 
2014
2091
  picker.keyBinds = function (keyBinds) {
2092
+ if (arguments.length === 0) {
2093
+ return options.keyBinds;
2094
+ }
2095
+
2015
2096
  options.keyBinds = keyBinds;
2016
2097
  return picker;
2017
2098
  };
2018
2099
 
2100
+ picker.getMoment = function (d) {
2101
+ return getMoment(d);
2102
+ };
2103
+
2019
2104
  picker.debug = function (debug) {
2020
2105
  if (typeof debug !== 'boolean') {
2021
2106
  throw new TypeError('debug() expects a boolean parameter');
@@ -2193,16 +2278,12 @@
2193
2278
  update();
2194
2279
  return picker;
2195
2280
  };
2196
-
2281
+ /**
2282
+ * Returns the component's model current viewDate, a moment object or null if not set. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.
2283
+ * @param {Takes string, viewDate, moment, null parameter.} newDate
2284
+ * @returns {viewDate.clone()}
2285
+ */
2197
2286
  picker.viewDate = function (newDate) {
2198
- ///<signature helpKeyword="$.fn.datetimepicker.viewDate">
2199
- ///<summary>Returns the component's model current viewDate, a moment object or null if not set.</summary>
2200
- ///<returns type="Moment">viewDate.clone()</returns>
2201
- ///</signature>
2202
- ///<signature>
2203
- ///<summary>Sets the components model current moment to it. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.</summary>
2204
- ///<param name="newDate" locid="$.fn.datetimepicker.date_p:newDate">Takes string, viewDate, moment, null parameter.</param>
2205
- ///</signature>
2206
2287
  if (arguments.length === 0) {
2207
2288
  return viewDate.clone();
2208
2289
  }
@@ -2226,7 +2307,7 @@
2226
2307
  input = element;
2227
2308
  } else {
2228
2309
  input = element.find(options.datepickerInput);
2229
- if (input.size() === 0) {
2310
+ if (input.length === 0) {
2230
2311
  input = element.find('input');
2231
2312
  } else if (!input.is('input')) {
2232
2313
  throw new Error('CSS class "' + options.datepickerInput + '" cannot be applied to non input element');
@@ -2235,8 +2316,8 @@
2235
2316
 
2236
2317
  if (element.hasClass('input-group')) {
2237
2318
  // in case there is more then one 'input-group-addon' Issue #48
2238
- if (element.find('.datepickerbutton').size() === 0) {
2239
- component = element.find('[class^="input-group-"]');
2319
+ if (element.find('.datepickerbutton').length === 0) {
2320
+ component = element.find('.input-group-addon');
2240
2321
  } else {
2241
2322
  component = element.find('.datepickerbutton');
2242
2323
  }
@@ -2246,6 +2327,10 @@
2246
2327
  throw new Error('Could not initialize DateTimePicker without an input element');
2247
2328
  }
2248
2329
 
2330
+ // Set defaults for date here now instead of in var declaration
2331
+ date = getMoment();
2332
+ viewDate = date.clone();
2333
+
2249
2334
  $.extend(true, options, dataToOptions());
2250
2335
 
2251
2336
  picker.options(options);
@@ -2275,18 +2360,68 @@
2275
2360
  *
2276
2361
  ********************************************************************************/
2277
2362
 
2363
+ /**
2364
+ * See (http://jquery.com/).
2365
+ * @name jQuery
2366
+ * @class
2367
+ * See the jQuery Library (http://jquery.com/) for full details. This just
2368
+ * documents the function and classes that are added to jQuery by this plug-in.
2369
+ */
2370
+ /**
2371
+ * See (http://jquery.com/)
2372
+ * @name fn
2373
+ * @class
2374
+ * See the jQuery Library (http://jquery.com/) for full details. This just
2375
+ * documents the function and classes that are added to jQuery by this plug-in.
2376
+ * @memberOf jQuery
2377
+ */
2378
+ /**
2379
+ * Show comments
2380
+ * @class datetimepicker
2381
+ * @memberOf jQuery.fn
2382
+ */
2278
2383
  $.fn.datetimepicker = function (options) {
2279
- return this.each(function () {
2280
- var $this = $(this);
2281
- if (!$this.data('DateTimePicker')) {
2282
- // create a private copy of the defaults object
2283
- options = $.extend(true, {}, $.fn.datetimepicker.defaults, options);
2284
- $this.data('DateTimePicker', dateTimePicker($this, options));
2285
- }
2286
- });
2384
+ options = options || {};
2385
+
2386
+ var args = Array.prototype.slice.call(arguments, 1),
2387
+ isInstance = true,
2388
+ thisMethods = ['destroy', 'hide', 'show', 'toggle'],
2389
+ returnValue;
2390
+
2391
+ if (typeof options === 'object') {
2392
+ return this.each(function () {
2393
+ var $this = $(this),
2394
+ _options;
2395
+ if (!$this.data('DateTimePicker')) {
2396
+ // create a private copy of the defaults object
2397
+ _options = $.extend(true, {}, $.fn.datetimepicker.defaults, options);
2398
+ $this.data('DateTimePicker', dateTimePicker($this, _options));
2399
+ }
2400
+ });
2401
+ } else if (typeof options === 'string') {
2402
+ this.each(function () {
2403
+ var $this = $(this),
2404
+ instance = $this.data('DateTimePicker');
2405
+ if (!instance) {
2406
+ throw new Error('bootstrap-datetimepicker("' + options + '") method was called on an element that is not using DateTimePicker');
2407
+ }
2408
+
2409
+ returnValue = instance[options].apply(instance, args);
2410
+ isInstance = returnValue === instance;
2411
+ });
2412
+
2413
+ if (isInstance || $.inArray(options, thisMethods) > -1) {
2414
+ return this;
2415
+ }
2416
+
2417
+ return returnValue;
2418
+ }
2419
+
2420
+ throw new TypeError('Invalid arguments for DateTimePicker: ' + options);
2287
2421
  };
2288
2422
 
2289
2423
  $.fn.datetimepicker.defaults = {
2424
+ timeZone: '',
2290
2425
  format: false,
2291
2426
  dayViewHeaderFormat: 'MMMM YYYY',
2292
2427
  extraFormats: false,
@@ -2310,6 +2445,33 @@
2310
2445
  clear: 'glyphicon glyphicon-trash',
2311
2446
  close: 'glyphicon glyphicon-remove'
2312
2447
  },
2448
+ tooltips: {
2449
+ today: 'Go to today',
2450
+ clear: 'Clear selection',
2451
+ close: 'Close the picker',
2452
+ selectMonth: 'Select Month',
2453
+ prevMonth: 'Previous Month',
2454
+ nextMonth: 'Next Month',
2455
+ selectYear: 'Select Year',
2456
+ prevYear: 'Previous Year',
2457
+ nextYear: 'Next Year',
2458
+ selectDecade: 'Select Decade',
2459
+ prevDecade: 'Previous Decade',
2460
+ nextDecade: 'Next Decade',
2461
+ prevCentury: 'Previous Century',
2462
+ nextCentury: 'Next Century',
2463
+ pickHour: 'Pick Hour',
2464
+ incrementHour: 'Increment Hour',
2465
+ decrementHour: 'Decrement Hour',
2466
+ pickMinute: 'Pick Minute',
2467
+ incrementMinute: 'Increment Minute',
2468
+ decrementMinute: 'Decrement Minute',
2469
+ pickSecond: 'Pick Second',
2470
+ incrementSecond: 'Increment Second',
2471
+ decrementSecond: 'Decrement Second',
2472
+ togglePeriod: 'Toggle Period',
2473
+ selectTime: 'Select Time'
2474
+ },
2313
2475
  useStrict: false,
2314
2476
  sideBySide: false,
2315
2477
  daysOfWeekDisabled: false,
@@ -2335,11 +2497,11 @@
2335
2497
  if (!widget) {
2336
2498
  return;
2337
2499
  }
2338
- var d = this.date() || moment();
2500
+ var d = this.date() || this.getMoment();
2339
2501
  if (widget.find('.datepicker').is(':visible')) {
2340
2502
  this.date(d.clone().subtract(7, 'd'));
2341
2503
  } else {
2342
- this.date(d.clone().add(1, 'm'));
2504
+ this.date(d.clone().add(this.stepping(), 'm'));
2343
2505
  }
2344
2506
  },
2345
2507
  down: function (widget) {
@@ -2347,18 +2509,18 @@
2347
2509
  this.show();
2348
2510
  return;
2349
2511
  }
2350
- var d = this.date() || moment();
2512
+ var d = this.date() || this.getMoment();
2351
2513
  if (widget.find('.datepicker').is(':visible')) {
2352
2514
  this.date(d.clone().add(7, 'd'));
2353
2515
  } else {
2354
- this.date(d.clone().subtract(1, 'm'));
2516
+ this.date(d.clone().subtract(this.stepping(), 'm'));
2355
2517
  }
2356
2518
  },
2357
2519
  'control up': function (widget) {
2358
2520
  if (!widget) {
2359
2521
  return;
2360
2522
  }
2361
- var d = this.date() || moment();
2523
+ var d = this.date() || this.getMoment();
2362
2524
  if (widget.find('.datepicker').is(':visible')) {
2363
2525
  this.date(d.clone().subtract(1, 'y'));
2364
2526
  } else {
@@ -2369,7 +2531,7 @@
2369
2531
  if (!widget) {
2370
2532
  return;
2371
2533
  }
2372
- var d = this.date() || moment();
2534
+ var d = this.date() || this.getMoment();
2373
2535
  if (widget.find('.datepicker').is(':visible')) {
2374
2536
  this.date(d.clone().add(1, 'y'));
2375
2537
  } else {
@@ -2380,7 +2542,7 @@
2380
2542
  if (!widget) {
2381
2543
  return;
2382
2544
  }
2383
- var d = this.date() || moment();
2545
+ var d = this.date() || this.getMoment();
2384
2546
  if (widget.find('.datepicker').is(':visible')) {
2385
2547
  this.date(d.clone().subtract(1, 'd'));
2386
2548
  }
@@ -2389,7 +2551,7 @@
2389
2551
  if (!widget) {
2390
2552
  return;
2391
2553
  }
2392
- var d = this.date() || moment();
2554
+ var d = this.date() || this.getMoment();
2393
2555
  if (widget.find('.datepicker').is(':visible')) {
2394
2556
  this.date(d.clone().add(1, 'd'));
2395
2557
  }
@@ -2398,7 +2560,7 @@
2398
2560
  if (!widget) {
2399
2561
  return;
2400
2562
  }
2401
- var d = this.date() || moment();
2563
+ var d = this.date() || this.getMoment();
2402
2564
  if (widget.find('.datepicker').is(':visible')) {
2403
2565
  this.date(d.clone().subtract(1, 'M'));
2404
2566
  }
@@ -2407,7 +2569,7 @@
2407
2569
  if (!widget) {
2408
2570
  return;
2409
2571
  }
2410
- var d = this.date() || moment();
2572
+ var d = this.date() || this.getMoment();
2411
2573
  if (widget.find('.datepicker').is(':visible')) {
2412
2574
  this.date(d.clone().add(1, 'M'));
2413
2575
  }
@@ -2423,12 +2585,15 @@
2423
2585
  // if(toggle.length > 0) toggle.click();
2424
2586
  //},
2425
2587
  'control space': function (widget) {
2588
+ if (!widget) {
2589
+ return;
2590
+ }
2426
2591
  if (widget.find('.timepicker').is(':visible')) {
2427
2592
  widget.find('.btn[data-action="togglePeriod"]').click();
2428
2593
  }
2429
2594
  },
2430
2595
  t: function () {
2431
- this.date(moment());
2596
+ this.date(this.getMoment());
2432
2597
  },
2433
2598
  'delete': function () {
2434
2599
  this.clear();
@@ -2441,4 +2606,6 @@
2441
2606
  enabledHours: false,
2442
2607
  viewDate: false
2443
2608
  };
2609
+
2610
+ return $.fn.datetimepicker;
2444
2611
  }));