cms42 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +21 -0
- data/README.md +299 -0
- data/Rakefile +10 -0
- data/app/assets/stylesheets/cms/application.css +3 -0
- data/app/controllers/cms/admin/api_keys_controller.rb +52 -0
- data/app/controllers/cms/admin/base_controller.rb +54 -0
- data/app/controllers/cms/admin/documents_controller.rb +56 -0
- data/app/controllers/cms/admin/form_fields_controller.rb +70 -0
- data/app/controllers/cms/admin/form_submissions_controller.rb +36 -0
- data/app/controllers/cms/admin/images_controller.rb +67 -0
- data/app/controllers/cms/admin/pages_controller.rb +188 -0
- data/app/controllers/cms/admin/sections_controller.rb +177 -0
- data/app/controllers/cms/admin/sites_controller.rb +60 -0
- data/app/controllers/cms/admin/webhook_deliveries_controller.rb +19 -0
- data/app/controllers/cms/admin/webhooks_controller.rb +51 -0
- data/app/controllers/cms/api/base_controller.rb +45 -0
- data/app/controllers/cms/api/v1/base_controller.rb +29 -0
- data/app/controllers/cms/api/v1/pages_controller.rb +21 -0
- data/app/controllers/cms/api/v1/sites_controller.rb +18 -0
- data/app/controllers/cms/application_controller.rb +11 -0
- data/app/controllers/cms/public/base_controller.rb +23 -0
- data/app/controllers/cms/public/form_submissions_controller.rb +63 -0
- data/app/controllers/cms/public/previews_controller.rb +21 -0
- data/app/controllers/cms/public/sites_controller.rb +37 -0
- data/app/controllers/concerns/cms/admin/page_scoped_sections.rb +42 -0
- data/app/controllers/concerns/cms/current_site_resolver.rb +17 -0
- data/app/controllers/concerns/cms/public/page_paths.rb +31 -0
- data/app/controllers/concerns/cms/public/page_rendering.rb +23 -0
- data/app/controllers/concerns/cms/site_resolvable.rb +27 -0
- data/app/helpers/cms/admin/pages_helper.rb +29 -0
- data/app/helpers/cms/admin/sections_helper.rb +86 -0
- data/app/helpers/cms/admin/sites_helper.rb +8 -0
- data/app/helpers/cms/application_helper.rb +51 -0
- data/app/helpers/cms/media_helper.rb +28 -0
- data/app/helpers/cms/pages_helper.rb +16 -0
- data/app/helpers/cms/sections_helper.rb +25 -0
- data/app/helpers/cms/sites_helper.rb +11 -0
- data/app/javascript/cms/controllers/sortable_controller.js +38 -0
- data/app/jobs/cms/application_job.rb +6 -0
- data/app/jobs/cms/deliver_webhook_job.rb +66 -0
- data/app/mailers/cms/application_mailer.rb +9 -0
- data/app/mailers/cms/form_submission_mailer.rb +16 -0
- data/app/models/cms/api_key.rb +27 -0
- data/app/models/cms/application_record.rb +7 -0
- data/app/models/cms/document.rb +48 -0
- data/app/models/cms/form_field.rb +27 -0
- data/app/models/cms/form_submission.rb +42 -0
- data/app/models/cms/image.rb +61 -0
- data/app/models/cms/image_translation.rb +22 -0
- data/app/models/cms/page.rb +228 -0
- data/app/models/cms/page_section.rb +43 -0
- data/app/models/cms/page_translation.rb +22 -0
- data/app/models/cms/section/block_base.rb +32 -0
- data/app/models/cms/section/blocks/call_to_action_block.rb +16 -0
- data/app/models/cms/section/blocks/hero_block.rb +14 -0
- data/app/models/cms/section/blocks/image_block.rb +13 -0
- data/app/models/cms/section/blocks/rich_text_block.rb +12 -0
- data/app/models/cms/section/kind_registry.rb +66 -0
- data/app/models/cms/section.rb +94 -0
- data/app/models/cms/section_image.rb +10 -0
- data/app/models/cms/section_translation.rb +25 -0
- data/app/models/cms/site.rb +87 -0
- data/app/models/cms/webhook.rb +41 -0
- data/app/models/cms/webhook_delivery.rb +12 -0
- data/app/serializers/cms/api/base_serializer.rb +51 -0
- data/app/serializers/cms/api/page_serializer.rb +145 -0
- data/app/serializers/cms/api/site_serializer.rb +45 -0
- data/app/services/cms/locale_resolver.rb +30 -0
- data/app/services/cms/page_resolver.rb +73 -0
- data/app/services/cms/public_page_context.rb +49 -0
- data/app/views/cms/admin/api_keys/_form.html.erb +23 -0
- data/app/views/cms/admin/api_keys/create.html.erb +9 -0
- data/app/views/cms/admin/api_keys/edit.html.erb +5 -0
- data/app/views/cms/admin/api_keys/index.html.erb +36 -0
- data/app/views/cms/admin/api_keys/new.html.erb +5 -0
- data/app/views/cms/admin/documents/_form.html.erb +24 -0
- data/app/views/cms/admin/documents/edit.html.erb +2 -0
- data/app/views/cms/admin/documents/index.html.erb +37 -0
- data/app/views/cms/admin/documents/new.html.erb +2 -0
- data/app/views/cms/admin/form_fields/_form.html.erb +46 -0
- data/app/views/cms/admin/form_fields/edit.html.erb +2 -0
- data/app/views/cms/admin/form_fields/index.html.erb +41 -0
- data/app/views/cms/admin/form_fields/new.html.erb +2 -0
- data/app/views/cms/admin/form_submissions/index.html.erb +38 -0
- data/app/views/cms/admin/images/_form.html.erb +36 -0
- data/app/views/cms/admin/images/edit.html.erb +2 -0
- data/app/views/cms/admin/images/index.html.erb +25 -0
- data/app/views/cms/admin/images/new.html.erb +2 -0
- data/app/views/cms/admin/pages/_attach_section_panel.html.erb +20 -0
- data/app/views/cms/admin/pages/_form.html.erb +116 -0
- data/app/views/cms/admin/pages/_section_editor_frame.html.erb +3 -0
- data/app/views/cms/admin/pages/_sections_list.html.erb +9 -0
- data/app/views/cms/admin/pages/edit.html.erb +2 -0
- data/app/views/cms/admin/pages/index.html.erb +62 -0
- data/app/views/cms/admin/pages/new.html.erb +2 -0
- data/app/views/cms/admin/pages/show.html.erb +111 -0
- data/app/views/cms/admin/sections/_form.html.erb +128 -0
- data/app/views/cms/admin/sections/_section.html.erb +22 -0
- data/app/views/cms/admin/sections/edit.html.erb +9 -0
- data/app/views/cms/admin/sections/index.html.erb +47 -0
- data/app/views/cms/admin/sections/new.html.erb +9 -0
- data/app/views/cms/admin/sections/page_update.turbo_stream.erb +17 -0
- data/app/views/cms/admin/sections/show.html.erb +97 -0
- data/app/views/cms/admin/sites/_form.html.erb +44 -0
- data/app/views/cms/admin/sites/edit.html.erb +3 -0
- data/app/views/cms/admin/sites/new.html.erb +5 -0
- data/app/views/cms/admin/sites/show.html.erb +22 -0
- data/app/views/cms/admin/webhook_deliveries/index.html.erb +29 -0
- data/app/views/cms/admin/webhooks/_form.html.erb +38 -0
- data/app/views/cms/admin/webhooks/edit.html.erb +5 -0
- data/app/views/cms/admin/webhooks/index.html.erb +34 -0
- data/app/views/cms/admin/webhooks/new.html.erb +5 -0
- data/app/views/cms/form_submission_mailer/notify.html.erb +14 -0
- data/app/views/cms/form_submission_mailer/notify.text.erb +7 -0
- data/app/views/cms/public/pages/_content.html.erb +48 -0
- data/app/views/cms/public/pages/show.html.erb +44 -0
- data/app/views/cms/public/pages/templates/_custom.html.erb +3 -0
- data/app/views/cms/public/pages/templates/_form.html.erb +3 -0
- data/app/views/cms/public/pages/templates/_landing.html.erb +3 -0
- data/app/views/cms/public/pages/templates/_standard.html.erb +3 -0
- data/app/views/cms/sections/kinds/_cta.html.erb +13 -0
- data/app/views/cms/sections/kinds/_hero.html.erb +14 -0
- data/app/views/cms/sections/kinds/_image.html.erb +19 -0
- data/app/views/cms/sections/kinds/_rich_text.html.erb +6 -0
- data/app/views/layouts/cms/application.html.erb +13 -0
- data/app/views/layouts/cms/public.html.erb +14 -0
- data/bin/rails +19 -0
- data/bin/rubocop +9 -0
- data/cms.gemspec +29 -0
- data/config/importmap.rb +4 -0
- data/config/locales/activerecord.cms.en.yml +65 -0
- data/config/locales/en.yml +390 -0
- data/config/routes.rb +56 -0
- data/lib/cms/engine.rb +45 -0
- data/lib/cms/version.rb +5 -0
- data/lib/cms.rb +75 -0
- data/lib/cms42.rb +3 -0
- data/lib/generators/cms/install/install_generator.rb +26 -0
- data/lib/generators/cms/install/templates/create_cms_tables.rb +194 -0
- data/lib/generators/cms/install/templates/initializer.rb +21 -0
- data/lib/generators/cms/views/views_generator.rb +79 -0
- data/lib/tasks/cms_tasks.rake +6 -0
- data/lib/tasks/version.rake +8 -0
- metadata +281 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<h1><%= t(".title") %></h1>
|
|
2
|
+
|
|
3
|
+
<p><%= link_to t(".new"), new_admin_api_key_path %></p>
|
|
4
|
+
|
|
5
|
+
<% if @api_keys.any? %>
|
|
6
|
+
<table>
|
|
7
|
+
<thead>
|
|
8
|
+
<tr>
|
|
9
|
+
<th><%= t(".name") %></th>
|
|
10
|
+
<th><%= t(".active") %></th>
|
|
11
|
+
<th><%= t(".last_used") %></th>
|
|
12
|
+
<th><%= t(".created") %></th>
|
|
13
|
+
<th></th>
|
|
14
|
+
</tr>
|
|
15
|
+
</thead>
|
|
16
|
+
<tbody>
|
|
17
|
+
<% @api_keys.each do |key| %>
|
|
18
|
+
<tr>
|
|
19
|
+
<td><%= key.name %></td>
|
|
20
|
+
<td><%= cms_yes_no(key.active?) %></td>
|
|
21
|
+
<td><%= key.last_used_at ? cms_datetime(key.last_used_at) : t(".never") %></td>
|
|
22
|
+
<td><%= cms_date(key.created_at) %></td>
|
|
23
|
+
<td>
|
|
24
|
+
<%= link_to t(".edit"), edit_admin_api_key_path(key) %>
|
|
25
|
+
|
|
|
26
|
+
<%= link_to t(".delete"),
|
|
27
|
+
admin_api_key_path(key),
|
|
28
|
+
data: { turbo_method: :delete, turbo_confirm: t(".delete_confirm") } %>
|
|
29
|
+
</td>
|
|
30
|
+
</tr>
|
|
31
|
+
<% end %>
|
|
32
|
+
</tbody>
|
|
33
|
+
</table>
|
|
34
|
+
<% else %>
|
|
35
|
+
<p><%= t(".empty") %></p>
|
|
36
|
+
<% end %>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%= form_with model: [:admin, document], local: true do |f| %>
|
|
2
|
+
<p>
|
|
3
|
+
<%= f.label :title %><br>
|
|
4
|
+
<%= f.text_field :title %>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p>
|
|
8
|
+
<%= f.label :file, t(".file") %><br>
|
|
9
|
+
<%= f.file_field :file, accept: ".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.csv,.zip" %>
|
|
10
|
+
<% if document.file.attached? %>
|
|
11
|
+
<br><%= t(".current") %>: <%= link_to document.file.filename.to_s, url_for(document.file) %>
|
|
12
|
+
<% end %>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p>
|
|
16
|
+
<%= f.label :description %><br>
|
|
17
|
+
<%= f.text_area :description, rows: 3 %>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p>
|
|
21
|
+
<%= f.submit %>
|
|
22
|
+
<%= link_to t(".cancel"), admin_documents_path %>
|
|
23
|
+
</p>
|
|
24
|
+
<% end %>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<h1><%= t(".title") %></h1>
|
|
2
|
+
|
|
3
|
+
<p><%= link_to t(".upload"), new_admin_document_path %></p>
|
|
4
|
+
|
|
5
|
+
<% if @documents.empty? %>
|
|
6
|
+
<p><%= t(".empty") %></p>
|
|
7
|
+
<% else %>
|
|
8
|
+
<table>
|
|
9
|
+
<thead>
|
|
10
|
+
<tr>
|
|
11
|
+
<th><%= t(".title_heading") %></th>
|
|
12
|
+
<th><%= t(".file") %></th>
|
|
13
|
+
<th><%= t(".description") %></th>
|
|
14
|
+
<th><%= t(".actions") %></th>
|
|
15
|
+
</tr>
|
|
16
|
+
</thead>
|
|
17
|
+
<tbody>
|
|
18
|
+
<% @documents.each do |doc| %>
|
|
19
|
+
<tr>
|
|
20
|
+
<td><%= doc.title %></td>
|
|
21
|
+
<td>
|
|
22
|
+
<% if doc.file.attached? %>
|
|
23
|
+
<%= link_to doc.file.filename.to_s, url_for(doc.file) %>
|
|
24
|
+
<% end %>
|
|
25
|
+
</td>
|
|
26
|
+
<td><%= doc.description %></td>
|
|
27
|
+
<td>
|
|
28
|
+
<%= link_to t(".edit"), edit_admin_document_path(doc) %>
|
|
29
|
+
<%= link_to t(".delete"),
|
|
30
|
+
admin_document_path(doc),
|
|
31
|
+
data: { turbo_method: :delete, turbo_confirm: t(".delete_confirm") } %>
|
|
32
|
+
</td>
|
|
33
|
+
</tr>
|
|
34
|
+
<% end %>
|
|
35
|
+
</tbody>
|
|
36
|
+
</table>
|
|
37
|
+
<% end %>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<%= form_with model: [:admin, @page, field], local: true do |f| %>
|
|
2
|
+
<p>
|
|
3
|
+
<%= f.label :label %><br>
|
|
4
|
+
<%= f.text_field :label %>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p>
|
|
8
|
+
<%= f.label :field_name, t(".field_name") %><br>
|
|
9
|
+
<%= f.text_field :field_name %>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p>
|
|
13
|
+
<%= f.label :kind %><br>
|
|
14
|
+
<%= f.select :kind, Cms::FormField::KINDS.map { |k| [cms_form_field_kind_label(k), k] } %>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p>
|
|
18
|
+
<%= f.label :placeholder %><br>
|
|
19
|
+
<%= f.text_field :placeholder %>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p>
|
|
23
|
+
<%= f.label :hint, t(".hint") %><br>
|
|
24
|
+
<%= f.text_field :hint %>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
<p>
|
|
28
|
+
<%= f.label :required %>
|
|
29
|
+
<%= f.check_box :required %>
|
|
30
|
+
</p>
|
|
31
|
+
|
|
32
|
+
<p>
|
|
33
|
+
<%= f.label :options, t(".options") %><br>
|
|
34
|
+
<%= f.text_area :options, value: Array(field.options).join("\n"), rows: 5 %>
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
<p>
|
|
38
|
+
<%= f.label :position %><br>
|
|
39
|
+
<%= f.number_field :position %>
|
|
40
|
+
</p>
|
|
41
|
+
|
|
42
|
+
<p>
|
|
43
|
+
<%= f.submit %>
|
|
44
|
+
<%= link_to t(".cancel"), admin_page_form_fields_path(@page) %>
|
|
45
|
+
</p>
|
|
46
|
+
<% end %>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<h1><%= t(".title", page: @page.display_title) %></h1>
|
|
2
|
+
|
|
3
|
+
<p>
|
|
4
|
+
<%= link_to t(".back"), admin_page_path(@page) %>
|
|
5
|
+
|
|
|
6
|
+
<%= link_to t(".submissions"), admin_page_form_submissions_path(@page) %>
|
|
7
|
+
|
|
|
8
|
+
<%= link_to t(".new"), new_admin_page_form_field_path(@page) %>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<% if @fields.empty? %>
|
|
12
|
+
<p><%= t(".empty") %></p>
|
|
13
|
+
<% else %>
|
|
14
|
+
<table>
|
|
15
|
+
<thead>
|
|
16
|
+
<tr>
|
|
17
|
+
<th><%= t(".label") %></th>
|
|
18
|
+
<th><%= t(".field_name") %></th>
|
|
19
|
+
<th><%= t(".kind") %></th>
|
|
20
|
+
<th><%= t(".required") %></th>
|
|
21
|
+
<th><%= t(".actions") %></th>
|
|
22
|
+
</tr>
|
|
23
|
+
</thead>
|
|
24
|
+
<tbody>
|
|
25
|
+
<% @fields.each do |field| %>
|
|
26
|
+
<tr>
|
|
27
|
+
<td><%= field.label %></td>
|
|
28
|
+
<td><code><%= field.field_name %></code></td>
|
|
29
|
+
<td><%= cms_form_field_kind_label(field.kind) %></td>
|
|
30
|
+
<td><%= cms_yes_no(field.required?) %></td>
|
|
31
|
+
<td>
|
|
32
|
+
<%= link_to t(".edit"), edit_admin_page_form_field_path(@page, field) %>
|
|
33
|
+
<%= link_to t(".delete"),
|
|
34
|
+
admin_page_form_field_path(@page, field),
|
|
35
|
+
data: { turbo_method: :delete, turbo_confirm: t(".delete_confirm") } %>
|
|
36
|
+
</td>
|
|
37
|
+
</tr>
|
|
38
|
+
<% end %>
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
<% end %>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<h1><%= t(".title", page: @page.display_title) %></h1>
|
|
2
|
+
|
|
3
|
+
<p>
|
|
4
|
+
<%= link_to t(".back"), admin_page_form_fields_path(@page) %>
|
|
5
|
+
|
|
|
6
|
+
<%= link_to t(".export"), admin_page_form_submissions_path(@page, format: :csv) %>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<% if @submissions.empty? %>
|
|
10
|
+
<p><%= t(".empty") %></p>
|
|
11
|
+
<% else %>
|
|
12
|
+
<table>
|
|
13
|
+
<thead>
|
|
14
|
+
<tr>
|
|
15
|
+
<th><%= t(".submitted_at") %></th>
|
|
16
|
+
<% @fields.each do |field| %>
|
|
17
|
+
<th><%= field.label %></th>
|
|
18
|
+
<% end %>
|
|
19
|
+
<th><%= t(".actions") %></th>
|
|
20
|
+
</tr>
|
|
21
|
+
</thead>
|
|
22
|
+
<tbody>
|
|
23
|
+
<% @submissions.each do |sub| %>
|
|
24
|
+
<tr>
|
|
25
|
+
<td><%= cms_datetime(sub.created_at) %></td>
|
|
26
|
+
<% @fields.each do |field| %>
|
|
27
|
+
<td><%= sub.data[field.field_name] %></td>
|
|
28
|
+
<% end %>
|
|
29
|
+
<td>
|
|
30
|
+
<%= link_to t(".delete"),
|
|
31
|
+
admin_page_form_submission_path(@page, sub),
|
|
32
|
+
data: { turbo_method: :delete, turbo_confirm: t(".delete_confirm") } %>
|
|
33
|
+
</td>
|
|
34
|
+
</tr>
|
|
35
|
+
<% end %>
|
|
36
|
+
</tbody>
|
|
37
|
+
</table>
|
|
38
|
+
<% end %>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<%= form_with model: [:admin, image], local: true do |f| %>
|
|
2
|
+
<% translation = image.image_translations.find { |record| record.locale == @translation_locale } || image.image_translations.build(locale: @translation_locale) %>
|
|
3
|
+
<p>
|
|
4
|
+
<%= f.label :file, t(".file") %><br>
|
|
5
|
+
<%= f.file_field :file, accept: "image/*" %>
|
|
6
|
+
<% if image.file.attached? %>
|
|
7
|
+
<br>
|
|
8
|
+
<%= image_tag image.file, alt: image.display_title, style: "max-width: 280px; height: auto;" %>
|
|
9
|
+
<% end %>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p>
|
|
13
|
+
<%= f.label :title %><br>
|
|
14
|
+
<%= f.text_field :title %>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<%= f.fields_for :image_translations, translation do |tf| %>
|
|
18
|
+
<%= tf.hidden_field :id if tf.object.persisted? %>
|
|
19
|
+
<%= tf.hidden_field :locale, value: @translation_locale %>
|
|
20
|
+
|
|
21
|
+
<p>
|
|
22
|
+
<%= tf.label :alt_text, t(".alt_text") %><br>
|
|
23
|
+
<%= tf.text_field :alt_text %>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
<p>
|
|
27
|
+
<%= tf.label :caption %><br>
|
|
28
|
+
<%= tf.text_field :caption %>
|
|
29
|
+
</p>
|
|
30
|
+
<% end %>
|
|
31
|
+
|
|
32
|
+
<p>
|
|
33
|
+
<%= f.submit %>
|
|
34
|
+
<%= link_to t(".cancel"), admin_images_path %>
|
|
35
|
+
</p>
|
|
36
|
+
<% end %>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<h1><%= t(".title") %></h1>
|
|
2
|
+
|
|
3
|
+
<p><%= link_to t(".upload"), new_admin_image_path %></p>
|
|
4
|
+
|
|
5
|
+
<% if @images.empty? %>
|
|
6
|
+
<p><%= t(".empty") %></p>
|
|
7
|
+
<% else %>
|
|
8
|
+
<div class="cms-image-grid">
|
|
9
|
+
<% @images.each do |image| %>
|
|
10
|
+
<div class="cms-image-card">
|
|
11
|
+
<% if image.file.attached? %>
|
|
12
|
+
<%= image_tag image.file, alt: image.alt_text.presence || image.display_title,
|
|
13
|
+
style: "max-width: 180px; height: 120px; object-fit: cover;" %>
|
|
14
|
+
<% end %>
|
|
15
|
+
<p><strong><%= image.display_title %></strong></p>
|
|
16
|
+
<p>
|
|
17
|
+
<%= link_to t(".edit"), edit_admin_image_path(image) %>
|
|
18
|
+
<%= link_to t(".delete"),
|
|
19
|
+
admin_image_path(image),
|
|
20
|
+
data: { turbo_method: :delete, turbo_confirm: t(".delete_confirm") } %>
|
|
21
|
+
</p>
|
|
22
|
+
</div>
|
|
23
|
+
<% end %>
|
|
24
|
+
</div>
|
|
25
|
+
<% end %>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<div id="cms-attach-section-panel">
|
|
2
|
+
<% if available_sections.any? %>
|
|
3
|
+
<hr>
|
|
4
|
+
|
|
5
|
+
<%= form_with url: admin_page_attach_section_path(page), method: :post, local: true do |f| %>
|
|
6
|
+
<p>
|
|
7
|
+
<%= f.label :section_id, t("cms.admin.pages.show.attach_existing") %><br>
|
|
8
|
+
<%= f.select :section_id,
|
|
9
|
+
available_sections.map do |section|
|
|
10
|
+
["#{cms_section_kind_label(section.kind)}: #{section.title.presence || t("cms.admin.pages.show.no_title")}", section.id]
|
|
11
|
+
end,
|
|
12
|
+
include_blank: t("cms.admin.pages.show.select_global") %>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p>
|
|
16
|
+
<%= f.submit t("cms.admin.pages.show.attach"), class: "cms-btn cms-btn--sm" %>
|
|
17
|
+
</p>
|
|
18
|
+
<% end %>
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<%= form_with model: [:admin, page] do |f| %>
|
|
2
|
+
<p>
|
|
3
|
+
<%= f.label :parent_id, t(".parent_page") %><br>
|
|
4
|
+
<%= f.select :parent_id, @parent_options, { include_blank: t(".no_parent") } %>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p>
|
|
8
|
+
<%= f.label :slug %><br>
|
|
9
|
+
<%= f.text_field :slug %>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p>
|
|
13
|
+
<%= f.label :template_key, t(".template") %><br>
|
|
14
|
+
<%= f.select :template_key, Cms::Page.template_keys.map { |key| [cms_page_template_label(key), key] } %>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p>
|
|
18
|
+
<%= f.label :status %><br>
|
|
19
|
+
<%= f.select :status, Cms::Page.statuses.keys.map { |key| [cms_page_status_label(key), key] } %>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p>
|
|
23
|
+
<%= f.label :position %><br>
|
|
24
|
+
<%= f.number_field :position %>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
<p>
|
|
28
|
+
<%= f.label :home %>
|
|
29
|
+
<%= f.check_box :home %>
|
|
30
|
+
</p>
|
|
31
|
+
|
|
32
|
+
<p>
|
|
33
|
+
<%= f.label :show_in_header %>
|
|
34
|
+
<%= f.check_box :show_in_header %>
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
<p>
|
|
38
|
+
<%= f.label :show_in_footer %>
|
|
39
|
+
<%= f.check_box :show_in_footer %>
|
|
40
|
+
</p>
|
|
41
|
+
|
|
42
|
+
<p>
|
|
43
|
+
<%= f.label :nav_group %><br>
|
|
44
|
+
<%= f.text_field :nav_group %>
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
<p>
|
|
48
|
+
<%= f.label :nav_order %><br>
|
|
49
|
+
<%= f.number_field :nav_order %>
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
<p>
|
|
53
|
+
<%= f.label :footer_order %><br>
|
|
54
|
+
<%= f.number_field :footer_order %>
|
|
55
|
+
</p>
|
|
56
|
+
|
|
57
|
+
<hr>
|
|
58
|
+
|
|
59
|
+
<%= f.fields_for :page_translations do |t| %>
|
|
60
|
+
<h3><%= I18n.t("cms.admin.pages.form.translation", locale: t.object.locale) %></h3>
|
|
61
|
+
|
|
62
|
+
<%= t.hidden_field :locale %>
|
|
63
|
+
|
|
64
|
+
<p>
|
|
65
|
+
<%= t.label :title, I18n.t("cms.admin.pages.form.translation_title") %><br>
|
|
66
|
+
<%= t.text_field :title %>
|
|
67
|
+
</p>
|
|
68
|
+
|
|
69
|
+
<p>
|
|
70
|
+
<%= t.label :seo_title, I18n.t("cms.admin.pages.form.seo_title") %><br>
|
|
71
|
+
<%= t.text_field :seo_title %>
|
|
72
|
+
</p>
|
|
73
|
+
|
|
74
|
+
<p>
|
|
75
|
+
<%= t.label :seo_description, I18n.t("cms.admin.pages.form.seo_description") %><br>
|
|
76
|
+
<%= t.text_area :seo_description, rows: 3 %>
|
|
77
|
+
</p>
|
|
78
|
+
<% end %>
|
|
79
|
+
|
|
80
|
+
<p>
|
|
81
|
+
<%= f.label :hero_image %><br>
|
|
82
|
+
<%= f.file_field :hero_image, accept: "image/*" %>
|
|
83
|
+
<% if page.hero_image.attached? %>
|
|
84
|
+
<br>
|
|
85
|
+
<%= image_tag cms_attachment_path(page.hero_image), alt: page.display_title, style: "max-width: 280px; height: auto;" %>
|
|
86
|
+
<br>
|
|
87
|
+
<label>
|
|
88
|
+
<%= check_box_tag "page[remove_hero_image]", "1" %>
|
|
89
|
+
<%= t(".remove_hero_image") %>
|
|
90
|
+
</label>
|
|
91
|
+
<% end %>
|
|
92
|
+
</p>
|
|
93
|
+
|
|
94
|
+
<p>
|
|
95
|
+
<%= f.label :media_files, t(".media_files") %><br>
|
|
96
|
+
<%= f.file_field :media_files, multiple: true, accept: "image/*,.pdf,.doc,.docx" %>
|
|
97
|
+
<% if page.media_files.attached? %>
|
|
98
|
+
<br>
|
|
99
|
+
<%= t(".current_files") %>:
|
|
100
|
+
<ul>
|
|
101
|
+
<% page.media_files.each do |file| %>
|
|
102
|
+
<li><%= file.filename.to_s %></li>
|
|
103
|
+
<% end %>
|
|
104
|
+
</ul>
|
|
105
|
+
<label>
|
|
106
|
+
<%= check_box_tag "page[remove_media_files]", "1" %>
|
|
107
|
+
<%= t(".remove_media_files") %>
|
|
108
|
+
</label>
|
|
109
|
+
<% end %>
|
|
110
|
+
</p>
|
|
111
|
+
|
|
112
|
+
<p>
|
|
113
|
+
<%= f.submit %>
|
|
114
|
+
<%= link_to t(".cancel"), admin_pages_path(locale: @translation_locale) %>
|
|
115
|
+
</p>
|
|
116
|
+
<% end %>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<%= turbo_frame_tag "cms-sections-list" do %>
|
|
2
|
+
<div data-controller="sortable"
|
|
3
|
+
data-sortable-url-value="<%= admin_page_sort_sections_path(page) %>"
|
|
4
|
+
data-sortable-handle-value=".cms-section-item__handle">
|
|
5
|
+
<% page_sections.each do |page_section| %>
|
|
6
|
+
<%= render "cms/admin/sections/section", page_section: page_section %>
|
|
7
|
+
<% end %>
|
|
8
|
+
</div>
|
|
9
|
+
<% end %>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<h1><%= t(".title") %></h1>
|
|
2
|
+
|
|
3
|
+
<p>
|
|
4
|
+
<%= link_to t(".site_settings"), admin_site_path %>
|
|
5
|
+
|
|
|
6
|
+
<%= link_to t(".new"), new_admin_page_path(locale: params[:locale]) %>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<%= form_with url: admin_pages_path, method: :get, local: true do |f| %>
|
|
10
|
+
<p>
|
|
11
|
+
<%= f.text_field :q, value: params[:q], placeholder: t(".search_placeholder") %>
|
|
12
|
+
<%= f.submit t(".search") %>
|
|
13
|
+
<% if params[:q].present? %>
|
|
14
|
+
<%= link_to t(".clear"), admin_pages_path %>
|
|
15
|
+
<% end %>
|
|
16
|
+
</p>
|
|
17
|
+
<% end %>
|
|
18
|
+
|
|
19
|
+
<p><%= t(".intro") %></p>
|
|
20
|
+
|
|
21
|
+
<% if @page_rows.empty? %>
|
|
22
|
+
<p>
|
|
23
|
+
<%= params[:q].present? ? t(".empty_search") : t(".empty") %>
|
|
24
|
+
</p>
|
|
25
|
+
<% else %>
|
|
26
|
+
<table>
|
|
27
|
+
<thead>
|
|
28
|
+
<tr>
|
|
29
|
+
<th><%= t(".title_heading") %></th>
|
|
30
|
+
<th><%= t(".slug") %></th>
|
|
31
|
+
<th><%= t(".template") %></th>
|
|
32
|
+
<th><%= t(".status") %></th>
|
|
33
|
+
<th><%= t(".nav") %></th>
|
|
34
|
+
<th><%= t(".actions") %></th>
|
|
35
|
+
</tr>
|
|
36
|
+
</thead>
|
|
37
|
+
<tbody>
|
|
38
|
+
<% @page_rows.each do |page, depth| %>
|
|
39
|
+
<tr>
|
|
40
|
+
<td style="padding-left: <%= depth * 1.5 %>rem;"><%= page.display_title %></td>
|
|
41
|
+
<td><%= page.slug %></td>
|
|
42
|
+
<td><%= cms_page_template_label(page.template_key) %></td>
|
|
43
|
+
<td><%= cms_page_status_label(page.status) %></td>
|
|
44
|
+
<td>
|
|
45
|
+
<% nav_items = [] %>
|
|
46
|
+
<% nav_items << t(".header") if page.show_in_header? %>
|
|
47
|
+
<% nav_items << t(".footer") if page.show_in_footer? %>
|
|
48
|
+
<%= nav_items.join(" / ") %>
|
|
49
|
+
<%= " (#{page.nav_group})" unless page.nav_group == "main" %>
|
|
50
|
+
</td>
|
|
51
|
+
<td>
|
|
52
|
+
<%= link_to t(".view"), admin_page_path(page, locale: params[:locale]) %>
|
|
53
|
+
<%= link_to t(".edit"), edit_admin_page_path(page, locale: params[:locale]) %>
|
|
54
|
+
<%= link_to t(".delete"),
|
|
55
|
+
admin_page_path(page, locale: params[:locale]),
|
|
56
|
+
data: { turbo_method: :delete, turbo_confirm: t(".delete_confirm") } %>
|
|
57
|
+
</td>
|
|
58
|
+
</tr>
|
|
59
|
+
<% end %>
|
|
60
|
+
</tbody>
|
|
61
|
+
</table>
|
|
62
|
+
<% end %>
|