fix some error and add new feature to let user can set role's is_top limit

and is_hot limit
This commit is contained in:
chiu 2020-03-02 18:09:55 +08:00
parent 5ab900e6e3
commit 6a5712500d
9 changed files with 304 additions and 132 deletions

View File

@ -102,6 +102,10 @@ class Admin::AnnouncementsController < OrbitAdminController
def updatesettings def updatesettings
setting = @announcement_setting setting = @announcement_setting
ids = params['announcement_setting']['anns_status_settings'].collect do |i,v|
v['_id']
end.compact
AnnsStatusSetting.where(:id.nin=>ids).destroy
setting.update_attributes(settings_params) setting.update_attributes(settings_params)
setting.save setting.save
redirect_to admin_announcement_settings_path redirect_to admin_announcement_settings_path
@ -144,6 +148,7 @@ class Admin::AnnouncementsController < OrbitAdminController
@statuses = [] @statuses = []
@bulletin = Bulletin.new @bulletin = Bulletin.new
@bulletin.email_sentdate = Time.now @bulletin.email_sentdate = Time.now
@reach_limit = @bulletin.check_status_limit(current_user,true)
end end
def create def create
@ -195,6 +200,7 @@ class Admin::AnnouncementsController < OrbitAdminController
def edit def edit
if can_edit_or_delete?(@bulletin) if can_edit_or_delete?(@bulletin)
@reach_limit = @bulletin.check_status_limit(current_user,true)
@tags = @module_app.tags @tags = @module_app.tags
@categories = @module_app.categories.enabled @categories = @module_app.categories.enabled
@statuses = [] @statuses = []
@ -223,6 +229,7 @@ class Admin::AnnouncementsController < OrbitAdminController
end end
bulletin.update_attributes(bps) bulletin.update_attributes(bps)
bulletin.update_user_id = current_user.id
if bulletin.rejected if bulletin.rejected
bulletin.reapproval = true bulletin.reapproval = true
bulletin.save bulletin.save
@ -231,7 +238,10 @@ class Admin::AnnouncementsController < OrbitAdminController
bulletin.save bulletin.save
end end
build_email(bulletin) build_email(bulletin)
redirect_to params['referer_url'] now_bulletin_page = Bulletin.where(:title.ne => "",:is_preview.in=>[false,nil])
.order_by(sort).map(&:id).map.with_index.select{|v,i| v==bulletin.id}[0][1] rescue nil
now_bulletin_page = now_bulletin_page.nil? ? 0 : ((now_bulletin_page+1).to_f/10).ceil
redirect_to "/zh_tw/admin/announcements?page=#{now_bulletin_page}"
end end
def destroy def destroy

View File

@ -133,8 +133,9 @@ class AnnouncementsController < ApplicationController
sorted_anns = sorted_anns.sample(widget_data_count) sorted_anns = sorted_anns.sample(widget_data_count)
end end
else else
sorted_anns = Bulletin.find(anns_cache.first.filter_result) sorted_ann_ids = anns_cache.first.filter_result
sorted_anns = sorted_anns.sort_by{|v| [(v.is_top==true ? 1 : 0),v['postdate']]}.reverse sorted_anns = Bulletin.find(sorted_ann_ids)
sorted_anns = sorted_ann_ids.map{|v1| sorted_anns.find{|v2| v2.id==v1}}
end end
if (defined? SiteFeed).nil? || is_random if (defined? SiteFeed).nil? || is_random
anns = sorted_anns.map{|v| data_to_human_type(v)} anns = sorted_anns.map{|v| data_to_human_type(v)}

View File

@ -100,19 +100,19 @@ module AnnouncementsHelper
end end
fans fans
end end
def filter_by_keywords(sorted,keywords,postdate) def filter_by_keywords(sorted,keywords)
sorted.select{|anns|
flag1 = true
if !keywords.nil? if !keywords.nil?
sorted.select{|anns|
if anns["source-site"].present? if anns["source-site"].present?
title = Nokogiri::HTML(anns["title"].to_s).text title = Nokogiri::HTML(anns["title"].to_s).text
else else
title = Nokogiri::HTML(anns.title.to_s).text title = Nokogiri::HTML(anns.title.to_s).text
end end
flag1 = title.include?(keywords.to_s) title.include?(keywords.to_s)
end
flag1
} }
else
sorted
end
end end
def get_sorted_annc def get_sorted_annc
params = OrbitHelper.params params = OrbitHelper.params
@ -145,9 +145,9 @@ module AnnouncementsHelper
else else
all_sorted = feeds_anns.sort_by{|v| v["postdate"] } all_sorted = feeds_anns.sort_by{|v| v["postdate"] }
end end
all_filter = filter_by_keywords(all_sorted,params[:keywords],params[:postdate]) all_filter = filter_by_keywords(all_sorted,params[:keywords])
else else
all_filter = filter_by_keywords(announcements,params[:keywords],params[:postdate]) all_filter = filter_by_keywords(announcements,params[:keywords])
end end
if page_data_count != 0 if page_data_count != 0
sorted = all_filter[(page_number-1)*page_data_count...page_number*page_data_count] sorted = all_filter[(page_number-1)*page_data_count...page_number*page_data_count]

View File

@ -6,7 +6,8 @@ class AnnouncementSetting
field :pro_enabled, type: Boolean, :default => false field :pro_enabled, type: Boolean, :default => false
field :approvers, type: Array, :default => [] field :approvers, type: Array, :default => []
field :email_to, type: Array, :default => ["admins","managers","approvers"] field :email_to, type: Array, :default => ["admins","managers","approvers"]
has_many :anns_status_settings, :autosave => true, :dependent => :destroy
accepts_nested_attributes_for :anns_status_settings, :allow_destroy => true
def self.check_limit_for_user(user_id, b_id = nil) def self.check_limit_for_user(user_id, b_id = nil)
limit = self.first.top_limit rescue 0 limit = self.first.top_limit rescue 0
return true if limit == 0 return true if limit == 0

View File

@ -0,0 +1,7 @@
class AnnsStatusSetting
include Mongoid::Document
field :role_id
field :status
field :top_limit
belongs_to :announcement_setting
end

View File

@ -54,7 +54,42 @@ class Bulletin
scope :is_approved, ->{where(:approved => true)} scope :is_approved, ->{where(:approved => true)}
before_create :set_expire before_create :set_expire
before_save :check_limit
def check_limit
check_status_limit(update_user)
end
def check_status_limit(user,check_only=false)
role_ids = user.member_profile.roles.map(&:id) rescue []
status_settings = (role_ids.collect do |role_id|
AnnouncementSetting.first.anns_status_settings.select{|v| v.role_id.to_s == role_id.to_s}
end.flatten rescue [])
reach_limit = []
if status_settings.count != 0
reach_limit = status_settings.collect do |status_setting|
status = status_setting.status
if status_setting.top_limit.to_i <= Bulletin.where(:update_user_id.in => Role.find(status_setting.role_id).member_profiles.collect(&:user).flatten.uniq.map{|v| v.id},status => true).count
if !check_only
if self[status] && !Bulletin.where(id:self.id).first[status]
self[status] = false
nil
end
else
status
end
else
nil
end
end.compact
reach_limit = reach_limit.group_by{|v| v}.collect do |k,v|
if v.count >= user.member_profile.roles.count
k
else
nil
end
end.compact
end
reach_limit
end
def slug_title def slug_title
doc = Nokogiri::HTML(self.title) doc = Nokogiri::HTML(self.title)
title = doc.text.gsub('/','-') title = doc.text.gsub('/','-')

View File

@ -3,6 +3,17 @@
<%= stylesheet_link_tag "lib/fileupload" %> <%= stylesheet_link_tag "lib/fileupload" %>
<%= stylesheet_link_tag "lib/main-list" %> <%= stylesheet_link_tag "lib/main-list" %>
<% end %> <% end %>
<style type="text/css">
.reach_limit{
background: #a90c0c;
color: white;
padding: 4px 12px;
font-family: 'Varela Round';
letter-spacing: -.4px;
cursor: default;
display: inline-block;
}
</style>
<% content_for :page_specific_javascript do %> <% content_for :page_specific_javascript do %>
<%= javascript_include_tag "lib/bootstrap-fileupload" %> <%= javascript_include_tag "lib/bootstrap-fileupload" %>
<%= javascript_include_tag "lib/bootstrap-datetimepicker" %> <%= javascript_include_tag "lib/bootstrap-datetimepicker" %>
@ -87,17 +98,28 @@
<!-- Status Module --> <!-- Status Module -->
<div class="tab-pane fade" id="status"> <div class="tab-pane fade" id="status">
<!-- Status --> <!-- Status -->
<div class="control-group"> <div class="control-group">
<label class="control-label muted"><%= t(:status) %></label> <label class="control-label muted"><%= t(:status) %></label>
<div class="controls" data-toggle="buttons-checkbox"> <div class="controls" data-toggle="buttons-checkbox">
<% if !(@reach_limit.include?('is_top') && @bulletin.is_top != true) || current_user.is_admin? %>
<label class="checkbox inline btn <%= 'active' if @bulletin.is_top? || (!@bulletin.top_end_date.nil? && @bulletin.top_end_date > Time.now) %>"> <label class="checkbox inline btn <%= 'active' if @bulletin.is_top? || (!@bulletin.top_end_date.nil? && @bulletin.top_end_date > Time.now) %>">
<%= f.check_box :is_top %> <%= t(:top) %> <%= f.check_box :is_top %> <%= t(:top) %>
</label> </label>
<% else %>
<label class="reach_limit">
<%= t(:top) %>
</label>
<% end %>
<% if !(@reach_limit.include?('is_hot') && @bulletin.is_hot != true) || current_user.is_admin? %>
<label class="checkbox inline btn <%= 'active' if @bulletin.is_hot? %>"> <label class="checkbox inline btn <%= 'active' if @bulletin.is_hot? %>">
<%= f.check_box :is_hot %> <%= t(:hot) %> <%= f.check_box :is_hot %> <%= t(:hot) %>
</label> </label>
<% else %>
<label class="reach_limit">
<%= t(:hot) %>
</label>
<% end %>
<label class="checkbox inline btn <%= 'active' if @bulletin.is_hidden? %>"> <label class="checkbox inline btn <%= 'active' if @bulletin.is_hidden? %>">
<%= f.check_box :is_hidden %> <%= t(:hide) %> <%= f.check_box :is_hidden %> <%= t(:hide) %>
</label> </label>

View File

@ -24,7 +24,7 @@
</td> </td>
<td> <td>
<% if b.expired? || (b.category.disable rescue false)%> <% if b.expired? || (b.category.disable rescue false)%>
<%= b.title %> <%= b.title.html_safe %>
<% else %> <% else %>
<a href="<%= page_for_bulletin(b) %>" target="_blank"><%= b.title.html_safe %></a> <a href="<%= page_for_bulletin(b) %>" target="_blank"><%= b.title.html_safe %></a>
<% end %> <% end %>

View File

@ -44,12 +44,80 @@
#approver-list .approver-title{ #approver-list .approver-title{
font-size: 14px; font-size: 14px;
} }
.table{
display: flex;
flex-direction: column;
}
.table-row,.role_limit_tr,.role_limit_add {
width: 100%;
display: inline-flex;
align-items: center;
margin-bottom: 0.5em;
}
.td{
width: 30%;
display: inline-flex;
justify-content: center;
}
.table{
border: #2d4cd0 0.1em solid;
}
.td-3{
width: 100%;
display: inline-flex;
justify-content: center;
}
.td>*{
max-width: 95%;
}
.td-delete{
width: 10%;
}
</style> </style>
<% <%
sub_managers = @module_app.sub_managers sub_managers = @module_app.sub_managers
sub_managers.delete(nil) sub_managers.delete(nil)
all_statuses = [[t('top'),'is_top'],[t('hot'),'is_hot']]
tp1 = select_tag("announcement_setting[anns_status_settings][-1][status]",options_for_select(all_statuses))
tp2 = select_tag("announcement_setting[anns_status_settings][-1][role_id]",options_for_select(Role.all.map{|r| [r.title,r.id]}))
tp3 = number_field_tag("announcement_setting[anns_status_settings][-1][top_limit]",nil, min: 0,required: true)
tp4 = "<button type='button' onclick='delete_limit_role(this)'' class='btn'>#{t('delete_')}</button>"
all_tp = "<div class='role_limit_tr'><div class='td'>#{tp1}</div><div class='td'>#{tp2}</div><div class='td'>#{tp3}</div><div class='td-delete'>#{tp4}</div></div>"
%> %>
<script type="text/javascript">
function add_limit_role(){
var role_limit_l = $('.role_limit_tr').length
var role_limit_tp = '<%= all_tp.inspect %>'
role_limit_tp = role_limit_tp.replace(/-1/g,role_limit_l)
$('.role_limit_add').before($('<div/>').html(role_limit_tp).text().slice(1,-2))
}
function delete_limit_role(ele){
var now_index = $(ele).parents('.role_limit_tr').index('.role_limit_tr')
console.log(now_index)
$(ele).parents('.role_limit_tr').remove()
$('.role_limit_tr').each(function(i,v){
if (i >= now_index){
$(v).find('[name^="announcement_setting[anns_status_settings]"]').each(function(i1,v1){
console.log($(v1).attr('name'))
$(v1).attr('name',$(v1).attr('name').replace(/\d+/g,i.toString()))
})
}
})
}
var approverList = $(".hidden-approver-list");
$(".approver-check input").on("click",function(){
var el = $(this);
if(el.is(":checked")){
var t = $("<input type='hidden'>");
t.val(el.val());
t.attr("name", "announcement_setting[approvers][]");
t.attr("id", "check_" + el.val());
approverList.append(t);
}else{
approverList.find("#check_" + el.val()).remove();
}
})
</script>
<div id="notification"><%= t("announcement.click_on_submit") %></div> <div id="notification"><%= t("announcement.click_on_submit") %></div>
<%= form_for @setting, url: (@setting.new_record? ? admin_announcement_createsettings_path : admin_announcement_updatesettings_path), html: {class: "form-horizontal main-forms"} do |f| %> <%= form_for @setting, url: (@setting.new_record? ? admin_announcement_createsettings_path : admin_announcement_updatesettings_path), html: {class: "form-horizontal main-forms"} do |f| %>
<div class="input-area"> <div class="input-area">
@ -60,6 +128,47 @@
<span class="help-block"><%= t("announcement.for_unlimited") %></span> <span class="help-block"><%= t("announcement.for_unlimited") %></span>
</div> </div>
</div> </div>
<div class="control-group">
<div class="table">
<div class="table-row">
<div class="td">
<%= t('status') %>
</div>
<div class="td">
<%= t('role') %>
</div>
<div class="td">
<%= t('announcement.top_limit') %>
</div>
</div>
<% (AnnouncementSetting.first.anns_status_settings rescue []).each_with_index do |v,i| %>
<div class="role_limit_tr">
<%= hidden_field_tag("announcement_setting[anns_status_settings][#{i}][_id]",v.id) %>
<div class="td">
<%= select_tag("announcement_setting[anns_status_settings][#{i}][status]",options_for_select(all_statuses,:selected => v['status'])) %>
</div>
<div class="td">
<%= select_tag("announcement_setting[anns_status_settings][#{i}][role_id]",options_for_select(Role.all.map{|r| [r.title,r.id]},:selected => v['role_id'])) %>
</div>
<div class="td">
<%= number_field_tag("announcement_setting[anns_status_settings][#{i}][top_limit]",v['top_limit'], min: 0,required: true) %>
</div>
<div class="td-delete">
<button type="button" onclick="delete_limit_role(this)" class="btn">
<%= t('delete_') %>
</button>
</div>
</div>
<% end %>
<div class="role_limit_add">
<div class="td-3">
<button type="button" onclick="add_limit_role()" class="btn">
<%= t('add') %>
</button>
</div>
</div>
</div>
</div>
<% if AnnouncementSetting.is_pro? %> <% if AnnouncementSetting.is_pro? %>
<% if !sub_managers.blank? %> <% if !sub_managers.blank? %>
<div class="control-group"> <div class="control-group">
@ -120,19 +229,6 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var approverList = $(".hidden-approver-list");
$(".approver-check input").on("click",function(){
var el = $(this);
if(el.is(":checked")){
var t = $("<input type='hidden'>");
t.val(el.val());
t.attr("name", "announcement_setting[approvers][]");
t.attr("id", "check_" + el.val());
approverList.append(t);
}else{
approverList.find("#check_" + el.val()).remove();
}
})
$("#approverModal").on("hidden",function(){ $("#approverModal").on("hidden",function(){
$("#notification").slideDown(); $("#notification").slideDown();
$(".badge-info").text($(".hidden-approver-list input").length); $(".badge-info").text($(".hidden-approver-list input").length);