proclaim 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/proclaim/editor.coffee +8 -1
- data/app/assets/stylesheets/proclaim/posts.scss +38 -12
- data/app/controllers/proclaim/posts_controller.rb +11 -2
- data/app/models/proclaim/post.rb +27 -14
- data/app/views/proclaim/posts/_form.html.erb +24 -8
- data/app/views/proclaim/posts/show.html.erb +4 -1
- data/db/migrate/20190615232009_create_punches_table.rb +21 -0
- data/db/migrate/20190617014907_add_subtitle_to_posts.rb +5 -0
- data/lib/proclaim/engine.rb +1 -0
- data/lib/proclaim/version.rb +1 -1
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26d5c8a84089609896acf5ec9d4217133f38e7610d5928bb787344ca708f034f
|
4
|
+
data.tar.gz: d2a9d27c63d5594e85db0d0f77a5540305d9590c92094e9026a10328e824ee2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e03292d0337594913998faa19610a6c386a01647ed36ae1848241d73670eb8e2f94ac1795290f3aa33ca14b1b10f10c75114be6e1e46fc75700c3407794d3f2
|
7
|
+
data.tar.gz: bdd25c22095e91b41e494c9113735e859f992b6c7ba0e1e6767e100f7cb7fcd4f9fec926f6947b7c11d43424e745e71a7b15eef5ba0724561cd30e877cb77c9e
|
@@ -1,9 +1,11 @@
|
|
1
1
|
class Editor
|
2
2
|
constructor: (@form, @titleFormField, @titleEditableItem, @titleContents,
|
3
|
+
@subtitleFormField, @subtitleEditableItem, @subtitleContents,
|
3
4
|
@bodyFormField, @quillBodyFormField, @bodyEditableItem,
|
4
5
|
@bodyScrollingContainer, @bodyContents, @toolbar, @formats) ->
|
5
6
|
if (@form.length == 1) and (@titleFormField.length == 1) and
|
6
|
-
(@titleEditableItem.length == 1) and (@
|
7
|
+
(@titleEditableItem.length == 1) and (@subtitleFormField.length == 1) and
|
8
|
+
(@subtitleEditableItem.length == 1)and (@bodyFormField.length == 1) and
|
7
9
|
(@bodyEditableItem.length == 1) and (@bodyScrollingContainer.length == 1)
|
8
10
|
@bodyEditor = new Quill(@bodyEditableItem.get(0), {
|
9
11
|
placeholder: @bodyEditableItem.data("placeholder"),
|
@@ -25,14 +27,19 @@ class Editor
|
|
25
27
|
@form.on "submit", @updateFormFields
|
26
28
|
@titleEditableItem.on "paste", @stripFormatting
|
27
29
|
@titleEditableItem.on "keypress", @disallowNewlines
|
30
|
+
@subtitleEditableItem.on "paste", @stripFormatting
|
31
|
+
@subtitleEditableItem.on "keypress", @disallowNewlines
|
28
32
|
|
29
33
|
cleanBindings: ->
|
30
34
|
@form.off "submit"
|
31
35
|
@titleEditableItem.off "paste"
|
32
36
|
@titleEditableItem.off "keypress"
|
37
|
+
@subtitleEditableItem.off "paste"
|
38
|
+
@subtitleEditableItem.off "keypress"
|
33
39
|
|
34
40
|
updateFormFields: (event) =>
|
35
41
|
@titleFormField.val(@titleEditableItem.text())
|
42
|
+
@subtitleFormField.val(@subtitleEditableItem.text())
|
36
43
|
@quillBodyFormField.val(JSON.stringify(@bodyEditor.getContents()))
|
37
44
|
@bodyFormField.val(@bodyEditableItem.children('div.ql-editor').html())
|
38
45
|
|
@@ -3,12 +3,15 @@
|
|
3
3
|
They will automatically be included in application.css.
|
4
4
|
*/
|
5
5
|
|
6
|
+
div.post_title
|
7
|
+
{
|
8
|
+
border-bottom: solid 1px #ddd;
|
9
|
+
}
|
10
|
+
|
6
11
|
h1.post_title
|
7
12
|
{
|
8
13
|
text-align: center;
|
9
|
-
padding-bottom: 10px;
|
10
14
|
font-weight: bold;
|
11
|
-
border-bottom: solid 1px #ddd;
|
12
15
|
|
13
16
|
&:empty:before
|
14
17
|
{
|
@@ -19,6 +22,39 @@ h1.post_title
|
|
19
22
|
}
|
20
23
|
}
|
21
24
|
|
25
|
+
h1.post_title.editable
|
26
|
+
{
|
27
|
+
margin-bottom: 20px;
|
28
|
+
&:after
|
29
|
+
{
|
30
|
+
position: relative;
|
31
|
+
text-align: center;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
h2.post_subtitle
|
36
|
+
{
|
37
|
+
text-align: center;
|
38
|
+
|
39
|
+
&:empty:before
|
40
|
+
{
|
41
|
+
content: attr(placeholder);
|
42
|
+
display: block; /* For Firefox */
|
43
|
+
font-style: italic;
|
44
|
+
color: rgba(0,0,0,0.6);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
h2.post_subtitle.editable
|
49
|
+
{
|
50
|
+
margin-bottom: 20px;
|
51
|
+
&:after
|
52
|
+
{
|
53
|
+
position: relative;
|
54
|
+
text-align: center;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
22
58
|
div.post_information
|
23
59
|
{
|
24
60
|
border-top: solid 1px #ddd;
|
@@ -88,16 +124,6 @@ div.post_body.editable:after
|
|
88
124
|
top: 0;
|
89
125
|
}
|
90
126
|
|
91
|
-
h1.post_title.editable
|
92
|
-
{
|
93
|
-
margin-bottom: 20px;
|
94
|
-
&:after
|
95
|
-
{
|
96
|
-
position: relative;
|
97
|
-
text-align: center;
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
127
|
/* Specify our own scrolling container */
|
102
128
|
div.scrolling-container {
|
103
129
|
height: 100%;
|
@@ -17,6 +17,11 @@ module Proclaim
|
|
17
17
|
def show
|
18
18
|
authorize @post
|
19
19
|
|
20
|
+
# Don't track traffic if it's a logged-in user
|
21
|
+
unless current_author
|
22
|
+
@post.punch(request)
|
23
|
+
end
|
24
|
+
|
20
25
|
# If an old id or a numeric id was used to find the record, then
|
21
26
|
# the request path will not match the post_path, and we should do
|
22
27
|
# a 301 redirect that uses the current friendly id.
|
@@ -99,12 +104,16 @@ module Proclaim
|
|
99
104
|
|
100
105
|
# Only allow a trusted parameter "white list" through.
|
101
106
|
def post_params
|
102
|
-
# Ensure post title
|
107
|
+
# Ensure post title and subtitle are sanitized of all HTML
|
103
108
|
if params[:post].include? :title
|
104
109
|
params[:post][:title] = HTMLEntities.new.decode(Rails::Html::FullSanitizer.new.sanitize(params[:post][:title]))
|
105
110
|
end
|
106
111
|
|
107
|
-
params
|
112
|
+
if params[:post].include? :subtitle
|
113
|
+
params[:post][:subtitle] = HTMLEntities.new.decode(Rails::Html::FullSanitizer.new.sanitize(params[:post][:subtitle]))
|
114
|
+
end
|
115
|
+
|
116
|
+
params.require(:post).permit(:title, :subtitle, :body, :quill_body)
|
108
117
|
end
|
109
118
|
end
|
110
119
|
end
|
data/app/models/proclaim/post.rb
CHANGED
@@ -40,7 +40,7 @@ module Proclaim
|
|
40
40
|
validates_presence_of :published_at, if: :published?
|
41
41
|
validates :published_at, absence: true, unless: :published?
|
42
42
|
|
43
|
-
validates_presence_of :title, :body, :quill_body, :author
|
43
|
+
validates_presence_of :title, :subtitle, :body, :quill_body, :author
|
44
44
|
validate :verifyBodyHtml
|
45
45
|
|
46
46
|
after_validation :move_friendly_id_error_to_title
|
@@ -48,25 +48,14 @@ module Proclaim
|
|
48
48
|
# Using after_commit since we use deliver_later and re-load them from the database
|
49
49
|
after_commit :notifyBlogSubscribersIfPublished, on: [:create, :update]
|
50
50
|
|
51
|
-
#
|
52
|
-
|
53
|
-
# No real reason to keep a slug history unless it's been published
|
54
|
-
unless published?
|
55
|
-
slugs.destroy_all
|
56
|
-
end
|
57
|
-
|
58
|
-
super
|
59
|
-
end
|
51
|
+
# Track views
|
52
|
+
acts_as_punchable
|
60
53
|
|
61
54
|
attr_writer :excerpt_length
|
62
55
|
def excerpt_length
|
63
56
|
@excerpt_length ||= Proclaim.excerpt_length
|
64
57
|
end
|
65
58
|
|
66
|
-
def body_plaintext
|
67
|
-
HTMLEntities.new.decode(Rails::Html::FullSanitizer.new.sanitize(body.gsub(/\r\n?/, ' ')))
|
68
|
-
end
|
69
|
-
|
70
59
|
def excerpt
|
71
60
|
document = Nokogiri::HTML.fragment(body)
|
72
61
|
|
@@ -86,8 +75,32 @@ module Proclaim
|
|
86
75
|
end
|
87
76
|
end
|
88
77
|
|
78
|
+
def feature_image
|
79
|
+
document = Nokogiri::HTML.fragment(body)
|
80
|
+
return nil if document.children.empty?
|
81
|
+
|
82
|
+
first_element_images = document.children.first.css("img")
|
83
|
+
return nil if first_element_images.empty?
|
84
|
+
|
85
|
+
return first_element_images.first.attr "src"
|
86
|
+
end
|
87
|
+
|
89
88
|
private
|
90
89
|
|
90
|
+
# Only save the slug history if the post is published
|
91
|
+
def create_slug
|
92
|
+
# No real reason to keep a slug history unless it's been published
|
93
|
+
unless published?
|
94
|
+
slugs.destroy_all
|
95
|
+
end
|
96
|
+
|
97
|
+
super
|
98
|
+
end
|
99
|
+
|
100
|
+
def body_plaintext
|
101
|
+
HTMLEntities.new.decode(Rails::Html::FullSanitizer.new.sanitize(body.gsub(/\r\n?/, ' ')))
|
102
|
+
end
|
103
|
+
|
91
104
|
def should_generate_new_friendly_id?
|
92
105
|
title_changed? || super
|
93
106
|
end
|
@@ -10,8 +10,11 @@
|
|
10
10
|
<% if @post.new_record? %>
|
11
11
|
new Editor($(document).find("form.new_post"),
|
12
12
|
$(document).find("input#post_title"),
|
13
|
-
$(document).find("form.new_post h1.editable"),
|
13
|
+
$(document).find("form.new_post h1.post_title.editable"),
|
14
14
|
'<%= @post.title.html_safe.strip %>',
|
15
|
+
$(document).find("input#post_subtitle"),
|
16
|
+
$(document).find("form.new_post h2.post_subtitle.editable"),
|
17
|
+
'<%= @post.subtitle.html_safe.strip %>',
|
15
18
|
$(document).find("input#post_body"),
|
16
19
|
$(document).find("input#post_quill_body"),
|
17
20
|
$(document).find("form.new_post div.editable"),
|
@@ -22,8 +25,11 @@
|
|
22
25
|
<% else %>
|
23
26
|
new Editor($(document).find("form.edit_post"),
|
24
27
|
$(document).find("input#post_title"),
|
25
|
-
$(document).find("form.edit_post h1.editable"),
|
28
|
+
$(document).find("form.edit_post h1.post_title.editable"),
|
26
29
|
'<%= @post.title.html_safe.strip %>',
|
30
|
+
$(document).find("input#post_subtitle"),
|
31
|
+
$(document).find("form.edit_post h2.post_subtitle.editable"),
|
32
|
+
'<%= @post.subtitle.html_safe.strip %>',
|
27
33
|
$(document).find("input#post_body"),
|
28
34
|
$(document).find("input#post_quill_body"),
|
29
35
|
$(document).find("form.edit_post div.editable"),
|
@@ -49,12 +55,21 @@
|
|
49
55
|
<% end %>
|
50
56
|
|
51
57
|
<div class = "post">
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
+
<div class = "post_title">
|
59
|
+
<%=
|
60
|
+
fake_form_field @post, :title do
|
61
|
+
content_tag :h1, @post.title, class: "post_title editable",
|
62
|
+
contenteditable: true, placeholder: "Post Title"
|
63
|
+
end
|
64
|
+
%>
|
65
|
+
|
66
|
+
<%=
|
67
|
+
fake_form_field @post, :subtitle do
|
68
|
+
content_tag :h2, @post.subtitle, class: "post_subtitle editable",
|
69
|
+
contenteditable: true, placeholder: "Post Subtitle"
|
70
|
+
end
|
71
|
+
%>
|
72
|
+
</div>
|
58
73
|
|
59
74
|
<div id="scrolling-container">
|
60
75
|
<%=
|
@@ -79,6 +94,7 @@
|
|
79
94
|
</div>
|
80
95
|
|
81
96
|
<%= f.hidden_field :title %>
|
97
|
+
<%= f.hidden_field :subtitle %>
|
82
98
|
<%= f.hidden_field :body %>
|
83
99
|
<%= f.hidden_field :quill_body %>
|
84
100
|
|
@@ -42,7 +42,10 @@
|
|
42
42
|
</div>
|
43
43
|
|
44
44
|
<div class = "post">
|
45
|
-
<
|
45
|
+
<div class = "post_title">
|
46
|
+
<h1 class = "post_title"><%= content_for :proclaim_title %></h1>
|
47
|
+
<h2 class = "post_subtitle"><%= @post.subtitle %></h2>
|
48
|
+
</div>
|
46
49
|
|
47
50
|
<div id="scrolling-container">
|
48
51
|
<div class = "post_body show">
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class CreatePunchesTable < ActiveRecord::Migration[4.2]
|
2
|
+
def self.up
|
3
|
+
create_table :punches do |t|
|
4
|
+
t.integer :punchable_id, :null => false
|
5
|
+
t.string :punchable_type, :null => false, :limit => 20
|
6
|
+
t.datetime :starts_at, :null => false
|
7
|
+
t.datetime :ends_at, :null => false
|
8
|
+
t.datetime :average_time, :null => false
|
9
|
+
t.integer :hits, :null => false, :default=>1
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index :punches, [:punchable_type, :punchable_id], :name => :punchable_index, :unique => false
|
13
|
+
add_index :punches, :average_time, :unique => false
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.down
|
17
|
+
remove_index :punches, :name => :punchable_index
|
18
|
+
remove_index :punches, :average_time
|
19
|
+
drop_table :punches
|
20
|
+
end
|
21
|
+
end
|
data/lib/proclaim/engine.rb
CHANGED
data/lib/proclaim/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: proclaim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle Fazzari
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -192,6 +192,20 @@ dependencies:
|
|
192
192
|
- - "~>"
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: 2.0.1
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: punching_bag
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 0.6.1
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 0.6.1
|
195
209
|
- !ruby/object:Gem::Dependency
|
196
210
|
name: sqlite3
|
197
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -407,6 +421,8 @@ files:
|
|
407
421
|
- db/migrate/20141115022230_create_proclaim_comment_hierarchies.rb
|
408
422
|
- db/migrate/20141210234057_create_proclaim_subscriptions.rb
|
409
423
|
- db/migrate/20150213015321_create_friendly_id_slugs.rb
|
424
|
+
- db/migrate/20190615232009_create_punches_table.rb
|
425
|
+
- db/migrate/20190617014907_add_subtitle_to_posts.rb
|
410
426
|
- lib/generators/proclaim/install_generator.rb
|
411
427
|
- lib/generators/proclaim/templates/README
|
412
428
|
- lib/generators/proclaim/templates/initialize_proclaim.rb
|
@@ -513,7 +529,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
513
529
|
requirements:
|
514
530
|
- - ">="
|
515
531
|
- !ruby/object:Gem::Version
|
516
|
-
version:
|
532
|
+
version: 2.6.0
|
517
533
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
518
534
|
requirements:
|
519
535
|
- - ">="
|