effective_posts 0.4.6 → 0.4.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/admin/posts_controller.rb +18 -5
- data/app/controllers/effective/posts_controller.rb +87 -17
- data/app/helpers/effective_posts_helper.rb +43 -16
- data/app/mailers/effective/posts_mailer.rb +34 -0
- data/app/models/effective/datatables/posts.rb +14 -4
- data/app/models/effective/post.rb +63 -5
- data/app/views/admin/posts/_actions.html.haml +16 -9
- data/app/views/admin/posts/_form.html.haml +28 -21
- data/app/views/admin/posts/edit.html.haml +1 -1
- data/app/views/admin/posts/excerpts.html.haml +1 -1
- data/app/views/admin/posts/new.html.haml +1 -1
- data/app/views/effective/posts/_additional_fields.html.haml +2 -0
- data/app/views/effective/posts/_categories.html.haml +4 -0
- data/app/views/effective/posts/_form.html.haml +27 -0
- data/app/views/effective/posts/_recent_posts.html.haml +5 -0
- data/app/views/effective/posts/_spacer.html.haml +1 -0
- data/app/views/effective/posts/edit.html.haml +2 -0
- data/app/views/effective/posts/index.html.haml +7 -2
- data/app/views/effective/posts/new.html.haml +2 -0
- data/app/views/effective/posts/show.html.haml +3 -3
- data/app/views/effective/posts/submitted.html.haml +10 -0
- data/app/views/effective/posts_mailer/post_submitted_to_admin.html.haml +22 -0
- data/app/views/layouts/effective_posts_mailer_layout.html.haml +7 -0
- data/config/routes.rb +12 -7
- data/lib/effective_posts.rb +19 -1
- data/lib/effective_posts/version.rb +1 -1
- data/lib/generators/effective_posts/install_generator.rb +10 -0
- data/lib/generators/templates/effective_posts.rb +52 -9
- data/lib/generators/templates/effective_posts_mailer_preview.rb +22 -0
- metadata +36 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6c0cbc8c247c67715094aba5e52ea2f212cdbe3
|
4
|
+
data.tar.gz: a67ae4457e20eb7675c78dc1c769a1b1cc84595b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1999a9f99ca390aab1e0576f8a1d5df86b0d33ccc7b29ea66b3903dd69777ac0ba29341a91f18abd1dc9e8360c98f5409d93cdeb4fe5f088d861cff8ae6b27e0
|
7
|
+
data.tar.gz: b09a6b63101b33d938f70230485668f0c2c1dd1b34d1bd01650a04757c9aa01d1943e9a5226af362d4826bff0ba9f4931bcb2d04b3621a7946b65956872eba3c
|
@@ -12,7 +12,7 @@ module Admin
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def new
|
15
|
-
@post = Effective::Post.new(:
|
15
|
+
@post = Effective::Post.new(published_at: Time.zone.now)
|
16
16
|
@page_title = 'New Post'
|
17
17
|
|
18
18
|
EffectivePosts.authorized?(self, :new, @post)
|
@@ -30,6 +30,7 @@ module Admin
|
|
30
30
|
if params[:commit] == 'Save and Edit Content' && defined?(EffectiveRegions)
|
31
31
|
redirect_to effective_regions.edit_path(effective_posts.post_path(@post), :exit => effective_posts.edit_admin_post_path(@post))
|
32
32
|
elsif params[:commit] == 'Save and Add New'
|
33
|
+
flash[:success] = 'Successfully created post'
|
33
34
|
redirect_to effective_posts.new_admin_post_path
|
34
35
|
else
|
35
36
|
flash[:success] = 'Successfully created post'
|
@@ -58,6 +59,7 @@ module Admin
|
|
58
59
|
if params[:commit] == 'Save and Edit Content' && defined?(EffectiveRegions)
|
59
60
|
redirect_to effective_regions.edit_path(effective_posts.post_path(@post), :exit => effective_posts.edit_admin_post_path(@post))
|
60
61
|
elsif params[:commit] == 'Save and Add New'
|
62
|
+
flash[:success] = 'Successfully updated post'
|
61
63
|
redirect_to effective_posts.new_admin_post_path
|
62
64
|
else
|
63
65
|
flash[:success] = 'Successfully updated post'
|
@@ -83,6 +85,20 @@ module Admin
|
|
83
85
|
redirect_to effective_posts.admin_posts_path
|
84
86
|
end
|
85
87
|
|
88
|
+
def approve
|
89
|
+
@post = Effective::Post.find(params[:id])
|
90
|
+
|
91
|
+
EffectivePosts.authorized?(self, :approve, @post)
|
92
|
+
|
93
|
+
if @post.update_attributes(draft: false)
|
94
|
+
flash[:success] = 'Successfully approved post. It is now displayed on the website.'
|
95
|
+
else
|
96
|
+
flash[:danger] = "Unable to approve post: #{@post.errors.full_messages.join(', ')}"
|
97
|
+
end
|
98
|
+
|
99
|
+
redirect_to(:back) rescue redirect_to(effective_posts.admin_posts_path)
|
100
|
+
end
|
101
|
+
|
86
102
|
def excerpts
|
87
103
|
@page_title = 'Post Excerpts'
|
88
104
|
|
@@ -91,13 +107,10 @@ module Admin
|
|
91
107
|
@posts = Effective::Post.includes(:regions)
|
92
108
|
end
|
93
109
|
|
94
|
-
|
95
110
|
private
|
96
111
|
|
97
112
|
def post_params
|
98
|
-
params.require(:effective_post).permit(
|
99
|
-
:title, :draft, :category, :published_at, :roles => []
|
100
|
-
)
|
113
|
+
params.require(:effective_post).permit(EffectivePosts.permitted_params)
|
101
114
|
end
|
102
115
|
|
103
116
|
end
|
@@ -2,34 +2,25 @@ module Effective
|
|
2
2
|
class PostsController < ApplicationController
|
3
3
|
layout (EffectivePosts.layout.kind_of?(Hash) ? EffectivePosts.layout[:posts] : EffectivePosts.layout)
|
4
4
|
|
5
|
-
|
5
|
+
before_action :authenticate_user!, only: [:new, :create, :edit, :update],
|
6
|
+
if: -> { EffectivePosts.submissions_require_current_user }
|
6
7
|
|
7
|
-
|
8
|
-
@posts = (Rails::VERSION::MAJOR > 3 ? Effective::Post.all : Effective::Post.scoped)
|
9
|
-
|
10
|
-
@posts = @posts.for_role(current_user.try(:roles)) if defined?(EffectiveRoles)
|
11
|
-
@posts = @posts.with_category(params[:category]) if params[:category]
|
12
|
-
@posts = @posts.published
|
13
|
-
@posts = @posts.includes(:regions)
|
8
|
+
after_action :monkey_patch_for_kaminari, only: [:index]
|
14
9
|
|
15
|
-
|
10
|
+
def index
|
11
|
+
@posts ||= Effective::Post.posts(user: current_user, category: params[:category])
|
16
12
|
@posts = @posts.page(params[:page]).per(EffectivePosts.per_page)
|
17
13
|
|
18
14
|
EffectivePosts.authorized?(self, :index, Effective::Post)
|
19
15
|
|
20
|
-
@page_title = (params[:category] || 'Posts').titleize
|
16
|
+
@page_title = (params[:page_title] || params[:category] || 'Posts').titleize
|
21
17
|
end
|
22
18
|
|
23
19
|
def show
|
24
|
-
@posts
|
25
|
-
|
26
|
-
@posts = @posts.with_category(params[:category]) if params[:category]
|
27
|
-
@posts = @posts.published if params[:edit].to_s != 'true'
|
28
|
-
@posts = @posts.includes(:regions)
|
29
|
-
|
20
|
+
@posts ||= Effective::Post.posts(user: current_user, category: params[:category], drafts: (params[:edit].to_s == 'true' || params[:preview].to_s == 'true'))
|
30
21
|
@post = @posts.find(params[:id])
|
31
22
|
|
32
|
-
if
|
23
|
+
if @post.respond_to?(:roles_permit?)
|
33
24
|
raise Effective::AccessDenied unless @post.roles_permit?(current_user)
|
34
25
|
end
|
35
26
|
|
@@ -38,8 +29,87 @@ module Effective
|
|
38
29
|
@page_title = @post.title
|
39
30
|
end
|
40
31
|
|
32
|
+
# Public user submit a post functionality
|
33
|
+
def new
|
34
|
+
@post ||= Effective::Post.new(published_at: Time.zone.now)
|
35
|
+
@page_title = 'New Post'
|
36
|
+
|
37
|
+
EffectivePosts.authorized?(self, :new, @post)
|
38
|
+
end
|
39
|
+
|
40
|
+
def create
|
41
|
+
@post ||= Effective::Post.new(post_params)
|
42
|
+
@post.user = current_user if defined?(current_user)
|
43
|
+
@post.draft = (EffectivePosts.submissions_require_approval == true)
|
44
|
+
|
45
|
+
EffectivePosts.authorized?(self, :create, @post)
|
46
|
+
|
47
|
+
if @post.save
|
48
|
+
@page_title ||= 'Post Submitted'
|
49
|
+
flash.now[:success] = 'Successfully submitted post'
|
50
|
+
|
51
|
+
if EffectivePosts.submissions_require_approval
|
52
|
+
@post.send_post_submitted_to_admin!
|
53
|
+
end
|
54
|
+
|
55
|
+
render :submitted
|
56
|
+
else
|
57
|
+
@page_title ||= 'New Post'
|
58
|
+
flash.now[:danger] = 'Unable to submit post'
|
59
|
+
render action: :new
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def edit
|
64
|
+
@post ||= Effective::Post.find(params[:id])
|
65
|
+
@page_title ||= 'Edit Post'
|
66
|
+
|
67
|
+
EffectivePosts.authorized?(self, :edit, @post)
|
68
|
+
end
|
69
|
+
|
70
|
+
def update
|
71
|
+
@post ||= Effective::Post.find(params[:id])
|
72
|
+
draft_was = @post.draft
|
73
|
+
@post.draft = (EffectivePosts.submissions_require_approval == true)
|
74
|
+
|
75
|
+
EffectivePosts.authorized?(self, :update, @post)
|
76
|
+
|
77
|
+
if @post.update_attributes(post_params)
|
78
|
+
@page_title ||= 'Post Submitted'
|
79
|
+
flash.now[:success] = 'Successfully re-submitted post'
|
80
|
+
|
81
|
+
if EffectivePosts.submissions_require_approval && draft_was != true
|
82
|
+
@post.send_post_submitted_to_admin!
|
83
|
+
end
|
84
|
+
|
85
|
+
render :submitted
|
86
|
+
else
|
87
|
+
@page_title ||= 'Edit Post'
|
88
|
+
flash.now[:danger] = 'Unable to update post'
|
89
|
+
render action: :edit
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def destroy
|
94
|
+
@post ||= Effective::Post.find(params[:id])
|
95
|
+
|
96
|
+
EffectivePosts.authorized?(self, :destroy, @post)
|
97
|
+
|
98
|
+
if @post.destroy
|
99
|
+
flash[:success] = 'Successfully deleted post'
|
100
|
+
else
|
101
|
+
flash[:danger] = 'Unable to delete post'
|
102
|
+
end
|
103
|
+
|
104
|
+
redirect_to effective_posts.posts_path
|
105
|
+
end
|
106
|
+
|
41
107
|
private
|
42
108
|
|
109
|
+
def post_params
|
110
|
+
params.require(:effective_post).permit(EffectivePosts.permitted_params)
|
111
|
+
end
|
112
|
+
|
43
113
|
def monkey_patch_for_kaminari
|
44
114
|
@template = @template.tap { |template| template.extend(EffectiveKaminariHelper) }
|
45
115
|
end
|
@@ -1,6 +1,17 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
|
3
3
|
module EffectivePostsHelper
|
4
|
+
def effective_post_path(post, opts = nil)
|
5
|
+
category = post.category.to_s.downcase
|
6
|
+
opts ||= {}
|
7
|
+
|
8
|
+
if EffectivePosts.use_category_routes
|
9
|
+
"/#{category}" + effective_posts.post_path(post, opts)
|
10
|
+
else
|
11
|
+
effective_posts.post_path(post, opts.merge(category: category))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
4
15
|
def render_post(post)
|
5
16
|
render(partial: 'effective/posts/post', locals: { post: post })
|
6
17
|
end
|
@@ -19,33 +30,37 @@ module EffectivePostsHelper
|
|
19
30
|
# :omission => '...' passed to the final text node's truncate
|
20
31
|
# :length => 200 to set the max inner_text length of the content
|
21
32
|
# All other options are passed to the link_to 'Read more'
|
22
|
-
def post_excerpt(post,
|
23
|
-
content = effective_region(post, :
|
24
|
-
|
25
|
-
options = {
|
26
|
-
:label => 'Read more',
|
27
|
-
:omission => '...',
|
28
|
-
:length => 200
|
29
|
-
}.merge(opts)
|
33
|
+
def post_excerpt(post, read_more_link: true, label: 'Read more', omission: '...', length: 200)
|
34
|
+
content = effective_region(post, :body, :editable => false) { '<p>Default content</p>'.html_safe }
|
30
35
|
|
31
36
|
divider = content.index(Effective::Snippets::ReadMoreDivider::TOKEN)
|
32
|
-
|
33
|
-
omission = options.delete(:omission)
|
37
|
+
read_more = (read_more_link && label.present?) ? readmore_link(post, label: label) : ''
|
34
38
|
|
35
39
|
CGI.unescapeHTML(if divider.present?
|
36
|
-
truncate_html(content, Effective::Snippets::ReadMoreDivider::TOKEN, '') +
|
40
|
+
truncate_html(content, Effective::Snippets::ReadMoreDivider::TOKEN, '') + readmore
|
37
41
|
elsif length.present?
|
38
|
-
truncate_html(content, length, omission) +
|
42
|
+
truncate_html(content, length, omission) + read_more
|
39
43
|
else
|
40
44
|
content
|
41
45
|
end).html_safe
|
42
46
|
end
|
43
47
|
|
44
|
-
def
|
48
|
+
def read_more_link(post, options)
|
45
49
|
content_tag(:p, class: 'post-read-more') do
|
46
50
|
link_to((options.delete(:label) || 'Read more'), effective_posts.post_path(post), options)
|
47
51
|
end
|
48
52
|
end
|
53
|
+
alias_method :readmore_link, :read_more_link
|
54
|
+
|
55
|
+
### Post Categories
|
56
|
+
|
57
|
+
def post_categories
|
58
|
+
categories = EffectivePosts.categories
|
59
|
+
end
|
60
|
+
|
61
|
+
def render_post_categories
|
62
|
+
render(partial: '/effective/posts/categories', locals: { categories: post_categories })
|
63
|
+
end
|
49
64
|
|
50
65
|
def link_to_post_category(category, options = {})
|
51
66
|
category = category.to_s.downcase
|
@@ -54,9 +69,21 @@ module EffectivePostsHelper
|
|
54
69
|
link_to(category.to_s.titleize, href, options)
|
55
70
|
end
|
56
71
|
|
57
|
-
|
58
|
-
|
59
|
-
|
72
|
+
### Recent Posts
|
73
|
+
|
74
|
+
def recent_posts(user: current_user, category: nil, limit: EffectivePosts.per_page)
|
75
|
+
@recent_posts ||= Effective::Post.posts(user: user, category: category).limit(limit)
|
76
|
+
end
|
77
|
+
|
78
|
+
def render_recent_posts(user: current_user, category: nil, limit: EffectivePosts.per_page)
|
79
|
+
posts = recent_posts(user: user, category: category, limit: limit)
|
80
|
+
|
81
|
+
render partial: '/effective/posts/recent_posts', locals: { posts: posts }
|
82
|
+
end
|
83
|
+
|
84
|
+
### Submitting a Post
|
85
|
+
def link_to_submit_post(label = 'Submit a post', options = {})
|
86
|
+
link_to(label, effective_posts.new_post_path, options)
|
60
87
|
end
|
61
88
|
|
62
89
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Effective
|
2
|
+
class PostsMailer < ActionMailer::Base
|
3
|
+
helper EffectivePostsHelper
|
4
|
+
|
5
|
+
layout EffectivePosts.mailer[:layout].presence || 'effective_posts_mailer_layout'
|
6
|
+
|
7
|
+
def post_submitted_to_admin(post_param)
|
8
|
+
@post = (post_param.kind_of?(Effective::Post) ? post_param : Effective::Post.find(post_param))
|
9
|
+
|
10
|
+
mail(
|
11
|
+
to: EffectivePosts.mailer[:admin_email],
|
12
|
+
from: EffectivePosts.mailer[:default_from],
|
13
|
+
subject: subject_for_post_submitted_to_admin(@post)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def subject_for_post_submitted_to_admin(post)
|
20
|
+
string_or_callable = EffectivePosts.mailer[:subject_for_post_submitted_to_admin]
|
21
|
+
|
22
|
+
if string_or_callable.respond_to?(:call) # This is a Proc or a function, not a string
|
23
|
+
string_or_callable = self.instance_exec(post, &string_or_callable)
|
24
|
+
end
|
25
|
+
|
26
|
+
prefix_subject(string_or_callable.presence || "A new post has been submitted that needs approval")
|
27
|
+
end
|
28
|
+
|
29
|
+
def prefix_subject(text)
|
30
|
+
prefix = (EffectivePosts.mailer[:subject_prefix].to_s rescue '')
|
31
|
+
prefix.present? ? (prefix.chomp(' ') + ' ' + text) : text
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -6,14 +6,24 @@ if defined?(EffectiveDatatables)
|
|
6
6
|
default_order :published_at, :desc
|
7
7
|
|
8
8
|
table_column :published_at
|
9
|
-
table_column :id, :
|
9
|
+
table_column :id, visible: false
|
10
10
|
|
11
11
|
table_column :title
|
12
|
-
table_column :category, :
|
12
|
+
table_column :category, filter: { type: :select, values: EffectivePosts.categories }
|
13
13
|
|
14
|
-
|
14
|
+
if EffectivePosts.submissions_enabled
|
15
|
+
table_column :approved, column: 'NOT(draft)', as: :boolean do |post|
|
16
|
+
post.draft ? 'No' : 'Yes'
|
17
|
+
end
|
15
18
|
|
16
|
-
|
19
|
+
table_column :draft, visible: false
|
20
|
+
else
|
21
|
+
table_column :draft
|
22
|
+
end
|
23
|
+
|
24
|
+
table_column :created_at, label: 'Submitted at', visible: false
|
25
|
+
|
26
|
+
table_column :actions, sortable: false, filter: false, partial: '/admin/posts/actions'
|
17
27
|
end
|
18
28
|
|
19
29
|
def collection
|
@@ -17,12 +17,48 @@ module Effective
|
|
17
17
|
# timestamps
|
18
18
|
# end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
validates :title, presence: true, length: { maximum: 255 }
|
21
|
+
validates :category, presence: true
|
22
|
+
validates :published_at, presence: true
|
22
23
|
|
23
|
-
scope :drafts, -> { where(:
|
24
|
-
scope :published, -> { where(:
|
25
|
-
scope :with_category,
|
24
|
+
scope :drafts, -> { where(draft: true) }
|
25
|
+
scope :published, -> { where(draft: false).where("#{EffectivePosts.posts_table_name}.published_at < ?", Time.zone.now) }
|
26
|
+
scope :with_category, -> (category) { where(category: category.to_s.downcase) }
|
27
|
+
|
28
|
+
scope :posts, -> (user: nil, category: nil, drafts: false) {
|
29
|
+
scope = (Rails::VERSION::MAJOR > 3 ? all : scoped)
|
30
|
+
scope = scope.includes(:regions).order(published_at: :desc)
|
31
|
+
|
32
|
+
if user.present? && user.respond_to?(:roles) && defined?(EffectiveRoles)
|
33
|
+
scope = scope.for_role(user.roles)
|
34
|
+
end
|
35
|
+
|
36
|
+
if category.present?
|
37
|
+
scope = scope.with_category(category)
|
38
|
+
end
|
39
|
+
|
40
|
+
if drafts.blank?
|
41
|
+
scope = scope.published
|
42
|
+
end
|
43
|
+
|
44
|
+
scope
|
45
|
+
}
|
46
|
+
|
47
|
+
def to_s
|
48
|
+
title.presence || 'New Post'
|
49
|
+
end
|
50
|
+
|
51
|
+
def approved?
|
52
|
+
draft == false
|
53
|
+
end
|
54
|
+
|
55
|
+
def body
|
56
|
+
region(:body).content
|
57
|
+
end
|
58
|
+
|
59
|
+
def body=(input)
|
60
|
+
region(:body).content = input
|
61
|
+
end
|
26
62
|
|
27
63
|
def to_param
|
28
64
|
"#{id}-#{title.parameterize}"
|
@@ -32,5 +68,27 @@ module Effective
|
|
32
68
|
def time_to_read_in_seconds(reading_speed = 3.333)
|
33
69
|
(regions.to_a.sum { |region| (region.content || '').scan(/\w+/).size } / reading_speed).seconds
|
34
70
|
end
|
71
|
+
|
72
|
+
def send_post_submitted_to_admin!
|
73
|
+
send_email(:post_submitted_to_admin, to_param)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def send_email(email, *mailer_args)
|
79
|
+
begin
|
80
|
+
if EffectivePosts.mailer[:delayed_job_deliver] && EffectivePosts.mailer[:deliver_method] == :deliver_later
|
81
|
+
Effective::PostsMailer.delay.public_send(email, *mailer_args)
|
82
|
+
elsif EffectivePosts.mailer[:deliver_method].present?
|
83
|
+
Effective::PostsMailer.public_send(email, *mailer_args).public_send(EffectivePosts.mailer[:deliver_method])
|
84
|
+
else
|
85
|
+
Effective::PostsMailer.public_send(email, *mailer_args).deliver_now
|
86
|
+
end
|
87
|
+
rescue => e
|
88
|
+
raise e unless Rails.env.production?
|
89
|
+
return false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
35
93
|
end
|
36
94
|
end
|
@@ -1,9 +1,16 @@
|
|
1
|
-
|
2
|
-
= link_to
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
- if EffectivePosts.submissions_enabled && EffectivePosts.submissions_require_approval && !post.approved?
|
2
|
+
= link_to effective_posts.admin_approve_post_path(post.id), title: 'Approve' do
|
3
|
+
%span.glyphicon.glyphicon-ok
|
4
|
+
|
5
|
+
= link_to effective_posts.edit_admin_post_path(post.id), title: 'Settings' do
|
6
|
+
%span.glyphicon.glyphicon-cog
|
7
|
+
|
8
|
+
= link_to effective_post_path(post, (post.draft? ? {preview: true} : nil)), title: 'View', target: '_blank' do
|
9
|
+
%span.glyphicon.glyphicon-eye-open
|
10
|
+
|
11
|
+
- if defined?(EffectiveRegions)
|
12
|
+
= link_to effective_post_path(post, edit: true), title: 'Edit Content', 'data-no-turbolink': true, target: '_blank' do
|
13
|
+
%span.glyphicon.glyphicon-edit
|
14
|
+
|
15
|
+
= link_to effective_posts.admin_post_path(post.id), title: 'Delete', data: { method: :delete, confirm: 'Are you sure you want to delete? This cannot be undone.' } do
|
16
|
+
%span.glyphicon.glyphicon-trash
|
@@ -1,28 +1,35 @@
|
|
1
|
-
= simple_form_for(post, (EffectivePosts.
|
2
|
-
= f.input :title, :
|
1
|
+
= simple_form_for(post, (EffectivePosts.admin_simple_form_options || {}).merge(:url => (post.persisted? ? effective_posts.admin_post_path(post.id) : effective_posts.admin_posts_path))) do |f|
|
2
|
+
= f.input :title, hint: 'The title of your post.'
|
3
3
|
|
4
4
|
- if Array(EffectivePosts.categories).length > 0
|
5
|
-
= f.input :category,
|
5
|
+
= f.input :category,
|
6
|
+
as: (defined?(EffectiveFormInputs) ? :effective_select : :select),
|
7
|
+
collection: EffectivePosts.categories,
|
8
|
+
include_blank: false
|
6
9
|
- else
|
7
|
-
= f.input :category, :
|
10
|
+
= f.input :category, as: :hidden, input_html: { value: 'posts' }
|
8
11
|
|
9
|
-
|
10
|
-
= f.input :draft, :hint => "Save this post as a draft. It will not be accessible on the website."
|
12
|
+
= render partial: '/effective/posts/additional_fields', locals: { post: post, form: f, f: f }
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
= f.input :draft, hint: 'Save this post as a draft. It will not be accessible on the website.'
|
15
|
+
|
16
|
+
= f.input :published_at,
|
17
|
+
as: (defined?(EffectiveFormInputs) ? :effective_date_time_picker : :datetime),
|
18
|
+
label: 'Publish date',
|
19
|
+
hint: 'When your post will be displayed on the website.'
|
20
|
+
|
21
|
+
= f.input :body,
|
22
|
+
as: (defined?(EffectiveFormInputs) ? :effective_ckeditor_text_area : :text),
|
23
|
+
hint: 'The body of your post.',
|
24
|
+
toolbar: 'simple',
|
25
|
+
required: true
|
16
26
|
|
17
|
-
- if defined?(EffectiveRoles) and f.object.respond_to?(:roles)
|
18
|
-
= f.input :roles, :
|
27
|
+
- if defined?(EffectiveRoles) and f.object.respond_to?(:roles) && EffectivePosts.use_effective_roles
|
28
|
+
= f.input :roles, collection: EffectiveRoles.roles_collection(f.object), as: :check_boxes, hint: '* leave blank for a regular public post that anyone can view'
|
19
29
|
|
20
|
-
.
|
21
|
-
.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
= f.button :submit, 'Save and Edit Content', data: { disable_with: 'Saving...' }
|
27
|
-
= f.button :submit, 'Save and Add New', data: { disable_with: 'Saving...' }
|
28
|
-
= link_to 'Cancel', effective_posts.admin_posts_path
|
30
|
+
.effective-post-actions.pull-right
|
31
|
+
= f.button :submit, 'Save', data: { disable_with: 'Saving...' }
|
32
|
+
- if defined?(EffectiveRegions)
|
33
|
+
= f.button :submit, 'Save and Edit Content', data: { disable_with: 'Saving...' }
|
34
|
+
= f.button :submit, 'Save and Add New', data: { disable_with: 'Saving...' }
|
35
|
+
= link_to 'Cancel', effective_posts.admin_posts_path
|
@@ -1,2 +1,2 @@
|
|
1
1
|
%h2= @page_title
|
2
|
-
= render :
|
2
|
+
= render partial: 'form', as: :post, object: @post
|
@@ -1,2 +1,2 @@
|
|
1
1
|
%h2= @page_title
|
2
|
-
= render :
|
2
|
+
= render partial: 'form', as: :post, object: @post
|
@@ -0,0 +1,27 @@
|
|
1
|
+
= simple_form_for(post, (EffectivePosts.simple_form_options || {}).merge(:url => (post.persisted? ? effective_posts.post_path(post.id) : effective_posts.posts_path))) do |f|
|
2
|
+
= f.input :title, hint: 'The title of your post.'
|
3
|
+
|
4
|
+
- if Array(EffectivePosts.categories).length > 0
|
5
|
+
= f.input :category,
|
6
|
+
as: (defined?(EffectiveFormInputs) ? :effective_select : :select),
|
7
|
+
collection: EffectivePosts.categories,
|
8
|
+
include_blank: false
|
9
|
+
- else
|
10
|
+
= f.input :category, as: :hidden, input_html: { value: 'posts' }
|
11
|
+
|
12
|
+
= render partial: '/effective/posts/additional_fields', locals: { post: post, form: f, f: f }
|
13
|
+
|
14
|
+
= f.input :published_at,
|
15
|
+
as: (defined?(EffectiveFormInputs) ? :effective_date_time_picker : :datetime),
|
16
|
+
label: 'Publish date',
|
17
|
+
hint: 'When your post will be displayed on the website.'
|
18
|
+
|
19
|
+
= f.input :body,
|
20
|
+
as: (defined?(EffectiveFormInputs) ? :effective_ckeditor_text_area : :text),
|
21
|
+
hint: 'The body of your post.',
|
22
|
+
toolbar: 'simple',
|
23
|
+
required: true
|
24
|
+
|
25
|
+
%p.effective-post-actions.pull-right
|
26
|
+
= f.button :submit, 'Save', data: { disable_with: 'Saving...' }
|
27
|
+
= link_to 'Cancel', effective_posts.posts_path
|
@@ -0,0 +1 @@
|
|
1
|
+
- # intentionally left blank
|
@@ -1,4 +1,9 @@
|
|
1
|
+
- if EffectivePosts.submissions_enabled
|
2
|
+
%p.text-right= link_to 'Submit New Post', effective_posts.new_post_path, class: 'btn btn-primary'
|
3
|
+
|
4
|
+
%nav= paginate @posts
|
5
|
+
|
1
6
|
.effective-posts
|
2
|
-
= render :
|
7
|
+
= render partial: @posts, spacer_template: 'spacer'
|
3
8
|
|
4
|
-
|
9
|
+
%nav= paginate @posts
|
@@ -1,12 +1,12 @@
|
|
1
1
|
.effective-post
|
2
2
|
%h2.post-title
|
3
|
-
%a{:
|
3
|
+
%a{href: effective_post_path(@post)}
|
4
4
|
= simple_effective_region @post, :title do
|
5
5
|
= @post.title
|
6
6
|
|
7
7
|
%p.post-meta= post_meta(@post)
|
8
8
|
|
9
|
-
.post-content
|
10
|
-
= effective_region @post, :
|
9
|
+
.post-body.post-content
|
10
|
+
= effective_region @post, :body do
|
11
11
|
%p Default content
|
12
12
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
%h2= @page_title
|
2
|
+
|
3
|
+
%p= EffectivePosts.submissions_note
|
4
|
+
|
5
|
+
- if (EffectivePosts.authorized?(controller, :edit, @post) rescue false)
|
6
|
+
%p= link_to 'Edit Post', effective_posts.edit_post_path(@post), class: 'btn btn-primary btn-edit-post'
|
7
|
+
|
8
|
+
%hr
|
9
|
+
|
10
|
+
= render file: '/effective/posts/show'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
%p A new post has been submitted and needs your approval before it may be displayed on the website:
|
2
|
+
|
3
|
+
%p= link_to 'Approve Post', effective_posts.admin_approve_post_path(@post)
|
4
|
+
|
5
|
+
%hr
|
6
|
+
|
7
|
+
%h3 Title
|
8
|
+
%p= @post.title
|
9
|
+
|
10
|
+
%h3 Category
|
11
|
+
%p= @post.category
|
12
|
+
|
13
|
+
- if @post.user.present?
|
14
|
+
%h3 Submitted by
|
15
|
+
%p= @post.user
|
16
|
+
|
17
|
+
%h3 Body
|
18
|
+
%p= @post.body
|
19
|
+
|
20
|
+
%hr
|
21
|
+
|
22
|
+
%p= link_to 'Approve Post', effective_posts.admin_approve_post_path(@post)
|
data/config/routes.rb
CHANGED
@@ -1,18 +1,23 @@
|
|
1
1
|
EffectivePosts::Engine.routes.draw do
|
2
2
|
namespace :admin do
|
3
|
-
resources :posts, :
|
4
|
-
|
3
|
+
resources :posts, except: [:show]
|
4
|
+
|
5
|
+
if EffectivePosts.submissions_enabled && EffectivePosts.submissions_require_approval
|
6
|
+
match 'posts/:id/approve', to: 'posts#approve', via: :get, as: :approve_post
|
7
|
+
end
|
8
|
+
|
9
|
+
match 'posts/excerpts', to: 'posts#excerpts', via: :get
|
5
10
|
end
|
6
11
|
|
7
12
|
scope :module => 'effective' do
|
8
|
-
resources :posts, :
|
13
|
+
resources :posts, only: ([:index, :show] unless EffectivePosts.submissions_enabled)
|
9
14
|
|
10
15
|
if EffectivePosts.use_category_routes
|
11
|
-
EffectivePosts.categories.each do |category|
|
12
|
-
next if category
|
16
|
+
Array(EffectivePosts.categories).map { |category| category.to_s }.each do |category|
|
17
|
+
next if category == 'posts'
|
13
18
|
|
14
|
-
match
|
15
|
-
match "#{category}/:id", :
|
19
|
+
match category, to: 'posts#index', via: :get, defaults: {:category => category }
|
20
|
+
match "#{category}/:id", to: 'posts#show', via: :get, defaults: {:category => category }
|
16
21
|
end
|
17
22
|
end
|
18
23
|
end
|
data/lib/effective_posts.rb
CHANGED
@@ -10,15 +10,28 @@ module EffectivePosts
|
|
10
10
|
mattr_accessor :posts_table_name
|
11
11
|
|
12
12
|
mattr_accessor :authorization_method
|
13
|
-
mattr_accessor :
|
13
|
+
mattr_accessor :permitted_params
|
14
|
+
|
14
15
|
mattr_accessor :layout
|
16
|
+
mattr_accessor :simple_form_options
|
17
|
+
mattr_accessor :admin_simple_form_options
|
15
18
|
|
16
19
|
mattr_accessor :categories
|
17
20
|
mattr_accessor :use_category_routes
|
18
21
|
|
22
|
+
mattr_accessor :use_effective_roles
|
23
|
+
|
19
24
|
mattr_accessor :per_page
|
20
25
|
mattr_accessor :post_meta_author
|
21
26
|
|
27
|
+
mattr_accessor :submissions_enabled
|
28
|
+
mattr_accessor :submissions_require_current_user
|
29
|
+
mattr_accessor :submissions_require_approval
|
30
|
+
mattr_accessor :submissions_note
|
31
|
+
|
32
|
+
# These are hashes of configs
|
33
|
+
mattr_accessor :mailer
|
34
|
+
|
22
35
|
def self.setup
|
23
36
|
yield self
|
24
37
|
end
|
@@ -29,4 +42,9 @@ module EffectivePosts
|
|
29
42
|
end
|
30
43
|
true
|
31
44
|
end
|
45
|
+
|
46
|
+
def self.permitted_params
|
47
|
+
@@permitted_params ||= [:title, :draft, :category, :published_at, :body, roles: []]
|
48
|
+
end
|
49
|
+
|
32
50
|
end
|
@@ -25,6 +25,16 @@ module EffectivePosts
|
|
25
25
|
migration_template '../../../db/migrate/01_create_effective_posts.rb.erb', 'db/migrate/create_effective_posts.rb'
|
26
26
|
end
|
27
27
|
|
28
|
+
def copy_mailer_preview
|
29
|
+
mailer_preview_path = (Rails.application.config.action_mailer.preview_path rescue nil)
|
30
|
+
|
31
|
+
if mailer_preview_path.present?
|
32
|
+
template 'effective_posts_mailer_preview.rb', File.join(mailer_preview_path, 'effective_posts_mailer_preview.rb')
|
33
|
+
else
|
34
|
+
puts "couldn't find action_mailer.preview_path. Skipping effective_posts_mailer_preview."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
28
38
|
def show_readme
|
29
39
|
readme "README" if behavior == :invoke
|
30
40
|
end
|
@@ -31,22 +31,65 @@ EffectivePosts.setup do |config|
|
|
31
31
|
# Layout Settings
|
32
32
|
# Configure the Layout per controller, or all at once
|
33
33
|
config.layout = {
|
34
|
-
:
|
35
|
-
:
|
34
|
+
posts: 'application',
|
35
|
+
admin: 'application'
|
36
36
|
}
|
37
37
|
|
38
38
|
# SimpleForm Options
|
39
|
-
# This Hash of options will be passed into any simple_form_for() calls
|
39
|
+
# This Hash of options will be passed into any client facing simple_form_for() calls
|
40
40
|
config.simple_form_options = {}
|
41
|
+
config.admin_simple_form_options = {} # For the /admin/posts/new form
|
41
42
|
|
42
43
|
# config.simple_form_options = {
|
43
|
-
# :
|
44
|
-
# :
|
45
|
-
# :
|
46
|
-
# :
|
47
|
-
# :
|
48
|
-
# :
|
44
|
+
# html: {class: 'form-horizontal'},
|
45
|
+
# wrapper: :horizontal_form,
|
46
|
+
# wrapper_mappings: {
|
47
|
+
# boolean: :horizontal_boolean,
|
48
|
+
# check_boxes: :horizontal_radio_and_checkboxes,
|
49
|
+
# radio_buttons: :horizontal_radio_and_checkboxes
|
49
50
|
# }
|
50
51
|
# }
|
51
52
|
|
53
|
+
# Display the effective roles 'choose roles' input when an admin creates a new post
|
54
|
+
config.use_effective_roles = true
|
55
|
+
|
56
|
+
# Submissions
|
57
|
+
# Allow users to submit posts (optionally for approval) to display on the website
|
58
|
+
config.submissions_enabled = true
|
59
|
+
|
60
|
+
# When true, a user might be signed in to submit a post. (calls devise's authenticate_user!)
|
61
|
+
config.submissions_require_current_user = false
|
62
|
+
|
63
|
+
# When true, an Admin must first approve any newly submitted posts before they'll be displayed
|
64
|
+
config.submissions_require_approval = true
|
65
|
+
|
66
|
+
# The Thank you message when they submit a post
|
67
|
+
config.submissions_note = "News & Event submitted! A confirmation email has been sent to the AALA office. When approved, your submission will appear on the website."
|
68
|
+
|
69
|
+
# Mailer Settings
|
70
|
+
# effective_posts will send the admin an email when a post is submitted
|
71
|
+
# For all the emails, the same :subject_prefix will be prefixed. Leave as nil / empty string if you don't want any prefix
|
72
|
+
#
|
73
|
+
# The subject_for_post_submitted_to_admin can be one of:
|
74
|
+
# - nil / empty string to use the built in defaults
|
75
|
+
# - A string with the full subject line for this email
|
76
|
+
# - A Proc to create the subject line based on the email
|
77
|
+
# In all three of these cases, the subject_prefix will still be used.
|
78
|
+
|
79
|
+
# The Procs are the same for admin & buyer receipt, the seller Proc is different
|
80
|
+
# subject_for_post_submitted_to_admin: Proc.new { |post| "Post needs approval"}
|
81
|
+
|
82
|
+
config.mailer = {
|
83
|
+
subject_prefix: '[example]',
|
84
|
+
subject_for_post_submitted_to_admin: '',
|
85
|
+
|
86
|
+
layout: 'effective_posts_mailer_layout',
|
87
|
+
|
88
|
+
default_from: 'info@example.com',
|
89
|
+
admin_email: 'admin@example.com',
|
90
|
+
|
91
|
+
deliver_method: nil, # :deliver (rails < 4.2), :deliver_now (rails >= 4.2) or :deliver_later
|
92
|
+
delayed_job_deliver: false
|
93
|
+
}
|
94
|
+
|
52
95
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# In Rails 4.1 and above, visit:
|
2
|
+
# http://localhost:3000/rails/mailers
|
3
|
+
# to see a preview of the following 3 emails:
|
4
|
+
|
5
|
+
class EffectivePostsMailerPreview < ActionMailer::Preview
|
6
|
+
def post_submitted_to_admin
|
7
|
+
Effective::PostsMailer.post_submitted_to_admin(build_preview_post)
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def build_preview_post
|
13
|
+
post = Effective::Post.new(
|
14
|
+
title: 'An example post',
|
15
|
+
category: EffectivePosts.categories.first.presence || 'posts',
|
16
|
+
published_at: Time.zone.now,
|
17
|
+
draft: true,
|
18
|
+
content: 'This is a new post that has been submitted by a public user.'
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
metadata
CHANGED
@@ -1,141 +1,141 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_posts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: haml-rails
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sass-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: kaminari
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: nokogiri
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: simple_form
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: effective_ckeditor
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: 1.2.0
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 1.2.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: effective_datatables
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 2.0.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 2.0.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: effective_regions
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.
|
131
|
+
version: 1.6.9
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 1.
|
138
|
+
version: 1.6.9
|
139
139
|
description: A blog implementation with WYSIWYG content editing, post scheduling,
|
140
140
|
pagination and optional top level routes for each post category.
|
141
141
|
email:
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- app/helpers/effective_kaminari_helper.rb
|
156
156
|
- app/helpers/effective_posts_helper.rb
|
157
157
|
- app/helpers/effective_truncate_html_helper.rb
|
158
|
+
- app/mailers/effective/posts_mailer.rb
|
158
159
|
- app/models/effective/access_denied.rb
|
159
160
|
- app/models/effective/datatables/posts.rb
|
160
161
|
- app/models/effective/post.rb
|
@@ -165,10 +166,18 @@ files:
|
|
165
166
|
- app/views/admin/posts/excerpts.html.haml
|
166
167
|
- app/views/admin/posts/index.html.haml
|
167
168
|
- app/views/admin/posts/new.html.haml
|
169
|
+
- app/views/effective/posts/_additional_fields.html.haml
|
170
|
+
- app/views/effective/posts/_categories.html.haml
|
171
|
+
- app/views/effective/posts/_form.html.haml
|
168
172
|
- app/views/effective/posts/_post.html.haml
|
173
|
+
- app/views/effective/posts/_recent_posts.html.haml
|
169
174
|
- app/views/effective/posts/_spacer.html.haml
|
175
|
+
- app/views/effective/posts/edit.html.haml
|
170
176
|
- app/views/effective/posts/index.html.haml
|
177
|
+
- app/views/effective/posts/new.html.haml
|
171
178
|
- app/views/effective/posts/show.html.haml
|
179
|
+
- app/views/effective/posts/submitted.html.haml
|
180
|
+
- app/views/effective/posts_mailer/post_submitted_to_admin.html.haml
|
172
181
|
- app/views/effective/snippets/_read_more_divider.html.haml
|
173
182
|
- app/views/kaminari/_first_page.html.haml
|
174
183
|
- app/views/kaminari/_gap.html.haml
|
@@ -177,6 +186,7 @@ files:
|
|
177
186
|
- app/views/kaminari/_page.html.haml
|
178
187
|
- app/views/kaminari/_paginator.html.haml
|
179
188
|
- app/views/kaminari/_prev_page.html.haml
|
189
|
+
- app/views/layouts/effective_posts_mailer_layout.html.haml
|
180
190
|
- config/routes.rb
|
181
191
|
- db/migrate/01_create_effective_posts.rb.erb
|
182
192
|
- lib/effective_posts.rb
|
@@ -185,6 +195,7 @@ files:
|
|
185
195
|
- lib/generators/effective_posts/install_generator.rb
|
186
196
|
- lib/generators/templates/README
|
187
197
|
- lib/generators/templates/effective_posts.rb
|
198
|
+
- lib/generators/templates/effective_posts_mailer_preview.rb
|
188
199
|
- spec/effective_pages_spec.rb
|
189
200
|
- spec/spec_helper.rb
|
190
201
|
- spec/support/factories.rb
|
@@ -198,17 +209,17 @@ require_paths:
|
|
198
209
|
- lib
|
199
210
|
required_ruby_version: !ruby/object:Gem::Requirement
|
200
211
|
requirements:
|
201
|
-
- -
|
212
|
+
- - ">="
|
202
213
|
- !ruby/object:Gem::Version
|
203
214
|
version: '0'
|
204
215
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
216
|
requirements:
|
206
|
-
- -
|
217
|
+
- - ">="
|
207
218
|
- !ruby/object:Gem::Version
|
208
219
|
version: '0'
|
209
220
|
requirements: []
|
210
221
|
rubyforge_project:
|
211
|
-
rubygems_version: 2.4.
|
222
|
+
rubygems_version: 2.4.5.1
|
212
223
|
signing_key:
|
213
224
|
specification_version: 4
|
214
225
|
summary: A blog implementation with WYSIWYG content editing, post scheduling, pagination
|