binda 0.1.5 → 0.1.6

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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +42 -26
  3. data/Rakefile +4 -0
  4. data/app/assets/javascripts/binda/application.js +3 -0
  5. data/app/assets/javascripts/binda/components/field_setting_choices.js +5 -5
  6. data/app/assets/javascripts/binda/components/fileupload.js +1 -1
  7. data/app/assets/javascripts/binda/components/form_item_collapsable.js +245 -0
  8. data/app/assets/javascripts/binda/components/form_item_image.js +1 -1
  9. data/app/assets/javascripts/binda/components/login-shader.js +1 -1
  10. data/app/assets/javascripts/binda/components/login_form.js +1 -1
  11. data/app/assets/javascripts/binda/components/sortable.js +21 -30
  12. data/app/assets/javascripts/binda/dist/binda.bundle.js +299 -377
  13. data/app/assets/javascripts/binda/index.js +9 -17
  14. data/app/assets/stylesheets/binda/components/field_setting_choices.scss +5 -3
  15. data/app/assets/stylesheets/binda/components/form_item.scss +23 -70
  16. data/app/assets/stylesheets/binda/components/standard-form.scss +56 -1
  17. data/app/assets/stylesheets/binda/settings/tiny_mce_overrides.scss +8 -0
  18. data/app/controllers/binda/application_controller.rb +6 -0
  19. data/app/controllers/binda/boards_controller.rb +18 -12
  20. data/app/controllers/binda/components_controller.rb +21 -16
  21. data/app/controllers/binda/field_groups_controller.rb +57 -16
  22. data/app/controllers/binda/field_settings_controller.rb +14 -2
  23. data/app/controllers/binda/repeaters_controller.rb +2 -2
  24. data/app/controllers/binda/structures_controller.rb +32 -16
  25. data/app/controllers/concerns/binda/fieldable_helpers.rb +2 -2
  26. data/app/helpers/binda/components_helper.rb +16 -4
  27. data/app/helpers/binda/field_groups_helper.rb +4 -1
  28. data/app/models/binda/asset.rb +1 -3
  29. data/app/models/binda/component.rb +17 -10
  30. data/app/models/binda/date.rb +2 -6
  31. data/app/models/binda/field_group.rb +7 -5
  32. data/app/models/binda/field_setting.rb +69 -8
  33. data/app/models/binda/gallery.rb +2 -3
  34. data/app/models/binda/image.rb +7 -1
  35. data/app/models/binda/relation.rb +2 -5
  36. data/app/models/binda/repeater.rb +10 -14
  37. data/app/models/binda/selection.rb +3 -3
  38. data/app/models/binda/structure.rb +9 -5
  39. data/app/models/binda/text.rb +2 -6
  40. data/app/models/binda/user.rb +10 -0
  41. data/app/models/concerns/binda/field_uniqueness.rb +31 -0
  42. data/app/models/concerns/binda/fieldable_association_helpers.rb +31 -11
  43. data/app/models/concerns/binda/fieldable_associations.rb +2 -3
  44. data/app/models/concerns/binda/fields.rb +21 -0
  45. data/app/views/binda/boards/edit.html.erb +2 -1
  46. data/app/views/binda/components/edit.html.erb +2 -1
  47. data/app/views/binda/field_groups/_form_body.html.erb +4 -42
  48. data/app/views/binda/field_groups/_form_header.html.erb +11 -0
  49. data/app/views/binda/field_groups/_form_item.html.erb +4 -6
  50. data/app/views/binda/field_groups/_form_new_item.html.erb +8 -0
  51. data/app/views/binda/field_groups/_form_section.html.erb +17 -27
  52. data/app/views/binda/field_groups/_form_section_repeater.html.erb +17 -18
  53. data/app/views/binda/field_groups/_form_sidebar.html.erb +13 -0
  54. data/app/views/binda/field_groups/form_item/_form_item_editor.html.erb +9 -5
  55. data/app/views/binda/field_groups/form_item/{_form_item_persisted_editor.html.erb → _form_item_editor_existing_item.html.erb} +1 -4
  56. data/app/views/binda/field_groups/form_item/_form_item_editor_new_item.html.erb +3 -0
  57. data/app/views/binda/field_groups/form_item/_form_item_header.html.erb +23 -24
  58. data/app/views/binda/field_groups/form_section/_form_section_header.html.erb +45 -0
  59. data/app/views/binda/field_groups/form_section/_form_section_list.html.erb +9 -0
  60. data/app/views/binda/fieldable/_form_body.html.erb +6 -1
  61. data/app/views/binda/fieldable/_form_item_date.html.erb +1 -1
  62. data/app/views/binda/fieldable/_form_item_image.html.erb +1 -1
  63. data/app/views/binda/fieldable/_form_item_new_repeater.html.erb +7 -21
  64. data/app/views/binda/fieldable/_form_item_relation.html.erb +7 -7
  65. data/app/views/binda/fieldable/_form_item_repeater.html.erb +9 -99
  66. data/app/views/binda/fieldable/_form_item_selections.html.erb +1 -1
  67. data/app/views/binda/fieldable/_form_item_string.html.erb +5 -12
  68. data/app/views/binda/fieldable/_form_item_text.html.erb +5 -13
  69. data/app/views/binda/fieldable/_form_item_video.html.erb +1 -1
  70. data/app/views/binda/fieldable/_form_section.html.erb +11 -10
  71. data/app/views/binda/fieldable/_form_section_repeater.html.erb +2 -3
  72. data/app/views/binda/fieldable/form_item_repeater/_form_item_repeater_header.html.erb +32 -0
  73. data/app/views/binda/fieldable/form_item_repeater/_form_item_repeater_list.html.erb +19 -0
  74. data/app/views/binda/fieldable/form_item_repeater/_form_item_repeater_list_item.html.erb +42 -0
  75. data/app/views/binda/structures/_form_field_group_item.html.erb +5 -0
  76. data/app/views/binda/structures/_form_new_field_group_item.html.erb +8 -0
  77. data/app/views/binda/structures/_form_section.html.erb +16 -78
  78. data/app/views/binda/structures/_form_sidebar.html.erb +9 -8
  79. data/app/views/binda/structures/form_field_group_item/_form_field_group_item_editor.html.erb +18 -0
  80. data/app/views/binda/structures/form_field_group_item/_form_field_group_item_field_setting_form.html.erb +12 -0
  81. data/app/views/binda/structures/form_field_group_item/_form_field_group_item_field_settings.html.erb +18 -0
  82. data/app/views/binda/structures/form_field_group_item/_form_field_group_item_header.html.erb +29 -0
  83. data/app/views/binda/structures/form_section/_form_section_header.html.erb +26 -0
  84. data/app/views/binda/structures/form_section/_form_section_list.html.erb +8 -0
  85. data/config/initializers/simple_form__fileupload.rb +3 -4
  86. data/config/locales/en.yml +9 -4
  87. data/config/routes.rb +4 -0
  88. data/lib/binda/version.rb +1 -1
  89. data/lib/generators/binda/install/install_generator.rb +17 -6
  90. data/lib/generators/binda/maintenance/maintenance_generator.rb +12 -8
  91. data/lib/generators/binda/setup/setup_generator.rb +23 -27
  92. data/lib/tasks/create_missing_field_instances_task.rake +10 -0
  93. data/lib/tasks/remove_orphan_fields_task.rake +1 -7
  94. data/lib/tasks/user_tasks.rake +1 -7
  95. data/vendor/assets/javascripts/lodash.js +17097 -0
  96. metadata +39 -7
  97. data/app/assets/javascripts/binda/components/form_item.js +0 -113
  98. data/app/assets/javascripts/binda/components/form_item_editor.js +0 -39
  99. data/app/assets/javascripts/binda/components/form_item_repeater.js +0 -127
  100. data/app/views/binda/field_groups/form_item/_form_item_new_editor.html.erb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9698551271bf5efe2fbaa045f9fd93b6c5edf49b
4
- data.tar.gz: 7e4772d16ce867877f8059f31c66648aebdb8700
3
+ metadata.gz: 380a6ee6ba0e7fad66075ccd4f6d35f79b7946d3
4
+ data.tar.gz: 04d50e53a323cff2202b6ea28fc422eed13d625c
5
5
  SHA512:
6
- metadata.gz: 23a18574bd5b641433165fd1954bf3a52e65aa44d5b98be39bbb8554d2813756b054461e8e41fc6c69769fe6701cb4d22bcb7c082c097765c24c452794242c50
7
- data.tar.gz: d1a3ca511d47479cd569e9fd716afed73183d391085994a752ffa32c9fc62756ca14a15c2b631d793accc60632c8e8e0b2b1adcbc059787d5eb84464a1c11f58
6
+ metadata.gz: 668e07be1cf3f3c424b79d48c0dbd17698a6f7919870dd0121b8efde2cb9e327f01517f4b5702284dfb31f6fc8960bcef1f4e160be96bd832d046f86199d6f52
7
+ data.tar.gz: c5d557f08401dd999c81162bc7cad8f375b75f079d0ff22c75d824ca6e9840de555d51e0a58661ab6415435919f1dbde3dcb072aaa74e651e9bf0bd877632904
data/README.md CHANGED
@@ -3,7 +3,6 @@ A modular CMS for Ruby on Rails 5.1.
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/binda.svg)](https://badge.fury.io/rb/binda)
5
5
  [![Code Climate](https://codeclimate.com/github/lacolonia/binda/badges/gpa.svg)](https://codeclimate.com/github/lacolonia/binda)
6
- [![Build Status](https://travis-ci.org/a-barbieri/binda.svg?branch=master)](https://travis-ci.org/lacolonia/binda)
7
6
  [![Test Coverage](https://api.codeclimate.com/v1/badges/5dc62774a6b8b63aa72b/test_coverage)](https://codeclimate.com/github/lacolonia/binda/test_coverage)
8
7
  [![Dependency Status](https://gemnasium.com/badges/github.com/lacolonia/binda.svg)](https://gemnasium.com/github.com/lacolonia/binda)
9
8
  [![Inline docs](http://inch-ci.org/github/lacolonia/binda.svg?branch=master)](http://inch-ci.org/github/lacolonia/binda)
@@ -430,30 +429,30 @@ You can retrieve field content from a instance of `Binda::Component`, `Binda::Bo
430
429
 
431
430
  | Helper |||
432
431
  |---|---|---|
433
- | `has_text`| Returns `true/false` | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_text) |
434
- | `get_text`| Returns the text. Use [`simple_format`](https://apidock.com/rails/ActionView/Helpers/TextHelper/simple_format) to maintain HTML tags. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_text) |
435
- | `has_string`| Returns `true/false`. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_string) |
436
- | `get_string`| Returns the text. Use [`simple_format`](https://apidock.com/rails/ActionView/Helpers/TextHelper/simple_format) to maintain HTML tags. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_string) |
437
- |`has_image`| Returns `true/false`.| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_image) |
438
- |`get_image_url(size)`| Returns the url of the image. A thumbnail version (200x200) by specifying `thumb` size. If no size is provided the method will return the original image size. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_image_url) |
439
- |`get_image_path(size)`| Returns the path of the image. A thumbnail version (200x200) by specifying `thumb` size. If no size is provided the method will return the original image size. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_image_path) |
440
- |`get_image_size`| Returns the image size in MB. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_image_size) |
441
- |`get_image_dimension`| Returns a hash { width: xxx, height: xxx } with image dimension. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_image_dimension) |
442
- |`get_image_mime_type`| Returns the mime type of the image. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_image_mime_type) |
443
- |`has_video`| Returns `true/false`.| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_video) |
444
- |`get_video_url`| Returns the url of the video. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_video_url) |
445
- |`get_video_path`| Returns the path of the video. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_image_path) |
446
- |`has_date`| Returns `true/false` | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_date) |
447
- |`get_date`| Returns the date in `datetime` format. Use [`strftime`](https://apidock.com/rails/ActiveSupport/TimeWithZone/strftime) to change date format. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_date) |
448
- |`has_repeaters`| Returns `true/false`| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_repeaters) |
449
- |`get_repeaters`| Returns an array of repeaters. See next session for more details. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_repeaters) |
450
- |`get_selection_choices`| Returns an hash with label and value of the selected choice. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_selection_choices) |
451
- |`get_radio_choice`| Returns an hash with label and value of the selected choice. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_radio_choice) |
452
- |`get_checkbox_choices`| Returns an array of label/value pairs of all the selected choices. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:get_checkbox_choices) |
453
- |`has_related_components`| Check if has related components. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_related_components) |
454
- |`get_related_components`| Retrieve related components. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_related_components) |
455
- |`has_related_boards`| Check if has related boards. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_related_boards) |
456
- |`get_related_boards`| Retrieve related boards. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociations:has_related_boards) |
432
+ | `has_text`| Returns `true/false` | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_text) |
433
+ | `get_text`| Returns the text. Use [`simple_format`](https://apidock.com/rails/ActionView/Helpers/TextHelper/simple_format) to maintain HTML tags. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_text) |
434
+ | `has_string`| Returns `true/false`. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_string) |
435
+ | `get_string`| Returns the text. Use [`simple_format`](https://apidock.com/rails/ActionView/Helpers/TextHelper/simple_format) to maintain HTML tags. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_string) |
436
+ |`has_image`| Returns `true/false`.| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_image) |
437
+ |`get_image_url(size)`| Returns the url of the image. A thumbnail version (200x200) by specifying `thumb` size. If no size is provided the method will return the original image size. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_image_url) |
438
+ |`get_image_path(size)`| Returns the path of the image. A thumbnail version (200x200) by specifying `thumb` size. If no size is provided the method will return the original image size. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_image_path) |
439
+ |`get_image_size`| Returns the image size in MB. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_image_size) |
440
+ |`get_image_dimension`| Returns a hash { width: xxx, height: xxx } with image dimension. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_image_dimension) |
441
+ |`get_image_mime_type`| Returns the mime type of the image. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_image_mime_type) |
442
+ |`has_video`| Returns `true/false`.| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_video) |
443
+ |`get_video_url`| Returns the url of the video. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_video_url) |
444
+ |`get_video_path`| Returns the path of the video. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_image_path) |
445
+ |`has_date`| Returns `true/false` | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_date) |
446
+ |`get_date`| Returns the date in `datetime` format. Use [`strftime`](https://apidock.com/rails/ActiveSupport/TimeWithZone/strftime) to change date format. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_date) |
447
+ |`has_repeaters`| Returns `true/false`| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_repeaters) |
448
+ |`get_repeaters`| Returns an array of repeaters. See next session for more details. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_repeaters) |
449
+ |`get_selection_choices`| Returns an hash with label and value of the selected choice. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_selection_choices) |
450
+ |`get_radio_choice`| Returns an hash with label and value of the selected choice. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_radio_choice) |
451
+ |`get_checkbox_choices`| Returns an array of label/value pairs of all the selected choices. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_checkbox_choices) |
452
+ |`has_related_components`| Check if has related components. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_related_components) |
453
+ |`get_related_components`| Retrieve related components. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_related_components) |
454
+ |`has_related_boards`| Check if has related boards. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_related_boards) |
455
+ |`get_related_boards`| Retrieve related boards. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_related_boards) |
457
456
 
458
457
  If you need to get each dependent of all relations with a specified slug (or slugs) you can use `B.get_relation_dependents` helper. This is very useful to retrieve only the instances which have a owner (and therefore are 'dependents').
459
458
 
@@ -934,9 +933,26 @@ Same thing can be done on linux usign another binary code (see [documentation](h
934
933
 
935
934
 
936
935
 
936
+ # Binda versioning
937
+
938
+ It's possible to test edge versions of Binda on real projects. Edge versions can be found only in the github repository and can be referenced by tag.
939
+
940
+ For example once `v0.1.0` is published any new edge release which can be considered stable enough for a real project is tagged with alpha or beta (`v0.1.1.alpha`, `v0.1.1.alpha.1`, `v0.1.1.beta`, etc). These tags won't change and won't be removed so you can safely add them to you gemfile like so:
941
+
942
+ ```ruby
943
+ gem 'binda', github: 'lacolonia/binda', ref: 'v0.1.1.alpha.1'
944
+ ```
945
+
946
+ The same tag is listed as the gem version, but it's not published to Rubygems.
947
+
948
+ More info can be found at the [semantic versioning documentation](https://semver.org/spec/v2.0.0-rc.1.html).
949
+ ---
950
+
951
+
952
+
937
953
  ### Bug reporting
938
954
  Please refer to this [guide](http://yourbugreportneedsmore.info).
939
- If you need direct help you can join [Binda Slack Community](https://bindacms.slack.com).
955
+ If you need direct help you can join [Binda Slack Channel](https://bindacms.slack.com).
940
956
 
941
957
 
942
958
  ### License
data/Rakefile CHANGED
@@ -14,6 +14,10 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
+ # https://www.viget.com/articles/rails-engine-testing-with-rspec-capybara-and-factorygirl/
18
+ # Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
19
+ # require 'rspec/core'
20
+
17
21
  APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
22
  load 'rails/tasks/engine.rake'
19
23
 
@@ -27,6 +27,9 @@
27
27
  // Select2
28
28
  //= require select2/select2.full.min
29
29
 
30
+ // Lodash
31
+ //= require lodash
32
+
30
33
  // TweenLite
31
34
  // GSAP/CSSPlugin.min
32
35
  // GSAP/EasePack.min
@@ -2,14 +2,14 @@
2
2
  * FORM ITEM CHOICE
3
3
  */
4
4
 
5
- import { _FormItemEditor } from "./form_item_editor";
5
+ import { resizeCollapsableStacks } from "./form_item_collapsable";
6
6
 
7
7
  class FieldSettingChoices {
8
8
  constructor() {
9
9
  this.target = ".field-setting-choices--choice";
10
10
  }
11
11
 
12
- isSet() {
12
+ isPresent() {
13
13
  if ($(this.target).length > 0) {
14
14
  return true;
15
15
  } else {
@@ -39,7 +39,7 @@ class FieldSettingChoices {
39
39
  .closest(".field-setting-choices--choice")
40
40
  .remove();
41
41
  // Update form item editor size
42
- _FormItemEditor.resize();
42
+ resizeCollapsableStacks();
43
43
  }
44
44
  );
45
45
  }
@@ -65,7 +65,7 @@ function addChoice(event) {
65
65
  // Append the clone right after
66
66
  choices.prepend(clone);
67
67
  // Update form item editor size
68
- _FormItemEditor.resize();
68
+ resizeCollapsableStacks();
69
69
  }
70
70
 
71
71
  function deleteChoice(event) {
@@ -81,7 +81,7 @@ function deleteChoice(event) {
81
81
  }).done(function() {
82
82
  choice.remove();
83
83
  // Update form item editor size
84
- _FormItemEditor.resize();
84
+ resizeCollapsableStacks();
85
85
  }).fail(function(data){
86
86
  alert(data.responseJSON.errors);
87
87
  });
@@ -10,7 +10,7 @@ class FileUpload {
10
10
  this.target = ".fileupload";
11
11
  }
12
12
 
13
- isSet() {
13
+ isPresent() {
14
14
  if ($(this.target).length > 0) {
15
15
  return true;
16
16
  } else {
@@ -0,0 +1,245 @@
1
+ /**
2
+ * FORM ITEM
3
+ */
4
+
5
+ import { setupSelect2 } from "./select2";
6
+
7
+ // Component Global Variables
8
+ let newFormItemId = 1;
9
+
10
+ class FormItemCollapsable {
11
+ constructor() {}
12
+
13
+ isPresent() {
14
+ if ($(".form--list").length > 0) {
15
+ return true;
16
+ } else {
17
+ return false;
18
+ }
19
+ }
20
+
21
+ setEvents() {
22
+ $(document).on("click", ".form--add-list-item", addNewItem);
23
+ $(document).on("click", ".form--delete-list-item", deleteItem);
24
+ $(document).on("click", ".form-item--collapse-btn", collapseToggle);
25
+ $(window).resize(resizeCollapsableStacks);
26
+ // Make sure all collapsable items are resized already at every page load
27
+ resizeCollapsableStacks();
28
+ }
29
+ }
30
+
31
+ export let _FormItemCollapsable = new FormItemCollapsable();
32
+
33
+ /**
34
+ * COMPONENT HELPER FUNCTIONS
35
+ */
36
+
37
+ /**
38
+ * Adds a new item.
39
+ *
40
+ * @param {event} event The event
41
+ */
42
+ function addNewItem(event) {
43
+ // Stop default behaviour
44
+ event.preventDefault();
45
+ // Get the child to clone
46
+ let id = $(this).data("id");
47
+ let $list = $("#form--list-" + id);
48
+ let url = $(this).data("url");
49
+ let data = $list.sortable("serialize");
50
+ let params = $(this).data("params");
51
+ if (params) {
52
+ data = data.concat(`&${params}`);
53
+ }
54
+ $.ajax({
55
+ url: url,
56
+ data: data,
57
+ method: "POST"
58
+ }).done(function(data) {
59
+ // Get repaeter code from Rails
60
+ // Due to the Rails way of creating nested forms it's necessary to
61
+ // create the nested item inside a different new form, then get just
62
+ // the code contained between the two SPLIT comments
63
+ let parts = data.split("<!-- SPLIT -->");
64
+ let newItem = parts[1];
65
+ setupAndAppend(newItem, $list);
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Setup and append new item
71
+ *
72
+ * @param {string} newItem The new item
73
+ * @param {object} $list The list
74
+ */
75
+ function setupAndAppend(newItem, $list) {
76
+ // Append the item
77
+ $list.prepend(newItem);
78
+ let collapsable = $list.find(".form-item--collapsable").get(0);
79
+
80
+ // Update select input for Select2 plugin
81
+ setupSelect2($list.find("select"));
82
+
83
+ setupTinyMCE($list.find("textarea"));
84
+
85
+ // Prepare collapsable animation
86
+ collapsable.style.maxHeight = "0px";
87
+
88
+ // Prepare collapsable stack animation
89
+ openCollapsableStacks(collapsable);
90
+
91
+ // Refresh Sortable to update the added item with Sortable features
92
+ $list.sortable("refresh");
93
+
94
+ // Run animation 500ms after previous style declaration (see above) otherwise animation doesn't get triggered
95
+ setTimeout(function() {
96
+ collapsable.style.maxHeight = collapsable.scrollHeight + "px";
97
+ }, 50);
98
+ }
99
+
100
+ /**
101
+ * Close collapsable stacks
102
+ *
103
+ * It closes all collapsable stacks inside the collapsable item passed as argument
104
+ *
105
+ * @param {object, string} target The target
106
+ */
107
+ export function closeCollapsableStacks(obj) {
108
+ $(obj)
109
+ .addClass("form-item--collapsed")
110
+ .find(".form-item--collapsable-stack")
111
+ .each(function() {
112
+ this.style.maxHeight = "0px";
113
+ this.style.pointerEvents = "none";
114
+ });
115
+ }
116
+
117
+ /**
118
+ * Open collapsable stacks
119
+ *
120
+ * It opens all collapsable stacks inside the collapsable item passed as argument
121
+ *
122
+ * @param {object, string} target The target
123
+ */
124
+ export function openCollapsableStacks(obj) {
125
+ // Don't execute this if sortable is enabled
126
+ if (
127
+ $(obj)
128
+ .closest(".sortable")
129
+ .hasClass("sortable--enabled")
130
+ ) {
131
+ return;
132
+ }
133
+ $(obj)
134
+ .removeClass("form-item--collapsed")
135
+ .find(".form-item--collapsable-stack")
136
+ .each(function() {
137
+ this.style.maxHeight = this.scrollHeight + "px";
138
+ this.style.pointerEvents = "auto";
139
+ });
140
+ }
141
+
142
+ /**
143
+ * Toggle a collapsable item
144
+ *
145
+ * Basically it opens it or closes it based on its state
146
+ *
147
+ * @param {event} event The event
148
+ */
149
+ function collapseToggle(event) {
150
+ // Stop default behaviour
151
+ event.preventDefault();
152
+ let $collapsable = $(this).closest(".form-item--collapsable");
153
+ if ($collapsable.hasClass("form-item--collapsed")) {
154
+ $collapsable.each(function() {
155
+ openCollapsableStacks(this);
156
+ });
157
+ } else {
158
+ $collapsable.each(function() {
159
+ closeCollapsableStacks(this);
160
+ });
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Delete collapsable item and hide it
166
+ *
167
+ * @param {event} event The event
168
+ */
169
+ function deleteItem(event) {
170
+ // Stop default behaviour
171
+ event.preventDefault();
172
+ let record_id = $(this).data("id");
173
+ let targetId = `#form--list-item-${record_id}`;
174
+ let target = $(targetId).get(0);
175
+ // As max-height isn't set you need to set it manually before changing it,
176
+ // otherwise the animation doesn't get triggered
177
+ target.style.maxHeight = target.scrollHeight + "px";
178
+ // Change max-height after 50ms to trigger css animation
179
+ setTimeout(function() {
180
+ target.style.maxHeight = "0px";
181
+ target.style.pointerEvents = "none";
182
+ }, 50);
183
+ $.ajax({
184
+ url: $(this).attr("href"),
185
+ data: { id: record_id, target_id: targetId, isAjax: true },
186
+ method: "DELETE"
187
+ }).done(function(data) {
188
+ // Make sure the animation completes before removing the item (it should last 600ms + 50ms)
189
+ setTimeout(function() {
190
+ $(data.target_id).remove();
191
+ }, 700);
192
+ });
193
+ // TODO add a fallback if request fails
194
+ }
195
+
196
+ /**
197
+ * Resize all collapsable item
198
+ *
199
+ * If a target is passed as a argument the function will resize only that target and its children.
200
+ *
201
+ * @param {object, string} target The target.
202
+ */
203
+ export function resizeCollapsableStacks(target) {
204
+ target = _.isUndefined(target) ? document.getElementsByClassName("form-item--collapsable-stack") : target;
205
+ // target CANNOT BE a jquery object because it leads to the following error
206
+ // TypeError: undefined is not an object (evaluating 't.ownerDocument.defaultView')
207
+ $(target).each(function() {
208
+ // If the collapsable item is closed don't go any further
209
+ if (
210
+ $(this).height() === 0 ||
211
+ $(this)
212
+ .closest(".form-item--collapsable")
213
+ .hasClass("form-item--collapsed")
214
+ ) {
215
+ this.style.maxHeight = "0px";
216
+ this.style.pointerEvents = "none";
217
+ } else {
218
+ // otherwise update the max-height which is needed for the CSS transition
219
+ // NOTE you need to remove the max-height (inside 'style' attribute) to get the real height
220
+ this.style.height = "auto";
221
+ this.style.maxHeight = this.scrollHeight + "px";
222
+ this.style.pointerEvents = "auto";
223
+ }
224
+ });
225
+ }
226
+
227
+ /**
228
+ * Setup TinyMCE
229
+ *
230
+ * @param {jQuery object} $textareas The textareas
231
+ */
232
+ function setupTinyMCE($textareas) {
233
+ let editor_ids = _.map(tinyMCE.editors, editor => {
234
+ return editor.id;
235
+ })
236
+ // console.log({editors});
237
+ $textareas.each(function() {
238
+ if (_.includes(editor_ids, this.getAttribute('id'))){
239
+ return;
240
+ }
241
+ tinyMCE.init({
242
+ selector: `#${this.getAttribute("id")}`
243
+ });
244
+ });
245
+ }
@@ -7,7 +7,7 @@ class FormItemImage {
7
7
  this.target = ".form-item--image--uploader";
8
8
  }
9
9
 
10
- isSet() {
10
+ isPresent() {
11
11
  if ($(this.target).length > 0) {
12
12
  return true;
13
13
  } else {
@@ -14,7 +14,7 @@ class Shader {
14
14
  };
15
15
  }
16
16
 
17
- isSet() {
17
+ isPresent() {
18
18
  if ($("#background-shader").length > 0) {
19
19
  return true;
20
20
  } else {
@@ -11,7 +11,7 @@ class LoginForm {
11
11
  this.isFilled = false;
12
12
  }
13
13
 
14
- isSet() {
14
+ isPresent() {
15
15
  if ($(".login--form").length > 0) {
16
16
  return true;
17
17
  } else {