gaco_cms 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +48 -0
- data/Rakefile +10 -0
- data/app/assets/builds/gaco_cms.css +18257 -0
- data/app/assets/builds/gaco_cms.js +43235 -0
- data/app/assets/builds/gaco_cms.js.map +7 -0
- data/app/assets/builds/gaco_cms_front.css +18237 -0
- data/app/assets/builds/gaco_cms_front.js +10722 -0
- data/app/assets/builds/gaco_cms_front.js.map +7 -0
- data/app/assets/javascripts/gaco_cms/base.js +24 -0
- data/app/assets/javascripts/gaco_cms/controllers/confirm_controller.ts +20 -0
- data/app/assets/javascripts/gaco_cms/controllers/deletable_row_controller.ts +46 -0
- data/app/assets/javascripts/gaco_cms/controllers/editor_controller.ts +58 -0
- data/app/assets/javascripts/gaco_cms/controllers/file_input_controller.ts +82 -0
- data/app/assets/javascripts/gaco_cms/controllers/modal_controller.ts +73 -0
- data/app/assets/javascripts/gaco_cms/controllers/remote_content_controller.ts +27 -0
- data/app/assets/javascripts/gaco_cms/controllers/repeatable_field_controller.ts +26 -0
- data/app/assets/javascripts/gaco_cms/controllers/sortable_controller.ts +27 -0
- data/app/assets/javascripts/gaco_cms/controllers/toggle_field_controller.ts +37 -0
- data/app/assets/javascripts/gaco_cms/controllers/translatable_controller.ts +86 -0
- data/app/assets/javascripts/gaco_cms/lib/progress_bar.ts +7 -0
- data/app/assets/javascripts/gaco_cms/lib/request.ts +21 -0
- data/app/assets/javascripts/gaco_cms/lib/turbo_request.ts +61 -0
- data/app/assets/javascripts/gaco_cms/stimulus.ts +9 -0
- data/app/assets/javascripts/gaco_cms.js +7 -0
- data/app/assets/javascripts/gaco_cms_front.js +3 -0
- data/app/assets/stylesheets/gaco_cms/bootstrap_custom.scss +15 -0
- data/app/assets/stylesheets/gaco_cms/shared.scss +22 -0
- data/app/assets/stylesheets/gaco_cms.css.scss +8 -0
- data/app/assets/stylesheets/gaco_cms_front.css.scss +6 -0
- data/app/controllers/concerns/gaco_cms/turbo_concern.rb +52 -0
- data/app/controllers/gaco_cms/admin/base_controller.rb +20 -0
- data/app/controllers/gaco_cms/admin/field_groups_controller.rb +87 -0
- data/app/controllers/gaco_cms/admin/field_groups_manager_controller.rb +66 -0
- data/app/controllers/gaco_cms/admin/field_groups_renderer_controller.rb +33 -0
- data/app/controllers/gaco_cms/admin/fields_controller.rb +20 -0
- data/app/controllers/gaco_cms/admin/page_types_controller.rb +56 -0
- data/app/controllers/gaco_cms/admin/pages_controller.rb +70 -0
- data/app/controllers/gaco_cms/admin/themes_controller.rb +55 -0
- data/app/controllers/gaco_cms/admin_controller.rb +47 -0
- data/app/controllers/gaco_cms/front_controller.rb +39 -0
- data/app/helpers/gaco_cms/application_helper.rb +26 -0
- data/app/jobs/gaco_cms/application_job.rb +6 -0
- data/app/mailers/gaco_cms/application_mailer.rb +8 -0
- data/app/models/concerns/gaco_cms/fields_assignable.rb +40 -0
- data/app/models/concerns/gaco_cms/union_scope.rb +14 -0
- data/app/models/gaco_cms/application_record.rb +25 -0
- data/app/models/gaco_cms/draft_record.rb +16 -0
- data/app/models/gaco_cms/field.rb +78 -0
- data/app/models/gaco_cms/field_group.rb +55 -0
- data/app/models/gaco_cms/field_value.rb +77 -0
- data/app/models/gaco_cms/media_file.rb +22 -0
- data/app/models/gaco_cms/page.rb +57 -0
- data/app/models/gaco_cms/page_type.rb +38 -0
- data/app/models/gaco_cms/theme.rb +28 -0
- data/app/services/gaco_cms/application_service.rb +33 -0
- data/app/services/gaco_cms/shortcode_parser.rb +217 -0
- data/app/services/gaco_cms/theme_content_generator.rb +55 -0
- data/app/views/gaco_cms/admin/base/index.html.haml +4 -0
- data/app/views/gaco_cms/admin/field_groups_manager/_field.html.haml +53 -0
- data/app/views/gaco_cms/admin/field_groups_manager/_group.html.haml +54 -0
- data/app/views/gaco_cms/admin/field_groups_manager/index.html.haml +14 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/_field.html.haml +31 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/_fields_frame.html.haml +16 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/_group.html.haml +24 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/default_value/_page.html.haml +3 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/fields/_editor.html.haml +3 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/fields/_file.html.haml +4 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/fields/_page.html.haml +3 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/fields/_text_area.html.haml +3 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/fields/_text_field.html.haml +3 -0
- data/app/views/gaco_cms/admin/field_groups_renderer/index.html.haml +20 -0
- data/app/views/gaco_cms/admin/page_types/form.html.haml +27 -0
- data/app/views/gaco_cms/admin/page_types/index.html.haml +27 -0
- data/app/views/gaco_cms/admin/pages/edit.html.haml +57 -0
- data/app/views/gaco_cms/admin/pages/index.html.haml +23 -0
- data/app/views/gaco_cms/admin/pages/new.html.haml +16 -0
- data/app/views/gaco_cms/admin/themes/edit.html.haml +36 -0
- data/app/views/gaco_cms/admin/themes/index.html.haml +24 -0
- data/app/views/gaco_cms/admin/themes/new.html.haml +21 -0
- data/app/views/layouts/gaco_cms/_breadcrumb.html.haml +7 -0
- data/app/views/layouts/gaco_cms/_flash_messages.html.haml +13 -0
- data/app/views/layouts/gaco_cms/admin.haml +55 -0
- data/config/routes.rb +26 -0
- data/db/migrate/20230202133738_create_cms_pages.rb +16 -0
- data/db/migrate/20230202134840_create_cms_field_groups.rb +17 -0
- data/db/migrate/20230202135314_create_cms_fields.rb +21 -0
- data/db/migrate/20230202135739_create_cms_field_values.rb +16 -0
- data/db/migrate/20230202181744_create_cms_media_files.rb +10 -0
- data/db/migrate/20230206231547_create_cms_page_types.rb +23 -0
- data/db/migrate/20230209090008_create_cms_themes.rb +19 -0
- data/lib/gaco_cms/config.rb +19 -0
- data/lib/gaco_cms/engine.rb +31 -0
- data/lib/gaco_cms/version.rb +5 -0
- data/lib/gaco_cms.rb +18 -0
- data/lib/generators/gaco_cms/install_generator.rb +16 -0
- data/lib/generators/gaco_cms/install_template/gaco_cms.rb +11 -0
- data/lib/generators/gaco_cms/install_template/themes/default/index.html.haml +2 -0
- data/lib/generators/gaco_cms/install_template/themes/default/layouts/application.html.haml +34 -0
- data/lib/generators/gaco_cms/install_template/themes/default/page.html.haml +2 -0
- data/lib/tasks/auto_annotate_models.rake +59 -0
- data/lib/tasks/gaco_cms_tasks.rake +5 -0
- 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,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,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,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?
|