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 +%> +
col-md-12'> - <% if post.pending_review? %> + <% if post.pending_review? && show_buttons %>
<%= t(".pending_review") %> <% if forem_admin_or_moderator?(post.topic.forum) %> @@ -16,31 +27,43 @@
<% end %> -
- <% if post.user.is_a?(Forem::NilUser) %> + <% if post_user.is_a?(Forem::NilUser) %> <%= t(:deleted) %> <% else %> - <%= link_to_if Forem.user_profile_links, post.user.forem_name, [main_app, post.user] %> + <%= link_to_if Forem.user_profile_links, post_user.forem_name, [main_app, post_user] %> <% end %>
-
<%= forem_avatar(post.user, :size => 60) %>
+
<%= forem_avatar(post_user, :size => 60) %>
+
+
    +
  • <%= t('wrote_posts', count: post_user.forem_posts.approved.count) %>
  • +
  • <%= t('member_since', date: post_user.created_at.strftime('%e %b %y')) %>
  • +
+
+
- - <%= post_time_tag(post) %> + + <% if post.persisted? %> + <%= post_time_tag(post) %> + <% else %> +   + <% end %> - <%= forem_format(post.text) %> - <% if post.reply_to %>
<%= link_to "#{t("forem.post.in_reply_to")} #{post.reply_to.user.forem_name}", "#post-#{post.reply_to.id}" %>
<% end %> + + + <%= forem_format(post.text) if post.persisted? %> + - <% if forem_user %> + <% if forem_user && show_buttons %>
<% if can?(:reply, post.topic) %> <% if post.topic.can_be_replied_to? %> @@ -50,7 +73,7 @@ <% end %> <% if post.owner_or_admin?(forem_user) %> <% if can?(:edit_post, post.topic.forum) %> - <%= link_to t('edit', :scope => 'forem.post'), forem.edit_forum_topic_post_path(post.forum, post.topic, post), :class => "btn btn-info" %> + <%= link_to t('edit', :scope => 'forem.post.buttons'), forem.edit_forum_topic_post_path(post.forum, post.topic, post), :class => "btn btn-info" %> <% end %> <% if can?(:destroy_post, post.topic.forum) %> <%= link_to t('delete', :scope => 'forem.topic'), forem.forum_topic_post_path(post.forum, post.topic, post), :method => :delete, data: { :confirm => t("are_you_sure") }, :class => "btn btn-danger" %> @@ -59,6 +82,6 @@
<% end %>
-
+
diff --git a/app/views/forem/posts/new.html.erb b/app/views/forem/posts/new.html.erb index 23b355a90..45fb0484c 100644 --- a/app/views/forem/posts/new.html.erb +++ b/app/views/forem/posts/new.html.erb @@ -1,13 +1,11 @@ <%= render :partial => 'forem/forums/head', :locals => { :forum => @topic.forum } %> -

- <%= t("forem.post.new") %> - <% if @reply_to_post %> - <%= render 'reply_to_post', :post => @reply_to_post %> - <% else %> - <%= @topic.subject %> - <% end %> -

+

<%= t("forem.post.new") %>

+<% if @reply_to_post %> +<%= render "/forem/posts/post", :post => @reply_to_post, post_counter: 0, show_buttons: false %> +<% else %> +<%= @topic.subject %> +<% end %> <%= simple_form_for [forem, @topic.forum, @topic, @post] do |f| %> <%= render :partial => "form", :locals => { :f => f } %> diff --git a/app/views/forem/topics/_form.html.erb b/app/views/forem/topics/_form.html.erb index 6246d6d85..577bbc165 100644 --- a/app/views/forem/topics/_form.html.erb +++ b/app/views/forem/topics/_form.html.erb @@ -6,4 +6,4 @@ <% end %> <%= f.submit :class => "btn btn-primary" %> -<% end %> +<% end %> \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 6ed4ceae3..8548e4b32 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -217,3 +217,5 @@ en: by: by started_by: "Started by " are_you_sure: Are you sure? + wrote_posts: "Wrote %{count} posts" + member_since: "Member since %{date}" diff --git a/config/routes.rb b/config/routes.rb index 196843b65..7dd1a32ef 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -33,6 +33,9 @@ get 'users/autocomplete', :to => "users#autocomplete", :as => "user_autocomplete" end + #post preview + post '/render_preview', to: "posts#preview", as: :render_post_preview + get '/:forum_id/moderation', :to => "moderation#index", :as => :forum_moderator_tools # For mass moderation of posts put '/:forum_id/moderate/posts', :to => "moderation#posts", :as => :forum_moderate_posts diff --git a/forem.gemspec b/forem.gemspec index ec7c544f3..bafe6546c 100644 --- a/forem.gemspec +++ b/forem.gemspec @@ -12,7 +12,6 @@ Gem::Specification.new do |s| s.add_development_dependency 'launchy' s.add_development_dependency 'rspec-rails', '~> 2.14.0' s.add_development_dependency 'capybara', '2.1.0' - s.add_development_dependency 'jquery-rails' s.add_development_dependency 'factory_girl_rails', '~> 4.4.1' s.add_development_dependency 'database_cleaner', '~> 1.0.0' @@ -29,6 +28,7 @@ Gem::Specification.new do |s| s.add_dependency 'gemoji', '= 2.1.0' s.add_dependency 'decorators', '~> 1.0.2' s.add_dependency 'select2-rails', '~> 3.5.4' + s.add_dependency 'jquery-rails', '~> 3.1.0' s.add_dependency 'friendly_id', '~> 5.0.0' s.add_dependency 'cancancan', '~> 1.7' end diff --git a/lib/forem/engine.rb b/lib/forem/engine.rb index 8ffabe748..a88d10020 100644 --- a/lib/forem/engine.rb +++ b/lib/forem/engine.rb @@ -1,3 +1,5 @@ +require 'emoji' + module ::Forem class Engine < Rails::Engine isolate_namespace Forem @@ -13,17 +15,19 @@ def root Decorators.register! Engine.root, Rails.root end + config.assets.paths << Emoji.images_path + # Precompile any assets included straight in certain pges initializer "forem.assets.precompile", :group => :all do |app| app.config.assets.precompile += %w[ forem/admin/members.js ] + app.config.assets.precompile << "emoji/**/*.png" end end end require 'simple_form' -require 'emoji' require 'select2-rails' # We need one of the two pagination engines loaded by this point.