dune-dashboard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +22 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +13 -0
  6. data/CHANGELOG.md +6 -0
  7. data/Gemfile +12 -0
  8. data/Gemfile.lock +392 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +58 -0
  11. data/Rakefile +23 -0
  12. data/app/assets/images/dune/dashboard/logo@2x.png +0 -0
  13. data/app/assets/javascripts/adapters/channel_adapter.coffee +1 -0
  14. data/app/assets/javascripts/adapters/form_data.coffee +26 -0
  15. data/app/assets/javascripts/adapters/press_asset_adapter.coffee +1 -0
  16. data/app/assets/javascripts/configs.coffee +10 -0
  17. data/app/assets/javascripts/controllers/.gitkeep +0 -0
  18. data/app/assets/javascripts/controllers/channels.coffee +40 -0
  19. data/app/assets/javascripts/controllers/contributions.coffee +26 -0
  20. data/app/assets/javascripts/controllers/press_assets.coffee +24 -0
  21. data/app/assets/javascripts/controllers/projects.coffee +36 -0
  22. data/app/assets/javascripts/controllers/sessions.coffee +2 -0
  23. data/app/assets/javascripts/controllers/tags.coffee +24 -0
  24. data/app/assets/javascripts/controllers/users.coffee +8 -0
  25. data/app/assets/javascripts/dashboard.coffee +5 -0
  26. data/app/assets/javascripts/dune-dashboard-application.js +16 -0
  27. data/app/assets/javascripts/dune-dashboard-libs.js +25 -0
  28. data/app/assets/javascripts/dune-dashboard-templates.js +1 -0
  29. data/app/assets/javascripts/helpers/daterangepicker.coffee +1 -0
  30. data/app/assets/javascripts/helpers/format-date.coffee +5 -0
  31. data/app/assets/javascripts/helpers/loading.coffee +14 -0
  32. data/app/assets/javascripts/helpers/number-to-currency.coffee +5 -0
  33. data/app/assets/javascripts/helpers/pagination.coffee +1 -0
  34. data/app/assets/javascripts/helpers/show-boolean.coffee +5 -0
  35. data/app/assets/javascripts/i18n/translations_en.js +165 -0
  36. data/app/assets/javascripts/initializers/authentication.coffee +50 -0
  37. data/app/assets/javascripts/mixins/modal-controller.coffee +7 -0
  38. data/app/assets/javascripts/mixins/modal-view.coffee +15 -0
  39. data/app/assets/javascripts/mixins/paginable.coffee +25 -0
  40. data/app/assets/javascripts/mixins/searchable.coffee +58 -0
  41. data/app/assets/javascripts/models/.gitkeep +0 -0
  42. data/app/assets/javascripts/models/channel.coffee +25 -0
  43. data/app/assets/javascripts/models/contributions.coffee +15 -0
  44. data/app/assets/javascripts/models/press_asset.coffee +5 -0
  45. data/app/assets/javascripts/models/project.coffee +16 -0
  46. data/app/assets/javascripts/models/reward.coffee +4 -0
  47. data/app/assets/javascripts/models/tag.coffee +4 -0
  48. data/app/assets/javascripts/models/user.coffee +13 -0
  49. data/app/assets/javascripts/router.coffee +36 -0
  50. data/app/assets/javascripts/routes/.gitkeep +0 -0
  51. data/app/assets/javascripts/routes/application.coffee +35 -0
  52. data/app/assets/javascripts/routes/channels-edit.coffee +4 -0
  53. data/app/assets/javascripts/routes/channels-new.coffee +4 -0
  54. data/app/assets/javascripts/routes/channels.coffee +21 -0
  55. data/app/assets/javascripts/routes/contributions.coffee +29 -0
  56. data/app/assets/javascripts/routes/index.coffee +4 -0
  57. data/app/assets/javascripts/routes/press_assets-edit.coffee +4 -0
  58. data/app/assets/javascripts/routes/press_assets-new.coffee +5 -0
  59. data/app/assets/javascripts/routes/press_assets.coffee +13 -0
  60. data/app/assets/javascripts/routes/projects.coffee +23 -0
  61. data/app/assets/javascripts/routes/sessions.coffee +3 -0
  62. data/app/assets/javascripts/routes/tags-edit.coffee +4 -0
  63. data/app/assets/javascripts/routes/tags-new.coffee +5 -0
  64. data/app/assets/javascripts/routes/tags.coffee +15 -0
  65. data/app/assets/javascripts/routes/users.coffee +17 -0
  66. data/app/assets/javascripts/serializers/channel.coffee +10 -0
  67. data/app/assets/javascripts/serializers/file.coffee +6 -0
  68. data/app/assets/javascripts/serializers/object.coffee +6 -0
  69. data/app/assets/javascripts/serializers/project.coffee +4 -0
  70. data/app/assets/javascripts/store.coffee +5 -0
  71. data/app/assets/javascripts/templates/.gitkeep +0 -0
  72. data/app/assets/javascripts/templates/channels/_form.emblem +256 -0
  73. data/app/assets/javascripts/templates/channels/edit.emblem +1 -0
  74. data/app/assets/javascripts/templates/channels/index.emblem +66 -0
  75. data/app/assets/javascripts/templates/channels/new.emblem +1 -0
  76. data/app/assets/javascripts/templates/channels/search-form.emblem +13 -0
  77. data/app/assets/javascripts/templates/contributions/index.emblem +111 -0
  78. data/app/assets/javascripts/templates/contributions/search-form.emblem +27 -0
  79. data/app/assets/javascripts/templates/contributions/show.emblem +79 -0
  80. data/app/assets/javascripts/templates/daterangepicker.emblem +5 -0
  81. data/app/assets/javascripts/templates/layouts/application.emblem +19 -0
  82. data/app/assets/javascripts/templates/layouts/header.emblem +25 -0
  83. data/app/assets/javascripts/templates/layouts/sidebar.emblem +32 -0
  84. data/app/assets/javascripts/templates/pagination.emblem +10 -0
  85. data/app/assets/javascripts/templates/press_assets/_form.emblem +33 -0
  86. data/app/assets/javascripts/templates/press_assets/edit.emblem +1 -0
  87. data/app/assets/javascripts/templates/press_assets/index.emblem +45 -0
  88. data/app/assets/javascripts/templates/press_assets/new.emblem +1 -0
  89. data/app/assets/javascripts/templates/projects/index.emblem +119 -0
  90. data/app/assets/javascripts/templates/projects/search-form.emblem +19 -0
  91. data/app/assets/javascripts/templates/search-tab.emblem +6 -0
  92. data/app/assets/javascripts/templates/sessions/new.emblem +17 -0
  93. data/app/assets/javascripts/templates/tags/_form.emblem +24 -0
  94. data/app/assets/javascripts/templates/tags/edit.emblem +1 -0
  95. data/app/assets/javascripts/templates/tags/index.emblem +46 -0
  96. data/app/assets/javascripts/templates/tags/new.emblem +1 -0
  97. data/app/assets/javascripts/templates/users/index.emblem +51 -0
  98. data/app/assets/javascripts/templates/users/search-form.emblem +13 -0
  99. data/app/assets/javascripts/views/auto-save-checkbox.coffee +14 -0
  100. data/app/assets/javascripts/views/contributions/show.coffee +1 -0
  101. data/app/assets/javascripts/views/daterangepicker.coffee +60 -0
  102. data/app/assets/javascripts/views/file.coffee +7 -0
  103. data/app/assets/javascripts/views/layouts/header.coffee +23 -0
  104. data/app/assets/javascripts/views/layouts/sidebar.coffee +6 -0
  105. data/app/assets/javascripts/views/page-title.coffee +45 -0
  106. data/app/assets/javascripts/views/pagination.coffee +51 -0
  107. data/app/assets/javascripts/views/projects/index.coffee +5 -0
  108. data/app/assets/javascripts/views/search-tab.coffee +24 -0
  109. data/app/assets/stylesheets/core/core.sass +299 -0
  110. data/app/assets/stylesheets/core/mixins.sass +83 -0
  111. data/app/assets/stylesheets/core/settings.sass +75 -0
  112. data/app/assets/stylesheets/dune-dashboard-application.sass +12 -0
  113. data/app/assets/stylesheets/modules/alerts.sass +21 -0
  114. data/app/assets/stylesheets/modules/avatar.sass +13 -0
  115. data/app/assets/stylesheets/modules/boxes.sass +274 -0
  116. data/app/assets/stylesheets/modules/buttons.sass +160 -0
  117. data/app/assets/stylesheets/modules/dl-details.sass +13 -0
  118. data/app/assets/stylesheets/modules/forms.sass +53 -0
  119. data/app/assets/stylesheets/modules/generic.sass +9 -0
  120. data/app/assets/stylesheets/modules/header.sass +153 -0
  121. data/app/assets/stylesheets/modules/labels.sass +3 -0
  122. data/app/assets/stylesheets/modules/navs.sass +98 -0
  123. data/app/assets/stylesheets/modules/pagination.sass +19 -0
  124. data/app/assets/stylesheets/modules/sidebar.sass +147 -0
  125. data/app/assets/stylesheets/modules/small-box.sass +78 -0
  126. data/app/assets/stylesheets/pages/login.sass +42 -0
  127. data/app/controllers/dune/dashboard/ember_controller.rb +7 -0
  128. data/app/views/layouts/dune/dashboard/application.html.erb +15 -0
  129. data/bower.json +28 -0
  130. data/config/ember-i18n.yml +2 -0
  131. data/config/ember_locales/channels.en.yml +49 -0
  132. data/config/ember_locales/contributions.en.yml +42 -0
  133. data/config/ember_locales/en.yml +1 -0
  134. data/config/ember_locales/layouts.en.yml +16 -0
  135. data/config/ember_locales/press_assets.en.yml +14 -0
  136. data/config/ember_locales/projects.en.yml +33 -0
  137. data/config/ember_locales/sessions.en.yml +11 -0
  138. data/config/ember_locales/tags.en.yml +12 -0
  139. data/config/ember_locales/titles.en.yml +22 -0
  140. data/config/ember_locales/users.en.yml +12 -0
  141. data/config/ember_locales/words.en.yml +12 -0
  142. data/config/routes.rb +4 -0
  143. data/dune-dashboard.gemspec +28 -0
  144. data/lib/dune/dashboard.rb +11 -0
  145. data/lib/dune/dashboard/engine.rb +12 -0
  146. data/lib/dune/dashboard/i18n.rb +108 -0
  147. data/lib/dune/dashboard/version.rb +5 -0
  148. data/spec/dummy/README.rdoc +28 -0
  149. data/spec/dummy/Rakefile +6 -0
  150. data/spec/dummy/app/assets/images/.keep +0 -0
  151. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  152. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  153. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  154. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  155. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  156. data/spec/dummy/app/mailers/.keep +0 -0
  157. data/spec/dummy/app/models/.keep +0 -0
  158. data/spec/dummy/app/models/concerns/.keep +0 -0
  159. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  160. data/spec/dummy/bin/bundle +3 -0
  161. data/spec/dummy/bin/rails +4 -0
  162. data/spec/dummy/bin/rake +4 -0
  163. data/spec/dummy/config.ru +4 -0
  164. data/spec/dummy/config/application.rb +30 -0
  165. data/spec/dummy/config/boot.rb +5 -0
  166. data/spec/dummy/config/environment.rb +5 -0
  167. data/spec/dummy/config/environments/development.rb +29 -0
  168. data/spec/dummy/config/environments/production.rb +80 -0
  169. data/spec/dummy/config/environments/test.rb +38 -0
  170. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  171. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  172. data/spec/dummy/config/initializers/inflections.rb +16 -0
  173. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  174. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  175. data/spec/dummy/config/initializers/session_store.rb +3 -0
  176. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  177. data/spec/dummy/config/locales/en.yml +23 -0
  178. data/spec/dummy/config/routes.rb +3 -0
  179. data/spec/dummy/lib/assets/.keep +0 -0
  180. data/spec/dummy/log/.keep +0 -0
  181. data/spec/dummy/public/404.html +58 -0
  182. data/spec/dummy/public/422.html +58 -0
  183. data/spec/dummy/public/500.html +57 -0
  184. data/spec/dummy/public/favicon.ico +0 -0
  185. data/spec/javascripts/controllers/channels_spec.coffee +16 -0
  186. data/spec/javascripts/controllers/press_assets_spec.coffee +5 -0
  187. data/spec/javascripts/controllers/projects_spec.coffee +16 -0
  188. data/spec/javascripts/controllers/users_spec.coffee +16 -0
  189. data/spec/javascripts/fixtures/channels.coffee +49 -0
  190. data/spec/javascripts/fixtures/contributions.coffee +46 -0
  191. data/spec/javascripts/fixtures/press_assets.coffee +15 -0
  192. data/spec/javascripts/fixtures/projects.coffee +108 -0
  193. data/spec/javascripts/fixtures/tags.coffee +15 -0
  194. data/spec/javascripts/fixtures/users.coffee +26 -0
  195. data/spec/javascripts/helpers/auththentication.coffee +11 -0
  196. data/spec/javascripts/integration/channels_spec.coffee +109 -0
  197. data/spec/javascripts/integration/contributions_spec.coffee +108 -0
  198. data/spec/javascripts/integration/press_assets_spec.coffee +66 -0
  199. data/spec/javascripts/integration/projects_spec.coffee +110 -0
  200. data/spec/javascripts/integration/sessions_spec.coffee +71 -0
  201. data/spec/javascripts/integration/tags_spec.coffee +65 -0
  202. data/spec/javascripts/integration/users_spec.coffee +108 -0
  203. data/spec/javascripts/models/channel_spec.coffee +4 -0
  204. data/spec/javascripts/models/contribution_spec.coffee +4 -0
  205. data/spec/javascripts/models/press_asset_spec.coffee +5 -0
  206. data/spec/javascripts/models/project_spec.coffee +4 -0
  207. data/spec/javascripts/models/reward_spec.coffee +4 -0
  208. data/spec/javascripts/models/tag_spec.coffee +4 -0
  209. data/spec/javascripts/models/user_spec.coffee +4 -0
  210. data/spec/javascripts/spec_helper.coffee +56 -0
  211. data/spec/javascripts/support/jquery.mockjax.js +598 -0
  212. data/spec/teaspoon_env.rb +183 -0
  213. data/vendor/assets/components/cldr/.bower.json +14 -0
  214. data/vendor/assets/components/cldr/README.md +47 -0
  215. data/vendor/assets/components/cldr/plurals.js +240 -0
  216. data/vendor/assets/components/ember-i18n/.bower.json +46 -0
  217. data/vendor/assets/components/ember-i18n/CONTRIBUTING.md +13 -0
  218. data/vendor/assets/components/ember-i18n/Changelog.md +82 -0
  219. data/vendor/assets/components/ember-i18n/LICENSE +10 -0
  220. data/vendor/assets/components/ember-i18n/README.md +148 -0
  221. data/vendor/assets/components/ember-i18n/VERSION +1 -0
  222. data/vendor/assets/components/ember-i18n/bower.json +34 -0
  223. data/vendor/assets/components/ember-i18n/lib/i18n.js +215 -0
  224. data/vendor/assets/components/ember-i18n/package.json +27 -0
  225. data/vendor/assets/components/ember-i18n/script/buildSuite.js +34 -0
  226. data/vendor/assets/components/ember-i18n/script/fetch_vendor.js +66 -0
  227. data/vendor/assets/components/ember-i18n/script/run.js +24 -0
  228. data/vendor/assets/components/ember-simple-auth/.bower.json +31 -0
  229. data/vendor/assets/components/ember-simple-auth/LICENSE +20 -0
  230. data/vendor/assets/components/ember-simple-auth/README.md +15 -0
  231. data/vendor/assets/components/ember-simple-auth/bower.json +21 -0
  232. data/vendor/assets/components/ember-simple-auth/simple-auth-cookie-store.amd.js +220 -0
  233. data/vendor/assets/components/ember-simple-auth/simple-auth-cookie-store.js +284 -0
  234. data/vendor/assets/components/ember-simple-auth/simple-auth-devise.amd.js +243 -0
  235. data/vendor/assets/components/ember-simple-auth/simple-auth-devise.js +312 -0
  236. data/vendor/assets/components/ember-simple-auth/simple-auth-oauth2.amd.js +386 -0
  237. data/vendor/assets/components/ember-simple-auth/simple-auth-oauth2.js +455 -0
  238. data/vendor/assets/components/ember-simple-auth/simple-auth-testing.amd.js +79 -0
  239. data/vendor/assets/components/ember-simple-auth/simple-auth-testing.js +137 -0
  240. data/vendor/assets/components/ember-simple-auth/simple-auth-torii.amd.js +142 -0
  241. data/vendor/assets/components/ember-simple-auth/simple-auth-torii.js +199 -0
  242. data/vendor/assets/components/ember-simple-auth/simple-auth.amd.js +1450 -0
  243. data/vendor/assets/components/ember-simple-auth/simple-auth.js +1548 -0
  244. data/vendor/assets/components/ember/.bower.json +21 -0
  245. data/vendor/assets/components/ember/.gitignore +5 -0
  246. data/vendor/assets/components/ember/Makefile +9 -0
  247. data/vendor/assets/components/ember/README.md +12 -0
  248. data/vendor/assets/components/ember/bower.json +11 -0
  249. data/vendor/assets/components/ember/component.json +13 -0
  250. data/vendor/assets/components/ember/composer.json +27 -0
  251. data/vendor/assets/components/ember/ember-template-compiler.js +336 -0
  252. data/vendor/assets/components/ember/ember.js +46762 -0
  253. data/vendor/assets/components/ember/ember.min.js +20 -0
  254. data/vendor/assets/components/ember/ember.prod.js +46319 -0
  255. data/vendor/assets/components/ember/package.json +11 -0
  256. data/vendor/assets/components/handlebars/.bower.json +16 -0
  257. data/vendor/assets/components/handlebars/.gitignore +2 -0
  258. data/vendor/assets/components/handlebars/README.md +11 -0
  259. data/vendor/assets/components/handlebars/bower.json +6 -0
  260. data/vendor/assets/components/handlebars/component.json +9 -0
  261. data/vendor/assets/components/handlebars/composer.json +35 -0
  262. data/vendor/assets/components/handlebars/handlebars-source.gemspec +21 -0
  263. data/vendor/assets/components/handlebars/handlebars.amd.js +2719 -0
  264. data/vendor/assets/components/handlebars/handlebars.amd.min.js +28 -0
  265. data/vendor/assets/components/handlebars/handlebars.js +2746 -0
  266. data/vendor/assets/components/handlebars/handlebars.js.nuspec +17 -0
  267. data/vendor/assets/components/handlebars/handlebars.min.js +28 -0
  268. data/vendor/assets/components/handlebars/handlebars.runtime.amd.js +515 -0
  269. data/vendor/assets/components/handlebars/handlebars.runtime.amd.min.js +27 -0
  270. data/vendor/assets/components/handlebars/handlebars.runtime.js +530 -0
  271. data/vendor/assets/components/handlebars/handlebars.runtime.min.js +27 -0
  272. data/vendor/assets/components/handlebars/lib/handlebars/source.rb +11 -0
  273. data/vendor/assets/components/jquery/.bower.json +37 -0
  274. data/vendor/assets/components/jquery/MIT-LICENSE.txt +21 -0
  275. data/vendor/assets/components/jquery/bower.json +27 -0
  276. data/vendor/assets/components/jquery/dist/jquery.js +9111 -0
  277. data/vendor/assets/components/jquery/dist/jquery.min.js +5 -0
  278. data/vendor/assets/components/jquery/dist/jquery.min.map +1 -0
  279. data/vendor/assets/components/jquery/src/ajax.js +806 -0
  280. data/vendor/assets/components/jquery/src/ajax/jsonp.js +89 -0
  281. data/vendor/assets/components/jquery/src/ajax/load.js +75 -0
  282. data/vendor/assets/components/jquery/src/ajax/parseJSON.js +13 -0
  283. data/vendor/assets/components/jquery/src/ajax/parseXML.js +28 -0
  284. data/vendor/assets/components/jquery/src/ajax/script.js +64 -0
  285. data/vendor/assets/components/jquery/src/ajax/var/nonce.js +5 -0
  286. data/vendor/assets/components/jquery/src/ajax/var/rquery.js +3 -0
  287. data/vendor/assets/components/jquery/src/ajax/xhr.js +130 -0
  288. data/vendor/assets/components/jquery/src/attributes.js +11 -0
  289. data/vendor/assets/components/jquery/src/attributes/attr.js +143 -0
  290. data/vendor/assets/components/jquery/src/attributes/classes.js +158 -0
  291. data/vendor/assets/components/jquery/src/attributes/prop.js +96 -0
  292. data/vendor/assets/components/jquery/src/attributes/support.js +35 -0
  293. data/vendor/assets/components/jquery/src/attributes/val.js +153 -0
  294. data/vendor/assets/components/jquery/src/callbacks.js +205 -0
  295. data/vendor/assets/components/jquery/src/core.js +500 -0
  296. data/vendor/assets/components/jquery/src/core/access.js +60 -0
  297. data/vendor/assets/components/jquery/src/core/init.js +123 -0
  298. data/vendor/assets/components/jquery/src/core/parseHTML.js +39 -0
  299. data/vendor/assets/components/jquery/src/core/ready.js +96 -0
  300. data/vendor/assets/components/jquery/src/core/var/rsingleTag.js +4 -0
  301. data/vendor/assets/components/jquery/src/css.js +455 -0
  302. data/vendor/assets/components/jquery/src/css/addGetHookIf.js +24 -0
  303. data/vendor/assets/components/jquery/src/css/curCSS.js +57 -0
  304. data/vendor/assets/components/jquery/src/css/defaultDisplay.js +69 -0
  305. data/vendor/assets/components/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  306. data/vendor/assets/components/jquery/src/css/support.js +83 -0
  307. data/vendor/assets/components/jquery/src/css/swap.js +28 -0
  308. data/vendor/assets/components/jquery/src/css/var/cssExpand.js +3 -0
  309. data/vendor/assets/components/jquery/src/css/var/getStyles.js +5 -0
  310. data/vendor/assets/components/jquery/src/css/var/isHidden.js +13 -0
  311. data/vendor/assets/components/jquery/src/css/var/rmargin.js +3 -0
  312. data/vendor/assets/components/jquery/src/css/var/rnumnonpx.js +5 -0
  313. data/vendor/assets/components/jquery/src/data.js +175 -0
  314. data/vendor/assets/components/jquery/src/data/Data.js +181 -0
  315. data/vendor/assets/components/jquery/src/data/accepts.js +20 -0
  316. data/vendor/assets/components/jquery/src/data/var/data_priv.js +5 -0
  317. data/vendor/assets/components/jquery/src/data/var/data_user.js +5 -0
  318. data/vendor/assets/components/jquery/src/deferred.js +149 -0
  319. data/vendor/assets/components/jquery/src/deprecated.js +13 -0
  320. data/vendor/assets/components/jquery/src/dimensions.js +50 -0
  321. data/vendor/assets/components/jquery/src/effects.js +642 -0
  322. data/vendor/assets/components/jquery/src/effects/Tween.js +114 -0
  323. data/vendor/assets/components/jquery/src/effects/animatedSelector.js +13 -0
  324. data/vendor/assets/components/jquery/src/event.js +859 -0
  325. data/vendor/assets/components/jquery/src/event/alias.js +39 -0
  326. data/vendor/assets/components/jquery/src/event/support.js +9 -0
  327. data/vendor/assets/components/jquery/src/exports/amd.js +18 -0
  328. data/vendor/assets/components/jquery/src/exports/global.js +32 -0
  329. data/vendor/assets/components/jquery/src/intro.js +44 -0
  330. data/vendor/assets/components/jquery/src/jquery.js +36 -0
  331. data/vendor/assets/components/jquery/src/manipulation.js +583 -0
  332. data/vendor/assets/components/jquery/src/manipulation/_evalUrl.js +18 -0
  333. data/vendor/assets/components/jquery/src/manipulation/support.js +24 -0
  334. data/vendor/assets/components/jquery/src/manipulation/var/rcheckableType.js +3 -0
  335. data/vendor/assets/components/jquery/src/offset.js +204 -0
  336. data/vendor/assets/components/jquery/src/outro.js +1 -0
  337. data/vendor/assets/components/jquery/src/queue.js +142 -0
  338. data/vendor/assets/components/jquery/src/queue/delay.js +22 -0
  339. data/vendor/assets/components/jquery/src/selector-native.js +171 -0
  340. data/vendor/assets/components/jquery/src/selector-sizzle.js +14 -0
  341. data/vendor/assets/components/jquery/src/selector.js +1 -0
  342. data/vendor/assets/components/jquery/src/serialize.js +111 -0
  343. data/vendor/assets/components/jquery/src/sizzle/dist/sizzle.js +2015 -0
  344. data/vendor/assets/components/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  345. data/vendor/assets/components/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  346. data/vendor/assets/components/jquery/src/traversing.js +200 -0
  347. data/vendor/assets/components/jquery/src/traversing/findFilter.js +100 -0
  348. data/vendor/assets/components/jquery/src/traversing/var/rneedsContext.js +6 -0
  349. data/vendor/assets/components/jquery/src/var/arr.js +3 -0
  350. data/vendor/assets/components/jquery/src/var/class2type.js +4 -0
  351. data/vendor/assets/components/jquery/src/var/concat.js +5 -0
  352. data/vendor/assets/components/jquery/src/var/hasOwn.js +5 -0
  353. data/vendor/assets/components/jquery/src/var/indexOf.js +5 -0
  354. data/vendor/assets/components/jquery/src/var/pnum.js +3 -0
  355. data/vendor/assets/components/jquery/src/var/push.js +5 -0
  356. data/vendor/assets/components/jquery/src/var/rnotwhite.js +3 -0
  357. data/vendor/assets/components/jquery/src/var/slice.js +5 -0
  358. data/vendor/assets/components/jquery/src/var/strundefined.js +3 -0
  359. data/vendor/assets/components/jquery/src/var/support.js +4 -0
  360. data/vendor/assets/components/jquery/src/var/toString.js +5 -0
  361. data/vendor/assets/components/jquery/src/var/trim.js +3 -0
  362. data/vendor/assets/components/jquery/src/wrap.js +78 -0
  363. data/vendor/assets/components/moment/.bower.json +30 -0
  364. data/vendor/assets/components/moment/LICENSE +22 -0
  365. data/vendor/assets/components/moment/bower.json +20 -0
  366. data/vendor/assets/components/moment/lang/ar-ma.js +56 -0
  367. data/vendor/assets/components/moment/lang/ar-sa.js +96 -0
  368. data/vendor/assets/components/moment/lang/ar.js +97 -0
  369. data/vendor/assets/components/moment/lang/az.js +102 -0
  370. data/vendor/assets/components/moment/lang/bg.js +86 -0
  371. data/vendor/assets/components/moment/lang/bn.js +106 -0
  372. data/vendor/assets/components/moment/lang/br.js +107 -0
  373. data/vendor/assets/components/moment/lang/bs.js +139 -0
  374. data/vendor/assets/components/moment/lang/ca.js +66 -0
  375. data/vendor/assets/components/moment/lang/cs.js +155 -0
  376. data/vendor/assets/components/moment/lang/cv.js +59 -0
  377. data/vendor/assets/components/moment/lang/cy.js +77 -0
  378. data/vendor/assets/components/moment/lang/da.js +56 -0
  379. data/vendor/assets/components/moment/lang/de-at.js +72 -0
  380. data/vendor/assets/components/moment/lang/de.js +71 -0
  381. data/vendor/assets/components/moment/lang/el.js +90 -0
  382. data/vendor/assets/components/moment/lang/en-au.js +62 -0
  383. data/vendor/assets/components/moment/lang/en-ca.js +59 -0
  384. data/vendor/assets/components/moment/lang/en-gb.js +63 -0
  385. data/vendor/assets/components/moment/lang/eo.js +65 -0
  386. data/vendor/assets/components/moment/lang/es.js +75 -0
  387. data/vendor/assets/components/moment/lang/et.js +76 -0
  388. data/vendor/assets/components/moment/lang/eu.js +60 -0
  389. data/vendor/assets/components/moment/lang/fa.js +97 -0
  390. data/vendor/assets/components/moment/lang/fi.js +103 -0
  391. data/vendor/assets/components/moment/lang/fo.js +56 -0
  392. data/vendor/assets/components/moment/lang/fr-ca.js +54 -0
  393. data/vendor/assets/components/moment/lang/fr.js +58 -0
  394. data/vendor/assets/components/moment/lang/gl.js +71 -0
  395. data/vendor/assets/components/moment/lang/he.js +77 -0
  396. data/vendor/assets/components/moment/lang/hi.js +105 -0
  397. data/vendor/assets/components/moment/lang/hr.js +140 -0
  398. data/vendor/assets/components/moment/lang/hu.js +105 -0
  399. data/vendor/assets/components/moment/lang/hy-am.js +113 -0
  400. data/vendor/assets/components/moment/lang/id.js +67 -0
  401. data/vendor/assets/components/moment/lang/is.js +124 -0
  402. data/vendor/assets/components/moment/lang/it.js +59 -0
  403. data/vendor/assets/components/moment/lang/ja.js +58 -0
  404. data/vendor/assets/components/moment/lang/ka.js +108 -0
  405. data/vendor/assets/components/moment/lang/km.js +55 -0
  406. data/vendor/assets/components/moment/lang/ko.js +63 -0
  407. data/vendor/assets/components/moment/lang/lb.js +160 -0
  408. data/vendor/assets/components/moment/lang/lt.js +118 -0
  409. data/vendor/assets/components/moment/lang/lv.js +77 -0
  410. data/vendor/assets/components/moment/lang/mk.js +86 -0
  411. data/vendor/assets/components/moment/lang/ml.js +64 -0
  412. data/vendor/assets/components/moment/lang/mr.js +104 -0
  413. data/vendor/assets/components/moment/lang/ms-my.js +66 -0
  414. data/vendor/assets/components/moment/lang/nb.js +57 -0
  415. data/vendor/assets/components/moment/lang/ne.js +105 -0
  416. data/vendor/assets/components/moment/lang/nl.js +67 -0
  417. data/vendor/assets/components/moment/lang/nn.js +56 -0
  418. data/vendor/assets/components/moment/lang/pl.js +98 -0
  419. data/vendor/assets/components/moment/lang/pt-br.js +56 -0
  420. data/vendor/assets/components/moment/lang/pt.js +60 -0
  421. data/vendor/assets/components/moment/lang/ro.js +72 -0
  422. data/vendor/assets/components/moment/lang/ru.js +166 -0
  423. data/vendor/assets/components/moment/lang/sk.js +156 -0
  424. data/vendor/assets/components/moment/lang/sl.js +144 -0
  425. data/vendor/assets/components/moment/lang/sq.js +61 -0
  426. data/vendor/assets/components/moment/lang/sr-cyrl.js +106 -0
  427. data/vendor/assets/components/moment/lang/sr.js +106 -0
  428. data/vendor/assets/components/moment/lang/sv.js +63 -0
  429. data/vendor/assets/components/moment/lang/ta.js +112 -0
  430. data/vendor/assets/components/moment/lang/th.js +58 -0
  431. data/vendor/assets/components/moment/lang/tl-ph.js +58 -0
  432. data/vendor/assets/components/moment/lang/tr.js +93 -0
  433. data/vendor/assets/components/moment/lang/tzm-latn.js +55 -0
  434. data/vendor/assets/components/moment/lang/tzm.js +55 -0
  435. data/vendor/assets/components/moment/lang/uk.js +157 -0
  436. data/vendor/assets/components/moment/lang/uz.js +55 -0
  437. data/vendor/assets/components/moment/lang/vi.js +62 -0
  438. data/vendor/assets/components/moment/lang/zh-cn.js +108 -0
  439. data/vendor/assets/components/moment/lang/zh-tw.js +84 -0
  440. data/vendor/assets/components/moment/min/langs.js +6426 -0
  441. data/vendor/assets/components/moment/min/langs.min.js +4 -0
  442. data/vendor/assets/components/moment/min/moment-with-langs.js +8521 -0
  443. data/vendor/assets/components/moment/min/moment-with-langs.min.js +9 -0
  444. data/vendor/assets/components/moment/min/moment.min.js +6 -0
  445. data/vendor/assets/components/moment/moment.js +2610 -0
  446. data/vendor/assets/components/moment/readme.md +388 -0
  447. data/vendor/assets/components/numeral/.bower.json +28 -0
  448. data/vendor/assets/components/numeral/.gitignore +29 -0
  449. data/vendor/assets/components/numeral/.travis.yml +7 -0
  450. data/vendor/assets/components/numeral/Gruntfile.js +91 -0
  451. data/vendor/assets/components/numeral/LICENSE +22 -0
  452. data/vendor/assets/components/numeral/README.md +213 -0
  453. data/vendor/assets/components/numeral/bower.json +16 -0
  454. data/vendor/assets/components/numeral/component.json +16 -0
  455. data/vendor/assets/components/numeral/languages.js +989 -0
  456. data/vendor/assets/components/numeral/languages/be-nl.js +35 -0
  457. data/vendor/assets/components/numeral/languages/chs.js +34 -0
  458. data/vendor/assets/components/numeral/languages/cs.js +34 -0
  459. data/vendor/assets/components/numeral/languages/da-dk.js +34 -0
  460. data/vendor/assets/components/numeral/languages/de-ch.js +34 -0
  461. data/vendor/assets/components/numeral/languages/de.js +34 -0
  462. data/vendor/assets/components/numeral/languages/en-gb.js +38 -0
  463. data/vendor/assets/components/numeral/languages/es-ES.js +39 -0
  464. data/vendor/assets/components/numeral/languages/es.js +39 -0
  465. data/vendor/assets/components/numeral/languages/et.js +37 -0
  466. data/vendor/assets/components/numeral/languages/fi.js +34 -0
  467. data/vendor/assets/components/numeral/languages/fr-CA.js +34 -0
  468. data/vendor/assets/components/numeral/languages/fr-ch.js +34 -0
  469. data/vendor/assets/components/numeral/languages/fr.js +34 -0
  470. data/vendor/assets/components/numeral/languages/hu.js +34 -0
  471. data/vendor/assets/components/numeral/languages/it.js +34 -0
  472. data/vendor/assets/components/numeral/languages/ja.js +34 -0
  473. data/vendor/assets/components/numeral/languages/nl-nl.js +35 -0
  474. data/vendor/assets/components/numeral/languages/pl.js +34 -0
  475. data/vendor/assets/components/numeral/languages/pt-br.js +34 -0
  476. data/vendor/assets/components/numeral/languages/pt-pt.js +34 -0
  477. data/vendor/assets/components/numeral/languages/ru-UA.js +35 -0
  478. data/vendor/assets/components/numeral/languages/ru.js +37 -0
  479. data/vendor/assets/components/numeral/languages/sk.js +34 -0
  480. data/vendor/assets/components/numeral/languages/th.js +34 -0
  481. data/vendor/assets/components/numeral/languages/tr.js +67 -0
  482. data/vendor/assets/components/numeral/languages/uk-UA.js +35 -0
  483. data/vendor/assets/components/numeral/min/languages.min.js +129 -0
  484. data/vendor/assets/components/numeral/min/languages/be-nl.min.js +6 -0
  485. data/vendor/assets/components/numeral/min/languages/chs.min.js +6 -0
  486. data/vendor/assets/components/numeral/min/languages/cs.min.js +6 -0
  487. data/vendor/assets/components/numeral/min/languages/da-dk.min.js +6 -0
  488. data/vendor/assets/components/numeral/min/languages/de-ch.min.js +6 -0
  489. data/vendor/assets/components/numeral/min/languages/de.min.js +6 -0
  490. data/vendor/assets/components/numeral/min/languages/en-gb.min.js +6 -0
  491. data/vendor/assets/components/numeral/min/languages/es-ES.min.js +6 -0
  492. data/vendor/assets/components/numeral/min/languages/es.min.js +6 -0
  493. data/vendor/assets/components/numeral/min/languages/et.min.js +9 -0
  494. data/vendor/assets/components/numeral/min/languages/fi.min.js +6 -0
  495. data/vendor/assets/components/numeral/min/languages/fr-CA.min.js +6 -0
  496. data/vendor/assets/components/numeral/min/languages/fr-ch.min.js +6 -0
  497. data/vendor/assets/components/numeral/min/languages/fr.min.js +6 -0
  498. data/vendor/assets/components/numeral/min/languages/hu.min.js +6 -0
  499. data/vendor/assets/components/numeral/min/languages/it.min.js +6 -0
  500. data/vendor/assets/components/numeral/min/languages/ja.min.js +6 -0
  501. data/vendor/assets/components/numeral/min/languages/nl-nl.min.js +6 -0
  502. data/vendor/assets/components/numeral/min/languages/pl.min.js +6 -0
  503. data/vendor/assets/components/numeral/min/languages/pt-br.min.js +6 -0
  504. data/vendor/assets/components/numeral/min/languages/pt-pt.min.js +6 -0
  505. data/vendor/assets/components/numeral/min/languages/ru-UA.min.js +1 -0
  506. data/vendor/assets/components/numeral/min/languages/ru.min.js +6 -0
  507. data/vendor/assets/components/numeral/min/languages/sk.min.js +6 -0
  508. data/vendor/assets/components/numeral/min/languages/th.min.js +6 -0
  509. data/vendor/assets/components/numeral/min/languages/tr.min.js +6 -0
  510. data/vendor/assets/components/numeral/min/languages/uk-UA.min.js +1 -0
  511. data/vendor/assets/components/numeral/min/numeral.min.js +8 -0
  512. data/vendor/assets/components/numeral/numeral.js +679 -0
  513. data/vendor/assets/components/numeral/package.json +50 -0
  514. data/vendor/assets/components/numeral/tests/languages/be-nl.js +107 -0
  515. data/vendor/assets/components/numeral/tests/languages/chs.js +101 -0
  516. data/vendor/assets/components/numeral/tests/languages/cs.js +102 -0
  517. data/vendor/assets/components/numeral/tests/languages/da-dk.js +101 -0
  518. data/vendor/assets/components/numeral/tests/languages/de-ch.js +101 -0
  519. data/vendor/assets/components/numeral/tests/languages/de.js +101 -0
  520. data/vendor/assets/components/numeral/tests/languages/en-gb.js +101 -0
  521. data/vendor/assets/components/numeral/tests/languages/en.js +98 -0
  522. data/vendor/assets/components/numeral/tests/languages/es-ES.js +101 -0
  523. data/vendor/assets/components/numeral/tests/languages/es.js +101 -0
  524. data/vendor/assets/components/numeral/tests/languages/et.js +101 -0
  525. data/vendor/assets/components/numeral/tests/languages/fi.js +101 -0
  526. data/vendor/assets/components/numeral/tests/languages/fr-CA.js +101 -0
  527. data/vendor/assets/components/numeral/tests/languages/fr-ch.js +101 -0
  528. data/vendor/assets/components/numeral/tests/languages/fr.js +101 -0
  529. data/vendor/assets/components/numeral/tests/languages/hu.js +101 -0
  530. data/vendor/assets/components/numeral/tests/languages/it.js +101 -0
  531. data/vendor/assets/components/numeral/tests/languages/ja.js +101 -0
  532. data/vendor/assets/components/numeral/tests/languages/nl-nl.js +109 -0
  533. data/vendor/assets/components/numeral/tests/languages/pl.js +102 -0
  534. data/vendor/assets/components/numeral/tests/languages/pt-br.js +101 -0
  535. data/vendor/assets/components/numeral/tests/languages/pt-pt.js +101 -0
  536. data/vendor/assets/components/numeral/tests/languages/ru-UA.js +102 -0
  537. data/vendor/assets/components/numeral/tests/languages/ru.js +102 -0
  538. data/vendor/assets/components/numeral/tests/languages/sk.js +101 -0
  539. data/vendor/assets/components/numeral/tests/languages/th.js +101 -0
  540. data/vendor/assets/components/numeral/tests/languages/tr.js +101 -0
  541. data/vendor/assets/components/numeral/tests/languages/uk-UA.js +102 -0
  542. data/vendor/assets/components/numeral/tests/numeral/format.js +204 -0
  543. data/vendor/assets/components/numeral/tests/numeral/manipulate.js +104 -0
  544. data/vendor/assets/components/numeral/tests/numeral/misc.js +123 -0
  545. data/vendor/assets/components/numeral/tests/numeral/unformat.js +96 -0
  546. data/vendor/assets/components/qunit-bdd/.bower.json +31 -0
  547. data/vendor/assets/components/qunit-bdd/LICENSE +13 -0
  548. data/vendor/assets/components/qunit-bdd/README.md +282 -0
  549. data/vendor/assets/components/qunit-bdd/bower.json +22 -0
  550. data/vendor/assets/components/qunit-bdd/karma.conf.js +70 -0
  551. data/vendor/assets/components/qunit-bdd/lib/qunit-bdd.js +755 -0
  552. data/vendor/assets/components/qunit-bdd/package.json +33 -0
  553. data/vendor/assets/javascripts/bs-breadcrumbs.js +85 -0
  554. data/vendor/assets/javascripts/bs-core.js +476 -0
  555. data/vendor/assets/javascripts/bs-notifications.js +111 -0
  556. data/vendor/assets/javascripts/daterangepicker.js +1030 -0
  557. data/vendor/assets/javascripts/fix_bind_phantomjs.js +37 -0
  558. data/vendor/assets/javascripts/jquery-deparam.js +97 -0
  559. data/vendor/assets/javascripts/sidebar-tree.js +68 -0
  560. data/vendor/assets/stylesheets/daterangepicker.css +271 -0
  561. metadata +766 -0
@@ -0,0 +1,111 @@
1
+ /*
2
+ A view that displays notification (messages).
3
+
4
+ Currently a single notification is displayed as an Alert on top of the screen, each notification in a time.
5
+ */
6
+
7
+
8
+ (function() {
9
+ Bootstrap.NotificationsView = Ember.CollectionView.extend({
10
+ classNames: ['notifications'],
11
+ attributeBindings: ['style'],
12
+ contentBinding: 'Bootstrap.NM.content',
13
+ showTime: 2000,
14
+ fadeInTime: 500,
15
+ fadeOutTime: 3000,
16
+ showTimeTimeoutId: null,
17
+ /*
18
+ itemViewClass: Bootstrap.BsAlertComponent.extend(
19
+ messageBinding: 'content.message'
20
+ typeBinding: 'content.type'
21
+ fadeInTimeBinding: 'parentView.fadeInTime'
22
+ isVisible: false
23
+
24
+ didInsertElement: ->
25
+ @$().fadeIn(@get('fadeInTime'))
26
+ )
27
+ */
28
+
29
+ itemViewClass: Ember.View.extend({
30
+ classNames: ['alert', 'notification'],
31
+ template: Ember.Handlebars.compile('{{view.content.message}}'),
32
+ classNameBindings: ["alertType"],
33
+ isVisible: false,
34
+ alertType: (function() {
35
+ return this.get('content').get('classType');
36
+ }).property('content'),
37
+ didInsertElement: function() {
38
+ return this.$().fadeIn(this.get('fadeInTime'));
39
+ }
40
+ }),
41
+ contentChanged: (function() {
42
+ if (this.get('content').length > 0) {
43
+ //return this.resetShowTime();
44
+ }
45
+ }).observes('content.length'),
46
+ resetShowTime: function() {
47
+ var _this = this;
48
+ this.$().css({
49
+ display: 'block'
50
+ });
51
+ if (this.$().is(":animated")) {
52
+ this.$().stop().animate({
53
+ opacity: "100"
54
+ });
55
+ }
56
+ if (this.showTimeTimeoutId != null) {
57
+ clearTimeout(this.showTimeTimeoutId);
58
+ }
59
+ return this.showTimeTimeoutId = setTimeout(function() {
60
+ return _this.fadeOut(_this);
61
+ }, this.showTime);
62
+ },
63
+ fadeOut: function(that) {
64
+ return that.$().fadeOut(that.fadeOutTime, function() {
65
+ return that.get('content').clear();
66
+ });
67
+ },
68
+ mouseEnter: function() {
69
+ if (this.$().is(":animated")) {
70
+ return this.$().stop().animate({
71
+ opacity: "100"
72
+ });
73
+ }
74
+ },
75
+ mouseLeave: function() {
76
+ return this.resetShowTime();
77
+ }
78
+ });
79
+
80
+ Ember.Handlebars.helper('bs-notifications', Bootstrap.NotificationsView);
81
+
82
+ Bootstrap.NM = Bootstrap.NotificationManager = Ember.Object.create({
83
+ content: Ember.A(),
84
+ push: function(message, type) {
85
+ var notif;
86
+ type = type != null ? type : type = 'info';
87
+ notif = Bootstrap.Notification.create({
88
+ message: message,
89
+ type: type
90
+ });
91
+ return this.get('content').pushObject(notif);
92
+ }
93
+ });
94
+
95
+ /*
96
+ This object represents a notification to be displayed.
97
+ Notification(s) are added into the NotificationQueue by the pushNotification function.
98
+ */
99
+
100
+
101
+ Bootstrap.Notification = Ember.Object.extend({
102
+ classType: (function() {
103
+ if (this.type != null) {
104
+ return "alert-" + this.type;
105
+ } else {
106
+ return null;
107
+ }
108
+ }).property('type').cacheable()
109
+ });
110
+
111
+ }).call(this);
@@ -0,0 +1,1030 @@
1
+ /**
2
+ * @version: 1.3.7
3
+ * @author: Dan Grossman http://www.dangrossman.info/
4
+ * @date: 2014-04-29
5
+ * @copyright: Copyright (c) 2012-2014 Dan Grossman. All rights reserved.
6
+ * @license: Licensed under Apache License v2.0. See http://www.apache.org/licenses/LICENSE-2.0
7
+ * @website: http://www.improvely.com/
8
+ */
9
+ !function ($, moment) {
10
+
11
+ var DateRangePicker = function (element, options, cb) {
12
+
13
+ // by default, the daterangepicker element is placed at the bottom of HTML body
14
+ this.parentEl = 'body';
15
+
16
+ //element that triggered the date range picker
17
+ this.element = $(element);
18
+
19
+ //create the picker HTML object
20
+ var DRPTemplate = '<div class="daterangepicker dropdown-menu">' +
21
+ '<div class="calendar left"></div>' +
22
+ '<div class="calendar right"></div>' +
23
+ '<div class="ranges">' +
24
+ '<div class="range_inputs">' +
25
+ '<div class="daterangepicker_start_input">' +
26
+ '<label for="daterangepicker_start"></label>' +
27
+ '<input class="input-mini" type="text" name="daterangepicker_start" value="" readonly="readonly" />' +
28
+ '</div>' +
29
+ '<div class="daterangepicker_end_input">' +
30
+ '<label for="daterangepicker_end"></label>' +
31
+ '<input class="input-mini" type="text" name="daterangepicker_end" value="" readonly="readonly" />' +
32
+ '</div>' +
33
+ '<button class="applyBtn" disabled="disabled"></button>&nbsp;' +
34
+ '<button class="cancelBtn"></button>' +
35
+ '</div>' +
36
+ '</div>' +
37
+ '</div>';
38
+
39
+ //custom options
40
+ if (typeof options !== 'object' || options === null)
41
+ options = {};
42
+
43
+ this.parentEl = (typeof options === 'object' && options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl);
44
+ this.container = $(DRPTemplate).appendTo(this.parentEl);
45
+
46
+ this.setOptions(options, cb);
47
+
48
+ //apply CSS classes and labels to buttons
49
+ var c = this.container;
50
+ $.each(this.buttonClasses, function (idx, val) {
51
+ c.find('button').addClass(val);
52
+ });
53
+ this.container.find('.daterangepicker_start_input label').html(this.locale.fromLabel);
54
+ this.container.find('.daterangepicker_end_input label').html(this.locale.toLabel);
55
+ if (this.applyClass.length)
56
+ this.container.find('.applyBtn').addClass(this.applyClass);
57
+ if (this.cancelClass.length)
58
+ this.container.find('.cancelBtn').addClass(this.cancelClass);
59
+ this.container.find('.applyBtn').html(this.locale.applyLabel);
60
+ this.container.find('.cancelBtn').html(this.locale.cancelLabel);
61
+
62
+ //event listeners
63
+
64
+ this.container.find('.calendar')
65
+ .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this))
66
+ .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this))
67
+ .on('click.daterangepicker', 'td.available', $.proxy(this.clickDate, this))
68
+ .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.enterDate, this))
69
+ .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this))
70
+ .on('change.daterangepicker', 'select.yearselect', $.proxy(this.updateMonthYear, this))
71
+ .on('change.daterangepicker', 'select.monthselect', $.proxy(this.updateMonthYear, this))
72
+ .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.ampmselect', $.proxy(this.updateTime, this));
73
+
74
+ this.container.find('.ranges')
75
+ .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this))
76
+ .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this))
77
+ .on('click.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.showCalendars, this))
78
+ .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this))
79
+ .on('mouseenter.daterangepicker', 'li', $.proxy(this.enterRange, this))
80
+ .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this));
81
+
82
+ if (this.element.is('input')) {
83
+ this.element.on({
84
+ 'click.daterangepicker': $.proxy(this.show, this),
85
+ 'focus.daterangepicker': $.proxy(this.show, this),
86
+ 'keyup.daterangepicker': $.proxy(this.updateFromControl, this)
87
+ });
88
+ } else {
89
+ this.element.on('click.daterangepicker', $.proxy(this.toggle, this));
90
+ }
91
+
92
+ };
93
+
94
+ DateRangePicker.prototype = {
95
+
96
+ constructor: DateRangePicker,
97
+
98
+ setOptions: function(options, callback) {
99
+
100
+ this.startDate = moment().startOf('day');
101
+ this.endDate = moment().endOf('day');
102
+ this.minDate = false;
103
+ this.maxDate = false;
104
+ this.dateLimit = false;
105
+
106
+ this.showDropdowns = false;
107
+ this.showWeekNumbers = false;
108
+ this.timePicker = false;
109
+ this.timePickerIncrement = 30;
110
+ this.timePicker12Hour = true;
111
+ this.singleDatePicker = false;
112
+ this.ranges = {};
113
+
114
+ this.opens = 'right';
115
+ if (this.element.hasClass('pull-right'))
116
+ this.opens = 'left';
117
+
118
+ this.buttonClasses = ['btn', 'btn-small btn-sm'];
119
+ this.applyClass = 'btn-success';
120
+ this.cancelClass = 'btn-default';
121
+
122
+ this.format = 'MM/DD/YYYY';
123
+ this.separator = ' - ';
124
+
125
+ this.locale = {
126
+ applyLabel: 'Apply',
127
+ cancelLabel: 'Cancel',
128
+ fromLabel: 'From',
129
+ toLabel: 'To',
130
+ weekLabel: 'W',
131
+ customRangeLabel: 'Custom Range',
132
+ daysOfWeek: moment()._lang._weekdaysMin.slice(),
133
+ monthNames: moment()._lang._monthsShort.slice(),
134
+ firstDay: 0
135
+ };
136
+
137
+ this.cb = function () { };
138
+
139
+ if (typeof options.format === 'string')
140
+ this.format = options.format;
141
+
142
+ if (typeof options.separator === 'string')
143
+ this.separator = options.separator;
144
+
145
+ if (typeof options.startDate === 'string')
146
+ this.startDate = moment(options.startDate, this.format);
147
+
148
+ if (typeof options.endDate === 'string')
149
+ this.endDate = moment(options.endDate, this.format);
150
+
151
+ if (typeof options.minDate === 'string')
152
+ this.minDate = moment(options.minDate, this.format);
153
+
154
+ if (typeof options.maxDate === 'string')
155
+ this.maxDate = moment(options.maxDate, this.format);
156
+
157
+ if (typeof options.startDate === 'object')
158
+ this.startDate = moment(options.startDate);
159
+
160
+ if (typeof options.endDate === 'object')
161
+ this.endDate = moment(options.endDate);
162
+
163
+ if (typeof options.minDate === 'object')
164
+ this.minDate = moment(options.minDate);
165
+
166
+ if (typeof options.maxDate === 'object')
167
+ this.maxDate = moment(options.maxDate);
168
+
169
+ if (typeof options.applyClass === 'string')
170
+ this.applyClass = options.applyClass;
171
+
172
+ if (typeof options.cancelClass === 'string')
173
+ this.cancelClass = options.cancelClass;
174
+
175
+ if (typeof options.dateLimit === 'object')
176
+ this.dateLimit = options.dateLimit;
177
+
178
+ // update day names order to firstDay
179
+ if (typeof options.locale === 'object') {
180
+
181
+ if (typeof options.locale.daysOfWeek === 'object') {
182
+ // Create a copy of daysOfWeek to avoid modification of original
183
+ // options object for reusability in multiple daterangepicker instances
184
+ this.locale.daysOfWeek = options.locale.daysOfWeek.slice();
185
+ }
186
+
187
+ if (typeof options.locale.monthNames === 'object') {
188
+ this.locale.monthNames = options.locale.monthNames.slice();
189
+ }
190
+
191
+ if (typeof options.locale.firstDay === 'number') {
192
+ this.locale.firstDay = options.locale.firstDay;
193
+ var iterator = options.locale.firstDay;
194
+ while (iterator > 0) {
195
+ this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift());
196
+ iterator--;
197
+ }
198
+ }
199
+
200
+ if (typeof options.locale.applyLabel === 'string') {
201
+ this.locale.applyLabel = options.locale.applyLabel;
202
+ }
203
+
204
+ if (typeof options.locale.cancelLabel === 'string') {
205
+ this.locale.cancelLabel = options.locale.cancelLabel;
206
+ }
207
+
208
+ if (typeof options.locale.fromLabel === 'string') {
209
+ this.locale.fromLabel = options.locale.fromLabel;
210
+ }
211
+
212
+ if (typeof options.locale.toLabel === 'string') {
213
+ this.locale.toLabel = options.locale.toLabel;
214
+ }
215
+
216
+ if (typeof options.locale.weekLabel === 'string') {
217
+ this.locale.weekLabel = options.locale.weekLabel;
218
+ }
219
+
220
+ if (typeof options.locale.customRangeLabel === 'string') {
221
+ this.locale.customRangeLabel = options.locale.customRangeLabel;
222
+ }
223
+ }
224
+
225
+ if (typeof options.opens === 'string')
226
+ this.opens = options.opens;
227
+
228
+ if (typeof options.showWeekNumbers === 'boolean') {
229
+ this.showWeekNumbers = options.showWeekNumbers;
230
+ }
231
+
232
+ if (typeof options.buttonClasses === 'string') {
233
+ this.buttonClasses = [options.buttonClasses];
234
+ }
235
+
236
+ if (typeof options.buttonClasses === 'object') {
237
+ this.buttonClasses = options.buttonClasses;
238
+ }
239
+
240
+ if (typeof options.showDropdowns === 'boolean') {
241
+ this.showDropdowns = options.showDropdowns;
242
+ }
243
+
244
+ if (typeof options.singleDatePicker === 'boolean') {
245
+ this.singleDatePicker = options.singleDatePicker;
246
+ }
247
+
248
+ if (typeof options.timePicker === 'boolean') {
249
+ this.timePicker = options.timePicker;
250
+ }
251
+
252
+ if (typeof options.timePickerIncrement === 'number') {
253
+ this.timePickerIncrement = options.timePickerIncrement;
254
+ }
255
+
256
+ if (typeof options.timePicker12Hour === 'boolean') {
257
+ this.timePicker12Hour = options.timePicker12Hour;
258
+ }
259
+
260
+ var start, end, range;
261
+
262
+ //if no start/end dates set, check if an input element contains initial values
263
+ if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') {
264
+ if ($(this.element).is('input[type=text]')) {
265
+ var val = $(this.element).val();
266
+ var split = val.split(this.separator);
267
+ start = end = null;
268
+ if (split.length == 2) {
269
+ start = moment(split[0], this.format);
270
+ end = moment(split[1], this.format);
271
+ } else if (this.singleDatePicker) {
272
+ start = moment(val, this.format);
273
+ end = moment(val, this.format);
274
+ }
275
+ if (start !== null && end !== null) {
276
+ this.startDate = start;
277
+ this.endDate = end;
278
+ }
279
+ }
280
+ }
281
+
282
+ if (typeof options.ranges === 'object') {
283
+ for (range in options.ranges) {
284
+
285
+ start = moment(options.ranges[range][0]);
286
+ end = moment(options.ranges[range][1]);
287
+
288
+ // If we have a min/max date set, bound this range
289
+ // to it, but only if it would otherwise fall
290
+ // outside of the min/max.
291
+ if (this.minDate && start.isBefore(this.minDate))
292
+ start = moment(this.minDate);
293
+
294
+ if (this.maxDate && end.isAfter(this.maxDate))
295
+ end = moment(this.maxDate);
296
+
297
+ // If the end of the range is before the minimum (if min is set) OR
298
+ // the start of the range is after the max (also if set) don't display this
299
+ // range option.
300
+ if ((this.minDate && end.isBefore(this.minDate)) || (this.maxDate && start.isAfter(this.maxDate))) {
301
+ continue;
302
+ }
303
+
304
+ this.ranges[range] = [start, end];
305
+ }
306
+
307
+ var list = '<ul>';
308
+ for (range in this.ranges) {
309
+ list += '<li>' + range + '</li>';
310
+ }
311
+ list += '<li>' + this.locale.customRangeLabel + '</li>';
312
+ list += '</ul>';
313
+ this.container.find('.ranges ul').remove();
314
+ this.container.find('.ranges').prepend(list);
315
+ }
316
+
317
+ if (typeof callback === 'function') {
318
+ this.cb = callback;
319
+ }
320
+
321
+ if (!this.timePicker) {
322
+ this.startDate = this.startDate.startOf('day');
323
+ this.endDate = this.endDate.endOf('day');
324
+ }
325
+
326
+ if (this.singleDatePicker) {
327
+ this.opens = 'right';
328
+ this.container.find('.calendar.right').show();
329
+ this.container.find('.calendar.left').hide();
330
+ this.container.find('.ranges').hide();
331
+ if (!this.container.find('.calendar.right').hasClass('single'))
332
+ this.container.find('.calendar.right').addClass('single');
333
+ } else {
334
+ this.container.find('.calendar.right').removeClass('single');
335
+ this.container.find('.ranges').show();
336
+ }
337
+
338
+ this.oldStartDate = this.startDate.clone();
339
+ this.oldEndDate = this.endDate.clone();
340
+ this.oldChosenLabel = this.chosenLabel;
341
+
342
+ this.leftCalendar = {
343
+ month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute()]),
344
+ calendar: []
345
+ };
346
+
347
+ this.rightCalendar = {
348
+ month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute()]),
349
+ calendar: []
350
+ };
351
+
352
+ if (this.opens == 'right') {
353
+ //swap calendar positions
354
+ var left = this.container.find('.calendar.left');
355
+ var right = this.container.find('.calendar.right');
356
+ left.removeClass('left').addClass('right');
357
+ right.removeClass('right').addClass('left');
358
+ }
359
+
360
+ if (typeof options.ranges === 'undefined' && !this.singleDatePicker) {
361
+ this.container.addClass('show-calendar');
362
+ }
363
+
364
+ this.container.addClass('opens' + this.opens);
365
+
366
+ this.updateView();
367
+ this.updateCalendars();
368
+
369
+ },
370
+
371
+ setStartDate: function(startDate) {
372
+ if (typeof startDate === 'string')
373
+ this.startDate = moment(startDate, this.format);
374
+
375
+ if (typeof startDate === 'object')
376
+ this.startDate = moment(startDate);
377
+
378
+ if (!this.timePicker)
379
+ this.startDate = this.startDate.startOf('day');
380
+
381
+ this.oldStartDate = this.startDate.clone();
382
+
383
+ this.updateView();
384
+ this.updateCalendars();
385
+ this.updateInputText();
386
+ },
387
+
388
+ setEndDate: function(endDate) {
389
+ if (typeof endDate === 'string')
390
+ this.endDate = moment(endDate, this.format);
391
+
392
+ if (typeof endDate === 'object')
393
+ this.endDate = moment(endDate);
394
+
395
+ if (!this.timePicker)
396
+ this.endDate = this.endDate.endOf('day');
397
+
398
+ this.oldEndDate = this.endDate.clone();
399
+
400
+ this.updateView();
401
+ this.updateCalendars();
402
+ this.updateInputText();
403
+ },
404
+
405
+ updateView: function () {
406
+ this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute());
407
+ this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute());
408
+ this.updateFormInputs();
409
+ },
410
+
411
+ updateFormInputs: function () {
412
+ this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format));
413
+ this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format));
414
+
415
+ if (this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate)) {
416
+ this.container.find('button.applyBtn').removeAttr('disabled');
417
+ } else {
418
+ this.container.find('button.applyBtn').attr('disabled', 'disabled');
419
+ }
420
+ },
421
+
422
+ updateFromControl: function () {
423
+ if (!this.element.is('input')) return;
424
+ if (!this.element.val().length) return;
425
+
426
+ var dateString = this.element.val().split(this.separator),
427
+ start = null,
428
+ end = null;
429
+
430
+ if(dateString.length === 2) {
431
+ start = moment(dateString[0], this.format);
432
+ end = moment(dateString[1], this.format);
433
+ }
434
+
435
+ if (this.singleDatePicker || start === null || end === null) {
436
+ start = moment(this.element.val(), this.format);
437
+ end = start;
438
+ }
439
+
440
+ if (end.isBefore(start)) return;
441
+
442
+ this.oldStartDate = this.startDate.clone();
443
+ this.oldEndDate = this.endDate.clone();
444
+
445
+ this.startDate = start;
446
+ this.endDate = end;
447
+
448
+ if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate))
449
+ this.notify();
450
+
451
+ this.updateCalendars();
452
+ },
453
+
454
+ notify: function () {
455
+ this.updateView();
456
+ this.cb(this.startDate, this.endDate, this.chosenLabel);
457
+ },
458
+
459
+ move: function () {
460
+ var parentOffset = { top: 0, left: 0 };
461
+ if (!this.parentEl.is('body')) {
462
+ parentOffset = {
463
+ top: this.parentEl.offset().top - this.parentEl.scrollTop(),
464
+ left: this.parentEl.offset().left - this.parentEl.scrollLeft()
465
+ };
466
+ }
467
+
468
+ if (this.opens == 'left') {
469
+ this.container.css({
470
+ top: this.element.offset().top + this.element.outerHeight() - parentOffset.top,
471
+ right: $(window).width() - this.element.offset().left - this.element.outerWidth() - parentOffset.left,
472
+ left: 'auto'
473
+ });
474
+ if (this.container.offset().left < 0) {
475
+ this.container.css({
476
+ right: 'auto',
477
+ left: 9
478
+ });
479
+ }
480
+ } else {
481
+ this.container.css({
482
+ top: this.element.offset().top + this.element.outerHeight() - parentOffset.top,
483
+ left: this.element.offset().left - parentOffset.left,
484
+ right: 'auto'
485
+ });
486
+ if (this.container.offset().left + this.container.outerWidth() > $(window).width()) {
487
+ this.container.css({
488
+ left: 'auto',
489
+ right: 0
490
+ });
491
+ }
492
+ }
493
+ },
494
+
495
+ toggle: function (e) {
496
+ if (this.element.hasClass('active')) {
497
+ this.hide();
498
+ } else {
499
+ this.show();
500
+ }
501
+ },
502
+
503
+ show: function (e) {
504
+ this.element.addClass('active');
505
+ this.container.show();
506
+ this.move();
507
+
508
+ // Create a click proxy that is private to this instance of datepicker, for unbinding
509
+ this._outsideClickProxy = $.proxy(function (e) { this.outsideClick(e); }, this);
510
+ // Bind global datepicker mousedown for hiding and
511
+ $(document)
512
+ .on('mousedown.daterangepicker', this._outsideClickProxy)
513
+ // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them
514
+ .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy)
515
+ // and also close when focus changes to outside the picker (eg. tabbing between controls)
516
+ .on('focusin.daterangepicker', this._outsideClickProxy);
517
+
518
+ this.element.trigger('show.daterangepicker', this);
519
+ },
520
+
521
+ outsideClick: function (e) {
522
+ var target = $(e.target);
523
+ // if the page is clicked anywhere except within the daterangerpicker/button
524
+ // itself then call this.hide()
525
+ if (
526
+ target.closest(this.element).length ||
527
+ target.closest(this.container).length ||
528
+ target.closest('.calendar-date').length
529
+ ) return;
530
+ this.hide();
531
+ },
532
+
533
+ hide: function (e) {
534
+ $(document)
535
+ .off('mousedown.daterangepicker', this._outsideClickProxy)
536
+ .off('click.daterangepicker', this._outsideClickProxy)
537
+ .off('focusin.daterangepicker', this._outsideClickProxy);
538
+
539
+ this.element.removeClass('active');
540
+ this.container.hide();
541
+
542
+ if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate))
543
+ this.notify();
544
+
545
+ this.oldStartDate = this.startDate.clone();
546
+ this.oldEndDate = this.endDate.clone();
547
+
548
+ this.element.trigger('hide.daterangepicker', this);
549
+ },
550
+
551
+ enterRange: function (e) {
552
+ // mouse pointer has entered a range label
553
+ var label = e.target.innerHTML;
554
+ if (label == this.locale.customRangeLabel) {
555
+ this.updateView();
556
+ } else {
557
+ var dates = this.ranges[label];
558
+ this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format));
559
+ this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format));
560
+ }
561
+ },
562
+
563
+ showCalendars: function() {
564
+ this.container.addClass('show-calendar');
565
+ this.move();
566
+ this.element.trigger('showCalendar.daterangepicker', this);
567
+ },
568
+
569
+ hideCalendars: function() {
570
+ this.container.removeClass('show-calendar');
571
+ this.element.trigger('hideCalendar.daterangepicker', this);
572
+ },
573
+
574
+ updateInputText: function() {
575
+ if (this.element.is('input') && !this.singleDatePicker) {
576
+ this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format));
577
+ } else if (this.element.is('input')) {
578
+ this.element.val(this.startDate.format(this.format));
579
+ }
580
+ },
581
+
582
+ clickRange: function (e) {
583
+ var label = e.target.innerHTML;
584
+ this.chosenLabel = label;
585
+ if (label == this.locale.customRangeLabel) {
586
+ this.showCalendars();
587
+ } else {
588
+ var dates = this.ranges[label];
589
+
590
+ this.startDate = dates[0];
591
+ this.endDate = dates[1];
592
+
593
+ if (!this.timePicker) {
594
+ this.startDate.startOf('day');
595
+ this.endDate.endOf('day');
596
+ }
597
+
598
+ this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute());
599
+ this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute());
600
+ this.updateCalendars();
601
+
602
+ this.updateInputText();
603
+
604
+ this.hideCalendars();
605
+ this.hide();
606
+ this.element.trigger('apply.daterangepicker', this);
607
+ }
608
+ },
609
+
610
+ clickPrev: function (e) {
611
+ var cal = $(e.target).parents('.calendar');
612
+ if (cal.hasClass('left')) {
613
+ this.leftCalendar.month.subtract('month', 1);
614
+ } else {
615
+ this.rightCalendar.month.subtract('month', 1);
616
+ }
617
+ this.updateCalendars();
618
+ },
619
+
620
+ clickNext: function (e) {
621
+ var cal = $(e.target).parents('.calendar');
622
+ if (cal.hasClass('left')) {
623
+ this.leftCalendar.month.add('month', 1);
624
+ } else {
625
+ this.rightCalendar.month.add('month', 1);
626
+ }
627
+ this.updateCalendars();
628
+ },
629
+
630
+ enterDate: function (e) {
631
+
632
+ var title = $(e.target).attr('data-title');
633
+ var row = title.substr(1, 1);
634
+ var col = title.substr(3, 1);
635
+ var cal = $(e.target).parents('.calendar');
636
+
637
+ if (cal.hasClass('left')) {
638
+ this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format));
639
+ } else {
640
+ this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format));
641
+ }
642
+
643
+ },
644
+
645
+ clickDate: function (e) {
646
+ var title = $(e.target).attr('data-title');
647
+ var row = title.substr(1, 1);
648
+ var col = title.substr(3, 1);
649
+ var cal = $(e.target).parents('.calendar');
650
+
651
+ var startDate, endDate;
652
+ if (cal.hasClass('left')) {
653
+ startDate = this.leftCalendar.calendar[row][col];
654
+ endDate = this.endDate;
655
+ if (typeof this.dateLimit === 'object') {
656
+ var maxDate = moment(startDate).add(this.dateLimit).startOf('day');
657
+ if (endDate.isAfter(maxDate)) {
658
+ endDate = maxDate;
659
+ }
660
+ }
661
+ } else {
662
+ startDate = this.startDate;
663
+ endDate = this.rightCalendar.calendar[row][col];
664
+ if (typeof this.dateLimit === 'object') {
665
+ var minDate = moment(endDate).subtract(this.dateLimit).startOf('day');
666
+ if (startDate.isBefore(minDate)) {
667
+ startDate = minDate;
668
+ }
669
+ }
670
+ }
671
+
672
+ if (this.singleDatePicker && cal.hasClass('left')) {
673
+ endDate = startDate.clone();
674
+ } else if (this.singleDatePicker && cal.hasClass('right')) {
675
+ startDate = endDate.clone();
676
+ }
677
+
678
+ cal.find('td').removeClass('active');
679
+
680
+ if (startDate.isSame(endDate) || startDate.isBefore(endDate)) {
681
+ $(e.target).addClass('active');
682
+ this.startDate = startDate;
683
+ this.endDate = endDate;
684
+ this.chosenLabel = this.locale.customRangeLabel;
685
+ } else if (startDate.isAfter(endDate)) {
686
+ $(e.target).addClass('active');
687
+ var difference = this.endDate.diff(this.startDate);
688
+ this.startDate = startDate;
689
+ this.endDate = moment(startDate).add('ms', difference);
690
+ this.chosenLabel = this.locale.customRangeLabel;
691
+ }
692
+
693
+ this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year());
694
+ this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year());
695
+ this.updateCalendars();
696
+
697
+ if (!this.timePicker)
698
+ endDate.endOf('day');
699
+
700
+ if (this.singleDatePicker)
701
+ this.clickApply();
702
+ },
703
+
704
+ clickApply: function (e) {
705
+ this.updateInputText();
706
+ this.hide();
707
+ this.element.trigger('apply.daterangepicker', this);
708
+ },
709
+
710
+ clickCancel: function (e) {
711
+ this.startDate = this.oldStartDate;
712
+ this.endDate = this.oldEndDate;
713
+ this.chosenLabel = this.oldChosenLabel;
714
+ this.updateView();
715
+ this.updateCalendars();
716
+ this.hide();
717
+ this.element.trigger('cancel.daterangepicker', this);
718
+ },
719
+
720
+ updateMonthYear: function (e) {
721
+ var isLeft = $(e.target).closest('.calendar').hasClass('left'),
722
+ leftOrRight = isLeft ? 'left' : 'right',
723
+ cal = this.container.find('.calendar.'+leftOrRight);
724
+
725
+ // Month must be Number for new moment versions
726
+ var month = parseInt(cal.find('.monthselect').val(), 10);
727
+ var year = cal.find('.yearselect').val();
728
+
729
+ this[leftOrRight+'Calendar'].month.month(month).year(year);
730
+ this.updateCalendars();
731
+ },
732
+
733
+ updateTime: function(e) {
734
+
735
+ var cal = $(e.target).closest('.calendar'),
736
+ isLeft = cal.hasClass('left');
737
+
738
+ var hour = parseInt(cal.find('.hourselect').val(), 10);
739
+ var minute = parseInt(cal.find('.minuteselect').val(), 10);
740
+
741
+ if (this.timePicker12Hour) {
742
+ var ampm = cal.find('.ampmselect').val();
743
+ if (ampm === 'PM' && hour < 12)
744
+ hour += 12;
745
+ if (ampm === 'AM' && hour === 12)
746
+ hour = 0;
747
+ }
748
+
749
+ if (isLeft) {
750
+ var start = this.startDate.clone();
751
+ start.hour(hour);
752
+ start.minute(minute);
753
+ this.startDate = start;
754
+ this.leftCalendar.month.hour(hour).minute(minute);
755
+ } else {
756
+ var end = this.endDate.clone();
757
+ end.hour(hour);
758
+ end.minute(minute);
759
+ this.endDate = end;
760
+ this.rightCalendar.month.hour(hour).minute(minute);
761
+ }
762
+
763
+ this.updateCalendars();
764
+ },
765
+
766
+ updateCalendars: function () {
767
+ this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), 'left');
768
+ this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), 'right');
769
+ this.container.find('.calendar.left').empty().html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate));
770
+ this.container.find('.calendar.right').empty().html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.startDate, this.maxDate));
771
+
772
+ this.container.find('.ranges li').removeClass('active');
773
+ var customRange = true;
774
+ var i = 0;
775
+ for (var range in this.ranges) {
776
+ if (this.timePicker) {
777
+ if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) {
778
+ customRange = false;
779
+ this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')')
780
+ .addClass('active').html();
781
+ }
782
+ } else {
783
+ //ignore times when comparing dates if time picker is not enabled
784
+ if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) {
785
+ customRange = false;
786
+ this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')')
787
+ .addClass('active').html();
788
+ }
789
+ }
790
+ i++;
791
+ }
792
+ if (customRange) {
793
+ this.chosenLabel = this.container.find('.ranges li:last')
794
+ .addClass('active').html();
795
+ }
796
+ },
797
+
798
+ buildCalendar: function (month, year, hour, minute, side) {
799
+ var firstDay = moment([year, month, 1]);
800
+ var lastMonth = moment(firstDay).subtract('month', 1).month();
801
+ var lastYear = moment(firstDay).subtract('month', 1).year();
802
+
803
+ var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth();
804
+
805
+ var dayOfWeek = firstDay.day();
806
+
807
+ var i;
808
+
809
+ //initialize a 6 rows x 7 columns array for the calendar
810
+ var calendar = [];
811
+ for (i = 0; i < 6; i++) {
812
+ calendar[i] = [];
813
+ }
814
+
815
+ //populate the calendar with date objects
816
+ var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1;
817
+ if (startDay > daysInLastMonth)
818
+ startDay -= 7;
819
+
820
+ if (dayOfWeek == this.locale.firstDay)
821
+ startDay = daysInLastMonth - 6;
822
+
823
+ var curDate = moment([lastYear, lastMonth, startDay, 12, minute]);
824
+ var col, row;
825
+ for (i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add('hour', 24)) {
826
+ if (i > 0 && col % 7 === 0) {
827
+ col = 0;
828
+ row++;
829
+ }
830
+ calendar[row][col] = curDate.clone().hour(hour);
831
+ curDate.hour(12);
832
+ }
833
+
834
+ return calendar;
835
+ },
836
+
837
+ renderDropdowns: function (selected, minDate, maxDate) {
838
+ var currentMonth = selected.month();
839
+ var monthHtml = '<select class="monthselect">';
840
+ var inMinYear = false;
841
+ var inMaxYear = false;
842
+
843
+ for (var m = 0; m < 12; m++) {
844
+ if ((!inMinYear || m >= minDate.month()) && (!inMaxYear || m <= maxDate.month())) {
845
+ monthHtml += "<option value='" + m + "'" +
846
+ (m === currentMonth ? " selected='selected'" : "") +
847
+ ">" + this.locale.monthNames[m] + "</option>";
848
+ }
849
+ }
850
+ monthHtml += "</select>";
851
+
852
+ var currentYear = selected.year();
853
+ var maxYear = (maxDate && maxDate.year()) || (currentYear + 5);
854
+ var minYear = (minDate && minDate.year()) || (currentYear - 50);
855
+ var yearHtml = '<select class="yearselect">';
856
+
857
+ for (var y = minYear; y <= maxYear; y++) {
858
+ yearHtml += '<option value="' + y + '"' +
859
+ (y === currentYear ? ' selected="selected"' : '') +
860
+ '>' + y + '</option>';
861
+ }
862
+
863
+ yearHtml += '</select>';
864
+
865
+ return monthHtml + yearHtml;
866
+ },
867
+
868
+ renderCalendar: function (calendar, selected, minDate, maxDate) {
869
+
870
+ var html = '<div class="calendar-date">';
871
+ html += '<table class="table-condensed">';
872
+ html += '<thead>';
873
+ html += '<tr>';
874
+
875
+ // add empty cell for week number
876
+ if (this.showWeekNumbers)
877
+ html += '<th></th>';
878
+
879
+ if (!minDate || minDate.isBefore(calendar[1][1])) {
880
+ html += '<th class="prev available"><i class="fa fa-arrow-left icon-arrow-left glyphicon glyphicon-arrow-left"></i></th>';
881
+ } else {
882
+ html += '<th></th>';
883
+ }
884
+
885
+ var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY");
886
+
887
+ if (this.showDropdowns) {
888
+ dateHtml = this.renderDropdowns(calendar[1][1], minDate, maxDate);
889
+ }
890
+
891
+ html += '<th colspan="5" class="month">' + dateHtml + '</th>';
892
+ if (!maxDate || maxDate.isAfter(calendar[1][1])) {
893
+ html += '<th class="next available"><i class="fa fa-arrow-right icon-arrow-right glyphicon glyphicon-arrow-right"></i></th>';
894
+ } else {
895
+ html += '<th></th>';
896
+ }
897
+
898
+ html += '</tr>';
899
+ html += '<tr>';
900
+
901
+ // add week number label
902
+ if (this.showWeekNumbers)
903
+ html += '<th class="week">' + this.locale.weekLabel + '</th>';
904
+
905
+ $.each(this.locale.daysOfWeek, function (index, dayOfWeek) {
906
+ html += '<th>' + dayOfWeek + '</th>';
907
+ });
908
+
909
+ html += '</tr>';
910
+ html += '</thead>';
911
+ html += '<tbody>';
912
+
913
+ for (var row = 0; row < 6; row++) {
914
+ html += '<tr>';
915
+
916
+ // add week number
917
+ if (this.showWeekNumbers)
918
+ html += '<td class="week">' + calendar[row][0].week() + '</td>';
919
+
920
+ for (var col = 0; col < 7; col++) {
921
+ var cname = 'available ';
922
+ cname += (calendar[row][col].month() == calendar[1][1].month()) ? '' : 'off';
923
+
924
+ if ((minDate && calendar[row][col].isBefore(minDate, 'day')) || (maxDate && calendar[row][col].isAfter(maxDate, 'day'))) {
925
+ cname = ' off disabled ';
926
+ } else if (calendar[row][col].format('YYYY-MM-DD') == selected.format('YYYY-MM-DD')) {
927
+ cname += ' active ';
928
+ if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) {
929
+ cname += ' start-date ';
930
+ }
931
+ if (calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) {
932
+ cname += ' end-date ';
933
+ }
934
+ } else if (calendar[row][col] >= this.startDate && calendar[row][col] <= this.endDate) {
935
+ cname += ' in-range ';
936
+ if (calendar[row][col].isSame(this.startDate)) { cname += ' start-date '; }
937
+ if (calendar[row][col].isSame(this.endDate)) { cname += ' end-date '; }
938
+ }
939
+
940
+ var title = 'r' + row + 'c' + col;
941
+ html += '<td class="' + cname.replace(/\s+/g, ' ').replace(/^\s?(.*?)\s?$/, '$1') + '" data-title="' + title + '">' + calendar[row][col].date() + '</td>';
942
+ }
943
+ html += '</tr>';
944
+ }
945
+
946
+ html += '</tbody>';
947
+ html += '</table>';
948
+ html += '</div>';
949
+
950
+ var i;
951
+ if (this.timePicker) {
952
+
953
+ html += '<div class="calendar-time">';
954
+ html += '<select class="hourselect">';
955
+ var start = 0;
956
+ var end = 23;
957
+ var selected_hour = selected.hour();
958
+ if (this.timePicker12Hour) {
959
+ start = 1;
960
+ end = 12;
961
+ if (selected_hour >= 12)
962
+ selected_hour -= 12;
963
+ if (selected_hour === 0)
964
+ selected_hour = 12;
965
+ }
966
+
967
+ for (i = start; i <= end; i++) {
968
+ if (i == selected_hour) {
969
+ html += '<option value="' + i + '" selected="selected">' + i + '</option>';
970
+ } else {
971
+ html += '<option value="' + i + '">' + i + '</option>';
972
+ }
973
+ }
974
+
975
+ html += '</select> : ';
976
+
977
+ html += '<select class="minuteselect">';
978
+
979
+ for (i = 0; i < 60; i += this.timePickerIncrement) {
980
+ var num = i;
981
+ if (num < 10)
982
+ num = '0' + num;
983
+ if (i == selected.minute()) {
984
+ html += '<option value="' + i + '" selected="selected">' + num + '</option>';
985
+ } else {
986
+ html += '<option value="' + i + '">' + num + '</option>';
987
+ }
988
+ }
989
+
990
+ html += '</select> ';
991
+
992
+ if (this.timePicker12Hour) {
993
+ html += '<select class="ampmselect">';
994
+ if (selected.hour() >= 12) {
995
+ html += '<option value="AM">AM</option><option value="PM" selected="selected">PM</option>';
996
+ } else {
997
+ html += '<option value="AM" selected="selected">AM</option><option value="PM">PM</option>';
998
+ }
999
+ html += '</select>';
1000
+ }
1001
+
1002
+ html += '</div>';
1003
+
1004
+ }
1005
+
1006
+ return html;
1007
+
1008
+ },
1009
+
1010
+ remove: function() {
1011
+
1012
+ this.container.remove();
1013
+ this.element.off('.daterangepicker');
1014
+ this.element.removeData('daterangepicker');
1015
+
1016
+ }
1017
+
1018
+ };
1019
+
1020
+ $.fn.daterangepicker = function (options, cb) {
1021
+ this.each(function () {
1022
+ var el = $(this);
1023
+ if (el.data('daterangepicker'))
1024
+ el.data('daterangepicker').remove();
1025
+ el.data('daterangepicker', new DateRangePicker(el, options, cb));
1026
+ });
1027
+ return this;
1028
+ };
1029
+
1030
+ }(window.jQuery, window.moment);