decidim-core 0.24.3 → 0.25.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim-core might be problematic. Click here for more details.

Files changed (764) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity_cell.rb +8 -0
  3. data/app/cells/decidim/announcement/show.erb +1 -1
  4. data/app/cells/decidim/author/comments.erb +2 -2
  5. data/app/cells/decidim/author/profile_inline.erb +3 -3
  6. data/app/cells/decidim/author_cell.rb +2 -1
  7. data/app/cells/decidim/coauthorships_cell.rb +2 -2
  8. data/app/cells/decidim/content_blocks/cta_cell.rb +1 -1
  9. data/app/cells/decidim/content_blocks/hero_cell.rb +1 -1
  10. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +1 -1
  11. data/app/cells/decidim/content_blocks/how_to_participate/show.erb +4 -4
  12. data/app/cells/decidim/content_blocks/stats/show.erb +8 -3
  13. data/app/cells/decidim/content_blocks/sub_hero/show.erb +1 -1
  14. data/app/cells/decidim/content_blocks/sub_hero_cell.rb +10 -0
  15. data/app/cells/decidim/{date → date_range}/show.erb +0 -0
  16. data/app/cells/decidim/{date_cell.rb → date_range_cell.rb} +1 -1
  17. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +0 -1
  18. data/app/cells/decidim/flag_modal/show.erb +11 -8
  19. data/app/cells/decidim/newsletter_templates/basic_only_text/show.erb +2 -2
  20. data/app/cells/decidim/newsletter_templates/image_text_cta/show.erb +2 -2
  21. data/app/cells/decidim/newsletter_templates/image_text_cta_cell.rb +2 -2
  22. data/app/cells/decidim/notifications/show.erb +0 -2
  23. data/app/cells/decidim/profile/invalid.erb +9 -0
  24. data/app/cells/decidim/profile_cell.rb +4 -5
  25. data/app/cells/decidim/public_participation/show.erb +4 -0
  26. data/app/cells/decidim/public_participation_cell.rb +12 -0
  27. data/app/cells/decidim/represent_user_group/show.erb +0 -1
  28. data/app/cells/decidim/statistic/homepage.erb +9 -0
  29. data/app/cells/decidim/statistic/show.erb +9 -0
  30. data/app/cells/decidim/statistic_cell.rb +22 -0
  31. data/app/cells/decidim/statistics/show.erb +19 -0
  32. data/app/cells/decidim/statistics_cell.rb +36 -0
  33. data/app/cells/decidim/user_activity/show.erb +0 -1
  34. data/app/cells/decidim/user_conversation/conversation_header.erb +2 -2
  35. data/app/cells/decidim/user_conversation/messages.erb +1 -1
  36. data/app/cells/decidim/user_conversation_cell.rb +11 -2
  37. data/app/cells/decidim/user_conversations/add_conversation_users.erb +0 -1
  38. data/app/cells/decidim/user_conversations/conversation_item.erb +1 -1
  39. data/app/cells/decidim/user_conversations/show.erb +0 -1
  40. data/app/cells/decidim/user_conversations_cell.rb +10 -2
  41. data/app/cells/decidim/user_profile/unlinked_user_data.erb +3 -3
  42. data/app/cells/decidim/user_profile/user_data.erb +3 -3
  43. data/app/cells/decidim/user_profile_cell.rb +2 -1
  44. data/app/cells/decidim/version_author/show.erb +4 -4
  45. data/app/cells/decidim/version_author_cell.rb +11 -0
  46. data/app/cells/decidim/versions_list_item/show.erb +1 -1
  47. data/app/commands/decidim/attachment_attributes_methods.rb +18 -0
  48. data/app/commands/decidim/attachment_methods.rb +2 -1
  49. data/app/commands/decidim/create_follow.rb +4 -1
  50. data/app/commands/decidim/create_omniauth_registration.rb +6 -1
  51. data/app/commands/decidim/destroy_account.rb +1 -1
  52. data/app/commands/decidim/gallery_methods.rb +2 -1
  53. data/app/commands/decidim/messaging/start_conversation.rb +2 -2
  54. data/app/commands/decidim/multiple_attachments_methods.rb +2 -1
  55. data/app/commands/decidim/update_account.rb +6 -2
  56. data/app/commands/decidim/update_user_group.rb +1 -2
  57. data/app/controllers/concerns/decidim/amendments_controller.rb +1 -0
  58. data/app/controllers/concerns/decidim/force_authentication.rb +0 -1
  59. data/app/controllers/concerns/decidim/impersonate_users.rb +12 -4
  60. data/app/controllers/concerns/decidim/needs_permission.rb +1 -0
  61. data/app/controllers/decidim/account_controller.rb +2 -2
  62. data/app/controllers/decidim/application_controller.rb +2 -0
  63. data/app/controllers/decidim/data_portability_controller.rb +2 -14
  64. data/app/controllers/decidim/doorkeeper/credentials_controller.rb +1 -1
  65. data/app/controllers/decidim/free_resource_authorization_modals_controller.rb +33 -0
  66. data/app/controllers/decidim/links_controller.rb +42 -0
  67. data/app/controllers/decidim/messaging/conversations_controller.rb +5 -2
  68. data/app/controllers/decidim/open_data_controller.rb +3 -9
  69. data/app/controllers/decidim/profiles_controller.rb +1 -7
  70. data/app/controllers/decidim/timeouts_controller.rb +10 -5
  71. data/app/controllers/decidim/user_activities_controller.rb +1 -0
  72. data/app/forms/decidim/account_form.rb +2 -1
  73. data/app/forms/decidim/messaging/conversation_form.rb +1 -1
  74. data/app/forms/decidim/notifications_settings_form.rb +3 -14
  75. data/app/forms/url_validator.rb +2 -0
  76. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +5 -2
  77. data/app/helpers/decidim/action_authorization_helper.rb +7 -2
  78. data/app/helpers/decidim/amendments_helper.rb +0 -10
  79. data/app/helpers/decidim/attachments_helper.rb +1 -1
  80. data/app/helpers/decidim/check_boxes_tree_helper.rb +28 -10
  81. data/app/helpers/decidim/decidim_form_helper.rb +0 -4
  82. data/app/helpers/decidim/external_domain_helper.rb +13 -0
  83. data/app/helpers/decidim/layout_helper.rb +30 -8
  84. data/app/helpers/decidim/map_helper.rb +4 -3
  85. data/app/helpers/decidim/menu_helper.rb +4 -2
  86. data/app/helpers/decidim/user_group_helper.rb +22 -0
  87. data/app/jobs/decidim/application_job.rb +5 -0
  88. data/app/jobs/decidim/data_portability_export_job.rb +1 -2
  89. data/app/jobs/decidim/export_job.rb +1 -1
  90. data/app/jobs/decidim/export_participatory_space_job.rb +1 -1
  91. data/app/jobs/decidim/machine_translation_fields_job.rb +1 -1
  92. data/app/jobs/decidim/machine_translation_resource_job.rb +10 -6
  93. data/app/jobs/decidim/machine_translation_save_job.rb +1 -1
  94. data/app/jobs/decidim/open_data_job.rb +2 -2
  95. data/app/mailers/decidim/application_mailer.rb +1 -1
  96. data/app/mailers/decidim/reported_mailer.rb +1 -1
  97. data/app/models/decidim/attachment.rb +18 -11
  98. data/app/models/decidim/authorization.rb +3 -5
  99. data/app/models/decidim/content_block.rb +30 -44
  100. data/app/models/decidim/content_block_attachment.rb +35 -0
  101. data/app/models/decidim/impersonation_log.rb +8 -0
  102. data/app/models/decidim/messaging/conversation.rb +2 -0
  103. data/app/models/decidim/messaging/message.rb +2 -0
  104. data/app/models/decidim/messaging/participation.rb +2 -0
  105. data/app/models/decidim/messaging/receipt.rb +2 -0
  106. data/app/models/decidim/oauth_application.rb +2 -2
  107. data/app/models/decidim/organization.rb +16 -20
  108. data/app/models/decidim/user.rb +16 -12
  109. data/app/models/decidim/user_base_entity.rb +2 -2
  110. data/app/models/decidim/user_group.rb +20 -1
  111. data/app/packs/entrypoints/decidim_conference_diploma.js +2 -0
  112. data/app/packs/entrypoints/decidim_conference_diploma.scss +1 -0
  113. data/app/packs/entrypoints/decidim_core.js +69 -0
  114. data/app/packs/entrypoints/decidim_core.scss +1 -0
  115. data/app/packs/entrypoints/decidim_email.js +1 -0
  116. data/app/packs/entrypoints/decidim_email.scss +1 -0
  117. data/app/packs/entrypoints/decidim_geocoding_provider_here.js +1 -0
  118. data/app/packs/entrypoints/decidim_geocoding_provider_photon.js +1 -0
  119. data/app/packs/entrypoints/decidim_map.js +1 -0
  120. data/app/packs/entrypoints/decidim_map.scss +1 -0
  121. data/app/packs/entrypoints/decidim_map_provider_default.js +2 -0
  122. data/app/packs/entrypoints/decidim_map_provider_here.js +2 -0
  123. data/app/packs/entrypoints/decidim_widget.js +1 -0
  124. data/app/{assets → packs}/fonts/decidim/Roboto-Regular.eot +0 -0
  125. data/app/{assets → packs}/fonts/decidim/Roboto-Regular.svg +0 -0
  126. data/app/{assets → packs}/fonts/decidim/Roboto-Regular.ttf +0 -0
  127. data/app/{assets → packs}/fonts/decidim/Roboto-Regular.woff +0 -0
  128. data/app/{assets → packs}/fonts/decidim/Roboto-Regular.woff2 +0 -0
  129. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_400.eot +0 -0
  130. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_400.svg +0 -0
  131. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_400.ttf +0 -0
  132. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_400.woff +0 -0
  133. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_400.woff2 +0 -0
  134. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_600.eot +0 -0
  135. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_600.svg +0 -0
  136. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_600.ttf +0 -0
  137. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_600.woff +0 -0
  138. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_600.woff2 +0 -0
  139. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_900.eot +0 -0
  140. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_900.svg +0 -0
  141. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_900.ttf +0 -0
  142. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_900.woff +0 -0
  143. data/app/{assets → packs}/fonts/decidim/Source_Sans_Pro_900.woff2 +0 -0
  144. data/app/{assets → packs}/images/decidim/avatar-multiuser.png +0 -0
  145. data/app/{assets → packs}/images/decidim/brands/google.svg +0 -0
  146. data/app/{assets → packs}/images/decidim/cc-badge.png +0 -0
  147. data/app/{assets → packs}/images/decidim/decidim-logo.svg +0 -0
  148. data/app/{assets → packs}/images/decidim/default-avatar.svg +0 -0
  149. data/app/{assets/images/decidim/gamification/badges/followers.svg → packs/images/decidim/gamification/badges/decidim_gamification_badges_followers.svg} +0 -0
  150. data/app/{assets/images/decidim/gamification/badges/invitations.svg → packs/images/decidim/gamification/badges/decidim_gamification_badges_invitations.svg} +0 -0
  151. data/app/{assets → packs}/images/decidim/icons.svg +0 -0
  152. data/app/{assets → packs}/images/decidim/pattern.png +0 -0
  153. data/app/{assets → packs}/images/decidim/placeholder.jpg +0 -0
  154. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  155. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  156. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  157. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  158. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  159. data/app/packs/images/decidim/vendor/social-share-button/delicious.svg +13 -0
  160. data/app/packs/images/decidim/vendor/social-share-button/douban.svg +8 -0
  161. data/app/packs/images/decidim/vendor/social-share-button/email.svg +8 -0
  162. data/app/packs/images/decidim/vendor/social-share-button/facebook.svg +8 -0
  163. data/app/packs/images/decidim/vendor/social-share-button/google_bookmark.svg +8 -0
  164. data/app/packs/images/decidim/vendor/social-share-button/google_plus.svg +10 -0
  165. data/app/packs/images/decidim/vendor/social-share-button/hacker_news.svg +69 -0
  166. data/app/packs/images/decidim/vendor/social-share-button/linkedin.svg +8 -0
  167. data/app/packs/images/decidim/vendor/social-share-button/odnoklassniki.svg +1 -0
  168. data/app/packs/images/decidim/vendor/social-share-button/pinterest.svg +8 -0
  169. data/app/packs/images/decidim/vendor/social-share-button/qq.svg +8 -0
  170. data/app/packs/images/decidim/vendor/social-share-button/reddit.svg +6 -0
  171. data/app/packs/images/decidim/vendor/social-share-button/telegram.svg +12 -0
  172. data/app/packs/images/decidim/vendor/social-share-button/tumblr.svg +8 -0
  173. data/app/packs/images/decidim/vendor/social-share-button/twitter.svg +8 -0
  174. data/app/packs/images/decidim/vendor/social-share-button/vkontakte.svg +23 -0
  175. data/app/packs/images/decidim/vendor/social-share-button/wechat.svg +8 -0
  176. data/app/packs/images/decidim/vendor/social-share-button/weibo.svg +10 -0
  177. data/app/packs/images/decidim/vendor/social-share-button/whatsapp.svg +10 -0
  178. data/app/packs/images/decidim/vendor/social-share-button/xing.svg +79 -0
  179. data/app/{assets/javascripts/decidim/account_form.js.es6 → packs/src/decidim/account_form.js} +0 -0
  180. data/app/{assets/javascripts/decidim/ajax_modals.js.es6 → packs/src/decidim/ajax_modals.js} +0 -0
  181. data/app/packs/src/decidim/append_elements.js +6 -0
  182. data/app/{assets/javascripts/decidim/append_redirect_url_to_modals.js.es6 → packs/src/decidim/append_redirect_url_to_modals.js} +0 -1
  183. data/app/packs/src/decidim/callout.js +16 -0
  184. data/app/packs/src/decidim/check_boxes_tree.js +185 -0
  185. data/app/packs/src/decidim/clipboard.js +119 -0
  186. data/app/packs/src/decidim/conferences.js +15 -0
  187. data/app/packs/src/decidim/configuration.js +17 -0
  188. data/app/packs/src/decidim/confirm.js +171 -0
  189. data/app/{assets/javascripts/decidim/conversations.js.es6 → packs/src/decidim/conversations.js} +2 -2
  190. data/app/packs/src/decidim/data_picker.js +272 -0
  191. data/app/packs/src/decidim/decidim_application.js +0 -0
  192. data/app/packs/src/decidim/delayed.js +23 -0
  193. data/app/{assets/javascripts/decidim/diff_mode_dropdown.js.es6 → packs/src/decidim/diff_mode_dropdown.js} +0 -0
  194. data/app/packs/src/decidim/dropdowns_menus.js +29 -0
  195. data/app/packs/src/decidim/editor.js +72 -0
  196. data/app/packs/src/decidim/editor/attribute_diff.js +28 -0
  197. data/app/packs/src/decidim/editor/history_override.js +110 -0
  198. data/app/packs/src/decidim/editor/linebreak_module.js +183 -0
  199. data/app/packs/src/decidim/editor/modified_backspace_offset1.js +96 -0
  200. data/app/packs/src/decidim/editor/modified_backspace_offset_any.js +46 -0
  201. data/app/packs/src/decidim/editor/modified_enter.js +116 -0
  202. data/app/packs/src/decidim/external_domain_warning.js +33 -0
  203. data/app/packs/src/decidim/external_link.js +56 -0
  204. data/app/{assets/javascripts/decidim/floating_help.js.es6 → packs/src/decidim/floating_help.js} +0 -0
  205. data/app/packs/src/decidim/form_datepicker.js +21 -0
  206. data/app/{assets/javascripts → packs/src}/decidim/form_filter.component.test.js +8 -9
  207. data/app/packs/src/decidim/form_filter.component_for_testing.js +7 -0
  208. data/app/packs/src/decidim/form_filter.js +319 -0
  209. data/app/packs/src/decidim/form_validator.js +56 -0
  210. data/app/packs/src/decidim/foundation_datepicker_locales.js +65 -0
  211. data/app/{assets/javascripts/decidim/gallery.js.es6 → packs/src/decidim/gallery.js} +0 -0
  212. data/app/packs/src/decidim/geocoding.js +54 -0
  213. data/app/packs/src/decidim/geocoding/attach_input.js +127 -0
  214. data/app/packs/src/decidim/geocoding/coordinate_input.js +21 -0
  215. data/app/packs/src/decidim/geocoding/format_address.js +27 -0
  216. data/app/packs/src/decidim/geocoding/provider/here.js +101 -0
  217. data/app/packs/src/decidim/geocoding/provider/photon.js +71 -0
  218. data/app/packs/src/decidim/history.js +44 -0
  219. data/app/packs/src/decidim/icon.js +51 -0
  220. data/app/{assets/javascripts/decidim/identity_selector_dialog.js.es6 → packs/src/decidim/identity_selector_dialog.js} +2 -3
  221. data/app/packs/src/decidim/impersonation.js +23 -0
  222. data/app/packs/src/decidim/index.js +69 -0
  223. data/app/packs/src/decidim/input_autojump.js +38 -0
  224. data/app/packs/src/decidim/input_character_counter.js +121 -0
  225. data/app/packs/src/decidim/input_emoji.js +33 -0
  226. data/app/{assets/javascripts/decidim/input_hashtags.js.es6 → packs/src/decidim/input_hashtags.js} +2 -1
  227. data/app/{assets/javascripts/decidim/input_mentions.js.es6 → packs/src/decidim/input_mentions.js} +10 -3
  228. data/app/{assets/javascripts/decidim/input_multiple_mentions.js.es6 → packs/src/decidim/input_multiple_mentions.js} +5 -3
  229. data/app/{assets/javascripts/decidim/input_tags.js.es6 → packs/src/decidim/input_tags.js} +1 -1
  230. data/app/packs/src/decidim/map.js +37 -0
  231. data/app/packs/src/decidim/map/controller.js +78 -0
  232. data/app/packs/src/decidim/map/controller/drag_marker.js +50 -0
  233. data/app/packs/src/decidim/map/controller/markers.js +75 -0
  234. data/app/packs/src/decidim/map/controller/static.js +44 -0
  235. data/app/packs/src/decidim/map/controller_registry.js +17 -0
  236. data/app/packs/src/decidim/map/factory.js +44 -0
  237. data/app/packs/src/decidim/map/icon.js +31 -0
  238. data/app/packs/src/decidim/map/integration/forms.js +29 -0
  239. data/app/packs/src/decidim/map/legacy.js +80 -0
  240. data/app/packs/src/decidim/map/provider/default.js +12 -0
  241. data/app/packs/src/decidim/map/provider/here.js +13 -0
  242. data/app/{assets/javascripts/decidim/notifications.js.es6 → packs/src/decidim/notifications.js} +0 -0
  243. data/app/{assets/javascripts/decidim/represent_user_group.js.es6 → packs/src/decidim/represent_user_group.js} +0 -0
  244. data/app/{assets/javascripts/decidim/responsive_horizontal_tabs.js.es6 → packs/src/decidim/responsive_horizontal_tabs.js} +0 -0
  245. data/app/packs/src/decidim/results_listing.js +41 -0
  246. data/app/packs/src/decidim/security/selfxss_warning.js +16 -0
  247. data/app/packs/src/decidim/session_timeouter.js +133 -0
  248. data/app/{assets/javascripts/decidim/slug_form.js.es6 → packs/src/decidim/slug_form.js} +0 -0
  249. data/app/{assets/javascripts → packs/src}/decidim/start_conversation_dialog.js +1 -1
  250. data/app/{assets/javascripts/decidim/tooltip_keep_on_hover.js.es6 → packs/src/decidim/tooltip_keep_on_hover.js} +0 -0
  251. data/app/{assets/javascripts/decidim/user_registrations.js.es6 → packs/src/decidim/user_registrations.js} +0 -0
  252. data/app/packs/src/decidim/vendor/foundation-datepicker.js +1431 -0
  253. data/app/packs/src/decidim/vendor/jquery-tmpl.js +488 -0
  254. data/{vendor/assets/javascripts → app/packs/src/decidim/vendor}/leaflet-tilelayer-here.js +1 -0
  255. data/{vendor/assets/javascripts → app/packs/src/decidim/vendor}/modernizr.js +3 -1
  256. data/{vendor/assets/javascripts → app/packs/src/decidim/vendor}/tribute.js +2 -0
  257. data/app/packs/src/decidim/vizzs.js +1 -0
  258. data/app/{assets/javascripts/decidim/vizzs/areachart.js.es6 → packs/src/decidim/vizzs/areachart.js} +4 -3
  259. data/app/{assets/javascripts/decidim/vizzs/linechart.js.es6 → packs/src/decidim/vizzs/linechart.js} +3 -3
  260. data/app/{assets/javascripts/decidim/vizzs/metrics.js.es6 → packs/src/decidim/vizzs/metrics.js} +3 -3
  261. data/app/packs/src/decidim/vizzs/renders.js +9 -0
  262. data/app/{assets/javascripts/decidim/vizzs/rowchart.js.es6 → packs/src/decidim/vizzs/rowchart.js} +3 -3
  263. data/app/{assets/javascripts/decidim/widget.js.es6 → packs/src/decidim/widget.js} +0 -0
  264. data/app/{assets → packs}/stylesheets/decidim/_decidim-settings.scss +2 -0
  265. data/app/packs/stylesheets/decidim/_decidim.scss +19 -0
  266. data/app/{assets/stylesheets/decidim/editor.scss → packs/stylesheets/decidim/_editor.scss} +3 -3
  267. data/app/{assets → packs}/stylesheets/decidim/_properties.scss +0 -0
  268. data/app/{assets → packs}/stylesheets/decidim/_variables.scss +2 -2
  269. data/app/packs/stylesheets/decidim/application.scss +9 -0
  270. data/app/{assets/stylesheets/decidim/conference-diploma.css.scss → packs/stylesheets/decidim/conference-diploma.scss} +8 -8
  271. data/app/packs/stylesheets/decidim/decidim_application.scss +7 -0
  272. data/app/{assets → packs}/stylesheets/decidim/email.scss +1 -1
  273. data/app/{assets → packs}/stylesheets/decidim/extras/_add_comments.scss +0 -0
  274. data/app/{assets → packs}/stylesheets/decidim/extras/_announcement.scss +0 -0
  275. data/app/{assets → packs}/stylesheets/decidim/extras/_collection-sort-controls.scss +0 -0
  276. data/app/{assets → packs}/stylesheets/decidim/extras/_embed.scss +0 -0
  277. data/app/{assets → packs}/stylesheets/decidim/extras/_external-links.scss +16 -0
  278. data/app/packs/stylesheets/decidim/extras/_extras.scss +16 -0
  279. data/app/{assets → packs}/stylesheets/decidim/extras/_impersonation-bar.scss +0 -0
  280. data/app/{assets → packs}/stylesheets/decidim/extras/_label-required.scss +0 -0
  281. data/app/{assets → packs}/stylesheets/decidim/extras/_leaflet.scss +0 -0
  282. data/app/{assets → packs}/stylesheets/decidim/extras/_meeting-registrations.scss +5 -0
  283. data/app/{assets → packs}/stylesheets/decidim/extras/_proposal_form.scss +0 -0
  284. data/app/{assets → packs}/stylesheets/decidim/extras/_quill.scss +0 -0
  285. data/app/{assets → packs}/stylesheets/decidim/extras/_reference.scss +0 -0
  286. data/app/{assets → packs}/stylesheets/decidim/extras/_results-per-page.scss +0 -0
  287. data/app/{assets → packs}/stylesheets/decidim/extras/_social_icons_mini.scss +0 -0
  288. data/app/{assets/stylesheets/decidim/extras/_social_share.css.scss → packs/stylesheets/decidim/extras/_social_share.scss} +6 -3
  289. data/app/{assets → packs}/stylesheets/decidim/extras/_status-labels.scss +0 -0
  290. data/app/{assets → packs}/stylesheets/decidim/layouts/_highlighted_banner.scss +0 -0
  291. data/app/{assets → packs}/stylesheets/decidim/layouts/_home.scss +35 -46
  292. data/app/packs/stylesheets/decidim/layouts/_layouts.scss +5 -0
  293. data/app/{assets → packs}/stylesheets/decidim/layouts/_logo.scss +0 -0
  294. data/app/{assets → packs}/stylesheets/decidim/layouts/_user.scss +0 -0
  295. data/app/{assets → packs}/stylesheets/decidim/layouts/_view.scss +0 -0
  296. data/app/packs/stylesheets/decidim/map.scss +3 -0
  297. data/app/{assets → packs}/stylesheets/decidim/modules/_address.scss +0 -0
  298. data/app/{assets → packs}/stylesheets/decidim/modules/_author-avatar.scss +1 -1
  299. data/app/{assets → packs}/stylesheets/decidim/modules/_badges.scss +0 -0
  300. data/app/{assets → packs}/stylesheets/decidim/modules/_block-banner.scss +0 -0
  301. data/app/{assets → packs}/stylesheets/decidim/modules/_buttons.scss +1 -1
  302. data/app/{assets → packs}/stylesheets/decidim/modules/_callout.scss +0 -0
  303. data/app/{assets → packs}/stylesheets/decidim/modules/_card-grid.scss +0 -0
  304. data/app/{assets → packs}/stylesheets/decidim/modules/_cards.scss +8 -8
  305. data/app/{assets → packs}/stylesheets/decidim/modules/_collapsible-list.scss +0 -0
  306. data/app/{assets → packs}/stylesheets/decidim/modules/_comments.scss +46 -12
  307. data/app/{assets → packs}/stylesheets/decidim/modules/_conference-diploma.scss +9 -9
  308. data/app/{assets → packs}/stylesheets/decidim/modules/_conference-media.scss +3 -1
  309. data/app/{assets → packs}/stylesheets/decidim/modules/_conference-nav.scss +0 -0
  310. data/app/{assets → packs}/stylesheets/decidim/modules/_conference-programme.scss +0 -0
  311. data/app/{assets → packs}/stylesheets/decidim/modules/_conference-registration.scss +0 -0
  312. data/app/{assets → packs}/stylesheets/decidim/modules/_conference-speaker.scss +0 -0
  313. data/app/{assets → packs}/stylesheets/decidim/modules/_confirm.scss +0 -0
  314. data/app/{assets → packs}/stylesheets/decidim/modules/_conversation.scss +6 -1
  315. data/app/{assets → packs}/stylesheets/decidim/modules/_cookie-bar.scss +0 -0
  316. data/app/{assets → packs}/stylesheets/decidim/modules/_data-picker.scss +0 -0
  317. data/app/{assets → packs}/stylesheets/decidim/modules/_datepicker.scss +0 -0
  318. data/app/{assets → packs}/stylesheets/decidim/modules/_definition-data.scss +0 -0
  319. data/app/{assets → packs}/stylesheets/decidim/modules/_docs-manager.scss +0 -0
  320. data/app/{assets → packs}/stylesheets/decidim/modules/_extra.scss +0 -0
  321. data/app/{assets → packs}/stylesheets/decidim/modules/_filter-tags.scss +0 -0
  322. data/app/{assets → packs}/stylesheets/decidim/modules/_filters.scss +1 -1
  323. data/app/{assets → packs}/stylesheets/decidim/modules/_fingerprint.scss +0 -0
  324. data/app/{assets → packs}/stylesheets/decidim/modules/_flag.scss +0 -0
  325. data/app/{assets → packs}/stylesheets/decidim/modules/_floating-helper.scss +2 -2
  326. data/app/{assets → packs}/stylesheets/decidim/modules/_footer.scss +0 -0
  327. data/app/{assets → packs}/stylesheets/decidim/modules/_forms.scss +18 -1
  328. data/app/{assets → packs}/stylesheets/decidim/modules/_help.scss +0 -0
  329. data/app/{assets → packs}/stylesheets/decidim/modules/_horizontal-tabs.scss +1 -1
  330. data/app/{assets → packs}/stylesheets/decidim/modules/_hover-section.scss +0 -0
  331. data/app/{assets → packs}/stylesheets/decidim/modules/_icons.scss +0 -0
  332. data/app/{assets → packs}/stylesheets/decidim/modules/_inline-filters.scss +1 -1
  333. data/app/{assets → packs}/stylesheets/decidim/modules/_input-gallery.scss +0 -0
  334. data/app/{assets → packs}/stylesheets/decidim/modules/_input-mentions.scss +1 -1
  335. data/app/{assets → packs}/stylesheets/decidim/modules/_input-multiple-mentions.scss +1 -1
  336. data/app/{assets → packs}/stylesheets/decidim/modules/_input-tags.scss +2 -2
  337. data/app/{assets → packs}/stylesheets/decidim/modules/_layout.scss +0 -0
  338. data/app/{assets → packs}/stylesheets/decidim/modules/_list-docs.scss +0 -0
  339. data/app/{assets → packs}/stylesheets/decidim/modules/_list-request.scss +1 -1
  340. data/app/{assets → packs}/stylesheets/decidim/modules/_loading-spinner.scss +0 -0
  341. data/app/{assets → packs}/stylesheets/decidim/modules/_main-container.scss +0 -0
  342. data/app/{assets → packs}/stylesheets/decidim/modules/_map.scss +1 -1
  343. data/app/{assets → packs}/stylesheets/decidim/modules/_margins.scss +0 -0
  344. data/app/{assets → packs}/stylesheets/decidim/modules/_messages.scss +0 -0
  345. data/app/packs/stylesheets/decidim/modules/_modules.scss +92 -0
  346. data/app/{assets → packs}/stylesheets/decidim/modules/_navbar.scss +3 -3
  347. data/app/{assets → packs}/stylesheets/decidim/modules/_notification.scss +0 -0
  348. data/app/{assets → packs}/stylesheets/decidim/modules/_omnipresent_banner.scss +0 -0
  349. data/app/{assets → packs}/stylesheets/decidim/modules/_opinion-toggle.scss +0 -0
  350. data/app/{assets → packs}/stylesheets/decidim/modules/_order-by.scss +0 -4
  351. data/app/{assets → packs}/stylesheets/decidim/modules/_pagination.scss +0 -0
  352. data/app/{assets → packs}/stylesheets/decidim/modules/_process-header.scss +0 -0
  353. data/app/{assets → packs}/stylesheets/decidim/modules/_process-info.scss +0 -0
  354. data/app/{assets → packs}/stylesheets/decidim/modules/_process-nav.scss +3 -3
  355. data/app/{assets → packs}/stylesheets/decidim/modules/_process-phase.scss +1 -1
  356. data/app/{assets → packs}/stylesheets/decidim/modules/_progress-bar.scss +0 -0
  357. data/app/{assets → packs}/stylesheets/decidim/modules/_reference.scss +0 -0
  358. data/app/{assets → packs}/stylesheets/decidim/modules/_reveal.scss +15 -0
  359. data/app/{assets → packs}/stylesheets/decidim/modules/_share.scss +0 -0
  360. data/app/{assets → packs}/stylesheets/decidim/modules/_signup.scss +0 -0
  361. data/app/{assets → packs}/stylesheets/decidim/modules/_space-stats.scss +0 -0
  362. data/app/{assets → packs}/stylesheets/decidim/modules/_static-pages.scss +0 -0
  363. data/app/packs/stylesheets/decidim/modules/_statistics.scss +53 -0
  364. data/app/{assets → packs}/stylesheets/decidim/modules/_status-labels.scss +0 -0
  365. data/app/{assets → packs}/stylesheets/decidim/modules/_sticky.scss +0 -0
  366. data/app/{assets → packs}/stylesheets/decidim/modules/_tags.scss +0 -0
  367. data/app/{assets → packs}/stylesheets/decidim/modules/_timeline.scss +2 -2
  368. data/app/{assets → packs}/stylesheets/decidim/modules/_title-action.scss +0 -0
  369. data/app/packs/stylesheets/decidim/modules/_toggle.scss +9 -0
  370. data/app/{assets → packs}/stylesheets/decidim/modules/_typography.scss +5 -4
  371. data/app/{assets → packs}/stylesheets/decidim/modules/_user-form.scss +0 -0
  372. data/app/{assets → packs}/stylesheets/decidim/modules/_versions.scss +0 -0
  373. data/app/{assets → packs}/stylesheets/decidim/modules/_video.scss +0 -0
  374. data/app/{assets → packs}/stylesheets/decidim/modules/_wizard-steps.scss +0 -0
  375. data/app/packs/stylesheets/decidim/plugins/MarkerCluster.Default.scss +67 -0
  376. data/app/packs/stylesheets/decidim/plugins/MarkerCluster.scss +15 -0
  377. data/app/packs/stylesheets/decidim/plugins/leaflet.scss +700 -0
  378. data/app/packs/stylesheets/decidim/utils/_fontface.scss +29 -0
  379. data/app/{assets → packs}/stylesheets/decidim/utils/_helpers.scss +13 -0
  380. data/app/{assets → packs}/stylesheets/decidim/utils/_keyframes.scss +0 -0
  381. data/app/{assets → packs}/stylesheets/decidim/utils/_mixins.scss +5 -5
  382. data/app/{assets → packs}/stylesheets/decidim/utils/_settings.scss +10 -4
  383. data/app/{assets → packs}/stylesheets/decidim/utils/_toggle-expand.scss +0 -0
  384. data/app/packs/stylesheets/decidim/vendor/_social_share_button.scss +129 -0
  385. data/app/packs/stylesheets/decidim/vizzs.scss +8 -0
  386. data/app/{assets → packs}/stylesheets/decidim/vizzs/_areachart.scss +0 -0
  387. data/app/{assets → packs}/stylesheets/decidim/vizzs/_chart-tooltip.scss +0 -0
  388. data/app/{assets → packs}/stylesheets/decidim/vizzs/_linechart.scss +1 -1
  389. data/app/{assets → packs}/stylesheets/decidim/vizzs/_orgchart.scss +0 -0
  390. data/app/{assets → packs}/stylesheets/decidim/vizzs/_rowchart.scss +1 -1
  391. data/app/packs/stylesheets/decidim/vizzs/_vizzs.scss +5 -0
  392. data/app/{assets → packs}/stylesheets/foundation-overrides/components/_button-group.scss +3 -1
  393. data/app/presenters/decidim/attachment_presenter.rb +1 -6
  394. data/app/presenters/decidim/home_stats_presenter.rb +6 -35
  395. data/app/presenters/decidim/menu_item_presenter.rb +12 -12
  396. data/app/presenters/decidim/menu_presenter.rb +2 -3
  397. data/app/presenters/decidim/nil_presenter.rb +1 -1
  398. data/app/presenters/decidim/official_author_presenter.rb +1 -1
  399. data/app/presenters/decidim/stats_presenter.rb +32 -0
  400. data/app/presenters/decidim/user_group_presenter.rb +0 -2
  401. data/app/presenters/decidim/user_presenter.rb +14 -2
  402. data/app/queries/decidim/metric_manage.rb +3 -3
  403. data/app/queries/decidim/similar_emendations.rb +1 -1
  404. data/app/queries/decidim/stats_users_count.rb +1 -2
  405. data/app/serializers/decidim/exporters/participatory_space_components_serializer.rb +2 -1
  406. data/app/serializers/decidim/exporters/serializer.rb +29 -0
  407. data/app/services/decidim/action_authorizer.rb +3 -2
  408. data/app/services/decidim/activity_search.rb +46 -1
  409. data/app/services/decidim/data_portability_exporter.rb +1 -1
  410. data/app/services/decidim/zip_stream/writer.rb +39 -0
  411. data/app/uploaders/decidim/application_uploader.rb +68 -27
  412. data/app/uploaders/decidim/attachment_uploader.rb +11 -57
  413. data/app/uploaders/decidim/avatar_uploader.rb +8 -14
  414. data/app/uploaders/decidim/cw/application_uploader.rb +77 -0
  415. data/app/uploaders/decidim/cw/attachment_uploader.rb +56 -0
  416. data/app/uploaders/decidim/cw/avatar_uploader.rb +24 -0
  417. data/app/uploaders/decidim/cw/banner_image_uploader.rb +7 -0
  418. data/app/uploaders/decidim/{data_portability_uploader.rb → cw/data_portability_uploader.rb} +1 -1
  419. data/app/uploaders/decidim/cw/downloader.rb +9 -0
  420. data/app/uploaders/decidim/cw/hero_image_uploader.rb +10 -0
  421. data/app/uploaders/decidim/cw/homepage_image_uploader.rb +14 -0
  422. data/app/uploaders/decidim/cw/image_uploader.rb +78 -0
  423. data/app/uploaders/decidim/cw/newsletter_template_image_uploader.rb +38 -0
  424. data/app/uploaders/decidim/cw/oauth_application_logo_uploader.rb +10 -0
  425. data/app/uploaders/decidim/cw/official_image_footer_uploader.rb +10 -0
  426. data/app/uploaders/decidim/cw/official_image_header_uploader.rb +10 -0
  427. data/app/uploaders/decidim/{open_data_uploader.rb → cw/open_data_uploader.rb} +1 -1
  428. data/app/uploaders/decidim/cw/organization_favicon_uploader.rb +18 -0
  429. data/app/uploaders/decidim/cw/organization_logo_uploader.rb +10 -0
  430. data/app/uploaders/decidim/cw/record_image_uploader.rb +15 -0
  431. data/app/uploaders/decidim/hero_image_uploader.rb +3 -1
  432. data/app/uploaders/decidim/homepage_image_uploader.rb +2 -2
  433. data/app/uploaders/decidim/image_uploader.rb +11 -47
  434. data/app/uploaders/decidim/newsletter_template_image_uploader.rb +3 -1
  435. data/app/uploaders/decidim/oauth_application_logo_uploader.rb +3 -1
  436. data/app/uploaders/decidim/official_image_footer_uploader.rb +3 -1
  437. data/app/uploaders/decidim/official_image_header_uploader.rb +3 -1
  438. data/app/uploaders/decidim/organization_favicon_uploader.rb +3 -3
  439. data/app/uploaders/decidim/organization_logo_uploader.rb +2 -2
  440. data/app/validators/organization_present_validator.rb +15 -0
  441. data/app/validators/uploader_content_type_validator.rb +2 -4
  442. data/app/validators/uploader_image_dimensions_validator.rb +49 -0
  443. data/app/views/decidim/account/show.html.erb +9 -1
  444. data/app/views/decidim/amendments/edit_draft.html.erb +1 -1
  445. data/app/views/decidim/amendments/new.html.erb +1 -1
  446. data/app/views/decidim/application/_attachments.html.erb +2 -2
  447. data/app/views/decidim/application/_collection.html.erb +8 -2
  448. data/app/views/decidim/application/_document.html.erb +2 -2
  449. data/app/views/decidim/application/_documents.html.erb +5 -3
  450. data/app/views/decidim/application/_photos.html.erb +1 -1
  451. data/app/views/decidim/block_user_mailer/notify.html.erb +4 -4
  452. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +1 -1
  453. data/app/views/decidim/export_mailer/data_portability_export.html.erb +7 -2
  454. data/app/views/decidim/export_mailer/export.html.erb +3 -1
  455. data/app/views/decidim/homepage/show.html.erb +1 -0
  456. data/app/views/decidim/last_activities/index.html.erb +0 -2
  457. data/app/views/decidim/links/_modal.html.erb +22 -0
  458. data/app/views/decidim/links/_warning.html.erb +4 -0
  459. data/app/views/decidim/links/new.html.erb +22 -0
  460. data/app/views/decidim/links/new.js.erb +8 -0
  461. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_conversation.html.erb +5 -5
  462. data/app/views/decidim/messaging/conversation_mailer/comanagers_new_message.html.erb +5 -5
  463. data/app/views/decidim/messaging/conversation_mailer/new_conversation.html.erb +4 -4
  464. data/app/views/decidim/messaging/conversation_mailer/new_group_conversation.html.erb +5 -5
  465. data/app/views/decidim/messaging/conversation_mailer/new_group_message.html.erb +5 -5
  466. data/app/views/decidim/messaging/conversation_mailer/new_message.html.erb +4 -4
  467. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +0 -1
  468. data/app/views/decidim/messaging/conversations/_conversation.html.erb +2 -2
  469. data/app/views/decidim/messaging/conversations/_messages.html.erb +1 -1
  470. data/app/views/decidim/messaging/conversations/_new_conversation_button.html.erb +0 -1
  471. data/app/views/decidim/messaging/conversations/_reply.html.erb +3 -2
  472. data/app/views/decidim/messaging/conversations/_show.html.erb +9 -7
  473. data/app/views/decidim/messaging/conversations/_start.html.erb +3 -2
  474. data/app/views/decidim/newsletters_opt_in_mailer/notify.html.erb +6 -6
  475. data/app/views/decidim/notification_mailer/event_received.html.erb +24 -7
  476. data/app/views/decidim/pages/_standalone.html.erb +8 -10
  477. data/app/views/decidim/reported_mailer/hide.html.erb +3 -3
  478. data/app/views/decidim/reported_mailer/report.html.erb +3 -3
  479. data/app/views/decidim/searches/index.html.erb +0 -2
  480. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +3 -3
  481. data/app/views/decidim/shared/_orders.html.erb +6 -6
  482. data/app/views/decidim/shared/_results_per_page.html.erb +6 -6
  483. data/app/views/decidim/shared/_share_modal.html.erb +13 -4
  484. data/app/views/decidim/shared/participatory_space_filters/_filters.html.erb +7 -4
  485. data/app/views/decidim/shared/participatory_space_filters/_show.html.erb +8 -6
  486. data/app/views/decidim/user_report_mailer/notify.html.erb +4 -4
  487. data/app/views/devise/mailer/confirmation_instructions.html.erb +4 -3
  488. data/app/views/devise/mailer/invitation_instructions.html.erb +5 -5
  489. data/app/views/devise/mailer/invite_admin.html.erb +5 -5
  490. data/app/views/devise/mailer/invite_collaborator.html.erb +5 -5
  491. data/app/views/devise/mailer/invite_private_user.html.erb +5 -5
  492. data/app/views/devise/mailer/organization_admin_invitation_instructions.html.erb +6 -5
  493. data/app/views/devise/mailer/password_change.html.erb +2 -2
  494. data/app/views/devise/mailer/reset_password_instructions.html.erb +6 -5
  495. data/app/views/devise/mailer/unlock_instructions.html.erb +4 -4
  496. data/app/views/layouts/decidim/_application.html.erb +3 -2
  497. data/app/views/layouts/decidim/_cookie_warning.html.erb +1 -1
  498. data/app/views/layouts/decidim/_cors.html.erb +8 -0
  499. data/app/views/layouts/decidim/_head.html.erb +2 -4
  500. data/app/views/layouts/decidim/_impersonation_warning.html.erb +0 -1
  501. data/app/views/layouts/decidim/_js_configuration.html.erb +12 -2
  502. data/app/views/layouts/decidim/_language_chooser.html.erb +5 -5
  503. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  504. data/app/views/layouts/decidim/_mailer_logo.html.erb +6 -2
  505. data/app/views/layouts/decidim/_main_footer.html.erb +2 -2
  506. data/app/views/layouts/decidim/_mini_footer.html.erb +2 -2
  507. data/app/views/layouts/decidim/_timeout_modal.html.erb +4 -3
  508. data/app/views/layouts/decidim/_user_menu.html.erb +6 -6
  509. data/app/views/layouts/decidim/_wrapper.html.erb +65 -60
  510. data/app/views/layouts/decidim/mailer.html.erb +3 -3
  511. data/app/views/layouts/decidim/newsletter_base.html.erb +1 -1
  512. data/app/views/layouts/decidim/widget.html.erb +4 -3
  513. data/config/assets.rb +16 -0
  514. data/config/initializers/devise.rb +1 -1
  515. data/config/locales/ar.yml +2 -18
  516. data/config/locales/bg.yml +2 -18
  517. data/config/locales/ca.yml +38 -18
  518. data/config/locales/cs.yml +40 -18
  519. data/config/locales/de.yml +25 -18
  520. data/config/locales/el.yml +2 -18
  521. data/config/locales/en.yml +41 -19
  522. data/config/locales/eo.yml +0 -2
  523. data/config/locales/es-MX.yml +25 -18
  524. data/config/locales/es-PY.yml +25 -18
  525. data/config/locales/es.yml +25 -18
  526. data/config/locales/eu.yml +2 -17
  527. data/config/locales/fi-plain.yml +40 -18
  528. data/config/locales/fi.yml +41 -19
  529. data/config/locales/fr-CA.yml +20 -18
  530. data/config/locales/fr-LU.yml +1676 -0
  531. data/config/locales/fr.yml +20 -18
  532. data/config/locales/gl.yml +36 -17
  533. data/config/locales/hu.yml +2 -18
  534. data/config/locales/id-ID.yml +2 -17
  535. data/config/locales/is-IS.yml +0 -7
  536. data/config/locales/it.yml +59 -19
  537. data/config/locales/ja.yml +132 -27
  538. data/config/locales/lb-LU.yml +1 -0
  539. data/config/locales/lv.yml +2 -17
  540. data/config/locales/nl.yml +32 -18
  541. data/config/locales/no.yml +2 -18
  542. data/config/locales/pl.yml +42 -33
  543. data/config/locales/pt-BR.yml +480 -20
  544. data/config/locales/pt.yml +2 -18
  545. data/config/locales/ro-RO.yml +40 -18
  546. data/config/locales/ru.yml +2 -15
  547. data/config/locales/sk.yml +2 -18
  548. data/config/locales/sl.yml +0 -3
  549. data/config/locales/sv.yml +25 -18
  550. data/config/locales/tr-TR.yml +2 -18
  551. data/config/locales/uk.yml +2 -14
  552. data/config/locales/zh-CN.yml +2 -18
  553. data/config/routes.rb +7 -0
  554. data/db/migrate/20170605162500_add_hierarchy_to_scopes.rb +1 -1
  555. data/db/migrate/20180810092428_move_organization_fields_to_hero_content_block.rb +5 -4
  556. data/db/migrate/20210210114657_add_external_domain_whitelist_to_organization.rb +15 -0
  557. data/db/migrate/20210309190009_create_active_storage_tables.active_storage.rb +29 -0
  558. data/db/migrate/20210407190753_allow_null_organization_logo_column_in_oauth_applications_table.rb +7 -0
  559. data/db/migrate/20210412120115_add_enable_participatory_space_filters_to_organization.rb +7 -0
  560. data/db/migrate/20210419165805_create_decidim_content_block_attachments.rb +10 -0
  561. data/db/migrate/20210629172525_fix_blocked_user_names_in_action_log.rb +45 -0
  562. data/db/seeds.rb +10 -3
  563. data/lib/decidim/action_authorization.rb +1 -1
  564. data/lib/decidim/api/functions/category_list.rb +31 -0
  565. data/lib/decidim/api/input_filters/category_input_filter.rb +18 -0
  566. data/lib/decidim/api/interfaces/categories_container_interface.rb +19 -0
  567. data/lib/decidim/carrier_wave_migrator_service.rb +295 -0
  568. data/lib/decidim/core.rb +27 -8
  569. data/lib/decidim/core/api.rb +3 -0
  570. data/lib/decidim/core/engine.rb +65 -56
  571. data/lib/decidim/core/test.rb +4 -0
  572. data/lib/decidim/core/test/factories.rb +2 -0
  573. data/lib/decidim/core/test/shared_examples/admin_log_presenter_examples.rb +3 -1
  574. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +2 -2
  575. data/lib/decidim/core/test/shared_examples/assembly_announcements_examples.rb +34 -0
  576. data/lib/decidim/core/test/shared_examples/categories_container_examples.rb +22 -0
  577. data/lib/decidim/core/test/shared_examples/comments_examples.rb +189 -6
  578. data/lib/decidim/core/test/shared_examples/comments_reports_examples.rb +68 -0
  579. data/lib/decidim/core/test/shared_examples/has_attachment_collections.rb +3 -3
  580. data/lib/decidim/core/test/shared_examples/has_attachments.rb +2 -2
  581. data/lib/decidim/core/test/shared_examples/logo_email.rb +3 -2
  582. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +1 -1
  583. data/lib/decidim/core/test/shared_examples/map_examples.rb +28 -11
  584. data/lib/decidim/core/test/shared_examples/paginated_resource_examples.rb +1 -0
  585. data/lib/decidim/core/test/shared_examples/share_link_examples.rb +50 -0
  586. data/lib/decidim/core/version.rb +1 -1
  587. data/lib/decidim/data_portability_serializers/data_portability_conversation_serializer.rb +1 -0
  588. data/lib/decidim/diffy_extension.rb +1 -1
  589. data/lib/decidim/events/email_event.rb +12 -0
  590. data/lib/decidim/exporters/csv.rb +1 -1
  591. data/lib/decidim/exporters/excel.rb +24 -20
  592. data/lib/decidim/exporters/json.rb +1 -1
  593. data/lib/decidim/file_validator_humanizer.rb +3 -2
  594. data/lib/decidim/filter_form_builder.rb +2 -2
  595. data/lib/decidim/fingerprintable.rb +2 -2
  596. data/lib/decidim/form_builder.rb +26 -20
  597. data/lib/decidim/gamification/badge.rb +1 -1
  598. data/lib/decidim/has_upload_validations.rb +37 -4
  599. data/lib/decidim/map/dynamic_map.rb +2 -2
  600. data/lib/decidim/map/provider/autocomplete/here.rb +1 -1
  601. data/lib/decidim/map/provider/autocomplete/osm.rb +1 -1
  602. data/lib/decidim/map/provider/dynamic_map/here.rb +1 -1
  603. data/lib/decidim/menu.rb +64 -1
  604. data/lib/decidim/menu_item.rb +5 -2
  605. data/lib/decidim/middleware/current_organization.rb +57 -0
  606. data/lib/decidim/middleware/strip_x_forwarded_host.rb +16 -0
  607. data/lib/decidim/participable.rb +41 -33
  608. data/lib/decidim/rails.rb +21 -0
  609. data/lib/decidim/resource_manifest.rb +13 -0
  610. data/lib/decidim/resourceable.rb +8 -0
  611. data/lib/decidim/searchable.rb +1 -1
  612. data/lib/decidim/traceable.rb +2 -3
  613. data/lib/decidim/translatable_resource.rb +1 -1
  614. data/lib/decidim/view_model.rb +1 -0
  615. data/lib/decidim/webpacker.rb +32 -0
  616. data/lib/decidim/webpacker/configuration.rb +89 -0
  617. data/lib/decidim/webpacker/postcss.config.js +16 -0
  618. data/lib/decidim/webpacker/runner.rb +24 -0
  619. data/lib/decidim/webpacker/webpack/base.js +6 -0
  620. data/lib/decidim/webpacker/webpack/custom.js +97 -0
  621. data/lib/decidim/webpacker/webpack/development.js +7 -0
  622. data/lib/decidim/webpacker/webpack/production.js +7 -0
  623. data/lib/decidim/webpacker/webpack/test.js +7 -0
  624. data/lib/decidim/webpacker/webpacker.yml +68 -0
  625. data/lib/gem_overrides/webpacker/runner.rb +9 -0
  626. data/lib/tasks/decidim_active_storage_migration_tasks.rake +43 -0
  627. data/lib/tasks/decidim_data_portability_tasks.rake +13 -67
  628. data/lib/tasks/decidim_tasks.rake +1 -1
  629. data/lib/tasks/decidim_webpacker_tasks.rake +166 -0
  630. metadata +417 -431
  631. data/app/assets/config/decidim_core_manifest.js +0 -25
  632. data/app/assets/javascripts/decidim.js.es6 +0 -82
  633. data/app/assets/javascripts/decidim/append_elements.js.es6 +0 -8
  634. data/app/assets/javascripts/decidim/assets.js.erb +0 -5
  635. data/app/assets/javascripts/decidim/callout.js.es6 +0 -18
  636. data/app/assets/javascripts/decidim/check_boxes_tree.js.es6 +0 -190
  637. data/app/assets/javascripts/decidim/conferences.js.es6 +0 -16
  638. data/app/assets/javascripts/decidim/configuration.js.es6 +0 -23
  639. data/app/assets/javascripts/decidim/confirm.js.es6 +0 -179
  640. data/app/assets/javascripts/decidim/core/bundle.js +0 -2
  641. data/app/assets/javascripts/decidim/core/bundle.js.map +0 -1
  642. data/app/assets/javascripts/decidim/core/extrapoly.js +0 -6
  643. data/app/assets/javascripts/decidim/data_picker.js.es6 +0 -273
  644. data/app/assets/javascripts/decidim/delayed.js.es6 +0 -26
  645. data/app/assets/javascripts/decidim/dropdowns_menus.js.es6 +0 -32
  646. data/app/assets/javascripts/decidim/editor.js.es6 +0 -83
  647. data/app/assets/javascripts/decidim/editor/history_override.js.es6 +0 -117
  648. data/app/assets/javascripts/decidim/editor/linebreak_module.js.es6 +0 -187
  649. data/app/assets/javascripts/decidim/editor/modified_backspace_offset1.js.es6 +0 -98
  650. data/app/assets/javascripts/decidim/editor/modified_backspace_offset_any.js.es6 +0 -48
  651. data/app/assets/javascripts/decidim/editor/modified_backspace_utils.js.es6 +0 -31
  652. data/app/assets/javascripts/decidim/editor/modified_enter.js.es6 +0 -123
  653. data/app/assets/javascripts/decidim/external_link.js.es6 +0 -69
  654. data/app/assets/javascripts/decidim/filters.js.es6 +0 -16
  655. data/app/assets/javascripts/decidim/form_filter.component.js.es6 +0 -315
  656. data/app/assets/javascripts/decidim/form_validator.es6 +0 -61
  657. data/app/assets/javascripts/decidim/foundation.js.es6 +0 -28
  658. data/app/assets/javascripts/decidim/geocoding.js.es6 +0 -60
  659. data/app/assets/javascripts/decidim/geocoding/attach_input.js.es6 +0 -143
  660. data/app/assets/javascripts/decidim/geocoding/format_address.js.es6 +0 -29
  661. data/app/assets/javascripts/decidim/geocoding/provider/here.js.es6 +0 -107
  662. data/app/assets/javascripts/decidim/geocoding/provider/photon.js.es6 +0 -77
  663. data/app/assets/javascripts/decidim/history.js.es6 +0 -53
  664. data/app/assets/javascripts/decidim/icon.js.es6 +0 -42
  665. data/app/assets/javascripts/decidim/impersonation.js.es6 +0 -16
  666. data/app/assets/javascripts/decidim/input_character_counter.js.es6 +0 -120
  667. data/app/assets/javascripts/decidim/map.js.es6 +0 -46
  668. data/app/assets/javascripts/decidim/map/controller.js.es6 +0 -92
  669. data/app/assets/javascripts/decidim/map/controller/markers.js.es6 +0 -95
  670. data/app/assets/javascripts/decidim/map/controller/static.es6 +0 -48
  671. data/app/assets/javascripts/decidim/map/factory.js.es6 +0 -51
  672. data/app/assets/javascripts/decidim/map/icon.js.es6 +0 -31
  673. data/app/assets/javascripts/decidim/map/legacy.js.es6 +0 -87
  674. data/app/assets/javascripts/decidim/map/provider/default.js.es6 +0 -22
  675. data/app/assets/javascripts/decidim/map/provider/here.js.es6 +0 -22
  676. data/app/assets/javascripts/decidim/orders.js.es6 +0 -9
  677. data/app/assets/javascripts/decidim/results_listing.js.es6 +0 -44
  678. data/app/assets/javascripts/decidim/security/selfxss_warning.js.es6 +0 -19
  679. data/app/assets/javascripts/decidim/session_timeouter.js.es6 +0 -78
  680. data/app/assets/javascripts/decidim/social_share.js +0 -2
  681. data/app/assets/javascripts/decidim/vizzs.js.es6 +0 -1
  682. data/app/assets/javascripts/decidim/vizzs/renders.js.es6 +0 -11
  683. data/app/assets/stylesheets/decidim/_decidim.scss +0 -19
  684. data/app/assets/stylesheets/decidim/application.scss.erb +0 -10
  685. data/app/assets/stylesheets/decidim/extras/_extras.scss +0 -17
  686. data/app/assets/stylesheets/decidim/extras/_process_stats.scss +0 -45
  687. data/app/assets/stylesheets/decidim/layouts/_layouts.scss +0 -5
  688. data/app/assets/stylesheets/decidim/map.css +0 -5
  689. data/app/assets/stylesheets/decidim/modules/_modules.scss +0 -92
  690. data/app/assets/stylesheets/decidim/modules/_toggle.scss +0 -9
  691. data/app/assets/stylesheets/decidim/utils/_fontface.scss +0 -39
  692. data/app/assets/stylesheets/decidim/vizzs.scss +0 -8
  693. data/app/assets/stylesheets/decidim/vizzs/_vizzs.scss +0 -5
  694. data/app/frontend/entry.ts +0 -1
  695. data/app/middleware/decidim/current_organization.rb +0 -55
  696. data/app/middleware/decidim/strip_x_forwarded_host.rb +0 -14
  697. data/app/services/decidim/zip_stream/zip_stream_writer.rb +0 -56
  698. data/config/locales/ja-JP.yml +0 -1587
  699. data/lib/decidim/messaging.rb +0 -9
  700. data/vendor/assets/javascripts/appendAround.js +0 -41
  701. data/vendor/assets/javascripts/d3.js +0 -17813
  702. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ar.js +0 -16
  703. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.bg.js +0 -14
  704. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ca.js +0 -16
  705. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.cs.js +0 -14
  706. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.da.js +0 -14
  707. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.de.js +0 -14
  708. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.el.js +0 -14
  709. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.eo.js +0 -17
  710. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.es-MX.js +0 -15
  711. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.es-PY.js +0 -15
  712. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.es.js +0 -15
  713. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.et.js +0 -18
  714. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.eu.js +0 -15
  715. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.fi-pl.js +0 -14
  716. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.fi.js +0 -14
  717. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.fr-CA.js +0 -16
  718. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.fr.js +0 -16
  719. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ga.js +0 -15
  720. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.gl.js +0 -12
  721. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.hr.js +0 -13
  722. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.hu.js +0 -16
  723. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.id.js +0 -13
  724. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.is.js +0 -14
  725. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.it.js +0 -14
  726. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ja.js +0 -16
  727. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ko.js +0 -18
  728. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.lt.js +0 -16
  729. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.lv.js +0 -17
  730. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.mt.js +0 -15
  731. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.nl.js +0 -14
  732. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.no.js +0 -13
  733. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.pl.js +0 -15
  734. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.pt-BR.js +0 -14
  735. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.pt.js +0 -17
  736. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ro.js +0 -15
  737. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ru.js +0 -16
  738. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.sk.js +0 -14
  739. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.sl.js +0 -14
  740. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.sr.js +0 -16
  741. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.sv.js +0 -14
  742. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.tr.js +0 -14
  743. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.uk.js +0 -16
  744. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.vi.js +0 -14
  745. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.zh-CN.js +0 -14
  746. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.zh-TW.js +0 -14
  747. data/vendor/assets/javascripts/form_datepicker.js.es6 +0 -24
  748. data/vendor/assets/javascripts/foundation-datepicker.js +0 -1425
  749. data/vendor/assets/javascripts/leaflet-svg-icon.js +0 -179
  750. data/vendor/assets/javascripts/leaflet.js +0 -9
  751. data/vendor/assets/javascripts/leaflet.markercluster.js +0 -7
  752. data/vendor/assets/javascripts/morphdom.js +0 -688
  753. data/vendor/assets/javascripts/quill.min.js +0 -8
  754. data/vendor/assets/javascripts/quill.min.js.map +0 -1
  755. data/vendor/assets/javascripts/svg4everybody.min.js +0 -1
  756. data/vendor/assets/javascripts/tagsinput.js +0 -683
  757. data/vendor/assets/stylesheets/MarkerCluster.Default.css +0 -60
  758. data/vendor/assets/stylesheets/MarkerCluster.css +0 -14
  759. data/vendor/assets/stylesheets/leaflet.css +0 -624
  760. data/vendor/assets/stylesheets/quill.bubble.css +0 -952
  761. data/vendor/assets/stylesheets/quill.core.css +0 -397
  762. data/vendor/assets/stylesheets/quill.snow.css +0 -945
  763. data/vendor/assets/stylesheets/tagsinput.css +0 -55
  764. data/vendor/assets/stylesheets/tribute.css +0 -27
@@ -0,0 +1,29 @@
1
+ $(() => {
2
+ $("[data-decidim-map]").on("ready.decidim", (ev, _map, mapConfig) => {
3
+ const $map = $(ev.target);
4
+ const ctrl = $map.data("map-controller");
5
+
6
+ if (mapConfig.type === "drag-marker") {
7
+ const inputSelector = $map.data("connected-input");
8
+ if (!inputSelector) {
9
+ return;
10
+ }
11
+
12
+ const $inputs = $(inputSelector);
13
+ if ($inputs.length < 1) {
14
+ return;
15
+ }
16
+
17
+ ctrl.setEventHandler("coordinates", (latlng) => {
18
+ $inputs.each((_i, el) => {
19
+ const $input = $(el);
20
+ if ($input.data("type") === "latitude") {
21
+ $input.val(latlng.lat);
22
+ } else if ($input.data("type") === "longitude") {
23
+ $input.val(latlng.lng);
24
+ }
25
+ })
26
+ });
27
+ }
28
+ });
29
+ });
@@ -0,0 +1,80 @@
1
+ /* eslint-disable require-jsdoc */
2
+
3
+ import * as L from "leaflet";
4
+ import createMapController from "src/decidim/map/factory"
5
+
6
+ /**
7
+ * @deprecated
8
+ *
9
+ * This adds support for the legacy style of map configuration and the methods
10
+ * available globally. This is not really needed unless someone is still relying
11
+ * on these methods or the have customizations that are hard to update.
12
+ * @param {Object} $map A selector with the map container
13
+ *
14
+ * @returns {void} Nothing.
15
+ */
16
+ const legacyMapSupport = ($map) => {
17
+ const hereAppId = $map.data("here-app-id");
18
+ const hereAppCode = $map.data("here-app-code");
19
+ const hereApiKey = $map.data("here-api-key");
20
+
21
+ let mapApiConfig = null;
22
+ if (hereApiKey) {
23
+ mapApiConfig = { apiKey: hereApiKey };
24
+ } else if (hereAppId && hereAppCode) {
25
+ mapApiConfig = {
26
+ appId: hereAppId,
27
+ appCode: hereAppCode
28
+ };
29
+ } else {
30
+ throw new Error("Legacy map support: Please provide the HERE API configuration");
31
+ }
32
+
33
+ const markersData = $map.data("markers-data");
34
+
35
+ let markerColor = getComputedStyle(document.documentElement).getPropertyValue("--primary");
36
+ if (!markerColor || markerColor.length < 1) {
37
+ markerColor = "#ef604d";
38
+ }
39
+
40
+ // Configure the map element with the new style
41
+ const mapConfig = {
42
+ markerColor,
43
+ popupTemplateId: "marker-popup",
44
+ markers: markersData,
45
+ tileLayer: mapApiConfig
46
+ }
47
+
48
+ $map.data("decidim-map", mapConfig);
49
+
50
+ window.Decidim.mapConfiguration = $.extend({
51
+ markerColor: markerColor
52
+ }, mapApiConfig);
53
+ };
54
+
55
+ const loadMap = (mapId, markersData) => {
56
+ // Allow the configured map service to configure the map, e.g. attaching the
57
+ // tile layer to the map.
58
+ const $map = $(`#${mapId}`);
59
+ $map.data("markers-data", markersData);
60
+ legacyMapSupport($map);
61
+
62
+ const mapData = $map.data("decidim-map");
63
+ const ctrl = createMapController(mapId, mapData);
64
+ const map = ctrl.load();
65
+
66
+ L.tileLayer.here(mapData.tileLayer).addTo(map);
67
+
68
+ ctrl.start();
69
+
70
+ window.Decidim.currentMap = map;
71
+
72
+ return map;
73
+ };
74
+
75
+ $(() => {
76
+ const $map = $("#map");
77
+ if ($map.length > 0) {
78
+ loadMap($map.attr("id"), $map.data("markers-data"));
79
+ }
80
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * NOTE:
3
+ * This has to load before decidim/map in order for it to apply correctly when
4
+ * the map is initialized. The document.ready handler set by this script has to
5
+ * be registered before decidim/map registers its own.
6
+ */
7
+ $(() => {
8
+ $("[data-decidim-map]").on("configure.decidim", (_ev, map, mapConfig) => {
9
+ const tilesConfig = mapConfig.tileLayer;
10
+ L.tileLayer(tilesConfig.url, tilesConfig.options).addTo(map);
11
+ });
12
+ });
@@ -0,0 +1,13 @@
1
+ import * as L from "leaflet"
2
+
3
+ /**
4
+ * NOTE:
5
+ * This has to load before decidim/map in order for it to apply correctly when
6
+ * the map is initialized. The document.ready handler set by this script has to
7
+ * be registered before decidim/map registers its own.
8
+ */
9
+ $(() => {
10
+ $("[data-decidim-map]").on("configure.decidim", (_ev, map, mapConfig) => {
11
+ L.tileLayer.here(mapConfig.tileLayer).addTo(map);
12
+ });
13
+ });
@@ -0,0 +1,41 @@
1
+ import { pushState, registerCallback } from "src/decidim/history"
2
+
3
+ const initializeListingOptionsMenu = (options) => {
4
+ $(document).on("click", `${options.containerSelector} a`, (event) => {
5
+ const $target = $(event.target);
6
+
7
+ $target.parents(".menu").find("a:first").text($target.text());
8
+
9
+ pushState($target.attr("href"));
10
+ })
11
+
12
+ registerCallback(options.callbackName, () => {
13
+ const url = window.location.toString();
14
+ const match = url.match(/${options.urlParameter}=([^&]*)/);
15
+ const $targetMenu = $(`${options.containerSelector} .menu`);
16
+ let value = $targetMenu.find(".menu a:first").data(options.dataAttribute);
17
+
18
+ if (match) {
19
+ value = match[1];
20
+ }
21
+
22
+ const linkText = $targetMenu.find(`.menu a[data-${options.dataAttribute}="${value}"]`).text();
23
+
24
+ $targetMenu.find("a:first").text(linkText);
25
+ });
26
+ };
27
+
28
+ $(() => {
29
+ initializeListingOptionsMenu({
30
+ containerSelector: ".order-by",
31
+ callbackName: "orders",
32
+ urlParameter: "order",
33
+ dataAttribute: "order"
34
+ });
35
+ initializeListingOptionsMenu({
36
+ containerSelector: ".results-per-page",
37
+ callbackName: "results_per_page",
38
+ urlParameter: "per_page",
39
+ dataAttribute: "per-page-option"
40
+ });
41
+ });
@@ -0,0 +1,16 @@
1
+ /* eslint-disable no-console */
2
+
3
+ $(() => {
4
+ if (!console) {
5
+ return;
6
+ }
7
+
8
+ const allMessages = window.Decidim.config.get("messages");
9
+ if (!allMessages) {
10
+ return;
11
+ }
12
+ const messages = allMessages.selfxssWarning;
13
+
14
+ console.log(`%c${messages.title}`, "color:#f00;font-weight:bold;font-size:50px;");
15
+ console.log(`%c${messages.description}`, "font-size:24px;");
16
+ });
@@ -0,0 +1,133 @@
1
+ import moment from "moment"
2
+ import Foundation from "foundation-sites"
3
+
4
+ $(() => {
5
+ let sessionTimeOutEnabled = true;
6
+ const $timeoutModal = $("#timeoutModal");
7
+ const timeoutInSeconds = parseInt($timeoutModal.data("session-timeout"), 10);
8
+ const secondsUntilTimeoutPath = $timeoutModal.data("seconds-until-timeout-path");
9
+ const heartbeatPath = $timeoutModal.data("heartbeat-path");
10
+ const interval = parseInt($timeoutModal.data("session-timeout-interval"), 10);
11
+ let endsAt = moment().add(timeoutInSeconds, "seconds");
12
+ let lastAction = moment();
13
+ const popup = new Foundation.Reveal($timeoutModal);
14
+ const $continueSessionButton = $("#continueSession");
15
+ let lastActivityCheck = moment();
16
+ // 5 * 60 seconds = 5 Minutes
17
+ const activityCheckInterval = 5 * 60;
18
+
19
+ // Ajax request is made at timeout_modal.html.erb
20
+ $continueSessionButton.on("click", () => {
21
+ $("#timeoutModal").foundation("close");
22
+ // In admin panel we have to hide all overlays
23
+ $(".reveal-overlay").css("display", "none");
24
+ lastActivityCheck = moment();
25
+ })
26
+
27
+ if (isNaN(interval)) {
28
+ return;
29
+ }
30
+ if (!timeoutInSeconds) {
31
+ return;
32
+ }
33
+
34
+ const disableSessionTimeout = () => {
35
+ sessionTimeOutEnabled = false;
36
+ }
37
+
38
+ const enableSessionTimeout = () => {
39
+ sessionTimeOutEnabled = true;
40
+ }
41
+
42
+ const setTimer = (secondsUntilExpiration) => {
43
+ if (!secondsUntilExpiration) {
44
+ return;
45
+ }
46
+ endsAt = moment().add(secondsUntilExpiration, "seconds");
47
+ }
48
+
49
+ const sessionTimeLeft = () => {
50
+ return $.ajax({
51
+ method: "GET",
52
+ url: secondsUntilTimeoutPath,
53
+ contentType: "application/json",
54
+ headers: {
55
+ "X-CSRF-Token": $("meta[name=csrf-token]").attr("content")
56
+ }
57
+ });
58
+ }
59
+
60
+ const heartbeat = () => {
61
+ return $.ajax({
62
+ method: "POST",
63
+ url: heartbeatPath,
64
+ contentType: "application/javascript"
65
+ });
66
+ }
67
+
68
+ const userBeenActiveSince = (seconds) => {
69
+ return (moment() - lastAction) / 1000 < seconds;
70
+ }
71
+
72
+ const exitInterval = setInterval(() => {
73
+ const timeSinceLastActivityCheckInSeconds = Math.round((moment() - lastActivityCheck) / 1000);
74
+
75
+ const popupOpen = $("#timeoutModal").parent().css("display") === "block";
76
+ if (!popupOpen && timeSinceLastActivityCheckInSeconds >= activityCheckInterval) {
77
+ lastActivityCheck = moment();
78
+ if (userBeenActiveSince(activityCheckInterval)) {
79
+ heartbeat();
80
+ return;
81
+ }
82
+ }
83
+
84
+ const timeRemaining = Math.round((endsAt - moment()) / 1000);
85
+ if (timeRemaining > 150) {
86
+ return;
87
+ }
88
+
89
+ sessionTimeLeft().then((result) => {
90
+ const secondsUntilSessionExpires = result.seconds_remaining;
91
+ setTimer(secondsUntilSessionExpires);
92
+
93
+ if (!sessionTimeOutEnabled) {
94
+ heartbeat();
95
+ } else if (secondsUntilSessionExpires <= 90) {
96
+ $timeoutModal.find("#reveal-hidden-sign-out")[0].click();
97
+ } else if (secondsUntilSessionExpires <= 150) {
98
+ popup.open();
99
+ }
100
+ });
101
+ }, interval);
102
+
103
+ $(document).mousemove(() => {
104
+ lastAction = moment();
105
+ })
106
+ $(document).scroll(() => {
107
+ lastAction = moment();
108
+ })
109
+ $(document).keypress(() => {
110
+ lastAction = moment();
111
+ })
112
+
113
+ // Devise restarts its own timer on ajax requests,
114
+ // so here we restart our.
115
+ $(document).on("ajax:complete", () => {
116
+ setTimer(timeoutInSeconds);
117
+ });
118
+
119
+ $(document).ajaxComplete((_event, _xhr, settings) => {
120
+ if (settings && settings.url === secondsUntilTimeoutPath) {
121
+ return;
122
+ }
123
+ setTimer(timeoutInSeconds);
124
+ });
125
+
126
+ window.addEventListener("beforeunload", () => {
127
+ clearInterval(exitInterval);
128
+ return;
129
+ });
130
+
131
+ window.Decidim.enableSessionTimeout = enableSessionTimeout
132
+ window.Decidim.disableSessionTimeout = disableSessionTimeout
133
+ });
@@ -1,4 +1,4 @@
1
- $(document).ready(function () {
1
+ $(() => {
2
2
  let addUsersConversationDialog = $("#user-conversations-add-modal"),
3
3
  button = $("#start-conversation-dialog-button");
4
4
 
@@ -0,0 +1,1431 @@
1
+ /* eslint-disable */
2
+
3
+ /* =========================================================
4
+ * foundation-datepicker.js
5
+ * Copyright 2015 Peter Beno, najlepsiwebdesigner@gmail.com, @benopeter
6
+ * project website http://foundation-datepicker.peterbeno.com
7
+ * ========================================================= */
8
+
9
+ // This file is a modified version of the original file
10
+ // See
11
+ // - https://github.com/decidim/decidim/pull/1207
12
+ // - https://github.com/decidim/decidim/pull/2512
13
+ // - https://github.com/decidim/decidim/pull/3515
14
+
15
+ !(function($) {
16
+
17
+ function UTCDate() {
18
+ return new Date(Date.UTC(...arguments));
19
+ }
20
+
21
+ function UTCToday() {
22
+ let today = new Date();
23
+ return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate());
24
+ }
25
+
26
+ let Datepicker = function(element, options) {
27
+ let that = this;
28
+
29
+ this.element = $(element);
30
+ this.autoShow = (options.autoShow == undefined ? true : options.autoShow);
31
+ this.appendTo = options.appendTo || "body";
32
+ this.closeButton = options.closeButton;
33
+ this.language = options.language || this.element.data("date-language") || "en";
34
+ this.language = this.language in dates ? this.language : this.language.split("-")[0]; // Check if "de-DE" style date is available, if not language should fallback to 2 letter code eg "de"
35
+ this.language = this.language in dates ? this.language : "en";
36
+ this.isRTL = dates[this.language].rtl || false;
37
+ this.format = DPGlobal.parseFormat(options.format || this.element.data("date-format") || dates[this.language].format || "mm/dd/yyyy");
38
+ this.formatText = options.format || this.element.data("date-format") || dates[this.language].format || "mm/dd/yyyy";
39
+ this.isInline = false;
40
+ this.isInput = this.element.is("input");
41
+ this.component = this.element.is(".date") ? this.element.find(".prefix, .postfix") : false;
42
+ this.hasInput = this.component && this.element.find("input").length;
43
+ this.disableDblClickSelection = options.disableDblClickSelection;
44
+ this.onRender = options.onRender || function() {};
45
+ if (this.component && this.component.length === 0) {
46
+ this.component = false;
47
+ }
48
+ this.linkField = options.linkField || this.element.data("link-field") || false;
49
+ this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data("link-format") || "yyyy-mm-dd hh:ii:ss");
50
+ this.minuteStep = options.minuteStep || this.element.data("minute-step") || 5;
51
+ this.pickerPosition = options.pickerPosition || this.element.data("picker-position") || "bottom-right";
52
+ this.initialDate = options.initialDate || null;
53
+ this.faCSSprefix = options.faCSSprefix || "fa";
54
+ this.leftArrow = options.leftArrow || `<i class="${this.faCSSprefix} ${this.faCSSprefix}-chevron-left fi-arrow-left"/>`;
55
+ this.rightArrow = options.rightArrow || `<i class="${this.faCSSprefix} ${this.faCSSprefix}-chevron-right fi-arrow-right"/>`;
56
+ this.closeIcon = options.closeIcon || `<i class="${this.faCSSprefix} ${this.faCSSprefix}-remove ${this.faCSSprefix}-times fi-x"></i>`;
57
+
58
+
59
+ this.minView = 0;
60
+ if ("minView" in options) {
61
+ this.minView = options.minView;
62
+ } else if ("minView" in this.element.data()) {
63
+ this.minView = this.element.data("min-view");
64
+ }
65
+ this.minView = DPGlobal.convertViewMode(this.minView);
66
+
67
+ this.maxView = DPGlobal.modes.length - 1;
68
+ if ("maxView" in options) {
69
+ this.maxView = options.maxView;
70
+ } else if ("maxView" in this.element.data()) {
71
+ this.maxView = this.element.data("max-view");
72
+ }
73
+ this.maxView = DPGlobal.convertViewMode(this.maxView);
74
+
75
+ this.startViewMode = "month";
76
+ if ("startView" in options) {
77
+ this.startViewMode = options.startView;
78
+ } else if ("startView" in this.element.data()) {
79
+ this.startViewMode = this.element.data("start-view");
80
+ }
81
+ this.startViewMode = DPGlobal.convertViewMode(this.startViewMode);
82
+ this.viewMode = this.startViewMode;
83
+
84
+ if (!("minView" in options) && !("maxView" in options) && !(this.element.data("min-view")) && !(this.element.data("max-view"))) {
85
+ this.pickTime = false;
86
+ if ("pickTime" in options) {
87
+ this.pickTime = options.pickTime;
88
+ }
89
+ if (this.pickTime == true) {
90
+ this.minView = 0;
91
+ this.maxView = 4;
92
+ } else {
93
+ this.minView = 2;
94
+ this.maxView = 4;
95
+ }
96
+ }
97
+
98
+ this.forceParse = true;
99
+ if ("forceParse" in options) {
100
+ this.forceParse = options.forceParse;
101
+ } else if ("dateForceParse" in this.element.data()) {
102
+ this.forceParse = this.element.data("date-force-parse");
103
+ }
104
+
105
+
106
+ this.picker = $(DPGlobal.template(this.leftArrow, this.rightArrow, this.closeIcon)).
107
+ appendTo(this.isInline ? this.element : this.appendTo).
108
+ on({
109
+ click: $.proxy(this.click, this),
110
+ mousedown: $.proxy(this.mousedown, this)
111
+ });
112
+ if (this.closeButton) {
113
+ this.picker.find("a.datepicker-close").show();
114
+ } else {
115
+ this.picker.find("a.datepicker-close").hide();
116
+ }
117
+
118
+ if (this.isInline) {
119
+ this.picker.addClass("datepicker-inline");
120
+ } else {
121
+ this.picker.addClass("datepicker-dropdown dropdown-menu");
122
+ }
123
+ if (this.isRTL) {
124
+ this.picker.addClass("datepicker-rtl");
125
+
126
+ this.picker.find(".date-switch").each(function() {
127
+ $(this).parent().prepend($(this).siblings(".next"));
128
+ $(this).parent().append($(this).siblings(".prev"));
129
+ })
130
+ this.picker.find(".prev, .next").toggleClass("prev next");
131
+
132
+ }
133
+ $(document).on("mousedown", function(e) {
134
+ if (that.isInput && e.target === that.element[0]) {
135
+ return;
136
+ }
137
+
138
+ // Clicked outside the datepicker, hide it
139
+ if ($(e.target).closest(".datepicker.datepicker-inline, .datepicker.datepicker-dropdown").length === 0) {
140
+ that.hide();
141
+ }
142
+ });
143
+
144
+ this.autoclose = true;
145
+ if ("autoclose" in options) {
146
+ this.autoclose = options.autoclose;
147
+ } else if ("dateAutoclose" in this.element.data()) {
148
+ this.autoclose = this.element.data("date-autoclose");
149
+ }
150
+
151
+ this.keyboardNavigation = true;
152
+ if ("keyboardNavigation" in options) {
153
+ this.keyboardNavigation = options.keyboardNavigation;
154
+ } else if ("dateKeyboardNavigation" in this.element.data()) {
155
+ this.keyboardNavigation = this.element.data("date-keyboard-navigation");
156
+ }
157
+
158
+ this.todayBtn = (options.todayBtn || this.element.data("date-today-btn") || false);
159
+ this.todayHighlight = (options.todayHighlight || this.element.data("date-today-highlight") || false);
160
+
161
+ this.calendarWeeks = false;
162
+ if ("calendarWeeks" in options) {
163
+ this.calendarWeeks = options.calendarWeeks;
164
+ } else if ("dateCalendarWeeks" in this.element.data()) {
165
+ this.calendarWeeks = this.element.data("date-calendar-weeks");
166
+ }
167
+ if (this.calendarWeeks)
168
+ {this.picker.find("tfoot th.today").
169
+ attr("colspan", function(i, val) {
170
+ return parseInt(val) + 1;
171
+ });}
172
+
173
+ this.weekStart = ((options.weekStart || this.element.data("date-weekstart") || dates[this.language].weekStart || 0) % 7);
174
+ this.weekEnd = ((this.weekStart + 6) % 7);
175
+ this.startDate = -Infinity;
176
+ this.endDate = Infinity;
177
+ this.daysOfWeekDisabled = [];
178
+ this.datesDisabled = [];
179
+ this.setStartDate(options.startDate || this.element.data("date-startdate"));
180
+ this.setEndDate(options.endDate || this.element.data("date-enddate"));
181
+ this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data("date-days-of-week-disabled"));
182
+ this.setDatesDisabled(options.datesDisabled || this.element.data("dates-disabled"));
183
+
184
+ if (this.initialDate != null) {
185
+ this.date = this.viewDate = DPGlobal.parseDate(this.initialDate, this.format, this.language);
186
+ this.setValue();
187
+ }
188
+
189
+ this.fillDow();
190
+ this.fillMonths();
191
+ this.update();
192
+
193
+ this.showMode();
194
+
195
+ if (this.isInline) {
196
+ this.show();
197
+ }
198
+
199
+ this._attachEvents();
200
+ };
201
+
202
+ Datepicker.prototype = {
203
+ constructor: Datepicker,
204
+
205
+ _events: [],
206
+ _attachEvents: function() {
207
+ this._detachEvents();
208
+ if (this.isInput) { // single input
209
+ if (!this.keyboardNavigation) {
210
+ this._events = [
211
+ [this.element, {
212
+ focus: (this.autoShow) ? $.proxy(this.show, this) : function() {}
213
+ }]
214
+ ];
215
+ } else {
216
+ this._events = [
217
+ [this.element, {
218
+ focus: (this.autoShow) ? $.proxy(this.show, this) : function() {},
219
+ keyup: $.proxy(this.update, this),
220
+ keydown: $.proxy(this.keydown, this),
221
+ click: (this.element.attr("readonly")) ? $.proxy(this.show, this) : function() {}
222
+ }]
223
+ ];
224
+ }
225
+ }
226
+ else if (this.component && this.hasInput) { // component: input + button
227
+ this._events = [
228
+ // For components that are not readonly, allow keyboard nav
229
+ [this.element.find("input"), {
230
+ focus: (this.autoShow) ? $.proxy(this.show, this) : function() {},
231
+ keyup: $.proxy(this.update, this),
232
+ keydown: $.proxy(this.keydown, this)
233
+ }],
234
+ [this.component, {
235
+ click: $.proxy(this.show, this)
236
+ }]
237
+ ];
238
+ } else if (this.element.is("div")) { // inline datepicker
239
+ this.isInline = true;
240
+ } else {
241
+ this._events = [
242
+ [this.element, {
243
+ click: $.proxy(this.show, this)
244
+ }]
245
+ ];
246
+ }
247
+
248
+ if (this.disableDblClickSelection) {
249
+ this._events[this._events.length] = [
250
+ this.element, {
251
+ dblclick: function(e) {
252
+ e.preventDefault();
253
+ e.stopPropagation();
254
+ $(this).blur()
255
+ }
256
+ }
257
+ ];
258
+ }
259
+
260
+ for (var el, ev, i = 0; i < this._events.length; i++) {
261
+ el = this._events[i][0];
262
+ ev = this._events[i][1];
263
+ el.on(ev);
264
+ }
265
+ },
266
+ _detachEvents: function() {
267
+ for (var el, ev, i = 0; i < this._events.length; i++) {
268
+ el = this._events[i][0];
269
+ ev = this._events[i][1];
270
+ el.off(ev);
271
+ }
272
+ this._events = [];
273
+ },
274
+
275
+ show: function(e) {
276
+ this.picker.show();
277
+ this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
278
+ this.update();
279
+ this.place();
280
+ $(window).on("resize", $.proxy(this.place, this));
281
+ if (e) {
282
+ e.stopPropagation();
283
+ e.preventDefault();
284
+ }
285
+ this.element.trigger({
286
+ type: "show",
287
+ date: this.date
288
+ });
289
+ },
290
+
291
+ hide: function(e) {
292
+ if (this.isInline) {return;}
293
+ if (!this.picker.is(":visible")) {return;}
294
+ this.picker.hide();
295
+ $(window).off("resize", this.place);
296
+ this.viewMode = this.startViewMode;
297
+ this.showMode();
298
+ if (!this.isInput) {
299
+ $(document).off("mousedown", this.hide);
300
+ }
301
+
302
+ if (
303
+ this.forceParse &&
304
+ (
305
+ this.isInput && this.element.val() ||
306
+ this.hasInput && this.element.find("input").val()
307
+ )
308
+ )
309
+ {this.setValue();}
310
+ this.element.trigger({
311
+ type: "hide",
312
+ date: this.date
313
+ });
314
+ },
315
+
316
+ remove: function() {
317
+ this._detachEvents();
318
+ this.picker.remove();
319
+ delete this.element.data().datepicker;
320
+ },
321
+
322
+ getDate: function() {
323
+ let d = this.getUTCDate();
324
+ return new Date(d.getTime() + (d.getTimezoneOffset() * 60000));
325
+ },
326
+
327
+ getUTCDate: function() {
328
+ return this.date;
329
+ },
330
+
331
+ setDate: function(d) {
332
+ this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000)));
333
+ },
334
+
335
+ setUTCDate: function(d) {
336
+ this.date = d;
337
+ this.setValue();
338
+ },
339
+
340
+ setValue: function() {
341
+ let formatted = this.getFormattedDate();
342
+ if (!this.isInput) {
343
+ if (this.component) {
344
+ this.element.find("input").val(formatted);
345
+ }
346
+ this.element.data("date", formatted);
347
+ } else {
348
+ this.element.val(formatted);
349
+ }
350
+ },
351
+
352
+ getFormattedDate: function(format) {
353
+ if (format === undefined)
354
+ {format = this.format;}
355
+ return DPGlobal.formatDate(this.date, format, this.language);
356
+ },
357
+
358
+ setStartDate: function(startDate) {
359
+ this.startDate = startDate || -Infinity;
360
+ if (this.startDate !== -Infinity) {
361
+ this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language);
362
+ }
363
+ this.update();
364
+ this.updateNavArrows();
365
+ },
366
+
367
+ setEndDate: function(endDate) {
368
+ this.endDate = endDate || Infinity;
369
+ if (this.endDate !== Infinity) {
370
+ this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language);
371
+ }
372
+ this.update();
373
+ this.updateNavArrows();
374
+ },
375
+
376
+ setDaysOfWeekDisabled: function(daysOfWeekDisabled) {
377
+ this.daysOfWeekDisabled = daysOfWeekDisabled || [];
378
+ if (!$.isArray(this.daysOfWeekDisabled)) {
379
+ this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/);
380
+ }
381
+ this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function(d) {
382
+ return parseInt(d, 10);
383
+ });
384
+ this.update();
385
+ this.updateNavArrows();
386
+ },
387
+
388
+ setDatesDisabled: function(datesDisabled) {
389
+ this.datesDisabled = datesDisabled || [];
390
+ if (!$.isArray(this.datesDisabled)) {
391
+ this.datesDisabled = this.datesDisabled.split(/,\s*/);
392
+ }
393
+ this.datesDisabled = $.map(this.datesDisabled, function(d) {
394
+ return DPGlobal.parseDate(d, this.format, this.language).valueOf();
395
+ });
396
+ this.update();
397
+ this.updateNavArrows();
398
+ },
399
+
400
+ place: function() {
401
+ if (this.isInline) {return;}
402
+ let zIndexes = [];
403
+ this.element.parents().map(function() {
404
+ if ($(this).css("z-index") != "auto") {
405
+ zIndexes.push(parseInt($(this).css("z-index")));
406
+ }
407
+ });
408
+ let zIndex = zIndexes.sort(function(a, b) { return a - b; }).pop() + 10;
409
+ let textbox = this.component ? this.component : this.element;
410
+ let offset = textbox.offset();
411
+ let height = textbox.outerHeight() + parseInt(textbox.css("margin-top"));
412
+ let width = textbox.outerWidth() + parseInt(textbox.css("margin-left"));
413
+ let fullOffsetTop = offset.top + height;
414
+ let offsetLeft = offset.left;
415
+ this.picker.removeClass("datepicker-top datepicker-bottom");
416
+ // can we show it on top?
417
+ let canShowTop = ($(window).scrollTop() < offset.top - this.picker.outerHeight());
418
+ let canShowBottom = (fullOffsetTop + this.picker.outerHeight()) < $(window).scrollTop() + $(window).height();
419
+ // If the datepicker is going to be below the window, show it on top of the input if it fits
420
+ if (!canShowBottom && canShowTop) {
421
+ fullOffsetTop = offset.top - this.picker.outerHeight();
422
+ this.picker.addClass("datepicker-top");
423
+ }
424
+ else {
425
+ // Scroll up if we cannot show it on bottom or top (for mobile devices)
426
+ if (!canShowBottom) {$(window).scrollTop(offset.top);}
427
+ this.picker.addClass("datepicker-bottom");
428
+ }
429
+
430
+ // if the datepicker is going to go past the right side of the window, we want
431
+ // to set the right position so the datepicker lines up with the textbox
432
+ if (offset.left + this.picker.width() >= $(window).width()) {
433
+ offsetLeft = (offset.left + width) - this.picker.width();
434
+ }
435
+ this.picker.css({
436
+ top: fullOffsetTop,
437
+ left: offsetLeft,
438
+ zIndex: zIndex
439
+ });
440
+ },
441
+
442
+ update: function() {
443
+ let date,
444
+ fromArgs = false;
445
+ let currentVal = this.isInput ? this.element.val() : this.element.data("date") || this.element.find("input").val();
446
+ if (arguments && arguments.length && (typeof arguments[0] === "string" || arguments[0] instanceof Date)) {
447
+ date = arguments[0];
448
+ fromArgs = true;
449
+ }
450
+ else {
451
+ date = this.isInput ? this.element.val() : this.element.data("date") || this.element.find("input").val();
452
+ }
453
+
454
+ this.date = DPGlobal.parseDate(date, this.format, this.language);
455
+
456
+ if (fromArgs) {
457
+ this.setValue();
458
+ } else if (currentVal == "") {
459
+ this.element.trigger({
460
+ type: "changeDate",
461
+ date: null
462
+ });
463
+ }
464
+
465
+ if (this.date < this.startDate) {
466
+ this.viewDate = new Date(this.startDate.valueOf());
467
+ } else if (this.date > this.endDate) {
468
+ this.viewDate = new Date(this.endDate.valueOf());
469
+ } else {
470
+ this.viewDate = new Date(this.date.valueOf());
471
+ }
472
+ this.fill();
473
+ },
474
+
475
+ fillDow: function() {
476
+ let dowCnt = this.weekStart,
477
+ html = "<tr>";
478
+ if (this.calendarWeeks) {
479
+ let cell = '<th class="cw">&nbsp;</th>';
480
+ html += cell;
481
+ this.picker.find(".datepicker-days thead tr:first-child").prepend(cell);
482
+ }
483
+ while (dowCnt < this.weekStart + 7) {
484
+ html += `<th class="dow">${dates[this.language].daysMin[(dowCnt++) % 7]}</th>`;
485
+ }
486
+ html += "</tr>";
487
+ this.picker.find(".datepicker-days thead").append(html);
488
+ },
489
+
490
+ fillMonths: function() {
491
+ let html = "",
492
+ i = 0;
493
+ while (i < 12) {
494
+ html += `<span class="month">${dates[this.language].monthsShort[i++]}</span>`;
495
+ }
496
+ this.picker.find(".datepicker-months td").html(html);
497
+ },
498
+
499
+ fill: function() {
500
+ if (this.date == null || this.viewDate == null) {
501
+ return;
502
+ }
503
+
504
+ let d = new Date(this.viewDate.valueOf()),
505
+ year = d.getUTCFullYear(),
506
+ month = d.getUTCMonth(),
507
+ dayMonth = d.getUTCDate(),
508
+ hours = d.getUTCHours(),
509
+ minutes = d.getUTCMinutes(),
510
+ startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity,
511
+ startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity,
512
+ endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity,
513
+ endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity,
514
+ currentDate = this.date && UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate()).valueOf(),
515
+ today = new Date(),
516
+ titleFormat = dates[this.language].titleFormat || dates.en.titleFormat;
517
+ // this.picker.find('.datepicker-days thead th.date-switch')
518
+ // .text(DPGlobal.formatDate(new UTCDate(year, month), titleFormat, this.language));
519
+
520
+ this.picker.find(".datepicker-days thead th:eq(1)").
521
+ text(`${dates[this.language].months[month]} ${year}`);
522
+ this.picker.find(".datepicker-hours thead th:eq(1)").
523
+ text(`${dayMonth} ${dates[this.language].months[month]} ${year}`);
524
+ this.picker.find(".datepicker-minutes thead th:eq(1)").
525
+ text(`${dayMonth} ${dates[this.language].months[month]} ${year}`);
526
+
527
+
528
+ this.picker.find("tfoot th.today").
529
+ text(dates[this.language].today).
530
+ toggle(this.todayBtn !== false);
531
+ this.updateNavArrows();
532
+ this.fillMonths();
533
+ let prevMonth = UTCDate(year, month - 1, 28, 0, 0, 0, 0),
534
+ day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
535
+ prevMonth.setUTCDate(day);
536
+ prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7) % 7);
537
+ let nextMonth = new Date(prevMonth.valueOf());
538
+ nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
539
+ nextMonth = nextMonth.valueOf();
540
+ let html = [];
541
+ let clsName;
542
+ while (prevMonth.valueOf() < nextMonth) {
543
+ if (prevMonth.getUTCDay() == this.weekStart) {
544
+ html.push("<tr>");
545
+ if (this.calendarWeeks) {
546
+ // adapted from https://github.com/timrwood/moment/blob/master/moment.js#L128
547
+ let a = new Date(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth(), prevMonth.getUTCDate() - prevMonth.getDay() + 10 - (this.weekStart && this.weekStart % 7 < 5 && 7)),
548
+ b = new Date(a.getFullYear(), 0, 4),
549
+ calWeek = ~~((a - b) / 864e5 / 7 + 1.5);
550
+ html.push(`<td class="cw">${calWeek}</td>`);
551
+ }
552
+ }
553
+ clsName = ` ${this.onRender(prevMonth)} `;
554
+ if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) {
555
+ clsName += " old";
556
+ } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) {
557
+ clsName += " new";
558
+ }
559
+ // Compare internal UTC date with local today, not UTC today
560
+ if (this.todayHighlight &&
561
+ prevMonth.getUTCFullYear() == today.getFullYear() &&
562
+ prevMonth.getUTCMonth() == today.getMonth() &&
563
+ prevMonth.getUTCDate() == today.getDate()) {
564
+ clsName += " today";
565
+ }
566
+ if (currentDate && prevMonth.valueOf() == currentDate) {
567
+ clsName += " active";
568
+ }
569
+ if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate ||
570
+ $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1 ||
571
+ $.inArray(prevMonth.valueOf(), this.datesDisabled) !== -1) {
572
+ clsName += " disabled";
573
+ }
574
+ html.push(`<td class="day${clsName}">${prevMonth.getUTCDate()}</td>`);
575
+ if (prevMonth.getUTCDay() == this.weekEnd) {
576
+ html.push("</tr>");
577
+ }
578
+ prevMonth.setUTCDate(prevMonth.getUTCDate() + 1);
579
+ }
580
+ this.picker.find(".datepicker-days tbody").empty().append(html.join(""));
581
+
582
+ html = [];
583
+ for (var i = 0; i < 24; i++) {
584
+ var actual = UTCDate(year, month, dayMonth, i);
585
+ clsName = "";
586
+ // We want the previous hour for the startDate
587
+ if ((actual.valueOf() + 3600000) < this.startDate || actual.valueOf() > this.endDate) {
588
+ clsName += " disabled";
589
+ } else if (hours == i) {
590
+ clsName += " active";
591
+ }
592
+ html.push(`<span class="hour${clsName}">${i}:00</span>`);
593
+ }
594
+ this.picker.find(".datepicker-hours td").html(html.join(""));
595
+
596
+ html = [];
597
+ for (var i = 0; i < 60; i += this.minuteStep) {
598
+ var actual = UTCDate(year, month, dayMonth, hours, i);
599
+ clsName = "";
600
+ if (actual.valueOf() < this.startDate || actual.valueOf() > this.endDate) {
601
+ clsName += " disabled";
602
+ } else if (Math.floor(minutes / this.minuteStep) == Math.floor(i / this.minuteStep)) {
603
+ clsName += " active";
604
+ }
605
+ html.push(`<span class="minute${clsName}">${hours}:${i < 10 ? `0${i}` : i}</span>`);
606
+ }
607
+ this.picker.find(".datepicker-minutes td").html(html.join(""));
608
+
609
+
610
+ let currentYear = this.date && this.date.getUTCFullYear();
611
+ let months = this.picker.find(".datepicker-months").
612
+ find("th:eq(1)").
613
+ text(year).
614
+ end().
615
+ find("span").removeClass("active");
616
+ if (currentYear && currentYear == year) {
617
+ months.eq(this.date.getUTCMonth()).addClass("active");
618
+ }
619
+ if (year < startYear || year > endYear) {
620
+ months.addClass("disabled");
621
+ }
622
+ if (year == startYear) {
623
+ months.slice(0, startMonth).addClass("disabled");
624
+ }
625
+ if (year == endYear) {
626
+ months.slice(endMonth + 1).addClass("disabled");
627
+ }
628
+
629
+ html = "";
630
+ year = parseInt(year / 10, 10) * 10;
631
+ let yearCont = this.picker.find(".datepicker-years").
632
+ find("th:eq(1)").
633
+ text(`${year}-${year + 9}`).
634
+ end().
635
+ find("td");
636
+ year -= 1;
637
+ for (var i = -1; i < 11; i++) {
638
+ html += `<span class="year${i == -1 || i == 10 ? " old" : ""}${currentYear == year ? " active" : ""}${year < startYear || year > endYear ? " disabled" : ""}">${year}</span>`;
639
+ year += 1;
640
+ }
641
+ yearCont.html(html);
642
+ },
643
+
644
+ updateNavArrows: function() {
645
+ let d = new Date(this.viewDate),
646
+ year = d.getUTCFullYear(),
647
+ month = d.getUTCMonth(),
648
+ day = d.getUTCDate(),
649
+ hour = d.getUTCHours();
650
+ switch (this.viewMode) {
651
+ case 0:
652
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth() && day <= this.startDate.getUTCDate() && hour <= this.startDate.getUTCHours()) {
653
+ this.picker.find(".prev").css({
654
+ visibility: "hidden"
655
+ });
656
+ } else {
657
+ this.picker.find(".prev").css({
658
+ visibility: "visible"
659
+ });
660
+ }
661
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth() && day >= this.endDate.getUTCDate() && hour >= this.endDate.getUTCHours()) {
662
+ this.picker.find(".next").css({
663
+ visibility: "hidden"
664
+ });
665
+ } else {
666
+ this.picker.find(".next").css({
667
+ visibility: "visible"
668
+ });
669
+ }
670
+ break;
671
+ case 1:
672
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth() && day <= this.startDate.getUTCDate()) {
673
+ this.picker.find(".prev").css({
674
+ visibility: "hidden"
675
+ });
676
+ } else {
677
+ this.picker.find(".prev").css({
678
+ visibility: "visible"
679
+ });
680
+ }
681
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth() && day >= this.endDate.getUTCDate()) {
682
+ this.picker.find(".next").css({
683
+ visibility: "hidden"
684
+ });
685
+ } else {
686
+ this.picker.find(".next").css({
687
+ visibility: "visible"
688
+ });
689
+ }
690
+ break;
691
+ case 2:
692
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth()) {
693
+ this.picker.find(".prev").css({
694
+ visibility: "hidden"
695
+ });
696
+ } else {
697
+ this.picker.find(".prev").css({
698
+ visibility: "visible"
699
+ });
700
+ }
701
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth()) {
702
+ this.picker.find(".next").css({
703
+ visibility: "hidden"
704
+ });
705
+ } else {
706
+ this.picker.find(".next").css({
707
+ visibility: "visible"
708
+ });
709
+ }
710
+ break;
711
+ case 3:
712
+ case 4:
713
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) {
714
+ this.picker.find(".prev").css({
715
+ visibility: "hidden"
716
+ });
717
+ } else {
718
+ this.picker.find(".prev").css({
719
+ visibility: "visible"
720
+ });
721
+ }
722
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()) {
723
+ this.picker.find(".next").css({
724
+ visibility: "hidden"
725
+ });
726
+ } else {
727
+ this.picker.find(".next").css({
728
+ visibility: "visible"
729
+ });
730
+ }
731
+ break;
732
+ }
733
+ },
734
+
735
+ click: function(e) {
736
+ e.stopPropagation();
737
+ e.preventDefault();
738
+
739
+ if ($(e.target).hasClass("datepicker-close") || $(e.target).parent().hasClass("datepicker-close")) {
740
+ this.hide();
741
+ }
742
+
743
+ let target = $(e.target).closest("span, td, th");
744
+ if (target.length == 1) {
745
+ if (target.is(".disabled")) {
746
+ this.element.trigger({
747
+ type: "outOfRange",
748
+ date: this.viewDate,
749
+ startDate: this.startDate,
750
+ endDate: this.endDate
751
+ });
752
+ return;
753
+ }
754
+
755
+ switch (target[0].nodeName.toLowerCase()) {
756
+ case "th":
757
+ switch (target[0].className) {
758
+ case "date-switch":
759
+ this.showMode(1);
760
+ break;
761
+ case "prev":
762
+ case "next":
763
+ var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == "prev" ? -1 : 1);
764
+ switch (this.viewMode) {
765
+ case 0:
766
+ this.viewDate = this.moveHour(this.viewDate, dir);
767
+ break;
768
+ case 1:
769
+ this.viewDate = this.moveDate(this.viewDate, dir);
770
+ break;
771
+ case 2:
772
+ this.viewDate = this.moveMonth(this.viewDate, dir);
773
+ break;
774
+ case 3:
775
+ case 4:
776
+ this.viewDate = this.moveYear(this.viewDate, dir);
777
+ break;
778
+ }
779
+ this.fill();
780
+ break;
781
+ case "today":
782
+ var date = new Date();
783
+ date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
784
+
785
+ this.viewMode = this.startViewMode;
786
+ this.showMode(0);
787
+ this._setDate(date);
788
+ break;
789
+ }
790
+ break;
791
+ case "span":
792
+ if (!target.is(".disabled")) {
793
+ if (target.is(".month")) {
794
+ if (this.minView === 3) {
795
+ var month = target.parent().find("span").index(target) || 0;
796
+ var year = this.viewDate.getUTCFullYear(),
797
+ day = 1,
798
+ hours = this.viewDate.getUTCHours(),
799
+ minutes = this.viewDate.getUTCMinutes(),
800
+ seconds = this.viewDate.getUTCSeconds();
801
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
802
+ } else {
803
+ this.viewDate.setUTCDate(1);
804
+ var month = target.parent().find("span").index(target);
805
+ this.viewDate.setUTCMonth(month);
806
+ this.element.trigger({
807
+ type: "changeMonth",
808
+ date: this.viewDate
809
+ });
810
+ }
811
+ } else if (target.is(".year")) {
812
+ if (this.minView === 4) {
813
+ var year = parseInt(target.text(), 10) || 0;
814
+ var month = 0,
815
+ day = 1,
816
+ hours = this.viewDate.getUTCHours(),
817
+ minutes = this.viewDate.getUTCMinutes(),
818
+ seconds = this.viewDate.getUTCSeconds();
819
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
820
+ } else {
821
+ this.viewDate.setUTCDate(1);
822
+ var year = parseInt(target.text(), 10) || 0;
823
+ this.viewDate.setUTCFullYear(year);
824
+ this.element.trigger({
825
+ type: "changeYear",
826
+ date: this.viewDate
827
+ });
828
+ }
829
+ } else if (target.is(".hour")) {
830
+ var hours = parseInt(target.text(), 10) || 0;
831
+ var year = this.viewDate.getUTCFullYear(),
832
+ month = this.viewDate.getUTCMonth(),
833
+ day = this.viewDate.getUTCDate(),
834
+ minutes = this.viewDate.getUTCMinutes(),
835
+ seconds = this.viewDate.getUTCSeconds();
836
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
837
+ } else if (target.is(".minute")) {
838
+ var minutes = parseInt(target.text().substr(target.text().indexOf(":") + 1), 10) || 0;
839
+ var year = this.viewDate.getUTCFullYear(),
840
+ month = this.viewDate.getUTCMonth(),
841
+ day = this.viewDate.getUTCDate(),
842
+ hours = this.viewDate.getUTCHours(),
843
+ seconds = this.viewDate.getUTCSeconds();
844
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
845
+ }
846
+
847
+
848
+ if (this.viewMode != 0) {
849
+
850
+
851
+ var oldViewMode = this.viewMode;
852
+ this.showMode(-1);
853
+ this.fill();
854
+ if (oldViewMode == this.viewMode && this.autoclose) {
855
+ this.hide();
856
+ }
857
+ } else {
858
+ this.fill();
859
+ if (this.autoclose) {
860
+ this.hide();
861
+ }
862
+ }
863
+ }
864
+ break;
865
+ case "td":
866
+
867
+
868
+ if (target.is(".day") && !target.is(".disabled")) {
869
+ var day = parseInt(target.text(), 10) || 1;
870
+ var year = this.viewDate.getUTCFullYear(),
871
+ month = this.viewDate.getUTCMonth(),
872
+ hours = this.viewDate.getUTCHours(),
873
+ minutes = this.viewDate.getUTCMinutes(),
874
+ seconds = this.viewDate.getUTCSeconds();
875
+ if (target.is(".old")) {
876
+ if (month === 0) {
877
+ month = 11;
878
+ year -= 1;
879
+ } else {
880
+ month -= 1;
881
+ }
882
+ } else if (target.is(".new")) {
883
+ if (month == 11) {
884
+ month = 0;
885
+ year += 1;
886
+ } else {
887
+ month += 1;
888
+ }
889
+ }
890
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
891
+ }
892
+
893
+
894
+ var oldViewMode = this.viewMode;
895
+
896
+
897
+ this.showMode(-1);
898
+
899
+
900
+ this.fill();
901
+ if (oldViewMode == this.viewMode && this.autoclose) {
902
+ this.hide();
903
+ }
904
+ break;
905
+ }
906
+ }
907
+ },
908
+
909
+ _setDate: function(date, which) {
910
+
911
+ if (!which || which == "date")
912
+ {this.date = date;}
913
+ if (!which || which == "view")
914
+ {this.viewDate = date;}
915
+ this.fill();
916
+ this.setValue();
917
+ this.element.trigger({
918
+ type: "changeDate",
919
+ date: this.date
920
+ });
921
+ let element;
922
+ if (this.isInput) {
923
+ element = this.element;
924
+ } else if (this.component) {
925
+ element = this.element.find("input");
926
+ }
927
+ if (element) {
928
+ element.change();
929
+ if (this.autoclose && (!which || which == "date")) {
930
+ // this.hide();
931
+ }
932
+ }
933
+ },
934
+
935
+ moveHour: function(date, dir) {
936
+ if (!dir) {return date;}
937
+ let new_date = new Date(date.valueOf());
938
+ dir = dir > 0 ? 1 : -1;
939
+ new_date.setUTCHours(new_date.getUTCHours() + dir);
940
+ return new_date;
941
+ },
942
+
943
+ moveDate: function(date, dir) {
944
+ if (!dir) {return date;}
945
+ let new_date = new Date(date.valueOf());
946
+ dir = dir > 0 ? 1 : -1;
947
+ new_date.setUTCDate(new_date.getUTCDate() + dir);
948
+ return new_date;
949
+ },
950
+
951
+ moveMonth: function(date, dir) {
952
+ if (!dir) {return date;}
953
+ let new_date = new Date(date.valueOf()),
954
+ day = new_date.getUTCDate(),
955
+ month = new_date.getUTCMonth(),
956
+ mag = Math.abs(dir),
957
+ new_month, test;
958
+ dir = dir > 0 ? 1 : -1;
959
+ if (mag == 1) {
960
+ test = dir == -1
961
+ // If going back one month, make sure month is not current month
962
+ // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
963
+ ? function() {
964
+ return new_date.getUTCMonth() == month;
965
+ }
966
+ // If going forward one month, make sure month is as expected
967
+ // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
968
+ : function() {
969
+ return new_date.getUTCMonth() != new_month;
970
+ };
971
+ new_month = month + dir;
972
+ new_date.setUTCMonth(new_month);
973
+ // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
974
+ if (new_month < 0 || new_month > 11)
975
+ {new_month = (new_month + 12) % 12;}
976
+ } else {
977
+ // For magnitudes >1, move one month at a time...
978
+ for (let i = 0; i < mag; i++)
979
+ // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
980
+ {new_date = this.moveMonth(new_date, dir);}
981
+ // ...then reset the day, keeping it in the new month
982
+ new_month = new_date.getUTCMonth();
983
+ new_date.setUTCDate(day);
984
+ test = function() {
985
+ return new_month != new_date.getUTCMonth();
986
+ };
987
+ }
988
+ // Common date-resetting loop -- if date is beyond end of month, make it
989
+ // end of month
990
+ while (test()) {
991
+ new_date.setUTCDate(--day);
992
+ new_date.setUTCMonth(new_month);
993
+ }
994
+ return new_date;
995
+ },
996
+
997
+ moveYear: function(date, dir) {
998
+ return this.moveMonth(date, dir * 12);
999
+ },
1000
+
1001
+ dateWithinRange: function(date) {
1002
+ return date >= this.startDate && date <= this.endDate;
1003
+ },
1004
+
1005
+ keydown: function(e) {
1006
+ if (!this.keyboardNavigation) {
1007
+ return true;
1008
+ }
1009
+ if (this.picker.is(":not(:visible)")) {
1010
+ if (e.keyCode == 27) // allow escape to hide and re-show picker
1011
+ {this.show();}
1012
+ return;
1013
+ }
1014
+ let dateChanged = false,
1015
+ day, dir, month,
1016
+ newDate, newViewDate;
1017
+ switch (e.keyCode) {
1018
+ case 27: // escape
1019
+ this.hide();
1020
+ e.preventDefault();
1021
+ break;
1022
+ case 37: // left
1023
+ case 39: // right
1024
+ if (!this.keyboardNavigation) {break;}
1025
+ dir = e.keyCode == 37 ? -1 : 1;
1026
+ if (e.ctrlKey) {
1027
+ newDate = this.moveYear(this.date, dir);
1028
+ newViewDate = this.moveYear(this.viewDate, dir);
1029
+ } else if (e.shiftKey) {
1030
+ newDate = this.moveMonth(this.date, dir);
1031
+ newViewDate = this.moveMonth(this.viewDate, dir);
1032
+ } else {
1033
+ newDate = new Date(this.date.valueOf());
1034
+ newDate.setUTCDate(this.date.getUTCDate() + dir);
1035
+ newViewDate = new Date(this.viewDate.valueOf());
1036
+ newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir);
1037
+ }
1038
+ if (this.dateWithinRange(newDate)) {
1039
+ this.date = newDate;
1040
+ this.viewDate = newViewDate;
1041
+ this.setValue();
1042
+ this.update();
1043
+ e.preventDefault();
1044
+ dateChanged = true;
1045
+ }
1046
+ break;
1047
+ case 38: // up
1048
+ case 40: // down
1049
+ if (!this.keyboardNavigation) {break;}
1050
+ dir = e.keyCode == 38 ? -1 : 1;
1051
+ if (e.ctrlKey) {
1052
+ newDate = this.moveYear(this.date, dir);
1053
+ newViewDate = this.moveYear(this.viewDate, dir);
1054
+ } else if (e.shiftKey) {
1055
+ newDate = this.moveMonth(this.date, dir);
1056
+ newViewDate = this.moveMonth(this.viewDate, dir);
1057
+ } else {
1058
+ newDate = new Date(this.date.valueOf());
1059
+ newDate.setUTCDate(this.date.getUTCDate() + dir * 7);
1060
+ newViewDate = new Date(this.viewDate.valueOf());
1061
+ newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir * 7);
1062
+ }
1063
+ if (this.dateWithinRange(newDate)) {
1064
+ this.date = newDate;
1065
+ this.viewDate = newViewDate;
1066
+ this.setValue();
1067
+ this.update();
1068
+ e.preventDefault();
1069
+ dateChanged = true;
1070
+ }
1071
+ break;
1072
+ case 13: // enter
1073
+ this.hide();
1074
+ e.preventDefault();
1075
+ break;
1076
+ case 9: // tab
1077
+ this.hide();
1078
+ break;
1079
+ }
1080
+ if (dateChanged) {
1081
+ this.element.trigger({
1082
+ type: "changeDate",
1083
+ date: this.date
1084
+ });
1085
+ let element;
1086
+ if (this.isInput) {
1087
+ element = this.element;
1088
+ } else if (this.component) {
1089
+ element = this.element.find("input");
1090
+ }
1091
+ if (element) {
1092
+ element.change();
1093
+ }
1094
+ }
1095
+ },
1096
+
1097
+ showMode: function(dir) {
1098
+
1099
+ if (dir) {
1100
+ let newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir));
1101
+ if (newViewMode >= this.minView && newViewMode <= this.maxView) {
1102
+ this.viewMode = newViewMode;
1103
+ }
1104
+ }
1105
+
1106
+ /*
1107
+ vitalets: fixing bug of very special conditions:
1108
+ jquery 1.7.1 + webkit + show inline datepicker in bootstrap popover.
1109
+ Method show() does not set display css correctly and datepicker is not shown.
1110
+ Changed to .css('display', 'block') solve the problem.
1111
+ See https://github.com/vitalets/x-editable/issues/37
1112
+
1113
+ In jquery 1.7.2+ everything works fine.
1114
+ */
1115
+ // this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
1116
+ this.picker.find(">div").hide().filter(`.datepicker-${DPGlobal.modes[this.viewMode].clsName}`).css("display", "block");
1117
+ this.updateNavArrows();
1118
+ },
1119
+
1120
+ changeViewDate: function(date) {
1121
+ this.date = date;
1122
+ this.viewDate = date;
1123
+ this.fill();
1124
+ },
1125
+
1126
+ reset: function(e) {
1127
+ this._setDate(null, "date");
1128
+ }
1129
+ };
1130
+
1131
+ $.fn.fdatepicker = function(option) {
1132
+ let args = Array(...arguments);
1133
+ args.shift();
1134
+ return this.each(function() {
1135
+ let $this = $(this),
1136
+ data = $this.data("datepicker"),
1137
+ options = typeof option === "object" && option;
1138
+ if (!data) {
1139
+ $this.data("datepicker", (data = new Datepicker(this, $.extend({}, $.fn.fdatepicker.defaults, options))));
1140
+ }
1141
+ if (typeof option === "string" && typeof data[option] === "function") {
1142
+ data[option](...args);
1143
+ }
1144
+ });
1145
+ };
1146
+
1147
+ $.fn.fdatepicker.defaults = {
1148
+ onRender: function(date) {
1149
+ return "";
1150
+ }
1151
+ };
1152
+ $.fn.fdatepicker.Constructor = Datepicker;
1153
+ var dates = $.fn.fdatepicker.dates = {
1154
+ "en": {
1155
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
1156
+ daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
1157
+ daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
1158
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
1159
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
1160
+ today: "Today",
1161
+ titleFormat: "MM yyyy"
1162
+ }
1163
+ };
1164
+
1165
+ var DPGlobal = {
1166
+ modes: [{
1167
+ clsName: "minutes",
1168
+ navFnc: "Hours",
1169
+ navStep: 1
1170
+ }, {
1171
+ clsName: "hours",
1172
+ navFnc: "Date",
1173
+ navStep: 1
1174
+ }, {
1175
+ clsName: "days",
1176
+ navFnc: "Month",
1177
+ navStep: 1
1178
+ }, {
1179
+ clsName: "months",
1180
+ navFnc: "FullYear",
1181
+ navStep: 1
1182
+ }, {
1183
+ clsName: "years",
1184
+ navFnc: "FullYear",
1185
+ navStep: 10
1186
+ }],
1187
+ isLeapYear: function(year) {
1188
+ return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
1189
+ },
1190
+ getDaysInMonth: function(year, month) {
1191
+ return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
1192
+ },
1193
+ validParts: /hh?|ii?|ss?|dd?|mm?|MM?|yy(?:yy)?/g,
1194
+ nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,
1195
+ parseFormat: function(format) {
1196
+ // IE treats \0 as a string end in inputs (truncating the value),
1197
+ // so it's a bad format delimiter, anyway
1198
+ let separators = format.replace(this.validParts, "\0").split("\0"),
1199
+ parts = format.match(this.validParts);
1200
+ if (!separators || !separators.length || !parts || parts.length === 0) {
1201
+ throw new Error("Invalid date format.");
1202
+ }
1203
+ this.formatText = format;
1204
+ return {
1205
+ separators: separators,
1206
+ parts: parts
1207
+ };
1208
+ },
1209
+ parseDate: function(date, format, language) {
1210
+ if (date instanceof Date) {return new Date(date.valueOf() - date.getTimezoneOffset() * 60000);}
1211
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) {
1212
+ format = this.parseFormat("yyyy-mm-dd");
1213
+ }
1214
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) {
1215
+ format = this.parseFormat("yyyy-mm-dd hh:ii");
1216
+ }
1217
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) {
1218
+ format = this.parseFormat("yyyy-mm-dd hh:ii:ss");
1219
+ }
1220
+ if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) {
1221
+ var part_re = /([-+]\d+)([dmwy])/,
1222
+ parts = date.match(/([-+]\d+)([dmwy])/g),
1223
+ part, dir;
1224
+ date = new Date();
1225
+ for (var i = 0; i < parts.length; i++) {
1226
+ part = part_re.exec(parts[i]);
1227
+ dir = parseInt(part[1]);
1228
+ switch (part[2]) {
1229
+ case "d":
1230
+ date.setUTCDate(date.getUTCDate() + dir);
1231
+ break;
1232
+ case "m":
1233
+ date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir);
1234
+ break;
1235
+ case "w":
1236
+ date.setUTCDate(date.getUTCDate() + dir * 7);
1237
+ break;
1238
+ case "y":
1239
+ date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir);
1240
+ break;
1241
+ }
1242
+ }
1243
+ return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
1244
+ }
1245
+ var parts = date && date.match(this.nonpunctuation) || [],
1246
+ date = new Date(),
1247
+ parsed = {},
1248
+ setters_order = ["hh", "h", "ii", "i", "ss", "s", "yyyy", "yy", "M", "MM", "m", "mm", "d", "dd"],
1249
+ setters_map = {
1250
+ hh: function(d, v) {
1251
+ return d.setUTCHours(v);
1252
+ },
1253
+ h: function(d, v) {
1254
+ return d.setUTCHours(v);
1255
+ },
1256
+ ii: function(d, v) {
1257
+ return d.setUTCMinutes(v);
1258
+ },
1259
+ i: function(d, v) {
1260
+ return d.setUTCMinutes(v);
1261
+ },
1262
+ ss: function(d, v) {
1263
+ return d.setUTCSeconds(v);
1264
+ },
1265
+ s: function(d, v) {
1266
+ return d.setUTCSeconds(v);
1267
+ },
1268
+ yyyy: function(d, v) {
1269
+ return d.setUTCFullYear(v);
1270
+ },
1271
+ yy: function(d, v) {
1272
+ return d.setUTCFullYear(2000 + v);
1273
+ },
1274
+ m: function(d, v) {
1275
+ v -= 1;
1276
+ while (v < 0) {v += 12;}
1277
+ v %= 12;
1278
+ d.setUTCMonth(v);
1279
+ while (d.getUTCMonth() != v)
1280
+ {d.setUTCDate(d.getUTCDate() - 1);}
1281
+ return d;
1282
+ },
1283
+ d: function(d, v) {
1284
+ return d.setUTCDate(v);
1285
+ }
1286
+ },
1287
+ val, filtered, part;
1288
+ setters_map.M = setters_map.MM = setters_map.mm = setters_map.m;
1289
+ setters_map.dd = setters_map.d;
1290
+ date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); // date.getHours(), date.getMinutes(), date.getSeconds());
1291
+ if (parts.length == format.parts.length) {
1292
+ for (var i = 0, cnt = format.parts.length; i < cnt; i++) {
1293
+ val = parseInt(parts[i], 10);
1294
+ part = format.parts[i];
1295
+ if (isNaN(val)) {
1296
+ switch (part) {
1297
+ case "MM":
1298
+ filtered = $(dates[language].months).filter(function() {
1299
+ let m = this.slice(0, parts[i].length),
1300
+ p = parts[i].slice(0, m.length);
1301
+ return m == p;
1302
+ });
1303
+ val = $.inArray(filtered[0], dates[language].months) + 1;
1304
+ break;
1305
+ case "M":
1306
+ filtered = $(dates[language].monthsShort).filter(function() {
1307
+ let m = this.slice(0, parts[i].length),
1308
+ p = parts[i].slice(0, m.length);
1309
+ return m == p;
1310
+ });
1311
+ val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
1312
+ break;
1313
+ }
1314
+ }
1315
+ parsed[part] = val;
1316
+ }
1317
+ for (var i = 0, s; i < setters_order.length; i++) {
1318
+ s = setters_order[i];
1319
+ if (s in parsed && !isNaN(parsed[s]))
1320
+ {setters_map[s](date, parsed[s])}
1321
+ }
1322
+ }
1323
+ return date;
1324
+ },
1325
+ formatDate: function(date, format, language) {
1326
+ if (date == null) {
1327
+ return "";
1328
+ }
1329
+ let val = {
1330
+ h: date.getUTCHours(),
1331
+ i: date.getUTCMinutes(),
1332
+ s: date.getUTCSeconds(),
1333
+ d: date.getUTCDate(),
1334
+ m: date.getUTCMonth() + 1,
1335
+ M: dates[language].monthsShort[date.getUTCMonth()],
1336
+ MM: dates[language].months[date.getUTCMonth()],
1337
+ yy: date.getUTCFullYear().toString().substring(2),
1338
+ yyyy: date.getUTCFullYear()
1339
+ };
1340
+ val.hh = (val.h < 10 ? "0" : "") + val.h;
1341
+ val.ii = (val.i < 10 ? "0" : "") + val.i;
1342
+ val.ss = (val.s < 10 ? "0" : "") + val.s;
1343
+ val.dd = (val.d < 10 ? "0" : "") + val.d;
1344
+ val.mm = (val.m < 10 ? "0" : "") + val.m;
1345
+ var date = [],
1346
+ seps = $.extend([], format.separators);
1347
+ for (let i = 0, cnt = format.parts.length; i < cnt; i++) {
1348
+ if (seps.length)
1349
+ {date.push(seps.shift())}
1350
+ date.push(val[format.parts[i]]);
1351
+ }
1352
+ return date.join("");
1353
+ },
1354
+ convertViewMode: function(viewMode) {
1355
+ switch (viewMode) {
1356
+ case 4:
1357
+ case "decade":
1358
+ viewMode = 4;
1359
+ break;
1360
+ case 3:
1361
+ case "year":
1362
+ viewMode = 3;
1363
+ break;
1364
+ case 2:
1365
+ case "month":
1366
+ viewMode = 2;
1367
+ break;
1368
+ case 1:
1369
+ case "day":
1370
+ viewMode = 1;
1371
+ break;
1372
+ case 0:
1373
+ case "hour":
1374
+ viewMode = 0;
1375
+ break;
1376
+ }
1377
+
1378
+ return viewMode;
1379
+ },
1380
+ headTemplate: function(leftArrow, rightArrow) {return (`${"<thead>" +
1381
+ "<tr>" +
1382
+ '<th class="prev">'}${leftArrow}</th>` +
1383
+ "<th colspan=\"5\" class=\"date-switch\"></th>" +
1384
+ `<th class="next">${rightArrow}</th>` +
1385
+ "</tr>" +
1386
+ "</thead>")},
1387
+ contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
1388
+ footTemplate: '<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'
1389
+ };
1390
+ DPGlobal.template = function(leftArrow, rightArrow, closeIcon) {return (`${'<div class="datepicker">' +
1391
+ '<div class="datepicker-minutes">' +
1392
+ '<table class=" table-condensed">'}${
1393
+ DPGlobal.headTemplate(leftArrow, rightArrow)
1394
+ }${DPGlobal.contTemplate
1395
+ }${DPGlobal.footTemplate
1396
+ }</table>` +
1397
+ "</div>" +
1398
+ "<div class=\"datepicker-hours\">" +
1399
+ `<table class=" table-condensed">${
1400
+ DPGlobal.headTemplate(leftArrow, rightArrow)
1401
+ }${DPGlobal.contTemplate
1402
+ }${DPGlobal.footTemplate
1403
+ }</table>` +
1404
+ "</div>" +
1405
+ "<div class=\"datepicker-days\">" +
1406
+ `<table class=" table-condensed">${
1407
+ DPGlobal.headTemplate(leftArrow, rightArrow)
1408
+ }<tbody></tbody>${
1409
+ DPGlobal.footTemplate
1410
+ }</table>` +
1411
+ "</div>" +
1412
+ "<div class=\"datepicker-months\">" +
1413
+ `<table class="table-condensed">${
1414
+ DPGlobal.headTemplate(leftArrow, rightArrow)
1415
+ }${DPGlobal.contTemplate
1416
+ }${DPGlobal.footTemplate
1417
+ }</table>` +
1418
+ "</div>" +
1419
+ "<div class=\"datepicker-years\">" +
1420
+ `<table class="table-condensed">${
1421
+ DPGlobal.headTemplate(leftArrow, rightArrow)
1422
+ }${DPGlobal.contTemplate
1423
+ }${DPGlobal.footTemplate
1424
+ }</table>` +
1425
+ "</div>" +
1426
+ `<a class="button datepicker-close tiny alert right" style="width:auto;">${closeIcon}</a>` +
1427
+ "</div>")};
1428
+
1429
+ $.fn.fdatepicker.DPGlobal = DPGlobal;
1430
+
1431
+ }(window.jQuery));