formstrap 0.2.1 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/app/assets/javascripts/formstrap/controllers/nested_preview_controller.js +194 -0
- data/app/assets/javascripts/formstrap/controllers/preview_controller.js +65 -0
- data/app/assets/javascripts/formstrap/controllers/repeater_controller.js +39 -7
- data/app/assets/javascripts/formstrap/index.js +4 -0
- data/app/assets/javascripts/formstrap.js +219 -7
- data/app/assets/stylesheets/formstrap/shared/nested_preview.scss +31 -0
- data/app/assets/stylesheets/formstrap/shared.scss +1 -0
- data/app/assets/stylesheets/formstrap.css +31 -0
- data/app/views/formstrap/_button.html.erb +0 -0
- data/app/views/formstrap/_repeater.html.erb +40 -22
- data/app/views/formstrap/repeater/_row.html.erb +20 -4
- data/app/views/formstrap/shared/_nested_preview.html.erb +35 -0
- data/config/locales/de.yml +5 -0
- data/config/locales/en.yml +1 -5
- data/config/locales/formstrap/de.yml +48 -0
- data/config/locales/formstrap/en.yml +48 -0
- data/config/locales/formstrap/fr.yml +48 -0
- data/config/locales/formstrap/nl.yml +48 -0
- data/config/locales/fr.yml +5 -0
- data/config/locales/nl.yml +1 -5
- data/lib/formstrap/form_builder.rb +15 -0
- data/lib/formstrap/version.rb +1 -1
- data/package.json +1 -1
- metadata +13 -8
- data/config/locales/formstrap/forms/en.yml +0 -25
- data/config/locales/formstrap/forms/nl.yml +0 -25
- data/config/locales/formstrap/media/en.yml +0 -16
- data/config/locales/formstrap/media/nl.yml +0 -16
- data/config/locales/formstrap/thumbnail/en.yml +0 -4
- 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
|
}
|
File without changes
|
@@ -1,14 +1,17 @@
|
|
1
1
|
<%
|
2
2
|
# formstrap/repeater
|
3
3
|
#
|
4
|
-
# ====
|
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
|
-
|
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(
|
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
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
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 |
|
119
|
-
<template data-repeater-target="template" data-template-name="<%=
|
120
|
-
<%= form.fields_for attribute, association_object, child_index:
|
121
|
-
<%= render "formstrap/repeater/row", row_options.merge(form: ff, pass_thru: pass_thru, repeater_id: repeater_id) do %>
|
122
|
-
|
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
|
11
|
-
|
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="<%=
|
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
|
-
|
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">
|
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>
|
data/config/locales/en.yml
CHANGED
@@ -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
|
data/config/locales/nl.yml
CHANGED
@@ -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
|
data/lib/formstrap/version.rb
CHANGED
data/package.json
CHANGED
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.
|
4
|
+
version: 0.3.1
|
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-
|
11
|
+
date: 2024-03-18 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/
|
167
|
-
- config/locales/formstrap/
|
168
|
-
- config/locales/formstrap/
|
169
|
-
- config/locales/formstrap/
|
170
|
-
- config/locales/
|
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
|