diff --git a/app/assets/javascripts/forem.js.erb b/app/assets/javascripts/forem.js.erb index f7b25f5ef..4e5324b7f 100644 --- a/app/assets/javascripts/forem.js.erb +++ b/app/assets/javascripts/forem.js.erb @@ -1,4 +1,40 @@ //= require select2 +//= require jquery var Forem = {}; Forem.routes = {}; + +var textareaSelector = 'textarea.new-post'; +var lastRenderedMarkdown = ""; +var previewRefreshTimeout = 100; + +$(function() { + if($(textareaSelector).length) { + fetch_preview(); + } +}); + +function fetch_preview() +{ + markdownText = $(textareaSelector).val(); + if(markdownText == lastRenderedMarkdown) { + setTimeout(fetch_preview, previewRefreshTimeout); + return; + } + + lastRenderedMarkdown = markdownText; + $.post( + $(textareaSelector).data("previewUrl"), + { markdown : markdownText }, + function(result) { + update_preview(result); + setTimeout(fetch_preview, previewRefreshTimeout); + } + ); +} + +function update_preview(data) +{ + selector = $(textareaSelector).data("previewElementSelector"); + $(selector).html(data.html); +} diff --git a/app/controllers/forem/posts_controller.rb b/app/controllers/forem/posts_controller.rb index b9ef358a7..ac068420a 100644 --- a/app/controllers/forem/posts_controller.rb +++ b/app/controllers/forem/posts_controller.rb @@ -1,7 +1,7 @@ module Forem class PostsController < Forem::ApplicationController before_filter :authenticate_forem_user, except: :show - before_filter :find_topic + before_filter :find_topic, except: [:preview] before_filter :reject_locked_topic!, :only => [:create] before_filter :block_spammers, :only => [:new, :create] before_filter :authorize_reply_for_topic!, :only => [:new, :create] @@ -26,6 +26,10 @@ def new flash[:notice] = t("forem.post.cannot_quote_deleted_post") redirect_to [@topic.forum, @topic] end + + if(@reply_to_post) + @post.reply_to = @reply_to_post + end end def create @@ -54,6 +58,17 @@ def destroy @post.destroy destroy_successful end + + def preview + formatted_markdown = { + markdown: params[:markdown], + html: ApplicationController.helpers.forem_format(params[:markdown]) + } + respond_to do |format| + format.json { render json: formatted_markdown} + end + end + private diff --git a/app/models/forem/forum.rb b/app/models/forem/forum.rb index 7a2d7ce9b..71d3c77d0 100644 --- a/app/models/forem/forum.rb +++ b/app/models/forem/forum.rb @@ -30,7 +30,7 @@ def last_post_for(forem_user) end def last_visible_post(forem_user) - posts.approved_or_pending_review_for(forem_user).last + posts.visible.approved_or_pending_review_for(forem_user).last end def moderator?(user) diff --git a/app/models/forem/topic.rb b/app/models/forem/topic.rb index 72ecda402..59caf7182 100644 --- a/app/models/forem/topic.rb +++ b/app/models/forem/topic.rb @@ -42,19 +42,19 @@ def visible end def by_pinned - order('forem_topics.pinned DESC'). - order('forem_topics.id') + order('forem_topics.pinned DESC', + 'forem_topics.id') end def by_most_recent_post - order('forem_topics.last_post_at DESC'). - order('forem_topics.id') + order('forem_topics.last_post_at DESC', + 'forem_topics.id') end def by_pinned_or_most_recent_post - order('forem_topics.pinned DESC'). - order('forem_topics.last_post_at DESC'). - order('forem_topics.id') + order('forem_topics.pinned DESC', + 'forem_topics.last_post_at DESC', + 'forem_topics.id') end def pending_review diff --git a/app/views/forem/posts/_form.html.erb b/app/views/forem/posts/_form.html.erb index dc737a901..6fa051881 100644 --- a/app/views/forem/posts/_form.html.erb +++ b/app/views/forem/posts/_form.html.erb @@ -1,4 +1,10 @@ -<%= f.input :text, :input_html => { :class => "field col-md-12" } %> +<%= render "/forem/posts/post", + post: f.object, + post_counter: 1, + show_buttons: false + %> + +<%= f.input :text, :input_html => { :class => "field col-md-12 new-post", "data-preview-url" => render_post_preview_path, "data-preview-element-selector" => "#post_2 .contents .text" } %> <% if params[:reply_to_id] %> <%= f.hidden_field :reply_to_id, :value => params[:reply_to_id] %> diff --git a/app/views/forem/posts/_post.html.erb b/app/views/forem/posts/_post.html.erb index 36cff21d1..ad8459b9e 100644 --- a/app/views/forem/posts/_post.html.erb +++ b/app/views/forem/posts/_post.html.erb @@ -1,7 +1,18 @@ +<% +post_user = Forem::NilUser +if post.persisted? + post_user = post.user +else + post_user = forem_user +end + +show_buttons = post.persisted? && local_assigns[:show_buttons].nil? ? true : show_buttons +%> +