formstrap 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/app/assets/javascripts/formstrap/controllers/nested_preview_controller.js +167 -0
  4. data/app/assets/javascripts/formstrap/controllers/popup_controller.js +2 -2
  5. data/app/assets/javascripts/formstrap/controllers/preview_controller.js +65 -0
  6. data/app/assets/javascripts/formstrap/controllers/repeater_controller.js +39 -7
  7. data/app/assets/javascripts/formstrap/index.js +4 -0
  8. data/app/assets/javascripts/formstrap.js +199 -7
  9. data/app/assets/stylesheets/formstrap/shared/nested_preview.scss +31 -0
  10. data/app/assets/stylesheets/formstrap/shared.scss +1 -0
  11. data/app/assets/stylesheets/formstrap.css +31 -0
  12. data/app/models/formstrap/media_view.rb +1 -1
  13. data/app/views/formstrap/_button.html.erb +0 -0
  14. data/app/views/formstrap/_repeater.html.erb +40 -22
  15. data/app/views/formstrap/repeater/_row.html.erb +20 -4
  16. data/app/views/formstrap/shared/_nested_preview.html.erb +35 -0
  17. data/config/locales/de.yml +5 -0
  18. data/config/locales/en.yml +1 -5
  19. data/config/locales/formstrap/de.yml +48 -0
  20. data/config/locales/formstrap/en.yml +48 -0
  21. data/config/locales/formstrap/fr.yml +48 -0
  22. data/config/locales/formstrap/nl.yml +48 -0
  23. data/config/locales/fr.yml +5 -0
  24. data/config/locales/nl.yml +1 -5
  25. data/lib/formstrap/form_builder.rb +15 -0
  26. data/lib/formstrap/version.rb +1 -1
  27. data/package.json +1 -1
  28. metadata +13 -8
  29. data/config/locales/formstrap/forms/en.yml +0 -25
  30. data/config/locales/formstrap/forms/nl.yml +0 -25
  31. data/config/locales/formstrap/media/en.yml +0 -16
  32. data/config/locales/formstrap/media/nl.yml +0 -16
  33. data/config/locales/formstrap/thumbnail/en.yml +0 -4
  34. data/config/locales/formstrap/thumbnail/nl.yml +0 -4
@@ -1400,6 +1400,37 @@ mark {
1400
1400
  .formstrap-popup.closed {
1401
1401
  display: none;
1402
1402
  }
1403
+ .nested-preview-offcanvas,
1404
+ .nested-preview .hiding {
1405
+ display: none !important;
1406
+ }
1407
+ .nested-preview-offcanvas.show,
1408
+ .nested-preview-offcanvas.showing,
1409
+ .nested-preview .hiding.show,
1410
+ .nested-preview .hiding.showing {
1411
+ display: flex !important;
1412
+ }
1413
+ .nested-preview-iframe-wrapper {
1414
+ position: relative;
1415
+ cursor: pointer;
1416
+ }
1417
+ .nested-preview-iframe-wrapper iframe {
1418
+ width: 100%;
1419
+ }
1420
+ .nested-preview-loader {
1421
+ position: absolute;
1422
+ width: 100%;
1423
+ height: 100%;
1424
+ z-index: 2;
1425
+ top: 0;
1426
+ left: 0;
1427
+ padding: 40px;
1428
+ display: flex;
1429
+ align-items: center;
1430
+ justify-content: center;
1431
+ background: var(--bs-secondary-bg);
1432
+ opacity: 0.5;
1433
+ }
1403
1434
  .formstrap-media-modal .formstrap-thumbnail {
1404
1435
  cursor: pointer;
1405
1436
  }
@@ -130,7 +130,7 @@ module Formstrap
130
130
  def edit_modal_url(attachment)
131
131
  return nil unless edit_url.present?
132
132
  return edit_url unless attachment&.persisted?
133
- edit_url.gsub(":id", attachment.id.to_s)
133
+ edit_url.gsub(":id", attachment.blob&.id.to_s)
134
134
  end
135
135
 
136
136
  attr_reader :accept
File without changes
@@ -1,14 +1,17 @@
1
1
  <%
2
2
  # formstrap/repeater
3
3
  #
4
- # ==== Options
4
+ # ==== Required parameters
5
5
  # * +form+ - Form object
6
6
  # * +attribute+ - Name of the attribute of the form model
7
+ #
8
+ # ==== Optional parameters
7
9
  # * +header+ - Name of the template to use as header
8
10
  # * +label+ - Text to show as label. Label will be hidden if value is false
9
11
  # * +templates+ - List of all views that can be used as a template for a new block
10
12
  # * +flush+ - Set to true if you want the list items to sit flush with its parent.
11
13
  # * +row+ - Pass hash with options to pass to the row template.
14
+ # * +preview_url+ - Enables previews of each row. Provide and endpoint capable of rendering a preview for the rows values.
12
15
  #
13
16
  # ==== Examples
14
17
  # # Basic version
@@ -28,7 +31,12 @@
28
31
  #
29
32
  # # Allow more than one type of fields to be inserted. You must specify the templates as an array of view paths
30
33
  # <% templates = ["admin/questions/fields/type_1", "admin/questions/fields/type_2"] %#>
31
- # <% render "formstrap/repeater", form: form, attribute: :questions, templates: templates do |question| %#>
34
+ # <% render "formstrap/repeater", form: form, attribute: :questions, templates: templates do |question, template_name| %#>
35
+ # <% render "admin/questions/#{template_name}, form: :question" %#>
36
+ # <% end %#>
37
+ #
38
+ # # Enable previews
39
+ # <% render "formstrap/repeater", form: form, attribute: :questions, preview_url: admin_preview_question_path do |question| %#>
32
40
  # <% render "admin/questions/fields, form: :question" %#>
33
41
  # <% end %#>
34
42
 
@@ -37,6 +45,7 @@
37
45
  header = local_assigns.has_key?(:header) ? header : nil
38
46
  templates = local_assigns.has_key?(:templates) ? templates : []
39
47
  flush = local_assigns.has_key?(:flush) ? flush : true
48
+ preview_url = local_assigns.has_key?(:preview_url) ? preview_url : nil
40
49
  row_options = local_assigns.has_key?(:row) ? row : {}
41
50
 
42
51
  template_names = templates.map { |template| File.basename(template, ".html.erb") }
@@ -46,12 +55,21 @@
46
55
  association_object = association_model.new
47
56
  with_positions = association_object.attributes.keys.include?("position")
48
57
 
49
- # We sort the collection with ruby to prevent a new query to be made that would dispose of nested object in memory
50
58
  associations = form.object.send(attribute)
51
- associations = with_positions ? associations.sort_by{|resource| resource.position} : associations
59
+
60
+ # We sort the collection with ruby to prevent a new query to be made that would dispose of nested object in memory
61
+ associations = (with_positions && associations.map(&:position).compact.any?) ? associations.sort_by { |resource| resource.position } : associations
62
+
52
63
  repeater_id = form.object_id
53
64
  pass_thru = template_names.count == 1 ? "[data-template-name=\"#{template_names.first}\"]" : nil
54
65
  show_label = label != false
66
+
67
+ # Override default row options
68
+ row_options.merge!(
69
+ preview_url: preview_url,
70
+ pass_thru: pass_thru,
71
+ repeater_id: repeater_id,
72
+ )
55
73
  %>
56
74
 
57
75
  <!-- Label -->
@@ -70,7 +88,7 @@
70
88
 
71
89
  <!-- Rows -->
72
90
  <%= form.fields_for attribute, associations do |ff| %>
73
- <%= render "formstrap/repeater/row", row_options.merge(pass_thru: pass_thru, form: ff, repeater_id: repeater_id) do %>
91
+ <%= render "formstrap/repeater/row", row_options.merge(form: ff, index: ff.index) do %>
74
92
  <%= yield(ff) %>
75
93
  <% end %>
76
94
  <% end %>
@@ -85,12 +103,12 @@
85
103
 
86
104
  <!-- Button -->
87
105
  <div
88
- class="btn btn-sm btn-outline-secondary"
89
- data-repeater-target="addButton"
90
- data-popup-target="button"
91
- data-popup-id="<%= "repeater-buttons-#{repeater_id}" %>"
92
- data-popup-pass-thru="<%= pass_thru %>"
93
- data-action="click->repeater#resetButtonIndices click->popup#open"
106
+ class="btn btn-sm btn-outline-secondary"
107
+ data-repeater-target="addButton"
108
+ data-popup-target="button"
109
+ data-popup-id="<%= "repeater-buttons-#{repeater_id}" %>"
110
+ data-popup-pass-thru="<%= pass_thru %>"
111
+ data-action="click->repeater#resetButtonIndices click->popup#open"
94
112
  >
95
113
  <%= bootstrap_icon("plus") %>
96
114
  <%= t(".add", name: association_model.model_name.human) %>
@@ -101,12 +119,12 @@
101
119
  <div class="d-grid gap-2">
102
120
  <% template_names.each do |name| %>
103
121
  <div
104
- class="btn btn-sm btn-outline-secondary"
105
- data-popup-target="button"
106
- data-popup-id="<%= "repeater-buttons-#{repeater_id}" %>"
107
- data-action="click->repeater#addRow click->popup#close"
108
- data-row-index=""
109
- data-template-name="<%= name %>"
122
+ class="btn btn-sm btn-outline-secondary"
123
+ data-popup-target="button"
124
+ data-popup-id="<%= "repeater-buttons-#{repeater_id}" %>"
125
+ data-action="click->repeater#addRow click->popup#close"
126
+ data-row-index=""
127
+ data-template-name="<%= name %>"
110
128
  >
111
129
  <%= t("blocks.#{name}", default: name).humanize %>
112
130
  </div>
@@ -115,11 +133,11 @@
115
133
  <% end %>
116
134
 
117
135
  <!-- Templates -->
118
- <% template_names.each do |name| %>
119
- <template data-repeater-target="template" data-template-name="<%= name %>" data-template-id-regex="<%= association_object.object_id %>">
120
- <%= form.fields_for attribute, association_object, child_index: association_object.object_id do |ff| %>
121
- <%= render "formstrap/repeater/row", row_options.merge(form: ff, pass_thru: pass_thru, repeater_id: repeater_id) do %>
122
- <% yield(ff, name) %>
136
+ <% template_names.each do |template_name| %>
137
+ <template data-repeater-target="template" data-template-name="<%= template_name %>">
138
+ <%= form.fields_for attribute, association_object, child_index: "rrrrrrrrr" do |ff| %>
139
+ <%= render "formstrap/repeater/row", row_options.merge(form: ff, pass_thru: pass_thru, repeater_id: repeater_id, index: nil, template_name: template_name) do %>
140
+ <%= yield(ff, template_name) %>
123
141
  <% end %>
124
142
  <% end %>
125
143
  </template>
@@ -3,16 +3,24 @@
3
3
  # accepts block: yes
4
4
  # parameters:
5
5
  # form: Form object
6
+ # repeater_id: ID of the repeater
7
+ # index: Index of the row in the repeater
6
8
  # pass_thru: (string) Pass thru for add button if needed
9
+ # preview_url: (string) URL for previews
7
10
 
11
+ repeater_id = local_assigns[:repeater_id]
12
+ pass_thru = local_assigns[:pass_thru]
8
13
  draggable = form.object.respond_to?(:position)
9
14
  destroyable = form.object.respond_to?(:destroy)
10
- error_class = form.object.errors.present? ? "border border-danger" : ""
11
- class_names = local_assigns.has_key?(:class) ? local_assigns[:class] : "formstrap-repeater-row list-group-item"
15
+ error_class = form.object&.errors&.present? ? "border border-danger" : ""
16
+ preview_url = local_assigns.has_key?(:preview_url) ? local_assigns[:preview_url] : nil
17
+ preview = preview_url.present?
18
+ preview_url = "#{preview_url}?id=#{form.object.id}&name=#{local_assigns[:template_name] || form.object.name}&pp=disabled"
19
+ class_names = local_assigns.has_key?(:class) ? local_assigns[:class] : "formstrap-repeater-row list-group-item #{'p-0' if preview}"
12
20
  %>
13
21
  <div class="<%= class_names %> <%= error_class %>"
14
22
  data-repeater-target="row"
15
- data-row-index="<%= form.options[:child_index] %>"
23
+ data-row-index="<%= index %>"
16
24
  data-new-record="<%= form.object.new_record? %>"
17
25
  >
18
26
 
@@ -49,5 +57,13 @@
49
57
  <%= bootstrap_icon("dash-circle") %>
50
58
  </div>
51
59
 
52
- <%= yield %>
60
+ <% if preview %>
61
+ <!-- Wrap row in preview layout -->
62
+ <%= render layout: "formstrap/shared/nested_preview", locals: { form: form, url: preview_url } do %>
63
+ <%= yield %>
64
+ <% end %>
65
+ <% else %>
66
+ <!-- Just render row content -->
67
+ <%= yield %>
68
+ <% end %>
53
69
  </div>
@@ -0,0 +1,35 @@
1
+ <div data-controller="nested-preview" data-nested-preview-url-value="<%= url %>">
2
+ <!-- Preview placeholder -->
3
+ <div class="nested-preview-iframe-wrapper position-relative" role="button" data-nested-preview-target="iframeWrapper" data-bs-toggle="offcanvas" data-bs-target="#offcanvas-<%= form.options[:child_index] %>" aria-controls="offcanvasRight" data-turbo-cache="false">
4
+ <iframe src="<%= url %>" class="pe-none" data-nested-preview-target="iframe"></iframe>
5
+ <div data-nested-preview-target="loader" class="nested-preview-loader terti">
6
+ <div class="spinner-grow text-secondary" role="status">
7
+ <span class="visually-hidden">Loading...</span>
8
+ </div>
9
+ </div>
10
+ </div>
11
+
12
+ <!-- Preview fields wrapper -->
13
+ <div class="offcanvas offcanvas-end nested-preview-offcanvas" tabindex="-1" id="offcanvas-<%= form.options[:child_index] %>" aria-labelledby="offcanvasRightLabel" data-nested-preview-target="offcanvas">
14
+ <div class="offcanvas-header">
15
+ <h5 class="offcanvas-title" id="offcanvasRightLabel"><%= t('.title', model: form.object.model_name.human) %></h5>
16
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
17
+ </div>
18
+ <div class="offcanvas-body">
19
+
20
+ <div class="alert alert-danger d-none" data-nested-preview-target="error">
21
+ <% t(".error") %>
22
+ </div>
23
+
24
+ <!-- Row content -->
25
+ <div data-nested-preview-target="fields">
26
+ <%= yield %>
27
+ </div>
28
+
29
+ <!-- Preview sync button -->
30
+ <div class="btn btn-primary" data-action="click->nested-preview#update">
31
+ <%= bootstrap_icon("arrow-repeat") %> <%= t('.button') %>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
@@ -0,0 +1,5 @@
1
+ de:
2
+ language_name: Deutsch
3
+ date:
4
+ formats:
5
+ default: "%d/%m/%Y"
@@ -2,8 +2,4 @@ en:
2
2
  language_name: English
3
3
  date:
4
4
  formats:
5
- default: "%d/%m/%Y"
6
- formstrap:
7
- pagination:
8
- infinite:
9
- load_more: Load more
5
+ default: "%d/%m/%Y"
@@ -0,0 +1,48 @@
1
+ de:
2
+ formstrap:
3
+ file:
4
+ not_found: Nicht verfügbar
5
+ placeholder:
6
+ one: Datei durchsuchen oder hierher ziehen und ablegen
7
+ other: Dateien durchsuchen oder hierher ziehen und ablegen
8
+ group:
9
+ save: Speichern
10
+ media:
11
+ modal:
12
+ close: Schließen
13
+ limits: "Minimum: %{min} und Maximum: %{max}"
14
+ maximum: " von %{count}"
15
+ placeholder: Laden Sie Ihre erste Datei in die Medienbibliothek hoch
16
+ search: Suche
17
+ search_no_results: Keine Suchergebnisse gefunden
18
+ select: Auswählen
19
+ title:
20
+ one: Wählen Sie mindestens 1 Datei aus
21
+ other: Wählen Sie mindestens %{count} Dateien aus
22
+ unlimited: unbegrenzt
23
+ upload: Neue Dateien hochladen
24
+ validation:
25
+ min:
26
+ one: Bitte wählen Sie mindestens 1 Element aus
27
+ other: "Bitte wählen Sie mindestens %{count} Elemente aus"
28
+ max:
29
+ one: Bitte beschränken Sie Ihre Auswahl auf maximal 1 Element
30
+ other: "Bitte beschränken Sie Ihre Auswahl auf maximal %{count} Elemente"
31
+ pagination:
32
+ infinite:
33
+ load_more: Mehr laden
34
+ repeater:
35
+ add: "%{name} hinzufügen"
36
+ empty: Beginnen Sie mit dem Hinzufügen Ihres ersten Blocks
37
+ row:
38
+ add: Zeile hinzufügen
39
+ remove: Zeile entfernen
40
+ select:
41
+ blank: Bitte wählen
42
+ shared:
43
+ nested_preview:
44
+ button: Vorschau aktualisieren
45
+ error: Vorschau konnte nicht geladen werden. Überprüfen Sie alle Felder und versuchen Sie es erneut.
46
+ title: "%{model} bearbeiten"
47
+ thumbnail:
48
+ title: Titel
@@ -0,0 +1,48 @@
1
+ en:
2
+ formstrap:
3
+ file:
4
+ not_found: Not available
5
+ placeholder:
6
+ one: Browse file or drag & drop it here
7
+ other: Browse files or drag & drop them here
8
+ group:
9
+ save: Save
10
+ media:
11
+ modal:
12
+ close: Close
13
+ limits: "minimum: %{min} en maximum: %{max}"
14
+ maximum: " of %{count}"
15
+ placeholder: Upload your first file to the media library
16
+ search: Search
17
+ search_no_results: No search results found
18
+ select: Select
19
+ title:
20
+ one: Select at least 1 file
21
+ other: Select at least %{count} files
22
+ unlimited: unlimited
23
+ upload: Upload new files
24
+ validation:
25
+ min:
26
+ one: Please select at least 1 item
27
+ other: "Please select at least %{count} items"
28
+ max:
29
+ one: Please limit your selection to maximum 1 item
30
+ other: "Please limit your selection to maximum %{count} items"
31
+ pagination:
32
+ infinite:
33
+ load_more: Load more
34
+ repeater:
35
+ add: "Add %{name}"
36
+ empty: Start by adding your first block
37
+ row:
38
+ add: Add row
39
+ remove: Remove row
40
+ select:
41
+ blank: Make a choice
42
+ shared:
43
+ nested_preview:
44
+ button: Update preview
45
+ error: Unable to load preview. Check all fields and try again.
46
+ title: "Edit %{model}"
47
+ thumbnail:
48
+ title: Title
@@ -0,0 +1,48 @@
1
+ fr:
2
+ formstrap:
3
+ file:
4
+ not_found: Indisponible
5
+ placeholder:
6
+ one: Parcourir le fichier ou faites glisser et déposez-le ici
7
+ other: Parcourir les fichiers ou faites les glisser et déposez-les ici
8
+ group:
9
+ save: Sauvegarder
10
+ media:
11
+ modal:
12
+ close: Fermer
13
+ limits: "minimum: %{min} et maximum: %{max}"
14
+ maximum: " de %{count}"
15
+ placeholder: Téléchargez votre premier fichier dans la bibliothèque multimédia
16
+ search: Rechercher
17
+ search_no_results: Aucun résultat trouvé
18
+ select: Sélectionner
19
+ title:
20
+ one: Sélectionnez au moins 1 fichier
21
+ other: Sélectionnez au moins %{count} fichiers
22
+ unlimited: illimité
23
+ upload: Télécharger de nouveaux fichiers
24
+ validation:
25
+ min:
26
+ one: Veuillez sélectionner au moins 1 élément
27
+ other: "Veuillez sélectionner au moins %{count} éléments"
28
+ max:
29
+ one: Veuillez limiter votre sélection à un maximum de 1 élément
30
+ other: "Veuillez limiter votre sélection à un maximum de %{count} éléments"
31
+ pagination:
32
+ infinite:
33
+ load_more: Charger plus
34
+ repeater:
35
+ add: "Ajouter %{name}"
36
+ empty: Commencez par ajouter votre premier bloc
37
+ row:
38
+ add: Ajouter une ligne
39
+ remove: Supprimer la ligne
40
+ select:
41
+ blank: Faites un choix
42
+ shared:
43
+ nested_preview:
44
+ button: Mettre à jour l'aperçu
45
+ error: Impossible de charger l'aperçu. Vérifiez tous les champs et réessayez.
46
+ title: "Modifier %{model}"
47
+ thumbnail:
48
+ title: Titre
@@ -0,0 +1,48 @@
1
+ nl:
2
+ formstrap:
3
+ file:
4
+ not_found: Niet beschikbaar
5
+ placeholder:
6
+ one: Kies bestand of sleep het hierheen
7
+ other: Kies bestanden of sleep ze hierheen
8
+ group:
9
+ save: Opslaan
10
+ media:
11
+ modal:
12
+ close: Sluiten
13
+ limits: "minimum: %{min} and maximum: %{max}"
14
+ maximum: " van %{count}"
15
+ placeholder: Upload je eerste bestand naar de mediabibliotheek
16
+ search: Zoeken
17
+ search_no_results: Geen resultaten gevonden
18
+ select: Selecteer
19
+ title:
20
+ one: Selecteer bestand
21
+ other: Selecteer bestanden
22
+ unlimited: onbeperkt
23
+ upload: Nieuwe bestanden uploaden
24
+ validation:
25
+ min:
26
+ one: Gelieve minstens 1 item te selecteren
27
+ other: "Gelieve minstens %{count} items te selecteren"
28
+ max:
29
+ one: Gelieve maximum 1 item te selecteren
30
+ other: "Gelieve maximum %{count} items te selecteren"
31
+ pagination:
32
+ infinite:
33
+ load_more: Laad meer
34
+ repeater:
35
+ add: "%{name} toevoegen"
36
+ empty: Voeg je eerste rij toe om te beginnen
37
+ row:
38
+ add: Rij toevoegen
39
+ remove: Rij verwijderen
40
+ select:
41
+ blank: Maak een keuze
42
+ shared:
43
+ nested_preview:
44
+ button: Voorvertoning bijwerken
45
+ error: Er kon geen voorvertoning worden geladen. Kijk alle velden na en probeer het opnieuw.
46
+ title: "%{model} bewerken"
47
+ thumbnail:
48
+ title: Titel
@@ -0,0 +1,5 @@
1
+ fr:
2
+ language_name: Français
3
+ date:
4
+ formats:
5
+ default: "%d/%m/%Y"
@@ -2,8 +2,4 @@ nl:
2
2
  language_name: Nederlands
3
3
  date:
4
4
  formats:
5
- default: "%d/%m/%Y"
6
- formstrap:
7
- pagination:
8
- infinite:
9
- load_more: Laad meer
5
+ default: "%d/%m/%Y"
@@ -11,6 +11,17 @@ module Formstrap
11
11
  render_input(:association, attribute, options)
12
12
  end
13
13
 
14
+ def preview_button(value = nil, options = {}, &block)
15
+ default_options = {
16
+ data: {
17
+ controller: "preview",
18
+ "preview-url-value": options[:url]
19
+ },
20
+ type: nil
21
+ }
22
+ button value, default_options.deep_merge(options.except(:url)), &block
23
+ end
24
+
14
25
  def checkbox(attribute, formstrap: true, **options)
15
26
  if formstrap
16
27
  render_input :checkbox, attribute, options
@@ -103,6 +114,10 @@ module Formstrap
103
114
  end
104
115
  end
105
116
 
117
+ def repeater_for(attribute, options = {}, &block)
118
+ @template.render("formstrap/repeater", form: self, attribute: attribute, **options, &block)
119
+ end
120
+
106
121
  def redactorx(attribute, options = {})
107
122
  render_input(:redactorx, attribute, options)
108
123
  end
@@ -1,3 +1,3 @@
1
1
  module Formstrap
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontierdotbe/formstrap",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Bootstrap-powered Form Helpers",
5
5
  "module": "app/assets/javascripts/formstrap.js",
6
6
  "main": "app/assets/javascripts/formstrap.js",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formstrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jef Vlamings
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-08 00:00:00.000000000 Z
11
+ date: 2024-03-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: An extensive Bootstrap form library to power your Ruby On Rails application.
14
14
  email:
@@ -44,7 +44,9 @@ files:
44
44
  - app/assets/javascripts/formstrap/controllers/infinite_scroller_controller.js
45
45
  - app/assets/javascripts/formstrap/controllers/media_controller.js
46
46
  - app/assets/javascripts/formstrap/controllers/media_modal_controller.js
47
+ - app/assets/javascripts/formstrap/controllers/nested_preview_controller.js
47
48
  - app/assets/javascripts/formstrap/controllers/popup_controller.js
49
+ - app/assets/javascripts/formstrap/controllers/preview_controller.js
48
50
  - app/assets/javascripts/formstrap/controllers/redactorx_controller.js
49
51
  - app/assets/javascripts/formstrap/controllers/repeater_controller.js
50
52
  - app/assets/javascripts/formstrap/controllers/select_controller.js
@@ -61,6 +63,7 @@ files:
61
63
  - app/assets/stylesheets/formstrap/repeater.scss
62
64
  - app/assets/stylesheets/formstrap/search.scss
63
65
  - app/assets/stylesheets/formstrap/shared.scss
66
+ - app/assets/stylesheets/formstrap/shared/nested_preview.scss
64
67
  - app/assets/stylesheets/formstrap/shared/popup.scss
65
68
  - app/assets/stylesheets/formstrap/shared/thumbnail.scss
66
69
  - app/assets/stylesheets/formstrap/utilities.scss
@@ -114,6 +117,7 @@ files:
114
117
  - app/models/view_model.rb
115
118
  - app/views/formstrap/_association.html.erb
116
119
  - app/views/formstrap/_autocomplete.html.erb
120
+ - app/views/formstrap/_button.html.erb
117
121
  - app/views/formstrap/_checkbox.html.erb
118
122
  - app/views/formstrap/_color.html.erb
119
123
  - app/views/formstrap/_datalist.html.erb
@@ -156,19 +160,20 @@ files:
156
160
  - app/views/formstrap/media/thumbnail.html.erb
157
161
  - app/views/formstrap/pagination/_infinite.html.erb
158
162
  - app/views/formstrap/repeater/_row.html.erb
163
+ - app/views/formstrap/shared/_nested_preview.html.erb
159
164
  - app/views/formstrap/shared/_notifications.html.erb
160
165
  - app/views/formstrap/shared/_popup.html.erb
161
166
  - app/views/formstrap/shared/_thumbnail.html.erb
162
167
  - bin/console
163
168
  - bin/setup
164
169
  - config/importmap.rb
170
+ - config/locales/de.yml
165
171
  - config/locales/en.yml
166
- - config/locales/formstrap/forms/en.yml
167
- - config/locales/formstrap/forms/nl.yml
168
- - config/locales/formstrap/media/en.yml
169
- - config/locales/formstrap/media/nl.yml
170
- - config/locales/formstrap/thumbnail/en.yml
171
- - config/locales/formstrap/thumbnail/nl.yml
172
+ - config/locales/formstrap/de.yml
173
+ - config/locales/formstrap/en.yml
174
+ - config/locales/formstrap/fr.yml
175
+ - config/locales/formstrap/nl.yml
176
+ - config/locales/fr.yml
172
177
  - config/locales/nl.yml
173
178
  - config/routes.rb
174
179
  - esbuild-css.js
@@ -1,25 +0,0 @@
1
- en:
2
- formstrap:
3
- file:
4
- not_found: Not available
5
- placeholder:
6
- one: Browse file or drag & drop it here
7
- other: Browse files or drag & drop them here
8
- group:
9
- save: Save
10
- media:
11
- validation:
12
- min:
13
- one: Please select at least 1 item
14
- other: "Please select at least %{count} items"
15
- max:
16
- one: Please limit your selection to maximum 1 item
17
- other: "Please limit your selection to maximum %{count} items"
18
- select:
19
- blank: Make a choice
20
- repeater:
21
- add: "Add %{name}"
22
- empty: Start by adding your first block
23
- row:
24
- add: Add row
25
- remove: Remove row
@@ -1,25 +0,0 @@
1
- nl:
2
- formstrap:
3
- file:
4
- not_found: Niet beschikbaar
5
- placeholder:
6
- one: Kies bestand of sleep het hierheen
7
- other: Kies bestanden of sleep ze hierheen
8
- group:
9
- save: Opslaan
10
- media:
11
- validation:
12
- min:
13
- one: Gelieve minstens 1 item te selecteren
14
- other: "Gelieve minstens %{count} items te selecteren"
15
- max:
16
- one: Gelieve maximum 1 item te selecteren
17
- other: "Gelieve maximum %{count} items te selecteren"
18
- select:
19
- blank: Maak een keuze
20
- repeater:
21
- add: "%{name} toevoegen"
22
- empty: Voeg je eerste rij toe om te beginnen
23
- row:
24
- add: Rij toevoegen
25
- remove: Rij verwijderen
@@ -1,16 +0,0 @@
1
- en:
2
- formstrap:
3
- media:
4
- modal:
5
- close: Close
6
- limits: "minimum: %{min} en maximum: %{max}"
7
- maximum: " of %{count}"
8
- placeholder: Upload your first file to the media library
9
- search: Search
10
- search_no_results: No search results found
11
- select: Select
12
- title:
13
- one: Select at least 1 file
14
- other: Select at least %{count} files
15
- unlimited: unlimited
16
- upload: Upload new files