kcy_comfy_blog 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.github/issue_template.md +22 -0
  3. data/.github/pull_request_template.md +6 -0
  4. data/.gitignore +16 -0
  5. data/.rubocop.yml +96 -0
  6. data/.travis.yml +21 -0
  7. data/CONTRIBUTING.md +32 -0
  8. data/Gemfile +27 -0
  9. data/LICENSE +20 -0
  10. data/README.md +42 -0
  11. data/Rakefile +5 -0
  12. data/app/controllers/comfy/admin/blog/posts_controller.rb +84 -0
  13. data/app/controllers/comfy/admin/blog/revisions/post_controller.rb +30 -0
  14. data/app/controllers/comfy/blog/posts_controller.rb +50 -0
  15. data/app/models/comfy/blog/post.rb +55 -0
  16. data/app/views/comfy/admin/blog/partials/_navigation.html.haml +4 -0
  17. data/app/views/comfy/admin/blog/posts/_form.html.haml +22 -0
  18. data/app/views/comfy/admin/blog/posts/edit.html.haml +9 -0
  19. data/app/views/comfy/admin/blog/posts/index.html.haml +37 -0
  20. data/app/views/comfy/admin/blog/posts/new.html.haml +5 -0
  21. data/app/views/comfy/blog/posts/index.html.haml +28 -0
  22. data/app/views/comfy/blog/posts/index.rss.builder +22 -0
  23. data/app/views/comfy/blog/posts/show.html.haml +8 -0
  24. data/app/views/layouts/comfy/blog/application.html.erb +22 -0
  25. data/bin/bundle +3 -0
  26. data/bin/rails +4 -0
  27. data/bin/rake +4 -0
  28. data/bin/setup +36 -0
  29. data/bin/update +31 -0
  30. data/bin/yarn +11 -0
  31. data/comfy_blog.gemspec +29 -0
  32. data/config.ru +6 -0
  33. data/config/application.rb +39 -0
  34. data/config/blog_routes.rb +8 -0
  35. data/config/boot.rb +7 -0
  36. data/config/database.yml +11 -0
  37. data/config/environment.rb +7 -0
  38. data/config/environments/development.rb +64 -0
  39. data/config/environments/test.rb +51 -0
  40. data/config/initializers/comfy_blog.rb +9 -0
  41. data/config/locales/ca.yml +38 -0
  42. data/config/locales/cs.yml +38 -0
  43. data/config/locales/da.yml +38 -0
  44. data/config/locales/de.yml +38 -0
  45. data/config/locales/en.yml +38 -0
  46. data/config/locales/es.yml +38 -0
  47. data/config/locales/fi.yml +38 -0
  48. data/config/locales/fr.yml +38 -0
  49. data/config/locales/gr.yml +38 -0
  50. data/config/locales/it.yml +38 -0
  51. data/config/locales/ja.yml +38 -0
  52. data/config/locales/nb.yml +38 -0
  53. data/config/locales/nl.yml +38 -0
  54. data/config/locales/pl.yml +38 -0
  55. data/config/locales/pt-BR.yml +38 -0
  56. data/config/locales/ru.yml +38 -0
  57. data/config/locales/sv.yml +38 -0
  58. data/config/locales/tr.yml +38 -0
  59. data/config/locales/uk.yml +38 -0
  60. data/config/locales/zh-CN.yml +38 -0
  61. data/config/locales/zh-TW.yml +38 -0
  62. data/config/storage.yml +35 -0
  63. data/db/migrate/00_create_cms.rb +167 -0
  64. data/db/migrate/01_create_blog.rb +24 -0
  65. data/lib/comfy_blog.rb +29 -0
  66. data/lib/comfy_blog/configuration.rb +24 -0
  67. data/lib/comfy_blog/engine.rb +32 -0
  68. data/lib/comfy_blog/routes/blog.rb +21 -0
  69. data/lib/comfy_blog/routes/blog_admin.rb +23 -0
  70. data/lib/comfy_blog/routing.rb +4 -0
  71. data/lib/comfy_blog/version.rb +7 -0
  72. data/lib/generators/comfy/blog/README +10 -0
  73. data/lib/generators/comfy/blog/blog_generator.rb +53 -0
  74. metadata +129 -0
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Comfy::Blog::Post < ActiveRecord::Base
4
+
5
+ self.table_name = "comfy_blog_posts"
6
+
7
+ include Comfy::Cms::WithFragments
8
+ include Comfy::Cms::WithCategories
9
+
10
+ cms_has_revisions_for :fragments_attributes
11
+
12
+ # -- Relationships -----------------------------------------------------------
13
+ belongs_to :site,
14
+ class_name: "Comfy::Cms::Site"
15
+
16
+ # -- Validations -------------------------------------------------------------
17
+ validates :title, :slug, :year, :month,
18
+ presence: true
19
+ validates :slug,
20
+ uniqueness: { scope: %i[site_id year month] },
21
+ format: { with: %r{\A%*\w[a-z0-9_%-]*\z}i }
22
+
23
+ # -- Scopes ------------------------------------------------------------------
24
+ scope :published, -> { where(is_published: true) }
25
+ scope :for_year, ->(year) { where(year: year) }
26
+ scope :for_month, ->(month) { where(month: month) }
27
+
28
+ # -- Callbacks ---------------------------------------------------------------
29
+ before_validation :set_slug,
30
+ :set_published_at,
31
+ :set_date
32
+
33
+ # -- Instance Mathods --------------------------------------------------------
34
+ def url(relative: false)
35
+ public_blog_path = ComfyBlog.config.public_blog_path
36
+ post_path = ["/", public_blog_path, year, month, slug].join("/").squeeze("/")
37
+ [site.url(relative: relative), post_path].join
38
+ end
39
+
40
+ protected
41
+
42
+ def set_slug
43
+ self.slug ||= title.to_s.parameterize
44
+ end
45
+
46
+ def set_date
47
+ self.year = published_at.year
48
+ self.month = published_at.month
49
+ end
50
+
51
+ def set_published_at
52
+ self.published_at ||= Time.zone.now
53
+ end
54
+
55
+ end
@@ -0,0 +1,4 @@
1
+ - if @site && @site.persisted?
2
+ %li.nav-item
3
+ = active_link_to comfy_admin_blog_posts_path(@site), class: "nav-link" do
4
+ = t('comfy.admin.cms.base.posts')
@@ -0,0 +1,22 @@
1
+ = comfy_admin_partial "comfy/admin/blog/partials/post_form_before", form: form
2
+
3
+ = form.text_field :title, data: {slugify: @post.new_record?}
4
+ = form.text_field :slug, data: {slug: true}
5
+
6
+ - if (options = ::Comfy::Cms::Layout.options_for_select(@site)).present?
7
+ = form.select :layout_id, options, {}, {data: {url: form_fragments_comfy_admin_blog_post_path(@site, @post.id.to_i)}, id: "fragments-toggle"}
8
+
9
+ #form-fragments-container
10
+ = render "comfy/admin/cms/fragments/form_fragments", record: @post, scope: :post
11
+
12
+ = render "comfy/admin/cms/categories/form", form: form
13
+
14
+ = form.text_field :published_at, value: @post.published_at.try(:to_s, :db), data: {'cms-datetime' => true}
15
+
16
+ = form.check_box :is_published
17
+
18
+ = comfy_admin_partial "comfy/admin/blog/partials/post_form_after", form: form
19
+
20
+ = form.form_actions do
21
+ = submit_tag t(@post.new_record?? ".create" : ".update"), class: "btn btn-primary ml-sm-1", data: {disable_with: false}
22
+ = link_to t(".cancel"), comfy_admin_blog_posts_path(@site, @blog), class: "btn btn-link"
@@ -0,0 +1,9 @@
1
+ - content_for :right_column do
2
+ - link = comfy_admin_blog_post_revisions_path(@site, @post)
3
+ = render "comfy/admin/cms/revisions/sidebar", record: @post, link: link
4
+
5
+ .page-header
6
+ %h2= t('.title')
7
+
8
+ = comfy_form_with model: @post, scope: :post, url: {action: :update}, html: {multipart: true} do |form|
9
+ = render form
@@ -0,0 +1,37 @@
1
+ - content_for :right_column do
2
+ = render "comfy/admin/cms/categories/index", type: "Comfy::Blog::Post"
3
+
4
+ .page-header
5
+ = link_to t('.new_link'), new_comfy_admin_blog_post_path(@site), class: 'btn btn-secondary float-right'
6
+ %h2= t('.title')
7
+
8
+ = comfy_admin_partial "comfy/admin/blog/partials/posts_before"
9
+
10
+ = comfy_paginate @posts
11
+
12
+ %ul.list
13
+ - @posts.each do |post|
14
+ %li
15
+ .row
16
+ .col-md-8.item
17
+ .item-content
18
+ .item-title
19
+ - published_css_class = post.is_published? ? "published" : "draft"
20
+ = link_to post.title, edit_comfy_admin_blog_post_path(@site, post), class: published_css_class
21
+ .item-meta
22
+ - link = post.url
23
+ = link_to link, link, target: "_blank"
24
+ %br
25
+ = post.published_at.try(:to_s, :db)
26
+
27
+ .item-categories.ml-auto.d-flex.align-items-center
28
+ = render "comfy/admin/cms/categories/categories", object: post
29
+
30
+ .col-md-4.d-flex.align-items-center.justify-content-md-end
31
+ .btn-group.btn-group-sm
32
+ = link_to t('.edit'), edit_comfy_admin_blog_post_path(@site, post), class: 'btn btn-outline-secondary'
33
+ = link_to t('.delete'), comfy_admin_blog_post_path(@site, post), method: :delete, data: {confirm: t('.are_you_sure')}, class: 'btn btn-danger'
34
+
35
+ = comfy_paginate @posts
36
+
37
+ = comfy_admin_partial "comfy/admin/blog/partials/posts_after"
@@ -0,0 +1,5 @@
1
+ .page-header
2
+ %h2= t('.title')
3
+
4
+ = comfy_form_with model: @post, scope: :post, url: {action: :create}, html: {multipart: true} do |form|
5
+ = render form
@@ -0,0 +1,28 @@
1
+ .container
2
+ .row
3
+ .col-md-8
4
+ %h1 Blog Posts
5
+
6
+ - @blog_posts.each do |post|
7
+
8
+ %h2
9
+ = link_to post.title, comfy_blog_post_path(@cms_site.path, post.year, post.month, post.slug)
10
+ .date
11
+ = post.published_at.to_s(:db)
12
+
13
+ = comfy_paginate @blog_posts
14
+
15
+ .col-md-4
16
+
17
+ %h3 Archive
18
+ - dates_with_counts = @cms_site.blog_posts.published.group(:year, :month).order(year: :desc, month: :desc).count
19
+ - dates_with_counts.each do |(year, month), count|
20
+ %li
21
+ - date = [I18n.t("date.month_names")[month.to_i], year].join(" ")
22
+ - site_path = @cms_site.url(relative: true)
23
+ = link_to date, comfy_blog_posts_of_month_path(site_path, year: year, month: month)
24
+ %small (#{count})
25
+
26
+ %h3 Tags
27
+ - Comfy::Cms::Category.of_type('Comfy::Blog::Post').all.each do |tag|
28
+ = link_to tag.label, category: tag.label
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ xml.instruct! :xml, version: "1.0"
4
+ xml.rss version: "2.0" do
5
+ xml.channel do
6
+ xml.title "My Blog"
7
+ xml.description "My Blog Description"
8
+ xml.link comfy_blog_posts_url(@cms_site.path)
9
+
10
+ @blog_posts.each do |post|
11
+ url = comfy_blog_post_url(@cms_site.path, post.year, post.month, post.slug)
12
+
13
+ xml.item do
14
+ xml.title post.title
15
+ xml.description "blog post content"
16
+ xml.pubDate post.published_at.to_s(:rfc822)
17
+ xml.link url
18
+ xml.guid url
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ %h1= @cms_post.title
2
+
3
+ %p
4
+ - label = Comfy::Blog::Post.human_attribute_name(:published_on)
5
+ - time = @cms_post.published_at.to_formatted_s(:short)
6
+ = "#{label}: #{time}"
7
+
8
+ = @cms_post.content_cache.html_safe
@@ -0,0 +1,22 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Hello, world!</title>
5
+ <!-- Required meta tags -->
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
8
+
9
+ <!-- Bootstrap CSS -->
10
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
11
+ </head>
12
+ <body>
13
+
14
+ <%= yield %>
15
+
16
+ <!-- Optional JavaScript -->
17
+ <!-- jQuery first, then Popper.js, then Bootstrap JS -->
18
+ <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
19
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
20
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
21
+ </body>
22
+ </html>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../config/application', __dir__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+ include FileUtils
4
+
5
+ # path to your application root.
6
+ APP_ROOT = File.expand_path('..', __dir__)
7
+
8
+ def system!(*args)
9
+ system(*args) || abort("\n== Command #{args} failed ==")
10
+ end
11
+
12
+ chdir APP_ROOT do
13
+ # This script is a starting point to setup your application.
14
+ # Add necessary setup steps to this file.
15
+
16
+ puts '== Installing dependencies =='
17
+ system! 'gem install bundler --conservative'
18
+ system('bundle check') || system!('bundle install')
19
+
20
+ # Install JavaScript dependencies if using Yarn
21
+ # system('bin/yarn')
22
+
23
+ # puts "\n== Copying sample files =="
24
+ # unless File.exist?('config/database.yml')
25
+ # cp 'config/database.yml.sample', 'config/database.yml'
26
+ # end
27
+
28
+ puts "\n== Preparing database =="
29
+ system! 'bin/rails db:setup'
30
+
31
+ puts "\n== Removing old logs and tempfiles =="
32
+ system! 'bin/rails log:clear tmp:clear'
33
+
34
+ puts "\n== Restarting application server =="
35
+ system! 'bin/rails restart'
36
+ end
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+ include FileUtils
4
+
5
+ # path to your application root.
6
+ APP_ROOT = File.expand_path('..', __dir__)
7
+
8
+ def system!(*args)
9
+ system(*args) || abort("\n== Command #{args} failed ==")
10
+ end
11
+
12
+ chdir APP_ROOT do
13
+ # This script is a way to update your development environment automatically.
14
+ # Add necessary update steps to this file.
15
+
16
+ puts '== Installing dependencies =='
17
+ system! 'gem install bundler --conservative'
18
+ system('bundle check') || system!('bundle install')
19
+
20
+ # Install JavaScript dependencies if using Yarn
21
+ # system('bin/yarn')
22
+
23
+ puts "\n== Updating database =="
24
+ system! 'bin/rails db:migrate'
25
+
26
+ puts "\n== Removing old logs and tempfiles =="
27
+ system! 'bin/rails log:clear tmp:clear'
28
+
29
+ puts "\n== Restarting application server =="
30
+ system! 'bin/rails restart'
31
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ VENDOR_PATH = File.expand_path('..', __dir__)
3
+ Dir.chdir(VENDOR_PATH) do
4
+ begin
5
+ exec "yarnpkg #{ARGV.join(' ')}"
6
+ rescue Errno::ENOENT
7
+ $stderr.puts "Yarn executable was not detected in the system."
8
+ $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install"
9
+ exit 1
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path("lib", __dir__)
4
+
5
+ require "comfy_blog/version"
6
+
7
+ # Describe your gem and declare its dependencies:
8
+ Gem::Specification.new do |s|
9
+ s.name = "kcy_comfy_blog"
10
+ s.version = ComfyBlog::VERSION
11
+ s.authors = ["Oleg Khabarov"]
12
+ s.email = ["oleg@khabarov.ca"]
13
+ s.homepage = "http://github.com/comfy/comfy-blog"
14
+ s.summary = "Simple Blog Engine for ComfortableMexicanSofa"
15
+ s.description = "Simple Blog Engine for ComfortableMexicanSofa"
16
+ s.license = "MIT"
17
+
18
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|doc)/})
20
+ end
21
+
22
+ s.require_paths = ["lib"]
23
+
24
+ s.required_ruby_version = ">= 2.3.0"
25
+
26
+ # s.add_dependency "comfortable_mexican_sofa", ">= 2.0.14"
27
+ s.add_dependency "kcy1"
28
+
29
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is used by Rack-based servers to start the application.
4
+
5
+ require ::File.expand_path("../config/environment", __FILE__)
6
+ run ComfyBlog::Application
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "boot"
4
+
5
+ require "rails/all"
6
+
7
+ # Require the gems listed in Gemfile, including any gems
8
+ # you've limited to :test, :development, or :production.
9
+ Bundler.require(*Rails.groups)
10
+
11
+ module ComfyBlog
12
+ class Application < Rails::Application
13
+
14
+ require_relative "../lib/comfy_blog"
15
+
16
+ config.load_defaults 5.2
17
+
18
+ # Settings in config/environments/* take precedence over those specified here.
19
+ # Application configuration should go into files in config/initializers
20
+ # -- all .rb files in that directory are automatically loaded.
21
+
22
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
23
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
24
+ # config.time_zone = 'Central Time (US & Canada)'
25
+
26
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
27
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
28
+ # config.i18n.default_locale = :de
29
+
30
+ # Ensuring that all ActiveStorage routes are loaded before out globbing route.
31
+ config.railties_order = [ActiveStorage::Engine, :main_app, :all]
32
+
33
+ # Making sure we don't load our dev routes as part of the engine
34
+ config.paths["config/routes.rb"] << "config/blog_routes.rb"
35
+
36
+ config.i18n.enforce_available_locales = true
37
+
38
+ end
39
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ ComfyBlog::Application.routes.draw do
4
+ comfy_route :cms_admin
5
+ comfy_route :blog_admin
6
+ comfy_route :blog
7
+ comfy_route :cms
8
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Set up gems listed in the Gemfile.
4
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
5
+
6
+ require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
7
+ File.exist?(ENV["BUNDLE_GEMFILE"])
@@ -0,0 +1,11 @@
1
+ development:
2
+ adapter: sqlite3
3
+ database: db/development.sqlite3
4
+ pool: 5
5
+ timeout: 10000
6
+
7
+ test:
8
+ adapter: sqlite3
9
+ database: db/test.sqlite3
10
+ pool: 5
11
+ timeout: 10000
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Load the rails application
4
+ require File.expand_path("application", __dir__)
5
+
6
+ # Initialize the rails application
7
+ ComfyBlog::Application.initialize!