gaco_cms 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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?