gaco_cms 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.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +48 -0
  3. data/Rakefile +10 -0
  4. data/app/assets/builds/gaco_cms.css +18257 -0
  5. data/app/assets/builds/gaco_cms.js +43235 -0
  6. data/app/assets/builds/gaco_cms.js.map +7 -0
  7. data/app/assets/builds/gaco_cms_front.css +18237 -0
  8. data/app/assets/builds/gaco_cms_front.js +10722 -0
  9. data/app/assets/builds/gaco_cms_front.js.map +7 -0
  10. data/app/assets/javascripts/gaco_cms/base.js +24 -0
  11. data/app/assets/javascripts/gaco_cms/controllers/confirm_controller.ts +20 -0
  12. data/app/assets/javascripts/gaco_cms/controllers/deletable_row_controller.ts +46 -0
  13. data/app/assets/javascripts/gaco_cms/controllers/editor_controller.ts +58 -0
  14. data/app/assets/javascripts/gaco_cms/controllers/file_input_controller.ts +82 -0
  15. data/app/assets/javascripts/gaco_cms/controllers/modal_controller.ts +73 -0
  16. data/app/assets/javascripts/gaco_cms/controllers/remote_content_controller.ts +27 -0
  17. data/app/assets/javascripts/gaco_cms/controllers/repeatable_field_controller.ts +26 -0
  18. data/app/assets/javascripts/gaco_cms/controllers/sortable_controller.ts +27 -0
  19. data/app/assets/javascripts/gaco_cms/controllers/toggle_field_controller.ts +37 -0
  20. data/app/assets/javascripts/gaco_cms/controllers/translatable_controller.ts +86 -0
  21. data/app/assets/javascripts/gaco_cms/lib/progress_bar.ts +7 -0
  22. data/app/assets/javascripts/gaco_cms/lib/request.ts +21 -0
  23. data/app/assets/javascripts/gaco_cms/lib/turbo_request.ts +61 -0
  24. data/app/assets/javascripts/gaco_cms/stimulus.ts +9 -0
  25. data/app/assets/javascripts/gaco_cms.js +7 -0
  26. data/app/assets/javascripts/gaco_cms_front.js +3 -0
  27. data/app/assets/stylesheets/gaco_cms/bootstrap_custom.scss +15 -0
  28. data/app/assets/stylesheets/gaco_cms/shared.scss +22 -0
  29. data/app/assets/stylesheets/gaco_cms.css.scss +8 -0
  30. data/app/assets/stylesheets/gaco_cms_front.css.scss +6 -0
  31. data/app/controllers/concerns/gaco_cms/turbo_concern.rb +52 -0
  32. data/app/controllers/gaco_cms/admin/base_controller.rb +20 -0
  33. data/app/controllers/gaco_cms/admin/field_groups_controller.rb +87 -0
  34. data/app/controllers/gaco_cms/admin/field_groups_manager_controller.rb +66 -0
  35. data/app/controllers/gaco_cms/admin/field_groups_renderer_controller.rb +33 -0
  36. data/app/controllers/gaco_cms/admin/fields_controller.rb +20 -0
  37. data/app/controllers/gaco_cms/admin/page_types_controller.rb +56 -0
  38. data/app/controllers/gaco_cms/admin/pages_controller.rb +70 -0
  39. data/app/controllers/gaco_cms/admin/themes_controller.rb +55 -0
  40. data/app/controllers/gaco_cms/admin_controller.rb +47 -0
  41. data/app/controllers/gaco_cms/front_controller.rb +39 -0
  42. data/app/helpers/gaco_cms/application_helper.rb +26 -0
  43. data/app/jobs/gaco_cms/application_job.rb +6 -0
  44. data/app/mailers/gaco_cms/application_mailer.rb +8 -0
  45. data/app/models/concerns/gaco_cms/fields_assignable.rb +40 -0
  46. data/app/models/concerns/gaco_cms/union_scope.rb +14 -0
  47. data/app/models/gaco_cms/application_record.rb +25 -0
  48. data/app/models/gaco_cms/draft_record.rb +16 -0
  49. data/app/models/gaco_cms/field.rb +78 -0
  50. data/app/models/gaco_cms/field_group.rb +55 -0
  51. data/app/models/gaco_cms/field_value.rb +77 -0
  52. data/app/models/gaco_cms/media_file.rb +22 -0
  53. data/app/models/gaco_cms/page.rb +57 -0
  54. data/app/models/gaco_cms/page_type.rb +38 -0
  55. data/app/models/gaco_cms/theme.rb +28 -0
  56. data/app/services/gaco_cms/application_service.rb +33 -0
  57. data/app/services/gaco_cms/shortcode_parser.rb +217 -0
  58. data/app/services/gaco_cms/theme_content_generator.rb +55 -0
  59. data/app/views/gaco_cms/admin/base/index.html.haml +4 -0
  60. data/app/views/gaco_cms/admin/field_groups_manager/_field.html.haml +53 -0
  61. data/app/views/gaco_cms/admin/field_groups_manager/_group.html.haml +54 -0
  62. data/app/views/gaco_cms/admin/field_groups_manager/index.html.haml +14 -0
  63. data/app/views/gaco_cms/admin/field_groups_renderer/_field.html.haml +31 -0
  64. data/app/views/gaco_cms/admin/field_groups_renderer/_fields_frame.html.haml +16 -0
  65. data/app/views/gaco_cms/admin/field_groups_renderer/_group.html.haml +24 -0
  66. data/app/views/gaco_cms/admin/field_groups_renderer/default_value/_page.html.haml +3 -0
  67. data/app/views/gaco_cms/admin/field_groups_renderer/fields/_editor.html.haml +3 -0
  68. data/app/views/gaco_cms/admin/field_groups_renderer/fields/_file.html.haml +4 -0
  69. data/app/views/gaco_cms/admin/field_groups_renderer/fields/_page.html.haml +3 -0
  70. data/app/views/gaco_cms/admin/field_groups_renderer/fields/_text_area.html.haml +3 -0
  71. data/app/views/gaco_cms/admin/field_groups_renderer/fields/_text_field.html.haml +3 -0
  72. data/app/views/gaco_cms/admin/field_groups_renderer/index.html.haml +20 -0
  73. data/app/views/gaco_cms/admin/page_types/form.html.haml +27 -0
  74. data/app/views/gaco_cms/admin/page_types/index.html.haml +27 -0
  75. data/app/views/gaco_cms/admin/pages/edit.html.haml +57 -0
  76. data/app/views/gaco_cms/admin/pages/index.html.haml +23 -0
  77. data/app/views/gaco_cms/admin/pages/new.html.haml +16 -0
  78. data/app/views/gaco_cms/admin/themes/edit.html.haml +36 -0
  79. data/app/views/gaco_cms/admin/themes/index.html.haml +24 -0
  80. data/app/views/gaco_cms/admin/themes/new.html.haml +21 -0
  81. data/app/views/layouts/gaco_cms/_breadcrumb.html.haml +7 -0
  82. data/app/views/layouts/gaco_cms/_flash_messages.html.haml +13 -0
  83. data/app/views/layouts/gaco_cms/admin.haml +55 -0
  84. data/config/routes.rb +26 -0
  85. data/db/migrate/20230202133738_create_cms_pages.rb +16 -0
  86. data/db/migrate/20230202134840_create_cms_field_groups.rb +17 -0
  87. data/db/migrate/20230202135314_create_cms_fields.rb +21 -0
  88. data/db/migrate/20230202135739_create_cms_field_values.rb +16 -0
  89. data/db/migrate/20230202181744_create_cms_media_files.rb +10 -0
  90. data/db/migrate/20230206231547_create_cms_page_types.rb +23 -0
  91. data/db/migrate/20230209090008_create_cms_themes.rb +19 -0
  92. data/lib/gaco_cms/config.rb +19 -0
  93. data/lib/gaco_cms/engine.rb +31 -0
  94. data/lib/gaco_cms/version.rb +5 -0
  95. data/lib/gaco_cms.rb +18 -0
  96. data/lib/generators/gaco_cms/install_generator.rb +16 -0
  97. data/lib/generators/gaco_cms/install_template/gaco_cms.rb +11 -0
  98. data/lib/generators/gaco_cms/install_template/themes/default/index.html.haml +2 -0
  99. data/lib/generators/gaco_cms/install_template/themes/default/layouts/application.html.haml +34 -0
  100. data/lib/generators/gaco_cms/install_template/themes/default/page.html.haml +2 -0
  101. data/lib/tasks/auto_annotate_models.rake +59 -0
  102. data/lib/tasks/gaco_cms_tasks.rake +5 -0
  103. metadata +174 -0
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GacoCms
4
+ class ThemeContentGenerator
5
+ def call
6
+ generate_pages
7
+ generate_theme_settings
8
+ end
9
+
10
+ private
11
+
12
+ def generate_pages
13
+ Page.create(title: 'Home', key: :home, content: home_content)
14
+ # TODO: create content for below pages
15
+ Page.create(title: 'Shortcodes', key: :shortcodes, content: gallery_content)
16
+ Page.create(title: 'Custom Fields', key: :custom_fields, content: gallery_content)
17
+ Page.create(title: 'Gallery', key: :gallery, content: gallery_content)
18
+ end
19
+
20
+ def generate_theme_settings
21
+ theme = Theme.current
22
+ group = theme.field_groups.create!(title: 'Menus', repeat: true)
23
+ label_field = group.fields.create!(title: 'Label', key: :menu_label, kind: :text_field, translatable: true, required: true)
24
+ url_field = group.fields.create!(title: 'Url', key: :menu_url, kind: :text_field, required: true)
25
+
26
+ theme.field_values.create!(value: 'Home', group_no: 1, field: label_field)
27
+ theme.field_values.create!(value: '/', group_no: 1, field: url_field)
28
+
29
+ theme.field_values.create!(value: 'Gallery', group_no: 2, field: label_field)
30
+ theme.field_values.create!(value: '[page_url key=gallery]', group_no: 2, field: url_field)
31
+ end
32
+
33
+ def home_content
34
+ '''
35
+ GacoCms is a lightweight CMS built in RubyonRails, to be included in any Rails application as the main purpose in mind.
36
+ <br>
37
+ Most outstanding characteristics are:
38
+ <ul>
39
+ <li>No extra Ruby dependencies required, except <a href="https://github.com/owen2345/buddy_translatable" target="_blank">translatable</a> that can conflict with existent applications</li>
40
+ <li>Surpricingly fast</li>
41
+ <li>Support multilanguage</li>
42
+ <li>Manage your content structure via custom fields</li>
43
+ <li>Manage content easily via shortcodes</li>
44
+ </ul>
45
+ <div class="alert alert-info">Note: Any error, issue, improvement, please let us know in https://github.com/owen2345/gaco_cms</div>
46
+ '''
47
+ end
48
+
49
+ def gallery_content
50
+ '''
51
+ This is a sample gallery page
52
+ '''
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,4 @@
1
+ %h1
2
+ Welcome to
3
+ %span.text-primary GacoCms
4
+ Admin Panel
@@ -0,0 +1,53 @@
1
+ -# locals: { field: Field, parent_name: String }
2
+ :ruby
3
+ accordion_key = "field_item_#{Time.current.to_i}_#{field.id}_#{field.kind}"
4
+ name = "#{parent_name}fields_attributes[#{accordion_key}]"
5
+
6
+ .accordion-item
7
+ .accordion-header
8
+ .accordion-button{'data-bs-target' => "##{accordion_key}", "data-bs-toggle" => "collapse"}
9
+ = button_tag class: 'btn btn-sm sort-btn btn-light', type: :button do
10
+ %i.fa.fa-arrows-alt
11
+ = check_box_tag "#{name}[_destroy]", '1', false , 'data-controller': 'gaco-cms-deletable_row', 'data-hide-closest': '.accordion-item', 'data-hideonly': field.id
12
+ %code.ms-3.small= "[#{field.kind}]"
13
+
14
+ .accordion-collapse.collapse.show{ id: accordion_key }
15
+ .accordion-body
16
+ = fields_for name, field do |f|
17
+ = f.hidden_field :id
18
+ = f.hidden_field :kind
19
+ .row.mb-2.gx-2
20
+ .col.col-auto
21
+ = f.label :key
22
+ = f.text_field :key, class: 'form-control ms-1 me-1', style: 'max-width: 100px'
23
+ .col
24
+ = f.label :title
25
+ = f.text_field :title, class: 'form-control'
26
+ .col.col-auto
27
+ = f.label :repeat
28
+ %br
29
+ = f.check_box :repeat, class: 'form-check-input'
30
+ .col.col-auto
31
+ = f.label :required
32
+ %br
33
+ = f.check_box :required, class: 'form-check-input'
34
+ - if field.allow_translation?
35
+ .col.col-auto
36
+ = f.label :translatable
37
+ %br
38
+ = f.check_box :translatable, class: 'form-check-input'
39
+ .col.col-auto.d-none
40
+ = f.label :position
41
+ = f.number_field :position, class: 'form-control position-field'
42
+ .row
43
+ .col-6
44
+ - if field.default_value_tpl
45
+ = render field.default_value_tpl, field: field, f: f
46
+ - else
47
+ = f.label :def_value
48
+ .fw{ data: { controller: 'gaco-cms-toggle-field', 'gaco-cms-toggle-field-open-value': field.def_value_data.values.any?(&:present?) } }
49
+ = f.text_field :def_value, value: field.def_value_data.to_json, class: 'form-control', data: { controller: 'gaco-cms-translatable' }
50
+ .col-6
51
+ = f.label :description
52
+ .fw{ data: { controller: 'gaco-cms-toggle-field', 'gaco-cms-toggle-field-open-value': field.description_data.values.any?(&:present?) } }
53
+ = f.text_area :description, class: 'form-control'
@@ -0,0 +1,54 @@
1
+ -# locals: { group: FieldGroup }
2
+ :ruby
3
+ name = "groups_manager[field_groups_attributes][#{Time.current.to_i}-#{group.id}]"
4
+ accordion_key = name.parameterize
5
+ = fields_for name, group do |f|
6
+ .accordion-item
7
+ .accordion-header
8
+ .accordion-button.bg-light{'data-bs-target' => "##{accordion_key}", 'data-bs-toggle': 'collapse'}
9
+ .accordion-actions.ms-2
10
+ = f.check_box :_destroy, 'data-controller': 'gaco-cms-deletable_row', 'data-propagate': '._destroy_field', 'data-hide-closest': '.accordion-item', 'data-hideonly': group.id
11
+ = button_tag class: 'btn btn-sm group-sort-btn btn-light', type: :button do
12
+ %i.fa.fa-arrows-alt
13
+ .btn-group.btn-group-sm.ms-2
14
+ %button.btn.btn-primary.dropdown-toggle{"aria-expanded" => "false", "data-bs-toggle" => "dropdown", type: "button"}
15
+ %i.fa.fa-plus
16
+ = GacoCms::Field.human_name(count: 2)
17
+ %ul.dropdown-menu
18
+ - GacoCms::Field.dropdown_data.each do |v, k|
19
+ %li= link_to(v, url_for(action: :field_tpl, kind: k, parent_name: name), class: 'dropdown-item', data: { controller: 'gaco-cms-remote-content', 'gaco-cms-remote-content-target-value': "##{accordion_key}_fields" })
20
+
21
+ .accordion-collapse.collapse-effect.show{ id: accordion_key }
22
+ .accordion-body.p-0.mb-3
23
+ .card
24
+ .card-body.bg-light
25
+ .row
26
+ .col-auto
27
+ = required_label f, :key
28
+ = f.text_field :key, class: 'form-control', style: 'max-width: 90px', required: true
29
+
30
+ .col
31
+ = required_label f, :title
32
+ = f.text_field :title, value: group.title, class: 'form-control', required: true
33
+
34
+ .col.d-none
35
+ = f.number_field :position, class: 'position-group'
36
+ = f.hidden_field :id
37
+
38
+ .col.col-auto
39
+ = f.label :repeat, class: 'd-block'
40
+ = f.check_box :repeat
41
+
42
+ -#.col.col-auto
43
+ -# = f.label :description
44
+ -# .fw{ data: { controller: 'gaco-cms-toggle-field', 'gaco-cms-toggle-field-open-value': group.description_data.values.any?(&:present?) } }
45
+ -# = f.text_area :description, value: group.description_data.to_json, class: 'form-control', data: { controller: 'gaco-cms-translatable' }
46
+
47
+ .col.col-auto
48
+ = f.label :template
49
+ .fw{ data: { controller: 'gaco-cms-toggle-field', 'gaco-cms-toggle-field-open-value': group.template.present? } }
50
+ = f.text_area :template, class: 'form-control'
51
+
52
+ .accordion{ id: "#{accordion_key}_fields", data: { controller: 'gaco-cms-sortable', 'gaco-cms-sortable-handle-value': '.accordion-item .sort-btn', 'gaco-cms-sortable-input-selector-value': '.position-field' } }
53
+ - group.fields.ordered.each do |field|
54
+ = render 'field', field: field, parent_name: name
@@ -0,0 +1,14 @@
1
+ = form_for @record, url: url_for(action: :update, id: @record) , html: { 'data-turbo-request-close-modal': 'true', 'data-turbo-request-reload-frame': params[:reload_frame] } do |_f|
2
+ .text-end.mb-1.sticky-top.bg-white.p-2
3
+ = link_to url_for(action: :group_tpl, record_type: @record.class.name, record_id: @record.id), class: 'btn btn-secondary', data: { controller: 'gaco-cms-remote-content', 'gaco-cms-remote-content-target-value': '#field_groups_list' } do
4
+ %i.fa.fa-plus
5
+ = GacoCms::FieldGroup.human_name
6
+ = button_tag class: 'btn btn-primary ms-2' do
7
+ %i.fa.fa-save
8
+ = GacoCms::FieldGroup.human_name(count: 2)
9
+
10
+ = hidden_field_tag :record_id, params[:record_id]
11
+ = hidden_field_tag :record_type, params[:record_type]
12
+ .accordion#field_groups_list.mb-2{ data: { controller: 'gaco-cms-sortable', 'gaco-cms-sortable-handle-value': '.accordion-item .group-sort-btn', 'gaco-cms-sortable-input-selector-value': '.position-group' } }
13
+ - @groups.each do |group|
14
+ = render 'group', group: group
@@ -0,0 +1,31 @@
1
+ -# locals: { value: Value }
2
+ :ruby
3
+ key = "#{value.id}_#{value.field_id}_#{value.field.field_group_id}_#{Time.current.to_i}"
4
+ name = "field_values_attributes[#{key}]"
5
+
6
+ - field_tpl = capture do
7
+ = fields_for name, value do |f|
8
+ = f.hidden_field :id
9
+ = f.hidden_field :field_id
10
+ = f.hidden_field :group_no
11
+ = f.text_field :position, class: 'd-none position-field'
12
+ = f.check_box :_destroy, class: 'd-none _destroy_field'
13
+ .d-flex.align-items-center
14
+ = required_label f, :title, label: value.field.title, optional: !value.required, class: 'me-2'
15
+ %small
16
+ %code.small= "[#{value.field.key}]"
17
+ - if value.field.description
18
+ .small.text-light.fst-italic= value.field.description
19
+ = render value.field.tpl, value: value, name: name
20
+
21
+ - if value.repeat
22
+ %li.list-group-item.ps-1.pe-1
23
+ .row.align-items-center.gx-2
24
+ .col.field-col= field_tpl
25
+ .col.actions-col.col-auto.text-end{ style: 'max-width: 38px;' }
26
+ = fields_for name, value do |f|
27
+ = f.check_box :_destroy, 'data-controller': 'gaco-cms-deletable_row', 'data-hide-closest': '.list-group-item', 'data-hideonly': value.id, class: '_destroy_field'
28
+ = button_tag class: 'btn btn-sm sort-btn btn-light', type: :button do
29
+ %i.fa.fa-arrows-alt
30
+ - else
31
+ = field_tpl
@@ -0,0 +1,16 @@
1
+ -# locals: { record: Page|Theme }
2
+
3
+ .fieldset_style
4
+ .d-flex.justify-content-end.legend_style
5
+ = link_to gaco_cms_admin_field_groups_manager_index_path(record_type: @page.class.name, record_id: @page.id, reload_frame: '#field-groups-renderer'), class: 'btn btn-sm btn-info', 'data-title': 'Configure Fields', 'data-controller': 'gaco-cms-modal', 'data-gaco-cms-modal-size-value': 'modal-xl' do
6
+ %i.fa.fa-gears
7
+ Configure Fields
8
+
9
+ %turbo-frame{ id: 'field-groups-renderer', src: gaco_cms_admin_field_groups_renderer_index_path(record_type: @page.class.name, record_id: @page.id) }
10
+ .card{ style: 'min-height: 250px' }
11
+ .card-body
12
+ %h5.card-title.placeholder-glow
13
+ %span.placeholder.col-12{ style: 'height: 50px' }
14
+ %p.card-text.placeholder-glow
15
+ %span.placeholder.col-12
16
+ %span.placeholder.col-12
@@ -0,0 +1,24 @@
1
+ -# locals: { group: FieldGroup, field_values: [FieldValue], group_no: Integer }
2
+ - accordion_key = "gaco_cms-field-group#{group.id}-#{group_no}"
3
+ .accordion-item
4
+ - if group.repeat
5
+ .accordion-header
6
+ .accordion-button{'data-bs-target' => "##{accordion_key}", "data-bs-toggle" => "collapse"}
7
+ = check_box_tag :_destroy, '1', false , 'data-controller': 'gaco-cms-deletable_row', 'data-propagate': '._destroy_field', 'data-hide-closest': '.accordion-item', 'data-hideonly': field_values.for_group(group).where(group_no: group_no).any?
8
+
9
+ .accordion-collapse.collapse.show{ id: accordion_key }
10
+ .accordion-body
11
+ %ul.list-group.list-group-flush
12
+ - group.fields.ordered.each.with_index do |field, _i|
13
+ %li.list-group-item{ class: "#{field.repeat ? 'list-group-item-light ps-1 pe-1 border' : 'ps-0 pe-0' }", 'data-kind': field.kind }
14
+ - if field.repeat
15
+ .fields-list{ 'data-controller': 'gaco-cms-repeatable-field' }
16
+ .d-flex.justify-content-end.mb-2
17
+ = link_to url_for(action: :render_field, field_id: field, group_no: group_no), class: 'btn btn-sm btn-outline-primary', 'data-gaco-cms-repeatable-field-target' => 'button' do
18
+ = field.title
19
+ %i.fa.fa-plus-square
20
+ %ul.list-group.list-group-flush{ 'data-gaco-cms-repeatable-field-target': 'list', data: { controller: 'gaco-cms-sortable', 'gaco-cms-sortable-handle-value': '.list-group-item .sort-btn', 'gaco-cms-sortable-input-selector-value': '.position-field' } }
21
+ - field_values.all_or_new_for(field, group_no).each do |value|
22
+ = render 'field', value: value, index: 0
23
+ - else
24
+ = render 'field', value: field_values.all_or_new_for(field, group_no).first, index: 0
@@ -0,0 +1,3 @@
1
+ -# locals { field: Field, f: Form }
2
+ = f.label :def_value
3
+ = f.grouped_collection_select :def_value, GacoCms::PageType.title_ordered.all, :pages, :title, :id, :title, { include_blank: true }, class: 'form-select'
@@ -0,0 +1,3 @@
1
+ -# locals: { value: FieldValue, name: String }
2
+ = fields_for name, value do |f|
3
+ = f.text_field :value, value: value.value_for_input, class: 'form-control', data: { controller: "#{'gaco-cms-translatable' if value.field.translatable} gaco-cms-editor", height: 200 }
@@ -0,0 +1,4 @@
1
+ -# locals: { value: FieldValue, name: String }
2
+ = fields_for name, value do |f|
3
+ .file_panel{ data: { controller: 'gaco-cms-file-input' } }
4
+ = f.text_field :value, value: value.value_for_input, class: 'form-control', data: { 'gaco-cms-file-input-target': 'input', controller: "#{'gaco-cms-translatable' if value.field.translatable}", 'gaco-cms-translatable-closest-clone-value': '.file_panel' }
@@ -0,0 +1,3 @@
1
+ -# locals: { value: FieldValue, name: String }
2
+ = fields_for name, value do |f|
3
+ = f.grouped_collection_select :value, GacoCms::PageType.title_ordered.all, :pages, :title, :id, :title, { include_blank: true, selected: value.value_for_input }, class: 'form-select'
@@ -0,0 +1,3 @@
1
+ -# locals: { value: FieldValue, name: String }
2
+ = fields_for name, value do |f|
3
+ = f.text_area :value, value: value.value_for_input, class: 'form-control', data: { controller: "#{'gaco-cms-translatable' if value.field.translatable}" }
@@ -0,0 +1,3 @@
1
+ -# locals: { value: FieldValue, name: String }
2
+ = fields_for name, value do |f|
3
+ = f.text_field :value, value: value.value_for_input, class: 'form-control', data: { controller: "#{'gaco-cms-translatable' if value.field.translatable}" }
@@ -0,0 +1,20 @@
1
+ - @groups.ordered.each do |group|
2
+ .card.fields-list.mb-4{ 'data-controller': 'gaco-cms-repeatable-field' }
3
+ .card-header
4
+ .d-flex.justify-content-between
5
+ .title
6
+ %h4= group.title
7
+ - if group.description.present?
8
+ .small.italic.text-light= group.description
9
+ - if group.repeat
10
+ .btns
11
+ %small
12
+ %code.small= "[#{group.key}]"
13
+ = link_to url_for(action: :render_group, group_id: group), class: 'btn btn-sm btn-outline-primary', 'data-gaco-cms-repeatable-field-target' => 'button' do
14
+ %i.fa.fa-plus-square
15
+ .accordion{ 'data-gaco-cms-repeatable-field-target': 'list' }
16
+ - (@record.field_values.group_nos_for(group).presence || [999]).each do |group_no|
17
+ = render 'group', group: group, field_values: @record.field_values.eager_load(:field), group_no: group_no
18
+
19
+ -# - if @groups.none?
20
+ -# .alert.alert-info Fields not assigned yet
@@ -0,0 +1,27 @@
1
+ %h2= form_title(@page_type)
2
+ .row
3
+ = form_for(@page_type, url: url_for(action: @page_type.new_record? ? :create : :update), html: { enctype: 'multipart/form-data', class: 'col-4 col-xs-12' }) do |f|
4
+ .field.mb-2
5
+ = f.label :title
6
+ = f.text_field :title, value: @page_type.title_data.to_json, class: 'form-control', required: true, data: { controller: 'gaco-cms-translatable' }
7
+ .field.mb-2
8
+ = f.label :key
9
+ = f.text_field :key, class: 'form-control', required: true
10
+ .field.mb-2
11
+ = f.label :template
12
+ .fw{ data: { controller: 'gaco-cms-toggle-field', 'gaco-cms-toggle-field-open-value': @page_type.template.present? } }
13
+ = f.text_area :template, class: 'form-control', data: { controller: 'gaco-cms-editor', height: 500 }
14
+
15
+ .field.mb-2.text-end
16
+ = link_to url_for(action: :index), class: 'btn btn-secondary me-3' do
17
+ Cancel
18
+
19
+ = button_tag class: 'btn btn-primary' do
20
+ Save
21
+ %i.fa.fa-save
22
+
23
+ .col-8
24
+ .fieldset_style.mt-0
25
+ .d-flex.justify-content-end.legend_style
26
+ %span.bg-white Custom Fields
27
+ %turbo-frame{ id: 'field-groups-renderer-parent', src: gaco_cms_admin_field_groups_manager_index_path(record_type: @page_type.class.name, record_id: @page_type.id, reload_frame: '#field-groups-renderer-parent') }
@@ -0,0 +1,27 @@
1
+ %h1= GacoCms::PageType.human_name(count: 2)
2
+
3
+ .text-end
4
+ = link_to(url_for(action: :new), class: 'btn btn-small btn-primary') do
5
+ = GacoCms::PageType.human_name
6
+ %i.fa.fa-plus
7
+
8
+ %table.table.table-striped
9
+ %thead
10
+ %tr
11
+ %th= GacoCms::PageType.attr_label(:key)
12
+ %th= GacoCms::PageType.attr_label(:title)
13
+ %th= GacoCms::PageType.attr_label(:pages)
14
+ %th
15
+
16
+ %tbody
17
+ - @page_types.each do |page_type|
18
+ %tr
19
+ %td= page_type.key
20
+ %td= page_type.title
21
+ %td= page_type.pages.count
22
+ %td.text-end{ style: 'white-space: nowrap;' }
23
+ = link_to gaco_cms_admin_page_type_pages_path(page_type_id: page_type), class: 'btn btn-secondary btn-sm me-1' do
24
+ = GacoCms::Page.human_name(count: 2)
25
+ %i.fa.fa-list
26
+ = link_to '<i class="fa fa-pencil"></i>'.html_safe, url_for(action: :edit, id: page_type), class: 'btn btn-secondary btn-sm'
27
+ = button_to '<i class="fa fa-trash"></i>'.html_safe, url_for(action: :destroy, id: page_type), class: 'btn btn-danger btn-sm', form_class: 'd-inline', method: :delete, data: { controller: 'form-confirm', confirm: 'Are you sure?' }
@@ -0,0 +1,57 @@
1
+ %h2= form_title(@page)
2
+ = form_for(@page, url: url_for(action: :update), html: { enctype: 'multipart/form-data', class: 'row mb-4', 'data-turbo-request-reload-frame': '#page_iframe,#field-groups-renderer,#field-groups-renderer-parent' }) do |f|
3
+ .col-4.col-xs-12.border-end
4
+ .text-end.sticky-top.bg-white.pb-2.mb-2
5
+ = link_to url_for(action: :index), class: 'btn btn-secondary me-2' do
6
+ Cancel
7
+ = button_tag class: 'btn btn-primary' do
8
+ Save
9
+ %i.fa.fa-save
10
+
11
+ .row.mb-2
12
+ .col.col-auto
13
+ = f.label :key
14
+ .fw{ data: { controller: 'gaco-cms-toggle-field' } }
15
+ = f.text_field :key, class: 'form-control', required: true
16
+ .col
17
+ = f.label :title
18
+ = f.text_field :title, value: @page.title_data.to_json, class: 'form-control', required: true, data: { controller: 'gaco-cms-translatable' }
19
+
20
+ .field.mb-2
21
+ = f.label :content
22
+ = f.text_area :content, value: @page.content_data.to_json, class: 'form-control', required: true, data: { controller: 'gaco-cms-translatable gaco-cms-editor', height: '300px' }
23
+
24
+ .row.mb-2
25
+ .col.col-6
26
+ = f.label :template
27
+ .fw{ data: { controller: 'gaco-cms-toggle-field' } }
28
+ = f.text_area :template, class: 'form-control', data: { controller: 'gaco-cms-editor', height: '400' }
29
+
30
+ .col.col-6
31
+ = f.label :summary
32
+ .fw{ data: { controller: 'gaco-cms-toggle-field' } }
33
+ = f.text_area :summary, value: @page.summary_data.to_json, class: 'form-control', data: { controller: 'gaco-cms-translatable' }
34
+
35
+ .field.mb-2
36
+ = f.label :photo_url
37
+ .photo_panel{ data: { controller: 'gaco-cms-file-input' } }
38
+ = f.text_field :photo_url, class: 'form-control', accept: 'image/*', data: { 'gaco-cms-file-input-target': 'input' }
39
+
40
+ .fieldset_style
41
+ .d-flex.justify-content-end.legend_style
42
+ %span.bg-white.px-1 Page Fields
43
+ = link_to gaco_cms_admin_field_groups_manager_index_path(record_type: @page.class.name, record_id: @page.id, reload_frame: '#field-groups-renderer'), class: 'btn btn-sm btn-info', 'data-title': 'Configure Fields', 'data-controller': 'gaco-cms-modal', 'data-gaco-cms-modal-size-value': 'modal-xl' do
44
+ %i.fa.fa-pencil
45
+ %turbo-frame{ id: 'field-groups-renderer', src: gaco_cms_admin_field_groups_renderer_index_path(record_type: @page.class.name, record_id: @page.id) }
46
+
47
+ - if @page.page_type.field_groups.any?
48
+ .fieldset_style
49
+ .d-flex.justify-content-end.legend_style
50
+ %span.bg-white.px-1 Inherited Fields
51
+ = link_to gaco_cms_admin_field_groups_manager_index_path(record_type: @page.page_type.class.name, record_id: @page.page_type_id, reload_frame: '#field-groups-renderer-parent'), class: 'btn btn-sm btn-info', 'data-title': 'Configure Parent Fields', 'data-controller': 'gaco-cms-modal', 'data-gaco-cms-modal-size-value': 'modal-xl' do
52
+ %i.fa.fa-pencil
53
+
54
+ %turbo-frame{ id: 'field-groups-renderer-parent', src: gaco_cms_admin_field_groups_renderer_index_path(record_type: @page.class.name, record_id: @page.id, parent: true ) }
55
+
56
+ .col.col-8
57
+ %iframe{ src: page_url_for(@page.id), width: '100%', height: '100%', id: 'page_iframe' }
@@ -0,0 +1,23 @@
1
+ %h1= GacoCms::Page.human_name(count: 2)
2
+
3
+ .text-end
4
+ = link_to(url_for(action: :new), class: 'btn btn-small btn-primary', 'data-controller': 'gaco-cms-modal') do
5
+ = GacoCms::Page.human_name
6
+ %i.fa.fa-plus
7
+
8
+ %table.table.table-striped
9
+ %thead
10
+ %tr
11
+ %th= GacoCms::Page.attr_label(:key)
12
+ %th= GacoCms::Page.attr_label(:title)
13
+ %th
14
+
15
+ %tbody
16
+ - @pages.each do |page|
17
+ %tr
18
+ %td= page.key
19
+ %td= page.title
20
+ %td.text-end{ style: 'white-space: nowrap;' }
21
+ = link_to '<i class="fa fa-pencil"></i>'.html_safe, url_for(action: :edit, id: page), class: 'btn btn-primary btn-sm'
22
+ = button_to '<i class="fa fa-trash"></i>'.html_safe, url_for(action: :destroy, id: page), class: 'btn btn-danger btn-sm', form_class: 'd-inline', method: :delete, data: { controller: 'form-confirm', confirm: 'Are you sure?' }
23
+ = link_to '<i class="fa fa-eye"></i>'.html_safe, page_url_for(page.id), class: 'btn btn-sm btn-secondary', target: '_blank'
@@ -0,0 +1,16 @@
1
+ %h2= form_title(@page)
2
+ = form_for(@page, url: url_for(action: :create), html: { 'data-turbo-frame': '_top', 'data-turbo-request-close-modal': 'true' }) do |f|
3
+ .row.mb-2
4
+ .col.col-auto
5
+ = f.label :key
6
+ = f.text_field :key, class: 'form-control', required: true
7
+ .col
8
+ = f.label :title
9
+ = f.text_field :title, value: @page.title_data.to_json, class: 'form-control', required: true, data: { controller: 'gaco-cms-translatable' }
10
+
11
+ .field.text-end
12
+ = button_tag class: 'btn btn-primary' do
13
+ Save
14
+ %i.fa.fa-save
15
+
16
+
@@ -0,0 +1,36 @@
1
+ .row
2
+ .col-4.col-xs-12
3
+ %h2= form_title(@theme)
4
+ = form_for(@theme, url: url_for(action: :update), html: { enctype: 'multipart/form-data', 'data-turbo-request-reload-frame': '#theme_iframe,#field-groups-renderer' }) do |f|
5
+ .row
6
+ .col
7
+ = f.label :key
8
+ .fw{ data: { controller: 'gaco-cms-toggle-field' } }
9
+ = f.text_field :key, class: 'form-control', required: true
10
+ .col.col-auto
11
+ = f.label :title
12
+ = f.text_field :title, class: 'form-control', required: true
13
+ .col.col-auto
14
+ = f.label :active
15
+ %br
16
+ = f.check_box :active
17
+
18
+ .sticky-top.bg-white.p-1
19
+ .text-end
20
+ = link_to url_for(action: :index), class: 'btn btn-secondary me-2' do
21
+ Cancel
22
+ = button_tag class: 'btn btn-primary' do
23
+ Save
24
+ %i.fa.fa-save
25
+ %hr
26
+
27
+ .fieldset_style
28
+ .d-flex.justify-content-end.legend_style
29
+ = link_to gaco_cms_admin_field_groups_manager_index_path(record_type: @theme.class.name, record_id: @theme.id, reload_frame: '#field-groups-renderer'), class: 'btn btn-sm btn-info', 'data-title': 'Configure Fields', 'data-controller': 'gaco-cms-modal', 'data-gaco-cms-modal-size-value': 'modal-xl' do
30
+ %i.fa.fa-gears
31
+ Configure Fields
32
+ %turbo-frame{ id: 'field-groups-renderer', src: gaco_cms_admin_field_groups_renderer_index_path(record_type: @theme.class.name, record_id: @theme.id) }
33
+
34
+ .col.col-8
35
+ %iframe{ src: gaco_cms_path, width: '100%', height: '2000px', id: 'theme_iframe' }
36
+
@@ -0,0 +1,24 @@
1
+ %h1= GacoCms::Theme.human_name(count: 2)
2
+
3
+ .text-end
4
+ = link_to(url_for(action: :new), class: 'btn btn-small btn-primary', 'data-controller': 'gaco-cms-modal') do
5
+ = GacoCms::Theme.human_name
6
+ %i.fa.fa-plus
7
+
8
+ %table.table.table-striped
9
+ %thead
10
+ %tr
11
+ %th= GacoCms::Theme.attr_label(:key)
12
+ %th= GacoCms::Theme.attr_label(:title)
13
+ %th= GacoCms::Theme.attr_label(:active)
14
+ %th
15
+
16
+ %tbody
17
+ - @themes.each do |theme|
18
+ %tr
19
+ %td= theme.key
20
+ %td= theme.title
21
+ %td= theme.active
22
+ %td.text-end{ style: 'white-space: nowrap;' }
23
+ = link_to '<i class="fa fa-pencil"></i>'.html_safe, url_for(action: :edit, id: theme), class: 'btn btn-primary btn-sm'
24
+ = button_to '<i class="fa fa-trash"></i>'.html_safe, url_for(action: :destroy, id: theme), class: 'btn btn-danger btn-sm', form_class: 'd-inline', method: :delete, data: { controller: 'form-confirm', confirm: 'Are you sure?' }
@@ -0,0 +1,21 @@
1
+ %h2= form_title(@theme)
2
+ = form_for(@theme, url: url_for(action: :create), html: { enctype: 'multipart/form-data', 'data-turbo-frame': '_top', 'data-turbo-request-close-modal': 'true' }) do |f|
3
+ .field.mb-2
4
+ = f.label :title
5
+ = f.text_field :title, class: 'form-control', required: true
6
+
7
+ .field.mb-2
8
+ = f.label :key
9
+ = f.text_field :key, class: 'form-control', required: true
10
+
11
+ .field.mb-2
12
+ = f.label :active
13
+ %br
14
+ = f.check_box :active
15
+
16
+ .field.text-end
17
+ = button_tag class: 'btn btn-primary' do
18
+ Save
19
+ %i.fa.fa-save
20
+
21
+
@@ -0,0 +1,7 @@
1
+ %ol.breadcrumb.mb-0.small
2
+ - @breadcrumbs.each do |item|
3
+ - label = item[0].is_a?(String) ? item[0] : t("breadcrumbs.#{Array(item.first).join('.')}")
4
+ - if @breadcrumbs.last == item
5
+ %li.breadcrumb-item.active= label
6
+ - else
7
+ %li.breadcrumb-item= link_to(label, item[1], class: 'link-light')
@@ -0,0 +1,13 @@
1
+ - flash.each do |msg_type, message|
2
+ :ruby
3
+ if %i[alert error].include?(msg_type.to_sym)
4
+ flash_class = 'bg-danger'
5
+ elsif %i[warning warn].include?(msg_type.to_sym)
6
+ flash_class = 'bg-danger'
7
+ else
8
+ flash_class = 'bg-success'
9
+ end
10
+ .toast.align-items-center.text-white.border-0.fade.show{"data-bs-autohide" => "true", class: flash_class}
11
+ .d-flex
12
+ .toast-body= message
13
+ %button.btn-close.btn-close-white.me-2.m-auto{"aria-label" => "Close", "data-bs-dismiss" => "toast", type: "button"}
@@ -0,0 +1,55 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ = display_meta_tags site: 'Gaco CMS'
5
+ %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
6
+ %meta{:content => "width=device-width,initial-scale=1", :name => "viewport"}/
7
+ = csrf_meta_tags
8
+ = csp_meta_tag
9
+ = stylesheet_link_tag 'gaco_cms'
10
+ = javascript_include_tag 'gaco_cms'
11
+ = javascript_tag "window.locale = '#{I18n.locale}'; window.gaco_cms_config = { \"locale\": '#{I18n.locale}', \"locales\": #{GacoCms::Config.locales.to_json}, \"editor_css\": '#{instance_eval(&GacoCms::Config.backend_editor_css)}', upload_path: '#{gaco_cms_admin_upload_file_path(format: :json)}' };";
12
+
13
+ %body#body
14
+ #header
15
+ -########### Second NavBar
16
+ %nav.navbar.navbar-expand-lg.shadow.text-white.bg-primary.navbar-dark
17
+ .container
18
+ %a.navbar-brand.logo.p-0.d-flex{href: gaco_cms_admin_path, style: 'font-size: 32px;'}
19
+ %span.text-black Gaco
20
+ %span.text-white Cms
21
+ %button.navbar-toggler{"aria-controls" => "navbarSupportedContent", "aria-expanded" => "false", "aria-label" => "Toggle navigation", "data-bs-target" => "#main_nav_bar", "data-bs-toggle" => "collapse", :type => "button"}
22
+ %span.fa.fa-bars
23
+
24
+ #main_nav_bar.collapse.navbar-collapse.justify-content-end.text-white-50
25
+ %ul.navbar-nav
26
+ - GacoCms::PageType.all.title_ordered.each do |ptype|
27
+ %li.nav-item.dropdown
28
+ %button.btn.dropdown-toggle.nav-link{"data-bs-toggle" => "dropdown", type: "button"}= ptype.title
29
+ %ul.dropdown-menu{"aria-labelledby" => "dropdownMenuButton1"}
30
+ %li
31
+ %a.dropdown-item{href: gaco_cms_admin_page_type_pages_path(page_type_id: ptype)} List
32
+ %li
33
+ %a.dropdown-item{href: new_gaco_cms_admin_page_type_page_path(page_type_id: ptype)} Add New
34
+ %li.nav-item
35
+ .vr.bg-black{ style: 'height: 100%' }
36
+ %li.nav-item
37
+ %a.nav-link{href: gaco_cms_admin_page_types_path}= GacoCms::PageType.human_name(count: 2)
38
+ %li.nav-item
39
+ %a.nav-link{href: gaco_cms_admin_themes_path}= GacoCms::Theme.human_name(count: 2)
40
+
41
+
42
+ -########## Breadcrumbs
43
+ #breadcrumb_panel.d-flex.justify-content-end.container.pt-1
44
+ %nav{style: '--bs-breadcrumb-divider: "»";'}= render '/layouts/gaco_cms/breadcrumb'
45
+
46
+ #main-progress-bar.progress.fixed-top.invisible{ style: 'z-index: 99999' }
47
+ .progress-bar.progress-bar-striped.progress-bar-animated{role: "progressbar", style: "width: 100%"}
48
+ #toasts.toast-container.position-fixed.p-3.bottom-0.end-0{ style: 'z-index: 99999' }
49
+ = render '/layouts/gaco_cms/flash_messages'
50
+
51
+ #container.container.pt-3
52
+ = yield
53
+ = turbo_frame_tag :turbo_frame_none
54
+
55
+ = render '/rails_hotreload/stream', custom_style: 'left: 20px; bottom: 20px;' if Rails.env.development?