diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-07-04 10:42:21 -0400 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-07-04 10:42:21 -0400 |
commit | d48adb741c5c30ba3f2d3c039a7e342b43add352 (patch) | |
tree | cbc25ac929e73702142a5ec5728a98dc54d88602 | |
parent | 66353403efcc9c0b16c82ea8ab9860ca8a44aa4c (diff) | |
download | thoughts-d48adb741c5c30ba3f2d3c039a7e342b43add352.tar.gz thoughts-d48adb741c5c30ba3f2d3c039a7e342b43add352.tar.bz2 thoughts-d48adb741c5c30ba3f2d3c039a7e342b43add352.zip |
Added blog drafts
An unpublished post is not viewable unless you are logged in. The "Create record" field is disabled for unpublished posts, though this is only in JavaScript and the backend will not disallow creating records for unpublished posts if forced to. Unpublishing a post does not destroy records for that post. This only applies to blog posts, currently; streams and stream updates cannot be drafted. Unpublished posts still require titles and slugs. There is no autosaving functionality yet. refs #1
-rw-r--r-- | app/assets/javascripts/admin/records.coffee | 24 | ||||
-rw-r--r-- | app/assets/stylesheets/admin/layout.scss | 6 | ||||
-rw-r--r-- | app/controllers/admin/blogs_controller.rb | 8 | ||||
-rw-r--r-- | app/controllers/blogs_controller.rb | 3 | ||||
-rw-r--r-- | app/models/blog.rb | 21 | ||||
-rw-r--r-- | app/views/admin/blogs/_form.html.haml | 4 | ||||
-rw-r--r-- | app/views/admin/blogs/drafts.html.haml | 10 | ||||
-rw-r--r-- | app/views/admin/blogs/index.html.haml | 4 | ||||
-rw-r--r-- | app/views/blogs/show.html.haml | 2 | ||||
-rw-r--r-- | app/views/layouts/admin.html.haml | 1 | ||||
-rw-r--r-- | config/routes.rb | 6 | ||||
-rw-r--r-- | db/migrate/20180704125527_add_blog_drafts.rb | 17 | ||||
-rw-r--r-- | db/schema.rb | 4 |
13 files changed, 99 insertions, 11 deletions
diff --git a/app/assets/javascripts/admin/records.coffee b/app/assets/javascripts/admin/records.coffee index 69cd471..3a1ed51 100644 --- a/app/assets/javascripts/admin/records.coffee +++ b/app/assets/javascripts/admin/records.coffee | |||
@@ -1,9 +1,25 @@ | |||
1 | # Place all the behaviors and hooks related to the matching controller here. | 1 | # Place all the behaviors and hooks related to the matching controller here. |
2 | # All this logic will automatically be available in application.js. | 2 | # All this logic will automatically be available in application.js. |
3 | # You can use CoffeeScript in this file: http://coffeescript.org/ | 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ |
4 | |||
5 | create_record_toggle = (checked) -> | ||
6 | if checked | ||
7 | $(".record-description-field").show() | ||
8 | else | ||
9 | $(".record-description-field").hide() | ||
10 | |||
11 | published_field_toggle = (checked) -> | ||
12 | if checked | ||
13 | $(".should-create-record-field input[type=checkbox]").prop("disabled", false) | ||
14 | else | ||
15 | $(".should-create-record-field input[type=checkbox]").prop("disabled", true) | ||
16 | $(".should-create-record-field input[type=checkbox]").prop("checked", false) | ||
17 | create_record_toggle(false) | ||
18 | |||
4 | $(document).on "turbolinks:load", -> | 19 | $(document).on "turbolinks:load", -> |
20 | if $(".published-field").length > 0 | ||
21 | published_field_toggle($(".published-field input[type=checkbox]").prop("checked")) | ||
5 | $(".should-create-record-field input[type=checkbox]").change -> | 22 | $(".should-create-record-field input[type=checkbox]").change -> |
6 | if $(".should-create-record-field input[type=checkbox]").prop("checked") | 23 | create_record_toggle($(this).prop("checked")) |
7 | $(".record-description-field").show() | 24 | $(".published-field input[type=checkbox]").change -> |
8 | else | 25 | published_field_toggle($(this).prop("checked")) |
9 | $(".record-description-field").hide() | ||
diff --git a/app/assets/stylesheets/admin/layout.scss b/app/assets/stylesheets/admin/layout.scss index 6645709..f68cf6a 100644 --- a/app/assets/stylesheets/admin/layout.scss +++ b/app/assets/stylesheets/admin/layout.scss | |||
@@ -190,6 +190,12 @@ body { | |||
190 | } | 190 | } |
191 | } | 191 | } |
192 | 192 | ||
193 | .published-field { | ||
194 | label { | ||
195 | font-size: .75em; | ||
196 | } | ||
197 | } | ||
198 | |||
193 | .record-description-field { | 199 | .record-description-field { |
194 | display: none; | 200 | display: none; |
195 | margin-top: 1em; | 201 | margin-top: 1em; |
diff --git a/app/controllers/admin/blogs_controller.rb b/app/controllers/admin/blogs_controller.rb index fa46ab8..9706df3 100644 --- a/app/controllers/admin/blogs_controller.rb +++ b/app/controllers/admin/blogs_controller.rb | |||
@@ -2,7 +2,11 @@ class Admin::BlogsController < Admin::AdminController | |||
2 | before_action :set_section | 2 | before_action :set_section |
3 | 3 | ||
4 | def index | 4 | def index |
5 | @blogs = Blog.order(created_at: :desc) | 5 | @blogs = Blog.where(published: true).order(published_at: :desc) |
6 | end | ||
7 | |||
8 | def drafts | ||
9 | @blogs = Blog.where(published: false).order(updated_at: :desc) | ||
6 | end | 10 | end |
7 | 11 | ||
8 | def new | 12 | def new |
@@ -42,7 +46,7 @@ class Admin::BlogsController < Admin::AdminController | |||
42 | private | 46 | private |
43 | 47 | ||
44 | def blog_params | 48 | def blog_params |
45 | params.require(:blog).permit(:title, :body, :slug, records_attributes: [:description, :_destroy]) | 49 | params.require(:blog).permit(:title, :body, :slug, :published, records_attributes: [:description, :_destroy]) |
46 | end | 50 | end |
47 | 51 | ||
48 | def set_section | 52 | def set_section |
diff --git a/app/controllers/blogs_controller.rb b/app/controllers/blogs_controller.rb index 5e72601..f31287b 100644 --- a/app/controllers/blogs_controller.rb +++ b/app/controllers/blogs_controller.rb | |||
@@ -2,6 +2,9 @@ class BlogsController < ApplicationController | |||
2 | 2 | ||
3 | def show | 3 | def show |
4 | @blog = Blog.find_by_slug(params[:slug]) | 4 | @blog = Blog.find_by_slug(params[:slug]) |
5 | |||
6 | raise ActiveRecord::RecordNotFound unless @blog | ||
7 | raise ActiveRecord::RecordNotFound unless @blog.published or user_signed_in? | ||
5 | end | 8 | end |
6 | 9 | ||
7 | end | 10 | end |
diff --git a/app/models/blog.rb b/app/models/blog.rb index 1ace11b..495c6eb 100644 --- a/app/models/blog.rb +++ b/app/models/blog.rb | |||
@@ -6,7 +6,28 @@ class Blog < ApplicationRecord | |||
6 | 6 | ||
7 | accepts_nested_attributes_for :records, allow_destroy: true | 7 | accepts_nested_attributes_for :records, allow_destroy: true |
8 | 8 | ||
9 | before_save :set_published_at | ||
10 | |||
9 | def path | 11 | def path |
10 | "/says/#{slug}" | 12 | "/says/#{slug}" |
11 | end | 13 | end |
14 | |||
15 | def posted_at | ||
16 | if published | ||
17 | published_at | ||
18 | else | ||
19 | updated_at | ||
20 | end | ||
21 | end | ||
22 | |||
23 | private | ||
24 | def set_published_at | ||
25 | if self.published | ||
26 | if self.published_at.blank? | ||
27 | self.published_at = DateTime.now | ||
28 | end | ||
29 | else | ||
30 | self.published_at = nil | ||
31 | end | ||
32 | end | ||
12 | end | 33 | end |
diff --git a/app/views/admin/blogs/_form.html.haml b/app/views/admin/blogs/_form.html.haml index 4a1c410..2066aed 100644 --- a/app/views/admin/blogs/_form.html.haml +++ b/app/views/admin/blogs/_form.html.haml | |||
@@ -16,6 +16,10 @@ | |||
16 | - f.object.errors.full_messages.each do |error| | 16 | - f.object.errors.full_messages.each do |error| |
17 | %li= error | 17 | %li= error |
18 | .details-module | 18 | .details-module |
19 | .published-field | ||
20 | = f.check_box :published | ||
21 | = f.label :published | ||
22 | .details-module | ||
19 | = f.fields_for :records, Record.new do |builder| | 23 | = f.fields_for :records, Record.new do |builder| |
20 | .should-create-record-field | 24 | .should-create-record-field |
21 | = builder.check_box :_destroy, {checked: false}, "0", "1" | 25 | = builder.check_box :_destroy, {checked: false}, "0", "1" |
diff --git a/app/views/admin/blogs/drafts.html.haml b/app/views/admin/blogs/drafts.html.haml new file mode 100644 index 0000000..91d3214 --- /dev/null +++ b/app/views/admin/blogs/drafts.html.haml | |||
@@ -0,0 +1,10 @@ | |||
1 | %table#entries | ||
2 | %tr | ||
3 | %th Title | ||
4 | %th Last updated | ||
5 | %th | ||
6 | - @blogs.each do |blog| | ||
7 | %tr{ class: cycle("even", "odd") } | ||
8 | %td= blog.title | ||
9 | %td= blog.updated_at.strftime("%B %d, %Y, %l:%M%P") | ||
10 | %td= link_to "Edit", edit_admin_blog_url(blog) | ||
diff --git a/app/views/admin/blogs/index.html.haml b/app/views/admin/blogs/index.html.haml index 448617a..c5db4f1 100644 --- a/app/views/admin/blogs/index.html.haml +++ b/app/views/admin/blogs/index.html.haml | |||
@@ -1,10 +1,10 @@ | |||
1 | %table#entries | 1 | %table#entries |
2 | %tr | 2 | %tr |
3 | %th Title | 3 | %th Title |
4 | %th Date created | 4 | %th Date published |
5 | %th | 5 | %th |
6 | - @blogs.each do |blog| | 6 | - @blogs.each do |blog| |
7 | %tr{ class: cycle("even", "odd") } | 7 | %tr{ class: cycle("even", "odd") } |
8 | %td= blog.title | 8 | %td= blog.title |
9 | %td= blog.created_at.strftime("%B %d, %Y, %l:%M%P") | 9 | %td= blog.published_at.strftime("%B %d, %Y, %l:%M%P") |
10 | %td= link_to "Edit", edit_admin_blog_url(blog) | 10 | %td= link_to "Edit", edit_admin_blog_url(blog) |
diff --git a/app/views/blogs/show.html.haml b/app/views/blogs/show.html.haml index c44d3f4..48c07dc 100644 --- a/app/views/blogs/show.html.haml +++ b/app/views/blogs/show.html.haml | |||
@@ -3,4 +3,4 @@ | |||
3 | %footer#blog-footer | 3 | %footer#blog-footer |
4 | This entry was posted on | 4 | This entry was posted on |
5 | = succeed "." do | 5 | = succeed "." do |
6 | %time= @blog.created_at.strftime("%B #{@blog.created_at.day.ordinalize}, %Y at %-I:%M:%S%P") | 6 | %time= @blog.posted_at.strftime("%B #{@blog.posted_at.day.ordinalize}, %Y at %-I:%M:%S%P") |
diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 68bbd96..cb48c50 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml | |||
@@ -24,6 +24,7 @@ | |||
24 | = link_to "Blogs", admin_blogs_url, class: "major-link" | 24 | = link_to "Blogs", admin_blogs_url, class: "major-link" |
25 | %ul.minors | 25 | %ul.minors |
26 | %li.minor= link_to "New blog", new_admin_blog_url | 26 | %li.minor= link_to "New blog", new_admin_blog_url |
27 | %li.minor= link_to "Drafts", drafts_admin_blogs_url | ||
27 | %li{major_sidebar_attrs("streams")} | 28 | %li{major_sidebar_attrs("streams")} |
28 | = link_to "Streams", admin_streams_url, class: "major-link" | 29 | = link_to "Streams", admin_streams_url, class: "major-link" |
29 | %ul.minors | 30 | %ul.minors |
diff --git a/config/routes.rb b/config/routes.rb index 7369514..37e7f90 100644 --- a/config/routes.rb +++ b/config/routes.rb | |||
@@ -2,7 +2,11 @@ Rails.application.routes.draw do | |||
2 | namespace :admin do | 2 | namespace :admin do |
3 | get '/', to: 'dashboard#index' | 3 | get '/', to: 'dashboard#index' |
4 | 4 | ||
5 | resources :blogs, except: [:show] | 5 | resources :blogs, except: [:show] do |
6 | collection do | ||
7 | get 'drafts' | ||
8 | end | ||
9 | end | ||
6 | 10 | ||
7 | resources :streams, except: [:show] do | 11 | resources :streams, except: [:show] do |
8 | resources :updates, except: [:index, :show] | 12 | resources :updates, except: [:index, :show] |
diff --git a/db/migrate/20180704125527_add_blog_drafts.rb b/db/migrate/20180704125527_add_blog_drafts.rb new file mode 100644 index 0000000..07c5078 --- /dev/null +++ b/db/migrate/20180704125527_add_blog_drafts.rb | |||
@@ -0,0 +1,17 @@ | |||
1 | class AddBlogDrafts < ActiveRecord::Migration[5.1] | ||
2 | def change | ||
3 | add_column :blogs, :published, :boolean, null: false, default: false | ||
4 | add_column :blogs, :published_at, :datetime, null: true | ||
5 | |||
6 | reversible do |dir| | ||
7 | dir.up do | ||
8 | Blog.all.each do |blog| | ||
9 | blog.published = true | ||
10 | blog.published_at = blog.created_at | ||
11 | |||
12 | blog.save! | ||
13 | end | ||
14 | end | ||
15 | end | ||
16 | end | ||
17 | end | ||
diff --git a/db/schema.rb b/db/schema.rb index 2ca0b58..d885500 100644 --- a/db/schema.rb +++ b/db/schema.rb | |||
@@ -10,7 +10,7 @@ | |||
10 | # | 10 | # |
11 | # It's strongly recommended that you check this file into your version control system. | 11 | # It's strongly recommended that you check this file into your version control system. |
12 | 12 | ||
13 | ActiveRecord::Schema.define(version: 20180702221133) do | 13 | ActiveRecord::Schema.define(version: 20180704125527) do |
14 | 14 | ||
15 | create_table "blogs", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" do |t| | 15 | create_table "blogs", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" do |t| |
16 | t.string "title" | 16 | t.string "title" |
@@ -18,6 +18,8 @@ ActiveRecord::Schema.define(version: 20180702221133) do | |||
18 | t.string "slug", null: false | 18 | t.string "slug", null: false |
19 | t.datetime "created_at", null: false | 19 | t.datetime "created_at", null: false |
20 | t.datetime "updated_at", null: false | 20 | t.datetime "updated_at", null: false |
21 | t.boolean "published", default: false, null: false | ||
22 | t.datetime "published_at" | ||
21 | end | 23 | end |
22 | 24 | ||
23 | create_table "ckeditor_assets", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" do |t| | 25 | create_table "ckeditor_assets", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" do |t| |