proclaim 0.6.0 → 0.6.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.
- 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
|
- - ">="
|