binda 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
data/Rakefile CHANGED
@@ -24,21 +24,9 @@ load 'rails/tasks/statistics.rake'
24
24
  require 'bundler/gem_tasks'
25
25
 
26
26
 
27
-
28
- # # I guess this generate test file every time you use `rails g` command
29
- # require 'rake/testtask'
30
- # Rake::TestTask.new(:test) do |t|
31
- # t.libs << 'lib'
32
- # t.libs << 'test'
33
- # t.pattern = 'test/**/*_test.rb'
34
- # t.verbose = false
35
- # t.warning = false
36
- # end
37
- # task default: :test
38
-
39
27
  # This should ensure creation of spec instead of test (partially true)
40
28
  # https://stackoverflow.com/a/4632188/1498118
41
29
  require 'rspec/core/rake_task'
42
30
  RSpec::Core::RakeTask.new('spec')
43
31
  # If you want to make this the default task
44
- task default: :spec
32
+ task default: :spec
@@ -11,8 +11,31 @@
11
11
  // about supported directives.
12
12
  //
13
13
 
14
+ // JQuery
14
15
  //= require jquery
15
16
  //= require jquery_ujs
16
17
  //= require jquery-ui/widgets/sortable
18
+ //= require jquery-ui/widget
19
+
20
+ // TinyMCE
17
21
  //= require tinymce-jquery
22
+
23
+ // Bootstrap dependency
24
+ // https://v4-alpha.getbootstrap.com/components/tooltips/
25
+ // require tether.min
26
+
27
+ // Bootstrap
28
+ //= require bootstrap/bootstrap-sprockets
29
+
30
+ // Select2
31
+ //= require select2/select2.full.min
32
+
33
+ // TweenLite
34
+ // GSAP/CSSPlugin.min
35
+ // GSAP/EasePack.min
36
+ // GSAP/ScrollToPlugin.min
37
+ // GSAP/TweenLite.min
38
+
39
+ // Binda scripts
18
40
  //= require binda/dist/binda.bundle.js
41
+
@@ -0,0 +1,9 @@
1
+ /**
2
+ * BOOSTRAP SCRIPT
3
+ */
4
+
5
+ export default function()
6
+ {
7
+ // See https://v4-alpha.getbootstrap.com/components/tooltips/#example-enable-tooltips-everywhere
8
+ $('[data-toggle="tooltip"]').tooltip()
9
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * FIELD GROUP EDITOR
3
+ */
4
+
5
+ export default function()
6
+ {
7
+ $('.field_groups-edit #save').on('click', function(event)
8
+ {
9
+ let instanceType = $(this).data('instance-type')
10
+ let entriesNumber = $(this).data('entries-number')
11
+
12
+ // If the current structure have many entries updating the field group
13
+ // might be a slow operation, therefore it's good practice to inform the user
14
+ if ( entriesNumber > 500 ) {
15
+ alert(`You have ${entriesNumber} ${instanceType}. This operation might take some time to complete. To avoid unexpected behaviour don't leave or refresh the page`)
16
+ }
17
+ })
18
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * FILE UPLOAD
3
+ *
4
+ * see https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/
5
+ *
6
+ */
7
+
8
+ class FileUpload {
9
+
10
+ constructor(){
11
+ this.target = '.fileupload'
12
+ }
13
+
14
+ isSet()
15
+ {
16
+ if ( $( this.target ).length > 0 ) { return true }
17
+ else { return false }
18
+ }
19
+
20
+ setEvents()
21
+ {
22
+ let self = this
23
+
24
+ $(document).on('click', '.fileupload--remove-image-btn', remove_preview)
25
+
26
+ $(document).on('change', `${this.target} input.file`, handle_file)
27
+ }
28
+ }
29
+
30
+ export let _FileUpload = new FileUpload()
31
+
32
+
33
+ /**
34
+ * HELPER FUNCTIONS
35
+ */
36
+
37
+ // Reference --> http://blog.teamtreehouse.com/uploading-files-ajax
38
+ function handle_file(event)
39
+ {
40
+ let id = event.target.getAttribute('data-id')
41
+ let $parent = $('#fileupload-'+id)
42
+ let $preview = $('#fileupload-'+id+' .fileupload--preview')
43
+
44
+ // Get the selected file from the input
45
+ // This script doesn't consider multiple files upload
46
+ let file = event.target.files[0]
47
+
48
+ // Don't go any further if no file has been selected
49
+ if ( typeof file === 'undefined' ) { return }
50
+
51
+ // Create a new FormData object which will be sent to the server
52
+ let formData = new FormData()
53
+
54
+ // Get data from the input element
55
+ $parent.find('input').each(function()
56
+ {
57
+ if ( this.isSameNode(event.target) )
58
+ {
59
+ // Add the file to the request
60
+ formData.append(this.getAttribute('name'), file, file.name)
61
+ } else {
62
+ // Add secondary values to the request
63
+ formData.append(this.getAttribute('name'), this.getAttribute('value'))
64
+ }
65
+ })
66
+
67
+ // If it's inside a repeater add repeater parameters
68
+ let $parent_repeater = $parent.closest('.form-item--repeater-fields')
69
+ if ( $parent.closest('.form-item--repeater-fields').length > 0 )
70
+ {
71
+ $parent_repeater.children('.form-group').find('input').each(function()
72
+ {
73
+ formData.append(this.getAttribute('name'), this.getAttribute('value'))
74
+ })
75
+ }
76
+
77
+ // Is this needed? Apparently it works without it. Is it a security issue?
78
+ // let token = document.querySelector('meta[name="csrf-token"]').content
79
+ // formData.append('authenticity_token', token)
80
+
81
+ // Display loader
82
+ $('.popup-warning').removeClass('popup-warning--hidden')
83
+
84
+ // Open the connection
85
+ $.ajax(
86
+ {
87
+ url: event.target.getAttribute('data-url'),
88
+ type: 'PATCH',
89
+ processData: false, // needed to pass formData with the current format
90
+ contentType: false, // needed to pass formData with the current format
91
+ data: formData
92
+ }).done( function(data)
93
+ {
94
+ if ( data.type == 'image' ) { setup_image_preview(data, id) }
95
+ else if ( data.type == 'video' ) { setup_video_preview(data, id) }
96
+ else { alert('Something went wrong. No preview has been received.') }
97
+
98
+ // Hide loaded
99
+ $('.popup-warning').addClass('popup-warning--hidden')
100
+
101
+ // Display details and buttons
102
+ $parent.find('.fileupload--details').removeClass('fileupload--details--hidden')
103
+ $parent.find('.fileupload--remove-image-btn').removeClass('fileupload--remove-image-btn--hidden')
104
+ }).fail( function()
105
+ {
106
+ // Hide loaded
107
+ $('.popup-warning').addClass('popup-warning--hidden')
108
+ alert('Something went wrong. Upload process failed.')
109
+ })
110
+ }
111
+
112
+ function reset_file(event)
113
+ {
114
+ let input = event.target
115
+
116
+ input.value = ''
117
+
118
+ if(!/safari/i.test(navigator.userAgent)){
119
+ input.type = ''
120
+ input.type = 'file'
121
+ }
122
+ }
123
+
124
+ function remove_preview(event)
125
+ {
126
+ let id = event.target.getAttribute('data-id')
127
+ let $parent = $('#fileupload-'+id)
128
+
129
+ // Reset previews (either image or video)
130
+ $parent.find('.fileupload--preview').css('background-image','').removeClass('fileupload--preview--uploaded')
131
+ $parent.find('video source').attr('src', '')
132
+
133
+ // Reset buttons to initial state
134
+ $parent.find('.fileupload--remove-image-btn').addClass('fileupload--remove-image-btn--hidden')
135
+ $parent.find('.fileupload--details').addClass('fileupload--details--hidden')
136
+ }
137
+
138
+ function setup_image_preview(data, id)
139
+ {
140
+ let $parent = $('#fileupload-'+id)
141
+ let $preview = $('#fileupload-'+id+' .fileupload--preview')
142
+
143
+ // Update thumbnail
144
+ $preview.css('background-image', `url(${data.thumbnailUrl})`)
145
+
146
+ // Remove and add class to trigger css animation
147
+ let uploadedClass = 'fileupload--preview--uploaded'
148
+ $preview.removeClass(uploadedClass).addClass(uploadedClass)
149
+
150
+ // Update details
151
+ $parent.find('.fileupload--width').text(data.width)
152
+ $parent.find('.fileupload--height').text(data.height)
153
+ $parent.find('.fileupload--filesize').text(data.size)
154
+ $parent.find('.fileupload--filename').text(data.name)
155
+ }
156
+
157
+ function setup_video_preview(data, id)
158
+ {
159
+ let $parent = $('#fileupload-'+id)
160
+ let $preview = $('#fileupload-'+id+' .fileupload--preview')
161
+
162
+ $preview.removeClass('fileupload--preview--uploaded')
163
+ .find('video')
164
+ .attr('id', 'video-' + id)
165
+ .find('source')
166
+ .attr('src', data.url)
167
+ .attr('type', 'video/' + data.ext)
168
+
169
+ // If video source isn't blank load it (consider that a video tag is always present)
170
+ if ( $preview.find('video source').attr('src').length > 0 )
171
+ {
172
+ $preview.find('video').get(0).load()
173
+ }
174
+
175
+ // Remove and add class to trigger css animation
176
+ let uploadedClass = 'fileupload--preview--uploaded'
177
+ $preview.removeClass(uploadedClass).addClass(uploadedClass)
178
+
179
+ // Update details
180
+ $parent.find('.fileupload--filesize').text(data.size)
181
+ $parent.find('.fileupload--filename').text(data.name)
182
+ }
@@ -1,45 +1,78 @@
1
- ///- - - - - - - - - - - - - - - - - - - -
2
- /// FORM ITEM
3
- ///- - - - - - - - - - - - - - - - - - - -
1
+ /**
2
+ * FORM ITEM
3
+ */
4
4
 
5
5
  import { _FormItemEditor } from './form_item_editor'
6
+ import { setupSelect2 } from './select2'
7
+
8
+ // Component Global Variables
9
+ let newFormItemId = 1
6
10
 
7
11
  class FormItem {
8
12
 
9
- constructor()
10
- {
11
- this.target = '.form-item'
12
- }
13
+ constructor(){}
13
14
 
14
15
  isSet()
15
16
  {
16
- if ( $( this.target ).length > 0 ) { return true }
17
+ if ( $('.form-item').length > 0 ) { return true }
17
18
  else { return false }
18
19
  }
19
20
 
20
21
  setEvents()
21
22
  {
22
- $(document).on('click', this.target + '--add-new', addNewItem )
23
+ $(document).on('click', '.form-item--add-new', addNewItem )
23
24
 
24
25
  $(document).on('click', '.form-item--remove-item-with-js', function( event )
25
26
  {
26
27
  // Stop default behaviour
27
28
  event.preventDefault()
28
- $( this ).parent( this.target ).remove()
29
+ $( this ).closest('.form-item').remove()
30
+ })
31
+
32
+ $(document).on('click', '.form-item--collapse-btn', function( event )
33
+ {
34
+ // This function is temporarely just set for repeaters.
35
+ // TODO: Need refactoring in order to be available also for generic form items
36
+
37
+ // Stop default behaviour
38
+ event.preventDefault()
39
+
40
+ let $collapsable = $(this).closest('.form-item--collapsable')
41
+
42
+ if ( $collapsable.hasClass('form-item--collapsed') )
43
+ {
44
+ $collapsable.find('.form-item--repeater-fields').each(open)
45
+ $collapsable.removeClass('form-item--collapsed')
46
+ }
47
+ else
48
+ {
49
+ $collapsable.find('.form-item--repeater-fields').each(close)
50
+ $collapsable.addClass('form-item--collapsed')
51
+ }
29
52
  })
30
53
 
31
- $(document).on('click', '.form-item--open-button, .form-item--close-button', function()
54
+ $(document).on('click', '.form-item--toggle-button', function()
32
55
  {
33
- var formItemEditor = $( this ).parent('.form-item').children('.form-item--editor')
34
56
 
35
- // Make sure form-item--editor max-height correspond to the actual height
36
- // this is needed for the CSS transition which is trigger clicking open/close button
37
- if ( !formItemEditor.hasClass('form-item--editor-close') )
38
- { _FormItemEditor.resize() }
57
+ let $formItem = $( this ).closest('.form-item')
58
+ let $formItemEditor = $formItem.children('.form-item--editor')
59
+
60
+ if ( $formItemEditor.get(0).style.maxHeight === '' )
61
+ {
62
+ // Update height
63
+ $formItemEditor.get(0).style.maxHeight = $formItemEditor.get(0).scrollHeight + "px";
39
64
 
40
- // Update classes
41
- formItemEditor.toggleClass('form-item--editor-close')
42
- $( this ).parent('.form-item').children('.form-item--open-button, .form-item--close-button').toggle()
65
+ // Add class to trigger animation
66
+ $formItem.children('.form-item--toggle-button').removeClass('form-item--toggle-button-closed')
67
+ }
68
+ else
69
+ {
70
+ // Zero height
71
+ $formItemEditor.get(0).style.maxHeight = null;
72
+
73
+ // Add class to trigger animation
74
+ $formItem.children('.form-item--toggle-button').addClass('form-item--toggle-button-closed')
75
+ }
43
76
  })
44
77
  }
45
78
  }
@@ -51,15 +84,50 @@ export let _FormItem = new FormItem()
51
84
  /// COMPONENT HELPER FUNCTIONS
52
85
  ///- - - - - - - - - - - - - - - - - - - -
53
86
 
54
- function addNewItem( event )
87
+ // This function could be improved as it generates an issue with
88
+ // input ids which are duplicated after the entire target has been cloned
89
+ function addNewItem(event)
55
90
  {
56
91
  // Stop default behaviour
57
92
  event.preventDefault()
58
- // Get the child to clone
59
- let id = $( event.target ).data( 'new-child-id' )
93
+ // Get the child to clone
94
+ // (`this` always refers to the second argument of the $(document).on() method, in this case '.form-item--add-new')
95
+ let id = $( this ).data( 'new-form-item-id' )
60
96
  let $newChild = $( '#' + id )
61
97
  // Clone child and remove id and styles from cloned child
62
98
  $newChild.clone().insertAfter( $newChild )
63
- $newChild.removeClass( 'form-item--new' ).removeAttr( 'id' )
99
+ // Remove class in order to remove styles, and change id so it's reachable when testing
100
+ $newChild.removeClass( 'form-item--new' ).attr( 'id', 'new-form-item-'+newFormItemId )
101
+
102
+ // // Update all ids to avoid duplication
103
+ $newChild.find('[id]').each(function(){
104
+ let oldId = $(this).attr('id')
105
+ let newId = oldId + '-' + newFormItemId
106
+ $(this).attr('id', newId )
107
+ let $forId = $newChild.find('[for='+ oldId +']')
108
+ if ( $forId.length > 0 ) { $forId.attr('for', newId) }
109
+ })
110
+
111
+ // Update height (max-height) of the new element
112
+ let $formItemEditor = $('#new-form-item-'+newFormItemId).find('.form-item--editor')
113
+
114
+ // override current max-height which is set to 0
115
+ $formItemEditor.get(0).style.maxHeight = $formItemEditor.get(0).scrollHeight + "px";
116
+
64
117
  _FormItemEditor.resize()
118
+
119
+ // Increment global id variable `newFormItemId` in case needs to be used again
120
+ newFormItemId++
121
+
122
+ setupSelect2( $formItemEditor.find('select') )
123
+ }
124
+
125
+ function close()
126
+ {
127
+ this.style.maxHeight = '0px'
128
+ }
129
+
130
+ function open()
131
+ {
132
+ this.style.maxHeight = this.scrollHeight + "px";
65
133
  }
@@ -1,6 +1,6 @@
1
- ///- - - - - - - - - - - - - - - - - - - -
2
- /// FORM ITEM
3
- ///- - - - - - - - - - - - - - - - - - - -
1
+ /**
2
+ * FORM ITEM CHOICE
3
+ */
4
4
 
5
5
  import { _FormItemEditor } from './form_item_editor'
6
6
 
@@ -24,7 +24,7 @@ class FormItemChoice {
24
24
  {
25
25
  event.preventDefault()
26
26
  // Clone the new choice field
27
- var choices = $( this ).parent('.form-item--choices')
27
+ var choices = $( this ).closest('.form-item--choices')
28
28
  var newchoice = choices.find('.form-item--new-choice')
29
29
  var clone = newchoice.clone().removeClass('form-item--new-choice').toggle()
30
30
  clone.find('.form-item--toggle-choice').toggle()
@@ -38,19 +38,26 @@ class FormItemChoice {
38
38
  {
39
39
  event.preventDefault()
40
40
 
41
- var choice = $( this ).parent('.form-item--choice')
41
+ var choice = $( this ).closest('.form-item--choice')
42
42
  var destination = $( this ).attr('href')
43
-
43
+ var self = this
44
+
44
45
  $.ajax({
45
46
  url: destination,
46
47
  type: 'DELETE',
47
- success: function() { choice.remove() }
48
+ success: function() {
49
+ choice.remove()
50
+ // Update form item editor size
51
+ _FormItemEditor.resize()
52
+ }
48
53
  })
49
54
  })
50
55
  $(document).on('click', '.form-item--js-delete-choice', function( event )
51
56
  {
52
57
  event.preventDefault()
53
- $( this ).parent('.form-item--choice').remove()
58
+ $( this ).closest('.form-item--choice').remove()
59
+ // Update form item editor size
60
+ _FormItemEditor.resize()
54
61
  })
55
62
  }
56
63
  }