maglevcms 3.0.0.beta3 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -53
  3. data/Rakefile +3 -1
  4. data/app/assets/builds/maglev/tailwind.css +424 -84
  5. data/app/assets/config/maglev_manifest.js +3 -2
  6. data/app/assets/javascripts/maglev/client/dom-operations.js +5 -5
  7. data/app/assets/javascripts/maglev/client/iframe-decorator.js +24 -0
  8. data/app/assets/javascripts/maglev/client/incoming-messages.js +13 -3
  9. data/app/assets/javascripts/maglev/client/index.js +3 -2
  10. data/app/assets/javascripts/maglev/client/utils.js +22 -0
  11. data/app/assets/javascripts/maglev/editor/controllers/app/forms/section_form_controller.js +4 -3
  12. data/app/assets/javascripts/maglev/editor/controllers/app/forms/style_form_controller.js +2 -1
  13. data/app/assets/javascripts/maglev/editor/controllers/app/page_preview_controller.js +96 -5
  14. data/app/assets/javascripts/maglev/editor/controllers/app/preview_notification_center_controller.js +105 -23
  15. data/app/assets/javascripts/maglev/editor/controllers/app/setting_controller.js +3 -2
  16. data/app/assets/javascripts/maglev/editor/controllers/shared/copy_to_clipboard_controller.js +2 -1
  17. data/app/assets/javascripts/maglev/editor/controllers/utils.js +22 -0
  18. data/app/assets/javascripts/maglev/editor/index.js +2 -1
  19. data/app/assets/javascripts/maglev/editor/patches/turbo_stream_patch.js +3 -3
  20. data/app/assets/stylesheets/maglev/tailwind.css.erb +8 -1
  21. data/app/components/maglev/content/link.rb +1 -1
  22. data/app/components/maglev/editor/settings/link/link_component.rb +7 -1
  23. data/app/components/maglev/section_component.rb +11 -1
  24. data/app/components/maglev/uikit/app_layout/sidebar/link_component.html.erb +1 -1
  25. data/app/components/maglev/uikit/app_layout/sidebar/link_component.rb +35 -5
  26. data/app/components/maglev/uikit/app_layout/sidebar_component.html.erb +3 -4
  27. data/app/components/maglev/uikit/app_layout/topbar_component.html.erb +1 -1
  28. data/app/components/maglev/uikit/app_layout/topbar_component.rb +1 -1
  29. data/app/components/maglev/uikit/button_group_component/button_group_component.html.erb +5 -0
  30. data/app/components/maglev/uikit/button_group_component.rb +70 -0
  31. data/app/components/maglev/uikit/device_toggler_component.rb +10 -1
  32. data/app/components/maglev/uikit/dropdown_component/dropdown_component.html.erb +2 -2
  33. data/app/components/maglev/uikit/dropdown_component.rb +6 -1
  34. data/app/components/maglev/uikit/form/color_field_component.html.erb +1 -1
  35. data/app/components/maglev/uikit/form/combobox_component.html.erb +1 -0
  36. data/app/components/maglev/uikit/form/link_component.rb +5 -1
  37. data/app/components/maglev/uikit/form/richtext_controller.js +5 -4
  38. data/app/components/maglev/uikit/form/search_form_component.html.erb +1 -0
  39. data/app/components/maglev/uikit/icon_component.rb +3 -0
  40. data/app/components/maglev/uikit/image_library/uploader_controller.js +3 -2
  41. data/app/components/maglev/uikit/list/list_item_component.html.erb +36 -19
  42. data/app/components/maglev/uikit/list/list_item_component.rb +19 -5
  43. data/app/components/maglev/uikit/locale_switcher_component/locale_switcher_component.html.erb +6 -10
  44. data/app/components/maglev/uikit/menu_dropdown_component/menu_dropdown_component.html.erb +6 -2
  45. data/app/components/maglev/uikit/menu_dropdown_component.rb +244 -7
  46. data/app/components/maglev/uikit/page_actions_dropdown_component/page_actions_dropdown_component.html.erb +39 -46
  47. data/app/components/maglev/uikit/pagination_component/pagination_component.html.erb +9 -12
  48. data/app/components/maglev/uikit/pagination_component.rb +6 -1
  49. data/app/components/maglev/uikit/section_toolbar/bottom_component.html.erb +1 -1
  50. data/app/components/maglev/uikit/tabs_component/tabs_component.html.erb +7 -4
  51. data/app/components/maglev/uikit/tabs_component.rb +23 -4
  52. data/app/components/maglev/uikit/well/simple_well_component.html.erb +15 -0
  53. data/app/components/maglev/uikit/well/simple_well_component.rb +13 -0
  54. data/app/controllers/concerns/maglev/editor/preview_urls_concern.rb +32 -0
  55. data/app/controllers/concerns/maglev/editor/turbo_concern.rb +29 -0
  56. data/app/controllers/concerns/maglev/flash_i18n_concern.rb +1 -0
  57. data/app/controllers/maglev/application_controller.rb +1 -1
  58. data/app/controllers/maglev/assets/active_storage_proxy_controller.rb +2 -1
  59. data/app/controllers/maglev/editor/assets_controller.rb +1 -1
  60. data/app/controllers/maglev/editor/base_controller.rb +6 -32
  61. data/app/controllers/maglev/editor/pages/clone_controller.rb +22 -0
  62. data/app/controllers/maglev/editor/pages/discard_draft_controller.rb +17 -0
  63. data/app/controllers/maglev/editor/pages_controller.rb +26 -7
  64. data/app/controllers/maglev/editor/section_blocks_controller.rb +13 -9
  65. data/app/controllers/maglev/editor/sections_controller.rb +26 -7
  66. data/app/controllers/maglev/published_page_preview_controller.rb +4 -0
  67. data/app/helpers/maglev/application_helper.rb +6 -6
  68. data/app/helpers/maglev/editor/section_blocks_helper.rb +2 -2
  69. data/app/models/maglev/page/publishable_concern.rb +69 -0
  70. data/app/models/maglev/page.rb +2 -13
  71. data/app/models/maglev/section/block.rb +4 -0
  72. data/app/models/maglev/section/content_concern.rb +3 -1
  73. data/app/models/maglev/section.rb +21 -1
  74. data/app/models/maglev/sections_content_store.rb +1 -3
  75. data/app/services/concerns/maglev/content/helpers_concern.rb +5 -8
  76. data/app/services/maglev/app_container.rb +4 -2
  77. data/app/services/maglev/discard_page_draft_service.rb +45 -0
  78. data/app/services/maglev/fetch_section_screenshot_url.rb +12 -1
  79. data/app/services/maglev/has_unpublished_changes.rb +21 -0
  80. data/app/services/maglev/publish_service.rb +15 -2
  81. data/app/views/layouts/maglev/editor/_sidebar.html.erb +6 -1
  82. data/app/views/layouts/maglev/editor/application.html.erb +5 -0
  83. data/app/views/layouts/maglev/editor/topbar/_page_info.html.erb +1 -1
  84. data/app/views/layouts/maglev/editor/topbar/_publish_button.html.erb +32 -10
  85. data/app/views/maglev/editor/assets/_list.html.erb +2 -1
  86. data/app/views/maglev/editor/assets/index.html.erb +1 -0
  87. data/app/views/maglev/editor/home/index.html.erb +1 -1
  88. data/app/views/maglev/editor/links/edit/_email.html.erb +1 -1
  89. data/app/views/maglev/editor/links/edit/_url.html.erb +1 -1
  90. data/app/views/maglev/editor/pages/_list.html.erb +25 -21
  91. data/app/views/maglev/editor/pages/_preview.html.erb +6 -6
  92. data/app/views/maglev/editor/pages/_preview_empty_message.html.erb +13 -10
  93. data/app/views/maglev/editor/pages/discard_draft/create.turbo_stream.erb +16 -0
  94. data/app/views/maglev/editor/pages/index.html.erb +8 -1
  95. data/app/views/maglev/editor/section_blocks/_form.html.erb +5 -13
  96. data/app/views/maglev/editor/section_blocks/_form_with_tabs.html.erb +15 -0
  97. data/app/views/maglev/editor/section_blocks/_new.html.erb +1 -1
  98. data/app/views/maglev/editor/section_blocks/edit.html.erb +2 -2
  99. data/app/views/maglev/editor/section_blocks/index/_list.html.erb +2 -2
  100. data/app/views/maglev/editor/section_blocks/index/_tree.html.erb +1 -1
  101. data/app/views/maglev/editor/section_blocks/update.turbo_stream.erb +1 -1
  102. data/app/views/maglev/editor/sections/_form.html.erb +6 -20
  103. data/app/views/maglev/editor/sections/_form_with_tabs.html.erb +21 -0
  104. data/app/views/maglev/editor/sections/_list.html.erb +3 -3
  105. data/app/views/maglev/editor/sections/edit.html.erb +4 -4
  106. data/app/views/maglev/editor/sections/index.html.erb +1 -1
  107. data/app/views/maglev/editor/sections/new.html.erb +19 -2
  108. data/app/views/maglev/editor/sections/theme/_empty_list.html.erb +3 -0
  109. data/app/views/maglev/editor/sections/theme/_list.html.erb +35 -0
  110. data/app/views/maglev/editor/sections/theme/_screenshot_placeholder.html.erb +6 -0
  111. data/app/views/maglev/editor/sections/theme/_search.html.erb +22 -0
  112. data/app/views/maglev/editor/sections/update.turbo_stream.erb +1 -1
  113. data/app/views/maglev/editor/shared/_button_label.html.erb +4 -4
  114. data/app/views/maglev/editor/style/edit.html.erb +1 -0
  115. data/config/editor_importmap.rb +13 -13
  116. data/config/locales/editor.ar.yml +12 -4
  117. data/config/locales/editor.en.yml +31 -23
  118. data/config/locales/editor.es.yml +12 -4
  119. data/config/locales/editor.fr.yml +12 -4
  120. data/config/locales/editor.pt-BR.yml +12 -4
  121. data/config/routes/maglev/assets.rb +4 -0
  122. data/config/routes/maglev/editor.rb +38 -0
  123. data/config/routes/maglev/preview.rb +8 -0
  124. data/config/routes/maglev/public_preview.rb +6 -0
  125. data/config/routes.rb +8 -47
  126. data/db/migrate/20211013210954_translate_section_content.rb +1 -0
  127. data/db/migrate/20260114112058_add_published_payload_to_pages.rb +14 -0
  128. data/exe/tailwind-cli +1 -1
  129. data/lib/generators/maglev/install_generator.rb +9 -7
  130. data/lib/generators/maglev/templates/install/config/initializers/maglev.rb +10 -3
  131. data/lib/maglev/active_storage/serving_blob.rb +29 -0
  132. data/lib/maglev/active_storage.rb +2 -0
  133. data/lib/maglev/config.rb +22 -3
  134. data/lib/maglev/engine.rb +14 -10
  135. data/lib/maglev/version.rb +1 -1
  136. data/lib/maglev.rb +18 -3
  137. data/lib/tasks/db_test_all.rake +290 -0
  138. metadata +46 -19
  139. data/app/controllers/maglev/editor/page_clone_controller.rb +0 -20
  140. data/app/views/maglev/editor/sections/_theme_list.html.erb +0 -32
  141. /data/vendor/javascript/{@floating-ui--core.js → maglev/@floating-ui--core.js} +0 -0
  142. /data/vendor/javascript/{@floating-ui--dom.js → maglev/@floating-ui--dom.js} +0 -0
  143. /data/vendor/javascript/{@floating-ui--utils--dom.js → maglev/@floating-ui--utils--dom.js} +0 -0
  144. /data/vendor/javascript/{@floating-ui--utils.js → maglev/@floating-ui--utils.js} +0 -0
  145. /data/vendor/javascript/{@hotwired--stimulus.js → maglev/@hotwired--stimulus.js} +0 -0
  146. /data/vendor/javascript/{@hotwired--turbo-rails.js → maglev/@hotwired--turbo-rails.js} +0 -0
  147. /data/vendor/javascript/{@hotwired--turbo.js → maglev/@hotwired--turbo.js} +0 -0
  148. /data/vendor/javascript/{@rails--actioncable--src.js → maglev/@rails--actioncable--src.js} +0 -0
  149. /data/vendor/javascript/{@rails--request.js.js → maglev/@rails--request.js.js} +0 -0
  150. /data/vendor/javascript/{@shopify--draggable.js → maglev/@shopify--draggable.js} +0 -0
  151. /data/vendor/javascript/{el-transition.js → maglev/el-transition.js} +0 -0
  152. /data/vendor/javascript/{stimulus-use.js → maglev/stimulus-use.js} +0 -0
  153. /data/vendor/javascript/{tiptap.bundle.js → maglev/tiptap.bundle.js} +0 -0
@@ -2,12 +2,12 @@
2
2
  <% page_layout.with_title_content @section.type_name %>
3
3
  <% page_layout.with_notification_content maglev_flash_message %>
4
4
 
5
- <% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.breadcrumbs.sections')) %>
5
+ <% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.breadcrumb')) %>
6
6
 
7
7
  <%= form_with url: editor_section_path(@section, maglev_editing_route_context), method: :put, data: {
8
8
  controller: 'editor-section-form',
9
9
  'editor-section-form-section-id-value': @section.id,
10
- 'editor-section-form-section-lock-version-value': @section.lock_version,
10
+ 'editor-section-form-section-lock-version-value': source_lock_version,
11
11
  action: %(
12
12
  editor-setting:change->editor-section-form#onSettingChange
13
13
  editor-section-form:connected@window->editor-preview-notification-center#checkSectionLockVersion
@@ -18,7 +18,7 @@
18
18
  dispatcher:section-#{@section.id}:persisted@window->editor-section-form#onPersist
19
19
  )
20
20
  } do
21
- %>
22
- <%= render 'maglev/editor/sections/form' %>
21
+ %>
22
+ <%= render 'maglev/editor/sections/form_with_tabs' %>
23
23
  <% end %>
24
24
  <% end %>
@@ -6,6 +6,6 @@
6
6
  <%= render 'list' %>
7
7
 
8
8
  <% page_layout.with_footer do %>
9
- <%= link_to t('maglev.editor.sections.index.add_button'), new_editor_section_path(maglev_editing_route_context), class: maglev_button_classes(size: :big), data: { turbo_frame: '_top' } %>
9
+ <%= link_to t('maglev.editor.sections.index.add_button'), new_editor_section_path(maglev_editing_route_context), class: maglev_button_classes(size: :big), data: { turbo_frame: 'modal' } %>
10
10
  <% end %>
11
11
  <% end %>
@@ -1,8 +1,25 @@
1
+ <%= turbo_frame_tag 'modal' do %>
2
+ <%= render Maglev::Uikit::ModalComponent.new(id: 'new-section-modal', open: true) do |modal| %>
3
+ <% modal.with_title_content t('maglev.editor.sections.new.title') %>
4
+ <% modal.with_notification_content maglev_flash_message %>
5
+
6
+ <div class="flex h-[calc(100dvh-16rem)] min-h-0 w-[calc(100dvw-4rem)] flex-col gap-2 lg:w-3xl xl:w-5xl">
7
+ <%= render 'maglev/editor/sections/theme/search' %>
8
+
9
+ <% if @theme_sections.any? %>
10
+ <%= render 'maglev/editor/sections/theme/list' %>
11
+ <% else %>
12
+ <%= render 'maglev/editor/sections/theme/empty_list' %>
13
+ <% end %>
14
+ </div>
15
+ <% end %>
16
+ <% end %>
17
+
1
18
  <%= render Maglev::Uikit::PageLayoutComponent.new(expanded: true, back_path: editor_real_root_path(maglev_editing_route_context)) do |page_layout| %>
2
19
  <% page_layout.with_title_content t('maglev.editor.sections.new.title') %>
3
20
  <% page_layout.with_notification_content maglev_flash_message %>
4
21
 
5
- <% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.breadcrumbs.sections')) %>
22
+ <% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.breadcrumb')) %>
6
23
 
7
24
  <%= form_with url: editor_sections_path(maglev_editing_route_context), data: {
8
25
  turbo_frame: '_top',
@@ -17,4 +34,4 @@
17
34
 
18
35
  <%= render 'theme_list', f: f %>
19
36
  <% end %>
20
- <% end %>
37
+ <% end if false %>
@@ -0,0 +1,3 @@
1
+ <div class="flex min-h-0 flex-1 flex-col items-center justify-center px-4 py-12">
2
+ <p class="text-gray-500"><%= t('maglev.editor.sections.new.empty_list') %></p>
3
+ </div>
@@ -0,0 +1,35 @@
1
+ <div class="relative -mx-4 -my-4 flex min-h-0 flex-1 flex-col overflow-y-auto">
2
+ <%= form_with url: editor_sections_path(maglev_editing_route_context), html: { class: 'flex min-h-0 w-full flex-1 flex-col' }, data: {
3
+ turbo_frame: '_top',
4
+ controller: 'auto-save dispatcher',
5
+ action: %(
6
+ turbo:submit-end->editor-preview-notification-center#addSection
7
+ turbo:submit-end->dispatcher#trigger
8
+ turbo:submit-end->uikit-modal#close:self
9
+ ),
10
+ 'dispatcher-event-name-value': 'page-preview:remove-empty-message'
11
+ } do |f| %>
12
+ <%= f.hidden_field :position, value: @position %>
13
+
14
+ <div class="grid w-full grid-cols-1 gap-4 px-4 py-4 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3">
15
+ <% @theme_sections.each do |section| %>
16
+ <%= render Maglev::Uikit::List::ListItemComponent.new(options: {
17
+ wrapper_tag: :label,
18
+ wrapper_classes: 'cursor-pointer transition duration-150 ease-in-out transform hover:scale-105 hover:z-10 hover:ring-2 hover:ring-inset hover:ring-editor-primary/50' }
19
+ ) do |item| %>
20
+ <% item.with_big_image do %>
21
+ <% if screenshot_url = services.fetch_section_screenshot_url.call(section: section) %>
22
+ <%= image_tag screenshot_url, class: item.big_image_classes(class: 'rounded-md border border-gray-200'), data: { controller: 'broken-image' } %>
23
+ <% else %>
24
+ <%= render 'maglev/editor/sections/theme/screenshot_placeholder' %>
25
+ <% end %>
26
+ <% end %>
27
+
28
+ <% item.with_title_content(section.human_name) %>
29
+
30
+ <%= f.radio_button :section_type, section.id, class: 'sr-only peer' %>
31
+ <% end %>
32
+ <% end %>
33
+ </div>
34
+ <% end %>
35
+ </div>
@@ -0,0 +1,6 @@
1
+ <div class="relative bg-gray-200 rounded p-4">
2
+ <div class="h-12 bg-gray-300 mb-3 rounded"></div>
3
+ <div class="h-3 bg-gray-300 w-2/3 mb-2 rounded"></div>
4
+ <div class="h-3 bg-gray-300 w-1/2 mb-3 rounded"></div>
5
+ <div class="h-6 bg-gray-400 w-24 rounded"></div>
6
+ </div>
@@ -0,0 +1,22 @@
1
+ <div class="flex items-center w-full flex-col gap-4 shrink-0">
2
+ <div class="w-full">
3
+ <%= render Maglev::Uikit::Form::SearchFormComponent.new(
4
+ name: 'query',
5
+ value: @query,
6
+ search_path: new_editor_section_path({ query: @query, position: @position }),
7
+ options: {
8
+ placeholder: t('maglev.editor.sections.new.search_placeholder'),
9
+ class_names: 'w-full',
10
+ }) %>
11
+ </div>
12
+
13
+ <div class="w-full">
14
+ <div class="overflow-y-hidden pt-2 pb-4">
15
+ <%= render Maglev::Uikit::TabsComponent.new(variant: :pills, active_tab_index: -1) do |tabs| %>
16
+ <% maglev_theme.section_categories.each do |category| %>
17
+ <% tabs.with_tab(label: category.human_name, link: { url: new_editor_section_path(category_id: category.id, position: @position) }, active: category.id == @category_id) %>
18
+ <% end %>
19
+ <% end %>
20
+ </div>
21
+ </div>
22
+ </div>
@@ -1,4 +1,4 @@
1
- <%= turbo_stream.dispatch_event "section-#{@section.id}:persisted", payload: { lockVersion: @section.lock_version }.to_json %>
1
+ <%= turbo_stream.dispatch_event "section-#{@section.id}:persisted", payload: { lockVersion: source_lock_version }.to_json %>
2
2
 
3
3
  <%= turbo_stream.update 'page-layout-notification', method: 'morph' do %>
4
4
  <%= render Maglev::Uikit::BadgeComponent.new(color: :green, icon_name: 'checkbox_circle', disappear_after: 3.seconds).with_content(flash.now[:notice]) %>
@@ -1,18 +1,18 @@
1
- <span class="group-[.is-pending]/form:hidden group-[.is-success]/form:hidden group-[.is-error]/form:hidden">
1
+ <span class="group-[.is-pending]/form:hidden group-[.is-success]/form:hidden group-[.is-error]/form:hidden truncate">
2
2
  <%= label %>
3
3
  </span>
4
4
 
5
- <span class="hidden group-[.is-pending]/form:inline-flex gap-x-2 items-center">
5
+ <span class="hidden group-[.is-pending]/form:inline-flex gap-x-2 items-center truncate">
6
6
  <%= pending_label %>
7
7
  <%= render Maglev::Uikit::IconComponent.new(name: 'spinner', size: '1rem', class_names: 'animate-spin') %>
8
8
  </span>
9
9
 
10
- <span class="hidden group-[.is-success]/form:inline-flex gap-x-2 items-center">
10
+ <span class="hidden group-[.is-success]/form:inline-flex gap-x-2 items-center truncate">
11
11
  <%= success_label %>
12
12
  <%= render Maglev::Uikit::IconComponent.new(name: 'check', size: '1rem') %>
13
13
  </span>
14
14
 
15
- <span class="hidden group-[.is-error]/form:inline-flex gap-x-2 items-center">
15
+ <span class="hidden group-[.is-error]/form:inline-flex gap-x-2 items-center truncate">
16
16
  <%= error_label %>
17
17
  <%= render Maglev::Uikit::IconComponent.new(name: 'error_warning', size: '1rem') %>
18
18
  </span>
@@ -1,5 +1,6 @@
1
1
  <%= render Maglev::Uikit::PageLayoutComponent.new(back_path: editor_real_root_path(maglev_editing_route_context)) do |page_layout| %>
2
2
  <% page_layout.with_title_content t('maglev.editor.style.edit.title') %>
3
+ <% page_layout.with_description_content t('maglev.editor.style.edit.sub_title') %>
3
4
  <% page_layout.with_notification_content maglev_flash_message %>
4
5
 
5
6
  <%= form_with url: editor_style_path(**maglev_editing_route_context), method: :put, id: 'editor-style-form', data: {
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- pin '@floating-ui/dom', to: '@floating-ui--dom.js'
4
- pin '@floating-ui/core', to: '@floating-ui--core.js'
5
- pin '@floating-ui/utils', to: '@floating-ui--utils.js'
6
- pin '@floating-ui/utils/dom', to: '@floating-ui--utils--dom.js'
3
+ pin '@floating-ui/dom', to: 'maglev/@floating-ui--dom.js'
4
+ pin '@floating-ui/core', to: 'maglev/@floating-ui--core.js'
5
+ pin '@floating-ui/utils', to: 'maglev/@floating-ui--utils.js'
6
+ pin '@floating-ui/utils/dom', to: 'maglev/@floating-ui--utils--dom.js'
7
7
 
8
- pin 'el-transition'
9
- pin '@shopify/draggable', to: '@shopify--draggable.js'
10
- pin 'stimulus-use'
8
+ pin 'el-transition', to: 'maglev/el-transition.js'
9
+ pin '@shopify/draggable', to: 'maglev/@shopify--draggable.js'
10
+ pin 'stimulus-use', to: 'maglev/stimulus-use.js'
11
11
 
12
- pin '@hotwired/turbo-rails', to: '@hotwired--turbo-rails.js'
13
- pin '@hotwired/turbo', to: '@hotwired--turbo.js'
14
- pin '@rails/actioncable/src', to: '@rails--actioncable--src.js'
15
- pin '@hotwired/stimulus', to: '@hotwired--stimulus.js'
16
- pin '@rails/request.js', to: '@rails--request.js.js'
12
+ pin '@hotwired/turbo-rails', to: 'maglev/@hotwired--turbo-rails.js'
13
+ pin '@hotwired/turbo', to: 'maglev/@hotwired--turbo.js'
14
+ pin '@rails/actioncable/src', to: 'maglev/@rails--actioncable--src.js'
15
+ pin '@hotwired/stimulus', to: 'maglev/@hotwired--stimulus.js'
16
+ pin '@rails/request.js', to: 'maglev/@rails--request.js.js'
17
17
 
18
18
  # check out scripts/tiptap-bundle/README.md for more information
19
- pin 'tiptap', to: 'tiptap.bundle.js'
19
+ pin 'tiptap', to: 'maglev/tiptap.bundle.js'
20
20
 
21
21
  pin_all_from File.expand_path('../app/components/maglev/uikit', __dir__), under: 'uikit-controllers', to: 'maglev/uikit'
22
22
  pin_all_from File.expand_path('../app/assets/javascripts/maglev/editor/controllers', __dir__),
@@ -14,6 +14,9 @@ ar:
14
14
  in_progress: "جاري النشر..."
15
15
  success: "تم النشر!"
16
16
  fail: "فشل!"
17
+ discard_draft: "إلغاء المسودة"
18
+ discard_draft_confirm: "هل أنت متأكد من أنك تريد إلغاء تغييرات المسودة؟"
19
+ publish_confirm: "هل أنت متأكد من أنك تريد نشر هذه الصفحة؟"
17
20
  save_button:
18
21
  default: "حفظ"
19
22
  in_progress: "جاري الحفظ..."
@@ -42,6 +45,7 @@ ar:
42
45
  preview: "معاينة الصفحة"
43
46
  draft_preview: "نسخة مسودة"
44
47
  live_preview: "نسخة مباشرة"
48
+ no_live_preview: "لا توجد نسخة مباشرة"
45
49
  clone: "استنساخ الصفحة"
46
50
  hide: "إخفاء الصفحة"
47
51
  show: "إظهار الصفحة"
@@ -79,8 +83,10 @@ ar:
79
83
  confirm_delete: "هل أنت متأكد من أنك تريد حذفه؟"
80
84
  new:
81
85
  title: "إضافة قسم"
82
- empty_category: "لا توجد أقسام"
86
+ search_placeholder: "البحث عن قسم"
87
+ empty_list: "لم يتم العثور على أقسام"
83
88
  edit:
89
+ no_settings: "لا توجد إعدادات محددة في هذا القسم"
84
90
  tabs:
85
91
  main: "المحتوى"
86
92
  advanced: "متقدم"
@@ -92,6 +98,7 @@ ar:
92
98
  confirm_delete: "هل أنت متأكد من أنك تريد حذفه؟"
93
99
  empty: "لا توجد عناصر."
94
100
  edit:
101
+ no_settings: "لا توجد إعدادات محددة في هذه الكتلة"
95
102
  tabs:
96
103
  main: "المحتوى"
97
104
  advanced: "متقدم"
@@ -101,6 +108,7 @@ ar:
101
108
  style:
102
109
  edit:
103
110
  title: "تنسيق موقعك"
111
+ sub_title: "اضبط الألوان والخطوط وإعدادات السمة الأخرى المطبقة على كامل الموقع."
104
112
  submit_button:
105
113
  default: "تحديث النمط"
106
114
  in_progress: "جاري التحديث..."
@@ -220,9 +228,9 @@ ar:
220
228
  error: "فشل!"
221
229
  destroy:
222
230
  success: "تم الحذف!"
223
- page_clone:
224
- create:
225
- success: "تم الاستنساخ!"
231
+ clone:
232
+ create:
233
+ success: "تم الاستنساخ!"
226
234
  sections:
227
235
  sort:
228
236
  success: 'تم الترتيب!'
@@ -14,6 +14,9 @@ en:
14
14
  in_progress: "Publishing..."
15
15
  success: "Published!"
16
16
  fail: "Fail!"
17
+ discard_draft: "Discard draft"
18
+ discard_draft_confirm: "Are you sure you want to discard the draft changes?"
19
+ publish_confirm: "Are you sure you want to publish this page?"
17
20
  save_button:
18
21
  default: "Save"
19
22
  in_progress: "Saving..."
@@ -42,6 +45,7 @@ en:
42
45
  preview: "Preview page"
43
46
  draft_preview: "Draft version"
44
47
  live_preview: "Live version"
48
+ no_live_preview: "No live version"
45
49
  clone: "Clone page"
46
50
  hide: "Hide page"
47
51
  show: "Show page"
@@ -63,12 +67,12 @@ en:
63
67
  title: "Edit the current page"
64
68
  submit_button:
65
69
  default: "Update page"
66
- in_progress: "Updating..."
70
+ in_progress: "Updating..."
67
71
  cancel_button: "Cancel"
68
72
  form:
69
73
  tabs:
70
74
  main: "Main"
71
- seo: "SEO"
75
+ seo: "SEO"
72
76
  sections:
73
77
  breadcrumb: "Sections"
74
78
  index:
@@ -76,15 +80,17 @@ en:
76
80
  sub_title: "Re-order / delete the sections of the page"
77
81
  empty: "There are no sections."
78
82
  add_button: "Add a new section"
79
- confirm_delete: "Are you sure you want to delete it?"
83
+ confirm_delete: "Are you sure you want to delete it?"
80
84
  new:
81
85
  title: "Add a section"
82
- empty_category: "No sections"
86
+ search_placeholder: "Search for a section"
87
+ empty_list: "No sections found"
83
88
  edit:
89
+ no_settings: "There are no settings defined in this section"
84
90
  tabs:
85
91
  main: "Content"
86
92
  advanced: "Advanced"
87
- blocks: "Blocks"
93
+ blocks: "Blocks"
88
94
  section_blocks:
89
95
  breadcrumb: "Blocks"
90
96
  index:
@@ -92,20 +98,22 @@ en:
92
98
  confirm_delete: "Are you sure you want to delete it?"
93
99
  empty: "There are no items."
94
100
  edit:
101
+ no_settings: "There are no settings defined in this block"
95
102
  tabs:
96
103
  main: "Content"
97
- advanced: "Advanced"
104
+ advanced: "Advanced"
98
105
  settings:
99
106
  collection_item:
100
107
  placeholder: "Select a collection item"
101
108
  style:
102
109
  edit:
103
110
  title: "Style your site"
111
+ sub_title: "Adjust colors, typography, and other theme settings that apply site-wide."
104
112
  submit_button:
105
113
  default: "Update style"
106
114
  in_progress: "Updating..."
107
115
  success: "Updated!"
108
- fail: "Fail!"
116
+ fail: "Fail!"
109
117
  image_library:
110
118
  title: "List of images"
111
119
  picker_title: "Select an image"
@@ -118,7 +126,7 @@ en:
118
126
  wrong_files: "Make sure the size of each image is not greater than %{limit}."
119
127
  upload_button:
120
128
  default: "Upload images"
121
- in_progress: "Uploading..."
129
+ in_progress: "Uploading..."
122
130
  icon_input:
123
131
  add_button: "Add icon"
124
132
  replace_button: "Replace icon"
@@ -176,7 +184,7 @@ en:
176
184
  confirmation_button:
177
185
  text: "Are you sure to perform this action?"
178
186
  confirm_button_label: "Yes"
179
- cancel_button_label: "No"
187
+ cancel_button_label: "No"
180
188
  error_modals:
181
189
  stale_object:
182
190
  title: "Sorry about that 🙇"
@@ -195,13 +203,13 @@ en:
195
203
  support:
196
204
  human:
197
205
  locales:
198
- fr: 'Français'
199
- en: 'English'
200
- de: 'Deutsch'
201
- it: 'Italiano'
202
- es: 'Español'
203
- ar: 'Arabic'
204
- pt: 'Português'
206
+ fr: "Français"
207
+ en: "English"
208
+ de: "Deutsch"
209
+ it: "Italiano"
210
+ es: "Español"
211
+ ar: "Arabic"
212
+ pt: "Português"
205
213
  storage_units:
206
214
  format: "%{number} %{unit}"
207
215
  units:
@@ -219,14 +227,14 @@ en:
219
227
  success: "Saved!"
220
228
  error: "Failed!"
221
229
  destroy:
222
- success: "Deleted!"
223
- page_clone:
224
- create:
225
- success: "Cloned!"
230
+ success: "Deleted!"
231
+ clone:
232
+ create:
233
+ success: "Cloned!"
226
234
  sections:
227
235
  sort:
228
- success: 'Sorted!'
229
- error: 'Failed!'
236
+ success: "Sorted!"
237
+ error: "Failed!"
230
238
  create:
231
239
  success: "Added!"
232
240
  error: "Failed!"
@@ -265,4 +273,4 @@ en:
265
273
  success: "%{name} deleted!"
266
274
  placeholders:
267
275
  pages:
268
- visible_placeholder: "Show/Hide the live version of the page"
276
+ visible_placeholder: "Show/Hide the live version of the page"
@@ -14,6 +14,9 @@ es:
14
14
  in_progress: "Publicando..."
15
15
  success: "¡Publicado!"
16
16
  fail: "¡Falló!"
17
+ discard_draft: "Descartar borrador"
18
+ discard_draft_confirm: "¿Estás seguro de que quieres descartar los cambios del borrador?"
19
+ publish_confirm: "¿Estás seguro de que quieres publicar esta página?"
17
20
  save_button:
18
21
  default: "Guardar"
19
22
  in_progress: "Guardando..."
@@ -42,6 +45,7 @@ es:
42
45
  preview: "Vista previa de la página"
43
46
  draft_preview: "Versión borrador"
44
47
  live_preview: "Versión en vivo"
48
+ no_live_preview: "Sin versión en vivo"
45
49
  clone: "Clonar página"
46
50
  hide: "Ocultar página"
47
51
  show: "Mostrar página"
@@ -79,8 +83,10 @@ es:
79
83
  confirm_delete: "¿Estás seguro de que quieres eliminarlo?"
80
84
  new:
81
85
  title: "Agregar una sección"
82
- empty_category: "Sin secciones"
86
+ search_placeholder: "Buscar una sección"
87
+ empty_list: "No se encontraron secciones"
83
88
  edit:
89
+ no_settings: "No hay configuraciones definidas en esta sección"
84
90
  tabs:
85
91
  main: "Contenido"
86
92
  advanced: "Avanzado"
@@ -92,6 +98,7 @@ es:
92
98
  confirm_delete: "¿Estás seguro de que quieres eliminarlo?"
93
99
  empty: "No hay elementos."
94
100
  edit:
101
+ no_settings: "No hay configuraciones definidas en este bloque"
95
102
  tabs:
96
103
  main: "Contenido"
97
104
  advanced: "Avanzado"
@@ -101,6 +108,7 @@ es:
101
108
  style:
102
109
  edit:
103
110
  title: "Estilizar tu sitio"
111
+ sub_title: "Ajusta colores, tipografía y otros ajustes del tema que se aplican a todo el sitio."
104
112
  submit_button:
105
113
  default: "Actualizar estilo"
106
114
  in_progress: "Actualizando..."
@@ -220,9 +228,9 @@ es:
220
228
  error: "¡Falló!"
221
229
  destroy:
222
230
  success: "¡Eliminada!"
223
- page_clone:
224
- create:
225
- success: "¡Clonada!"
231
+ clone:
232
+ create:
233
+ success: "¡Clonada!"
226
234
  sections:
227
235
  sort:
228
236
  success: '¡Ordenado!'
@@ -14,6 +14,9 @@ fr:
14
14
  in_progress: "Publication..."
15
15
  success: "Publié !"
16
16
  fail: "Échec !"
17
+ discard_draft: "Annuler le brouillon"
18
+ discard_draft_confirm: "Êtes-vous sûr de vouloir annuler les modifications du brouillon ?"
19
+ publish_confirm: "Êtes-vous sûr de vouloir publier cette page ?"
17
20
  save_button:
18
21
  default: "Enregistrer"
19
22
  in_progress: "Enregistrement..."
@@ -42,6 +45,7 @@ fr:
42
45
  preview: "Aperçu de la page"
43
46
  draft_preview: "Version brouillon"
44
47
  live_preview: "Version en direct"
48
+ no_live_preview: "Aucune version en direct"
45
49
  clone: "Cloner la page"
46
50
  hide: "Masquer la page"
47
51
  show: "Afficher la page"
@@ -79,8 +83,10 @@ fr:
79
83
  confirm_delete: "Êtes-vous sûr de vouloir le supprimer ?"
80
84
  new:
81
85
  title: "Ajouter une section"
82
- empty_category: "Aucune section"
86
+ search_placeholder: "Rechercher une section"
87
+ empty_list: "Aucune section trouvée"
83
88
  edit:
89
+ no_settings: "Aucun paramètre n'est défini dans cette section"
84
90
  tabs:
85
91
  main: "Contenu"
86
92
  advanced: "Avancé"
@@ -92,6 +98,7 @@ fr:
92
98
  confirm_delete: "Êtes-vous sûr de vouloir le supprimer ?"
93
99
  empty: "Il n'y a pas d'éléments."
94
100
  edit:
101
+ no_settings: "Aucun paramètre n'est défini dans ce bloc"
95
102
  tabs:
96
103
  main: "Contenu"
97
104
  advanced: "Avancé"
@@ -101,6 +108,7 @@ fr:
101
108
  style:
102
109
  edit:
103
110
  title: "Styliser votre site"
111
+ sub_title: "Modifiez les couleurs, la typographie et les autres réglages du thème appliqués à tout le site."
104
112
  submit_button:
105
113
  default: "Mettre à jour le style"
106
114
  in_progress: "Mise à jour..."
@@ -220,9 +228,9 @@ fr:
220
228
  error: "Échec !"
221
229
  destroy:
222
230
  success: "Supprimée !"
223
- page_clone:
224
- create:
225
- success: "Clonée !"
231
+ clone:
232
+ create:
233
+ success: "Clonée !"
226
234
  sections:
227
235
  sort:
228
236
  success: 'Trié !'
@@ -14,6 +14,9 @@
14
14
  in_progress: "Publicando..."
15
15
  success: "Publicado!"
16
16
  fail: "Falhou!"
17
+ discard_draft: "Descartar rascunho"
18
+ discard_draft_confirm: "Tem certeza de que deseja descartar as alterações do rascunho?"
19
+ publish_confirm: "Tem certeza de que deseja publicar esta página?"
17
20
  save_button:
18
21
  default: "Salvar"
19
22
  in_progress: "Salvando..."
@@ -42,6 +45,7 @@
42
45
  preview: "Visualizar página"
43
46
  draft_preview: "Versão rascunho"
44
47
  live_preview: "Versão ao vivo"
48
+ no_live_preview: "Sem versão ao vivo"
45
49
  clone: "Clonar página"
46
50
  hide: "Ocultar página"
47
51
  show: "Mostrar página"
@@ -79,8 +83,10 @@
79
83
  confirm_delete: "Tem certeza de que deseja excluí-lo?"
80
84
  new:
81
85
  title: "Adicionar uma seção"
82
- empty_category: "Sem seções"
86
+ search_placeholder: "Pesquisar uma seção"
87
+ empty_list: "Nenhuma seção encontrada"
83
88
  edit:
89
+ no_settings: "Não há configurações definidas nesta seção"
84
90
  tabs:
85
91
  main: "Conteúdo"
86
92
  advanced: "Avançado"
@@ -92,6 +98,7 @@
92
98
  confirm_delete: "Tem certeza de que deseja excluí-lo?"
93
99
  empty: "Não há itens."
94
100
  edit:
101
+ no_settings: "Não há configurações definidas neste bloco"
95
102
  tabs:
96
103
  main: "Conteúdo"
97
104
  advanced: "Avançado"
@@ -101,6 +108,7 @@
101
108
  style:
102
109
  edit:
103
110
  title: "Estilizar seu site"
111
+ sub_title: "Ajuste cores, tipografia e outras configurações do tema que valem para todo o site."
104
112
  submit_button:
105
113
  default: "Atualizar estilo"
106
114
  in_progress: "Atualizando..."
@@ -220,9 +228,9 @@
220
228
  error: "Falhou!"
221
229
  destroy:
222
230
  success: "Excluída!"
223
- page_clone:
224
- create:
225
- success: "Clonada!"
231
+ clone:
232
+ create:
233
+ success: "Clonada!"
226
234
  sections:
227
235
  sort:
228
236
  success: 'Ordenado!'
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ get 'assets/:id(/:filename)', to: "#{Maglev.uploader_proxy_controller_name}#show",
4
+ as: :public_asset
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ root to: 'home#index'
4
+
5
+ get 'leave', to: 'home#destroy', as: :leave
6
+
7
+ resources :assets, only: %i[index create destroy]
8
+ resources :icons, only: %i[index]
9
+ resource :link, only: %i[edit update]
10
+
11
+ # combobox routes
12
+ namespace :combobox do
13
+ resources :pages, only: :index
14
+ resources :collection_items, only: :index
15
+ end
16
+
17
+ # always keep the scope of the current page and locale in the url
18
+ scope ':locale/:page_id' do
19
+ root to: 'home#index', as: :real_root
20
+
21
+ resources :pages do
22
+ member do
23
+ post :clone, controller: 'pages/clone', action: :create
24
+ post :discard_draft, controller: 'pages/discard_draft', action: :create
25
+ end
26
+ end
27
+
28
+ resources :sections do
29
+ put :sort, on: :collection
30
+ resources :blocks, controller: :section_blocks do
31
+ put :sort, on: :collection
32
+ end
33
+ end
34
+
35
+ resource :style, controller: :style, only: %i[edit update]
36
+
37
+ resource :publication, controller: :publication, only: :create
38
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ get 'preview/(*path)', to: 'page_preview#index',
4
+ defaults: { path: 'index', rendering_mode: :editor },
5
+ constraints: Maglev::PreviewConstraint.new,
6
+ as: :site_preview
7
+
8
+ post 'preview/(*path)', to: 'page_preview#create', defaults: { path: 'index', rendering_mode: :editor }
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ get '/sitemap', to: 'maglev/sitemap#index', defaults: { format: 'xml' }
4
+
5
+ get '(*path)', to: 'maglev/published_page_preview#index', defaults: { path: 'index' },
6
+ constraints: Maglev::PreviewConstraint.new