add comment feature for bulletin

This commit is contained in:
chiu 2020-07-30 22:12:21 +08:00
parent c3ed827184
commit 6b29a2c2a1
14 changed files with 283 additions and 9 deletions

View File

@ -3,18 +3,31 @@ require 'rubyXL'
class Admin::AnnouncementsController < OrbitAdminController class Admin::AnnouncementsController < OrbitAdminController
include Admin::AnnouncementsHelper include Admin::AnnouncementsHelper
before_action ->(module_app = @app_title) { set_variables module_app } before_action ->(module_app = @app_title) { set_variables module_app }
before_action :set_bulletin, only: [:edit, :destroy] before_action :set_bulletin, only: [:edit, :destroy, :comment]
before_action :load_access_level, :load_settings before_action :load_access_level, :load_settings
def initialize def initialize
super super
@app_title = "announcement" @app_title = "announcement"
end end
def comment_hidden
b = BulletinComment.find(params[:id]) rescue nil
if !b.nil?
b.is_hidden = !b.is_hidden
b.save
@table_feed_fields = ["announcement.time", "announcement.comment", "announcement.account","ip","is_hidden"]
@comments = b.bulletin.bulletin_comments.reverse rescue []
render partial: 'comment'
end
end
def comment
@table_feed_fields = ["announcement.time", "announcement.comment", "announcement.account","ip","is_hidden"]
@comments = @bulletin.bulletin_comments.reverse rescue []
end
def index def index
Bulletin.remove_expired_status Bulletin.remove_expired_status
@tags = @module_app.tags @tags = @module_app.tags
@table_fields = [:status, :category, :title, :start_date, :end_date, :last_modified] @table_fields = [:status, :category, :title, :start_date, :end_date, "announcement.comment", :last_modified]
@current_user = current_user @current_user = current_user
if AnnouncementSetting.first.is_display_edit_only && !current_user.is_admin? && !current_user.is_manager?(@module_app) if AnnouncementSetting.first.is_display_edit_only && !current_user.is_admin? && !current_user.is_manager?(@module_app)
current_user_is_sub_manager = !current_user.is_manager?(@module_app) && (current_user.is_sub_manager?(@module_app) || current_user.is_sub_manager_with_role?(@module_app)) rescue false current_user_is_sub_manager = !current_user.is_manager?(@module_app) && (current_user.is_sub_manager?(@module_app) || current_user.is_sub_manager_with_role?(@module_app)) rescue false

View File

@ -1,5 +1,17 @@
class AnnouncementsController < ApplicationController class AnnouncementsController < ApplicationController
include AnnouncementsHelper include AnnouncementsHelper
helper_method :complementaryColor,:lighten_color
def comment
@bulletin = Bulletin.where(:uid=>params[:uid]).first
comment_val = params['comment']
if !@bulletin.nil? && @bulletin.open_comment_for_user(OrbitHelper.current_user) && !comment_val.blank?
account_id = OrbitHelper.current_user.member_profile.id.to_s rescue 'visitor'
b = BulletinComment.new(ip: request.remote_ip,comment: comment_val,account_id: account_id)
b.bulletin_id = @bulletin.id
b.save
render :json => {}
end
end
def index def index
Bulletin.remove_expired_status Bulletin.remove_expired_status
sorted,total_pages = get_sorted_annc sorted,total_pages = get_sorted_annc
@ -198,6 +210,7 @@ class AnnouncementsController < ApplicationController
else else
announcement = Bulletin.can_display_and_sorted.where(:uid => uid).first announcement = Bulletin.can_display_and_sorted.where(:uid => uid).first
end end
@bulletin = announcement
announcement = Bulletin.where(:uid => uid).first if announcement.nil? announcement = Bulletin.where(:uid => uid).first if announcement.nil?
url_to_edit = OrbitHelper.user_can_edit?(announcement) ? "/admin/announcements/#{announcement.id.to_s}/edit" : "" url_to_edit = OrbitHelper.user_can_edit?(announcement) ? "/admin/announcements/#{announcement.id.to_s}/edit" : ""
@ -241,7 +254,7 @@ class AnnouncementsController < ApplicationController
subtitle_ann = announcement.subtitle if announcement.display_subtitle? subtitle_ann = announcement.subtitle if announcement.display_subtitle?
img_src = (announcement.image.thumb.url || "/assets/announcement-default.jpg") if announcement.display_img? img_src = (announcement.image.thumb.url || "/assets/announcement-default.jpg") if announcement.display_img?
img_description = announcement.image_description if (announcement.image_description.present?) && (announcement.display_img?) img_description = announcement.image_description if (announcement.image_description.present?) && (announcement.display_img?)
show_comment_flag = announcement.open_comment_for_user(OrbitHelper.current_user)
{ {
"tags" => tags, "tags" => tags,
"bulletin_files" => files, "bulletin_files" => files,
@ -258,6 +271,8 @@ class AnnouncementsController < ApplicationController
"hide_class" => announcement.display_img? ? '' : ' hide', "hide_class" => announcement.display_img? ? '' : ' hide',
"alt_title" => desc "alt_title" => desc
}, },
"comments" => announcement.comments,
"show_comment_flag" => show_comment_flag,
"impressionist" => (announcement.is_preview ? nil : announcement), "impressionist" => (announcement.is_preview ? nil : announcement),
"url_to_edit"=>url_to_edit "url_to_edit"=>url_to_edit
} }
@ -327,6 +342,8 @@ class AnnouncementsController < ApplicationController
"hide_class" => announcement["display_img"] ? '' : ' hide', "hide_class" => announcement["display_img"] ? '' : ' hide',
"alt_title" => desc "alt_title" => desc
}, },
"comments" => [],
"show_comment_flag" => false,
"impressionist" => nil, "impressionist" => nil,
"url_to_edit" => url_to_edit "url_to_edit" => url_to_edit
} }

View File

@ -1,7 +1,6 @@
# encoding: utf-8 # encoding: utf-8
class BulletinsController < ApplicationController class BulletinsController < ApplicationController
before_filter :set_I18n before_filter :set_I18n
def get_bulletins def get_bulletins
page = Page.where(:module => "announcement").first rescue nil page = Page.where(:module => "announcement").first rescue nil

View File

@ -1,4 +1,25 @@
module AnnouncementsHelper module AnnouncementsHelper
def complementaryColor(my_hex)
if my_hex[0] == '#'
my_hex = my_hex[1..-1]
end
rgb = my_hex.split(//).each_slice(my_hex.length/3).map{|v| v.join}
comp = rgb.map{|a| (255 - a.to_i(16)).to_s(16).rjust(2,'0')}
'#'+comp.join
end
def lighten_color(my_hex,percent)
if my_hex[0] == '#'
my_hex = my_hex[1..-1]
end
rgb = my_hex.split(//).each_slice(my_hex.length/3).map{|v| v.join}
comp = rgb.collect do |a|
tmp = a.to_i(16)*(1+percent/100.0)
tmp = 255 if tmp>255
tmp = 0 if tmp < 0
tmp.to_i.to_s(16).rjust(2,'0')
end
'#'+comp.join
end
def set_image_version_for_widget def set_image_version_for_widget
subpart = OrbitHelper.get_current_widget subpart = OrbitHelper.get_current_widget
@image_version = 'thumb' @image_version = 'thumb'

View File

@ -49,12 +49,15 @@ class Bulletin
field :other_mailaddress field :other_mailaddress
field :image_description, localize: true field :image_description, localize: true
field :top_end_date, :type => DateTime field :top_end_date, :type => DateTime
field :open_comment, :type => Boolean, :default => false
field :comment_end_time, :type => DateTime
field :comment_role, :type => Array, :default => []
mount_uploader :image, ImageUploader mount_uploader :image, ImageUploader
has_many :bulletin_links, :autosave => true, :dependent => :destroy has_many :bulletin_links, :autosave => true, :dependent => :destroy
has_many :bulletin_files, :autosave => true, :dependent => :destroy has_many :bulletin_files, :autosave => true, :dependent => :destroy
has_many :bulletin_comments, :autosave => true, :dependent => :destroy
accepts_nested_attributes_for :bulletin_files, :allow_destroy => true accepts_nested_attributes_for :bulletin_files, :allow_destroy => true
accepts_nested_attributes_for :bulletin_links, :allow_destroy => true accepts_nested_attributes_for :bulletin_links, :allow_destroy => true
@ -166,4 +169,11 @@ class Bulletin
def display_img? def display_img?
self.display_img rescue false self.display_img rescue false
end end
def comments
self.bulletin_comments.select{|v| !v.is_hidden}
end
def open_comment_for_user(user)
role_ids = user.member_profile.roles.collect{|v| v.id.to_s} rescue ['visitor']
!self.comment_end_time.blank? && self.open_comment && self.comment_end_time > Time.now && (self.comment_role.any?{|v| role_ids.include?(v)} || self.comment_role.include?('visitor') || (self.comment_role.include?('all_member') && role_ids[0] != 'visitor'))
end
end end

View File

@ -0,0 +1,21 @@
# encoding: utf-8
class BulletinComment
include Mongoid::Document
include Mongoid::Timestamps
field :ip
field :comment
field :account_id
field :is_hidden,type: Boolean,default: false
def time
self.created_at.strftime('%Y/%m/%d %H:%M')
end
def account
tmp = MemberProfile.where(:id => self.account_id).collect{|v| v.name}.join
tmp.blank? ? I18n.t('announcement_visitor') : tmp
end
def roles
MemberProfile.where(:id => self.account_id).collect{|v| v.roles}.flatten
end
belongs_to :bulletin
end

View File

@ -0,0 +1,25 @@
<table class="table main-list">
<thead>
<tr class="sort-header">
<% @table_feed_fields.each do |f| %>
<%= thead(f) %>
<% end %>
</tr>
</thead>
<tbody>
<% @comments.each do |comment| %>
<tr>
<td><%= comment.time %></td>
<td><%= comment.comment.html_safe %></td>
<td>
<%= comment.account %>
<% comment.roles.each do |role| %>
<span class="label"><%= role.title rescue '' %></span>
<% end %>
</td>
<td><%= comment.ip %></td>
<td><%= button_tag (comment.is_hidden ? t('show') : t('is_hidden')), type: 'button',"data-href" => "/#{I18n.locale}/admin/annc-comment-hidden/#{comment.id}",:onclick => "update_status(this)" ,class: (comment.is_hidden ? 'btn btn-primary' : 'btn btn-info') %></td>
</tr>
<% end %>
</tbody>
</table>

View File

@ -194,7 +194,33 @@
<%= f.datetime_picker :top_end_date, :no_label => true, :new_record => @bulletin.new_record? %> <%= f.datetime_picker :top_end_date, :no_label => true, :new_record => @bulletin.new_record? %>
</div> </div>
</div> </div>
<div class="control-group">
<label class="control-label muted"><%= t('announcement.open_comment')%></label>
<div class="controls">
<%= f.check_box :open_comment %><%= t('announcement.open') %>
</div>
</div>
<div class="control-group <%= @bulletin.open_comment ? "" : "hide" %>" data-for="open_comment">
<label for="" class="control-label muted"><%= t('announcement.comment_end_time')%></label>
<div class="controls">
<%= f.datetime_picker :comment_end_time, :no_label => true, :new_record => @bulletin.new_record? %>
</div>
</div>
<div class="control-group <%= @bulletin.open_comment ? "" : "hide" %>" data-for="open_comment">
<label for="" class="control-label muted"><%= t('announcement.comment_role')%></label>
<div class="controls">
<%= check_box_tag 'bulletin[comment_role][]','visitor',@bulletin.comment_role.include?('visitor') %>
<%= t('announcement.visitor') %>
<br>
<%= check_box_tag 'bulletin[comment_role][]','all_member',@bulletin.comment_role.include?('all_member'),class: 'role_all_member' %>
<%= t('announcement.all_member') %>
<br>
<% Role.all.each do |role| %>
<%= check_box_tag 'bulletin[comment_role][]',role.id.to_s,@bulletin.comment_role.include?(role.id.to_s),class: 'role' %>
<%= role.title %>
<% end %>
</div>
</div>
</div> </div>
<% end %> <% end %>
@ -459,6 +485,25 @@
} }
$(function() { $(function() {
$('#bulletin_open_comment').change(function(){
$(this).prop('checked') ? $('div[data-for="open_comment"]').removeClass('hide') : $('div[data-for="open_comment"]').addClass('hide')
})
$('.role_all_member').change(function(){
if ($(this).prop('checked')){
$('.role').each(function() {
$(this).prop("checked", true);
})
} else{
$('.role').each(function() {
$(this).prop("checked", false);
})
}
})
$('.role').change(function(){
if (!$(this).prop('checked') && $('.role_all_member').prop('checked')){
$('.role_all_member').prop('checked',false)
}
})
if (location.pathname.substr(-3)=='new'){ if (location.pathname.substr(-3)=='new'){
var getDate = new Date(); var getDate = new Date();
var toDay = getDate.getFullYear()+"/"+ (Appendzero(getDate.getMonth()+1))+"/"+Appendzero(getDate.getDate())+" "+Appendzero(getDate.getHours())+":"+Appendzero(getDate.getMinutes()); var toDay = getDate.getFullYear()+"/"+ (Appendzero(getDate.getMonth()+1))+"/"+Appendzero(getDate.getDate())+" "+Appendzero(getDate.getHours())+":"+Appendzero(getDate.getMinutes());

View File

@ -57,6 +57,7 @@
</td> </td>
<td><%= format_value b.postdate %></td> <td><%= format_value b.postdate %></td>
<td class="<%= b.expired? ? "expired" : "" %>"><%= format_value b.deadline %></td> <td class="<%= b.expired? ? "expired" : "" %>"><%= format_value b.deadline %></td>
<td><%= link_to b.bulletin_comments.count.to_s,"/#{I18n.locale}/admin/announcements/#{b.id}/comment" %></td>
<td><%= b.update_user.user_name rescue ""%></td> <td><%= b.update_user.user_name rescue ""%></td>
</tr> </tr>
<tr class="footable-row-detail"> <tr class="footable-row-detail">

View File

@ -0,0 +1,12 @@
<% content_for :page_specific_css do %>
<%= stylesheet_link_tag("admin/tags") %>
<% end %>
<script type="text/javascript">
function update_status(ele) {
$.get($(ele).data('href'),function(data){
$('table').html(data)
})
return false
}
</script>
<%= render 'comment' %>

View File

@ -74,3 +74,90 @@
<% if @show_back_and_next_flag==2 %> <% if @show_back_and_next_flag==2 %>
<%= content %> <%= content %>
<% end %> <% end %>
<% site = Site.first
hover_color = site.orbit_bar_background_hover_color rescue nil
hover_color = '#0095CF' if hover_color.blank?
bg_color = site.orbit_bar_background_color rescue nil
bg_color = bg_color.blank? ? '#3a3b3c' : lighten_color(bg_color,-40)
color1 = complementaryColor(bg_color)
color2 = lighten_color(color1,30)
%>
<style type="text/css">
div[contentEditable=true]:empty:before{
content: attr(data-ph);
color: <%= color1 %>;
padding-left: 3%;
font-weight: bold;
font-family: serif;
}
.announcement-comment {
background: <%= bg_color %>;
color: <%= color2 %>;
font-size: 1.3em;
padding-left: 3%;
border-radius: 0.7em;
display: inline-block;
width: 80%;
padding: 1% 3%;
outline: 0;
}
.annc-comment-div{
display: flex;
align-items: flex-start;
}
.btn-comment{
margin-left: 3%;
color: <%= color2 %>;
font-size: 1.2em;
background: <%= bg_color %>;
margin-left: 3%;
}
.btn.btn-comment:focus{
color: <%= color2 %>;
}
.btn-comment:hover{
color: <%= color2 %>;
background-color: <%= hover_color %>;
}
.comment-time{
padding-left: 1em;
color: <%= bg_color %>;
}
.annc-comments{
margin: 1.5em 0;
}
</style>
<script type="text/javascript">
$(function(){
$('.annc-comment-div .btn-comment').click(function(){
$.ajax({
url: "<%= "/xhr/announcements/#{params[:slug]}-#{params[:uid]}/comment" %>",
data : {"comment" : $(this).parents('.annc-comment-div').find('.announcement-comment').html()},
dataType : "json",
type : "get",
success : function(data){
window.location.href = window.location.href
}
})
})
})
</script>
<% action_data['comments'].reverse.each do |comment| %>
<div class="annc-comments">
<div class="comment-time">
<%= comment.time %>
</div>
<div class="announcement-comment">
<%= comment.comment.html_safe %>
</div>
<br>
</div>
<% end %>
<% if action_data['show_comment_flag'] %>
<div class="annc-comment-div">
<div data-ph="<%= t('announcement.comment') %>" contenteditable="true" class="announcement-comment"></div>
<button class="btn btn-comment">
<%= t('announcement.send_comment') %>
</button>
</div>
<% end %>

View File

@ -3,6 +3,16 @@ en:
feed: Feed feed: Feed
import: Import import: Import
announcement: announcement:
time: Time
send_comment: Send Comment
comment: Comment
account: Account
open_comment: Open for Comment
open: Open
comment_end_time: Comment End Time
comment_role: Comment Role
visitor: Visitor
all_member: All Member
add_to_calendar: Add to calendar add_to_calendar: Add to calendar
blank_to_set: (blank to use announcement setting) blank_to_set: (blank to use announcement setting)
stime: start time stime: start time

View File

@ -3,6 +3,16 @@ zh_tw:
feed: 供給 feed: 供給
import: 匯入 import: 匯入
announcement: announcement:
time: 時間
send_comment: 送出留言
comment: 留言內容
account: 帳號
open_comment: 開放評論
open: 開放
comment_end_time: 停止開放時間
comment_role: 留言身分
visitor: 訪客
all_member: 全部會員
add_to_calendar: 加入行事曆 add_to_calendar: 加入行事曆
blank_to_set: (留白則使用公告設定) blank_to_set: (留白則使用公告設定)
stime: 開始時間 stime: 開始時間

View File

@ -23,6 +23,8 @@ Rails.application.routes.draw do
post 'announcement/import_from_wp', to: 'announcements#import_from_wp' post 'announcement/import_from_wp', to: 'announcements#import_from_wp'
post 'announcement/generate_iframe_url' => 'announcements#generate_iframe_url' post 'announcement/generate_iframe_url' => 'announcements#generate_iframe_url'
resources :announcements resources :announcements
get 'announcements/:id/comment'=> 'announcements#comment'
get 'annc-comment-hidden/:id' => 'announcements#comment_hidden'
end end
resources :announcements do resources :announcements do
@ -36,6 +38,7 @@ Rails.application.routes.draw do
get "/xhr/announcements/feeds" => "announcement_feeds#feeds" get "/xhr/announcements/feeds" => "announcement_feeds#feeds"
get '/xhr/announcements/announcement.json', to: 'bulletins#get_bulletins' get '/xhr/announcements/announcement.json', to: 'bulletins#get_bulletins'
get '/xhr/panel/announcement/widget/sync_data' => 'announcements#show_widget' get '/xhr/panel/announcement/widget/sync_data' => 'announcements#show_widget'
get '/xhr/announcements/:slug_title-:uid/comment', to: 'announcements#comment'
end end
end end