headmin 0.5.1 → 0.5.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -2
- data/Gemfile +14 -0
- data/Gemfile.lock +77 -0
- data/app/assets/javascripts/headmin/controllers/media_controller.js +237 -0
- data/app/assets/javascripts/headmin/controllers/media_modal_controller.js +110 -0
- data/app/assets/javascripts/headmin/controllers/remote_modal_controller.js +10 -0
- data/app/assets/javascripts/headmin/controllers/textarea_controller.js +34 -0
- data/app/assets/javascripts/headmin/index.js +8 -0
- data/app/assets/javascripts/headmin.js +294 -0
- data/app/assets/stylesheets/headmin/forms/file.scss +40 -5
- data/app/assets/stylesheets/headmin/forms/media.scss +10 -0
- data/app/assets/stylesheets/headmin/forms/repeater.scss +4 -0
- data/app/assets/stylesheets/headmin/forms.scss +7 -0
- data/app/assets/stylesheets/headmin/layout/sidebar.scss +0 -1
- data/app/assets/stylesheets/headmin/media/index.scss +9 -0
- data/app/assets/stylesheets/headmin/media.scss +1 -0
- data/app/assets/stylesheets/headmin/table.scss +8 -0
- data/app/assets/stylesheets/headmin.css +64 -7
- data/app/assets/stylesheets/headmin.scss +1 -0
- data/app/controllers/headmin/media_controller.rb +52 -0
- data/app/controllers/headmin_controller.rb +2 -0
- data/app/models/concerns/headmin/field.rb +0 -1
- data/app/models/concerns/headmin/fieldable.rb +10 -1
- data/app/models/concerns/headmin/form/hintable.rb +6 -1
- data/app/models/headmin/filter/date.rb +49 -1
- data/app/models/headmin/form/media_view.rb +113 -0
- data/app/models/headmin/form/textarea_view.rb +6 -1
- data/app/views/examples/admin.html.erb +13 -13
- data/app/views/examples/auth.html.erb +1 -1
- data/app/views/headmin/_blocks.html.erb +2 -2
- data/app/views/headmin/_breadcrumbs.html.erb +1 -1
- data/app/views/headmin/_dropdown.html.erb +1 -1
- data/app/views/headmin/_filters.html.erb +3 -3
- data/app/views/headmin/_form.html.erb +2 -2
- data/app/views/headmin/_heading.html.erb +1 -1
- data/app/views/headmin/_index.html.erb +1 -1
- data/app/views/headmin/_notifications.html.erb +1 -1
- data/app/views/headmin/_pagination.html.erb +1 -1
- data/app/views/headmin/_popup.html.erb +2 -2
- data/app/views/headmin/_table.html.erb +1 -1
- data/app/views/headmin/dropdown/_devise.html.erb +8 -8
- data/app/views/headmin/dropdown/_list.html.erb +1 -1
- data/app/views/headmin/dropdown/_locale.html.erb +4 -4
- data/app/views/headmin/filters/_base.html.erb +20 -20
- data/app/views/headmin/filters/_boolean.html.erb +4 -4
- data/app/views/headmin/filters/_date.html.erb +4 -4
- data/app/views/headmin/filters/_flatpickr.html.erb +4 -4
- data/app/views/headmin/filters/_number.html.erb +4 -4
- data/app/views/headmin/filters/_options.html.erb +4 -4
- data/app/views/headmin/filters/_search.html.erb +3 -3
- data/app/views/headmin/filters/_text.html.erb +4 -4
- data/app/views/headmin/filters/filter/_button.html.erb +1 -1
- data/app/views/headmin/forms/_autocomplete.html.erb +2 -2
- data/app/views/headmin/forms/_blocks.html.erb +4 -4
- data/app/views/headmin/forms/_checkbox.html.erb +5 -5
- data/app/views/headmin/forms/_color.html.erb +5 -5
- data/app/views/headmin/forms/_date.html.erb +8 -8
- data/app/views/headmin/forms/_date_range.html.erb +3 -3
- data/app/views/headmin/forms/_datetime.html.erb +8 -8
- data/app/views/headmin/forms/_datetime_range.html.erb +3 -3
- data/app/views/headmin/forms/_email.html.erb +9 -9
- data/app/views/headmin/forms/_file.html.erb +12 -12
- data/app/views/headmin/forms/_flatpickr.html.erb +2 -2
- data/app/views/headmin/forms/_flatpickr_range.html.erb +8 -8
- data/app/views/headmin/forms/_hidden.html.erb +1 -1
- data/app/views/headmin/forms/_hint.html.erb +7 -2
- data/app/views/headmin/forms/_label.html.erb +1 -1
- data/app/views/headmin/forms/_media.html.erb +58 -0
- data/app/views/headmin/forms/_number.html.erb +8 -8
- data/app/views/headmin/forms/_password.html.erb +7 -7
- data/app/views/headmin/forms/_redactorx.html.erb +2 -2
- data/app/views/headmin/forms/_repeater.html.erb +12 -12
- data/app/views/headmin/forms/_search.html.erb +9 -9
- data/app/views/headmin/forms/_select.html.erb +8 -8
- data/app/views/headmin/forms/_switch.html.erb +2 -2
- data/app/views/headmin/forms/_text.html.erb +9 -9
- data/app/views/headmin/forms/_textarea.html.erb +7 -7
- data/app/views/headmin/forms/_url.html.erb +9 -9
- data/app/views/headmin/forms/_validation.html.erb +1 -1
- data/app/views/headmin/forms/_wysiwyg.html.erb +2 -2
- data/app/views/headmin/forms/fields/_base.html.erb +2 -2
- data/app/views/headmin/forms/fields/_file.html.erb +3 -3
- data/app/views/headmin/forms/fields/_files.html.erb +3 -3
- data/app/views/headmin/forms/fields/_group.html.erb +7 -7
- data/app/views/headmin/forms/fields/_list.html.erb +5 -5
- data/app/views/headmin/forms/fields/_text.html.erb +3 -3
- data/app/views/headmin/forms/media/_item.html.erb +32 -0
- data/app/views/headmin/forms/media/_validation.html.erb +10 -0
- data/app/views/headmin/forms/repeater/_row.html.erb +12 -11
- data/app/views/headmin/layout/_main.html.erb +3 -1
- data/app/views/headmin/layout/_remote_modal.html.erb +1 -0
- data/app/views/headmin/layout/_sidebar.html.erb +1 -1
- data/app/views/headmin/media/_item.html.erb +17 -0
- data/app/views/headmin/media/_media_item_modal.html.erb +51 -0
- data/app/views/headmin/media/_modal.html.erb +35 -0
- data/app/views/headmin/media/create.turbo_stream.erb +5 -0
- data/app/views/headmin/media/index.html.erb +3 -0
- data/app/views/headmin/media/show.html.erb +9 -0
- data/app/views/headmin/media/update.turbo_stream.erb +3 -0
- data/app/views/headmin/nav/_dropdown.html.erb +3 -3
- data/app/views/headmin/nav/_item.html.erb +2 -2
- data/app/views/headmin/nav/item/_devise.html.erb +6 -6
- data/app/views/headmin/nav/item/_locale.html.erb +4 -4
- data/app/views/headmin/table/_actions.html.erb +2 -2
- data/app/views/headmin/table/actions/_action.html.erb +3 -3
- data/app/views/headmin/table/actions/_delete.html.erb +2 -2
- data/app/views/headmin/table/actions/_export.html.erb +2 -2
- data/app/views/headmin/table/body/_image.html.erb +18 -0
- data/app/views/headmin/table/body/_row.html.erb +3 -3
- data/app/views/headmin/table/foot/_cell.html.erb +1 -1
- data/app/views/headmin/views/devise/confirmations/_new.html.erb +3 -3
- data/app/views/headmin/views/devise/passwords/_edit.html.erb +4 -4
- data/app/views/headmin/views/devise/passwords/_new.html.erb +3 -3
- data/app/views/headmin/views/devise/registrations/_edit.html.erb +5 -5
- data/app/views/headmin/views/devise/registrations/_new.html.erb +5 -5
- data/app/views/headmin/views/devise/sessions/_new.html.erb +4 -4
- data/app/views/headmin/views/devise/unlocks/_new.html.erb +3 -3
- data/config/locales/devise/nl.yml +1 -1
- data/config/locales/headmin/forms/en.yml +8 -0
- data/config/locales/headmin/forms/nl.yml +8 -0
- data/config/locales/headmin/media/en.yml +23 -0
- data/config/locales/headmin/media/nl.yml +22 -0
- data/config/locales/headmin/table/en.yml +2 -0
- data/config/locales/headmin/table/nl.yml +2 -0
- data/config/routes.rb +10 -0
- data/lib/generators/templates/views/auth/confirmations/new.html.erb +1 -1
- data/lib/generators/templates/views/auth/mailer/confirmation_instructions.html.erb +1 -1
- data/lib/generators/templates/views/auth/mailer/email_changed.html.erb +1 -1
- data/lib/generators/templates/views/auth/mailer/password_change.html.erb +1 -1
- data/lib/generators/templates/views/auth/mailer/reset_password_instructions.html.erb +1 -1
- data/lib/generators/templates/views/auth/mailer/unlock_instructions.html.erb +1 -1
- data/lib/generators/templates/views/auth/passwords/edit.html.erb +1 -1
- data/lib/generators/templates/views/auth/passwords/new.html.erb +1 -1
- data/lib/generators/templates/views/auth/registrations/edit.html.erb +1 -1
- data/lib/generators/templates/views/auth/registrations/new.html.erb +1 -1
- data/lib/generators/templates/views/auth/sessions/new.html.erb +1 -1
- data/lib/generators/templates/views/auth/unlocks/new.html.erb +1 -1
- data/lib/generators/templates/views/layouts/auth.html.erb +1 -1
- data/lib/headmin/version.rb +1 -1
- metadata +27 -3
- data/.lock-487e157d270f3062a98b7b2a012753708-1272821827 +0 -0
@@ -11,24 +11,24 @@
|
|
11
11
|
#
|
12
12
|
# ==== Examples
|
13
13
|
# # Basic version
|
14
|
-
# <% render
|
15
|
-
# <% render
|
14
|
+
# <% render 'headmin/forms/repeater', form: form, attribute: :questions do |question| %#>
|
15
|
+
# <% render 'admin/questions/fields, form: :question' %#>
|
16
16
|
# <% end %#>
|
17
17
|
#
|
18
18
|
# # Let list group sit flush within its container
|
19
|
-
# <% render
|
20
|
-
# <% render
|
19
|
+
# <% render 'headmin/forms/repeater', form: form, attribute: :questions, flush: true do |question| %#>
|
20
|
+
# <% render 'admin/questions/fields, form: :question' %#>
|
21
21
|
# <% end %#>
|
22
22
|
#
|
23
23
|
# # With fixed header row. A header row can be used to show the labels, so you can omit them in the repeated fields
|
24
|
-
# <% render
|
25
|
-
# <% render
|
24
|
+
# <% render 'headmin/forms/repeater', form: form, attribute: :questions, header: 'admin/questions/header' do |question| %#>
|
25
|
+
# <% render 'admin/questions/fields, form: :question' %#>
|
26
26
|
# <% end %#>
|
27
27
|
#
|
28
28
|
# # Allow more than one type of fields to be inserted. You must specify the templates as an array of view paths
|
29
29
|
# <% templates = ['admin/questions/fields/type_1', 'admin/questions/fields/type_2'] %#>
|
30
|
-
# <% render
|
31
|
-
# <% render
|
30
|
+
# <% render 'headmin/forms/repeater', form: form, attribute: :questions, templates: templates do |question| %#>
|
31
|
+
# <% render 'admin/questions/fields, form: :question' %#>
|
32
32
|
# <% end %#>
|
33
33
|
|
34
34
|
label = local_assigns.has_key?(:label) ? label : nil
|
@@ -52,7 +52,7 @@
|
|
52
52
|
|
53
53
|
<!-- Label -->
|
54
54
|
<% if show_label %>
|
55
|
-
<%= render
|
55
|
+
<%= render 'headmin/forms/label', form: form, attribute: attribute, text: label, required: required %>
|
56
56
|
<% end %>
|
57
57
|
|
58
58
|
<ul class="repeater list-group <%= 'list-group-flush' if flush %>" data-controller="repeater" data-repeater-target="list" data-repeater-id-value="<%= repeater_id %>">
|
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
<!-- Rows -->
|
68
68
|
<%= form.fields_for attribute, associations do |ff| %>
|
69
|
-
<%= render
|
69
|
+
<%= render 'headmin/forms/repeater/row', pass_thru: pass_thru, form: ff, repeater_id: repeater_id do %>
|
70
70
|
<%= yield(ff) %>
|
71
71
|
<% end %>
|
72
72
|
<% end %>
|
@@ -93,7 +93,7 @@
|
|
93
93
|
</div>
|
94
94
|
|
95
95
|
<!-- Popup -->
|
96
|
-
<%= render
|
96
|
+
<%= render 'headmin/popup', id: "repeater-buttons-#{repeater_id}" do %>
|
97
97
|
<div class="d-grid gap-2">
|
98
98
|
<% template_names.each do |name| %>
|
99
99
|
<div
|
@@ -114,7 +114,7 @@
|
|
114
114
|
<% template_names.each do |name| %>
|
115
115
|
<template data-repeater-target="template" data-template-name="<%= name %>" data-template-id-regex="<%= association_object.object_id %>">
|
116
116
|
<%= form.fields_for attribute, association_object, child_index: association_object.object_id do |ff| %>
|
117
|
-
<%= render
|
117
|
+
<%= render 'headmin/forms/repeater/row', form: ff, pass_thru: pass_thru, repeater_id: repeater_id do %>
|
118
118
|
<% yield(ff, name) %>
|
119
119
|
<% end %>
|
120
120
|
<% end %>
|
@@ -24,20 +24,20 @@
|
|
24
24
|
# ==== Examples
|
25
25
|
# Basic version
|
26
26
|
# <%= form_with do |form| %#>
|
27
|
-
# <%= render
|
27
|
+
# <%= render 'headmin/forms/search', form: form, attribute: "basic_example" %#>
|
28
28
|
# <% end %#>
|
29
29
|
|
30
30
|
search = Headmin::Form::SearchView.new(local_assigns)
|
31
31
|
%>
|
32
32
|
|
33
|
-
<%= render
|
34
|
-
<%= render
|
35
|
-
<%= render
|
33
|
+
<%= render 'headmin/forms/wrapper', search.wrapper_options do %>
|
34
|
+
<%= render 'headmin/forms/label', search.label_options if search.prepend_label? %>
|
35
|
+
<%= render 'headmin/forms/input_group', search.input_group_options do %>
|
36
36
|
<%= form.search_field(search.attribute, search.input_options) %>
|
37
|
-
<%= render
|
38
|
-
<%= render
|
37
|
+
<%= render 'headmin/forms/datalist', search.datalist_options if search.datalist? %>
|
38
|
+
<%= render 'headmin/forms/autocomplete', search.autocomplete_options if search.autocomplete? %>
|
39
39
|
<% end %>
|
40
|
-
<%= render
|
41
|
-
<%= render
|
42
|
-
<%= render
|
40
|
+
<%= render 'headmin/forms/validation', search.validation_options if search.validate? %>
|
41
|
+
<%= render 'headmin/forms/hint', search.hint_options if search.hint? %>
|
42
|
+
<%= render 'headmin/forms/label', search.label_options if search.append_label? %>
|
43
43
|
<% end %>
|
@@ -25,19 +25,19 @@
|
|
25
25
|
# ==== Examples
|
26
26
|
# Basic version
|
27
27
|
# <%= form_with do |form| %#>
|
28
|
-
# <%= render
|
28
|
+
# <%= render 'headmin/forms/select', form: form, attribute: :color, collection: %w[red green blue] %#>
|
29
29
|
# <% end %#>
|
30
30
|
|
31
31
|
select = Headmin::Form::SelectView.new(local_assigns)
|
32
32
|
%>
|
33
33
|
|
34
|
-
<%= render
|
35
|
-
<%= render
|
36
|
-
<%= render
|
34
|
+
<%= render 'headmin/forms/wrapper', select.wrapper_options do %>
|
35
|
+
<%= render 'headmin/forms/label', select.label_options if select.prepend_label? %>
|
36
|
+
<%= render 'headmin/forms/input_group', select.input_group_options do %>
|
37
37
|
<%= form.select(select.attribute, select.collection, select.select_options, select.input_options) %>
|
38
38
|
<% end %>
|
39
|
-
<%= render
|
40
|
-
<%= render
|
41
|
-
<%= render
|
42
|
-
<%= render
|
39
|
+
<%= render 'headmin/forms/validation', select.validation_options if select.validate? %>
|
40
|
+
<%= render 'headmin/forms/hint', select.hint_options if select.hint? %>
|
41
|
+
<%= render 'headmin/forms/datalist', select.datalist_options if select.datalist? %>
|
42
|
+
<%= render 'headmin/forms/label', select.label_options if select.append_label? %>
|
43
43
|
<% end %>
|
@@ -20,10 +20,10 @@
|
|
20
20
|
# ==== Examples
|
21
21
|
# Basic version
|
22
22
|
# <%= form_with do |form| %#>
|
23
|
-
# <%= render
|
23
|
+
# <%= render 'headmin/forms/switch', form: form, attribute: :active %#>
|
24
24
|
# <% end %#>
|
25
25
|
|
26
26
|
switch = Headmin::Form::SwitchView.new(local_assigns)
|
27
27
|
%>
|
28
28
|
|
29
|
-
<%= render
|
29
|
+
<%= render 'headmin/forms/checkbox', switch.options %>
|
@@ -24,20 +24,20 @@
|
|
24
24
|
# ==== Examples
|
25
25
|
# Basic version
|
26
26
|
# <%= form_with do |form| %#>
|
27
|
-
# <%= render
|
27
|
+
# <%= render 'headmin/forms/text', form: form, attribute: :title %#>
|
28
28
|
# <% end %#>
|
29
29
|
|
30
30
|
text = Headmin::Form::TextView.new(local_assigns)
|
31
31
|
%>
|
32
32
|
|
33
|
-
<%= render
|
34
|
-
<%= render
|
35
|
-
<%= render
|
33
|
+
<%= render 'headmin/forms/wrapper', text.wrapper_options do %>
|
34
|
+
<%= render 'headmin/forms/label', text.label_options if text.prepend_label? %>
|
35
|
+
<%= render 'headmin/forms/input_group', text.input_group_options do %>
|
36
36
|
<%= form.text_field(text.attribute, text.input_options) %>
|
37
|
-
<%= render
|
38
|
-
<%= render
|
37
|
+
<%= render 'headmin/forms/datalist', text.datalist_options if text.datalist? %>
|
38
|
+
<%= render 'headmin/forms/autocomplete', text.autocomplete_options if text.autocomplete? %>
|
39
39
|
<% end %>
|
40
|
-
<%= render
|
41
|
-
<%= render
|
42
|
-
<%= render
|
40
|
+
<%= render 'headmin/forms/validation', text.validation_options if text.validate? %>
|
41
|
+
<%= render 'headmin/forms/hint', text.hint_options if text.hint? %>
|
42
|
+
<%= render 'headmin/forms/label', text.label_options if text.append_label? %>
|
43
43
|
<% end %>
|
@@ -22,18 +22,18 @@
|
|
22
22
|
# ==== Examples
|
23
23
|
# Basic version
|
24
24
|
# <%= form_with do |form| %#>
|
25
|
-
# <%= render
|
25
|
+
# <%= render 'headmin/forms/textarea', form: form, attribute: :text %#>
|
26
26
|
# <% end %#>
|
27
27
|
|
28
28
|
textarea = Headmin::Form::TextareaView.new(local_assigns)
|
29
29
|
%>
|
30
30
|
|
31
|
-
<%= render
|
32
|
-
<%= render
|
33
|
-
<%= render
|
31
|
+
<%= render 'headmin/forms/wrapper', textarea.wrapper_options do %>
|
32
|
+
<%= render 'headmin/forms/label', textarea.label_options if textarea.prepend_label? %>
|
33
|
+
<%= render 'headmin/forms/input_group', textarea.input_group_options do %>
|
34
34
|
<%= form.text_area(textarea.attribute, textarea.input_options) %>
|
35
35
|
<% end %>
|
36
|
-
<%= render
|
37
|
-
<%= render
|
38
|
-
<%= render
|
36
|
+
<%= render 'headmin/forms/validation', textarea.validation_options if textarea.validate? %>
|
37
|
+
<%= render 'headmin/forms/hint', textarea.hint_options if textarea.hint? || textarea.maxlength? %>
|
38
|
+
<%= render 'headmin/forms/label', textarea.label_options if textarea.append_label? %>
|
39
39
|
<% end %>
|
@@ -24,20 +24,20 @@
|
|
24
24
|
# ==== Examples
|
25
25
|
# Basic version
|
26
26
|
# <%= form_with do |form| %#>
|
27
|
-
# <%= render
|
27
|
+
# <%= render 'headmin/forms/url', form: form, attribute: :website_url %#>
|
28
28
|
# <% end %#>
|
29
29
|
|
30
30
|
url = Headmin::Form::UrlView.new(local_assigns)
|
31
31
|
%>
|
32
32
|
|
33
|
-
<%= render
|
34
|
-
<%= render
|
35
|
-
<%= render
|
33
|
+
<%= render 'headmin/forms/wrapper', url.wrapper_options do %>
|
34
|
+
<%= render 'headmin/forms/label', url.label_options if url.prepend_label? %>
|
35
|
+
<%= render 'headmin/forms/input_group', url.input_group_options do %>
|
36
36
|
<%= form.url_field(url.attribute, url.input_options) %>
|
37
|
-
<%= render
|
38
|
-
<%= render
|
37
|
+
<%= render 'headmin/forms/datalist', url.datalist_options if url.datalist? %>
|
38
|
+
<%= render 'headmin/forms/autocomplete', url.autocomplete_options if url.autocomplete? %>
|
39
39
|
<% end %>
|
40
|
-
<%= render
|
41
|
-
<%= render
|
42
|
-
<%= render
|
40
|
+
<%= render 'headmin/forms/validation', url.validation_options if url.validate? %>
|
41
|
+
<%= render 'headmin/forms/hint', url.hint_options if url.hint? %>
|
42
|
+
<%= render 'headmin/forms/label', url.label_options if url.append_label? %>
|
43
43
|
<% end %>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# ==== Examples
|
12
12
|
# Basic version
|
13
|
-
# <%= render
|
13
|
+
# <%= render 'headmin/forms/validation', id: id, message: message %#>
|
14
14
|
%>
|
15
15
|
|
16
16
|
<div class="<%= valid ? "valid-feedback" : "invalid-feedback" %>" id="<%= id %>">
|
@@ -19,10 +19,10 @@
|
|
19
19
|
# ==== Examples
|
20
20
|
# Basic version
|
21
21
|
# <%= form_with do |form| %#>
|
22
|
-
# <%= render
|
22
|
+
# <%= render 'headmin/forms/redactorx', form: form, attribute: :text %#>
|
23
23
|
# <% end %#>
|
24
24
|
|
25
25
|
wysiwyg = Headmin::Form::WysiwygView.new(local_assigns)
|
26
26
|
%>
|
27
27
|
|
28
|
-
<%= render
|
28
|
+
<%= render 'headmin/forms/redactorx', wysiwyg.options %>
|
@@ -8,8 +8,8 @@
|
|
8
8
|
#
|
9
9
|
# ==== Examples
|
10
10
|
# Basic version
|
11
|
-
# <%= render
|
12
|
-
# <%= render
|
11
|
+
# <%= render 'headmin/forms/fields/base', form: form, field_type: :text, name: name do |field, label| %#>
|
12
|
+
# <%= render 'headmin/forms/text', form: field, attribute: :value, label: label %#>
|
13
13
|
# <% end %#>
|
14
14
|
|
15
15
|
field = form.object.fields.detect { |field| field.name.to_s == name.to_s }
|
@@ -7,11 +7,11 @@
|
|
7
7
|
#
|
8
8
|
# ==== Examples
|
9
9
|
# Basic version
|
10
|
-
# <%= render
|
11
|
-
# <%= render
|
10
|
+
# <%= render 'headmin/forms/fields/file', form: group, name: :file do |field, attribute, label| %#>
|
11
|
+
# <%= render 'headmin/forms/file', form: field, attribute: attribute, label: label %#>
|
12
12
|
# <% end %#>
|
13
13
|
%>
|
14
14
|
|
15
|
-
<%= render
|
15
|
+
<%= render 'headmin/forms/fields/base', form: form, field_type: :file, name: name do |field, label| %>
|
16
16
|
<% yield field, :files, label %>
|
17
17
|
<% end %>
|
@@ -7,11 +7,11 @@
|
|
7
7
|
#
|
8
8
|
# ==== Examples
|
9
9
|
# Basic version
|
10
|
-
# <%= render
|
11
|
-
# <%= render
|
10
|
+
# <%= render 'headmin/forms/fields/file', form: group, name: :file do |field, attribute, label| %#>
|
11
|
+
# <%= render 'headmin/forms/file', form: field, attribute: attribute, label: label %#>
|
12
12
|
# <% end %#>
|
13
13
|
%>
|
14
14
|
|
15
|
-
<%= render
|
15
|
+
<%= render 'headmin/forms/fields/base', form: form, field_type: :files, name: name do |field, label| %>
|
16
16
|
<% yield field, :files, label %>
|
17
17
|
<% end %>
|
@@ -8,16 +8,16 @@
|
|
8
8
|
#
|
9
9
|
# ==== Examples
|
10
10
|
# Basic version
|
11
|
-
# <%= render
|
11
|
+
# <%= render 'headmin/forms/fields/group', form: form, name: :button do |group| %#>
|
12
12
|
# <div class="row">
|
13
13
|
# <div class="col-md-6">
|
14
|
-
# <%= render
|
15
|
-
# <%= render
|
14
|
+
# <%= render 'headmin/forms/fields/text', form: group, name: :name do |field, attribute, label| %#>
|
15
|
+
# <%= render 'headmin/forms/text', form: field, attribute: attribute, label: label %#>
|
16
16
|
# <% end %#>
|
17
17
|
# </div>
|
18
18
|
# <div class="col-md-6">
|
19
|
-
# <%= render
|
20
|
-
# <%= render
|
19
|
+
# <%= render 'headmin/forms/fields/text', form: group, name: :url do |field, attribute, label| %#>
|
20
|
+
# <%= render 'headmin/forms/text', form: field, attribute: attribute, label: label %#>
|
21
21
|
# <% end %#>
|
22
22
|
# </div>
|
23
23
|
# </div>
|
@@ -28,9 +28,9 @@
|
|
28
28
|
show_label = label != false
|
29
29
|
%>
|
30
30
|
|
31
|
-
<%= render
|
31
|
+
<%= render 'headmin/forms/fields/base', form: form, name: name, field_type: :group do |group, field_label| %>
|
32
32
|
<% if show_label %>
|
33
|
-
<%= render
|
33
|
+
<%= render 'headmin/forms/label', form: form, attribute: :value, text: label || field_label %>
|
34
34
|
<% end %>
|
35
35
|
|
36
36
|
<% if wrapper %>
|
@@ -8,9 +8,9 @@
|
|
8
8
|
#
|
9
9
|
# ==== Examples
|
10
10
|
# Basic version
|
11
|
-
# <%= render
|
12
|
-
# <%= render
|
13
|
-
# <%= render
|
11
|
+
# <%= render 'headmin/forms/fields/list', form: form, name: :websites do |list| %#>
|
12
|
+
# <%= render 'headmin/forms/fields/text', form: list, name: :url do |field, attribute, label| %#>
|
13
|
+
# <%= render 'headmin/forms/text', form: field, attribute: attribute, label: label %#>
|
14
14
|
# <% end %#>
|
15
15
|
# <% end %#>
|
16
16
|
|
@@ -18,8 +18,8 @@
|
|
18
18
|
show_label = label != false
|
19
19
|
%>
|
20
20
|
|
21
|
-
<%= render
|
22
|
-
<%= render
|
21
|
+
<%= render 'headmin/forms/fields/base', form: form, name: name, field_type: :list do |list, field_label| %>
|
22
|
+
<%= render 'headmin/forms/repeater', form: list, attribute: :fields, label: show_label ? label || field_label : false, flush: false do |field| %>
|
23
23
|
<%= field.hidden_field :field_type, value: :group %>
|
24
24
|
<%= yield field %>
|
25
25
|
<% end %>
|
@@ -7,11 +7,11 @@
|
|
7
7
|
#
|
8
8
|
# ==== Examples
|
9
9
|
# Basic version
|
10
|
-
# <%= render
|
11
|
-
# <%= render
|
10
|
+
# <%= render 'headmin/forms/fields/text', form: group, name: :name do |field, attribute, label| %#>
|
11
|
+
# <%= render 'headmin/forms/text', form: field, attribute: attribute, label: label %#>
|
12
12
|
# <% end %#>
|
13
13
|
%>
|
14
14
|
|
15
|
-
<%= render
|
15
|
+
<%= render 'headmin/forms/fields/base', form: form, field_type: :text, name: name do |field, label| %>
|
16
16
|
<% yield field, :value, label %>
|
17
17
|
<% end %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<%
|
2
|
+
attachment = form.object
|
3
|
+
filename = attachment.blob&.filename&.to_s
|
4
|
+
size = number_to_human_size(attachment.blob&.byte_size || 0)
|
5
|
+
src = nil
|
6
|
+
if attachment.blob
|
7
|
+
src = attachment.image? ? url_for(attachment.variant(resize_to_fill: [100, 100])) : url_for(attachment)
|
8
|
+
end
|
9
|
+
%>
|
10
|
+
|
11
|
+
<div class="h-form-file-thumbnail media-drag-sort-handle" title="<%= "#{filename} (#{size})" %>" data-media-target="item">
|
12
|
+
<%= form.hidden_field(:id) %>
|
13
|
+
<%= form.hidden_field(:blob_id) %>
|
14
|
+
<%= form.hidden_field(:position, value: attachment.new_record? ? nil : attachment.position) if sort %>
|
15
|
+
<%= form.hidden_field(:_destroy) %>
|
16
|
+
|
17
|
+
<a href="<%= url %>" data-turbo-frame="remote_modal" data-media-target="modalButton">
|
18
|
+
<%= render 'headmin/thumbnail', src: src, width: 100, height: 100 %>
|
19
|
+
</a>
|
20
|
+
|
21
|
+
<div class="h-form-file-thumbnail-actions">
|
22
|
+
<!-- Edit -->
|
23
|
+
<a href="<%= headmin_media_item_url(id: attachment.blob ? attachment.blob.id : '$1') %>" class="h-form-file-thumbnail-edit" data-turbo-frame="remote_modal" data-media-target="editButton">
|
24
|
+
<%= bootstrap_icon('pencil') %>
|
25
|
+
</a>
|
26
|
+
|
27
|
+
<!-- Remove -->
|
28
|
+
<div class="h-form-file-thumbnail-remove" data-action="click->media#destroy">
|
29
|
+
<%= bootstrap_icon('x') %>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<!-- Custom validation field -->
|
2
|
+
<%= form.text_field :"validation_#{attribute}",
|
3
|
+
name: nil,
|
4
|
+
value: nil,
|
5
|
+
class: 'h-form-media-validation',
|
6
|
+
data: {
|
7
|
+
'media-target': 'validationInput',
|
8
|
+
'min-message': t('.min', count: min),
|
9
|
+
'max-message': t('.max', count: max),
|
10
|
+
} %>
|
@@ -18,7 +18,6 @@
|
|
18
18
|
<%= form.hidden_field :id %>
|
19
19
|
<%= form.hidden_field :_destroy if destroyable %>
|
20
20
|
<%= form.hidden_field :position if draggable %>
|
21
|
-
<%= yield %>
|
22
21
|
|
23
22
|
<!-- Drag handle -->
|
24
23
|
<% if draggable %>
|
@@ -29,23 +28,25 @@
|
|
29
28
|
|
30
29
|
<!-- Add button-->
|
31
30
|
<div
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
31
|
+
class="repeater-row-add btn btn-link"
|
32
|
+
title="<%= t('.add') %>"
|
33
|
+
data-repeater-target="addButton"
|
34
|
+
data-popup-target="button"
|
35
|
+
data-popup-id="<%= "repeater-buttons-#{repeater_id}" %>"
|
36
|
+
data-popup-pass-thru="<%= pass_thru %>"
|
37
|
+
data-action="click->repeater#resetButtonIndices click->popup#open"
|
39
38
|
>
|
40
39
|
<%= bootstrap_icon('plus-circle') %>
|
41
40
|
</div>
|
42
41
|
|
43
42
|
<!-- Remove button-->
|
44
43
|
<div
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
class="repeater-row-remove btn btn-link"
|
45
|
+
title="<%= t('.remove') %>"
|
46
|
+
data-action="click->repeater#removeRow"
|
48
47
|
>
|
49
48
|
<%= bootstrap_icon('dash-circle') %>
|
50
49
|
</div>
|
50
|
+
|
51
|
+
<%= yield %>
|
51
52
|
</div>
|
@@ -3,13 +3,15 @@
|
|
3
3
|
#
|
4
4
|
# ==== Examples
|
5
5
|
# Basic version
|
6
|
-
# <%= render
|
6
|
+
# <%= render 'headmin/layout/main' do %#>
|
7
7
|
# ...
|
8
8
|
# <% end %#>
|
9
9
|
|
10
10
|
class_names = local_assigns.has_key?(:class) ? local_assigns[:class] : false
|
11
11
|
%>
|
12
12
|
|
13
|
+
<%= render "headmin/layout/remote_modal" %>
|
14
|
+
|
13
15
|
<div class="main <%= class_names %>" data-controller="popup">
|
14
16
|
<div class="container-fluid">
|
15
17
|
<div class="row">
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= turbo_frame_tag "remote_modal", target: "_top" %>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
<div class="sidebar col-sm-12 col-md-1 col-lg-2 bg-dark overflow-y d-print-none">
|
9
9
|
<nav class="navbar navbar-expand-md navbar-dark bg-dark w-100 h-100 flex-md-column">
|
10
|
-
<a href="<%= local_assigns[:url] %>" class="nav-brand mb-
|
10
|
+
<a href="<%= local_assigns[:url] %>" class="nav-brand mb-4 mt-3 me-lg-auto">
|
11
11
|
<%= local_assigns[:logo] %>
|
12
12
|
</a>
|
13
13
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar-nav" aria-controls="sidebar-nav" aria-expanded="false" aria-label="Toggle navigation">
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div data-media-modal-target="item" title="<%= "#{blob.filename} (#{l(blob.created_at, format: :long)})" %>">
|
2
|
+
<!-- Input -->
|
3
|
+
<input
|
4
|
+
id="media-item-<%= blob.id %>"
|
5
|
+
type="checkbox"
|
6
|
+
value="<%= blob.id %>"
|
7
|
+
<%= "checked" if params[:ids]&.include?(blob.id.to_s) %>
|
8
|
+
data-action="change->media-modal#inputChange"
|
9
|
+
data-media-modal-target="idCheckbox"
|
10
|
+
hidden>
|
11
|
+
|
12
|
+
<!-- Label -->
|
13
|
+
<label for="media-item-<%= blob.id %>">
|
14
|
+
<% src = blob.image? ? url_for(blob.variant(resize_to_fill: [100, 100])) : url_for(blob) %>
|
15
|
+
<%= render 'headmin/thumbnail', src: src, width: 100, height: 100 %>
|
16
|
+
</label>
|
17
|
+
</div>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<%= turbo_frame_tag "modal_content" do %>
|
2
|
+
<%= form_with url: headmin_media_item_url(id: @blob.id), model: @blob do |form| %>
|
3
|
+
<div class="modal-header">
|
4
|
+
<h5 class="modal-title"><%= t('.edit') %></h5>
|
5
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="<%= t('.close') %>"></button>
|
6
|
+
</div>
|
7
|
+
<div class="modal-body">
|
8
|
+
<%= render 'headmin/notifications' %>
|
9
|
+
<div class="row">
|
10
|
+
<div class="col-3">
|
11
|
+
<%= render 'headmin/thumbnail', src: url_for(@blob), width: 100, height: 100 %>
|
12
|
+
</div>
|
13
|
+
<div class="col-8 d-flex flex-column justify-content-center">
|
14
|
+
<p class="small text-secondary m-0">
|
15
|
+
<strong><%= t('.uploaded_at') %>:</strong>
|
16
|
+
<%= l(@blob.created_at, format: :long) %>
|
17
|
+
</p>
|
18
|
+
<p class="small text-secondary m-0">
|
19
|
+
<strong><%= t('.type') %>:</strong>
|
20
|
+
<%= @blob.content_type %>
|
21
|
+
</p>
|
22
|
+
<p class="small text-secondary m-0">
|
23
|
+
<strong><%= t('.dimensions') %>:</strong>
|
24
|
+
<% if @blob.metadata[:width] && @blob.metadata[:height] %>
|
25
|
+
<%= "#{@blob.metadata[:width]}px x #{@blob.metadata[:height]}px" %>
|
26
|
+
<% else %>
|
27
|
+
<%= t('.not_analysed') %>
|
28
|
+
<% end %>
|
29
|
+
</p>
|
30
|
+
<p class="small text-secondary m-0">
|
31
|
+
<strong><%= t('.size') %>:</strong>
|
32
|
+
<% if @blob.byte_size > 0 %>
|
33
|
+
<%= number_to_human_size(@blob.byte_size) %>
|
34
|
+
<% else %>
|
35
|
+
<%= t('.not_analysed') %>
|
36
|
+
<% end %>
|
37
|
+
</p>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<div class="row mt-3">
|
41
|
+
<div class="col-12">
|
42
|
+
<%= render 'headmin/forms/text', form: form, attribute: :filename, append: "." + form.object.filename.to_s.rpartition(".").last, value: form.object.filename.to_s.rpartition(".").first %>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
<div class="modal-footer">
|
47
|
+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><%= t('.close') %></button>
|
48
|
+
<%= form.submit t(".update"), class: "btn btn-primary" %>
|
49
|
+
</div>
|
50
|
+
<% end %>
|
51
|
+
<% end %>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<div class="media-modal modal fade" tabindex="-1" data-controller="remote-modal media-modal" data-name="<%= name %>" data-min="<%= min %>" data-max="<%= max %>">
|
2
|
+
<div class="modal-dialog modal-lg modal-dialog-scrollable">
|
3
|
+
<div class="modal-content">
|
4
|
+
<div class="modal-header">
|
5
|
+
<h5 class="modal-title">
|
6
|
+
<%= t('.title', count: min.to_i < 1 ? 1 : min.to_i) %>
|
7
|
+
</h5>
|
8
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="<%= t('.close') %>"></button>
|
9
|
+
</div>
|
10
|
+
<div class="modal-body">
|
11
|
+
<%= turbo_frame_tag 'thumbnails', class: 'd-flex flex-wrap gap-2' do %>
|
12
|
+
<% @blobs.each do |blob| %>
|
13
|
+
<%= render 'headmin/media/item', blob: blob %>
|
14
|
+
<% end %>
|
15
|
+
<div data-media-modal-target="placeholder" class="<%= "d-none" if !@blobs.empty? %>">
|
16
|
+
<p><%= t('.placeholder') %></p>
|
17
|
+
</div>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
<div class="modal-footer">
|
21
|
+
<%= form_with url: headmin_media_path, multipart: true, data: {'media-modal-target': 'form'}, class: "me-auto" do |form| %>
|
22
|
+
<%= form.label :files, class: "btn h-btn-outline-light" do %>
|
23
|
+
<%= bootstrap_icon("upload") %>
|
24
|
+
<%= t('.upload') %>
|
25
|
+
<%= form.file_field :files, class: 'd-none', multiple: true, data: {action: "change->media-modal#submitForm"} %>
|
26
|
+
<% end %>
|
27
|
+
<% end %>
|
28
|
+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><%= t('.close') %></button>
|
29
|
+
<button type="button" class="btn btn-primary" data-bs-dismiss="modal" data-action="click->media-modal#select" data-media-modal-target="selectButton">
|
30
|
+
<%= t('.select') %> (<span data-media-modal-target="count">0</span><%= t('.maximum', count: max.to_i) if max.present? %>)
|
31
|
+
</button>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</div>
|