diff --git a/app/assets/javascripts/management.js b/app/assets/javascripts/management.js index 47fb767729d14615bbb80b9a64985b852b94e531..d6599d4ff51f5649c6c1eab9f427e63a47250a9b 100644 --- a/app/assets/javascripts/management.js +++ b/app/assets/javascripts/management.js @@ -19,8 +19,14 @@ //= require locastyle //= require turbolinks //= require_tree ./management + + var teachers, curators, admins; var visualised,non_visualised; +var n_complaints; +var complaints = []; +var complaints_names = []; + $(document).ready(function(){ if (document.getElementById("lobject") !== null) { visualised = document.getElementById("lobject").value; @@ -35,13 +41,16 @@ $(document).ready(function(){ var data_users = dataUsers(teachers,curators,admins); } - if(document.getElementById("lcomplaints") != null) { + if(document.getElementById("n_complaints") != null) { + + n_complaints = document.getElementById("n_complaints").value; + + for (i = 0; i < n_complaints; i++) { + complaints[i] = document.getElementById("complaints[" + i + "]").value; + complaints_names[i] = document.getElementById("complaints_names[" + i + "]").value; + } - false_user = document.getElementById("lcomplaints").value; - agressive_user = document.getElementById("lcomplaints_false").value; - offensive_object = document.getElementById("lcomplaints_offensive").value; - violates_copyright = document.getElementById("lcomplaints_violates").value; - var data_complaints = dataComplaints(false_user,agressive_user,offensive_object,violates_copyright); + var data_complaints = dataComplaints(complaints, complaints_names, n_complaints); } if (document.getElementById("lcollection") !== null) { diff --git a/app/assets/javascripts/management/complaints.js b/app/assets/javascripts/management/complaints.js index c86edd8190206abdae0a338a3a79534d81c798c9..987961aefd83b59d35d78266cfd58f031d72667f 100644 --- a/app/assets/javascripts/management/complaints.js +++ b/app/assets/javascripts/management/complaints.js @@ -3,38 +3,37 @@ //confurações dos gráficos de linha //mais infos: www.chartjs.org/docs/ +function increase_brightness(hex, percent){ + // strip the leading # if it's there + hex = hex.replace(/^\s*#|\s*$/g, ''); + + // convert 3 char codes --> 6, e.g. `E0F` --> `EE00FF` + if(hex.length == 3){ + hex = hex.replace(/(.)/g, '$1$1'); + } + + var r = parseInt(hex.substr(0, 2), 16), + g = parseInt(hex.substr(2, 2), 16), + b = parseInt(hex.substr(4, 2), 16); + + return '#' + + ((0|(1<<8) + r + (256 - r) * percent / 100).toString(16)).substr(1) + + ((0|(1<<8) + g + (256 - g) * percent / 100).toString(16)).substr(1) + + ((0|(1<<8) + b + (256 - b) * percent / 100).toString(16)).substr(1); +} //var visual = document.getElementById("object").value; //alert(visual); -function dataComplaints(false_user,agressive_user,offensive_object,violates_copyright) { - var data = [ - { - value: false_user, - color:"#68F000", - highlight: "#a9ff67", - label: "Usuários Falsos" - }, - { - value: agressive_user, - color: "#F55858", - highlight: "#FC8787", - label: "Usuários Ofensivos/Agressivos" - }, - { - value: offensive_object, - color: "#F9D60A", - highlight: "#fbe357", - label: "Objetos contém conteúdo Ofensivo/Abusivo" - }, - { - value: violates_copyright, - color: "#46BFBD", - highlight: "#5AD3D1", - label: "Objeto viola direitos Autorais" - }, - - ]; +function dataComplaints(complaints,complaints_names, n) { + + var data = []; + + for(i = 0; i < n; i++) { + var color = "#"+((1<<24)*Math.random()|0).toString(16); + var color_highlight = increase_brightness(color,20); + data[i] = {value: complaints[i], color: color, highlight: color_highlight, label: complaints_names[i]}; + } return data; } diff --git a/app/controllers/management/complaint_reasons_controller.rb b/app/controllers/management/complaint_reasons_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..36d6c89f52849910ba6faad486d42455f032b876 --- /dev/null +++ b/app/controllers/management/complaint_reasons_controller.rb @@ -0,0 +1,65 @@ +class Management::ComplaintReasonsController < ManagementController + + before_action :set_complaint_reason, only: [:destroy, :update, :edit] + + def show + end + + def index + @complaint_reasons = ComplaintReason.all + end + + + def new + @complaint_reason = ComplaintReason.new + end + + def create + @complaint_reason = ComplaintReason.new(complaint_reason_params) + + respond_to do |format| + if @complaint_reason.save + format.html { redirect_to management_complaint_reasons_path } + else + format.html { render :new } + end + end + end + + + def destroy + ComplaintReason.destroy @complaint_reason + + respond_to do |format| + format.html { redirect_to :back, notice: 'Razão de denúncia excluÃda com sucesso.' } + end + + end + + def edit + end + + + def update + respond_to do |format| + if @complaint_reason.save + format.html { redirect_to management_complaint_reasons_path } + else + format.html { render :new } + end + end + end + + + + private + + def set_complaint_reason + @complaint_reason = ComplaintReason.find params[:id] + end + + def complaint_reason_params + params.require(:complaint_reason).permit(:reason) + end + +end diff --git a/app/controllers/management/complaints_controller.rb b/app/controllers/management/complaints_controller.rb index da3a5ba121945bd27310bbdac0c32ee39e646e4a..25f54e9b58a37b721136fe292e49336487c85223 100644 --- a/app/controllers/management/complaints_controller.rb +++ b/app/controllers/management/complaints_controller.rb @@ -21,7 +21,9 @@ class Management::ComplaintsController < ManagementController -DateTime::Infinity.new end @complaints_in_period = @complaints.select{ |complaint| complaint.created_at >= @date_limit} + @n_complaints_in_period = @complaints_in_period.size @complaints_objs = @complaints_in_period.uniq{|x| x.complaintable.name}.size + @complaints_in_period = Kaminari.paginate_array(@complaints_in_period).page(params[:page]).per(25) end def suspend_object diff --git a/app/controllers/management/statistics_controller.rb b/app/controllers/management/statistics_controller.rb index 09e45aa093263bbc27b98370c37418554c570f8e..8695e54f39307c5e525f51cdf81e192b515e423a 100644 --- a/app/controllers/management/statistics_controller.rb +++ b/app/controllers/management/statistics_controller.rb @@ -39,7 +39,7 @@ class Management::StatisticsController < ManagementController @complaints = Complaint.all @n_complaints = Complaint.count @complaints_objs = @complaints.map{|complaint| complaint.complaintable.name}.inject(Hash.new(0)) { |h,e| h[e] += 1; h } - @complaints_per_message = Complaint.group(:complaint_reason_id).count + @complaints_per_message = Complaint.group(:complaint_reason).count.reduce({}){ |hash, (k, v)| hash.merge( k.reason => v ) } end end diff --git a/app/models/complaint_reason.rb b/app/models/complaint_reason.rb index 52fcbab028babde99c0b5ad2b127cc6fcdf489dc..90fd5d0f19af50e6f947fe89ef29153f2569c94d 100644 --- a/app/models/complaint_reason.rb +++ b/app/models/complaint_reason.rb @@ -1,5 +1,6 @@ class ComplaintReason < ActiveRecord::Base - has_many :complaints + has_many :complaints, dependent: :destroy validates_presence_of :reason + end diff --git a/app/views/management/complaint_reasons/_form.html.erb b/app/views/management/complaint_reasons/_form.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..07a08e4ec563ec28e36df56967ef6e5f656b169e --- /dev/null +++ b/app/views/management/complaint_reasons/_form.html.erb @@ -0,0 +1,27 @@ +<%= form_for([:management, @complaint_reason], html: {class: 'ls-form row'}) do |f| %> + + <% if @complaint_reason.errors.any? %> + <div class="ls-alert-danger"> + <h2><%= pluralize(@complaint_reason.errors.count, "erro") %> <%= "happened".pluralize(@complaint_reason.errors.count) %>:</h2> + <ul> + <% @complaint_reason.errors.full_messages.each do |message| %> + <li><%= message %></li> + <% end %> + </ul> + </div> + <% end %> + + <fieldset> + <label class="ls-label col-md-3"> + <b class="ls-label-text">Razão</b> + <p>Digite a razão</p> + <%= f.text_field :reason, {required: true} %> + </label> + </fieldset> + + <div class="ls-actions-btn"> + <button class="ls-btn">Salvar</button> + <%= link_to "Cancelar", management_complaint_reasons_path,class: "ls-btn-danger"%> + </div> + +<% end %> diff --git a/app/views/management/complaint_reasons/edit.html.erb b/app/views/management/complaint_reasons/edit.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..58e8ac702172633a5d1ca36512c73a221ea311e5 --- /dev/null +++ b/app/views/management/complaint_reasons/edit.html.erb @@ -0,0 +1,7 @@ +<h1 class="ls-title-intro ls-ico-star">Razões</h1> + +<ol class="ls-breadcrumb"> + <li><%= link_to 'Razões', management_complaint_reason_path %></li> +</ol> + +<%= render 'form' %> diff --git a/app/views/management/complaint_reasons/index.html.erb b/app/views/management/complaint_reasons/index.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..ccd43ae15366b0ca8930b0941dc11c613baefbfe --- /dev/null +++ b/app/views/management/complaint_reasons/index.html.erb @@ -0,0 +1,26 @@ +<h1 class="ls-title-intro ls-ico-bullhorn">Denúncias</h1> + +<h2 class="ls-title-4">Razões das Denúncias</h2> + + +<div class="ls-clearfix"></div> + +<% @complaint_reasons.each do |complaint| %> +<div class="ls-list"> + <header class="ls-list-header"> + <div class="ls-list-title col-md-9"> + <a href="#" ><%= complaint.reason %></a> + </div> + <div class="col-md-3 ls-txt-right"> + <%= link_to 'Modificar', edit_management_complaint_reason_path(complaint), class:'ls-btn-primary ls-ico-cog' %> + <%= link_to 'Excluir', management_complaint_reason_path(id: complaint.id), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir esta razão de denúncia?'}, title: 'Excluir', class: 'ls-btn ls-btn-sm', role: 'button'} %> + </div> + </header> +</div> +<% end %> + +<%= link_to 'Nova Razão', new_management_complaint_reason_path, title: 'Excluir', class: 'ls-btn ls-btn-sm', role: 'button' %> + + + +</div> diff --git a/app/views/management/complaint_reasons/new.html.erb b/app/views/management/complaint_reasons/new.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..db339872fa0efaf2b92dbbbcf678d033e1e710bb --- /dev/null +++ b/app/views/management/complaint_reasons/new.html.erb @@ -0,0 +1,6 @@ +<h1 class="ls-title-intro ls-ico-star">Razão</h1> + +<ol class="ls-breadcrumb"> +</ol> + +<%= render 'form' %> diff --git a/app/views/management/complaints/index.html.erb b/app/views/management/complaints/index.html.erb index c7cbec1e814de115bdb55c82e49241a1d774b129..a2d9d0069dfec0d52c350396764acc1d3083aba2 100644 --- a/app/views/management/complaints/index.html.erb +++ b/app/views/management/complaints/index.html.erb @@ -32,7 +32,7 @@ <div class="row"> <div class="col-md-6 col-sm-6"><p>Número de vezes que os usuários marcaram objetos educacionais como spam.</p></div> <div class="col-md-6 col-sm-6"> - <p class="ls-float-right ls-float-none-xs">PerÃodo selecionado: <strong>últimos 30 dias</strong></p></div> + <p class="ls-float-right ls-float-none-xs">PerÃodo selecionado: <strong><%= @date_limit %></strong></p></div> </div> <div class="ls-clearfix"></div> @@ -46,7 +46,7 @@ <h6 class="ls-title-4">Total de denúncias</h6> </div> <div class="ls-box-body"> - <strong><%= @complaints_in_period.size %></strong> + <strong><%= @n_complaints_in_period %></strong> </div> </div> </div> @@ -67,7 +67,7 @@ <div class="ls-tabs-container" id="awesome-tab-content"> <div id="infoAll" class="ls-tab-content" role="tabpanel" style="display: block;"> - <% (@complaints.sort{|x,y| x.created_at <=> y.created_at}.reverse.uniq{ |x| x.complaintable.name}).each do |complaint| %> + <% (@complaints_in_period.sort{|x,y| x.created_at <=> y.created_at}.reverse.uniq{ |x| x.complaintable.name}).each do |complaint| %> <% if Date.parse(complaint.created_at.to_s) >= @date_limit %> <div class="ls-list"> <header class="ls-list-header"> @@ -76,12 +76,12 @@ <% if complaint.complaintable.state == 'suspended' %> <a href="#" class="ls-tag-danger">Objeto Suspenso</a> <% end %> - <small><%= @complaints.select{ |x| x.complaintable.name == complaint.complaintable.name}.map{|x| x.reason }.each_with_object(Hash.new(0)){ |frequency,message| message[frequency] += 1 }.sort_by{ |k,v| v }.reverse.each{|x| x}.map{ |k,v| "#{k}(#{v})"}.join(",")%></small> + <small><%= @complaints_in_period.select{ |x| x.complaintable.name == complaint.complaintable.name}.map{|x| x.reason }.each_with_object(Hash.new(0)){ |frequency,message| message[frequency] += 1 }.sort_by{ |k,v| v }.reverse.each{|x| x}.map{ |k,v| "#{k}(#{v})"}.join(",")%></small> <div data-ls-module="collapse" data-target="#<%= complaint.complaintable.id %>" class="ls-collapse "> <a href="#" class="ls-collapse-header"><h5 class="ls-collapse-title"><strong>Descrições</strong></h5></a> <div class="ls-collapse-body" id="<%= complaint.complaintable.id %>"> - <% @complaints.sort {|left, right| left.description.length <=> right.description.length}.reverse.select{ |x| x.complaintable.name == complaint.complaintable.name }.each do |complaint_description| %> + <% @complaints_in_period.sort {|left, right| left.description.length <=> right.description.length}.reverse.select{ |x| x.complaintable.name == complaint.complaintable.name }.each do |complaint_description| %> <table class="ls-table ls-no-hover ls-table-striped"> <thead> <tr> @@ -146,4 +146,8 @@ </div> +<div class="ls-pagination-filter"> + <%= paginate @complaints_in_period, :theme => 'management_theme', :window => 2 %> +</div> + </div> diff --git a/app/views/management/statistics/complaints.html.erb b/app/views/management/statistics/complaints.html.erb index 5542a96994f179a70b0df5432b7865aaf67c0797..cff40f44d4a74f771b42cb2af2513d78890d6c51 100644 --- a/app/views/management/statistics/complaints.html.erb +++ b/app/views/management/statistics/complaints.html.erb @@ -27,7 +27,7 @@ <div class="col-sm-6 col-md-6"> <div class="ls-box"> <h6 class="ls-title-4"><%= complaint.reason %></h6> - <strong class="ls-color-theme"><%= @complaints_per_message[complaint.complaint_reason_id] %></strong> + <strong class="ls-color-theme"><%= @complaints_per_message[complaint.reason] %></strong> </div> </div> @@ -37,10 +37,14 @@ </div> </div> -<input type="hidden" id="lcomplaints" value="<%= @complaints_per_message[1] %>"/> -<input type="hidden" id="lcomplaints_false" value="<%= @complaints_per_message[2] %>"/> -<input type="hidden" id="lcomplaints_offensive" value="<%= @complaints_per_message[3] %>"/> -<input type="hidden" id="lcomplaints_violates" value="<%= @complaints_per_message[4] %>"/> + +<input type="hidden" id=<%= "n_complaints" %> value="<%= @complaints_per_message.keys.size %>"/> +<% @complaints.each_with_index do |complaint,i| %> + <input type="hidden" id=<%= "complaints[#{i}]" %> value="<%= @complaints_per_message[complaint.reason] %>"/> + <input type="hidden" id=<%= "complaints_names[#{i}]" %> value="<%= complaint.reason %>"/> +<% end %> + + <div align="right" > </div> diff --git a/app/views/management/users/admins.html.erb b/app/views/management/users/admins.html.erb index 8a6b2a1e5ed2567552b9dbb08ce54208d33d643d..a5a4f104bd0482a8700434bcffd01835ff6437be 100644 --- a/app/views/management/users/admins.html.erb +++ b/app/views/management/users/admins.html.erb @@ -64,10 +64,10 @@ <%= c.email %> </td> <td class="ls-txt-right ls-regroup"> - <%= link_to 'Administrar', edit_management_user_path(c), {class: 'ls-btn-primary ls-ico-cog', aria: {expanded: false}, role: 'combobox'} %> - <%= link_to 'Excluir', management_user_path(c), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn-danger ls-ico-close', role: 'option'} %> + <%= link_to 'Administrar', edit_management_user_path(c), {class: 'ls-btn-primary', aria: {expanded: false}, role: 'combobox'} %> + <%= link_to 'Excluir', management_user_path(c), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn-danger', role: 'option'} %> <div data-ls-module="dropdown" class="ls-dropdown ls-pos-right"> - <a href="#" class="ls-btn ls-ico-list" aria-expanded="false" role="combobox">NÃvel</a> + <a href="#" class="ls-btn" aria-expanded="false" role="combobox">NÃvel</a> <ul class="ls-dropdown-nav" aria-hidden="true"> <% Role.all.each do |r| %> <% nome = translate_role(r.name) %> diff --git a/app/views/management/users/curators.html.erb b/app/views/management/users/curators.html.erb index 46bd8c0e99bda6721f0232240617c424a13e874b..c0d0b5d24b3c4111eb3796dab4c0e0fc097b5911 100644 --- a/app/views/management/users/curators.html.erb +++ b/app/views/management/users/curators.html.erb @@ -64,10 +64,10 @@ <%= c.email %> </td> <td class="ls-txt-right ls-regroup"> - <%= link_to 'Administrar', edit_management_user_path(c), {class: 'ls-btn-primary ls-ico-cog', aria: {expanded: false}, role: 'combobox'} %> - <%= link_to 'Excluir', management_user_path(c), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn-danger ls-ico-close', role: 'option'} %> + <%= link_to 'Administrar', edit_management_user_path(c), {class: 'ls-btn-primary', aria: {expanded: false}, role: 'combobox'} %> + <%= link_to 'Excluir', management_user_path(c), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn-danger', role: 'option'} %> <div data-ls-module="dropdown" class="ls-dropdown ls-pos-right"> - <a href="#" class="ls-btn ls-ico-list" aria-expanded="false" role="combobox">NÃvel</a> + <a href="#" class="ls-btn" aria-expanded="false" role="combobox">NÃvel</a> <ul class="ls-dropdown-nav" aria-hidden="true"> <% Role.all.each do |r| %> <% nome = translate_role(r.name) %> diff --git a/app/views/management/users/index.html.erb b/app/views/management/users/index.html.erb index 14d53767fbf23e56b9fef5f6652d7a74e880dad8..a2d275d8d85fac0371f2c2a2439e0240d486b07e 100644 --- a/app/views/management/users/index.html.erb +++ b/app/views/management/users/index.html.erb @@ -66,10 +66,10 @@ </td> <td class="ls-txt-right ls-regroup"> - <%= link_to 'Administrar', edit_management_user_path(u), {class: 'ls-btn-primary ls-ico-cog', aria: {expanded: false}, role: 'combobox'} %> - <%= link_to 'Excluir', management_user_path(u), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn-danger ls-ico-close', role: 'option'} %> + <%= link_to 'Administrar', edit_management_user_path(u), {class: 'ls-btn-primary', aria: {expanded: false}, role: 'combobox'} %> + <%= link_to 'Excluir', management_user_path(u), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn-danger', role: 'option'} %> <div data-ls-module="dropdown" class="ls-dropdown ls-pos-right"> - <a href="#" class="ls-btn ls-ico-list" aria-expanded="false" role="combobox">NÃvel</a> + <a href="#" class="ls-btn" aria-expanded="false" role="combobox">NÃvel</a> <ul class="ls-dropdown-nav"> <% @user = u %> <% Role.all.each do |r| %> diff --git a/app/views/shared/management/_nav_menu.html.erb b/app/views/shared/management/_nav_menu.html.erb index da5517392b150b7b541e95184c36153c5530dd6d..142c107193eb73cc4d6695a40544fa343f5c0150 100644 --- a/app/views/shared/management/_nav_menu.html.erb +++ b/app/views/shared/management/_nav_menu.html.erb @@ -11,6 +11,7 @@ <li><%= link_to "Coleções", collections_management_statistics_path, class: 'ls-submenu-item' %></li> <li><%= link_to "Objetos", learning_objects_management_statistics_path, class: 'ls-submenu-item' %></li> <li><%= link_to "Acessos", accesses_management_statistics_path, class: 'ls-submenu-item' %></li> + <li><%= link_to "Denúncias", complaints_management_statistics_path, class: 'ls-submenu-item' %></li> </ul> </li> <li><%= link_to "Instituições", management_institutions_path, class: 'ls-ico-list2' %></li> @@ -22,7 +23,15 @@ <li><%= link_to "Administradores", admins_management_users_path, class: 'ls-submenu-item' %></li> </ul> </li> - <li><%= link_to "Denúncias", management_complaints_path, class: 'ls-ico-bullhorn' %> + + <li class="ls-submenu"> + <a href="#" class="ls-ico-bullhorn">Denúncias</a> + <ul role="menu"> + <li><%= link_to "Denúncias", management_complaints_path, class: 'ls-submenu-item' %> + <li><%= link_to "Razões", management_complaint_reasons_path, class: 'ls-submenu-item' %> + </ul> + </li> + <li> <%= link_to "Voltar ao Portal", root_path, class: 'ls-ico-chevron-left' %> </li> </ul> diff --git a/config/routes.rb b/config/routes.rb index 9c7b79d700469e89df8bab48ded3c51bb18f9c0e..668389642b64b537cd5763cf68e0d656330d2b94 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,6 +18,8 @@ Rails.application.routes.draw do delete '/user/:user_id', as: :remove_user, action: :remove_user end end + + resources :complaint_reasons resources :highlights resources :carousels