pulitzer 0.2.2 → 0.3.0
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/pulitzer.js +13 -4
- data/app/controllers/pulitzer/content_elements_controller.rb +3 -17
- data/app/controllers/pulitzer/post_tags_controller.rb +8 -8
- data/app/controllers/pulitzer/posts_controller.rb +4 -2
- data/app/controllers/pulitzer/versions_controller.rb +13 -4
- data/app/helpers/pulitzer/posts_helper.rb +1 -5
- data/app/interactions/pulitzer/clone_version.rb +22 -3
- data/app/interactions/pulitzer/create_post_tag.rb +6 -8
- data/app/interactions/pulitzer/update_version_status.rb +5 -1
- data/app/models/pulitzer/content_element.rb +4 -3
- data/app/models/pulitzer/post.rb +17 -1
- data/app/models/pulitzer/version.rb +11 -1
- data/app/validators/pulitzer/content_element_validator.rb +24 -0
- data/app/views/pulitzer/content_elements/_form.html.erb +1 -1
- data/app/views/pulitzer/content_elements/_index.html.erb +20 -0
- data/app/views/pulitzer/content_elements/{index_processing.html.erb → _index_processing.html.erb} +0 -0
- data/app/views/pulitzer/content_elements/_new.html.erb +6 -6
- data/app/views/pulitzer/content_elements/_show.html.erb +1 -1
- data/app/views/pulitzer/content_elements/_show_wrapper.html.erb +2 -2
- data/app/views/pulitzer/post_tags/_new.html.erb +3 -3
- data/app/views/pulitzer/post_tags/_show.html.erb +3 -3
- data/app/views/pulitzer/post_tags/_show_wrapper.html.erb +1 -1
- data/app/views/pulitzer/posts/_show.html.erb +1 -1
- data/app/views/pulitzer/posts/edit.html.erb +10 -0
- data/app/views/pulitzer/versions/_edit.html.erb +41 -0
- data/app/views/pulitzer/versions/_form.html.erb +2 -9
- data/config/routes.rb +6 -2
- data/db/migrate/20160122204201_add_errors_to_version.rb +5 -0
- data/lib/pulitzer/version.rb +1 -1
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +3 -7
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +7574 -0
- data/spec/dummy/public/uploads/tmp/1453739521-68535-5576/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453739521-68535-5576/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453739521-68535-5576/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453739650-68698-8068/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453739650-68698-8068/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453739650-68698-8068/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453740957-70195-5923/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453740957-70195-5923/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453740957-70195-5923/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741054-70338-5984/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741054-70338-5984/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741054-70338-5984/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741100-70403-3570/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741100-70403-3570/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741100-70403-3570/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741119-70445-1368/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741119-70445-1368/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741119-70445-1368/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741152-70510-7020/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741152-70510-7020/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741152-70510-7020/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741165-70539-8838/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741165-70539-8838/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741165-70539-8838/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741192-70601-8114/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741192-70601-8114/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741192-70601-8114/thumb_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741252-70701-6629/cms_sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741252-70701-6629/sam_and_snow.jpg +0 -0
- data/spec/dummy/public/uploads/tmp/1453741252-70701-6629/thumb_sam_and_snow.jpg +0 -0
- data/spec/interactions/clone_version_spec.rb +2 -0
- data/spec/models/content_element_spec.rb +0 -2
- data/spec/models/version_spec.rb +1 -1
- metadata +130 -9
- data/app/views/pulitzer/content_elements/index.html.erb +0 -39
- data/app/views/pulitzer/posts/show.html.erb +0 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9fb47ff0580548ffe9a35433a77ee4ac57e8d070
|
|
4
|
+
data.tar.gz: 0f6099bbf1a457a725f8cd5dcf9c3e89c498349e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e004f415446e6fbe37075e8a7da3934755b1398ca1249e76fc1d8af8a8285238f7fbb581184311e4e09366a2c46e8ffd1659d3fcbbef37792719d3866d5e7e73
|
|
7
|
+
data.tar.gz: 687eded1e2a0f063412e75911b31e320fc7df1541aa783f32fe6ab46c97fba3d1b035801068440b50c91513379b970c74f0ef3406f677e90afef7457642c5ceb
|
|
@@ -28,10 +28,11 @@ var Select2Trigger = Class.extend({
|
|
|
28
28
|
|
|
29
29
|
var RichTextEditor = Class.extend({
|
|
30
30
|
init: function($textarea){
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
var rich_text_editor = this
|
|
32
|
+
this.$form = $textarea.parents("form")
|
|
33
|
+
this.$toolbar = this.$form.find('[data-pulitzer-toolbar]')
|
|
34
|
+
this.editor = new wysihtml5.Editor($textarea[0], {
|
|
35
|
+
toolbar: rich_text_editor.$toolbar[0],
|
|
35
36
|
stylesheets: wysihtml5Stylesheets,
|
|
36
37
|
parserRules: wysihtml5ParserRules
|
|
37
38
|
});
|
|
@@ -54,6 +55,14 @@ var ContentElementEditor = Class.extend({
|
|
|
54
55
|
}
|
|
55
56
|
})
|
|
56
57
|
|
|
58
|
+
$(document).ajaxComplete(function(){
|
|
59
|
+
$.each(window.any_time_manager.recordedObjects["RichTextEditor"], function(){
|
|
60
|
+
if(this.$form.parents('body').length == 0){ //the form has been removed from the dom
|
|
61
|
+
this.editor.fire('destroy:composer')
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
57
66
|
$(document).ready(function(){
|
|
58
67
|
// window.any_time_manager.registerListWithClasses(
|
|
59
68
|
// { 'pulitzer-element' : 'ContentElementEditor'}
|
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
class Pulitzer::ContentElementsController < Pulitzer::ApplicationController
|
|
2
2
|
before_filter :set_content_element, only: [:show, :edit, :update]
|
|
3
3
|
|
|
4
|
-
def index
|
|
5
|
-
@post = Pulitzer::Post.find(params[:post_id])
|
|
6
|
-
if @post.preview_version
|
|
7
|
-
@content_elements = @post.preview_version.template_content_elements
|
|
8
|
-
@free_form_content_elements = @post.preview_version.free_form_content_elements
|
|
9
|
-
route = "pulitzer_preview_#{@post.post_type.name.parameterize('_')}_path"
|
|
10
|
-
@preview_path = main_app.public_send(route, @post.slug) if main_app.respond_to?(route)
|
|
11
|
-
elsif @post.processing_version
|
|
12
|
-
render template: '/pulitzer/content_elements/index_processing' and return
|
|
13
|
-
else
|
|
14
|
-
render text: "There is a problem with this post", status: 404
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
4
|
def new
|
|
19
|
-
@version
|
|
20
|
-
@content_element
|
|
5
|
+
@version = Pulitzer::Version.find params[:version_id]
|
|
6
|
+
@content_element = @version.content_elements.build
|
|
21
7
|
render partial: 'new', locals: { content_element: @content_element, version: @version }
|
|
22
8
|
end
|
|
23
9
|
|
|
24
10
|
def create
|
|
25
11
|
@version = Pulitzer::Version.find content_element_params[:version_id]
|
|
26
|
-
@content_element = @version.content_elements.create content_element_params
|
|
12
|
+
@content_element = @version.content_elements.create content_element_params.merge(ensure_unique: true)
|
|
27
13
|
render partial: 'show_wrapper', locals: { content_element: @content_element }
|
|
28
14
|
end
|
|
29
15
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
class Pulitzer::PostTagsController < Pulitzer::ApplicationController
|
|
2
|
-
before_filter :
|
|
2
|
+
before_filter :get_post_tag, only: [:destroy]
|
|
3
3
|
|
|
4
4
|
def new
|
|
5
5
|
@tag_model = params[:tag_model]
|
|
6
|
-
@
|
|
7
|
-
|
|
6
|
+
@version = Pulitzer::Version.find params[:version_id]
|
|
7
|
+
@post_tag = @version.post_tags.new label_type: @tag_model
|
|
8
|
+
render partial: 'new', locals: { tag_model: @tag_model, post_tag: @post_tag }
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def create
|
|
11
|
-
@post_tag = Pulitzer::CreatePostTag.new(
|
|
12
|
-
render partial: 'show', locals: {
|
|
12
|
+
@post_tag = Pulitzer::CreatePostTag.new(params).call
|
|
13
|
+
render partial: 'show', locals: { version: @post_tag.version, tag_model: @post_tag.label_type }
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def destroy
|
|
16
|
-
@post_tag = @post.preview_version.post_tags.find params[:id]
|
|
17
17
|
@post_tag.destroy
|
|
18
18
|
render nothing: true
|
|
19
19
|
end
|
|
@@ -24,8 +24,8 @@ class Pulitzer::PostTagsController < Pulitzer::ApplicationController
|
|
|
24
24
|
params[:post_tag].permit!
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
def
|
|
28
|
-
@
|
|
27
|
+
def get_post_tag
|
|
28
|
+
@post_tag = Pulitzer::PostTag.find(params[:id])
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
class Pulitzer::PostsController < Pulitzer::ApplicationController
|
|
2
|
-
before_filter :get_post, only: [:show, :edit, :update]
|
|
2
|
+
before_filter :get_post, only: [:show, :edit, :update, :processing_preview]
|
|
3
3
|
|
|
4
4
|
def index
|
|
5
5
|
@post_type = Pulitzer::PostType.find params[:post_type_id]
|
|
@@ -22,7 +22,9 @@ class Pulitzer::PostsController < Pulitzer::ApplicationController
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def edit
|
|
25
|
-
|
|
25
|
+
if request.xhr?
|
|
26
|
+
render partial: 'form', locals: { post: @post }
|
|
27
|
+
end
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
def update
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
class Pulitzer::VersionsController < Pulitzer::ApplicationController
|
|
2
2
|
before_action :set_version
|
|
3
3
|
|
|
4
|
+
def edit
|
|
5
|
+
if @version.preview?
|
|
6
|
+
route = "pulitzer_preview_#{@post.post_type.name.parameterize('_')}_path"
|
|
7
|
+
@preview_path = main_app.public_send(route, @post.slug) if main_app.respond_to?(route)
|
|
8
|
+
end
|
|
9
|
+
render_ajax locals: {version: @version}
|
|
10
|
+
end
|
|
11
|
+
|
|
4
12
|
def update
|
|
5
|
-
Pulitzer::UpdateVersionStatus.new(@version,@status).call
|
|
13
|
+
processing_version = Pulitzer::UpdateVersionStatus.new(@version,@status).call
|
|
6
14
|
|
|
7
|
-
|
|
15
|
+
render json: {html: render_to_string(partial: '/pulitzer/versions/edit', locals: {version: processing_version}),
|
|
16
|
+
flash_message: "The new version of #{@post.title} has been activated."}
|
|
8
17
|
end
|
|
9
18
|
|
|
10
19
|
private
|
|
11
20
|
def set_version
|
|
12
21
|
@version = Pulitzer::Version.find params[:id]
|
|
13
|
-
@
|
|
14
|
-
@
|
|
22
|
+
@status = params[:status]
|
|
23
|
+
@post = @version.post
|
|
15
24
|
end
|
|
16
25
|
|
|
17
26
|
end
|
|
@@ -40,11 +40,7 @@ module Pulitzer
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def select2_html_options(tag_model)
|
|
43
|
-
|
|
44
|
-
{ class: 'seletct2-pulitzer-tags', data: { select2_trigger: true } }
|
|
45
|
-
else
|
|
46
|
-
{ }
|
|
47
|
-
end
|
|
43
|
+
{ class: 'seletct2-pulitzer-tags', data: { select2_trigger: true } }
|
|
48
44
|
end
|
|
49
45
|
end
|
|
50
46
|
end
|
|
@@ -1,24 +1,43 @@
|
|
|
1
1
|
class Pulitzer::CloneVersion
|
|
2
|
+
include Pulitzer::Engine.routes.url_helpers
|
|
2
3
|
|
|
3
4
|
def initialize(version)
|
|
4
5
|
@version = version
|
|
5
6
|
@post = @version.post
|
|
7
|
+
Rails.logger.info("Pulitzer::CloneVersion !!! ")
|
|
8
|
+
Rails.logger.info($0)
|
|
6
9
|
end
|
|
7
10
|
|
|
8
11
|
def call
|
|
9
|
-
new_version = @post.
|
|
12
|
+
new_version = @post.processing_version
|
|
13
|
+
cloning_errors = []
|
|
14
|
+
new_version.processed_element_count = 0
|
|
10
15
|
@version.content_elements.each do |ce|
|
|
11
16
|
begin
|
|
12
17
|
cloned_content_element = ce.clone_me
|
|
13
18
|
new_version.content_elements << cloned_content_element
|
|
14
19
|
rescue ActiveRecord::RecordInvalid => invalid
|
|
15
|
-
|
|
20
|
+
cloning_errors.push "ContentElement #{ce.id} could not be cloned: #{invalid.record.errors.full_messages.join(', ')}"
|
|
16
21
|
end
|
|
22
|
+
new_version.processed_element_count += 1
|
|
23
|
+
new_version.broadcast_change if defined? ForeignOffice
|
|
17
24
|
end
|
|
18
25
|
@version.post_tags.each do |pt|
|
|
19
26
|
new_version.post_tags << pt.clone_me
|
|
27
|
+
new_version.processed_element_count += 1
|
|
28
|
+
new_version.broadcast_change if defined? ForeignOffice
|
|
20
29
|
end
|
|
21
|
-
|
|
30
|
+
if cloning_errors.any?
|
|
31
|
+
new_version.update(status: :processing_failed, cloning_errors: cloning_errors)
|
|
32
|
+
else
|
|
33
|
+
new_version.update(status: :preview)
|
|
34
|
+
new_version.processed_element_count += 1
|
|
35
|
+
new_version.broadcast_change if defined? ForeignOffice
|
|
36
|
+
end
|
|
37
|
+
@post.new_preview_version = edit_version_path(new_version)
|
|
38
|
+
new_version.processed_element_count += 1
|
|
39
|
+
new_version.broadcast_change if defined? ForeignOffice
|
|
40
|
+
@post.broadcast_change if defined? ForeignOffice
|
|
22
41
|
new_version
|
|
23
42
|
end
|
|
24
43
|
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
class Pulitzer::CreatePostTag
|
|
2
|
-
attr_accessor :post, :request_params
|
|
3
2
|
|
|
4
|
-
def initialize(
|
|
5
|
-
|
|
6
|
-
self.request_params = params
|
|
3
|
+
def initialize(params)
|
|
4
|
+
@request_params = params
|
|
7
5
|
end
|
|
8
6
|
|
|
9
7
|
def call
|
|
10
|
-
label_id =
|
|
8
|
+
label_id = post_tag_params[:label_id]
|
|
11
9
|
unless (Integer(label_id) rescue false)
|
|
12
10
|
tag = Pulitzer::Tag.where(name: label_id).first_or_create
|
|
13
|
-
request_params[:post_tag][:label_id] = tag.id
|
|
11
|
+
@request_params[:post_tag][:label_id] = tag.id
|
|
14
12
|
end
|
|
15
|
-
|
|
13
|
+
Pulitzer::PostTag.create post_tag_params
|
|
16
14
|
end
|
|
17
15
|
|
|
18
16
|
def post_tag_params
|
|
19
|
-
request_params[:post_tag].permit!
|
|
17
|
+
@request_params[:post_tag].permit!
|
|
20
18
|
end
|
|
21
19
|
end
|
|
@@ -3,6 +3,7 @@ class Pulitzer::UpdateVersionStatus
|
|
|
3
3
|
@transitional_version = version
|
|
4
4
|
@status = status
|
|
5
5
|
@status_change_method = 'make_version_' + @status.to_s
|
|
6
|
+
@post = version.post
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
def call
|
|
@@ -14,14 +15,17 @@ class Pulitzer::UpdateVersionStatus
|
|
|
14
15
|
@old_active_version = @new_active_version.post.active_version
|
|
15
16
|
@new_active_version.update(status: :active)
|
|
16
17
|
@old_active_version.update(status: :archived) if @old_active_version
|
|
18
|
+
@processing_version = @post.create_processing_version
|
|
17
19
|
Pulitzer::CloneVersionJob.perform_later(@new_active_version)
|
|
18
|
-
@
|
|
20
|
+
@processing_version
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
def make_version_abandoned
|
|
22
24
|
@active_version = @transitional_version.post.active_version
|
|
23
25
|
@transitional_version.update(status: :abandoned)
|
|
26
|
+
@processing_version = @post.create_processing_version
|
|
24
27
|
Pulitzer::CloneVersionJob.perform_later(@active_version)
|
|
28
|
+
@processing_version
|
|
25
29
|
end
|
|
26
30
|
|
|
27
31
|
end
|
|
@@ -10,10 +10,10 @@ module Pulitzer
|
|
|
10
10
|
delegate :type, :text_type?, :image_type?, :video_type?, to: :content_element_type
|
|
11
11
|
delegate :post, to: :version
|
|
12
12
|
|
|
13
|
-
attr_accessor :version_unavailable
|
|
13
|
+
attr_accessor :version_unavailable, :ensure_unique
|
|
14
14
|
|
|
15
15
|
# Validations
|
|
16
|
-
|
|
16
|
+
validates_with ContentElementValidator
|
|
17
17
|
|
|
18
18
|
# Callbacks
|
|
19
19
|
before_save :handle_sort_order
|
|
@@ -51,6 +51,7 @@ module Pulitzer
|
|
|
51
51
|
clone_attrs.delete 'version_id'
|
|
52
52
|
|
|
53
53
|
type_clone_method = 'clone_' + type.to_s
|
|
54
|
+
|
|
54
55
|
if respond_to? type_clone_method
|
|
55
56
|
my_clone = send type_clone_method, clone_attrs
|
|
56
57
|
else
|
|
@@ -67,7 +68,7 @@ module Pulitzer
|
|
|
67
68
|
# If there is an error getting the image, don't bail out,
|
|
68
69
|
# create the content element clone without the image so the user can reupload later
|
|
69
70
|
if !my_clone.valid?
|
|
70
|
-
if my_clone.errors.get(:image)
|
|
71
|
+
if my_clone.errors.get(:image)
|
|
71
72
|
my_clone = Pulitzer::ContentElement.new(clone_attrs)
|
|
72
73
|
end
|
|
73
74
|
end
|
data/app/models/pulitzer/post.rb
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
module Pulitzer
|
|
2
2
|
class Post < ActiveRecord::Base
|
|
3
|
+
include ForeignOffice::Broadcaster if defined? ForeignOffice
|
|
3
4
|
extend ::FriendlyId
|
|
4
5
|
has_many :versions
|
|
5
6
|
belongs_to :post_type
|
|
6
|
-
delegate :post_type_content_element_types, to: :post_type
|
|
7
|
+
delegate :post_type_content_element_types, :allow_free_form?, to: :post_type
|
|
7
8
|
delegate :content_elements, :post_tags, to: :active_version, allow_nil: true
|
|
8
9
|
friendly_id :title, use: [:slugged, :finders]
|
|
9
10
|
after_create :create_preview_version
|
|
10
11
|
|
|
12
|
+
attr_accessor :new_preview_version
|
|
13
|
+
|
|
11
14
|
validates :title, presence: true
|
|
12
15
|
|
|
13
16
|
TAG_MODELS = ["Pulitzer::Tag"] + Pulitzer.tagging_models
|
|
@@ -32,6 +35,14 @@ module Pulitzer
|
|
|
32
35
|
versions.processing.last
|
|
33
36
|
end
|
|
34
37
|
|
|
38
|
+
def processing_failed_version
|
|
39
|
+
versions.processing_failed.last
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def next_version
|
|
43
|
+
preview_version || processing_version || processing_failed_version
|
|
44
|
+
end
|
|
45
|
+
|
|
35
46
|
def create_preview_version
|
|
36
47
|
versions.create(status: :preview)
|
|
37
48
|
end
|
|
@@ -39,5 +50,10 @@ module Pulitzer
|
|
|
39
50
|
def create_processing_version
|
|
40
51
|
versions.create(status: :processing)
|
|
41
52
|
end
|
|
53
|
+
|
|
54
|
+
def serialize
|
|
55
|
+
self.attributes.merge \
|
|
56
|
+
new_preview_version: self.new_preview_version
|
|
57
|
+
end
|
|
42
58
|
end
|
|
43
59
|
end
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
module Pulitzer
|
|
2
2
|
class Version < ActiveRecord::Base
|
|
3
|
-
|
|
3
|
+
include ForeignOffice::Broadcaster if defined? ForeignOffice
|
|
4
|
+
enum status: [ :preview, :active, :archived, :abandoned, :processing, :processing_failed ]
|
|
4
5
|
has_many :content_elements, dependent: :destroy
|
|
5
6
|
has_many :post_tags, dependent: :destroy
|
|
6
7
|
belongs_to :post
|
|
7
8
|
|
|
9
|
+
attr_accessor :processed_element_count
|
|
10
|
+
|
|
11
|
+
delegate :allow_free_form?, :title, to: :post
|
|
12
|
+
|
|
8
13
|
validates :post_id, :status, presence: true
|
|
9
14
|
|
|
10
15
|
def content_element(label)
|
|
@@ -18,5 +23,10 @@ module Pulitzer
|
|
|
18
23
|
def free_form_content_elements
|
|
19
24
|
content_elements.free_form
|
|
20
25
|
end
|
|
26
|
+
|
|
27
|
+
def serialize
|
|
28
|
+
self.attributes.merge \
|
|
29
|
+
processed_element_count: self.processed_element_count
|
|
30
|
+
end
|
|
21
31
|
end
|
|
22
32
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Pulitzer
|
|
2
|
+
class ContentElementValidator < ActiveModel::Validator
|
|
3
|
+
attr_accessor :record
|
|
4
|
+
|
|
5
|
+
def validate(record)
|
|
6
|
+
self.record = record
|
|
7
|
+
validate_label_presence
|
|
8
|
+
validate_lable_uniqueness if record.ensure_unique
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def validate_label_presence
|
|
14
|
+
record.errors.add(:label, "is required.") unless record.label.present?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def validate_label_uniqueness
|
|
18
|
+
if record.version && record.version.content_elements.to_a.reject{|ce| ce == record}.any?{|ce| ce.label == record.label}
|
|
19
|
+
record.errors.add(:label, "is already taken.")
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<%= form_for content_element, html: ajax_form_hash(dom_target(content_element)), multipart: true,
|
|
5
5
|
data: { server_endpoint: content_element_path(content_element) } do |f| %>
|
|
6
6
|
<%= f.text_field :title, placeholder: 'Title' %>
|
|
7
|
-
<%= render partial: "
|
|
7
|
+
<%= render partial: "/pulitzer/content_elements/#{content_element.type}_fields", locals: { f: f, content_element: content_element } %>
|
|
8
8
|
<%= submit_tag "Update" %>
|
|
9
9
|
<%= link_to('Cancel', content_element_path(content_element), :class => 'button',
|
|
10
10
|
data: { ajax_link: true, ajax_target: dom_target(content_element) } ) %>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<h2>Template content elements</h2>
|
|
2
|
+
|
|
3
|
+
<% version.template_content_elements.each do |content_element| %>
|
|
4
|
+
<%= render partial: '/pulitzer/content_elements/show_wrapper', locals: { content_element: content_element } %>
|
|
5
|
+
<% end %>
|
|
6
|
+
|
|
7
|
+
<% if version.allow_free_form? %>
|
|
8
|
+
<div id="<%= dom_id version, :free_form_elements %>">
|
|
9
|
+
<h2>Free form content elements</h2>
|
|
10
|
+
<div class="pulitzer-row margin-bottom list-item">
|
|
11
|
+
<%= ajax_link "add a new content element for #{version.title}", new_content_element_path(version_id: version), {}, "#new_free_form_content_element_#{dom_id(version)}" %>
|
|
12
|
+
<div id="<%= dom_id(version, :new_free_form_content_element) %>"></div>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="pulitzer-row margin-bottom list-item" id="<%= dom_id(version, :free_form_content_element_container) %>" id="content_element_list" data-sorter href="<%= update_all_content_elements_path %>">
|
|
15
|
+
<% version.free_form_content_elements.each do |content_element| %>
|
|
16
|
+
<%= render partial: '/pulitzer/content_elements/show_wrapper', locals: { content_element: content_element } %>
|
|
17
|
+
<% end %>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<% end %>
|
data/app/views/pulitzer/content_elements/{index_processing.html.erb → _index_processing.html.erb}
RENAMED
|
File without changes
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
<%= form_for content_element, html: ajax_form_hash(
|
|
1
|
+
<%= form_for content_element, html: ajax_form_hash(dom_target(version, :free_form_content_element_container), insert_method: 'append', sub_class: "AddALineForm", container: dom_target(version, :new_free_form_content_element)) do |f| %>
|
|
2
2
|
<%= f.collection_select :content_element_type_id, Pulitzer::ContentElementType.all, :id, :name, {},
|
|
3
|
-
|
|
3
|
+
revealer(dom_id(version, :content_element_type_revealer), highlander: true) %>
|
|
4
4
|
|
|
5
|
-
<div
|
|
5
|
+
<div <%= revealer_target_attrs dom_id(version, :content_element_type_revealer) %>></div>
|
|
6
6
|
|
|
7
|
-
<div
|
|
7
|
+
<div <%= revealer_option_attrs(dom_id(version, :content_element_type_revealer), trigger: Pulitzer::ContentElementType.find_by(name: 'Image').id) %> >
|
|
8
8
|
<%= f.label :height %>
|
|
9
9
|
<%= f.text_field :height, placeholder: 'Height' %>
|
|
10
10
|
<%= f.label :width %>
|
|
11
11
|
<%= f.text_field :width, placeholder: 'Width' %>
|
|
12
12
|
</div>
|
|
13
13
|
|
|
14
|
-
<div
|
|
14
|
+
<div <%= revealer_option_attrs(dom_id(version, :content_element_type_revealer), trigger: Pulitzer::ContentElementType.find_by(name: 'Text').id) %>>
|
|
15
15
|
<%= f.label :text_editor, "Text editor" %>
|
|
16
16
|
<%= f.select :text_editor, Pulitzer.text_editor_toolbars.map { |t| t[:name] } %>
|
|
17
17
|
</div>
|
|
@@ -21,5 +21,5 @@
|
|
|
21
21
|
|
|
22
22
|
<%= submit_tag "Create" %>
|
|
23
23
|
<%= link_to('Cancel', '#', :class => 'button',
|
|
24
|
-
data: { emptier: true, target:
|
|
24
|
+
data: { emptier: true, target: dom_target(version, :new_free_form_content_element) } ) %>
|
|
25
25
|
<% end %>
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
<li><h3><%= content_element.label %></h3></li>
|
|
12
12
|
<% end %>
|
|
13
13
|
<li><%= render_element(content_element) %></li>
|
|
14
|
-
<li><%= ajax_link "Edit",
|
|
14
|
+
<li><%= ajax_link "Edit", edit_content_element_path(content_element), {}, dom_target(content_element) %></li>
|
|
15
15
|
</ul>
|
|
16
16
|
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div class="pulitzer-row margin-bottom list-item" id="<%= dom_id(content_element) %>">
|
|
2
2
|
<% if content_element.empty_body? %>
|
|
3
|
-
<%= render partial: 'form', locals: { content_element: content_element } %>
|
|
3
|
+
<%= render partial: '/pulitzer/content_elements/form', locals: { content_element: content_element } %>
|
|
4
4
|
<% else %>
|
|
5
|
-
<%= render partial: 'show', locals: { content_element: content_element } %>
|
|
5
|
+
<%= render partial: '/pulitzer/content_elements/show', locals: { content_element: content_element } %>
|
|
6
6
|
<% end %>
|
|
7
7
|
</div>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
<%= form_for post_tag,
|
|
1
|
+
<%= form_for post_tag, html: ajax_form_hash("#show_#{underscore_class_name(tag_model)}") do |f| %>
|
|
2
2
|
<%= f.label :name %>
|
|
3
3
|
<%= f.select :label_id, options_from_collection_for_select(tag_model.constantize.all, :id, :name), {}, select2_html_options(tag_model) %>
|
|
4
|
-
<%= f.hidden_field :version_id
|
|
5
|
-
<%= f.hidden_field :label_type
|
|
4
|
+
<%= f.hidden_field :version_id %>
|
|
5
|
+
<%= f.hidden_field :label_type %>
|
|
6
6
|
<%= f.submit "Create" %>
|
|
7
7
|
<%= link_to('Cancel', '#', class: 'button',
|
|
8
8
|
data: { emptier: true, target: "#new_tag_#{underscore_class_name(tag_model)}" } ) %>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<h3><%= humanize_class_name(tag_model).pluralize %></h3>
|
|
2
|
-
<%
|
|
2
|
+
<% version.post_tags.where(label_type: tag_model).each do |post_tag| %>
|
|
3
3
|
<ul class='inline-list' id="<%= dom_id(post_tag) %>">
|
|
4
4
|
<li><%= post_tag.label.name %></li>
|
|
5
|
-
<li><%= ajax_delete 'delete',
|
|
5
|
+
<li><%= ajax_delete 'delete', post_tag_path(post_tag), {}, dom_target(post_tag) %></li>
|
|
6
6
|
</ul>
|
|
7
7
|
<% end %>
|
|
8
8
|
|
|
9
|
-
<%= ajax_link "Add a new #{humanize_class_name(tag_model)}",
|
|
9
|
+
<%= ajax_link "Add a new #{humanize_class_name(tag_model)}", new_post_tag_path(version_id: version.id, tag_model: tag_model), {}, "#new_tag_#{underscore_class_name(tag_model)}" %>
|
|
10
10
|
|
|
11
11
|
<div id="new_tag_<%= underscore_class_name(tag_model) %>"></div>
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
<div class="pulitzer-row margin-bottom margin-left" id="show_<%= underscore_class_name(tag_model) %>">
|
|
2
|
-
<%= render partial: 'pulitzer/post_tags/show', locals: { tag_model: tag_model,
|
|
2
|
+
<%= render partial: 'pulitzer/post_tags/show', locals: { tag_model: tag_model, version: version } %>
|
|
3
3
|
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<h1>Editing <%= @post.title %></h1>
|
|
2
|
+
|
|
3
|
+
<div class="pulitzer-row margin-bottom list-item">
|
|
4
|
+
<%= link_back_to_posts(@post.post_type, "Back to #{@post.post_type.name.singularize} Posts", 'Back to post types') %>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<div id="<%= dom_id(@post, :preview_version)%>">
|
|
8
|
+
</div>
|
|
9
|
+
<%= ajax_link_now '', edit_version_path(@post.next_version), {}, dom_target(@post, :preview_version) %>
|
|
10
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<% if version.processing_failed? %>
|
|
2
|
+
<div class="pulitzer-row">
|
|
3
|
+
There was a problem creating the new preview version of this post for editing.
|
|
4
|
+
<ul>
|
|
5
|
+
<% version.cloning_errors.each do |error| %>
|
|
6
|
+
<li><%= error %></li>
|
|
7
|
+
<% end %>
|
|
8
|
+
</ul>
|
|
9
|
+
</div>
|
|
10
|
+
<% elsif version.processing? %>
|
|
11
|
+
<h2> Processing Preview for <%= version.title %> </h2>
|
|
12
|
+
<div class="pulitzer-row">
|
|
13
|
+
<progress value="0" max="<%= version.post.active_version.content_elements.count + version.post.active_version.post_tags.count + 2 %>" <%= listener_attrs version, :processed_element_count if defined? ForeignOffice %>></progress>
|
|
14
|
+
</div>
|
|
15
|
+
<a <%= listener_attrs version.post, :new_preview_version, trigger: true if defined? ForeignOffice %>
|
|
16
|
+
<%= ajax_link_attrs(dom_target(version.post, :preview_version)) %> > </a>
|
|
17
|
+
If the preview does not appear within a few minutes, click here to see if it's available.
|
|
18
|
+
<%= ajax_link "refresh preview", edit_version_path(version), {}, dom_target(version.post, :preview_version) %>
|
|
19
|
+
<% elsif version.preview? %>
|
|
20
|
+
<div class="pulitzer-row margin-bottom list-item">
|
|
21
|
+
<h2>Tags</h2>
|
|
22
|
+
<% Pulitzer::Post::TAG_MODELS.each do |tag_model| %>
|
|
23
|
+
<%= render partial: 'pulitzer/post_tags/show_wrapper', locals: { version: version, tag_model: tag_model } %>
|
|
24
|
+
<% end %>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<div class="pulitzer-row margin-bottom list-item">
|
|
28
|
+
<%= render partial: '/pulitzer/content_elements/index', locals: {version: version} %>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="pulitzer-row">
|
|
32
|
+
<%= render partial: 'pulitzer/versions/form', locals: { version: version } %>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="preview-link">
|
|
35
|
+
<% if @preview_path %>
|
|
36
|
+
<%= link_to "Preview", @preview_path, target: '_blank' %>
|
|
37
|
+
<% else %>
|
|
38
|
+
<small>Preview not available</small>
|
|
39
|
+
<% end %>
|
|
40
|
+
</div>
|
|
41
|
+
<% end %>
|
|
@@ -1,19 +1,12 @@
|
|
|
1
1
|
<div class="pulitzer-row">
|
|
2
|
-
<%= form_for version, html:
|
|
2
|
+
<%= form_for version, html: ajax_form_hash(dom_target(version.post, :preview_version)).merge( class: 'pulitzer-form-left' ) do |f| %>
|
|
3
3
|
<%= f.submit "Activate" %>
|
|
4
4
|
<%= hidden_field_tag :status, :active %>
|
|
5
5
|
<% end %>
|
|
6
6
|
|
|
7
|
-
<%= form_for version, html:
|
|
7
|
+
<%= form_for version, html: ajax_form_hash(dom_target(version.post, :preview_version)).merge( class: 'pulitzer-form-left' ) do |f| %>
|
|
8
8
|
<%= f.submit "Abandon" %>
|
|
9
9
|
<%= hidden_field_tag :status, :abandoned %>
|
|
10
10
|
<% end %>
|
|
11
11
|
|
|
12
|
-
<div class="preview-link">
|
|
13
|
-
<% if @preview_path %>
|
|
14
|
-
<%= link_to "Preview", @preview_path, target: '_blank' %>
|
|
15
|
-
<% else %>
|
|
16
|
-
<small>Preview not available</small>
|
|
17
|
-
<% end %>
|
|
18
|
-
</div>
|
|
19
12
|
</div>
|
data/config/routes.rb
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
Pulitzer::Engine.routes.draw do
|
|
2
2
|
resources :posts do
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
member do
|
|
4
|
+
get :processing_preview
|
|
5
|
+
end
|
|
5
6
|
end
|
|
7
|
+
resources :content_elements
|
|
8
|
+
resources :post_tags
|
|
9
|
+
|
|
6
10
|
resources :content_elements do
|
|
7
11
|
collection do
|
|
8
12
|
patch :update_all
|