From 7ed7129acee603f4550f221060352c616bda190b Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 19 Sep 2016 14:23:33 +0800 Subject: [PATCH 001/154] =?UTF-8?q?=E7=94=98=E7=89=B9=E5=9B=BE=E5=92=8C?= =?UTF-8?q?=E6=97=A5=E5=8E=86=E6=98=BE=E7=A4=BA=E5=8F=8ACSS=E6=9E=B6?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/base_projects.html.erb | 2 +- app/views/projects/_tools_expand.html.erb | 20 ++++++++++---------- public/stylesheets/css/calendar.css | 0 public/stylesheets/css/gantt.css | 0 4 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 public/stylesheets/css/calendar.css create mode 100644 public/stylesheets/css/gantt.css diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb index d3e72cc5a..11cc8aada 100644 --- a/app/views/layouts/base_projects.html.erb +++ b/app/views/layouts/base_projects.html.erb @@ -12,7 +12,7 @@ <%= favicon %> <%= javascript_heads %> <%= heads_for_theme %> - <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/common','css/structure','scm','css/public', 'css/project','css/popup','prettify','repository' %> + <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/common','css/structure','scm','css/public', 'css/project','css/popup','prettify','repository','css/gantt', 'css/calendar' %> <%= javascript_include_tag 'cookie','project',"avatars", 'header','prettify','select_list_move','attachments' %> <%= call_hook :view_layouts_base_html_head %> diff --git a/app/views/projects/_tools_expand.html.erb b/app/views/projects/_tools_expand.html.erb index 72f095609..414eb16fc 100644 --- a/app/views/projects/_tools_expand.html.erb +++ b/app/views/projects/_tools_expand.html.erb @@ -18,16 +18,16 @@ - - - - - - - - - - +
  • + <% unless @project.enabled_modules.where("name = 'calendar'").empty? %> + <%= link_to l(:project_module_calendar),project_calendar_path(@project) %> + <% end %> +
  • +
  • + <% unless @project.enabled_modules.where("name = 'gantt'").empty? %> + <%= link_to l(:project_module_gantt) ,project_gantt_path(@project) %> + <% end %> +
  • diff --git a/public/stylesheets/css/calendar.css b/public/stylesheets/css/calendar.css new file mode 100644 index 000000000..e69de29bb diff --git a/public/stylesheets/css/gantt.css b/public/stylesheets/css/gantt.css new file mode 100644 index 000000000..e69de29bb From 8d2636e3e6e8218a17489baf98dc710a64741b7f Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 19 Sep 2016 15:43:40 +0800 Subject: [PATCH 002/154] =?UTF-8?q?=E7=94=98=E7=89=B9=E5=9B=BEcss=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/gantts/show.html.erb | 643 ++++++++++++++++--------------- public/stylesheets/css/gantt.css | 177 +++++++++ 2 files changed, 499 insertions(+), 321 deletions(-) diff --git a/app/views/gantts/show.html.erb b/app/views/gantts/show.html.erb index 2808a99cc..f72113841 100644 --- a/app/views/gantts/show.html.erb +++ b/app/views/gantts/show.html.erb @@ -1,321 +1,322 @@ -
    -

    <% @gantt.view = self %> - <%= @query.new_record? ? l(:label_gantt) : h(@query.name) %>

    -
    - -<%= form_tag({:controller => 'gantts', :action => 'show', - :project_id => @project, :month => params[:month], - :year => params[:year], :months => params[:months]}, - :method => :get, :id => 'query_form') do %> -<%= hidden_field_tag 'set_filter', '1' %> -
    "> - <%= l(:label_filter_plural) %> -
    "> - <%= render :partial => 'queries/filters', :locals => {:query => @query} %> -
    -
    - - -

    - <%= gantt_zoom_link(@gantt, :in) %> - <%= gantt_zoom_link(@gantt, :out) %> -

    - -

    -<%= text_field_tag 'months', @gantt.months, :size => 2 %> -<%= l(:label_months_from) %> -<%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %> -<%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %> -<%= hidden_field_tag 'zoom', @gantt.zoom %> - -<%= link_to_function l(:button_apply), '$("#query_form").submit()', - :class => 'icon icon-checked' %> -<%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, - :class => 'icon icon-reload' %> -

    -<% end %> - -<%= error_messages_for 'query' %> -<% if @query.valid? %> -<% - zoom = 1 - @gantt.zoom.times { zoom = zoom * 2 } - - subject_width = 330 - header_height = 18 - - headers_height = header_height - show_weeks = false - show_days = false - - if @gantt.zoom > 1 - show_weeks = true - headers_height = 2 * header_height - if @gantt.zoom > 2 - show_days = true - headers_height = 3 * header_height - end - end - - # Width of the entire chart - g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i - @gantt.render(:top => headers_height + 8, - :zoom => zoom, - :g_width => g_width, - :subject_width => subject_width) - g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max - t_height = g_height + headers_height -%> - -<% if @gantt.truncated %> -

    <%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %>

    -<% end %> - - - - - - - -
    - <% - style = "" - style += "position:relative;" - style += "height: #{t_height + 24}px;" - style += "width: #{subject_width + 1}px;" - %> - <%= content_tag(:div, :style => style) do %> - <% - style = "" - style += "right:-2px;" - style += "width: #{subject_width}px;" - style += "height: #{headers_height}px;" - style += 'background: #eee;' - %> - <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> - <% - style = "" - style += "right:-2px;" - style += "width: #{subject_width}px;" - style += "height: #{t_height}px;" - style += 'border-left: 1px solid #c0c0c0;' - style += 'overflow: hidden;' - %> - <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> - <%= content_tag(:div, :class => "gantt_subjects") do %> - <%= @gantt.subjects.html_safe %> - <% end %> - <% end %> - -
    -<% - style = "" - style += "width: #{g_width - 1}px;" - style += "height: #{headers_height}px;" - style += 'background: #eee;' -%> -<%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %> - -<% ###### Months headers ###### %> -<% - month_f = @gantt.date_from - left = 0 - height = (show_weeks ? header_height : header_height + g_height) -%> -<% @gantt.months.times do %> - <% - width = (((month_f >> 1) - month_f) * zoom - 1).to_i - style = "" - style += "left: #{left}px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - %> - <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> - <%= link_to h("#{month_f.year}-#{month_f.month}"), - @gantt.params.merge(:year => month_f.year, :month => month_f.month), - :title => "#{month_name(month_f.month)} #{month_f.year}" %> - <% end %> - <% - left = left + width + 1 - month_f = month_f >> 1 - %> -<% end %> - -<% ###### Weeks headers ###### %> -<% if show_weeks %> - <% - left = 0 - height = (show_days ? header_height - 1 : header_height - 1 + g_height) - %> - <% if @gantt.date_from.cwday == 1 %> - <% - # @date_from is monday - week_f = @gantt.date_from - %> - <% else %> - <% - # find next monday after @date_from - week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1) - width = (7 - @gantt.date_from.cwday + 1) * zoom - 1 - style = "" - style += "left: #{left}px;" - style += "top: 19px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - %> - <%= content_tag(:div, ' '.html_safe, - :style => style, :class => "gantt_hdr") %> - <% left = left + width + 1 %> - <% end %> - <% while week_f <= @gantt.date_to %> - <% - width = ((week_f + 6 <= @gantt.date_to) ? - 7 * zoom - 1 : - (@gantt.date_to - week_f + 1) * zoom - 1).to_i - style = "" - style += "left: #{left}px;" - style += "top: 19px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - %> - <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> - <%= content_tag(:small) do %> - <%= week_f.cweek if width >= 16 %> - <% end %> - <% end %> - <% - left = left + width + 1 - week_f = week_f + 7 - %> - <% end %> -<% end %> - -<% ###### Days headers ####### %> -<% if show_days %> - <% - left = 0 - height = g_height + header_height - 1 - wday = @gantt.date_from.cwday - %> - <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %> - <% - width = zoom - 1 - style = "" - style += "left: #{left}px;" - style += "top:37px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - style += "font-size:0.7em;" - clss = "gantt_hdr" - clss << " nwday" if @gantt.non_working_week_days.include?(wday) - %> - <%= content_tag(:div, :style => style, :class => clss) do %> - <%= day_letter(wday) %> - <% end %> - <% - left = left + width + 1 - wday = wday + 1 - wday = 1 if wday > 7 - %> - <% end %> -<% end %> - -<%= @gantt.lines.html_safe %> - -<% ###### Today red line (excluded from cache) ###### %> -<% if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %> - <% - today_left = (((Date.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i - style = "" - style += "position: absolute;" - style += "height: #{g_height}px;" - style += "top: #{headers_height + 1}px;" - style += "left: #{today_left}px;" - style += "width:10px;" - style += "border-left: 1px dashed red;" - %> - <%= content_tag(:div, ' '.html_safe, :style => style, :id => 'today_line') %> -<% end %> -<% - style = "" - style += "position: absolute;" - style += "height: #{g_height}px;" - style += "top: #{headers_height + 1}px;" - style += "left: 0px;" - style += "width: #{g_width - 1}px;" -%> -<%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %> -
    -
    - - - - - - -
    - <%= link_to_content_update("\xc2\xab " + l(:label_previous), - params.merge(@gantt.params_previous)) %> - - <%= link_to_content_update(l(:label_next) + " \xc2\xbb", - params.merge(@gantt.params_next)) %> -
    - -<% other_formats_links do |f| %> - <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %> - <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %> -<% end %> -<% end # query.valid? %> - -<% content_for :sidebar do %> - <%= render :partial => 'issues/sidebar' %> -<% end %> - -<% html_title(l(:label_gantt)) -%> - -<% content_for :header_tags do %> - <%= javascript_include_tag 'raphael' %> - <%= javascript_include_tag 'gantt' %> -<% end %> - -<%= javascript_tag do %> - var issue_relation_type = <%= raw Redmine::Helpers::Gantt::DRAW_TYPES.to_json %>; - $(document).ready(drawGanttHandler); - $(window).resize(drawGanttHandler); - $(function() { - $("#draw_rels").change(drawGanttHandler); - $("#draw_progress_line").change(drawGanttHandler); - }); -<% end %> +
    +

    <% @gantt.view = self %> + <%= @query.new_record? ? l(:label_gantt) : h(@query.name) %>

    +
    + +<%= form_tag({:controller => 'gantts', :action => 'show', + :project_id => @project, :month => params[:month], + :year => params[:year], :months => params[:months]}, + :method => :get, :id => 'query_form') do %> +<%= hidden_field_tag 'set_filter', '1' %> +
    "> + <%= l(:label_filter_plural) %> +
    "> + <%= render :partial => 'queries/filters', :locals => {:query => @query} %> +
    +
    + + +

    + <%= gantt_zoom_link(@gantt, :in) %> + <%= gantt_zoom_link(@gantt, :out) %> +

    + +

    +<%= text_field_tag 'months', @gantt.months, :size => 2 %> +<%= l(:label_months_from) %> +<%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %> +<%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %> +<%= hidden_field_tag 'zoom', @gantt.zoom %> + +<%= link_to_function l(:button_apply), '$("#query_form").submit()', + :class => 'icon icon-checked' %> +<%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, + :class => 'icon icon-reload' %> +

    +<% end %> + +<%= error_messages_for 'query' %> +<% if @query.valid? %> +<% + zoom = 1 + @gantt.zoom.times { zoom = zoom * 2 } + + subject_width = 330 + header_height = 18 + + headers_height = header_height + show_weeks = false + show_days = false + + if @gantt.zoom > 1 + show_weeks = true + headers_height = 2 * header_height + if @gantt.zoom > 2 + show_days = true + headers_height = 3 * header_height + end + end + + # Width of the entire chart + g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i + @gantt.render(:top => headers_height + 8, + :zoom => zoom, + :g_width => g_width, + :subject_width => subject_width) + g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max + t_height = g_height + headers_height +%> + +<% if @gantt.truncated %> +

    <%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %>

    +<% end %> + + + + + + + +
    + <% + style = "" + style += "position:relative;" + style += "height: #{t_height + 24}px;" + style += "width: #{subject_width + 1}px;" + %> + <%= content_tag(:div, :style => style) do %> + <% + style = "" + style += "right:-2px;" + style += "width: #{subject_width}px;" + style += "height: #{headers_height}px;" + style += 'background: #eee;' + style += 'z-index: 1;' + %> + <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> + <% + style = "" + style += "right:-2px;" + style += "width: #{subject_width}px;" + style += "height: #{t_height}px;" + style += 'border-left: 1px solid #c0c0c0;' + style += 'overflow: hidden;' + %> + <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> + <%= content_tag(:div, :class => "gantt_subjects") do %> + <%= @gantt.subjects.html_safe %> + <% end %> + <% end %> + +
    +<% + style = "" + style += "width: #{g_width - 1}px;" + style += "height: #{headers_height}px;" + style += 'background: #eee;' +%> +<%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %> + +<% ###### Months headers ###### %> +<% + month_f = @gantt.date_from + left = 0 + height = (show_weeks ? header_height : header_height + g_height) +%> +<% @gantt.months.times do %> + <% + width = (((month_f >> 1) - month_f) * zoom - 1).to_i + style = "" + style += "left: #{left}px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> + <%= link_to h("#{month_f.year}-#{month_f.month}"), + @gantt.params.merge(:year => month_f.year, :month => month_f.month), + :title => "#{month_name(month_f.month)} #{month_f.year}" %> + <% end %> + <% + left = left + width + 1 + month_f = month_f >> 1 + %> +<% end %> + +<% ###### Weeks headers ###### %> +<% if show_weeks %> + <% + left = 0 + height = (show_days ? header_height - 1 : header_height - 1 + g_height) + %> + <% if @gantt.date_from.cwday == 1 %> + <% + # @date_from is monday + week_f = @gantt.date_from + %> + <% else %> + <% + # find next monday after @date_from + week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1) + width = (7 - @gantt.date_from.cwday + 1) * zoom - 1 + style = "" + style += "left: #{left}px;" + style += "top: 19px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, ' '.html_safe, + :style => style, :class => "gantt_hdr") %> + <% left = left + width + 1 %> + <% end %> + <% while week_f <= @gantt.date_to %> + <% + width = ((week_f + 6 <= @gantt.date_to) ? + 7 * zoom - 1 : + (@gantt.date_to - week_f + 1) * zoom - 1).to_i + style = "" + style += "left: #{left}px;" + style += "top: 19px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> + <%= content_tag(:small) do %> + <%= week_f.cweek if width >= 16 %> + <% end %> + <% end %> + <% + left = left + width + 1 + week_f = week_f + 7 + %> + <% end %> +<% end %> + +<% ###### Days headers ####### %> +<% if show_days %> + <% + left = 0 + height = g_height + header_height - 1 + wday = @gantt.date_from.cwday + %> + <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %> + <% + width = zoom - 1 + style = "" + style += "left: #{left}px;" + style += "top:37px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + style += "font-size:0.7em;" + clss = "gantt_hdr" + clss << " nwday" if @gantt.non_working_week_days.include?(wday) + %> + <%= content_tag(:div, :style => style, :class => clss) do %> + <%= day_letter(wday) %> + <% end %> + <% + left = left + width + 1 + wday = wday + 1 + wday = 1 if wday > 7 + %> + <% end %> +<% end %> + +<%= @gantt.lines.html_safe %> + +<% ###### Today red line (excluded from cache) ###### %> +<% if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %> + <% + today_left = (((Date.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i + style = "" + style += "position: absolute;" + style += "height: #{g_height}px;" + style += "top: #{headers_height + 1}px;" + style += "left: #{today_left}px;" + style += "width:10px;" + style += "border-left: 1px dashed red;" + %> + <%= content_tag(:div, ' '.html_safe, :style => style, :id => 'today_line') %> +<% end %> +<% + style = "" + style += "position: absolute;" + style += "height: #{g_height}px;" + style += "top: #{headers_height + 1}px;" + style += "left: 0px;" + style += "width: #{g_width - 1}px;" +%> +<%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %> +
    +
    + + + + + + +
    + <%= link_to_content_update("\xc2\xab " + l(:label_previous), + params.merge(@gantt.params_previous)) %> + + <%= link_to_content_update(l(:label_next) + " \xc2\xbb", + params.merge(@gantt.params_next)) %> +
    + +<% other_formats_links do |f| %> + <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %> + <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %> +<% end %> +<% end # query.valid? %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + +<% html_title(l(:label_gantt)) -%> + +<% content_for :header_tags do %> + <%= javascript_include_tag 'raphael' %> + <%= javascript_include_tag 'gantt' %> +<% end %> + +<%= javascript_tag do %> + var issue_relation_type = <%= raw Redmine::Helpers::Gantt::DRAW_TYPES.to_json %>; + $(document).ready(drawGanttHandler); + $(window).resize(drawGanttHandler); + $(function() { + $("#draw_rels").change(drawGanttHandler); + $("#draw_progress_line").change(drawGanttHandler); + }); +<% end %> diff --git a/public/stylesheets/css/gantt.css b/public/stylesheets/css/gantt.css index e69de29bb..d0ab0e4f2 100644 --- a/public/stylesheets/css/gantt.css +++ b/public/stylesheets/css/gantt.css @@ -0,0 +1,177 @@ +fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; } +fieldset.collapsible>legend { padding-left: 16px; background: url(/images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; } +fieldset.collapsible.collapsed>legend { background-image: url(/images/arrow_collapsed.png); } + +/***** Gantt chart *****/ +.gantt_hdr { + position:absolute; + top:0; + height:16px; + border-top: 1px solid #c0c0c0; + border-bottom: 1px solid #c0c0c0; + border-right: 1px solid #c0c0c0; + text-align: center; + overflow: hidden; +} + +.gantt_hdr.nwday {background-color:#f1f1f1;} + +.gantt_subjects { font-size: 0.8em; } +.gantt_subjects div { line-height:16px;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; } + +.task { + position: absolute; + height:8px; + font-size:0.8em; + color:#888; + padding:0; + margin:0; + line-height:16px; + white-space:nowrap; +} + +.task.label {width:100%;} +.task.label.project, .task.label.version { font-weight: bold; } + +.task_late { background:#f66 url(/images/task_late.png); border: 1px solid #f66; } +.task_done { background:#00c600 url(/images/task_done.png); border: 1px solid #00c600; } +.task_todo { background:#aaa url(/images/task_todo.png); border: 1px solid #aaa; } + +.task_todo.parent { background: #888; border: 1px solid #888; height: 3px;} +.task_late.parent, .task_done.parent { height: 3px;} +.task.parent.marker.starting { position: absolute; background: url(/images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;} +.task.parent.marker.ending { position: absolute; background: url(/images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; right: 0px; top: -1px;} + +.version.task_late { background:#f66 url(/images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} +.version.task_done { background:#00c600 url(/images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} +.version.task_todo { background:#fff url(/images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} +.version.marker { background-image:url(/images/version_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } + +.project.task_late { background:#f66 url(/images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} +.project.task_done { background:#00c600 url(/images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} +.project.task_todo { background:#fff url(/images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} +.project.marker { background-image:url(/images/project_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } + +.version-behind-schedule a, .issue-behind-schedule a {color: #f66914;} +.version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;} +/*end*/ + +dt.issue { background-image: url(/images/ticket.png); } +dt.issue-edit { background-image: url(/images/ticket_edit.png); } +dt.issue-closed { background-image: url(/images/ticket_checked.png); } +dt.issue-note { background-image: url(/images/ticket_note.png); } +dt.changeset { background-image: url(/images/changeset.png); } +dt.news { background-image: url(/images/news.png); } +dt.message { background-image: url(/images/message.png); } +dt.reply { background-image: url(/images/comments.png); } +dt.wiki-page { background-image: url(/images/wiki_edit.png); } +dt.attachment { background-image: url(/images/attachment.png); } +dt.document { background-image: url(/images/document.png); } +dt.project { background-image: url(/images/projects.png); } +dt.time-entry { background-image: url(/images/time.png); } + +/***** Icons *****/ +.icon { + background-position: 0% 50%; + background-repeat: no-repeat; + font-family: '微软雅黑'; /*modify by men*/ + padding-left: 20px; + padding-top: 2px; + padding-bottom: 3px; +} +.icon_enterprise { + background-position: 0% 50%; + background-repeat: no-repeat; + font-family: '微软雅黑'; /*modify by men*/ + padding-left: 20px; + padding-top: 2px; + padding-bottom: 3px; +} +.icon_enterprise-add { background-image: url(/images/add_enterprise.png); } +.icon-add { background-image: url(/images/add.png); } +.icon-edit { /*background-image: url(../images/edit.png);*/ } +.icon-copy { background-image: url(/images/copy.png); } +.icon-duplicate { background-image: url(/images/duplicate.png); } +.icon-del { /*background-image: url(../images/delete.png); */} +.icon-move { background-image: url(/images/move.png); } +.icon-save { background-image: url(/images/save.png); } +.icon-cancel { background-image: url(/images/cancel.png); } +.icon-multiple { background-image: url(/images/table_multiple.png); } +.icon-folder { background-image: url(/images/folder.png); } +.open .icon-folder { background-image: url(/images/folder_open.png); } +.icon-package { background-image: url(/images/package.png); } +.icon-user { background-image: url(/images/user.png); } +.icon-projects { background-image: url(/images/projects.png); } +.icon-help { background-image: url(/images/help.png); } +.icon-attachment { background-image: url(/images/attachment.png);padding-left: 20px !important; } +.icon-history { background-image: url(/images/history.png); } +.icon-time { background-image: url(/images/time.png); } +.icon-time-add { background-image: url(/images/time_add.png); } +.icon-stats { background-image: url(/images/stats.png); } +.icon-warning { background-image: url(/images/warning.png); } +.icon-fav { background-image: url(/images/fav.png); } +.icon-fav-off { background-image: url(/images/fav_off.png); } +.icon-reload { background-image: url(/images/reload.png); } +.icon-lock { background-image: url(/images/locked.png); } +.icon-unlock { background-image: url(/images/unlock.png); } +.icon-checked { background-image: url(/images/true.png); } +.icon-details { background-image: url(/images/zoom_in.png); } +.icon-report { background-image: url(/images/report.png); } +.icon-comment { /*background-image: url(../images/comment.png); */} +.icon-summary { background-image: url(/images/lightning.png); } +.icon-server-authentication { background-image: url(/images/server_key.png); } +.icon-issue { background-image: url(/images/ticket.png); } +.icon-zoom-in { background-image: url(/images/zoom_in.png); } +.icon-zoom-out { background-image: url(/images/zoom_out.png); } +.icon-passwd { background-image: url(/images/textfield_key.png); } +.icon-test { background-image: url(/images/bullet_go.png); } + +.icon-file { background-image: url(/images/files/default.png); } +.icon-file.text-plain { background-image: url(/images/files/text.png); } +.icon-file.text-x-c { background-image: url(/images/files/c.png); } +.icon-file.text-x-csharp { background-image: url(/images/files/csharp.png); } +.icon-file.text-x-java { background-image: url(/images/files/java.png); } +.icon-file.text-x-javascript { background-image: url(/images/files/js.png); } +.icon-file.text-x-php { background-image: url(/images/files/php.png); } +.icon-file.text-x-ruby { background-image: url(/images/files/ruby.png); } +.icon-file.text-xml { background-image: url(/images/files/xml.png); } +.icon-file.text-css { background-image: url(/images/files/css.png); } +.icon-file.text-html { background-image: url(/images/files/html.png); } +.icon-file.image-gif { background-image: url(/images/files/image.png); } +.icon-file.image-jpeg { background-image: url(/images/files/image.png); } +.icon-file.image-png { background-image: url(/images/files/image.png); } +.icon-file.image-tiff { background-image: url(/images/files/image.png); } +.icon-file.application-pdf { background-image: url(/images/files/pdf.png); } +.icon-file.application-zip { background-image: url(/images/files/zip.png); } +.icon-file.application-x-gzip { background-image: url(/images/files/zip.png); } + +img.gravatar { + padding: 2px; + border: solid 1px #d5d5d5; + background: #fff; + vertical-align: middle; +} + +div.issue img.gravatar { + float: left; + margin: 0 6px 0 0; + padding: 5px; +} + +div.issue table img.gravatar { + height: 14px; + width: 14px; + padding: 2px; + float: left; + margin: 0 0.5em 0 0; +} + +h2 img.gravatar {margin: -2px 4px -4px 0;} +h3 img.gravatar {margin: -4px 4px -4px 0;} +h4 img.gravatar {margin: -6px 4px -4px 0;} +td.username img.gravatar {margin: 0 0.5em 0 0; vertical-align: top;} +#activity dt img.gravatar {float: left; margin: 0 1em 1em 0;} +/* Used on 12px Gravatar img tags without the icon background */ +.icon-gravatar {float: left; margin-right: 4px;} + +.buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; } \ No newline at end of file From 8e6a88f7d89f983c30320c29f7430c94b7b07ca1 Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 19 Sep 2016 16:19:59 +0800 Subject: [PATCH 003/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=97=A5=E5=8E=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/issues_helper.rb | 9 +++++ app/views/common/_calendar.html.erb | 3 +- config/locales/projects/zh.yml | 3 ++ public/stylesheets/css/calendar.css | 53 +++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 5a124849f..489854ead 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -57,6 +57,15 @@ module IssuesHelper "#{@cached_label_priority}: #{h(issue.priority.name)}".html_safe end + def states_done_ratio(issue) + done_ratio = issue.done_ratio + if done_ratio == 100 + "#{l(:label_done_ratio_endding)}".html_safe + else + "#{l(:label_done_ratio_doing)}".html_safe + end + end + def issue_heading(issue) #h("#{issue.tracker} ##{issue.id}") # h("#{issue.tracker} #{issue.source_from}") diff --git a/app/views/common/_calendar.html.erb b/app/views/common/_calendar.html.erb index e4ce4da2c..b2aad3812 100644 --- a/app/views/common/_calendar.html.erb +++ b/app/views/common/_calendar.html.erb @@ -1,4 +1,4 @@ - +
    @@ -20,6 +20,7 @@
    <%= h("#{i.project} -") unless @project && @project == i.project %> <%= link_to_issue i, :truncate => 30 %> + (<%= states_done_ratio i %>) <%= render_issue_tooltip i %>
    <% else %> diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 792ff35fd..de3a83e19 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -462,3 +462,6 @@ zh: label_state_open: 待处理 label_state_closed: 关闭 label_state_merged: 已合并 + + label_done_ratio_endding: 已完成 + label_done_ratio_doing: 未完成 diff --git a/public/stylesheets/css/calendar.css b/public/stylesheets/css/calendar.css index e69de29bb..11cd99637 100644 --- a/public/stylesheets/css/calendar.css +++ b/public/stylesheets/css/calendar.css @@ -0,0 +1,53 @@ +/***** Calendar *****/ +table#calender td{padding: 2px;} +table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;} +table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; } +table.cal thead th.week-number {width: auto;} +table.cal tbody tr {height: 100px;} +table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;} +table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;} +table.cal td p.day-num {font-size: 1.1em; text-align:right;} +table.cal td.odd p.day-num {color: #bbb;} +table.cal td.today {background:#ffffdd;} +table.cal td.today p.day-num {font-weight: bold;} +table.cal .starting a, p.cal.legend .starting {background: url(/images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;} +table.cal .ending a, p.cal.legend .ending {background: url(/images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;} +table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(/images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;} +p.cal.legend span {display:block;} + +/***** Tooltips ******/ +.tooltip{position:relative;z-index:24;} +.tooltip:hover{z-index:25;color:#000;} +.tooltip span.tip{display: none; text-align:left;} + +div.tooltip:hover span.tip{ + display:block; + position:absolute; + top:12px; left:24px; width:270px; + border:1px solid #555; + background-color:#fff; + padding: 4px; + font-size: 0.8em; + color:#505050; +} + +img.ui-datepicker-trigger { + display: block; + background: url(/images/public_icon.png) -31px 0 no-repeat; + cursor: pointer; + vertical-align: middle; + margin-left: 5px; + margin-top: 5px; + width: 16px; + height: 15px; + float: left; +} + +div.issue {background:#FFFFEC; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;} +.tooltip{position:relative;z-index:24;} +.tooltip:hover{z-index:25;color:#000;} +.tooltip span.tip{display: none; text-align:left;} +.task.parent.marker.starting { position: absolute; background: url(/images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;} + +/*.icon*/ +.icon-package { background-image: url(/images/package.png); } \ No newline at end of file From 4d97dd388929392c1360f42417106e9ed00d476d Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 19 Sep 2016 17:22:30 +0800 Subject: [PATCH 004/154] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E9=A1=B9=E7=9B=AEmod?= =?UTF-8?q?ule=E4=B8=ADdts=E6=B5=8B=E8=AF=95=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/settings.yml | 2 +- lib/redmine.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/settings.yml b/config/settings.yml index bebf9ac94..dc89093f1 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -198,7 +198,7 @@ default_projects_modules: - calendar - gantt - course - - dts +# - dts default_projects_tracker_ids: serialized: true default: diff --git a/lib/redmine.rb b/lib/redmine.rb index 29167d4a8..48269ba9c 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -257,9 +257,9 @@ Redmine::AccessControl.map do |map| map.permission :view_gantt, {:gantts => [:show, :update]}, :read => true end - map.project_module :dts do |map| - map.permission :do_dts, {:dts => :show}, :read => true - end + # map.project_module :dts do |map| + # map.permission :do_dts, {:dts => :show}, :read => true + # end # map.project_module :journals do |map| # map.permission :view_journals_for_messages, {:gantts => [:show, :update]}, :read => true # end From 2ae7dd00878118dfbdadcbdc9ace71c729102f39 Mon Sep 17 00:00:00 2001 From: huang Date: Wed, 21 Sep 2016 10:18:40 +0800 Subject: [PATCH 005/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AEissue=E5=AF=BC?= =?UTF-8?q?=E5=87=BAexcel=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 85 +++++++++++++++++++++++ app/controllers/issues_controller.rb | 7 +- app/views/issues/index.html.erb | 14 ++-- config/locales/projects/zh.yml | 19 ++++- 4 files changed, 114 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ad0fab173..e449061f7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,4 @@ +# encoding: utf-8 # Redmine - project management software # Copyright (C) 2006-2013 Jean-Philippe Lang # @@ -685,6 +686,90 @@ class ApplicationController < ActionController::Base :content_type => 'application/atom+xml' end + # 项目列表导出Excel功能 + def issue_list_xls issues + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + sheet1 = book.create_worksheet :name => "issues" + blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 + sheet1.row(0).default_format = blue + sheet1.row(0).concat([l(:issue_xls_id),l(:issue_xls_tracker_id),l(:issue_xls_title),l(:issue_xls_description),l(:issue_xls_status),l(:issue_xls_assign),l(:issue_xls_priority),l(:issue_xls_author),l(:issue_xls_created_at),l(:issue_xls_version),l(:issue_xls_start),l(:issue_xls_due),l(:issue_xls_ratio)]) + count_row = 1 + issues.each do |issue| + sheet1[count_row,0] = issue.id + sheet1[count_row,1] = issue_tracker_change(issue.tracker_id) + sheet1[count_row,2] = issue.subject + sheet1[count_row,3] = issue.description + sheet1[count_row,4] = issue_status_change(issue.status_id) + sheet1[count_row,5] = issue.assigned_to.show_name + sheet1[count_row,6] = issue_priority_change(issue.priority_id) + sheet1[count_row,7] = issue.author.show_name + sheet1[count_row,8] = issue.created_on + sheet1[count_row,9] = issue.fixed_version.try(:name) + sheet1[count_row,10] = issue.start_date + sheet1[count_row,11] = issue.due_date + sheet1[count_row,12] = issue_ratio_change(issue.done_ratio, issue.status_id) + count_row += 1 + end + book.write xls_report + xls_report.string + end + + def issue_ratio_change done_ratio, status_id + if done_ratio == 100 || status_id == 3 + "已完成" + else + done_ratio.to_s + "%" + end + end + + def issue_priority_change priority_id + case priority_id + when 1 + "低" + when 2 + "正常" + when 3 + "高" + when 4 + "紧急" + when 5 + "立即" + end + end + + def issue_status_change status_id + case status_id + when 1 + "新增" + when 2 + "正在解决" + when 3 + "已解决" + when 4 + "反馈" + when 5 + "关闭" + when 6 + "拒绝" + end + end + + def issue_tracker_change tracker_id + case tracker_id + when 1 + "缺陷" + when 2 + "功能" + when 3 + "支持" + when 4 + "任务" + when 5 + "周报" + end + end + def self.accept_rss_auth(*actions) if actions.any? self.accept_rss_auth_actions = actions diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 6fb2868bc..088ecac58 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -97,13 +97,14 @@ class IssuesController < ApplicationController respond_to do |format| format.js format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young - format.api { - Issue.load_visible_relations(@issues) if include_in_api_response?('relations') - } + format.api {Issue.load_visible_relations(@issues) if include_in_api_response?('relations')} # format.json { render :json => @issues.map { |issue| issue.to_json}} #:json => @issues.map { |issue| issue.to_json} format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } format.csv { send_data(query_to_csv(@issues, @query, params), :type => 'text/csv; header=present', :filename => 'issues.csv') } format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'issues.pdf') } + format.xls {filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}.xls" + send_data(issue_list_xls(@issues), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) + } end else respond_to do |format| diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index e4557b787..83645720a 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -139,13 +139,13 @@ <% end %> - - - - - - - +
    + <%= link_to "导出:XLS", project_issues_path(:project_id => @project, :format => 'xls') %> + <%# other_formats_links do |f| %> + <%#= f.link_to "XLS", :url => params, :remote => false %> + <%#= f.link_to 'PDF', :url => params %> + <%# end %> +
    <% end %> -
      <%= pagination_links_full @versions_pages%>
    From 80105181ce7aa5ec34aaaa61f4ce82f504a6856d Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 22 Sep 2016 13:41:46 +0800 Subject: [PATCH 008/154] =?UTF-8?q?issue=E4=B8=AD=E6=88=91=E7=9A=84issue?= =?UTF-8?q?=EF=BC=8C=E6=8C=87=E6=B4=BE=E7=BB=99=E6=88=91=E7=9A=84issue?= =?UTF-8?q?=E5=92=8C=E5=85=A8=E9=83=A8issue=20js=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/index.html.erb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 83645720a..9e6b9fac2 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -43,6 +43,30 @@ } } + // 点击的时候让过滤条件选中assign_to + function switch_assign_to(assign) { + var assign = "option[value =" + assign + "]" + $("#assignToMe").click(function(){ + + }); + $("select[id='assigned_to_id']").find(assign).attr("selected", "selected"); + remote_function(); + } + + // 点击的时候让过滤条件选中user_id + function createByMe(user_id) { + var user = "option[value =" + user_id + "]" + $("#createByMe").click(function(){ + + }); + $("select[id='author_id']").find(user).attr("selected", "selected"); + remote_function(); + } + + function all_reset_form() { + $("#issue_query_form")[0].reset(); + remote_function(); + } @@ -92,6 +116,11 @@ ) %> + 指派我的 + 所有的 + 我发布的 + +
     
    @@ -113,6 +142,7 @@ <% end %>
    +
    <% if !@query.new_record? && @query.editable_by?(User.current) %> <%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> From de0f49f8501da28df8106b2fe92f5cb2b552af53 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 22 Sep 2016 14:38:45 +0800 Subject: [PATCH 009/154] =?UTF-8?q?ISSUE=E5=88=97=E8=A1=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=96=B0=E7=9A=84=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/issues_controller.rb | 46 ++++++++++++++----------- app/views/issues/_list.html.erb | 11 ++++-- app/views/issues/index.js.erb | 8 ++--- app/views/users/_project_issue.html.erb | 4 +-- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 088ecac58..820b1d7ac 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -66,16 +66,16 @@ class IssuesController < ApplicationController @project_base_tag = (params[:project_id] || @issue.project) ? 'base_projects':'base' if @query.valid? - case params[:format] - when 'csv', 'pdf' - @limit = 10#Setting.issues_export_limit.to_i - when 'atom' - @limit = 10#Setting.feeds_limit.to_i - when 'xml', 'json' - @offset, @limit = api_offset_and_limit({:limit => 10}) - else - @limit = 10#per_page_option - end + # case params[:format] + # when 'csv', 'pdf' + # @limit = 10#Setting.issues_export_limit.to_i + # when 'atom' + # @limit = 10#Setting.feeds_limit.to_i + # when 'xml', 'json' + # @offset, @limit = api_offset_and_limit({:limit => 10}) + # else + # @limit = 10#per_page_option + # end @assign_to_id = params[:assigned_to_id] @author_id = params[:author_id] @priority_id = params[:priority_id] @@ -83,17 +83,23 @@ class IssuesController < ApplicationController @subject = params[:subject] @done_ratio = params[:done_ratio] @issue_count = @query.issue_count - @issue_pages = Paginator.new @issue_count, @limit, params['page'] - params[:page] = (params[:page] || 1).to_i + 1 #页码需要加1 + # @issue_pages = Paginator.new @issue_count, @limit, params['page'] + # params[:page] = (params[:page] || 1).to_i + 1 #页码需要加1 + # @offset ||= @issue_pages.offset + @issues_filter = @query.issues + # (:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], + # :order => 'issues.updated_on desc', + # :offset => @offset, + # :limit => @limit) + @limit = 10 + @is_remote = true + @issue_pages = Paginator.new @issue_count, @limit, params['page'] || 1 @offset ||= @issue_pages.offset - @issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], - :order => 'issues.updated_on desc', - :offset => @offset, - :limit => @limit) - if params[:set_filter] - @set_filter = params[:set_filter] - end - @issue_count_by_group = @query.issue_count_by_group + @issues = paginateHelper @issues_filter, @limit + # if params[:set_filter] + # @set_filter = params[:set_filter] + # end + # @issue_count_by_group = @query.issue_count_by_group respond_to do |format| format.js format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young diff --git a/app/views/issues/_list.html.erb b/app/views/issues/_list.html.erb index 0eb3b4a0c..4fee89d6a 100644 --- a/app/views/issues/_list.html.erb +++ b/app/views/issues/_list.html.erb @@ -6,6 +6,11 @@ <%= render :partial => 'users/project_issue', :locals => {:activity => issue, :user_activity_id => issue.id} %> <% end %> - <% if issues.count == 10%> - <%= link_to "点击展开更多",project_issues_path({:project_id => project.id}.merge(params)),:id => "show_more_issues",:remote => "true",:class => "loadMore mt10 f_grey"%> - <% end%> +
    +
    +
      + <%= pagination_links_full @issue_pages, @issue_count, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true%> +
    +
    +
    +
    diff --git a/app/views/issues/index.js.erb b/app/views/issues/index.js.erb index 399c6a977..9068aac9e 100644 --- a/app/views/issues/index.js.erb +++ b/app/views/issues/index.js.erb @@ -1,6 +1,4 @@ //$("#issue_list").html("<%#= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count})%>"); -<% if @set_filter && @issue_pages.page == 1%> //只有搜索的第一页才需要替换整个issue_list,其余的都是替换show_more_issues - $("#issue_list").html("<%= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project})%>"); -<%else%> - $("#show_more_issues").replaceWith("<%= escape_javascript( render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project} )%>"); -<%end%> +$("#issue_list").html("<%= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); +$("#issue_list_pagination").html('<%= pagination_links_full @issue_pages, @issue_count, :issues => @issues, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>'); + diff --git a/app/views/users/_project_issue.html.erb b/app/views/users/_project_issue.html.erb index 5a0065f86..e4f24d4e0 100644 --- a/app/views/users/_project_issue.html.erb +++ b/app/views/users/_project_issue.html.erb @@ -95,9 +95,7 @@
    -
    - <%= render :partial => 'users/project_issue_reply', :locals => {:activity => activity, :user_activity_id => user_activity_id} %> -
    + + <%= render :partial => 'issues/project_issue', :locals => {:activity => issue, :user_activity_id => issue.id} %> +<% end %> +
    +
    +
      + <%= pagination_links_full @issue_pages, @issue_count, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true%> +
    +
    +
    +
    diff --git a/app/views/issues/_project_issue.html.erb b/app/views/issues/_project_issue.html.erb new file mode 100644 index 000000000..683b512f0 --- /dev/null +++ b/app/views/issues/_project_issue.html.erb @@ -0,0 +1,36 @@ +<% unless activity.author.nil? %> +
    +
    + <% if activity.status_id.to_i == 5 %> + + <% else %> + + <% end %> +
    +
    + +
    + <% if activity.try(:author).try(:realname) == ' ' %> + <%= link_to activity.try(:author), user_path(activity.author_id), :class => "fl issues_list_name" %> + <% else %> + <%= link_to activity.try(:author).try(:realname), user_path(activity.author_id), :class => "fl issues_list_name" %> + <% end %> +

    2016-05-15发布

    +
    +
    +
      +
    • 需求
    • +
    • hushashahushashahushasha
    • +
    • 20161231
    • +
    • 草稿
    • +
    • 90%
    • +
    • +
    +
    +<% end %> + diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index c704f9847..13ea19882 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -1,8 +1,201 @@ + + + + + 缺陷列表及头部 + + + + + + +
    +
    +
    + +
    +
    + +

    邀请码
    Y7AUZ

    +
    +
    +

    尹刚/Trustie Forge

    私有 +
    +

    + 项目评分:123 + 浏览:123 + 关注:123 + 成员:123 +

    +
    + 关注 +
    +
    +
    +
    + + + +
    + + +
    + +
    + + 清除 +
    + + +
    +
    + + +
    + +
    +
    + + <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), + { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 + }, + {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"fl"} + ) + %> + + <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + { :include_blank => false,:selected=>@status_id ? @status_id : 0 + }, + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl issues_filter_select_min"} + ) + %> + + + +
    +
    +
    + <%= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + +
    + ddd + +
    +
    + + ddd +
    +
    + +
    + +
    + + + + + + + + + + + + + <%= content_for(:header_tags) do %> <%= import_ke(enable_at: true,init_activity: true) %> <% end %> - - - -
    -
    -
    - -
    -
    - -

    邀请码
    Y7AUZ

    -
    -
    -

    尹刚/Trustie Forge

    私有 -
    -

    - 项目评分:123 - 浏览:123 - 关注:123 - 成员:123 -

    -
    - 关注 -
    -
    -
    -
    - - - -
    - - -
    - -
    - - 清除 -
    - - -
    -
    - - -
    - -
    -
    - - <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), - { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 - }, - {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"fl"} - ) - %> - - <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), - { :include_blank => false,:selected=>@status_id ? @status_id : 0 - }, - {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl issues_filter_select_min"} - ) - %> - - - -
    -
    -
    - <%= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
    - -
    - ddd - -
    -
    - - ddd -
    -
    - -
    - -
    - - - - - - - - - - - - - <%= content_for(:header_tags) do %> <%= import_ke(enable_at: true,init_activity: true) %> <% end %> @@ -239,7 +59,7 @@ // 点击的时候让过滤条件选中assign_to function switch_assign_to(assign) { var assign = "option[value =" + assign + "]" - $("#assignToMe").click(function(){ + $("#issues_type_2").click(function(){ }); $("select[id='assigned_to_id']").find(assign).attr("selected", "selected"); @@ -264,152 +84,81 @@
    -
    -
    <%= l(:label_issue_tracking) %>
    -
    -
    - <% unless @project.enabled_modules.where("name = 'issue_tracking'").empty? %> - <%= form_tag({:controller => 'issues', :action => 'index', :project_id => @project},:remote=>'true', :method => :get,:id=>"issue_query_form", :class => 'query_form') do %> - <%= hidden_field_tag 'set_filter', '1' %> - - <%#= link_to '新建问题', new_project_issue_path(@project) , :class => "green_u_btn fr ml10" %> -

    <%= l(:label_issues_sum) %>:<%= @project.project_score.issue_num %> - <%= l(:lable_issues_undo) %>:<%= @project.issues.where('status_id in (1,2,4,6)').visible.all.count %> -

    - -
    -
    - - <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), - { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 - }, - {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"w90 mr18"} - ) - %> - <%= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]), - { :include_blank => false,:selected=>@priority_id ? @priority_id : 0 - }, - {:onchange=>"remote_function();",:id=>"priority_id",:name=>"priority_id",:class=>"w90 mr18"} - ) - %> - <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), - { :include_blank => false,:selected=>@status_id ? @status_id : 0 - }, - {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"w90 mr18"} - ) - %> - <%= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), - { :include_blank => false,:selected=>@author_id ? @author_id : 0 - }, - {:onchange=>"remote_function();",:id=>"author_id",:name=>"author_id",:class=>"w90 mr18"} - ) - %> -
    - 指派我的 - 所有的 - 我发布的 - - -
    -
     
    -
    - - <%= text_field_tag 'issue_create_date_start_show', '创建日期起始',:readonly=>true, :size=>13, :nhname=>'date_show',:style=>'float:left;'%> - <%= calendar_for('issue_create_date_start_show') %> -
    -
     - 
    -
    - - <%= text_field_tag 'issue_create_date_end_show', '创建日期结束',:readonly=>true, :size=>13, :nhname=>'date_show',:style=>'float:left;'%> - <%= calendar_for('issue_create_date_end_show') %> -
    -
    -
    - <% end %> - -
    - <% end %> + <%= render :partial => 'issues/new_issue_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + <% if !@query.new_record? && @query.editable_by?(User.current) %> + <%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> + <%= delete_link query_path(@query) %> + <% end %>
    + <% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> +
    +
    -
    - <% if !@query.new_record? && @query.editable_by?(User.current) %> - <%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> - <%= delete_link query_path(@query) %> - <% end %> -
    + <%= error_messages_for 'query' %> - <% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> -
    -
    - - <%= error_messages_for 'query' %> - - <% if @query.valid? %> - <% if @issues.empty? %> -

    - <%= l(:label_no_data) %> -

    - <% else %> -
    + <% if @query.valid? %> + <% if @issues.empty? %> +

    + <%= l(:label_no_data) %> +

    + <% else %> +
    <%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
    +
    + <% end %> + +
    + <%= link_to "导出:Excel", project_issues_path(:project_id => @project, :format => 'xls') %> + <%# other_formats_links do |f| %> + <%#= f.link_to "XLS", :url => params, :remote => false %> + <%#= f.link_to 'PDF', :url => params %> + <%# end %> +
    + + + <% end %> + <%= call_hook(:view_issues_index_bottom, {:issues => @issues, :project => @project, :query => @query}) %> + <% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> + <% end %> -
    - <%= link_to "导出:Excel", project_issues_path(:project_id => @project, :format => 'xls') %> - <%# other_formats_links do |f| %> - <%#= f.link_to "XLS", :url => params, :remote => false %> - <%#= f.link_to 'PDF', :url => params %> - <%# end %> -
    + <% content_for :header_tags do %> + <%= auto_discovery_link_tag(:atom, + {:query_id => @query, :format => 'atom', + :page => nil, :key => User.current.rss_key}, + :title => l(:label_issue_plural)) %> + <%= auto_discovery_link_tag(:atom, + {:controller => 'journals', :action => 'index', + :query_id => @query, :format => 'atom', + :page => nil, :key => User.current.rss_key}, + :title => l(:label_changes_details)) %> + <% end %> - - <% end %> - <%= call_hook(:view_issues_index_bottom, {:issues => @issues, :project => @project, :query => @query}) %> - <% content_for :sidebar do %> - <%= render :partial => 'issues/sidebar' %> - <% end %> - - <% content_for :header_tags do %> - <%= auto_discovery_link_tag(:atom, - {:query_id => @query, :format => 'atom', - :page => nil, :key => User.current.rss_key}, - :title => l(:label_issue_plural)) %> - <%= auto_discovery_link_tag(:atom, - {:controller => 'journals', :action => 'index', - :query_id => @query, :format => 'atom', - :page => nil, :key => User.current.rss_key}, - :title => l(:label_changes_details)) %> - <% end %> - - <%= context_menu issues_context_menu_path %> + <%= context_menu issues_context_menu_path %>
    \ No newline at end of file From 7b5fc8b3233f97836f97f526a576179a7cd54d9e Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 23 Sep 2016 14:53:36 +0800 Subject: [PATCH 022/154] =?UTF-8?q?issues=E5=88=97=E8=A1=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/_project_issue.html.erb | 21 +++++++++++++++------ public/images/sy/sy_icons02.png | Bin 0 -> 199603 bytes 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 public/images/sy/sy_icons02.png diff --git a/app/views/issues/_project_issue.html.erb b/app/views/issues/_project_issue.html.erb index 53a8be434..891215503 100644 --- a/app/views/issues/_project_issue.html.erb +++ b/app/views/issues/_project_issue.html.erb @@ -11,8 +11,8 @@
    <%= activity.subject.to_s %> <% if activity.journals.count > 0%> - - <%= activity.journals.count %> + + <%= activity.journals.count %> <% end %>
    @@ -48,10 +48,19 @@ <%= link_to activity.try(:assigned_to).try(:realname), user_path(activity.assigned_to_id), :class => "c_grey" %> <% end %> <% end %> -
  • 20161231
  • -
  • 草稿
  • -
  • 90%
  • -
  • +
  • <%= activity.fixed_version %>
  • +
  • <%= activity.status.name%>
  • +
  • <%= activity.done_ratio %>%
  • +
  • + <%= link_to "", issue_path(activity.id, :edit => 'true'), :class => 'sy_icons_edit fl mt15', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> + <% if !defined?(project_id) && !defined?(user_id) %> + <%= link_to "", issue_path(activity.id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'sy_icons_del fl mt15' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% elsif defined?(project_id) %> + <%= link_to "", issue_path(activity.id, :page_classify => "project_page", :page_id => project_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'sy_icons_del fl mt15' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% elsif defined?(user_id) %> + <%= link_to "", issue_path(activity.id, :page_classify => "user_page", :page_id => user_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'sy_icons_del fl mt15' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% end %> +
  • <% end %> diff --git a/public/images/sy/sy_icons02.png b/public/images/sy/sy_icons02.png new file mode 100644 index 0000000000000000000000000000000000000000..7d29ef2a9d231b23c3c502ade1f3b34e557c47b4 GIT binary patch literal 199603 zcmdpFBMM7D!B!q;l{a)979;Ec0tMiP1eyz6We$KhieP7G_{l2d2bK7mR#fmGe zwZhog*os?D&$s9Q*WC$3*%`bnR?UX?6%3P-1F+C4&Q$4@{M=Ae6_L5UqAMp9sYN;!q`z`V>1_i zB%M6=%@xP)|J#<+UNLs#nMdBT=Gcv=zVXcE#=f}J*l};&;w?*W{-d!E?)35PH(L6V zpNyTdX!FS%FMG+^OC7Y^51cKQKIp<%jO}~qu7|&N^AC<4bX>a8m1C2lrN^>2t$Nim zleSvs6zjT+Z#(k?a}Pdm`ch+;TygYO$G+=2ceV45{?%Ih{q>>S?s)SZKbiU6v|96R zE4RzvIr+q6Pgrl&>Gv$N)zz;V8(Zs%Yk&M~wAtbJ+j(Qw&$%+?C##Y{3-8Q z;a3Mdamd2x>CNAC@>jRJe3NzFxWcPn{lNOeuU=^V@sMf%aBrV;+aU)&#@~JR<^vuY z`_S>5A9vOzr+xC74^^}GJ$w5@@3~^x)SmtLJ?lMt*})%s=FqoYdx!Vk_ieQL=O5nn zbLVY0dF#s-{&4#v@;CqD=sQ-q_hZh(>mKvW@<;Bs;@F~3Z+po$KX}#mub6qsfqz+Q z=|fi9^}2n>Hb3x@!57wg^$}w$@8LNMA0Hb#^5Q2B+kC^N#;!W{^goV`UGS&ZzwaAI zt-00Dmm3?)Px<)UzmvS`H9uZ$(IqRL_~UghxMav%Uw`sXUVp)-mtQuy ze7RMtH&6ZS>xPHkIQi=3);#XeWhYnDy)PYf`lNe5yV|=a|LpR4r!ReGy4MlAPhan^ zgL$jPUwq%@Pab~r<&&JxKmGX&wy=--`1jtu%x{+7XY(I^W8Jkr|MOGkU%SA2?d}I1 zbL!sLu653vHa+MEr=D@`yZ*G#g0YW&{?PiMYweZVFZ`~0-xoepeDHI-uC>8sYt(n` z>hFA*U$3)kxbNy~UvhHw;Bs$S`jCTGy??p)e`@8Q%>2aRhi|d#R=Z~3SpWX@&ROOB z<#t*Alb^DG@;{T0{KmHDtbf2NPh7hHaO!st-?dz{!C&6|rZ=Cw{`>!DrBy$0uNM zUwinrUwY~nKfUwZ)u#UJvv+K@{Hbr*{`8|(d8glOcGt3B`-+nucgi>4ebt#K|7N*w zes=0t-m~SbQ}*3%$_}47b5(DjTF=m~z}!Uw_4~k3H`4 z9j)IwYah4AmtXtkIXmt8_Q&4-k=2j*WhX>0HHXD5RhP}>e&pPm| z@TLQ9y6C3i1M?nO6ehps%l{?p!Ho^jr_ z4}I$PZ@lh`JXl-+4`8r7kzo>X*)06`O%$!yJ*WB-gn(6t&hcb7fZ-s7wDPkO{(^Xu@Fg`mVM9a{hJS|MjD%o$#X*ZaM3BvwrjYD>wbwN5A#d z)*GL&_Ahq->81}Re|zZhUGMnNm47_xj1$iI$s>o~Gv)pJzJIs(KXu`ow*B7|H#qqQ zYu4pAU;5tLF1+HyADlXE)8@&m?_Flv&!;W@l>@%=nTx)D(d1hc+2fY|+N=CmeDM`O zdgYYYOj|vD&GIYmw(h(m=UlSpU)O%3c5m5ZqvNk#{g=y~wEBD2e$u*fgRS0l!|M+H z^fk-fy7GZ@zW&5k_g?vfj(4p-DA;SGq;~v-+#h+2c7rL^FF@+XZ~J1eC#R< zR(;Fz4}9*KXUyJuomKz(sS^&~wz%ljFP{4D@1A?!J2&~#-6!pQ z^kdQQ-|^Ax$vr>4ZMo0S-Q~C4e#3=Fyx~hfTcrEw zUvb7U=WO^}>)f}VyKTGShDWY==fb;Z{c`OiKl97S?_BSR`H$SZ`pkp3y7shlwm*Bj zmDbp5$~QLL|Glq&@BZgazi|3{e&gQSKKth<)_e6Q*7(SUhks|g^S<-HH=eiuZV%r! z`QqY7Ypi$34r}hWvAz5D=a2TE@z8Z2y<*QRzIV(s+ugD2_B;J`uZ6e#_0a7p_r7tXrrra!#%++RL$-}L)Vzi;-U$9KE<+wZ(^ujKk)efpsl&szK8FW$BG z2WGwV4-39}z+R6Ydeu2s{qm}1{K|jey;uHV(anGTYH-?P2b}b=-LKgBnX|ri?nS@b z;HDcc{{4O*eq^OjuCw|({_x;Y_h0b+4fo$=?+c5MK05olzkK5NhpjbS`}~XVKJfSF zZL#0BKRfxb4}a~$uX?O_@V>nk%$a%1w=cfek~vcJ8Cg-8X&VhSyEKc%Mas(`KEr z=~pj&@K0Yj?WA?yzs?pHo%@diAGH5i?{k@d*e)lZa?)EjefWtxKXK$A&lsI?@=4ol zw&`zwM#J$utF4xIbU?bE;g-Z}R*k6-b?E}NXa;BQ;s_l|2H{PoA4-0PC-=l}NazukEE zuPnUq!Jps1_PMh+`28EtTmSq=|Gw{I53IT03V+$^mfa6HZ2xaRebG(N{P|T+zV^=_ zJLlQ&HkZu0?e8DFo&%gDu3)emFtxs?M>~@b_`(%CD8Nb^0 z@oD#bmF?-X=5B})l$&+S`Hl4hSzqPgX+^pGi#`FW`H9H)z&5rc}d)M)3 z@@CUk*ku2yEHJBCP)*u@*38-Sr|!S$WV7y6{#gF&l8 zIrExH{>H(ewt{d{7;kL*Vd#Y$O>!*TpJKUFTx;OCQ$1^{=S&*^*W_s{@JE}>8?{rn z&&%;&$DeIFdCvt4=1!e5WxxIQ+ju{B<2m#8m}19qJjHURIL?57VlaQ<>;={SgW2=f z>lS%#oxGV}&zmuK!HhYxC&{|iaLzspHk~|Ke$n&)8h@`@bD#f3v*(ZR9lJPX|7z|O zdt+Y}Txo{K@$XihX&K@i%+PUpRlqg>#!J+c)#)>@%-!ihY~e3)Xw7 zhnV|Z9`Vx4J^#1=<6DgC=YMkUKJ#Xp4Ib4~nwiZke&>9C&VI>vSTLh~;p4pM73A;y z$6wd%KjT0AnEajY$IMaazR)I|zp2^0rdlv(-i~wT%$(MpvKO)^k|#M;lis?^jM<|( z`^|sbCR6_PM_%~eFRa$&)q-XkKN$?Hc;Hw&TJcoRo$C4}{Aa`yZM)$F?2GM~n~Z#-khXliXYkrf2~ zz_(pq(etc995l_K_59fLt)Qx%%Dm)@fBfH;&gazo$T?u??&6Q;)GYt}v6>p!e(bn@ zJP4bSJFx907(}644~CKFd!wlFEysE87yZ*>|MrWvokwguyPEk=|BSrLh+h_4u5Y(Z zJMdlK8iax83}UB=c`K)`<7()Sn)$8R&$L>OZ!_9t%8UN$3y<~uPmcfC zjDP=}x-IC||EC}S&%a~8J)7D8*YWR`GXKSJoZbkVE)d(uJF>wz5A;#e#w7+qLIQC_rx8vx%lYN}bQtEDA7_P?E_MMYOOq%|BQMFq+zoQe^PMoTg3_|G z(DAaxFHq)=ofoC&1&Nb~JiNtM@Yoo;v|}q->;hhvSZ*0uaTa;3l(=3H$6;=JW$L(D zST1&f(2dd}N?Tl&q3(rZe$hw&fN9Vj14U9Fb(p^kMqRJ z7r#K{Sg{v|w(H1uEJ7>JBYr%K!YIt_FkkE|M1>awR_Hp8lNCvp`A!z_8PhVd1CMjP z*ahO)bMlNB(}}Gjur1lRvPgoY^b02l7ylXKtn}Q#Px+-j4^!AB5feWhMV8NDTKp5F zUhL-lvMh7U4|3m5EjMto#h=6?jqD;S!!(cmz$)B0_Z+@KT-ttA#6h^&ukg~* zr{zWVun8>!Prv4WM$MpVhw-3wM~&4qfmd0JH#PrZ=_ugU!f+7Qtu0H(gUI&XK@^Xg zD2xLMZTmiT6t<3K1p|BNdb0FrFdXrlqSkR+JG7!UvU@KbkHR3T2Y%a{a9rYks~(Kv zVdOfs&o3kpU5xGh4;vC!LC7T-)Q&Tfr)~#P;J1Te6FEb-iEOv(y>#VR^{}!Bp%=)v zY^*^PIebfJ8afw{-?yRkyNqJ*X@%7&N0`gg*@1s9pS}{STk9 zu|0g?a1dEBk8Y2mLEO3#U$qTmry@J7dY|hih%9$h4eH2?yQM29YDqdh@qMEfC)9VZ z+d7Q7G=q`jn!O$lhW2ncsG4C#GV3>O;P+hGwi<6_ks#Nt-*lgG=sOX|B=)_b&xQ|s zFYVMrw{C;MFpSL7qd`21{6TCre$~Wb(1v8;z0S4mG^45s>_J=c1-lbsN1PC=jYB7h zt+;9XF71w7za^0$y4JXPio%c$vAw8iqtI&I-cRk0g35Qifz{OJGXfMea=7iv@%_-@ z()WMr#vNHT<|*V{m<<_nItDzkz%L}1|!?D zoW3^1_L^wa1ognMyWF9dHj$js1n?LlJ? z0#vl0@tQfSdua~iF*Q;WVTwMpoUgOLi zowq9?H1g}l>wRTLqs9y6F>U9$V8O4#!H5%$A+PxYeJ{FWwcK-Yi!RZbIoCYDFLBN& z3R*%otFLc#Z2Wl~1H87KQN>jI1ZHs?)KOHs)iCb;)OHX$?B~F$qVX#;tcZ9ns=6M;zBQ_x znkdIweB$}iM%9U%CIkr>ShYRAbQRX_ARgL8)*Q>o>FdCpQRTaB6%B%>HNgUbnde1= z5qHwzgO1v|Z+z`EmTPeuh^0Go$JSH?*rTDGkO?f^G>#LzET6FrIV8h~Tn5~q zrw+O3F8&~NMntK@*o*sKbYfl4^;xU+x*(XtVUahE{GhE}{!SG2bp@^k@MX3BU{rf1 zzGmqd^G$&2dwyuuc=n!G#^u9VLsliC8DE-n!M(3W!zjiCaHIMz%{LrIqhP?h8!v97fz#7>jC&Ul;&A=dsf{|PE8JGA)cjEw8G9)^PEwdpccjh+QBin7TuXfz`qPvyV zkdLzi^+@l%yUdGLwi|;ve#k6XQ*8Q zw7w3^ZNSYU%#%ezE*lb&NLS8aI1KG!jWZbfy>DaF62$mIMt0e*I51qAcmLtZS>%l3Eus|&}syG0w9V( zbq1~F09^)tyY@7kMy*BUNjnc6`6k>wq^4g045-cS%(ZVQ;I@#sqq zQzf*+&kSvXg)T5-uQ_+z_I6m4`g?WQ_cjVjXxX(*N*a!DNaTvsAzTId3lIUTKQ z_4Vj}?T@?>H~YCOgZXglA$fHbkaVD38TQT5{ZR}m77hs_i5R*#gkYXPFPQH9p9v9Xm0<>n1xQF@;1z_zQHWCN&$(`;Np1yDdd;k~dZXl#(d0*x?ZK6#D#1{-WL2fdw!E zf$I`Z5{b!P<91{2ea*IjEd(STy_b%L7U-J;rixKw>1HtWW1yT-6t|!a^{96)0}@G+ z4iX$TJi6JCp-p~Jhn5Y_KZ@$!d1EkaeRvscKl>t2jZt-Kk3VgOBjDyZj`|wa03Xvz z8bj`Ad?Opu3i{~}v3XwX4ZXf0PJnsC$#??@DPvTD_?n97$+IoT4zaIR@1;i}IYn#_ zQ02)}OPW+iEbX?V+P7=0cyAlhR1S88G{8538B52KvU4&V$8LvKT=h-vf~KnCp&W^Z z!|idV1Gc>GeH&YNj2L_5M)5f1Gvqo7G#-%W)DDn&-;3UI!y{{mVwJ4J zT$$M6EVfP^;s?T^W%UgfLSPolvWeAkgtD{{ReaUh0SXxnv5LLZ|IisWXeS(qb0T50 zG(kM}nsk8JHI6Y-JvStDiBMzgX%&zhu{6LZXcS+#PR z+2SfehT8~c7fz-3(sAYSu}Cv2vox^W5b~#TZL%dmeJpt2r9C`jFl+`G6Jz=KCEf^- zIgCR##gDPLeV4|IfEJQ)K&Z)HW2!wcVW@dn726(GVPATUkbtF0V_t@(Lvd6dhokLi z2&hIgmxfA;T#0d6IJL% zM8WOZUJydy_YHBvVL(2_ky!F6DZtyv37VSE*u~edq`nV+&6Ock2&mfVZJtn2zT2eA!2QdMlzD6H`~eZ$Fc1ljKqP{aNkfJowyCByzBI|03lM*~;~6D)Ad46G$4m8a%h16Sb1ERl$SEI54~7|;@&7a)`ff^r;(=?4vgq88hYRj zL4ZWF??orO2X`l+j)KM22@I4gAko(-M~pWZhP0XgunA;f$R zSqDoKskU7CwhAMRQ;fQ{Z;p-);()-*;D5(Ki^}y0p%6GyqvsEa-1=@vWusK%gb=M7 z=8lUF!z9s}Xo4Mg==a4`Ns?--;`+gto0v~F1X8nUYwnB1SEzg2kkP0`f$c;27|=o- zm`&b@rL8Ow9E-Z;z8eBRjOe7oJi(sx8M%m7!@YMoAR(R&h_dg}gp)2cG31TU(QE8A z0?GiPy66Hp+`X6f;7Y)+o3P7ez~627QlxyqTPQ66{dzAwYS|Mwu&{$#aJ%3m&}+a( zWCUP-eRG+(g@JJ_Xji8T-2pAgq(REPCIAdZ$I&;wj@#BFAplz$I_Am{qDl0Jy2q~D z7Ob!BYg8*LX0hYs9KCn47coDH+1Aak8MBfdeB%z8LZxB*OBujHb zh!21e;ZATguHCz?pn_!es2&(JQ3s8aH=@o*r)m=xLkOXb>-*F`Frm~?lj)Dke5xTt z6!oG|&0TL)X`eGYAQkEugf-uH> zqd9{;jR-dTZb*of2Nei%V+uJ~THG#rKGa(1qkRIP-XTs!rGn>yvIOXKyAy(8B057L z0=60fX!pM8aZLav!9q-NLHE?~gxnyAq#9LG(0{M13WAN~rHa z0ELX<=Qw;`U`_}^u!=v85Zu940h(8R9T+m1#;yUGou;EQ#p43HfK>?F7>y_=?R&1N zOA2C}n91*|*KoT8uTteh9?U5TdY710ZG{piATS#~_ZgRz^aPp#yv;>5UJ>1JuJO1- z!eNdbg*e=Hr?)t1X!(`xBTU7$8yf=PUXejI=popcVSs+5=U$^lM?+*o4p?1Xfe9zs zYn~UyX4LjqTEI3qE@TEVUt|s+Ax=xSOU+3|!7TsR_VwsPhlNHp5F*bhd%fi9Wrl8C zL6VGM?l^%m*cv3+K_2vqOm0wW-#%J`p+lZGD^fm^1 zM#@ZCb=}uq!@a~(b~gw?@VmW60tVSlp(jEM97Jz`2D%bY0Rbr_5=wi8$u8an+GU@unpCn z(0YAuV;ck&YERPt=Q6MuLAI#Uowo4M7VF;G?)cKp%ds@QAV~BL z2QZN)9FU1=^=w}G$(|4~?8PnbeQgDe&1#1s|&kz=qpkW+YptRZLTvO^9TPTQn zOS@|lQlKq#PfI-JqdpC?96t-wVQwP{MP|9 zaeg}-+P+1i)Ym-KKJt8v;!y{MOlL!eQcpyI56+P)C0u^r6XMq~WUDg>Mu1tyH&#QK zO^Uz*7m*pYaeeV?0(T1Cv7(58&4!Q=_?SP^BywO6Gg9}(`QQTssnLBI0yCgqN>11T zxPtM|IP_wK7gFj%qVA(%>$}%rOBB=A1IoF_E#HvH4D%Ftt&4=sYWt@Df0qqs!gn+3!AqU2FDPXmz3l4hk zwM3Jk3j>$hPFWg0(84KA;tYS3xJGMMM`p1>D9OnhCX53_8+xLqf_5 zph>uX@IEX}E)!4(R*xL2%P3BAdsiEyz7%Ugl@BY*(!|$3yABvSL>Nar*xMDLyR4At zgQ=otl%*jgfIm~6oC0nu~)HiYiMJPuD7~;YHZ3Rd!NM*Q)Xx+_T z6O&OJ4TDmJLpyA-Qhn_;-ETaO0nHGcz-$N)Jah%tqKO8TBN4T#ea|(u;b_T%m%%pz z-lN-PbLmQHHiV}ZF+d}N&nmKDIr`p4G>kRGHhY0BmCs1FD^*G(cW5I9jlFi%*YY*c z(N>7Z_1aFji#4gK&x}Bg0Jfz5q;H6Wl1%s!a`dJvzh*-kR4r`?{~yqVJ?x$B!pVQ`_$-#nij1)m)(T!G~c1x3=F`h)e}|kKmdK0u25KG zmPX-NiZ%oV={95up_9$Xiz|qSmjN*Y@kQ$y64*$s zYPZ*fl7kTiw;|{ST{C)b2!0o(Ax49?QL;1u5xYDX*)#-`Dk4OzefOGkO9K)zu=qJV zWQf|9@(@ZXq1TA1dOtN~jFje5#D`>Ao|-E&;_y*b0C*S>F7)mhN8bv<0aHzYj*k!WCy4!0Q4)8hHf4b!j=?g~9LeITMzic_EiiuRa77j}; zQf={#+($|$i5A!pwx$Aw!>v<3-;xzre%}pg5xOGUKyJLm^?Xuv9!QOJ9dz}Lm=D4~ z42jeF(vk@dweMaB=wF3kq{wGnbQg;u98sR*lkd_3rLQZX?}X)}4dJwPJh~J@@JBSX z7?P!;E^zyzICSQ6sJA9_rr4}I*GtNQ(PPY$4qXy1nOuf!l+IP8Hb8U~Nw|KPa9Qzr5(oIx)mMh?=9msJQqyJxYjGW1HD z3Xn+lh3*n@R9bnIq$P_lUcooM3d#~EcH%V7&F*G_ljbGlkrmM-SG|gxmT6S_8J&%J zqo~O2Jo6x|QLH$Lc3&vraML7>vLZF#h!QkfM5k^cI}~fbksT#blqDIzT;3>2b1wy1 zhPq3gELXo#=A~(xC5dO7eSyVJ{hSYO@qP;H*6l6@izV&a!brB4eWB@doFo*_+7>N% zQ{{P)KGReWxj~lN>?`*wh||!|X=Pl{cv-oMTa;1mvLB%(XBVYKk;SY;a#zv@Sh)(l zr?V(Zyo7eYnSANgrId&J6qK2(=w00Hi|5lo8}VX9>u2^Q@vV}rjW|4XATG3b+VhK) zCft4&xn_6yE=lC2P7=E%t%S92RD#TvZeGToeCgEji_A&VBrZxTD;Mv_x;OIe(n@LG zMj~!j@wtukRL-ohED8ndHNHxmWmahi^d~oG*H8SECdppHHu-6xd?RceAK1(M(!5b* zmuZ>UrL>qXojlR5!a3zpDE)WLZL~_SV0Qx>u+dRemUeH1Wz18TPS;Usz7ZK+78fby zl5v@3+S`Z#pH4EAxkcSK!v1Dulz{q{rJHEqD74eCpjg(n0<*h$np2=sa3wHap4Lji zqK9dgW7vvuD-|VZ>O(*C3yrqE+ZWnea*vS=ViUxA=k(L|yd0UW24<&jAfWmsU9UsXQje2OI`Z-Gi)ex zwEKbwp|l_>Xqzw366LtYyok~ag_!GTtv7x0OD}UGn+=s!T!$X~+~&+9Hd3@k@Af73 z(?G0J;1_0J_#`R$& zi-Llo6GdkE+BZru3Mph8)Rj5AoZ}4a0`vk?VJ}|A*1b_igZ~gGolMBSWN93UmBO#d z?$Rg8EwI9F#6%A|Tr2k_!*UlS4>WO-H%f`aa*wSp30_i#$f$dxB8}Zlv~C?Ii)tPD;->zTwmp9FF5XS3fi5|3PReA6G}PLQqdd+rD6}@m-twgji-5sO zF#n8n$&?u%JCPM|>#SoUGS043kl&M|vuv3wzY%jK@QR6>`sN-*lA@4{xJ0Yc09Lz7 zL@G}@0wpi!g^DaUqlp=VVgkI9dX<=&L}Y9HTUO!h_{<*ig0%3;B2dP=w!=Ub@QEBZ zWOkPsJ2)2y!-Y;SS4JK-xvIlQVV!PwiK5ej#_<+?ZE$tUeQ|@d#GsIj=O%CD)G|Sd z??w`ex=OoBRImqFZ>}H_RLsvZO^9rQxlXuP?J6;IkeFh{cQM~6$Xz^aB(XR8Z0$V) zmT;Ux?5?>-v4rqAr!o%7vlZ53BKBnfju<;!8x~LbM%eqp;qJIG zCX@RBaFG>(1$E{nPO6N8Y!Ee>LPXrcxGu4E%vhon!OcB_#!|Zq#SkfZJyWhG5Rp+Y z>S5!`G~s(2v?2%qV{+10O8gS7eZg^{_aZE{jSt|Uq=g+o?8?NhSbL9{n~4b^t%^-1 zOox3k0DyaoZ6a<^exm>wmkgGZ$92LoxP&6)X-qwGiDb0T0wyQ(s=yn^@j5R`ZQwFV zaG3t2e3mdshy@caHT!{mVG06Msq&)WwPJ0gYO{^N0|bH$#FF#kT6y9XxsL-NS5x9I z;BpB*n$#>b-w5j7FL2Zuv6X~)$~Pj*A}4W5Iu@EcjTj8nqp)*=MJv==hKQ>Oa+1&> z)MTH%GGPI9QOOdj7VJt+=E|r%A~DA7u-%C=3St$&HIlUelgUS7SY1dcQUKKjWW-v_ zfG~oX$uk(4coIT9kS<>a(K)HFJ#_>uOlb>ba)>+&fo_(0pdBe_F+s5M8v&|?pt<0D zg;*&>TAY83IYaacUok+hvzSTF5#=@P(Bx{Q`8~&JqG@fBqf2zfe<(#%ONqQoZUDi2ZSLY!|)lsr`#7t7K**2eYMG96X-%_I_Bhz zF`5AF?m}&V%z~aoW)(vJjL;?ZGn?R3ixAk^5{ZJc6#g3EJsn4s0Q~??Qm+)~TFcpx zV}i8=amK!yNHqky;6|6^etaeE*~Mv)mUHR=PvpD+utn1C6l>)Io+-Z((-4^pnh|Ma z<{o)Wt7JGOtW-p5pv*pPPzDfgdWC~8$ejkg00bd60;>X^*FFmwV$LtcI2f;nN?3df zqf_Z0t0IpwopQ!-L#2ElgtZU!$afOP>dML?om z#gDi%nHM=GW=MhKiI#Cm2_xZht#2&+#EA&K{J=1UaE4A1z)t|~3UaJ{mM9ijsw^{O zrBG4AEi-qF7CfZd+Q>sNDLPINk69+OvH9Yp<7A^iaEcap-8U){7^^(C;fl<8VVo-b z4b|I)#i>^BZk}NV1amhx0Qfu0Azqx)PRZl6yUVf7Ev}NsoAA{!DunVR^<|I+YJ8Ve zLMTq&fZHf`w=6OJfMXue0U3(&8<<{OKnYN6Q0pSh)ojXlIM&aV3 ze9Um7s3IJH7VtFC0lt;l7c?F`SeX!9**v2%f=A{-@<}}%@*-YHZa5nh$XWKwFi~1> zhXjk#a=uX)@8XYgur6_y5XD-BhK!&l2_QI~h@!`#I|3>ih=~sOP9@kyRe;Q%d`GJb z!rX&;Fyz`vyVzTX8Rr~a?sSm2%IuTe1I8V;Feg-&^TI@vl+?gx`Zw>YJuk#gOzn0V z@jdSCp*wQG7w`sds4~U`Rpttl&2xW@59k%|$|@b2z?oY5I0;S)7}|Zuhj*y z%98lf^p=F=!7vD+zk;=Rs3Q}{7$PNBm{sk$~Qu~0J4DM3wBWuf`UNY4+?JC8$qAgele=wk7hwEJ!e{OqmHgnG=&7vBL-vh@}z|W2m_V`w#f6wlBa6 zHd#Z-`^d8-y|^p~)(Ue6)|PiFJ$TOu`G8;s_Sy->BesmJI)d zTLnNu>u(C?V+;uoY zM8JR+V5>?r)G0%13D_DRVq9(`2DCsN#7iYGk6Md~lz~7wjtL#iJ(AAo~G=@Expz`30^G=Y;YfN*kr0Foo6KVlWEBsH+2 zv=!@(f5v!1gu@J}KaY&MtDZfFxy8uUs#!zT?%Kk7zZOV5euaV?Sy9)XTBv&Z7CcvwSXr6=> zzaeP}Z-fFJ3xf!TyI2&;Jb?Cm*f>V0p+n{#5se}K!nbe&GSoRrv;x6FP6bY8`=0sI zDYP^^2{1E3U07;&7xoOe1*nC)EMAR0BCE}DZ<*z3GaHaXbf7@Gjwr#nN1{c8sK`UW zKu)9b8#y^g2D^lgU7iI5k*pJ>3c{QX(tc^6MuIqkACafB3J4G|nL{Y;K$$2l1GpT5 zshoTWmQHRX06tPmt|xd5h@0|_TzD3NFp~s|g;l_s3ur9jDY)fS8P`!24Vo9*)whu?lQRh*63X-Gi$t0kDPRfw0A#0S+y#LmdB%&OsUXWr+%m(nqC2ND3t5En8_`_^ z*$N)M^CZNlb|I+_R}``Q6yNKbHr;b5}et_jq0Lf%ukjYW%gPAB%bq4BHM9_&IgK=8MV&W6g&wzy&2oVbH z?uNva3?gLCy745WN6eKKo*bwQNtg1C(AVPCTo6!#DQ;tlPe4iUA#ld=D-k6!`2r<{ z$k$8+4+4nbgeVg=nGa>6d=|JpFgyG+QIPlmkr0H4R1qyn)qr*tC{+AUfxDO81wAJ# z#>CJ+ipSLY03tDNja0aGY7t~{h?L+JQ1N<})=zUzDUX0bfE|%HDyUF|bGM1UeV_v6 z8^xtaCXu6!pI!7yNR-J(fW3%fm8&3h3aQQq{x+vBu{bDLIT$543tzjt2_O(-U8o@K zA`cQHbkYzM5EF&AK7fA~s-Js}m{`6MS)?e}Ig0|PgxcMO(BRaAH{(9!OQQrx2|j!_ zI*093?hEy&7BbKT-qd6hBn2^HCpXeXBBzb(G8Mwp@|f4A{hMwdbO$2Kuu+3r01;;m7bLvqAN9~ZXQFK7k zS_a~G3O-=^GU3&T&T=UjK-2G_t4)r5+FAKnT(L2TJ z-G!_~F-DRl!3O&xf-Pw809V5D+B+>N2ss|Y=1vzB0bG=hENkj@baxs7vmX+{a6*Lr zm(oBy0Ln_Lj|m-=Q4j$;$~DnrjH`gTJXr~IQl>}}w0cbD&5-euRl%oq`$CNic$9@^ znj$SFVhx4^29<#_fWb?~=L2<7en}8Oo~8A$6fX&9g>r#fOLKNf=n0KDizGaXK0_v( zpcxyYL6H&x=u3=A5fMNaN?b@s=4dOwkplxk;U8wL{F!mB?l37RjXcPl_g+bsQFAK3n!iE zsz)8@$HR7Q%3W8XqZ3~vkC619Q1DcZ%iR2Wmu{GKb0>A(;+=83Hambe@ zo4_{;##&IXuFPz3t$ZAyW#LIA3Zl|0a`9^-xuZ9v@*8<2aZ?G7)b%;RFcqNH6hoDn zukL=~`5fLH&W4as-Uy8-Re(hEEbS9yDxby2JOV=!>~`!wl54bnUo6JWEPp7I{RD>NHpD;Kh*eQ8_ETfY`bWtt=%~K8jZxm8SMtkT`+i6Fg0z8qo9c ztcZ&!>FO%wbBY@gsFDhhLHgQ#LC%B0rd2v{uEdxrC}Jkpf@7qvz>}FkXazZH1-%0# zn}|VD2q6G35?jkRB4`Jpa_^V`*x(+r7JuarVS9x>70MzVU(#hm1w-kT~jR*?@4 z1?r~S$b-{Cj!2vkceO3}H(WIZ(VkF9TDvQ#3BowSc7s47d!auMg^C28(*8oZyEq^i z4a(CeQX@u8iz-6ON678D0pvIM|A2BRmPg2_d=><7RFLNk^6dBk>bfJFR7cn!FVpS| z&?iVke{u3ZfwL334>U{!6?d*rDhofI+mjE+ls?_w!JMY7rgSwD5|F!#zE zP=K`{FA>4HoEK6WDzYdOC&}gxXmb*(_;?$dY&m$woDUB8D479XmIqR=f@4JqAvl}d zBcel^@saDnaX<@b-v~KA=akkh#B%g!02AVJq8g8QO~=xnU20egJBZA z2s=l@rF<3?dgzw{$UuwD8};g}z$#$@KFyIg`vN#zV#!Idr0QPFHa9*7;cb|S7L8q3aBiU(Nr>N5ds21qzuTbF!{zGQAGl|4bF`5 zrtnSqMij|`Adyl*1ITTJ$i--~H%tdpTW=pvN^LzE2wFe6N8npgjN-K*ge6nbK1<1w zL93dO=E;|)5fgRTIW2o=>!{_je3yVhIu41>gEyit8ITT%H2qUR=9Mu6b*ywetQMEgDrEzTWx)Vp^PST!3$K11&ed7~760^mz11kA-WNbR#A zUKeYJs?D4ipm-#zM0Du(IDy(#z?mu7LB}%zF3T6U^wxQ#S8qnrb21jh#jqjFzRuG8!j9q2?bGFs43Dhv=$SIzNz zM6WFB#XNvjl(focp+1hFnW8d*rg$Spn>c> zrXLB;K&%u29Z6>nr;t-Sq|6&-ZWDJvP&R{}(@2v1gj!fY;XBb8q|!6pIdf~0o(I!I7RZ{+<6!J@YA6Xgz{npzf`u$tQl+f70(_ZhLA zmdhgPB;rLN2u^4s4?qUODfAW6RYTh~(WkXC>TU@44#yN|n9hY1JCfA`o+$SP$3y3K zPnwCCXF)#};S@=%DNro6cbe|xfYfAHe#gVYG0+Nt>}Aj4f5i47rC60TB;LNN4M?{BfqLB7MjWbCqXU+AFCOd0AE=!qb9*QfJ3VtQ;Y*t52SqYq?B z;t=P|Lo=(;5`+!*$qX`59PN223lc|hKV2<1sHjWSSs;wF={lsuRKaC)TmX~=mO*SC z+!%}kYk`7*s_XUzNJ@(BU~s{j#Y&MlQmjKDjU7S}!tl5xOxq!kDo*cT!QYC~LNP7*e4_fdL^#~5#fq2rx69QxzX zwF(ss4418p$Ow9T>>c7WbPRHKsoh8r_6x3q?e7FwklaXx`ahS$}8BVtNwJV|3Xvr?7f@h2b^gw1>+Endf1l$;_a z_HjbCE`VeY$!(-p1b7Z=75b{-@9CyWm9N&mP|Rz(woue!{4`*UNE-mKiS7brmPJDZ zt|Q@&&;e`=HBq!O;#NotJn{qO*#-3^DM7Y~_mEYDAfb&ei3C2^(LRgtBiv{70;XRO zc>we_xIrOtQK7XjTtos7CnYE}_65I0fJop>i8`Z?v~NTno{&-@)-|{kCzxt=xmRRL z+8(AfMw1TVlu1g{7i^u2>QKZuWN(zcDEWYZ5{o5pk0^M8y`=*w5gFfzK7pXsTm^Da zv{OpN8m5IVJyN!TNf57w-j;6KG~FbZpk7kByR-w5(br6T>E;K}or!8S)ON`0=>M-> z1)oN+LZ1fXVUt42*T8A%NbS;m0$_^;wa+5D^95JfFt-3Vrctg!q5{R(nnreqlsmZ4!X4Rbr@)**98S|ir|kl1MY4Bu@stogfvuT(o(=tMG{BH0USY>@uf6IBZlGoWOOD|?+bo}3Q45nSYOVIl-E*}E^RjDC~7l4 zD%A){(NXZFSw)l0u+AmGV z47hrVF2I7s+e7YB0m}EvATDF=8x3)2HiO!Os$uTA#~AU-k4H=|4%{L1N6i3M-7SzV zx6+}3Gv6T=R0$I~fO_-sL7=s($n-8KiU_#aptCr7LT2b7TBK=D9_0npx>1ZOZSOdF zj3EPLVs;y3l3*&zX91zGfq6Od9l|BaAIUk5Na2dLI%}FH!Rv8psF^T`D3%;EMT~}8 zTg_)txkp<*UJEy5?lpnPf8TGMa%04<_{VWhK%xbz9vskX8MdZ8dB|)dU=AiS(es3p zhf)rC1NTwpA`zb{cb954Fes`msrZ!h%i$BXoI`I9!Fjc-P@X2^p}0L#Qvx!8`G$9t zqF+dT^(w?FOu&}*jhs5_3b7Q_EU;Gq=-RUjs3Z-h1}#%q2c9N+7olXFt2`XZD8pV8hW6#g>$4rzZ^qf4=FLQ{)?5(I{oD1AXFb0;t-r1l2?rbPpe z3GE)RF`%|G3kCN^JYa(fAkmgs6A6J#;u2vpO(~SD3y2|6B8fCLX5BYJ{zL_li#!O! zqkb0L61qGj8AY=`grY_H?gjDMPLDE@C+fjxY z!c=uT)IN8$NZ3#^NTh1GJMuqe>4*>vkj7gQc^69_E{K~1%~d7dwr~C zp9n-k9-#-hKXRv0fsy(l9KwZzUn?sPs0pJ&3$zR)ZgNQJxkDv{FyJ9Oq}g32+t6{AgTr2_Edvr7OaacGE|;RJWCk5J$RbWB+AS+^I7J0F(0{#uZARRiuyHI&*pGEr96P#fv z&Ay1U4Zuq&jlvUXeKn=mfDC|J9p8ufmHe725sGM#{A-_ufQ)bjmb}9e!PC(rA}vOj z#WpEdf!A|H=i!ZaAfoFC@e6D^!K1pmigpUbKID<8_GDieTLtci3IzBARe|=@W$5+5 zg1xD z2t!~l>i6VXB(ot_2&L;K?5_5_@JRwx{V4Y)fEXi?S`xb}*b?L(lNd!2hC#r^0sKnQ z7UdO6yGyJi&0rFwXy%RjA)`1o&OhQF;XdWmA&elmrxhH7nbgw;(H@9{O@QPLCo8j` znW#YkBSU6FrJrV%go*{!I1|ZBC@`Z3pG_gfM7lXjks^~QrM%Egk%p2*3sXoLkBg2; znahe|kuibH(+2J$I;6BousoYlWwg1}s@XaJcy}TvpME{qUARx|6GxYxD7k0_P1AgxtwXJaxDHVysFt~nkdJwUnWMWqki0VMldy?{&*lQs z3MM4P9mWo{fO1D|m12aP09F>_lsDq+qIxY+yU8F43U#$PKF)$WByCJPj*Ypj+yPor zI5eywNL20%a&3+XeE_IU50CTE5P>ertViL8tiqcbrv zqWEdTRx$~)3)l``PWddzR}l9THBTfP7M}<-fhwZwK*Xs>?Zi|IXkCW8X!nKrZlZ!= zFq4#Eb6!NBzyLQ0oDh6S`9^fUkl}<0 z_8`X@=_n;l+Erxq9Y}B4sRtQ=6aw;t7vriaN!G4HgI4fvQu>bBB{QN_mzFHjKSlpW zWZ}$vU}#$x!K0Yt-%Q@2TvFYw1WZ>{qChd@Um6KFG%Yt0H7iC?`9=);0Zk{wWnz}x zX%Iw8TxCW(c#gK;pa>yhM??=}7%3tKs-gi5q#T0!GwriLT|#YRR*Z+GUbsiU9%|;L z@rC$+u7-kgR+u}fi$y`D?Hhsc01_XcCJBh-0a!lRA1Rh3C(V`7A(tHNm{IY7GP^ymmPYY}z{=qx7T7g|9u{@d4LQe<&y%pcAzZ5F-mx2nE$Ky9M+xtw%^o?2@oXd0x=x zN8kz62pc7URBuWOOfx);jJA@Lf?-O7sbodt++k!HMGQcq%-bXa)<*DjktDyPo!>;1 zY4}1c8{$&RWaR8h^9qr}^KgLBS`>#>$Umt8m4V^13SBl~yn&4&X&E@B-CYm{8+ktE z_Hr8|`s%^b;t(LtQMhYYfn1ZOAmn%QEDRd%p`S%+NUBKb^|&4q%{LJpObJDBj5yOq z&5T{7FtWs!7)1?yIn6jY&{7AF&P@46d}k0#m}M$-d82-~6x2JyIzggfY{b^VdO(81 z;7cK>cKWSMm=fg*@q1@qx7cM~tz9yhO4j)|{Gk<-UL&F*(C8WwM9d0AhF=Cev~m zFy7J56obK~@u4(~#g`DCl8BJz!17Tk$dnIlu0~N9R-Z&*d4U{-4Pg*}xq*a+GUXM?bQj!(H$oSN;ig0j zY?mGs$|#6pRC>~2X9*TK^hgTiYg6n^#4A;t+GkP{m1kewL zQNUsGYQ5}B3<+UFXTXwo)*GlT<6~!-KE9SR<3m(L$uqhw08x1su69U`6gHQdHgykl zcoo{OK!{CfqBTVqh{;g5O{k9%LJzdSAjL2==Io*aBo~!_ph$lBr>UiS_6^Ek?sS{Sjs#ghB|do$kEWW%Nv=tz<>@35WzG(t$kq? zW)xD3B-$0;2>k#CoX>;Wno>&T?&6*)JY#kcB?e%broM@~7qoLYH!bGDKsEkN&^{q_ z3-|_ZnGPp3V3bpbT1d2+AUHPEthTCEMEKy9$QZ`C2`W|?NXj{88Z}*dmHWaal793k zUQOh|AJ9-z`hkj2O^fdWd84%=$e{O;xdEvEfDD+LhPUTG+Gimdf;8gfmED)-1aco4 z;e$X<+r2!d@)Un0vz|@NK))(lUddEFGz4&V%4b34%EiGcfeY}B=$%|pX~Mh)sSDI* z!X&~4>AXy$nLy7I>B~T=CanwERPjgLK#F!i)cF%8d}-fEYQ50yVryj;l>N-GrKK*- z;*q3jJ**58z?x9k*x^#W`a6N*VvnS(J1`y=4@t-&Bs|h&AVK9DneN13u`-+wbc;!s z$Vbq`xU^UgwAEEq#!#Sw#FE;-wfv`z%nW6x~>eO^x+ta1h)hl^i62 z;LqAskOUzSp$C}JGm!BWcokws&LHubb`>%#X*y0(xqN8`uV6V-{s@jM)hg2XwE#FA z7Uan0)KP@W&??{;t~A(*@>ztOp-Tk1I)gQn@j)pNbYpfo1lrxDtUZ7#WHUPt%S2vs zNB}?LE7VKcXOZ?_z=X7fGIkedK;FjuEhK-ut$Gz2A)sNWj?dhqUXys~LbMr`A zh06+QRmR8&Df5=jv)X5Yqz8YZ;@(&W8V$PAz65Lt;$6#d;4JXdWS=5x=9I`l3lIky zLJLZ!oq8p`@1QN|`roZWZv;}v|F*814`k#n^kXueFl6eXRO5+eUuF&~_XYHo=BzTY zf<#Gf0O28hT%^Ada(nIW%Is;XKmqx>x=V6Bq*ExJNFBj3l+QxIFID^#v{KNDkbERD zoEpht3p)JbE9poiy#ch=o4$NB!@%Tq9mDDD0V&J4PC!YKRw~~JXoK1dM4jU-6crCp z1BiJ*jp>=7U4?W{gd!7~NDy=V83;_(8~>FEUR(%+@E{Ip=B4dcB7Ni`glV-r5lj`G z%aS;|1xBs_fztzpN!aK6Vk9b zEg{-u&Nt7aJaxQ0=q|sv>vj)gFa0SAcj=GB1Z3qZ(&37X71GGy3=Gkr>lKw*8B;5% z>(j1+bb#|ht62oN#4pfe%se4mL$U#bqFtqs>03-C?$oZJ=hO+>OdZFupm9*I!c;ME zCFzqUc>rh(G%++CaUvjrb`^X*ja9MQhKG&7Vqgu~TVz)>3|6lq!X2~`9ka}EROa6T zj7E%O47HdCHUDV07_xx8!dOheG8E2~mym;kcPXERqmPHC4xHpnA`d8X_(t+bk>%%F zZ!hXth6YfZ(&^xVyIB^fmidDe5ow==fmaB4XoB5ghtxkH0`@?wu)kUs3Q`;J$1jlq zb&NYCv8)1bL-SW{6&}!|hq-1n6W!G$#-v;b!Ut^}&EP0-QNEEhUZfBUmaJgafmy$_JvolsD;868U;HlPcT}je2_!xX0+dk z{0cEK0E|dY@Fb+f^hluj0%M>lG*G?~9ropiB}0-o;+v6k3EJTh^lH`g2wL$&F*cIp zizne8LGVgufTiJ9D4&G@M$&tN45M^HAHNxG34E(^{c6jTc75Uvt?D0i2DU!YwMyg}MfK+;Eu5*w%qM6cR! zL?>U822=-d!m_(SZa@Y&Yr;&J7u~a983CYRwP9_{siXg{phJXo%)!<6W0wkJzAAL# zIC6rfUpix;T%lG)+dYeE74+Cik&cZ=&4jF^p-9{y%GHw(=@}ui8@$p)x)##p+onAa zo^c|zP_%_7N)UX4njQH@#89-8;Zx(G=%K0nMg*mD_ptgC$Vp`S0A2*!MC>h|ghzkNYEs^D`IA)?OFs`L;eBg~`j2m5QRH{C#i>QI5B@5D(d-w0U~ZE&dY1Uuxs zFffg_Cy@Vi+)O>KmKd!oT{|Q??bOjID&bwgh@lneU8&t&`VjLIG}NXRT>NyeS_K*f zlDr}_1@{pxPC|VRwbPLH^z*=cY4?Q|`}Fokj?wu>XaEi(eZz@{fPR&$h^QZWf&*;& zR*>pR{6Kt01fb5cn2$o!XQ&ZEIkCGGMM3z1F#!AGRkXXyZs0~}Gf#3RmH||YZ;q&5 z0$(jRf#wnkkj$h3n38Wq6D?de0VYTcNw#udXwyR4-~g9*C^5_c<$=gm!Ba}LWuTcO znn$!`$i&452p>QfI;nzl;fJ-)LTf^Yr~@x+?h&fAjIPp@Ua&ct5)GA+2E=uAlZ3mK zSc*TU2{j^Kx(m~hbfsxhSW!~xnVjEFC>(x(5q$;x5; zs7PUc78VD+w=!>}TuB7)XlF#nz}aP|A=!}B%MeiQEF{V& ze;mEu3`Qm`i_vFN!$JIxyg<83L8QUM5c9~hfW%-a=%i%fpVT$(ybd-K+|TX0UvQIA z4$|bE)d(1sw~pFQB#PdaQkxnBa*qFbTQ6M2Dg!px^=6 zfZ@98vrBXV?&qNjnm}}zp?{E~J)}_`F4b#NCacgCEuhzOcXoladUSGR6%m&*keez= z*_Qy_D+Q>G$RQ-x#=EQ{7uucRoo0Ls93vF20N32 z8@`bcf)4M1GMrz?OXYbXG2#P3ixXJ#G$<1oF#{$~MIL>iwX2A5onJ~2)G=ZhP~t@N zIVGN2JCz3Nlu|ir)ZqV(C+QVqa+|RQ3`yZVd2FnrBRhKR-+W!4ioKohA%NUj!%ZQ3rqmf~WOr*lwIVlsk{XH|kfHg`tED<4F*6nlIgp z%R+BO*&apld~Aaq63s{_NfCrm%BGDO(5Fft5NUs5o`nb{wQj`$jbQ z5%0m5GON&=1`ZR|p0v=_^04%{$jHYXdNP?T3#3hEPr#p}iou5~pCxB}k@N}zg)z2{ zR`+P5VX>H;11_mv1yjeJ#1M4n1p*4?lMKs51g>6%{+0MtxLg6KNbrH}pmE6iAe1ca z?lQ0r^pyHu(VcK!VCFc8ly}p(ig|R(H=-~Hw3#G^E}ML56#e9|=q+f2PVZRl8`1L@ z=n~V^vHx_S5SSvttT2KN?g z1M`WN66_C%SNTR#l0qU3x%mIuyYo0%uewhBH;F6)YH&ex5F*GT8q!@|OIHYi>Z)qt z$By7c@TIv~31neN5CjL=935cs`6 z=c&3&XW^Wxp8sxUpfTxt@;v7`%Xj%KUA4kCa{SLU|7E1Lcqu|^_KZUclBk?g;mW|( z(Y6Fhs6C|!FUD?dOL=;YZi`VI4dO};N+l17@+cWR>OaixYcbYQ8^ZFJf#3z?loE^C z5*l2tCs?7%*;P_=s6?!-`$jm1a|jyrV*$*#GV(C1^i~vfnLd>BWwo`-t%#f+j%LTg z28$LhP~?L}Bw|>3lSD6uLZS%1Q_SLY=B9V0(J3UmQhC-<4WqyZelXJG%dHj>M#K;* zcmTY$I8~iIOrsn1JG1caxX7o~UQT6F^z{#p(yA%E}T7&%!DVr>dLm+&EpVJ=4z}j!LtmA(k&jtc@9BdZCN&Bp_62GjZ{BIN#D#CsnKDPCufLZF*2* z>Of~m9;R-R9G>JQap2^^i5P3SmPRqBiMz4Ua|d9KlIR0WP%Bd+s(mAljhZwhfjcz= zz8A#jSdhBGcWU)KoNvrRp_xIi%Dk{R_8f@iv&g;H<|GnL&Y$`kYwc-dAAl)Brt*pG z#x0~o5u0G`QpYP|I;= zTLdr!u`L`zYpx7Ojd|q&aHeh@3|-1ag~_ePY!TCMn>NN$eIX=Ou9< zCJT5_huwl4w07t|z`5yZRgQun7X~SAWjX777MMNYB%=g^GKp?LDoGX|3mW?s^jl0@TsCFab5n zW-I4K>Y%ZrjoRg~C`ST1ONdyARzvMKf@{WU6ix-4=Z%u*=q)Vr)& zte#*>NQ_C< z4>%}b)o9Pw#!|96YVazIJ9^|#&)lb(R%}my+zh2hM7HG8FKm%1De^`6I zK$OZ7Y0IwDpPmEJ^J<3f?ie!3rnRB075GJZA(dYmK3tU{+J4=aw#9dOKs!3Q*Vgur z93|-J0*AD+ayM?rWMODfPEQis%4bpKMr71Mkl7ezC(e}G5)O5%u9lmNxE*1r4RDI0 zIN>%>k=G|iU{gA*-A4dTMW~i*MrHOnPu(OgrfYHMBI1X64U@W# zW}K*>28V7rNL{IWN0$L86hS@U(CRlL15CXU-nF~ce023u93&rIIi&JS!|v!!M3%Da z&M{omBBV;7%|YwFauhjzB7fSf9Y+k56N)|l1`NPvwK1kJC`9RUX5;Zqwww(D5eV>s zWn3Et5jCOi3NhPtEd`s=oJGY@-O=@{NQF&;VPzI;${K)$<~8rgj+d zyK+j!uTUK&y7JpXv&v_YsSQH+LAA(kq(MM+(cf|1YxPy$0lSVPNCbE(*oy2UkX3~` zIjIsYf1SE#+0Ahq|7lCC%*#sNqqH)@b2bW+ZqW2IwHJR`d=Sag%9BAn>6#8?#$n}# zjpqZlqVkd`+HF_+Ml|QZfPwN$4ol233^w9Fk_zEa?I>z{WX}QlyL}WG4H&%!nMvQQ zT)X1#XfHt>bR99NI1k@IqdAT!s8>DP>aoNKiftmno32JkxXlMKy(TR zfM*iLG74Clx}9wRE<|v?a@A@4_&8n$2PHh47`oC8)$@a-s_nx@&5yOAL0l%~l;ZJf z{kY{MqqTY-bc=jk{iBi0CN&Sb1~GotZ`bA8tgOE%5{Db$4Mc~Y#Q=(kauh{lB(K^N z6Ej)wcT+;|Wb!O4Y14}YH<8Pxn$aCwN6}cbI=ye8v|4Tpss6Mh*ki5JafeBT#`9L} ztz;9CP;}d;B!whJF0FFC^fitInLzB_4q&$yg>14zj6D6~YRNlf5i!oY8SxFrbxhF|%f#jD_X4H*2wZW>=BdD!d z8^x#I9*K9mwYw72jHC~5LAnqCY2{g<1Y_DlR6wRuiw))YtU3X}7S2M}i=)$iaBjjK z(TuA6(v-ebenib(#~oJ}_7Q7L@fgFrGCK4u2>M#4u&Fs;6j$L1 zO6bPEwo$+ZwcqEgIn-)_BWmBs!ZjH-Q69`(y|b`(Wszz#Qa z(NS_F==M3cdA+7+TRRG>1^7-}xXZjK6GP8ZCDw+gj8r*_+zz=*0af&3cKO4yKO|WN zl0Z+RvT}l5FdOTk+1cFC=m^Ik|f-e?`xKKldia-cwr9r7&7Fe7LuXjk}M=)=l+ zk$DSvbQ{;vf<4YfI}at$xkxQ~_dC7y2rR3FaGq_tZ4 zM#APyL3EtTylA^<=E@~TqTbpXyzqeAt$hc^nNeU*)ctxCfi+LOYwfeB&S~~5QWq>S z%PrMa@<&XcwH7MpvwdCog{ z-r%fr&KaD1*1@fFPTt%+$4KXFZJvD2*48M^Zs9pTRHa1$(5gyfF_C6y6*PAY^B)y=u}mDl#+ zInt&AKp|^hQU&^Waq)Dg@&wwbusu68&}Q2B>4Au6b0YE@Mc0s92KrvnlQ}%lo;eCz z1Z*O1W#rEqT2qSWYLYQ0HdaqxQ zDFGb0AnCwLX>|M{y!oB1J`i0(on>{Gp}4!EUVgo=mVt=RaIMx&ttcbi&_GdL2hf)| zR@8uQcpwrXNH&|6(^_*xGoRRx)0WH0dIPcEjdUEIcf)zK_w$=<_-kvh)8)`Q6+o%sQEB_B;yK8VKx-RxyH{<9w}wiklV|mXPl&=PTDcN2Ja; z)xl4v>sDb>a6<#_6wTrdU84#t_YDmsq@?hr@6@Y+x7_eRfN=bz24bz%C!4=O^jx)| z{Z~bzdc9ASAc8XmCNAP!g`e^b4#bps3+GPozs45H6Cue^vzI`wvyKdeu?E5{yb)cl zKG|g;Z3PWb+O=zJkqm?eJ7Iko)6TV?NL(bQj2B}?#&|_OCD$y`h27ooHH6&%-%d>(yMa^Bu8`17P(SQX@n27FK1{8|h`N_e4;# zO6)OAuQ05+p*hOaKv3ent~uEXje!ox1uFoyH}pi59F*1&6`*$4`f3O^oZZ-(F)CbZ zAUJDKN|kT){q+Vy3frXp3?;kzb>#j~(&)pg5IaURUj2#4lChCj{v##^i@erAPDX{A zfWRuajo176Bb0`ZB(BvHTO$=E3I_hWg-``HsL-|gs~L!tg<^ALuPQ9buJ_eqpR4ME z%#5M8MpBbka~(O3pwQL%*LpQb0{C90H<13T59B&y`9X+tS5C9e327iWKJ_~^J81H? zo+!N_7THuzD}<4*_p5m#`j<3TL7!<*uKq;OniwpqYgF!PAm!KlMCb=&MRJdnCt5x4 zC;tGYXu~3@F%eunhAbKxBNaQKB0%poo=7z@#wtKkNXBbSwoZg3UAxNVrh>Hk?q`GP za*Sq@1)zYq^5@rB#H+#75&BDzRu8nODdPq}0>QNT{A;|LfdG;za-c7%w5|SXU|LbH zR)UV8!0N|{2DKt|gzmMy9dfHb5s<%Dy>pgQmX_EW11ZxEXvXT7j zS%OTg{zQ)ym;v4@x=`15j1c=7Qd>Ylj?LN{;j!uyyi@?>k^Nbt=D(wxA5Q{K z=z8gElvsB}AOzN3{~)>g`zud2wvC2w_|OmmSXQeK#7uw$11&|(aK=lk4}`3!2GNKA zA^h6X^4U{8)(D@lgr=ZFPYCy8^(S(?!l(fGavT8cTYVsg(74)=lC+c+$yx@A(RO5| zJ1Z0lr;s2D+SVg%M#DhZlsy7E1!V@EMfGu;2ZFLz90|WN_U-Uq%b!GV#RVfI;vxEA z;#598Bf0aI^N62IA3-Cgm1!4k1c}_Ew7(0eQh}B^{6wfZp!Ry>oy8nLo$DwMCdrz# zd^M6E^hMzgIu$?6T;dSq7ad7}1oe{*(Lrr>xCshWI>)6jUaT;AX>T`7Hf>r|)on^@ zl14p9S=ugp91T{Hb_Fu;&>S)FII6!!$P7+T?TE4@Nxz0y+cS_(4OH@kitY%sxgqh} z`$X!H0LfHm*=!QoT>Xg*gxreHy~*0WrCPJ+iAwnp1(n!6EshGg&g+}(3^d(DRS`yz zjcSOquj7gE&!8g62U_tf&k;z=iZ!;qPgJClV9PY1ureCzM|%ewBWarIXl zDnG|xm=2qgf5YLw_lYJw1Ok0^*&lRxLwvM%AaRje2G~fn3N{-0YkLN=s^c&-O$RdQ z?v>{VJQBkKc!ZHRUPVKkz4wXK`gBAgCFp|pnoh{0j}hEQx)6ayfTQ-eSDzy?wA$ej zCIM(ej9Gb(5@=C%z|HL0`teaemKquDo|qwhQxMkc%m^HA@knB5`VM{Z74#KA?x}ytZZn-0X&`tXa{5h zVv3|#bjk;m&FY^BY#0aEvcZLQ)v}XBpC;THJtuv?hJlV=*@7(bx)P*tWP=vbS_93e zS~OgUAln;OHhjQQcfTjngrIC{({bZi{fPpu$nJm|MS^Q6Anbjj_&hLC$8l04+iln) zdj}F|@gl{q71WUCSpC)P4-z2+?V@N@Ay9Vc?%(@FDH}!9QR8@kl(YI16$FAsX%F^s zPgWmDe59|QGOL2rc#Y3*ARRvt4G9uv(Hc*Lfe1Gu%@&YOR(~QcUtAw0N5oxd)-~iJ zd%jxf(@JurH2o>|-pa3*ffy|c|FogUqt%a*^w+ilhLLpGlT2C;wxf6dm_L`?80`Zq za!?@$etjz&Or2~y6^)p3YKyNvN6OG>_0C4DqiGA0W$#xrkYb&VKl`oCmXgMvfnsAO zH-faC%lg-NHPfSEC_sv77wxTvIg;G_mup{_do6tt)+vx@FhA^c>j%>RVCg14>o`oR z>uxq?jxq9b2{a5O@({@?8FV+T!yl>+Oj}t)?B6mFD-O&o6^xP`<3Et(6ZsS1g0gKH zNcn-nJcEY-bQS7S?%Cj}9wWMj$;KEx>VjPPI@&uBclT&WKn=#zw&BX&J5bJSS2fv8 zsG$mFu|u2ox(1?9BSMxX4;yZgJp<)nL&juTg9c$$Hhi_CCp!a?pS7$Q=TH<{eV~QcxEy%sEmZ-KEabxZC7+?K~45ZYzL=HBjxv7he8dn8z?)qM>93xh?kysN{FcYtLAb}QBSA;@re$0=R=ZKds zVitlrA4qN*4JYKDIpVoVnU~@Yncr9pa@ z)}NtEsS4f^kz-s%;Xt!SF;Wk@;j8Uxute(~>kYdUm6GIu6Ah4wA5X)A#OIqZ{J=S+ zHzLCd-<%2%M?{Ky74qtbwg^r3qt5J=i!6Hwa;B|D7uq{eiY$oNE;UWWLBpAS9RmT? z>1?Ic))F7>9mv5JiCvIL0>Uj<_MU;pTa+JZenoR)Aako!>W;K<{B&e6VXIVRC`?mrH!o-r99Sf9_<-OFLO%44fGKFNUeS4S3`hST<^~<>e%8o zWRNs-DKHJy`U*K?q3gwj3k8IF9=K3H<~S{FdmKaWRq6(dc8grr4f6?6t# zY9llg5FZA>W?cb63L&J4YwJXLwBgEz4^vKwV{6fOA^XQJ#!IP=f><@2kTlu#h@6OB zG!pZ9E1OO~;jbJQ4glpFtokM(lAf zTKS1`9;qK$0x9`!wk*h_UrlfvcVXOKtv_qD;fY9`Bwawn%H0o)qUwuu&RE`|-B3V~ z-!m;&KIkAZ#OL7HHi{GQfRRwc6YW==EvkW@cKuURuvy5oLHpqLd z9QBK|4!tPv9XT5e5>MayS3~K*dWw%&(S@XwW?l2RRzTXsKxi09jTj;aF{}%;l8RbI zBAQ5ew+wXjI!ZHhHyRYA$h~PpG(y+o$nz-4G5g|e3bv3V6-JY8Iu_DT!Eow#XPhBO2H}#$he^Y%to`E-`>8 za_cOmwgVS0e%eHC>p#EB17Ux;wZ{>S0F3I45O#=Ovk7k)h$GuJ8&)Y}2BP+sTCKwb zq1r{zFc7jL0X>2aol|H`C^_MAza!+e({Qf|J0YMIo;%S|%te+=^!29>5~QexCsGH2 z>z^rzCe13j1FRxjZj!*!H{huhAzDm!@0E;2O-(uL*j9|QYHDM|aV+HR0{pdP!Sd1;z* z9`QfqxU{1LwGCYxQPAoIX?h{)xF&e2GTC+r8D+qH6�m{XqI@Ou7k&ah6i{q1{JHfkf9xMXEt1 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 z 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 literal 0 HcmV?d00001 From 73089e6a6ad4a702b8fe567232903061d1914a4d Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 23 Sep 2016 17:23:12 +0800 Subject: [PATCH 023/154] =?UTF-8?q?issue=E5=BC=80=E5=A7=8B=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=8E=E7=BB=93=E6=9D=9F=E6=97=B6=E9=97=B4=E6=94=B9?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/_new_issue_list.html.erb | 18 ++++++++++-------- app/views/issues/_project_issue.html.erb | 6 +++--- public/stylesheets/css/project.css | 5 ++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/app/views/issues/_new_issue_list.html.erb b/app/views/issues/_new_issue_list.html.erb index a2de27b7d..494ea48ed 100644 --- a/app/views/issues/_new_issue_list.html.erb +++ b/app/views/issues/_new_issue_list.html.erb @@ -19,18 +19,20 @@ 清除 -
    - - <%= text_field_tag 'issue_create_date_start_show', '开始日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl '%> - <%= calendar_for('issue_create_date_start_show') %> - +
    - <%= text_field_tag 'issue_create_date_end_show', '结束日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl'%> - <%= calendar_for('issue_create_date_end_show') %> + + <%= calendar_for('issue_create_date_end_show')%> +
    +
    + + + <%= calendar_for('issue_create_date_start_show')%> +
    -
    +
    diff --git a/app/views/issues/_project_issue.html.erb b/app/views/issues/_project_issue.html.erb index 891215503..167fb2641 100644 --- a/app/views/issues/_project_issue.html.erb +++ b/app/views/issues/_project_issue.html.erb @@ -9,10 +9,10 @@
    - <%= activity.subject.to_s %> + <%= activity.subject.to_s %> <% if activity.journals.count > 0%> - <%= activity.journals.count %> + <%= activity.journals.count %> <% end %>
    @@ -50,7 +50,7 @@ <% end %>
  • <%= activity.fixed_version %>
  • <%= activity.status.name%>
  • -
  • <%= activity.done_ratio %>%
  • +
  • <%= activity.done_ratio %>%
  • <%= link_to "", issue_path(activity.id, :edit => 'true'), :class => 'sy_icons_edit fl mt15', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> <% if !defined?(project_id) && !defined?(user_id) %> diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index 1d308ce74..38f306358 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -819,7 +819,7 @@ a:hover.issues_list_title{color:#3b94d6;} .issues_list_titlebox span{ font-size: 12px;color: #888; font-weight: normal; } .issues_ciricons_01{ width: 22px; height: 22px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 0 no-repeat;} .issues_ciricons_02{ width: 22px; height: 22px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 -30px no-repeat;} -.issues_icons_mes{width: 17px; height: 17px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 -57px no-repeat; } +.issues_icons_mes{width: 17px; height: 19px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 -54px no-repeat; } .issues_list_name{ font-size: 12px;} .issues_list_name:hover{ color: #3b94d6;} .issues_list_small{ font-size: 12px; color: #666;} @@ -890,5 +890,4 @@ a.sy_btn_pink{ -o-border-radius:3px; border-radius:3px; } -a:hover.sy_btn_pink{ background: #e64c4c;} - +a:hover.sy_btn_pink{ background: #e64c4c;} \ No newline at end of file From 6d419efaecfc252b2505459eb962ed97560899f1 Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 23 Sep 2016 17:47:53 +0800 Subject: [PATCH 024/154] =?UTF-8?q?issue=E5=88=97=E8=A1=A8=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/issues_controller.rb | 1 - app/views/issues/index.html.erb | 196 ++++++++++++++++----------- app/views/issues/index.js.erb | 2 +- 3 files changed, 119 insertions(+), 80 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 628672602..4ab9bf841 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -79,7 +79,6 @@ class IssuesController < ApplicationController @tracker_id = params[:tracker_id] @assign_to_id = params[:assigned_to_id] @author_id = params[:author_id] - @priority_id = params[:priority_id] @status_id = params[:status_id] @subject = params[:subject] @done_ratio = params[:done_ratio] diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 87ce27a71..c44aa88bb 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -80,85 +80,125 @@ $("#issue_query_form")[0].reset(); remote_function(); } - - -
    - <%= render :partial => 'issues/new_issue_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
    - <% if !@query.new_record? && @query.editable_by?(User.current) %> - <%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> - <%= delete_link query_path(@query) %> + +
    +
    + + <% unless @project.enabled_modules.where("name = 'issue_tracking'").empty? %> + <%= form_tag({:controller => 'issues', :action => 'index', :project_id => @project},:remote=>'true', :method => :get,:id=>"issue_query_form", :class => 'query_form') do %> + <%= hidden_field_tag 'set_filter', '1' %> +
    + + 清除 +
    + + <%= text_field_tag 'issue_create_date_start_show', '开始日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl '%> + <%= calendar_for('issue_create_date_start_show') %> + + + <%= text_field_tag 'issue_create_date_end_show', '结束日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl'%> + <%= calendar_for('issue_create_date_end_show') %> + + + +
    +
    + +
    + +
    +
    + + <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), + { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 + }, + {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"w90 mr18"} + ) + %> + <%= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]), + { :include_blank => false,:selected=>@priority_id ? @priority_id : 0 + }, + {:onchange=>"remote_function();",:id=>"priority_id",:name=>"priority_id",:class=>"w90 mr18"} + ) + %> + <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + { :include_blank => false,:selected=>@status_id ? @status_id : 0 + }, + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"w90 mr18"} + ) + %> + <%= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), + { :include_blank => false,:selected=>@author_id ? @author_id : 0 + }, + {:onchange=>"remote_function();",:id=>"author_id",:name=>"author_id",:class=>"w90 mr18"} + ) + %> + + + <%#= select(:issue, :tracker_id, [["缺陷",1],["功能",2],["支持",3],["任务",4],["周报",5]].unshift(["类型",0]), + {:include_blank => false, :selected => @tracker_id ? @tracker_id : 0}, + {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl issues_filter_select_min"}) %> + <%#= select( :issue, :user_id, principals_options_for_isuue_list(@project), + { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0}, + {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"fl"}) + %> + + <%#= select(:issue, :fixed_version_id, options_for_version_isuue_list(@project), + {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, + {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "f1"}) %> + + <%#= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + { :include_blank => false,:selected=>@status_id ? @status_id : 0 + }, + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl issues_filter_select_min"} + ) %> + + <%#= select(:issue, :done_ratio, [["10%",1],["20%",2],["30%",3],["40%",4],["50%",5],["60%",6],["70%",7],["80%",8],["90%",9],["10%",10]].unshift(["完成度",0]), + {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0 }, + {:onchange => "remote_function();", :id => "done_ratio", :name => "done_ratio", :class => "f1"}) %> + + <%#= select(:issue, :test, [["最早创建",1],["最早更新",2]].unshift(["排序",0]), + {:include_blank => false, :selected => @order ? @order : 0 }, + {:onchange => "remote_function();", :id => "test", :name => "test", :class => "fr issues_filter_select_min"}) %> +
    +
    +
    + <% if @issues.empty? %> +

    <%= l(:label_no_data) %>

    + <% else %> +
    + <%= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + <% end %> + <%#= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + + <% end %> <% end %>
    - - <% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> -
    -
    - - <%= error_messages_for 'query' %> - - <% if @query.valid? %> - <% if @issues.empty? %> -

    - <%= l(:label_no_data) %> -

    - <% else %> -
    - <%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
    - - - <% end %> - -
    - <%= link_to "导出:Excel", project_issues_path(:project_id => @project, :format => 'xls') %> - <%# other_formats_links do |f| %> - <%#= f.link_to "XLS", :url => params, :remote => false %> - <%#= f.link_to 'PDF', :url => params %> - <%# end %> -
    - - - <% end %> - <%= call_hook(:view_issues_index_bottom, {:issues => @issues, :project => @project, :query => @query}) %> - <% content_for :sidebar do %> - <%= render :partial => 'issues/sidebar' %> - <% end %> - - <% content_for :header_tags do %> - <%= auto_discovery_link_tag(:atom, - {:query_id => @query, :format => 'atom', - :page => nil, :key => User.current.rss_key}, - :title => l(:label_issue_plural)) %> - <%= auto_discovery_link_tag(:atom, - {:controller => 'journals', :action => 'index', - :query_id => @query, :format => 'atom', - :page => nil, :key => User.current.rss_key}, - :title => l(:label_changes_details)) %> - <% end %> - - <%= context_menu issues_context_menu_path %>
    \ No newline at end of file diff --git a/app/views/issues/index.js.erb b/app/views/issues/index.js.erb index 9068aac9e..c611706b2 100644 --- a/app/views/issues/index.js.erb +++ b/app/views/issues/index.js.erb @@ -1,4 +1,4 @@ //$("#issue_list").html("<%#= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count})%>"); -$("#issue_list").html("<%= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); +$("#issue_list").replaceWith("<%= escape_javascript(render :partial => 'issues/all_list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); $("#issue_list_pagination").html('<%= pagination_links_full @issue_pages, @issue_count, :issues => @issues, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>'); From 222ef3c6afb89b9c7c2f821f5163148632379d26 Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 23 Sep 2016 19:36:43 +0800 Subject: [PATCH 025/154] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/issues_helper.rb | 3 ++- app/helpers/queries_helper.rb | 8 ++++--- app/views/issues/index.html.erb | 39 +++++++++++++++++++++++---------- app/views/issues/index.js.erb | 2 +- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 7b1347d3f..0ab09802f 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -127,9 +127,10 @@ module IssuesHelper end def options_for_version_isuue_list(project) - versions = Version.where(:project_id => project, :status => "open").map{|version| version.name}.unshift(["里程碑", 0]) + versions = Version.where(:project_id => project, :status => "open").map{|version| [version.name, version.id]}.unshift(["里程碑", 0]) end + def render_issue_subject_with_tree(issue) s = '' ancestors = issue.root? ? [] : issue.ancestors.visible.all diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 43d01a5dd..dc962b8b0 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -255,16 +255,18 @@ module QueriesHelper # Give it a name, required to be valid @query = IssueQuery.new(:name => "_") @query.project = @project - params[:f] = %w(subject status_id priority_id author_id assigned_to_id created_on) unless params[:status_id].nil? + params[:f] = %w(subject tracker_id status_id priority_id assigned_to_id fixed_version_id created_on) unless params[:status_id].nil? params[:op] = {'subject' => "~" , 'status_id' => ( params[:status_id] == '0' ? "!":"=" ), 'priority_id' => ( params[:priority_id] == '0' ? "!":"=" ), - 'author_id' => ( params[:author_id] == '0' ? "!":"=" ), + 'tracker_id' => ( params[:tracker_id] == '0' ? "!":"=" ), + 'fixed_version_id' => ( params[:fixed_version_id] == '0' ? "!":"=" ), 'assigned_to_id' => ( params[:assigned_to_id] == '0' ? "!":"=" )} unless params[:status_id].nil? params[:v] = {'subject' => [params[:subject]], 'status_id' => [params[:status_id]], 'priority_id' => [params[:priority_id]], - 'author_id' => [params[:author_id]], + 'tracker_id' => [params[:tracker_id]], + 'fixed_version_id' => [params[:fixed_version_id]], 'assigned_to_id' => [params[:assigned_to_id]]} unless params[:status_id].nil? if(params[:status_id] != nil) if( params[:issue_create_date_start]!=nil && params[:issue_create_date_start]!='' && diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index c44aa88bb..492c5407b 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -152,7 +152,16 @@ {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"w90 mr18"} ) %> - <%= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), + + <%= select(:issue, :tracker, [["缺陷",1],["功能",2],["支持",3],["任务",4],["周报",5]].unshift(["类型",0]), + {:include_blank => false, :selected => @tracker_id ? @tracker_id : 0}, + {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl issues_filter_select_min"}) %> + + <%= select(:issue, :fixed_version, options_for_version_isuue_list(@project), + {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, + {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "f1"}) %> + + <%#= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), { :include_blank => false,:selected=>@author_id ? @author_id : 0 }, {:onchange=>"remote_function();",:id=>"author_id",:name=>"author_id",:class=>"w90 mr18"} @@ -160,6 +169,8 @@ %> + + <%#= select(:issue, :tracker_id, [["缺陷",1],["功能",2],["支持",3],["任务",4],["周报",5]].unshift(["类型",0]), {:include_blank => false, :selected => @tracker_id ? @tracker_id : 0}, {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl issues_filter_select_min"}) %> @@ -172,12 +183,16 @@ {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "f1"}) %> - <%#= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + <%#= select( :issue, :status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), { :include_blank => false,:selected=>@status_id ? @status_id : 0 }, {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl issues_filter_select_min"} ) %> + <%#= select( :issue,:done_ratio, ((0..10).to_a.collect { |r| ["#{r*10} %", r*10] }), + {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0}, + {:onchange=>"remote_function();",:id=>"done_ratio",:name=>"done_ratio",:class=>"fl"}) %> + <%#= select(:issue, :done_ratio, [["10%",1],["20%",2],["30%",3],["40%",4],["50%",5],["60%",6],["70%",7],["80%",8],["90%",9],["10%",10]].unshift(["完成度",0]), {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0 }, {:onchange => "remote_function();", :id => "done_ratio", :name => "done_ratio", :class => "f1"}) %> @@ -188,17 +203,17 @@
    - <% if @issues.empty? %> -

    <%= l(:label_no_data) %>

    - <% else %> -
    - <%= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
    - <% end %> - <%#= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
  • - <% end %> <% end %> + <% if @issues.empty? %> +

    <%= l(:label_no_data) %>

    + <% else %> +
    + <%= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + <% end %> + <%#= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> + + \ No newline at end of file diff --git a/app/views/issues/index.js.erb b/app/views/issues/index.js.erb index c611706b2..0b4130ea7 100644 --- a/app/views/issues/index.js.erb +++ b/app/views/issues/index.js.erb @@ -1,4 +1,4 @@ //$("#issue_list").html("<%#= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count})%>"); -$("#issue_list").replaceWith("<%= escape_javascript(render :partial => 'issues/all_list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); +$("#issue_list").html("<%= escape_javascript(render :partial => 'issues/all_list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); $("#issue_list_pagination").html('<%= pagination_links_full @issue_pages, @issue_count, :issues => @issues, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>'); From 144814c11caac919da3f8219500d3fe92e92ee97 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 23 Sep 2016 20:19:47 +0800 Subject: [PATCH 026/154] =?UTF-8?q?=E6=8C=89=E5=BC=80=E5=A7=8B=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=8E=E7=BB=93=E6=9D=9F=E6=97=B6=E9=97=B4=E7=AD=9B?= =?UTF-8?q?=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/index.html.erb | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 492c5407b..8c02bf348 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -104,18 +104,19 @@ 清除 -
    - - <%= text_field_tag 'issue_create_date_start_show', '开始日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl '%> - <%= calendar_for('issue_create_date_start_show') %> - - - <%= text_field_tag 'issue_create_date_end_show', '结束日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl'%> - <%= calendar_for('issue_create_date_end_show') %> +
    + + + <%= calendar_for('issue_create_date_end_show')%> +
    +
    + + + <%= calendar_for('issue_create_date_start_show')%> +
    -
    From a8ed5ebb63a26c6d3217083ee4f50cb77484f301 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Sun, 25 Sep 2016 14:35:38 +0800 Subject: [PATCH 027/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AEissue=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=89=80=E6=9C=89=E4=BA=BA?= =?UTF-8?q?=E4=B8=8E=E5=AE=8C=E6=88=90=E5=BA=A6=E7=AD=9B=E9=80=89=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/queries_helper.rb | 4 +++- app/views/issues/index.html.erb | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index dc962b8b0..4a8306920 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -255,16 +255,18 @@ module QueriesHelper # Give it a name, required to be valid @query = IssueQuery.new(:name => "_") @query.project = @project - params[:f] = %w(subject tracker_id status_id priority_id assigned_to_id fixed_version_id created_on) unless params[:status_id].nil? + params[:f] = %w(subject tracker_id status_id priority_id done_ratio assigned_to_id fixed_version_id created_on) unless params[:status_id].nil? params[:op] = {'subject' => "~" , 'status_id' => ( params[:status_id] == '0' ? "!":"=" ), 'priority_id' => ( params[:priority_id] == '0' ? "!":"=" ), + 'done_ratio' => ( params[:done_ratio] == '0' ? "!":"=" ), 'tracker_id' => ( params[:tracker_id] == '0' ? "!":"=" ), 'fixed_version_id' => ( params[:fixed_version_id] == '0' ? "!":"=" ), 'assigned_to_id' => ( params[:assigned_to_id] == '0' ? "!":"=" )} unless params[:status_id].nil? params[:v] = {'subject' => [params[:subject]], 'status_id' => [params[:status_id]], 'priority_id' => [params[:priority_id]], + 'done_ratio' => [params[:done_ratio]], 'tracker_id' => [params[:tracker_id]], 'fixed_version_id' => [params[:fixed_version_id]], 'assigned_to_id' => [params[:assigned_to_id]]} unless params[:status_id].nil? diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 8c02bf348..7d7c5f460 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -121,7 +121,7 @@
      -
    • +
    • 所有<%= @project.project_score.issue_num %>
    • @@ -138,25 +138,33 @@ <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 }, - {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"w90 mr18"} + {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"fl"} ) %> <%= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]), { :include_blank => false,:selected=>@priority_id ? @priority_id : 0 }, - {:onchange=>"remote_function();",:id=>"priority_id",:name=>"priority_id",:class=>"w90 mr18"} + {:onchange=>"remote_function();",:id=>"priority_id",:name=>"priority_id",:class=>"fl"} ) %> + + <%#= select(:issue, :done_ratio, [["10%",1],["20%",2],["30%",3],["40%",4],["50%",5],["60%",6],["70%",7],["80%",8],["90%",9],["100%",10]].unshift(["完成度",0]), + {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0 }, + {:onchange => "remote_function();", :id => "done_ratio", :name => "done_ratio", :class => "f1"}) %> + <%= select( :issue,:done_ratio, ((1..10).to_a.collect { |r| ["#{r*10} %", r*10] }).unshift(["完成度",0]), + {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0}, + {:onchange=>"remote_function();",:id=>"done_ratio",:name=>"done_ratio",:class=>"fl"}) %> + <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), { :include_blank => false,:selected=>@status_id ? @status_id : 0 }, - {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"w90 mr18"} + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl"} ) %> <%= select(:issue, :tracker, [["缺陷",1],["功能",2],["支持",3],["任务",4],["周报",5]].unshift(["类型",0]), {:include_blank => false, :selected => @tracker_id ? @tracker_id : 0}, - {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl issues_filter_select_min"}) %> + {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl"}) %> <%= select(:issue, :fixed_version, options_for_version_isuue_list(@project), {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, From 617565bf1f2c99f10ec5e0c1dd9255156e2856b0 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Sun, 25 Sep 2016 16:05:04 +0800 Subject: [PATCH 028/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AEissue=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/queries_helper.rb | 6 +++--- app/views/issues/index.html.erb | 32 ++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 4a8306920..7677528aa 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -255,17 +255,17 @@ module QueriesHelper # Give it a name, required to be valid @query = IssueQuery.new(:name => "_") @query.project = @project - params[:f] = %w(subject tracker_id status_id priority_id done_ratio assigned_to_id fixed_version_id created_on) unless params[:status_id].nil? + params[:f] = %w(subject tracker_id status_id done_ratio assigned_to_id fixed_version_id created_on) unless params[:status_id].nil? params[:op] = {'subject' => "~" , 'status_id' => ( params[:status_id] == '0' ? "!":"=" ), - 'priority_id' => ( params[:priority_id] == '0' ? "!":"=" ), + 'done_ratio' => ( params[:done_ratio] == '0' ? "!":"=" ), 'tracker_id' => ( params[:tracker_id] == '0' ? "!":"=" ), 'fixed_version_id' => ( params[:fixed_version_id] == '0' ? "!":"=" ), 'assigned_to_id' => ( params[:assigned_to_id] == '0' ? "!":"=" )} unless params[:status_id].nil? params[:v] = {'subject' => [params[:subject]], 'status_id' => [params[:status_id]], - 'priority_id' => [params[:priority_id]], + 'done_ratio' => [params[:done_ratio]], 'tracker_id' => [params[:tracker_id]], 'fixed_version_id' => [params[:fixed_version_id]], diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 7d7c5f460..046595128 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -135,13 +135,27 @@
      + <%= select(:issue, :tracker, [["缺陷",1],["功能",2],["支持",3],["任务",4],["周报",5]].unshift(["类型",0]), + {:include_blank => false, :selected => @tracker_id ? @tracker_id : 0}, + {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl issues_filter_select_min"}) %> + <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 }, {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"fl"} ) %> - <%= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]), + <%= select(:issue, :fixed_version, options_for_version_isuue_list(@project), + {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, + {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "f1"}) %> + + <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + { :include_blank => false,:selected=>@status_id ? @status_id : 0 + }, + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl issues_filter_select_min"} + ) + %> + <%#= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]), { :include_blank => false,:selected=>@priority_id ? @priority_id : 0 }, {:onchange=>"remote_function();",:id=>"priority_id",:name=>"priority_id",:class=>"fl"} @@ -155,20 +169,10 @@ {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0}, {:onchange=>"remote_function();",:id=>"done_ratio",:name=>"done_ratio",:class=>"fl"}) %> - <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), - { :include_blank => false,:selected=>@status_id ? @status_id : 0 - }, - {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl"} - ) - %> - <%= select(:issue, :tracker, [["缺陷",1],["功能",2],["支持",3],["任务",4],["周报",5]].unshift(["类型",0]), - {:include_blank => false, :selected => @tracker_id ? @tracker_id : 0}, - {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl"}) %> - - <%= select(:issue, :fixed_version, options_for_version_isuue_list(@project), - {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, - {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "f1"}) %> + <%= select(:issue, :test, [["最新创建",1],["最早创建",2],["最近更新",3],["最早更新", 4]].unshift(["排序",0]), + {:include_blank => false, :selected => @order ? @order : 0 }, + {:onchange => "remote_function();", :id => "test", :name => "test", :class => "fr issues_filter_select_min"}) %> <%#= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), { :include_blank => false,:selected=>@author_id ? @author_id : 0 From 2ac827c66fd999b1efd42f6a1362889c37681d97 Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Mon, 26 Sep 2016 09:44:47 +0800 Subject: [PATCH 029/154] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=87=BA=E9=94=99=E6=97=B6=E7=9A=84=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_work_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index f6a97e66c..cd80575a2 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -106,13 +106,13 @@ class StudentWorkController < ApplicationController rescue Timeout::Error tEndtime = Time.now tUsedtime = (tEndtime.to_i-tStarttime.to_i)*1000+(tEndtime.usec - tStarttime.usec)/1000 - logger.debug "program_test_ex user wait time = #{tUsedtime} 毫秒" + logger.info "program_test_ex user wait time = #{tUsedtime} 毫秒" #status 0:答案正确 -5program_test_ex 函数出错 -4judge代码出错 -3http超时 -2:编译错误 -1:答案错误 2:程序运行超时 resultObj[:status] = -3 CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>-3,:wait_time=>tUsedtime,:student_work_id=>student_work.id) rescue => e #-4 judge代码 出错 - logger.debug "program_test_error #{e}" + logger.info "program_test_error #{e}" resultObj[:status] = -4 tmpstatus = -4 CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>tmpstatus,:time_used=>0,:wait_time=>0,:student_work_id=>student_work.id) @@ -217,7 +217,7 @@ class StudentWorkController < ApplicationController end rescue #-5 program_test_ex 函数出错 - logger.debug "program_test_error 2" + logger.info "program_test_error 2" resultObj[:status] = -5 tmpstatus = -5 CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>tmpstatus,:time_used=>0,:wait_time=>0,:student_work_id=>student_work.id) From 9bfb749e705411b5e17ef6643a4ee8e1e9d47384 Mon Sep 17 00:00:00 2001 From: cxt Date: Mon, 26 Sep 2016 10:17:45 +0800 Subject: [PATCH 030/154] =?UTF-8?q?=E7=8F=AD=E7=BA=A7=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E5=BA=93=E7=9A=84=E8=AF=BE=E5=86=85=E6=90=9C=E7=B4=A2=E6=94=B9?= =?UTF-8?q?=E6=88=90=E7=8F=AD=E5=86=85=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/files/_course_file.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/files/_course_file.html.erb b/app/views/files/_course_file.html.erb index 045eec6f7..1157961fe 100644 --- a/app/views/files/_course_file.html.erb +++ b/app/views/files/_course_file.html.erb @@ -98,7 +98,7 @@
      <%= form_tag( search_course_files_path(@course), method: 'get',:class => "re_search",:remote=>true) do %> <%= text_field_tag 'name', params[:name], name: "name", :class => 'researchBox fl',:style=>"padding: 0px"%> - <%= submit_tag "课内搜索", :class => "blueBtn mr5 fl",:name => "incourse",:id => "incourse" %> + <%= submit_tag "班内搜索", :class => "blueBtn mr5 fl",:name => "incourse",:id => "incourse" %> <%#= submit_tag "全站搜索", :class => "blueBtn mr5 fl",:name => "insite",:id => "insite" %> <% if is_course_teacher(User.current,@course) || (@course.publish_resource==1 && User.current.member_of_course?(@course) ) %> From 42afe33dab280adc715113d25ebc1d59faa6ee3a Mon Sep 17 00:00:00 2001 From: cxt Date: Mon, 26 Sep 2016 11:12:01 +0800 Subject: [PATCH 031/154] =?UTF-8?q?=E4=BD=9C=E5=93=81=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E4=BD=9C=E4=B8=9A=E6=8F=8F=E8=BF=B0=E5=8F=AA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=B8=80=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_homework_post_brief.html.erb | 2 +- .../student_work/_student_work_list.html.erb | 4 ---- app/views/student_work/index.html.erb | 23 ------------------- 3 files changed, 1 insertion(+), 28 deletions(-) diff --git a/app/views/student_work/_homework_post_brief.html.erb b/app/views/student_work/_homework_post_brief.html.erb index 6b3c0d542..310b4118b 100644 --- a/app/views/student_work/_homework_post_brief.html.erb +++ b/app/views/student_work/_homework_post_brief.html.erb @@ -42,7 +42,7 @@
      -
      +
      <%= homework.description.html_safe %>
      diff --git a/app/views/student_work/_student_work_list.html.erb b/app/views/student_work/_student_work_list.html.erb index 6bcb2bb5e..77517f747 100644 --- a/app/views/student_work/_student_work_list.html.erb +++ b/app/views/student_work/_student_work_list.html.erb @@ -54,10 +54,6 @@
      From fa46916ac9cb453f6dd024dd933791cf4be04a37 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 26 Sep 2016 11:20:49 +0800 Subject: [PATCH 032/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=90=84=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=AE=BD=E5=BA=A6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/calendars/show.html.erb | 6 +- app/views/gantts/show.html.erb | 6 +- app/views/projects/_history.html.erb | 2 +- app/views/projects/_project_jours.html.erb | 428 +++++++++--------- app/views/projects/feedback.html.erb | 8 +- app/views/projects/settings.html.erb | 5 +- app/views/repositories/changes.html.erb | 54 ++- app/views/repositories/show.html.erb | 8 +- app/views/versions/index.html.erb | 8 +- app/views/words/_journal_reply_items.html.erb | 2 +- 10 files changed, 276 insertions(+), 251 deletions(-) diff --git a/app/views/calendars/show.html.erb b/app/views/calendars/show.html.erb index 39cab4a53..26ad8501c 100644 --- a/app/views/calendars/show.html.erb +++ b/app/views/calendars/show.html.erb @@ -1,4 +1,4 @@ -
      +

      <%= @query.new_record? ? l(:label_calendar) : h(@query.name) %>

      @@ -40,3 +40,7 @@ <% end %> <% html_title(l(:label_calendar)) -%> + + diff --git a/app/views/gantts/show.html.erb b/app/views/gantts/show.html.erb index 0790b73f4..39ac2032b 100644 --- a/app/views/gantts/show.html.erb +++ b/app/views/gantts/show.html.erb @@ -1,4 +1,4 @@ -
      +

      <% @gantt.view = self %> <%= @query.new_record? ? l(:label_gantt) : h(@query.name) %>

      @@ -320,3 +320,7 @@ $("#draw_progress_line").change(drawGanttHandler); }); <% end %> + + diff --git a/app/views/projects/_history.html.erb b/app/views/projects/_history.html.erb index 113689344..d9abdf47b 100644 --- a/app/views/projects/_history.html.erb +++ b/app/views/projects/_history.html.erb @@ -3,7 +3,7 @@ <% for journal in journals %>
      <%= link_to image_tag(url_to_avatar(journal.user),:width => '46',:height => '46'), user_path(journal.user) %>
      -
      +
      <%= link_to journal.user.show_name, user_path(journal.user), :class => 'c_blue fb fl mb10 f14', :target => "_blank" %> diff --git a/app/views/projects/_project_jours.html.erb b/app/views/projects/_project_jours.html.erb index eacc2a152..a9f145c8a 100644 --- a/app/views/projects/_project_jours.html.erb +++ b/app/views/projects/_project_jours.html.erb @@ -1,214 +1,214 @@ - -<%= content_for(:header_tags) do %> - <%= import_ke(enable_at: false, prettify: false, init_activity: false) %> -<% end %> - -
      - <% reply_allow = JournalsForMessage.create_by_user? User.current %> -

      <%= l(:label_user_response) %>

      - <% if !User.current.logged?%> -
      - <%= l(:label_user_login_tips) %> - <%= link_to l(:label_user_login_new), signin_path %> -
      -
      - <% else %> - <%= form_for('new_form', :method => :post, :html => {:id => 'project_feedback_form', :multipart => true}, - :url => {:controller => 'words', :action => 'leave_project_message'}) do |f|%> - <%= f.text_area 'project_message', :rows => 3, :cols => 65, - :placeholder => "#{l(:label_welcome_my_respond)}",:nhname=>'new_message_textarea' %> -

      -
      - <%#= submit_tag l(:button_leave_meassge), :name => nil , :class => "blue_btn fr mt10 mb10" %> - 留言 - <%#= link_to l(:button_leave_meassge), "javascript:void(0)", :onclick => 'submitProjectFeedback();', :onmouseover => 'submitFocus(this);', :class => 'blue_btn fr mt10 mb10' %> - <% end %> - - <% end %> -
      -
      -
      - <%= render :partial => 'history',:locals => { :journals => @jour, :state => false} %> -
      -
        <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%>
      - -
      - + +<%= content_for(:header_tags) do %> + <%= import_ke(enable_at: false, prettify: false, init_activity: false) %> +<% end %> + +
      + <% reply_allow = JournalsForMessage.create_by_user? User.current %> +

      <%= l(:label_user_response) %>

      + <% if !User.current.logged?%> +
      + <%= l(:label_user_login_tips) %> + <%= link_to l(:label_user_login_new), signin_path %> +
      +
      + <% else %> + <%= form_for('new_form', :method => :post, :html => {:id => 'project_feedback_form', :multipart => true}, + :url => {:controller => 'words', :action => 'leave_project_message'}) do |f|%> + <%= f.text_area 'project_message', :rows => 3, :cols => 65, :style => "width:718px", + :placeholder => "#{l(:label_welcome_my_respond)}",:nhname=>'new_message_textarea' %> +

      +
      + <%#= submit_tag l(:button_leave_meassge), :name => nil , :class => "blue_btn fr mt10 mb10" %> + 留言 + <%#= link_to l(:button_leave_meassge), "javascript:void(0)", :onclick => 'submitProjectFeedback();', :onmouseover => 'submitFocus(this);', :class => 'blue_btn fr mt10 mb10' %> + <% end %> + + <% end %> +
      +
      +
      + <%= render :partial => 'history',:locals => { :journals => @jour, :state => false} %> +
      +
        <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%>
      + +
      + diff --git a/app/views/projects/feedback.html.erb b/app/views/projects/feedback.html.erb index fc474afaa..77f754567 100644 --- a/app/views/projects/feedback.html.erb +++ b/app/views/projects/feedback.html.erb @@ -1,4 +1,4 @@ -
      +

      <%= l(:label_project_tool_response)%>

      <% reply_allow = JournalsForMessage.create_by_user? User.current %> @@ -47,4 +47,8 @@ function checkMaxLength() { -<% html_title(l(:label_project_tool_response)) -%> \ No newline at end of file +<% html_title(l(:label_project_tool_response)) -%> + + \ No newline at end of file diff --git a/app/views/projects/settings.html.erb b/app/views/projects/settings.html.erb index fc9beae35..faf3a48f8 100644 --- a/app/views/projects/settings.html.erb +++ b/app/views/projects/settings.html.erb @@ -16,15 +16,16 @@ <% end%> <% end%> $("div[nhname='pro_setting']").show(); + $("#RSide").css('width',"730px"); }); -
      +

      配置

      -
    From 4db59ea0d328d2a56443fab6c2bd7366a1ab3fc1 Mon Sep 17 00:00:00 2001 From: cxt Date: Mon, 26 Sep 2016 15:07:25 +0800 Subject: [PATCH 035/154] =?UTF-8?q?=E6=88=91=E7=9A=84=E9=A2=98=E5=BA=93=20?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E4=B8=A4=E6=AC=A1=E5=90=8E=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 87dc127a0..792ba4690 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -625,7 +625,7 @@ class UsersController < ApplicationController visible_course_ids = visible_course.empty? ? "(-1)" : "(" + visible_course.map{|course| course.id}.join(",") + ")" @homeworks = HomeworkCommon.where("course_id in #{visible_course_ids} and publish_time <= '#{Date.today}'").order("#{@order} #{@b_sort}") end - @type = params[:type] + @type = params[:type] ? params[:type] : '1' @limit = 10 @is_remote = true @hw_count = @homeworks.count @@ -808,7 +808,7 @@ class UsersController < ApplicationController #@homeworks = @homeworks.where("homework_type = 3").reorder("#{@order} #{@b_sort}") end end - @type = params[:type] + @type = params[:type] ? params[:type] : '1' @property = params[:property] @is_import = params[:is_import] @limit = params[:is_import].to_i == 1 ? 15 : 10 From 3ace67f706ec671114fcc3aee5f3dfd089b0b881 Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 26 Sep 2016 16:17:21 +0800 Subject: [PATCH 036/154] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=BA=93=E5=BA=93?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=9F=E8=AE=A1=E5=AF=BC=E5=87=BAexcel?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 29 ---------- app/controllers/repositories_controller.rb | 16 +++++- app/helpers/application_helper.rb | 61 ++++++++++++++++++++++ app/views/repositories/show.html.erb | 7 +++ config/locales/projects/zh.yml | 11 ++++ config/routes.rb | 1 + 6 files changed, 95 insertions(+), 30 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 76808a392..14d5961cd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -686,35 +686,6 @@ class ApplicationController < ActionController::Base :content_type => 'application/atom+xml' end - # 项目列表导出Excel功能 - def issue_list_xls issues - xls_report = StringIO.new - book = Spreadsheet::Workbook.new - sheet1 = book.create_worksheet :name => "issues" - blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 - sheet1.row(0).default_format = blue - sheet1.row(0).concat([l(:issue_xls_id),l(:issue_xls_tracker_id),l(:issue_xls_title),l(:issue_xls_description),l(:issue_xls_status),l(:issue_xls_assign),l(:issue_xls_priority),l(:issue_xls_author),l(:issue_xls_created_at),l(:issue_xls_version),l(:issue_xls_start),l(:issue_xls_due),l(:issue_xls_ratio)]) - count_row = 1 - issues.each do |issue| - sheet1[count_row,0] = issue.id - sheet1[count_row,1] = issue_tracker_change(issue.tracker_id) - sheet1[count_row,2] = issue.subject - sheet1[count_row,3] = issue.description - sheet1[count_row,4] = issue_status_change(issue.status_id) - sheet1[count_row,5] = issue.assigned_to.try(:show_name) - sheet1[count_row,6] = issue_priority_change(issue.priority_id) - sheet1[count_row,7] = issue.author.show_name - sheet1[count_row,8] = issue.created_on - sheet1[count_row,9] = issue.fixed_version.try(:name) - sheet1[count_row,10] = issue.start_date - sheet1[count_row,11] = issue.due_date - sheet1[count_row,12] = issue_ratio_change(issue.done_ratio, issue.status_id) - count_row += 1 - end - book.write xls_report - xls_report.string - end - def issue_ratio_change done_ratio, status_id if done_ratio == 100 || status_id == 3 "已完成" diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index a79890870..5d9528f87 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -34,7 +34,7 @@ class RepositoriesController < ApplicationController before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo, :stats, :quality_analysis] before_filter :find_repository, :only => [:edit, :update, :destroy, :committers] - before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo, :to_gitlab, :forked, :project_archive] + before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo, :to_gitlab, :forked, :project_archive, :export_rep_static] before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive, :quality_analysis] # 链接gitlab @@ -69,6 +69,20 @@ class RepositoriesController < ApplicationController end + def export_rep_static + @project = Project.find(params[:id]) + gpid = @project.gpid + rev = params[:rev] + cycle = params[:cycle] + respond_to do |format| + format.html + format.xls{ + filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}_#{@rev}_#{l(:label_rep_xls)}.xls" + send_data(export_rep_xls(gpid, :rev => rev, :cycle => "1"), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) + } + end + end + def forked @project = Project.find(params[:id]) @repository = Repository.where("project_id =? and type =?", @project.id, "Repository::Gitlab") diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 92e96e84c..a204ac524 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -63,6 +63,67 @@ module ApplicationHelper result end + # 项目版本库导出Excel功能 + def export_rep_xls(gpid, options = {}) + g = Gitlab.client + cycle = params[:cycle] + rev = params[:rev] + # branch = g.branche(gpid, rev) + statics = g.rep_stats(gpid, :rev => rev) + + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + sheet1 = book.create_worksheet :name => "版本库" + blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 + sheet1.row(0).default_format = blue + sheet1.row(0).concat([l(:rep_branch),l(:rep_author),l(:rep_author_mail),l(:rep_code_add),l(:rep_code_delete),l(:rep_code_modified),l(:rep_sode_time),l(:rep_sode_cycle)]) + count_row = 1 + statics.each do |static| + user = User.where(:mail => static.email).first + sheet1[count_row,0] = rev + sheet1[count_row,1] = user.nil? ? static.uname : user.show_name + sheet1[count_row,2] = static.email + sheet1[count_row,3] = static.add + sheet1[count_row,4] = static.del + sheet1[count_row,5] = static.changes + sheet1[count_row,6] = Time.now + sheet1[count_row,7] = "1周" + count_row += 1 + end + + book.write xls_report + xls_report.string + end + + # 项目issue列表导出Excel功能 + def issue_list_xls issues + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + sheet1 = book.create_worksheet :name => "issues" + blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 + sheet1.row(0).default_format = blue + sheet1.row(0).concat([l(:issue_xls_id),l(:issue_xls_tracker_id),l(:issue_xls_title),l(:issue_xls_description),l(:issue_xls_status),l(:issue_xls_assign),l(:issue_xls_priority),l(:issue_xls_author),l(:issue_xls_created_at),l(:issue_xls_version),l(:issue_xls_start),l(:issue_xls_due),l(:issue_xls_ratio)]) + count_row = 1 + issues.each do |issue| + sheet1[count_row,0] = issue.id + sheet1[count_row,1] = issue_tracker_change(issue.tracker_id) + sheet1[count_row,2] = issue.subject + sheet1[count_row,3] = issue.description + sheet1[count_row,4] = issue_status_change(issue.status_id) + sheet1[count_row,5] = issue.assigned_to.try(:show_name) + sheet1[count_row,6] = issue_priority_change(issue.priority_id) + sheet1[count_row,7] = issue.author.show_name + sheet1[count_row,8] = issue.created_on + sheet1[count_row,9] = issue.fixed_version.try(:name) + sheet1[count_row,10] = issue.start_date + sheet1[count_row,11] = issue.due_date + sheet1[count_row,12] = issue_ratio_change(issue.done_ratio, issue.status_id) + count_row += 1 + end + book.write xls_report + xls_report.string + end + # 获取用户单位 # 优先获取高校信息,如果改信息不存在则获取occupation def get_occupation_from_user user diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index ec63a1c73..4403043ad 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -78,6 +78,13 @@ <% end %> 如何提交代码 +
    + <%= link_to "代码统计:导出excel", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev } %>
    + +
    + + <%#= link_to "导出excel", {:controller => 'repositories', :action => 'export_rep_static', :rev => @rev}, :format => 'xls' %> + <%# content_for :header_tags do %> <%#= stylesheet_link_tag "scm" %> diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 374d31ab4..a22bceeef 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -200,6 +200,8 @@ zh: label_issue_new: 新建问题 label_query: 自定义查询 label_issue_list_xls: Issue列表 + label_rep_xls: 版本库代码统计 + label_rep_branch: 分支 # Issue列表 excel导出参数 issue_xls_id: ID @@ -216,6 +218,15 @@ zh: issue_xls_due: 截止时间 issue_xls_ratio: 完成度 + # 版本库excel导出 + rep_branch: 分支 + rep_author: 作者 + rep_author_mail: 邮箱 + rep_code_add: 添加行数 + rep_code_delete: 删除代码 + rep_code_modified: 总行数 + rep_sode_time: 导出时间 + rep_sode_cycle: 周期 # 自定义查询 label_query_plural: 自定义查询 diff --git a/config/routes.rb b/config/routes.rb index afe30d4de..43ca44ac5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -982,6 +982,7 @@ RedmineApp::Application.routes.draw do get 'projects/:id/repository/changes(/*path(.:ext))', :to => 'repositories#changes' get 'projects/:id/repository/forked', :to => 'repositories#forked' + get 'projects/:id/repository/export_rep_static', :to => 'repositories#export_rep_static' get 'projects/:id/repository/project_archive', :to => 'repositories#project_archive', :as => 'project_archive' get 'projects/:id/repository/revisions', :to => 'repositories#revisions' get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision' From 0ec1ecc2bfc059623eb7ef9889948bf038bc0950 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 26 Sep 2016 16:22:14 +0800 Subject: [PATCH 037/154] =?UTF-8?q?issue=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/issues_controller.rb | 16 +++++++++++++++- app/helpers/queries_helper.rb | 6 +++--- app/views/issues/index.html.erb | 24 ++++++++++++++++++------ public/stylesheets/css/project.css | 2 +- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 4ab9bf841..3ac0aa166 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -84,10 +84,24 @@ class IssuesController < ApplicationController @done_ratio = params[:done_ratio] @fixed_version_id = params[:fixed_version_id] @issue_count = @query.issue_count + @test = params[:test] # @issue_pages = Paginator.new @issue_count, @limit, params['page'] # params[:page] = (params[:page] || 1).to_i + 1 #页码需要加1 # @offset ||= @issue_pages.offset - @issues_filter = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], :order => 'issues.updated_on desc') + @project_sort = 'issues.updated_on desc' + if params[:test] != "0" + case @test + when "1" + @project_sort = 'issues.created_on desc' + when "2" + @project_sort = 'issues.created_on asc' + when "3" + @project_sort = 'issues.updated_on desc' + when "4" + @project_sort = 'issues.updated_on asc' + end + end + @issues_filter = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], :order => @project_sort) @limit = 10 @is_remote = true @issue_pages = Paginator.new @issue_count, @limit, params['page'] || 1 diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 7677528aa..51af6adb6 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -255,17 +255,17 @@ module QueriesHelper # Give it a name, required to be valid @query = IssueQuery.new(:name => "_") @query.project = @project - params[:f] = %w(subject tracker_id status_id done_ratio assigned_to_id fixed_version_id created_on) unless params[:status_id].nil? + params[:f] = %w(subject tracker_id status_id done_ratio author_id assigned_to_id fixed_version_id created_on) unless params[:status_id].nil? params[:op] = {'subject' => "~" , 'status_id' => ( params[:status_id] == '0' ? "!":"=" ), - + 'author_id' =>(params[:author_id] == '0' ? "!":"=" ), 'done_ratio' => ( params[:done_ratio] == '0' ? "!":"=" ), 'tracker_id' => ( params[:tracker_id] == '0' ? "!":"=" ), 'fixed_version_id' => ( params[:fixed_version_id] == '0' ? "!":"=" ), 'assigned_to_id' => ( params[:assigned_to_id] == '0' ? "!":"=" )} unless params[:status_id].nil? params[:v] = {'subject' => [params[:subject]], 'status_id' => [params[:status_id]], - + 'author_id' => [params[:author_id]], 'done_ratio' => [params[:done_ratio]], 'tracker_id' => [params[:tracker_id]], 'fixed_version_id' => [params[:fixed_version_id]], diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 046595128..15599f114 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -11,9 +11,9 @@ //如果有N个标签,就将i<=N; for(var i=1;i<=3;i++){ g('issues_list_nav_'+i).className='issues_nav_nomal'; - g('issues_list_content_'+i).className='undis'; + } - g('issues_list_content_'+n).className='dis'; + g('issues_list_nav_'+n).className='issues_nav_hover'; } $(function(){ @@ -78,6 +78,8 @@ function all_reset_form() { $("#issue_query_form")[0].reset(); + $("select[id='author_id']").val(''); + $("select[id='assigned_to_id']").val(''); remote_function(); } @@ -103,7 +105,7 @@ - 清除 + 清除
    @@ -121,7 +123,7 @@
      -
    • +
    • 所有<%= @project.project_score.issue_num %>
    • @@ -147,7 +149,7 @@ %> <%= select(:issue, :fixed_version, options_for_version_isuue_list(@project), {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, - {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "f1"}) %> + {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "fl"}) %> <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), { :include_blank => false,:selected=>@status_id ? @status_id : 0 @@ -170,10 +172,20 @@ {:onchange=>"remote_function();",:id=>"done_ratio",:name=>"done_ratio",:class=>"fl"}) %> - <%= select(:issue, :test, [["最新创建",1],["最早创建",2],["最近更新",3],["最早更新", 4]].unshift(["排序",0]), + <%#= select(:issue, :test, [["最新创建",1],["最早创建",2],["最近更新",3],["最早更新", 4]].unshift(["排序",0]), {:include_blank => false, :selected => @order ? @order : 0 }, {:onchange => "remote_function();", :id => "test", :name => "test", :class => "fr issues_filter_select_min"}) %> + <%= select(:issue, :test, [["最新创建",1],["最早创建",2],["最近更新",3],["最早更新", 4]].unshift(["排序",0]), + {:include_blank => false, :selected => @test ? @test : 0 }, + {:onchange => "remote_function();", :id => "test", :name => "test", :class => "fr issues_filter_select_min"}) %> + + <%= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), + { :include_blank => false,:selected=>@author_id ? @author_id : 0}, + {:onchange=>"remote_function();",:id=>"author_id",:name=>"author_id",:style=>"display:none;"} + ) + %> + <%#= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), { :include_blank => false,:selected=>@author_id ? @author_id : 0 }, diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index 38f306358..254e9a4c1 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -819,7 +819,7 @@ a:hover.issues_list_title{color:#3b94d6;} .issues_list_titlebox span{ font-size: 12px;color: #888; font-weight: normal; } .issues_ciricons_01{ width: 22px; height: 22px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 0 no-repeat;} .issues_ciricons_02{ width: 22px; height: 22px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 -30px no-repeat;} -.issues_icons_mes{width: 17px; height: 19px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 -54px no-repeat; } +.issues_icons_mes{width: 17px; height: 19px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 -56px no-repeat; } .issues_list_name{ font-size: 12px;} .issues_list_name:hover{ color: #3b94d6;} .issues_list_small{ font-size: 12px; color: #666;} From 5531a236fa164caa75cb2e086f3731daaf6a2f79 Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 26 Sep 2016 21:02:12 +0800 Subject: [PATCH 038/154] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/issues_controller.rb | 2 ++ app/views/issues/_issue_filter.html.erb | 1 + app/views/issues/_issue_filter_author.html.erb | 1 + app/views/issues/index.html.erb | 16 ++++++++++++---- app/views/issues/index.js.erb | 2 ++ 5 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 app/views/issues/_issue_filter.html.erb create mode 100644 app/views/issues/_issue_filter_author.html.erb diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 3ac0aa166..38cc93fe3 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -101,6 +101,8 @@ class IssuesController < ApplicationController @project_sort = 'issues.updated_on asc' end end + @issues_filter_assign_count = @query.issues.select{|issue| issue.assigned_to_id == User.current.id }.count + @issues_filter_author_count = @query.issues.select{|issue| issue.author_id == User.current.id }.count @issues_filter = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], :order => @project_sort) @limit = 10 @is_remote = true diff --git a/app/views/issues/_issue_filter.html.erb b/app/views/issues/_issue_filter.html.erb new file mode 100644 index 000000000..07ebb047f --- /dev/null +++ b/app/views/issues/_issue_filter.html.erb @@ -0,0 +1 @@ +<%= @issues_filter_assign_count %> \ No newline at end of file diff --git a/app/views/issues/_issue_filter_author.html.erb b/app/views/issues/_issue_filter_author.html.erb new file mode 100644 index 000000000..8b9bed9f9 --- /dev/null +++ b/app/views/issues/_issue_filter_author.html.erb @@ -0,0 +1 @@ +<%= @issues_filter_author_count %><%#= @project.issues.where(:author_id => User.current.id ).visible.all.count %> \ No newline at end of file diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 15599f114..b292d07cc 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -91,8 +91,8 @@ 导出EXCEL @@ -127,13 +127,21 @@ 所有<%= @project.project_score.issue_num %>
    • - 指派给我<%= @project.issues.where(:assigned_to_id => User.current.id ).visible.all.count %> + 指派给我 + <%= render :partial => "issues/issue_filter" %> +
    • - 我的发布<%= @project.issues.where(:author_id => User.current.id ).visible.all.count %> + 我的发布 + <%= render :partial => "issues/issue_filter_author" %> +
    • + +
    + +
    diff --git a/app/views/issues/index.js.erb b/app/views/issues/index.js.erb index 0b4130ea7..731145eca 100644 --- a/app/views/issues/index.js.erb +++ b/app/views/issues/index.js.erb @@ -1,4 +1,6 @@ //$("#issue_list").html("<%#= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count})%>"); +$("#issue_assigned_count").html("<%= escape_javascript(render :partial => 'issues/issue_filter') %>"); +$("#issue_author_count").html("<%= escape_javascript(render :partial => 'issues/issue_filter_author') %>"); $("#issue_list").html("<%= escape_javascript(render :partial => 'issues/all_list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); $("#issue_list_pagination").html('<%= pagination_links_full @issue_pages, @issue_count, :issues => @issues, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>'); From 9620603f17045b94da5e7c6df72022c528e6a6f8 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 26 Sep 2016 21:19:10 +0800 Subject: [PATCH 039/154] =?UTF-8?q?issue=E6=9D=A1=E4=BB=B6=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/queries_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 51af6adb6..f058a75ec 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -259,7 +259,7 @@ module QueriesHelper params[:op] = {'subject' => "~" , 'status_id' => ( params[:status_id] == '0' ? "!":"=" ), 'author_id' =>(params[:author_id] == '0' ? "!":"=" ), - 'done_ratio' => ( params[:done_ratio] == '0' ? "!":"=" ), + 'done_ratio' => ( params[:done_ratio]), 'tracker_id' => ( params[:tracker_id] == '0' ? "!":"=" ), 'fixed_version_id' => ( params[:fixed_version_id] == '0' ? "!":"=" ), 'assigned_to_id' => ( params[:assigned_to_id] == '0' ? "!":"=" )} unless params[:status_id].nil? From 5afaeeb76dce7eb7362725996025ff44d3be5971 Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 26 Sep 2016 21:54:05 +0800 Subject: [PATCH 040/154] =?UTF-8?q?issue=E5=88=97=E8=A1=A8=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=B8=8D=E5=87=86=E7=A1=AE=E6=80=A7=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/queries_helper.rb | 2 +- app/views/issues/index.html.erb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index f058a75ec..5cc72a82d 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -259,7 +259,7 @@ module QueriesHelper params[:op] = {'subject' => "~" , 'status_id' => ( params[:status_id] == '0' ? "!":"=" ), 'author_id' =>(params[:author_id] == '0' ? "!":"=" ), - 'done_ratio' => ( params[:done_ratio]), + 'done_ratio' => ( params[:done_ratio]== '-1' ? "!":"="), 'tracker_id' => ( params[:tracker_id] == '0' ? "!":"=" ), 'fixed_version_id' => ( params[:fixed_version_id] == '0' ? "!":"=" ), 'assigned_to_id' => ( params[:assigned_to_id] == '0' ? "!":"=" )} unless params[:status_id].nil? diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index b292d07cc..fee3ae1d7 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -175,8 +175,8 @@ <%#= select(:issue, :done_ratio, [["10%",1],["20%",2],["30%",3],["40%",4],["50%",5],["60%",6],["70%",7],["80%",8],["90%",9],["100%",10]].unshift(["完成度",0]), {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0 }, {:onchange => "remote_function();", :id => "done_ratio", :name => "done_ratio", :class => "f1"}) %> - <%= select( :issue,:done_ratio, ((1..10).to_a.collect { |r| ["#{r*10} %", r*10] }).unshift(["完成度",0]), - {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0}, + <%= select( :issue,:done_ratio, ((0..10).to_a.collect { |r| ["#{r*10} %", r*10] }).unshift(["完成度",-1]), + {:include_blank => false, :selected => @done_ratio ? @done_ratio : -1}, {:onchange=>"remote_function();",:id=>"done_ratio",:name=>"done_ratio",:class=>"fl"}) %> From 433f42edbf5b57d89603484a434a9316d693def9 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 26 Sep 2016 21:58:59 +0800 Subject: [PATCH 041/154] . --- app/helpers/queries_helper.rb | 2 +- app/views/issues/index.html.erb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index f058a75ec..2459c2921 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -259,7 +259,7 @@ module QueriesHelper params[:op] = {'subject' => "~" , 'status_id' => ( params[:status_id] == '0' ? "!":"=" ), 'author_id' =>(params[:author_id] == '0' ? "!":"=" ), - 'done_ratio' => ( params[:done_ratio]), + 'done_ratio' => ( params[:done_ratio] == '-1' ? "!" : "="), 'tracker_id' => ( params[:tracker_id] == '0' ? "!":"=" ), 'fixed_version_id' => ( params[:fixed_version_id] == '0' ? "!":"=" ), 'assigned_to_id' => ( params[:assigned_to_id] == '0' ? "!":"=" )} unless params[:status_id].nil? diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index b292d07cc..469a3a843 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -175,8 +175,8 @@ <%#= select(:issue, :done_ratio, [["10%",1],["20%",2],["30%",3],["40%",4],["50%",5],["60%",6],["70%",7],["80%",8],["90%",9],["100%",10]].unshift(["完成度",0]), {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0 }, {:onchange => "remote_function();", :id => "done_ratio", :name => "done_ratio", :class => "f1"}) %> - <%= select( :issue,:done_ratio, ((1..10).to_a.collect { |r| ["#{r*10} %", r*10] }).unshift(["完成度",0]), - {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0}, + <%= select( :issue,:done_ratio, ((0..10).to_a.collect { |r| ["#{r*10} %", r*10] }).unshift(["完成度",-1]), + {:include_blank => false, :selected => @done_ratio ? @done_ratio : -1}, {:onchange=>"remote_function();",:id=>"done_ratio",:name=>"done_ratio",:class=>"fl"}) %> @@ -249,4 +249,4 @@
    -
    \ No newline at end of file +
    From e7344b6540da7ba05d9aa37f8eea283cf25d9bca Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 09:13:40 +0800 Subject: [PATCH 042/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=95=B0=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_base_project_top.html.erb | 3 ++- app/views/layouts/base_projects.html.erb | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_base_project_top.html.erb b/app/views/layouts/_base_project_top.html.erb index 820a004de..3b4cfa6e3 100644 --- a/app/views/layouts/_base_project_top.html.erb +++ b/app/views/layouts/_base_project_top.html.erb @@ -11,7 +11,8 @@ <% end %> - + <%# 更新访问数,刷新的时候更新访问次数 %> + <% update_visiti_count @project %>

    <%= l(:label_project_ivite_code)%>
    <%= (User.current.member_of?(@project) || User.current.admin?) ? @project.invite_code : "******" %>

    diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb index 969db6961..b0de79d7c 100644 --- a/app/views/layouts/base_projects.html.erb +++ b/app/views/layouts/base_projects.html.erb @@ -49,8 +49,7 @@
    <%= render :partial => 'layouts/base_project_top' %>
    - <%# 更新访问数,刷新的时候更新访问次数 %> - <% update_visiti_count @project %> +
    <%= score.nil? ? "--" : format("%.1f",score<0 ? 0 : score)%> <% unless score.nil?%> -
    +
    作品最终评分为 -  <%= student_work.final_score%> 分。 +  <%= student_work.final_score%> 
    迟交扣分   <%= student_work.homework_common && student_work.homework_common.teacher_priority == 1 && student_work.teacher_score ? 0 : student_work.late_penalty %> -  分, +  分
    缺评扣分   <%= student_work.homework_common && student_work.homework_common.teacher_priority == 1 && student_work.teacher_score ? 0 : student_work.absence_penalty%> -  分, +  分
    最终成绩为 -  <%= format("%.1f",score<0 ? 0 : score)%> 分。 +  <%= format("%.1f",score<0 ? 0 : score)%> 
    <% end%>
    -<% other_formats_links do |f| %> - <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %> - <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %> -<% end %> + <% end # query.valid? %> <% content_for :sidebar do %> From d2d0c263d7b3092fc4766234b7aa9f966e7f9477 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 27 Sep 2016 12:08:03 +0800 Subject: [PATCH 056/154] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AEiss?= =?UTF-8?q?ue=E5=AF=BC=E5=87=BAexcel=E7=9A=84=E6=97=B6=E9=97=B4=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E6=A0=BC=E5=BC=8F=E5=8F=8A=E7=9B=AE=E6=A0=87=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/application_helper.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 95125cd11..8563f6f02 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -102,7 +102,7 @@ module ApplicationHelper sheet1 = book.create_worksheet :name => "issues" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue - sheet1.row(0).concat([l(:issue_xls_id),l(:issue_xls_tracker_id),l(:issue_xls_title),l(:issue_xls_description),l(:issue_xls_status),l(:issue_xls_assign),l(:issue_xls_priority),l(:issue_xls_author),l(:issue_xls_created_at),l(:issue_xls_version),l(:issue_xls_start),l(:issue_xls_due),l(:issue_xls_ratio)]) + sheet1.row(0).concat([l(:issue_xls_id),l(:issue_xls_tracker_id),l(:issue_xls_title),l(:issue_xls_description),l(:issue_xls_status),l(:issue_xls_assign),l(:issue_xls_priority),l(:issue_xls_author),l(:issue_xls_created_at),l(:milestone),l(:issue_xls_start),l(:issue_xls_due),l(:issue_xls_ratio)]) count_row = 1 issues.each do |issue| sheet1[count_row,0] = issue.id @@ -113,10 +113,10 @@ module ApplicationHelper sheet1[count_row,5] = issue.assigned_to.try(:show_name) sheet1[count_row,6] = issue_priority_change(issue.priority_id) sheet1[count_row,7] = issue.author.show_name - sheet1[count_row,8] = issue.created_on + sheet1[count_row,8] = issue.created_on.nil? ? issue.created_on : issue.created_on.strftime('%Y-%m-%d %H:%M:%S') sheet1[count_row,9] = issue.fixed_version.try(:name) - sheet1[count_row,10] = issue.start_date - sheet1[count_row,11] = issue.due_date + sheet1[count_row,10] = issue.start_date.nil? ? issue.start_date : issue.start_date.strftime('%Y-%m-%d') + sheet1[count_row,11] = issue.due_date.nil? ? issue.due_date : issue.due_date.strftime('%Y-%m-%d') sheet1[count_row,12] = issue_ratio_change(issue.done_ratio, issue.status_id) count_row += 1 end From 405f4e0a20da1aaf2706940cf10a647aa773d33e Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 13:36:04 +0800 Subject: [PATCH 057/154] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=8E=89=E7=94=98?= =?UTF-8?q?=E7=89=B9=E5=9B=BE=E7=9A=84=E6=94=BE=E5=A4=A7=E7=BC=A9=E5=B0=8F?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/gantts/show.html.erb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/gantts/show.html.erb b/app/views/gantts/show.html.erb index 4581199ce..759f8c232 100644 --- a/app/views/gantts/show.html.erb +++ b/app/views/gantts/show.html.erb @@ -48,10 +48,10 @@ -

    - <%= gantt_zoom_link(@gantt, :in) %> - <%= gantt_zoom_link(@gantt, :out) %> -

    + + + +

    <%= text_field_tag 'months', @gantt.months, :size => 2 %> @@ -99,9 +99,9 @@ t_height = g_height + headers_height %> -<% if @gantt.truncated %> -

    <%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %>

    -<% end %> +<%# if @gantt.truncated %> + +<%# end %> From e7bfc9ee60d3a19839bee0f027a8035b495a73a4 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 13:37:34 +0800 Subject: [PATCH 058/154] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=BA=93=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/repositories/show.html.erb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 4447e45a0..21db53a31 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -79,8 +79,9 @@ 如何提交代码
    - <%= link_to "代码统计:导出excel", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev } %>
    - + 导出统计结果: + <%= link_to "当前一周", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev, :cycle => "week" } %> | + <%= link_to "当前一月", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev, :cycle => "month" } %>
    <%#= link_to "导出excel", {:controller => 'repositories', :action => 'export_rep_static', :rev => @rev}, :format => 'xls' %> @@ -94,4 +95,4 @@ + From edd03d05d04f130c6aab46c786299d9fac6bca51 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 27 Sep 2016 14:03:26 +0800 Subject: [PATCH 059/154] =?UTF-8?q?=E6=97=A5=E5=8E=86=E4=B8=ADissue?= =?UTF-8?q?=E5=8F=B7=E4=B8=8E=E5=AE=8C=E6=88=90=E5=BA=A6=E8=B6=85=E5=87=BA?= =?UTF-8?q?=E8=BE=B9=E6=A1=86=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/issues_helper.rb | 4 ++-- app/views/calendars/show.html.erb | 6 ------ app/views/common/_calendar.html.erb | 7 +++---- public/stylesheets/css/project.css | 2 +- 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 0ab09802f..7aec64718 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -60,9 +60,9 @@ module IssuesHelper def states_done_ratio(issue) done_ratio = issue.done_ratio if done_ratio == 100 - "#{l(:label_done_ratio_endding)}".html_safe + "#{l(:label_done_ratio_endding)}".html_safe else - "#{l(:label_done_ratio_doing)}".html_safe + "#{l(:label_done_ratio_doing)}".html_safe end end diff --git a/app/views/calendars/show.html.erb b/app/views/calendars/show.html.erb index 26ad8501c..05ce3bcac 100644 --- a/app/views/calendars/show.html.erb +++ b/app/views/calendars/show.html.erb @@ -5,12 +5,6 @@ <%= form_tag({:controller => 'calendars', :action => 'show', :project_id => @project}, :method => :get, :id => 'query_form') do %> <%= hidden_field_tag 'set_filter', '1' %> -
    "> - <%= l(:label_filter_plural) %> -
    "> - <%= render :partial => 'queries/filters', :locals => {:query => @query} %> -
    -

    <%= link_to_previous_month(@year, @month) %> | <%= link_to_next_month(@year, @month) %>

    diff --git a/app/views/common/_calendar.html.erb b/app/views/common/_calendar.html.erb index b2aad3812..2f4c61a77 100644 --- a/app/views/common/_calendar.html.erb +++ b/app/views/common/_calendar.html.erb @@ -24,10 +24,9 @@ <%= render_issue_tooltip i %> <% else %> - - <%= h("#{i.project} -") unless @project && @project == i.project %> - <%= link_to_version i%> - + + <%= h("#{i.project} -") unless @project && @project == i.project %> + <%= link_to_version i%> <% end %> <% end %> diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index 4a2ec5683..bfa85c5bd 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -167,7 +167,7 @@ div.thumbnails div {background:#fff;display:inline-block;margin-right:2px;} /* 里程碑 */ .roadmap_box{ background:#f8f8f8; width:648px; padding:10px; margin-top:5px; border:1px solid #ddd; color:#555;} .progress{ width:648px; height:20px; margin-bottom:5px; background:#e9e9e9;} -.closed{ background:#bae0ba; height:20px;} +.closed{ background:#bae0ba;} .done{ background:#d3edd3; display:block;height:20px;float:left;} .roadmap_box{ margin-bottom:10px;} .roadmap_list_ul{border:1px solid #ddd; border-bottom:none; margin-bottom:10px;} From a020ab8cd361e6061560f81773bdc0292ad100fe Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 27 Sep 2016 14:27:32 +0800 Subject: [PATCH 060/154] =?UTF-8?q?Issue=E5=AF=BC=E5=87=BAexcel=E5=B8=A6ht?= =?UTF-8?q?ml=E6=A0=87=E7=AD=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/application_helper.rb | 2 +- app/views/issues/index.html.erb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8563f6f02..573a7ba1f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -108,7 +108,7 @@ module ApplicationHelper sheet1[count_row,0] = issue.id sheet1[count_row,1] = issue_tracker_change(issue.tracker_id) sheet1[count_row,2] = issue.subject - sheet1[count_row,3] = issue.description + sheet1[count_row,3] = (issue.description.gsub(/<\/?.*?>/,"")).html_safe sheet1[count_row,4] = issue_status_change(issue.status_id) sheet1[count_row,5] = issue.assigned_to.try(:show_name) sheet1[count_row,6] = issue_priority_change(issue.priority_id) diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 8552a65b2..271fb16c6 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -60,9 +60,10 @@ function switch_assign_to(assign) { var assign = "option[value =" + assign + "]"; $("#issues_type_2").click(function(){ - $("select[id='author_id']").val(''); + }); $("select[id='assigned_to_id']").find(assign).attr("selected", "selected"); + $("select[id='author_id']").val(''); remote_function(); } From 70d58ea28eb3f72ca2e6aca727d9b66c7ff8dbfb Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 15:10:52 +0800 Subject: [PATCH 061/154] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=BA=93=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E4=BB=A3=E7=A0=81=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/repositories_controller.rb | 2 +- app/helpers/application_helper.rb | 18 ++++++++++-------- app/views/repositories/show.html.erb | 4 ++-- config/locales/projects/zh.yml | 3 ++- .../lib/gitlab/client/repositories.rb | 10 ++++++++++ 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 5d9528f87..d4042abf5 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -77,7 +77,7 @@ class RepositoriesController < ApplicationController respond_to do |format| format.html format.xls{ - filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}_#{@rev}_#{l(:label_rep_xls)}.xls" + filename = "#{@project.name.to_s}_#{l(:label_rep_xls)}.xls" send_data(export_rep_xls(gpid, :rev => rev, :cycle => "1"), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) } end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8563f6f02..7ade73751 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -68,29 +68,31 @@ module ApplicationHelper g = Gitlab.client cycle = params[:cycle] rev = params[:rev] - # branch = g.branche(gpid, rev) - statics = g.rep_stats(gpid, :rev => rev) - + if cycle == "week" + statics = g.rep_stats_week(gpid, :rev => rev) + elsif cycle == "month" + statics = g.rep_stats_month(gpid, :rev => rev) + end xls_report = StringIO.new book = Spreadsheet::Workbook.new sheet1 = book.create_worksheet :name => "版本库" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue - sheet1.row(0).concat([l(:rep_branch),l(:rep_author),l(:rep_author_mail),l(:rep_code_add),l(:rep_code_delete),l(:rep_code_modified),l(:rep_sode_time),l(:rep_sode_cycle)]) + sheet1.row(0).concat([l(:rep_branch),l(:rep_author),l(:rep_changeset),l(:rep_code_add),l(:rep_code_delete),l(:rep_code_modified),l(:rep_sode_time),l(:rep_sode_cycle),l(:rep_author_mail)]) count_row = 1 statics.each do |static| user = User.where(:mail => static.email).first sheet1[count_row,0] = rev sheet1[count_row,1] = user.nil? ? static.uname : user.show_name - sheet1[count_row,2] = static.email + sheet1[count_row,2] = static.commits_num sheet1[count_row,3] = static.add sheet1[count_row,4] = static.del sheet1[count_row,5] = static.changes - sheet1[count_row,6] = Time.now - sheet1[count_row,7] = "1周" + sheet1[count_row,6] = Time.now.strftime('%Y-%m-%d %H:%M:%S') + sheet1[count_row,7] = cycle == "week" ? "最近1周" : "最近一月" + sheet1[count_row,8] = static.email count_row += 1 end - book.write xls_report xls_report.string end diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 21db53a31..b12302e6e 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -80,8 +80,8 @@ 如何提交代码
    导出统计结果: - <%= link_to "当前一周", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev, :cycle => "week" } %> | - <%= link_to "当前一月", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev, :cycle => "month" } %> + <%= link_to "最近一周", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev, :cycle => "week" } %> | + <%= link_to "最近一月", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev, :cycle => "month" } %>
    <%#= link_to "导出excel", {:controller => 'repositories', :action => 'export_rep_static', :rev => @rev}, :format => 'xls' %> diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 1d44cffba..98e13a865 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -222,11 +222,12 @@ zh: rep_branch: 分支 rep_author: 作者 rep_author_mail: 邮箱 + rep_changeset: 提交次数 rep_code_add: 添加行数 rep_code_delete: 删除代码 rep_code_modified: 总行数 rep_sode_time: 导出时间 - rep_sode_cycle: 周期 + rep_sode_cycle: 时间区间 # 自定义查询 label_query_plural: 自定义查询 diff --git a/lib/gitlab-cli/lib/gitlab/client/repositories.rb b/lib/gitlab-cli/lib/gitlab/client/repositories.rb index 80d1058b5..daed2ee16 100644 --- a/lib/gitlab-cli/lib/gitlab/client/repositories.rb +++ b/lib/gitlab-cli/lib/gitlab/client/repositories.rb @@ -117,6 +117,16 @@ class Gitlab::Client end alias_method :repo_rep_stats, :rep_stats + def rep_stats_week(project, options={}) + get("/projects/#{project}/repository/rep_stats_week", :query => options) + end + alias_method :repo_rep_stats, :rep_stats + + def rep_stats_month(project, options={}) + get("/projects/#{project}/repository/rep_stats_month", :query => options) + end + alias_method :repo_rep_stats, :rep_stats + def rep_user_stats(project, options={}) get("/projects/#{project}/repository/rep_user_stats", :query => options) end From a87e95d0a9b4ea548b4335a1c66382241a22d80c Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 27 Sep 2016 15:19:04 +0800 Subject: [PATCH 062/154] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E7=95=99=E8=A8=80?= =?UTF-8?q?=EF=BC=8C=E9=A1=B9=E7=9B=AE=E7=94=A8=E6=88=B7=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/_courses_jours.html.erb | 2 +- app/views/courses/_history.html.erb | 2 +- app/views/courses/feedback.html.erb | 2 +- app/views/words/_journal_reply_items.html.erb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/courses/_courses_jours.html.erb b/app/views/courses/_courses_jours.html.erb index 0aefb0d18..3d679e591 100644 --- a/app/views/courses/_courses_jours.html.erb +++ b/app/views/courses/_courses_jours.html.erb @@ -19,7 +19,7 @@ -
    +

    <%= l(:label_leave_message) %>

    <% if !User.current.logged?%> diff --git a/app/views/courses/_history.html.erb b/app/views/courses/_history.html.erb index 35e0726a8..eb7ecff7a 100644 --- a/app/views/courses/_history.html.erb +++ b/app/views/courses/_history.html.erb @@ -5,7 +5,7 @@
    <%= link_to image_tag(url_to_avatar(journal.user),:width => '46',:height => '46'), user_path(journal.user) %>
    -
    +
    diff --git a/app/views/courses/feedback.html.erb b/app/views/courses/feedback.html.erb index 5eae03656..3b2d3030c 100644 --- a/app/views/courses/feedback.html.erb +++ b/app/views/courses/feedback.html.erb @@ -2,7 +2,7 @@
    -
    +

    <%= l(:label_contest_userresponse) %>

    diff --git a/app/views/words/_journal_reply_items.html.erb b/app/views/words/_journal_reply_items.html.erb index a568152b3..cdfee3e9f 100644 --- a/app/views/words/_journal_reply_items.html.erb +++ b/app/views/words/_journal_reply_items.html.erb @@ -11,7 +11,7 @@ <%= image_tag url_to_avatar(nil),:width => '30',:height => '30' %> <% end %>
    -
    +
    <% id = 'project_respond_form_'+ reply.id.to_s %> <%= link_to reply.user.show_name, user_path(reply.user) %> <%= l(:label_reply_to)%> From 8fb440c59309d267b76f2ee0be3dc49857aecc6c Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 27 Sep 2016 17:01:04 +0800 Subject: [PATCH 063/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AEissue=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/_project_issue.html.erb | 11 ++++++++-- app/views/issues/index.html.erb | 26 +++++++++++++++--------- public/stylesheets/css/project.css | 5 +++-- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/app/views/issues/_project_issue.html.erb b/app/views/issues/_project_issue.html.erb index 4f1f6c097..cf04baa14 100644 --- a/app/views/issues/_project_issue.html.erb +++ b/app/views/issues/_project_issue.html.erb @@ -40,6 +40,13 @@ 周报 <% end %> +
  • <% unless activity.assigned_to_id.nil? %> <% if activity.try(:assigned_to).try(:realname).empty? %> @@ -48,8 +55,8 @@ <%= link_to activity.try(:assigned_to).try(:realname), user_path(activity.assigned_to_id), :class => "c_grey" %> <% end %> <% end %>
  • -
  • <%= activity.fixed_version %>
  • -
  • <%= activity.status.name%>
  • +
  • <%= activity.fixed_version %>
  • +
  • <%= activity.status.name%>
  • <%= activity.done_ratio %>%
  • <%= link_to "", issue_path(activity.id, :edit => 'true'), :class => 'sy_icons_edit fl mt15', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 271fb16c6..256ea3378 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -4,7 +4,7 @@ + diff --git a/app/views/projects/watcherlist.html.erb b/app/views/projects/watcherlist.html.erb index 76e7c9d04..180cd22b0 100644 --- a/app/views/projects/watcherlist.html.erb +++ b/app/views/projects/watcherlist.html.erb @@ -1,7 +1,7 @@ -
    +

    <%= l(:label_user_watcher)%>

    -
    +
    加入时间
    @@ -23,4 +23,8 @@
    -<% html_title(l(:label_followers)) -%> \ No newline at end of file +<% html_title(l(:label_followers)) -%> + + \ No newline at end of file diff --git a/public/stylesheets/css/public.css b/public/stylesheets/css/public.css index d4cce2679..4937bd883 100644 --- a/public/stylesheets/css/public.css +++ b/public/stylesheets/css/public.css @@ -722,6 +722,7 @@ a.wzan_visited{background:url(../images/pic_zan.png) 0 0 no-repeat;} /* 学生列表*/ .st_list{ width:670px;} +.st_list2{ width:730px;} .st_search{ } .st_search span{ font-size:14px; font-weight:bold; color:#606060; margin-right:35px;} .st_search_input{ border:1px solid #1c9ec7; background:#fff; height:20px; color:#c4c4c4; width:220px; padding-left:5px; margin-bottom:5px;} From 7ef7c0c6f0cf34e179472f065284a45dc8b55fa6 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 19:41:10 +0800 Subject: [PATCH 067/154] =?UTF-8?q?issue=E8=BF=87=E6=BB=A4=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/index.html.erb | 38 ++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index d1bde712e..73decbf95 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -44,12 +44,30 @@ // }); } - function remote_function_export() { - $("#export_issue_hidden").attr("value","1"); -// $("#issue_query_form").attr("format","xls"); - $("#issue_query_form").submit(); + function remote_function_export(project_id) { +// $("#export_issue_hidden").attr("value","1"); +// $("#issue_query_form").attr("set_filter","1"); +// $("#issue_query_form").attr("action","/projects/"+project_id+"/issues.xls"); +// $("#issue_query_form").submit(); +// $("#issue_query_form").attr("action","/projects/"+project_id+"/issues"); // $("#issue_query_form").removeAttr("format"); - $("#export_issue_hidden").attr("value","0"); +// $("#issue_query_form").attr("set_filter","0"); +// $("#export_issue_hidden").attr("value","0"); + + var tracker_id = $("#tracker_id").attr("value"); + var subject = $("#v_subject").attr("value"); + var assigned_to_id = $("#assigned_to_id").attr("value"); + var fixed_version_id = $("#fixed_version_id").attr("value"); + var status_id = $("#status_id").attr("value"); + var done_ratio = $("#done_ratio").attr("value"); + var test = $("#test").attr("value"); + var author_id = $("#author_id").attr("value"); + var issue_create_date_start = $("#issue_date_start_issue_export").attr("value"); + var issue_create_date_end = $("#issue_date_end_issue_export").attr("value"); + $("#sendexcel").attr("href","/projects/"+project_id+"/issues.xls?export=true&set_filter=1&tracker_id="+tracker_id+"&assigned_to_id="+assigned_to_id+"&fixed_version_id="+fixed_version_id+"&status_id="+status_id+"&done_ratio="+done_ratio+"&test="+test+"&author_id="+author_id+"&subject="+subject+"&issue_create_date_start="+issue_create_date_start+"&issue_create_date_end="+issue_create_date_end); + ///projects/1811/issues.xls?export=true&set_filter=1 + + } // function nh_reset_form() { @@ -106,11 +124,11 @@
  • 关闭<%#= @issues_filter_author_count %><%= @project.issues.where(:status_id => 5 ).visible.all.count %>
  • - - " class="hw_btn_blue fr" alt="导出EXCEL" onclick="remote_function_export()">导出EXCEL + + " id="sendexcel" class="hw_btn_blue fr" alt="导出EXCEL" onclick="remote_function_export('<%= @project.id %>')">导出EXCEL
    <% unless @project.enabled_modules.where("name = 'issue_tracking'").empty? %> - <%= form_tag({:controller => 'issues', :action => 'index', :project_id => @project},:remote=>'true', :method => :get,:id=>"issue_query_form", :class => 'query_form') do %> + <%= form_tag({:controller => 'issues', :action => 'index', :project_id => @project},:remote=>'xls', :method => :get,:id=>"issue_query_form", :class => 'query_form') do %> <%= hidden_field_tag 'set_filter', '1' %> <%= hidden_field_tag 'export_issue_hidden', '0' %> @@ -122,12 +140,12 @@ 清除
    - + <%= calendar_for('issue_create_date_end_show')%>
    - + <%= calendar_for('issue_create_date_start_show')%>
    From d656d3e94c909a992b486d922cbdcdf7d5a558b5 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 19:43:11 +0800 Subject: [PATCH 068/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AF=84=E5=88=86?= =?UTF-8?q?=E4=B8=BA0=20=E7=9A=84=E6=97=B6=E5=80=99=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_base_project_top.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/_base_project_top.html.erb b/app/views/layouts/_base_project_top.html.erb index c99155fad..2610b585b 100644 --- a/app/views/layouts/_base_project_top.html.erb +++ b/app/views/layouts/_base_project_top.html.erb @@ -25,13 +25,13 @@

    项目评分: <% if @project.project_type == 0 %> - <% unless static_project_score(@project.project_score) == 0 %> + <%# unless static_project_score(@project.project_score) == 0 %> <%= link_to(format("%.2f" ,static_project_score(@project.project_score)).to_i, {:controller => 'projects', :action => 'show_projects_score', :remote => true, :id => @project.id}, :class => "sy_cblue" ) %> - <% end %> + <%# end %> <% end %> 浏览:<%= @project.visits.to_i %> From 7c76584e14b656e8a64898133f520aa9cf5fc422 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 27 Sep 2016 19:44:24 +0800 Subject: [PATCH 069/154] =?UTF-8?q?issue=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/issues_controller.rb | 6 +++--- app/controllers/versions_controller.rb | 13 +++++-------- app/views/projects/_project_jours.html.erb | 2 +- app/views/projects/settings.html.erb | 2 +- app/views/versions/index.html.erb | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 3ddbcd9d6..263155f91 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -60,13 +60,13 @@ class IssuesController < ApplicationController def index if params[:set_filter] != "1" @project_base_tag = (params[:project_id] || @issue.project) ? 'base_projects':'base' - @issues = @project.issues.visible.all - @issue_count = @issues.count + @issues_filter = Issue.where(:project_id => @project.id).order('updated_on desc') + @issue_count = @issues_filter.count @limit = 10 @is_remote = true @issue_pages = Paginator.new @issue_count, @limit, params['page'] || 1 @offset ||= @issue_pages.offset - @issues = paginateHelper @issues, @limit + @issues = paginateHelper @issues_filter, @limit # if params[:set_filter] # @set_filter = params[:set_filter] # end diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index 2dce0f37f..7e9d63e58 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -80,14 +80,11 @@ class VersionsController < ApplicationController all } format.api - format.xls { - @issues = @version.fixed_issues.visible. - includes(:status, :tracker, :priority). - reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id"). - all - filename = "#{@version.name.to_s}_#{l(:label_issue_list_xls)}.xls" - send_data(issue_list_xls(@issues), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) - } + # format.xls { + # @issues = @version.fixed_issues.visible.includes(:status, :tracker, :priority).reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id").all + # filename = "#{@version.name.to_s}_#{l(:label_issue_list_xls)}.xls" + # send_data(issue_list_xls(@issues), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) + # } end end diff --git a/app/views/projects/_project_jours.html.erb b/app/views/projects/_project_jours.html.erb index a9f145c8a..6db3995ff 100644 --- a/app/views/projects/_project_jours.html.erb +++ b/app/views/projects/_project_jours.html.erb @@ -9,7 +9,7 @@ div.respond-form .reply_btn{margin-left:565px;margin-top:5px;} div.recall_con{width:570px;} - div.recall_con .reply_btn{margin-left:525px;margin-top:5px;} + div.recall_con .reply_btn{margin-left:606px;margin-top:5px;} <%= content_for(:header_tags) do %> <%= import_ke(enable_at: false, prettify: false, init_activity: false) %> diff --git a/app/views/projects/settings.html.erb b/app/views/projects/settings.html.erb index faf3a48f8..0d4a55ff9 100644 --- a/app/views/projects/settings.html.erb +++ b/app/views/projects/settings.html.erb @@ -40,7 +40,7 @@ <% end %>

  • 组织
  • <% if User.current.allowed_to?(:manage_versions, @project) %> -
  • 版本
  • +
  • <%= l(:milestone) %>
  • <% end %> <% if User.current.allowed_to?(:manage_repository, @project) %> diff --git a/app/views/versions/index.html.erb b/app/views/versions/index.html.erb index 4e324aaf4..6b42dc3d8 100644 --- a/app/views/versions/index.html.erb +++ b/app/views/versions/index.html.erb @@ -58,7 +58,7 @@

    »<%= l(:label_versions_description)%>

    <%=h version.description %>

    -

    »<%= link_to "导出:Excel", version_path(version, :format => 'xls') %>

    +
    <% end %> From d647f7153acb6dc81b1323dd2275a1c8f16e5b33 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 20:01:23 +0800 Subject: [PATCH 070/154] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E9=87=8C=E7=A8=8B?= =?UTF-8?q?=E7=A2=91=E6=9C=AF=E8=AF=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/zh.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/zh.yml b/config/locales/zh.yml index d153ffe95..d57f29c39 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -623,7 +623,7 @@ zh: label_course_news_description: '课程必须是高校正式开设的课程,或是围绕特定主题定期发布课程资料的公共开放课程;
    如果您想创建一个协作研究空间,请您前往“我的项目”页面创建项目,谢谢!' label_course_board: 讨论区 label_version: 版本 - label_version_new: 新建版本 + label_version_new: 新建里程碑 label_close_versions: 关闭已完成的版本 label_confirmation: 确认 From b679783cc02739a9b51e0570ce1d5ca684c846c4 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 27 Sep 2016 20:04:29 +0800 Subject: [PATCH 071/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E4=B8=ADissue=E5=9B=9E=E5=A4=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_project_issue.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/users/_project_issue.html.erb b/app/views/users/_project_issue.html.erb index e4f24d4e0..5a0065f86 100644 --- a/app/views/users/_project_issue.html.erb +++ b/app/views/users/_project_issue.html.erb @@ -95,7 +95,9 @@
    - +
    + <%= render :partial => 'users/project_issue_reply', :locals => {:activity => activity, :user_activity_id => user_activity_id} %> +
    diff --git a/app/views/courses/_searchmembers.html.erb b/app/views/courses/_searchmembers.html.erb index b864bfd8f..fe71b721c 100644 --- a/app/views/courses/_searchmembers.html.erb +++ b/app/views/courses/_searchmembers.html.erb @@ -1,11 +1,35 @@ -<%= form_tag( searchmembers_course_path(@course), method: 'get',:class => "f_l",:remote=>true,:id => "search_student") do %> - <%= text_field_tag 'name', params[:name], name: "name", :class => 'st_search_input', :placeholder => '输入学生登录名、姓名、学号进行搜索'%> - <% if @group %> - <%= hidden_field "search_group_id", params[:search_group_id],:value => "#{@group.id}", name: 'search_group_id' %> - - <% else %> - +
    + <% if @canShowCode %> + 添加分班 + + <% end %> + +
    + + \ No newline at end of file diff --git a/app/views/courses/addgroups.js.erb b/app/views/courses/addgroups.js.erb index f0c0f4be3..494f26bae 100644 --- a/app/views/courses/addgroups.js.erb +++ b/app/views/courses/addgroups.js.erb @@ -1,2 +1,4 @@ $("#st_groups").html("<%= escape_javascript( render :partial => 'new_groups_name', locals: {:course_groups => @course_groups})%>"); -$("#member_content").html("<%= escape_javascript( render :partial => 'new_member_list', :locals => {:members => @members})%>"); \ No newline at end of file +$("#member_content").html("<%= escape_javascript( render :partial => 'new_member_list', :locals => {:members => @members})%>"); +$('#group_name').val(''); +$('#new_group_name').hide(); \ No newline at end of file diff --git a/app/views/courses/member.html.erb b/app/views/courses/member.html.erb index 4eeef6d1a..9ddca3fa5 100644 --- a/app/views/courses/member.html.erb +++ b/app/views/courses/member.html.erb @@ -1,17 +1,35 @@ -
    -
    -

    <%= @subPage_title%>

    - <% if User.current.allowed_to?(:as_teacher,@course) %> - - <%=link_to "成员管理", :controller => 'courses', :action => 'settings', :id => @course.id, :tab=>'member' %> - - <% end %> -
    -<% if @subPage_title == l(:label_student_list)%> - <%= render :partial => 'course_student', :locals => {:members => @members} %> -<% else%> - <%= render :partial => 'course_teacher', :locals => {:members => @members} %> -<% end%> +<% if @role == 1 %> +
    +
    +

    <%= @subPage_title%>

    + <% if User.current.allowed_to?(:as_teacher,@course) %> + + <%=link_to "成员管理", :controller => 'courses', :action => 'settings', :id => @course.id, :tab=>'member' %> + + <% end %> +
    + <%= render :partial => 'course_teacher', :locals => {:members => @members} %> +
    +<% else %> +
    +
    +

    <%= @subPage_title %>

    +
    +
      +
    • +
        +
      • <%= link_to l(:label_export_excel), export_course_member_excel_course_path(@course,:format => 'xls'), :class => 'hw_more_li'%>
      • + <% if User.current.allowed_to?(:as_teacher,@course) %> +
      • + <%=link_to "成员管理", :controller => 'courses', :action => 'settings', :id => @course.id, :tab => 'member', :class => 'hw_more_li' %> +
      • + <% end %> +
      +
    • +
    +
    +
    + <%= render :partial => 'course_student', :locals => {:members => @members} %>
    - +<% end %> diff --git a/public/images/sy/sy_icons02.png b/public/images/sy/sy_icons02.png new file mode 100644 index 0000000000000000000000000000000000000000..7d29ef2a9d231b23c3c502ade1f3b34e557c47b4 GIT binary patch literal 199603 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�m{XqI@Ou7k&ah6i{q1{JHfkf9xMXEt1 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 z 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/course.js b/public/javascripts/course.js index b9d02d18e..dbf68ea39 100644 --- a/public/javascripts/course.js +++ b/public/javascripts/course.js @@ -46,6 +46,7 @@ function add_group(url,course_id) { function edit_group(id,url,course_id,group_id) { var group_name = $('#'+id).val(); + var group_id = $('#'+group_id).val(); $.get( url, { @@ -56,7 +57,7 @@ function edit_group(id,url,course_id,group_id) }, function (data) { if (data.valid) { - $("#update_group_"+group_id).submit(); + $("#update_group_form").submit(); } else { diff --git a/public/stylesheets/css/common.css b/public/stylesheets/css/common.css index bf37bf3a4..59e052c86 100644 --- a/public/stylesheets/css/common.css +++ b/public/stylesheets/css/common.css @@ -81,7 +81,7 @@ h4{ font-size:14px;}/*color:#3b3b3b;*/ /* Float & Clear */ .clear{ zoom:1;} -.clear:after {content:".";height:0;visibility:hidden;display:block;clear:both;} +.clear:after {clear:both;content:".";display:block;font-size:0;height:0;line-height:0;visibility:hidden} .cl{ clear:both; overflow:hidden; } .fl{float:left;} .fr{float:right;} diff --git a/public/stylesheets/css/courses.css b/public/stylesheets/css/courses.css index eccbcc9b1..a21633e44 100644 --- a/public/stylesheets/css/courses.css +++ b/public/stylesheets/css/courses.css @@ -530,7 +530,7 @@ a:hover.blueCir{ background:#3598db; color:#fff;} .courseR {width:220px; padding:10px; background-color:#ffffff; margin-top:10px;} /*20160310分班样式*/ -.select-class-option {width:125px;} +.select-class-option {width:100px;} /*20160520作品列表table*/ .hwork-table-wrap {width:720px; border-collapse:collapse; vertical-align:middle; table-layout:fixed;} diff --git a/public/stylesheets/syllabus.css b/public/stylesheets/syllabus.css index 1a04c73a5..27054d92a 100644 --- a/public/stylesheets/syllabus.css +++ b/public/stylesheets/syllabus.css @@ -634,3 +634,40 @@ a:hover.sy_class_ltitle{ color:#333;} .sy_new_name{ display:block;max-width:120px; overflow:hidden;white-space: nowrap; text-overflow:ellipsis;} .sy_new_long_name{ display:block;width:180px; overflow:hidden;white-space: nowrap; text-overflow:ellipsis;} .mt12{ margin-top:12px;} + +/*20160919分班*/ +.sy_class_nobg{ background-color:#eaebec;} +.sy_class_r_head{ border: 1px solid #e7e7e7; background-color: #fff; padding:10px 15px; position: relative;} +.sy_class_r_head h3{ font-size: 14px; color: #333;} +.sy_class_r_more{ display: block;} +.sy_class_fenban{border: 1px solid #e7e7e7; background-color: #fff; padding:15px;} +.sy_fenban_input{ height: 28px; background-color: #fff; border: 1px solid #d1d1d1;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; border:1px solid #d3d3d3;padding-left:5px; color:#888; box-shadow: inset 0px 0px 5px #dcdcdc; } +.sy_icons_edit{ display: inline-block; padding:9px;background:url(../images/sy/sy_icons02.png) 0 1px no-repeat; } +.sy_icons_del{ padding:9px;background:url(../images/sy/sy_icons02.png) 0 -21px no-repeat;} +.sy_icons_edit:hover{ background:url(../images/sy/sy_icons02.png) -20px 1px no-repeat; } +.sy_icons_del:hover{ background:url(../images/sy/sy_icons02.png) -20px -21px no-repeat;} +.sy_icons_tips{padding:9px;background:url(../images/sy/sy_icons02.png) 0 -66px no-repeat;} +.sy_sortupbtn{display: inline-block; width:15px; height:18px;background:url(../images/sy/sy_icons02.png) 0 -39px no-repeat;} +.sy_sortdownbtn{display: inline-block; width:15px; height:18px;background:url(../images/sy/sy_icons02.png) -22px -39px no-repeat;} +.sy_fenban_list{-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; border:1px solid #d2d8e6; padding:5px 10px;background: #f8f9fd} +.sy_fenban_list a{ color:#3b94d6;} +.sy_fenban_list a:hover{ color:#2788d0;} +.sy_class_users_st{ width:30px; } +.sy_class_users_st_name{ display: inline-block;width:70px; overflow:hidden;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.sy_class_users_st_num{ display: inline-block;width:90px; overflow:hidden;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.sy_class_users_st img{ width:30px;height:30px; border: 1px solid #fff;-webkit-border-radius:50px;-moz-border-radius:50px;-o-border-radius:50px;border-radius:50px;} +.sy_fenban_select{height: 28px; background-color: #fff; border: 1px solid #d1d1d1;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; border:1px solid #d3d3d3;padding-left:5px; color:#888; box-shadow: inset 0px 0px 5px #dcdcdc; } +.sy_new_table_width tr th.sy_th10{ width: 10%; } +.sy_new_table_width tr th.sy_th0{ width: 12.5%; } +.sy_new_table_width tr th.sy_th15{ width: 15%; } +.sy_new_table_width tr th.sy_th7{ width: 7%;} +.sy_new_table_width tr th.sy_th13{ width: 13%;} +.sy_fenban_tap{ cursor: pointer; position: relative;} +.sy_fenban_tap:hover .sy_fenban_show{ display: block;} +.sy_fenban_show{ width:140px; z-index: 999;text-align: center; line-height:2.0; font-size:12px; font-weight: normal;color:#888;background-color:#fff; border:1px solid #eaeaea;border-radius:5px;position:absolute;left:20px; top:30px;padding:5px 0px;display:none; box-shadow: 0px 2px 8px rgba(146, 153, 169, 0.5);} +.sy_tips_box{ position: relative; cursor: pointer;} +.sy_tips_box:hover .sy_tips_box_inner{ display: block;} +.sy_tips_box_inner{ position: absolute;line-height: 2.0;padding: 5px 10px; white-space: nowrap; background-color: #fff; left:30px; top: -5px; box-shadow: 0px 2px 8px rgba(146, 153, 169, 0.5);} +.sy_tips_box_inner span { display: block; border-width: 10px;position: absolute;top: 15px; left: -18px; border-style: dashed solid dashed dashed;border-color: transparent #fff transparent transparent;font-size: 0;line-height: 0;} +.hw_search_box a.hw_btn_search{display:block; width:20px; height:20px; background:url(../images/hw/icons_hw.png) 0 -57px no-repeat; position:absolute; right:5px; top:5px;} + From 86b03542c8139ca5d11be2a2f97053e5ea06e5c6 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Wed, 28 Sep 2016 10:04:20 +0800 Subject: [PATCH 077/154] =?UTF-8?q?=E9=87=8C=E7=A8=8B=E7=A2=91=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=82=B9=E5=87=BB=E7=A9=BA=E7=99=BD=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/versions/index.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/versions/index.html.erb b/app/views/versions/index.html.erb index 6b42dc3d8..3a3740a23 100644 --- a/app/views/versions/index.html.erb +++ b/app/views/versions/index.html.erb @@ -25,8 +25,8 @@ <% @versions.each do |version| %>
    -

    - <%= version_anchor(version)%> +

    + <%= version_anchor(version)%> <%#= link_to_version_show version, :name => version_anchor(version) %> <% if version.completed? %> <%= format_date(version.effective_date) %> From 6ece9c0463739a5ee036f60ee636166633fda125 Mon Sep 17 00:00:00 2001 From: huang Date: Wed, 28 Sep 2016 10:40:56 +0800 Subject: [PATCH 078/154] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/issues_controller.rb | 86 ++++++++++------------------ app/views/issues/index.html.erb | 4 +- app/views/issues/index.js.erb | 4 +- 3 files changed, 35 insertions(+), 59 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 263155f91..0940dbdf8 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -58,27 +58,26 @@ class IssuesController < ApplicationController include ApplicationHelper def index + # 为了性能所有用了两种模式,issue的@query查询所有的没有优势 + # 但是对过滤条件很有有时 if params[:set_filter] != "1" @project_base_tag = (params[:project_id] || @issue.project) ? 'base_projects':'base' - @issues_filter = Issue.where(:project_id => @project.id).order('updated_on desc') + if User.current.member_of?(@project) + @issues_filter = Issue.where(:project_id => @project.id).order('updated_on desc') + else + @issues_filter = Issue.where(:project_id => @project.id, :is_private => 0).order('updated_on desc') + end + open_and_close_num(@project) @issue_count = @issues_filter.count @limit = 10 @is_remote = true @issue_pages = Paginator.new @issue_count, @limit, params['page'] || 1 @offset ||= @issue_pages.offset @issues = paginateHelper @issues_filter, @limit - # if params[:set_filter] - # @set_filter = params[:set_filter] - # end - # @issue_count_by_group = @query.issue_count_by_group respond_to do |format| format.js format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young format.api {Issue.load_visible_relations(@issues) if include_in_api_response?('relations')} - # format.json { render :json => @issues.map { |issue| issue.to_json}} #:json => @issues.map { |issue| issue.to_json} - # format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } - # format.csv { send_data(query_to_csv(@issues, @query, params), :type => 'text/csv; header=present', :filename => 'issues.csv') } - # format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'issues.pdf') } format.xls {filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}.xls" send_data(issue_list_xls(@issues_filter), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) } @@ -88,20 +87,8 @@ class IssuesController < ApplicationController sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria) sort_update(@query.sortable_columns) @query.sort_criteria = sort_criteria.to_a - @project_base_tag = (params[:project_id] || @issue.project) ? 'base_projects':'base' - if @query.valid? - # case params[:format] - # when 'csv', 'pdf' - # @limit = 10#Setting.issues_export_limit.to_i - # when 'atom' - # @limit = 10#Setting.feeds_limit.to_i - # when 'xml', 'json' - # @offset, @limit = api_offset_and_limit({:limit => 10}) - # else - # @limit = 10#per_page_option - # end @tracker_id = params[:tracker_id] @assign_to_id = params[:assigned_to_id] @author_id = params[:author_id] @@ -111,9 +98,6 @@ class IssuesController < ApplicationController @fixed_version_id = params[:fixed_version_id] @issue_count = @query.issue_count @test = params[:test] - # @issue_pages = Paginator.new @issue_count, @limit, params['page'] - # params[:page] = (params[:page] || 1).to_i + 1 #页码需要加1 - # @offset ||= @issue_pages.offset @project_sort = 'issues.updated_on desc' if params[:test] != "0" case @test @@ -127,6 +111,7 @@ class IssuesController < ApplicationController @project_sort = 'issues.updated_on asc' end end + open_and_close_num(@project) @issues_filter_assign_count = @query.issues.select{|issue| issue.assigned_to_id == User.current.id }.count @issues_filter_author_count = @query.issues.select{|issue| issue.author_id == User.current.id }.count @issues_filter = @query.issues(:order => @project_sort) @@ -135,35 +120,17 @@ class IssuesController < ApplicationController @issue_pages = Paginator.new @issue_count, @limit, params['page'] || 1 @offset ||= @issue_pages.offset @issues = paginateHelper @issues_filter, @limit - # if params[:set_filter] - # @set_filter = params[:set_filter] - # end - # @issue_count_by_group = @query.issue_count_by_group - if params[:export_issue_hidden] == "1" - # index(:format=>'xls', :export_issue_hidden => 0) - params[:export_issue_hidden] = "0" - redirect_to project_issues_path(:project_id => @project, :format => 'xls') - - # respond_to do |format| - # format.xls {filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}.xls" - # send_data(issue_list_xls(@issues_filter), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) - # return - # } - # return - # end - else - respond_to do |format| - format.js - format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young - format.api {Issue.load_visible_relations(@issues) if include_in_api_response?('relations')} - # format.json { render :json => @issues.map { |issue| issue.to_json}} #:json => @issues.map { |issue| issue.to_json} - format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } - format.csv { send_data(query_to_csv(@issues, @query, params), :type => 'text/csv; header=present', :filename => 'issues.csv') } - format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'issues.pdf') } - format.xls {filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}.xls" - send_data(issue_list_xls(@issues_filter), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) - } - end + respond_to do |format| + format.js + format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young + format.api {Issue.load_visible_relations(@issues) if include_in_api_response?('relations')} + # format.json { render :json => @issues.map { |issue| issue.to_json}} #:json => @issues.map { |issue| issue.to_json} + format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } + format.csv { send_data(query_to_csv(@issues, @query, params), :type => 'text/csv; header=present', :filename => 'issues.csv') } + format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'issues.pdf') } + format.xls {filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}.xls" + send_data(issue_list_xls(@issues_filter), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) + } end else respond_to do |format| @@ -174,12 +141,21 @@ class IssuesController < ApplicationController end end end - - rescue ActiveRecord::RecordNotFound render_404 end + # 获取issue的开启统计数 + def open_and_close_num project + if User.current.member_of?(project) + @issue_open_count = Issue.where("project_id=#{project.id} and status_id in (1,2,3,4,6)").count + @issue_close_count = Issue.where(:project_id => project.id, :status_id => 5 ).count + else + @issue_open_count = Issue.where("project_id=#{project.id} and status_id in (1,2,3,4,6) and is_private = 0").count + @issue_close_count = Issue.where(:project_id => project.id, :status_id => 5, :is_private => 0).count + end + end + def show # 打开编辑内容 @is_edit = true unless params[:edit].nil? diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 5e7669a25..732e4d9af 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -120,8 +120,8 @@

    diff --git a/app/views/issues/index.js.erb b/app/views/issues/index.js.erb index d2207b1d0..f792cf70f 100644 --- a/app/views/issues/index.js.erb +++ b/app/views/issues/index.js.erb @@ -1,7 +1,7 @@ //$("#issue_list").html("<%#= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count})%>"); -$("#issue_assigned_count").html("<%= escape_javascript(render :partial => 'issues/issue_filter') %>"); +//$("#issue_assigned_count").html("<%#= escape_javascript(render :partial => 'issues/issue_filter') %>"); $("#issue_filter_all").html("<%= escape_javascript(render :partial => 'issues/issue_filter_all') %>"); -$("#issue_author_count").html("<%= escape_javascript(render :partial => 'issues/issue_filter_author') %>"); +//$("#issue_author_count").html("<%#= escape_javascript(render :partial => 'issues/issue_filter_author') %>"); $("#issue_list").html("<%= escape_javascript(render :partial => 'issues/all_list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); $("#issue_list_pagination").html('<%= pagination_links_full @issue_pages, @issue_count, :issues => @issues, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>'); From 69a9171430bbd8246d9fb6e3be192ba672574c83 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 28 Sep 2016 10:47:58 +0800 Subject: [PATCH 079/154] =?UTF-8?q?=E5=88=86=E7=8F=AD=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4=EF=BC=9B=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E7=BF=BB=E9=A1=B5=E5=B1=85=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/_new_member_list.html.erb | 2 +- app/views/homework_common/_homework_index_list.html.erb | 2 +- public/stylesheets/syllabus.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/courses/_new_member_list.html.erb b/app/views/courses/_new_member_list.html.erb index 31bc91589..5a80d1d93 100644 --- a/app/views/courses/_new_member_list.html.erb +++ b/app/views/courses/_new_member_list.html.erb @@ -81,7 +81,7 @@ <% sum = hw_score + ex_score + act_score %>
    - <% if homework.course %> - - <% end %> +
    <%= i + 1 %> - <%= link_to image_tag(url_to_avatar(user), :width => "30", :height => "30"), user_path(member.user_id), :class => 'sy_class_users_st fl mt4 mr5' ,:alt => "用户头像" %> + <%= link_to image_tag(url_to_avatar(user), :width => "30", :height => "30", :style => "display:block;"), user_path(member.user_id), :class => 'sy_class_users_st fl mt5 mr5' ,:alt => "用户头像" %> <%= user.show_name %> diff --git a/app/views/homework_common/_homework_index_list.html.erb b/app/views/homework_common/_homework_index_list.html.erb index dcbe8d411..063621399 100644 --- a/app/views/homework_common/_homework_index_list.html.erb +++ b/app/views/homework_common/_homework_index_list.html.erb @@ -1,6 +1,6 @@ <%= render :partial => 'users/user_homework_list', :locals => {:homework_commons => homework_commons,:page => 0,:course_id => course_id} %> -
    +
      <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%>
    diff --git a/public/stylesheets/syllabus.css b/public/stylesheets/syllabus.css index 27054d92a..917e15661 100644 --- a/public/stylesheets/syllabus.css +++ b/public/stylesheets/syllabus.css @@ -654,7 +654,7 @@ a:hover.sy_class_ltitle{ color:#333;} .sy_fenban_list a:hover{ color:#2788d0;} .sy_class_users_st{ width:30px; } .sy_class_users_st_name{ display: inline-block;width:70px; overflow:hidden;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} -.sy_class_users_st_num{ display: inline-block;width:90px; overflow:hidden;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.sy_class_users_st_num{ display: block;width:90px; overflow:hidden;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .sy_class_users_st img{ width:30px;height:30px; border: 1px solid #fff;-webkit-border-radius:50px;-moz-border-radius:50px;-o-border-radius:50px;border-radius:50px;} .sy_fenban_select{height: 28px; background-color: #fff; border: 1px solid #d1d1d1;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; border:1px solid #d3d3d3;padding-left:5px; color:#888; box-shadow: inset 0px 0px 5px #dcdcdc; } .sy_new_table_width tr th.sy_th10{ width: 10%; } From b22b444a7ba8b61e8b2a43bad2053767e07a5e38 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Wed, 28 Sep 2016 10:58:31 +0800 Subject: [PATCH 080/154] =?UTF-8?q?=E4=BF=AE=E6=94=B9issue=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E6=97=B6=E9=97=B4=E4=B8=8E=E7=BB=93=E6=9D=9F=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=88=A4=E6=96=AD=EF=BC=8C=E5=B9=B6=E5=B0=86=E5=AF=BC?= =?UTF-8?q?=E5=87=BAexcel=E7=9A=84=E4=BD=9C=E8=80=85=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/index.html.erb | 5 ++++- config/locales/projects/zh.yml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index d1bde712e..ac42dfff8 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -27,7 +27,10 @@ }); function remote_function() { - $("#issue_query_form").submit(); + if($.trim($("#issue_create_date_end_show").val()) !="" && Date.parse($.trim($("#issue_create_date_end_show").val())) < Date.parse($.trim($("#issue_create_date_start_show").val()))){ + alert("开始日期不能大于结束日期!"); + } + $("#issue_query_form").submit(); // $.ajax({ // url:'<%#= project_issues_path(@project)%>', // data:{ diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 98e13a865..8944fad0c 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -209,7 +209,7 @@ zh: issue_xls_description: 描述 issue_xls_created_at: 创建时间 issue_xls_tracker_id: 类型 - issue_xls_author: 作者 + issue_xls_author: 发布人 issue_xls_assign: 指派给 issue_xls_status: 状态 issue_xls_priority: 优先级 From 30c3ce86d5aa8ea42cd998ec80985af995c19ff4 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 28 Sep 2016 11:01:30 +0800 Subject: [PATCH 081/154] =?UTF-8?q?wiki=E6=96=B0=E5=BB=BA=EF=BC=8C?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=A1=B5=E9=9D=A2=E5=AE=BD=E5=BA=A6=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/wiki/edit.html.erb | 10 +++++++--- app/views/wiki/show.html.erb | 4 +++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/views/wiki/edit.html.erb b/app/views/wiki/edit.html.erb index 17723f633..83b1d18ae 100644 --- a/app/views/wiki/edit.html.erb +++ b/app/views/wiki/edit.html.erb @@ -1,7 +1,7 @@ <%= wiki_page_breadcrumb(@page) %> -
    +

    Wiki

    @@ -21,8 +21,8 @@
    -
    -

    +

    +

    <%=text_area_tag 'content[text]', @text, :required => true, :id => 'editor02', :cols => 100, :rows => 25 %>

    diff --git a/app/views/wiki/show.html.erb b/app/views/wiki/show.html.erb index 4d100e9d7..995c44924 100644 --- a/app/views/wiki/show.html.erb +++ b/app/views/wiki/show.html.erb @@ -1,4 +1,4 @@ -
    +

    Wiki

    @@ -94,5 +94,7 @@ } }); }; + + $("#RSide").css("width","730px");
    \ No newline at end of file From b8ab3dc497c9ba1203d6624e3b991a89c75ea439 Mon Sep 17 00:00:00 2001 From: huang Date: Wed, 28 Sep 2016 11:39:11 +0800 Subject: [PATCH 082/154] =?UTF-8?q?=E7=82=B9=E6=95=B0=E5=AD=97=E4=B8=8D?= =?UTF-8?q?=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 4 ++-- app/views/issues/index.html.erb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index cbeade2a3..1305320cf 100644 --- a/Gemfile +++ b/Gemfile @@ -50,10 +50,10 @@ gem 'elasticsearch-model' gem 'elasticsearch-rails' #rails 3.2.22.2 bug - gem "test-unit", "~>3.0" + # gem "test-unit", "~>3.0" ### profile - gem 'oneapm_rpm' + # gem 'oneapm_rpm' group :development do gem 'grape-swagger' diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 9f8accdaa..69de96df6 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -159,8 +159,8 @@
    + diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index 7da1e671b..81a20b6b1 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -798,8 +798,8 @@ a:hover.hw_btn_blue,a:active.hw_btn_blue{ background: #3b94d6; color:#fff;} input.issues_calendar_input{ padding-left:5px; color:#444; border-right:none;} .issues_data_img{ display:block; width:25px; height:33px; border:1px solid #c8c8c8; border-left:none; background: url("/images/public_icon.png") -29px 9px no-repeat; } /* 缺陷Tab */ -.issues_con_list{border:1px solid #c8c8c8; } -#issues_list_nav {border-bottom:1px solid #d0d0d0;} +.issues_con_list{border:1px solid #e5e3da; } +#issues_list_nav {border-bottom:1px solid #e5e3da;} #issues_list_nav li {float:left; padding:10px 15px; text-align:center; } #issues_list_nav li a{font-size:12px; color:#444;} .issues_nav_hover{border-bottom:3px solid #3498db; font-weight:bold; } @@ -816,9 +816,9 @@ input.issues_calendar_input{ padding-left:5px; color:#444; border-right:none;} input.issues_calendar_input{ padding-left:5px; color:#444; border-right:none;} .issues_data_img{ display:block; width:25px; height:28px; border:1px solid #c8c8c8; border-left:none; background: url("/images/public_icon.png") -29px 9px no-repeat; } -.issues_list_box{ padding:15px; padding-right: 0px; border-bottom:1px dashed #c8c8c8;} +.issues_list_box{ padding:15px; padding-right: 0px; border-bottom:1px dashed #e5e3da;} .issues_list_titlebox{ font-size:14px; font-weight:bold; margin-bottom:8px;} -a.issues_list_title{ color:#444; max-width:260px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap; } +a.issues_list_title{ color:#444; max-width:300px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap; } a:hover.issues_list_title{color:#3b94d6;} .issues_list_titlebox span{ font-size: 12px;color: #888; font-weight: normal; } .issues_ciricons_01{ width: 22px; height: 22px; display: inline-block; background: url("/images/new_project/icons_issue.png") 0 0 no-repeat;} From fdca4ea968567048e8a051bd98220d85f3db4d70 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Wed, 28 Sep 2016 16:52:02 +0800 Subject: [PATCH 087/154] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=B8=8E=E7=8F=AD?= =?UTF-8?q?=E7=BA=A7=E8=B5=84=E6=BA=90=E5=BA=93=E5=AF=BC=E5=85=A5=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E9=87=8D=E5=90=8D=E6=97=B6=E5=AF=BC=E5=85=A5=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 87dc127a0..c13039696 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3200,6 +3200,7 @@ class UsersController < ApplicationController ori = Attachment.find_by_id(send_id) # 如果该附件已经存课程中,则只更新附件创建时间 mul_container.attachments.each do |att| + @exist = false if att.id == ori.id || (!att.copy_from.nil? && !ori.copy_from.nil? && att.copy_from == ori.copy_from) || att.copy_from == ori.id || att.id == ori.copy_from att.created_on = Time.now att.save From daa887fe0a72150109a8a34805c75d751cd0a0f5 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 28 Sep 2016 16:56:46 +0800 Subject: [PATCH 088/154] =?UTF-8?q?issue=E5=88=97=E8=A1=A8=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/_project_issue.html.erb | 4 ++-- public/stylesheets/css/project.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/issues/_project_issue.html.erb b/app/views/issues/_project_issue.html.erb index bbe16e413..25b7a6954 100644 --- a/app/views/issues/_project_issue.html.erb +++ b/app/views/issues/_project_issue.html.erb @@ -56,10 +56,10 @@
  • <%= activity.done_ratio %>%
  • <% if activity.journals.count > 0%> - + <%= activity.journals.count %> <% end %> -
    +
    <%= link_to "", issue_path(activity.id, :edit => 'true'), :class => 'sy_icons_edit fl mt15', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> <% if !defined?(project_id) && !defined?(user_id) %> <%= link_to "", issue_path(activity.id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'sy_icons_del fl mt15' if User.current.allowed_to?(:delete_issues, activity.project) %> diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index 81a20b6b1..3065caaf9 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -827,7 +827,7 @@ a:hover.issues_list_title{color:#3b94d6;} .issues_list_name{ font-size: 12px;} .issues_list_name:hover{ color: #3b94d6;} .issues_list_small{ font-size: 12px; color: #666;} -.issues_list_txt li{ height: 50px; line-height: 50px; float: left; font-size: 12px; width: 70px; text-align: center; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;} +.issues_list_txt li{ height: 50px; float: left; font-size: 12px; width: 70px; text-align: center; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;} .issues_list_txt li.issues_list_min{ width: 52px;} From f9fcc5d9614287cfde8314d40adee3f3afc3ed62 Mon Sep 17 00:00:00 2001 From: huang Date: Wed, 28 Sep 2016 17:02:17 +0800 Subject: [PATCH 089/154] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E9=A1=B6=E5=A4=B4=E7=A9=BA=E7=99=BD=E5=A4=AA=E5=A4=9A=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/stylesheets/css/project.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index 175a20395..4a8842e38 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -564,7 +564,7 @@ a:hover.upload_btn_grey{background:#8a8a8a;} .sy_class_infobox{ padding:15px; background:#fff; - margin:12px auto 0; + margin:0px auto ; width:968px; border:1px solid #e5e5e5; position: relative; From f6296377bd4e2906ad8914d84e5474767cc2163d Mon Sep 17 00:00:00 2001 From: cxt Date: Thu, 29 Sep 2016 11:29:37 +0800 Subject: [PATCH 090/154] =?UTF-8?q?=E7=8F=AD=E7=BA=A7=E5=86=85=E7=9A=84?= =?UTF-8?q?=E5=88=86=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 149 ++++++++++++++--- app/views/courses/_course_student.html.erb | 4 +- app/views/courses/_new_groups_name.html.erb | 5 +- app/views/courses/_new_member_list.html.erb | 176 +++++--------------- app/views/courses/_searchmembers.html.erb | 2 +- app/views/courses/member.html.erb | 4 +- app/views/courses/settings.html.erb | 2 +- public/stylesheets/syllabus.css | 2 +- 8 files changed, 177 insertions(+), 167 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 0c82edad7..e9b49b6fd 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -184,14 +184,24 @@ class CoursesController < ApplicationController if params[:incourse] results = searchmember_by_name(student_homework_score(0,0,0,"desc"), q) elsif params[:ingroup] - @group = CourseGroup.find(params[:search_group_id]) - results = searchmember_by_name(student_homework_score(@group.id,0,0,"desc"), q) + if params[:search_group_id] == "-1" + @group = -1 + results = searchmember_by_name(student_homework_score(-1,0,0,"desc"), q) + else + @group = CourseGroup.find(params[:search_group_id]) + results = searchmember_by_name(student_homework_score(@group.id,0,0,"desc"), q) + end end @is_remote = true #@result_count = results.count #@results = paginateHelper results, 10 @results = results @search_name = q + @limit = 50 + @page = params[:page].nil? ? 1 : params['page'].to_i + @members_count = @results.count + @mem_pages = Paginator.new @members_count, @limit, @page + @results = paginateHelper @results, @limit end def addgroups @@ -208,6 +218,12 @@ class CoursesController < ApplicationController @is_remote = true @members = student_homework_score(0,0, 10,@score_sort_by) @course_groups = @course.course_groups + @limit = 50 + @page = params[:page].nil? ? 1 : params['page'].to_i + @members_count = @members.count + @no_group_count = @members_count - @course.members.where("course_group_id != 0").count + @mem_pages = Paginator.new @members_count, @limit, @page + @members = paginateHelper @members, @limit end def deletegroup @@ -219,6 +235,12 @@ class CoursesController < ApplicationController @score_sort_by = "desc" @members = student_homework_score(0,0, 10,@score_sort_by) @course_groups = @course.course_groups + @limit = 50 + @page = params[:page].nil? ? 1 : params['page'].to_i + @members_count = @members.count + @no_group_count = @members_count - @course.members.where("course_group_id != 0").count + @mem_pages = Paginator.new @members_count, @limit, @page + @members = paginateHelper @members, @limit end def updategroupname @@ -232,6 +254,12 @@ class CoursesController < ApplicationController @is_remote = true @members = student_homework_score(0,0, 10,"desc") @course_groups = @course.course_groups + @limit = 50 + @page = params[:page].nil? ? 1 : params['page'].to_i + @members_count = @members.count + @no_group_count = @members_count - @course.members.where("course_group_id != 0").count + @mem_pages = Paginator.new @members_count, @limit, @page + @members = paginateHelper @members, @limit end def valid_ajax @@ -268,6 +296,7 @@ class CoursesController < ApplicationController member.course_group_id = params[:course_group_id].to_i member.save @course_groups = @course.course_groups + @no_group_count = @course.student.count - @course.members.where("course_group_id != 0").count @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' respond_to do |format| format.js @@ -283,6 +312,7 @@ class CoursesController < ApplicationController @group = group @course_groups = @course.course_groups + @no_group_count = @course.student.count - @course.members.where("course_group_id != 0").count search_group_members group end @@ -294,6 +324,7 @@ class CoursesController < ApplicationController member.save @group = group @course_groups = @course.course_groups + @no_group_count = @course.student.count - @course.members.where("course_group_id != 0").count search_group_members group end @@ -304,14 +335,22 @@ class CoursesController < ApplicationController @is_remote = true @sort_type = 'score' @score_sort_by = "desc" - if params[:group_id] && params[:group_id] != "0" + if params[:group_id] && params[:group_id] != "0" && params[:group_id] != "-1" @group = CourseGroup.find(params[:group_id]) @results = student_homework_score(@group.id,0, 0,"desc") # @results = paginateHelper @results, 10 + elsif params[:group_id] && params[:group_id] == "-1" + @group = -1 + @results = student_homework_score(-1, 0, 10,"desc") else page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) @results = student_homework_score(0,page_from, 10,"desc") end + @limit = 50 + @page = params[:page].nil? ? 1 : params['page'].to_i + @members_count = @results.count + @mem_pages = Paginator.new @members_count, @limit, @page + @results = paginateHelper @results, @limit end def member @@ -332,10 +371,14 @@ class CoursesController < ApplicationController @members = @all_members when '2' if @course.open_student == 1 || User.current.member_of_course?(@course) || User.current.admin? + @limit = 50 @subPage_title = l :label_student_list - page = params[:page].nil? ? 0 : (params['page'].to_i - 1) - @all_members = student_homework_score(0,page, 10,@score_sort_by,@sort_type) - @members = @all_members + @page = params[:page].nil? ? 1 : params['page'].to_i + @all_members = student_homework_score(0, @page - 1, @limit, @score_sort_by, @sort_type) + @members_count = @all_members.count + @no_group_count = @members_count - @course.members.where("course_group_id != 0").count + @mem_pages = Paginator.new @members_count, @limit, @page + @members = paginateHelper @all_members, @limit else render_403 return @@ -378,25 +421,35 @@ class CoursesController < ApplicationController group_id = params[:group_id] if !@search_name.nil? if group_id == '0' - page = params[:page].nil? ? 0 : (params['page'].to_i - 1) + #page = params[:page].nil? ? 0 : (params['page'].to_i - 1) @results = searchmember_by_name(student_homework_score(0,0,0,@score_sort_by,@sort_type), @search_name) - @result_count = @results.count # @results = paginateHelper @results, 10 + elsif group_id == '-1' + @group = -1 + @results = searchmember_by_name(student_homework_score(-1,0,0,@score_sort_by,@sort_type), @search_name) else @group = CourseGroup.find(group_id) @results = searchmember_by_name(student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type),@search_name) - @result_count = @results.count # @results = paginateHelper @results, 10 end else if group_id == '0' page = params[:page].nil? ? 0 : (params['page'].to_i - 1) @results = student_homework_score(0,page, 10,@score_sort_by,@sort_type) + elsif group_id == '-1' + @group = -1 + @results = student_homework_score(-1,0, 10,@score_sort_by,@sort_type) else @group = CourseGroup.find(group_id) @results = student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type) end end + @limit = 50 + @page = params[:page].nil? ? 1 : params['page'].to_i + @members_count = @results.count + @no_group_count = @members_count - @course.members.where("course_group_id != 0").count + @mem_pages = Paginator.new @members_count, @limit, @page + @results = paginateHelper @results, @limit end # 显示每个学生的作业评分详情 def show_member_score @@ -1223,7 +1276,6 @@ class CoursesController < ApplicationController def student_homework_score(groupid,start_from, nums, score_sort_by, sort_type = 'score') start_from = start_from * nums - sql_select = "" if groupid == 0 sql_select = "SELECT members.*,( SELECT SUM(student_works.work_score) @@ -1233,16 +1285,47 @@ class CoursesController < ApplicationController AND student_works.user_id = members.user_id ) AS score,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id - ) AS act_score,(SELECT SUM(exercise_users.score) - FROM exercise_users,exercises - WHERE exercise_users.exercise_id = exercises.id - AND exercises.course_id = #{@course.id} - AND exercise_users.user_id = members.user_id - ) AS ex_score + ) AS act_score,(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id + AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, + (SELECT student_id FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id, + (SELECT message_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, + (SELECT message_reply_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, + (SELECT news_reply_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS news_reply_num, + (SELECT news_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS news_num, + (SELECT resource_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, + (SELECT journal_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS journal_num, + (SELECT homework_journal_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num, + (SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num, + (SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercises.end_time >= eu.created_at AND eu.user_id = members.user_id) AS exercise_num FROM members JOIN students_for_courses ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id WHERE members.course_id = #{@course.id} ORDER BY #{sort_type} #{score_sort_by}" + elsif groupid == -1 + sql_select = "SELECT members.*,( + SELECT SUM(student_works.work_score) + FROM student_works,homework_commons + WHERE student_works.homework_common_id = homework_commons.id + AND homework_commons.course_id = #{@course.id} + AND student_works.user_id = members.user_id + ) AS score,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + + resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id + ) AS act_score,(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id + AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, + (SELECT student_id FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id, + (SELECT message_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, + (SELECT message_reply_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, + (SELECT news_reply_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS news_reply_num, + (SELECT news_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS news_num, + (SELECT resource_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, + (SELECT journal_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS journal_num, + (SELECT homework_journal_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num, + (SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num, + (SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercises.end_time >= eu.created_at AND eu.user_id = members.user_id) AS exercise_num + FROM members + JOIN students_for_courses + ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id + WHERE members.course_id = #{@course.id} AND members.course_group_id = 0 ORDER BY #{sort_type} #{score_sort_by}" else sql_select = "SELECT members.*,( SELECT SUM(student_works.work_score) @@ -1252,12 +1335,18 @@ class CoursesController < ApplicationController AND student_works.user_id = members.user_id ) AS score,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id - ) AS act_score,(SELECT SUM(exercise_users.score) - FROM exercise_users,exercises - WHERE exercise_users.exercise_id = exercises.id - AND exercises.course_id = #{@course.id} - AND exercise_users.user_id = members.user_id - ) AS ex_score + ) AS act_score,(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id + AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score, + (SELECT student_id FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id, + (SELECT message_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num, + (SELECT message_reply_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num, + (SELECT news_reply_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS news_reply_num, + (SELECT news_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS news_num, + (SELECT resource_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num, + (SELECT journal_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS journal_num, + (SELECT homework_journal_num FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num, + (SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num, + (SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND exercises.end_time >= eu.created_at AND eu.user_id = members.user_id) AS exercise_num FROM members JOIN students_for_courses ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id @@ -1310,8 +1399,10 @@ class CoursesController < ApplicationController for i in 0 ... homeworks.count sheet1[5,i+4] = "第"+(i+1).to_s+"次" end - sheet1[5,homeworks.count+4] = "总成绩" - sheet1[5,homeworks.count+5] = "活跃度" + sheet1[5,homeworks.count+4] = "作业得分" + sheet1[5,homeworks.count+5] = "测评得分" + sheet1[5,homeworks.count+6] = "社区得分" + sheet1[5,homeworks.count+7] = "总得分" count_row = 6 members.each_with_index do |member, i| sheet1[count_row,0]= i+1 @@ -1328,8 +1419,14 @@ class CoursesController < ApplicationController sheet1[count_row,j+4] = score <0 ? 0:score.round(2) end end - sheet1[count_row,homeworks.count+4] = member.score.nil? ? 0:member.score.round(2) - sheet1[count_row,homeworks.count+5] = member.act_score.nil? ? 0:member.act_score + hw_score = member.score.nil? ? 0 : member.score + ex_score = member.ex_score.nil? ? 0 : member.ex_score + act_score = member.act_score.nil? ? 0 : member.act_score + sum = hw_score + ex_score + act_score + sheet1[count_row,homeworks.count+4] = hw_score.round(2) + sheet1[count_row,homeworks.count+5] = ex_score + sheet1[count_row,homeworks.count+6] = act_score + sheet1[count_row,homeworks.count+7] = sum.round(2) count_row += 1 end diff --git a/app/views/courses/_course_student.html.erb b/app/views/courses/_course_student.html.erb index db0aabc3b..59c0dc641 100644 --- a/app/views/courses/_course_student.html.erb +++ b/app/views/courses/_course_student.html.erb @@ -1,5 +1,7 @@
    - <%= render :partial => 'searchmembers' %> +
    + <%= render :partial => 'searchmembers' %> +
    diff --git a/app/views/courses/_new_groups_name.html.erb b/app/views/courses/_new_groups_name.html.erb index 81799360a..24be067ba 100644 --- a/app/views/courses/_new_groups_name.html.erb +++ b/app/views/courses/_new_groups_name.html.erb @@ -3,8 +3,9 @@
  • <%= link_to l(:label_all), searchgroupmembers_course_path(@course,:group_id => 0), :onclick => "checkclass('course_group_0')", method: 'get', remote: true%>
  • -
  • - <%= link_to '未分班', searchgroupmembers_course_path(@course,:group_id => 0), :onclick => "checkclass('course_group_0')", method: 'get', remote: true%> +
  • + <%= link_to "未分班", searchgroupmembers_course_path(@course,:group_id => -1), :onclick => "checkclass('course_group_0')", method: 'get', remote: true, :class => 'fl mr5'%> + (<%=@no_group_count %>人)
  • <% unless course_groups.nil? %> diff --git a/app/views/courses/_new_member_list.html.erb b/app/views/courses/_new_member_list.html.erb index 31bc91589..c5d04c45c 100644 --- a/app/views/courses/_new_member_list.html.erb +++ b/app/views/courses/_new_member_list.html.erb @@ -1,23 +1,11 @@ - -
    - <% if User.current.logged? && User.current.member_of_course?(@course) && @group %> - <%= join_in_course_group(@course.course_groups,@group, User.current) unless @canShowCode %> - - <%= l(:label_current_group)%>:  - <%= @group.name %> - - <% end %> -
    -
    - <% if members.any? %> - +
    - <% members.each_with_index do |member, i| %> - + <% user = member.user %> <% hw_score = member.score.nil? ? 0 : member.score %> <% ex_score = member.ex_score.nil? ? 0 : member.ex_score %> <% act_score = member.act_score.nil? ? 0 : member.act_score %> <% sum = hw_score + ex_score + act_score %> - + - <% end %>
    序号 姓名 - <%= link_to '学号', member_score_sort_course_path(:sort_type => 'student_id', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0), :search_name => (@search_name ? @search_name : nil)), :result => members, method: 'get', remote: true, :style => 'color:#000000;'%> + <%= link_to '学号', member_score_sort_course_path(:sort_type => 'student_id', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? (@group == -1 ? -1 : @group.id) : 0), :search_name => (@search_name ? @search_name : nil)), :result => members, method: 'get', remote: true, :style => 'color:#000000;'%> <% if @sort_type == "student_id" && @score_sort_by == 'desc' %> <% elsif @sort_type == "student_id" && @score_sort_by == 'asc' %> @@ -25,7 +13,7 @@ <% end %> - <%= link_to '作业得分', member_score_sort_course_path(:sort_type => 'score', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0), :search_name => (@search_name ? @search_name : nil)), :result => members, method: 'get', remote: true, :style => 'color:#000000;'%> + <%= link_to '作业得分', member_score_sort_course_path(:sort_type => 'score', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? (@group == -1 ? -1 : @group.id) : 0), :search_name => (@search_name ? @search_name : nil)), :result => members, method: 'get', remote: true, :style => 'color:#000000;'%> <% if @sort_type == "score" && @score_sort_by == 'desc' %> <% elsif @sort_type == "score" && @score_sort_by == 'asc' %> @@ -36,14 +24,20 @@ 班级作业的得分总和

    测评得分 + + <%= link_to '测评得分', member_score_sort_course_path(:sort_type => 'ex_score', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? (@group == -1 ? -1 : @group.id) : 0), :search_name => (@search_name ? @search_name : nil)), :result => members, method: 'get', remote: true, :style => 'color:#000000;'%> + <% if @sort_type == "ex_score" && @score_sort_by == 'desc' %> + + <% elsif @sort_type == "ex_score" && @score_sort_by == 'asc' %> + + <% end %>

    积分规则
    班级测验的得分总和

    - <%= link_to '社区得分', member_score_sort_course_path(:sort_type => 'act_score', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0),:search_name => (@search_name ? @search_name : nil)) ,:result => members,method: 'get', remote: true, :style => 'color:#000000;'%> + <%= link_to '社区得分', member_score_sort_course_path(:sort_type => 'act_score', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? (@group == -1 ? -1 : @group.id) : 0),:search_name => (@search_name ? @search_name : nil)) ,:result => members,method: 'get', remote: true, :style => 'color:#000000;'%> <% if @sort_type == "act_score" && @score_sort_by == 'desc' %> <% elsif @sort_type == "act_score" && @score_sort_by == 'asc' %> @@ -73,13 +67,13 @@
    <%= i + 1 %><%= (@page - 1) * @limit + i + 1 %> <%= link_to image_tag(url_to_avatar(user), :width => "30", :height => "30"), user_path(member.user_id), :class => 'sy_class_users_st fl mt4 mr5' ,:alt => "用户头像" %> <%= user.show_name %> @@ -102,142 +96,58 @@ :remote => true}, :class => '' %> + <%= format("%0.2f", sum) %> -
    +

    <%= user.show_name %>
    - 资源    发布数:1
    - 问答    发布数:1回复数:1
    - 通知    提交数:1留言数:1
    - 作业    提交数:1留言数:1
    - 班级    留言数:1
    - 测验    提交数:1 + 资源    发布数:<%= member.resource_num %>
    + 问答    发布数:<%= member.message_num %>回复数:<%= member.message_reply_num %>
    + 通知    提交数:<%= member.news_num %>留言数:<%= member.news_reply_num %>
    + 作业    提交数:<%= member.homework_num %>留言数:<%= member.homework_journal_num %>
    + 班级    留言数:<%= member.journal_num %>
    + 测验    提交数:<%= member.exercise_num %>

    - <% unless @course.course_groups.empty? %> - <% if User.current.allowed_to?(:as_teacher, @course) || User.current.admin? || User.current == user %> - <% if @course.course_groups.nil? || @group %> - <%=member.course_group_id == 0 ? "暂无" : member.course_group.name %> - <% else %> - <%= form_tag({:controller => 'courses', :action => 'teacher_assign_group', :id => @course.id,:user_id => member.user_id},:remote=>'true', :method => 'post', :id=>"join_group_form_#{member.id}", :class => 'query_form') do %> -
    - <%=member.course_group_id == 0 ? "暂无" : member.course_group.name %> - -
    - <%= select( :name,:group_id, course_group_option(@course), - { :include_blank => false,:selected => member.course_group_id}, - {:onchange=>"join_group_function('#join_group_form_#{member.id}');", :id =>"course_group_id", :name => "course_group_id",:class=>"w100 undis class-edit sy_fenban_select", :style => "margin-left: 5px;"}) %> - <% end %> - <% end %> - <% else %> + <% if User.current.allowed_to?(:as_teacher, @course) || User.current.admin? || User.current == user %> + <% if @course.course_groups.empty? %> <%=member.course_group_id == 0 ? "暂无" : member.course_group.name %> + <% else %> + <%= form_tag({:controller => 'courses', :action => 'teacher_assign_group', :id => @course.id,:user_id => member.user_id},:remote=>'true', :method => 'post', :id=>"join_group_form_#{member.id}", :class => 'query_form') do %> +
    + <%=member.course_group_id == 0 ? "暂无" : member.course_group.name %> + +
    + <%= select( :name,:group_id, course_group_option(@course), + { :include_blank => false,:selected => member.course_group_id}, + {:onchange=>"join_group_function('#join_group_form_#{member.id}');", :id =>"course_group_id", :name => "course_group_id",:class=>"w100 undis class-edit sy_fenban_select", :style => "margin-left: 5px;"}) %> + <% end %> <% end %> + <% else %> + <%=member.course_group_id == 0 ? "暂无" : member.course_group.name %> <% end %>
    +
    +
    +
      + <%= pagination_links_full @mem_pages, @members_count, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true%> +
    +
    +
    +
    <% else%>

    <%= l(:label_no_data) %>

    <% end %> -<% if members.any? %> -
    -
      -
    • 姓名
    • -
    • 学号
    • - <% unless @course.course_groups.empty? %> -
    • 分班
    • - <% end %> -
    • - <%= link_to '英雄榜', member_score_sort_course_path(:sort_type => 'score', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0),:search_name => (@search_name ? @search_name : nil)) ,:result => members,method: 'get', remote: true, :class => 'ml35'%> - <% if @sort_type == "score" && @score_sort_by == 'desc' %> - - <% elsif @sort_type == "score" && @score_sort_by == 'asc' %> - - <% end %> -
    • -
    • - <%= link_to '活跃度', member_score_sort_course_path(:sort_type => 'act_score', :sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0),:search_name => (@search_name ? @search_name : nil)) ,:result => members,method: 'get', remote: true, :class => 'ml35'%> - <% if @sort_type == "act_score" && @score_sort_by == 'desc' %> - - <% elsif @sort_type == "act_score" && @score_sort_by == 'asc' %> - - <% end %> -
    • -
    • 加入时间
    • -
    -
    - - <% members.each do |member| %> -
    - - <%= member.user.nil? ? '' : (image_tag(url_to_avatar(member.user), :width => 32, :height => 32)) %> - -
      -
    • - <%= link_to("#{l(:label_bidding_user_studentname)}:".html_safe,user_path(member.user)) %> -
    • -
      - <% unless member.user.user_extensions.student_id == ''%> -
    • <%= link_to("#{l(:label_bidding_user_studentcode)}:".html_safe,user_path(member.user)) %>
    • - <% end%> -
    - <% unless @course.course_groups.empty? %> - <% if User.current.allowed_to?(:as_teacher, @course) || User.current.admin? %> - <% if @course.course_groups.nil? || @group %> -
    - -
    - <% else %> - <%= form_tag({:controller => 'courses', :action => 'teacher_assign_group', :id => @course.id,:user_id => member.user_id},:remote=>'true', :method => 'post', :id=>"join_group_form_#{member.id}", :class => 'query_form') do %> -
    - -
    - <%= select( :name,:group_id, course_group_option(@course), - { :include_blank => false,:selected => member.course_group_id}, - {:onchange=>"join_group_function('#join_group_form_#{member.id}');", :id =>"course_group_id", :name => "course_group_id",:class=>"w125 undis class-edit fl", :style => "margin-left: 5px;"}) %> - <% end %> - <% end %> - <% else %> -
    - -
    - <% end %> - <% end %> - <%= link_to format("%0.2f",member.score.nil? ? 0 : member.score.to_s), { - :action => 'show_member_score', - :member_id => member.id, - :remote => true}, - :class => "st_list_score c_red #{@course.course_groups.empty? ? 'ml130' : ''}" %> - <%= link_to member.act_score.nil? ? 0 : member.act_score.to_s, { - :action => 'show_member_act_score', - :member_id => member.id, - :remote => true}, - :class => 'st_list_score c_red' %> - <%= format_date(member.created_on)%> - <%= call_hook(:view_projects_settings_members_table_row, { :course => @course, :member => member}) %> -
    -
    - <% end; reset_cycle %> -
    - - -<% else%> -

    - <%= l(:label_no_data) %> -

    -<% end%> - diff --git a/app/views/gantts/show.html.erb b/app/views/gantts/show.html.erb index 759f8c232..d24971be2 100644 --- a/app/views/gantts/show.html.erb +++ b/app/views/gantts/show.html.erb @@ -319,5 +319,5 @@ <% end %> diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb index b0de79d7c..fced40737 100644 --- a/app/views/layouts/base_projects.html.erb +++ b/app/views/layouts/base_projects.html.erb @@ -89,7 +89,7 @@
    -
    +
    <%= render_flash_messages %> <%= yield %> <%= call_hook :view_layouts_base_content %> diff --git a/app/views/projects/feedback.html.erb b/app/views/projects/feedback.html.erb index 77f754567..f46b04aee 100644 --- a/app/views/projects/feedback.html.erb +++ b/app/views/projects/feedback.html.erb @@ -50,5 +50,5 @@ function checkMaxLength() { <% html_title(l(:label_project_tool_response)) -%> \ No newline at end of file diff --git a/app/views/pull_requests/index.html.erb b/app/views/pull_requests/index.html.erb index 2af67293f..1001557ae 100644 --- a/app/views/pull_requests/index.html.erb +++ b/app/views/pull_requests/index.html.erb @@ -1,4 +1,4 @@ -<%= render :partial => "pull_requests/pull_request_container" %> +<%#= render :partial => "pull_requests/pull_request_container" %>
    • <%= link_to "待处理#{@requests_opened_count}".html_safe, project_pull_requests_path(:type => "1"), :remote => true %>
    • <%= link_to "已处理#{@requests_merged_count}".html_safe, project_pull_requests_path(:type => "2"), :remote => true %>
    • @@ -16,7 +16,8 @@ diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index b12302e6e..2f6d53c8c 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -94,5 +94,5 @@ <% html_title(l(:label_repository)) -%> diff --git a/app/views/versions/index.html.erb b/app/views/versions/index.html.erb index 3a3740a23..ee940f342 100644 --- a/app/views/versions/index.html.erb +++ b/app/views/versions/index.html.erb @@ -74,5 +74,5 @@ <%= context_menu issues_context_menu_path %> diff --git a/app/views/wiki/edit.html.erb b/app/views/wiki/edit.html.erb index 83b1d18ae..a14cc01c1 100644 --- a/app/views/wiki/edit.html.erb +++ b/app/views/wiki/edit.html.erb @@ -68,5 +68,5 @@ <% html_title @page.pretty_title %> diff --git a/app/views/wiki/show.html.erb b/app/views/wiki/show.html.erb index 995c44924..bd9a0dc90 100644 --- a/app/views/wiki/show.html.erb +++ b/app/views/wiki/show.html.erb @@ -95,6 +95,6 @@ }); }; - $("#RSide").css("width","730px"); + $(".project_r_h").parent().css({"width":"730px","background-color":"#fff","padding":"10px","margin-left":"10px","margin-bottom":"10px"});
    \ No newline at end of file From c245d2fecd59f15313fa363db3980ee0152119dd Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Sep 2016 15:49:53 +0800 Subject: [PATCH 093/154] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=A4=B4=E9=83=A8?= =?UTF-8?q?=E8=B4=B4=E5=90=A7=E4=BA=A4=E6=B5=81=E6=94=B9=E4=B8=BA=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_logined_header.html.erb | 2 +- app/views/layouts/_unlogin_header.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/_logined_header.html.erb b/app/views/layouts/_logined_header.html.erb index cda8e8be5..1fb3071e0 100644 --- a/app/views/layouts/_logined_header.html.erb +++ b/app/views/layouts/_logined_header.html.erb @@ -18,7 +18,7 @@ <% end %> diff --git a/app/views/layouts/_unlogin_header.html.erb b/app/views/layouts/_unlogin_header.html.erb index bc21ff8d2..18d56fc72 100644 --- a/app/views/layouts/_unlogin_header.html.erb +++ b/app/views/layouts/_unlogin_header.html.erb @@ -8,7 +8,7 @@
    From 06ea193eb444b65734fb2d0e8dbef95b9aaf7249 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 29 Sep 2016 16:23:53 +0800 Subject: [PATCH 094/154] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E5=BA=93=E5=85=AC=E5=85=B1=E8=B5=84=E6=BA=90=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=8F=B3=E9=94=AE=E5=88=A0=E9=99=A4=E3=80=81=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_resources_list.html.erb | 2 +- app/views/users/_user_resource_info.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index 0190e60dc..3c78e3a0c 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -249,7 +249,7 @@ } line.children().css("background-color", 'white'); id = line.children().last().html(); - user_id = line.children().eq(5).html(); + user_id = line.children().eq(4).html(); if(user_id === '<%= User.current.id%>') { if(line.children().first().children().data('hasHistory') == 'Y'){ alert('该资源存在历史版本,不能删除'); diff --git a/app/views/users/_user_resource_info.html.erb b/app/views/users/_user_resource_info.html.erb index d3b169a17..d5a31bdf7 100644 --- a/app/views/users/_user_resource_info.html.erb +++ b/app/views/users/_user_resource_info.html.erb @@ -225,7 +225,7 @@ document.oncontextmenu = function() {return true;} line.children().css("background-color",'white'); id = line.children().last().html(); - user_id = line.children().eq(5).html(); + user_id = line.children().eq(4).html(); if(user_id === '<%= User.current.id %>') { res_name = line.children().eq(1).children().attr('title'); res_link = line.children().eq(1).html(); From e2be4a9e7fb28fc67e560173e53375ce52874d3a Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 29 Sep 2016 16:55:32 +0800 Subject: [PATCH 095/154] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=9A=E4=BD=9C=E4=B8=9A=E7=8F=AD=E7=BA=A7?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E6=97=B6=EF=BC=8C=E4=BD=9C=E4=B8=9A=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=A0=B7=E5=BC=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/admin/homework.html.erb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/views/admin/homework.html.erb b/app/views/admin/homework.html.erb index 03472d0a0..aaf21999d 100644 --- a/app/views/admin/homework.html.erb +++ b/app/views/admin/homework.html.erb @@ -38,11 +38,13 @@
    <%=link_to(homework.try(:name), student_work_index_path(:homework => homework.id))%> - <%= link_to(homework.course.name, course_path(homework.course.id)) %> + + + <% if homework.course %> + <%= link_to homework.course.name, course_path(homework.course.id) %> + <% end %> <%= homework.try(:user)%><% else %><%=homework.try(:user).try(:realname) %><% end %>'> <% if homework.try(:user).try(:realname) == ' '%> <%= link_to(homework.try(:user), user_path(homework.user_id)) %> From 17c82c5291c4f07b8a60dff788d4a473a4fc8954 Mon Sep 17 00:00:00 2001 From: cxt Date: Thu, 29 Sep 2016 17:17:17 +0800 Subject: [PATCH 096/154] =?UTF-8?q?=E5=B7=B2=E6=8F=90=E4=BA=A4=E4=BD=9C?= =?UTF-8?q?=E5=93=81=E7=9A=84=E5=88=86=E7=BB=84=E4=BD=9C=E4=B8=9A=E5=8F=AF?= =?UTF-8?q?=E6=89=A9=E5=A4=A7=E5=88=86=E7=BB=84=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/homework_common/edit.html.erb | 2 +- app/views/users/_user_group_attr.html.erb | 32 +++++++++++++++++--- app/views/users/_user_homework_form.html.erb | 2 +- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/app/views/homework_common/edit.html.erb b/app/views/homework_common/edit.html.erb index ec5ecc31c..b2bc236ca 100644 --- a/app/views/homework_common/edit.html.erb +++ b/app/views/homework_common/edit.html.erb @@ -47,7 +47,7 @@ <% elsif @homework.homework_type == 2 %>

    已有<%=committed_work_count %>个学生提交作品,不允许再修改作业类型和测试集。

    <% elsif @homework.homework_type == 3 %> -

    已有<%=committed_work_count %>个学生提交作品,不允许再修改作业类型和分组设置。

    +

    已有<%=committed_work_count %>个学生提交作品,不允许再修改作业类型和分组设置(可扩大分组范围)。

    <% end %> <% elsif stu_pro_count != 0 && @homework.homework_type == 3 %>

    已有<%=stu_pro_count %>个学生关联项目,不允许再修改作业类型。

    diff --git a/app/views/users/_user_group_attr.html.erb b/app/views/users/_user_group_attr.html.erb index 4596ef411..5d1475991 100644 --- a/app/views/users/_user_group_attr.html.erb +++ b/app/views/users/_user_group_attr.html.erb @@ -1,10 +1,10 @@
    分组设置:
    每组最小人数: - />人 + />人
    每组最大人数: - />人 + />人
    @@ -21,7 +21,29 @@
    \ No newline at end of file diff --git a/app/views/users/_user_homework_form.html.erb b/app/views/users/_user_homework_form.html.erb index f225e4fcd..b8785dc9a 100644 --- a/app/views/users/_user_homework_form.html.erb +++ b/app/views/users/_user_homework_form.html.erb @@ -7,7 +7,7 @@ var first_click = true; $(function(){ $("#homework_type_option").on("change",function(){ - var type = $(this).children('option:selected').val() + var type = $(this).children('option:selected').val(); if(type == "1"){ $("#homeworkSetting").addClass("undis"); $("#homeworkSetting").html(""); From 742d5b630b4999b4cf1182fc2d0420b9078ce5d5 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 29 Sep 2016 17:18:46 +0800 Subject: [PATCH 097/154] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=EF=BC=9A=E5=AF=BC=E5=85=A5=E9=97=AE=E5=8D=B7=E4=B8=80=E7=9B=B4?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E6=9C=AA=E6=9C=89=E6=96=B0=E5=BB=BA=E9=97=AE?= =?UTF-8?q?=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/poll/other_poll.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/poll/other_poll.js.erb b/app/views/poll/other_poll.js.erb index 26ec89046..19dc17052 100644 --- a/app/views/poll/other_poll.js.erb +++ b/app/views/poll/other_poll.js.erb @@ -1,6 +1,6 @@ <% if @polls.empty? %> - alert('您目前还没有自己新建的问卷'); + alert('您目前其他课程无问卷可导入'); <% else %> $('#ajax-modal').html('<%= escape_javascript(render :partial => 'other_poll',:locals => {:polls => @polls,:polls_group_id=>@polls_group_id}) %>'); From a9a53caa1377645db0c2c09c5687c589efc94d9c Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 30 Sep 2016 10:29:42 +0800 Subject: [PATCH 098/154] =?UTF-8?q?=E5=AD=A6=E7=94=9F=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E4=BD=9C=E5=93=81=E5=90=8E=EF=BC=8C=E8=B7=B3=E8=BD=AC=E8=87=B3?= =?UTF-8?q?=E2=80=9C=E4=BD=9C=E5=93=81=E5=88=97=E8=A1=A8=E2=80=9D=EF=BC=8C?= =?UTF-8?q?=E8=80=8C=E4=B8=8D=E6=98=AF=E2=80=9C=E4=BD=9C=E4=B8=9A=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 2 +- app/views/student_work/_work_edit_information.html.erb | 2 +- app/views/student_work/_work_information.html.erb | 2 +- app/views/student_work/update.js.erb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 792ba4690..5ab85e21d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1033,7 +1033,7 @@ class UsersController < ApplicationController update_org_activity(homework.class,homework.id) flash[:notice] = l(:notice_successful_create) - redirect_to student_work_index_url(:homework => params[:homework]) + redirect_to student_work_index_url(:homework => params[:homework], :tab => 2) else render_403 end diff --git a/app/views/student_work/_work_edit_information.html.erb b/app/views/student_work/_work_edit_information.html.erb index 057d305d5..d3e430d6e 100644 --- a/app/views/student_work/_work_edit_information.html.erb +++ b/app/views/student_work/_work_edit_information.html.erb @@ -38,6 +38,6 @@ \ No newline at end of file diff --git a/app/views/student_work/_work_information.html.erb b/app/views/student_work/_work_information.html.erb index f9da89c11..eabab8ed0 100644 --- a/app/views/student_work/_work_information.html.erb +++ b/app/views/student_work/_work_information.html.erb @@ -39,6 +39,6 @@ \ No newline at end of file diff --git a/app/views/student_work/update.js.erb b/app/views/student_work/update.js.erb index 9dc381e42..4f2ace330 100644 --- a/app/views/student_work/update.js.erb +++ b/app/views/student_work/update.js.erb @@ -12,5 +12,5 @@ window.location.href = '<%= edit_student_work_url(@work)%>'; function clickCanel() { hideModal('#popbox02'); - window.location.href = '<%= student_work_index_url(:homework => @homework.id)%>'; + window.location.href= "<%= Setting.protocol%>://"+"<%= Setting.host_name%>"+"/student_work?homework=" + "<%= @homework.id%>&tab=2" } \ No newline at end of file From 6ed65abb67b10ea31b86b325feb8cb1feacedcd2 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 30 Sep 2016 10:44:52 +0800 Subject: [PATCH 099/154] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=BA=93=E6=8A=A5500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/redmine/scm/adapters/git_adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb index 927018b34..76666b071 100644 --- a/lib/redmine/scm/adapters/git_adapter.rb +++ b/lib/redmine/scm/adapters/git_adapter.rb @@ -61,7 +61,7 @@ module Redmine end end - def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil) + def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil, project_id) super @path_encoding = path_encoding.blank? ? 'UTF-8' : path_encoding end From 0ad71e0f64768fe89cfd67c2d9f69d486d090a8a Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 30 Sep 2016 11:07:22 +0800 Subject: [PATCH 100/154] =?UTF-8?q?issue=E5=88=97=E8=A1=A8=E5=8F=8A?= =?UTF-8?q?=E5=B7=A6=E4=BE=A7=E5=AF=BC=E8=88=AA=E6=A0=8F=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E8=B7=9F=E8=B8=AA=E7=9A=84issue=E7=9A=84=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E7=BB=9F=E8=AE=A1=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/index.html.erb | 2 +- app/views/projects/_development_group.html.erb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 9f8accdaa..9a150bf92 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -122,7 +122,7 @@ 新 增
    diff --git a/app/views/projects/_development_group.html.erb b/app/views/projects/_development_group.html.erb index ad8d9a35a..57fea898b 100644 --- a/app/views/projects/_development_group.html.erb +++ b/app/views/projects/_development_group.html.erb @@ -8,8 +8,8 @@ <% unless @project.enabled_modules.where("name = 'issue_tracking'").empty? %> <% if @center_flag %>
    <% else %> -
    +
    <% if User.current == @syllabus.user %>

    您建立的课程还未创建班级,请 <%= link_to "新建班级", new_course_path(:host=> Setting.host_course, :syllabus_id => @syllabus.id), :class => "sy_corange", :target => '_blank'%> From 23d5d57f5caff5cb5a2c33c203208bd10efdf45d Mon Sep 17 00:00:00 2001 From: huang Date: Sat, 8 Oct 2016 10:49:50 +0800 Subject: [PATCH 120/154] =?UTF-8?q?admin=E2=80=9C=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E2=80=9D=E9=A1=B6=E9=83=A8=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E2=80=9C=E5=85=AC=E5=85=B1=E8=B4=B4=E5=90=A7=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 4 ++-- app/views/layouts/_logined_header.html.erb | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 1305320cf..cbeade2a3 100644 --- a/Gemfile +++ b/Gemfile @@ -50,10 +50,10 @@ gem 'elasticsearch-model' gem 'elasticsearch-rails' #rails 3.2.22.2 bug - # gem "test-unit", "~>3.0" + gem "test-unit", "~>3.0" ### profile - # gem 'oneapm_rpm' + gem 'oneapm_rpm' group :development do gem 'grape-swagger' diff --git a/app/views/layouts/_logined_header.html.erb b/app/views/layouts/_logined_header.html.erb index 98c06aafb..378741035 100644 --- a/app/views/layouts/_logined_header.html.erb +++ b/app/views/layouts/_logined_header.html.erb @@ -14,13 +14,14 @@

    - - - - <% end %> - + <% else %> + + <% end %>
    \ No newline at end of file diff --git a/app/views/student_work/_evaluation_un_group_work.html.erb b/app/views/student_work/_evaluation_un_group_work.html.erb index 25b42e5f6..bd3d71a28 100644 --- a/app/views/student_work/_evaluation_un_group_work.html.erb +++ b/app/views/student_work/_evaluation_un_group_work.html.erb @@ -1,7 +1,7 @@
    - + <% if student_work.work_status%> <%=get_status student_work.work_status %> @@ -16,12 +16,11 @@ <% end %> <% end %> - 评分
    提交时间:<%=format_date(student_work.commit_time) %> -
    +
    教师:<%= student_work.teacher_score.nil? ? "--" : format("%.1f",student_work.teacher_score)%>
    助教:<%= student_work.teaching_asistant_score.nil? ? "--" : format("%.1f",student_work.teaching_asistant_score)%>
    <% if @homework.anonymous_comment == 0 %> @@ -69,5 +68,6 @@
    + 评分
    \ No newline at end of file diff --git a/app/views/student_work/_group_member_work.html.erb b/app/views/student_work/_group_member_work.html.erb index bfe25c982..a03a9fb93 100644 --- a/app/views/student_work/_group_member_work.html.erb +++ b/app/views/student_work/_group_member_work.html.erb @@ -2,7 +2,7 @@ <% student_work_groups = @homework.student_works.where("user_id in #{user_ids}").order("created_at asc") %> <% anon_count = student_work.student_works_scores.where(:reviewer_role => 3).group_by(&:user_id).count %> <% student_work_groups.each_with_index do |st, j| %> -
    +
    <%= render :partial => 'evaluation_un_group_member_work', :locals => {:st => st, :anon_count => anon_count} %>
    <% if j != 0 %> From b4036ba901c0e433c3d9e7668f693afd8a56bb6b Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 8 Oct 2016 15:28:09 +0800 Subject: [PATCH 126/154] =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=AE=BD=E5=BA=A6=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_evaluation_un_group_member_work.html.erb | 8 ++++---- .../student_work/_evaluation_un_group_work.html.erb | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/student_work/_evaluation_un_group_member_work.html.erb b/app/views/student_work/_evaluation_un_group_member_work.html.erb index d373600a5..ac13c57ed 100644 --- a/app/views/student_work/_evaluation_un_group_member_work.html.erb +++ b/app/views/student_work/_evaluation_un_group_member_work.html.erb @@ -8,18 +8,18 @@ (组长) -
    diff --git a/app/views/student_work/_evaluation_un_group_work.html.erb b/app/views/student_work/_evaluation_un_group_work.html.erb index bd3d71a28..31b8fd190 100644 --- a/app/views/student_work/_evaluation_un_group_work.html.erb +++ b/app/views/student_work/_evaluation_un_group_work.html.erb @@ -9,18 +9,18 @@ <% if @homework.homework_detail_group.base_on_project == 1 %> - 关联项目: <% if student_work.project.is_public || User.current.member_of?(student_work.project) || User.current.admin? %> - <%= link_to student_work.project.name, project_path(student_work.project.id), :class => 'link-blue fl hidden', :style => "width:200px;", :title => "项目名称"%> + <%= link_to student_work.project.name, project_path(student_work.project.id), :class => 'link-blue fr hidden', :style => "max-width:200px;", :title => "项目名称"%> <% else %> - + <% end %> + 关联项目: <% end %>
    - 提交时间:<%=format_date(student_work.commit_time) %> -
    + 提交时间:<%=format_date(student_work.commit_time) %> +
    教师:<%= student_work.teacher_score.nil? ? "--" : format("%.1f",student_work.teacher_score)%>
    助教:<%= student_work.teaching_asistant_score.nil? ? "--" : format("%.1f",student_work.teaching_asistant_score)%>
    <% if @homework.anonymous_comment == 0 %> From 053e66c4645a91d2bfdde9b5dc0ba29ed76bc2c2 Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 8 Oct 2016 15:37:55 +0800 Subject: [PATCH 127/154] =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=AE=BD=E5=BA=A6=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_evaluation_un_group_member_work.html.erb | 12 ++++++------ .../student_work/_evaluation_un_group_work.html.erb | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/student_work/_evaluation_un_group_member_work.html.erb b/app/views/student_work/_evaluation_un_group_member_work.html.erb index ac13c57ed..efd3440f7 100644 --- a/app/views/student_work/_evaluation_un_group_member_work.html.erb +++ b/app/views/student_work/_evaluation_un_group_member_work.html.erb @@ -4,22 +4,22 @@
    > <%= link_to(image_tag(url_to_avatar(st.user),:width =>"40",:height => "40", :style => "display:block;"),user_activities_path(st.user), :class => "fl") %> <% if !is_expand %> - - + + (组长) <% else %> - - + + <% end %> -
    +
    <%= st.teacher_score.nil? ? "--" : format("%.1f",st.teacher_score)%>
    <%= st.teaching_asistant_score.nil? ? "--" : format("%.1f",st.teaching_asistant_score)%>
    <% if @homework.anonymous_comment == 0 %> @@ -68,7 +68,7 @@
    <% if is_expand %> -
    评分
    +
    评分
    <% end %>
    diff --git a/app/views/student_work/_evaluation_un_group_work.html.erb b/app/views/student_work/_evaluation_un_group_work.html.erb index 31b8fd190..8c18d64c7 100644 --- a/app/views/student_work/_evaluation_un_group_work.html.erb +++ b/app/views/student_work/_evaluation_un_group_work.html.erb @@ -19,8 +19,8 @@
    - 提交时间:<%=format_date(student_work.commit_time) %> -
    + 提交时间:<%=format_date(student_work.commit_time) %> +
    教师:<%= student_work.teacher_score.nil? ? "--" : format("%.1f",student_work.teacher_score)%>
    助教:<%= student_work.teaching_asistant_score.nil? ? "--" : format("%.1f",student_work.teaching_asistant_score)%>
    <% if @homework.anonymous_comment == 0 %> @@ -68,6 +68,6 @@
    - 评分 + 评分
    \ No newline at end of file From 9d65d61f2a0ee70324b7c21b09e990827b88375d Mon Sep 17 00:00:00 2001 From: cxt Date: Sat, 8 Oct 2016 15:56:43 +0800 Subject: [PATCH 128/154] =?UTF-8?q?=E6=95=99=E5=B8=88=E5=9B=A2=E9=98=9F?= =?UTF-8?q?=E4=B8=AD=E5=8F=AA=E6=9C=89=E4=B8=80=E4=B8=AA=E6=95=99=E5=B8=88?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E5=BA=94=E6=9C=89=E4=B8=8A=E7=A7=BB=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/syllabuses/_syllabus_member_list.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/syllabuses/_syllabus_member_list.html.erb b/app/views/syllabuses/_syllabus_member_list.html.erb index 84bbe1d01..97a500f56 100644 --- a/app/views/syllabuses/_syllabus_member_list.html.erb +++ b/app/views/syllabuses/_syllabus_member_list.html.erb @@ -42,7 +42,9 @@ <% else %> 删除 <% end %> - <% if i != 0 && i < count - 1 %> + <% if i == 0 && count == 1 %> +   + <% elsif i != 0 && i < count - 1 %> <%= link_to('下移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'down'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '下移') %> <%= link_to('上移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'up'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '上移') %> <% elsif i < count - 1 %> From 30e6bd6d0ed1931cc6751017bed3fe4cb1970a4b Mon Sep 17 00:00:00 2001 From: huang Date: Sat, 8 Oct 2016 16:04:35 +0800 Subject: [PATCH 129/154] =?UTF-8?q?=E8=B6=85=E7=BA=A7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E7=9C=8B=E4=BB=96=E4=BA=BA=E7=9A=84=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=88=97=E8=A1=A8500=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/base_users_new.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/base_users_new.html.erb b/app/views/layouts/base_users_new.html.erb index 6f70353e3..2f3ef2928 100644 --- a/app/views/layouts/base_users_new.html.erb +++ b/app/views/layouts/base_users_new.html.erb @@ -166,13 +166,13 @@ <% else%> \ No newline at end of file diff --git a/app/views/files/_project_list.html.erb b/app/views/files/_project_list.html.erb index faf254015..3193f4b42 100644 --- a/app/views/files/_project_list.html.erb +++ b/app/views/files/_project_list.html.erb @@ -40,8 +40,10 @@
    <%= render :partial => 'files/file_description', :locals => {:file => file} %>
    - + <%= form_tag(edit_file_description_project_file_path(file, :project_id => project.id),:remote=>'true', :method => :post, :id=>"files_query_form_#{file.id}") do %> + + <% end %>
    <% else %>
    @@ -70,6 +72,11 @@ <%= pagination_links_full @feedback_pages, @feedback_count, :per_page_links => false, :remote => true, :flag => true%> + diff --git a/app/views/files/_resource_detail.html.erb b/app/views/files/_resource_detail.html.erb index b60814afd..08b85ab2f 100644 --- a/app/views/files/_resource_detail.html.erb +++ b/app/views/files/_resource_detail.html.erb @@ -42,8 +42,10 @@
    <%= render :partial => 'files/file_description', :locals => {:file => file} %>
    - + <%= form_tag(edit_file_description_course_file_path(file, :course_id => @course.id),:remote=>'true', :method => :post, :id=>"files_query_form_#{file.id}") do %> + + <% end %>
    <% else %>
    @@ -99,4 +101,9 @@
    -
    \ No newline at end of file +
    + diff --git a/app/views/files/edit_file_description.js.erb b/app/views/files/edit_file_description.js.erb new file mode 100644 index 000000000..40b47a2ec --- /dev/null +++ b/app/views/files/edit_file_description.js.erb @@ -0,0 +1,3 @@ +$("#file_description_show_<%= @attachment.id %>").html("<%= escape_javascript render(:partial => "files/file_description", :locals => {:file => @attachment}) %>"); +$("#file_description_show_<%= @attachment.id %>").show(); +$("#file_description_edit_<%= @attachment.id %>").hide(); \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 4ff75cbf9..7ca24d861 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -133,6 +133,7 @@ RedmineApp::Application.routes.draw do member do match "quote_resource_show_org_subfield", :via => [:get] get "update_file_description" + post "edit_file_description" end end @@ -809,6 +810,7 @@ RedmineApp::Application.routes.draw do match "quote_resource_show", :via => [:get] get "file_hidden" get "update_file_description" + post "edit_file_description" end end @@ -1219,6 +1221,7 @@ RedmineApp::Application.routes.draw do get "file_hidden" post "republish_file" get "update_file_description" + post "edit_file_description" end end resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :new, :create, :update, :destroy] do From 125a389448b8e374bb6a0e1f600655cbd8b0874e Mon Sep 17 00:00:00 2001 From: huang Date: Sun, 9 Oct 2016 15:33:22 +0800 Subject: [PATCH 144/154] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E2=80=9C=E5=B8=AE=E5=8A=A9=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E2=80=9D500=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_logined_header.html.erb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_logined_header.html.erb b/app/views/layouts/_logined_header.html.erb index 378741035..b8235ff1c 100644 --- a/app/views/layouts/_logined_header.html.erb +++ b/app/views/layouts/_logined_header.html.erb @@ -14,9 +14,12 @@ - + <% memo = Memo.where(:id => 1168).first %> + <% unless memo.nil? %> + + <% end %> <% else %>
  • - <%= select_tag :end_time,options_for_select(course_time_option(@course.end_time),@course.end_time), {:id=>"new_end_time"} %> - <%= select_tag :end_term,options_for_select(course_term_option,@course.end_term || cur_course_term),{:id=>"new_end_term"} %> + <%= select_tag :end_time,options_for_select(course_time_option(@course[:end_time]),@course[:end_time]), {:id=>"new_end_time"} %> + <%= select_tag :end_term,options_for_select(course_term_option,@course[:end_term] || cur_course_term),{:id=>"new_end_term"} %> 仅针对跨越多个学期的班级,否则与开始学期保持一致。
  • From 41ee915ece7361d90b2fd3ca47d0b30b76f1ee3c Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Sun, 9 Oct 2016 16:55:41 +0800 Subject: [PATCH 147/154] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=B8=AE=E5=8A=A9=E4=B8=AD=E5=BF=83=EF=BC=8C?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=92=8C=E5=BB=BA=E8=AE=AE=E6=8A=A5500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_base_feedback.html.erb | 3 +++ app/views/layouts/_base_footer_public.html.erb | 3 +++ app/views/layouts/_footer.html.erb | 3 ++- app/views/layouts/_forbidden_new_feedback.html.erb | 3 +++ app/views/layouts/_logined_header_show.html.erb | 3 +++ app/views/layouts/_new_feedback.html.erb | 4 +++- app/views/layouts/_org_custom_footer.html.erb | 3 +++ app/views/layouts/_org_subdomain_footer.html.erb | 3 +++ app/views/layouts/_unlogin_header.html.erb | 3 +++ app/views/layouts/base_org.html.erb | 3 +++ app/views/layouts/base_org2.html.erb | 4 +++- app/views/layouts/base_org_newstyle.html.erb | 3 +++ app/views/layouts/base_organization.html.erb | 3 +++ app/views/organizations/_org2_footer.html.erb | 3 +++ app/views/sub_domains/show.html.erb | 3 +++ 15 files changed, 44 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_base_feedback.html.erb b/app/views/layouts/_base_feedback.html.erb index 9fe25ce95..7721eeb0d 100644 --- a/app/views/layouts/_base_feedback.html.erb +++ b/app/views/layouts/_base_feedback.html.erb @@ -158,6 +158,8 @@ function cookieget(n) }) +<% forum = Forum.where(:id => 1).first %> +<% unless forum.nil? %>
    @@ -189,4 +191,5 @@ function cookieget(n)
    +<% end %> diff --git a/app/views/layouts/_base_footer_public.html.erb b/app/views/layouts/_base_footer_public.html.erb index 18152c745..043c254e2 100644 --- a/app/views/layouts/_base_footer_public.html.erb +++ b/app/views/layouts/_base_footer_public.html.erb @@ -4,7 +4,10 @@
  • <%= l(:label_about_us)%>|
  • <%= l(:label_contact_us)%>|
  • <%= l(:label_recruitment_information)%>|
  • + <% memo = Memo.where(:id => 1168).first %> + <% unless memo.nil? %>
  • <%= link_to l(:label_surpport_group), "#{Setting.protocol}://#{Setting.host_name}/forums/1/memos/1168", :class => "f_grey mw20", :target=>"_blank" %>|
  • + <% end %>
  • <%= l(:label_forums)%>|
  • <%= l(:label_language)%>