kcy_comfy_blog 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/issue_template.md +22 -0
- data/.github/pull_request_template.md +6 -0
- data/.gitignore +16 -0
- data/.rubocop.yml +96 -0
- data/.travis.yml +21 -0
- data/CONTRIBUTING.md +32 -0
- data/Gemfile +27 -0
- data/LICENSE +20 -0
- data/README.md +42 -0
- data/Rakefile +5 -0
- data/app/controllers/comfy/admin/blog/posts_controller.rb +84 -0
- data/app/controllers/comfy/admin/blog/revisions/post_controller.rb +30 -0
- data/app/controllers/comfy/blog/posts_controller.rb +50 -0
- data/app/models/comfy/blog/post.rb +55 -0
- data/app/views/comfy/admin/blog/partials/_navigation.html.haml +4 -0
- data/app/views/comfy/admin/blog/posts/_form.html.haml +22 -0
- data/app/views/comfy/admin/blog/posts/edit.html.haml +9 -0
- data/app/views/comfy/admin/blog/posts/index.html.haml +37 -0
- data/app/views/comfy/admin/blog/posts/new.html.haml +5 -0
- data/app/views/comfy/blog/posts/index.html.haml +28 -0
- data/app/views/comfy/blog/posts/index.rss.builder +22 -0
- data/app/views/comfy/blog/posts/show.html.haml +8 -0
- data/app/views/layouts/comfy/blog/application.html.erb +22 -0
- data/bin/bundle +3 -0
- data/bin/rails +4 -0
- data/bin/rake +4 -0
- data/bin/setup +36 -0
- data/bin/update +31 -0
- data/bin/yarn +11 -0
- data/comfy_blog.gemspec +29 -0
- data/config.ru +6 -0
- data/config/application.rb +39 -0
- data/config/blog_routes.rb +8 -0
- data/config/boot.rb +7 -0
- data/config/database.yml +11 -0
- data/config/environment.rb +7 -0
- data/config/environments/development.rb +64 -0
- data/config/environments/test.rb +51 -0
- data/config/initializers/comfy_blog.rb +9 -0
- data/config/locales/ca.yml +38 -0
- data/config/locales/cs.yml +38 -0
- data/config/locales/da.yml +38 -0
- data/config/locales/de.yml +38 -0
- data/config/locales/en.yml +38 -0
- data/config/locales/es.yml +38 -0
- data/config/locales/fi.yml +38 -0
- data/config/locales/fr.yml +38 -0
- data/config/locales/gr.yml +38 -0
- data/config/locales/it.yml +38 -0
- data/config/locales/ja.yml +38 -0
- data/config/locales/nb.yml +38 -0
- data/config/locales/nl.yml +38 -0
- data/config/locales/pl.yml +38 -0
- data/config/locales/pt-BR.yml +38 -0
- data/config/locales/ru.yml +38 -0
- data/config/locales/sv.yml +38 -0
- data/config/locales/tr.yml +38 -0
- data/config/locales/uk.yml +38 -0
- data/config/locales/zh-CN.yml +38 -0
- data/config/locales/zh-TW.yml +38 -0
- data/config/storage.yml +35 -0
- data/db/migrate/00_create_cms.rb +167 -0
- data/db/migrate/01_create_blog.rb +24 -0
- data/lib/comfy_blog.rb +29 -0
- data/lib/comfy_blog/configuration.rb +24 -0
- data/lib/comfy_blog/engine.rb +32 -0
- data/lib/comfy_blog/routes/blog.rb +21 -0
- data/lib/comfy_blog/routes/blog_admin.rb +23 -0
- data/lib/comfy_blog/routing.rb +4 -0
- data/lib/comfy_blog/version.rb +7 -0
- data/lib/generators/comfy/blog/README +10 -0
- data/lib/generators/comfy/blog/blog_generator.rb +53 -0
- 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,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,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,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>
|
data/bin/bundle
ADDED
data/bin/rails
ADDED
data/bin/rake
ADDED
data/bin/setup
ADDED
@@ -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
|
data/bin/update
ADDED
@@ -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
|
data/bin/yarn
ADDED
@@ -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
|
data/comfy_blog.gemspec
ADDED
@@ -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
|
data/config.ru
ADDED
@@ -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
|
data/config/boot.rb
ADDED
data/config/database.yml
ADDED