binda 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +850 -18
  3. data/Rakefile +1 -13
  4. data/app/assets/javascripts/binda/application.js +23 -0
  5. data/app/assets/javascripts/binda/components/bootstrap.js +9 -0
  6. data/app/assets/javascripts/binda/components/field_group_editor.js +18 -0
  7. data/app/assets/javascripts/binda/components/fileupload.js +182 -0
  8. data/app/assets/javascripts/binda/components/form_item.js +91 -23
  9. data/app/assets/javascripts/binda/components/form_item_choice.js +15 -8
  10. data/app/assets/javascripts/binda/components/form_item_editor.js +6 -6
  11. data/app/assets/javascripts/binda/components/form_item_image.js +23 -0
  12. data/app/assets/javascripts/binda/components/form_item_repeater.js +70 -23
  13. data/app/assets/javascripts/binda/components/login-shader.js +193 -0
  14. data/app/assets/javascripts/binda/components/login_form.js +116 -0
  15. data/app/assets/javascripts/binda/components/radio-toggle.js +18 -0
  16. data/app/assets/javascripts/binda/components/select2.js +22 -0
  17. data/app/assets/javascripts/binda/components/sortable.js +53 -8
  18. data/app/assets/javascripts/binda/dist/binda.bundle.js +914 -107
  19. data/app/assets/javascripts/binda/index.js +26 -3
  20. data/app/assets/stylesheets/binda/application.scss +6 -0
  21. data/app/assets/stylesheets/binda/components/assets_manager.scss +46 -36
  22. data/app/assets/stylesheets/binda/components/b-btn.scss +114 -0
  23. data/app/assets/stylesheets/binda/components/button.scss +4 -1
  24. data/app/assets/stylesheets/binda/components/fileupload.scss +134 -0
  25. data/app/assets/stylesheets/binda/components/form_item.scss +233 -168
  26. data/app/assets/stylesheets/binda/components/form_item_image.scss +0 -0
  27. data/app/assets/stylesheets/binda/components/form_item_video.scss +25 -0
  28. data/app/assets/stylesheets/binda/components/main_container.scss +3 -0
  29. data/app/assets/stylesheets/binda/components/main_content.scss +1 -2
  30. data/app/assets/stylesheets/binda/components/main_header.scss +21 -20
  31. data/app/assets/stylesheets/binda/components/main_sidebar.scss +121 -0
  32. data/app/assets/stylesheets/binda/components/main_table.scss +84 -28
  33. data/app/assets/stylesheets/binda/components/popup_warning.scss +71 -0
  34. data/app/assets/stylesheets/binda/components/select2.scss +126 -0
  35. data/app/assets/stylesheets/binda/components/sortable.scss +83 -56
  36. data/app/assets/stylesheets/binda/components/standard-form.scss +228 -0
  37. data/app/assets/stylesheets/binda/components/texts.scss +6 -0
  38. data/app/assets/stylesheets/binda/controllers/components_index.scss +3 -0
  39. data/app/assets/stylesheets/binda/controllers/users_sessions_new.scss +309 -0
  40. data/app/assets/stylesheets/binda/index.scss +16 -8
  41. data/app/assets/stylesheets/binda/settings/bootstrap_overrides.scss +0 -0
  42. data/app/assets/stylesheets/binda/settings/buttons.scss +36 -0
  43. data/app/assets/stylesheets/binda/settings/common.scss +36 -79
  44. data/app/assets/stylesheets/binda/settings/fonts.scss +88 -31
  45. data/app/assets/stylesheets/binda/settings/tiny_mce_overrides.scss +82 -0
  46. data/app/assets/stylesheets/binda/settings/variables.scss +36 -31
  47. data/app/controllers/binda/application_controller.rb +0 -2
  48. data/app/controllers/binda/assets_controller.rb +1 -1
  49. data/app/controllers/binda/boards_controller.rb +15 -4
  50. data/app/controllers/binda/components_controller.rb +30 -15
  51. data/app/controllers/binda/field_groups_controller.rb +19 -4
  52. data/app/controllers/binda/images_controller.rb +68 -0
  53. data/app/controllers/binda/repeaters_controller.rb +3 -12
  54. data/app/controllers/binda/structures_controller.rb +8 -1
  55. data/app/controllers/binda/videos_controller.rb +68 -0
  56. data/app/controllers/concerns/binda/fieldable_helpers.rb +113 -28
  57. data/app/controllers/concerns/binda/maintenance_helpers.rb +34 -0
  58. data/app/helpers/binda/components_helper.rb +26 -2
  59. data/app/helpers/binda/field_groups_helper.rb +16 -0
  60. data/app/helpers/binda/structures_helper.rb +6 -0
  61. data/app/models/binda/asset.rb +0 -4
  62. data/app/models/binda/b.rb +5 -0
  63. data/app/models/binda/board.rb +1 -18
  64. data/app/models/binda/choice.rb +48 -12
  65. data/app/models/binda/component.rb +20 -0
  66. data/app/models/binda/field_group.rb +2 -2
  67. data/app/models/binda/field_setting.rb +61 -28
  68. data/app/models/binda/gallery.rb +0 -2
  69. data/app/models/binda/image.rb +7 -0
  70. data/app/models/binda/relation.rb +79 -0
  71. data/app/models/binda/relation_link.rb +11 -0
  72. data/app/models/binda/repeater.rb +1 -1
  73. data/app/models/binda/selection.rb +0 -9
  74. data/app/models/binda/structure.rb +41 -39
  75. data/app/models/binda/video.rb +7 -0
  76. data/app/models/concerns/binda/default_helpers.rb +186 -0
  77. data/app/models/concerns/binda/fieldable_associations.rb +276 -30
  78. data/app/uploaders/binda/{asset → image}/image_uploader.rb +27 -9
  79. data/app/uploaders/binda/video/video_uploader.rb +51 -0
  80. data/app/views/binda/boards/edit.html.erb +6 -1
  81. data/app/views/binda/categories/_form.html.erb +41 -40
  82. data/app/views/binda/categories/edit.html.erb +1 -1
  83. data/app/views/binda/categories/index.html.erb +16 -13
  84. data/app/views/binda/components/edit.html.erb +6 -3
  85. data/app/views/binda/components/index.html.erb +69 -28
  86. data/app/views/binda/components/new.html.erb +1 -1
  87. data/app/views/binda/components/sort_index.html.erb +46 -0
  88. data/app/views/binda/field_groups/_form_body.html.erb +65 -44
  89. data/app/views/binda/field_groups/_form_item.html.erb +66 -23
  90. data/app/views/binda/field_groups/_form_item_choice.erb +34 -15
  91. data/app/views/binda/field_groups/_form_section.html.erb +6 -10
  92. data/app/views/binda/field_groups/_form_section_repeater.html.erb +3 -3
  93. data/app/views/binda/field_groups/edit.html.erb +1 -1
  94. data/app/views/binda/field_settings/_form_body.html.erb +5 -5
  95. data/app/views/binda/field_settings/edit.html.erb +1 -1
  96. data/app/views/binda/fieldable/_form_body.html.erb +93 -79
  97. data/app/views/binda/fieldable/_form_item_date.html.erb +14 -14
  98. data/app/views/binda/fieldable/_form_item_image.html.erb +35 -0
  99. data/app/views/binda/fieldable/_form_item_new_repeater.html.erb +12 -5
  100. data/app/views/binda/fieldable/_form_item_relation.html.erb +44 -0
  101. data/app/views/binda/fieldable/_form_item_repeater.html.erb +80 -58
  102. data/app/views/binda/fieldable/_form_item_selections.html.erb +109 -87
  103. data/app/views/binda/fieldable/_form_item_string.html.erb +19 -17
  104. data/app/views/binda/fieldable/_form_item_text.html.erb +19 -16
  105. data/app/views/binda/fieldable/_form_item_video.html.erb +32 -0
  106. data/app/views/binda/fieldable/_form_section.html.erb +27 -5
  107. data/app/views/binda/fieldable/_form_section_repeater.html.erb +30 -10
  108. data/app/views/binda/fieldable/_form_sidebar.html.erb +44 -20
  109. data/app/views/binda/manage/users/_form_body.html.erb +42 -37
  110. data/app/views/binda/manage/users/edit.html.erb +1 -1
  111. data/app/views/binda/manage/users/index.html.erb +21 -21
  112. data/app/views/binda/structures/_form_body.html.erb +54 -60
  113. data/app/views/binda/structures/_form_section.html.erb +32 -18
  114. data/app/views/binda/structures/_form_sidebar.html.erb +35 -0
  115. data/app/views/binda/structures/edit.html.erb +2 -2
  116. data/app/views/binda/structures/index.html.erb +21 -16
  117. data/app/views/binda/structures/sort_index.html.erb +36 -0
  118. data/app/views/{users → binda/users}/confirmations/new.html.erb +1 -1
  119. data/app/views/{users → binda/users}/mailer/confirmation_instructions.html.erb +0 -0
  120. data/app/views/{users → binda/users}/mailer/password_change.html.erb +0 -0
  121. data/app/views/{users → binda/users}/mailer/reset_password_instructions.html.erb +0 -0
  122. data/app/views/{users → binda/users}/mailer/unlock_instructions.html.erb +0 -0
  123. data/app/views/{users → binda/users}/passwords/edit.html.erb +1 -1
  124. data/app/views/{users → binda/users}/passwords/new.html.erb +1 -1
  125. data/app/views/{users → binda/users}/registrations/edit.html.erb +0 -0
  126. data/app/views/{users → binda/users}/registrations/new.html.erb +1 -1
  127. data/app/views/binda/users/sessions/_background.html.erb +139 -0
  128. data/app/views/binda/users/sessions/new.html.erb +62 -0
  129. data/app/views/{users → binda/users}/shared/_links.html.erb +3 -3
  130. data/app/views/{users → binda/users}/unlocks/new.html.erb +1 -1
  131. data/app/views/kaminari/_first_page.html.erb +11 -0
  132. data/app/views/kaminari/_gap.html.erb +8 -0
  133. data/app/views/kaminari/_last_page.html.erb +11 -0
  134. data/app/views/kaminari/_next_page.html.erb +11 -0
  135. data/app/views/kaminari/_page.html.erb +12 -0
  136. data/app/views/kaminari/_paginator.html.erb +19 -0
  137. data/app/views/kaminari/_prev_page.html.erb +11 -0
  138. data/app/views/layouts/binda/_flash.html.erb +1 -1
  139. data/app/views/layouts/binda/_header.html.erb +2 -6
  140. data/app/views/layouts/binda/_sidebar.html.erb +11 -4
  141. data/app/views/layouts/binda/application.html.erb +15 -7
  142. data/config/autoprefixer.yml +5 -0
  143. data/config/database.yml.travis +3 -0
  144. data/config/initializers/assets.rb +1 -0
  145. data/config/initializers/autoprefixer.yml +5 -0
  146. data/config/initializers/carrierwave.rb +32 -0
  147. data/config/initializers/devise.rb +14 -10
  148. data/config/initializers/devise_patch.rb +8 -8
  149. data/config/initializers/simple_form.rb +4 -0
  150. data/config/initializers/simple_form__fileupload.rb +121 -0
  151. data/config/initializers/{simple_form_bootstrap.rb → simple_form_custom.rb} +79 -50
  152. data/config/locales/en.yml +61 -3
  153. data/config/locales/it.yml +51 -0
  154. data/config/locales/simple_form.en.yml +3 -3
  155. data/config/routes.rb +41 -24
  156. data/db/migrate/1_create_binda_tables.rb +18 -7
  157. data/db/migrate/20171214140451_add_preview_mode.rb +5 -0
  158. data/lib/binda.rb +1 -1
  159. data/lib/binda/engine.rb +19 -23
  160. data/lib/binda/version.rb +2 -2
  161. data/lib/generators/binda/install/install_generator.rb +59 -54
  162. data/lib/generators/binda/install/templates/config/initializers/carrierwave.rb +11 -2
  163. data/lib/generators/binda/maintenance/USAGE +8 -0
  164. data/lib/generators/binda/maintenance/maintenance_generator.rb +50 -0
  165. data/lib/generators/binda/maintenance/templates/app/assets/javascripts/maintenance.js +0 -0
  166. data/lib/generators/binda/maintenance/templates/app/assets/stylesheets/maintenance.scss +0 -0
  167. data/lib/generators/binda/maintenance/templates/app/views/layouts/maintenance.html.erb +16 -0
  168. data/lib/generators/binda/maintenance/templates/config/initializers/maintenance.rb +1 -0
  169. data/lib/generators/binda/setup/setup_generator.rb +41 -30
  170. data/lib/tasks/add_default_helpers_class_task.rake +11 -0
  171. data/lib/tasks/add_video_feature_task.rake +15 -0
  172. data/lib/tasks/remove_orphan_fields_task.rake +16 -0
  173. data/lib/tasks/set_repeater_position_task.rake +13 -0
  174. data/lib/tasks/upgrade_to_v007_task.rake +72 -0
  175. data/lib/tasks/user_tasks.rake +14 -0
  176. data/vendor/assets/fonts/font-awesome/fa-brands-400.eot +0 -0
  177. data/vendor/assets/fonts/font-awesome/fa-brands-400.svg +978 -0
  178. data/vendor/assets/fonts/font-awesome/fa-brands-400.ttf +0 -0
  179. data/vendor/assets/fonts/font-awesome/fa-brands-400.woff +0 -0
  180. data/vendor/assets/fonts/font-awesome/fa-brands-400.woff2 +0 -0
  181. data/vendor/assets/fonts/font-awesome/fa-regular-400.eot +0 -0
  182. data/vendor/assets/fonts/font-awesome/fa-regular-400.svg +363 -0
  183. data/vendor/assets/fonts/font-awesome/fa-regular-400.ttf +0 -0
  184. data/vendor/assets/fonts/font-awesome/fa-regular-400.woff +0 -0
  185. data/vendor/assets/fonts/font-awesome/fa-regular-400.woff2 +0 -0
  186. data/vendor/assets/fonts/font-awesome/fa-solid-900.eot +0 -0
  187. data/vendor/assets/fonts/font-awesome/fa-solid-900.svg +1410 -0
  188. data/vendor/assets/fonts/font-awesome/fa-solid-900.ttf +0 -0
  189. data/vendor/assets/fonts/font-awesome/fa-solid-900.woff +0 -0
  190. data/vendor/assets/fonts/font-awesome/fa-solid-900.woff2 +0 -0
  191. data/vendor/assets/javascripts/GSAP/CSSPlugin.min.js +13 -0
  192. data/vendor/assets/javascripts/GSAP/EasePack.min.js +12 -0
  193. data/vendor/assets/javascripts/GSAP/ScrollToPlugin.min.js +12 -0
  194. data/vendor/assets/javascripts/GSAP/TweenLite.min.js +12 -0
  195. data/vendor/assets/javascripts/select2/i18n/af.js +3 -0
  196. data/vendor/assets/javascripts/select2/i18n/ar.js +3 -0
  197. data/vendor/assets/javascripts/select2/i18n/az.js +3 -0
  198. data/vendor/assets/javascripts/select2/i18n/bg.js +3 -0
  199. data/vendor/assets/javascripts/select2/i18n/bs.js +3 -0
  200. data/vendor/assets/javascripts/select2/i18n/ca.js +3 -0
  201. data/vendor/assets/javascripts/select2/i18n/cs.js +3 -0
  202. data/vendor/assets/javascripts/select2/i18n/da.js +3 -0
  203. data/vendor/assets/javascripts/select2/i18n/de.js +3 -0
  204. data/vendor/assets/javascripts/select2/i18n/dsb.js +3 -0
  205. data/vendor/assets/javascripts/select2/i18n/el.js +3 -0
  206. data/vendor/assets/javascripts/select2/i18n/en.js +3 -0
  207. data/vendor/assets/javascripts/select2/i18n/es.js +3 -0
  208. data/vendor/assets/javascripts/select2/i18n/et.js +3 -0
  209. data/vendor/assets/javascripts/select2/i18n/eu.js +3 -0
  210. data/vendor/assets/javascripts/select2/i18n/fa.js +3 -0
  211. data/vendor/assets/javascripts/select2/i18n/fi.js +3 -0
  212. data/vendor/assets/javascripts/select2/i18n/fr.js +3 -0
  213. data/vendor/assets/javascripts/select2/i18n/gl.js +3 -0
  214. data/vendor/assets/javascripts/select2/i18n/he.js +3 -0
  215. data/vendor/assets/javascripts/select2/i18n/hi.js +3 -0
  216. data/vendor/assets/javascripts/select2/i18n/hr.js +3 -0
  217. data/vendor/assets/javascripts/select2/i18n/hsb.js +3 -0
  218. data/vendor/assets/javascripts/select2/i18n/hu.js +3 -0
  219. data/vendor/assets/javascripts/select2/i18n/hy.js +3 -0
  220. data/vendor/assets/javascripts/select2/i18n/id.js +3 -0
  221. data/vendor/assets/javascripts/select2/i18n/is.js +3 -0
  222. data/vendor/assets/javascripts/select2/i18n/it.js +3 -0
  223. data/vendor/assets/javascripts/select2/i18n/ja.js +3 -0
  224. data/vendor/assets/javascripts/select2/i18n/km.js +3 -0
  225. data/vendor/assets/javascripts/select2/i18n/ko.js +3 -0
  226. data/vendor/assets/javascripts/select2/i18n/lt.js +3 -0
  227. data/vendor/assets/javascripts/select2/i18n/lv.js +3 -0
  228. data/vendor/assets/javascripts/select2/i18n/mk.js +3 -0
  229. data/vendor/assets/javascripts/select2/i18n/ms.js +3 -0
  230. data/vendor/assets/javascripts/select2/i18n/nb.js +3 -0
  231. data/vendor/assets/javascripts/select2/i18n/nl.js +3 -0
  232. data/vendor/assets/javascripts/select2/i18n/pl.js +3 -0
  233. data/vendor/assets/javascripts/select2/i18n/ps.js +3 -0
  234. data/vendor/assets/javascripts/select2/i18n/pt-BR.js +3 -0
  235. data/vendor/assets/javascripts/select2/i18n/pt.js +3 -0
  236. data/vendor/assets/javascripts/select2/i18n/ro.js +3 -0
  237. data/vendor/assets/javascripts/select2/i18n/ru.js +3 -0
  238. data/vendor/assets/javascripts/select2/i18n/sk.js +3 -0
  239. data/vendor/assets/javascripts/select2/i18n/sl.js +3 -0
  240. data/vendor/assets/javascripts/select2/i18n/sr-Cyrl.js +3 -0
  241. data/vendor/assets/javascripts/select2/i18n/sr.js +3 -0
  242. data/vendor/assets/javascripts/select2/i18n/sv.js +3 -0
  243. data/vendor/assets/javascripts/select2/i18n/th.js +3 -0
  244. data/vendor/assets/javascripts/select2/i18n/tr.js +3 -0
  245. data/vendor/assets/javascripts/select2/i18n/uk.js +3 -0
  246. data/vendor/assets/javascripts/select2/i18n/vi.js +3 -0
  247. data/vendor/assets/javascripts/select2/i18n/zh-CN.js +3 -0
  248. data/vendor/assets/javascripts/select2/i18n/zh-TW.js +3 -0
  249. data/vendor/assets/javascripts/select2/select2.full.min.js +1 -0
  250. data/vendor/assets/javascripts/select2/select2.min.js +1 -0
  251. data/vendor/assets/javascripts/tether.min.js +1 -0
  252. data/vendor/assets/stylesheets/{bootstrap-select.css → bootstrap/bootstrap-select.css} +0 -0
  253. data/vendor/assets/stylesheets/font-awesome/_animated.scss +6 -20
  254. data/vendor/assets/stylesheets/font-awesome/_bordered-pulled.scss +6 -11
  255. data/vendor/assets/stylesheets/font-awesome/_core.scss +11 -7
  256. data/vendor/assets/stylesheets/font-awesome/_fixed-width.scss +1 -1
  257. data/vendor/assets/stylesheets/font-awesome/_icons.scss +785 -787
  258. data/vendor/assets/stylesheets/font-awesome/_larger.scss +16 -6
  259. data/vendor/assets/stylesheets/font-awesome/_list.scss +7 -8
  260. data/vendor/assets/stylesheets/font-awesome/_mixins.scss +17 -20
  261. data/vendor/assets/stylesheets/font-awesome/_rotated-flipped.scss +9 -6
  262. data/vendor/assets/stylesheets/font-awesome/_screen-reader.scss +2 -2
  263. data/vendor/assets/stylesheets/font-awesome/_stacked.scss +19 -8
  264. data/vendor/assets/stylesheets/font-awesome/_variables.scss +795 -795
  265. data/vendor/assets/stylesheets/font-awesome/fa-brands.scss +21 -0
  266. data/vendor/assets/stylesheets/font-awesome/fa-regular.scss +22 -0
  267. data/vendor/assets/stylesheets/font-awesome/fa-solid.scss +23 -0
  268. data/vendor/assets/stylesheets/font-awesome/fontawesome.scss +20 -0
  269. data/vendor/assets/stylesheets/select2/select2.min.css +1 -0
  270. metadata +278 -125
  271. data/app/assets/javascripts/binda/components/form_item_asset.js +0 -25
  272. data/app/assets/stylesheets/binda/application.css +0 -6
  273. data/app/assets/stylesheets/binda/components/form_body.scss +0 -2
  274. data/app/assets/stylesheets/binda/components/form_item_asset.scss +0 -20
  275. data/app/assets/stylesheets/binda/components/form_section.scss +0 -40
  276. data/app/assets/stylesheets/binda/components/sidebar.scss +0 -131
  277. data/app/assets/stylesheets/binda/layout/components_index.scss +0 -9
  278. data/app/assets/stylesheets/binda/layout/dashboard.scss +0 -7
  279. data/app/assets/stylesheets/binda/layout/users_sign_in.scss +0 -29
  280. data/app/controllers/binda/bindings_controller.rb +0 -62
  281. data/app/controllers/concerns/binda/default_helpers.rb +0 -226
  282. data/app/helpers/binda/bindings_helper.rb +0 -4
  283. data/app/models/binda/binda.rb +0 -7
  284. data/app/models/binda/binding.rb +0 -24
  285. data/app/views/binda/bindings/_form.html.erb +0 -32
  286. data/app/views/binda/bindings/edit.html.erb +0 -6
  287. data/app/views/binda/bindings/index.html.erb +0 -31
  288. data/app/views/binda/bindings/new.html.erb +0 -5
  289. data/app/views/binda/bindings/show.html.erb +0 -19
  290. data/app/views/binda/field_groups/index.html.erb +0 -34
  291. data/app/views/binda/fieldable/_form_item_asset.html.erb +0 -20
  292. data/app/views/users/sessions/new.html.erb +0 -27
  293. data/lib/tasks/binda.rake +0 -79
  294. data/vendor/assets/fonts/font-awesome/FontAwesome.otf +0 -0
  295. data/vendor/assets/fonts/font-awesome/fontawesome-webfont.eot +0 -0
  296. data/vendor/assets/fonts/font-awesome/fontawesome-webfont.svg +0 -2671
  297. data/vendor/assets/fonts/font-awesome/fontawesome-webfont.ttf +0 -0
  298. data/vendor/assets/fonts/font-awesome/fontawesome-webfont.woff +0 -0
  299. data/vendor/assets/fonts/font-awesome/fontawesome-webfont.woff2 +0 -0
  300. data/vendor/assets/stylesheets/font-awesome/_path.scss +0 -15
  301. data/vendor/assets/stylesheets/font-awesome/font-awesome.scss +0 -18
@@ -0,0 +1,18 @@
1
+ export default function()
2
+ {
3
+ $('input[name="login"]').click(function(){
4
+ let $radio = $(this);
5
+
6
+ // if this was previously checked
7
+ if ($radio.data('waschecked') === true)
8
+ {
9
+ $radio.prop('checked', false);
10
+ $radio.data('waschecked', false);
11
+ }
12
+ else
13
+ $radio.data('waschecked', true);
14
+
15
+ // remove was checked from other radios
16
+ $radio.siblings('input[name="login"]').data('waschecked', false);
17
+ });
18
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * OPTIONAL (SELECT2 PLUGIN)
3
+ */
4
+
5
+ export default function ()
6
+ {
7
+ setupSelect2('.select2-item')
8
+ }
9
+
10
+ export function setupSelect2(target)
11
+ {
12
+ $(target).each(function()
13
+ {
14
+ let placeholder = $(this).attr('placeholder')
15
+ if ( typeof placeholder == 'undefined' ) { placeholder = 'Select a option' }
16
+
17
+ $(this).select2({
18
+ minimumResultsForSearch: 32, // 31 are max number of day in a month, which you don't want to be searchable
19
+ placeholder: placeholder
20
+ })
21
+ })
22
+ }
@@ -1,3 +1,7 @@
1
+ /**
2
+ * SORTABLE
3
+ */
4
+
1
5
  export default function()
2
6
  {
3
7
  if ( $('.sortable').length > 0 )
@@ -5,12 +9,21 @@ export default function()
5
9
  // Initialize sortable item
6
10
  $('.sortable')
7
11
  .sortable({
12
+ stop: function(event, ui){
13
+ ui.item.css('z-index', 0)
14
+ },
8
15
  placeholder: "ui-state-highlight",
9
16
  update: function () {
10
- $.post(
11
- $(this).data('update-url'),
12
- $(this).sortable('serialize')
13
- )
17
+ if ( $('.popup-warning').length > 0 ) {
18
+ $('.sortable').addClass('sortable--disabled')
19
+ $('.popup-warning').removeClass('popup-warning--hidden')
20
+ $(this).sortable('option','disabled', true)
21
+ }
22
+ let url = $(this).data('update-url')
23
+ let data = $(this).sortable('serialize')
24
+ // If there is a pagination update accordingly
25
+ data = data.concat(`&id=${$(this).attr('id')}`)
26
+ $.post( url, data )
14
27
  }
15
28
  })
16
29
 
@@ -26,18 +39,50 @@ export default function()
26
39
  $('.sortable--disabled').sortable('disable')
27
40
  }
28
41
 
29
- $(document).on( 'click', '.sortable--toggle', function( event )
42
+ // If there is a sortable toggle button prepare the sortable items accordingly
43
+ if ( $('.sortable--toggle').length > 0 ) { setupSortableToggle() }
44
+
45
+ // Add event to any sortable toggle button
46
+ // TODO: make this event available to element which aren't standard form repeaters
47
+ $(document).on('click', '.standard-form--repeater .sortable--toggle', function( event )
30
48
  {
31
49
  event.preventDefault()
32
- let id = '#' + $( this ).data( 'repeater-id' )
50
+ let id = '#' + $( this ).data('repeater-id')
33
51
 
34
52
  if ( $( id ).hasClass('sortable--disabled') )
35
- { $( id ).sortable('enable') }
53
+ {
54
+ $( id ).sortable('enable')
55
+ $( id ).find('.form-item--repeater-fields').each(close)
56
+ $( id ).find('.form-item--collapsable').addClass('form-item--collapsed')
57
+ }
36
58
  else
37
- { $( id ).sortable('disable') }
59
+ {
60
+ $( id ).sortable('disable')
61
+ }
38
62
 
39
63
  $( id ).toggleClass('sortable--disabled')
40
64
  $( id ).toggleClass('sortable--enabled')
41
65
  $( this ).children('.sortable--toggle-text').toggle()
42
66
  })
67
+ }
68
+
69
+
70
+ function setupSortableToggle()
71
+ {
72
+ $('.sortable--toggle').each(function()
73
+ {
74
+ let id = '#' + $( this ).data('repeater-id')
75
+ $( id ).find('.form-item--collapsable').addClass('form-item--collapsed')
76
+ $( id ).find('.form-item--repeater-fields').each(close)
77
+ })
78
+ }
79
+
80
+ function close()
81
+ {
82
+ this.style.maxHeight = '0px'
83
+ }
84
+
85
+ function open()
86
+ {
87
+ this.style.maxHeight = this.scrollHeight + "px";
43
88
  }
@@ -63,7 +63,7 @@
63
63
  /******/ __webpack_require__.p = "";
64
64
  /******/
65
65
  /******/ // Load entry module and return exports
66
- /******/ return __webpack_require__(__webpack_require__.s = 6);
66
+ /******/ return __webpack_require__(__webpack_require__.s = 13);
67
67
  /******/ })
68
68
  /************************************************************************/
69
69
  /******/ ([
@@ -76,9 +76,9 @@ var _createClass = function () { function defineProperties(target, props) { for
76
76
 
77
77
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
78
78
 
79
- ///- - - - - - - - - - - - - - - - - - - -
80
- /// FORM ITEM
81
- ///- - - - - - - - - - - - - - - - - - - -
79
+ /**
80
+ * FORM ITEM EDITOR
81
+ */
82
82
 
83
83
  var FormItemEditor = function () {
84
84
  function FormItemEditor() {
@@ -112,11 +112,12 @@ var FormItemEditor = function () {
112
112
  key: 'resize',
113
113
  value: function resize() {
114
114
  $(this.target).each(function () {
115
- // If the form item edito is closed don't go any further
115
+ // If the form item editor is closed don't go any further
116
116
  if ($(this).height() === 0) return;
117
117
  // otherwise update the max-height which is needed for the CSS transition
118
118
  // NOTE you need to remove the max-height (inside 'style' attribute) to get the real height
119
- $(this).css("max-height", $(this).removeAttr('style').height());
119
+ $(this).get(0).style.height = 'auto';
120
+ $(this).get(0).style.maxHeight = $(this).get(0).scrollHeight + "px";
120
121
  });
121
122
  }
122
123
  }]);
@@ -130,30 +131,285 @@ var _FormItemEditor = new FormItemEditor();
130
131
  /* 1 */
131
132
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
132
133
 
134
+ "use strict";
135
+ /* harmony export (immutable) */ __webpack_exports__["b"] = setupSelect2;
136
+ /**
137
+ * OPTIONAL (SELECT2 PLUGIN)
138
+ */
139
+
140
+ /* harmony default export */ __webpack_exports__["a"] = function () {
141
+ setupSelect2('.select2-item');
142
+ };
143
+
144
+ function setupSelect2(target) {
145
+ $(target).each(function () {
146
+ var placeholder = $(this).attr('placeholder');
147
+ if (typeof placeholder == 'undefined') {
148
+ placeholder = 'Select a option';
149
+ }
150
+
151
+ $(this).select2({
152
+ minimumResultsForSearch: 32, // 31 are max number of day in a month, which you don't want to be searchable
153
+ placeholder: placeholder
154
+ });
155
+ });
156
+ }
157
+
158
+ /***/ }),
159
+ /* 2 */
160
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
161
+
162
+ "use strict";
163
+ /**
164
+ * BOOSTRAP SCRIPT
165
+ */
166
+
167
+ /* harmony default export */ __webpack_exports__["a"] = function () {
168
+ // See https://v4-alpha.getbootstrap.com/components/tooltips/#example-enable-tooltips-everywhere
169
+ $('[data-toggle="tooltip"]').tooltip();
170
+ };
171
+
172
+ /***/ }),
173
+ /* 3 */
174
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
175
+
176
+ "use strict";
177
+ /**
178
+ * FIELD GROUP EDITOR
179
+ */
180
+
181
+ /* harmony default export */ __webpack_exports__["a"] = function () {
182
+ $('.field_groups-edit #save').on('click', function (event) {
183
+ var instanceType = $(this).data('instance-type');
184
+ var entriesNumber = $(this).data('entries-number');
185
+
186
+ // If the current structure have many entries updating the field group
187
+ // might be a slow operation, therefore it's good practice to inform the user
188
+ if (entriesNumber > 500) {
189
+ alert('You have ' + entriesNumber + ' ' + instanceType + '. This operation might take some time to complete. To avoid unexpected behaviour don\'t leave or refresh the page');
190
+ }
191
+ });
192
+ };
193
+
194
+ /***/ }),
195
+ /* 4 */
196
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
197
+
198
+ "use strict";
199
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _FileUpload; });
200
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
201
+
202
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
203
+
204
+ /**
205
+ * FILE UPLOAD
206
+ *
207
+ * see https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/
208
+ *
209
+ */
210
+
211
+ var FileUpload = function () {
212
+ function FileUpload() {
213
+ _classCallCheck(this, FileUpload);
214
+
215
+ this.target = '.fileupload';
216
+ }
217
+
218
+ _createClass(FileUpload, [{
219
+ key: 'isSet',
220
+ value: function isSet() {
221
+ if ($(this.target).length > 0) {
222
+ return true;
223
+ } else {
224
+ return false;
225
+ }
226
+ }
227
+ }, {
228
+ key: 'setEvents',
229
+ value: function setEvents() {
230
+ var self = this;
231
+
232
+ $(document).on('click', '.fileupload--remove-image-btn', remove_preview);
233
+
234
+ $(document).on('change', this.target + ' input.file', handle_file);
235
+ }
236
+ }]);
237
+
238
+ return FileUpload;
239
+ }();
240
+
241
+ var _FileUpload = new FileUpload();
242
+
243
+ /**
244
+ * HELPER FUNCTIONS
245
+ */
246
+
247
+ // Reference --> http://blog.teamtreehouse.com/uploading-files-ajax
248
+ function handle_file(event) {
249
+ var id = event.target.getAttribute('data-id');
250
+ var $parent = $('#fileupload-' + id);
251
+ var $preview = $('#fileupload-' + id + ' .fileupload--preview');
252
+
253
+ // Get the selected file from the input
254
+ // This script doesn't consider multiple files upload
255
+ var file = event.target.files[0];
256
+
257
+ // Don't go any further if no file has been selected
258
+ if (typeof file === 'undefined') {
259
+ return;
260
+ }
261
+
262
+ // Create a new FormData object which will be sent to the server
263
+ var formData = new FormData();
264
+
265
+ // Get data from the input element
266
+ $parent.find('input').each(function () {
267
+ if (this.isSameNode(event.target)) {
268
+ // Add the file to the request
269
+ formData.append(this.getAttribute('name'), file, file.name);
270
+ } else {
271
+ // Add secondary values to the request
272
+ formData.append(this.getAttribute('name'), this.getAttribute('value'));
273
+ }
274
+ });
275
+
276
+ // If it's inside a repeater add repeater parameters
277
+ var $parent_repeater = $parent.closest('.form-item--repeater-fields');
278
+ if ($parent.closest('.form-item--repeater-fields').length > 0) {
279
+ $parent_repeater.children('.form-group').find('input').each(function () {
280
+ formData.append(this.getAttribute('name'), this.getAttribute('value'));
281
+ });
282
+ }
283
+
284
+ // Is this needed? Apparently it works without it. Is it a security issue?
285
+ // let token = document.querySelector('meta[name="csrf-token"]').content
286
+ // formData.append('authenticity_token', token)
287
+
288
+ // Display loader
289
+ $('.popup-warning').removeClass('popup-warning--hidden');
290
+
291
+ // Open the connection
292
+ $.ajax({
293
+ url: event.target.getAttribute('data-url'),
294
+ type: 'PATCH',
295
+ processData: false, // needed to pass formData with the current format
296
+ contentType: false, // needed to pass formData with the current format
297
+ data: formData
298
+ }).done(function (data) {
299
+ if (data.type == 'image') {
300
+ setup_image_preview(data, id);
301
+ } else if (data.type == 'video') {
302
+ setup_video_preview(data, id);
303
+ } else {
304
+ alert('Something went wrong. No preview has been received.');
305
+ }
306
+
307
+ // Hide loaded
308
+ $('.popup-warning').addClass('popup-warning--hidden');
309
+
310
+ // Display details and buttons
311
+ $parent.find('.fileupload--details').removeClass('fileupload--details--hidden');
312
+ $parent.find('.fileupload--remove-image-btn').removeClass('fileupload--remove-image-btn--hidden');
313
+ }).fail(function () {
314
+ // Hide loaded
315
+ $('.popup-warning').addClass('popup-warning--hidden');
316
+ alert('Something went wrong. Upload process failed.');
317
+ });
318
+ }
319
+
320
+ function reset_file(event) {
321
+ var input = event.target;
322
+
323
+ input.value = '';
324
+
325
+ if (!/safari/i.test(navigator.userAgent)) {
326
+ input.type = '';
327
+ input.type = 'file';
328
+ }
329
+ }
330
+
331
+ function remove_preview(event) {
332
+ var id = event.target.getAttribute('data-id');
333
+ var $parent = $('#fileupload-' + id);
334
+
335
+ // Reset previews (either image or video)
336
+ $parent.find('.fileupload--preview').css('background-image', '').removeClass('fileupload--preview--uploaded');
337
+ $parent.find('video source').attr('src', '');
338
+
339
+ // Reset buttons to initial state
340
+ $parent.find('.fileupload--remove-image-btn').addClass('fileupload--remove-image-btn--hidden');
341
+ $parent.find('.fileupload--details').addClass('fileupload--details--hidden');
342
+ }
343
+
344
+ function setup_image_preview(data, id) {
345
+ var $parent = $('#fileupload-' + id);
346
+ var $preview = $('#fileupload-' + id + ' .fileupload--preview');
347
+
348
+ // Update thumbnail
349
+ $preview.css('background-image', 'url(' + data.thumbnailUrl + ')');
350
+
351
+ // Remove and add class to trigger css animation
352
+ var uploadedClass = 'fileupload--preview--uploaded';
353
+ $preview.removeClass(uploadedClass).addClass(uploadedClass);
354
+
355
+ // Update details
356
+ $parent.find('.fileupload--width').text(data.width);
357
+ $parent.find('.fileupload--height').text(data.height);
358
+ $parent.find('.fileupload--filesize').text(data.size);
359
+ $parent.find('.fileupload--filename').text(data.name);
360
+ }
361
+
362
+ function setup_video_preview(data, id) {
363
+ var $parent = $('#fileupload-' + id);
364
+ var $preview = $('#fileupload-' + id + ' .fileupload--preview');
365
+
366
+ $preview.removeClass('fileupload--preview--uploaded').find('video').attr('id', 'video-' + id).find('source').attr('src', data.url).attr('type', 'video/' + data.ext);
367
+
368
+ // If video source isn't blank load it (consider that a video tag is always present)
369
+ if ($preview.find('video source').attr('src').length > 0) {
370
+ $preview.find('video').get(0).load();
371
+ }
372
+
373
+ // Remove and add class to trigger css animation
374
+ var uploadedClass = 'fileupload--preview--uploaded';
375
+ $preview.removeClass(uploadedClass).addClass(uploadedClass);
376
+
377
+ // Update details
378
+ $parent.find('.fileupload--filesize').text(data.size);
379
+ $parent.find('.fileupload--filename').text(data.name);
380
+ }
381
+
382
+ /***/ }),
383
+ /* 5 */
384
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
385
+
133
386
  "use strict";
134
387
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__form_item_editor__ = __webpack_require__(0);
388
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__select2__ = __webpack_require__(1);
135
389
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _FormItem; });
136
390
  var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
137
391
 
138
392
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
139
393
 
140
- ///- - - - - - - - - - - - - - - - - - - -
141
- /// FORM ITEM
142
- ///- - - - - - - - - - - - - - - - - - - -
394
+ /**
395
+ * FORM ITEM
396
+ */
397
+
143
398
 
144
399
 
145
400
 
401
+ // Component Global Variables
402
+ var newFormItemId = 1;
403
+
146
404
  var FormItem = function () {
147
405
  function FormItem() {
148
406
  _classCallCheck(this, FormItem);
149
-
150
- this.target = '.form-item';
151
407
  }
152
408
 
153
409
  _createClass(FormItem, [{
154
410
  key: 'isSet',
155
411
  value: function isSet() {
156
- if ($(this.target).length > 0) {
412
+ if ($('.form-item').length > 0) {
157
413
  return true;
158
414
  } else {
159
415
  return false;
@@ -162,26 +418,50 @@ var FormItem = function () {
162
418
  }, {
163
419
  key: 'setEvents',
164
420
  value: function setEvents() {
165
- $(document).on('click', this.target + '--add-new', addNewItem);
421
+ $(document).on('click', '.form-item--add-new', addNewItem);
166
422
 
167
423
  $(document).on('click', '.form-item--remove-item-with-js', function (event) {
168
424
  // Stop default behaviour
169
425
  event.preventDefault();
170
- $(this).parent(this.target).remove();
426
+ $(this).closest('.form-item').remove();
171
427
  });
172
428
 
173
- $(document).on('click', '.form-item--open-button, .form-item--close-button', function () {
174
- var formItemEditor = $(this).parent('.form-item').children('.form-item--editor');
429
+ $(document).on('click', '.form-item--collapse-btn', function (event) {
430
+ // This function is temporarely just set for repeaters.
431
+ // TODO: Need refactoring in order to be available also for generic form items
175
432
 
176
- // Make sure form-item--editor max-height correspond to the actual height
177
- // this is needed for the CSS transition which is trigger clicking open/close button
178
- if (!formItemEditor.hasClass('form-item--editor-close')) {
179
- __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
433
+ // Stop default behaviour
434
+ event.preventDefault();
435
+
436
+ var $collapsable = $(this).closest('.form-item--collapsable');
437
+
438
+ if ($collapsable.hasClass('form-item--collapsed')) {
439
+ $collapsable.find('.form-item--repeater-fields').each(open);
440
+ $collapsable.removeClass('form-item--collapsed');
441
+ } else {
442
+ $collapsable.find('.form-item--repeater-fields').each(close);
443
+ $collapsable.addClass('form-item--collapsed');
180
444
  }
445
+ });
181
446
 
182
- // Update classes
183
- formItemEditor.toggleClass('form-item--editor-close');
184
- $(this).parent('.form-item').children('.form-item--open-button, .form-item--close-button').toggle();
447
+ $(document).on('click', '.form-item--toggle-button', function () {
448
+
449
+ var $formItem = $(this).closest('.form-item');
450
+ var $formItemEditor = $formItem.children('.form-item--editor');
451
+
452
+ if ($formItemEditor.get(0).style.maxHeight === '') {
453
+ // Update height
454
+ $formItemEditor.get(0).style.maxHeight = $formItemEditor.get(0).scrollHeight + "px";
455
+
456
+ // Add class to trigger animation
457
+ $formItem.children('.form-item--toggle-button').removeClass('form-item--toggle-button-closed');
458
+ } else {
459
+ // Zero height
460
+ $formItemEditor.get(0).style.maxHeight = null;
461
+
462
+ // Add class to trigger animation
463
+ $formItem.children('.form-item--toggle-button').addClass('form-item--toggle-button-closed');
464
+ }
185
465
  });
186
466
  }
187
467
  }]);
@@ -195,63 +475,55 @@ var _FormItem = new FormItem();
195
475
  /// COMPONENT HELPER FUNCTIONS
196
476
  ///- - - - - - - - - - - - - - - - - - - -
197
477
 
478
+ // This function could be improved as it generates an issue with
479
+ // input ids which are duplicated after the entire target has been cloned
198
480
  function addNewItem(event) {
199
481
  // Stop default behaviour
200
482
  event.preventDefault();
201
- // Get the child to clone
202
- var id = $(event.target).data('new-child-id');
483
+ // Get the child to clone
484
+ // (`this` always refers to the second argument of the $(document).on() method, in this case '.form-item--add-new')
485
+ var id = $(this).data('new-form-item-id');
203
486
  var $newChild = $('#' + id);
204
487
  // Clone child and remove id and styles from cloned child
205
488
  $newChild.clone().insertAfter($newChild);
206
- $newChild.removeClass('form-item--new').removeAttr('id');
207
- __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
208
- }
209
-
210
- /***/ }),
211
- /* 2 */
212
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
489
+ // Remove class in order to remove styles, and change id so it's reachable when testing
490
+ $newChild.removeClass('form-item--new').attr('id', 'new-form-item-' + newFormItemId);
491
+
492
+ // // Update all ids to avoid duplication
493
+ $newChild.find('[id]').each(function () {
494
+ var oldId = $(this).attr('id');
495
+ var newId = oldId + '-' + newFormItemId;
496
+ $(this).attr('id', newId);
497
+ var $forId = $newChild.find('[for=' + oldId + ']');
498
+ if ($forId.length > 0) {
499
+ $forId.attr('for', newId);
500
+ }
501
+ });
213
502
 
214
- "use strict";
215
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _FormItemAsset; });
216
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
503
+ // Update height (max-height) of the new element
504
+ var $formItemEditor = $('#new-form-item-' + newFormItemId).find('.form-item--editor');
217
505
 
218
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
506
+ // override current max-height which is set to 0
507
+ $formItemEditor.get(0).style.maxHeight = $formItemEditor.get(0).scrollHeight + "px";
219
508
 
220
- ///- - - - - - - - - - - - - - - - - - - -
221
- /// FORM ITEM ASSET
222
- ///- - - - - - - - - - - - - - - - - - - -
223
-
224
- var FormItemAsset = function () {
225
- function FormItemAsset() {
226
- _classCallCheck(this, FormItemAsset);
509
+ __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
227
510
 
228
- this.target = '.form-item--asset';
229
- }
511
+ // Increment global id variable `newFormItemId` in case needs to be used again
512
+ newFormItemId++;
230
513
 
231
- _createClass(FormItemAsset, [{
232
- key: 'isSet',
233
- value: function isSet() {
234
- if ($(this.target).length > 0) {
235
- return true;
236
- } else {
237
- return false;
238
- }
239
- }
240
- }, {
241
- key: 'setEvents',
242
- value: function setEvents() {
243
- // here code to setup assets via ajax
244
- //
245
- }
246
- }]);
514
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__select2__["b" /* setupSelect2 */])($formItemEditor.find('select'));
515
+ }
247
516
 
248
- return FormItemAsset;
249
- }();
517
+ function close() {
518
+ this.style.maxHeight = '0px';
519
+ }
250
520
 
251
- var _FormItemAsset = new FormItemAsset();
521
+ function open() {
522
+ this.style.maxHeight = this.scrollHeight + "px";
523
+ }
252
524
 
253
525
  /***/ }),
254
- /* 3 */
526
+ /* 6 */
255
527
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
256
528
 
257
529
  "use strict";
@@ -261,9 +533,9 @@ var _createClass = function () { function defineProperties(target, props) { for
261
533
 
262
534
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
263
535
 
264
- ///- - - - - - - - - - - - - - - - - - - -
265
- /// FORM ITEM
266
- ///- - - - - - - - - - - - - - - - - - - -
536
+ /**
537
+ * FORM ITEM CHOICE
538
+ */
267
539
 
268
540
 
269
541
 
@@ -289,7 +561,7 @@ var FormItemChoice = function () {
289
561
  $(document).on('click', '.form-item--add-choice', function (event) {
290
562
  event.preventDefault();
291
563
  // Clone the new choice field
292
- var choices = $(this).parent('.form-item--choices');
564
+ var choices = $(this).closest('.form-item--choices');
293
565
  var newchoice = choices.find('.form-item--new-choice');
294
566
  var clone = newchoice.clone().removeClass('form-item--new-choice').toggle();
295
567
  clone.find('.form-item--toggle-choice').toggle();
@@ -302,20 +574,25 @@ var FormItemChoice = function () {
302
574
  $(document).on('click', '.form-item--delete-choice', function (event) {
303
575
  event.preventDefault();
304
576
 
305
- var choice = $(this).parent('.form-item--choice');
577
+ var choice = $(this).closest('.form-item--choice');
306
578
  var destination = $(this).attr('href');
579
+ var self = this;
307
580
 
308
581
  $.ajax({
309
582
  url: destination,
310
583
  type: 'DELETE',
311
584
  success: function success() {
312
585
  choice.remove();
586
+ // Update form item editor size
587
+ __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
313
588
  }
314
589
  });
315
590
  });
316
591
  $(document).on('click', '.form-item--js-delete-choice', function (event) {
317
592
  event.preventDefault();
318
- $(this).parent('.form-item--choice').remove();
593
+ $(this).closest('.form-item--choice').remove();
594
+ // Update form item editor size
595
+ __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
319
596
  });
320
597
  }
321
598
  }]);
@@ -326,33 +603,73 @@ var FormItemChoice = function () {
326
603
  var _FormItemChoice = new FormItemChoice();
327
604
 
328
605
  /***/ }),
329
- /* 4 */
606
+ /* 7 */
607
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
608
+
609
+ "use strict";
610
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _FormItemImage; });
611
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
612
+
613
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
614
+
615
+ /**
616
+ * FORM ITEM IMAGE
617
+ */
618
+
619
+ var FormItemImage = function () {
620
+ function FormItemImage() {
621
+ _classCallCheck(this, FormItemImage);
622
+
623
+ this.target = '.form-item--image--uploader';
624
+ }
625
+
626
+ _createClass(FormItemImage, [{
627
+ key: 'isSet',
628
+ value: function isSet() {
629
+ if ($(this.target).length > 0) {
630
+ return true;
631
+ } else {
632
+ return false;
633
+ }
634
+ }
635
+ }, {
636
+ key: 'setEvents',
637
+ value: function setEvents() {}
638
+ }]);
639
+
640
+ return FormItemImage;
641
+ }();
642
+
643
+ var _FormItemImage = new FormItemImage();
644
+
645
+ /***/ }),
646
+ /* 8 */
330
647
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
331
648
 
332
649
  "use strict";
333
650
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__form_item_editor__ = __webpack_require__(0);
651
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__select2__ = __webpack_require__(1);
334
652
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _FormItemRepeater; });
335
653
  var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
336
654
 
337
655
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
338
656
 
339
- ///- - - - - - - - - - - - - - - - - - - -
340
- /// FORM ITEM
341
- ///- - - - - - - - - - - - - - - - - - - -
657
+ /**
658
+ * FORM ITEM REPEATER
659
+ */
660
+
342
661
 
343
662
 
344
663
 
345
664
  var FormItemRepeater = function () {
346
665
  function FormItemRepeater() {
347
666
  _classCallCheck(this, FormItemRepeater);
348
-
349
- this.target = '.form-item--repeater-section';
350
667
  }
351
668
 
352
669
  _createClass(FormItemRepeater, [{
353
670
  key: 'isSet',
354
671
  value: function isSet() {
355
- if ($(this.target).length > 0) {
672
+ if ($('.form-item--repeater-section').length > 0) {
356
673
  return true;
357
674
  } else {
358
675
  return false;
@@ -361,28 +678,43 @@ var FormItemRepeater = function () {
361
678
  }, {
362
679
  key: 'setEvents',
363
680
  value: function setEvents() {
364
- $(document).on('click', this.target + '--add-new', addNewItem);
681
+ $(document).on('click', '.form-item--repeater-section--add-new', function (event) {
682
+ addNewItem(this, event);
683
+ });
365
684
 
366
685
  $(document).on('click', '.form-item--remove-item-with-js', function (event) {
367
686
  // Stop default behaviour
368
687
  event.preventDefault();
369
- $(this).parent(this.target).remove();
688
+ $(this).parent('.form-item--repeater-section').remove();
370
689
  __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
371
690
  });
372
691
 
373
692
  $(document).on('click', '.form-item--delete-repeater-item', function (event) {
374
- var _this = this;
375
-
376
693
  // Stop default behaviour
377
694
  event.preventDefault();
378
695
 
696
+ // if ( !confirm($(this).data('confirm')) ) return
697
+
698
+ var record_id = $(this).data('id');
699
+ var target = $('#repeater_' + record_id).get(0);
700
+ // As max-height isn't set you need to set it manually before changing it,
701
+ // otherwise the animation doesn't get triggered
702
+ target.style.maxHeight = target.scrollHeight + 'px';
703
+ // Change max-height after 50ms to trigger css animation
704
+ setTimeout(function () {
705
+ target.style.maxHeight = 0 + 'px';
706
+ }, 50);
707
+
379
708
  $.ajax({
380
709
  url: $(this).attr('href'),
381
- data: { id: $(this).data('id'), isAjax: true },
710
+ data: { id: record_id, isAjax: true },
382
711
  method: "DELETE"
383
712
  }).done(function () {
384
- $(_this).parent('li').remove();
385
- __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
713
+ // Make sure the animation completes before removing the item (it should last 600ms + 50ms)
714
+ setTimeout(function () {
715
+ $(target).remove();
716
+ }, 700);
717
+ // _FormItemEditor.resize()
386
718
  });
387
719
  });
388
720
  }
@@ -393,39 +725,454 @@ var FormItemRepeater = function () {
393
725
 
394
726
  var _FormItemRepeater = new FormItemRepeater();
395
727
 
396
- ///- - - - - - - - - - - - - - - - - - - -
397
- /// COMPONENT HELPER FUNCTIONS
398
- ///- - - - - - - - - - - - - - - - - - - -
728
+ /**
729
+ * COMPONENT HELPER FUNCTIONS
730
+ *
731
+ * @param {string} target The target
732
+ * @param {object} event The event
733
+ */
399
734
 
400
- function addNewItem(event) {
735
+ function addNewItem(target, event) {
401
736
  // Stop default behaviour
402
737
  event.preventDefault();
403
738
  // Get the child to clone
404
- var id = $(event.target).data('id');
739
+ var id = $(target).data('id');
405
740
  var $list = $('#form-item--repeater-setting-' + id);
406
- var url = $(event.target).data('url');
741
+ var url = $(target).data('url');
407
742
  $.post(url, { repeater_setting_id: id }, function (data) {
743
+ // Get repaeter code from Rails
744
+ // Due to the Rails way of creating nested forms it's necessary to
745
+ // create the nested item inside a different new form, then get just
746
+ // the code contained between the two SPLIT comments
408
747
  var parts = data.split('<!-- SPLIT -->');
409
748
  var newRepeater = parts[1];
410
- $list.append(newRepeater);
411
- var editor_id = $list.find('textarea').last('textarea').attr('id');
412
- tinyMCE.EditorManager.execCommand('mceAddEditor', true, editor_id);
413
- __WEBPACK_IMPORTED_MODULE_0__form_item_editor__["a" /* _FormItemEditor */].resize();
749
+
750
+ // Append the item
751
+ $list.prepend(newRepeater);
752
+ var new_repeater_item = $list.find('.form-item--repeater').get(0);
753
+
754
+ // Prepare animation
755
+ new_repeater_item.style.maxHeight = 0;
756
+
757
+ // Group fields if sotrable is enabled
758
+ if ($list.hasClass('sortable--enabled')) {
759
+ $(new_repeater_item).find('.form-item--repeater-fields').each(function () {
760
+ this.style.maxHeight = 0 + 'px';
761
+ });
762
+ }
763
+
764
+ // Setup TinyMCE for the newly created item
765
+ var textarea_editor_id = $list.find('textarea').last('textarea').attr('id');
766
+ tinyMCE.EditorManager.execCommand('mceAddEditor', true, textarea_editor_id);
767
+
768
+ // Resize the editor (is it needed with the new configuration?)
769
+ // _FormItemEditor.resize()
770
+
771
+ // Update select input for Select2 plugin
772
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__select2__["b" /* setupSelect2 */])($list.find('select'));
773
+
774
+ // Refresh Sortable to update the added item with Sortable features
775
+ $list.sortable('refresh');
776
+
777
+ // Run animation 50ms after previous style declaration (see above) otherwise animation doesn't get triggered
778
+ setTimeout(function () {
779
+ new_repeater_item.style.maxHeight = new_repeater_item.scrollHeight + 'px';
780
+ }, 50);
414
781
  });
415
782
  }
416
783
 
417
784
  /***/ }),
418
- /* 5 */
785
+ /* 9 */
419
786
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
420
787
 
421
788
  "use strict";
789
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _Shader; });
790
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
791
+
792
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
793
+
794
+ var Shader = function () {
795
+ function Shader() {
796
+ _classCallCheck(this, Shader);
797
+ }
798
+
799
+ _createClass(Shader, [{
800
+ key: 'isSet',
801
+ value: function isSet() {
802
+ if ($('#background-shader').length > 0) {
803
+ return true;
804
+ } else {
805
+ return false;
806
+ }
807
+ }
808
+
809
+ // SETUP SHADER
810
+
811
+ }, {
812
+ key: 'setup',
813
+ value: function setup() {
814
+
815
+ var Container = PIXI.Container,
816
+ autoDetectRenderer = PIXI.autoDetectRenderer,
817
+ loader = PIXI.loader,
818
+ resources = PIXI.loader.resources,
819
+ Sprite = PIXI.Sprite;
820
+
821
+ // Create a container object called the `stage`
822
+ this.stage = new Container();
823
+
824
+ // Create 'renderer'
825
+ this.renderer = PIXI.autoDetectRenderer(window.innerWidth, window.innerHeight);
826
+
827
+ // //Add the canvas to the HTML document
828
+
829
+ document.getElementById('background-shader').appendChild(this.renderer.view);
830
+
831
+ this.renderer.backgroundColor = 0xFF00FF;
832
+
833
+ // canvas full window
834
+ this.renderer.view.style.position = "fixed";
835
+ this.renderer.view.style.display = "block";
836
+
837
+ var fragmentShader = document.getElementById("fragmentShader").innerHTML;
838
+
839
+ var currentTime = Math.sin(Date.now()) + 0.5;
840
+
841
+ this.uniforms = {
842
+ uTime: { type: '1f', value: 0.0 },
843
+ uCurrentTime: { type: '1f', value: currentTime },
844
+ uMouse: { type: '2f', value: [window.innerWidth, window.innerHeight] },
845
+ uWindowSize: { type: '2f', value: [window.innerWidth, window.innerHeight] }
846
+ };
847
+
848
+ this.customShader = new PIXI.AbstractFilter(null, fragmentShader, this.uniforms);
849
+ this.drawRectagle();
850
+ }
851
+
852
+ // DRAW RECTANGLE
853
+
854
+ }, {
855
+ key: 'drawRectagle',
856
+ value: function drawRectagle() {
857
+
858
+ this.rectangle = new PIXI.Graphics();
859
+
860
+ // Set the default background color wo if browser doesn't support the filter we still see the primary color
861
+ var colorWithHash = '#FF00FF';
862
+ var colorWith0x = '0x' + colorWithHash.slice(1, 7);
863
+ this.rectangle.beginFill(colorWith0x);
864
+
865
+ // Create the background rectanlge
866
+ this.rectangle.drawRect(0, 0, window.innerWidth, window.innerHeight);
867
+ this.rectangle.endFill();
868
+
869
+ // Setup the filter (shader)
870
+ this.rectangle.filters = [this.customShader];
871
+
872
+ // Add background to stage
873
+ this.stage.addChild(this.rectangle);
874
+ }
875
+
876
+ // START ANIMATION
877
+
878
+ }, {
879
+ key: 'start',
880
+ value: function start() {
881
+ animate();
882
+ }
883
+
884
+ // MOUSE UPDATE
885
+
886
+ }, {
887
+ key: 'mouseUpdate',
888
+ value: function mouseUpdate(event) {
889
+
890
+ // If uniforms haven't been set yet don't do anything and exit
891
+ if (typeof this.uniforms === 'undefined') return;
892
+
893
+ // udpate mouse coordinates for the shader
894
+ this.customShader.uniforms.uMouse = [event.pageX, event.pageY];
895
+ }
896
+
897
+ // RESIZE
898
+
899
+ }, {
900
+ key: 'resize',
901
+ value: function resize() {
902
+
903
+ // let scale = scaleToWindow( this.renderer.view )
904
+ var prevWidth = this.renderer.view.style.width;
905
+ var prevHeight = this.renderer.view.style.height;
906
+ this.renderer.view.style.width = window.innerWidth + "px";
907
+ this.renderer.view.style.height = window.innerHeight + "px";
908
+ this.customShader.uniforms.uWindowSize = [window.innerWidth, window.innerHeight];
909
+
910
+ // Plese check this out ↴↴↴
911
+ // this.rectangle.scale.x = window.innerWidth / prevWidth
912
+ // this.rectangle.scale.y = window.innerHeight / prevHeight
913
+ }
914
+ }]);
915
+
916
+ return Shader;
917
+ }();
918
+
919
+ var _Shader = new Shader();
920
+
921
+ // ANIMATE
922
+ // -------
923
+ function animate() {
924
+
925
+ // start the timer for the next animation loop
926
+ requestAnimationFrame(animate);
927
+ _Shader.customShader.uniforms.uTime += 0.01;
928
+ // this is the main render call that makes pixi draw your container and its children.
929
+ _Shader.renderer.render(_Shader.stage);
930
+ }
931
+
932
+ // CONVERT HEX TO RGB COLORS
933
+ // -------------------------
934
+ function hexToShaderRgb(hex) {
935
+
936
+ // Precision of the float number
937
+ var precision = 100;
938
+ // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
939
+ var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
940
+ hex = hex.replace(shorthandRegex, function (m, r, g, b) {
941
+ return r + r + g + g + b + b;
942
+ });
943
+
944
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
945
+ return result ? {
946
+ // Get a number between 0.00 and 1.00
947
+ r: Math.round(parseInt(result[1], 16) * precision / 255) / precision,
948
+ g: Math.round(parseInt(result[2], 16) * precision / 255) / precision,
949
+ b: Math.round(parseInt(result[3], 16) * precision / 255) / precision
950
+ } : null;
951
+ }
952
+
953
+ // REQUEST ANIMATION POLYFILL
954
+ // --------------------------
955
+ // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
956
+ // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
957
+ // requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
958
+ // MIT license
959
+ (function () {
960
+ var lastTime = 0;
961
+ var vendors = ['ms', 'moz', 'webkit', 'o'];
962
+ for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
963
+ window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
964
+ window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
965
+ }
966
+
967
+ if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) {
968
+ var currTime = new Date().getTime();
969
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
970
+ var id = window.setTimeout(function () {
971
+ callback(currTime + timeToCall);
972
+ }, timeToCall);
973
+ lastTime = currTime + timeToCall;
974
+ return id;
975
+ };
976
+
977
+ if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {
978
+ clearTimeout(id);
979
+ };
980
+ })();
981
+
982
+ // Mozilla MDN optimized resize
983
+ // https://developer.mozilla.org/en-US/docs/Web/Events/resize
984
+ (function () {
985
+ var throttle = function throttle(type, name, obj) {
986
+ obj = obj || window;
987
+ var running = false;
988
+ var func = function func() {
989
+ if (running) {
990
+ return;
991
+ }
992
+ running = true;
993
+ requestAnimationFrame(function () {
994
+ obj.dispatchEvent(new CustomEvent(name));
995
+ running = false;
996
+ });
997
+ };
998
+ obj.addEventListener(type, func);
999
+ };
1000
+
1001
+ /* init - you can init any event */
1002
+ throttle("resize", "optimizedResize");
1003
+ })();
1004
+
1005
+ /***/ }),
1006
+ /* 10 */
1007
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1008
+
1009
+ "use strict";
1010
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _LoginForm; });
1011
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
1012
+
1013
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
1014
+
1015
+ /**
1016
+ * LOGIN FORM
1017
+ *
1018
+ * https://tympanus.net/Development/MinimalForm/
1019
+ * https://github.com/codrops/MinimalForm/blob/master/js/stepsForm.js
1020
+ */
1021
+
1022
+ var LoginForm = function () {
1023
+ function LoginForm() {
1024
+ _classCallCheck(this, LoginForm);
1025
+
1026
+ this.current = 0;
1027
+ this.isFilled = false;
1028
+ }
1029
+
1030
+ _createClass(LoginForm, [{
1031
+ key: 'isSet',
1032
+ value: function isSet() {
1033
+ if ($('.login--form').length > 0) {
1034
+ return true;
1035
+ } else {
1036
+ return false;
1037
+ }
1038
+ }
1039
+ }, {
1040
+ key: 'setEvents',
1041
+ value: function setEvents() {
1042
+ this.$form = $('.login--form');
1043
+ this.$questions = $('ol.login--questions > li');
1044
+ this.questionsCount = this.$questions.length;
1045
+ this.$nextButton = $('button.login--next');
1046
+
1047
+ // Mark the first question as the current one
1048
+ this.$questions.first().addClass('login--current');
1049
+
1050
+ //disable form autocomplete
1051
+ this.$form.attr('autocomplete', 'off');
1052
+
1053
+ var self = this;
1054
+
1055
+ // first input
1056
+ var firstInput = this.$questions.get(this.current).querySelector('input, textarea, select');
1057
+
1058
+ // focus
1059
+ var onFocusStart = function onFocusStart() {
1060
+ firstInput.removeEventListener('focus', onFocusStart);
1061
+ self.$nextButton.addClass('login--show');
1062
+ };
1063
+ // show the next question control first time the input gets focused
1064
+ firstInput.addEventListener('focus', onFocusStart);
1065
+
1066
+ // show next question
1067
+ this.$nextButton.on('click', function (event) {
1068
+ event.preventDefault();
1069
+ self._nextQuestion();
1070
+ });
1071
+
1072
+ // pressing enter will jump to next question
1073
+ this.$form.on('keydown', function (event) {
1074
+ var keyCode = event.keyCode || event.which;
1075
+ // enter
1076
+ if (keyCode === 13) {
1077
+ event.preventDefault();
1078
+ self._nextQuestion();
1079
+ }
1080
+ });
1081
+ }
1082
+ }, {
1083
+ key: '_nextQuestion',
1084
+ value: function _nextQuestion() {
1085
+ // check if form is filled
1086
+ if (this.current === this.questionsCount - 1) {
1087
+ this.isFilled = true;
1088
+ }
1089
+
1090
+ // current question
1091
+ var currentQuestion = this.$questions.get(this.current);
1092
+
1093
+ // increment current question iterator
1094
+ ++this.current;
1095
+
1096
+ if (!this.isFilled) {
1097
+ // add class "show-next" to form element (start animations)
1098
+ this.$form.addClass('login--show-next');
1099
+
1100
+ // remove class "current" from current question and add it to the next one
1101
+ // current question
1102
+ var nextQuestion = this.$questions.get(this.current);
1103
+ $(currentQuestion).removeClass('login--current');
1104
+ $(nextQuestion).addClass('login--current');
1105
+ }
1106
+
1107
+ // after animation ends, remove class "show-next" from form element and change current question placeholder
1108
+ var self = this;
1109
+ var onEndTransition = function onEndTransition() {
1110
+ if (self.isFilled) {
1111
+ self.$form.submit();
1112
+ } else {
1113
+ self.$form.removeClass('login--show-next');
1114
+ // force the focus on the next input
1115
+ nextQuestion.querySelector('input, textarea, select').focus();
1116
+ }
1117
+ };
1118
+
1119
+ setTimeout(onEndTransition, 400); // Wait for CSS transition to complete
1120
+ }
1121
+ }]);
1122
+
1123
+ return LoginForm;
1124
+ }();
1125
+
1126
+ var _LoginForm = new LoginForm();
1127
+
1128
+ /***/ }),
1129
+ /* 11 */
1130
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1131
+
1132
+ "use strict";
1133
+ /* harmony default export */ __webpack_exports__["a"] = function () {
1134
+ $('input[name="login"]').click(function () {
1135
+ var $radio = $(this);
1136
+
1137
+ // if this was previously checked
1138
+ if ($radio.data('waschecked') === true) {
1139
+ $radio.prop('checked', false);
1140
+ $radio.data('waschecked', false);
1141
+ } else $radio.data('waschecked', true);
1142
+
1143
+ // remove was checked from other radios
1144
+ $radio.siblings('input[name="login"]').data('waschecked', false);
1145
+ });
1146
+ };
1147
+
1148
+ /***/ }),
1149
+ /* 12 */
1150
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1151
+
1152
+ "use strict";
1153
+ /**
1154
+ * SORTABLE
1155
+ */
1156
+
422
1157
  /* harmony default export */ __webpack_exports__["a"] = function () {
423
1158
  if ($('.sortable').length > 0) {
424
1159
  // Initialize sortable item
425
1160
  $('.sortable').sortable({
1161
+ stop: function stop(event, ui) {
1162
+ ui.item.css('z-index', 0);
1163
+ },
426
1164
  placeholder: "ui-state-highlight",
427
1165
  update: function update() {
428
- $.post($(this).data('update-url'), $(this).sortable('serialize'));
1166
+ if ($('.popup-warning').length > 0) {
1167
+ $('.sortable').addClass('sortable--disabled');
1168
+ $('.popup-warning').removeClass('popup-warning--hidden');
1169
+ $(this).sortable('option', 'disabled', true);
1170
+ }
1171
+ var url = $(this).data('update-url');
1172
+ var data = $(this).sortable('serialize');
1173
+ // If there is a pagination update accordingly
1174
+ data = data.concat('&id=' + $(this).attr('id'));
1175
+ $.post(url, data);
429
1176
  }
430
1177
  });
431
1178
 
@@ -441,12 +1188,21 @@ function addNewItem(event) {
441
1188
  $('.sortable--disabled').sortable('disable');
442
1189
  }
443
1190
 
444
- $(document).on('click', '.sortable--toggle', function (event) {
1191
+ // If there is a sortable toggle button prepare the sortable items accordingly
1192
+ if ($('.sortable--toggle').length > 0) {
1193
+ setupSortableToggle();
1194
+ }
1195
+
1196
+ // Add event to any sortable toggle button
1197
+ // TODO: make this event available to element which aren't standard form repeaters
1198
+ $(document).on('click', '.standard-form--repeater .sortable--toggle', function (event) {
445
1199
  event.preventDefault();
446
1200
  var id = '#' + $(this).data('repeater-id');
447
1201
 
448
1202
  if ($(id).hasClass('sortable--disabled')) {
449
1203
  $(id).sortable('enable');
1204
+ $(id).find('.form-item--repeater-fields').each(close);
1205
+ $(id).find('.form-item--collapsable').addClass('form-item--collapsed');
450
1206
  } else {
451
1207
  $(id).sortable('disable');
452
1208
  }
@@ -457,18 +1213,41 @@ function addNewItem(event) {
457
1213
  });
458
1214
  };
459
1215
 
1216
+ function setupSortableToggle() {
1217
+ $('.sortable--toggle').each(function () {
1218
+ var id = '#' + $(this).data('repeater-id');
1219
+ $(id).find('.form-item--collapsable').addClass('form-item--collapsed');
1220
+ $(id).find('.form-item--repeater-fields').each(close);
1221
+ });
1222
+ }
1223
+
1224
+ function close() {
1225
+ this.style.maxHeight = '0px';
1226
+ }
1227
+
1228
+ function open() {
1229
+ this.style.maxHeight = this.scrollHeight + "px";
1230
+ }
1231
+
460
1232
  /***/ }),
461
- /* 6 */
1233
+ /* 13 */
462
1234
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
463
1235
 
464
1236
  "use strict";
465
1237
  Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
466
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_form_item__ = __webpack_require__(1);
467
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_form_item_repeater__ = __webpack_require__(4);
468
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_form_item_asset__ = __webpack_require__(2);
469
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__components_form_item_choice__ = __webpack_require__(3);
1238
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_form_item__ = __webpack_require__(5);
1239
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_form_item_repeater__ = __webpack_require__(8);
1240
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_form_item_image__ = __webpack_require__(7);
1241
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__components_form_item_choice__ = __webpack_require__(6);
470
1242
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__components_form_item_editor__ = __webpack_require__(0);
471
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__components_sortable__ = __webpack_require__(5);
1243
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__components_fileupload__ = __webpack_require__(4);
1244
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__components_login_shader__ = __webpack_require__(9);
1245
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__components_login_form__ = __webpack_require__(10);
1246
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__components_sortable__ = __webpack_require__(12);
1247
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__components_field_group_editor__ = __webpack_require__(3);
1248
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__components_bootstrap__ = __webpack_require__(2);
1249
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__components_select2__ = __webpack_require__(1);
1250
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__components_radio_toggle__ = __webpack_require__(11);
472
1251
  ///- - - - - - - - - - - - - - - - - - - -
473
1252
  /// INDEX OF BINDA'S SCRIPTS
474
1253
  ///- - - - - - - - - - - - - - - - - - - -
@@ -480,6 +1259,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
480
1259
 
481
1260
 
482
1261
 
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
483
1269
  $(document).ready(function () {
484
1270
  if (__WEBPACK_IMPORTED_MODULE_0__components_form_item__["a" /* _FormItem */].isSet()) {
485
1271
  __WEBPACK_IMPORTED_MODULE_0__components_form_item__["a" /* _FormItem */].setEvents();
@@ -487,8 +1273,8 @@ $(document).ready(function () {
487
1273
  if (__WEBPACK_IMPORTED_MODULE_1__components_form_item_repeater__["a" /* _FormItemRepeater */].isSet()) {
488
1274
  __WEBPACK_IMPORTED_MODULE_1__components_form_item_repeater__["a" /* _FormItemRepeater */].setEvents();
489
1275
  }
490
- if (__WEBPACK_IMPORTED_MODULE_2__components_form_item_asset__["a" /* _FormItemAsset */].isSet()) {
491
- __WEBPACK_IMPORTED_MODULE_2__components_form_item_asset__["a" /* _FormItemAsset */].setEvents();
1276
+ if (__WEBPACK_IMPORTED_MODULE_2__components_form_item_image__["a" /* _FormItemImage */].isSet()) {
1277
+ __WEBPACK_IMPORTED_MODULE_2__components_form_item_image__["a" /* _FormItemImage */].setEvents();
492
1278
  }
493
1279
  if (__WEBPACK_IMPORTED_MODULE_3__components_form_item_choice__["a" /* _FormItemChoice */].isSet()) {
494
1280
  __WEBPACK_IMPORTED_MODULE_3__components_form_item_choice__["a" /* _FormItemChoice */].setEvents();
@@ -496,7 +1282,28 @@ $(document).ready(function () {
496
1282
  if (__WEBPACK_IMPORTED_MODULE_4__components_form_item_editor__["a" /* _FormItemEditor */].isSet()) {
497
1283
  __WEBPACK_IMPORTED_MODULE_4__components_form_item_editor__["a" /* _FormItemEditor */].setEvents();
498
1284
  }
499
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__components_sortable__["a" /* default */])();
1285
+ if (__WEBPACK_IMPORTED_MODULE_5__components_fileupload__["a" /* _FileUpload */].isSet()) {
1286
+ __WEBPACK_IMPORTED_MODULE_5__components_fileupload__["a" /* _FileUpload */].setEvents();
1287
+ }
1288
+ if (__WEBPACK_IMPORTED_MODULE_7__components_login_form__["a" /* _LoginForm */].isSet()) {
1289
+ __WEBPACK_IMPORTED_MODULE_7__components_login_form__["a" /* _LoginForm */].setEvents();
1290
+ }
1291
+ if (__WEBPACK_IMPORTED_MODULE_6__components_login_shader__["a" /* _Shader */].isSet()) {
1292
+ __WEBPACK_IMPORTED_MODULE_6__components_login_shader__["a" /* _Shader */].setup();
1293
+ __WEBPACK_IMPORTED_MODULE_6__components_login_shader__["a" /* _Shader */].start();
1294
+ }
1295
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_12__components_radio_toggle__["a" /* default */])();
1296
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_8__components_sortable__["a" /* default */])();
1297
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__components_field_group_editor__["a" /* default */])();
1298
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__components_bootstrap__["a" /* default */])();
1299
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_11__components_select2__["a" /* default */])();
1300
+ });
1301
+
1302
+ // handle event
1303
+ window.addEventListener("optimizedResize", function () {
1304
+ if (__WEBPACK_IMPORTED_MODULE_6__components_login_shader__["a" /* _Shader */].isSet()) {
1305
+ __WEBPACK_IMPORTED_MODULE_6__components_login_shader__["a" /* _Shader */].resize();
1306
+ }
500
1307
  });
501
1308
 
502
1309
  /***/ })