ets_comfy_blog 0.0.1

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 (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 +28 -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,28 @@
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 = "ets_comfy_blog"
10
+ s.version = ComfyBlog::VERSION
11
+ s.authors = ["PG9-SEP"]
12
+ s.email = ["PG9@SEP"]
13
+ s.homepage = "https://github.com/changyukang/comfy-blog"
14
+ s.summary = "Self-customized Simple Blog Engine for ComfortableMexicanSofa"
15
+ s.description = "Self-customized 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 "PixelForce_ETS", ">= 0.0.1"
27
+
28
+ 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!