lato_cms 3.0.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 (62) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +67 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/config/lato_cms_manifest.js +2 -0
  6. data/app/assets/javascripts/lato_cms/application.js +1 -0
  7. data/app/assets/javascripts/lato_cms/controllers/lato_cms_advanced_editor_controller.js +57 -0
  8. data/app/assets/javascripts/lato_cms/controllers/lato_cms_color_field_controller.js +9 -0
  9. data/app/assets/javascripts/lato_cms/controllers/lato_cms_component_accordion_controller.js +60 -0
  10. data/app/assets/javascripts/lato_cms/controllers/lato_cms_component_form_controller.js +96 -0
  11. data/app/assets/javascripts/lato_cms/controllers/lato_cms_component_toggle_controller.js +89 -0
  12. data/app/assets/javascripts/lato_cms/controllers/lato_cms_gallery_field_controller.js +136 -0
  13. data/app/assets/javascripts/lato_cms/controllers/lato_cms_image_field_controller.js +24 -0
  14. data/app/assets/javascripts/lato_cms/controllers/lato_cms_json_field_controller.js +27 -0
  15. data/app/assets/javascripts/lato_cms/controllers/lato_cms_page_preview_controller.js +86 -0
  16. data/app/assets/javascripts/lato_cms/controllers/lato_cms_text_field_controller.js +74 -0
  17. data/app/assets/stylesheets/lato_cms/application.scss +252 -0
  18. data/app/controllers/lato_cms/api/pages_controller.rb +38 -0
  19. data/app/controllers/lato_cms/application_controller.rb +26 -0
  20. data/app/controllers/lato_cms/pages_controller.rb +194 -0
  21. data/app/helpers/lato_cms/application_helper.rb +4 -0
  22. data/app/helpers/lato_cms/pages_helper.rb +69 -0
  23. data/app/jobs/lato_cms/application_job.rb +4 -0
  24. data/app/mailers/lato_cms/application_mailer.rb +6 -0
  25. data/app/models/lato_cms/page.rb +133 -0
  26. data/app/models/lato_cms/page_field.rb +113 -0
  27. data/app/models/lato_cms/template_manager.rb +64 -0
  28. data/app/views/lato_cms/pages/_component_accordion.html.erb +97 -0
  29. data/app/views/lato_cms/pages/_fields_editor.html.erb +12 -0
  30. data/app/views/lato_cms/pages/_form_create.html.erb +26 -0
  31. data/app/views/lato_cms/pages/_form_update.html.erb +39 -0
  32. data/app/views/lato_cms/pages/create.html.erb +13 -0
  33. data/app/views/lato_cms/pages/fields/_boolean.html.erb +16 -0
  34. data/app/views/lato_cms/pages/fields/_color.html.erb +18 -0
  35. data/app/views/lato_cms/pages/fields/_date.html.erb +16 -0
  36. data/app/views/lato_cms/pages/fields/_datetime.html.erb +16 -0
  37. data/app/views/lato_cms/pages/fields/_file.html.erb +29 -0
  38. data/app/views/lato_cms/pages/fields/_gallery.html.erb +55 -0
  39. data/app/views/lato_cms/pages/fields/_image.html.erb +39 -0
  40. data/app/views/lato_cms/pages/fields/_json.html.erb +23 -0
  41. data/app/views/lato_cms/pages/fields/_multiselect.html.erb +25 -0
  42. data/app/views/lato_cms/pages/fields/_number.html.erb +18 -0
  43. data/app/views/lato_cms/pages/fields/_select.html.erb +23 -0
  44. data/app/views/lato_cms/pages/fields/_string.html.erb +18 -0
  45. data/app/views/lato_cms/pages/fields/_text.html.erb +80 -0
  46. data/app/views/lato_cms/pages/fields/_textarea.html.erb +16 -0
  47. data/app/views/lato_cms/pages/index.html.erb +32 -0
  48. data/app/views/lato_cms/pages/show.html.erb +105 -0
  49. data/app/views/lato_cms/pages/update.html.erb +13 -0
  50. data/config/importmap.rb +2 -0
  51. data/config/locales/en.yml +70 -0
  52. data/config/locales/it.yml +70 -0
  53. data/config/routes.rb +22 -0
  54. data/db/migrate/20250328072343_add_lato_cms_admin_to_lato_user.rb +5 -0
  55. data/db/migrate/20260320070819_create_lato_cms_pages.rb +13 -0
  56. data/db/migrate/20260323171241_create_lato_cms_page_fields.rb +13 -0
  57. data/lib/lato_cms/config.rb +13 -0
  58. data/lib/lato_cms/engine.rb +13 -0
  59. data/lib/lato_cms/version.rb +3 -0
  60. data/lib/lato_cms.rb +15 -0
  61. data/lib/tasks/lato_cms_tasks.rake +183 -0
  62. metadata +158 -0
data/config/routes.rb ADDED
@@ -0,0 +1,22 @@
1
+ LatoCms::Engine.routes.draw do
2
+ root 'application#index'
3
+
4
+ namespace :api do
5
+ scope :pages do
6
+ get '', to: 'pages#index', as: :pages
7
+ get '*id', to: 'pages#show', as: :pages_show
8
+ end
9
+ end
10
+
11
+ scope :pages do
12
+ get '', to: 'pages#index', as: :pages
13
+ get 'create', to: 'pages#create', as: :pages_create
14
+ post 'create', to: 'pages#create_action', as: :pages_create_action
15
+ get ':id', to: 'pages#show', as: :pages_show
16
+ get ':id/update', to: 'pages#update', as: :pages_update
17
+ patch ':id/update', to: 'pages#update_action', as: :pages_update_action
18
+ post ':id/fields', to: 'pages#save_fields_action', as: :pages_save_fields_action
19
+ patch ':id/components/:template_component_id/toggle', to: 'pages#toggle_component_action', as: :pages_toggle_component_action
20
+ delete ':id', to: 'pages#destroy_action', as: :pages_destroy_action
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ class AddLatoCmsAdminToLatoUser < ActiveRecord::Migration[7.1]
2
+ def change
3
+ add_column :lato_users, :lato_cms_admin, :boolean, default: false
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateLatoCmsPages < ActiveRecord::Migration[8.1]
2
+ def change
3
+ create_table :lato_cms_pages do |t|
4
+ t.string :permalink, null: false, index: true
5
+ t.string :locale, null: false, index: true
6
+ t.string :title, null: false
7
+ t.string :frontend_url
8
+ t.string :template_id
9
+ t.json :component_states, default: {}, null: false
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class CreateLatoCmsPageFields < ActiveRecord::Migration[8.1]
2
+ def change
3
+ create_table :lato_cms_page_fields do |t|
4
+ t.references :page, null: false, foreign_key: { to_table: :lato_cms_pages }
5
+ t.string :template_id
6
+ t.string :template_component_id
7
+ t.string :component_id
8
+ t.string :field_id
9
+ t.text :value
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module LatoCms
2
+ # Config
3
+ # This class contains the default configuration of the engine.
4
+ ##
5
+ class Config
6
+ attr_accessor :locales, :templates_path
7
+
8
+ def initialize
9
+ @locales = [:en]
10
+ @templates_path = 'config/lato_cms'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module LatoCms
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace LatoCms
4
+
5
+ initializer 'lato_cms.importmap', before: 'importmap' do |app|
6
+ app.config.importmap.paths << root.join('config/importmap.rb')
7
+ end
8
+
9
+ initializer "lato_cms.precompile" do |app|
10
+ app.config.assets.precompile << "lato_cms_manifest.js"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module LatoCms
2
+ VERSION = "3.0.0"
3
+ end
data/lib/lato_cms.rb ADDED
@@ -0,0 +1,15 @@
1
+ require "lato_cms/version"
2
+ require "lato_cms/engine"
3
+ require "lato_cms/config"
4
+
5
+ module LatoCms
6
+ class << self
7
+ def config
8
+ @config ||= Config.new
9
+ end
10
+
11
+ def configure
12
+ yield config
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,183 @@
1
+ require 'fileutils'
2
+
3
+ namespace :lato_cms do
4
+ namespace :install do
5
+ desc 'Install Lato CMS engine and create example templates'
6
+ # Usage: rails lato_cms:install:application
7
+ task application: :environment do
8
+ base_path = Rails.root.join('config', 'lato_cms')
9
+ templates_path = base_path.join('templates')
10
+ components_path = base_path.join('components')
11
+
12
+ FileUtils.mkdir_p(templates_path)
13
+ FileUtils.mkdir_p(components_path)
14
+
15
+ # Create example component
16
+ component_file = components_path.join('hero.yml')
17
+ unless File.exist?(component_file)
18
+ File.write(component_file, <<~YAML)
19
+ id: hero
20
+ name: Hero Section
21
+ fields:
22
+ title:
23
+ name: Title
24
+ type: string
25
+ required: true
26
+ settings:
27
+ placeholder: "Enter the hero title"
28
+ subtitle:
29
+ name: Subtitle
30
+ type: textarea
31
+ required: false
32
+ settings:
33
+ rows: 3
34
+ placeholder: "Enter a subtitle"
35
+ image:
36
+ name: Background Image
37
+ type: file
38
+ required: false
39
+ settings:
40
+ accept: "image/*"
41
+ YAML
42
+ puts "Created #{component_file}"
43
+ else
44
+ puts "Skipped #{component_file} (already exists)"
45
+ end
46
+
47
+ # Create example template
48
+ template_file = templates_path.join('homepage.yml')
49
+ unless File.exist?(template_file)
50
+ File.write(template_file, <<~YAML)
51
+ id: homepage
52
+ name: Homepage
53
+ components:
54
+ hero_section:
55
+ component_id: hero
56
+ name: Hero Section
57
+ YAML
58
+ puts "Created #{template_file}"
59
+ else
60
+ puts "Skipped #{template_file} (already exists)"
61
+ end
62
+
63
+ puts ""
64
+ puts "Lato CMS templates installed in #{base_path}"
65
+ puts " Templates: #{templates_path}"
66
+ puts " Components: #{components_path}"
67
+ end
68
+ end
69
+
70
+ namespace :generate do
71
+ desc 'Generate a new template YAML file'
72
+ # Usage: rails "lato_cms:generate:template[template_name]"
73
+ task :template, [:name] => :environment do |_t, args|
74
+ name = args[:name]
75
+ abort "Usage: rails \"lato_cms:generate:template[template_name]\"" if name.blank?
76
+
77
+ templates_path = Rails.root.join(LatoCms.config.templates_path, 'templates')
78
+ FileUtils.mkdir_p(templates_path)
79
+
80
+ id = name.parameterize(separator: '_')
81
+ file = templates_path.join("#{id}.yml")
82
+
83
+ abort "Template file already exists: #{file}" if File.exist?(file)
84
+
85
+ File.write(file, <<~YAML)
86
+ id: #{id}
87
+ name: #{name.titleize}
88
+ components: {}
89
+ YAML
90
+
91
+ puts "Created template: #{file}"
92
+ end
93
+
94
+ desc 'Generate a new component YAML file'
95
+ # Usage: rails "lato_cms:generate:component[component_name,field_id:type,field_id:type]"
96
+ task :component, [:name] => :environment do |_t, args|
97
+ name = args[:name]
98
+ abort "Usage: rails \"lato_cms:generate:component[component_name,field_id:type,...]\"" if name.blank?
99
+
100
+ components_path = Rails.root.join(LatoCms.config.templates_path, 'components')
101
+ FileUtils.mkdir_p(components_path)
102
+
103
+ id = name.parameterize(separator: '_')
104
+ file = components_path.join("#{id}.yml")
105
+
106
+ abort "Component file already exists: #{file}" if File.exist?(file)
107
+
108
+ valid_types = %w[string textarea file number date datetime boolean select multiselect color json text]
109
+
110
+ # Parse field pairs from extra args
111
+ fields = {}
112
+ (args.extras || []).each do |arg|
113
+ parts = arg.split(':')
114
+ next unless parts.length == 2
115
+
116
+ field_id = parts[0].parameterize(separator: '_')
117
+ field_type = parts[1]
118
+ field_type = 'string' unless valid_types.include?(field_type)
119
+
120
+ fields[field_id] = {
121
+ 'name' => field_id.humanize,
122
+ 'type' => field_type,
123
+ 'required' => false
124
+ }
125
+ end
126
+
127
+ if fields.empty?
128
+ fields['example_field'] = {
129
+ 'name' => 'Example Field',
130
+ 'type' => 'string',
131
+ 'required' => false
132
+ }
133
+ end
134
+
135
+ yaml_content = {
136
+ 'id' => id,
137
+ 'name' => name.titleize,
138
+ 'fields' => fields
139
+ }
140
+
141
+ File.write(file, yaml_content.to_yaml)
142
+ puts "Created component: #{file}"
143
+ end
144
+
145
+ desc 'Generate custom field partial in host app'
146
+ # Usage: rails "lato_cms:generate:custom_field[field_name]"
147
+ task :custom_field, [:name] => :environment do |_t, args|
148
+ name = args[:name]
149
+ abort "Usage: rails \"lato_cms:generate:custom_field[field_name]\"" if name.blank?
150
+
151
+ field_id = name.parameterize(separator: '_')
152
+ views_path = Rails.root.join('app', 'views', 'lato_cms', 'custom_fields')
153
+ FileUtils.mkdir_p(views_path)
154
+
155
+ file = views_path.join("_#{field_id}.html.erb")
156
+ abort "Custom field partial already exists: #{file}" if File.exist?(file)
157
+
158
+ File.write(file, <<~ERB)
159
+ <% label = field_config['name'] || field_id.humanize %>
160
+ <% required = field_config['required'] == true %>
161
+ <% settings = field_config['settings'] || {} %>
162
+ <% current_value = page_field&.value.to_s %>
163
+
164
+ <label class="form-label" for="fields_<%= field_id %>_value">
165
+ <%= label %><%= ' *' if required %>
166
+ </label>
167
+
168
+ <input type="text"
169
+ class="form-control"
170
+ name="fields[<%= field_id %>][value]"
171
+ id="fields_<%= field_id %>_value"
172
+ value="<%= current_value %>"
173
+ <%= 'required' if required %>
174
+ placeholder="<%= settings['placeholder'] %>">
175
+ ERB
176
+
177
+ puts "Created custom field partial: #{file}"
178
+ puts "Use in component YAML:"
179
+ puts " type: custom"
180
+ puts " render: lato_cms/custom_fields/#{field_id}"
181
+ end
182
+ end
183
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lato_cms
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Gregorio Galante
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 7.1.1
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 7.1.1
26
+ - !ruby/object:Gem::Dependency
27
+ name: lato
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: lato_spaces
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: jbuilder
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ description: A Rails engine to manage application users on Lato projects!
69
+ email:
70
+ - me@gregoriogalante.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - MIT-LICENSE
76
+ - README.md
77
+ - Rakefile
78
+ - app/assets/config/lato_cms_manifest.js
79
+ - app/assets/javascripts/lato_cms/application.js
80
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_advanced_editor_controller.js
81
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_color_field_controller.js
82
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_component_accordion_controller.js
83
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_component_form_controller.js
84
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_component_toggle_controller.js
85
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_gallery_field_controller.js
86
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_image_field_controller.js
87
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_json_field_controller.js
88
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_page_preview_controller.js
89
+ - app/assets/javascripts/lato_cms/controllers/lato_cms_text_field_controller.js
90
+ - app/assets/stylesheets/lato_cms/application.scss
91
+ - app/controllers/lato_cms/api/pages_controller.rb
92
+ - app/controllers/lato_cms/application_controller.rb
93
+ - app/controllers/lato_cms/pages_controller.rb
94
+ - app/helpers/lato_cms/application_helper.rb
95
+ - app/helpers/lato_cms/pages_helper.rb
96
+ - app/jobs/lato_cms/application_job.rb
97
+ - app/mailers/lato_cms/application_mailer.rb
98
+ - app/models/lato_cms/page.rb
99
+ - app/models/lato_cms/page_field.rb
100
+ - app/models/lato_cms/template_manager.rb
101
+ - app/views/lato_cms/pages/_component_accordion.html.erb
102
+ - app/views/lato_cms/pages/_fields_editor.html.erb
103
+ - app/views/lato_cms/pages/_form_create.html.erb
104
+ - app/views/lato_cms/pages/_form_update.html.erb
105
+ - app/views/lato_cms/pages/create.html.erb
106
+ - app/views/lato_cms/pages/fields/_boolean.html.erb
107
+ - app/views/lato_cms/pages/fields/_color.html.erb
108
+ - app/views/lato_cms/pages/fields/_date.html.erb
109
+ - app/views/lato_cms/pages/fields/_datetime.html.erb
110
+ - app/views/lato_cms/pages/fields/_file.html.erb
111
+ - app/views/lato_cms/pages/fields/_gallery.html.erb
112
+ - app/views/lato_cms/pages/fields/_image.html.erb
113
+ - app/views/lato_cms/pages/fields/_json.html.erb
114
+ - app/views/lato_cms/pages/fields/_multiselect.html.erb
115
+ - app/views/lato_cms/pages/fields/_number.html.erb
116
+ - app/views/lato_cms/pages/fields/_select.html.erb
117
+ - app/views/lato_cms/pages/fields/_string.html.erb
118
+ - app/views/lato_cms/pages/fields/_text.html.erb
119
+ - app/views/lato_cms/pages/fields/_textarea.html.erb
120
+ - app/views/lato_cms/pages/index.html.erb
121
+ - app/views/lato_cms/pages/show.html.erb
122
+ - app/views/lato_cms/pages/update.html.erb
123
+ - config/importmap.rb
124
+ - config/locales/en.yml
125
+ - config/locales/it.yml
126
+ - config/routes.rb
127
+ - db/migrate/20250328072343_add_lato_cms_admin_to_lato_user.rb
128
+ - db/migrate/20260320070819_create_lato_cms_pages.rb
129
+ - db/migrate/20260323171241_create_lato_cms_page_fields.rb
130
+ - lib/lato_cms.rb
131
+ - lib/lato_cms/config.rb
132
+ - lib/lato_cms/engine.rb
133
+ - lib/lato_cms/version.rb
134
+ - lib/tasks/lato_cms_tasks.rake
135
+ homepage: https://github.com/Lato-org/lato_cms
136
+ licenses:
137
+ - MIT
138
+ metadata:
139
+ homepage_uri: https://github.com/Lato-org/lato_cms
140
+ source_code_uri: https://github.com/Lato-org/lato_cms
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubygems_version: 4.0.9
156
+ specification_version: 4
157
+ summary: Another engine for Lato projects
158
+ test_files: []