Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged features from redmine_archive_issue_categories #13

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 53 additions & 7 deletions app/views/helpers/redmine_category_tree/issue_category_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module RedmineCategoryTree
module IssueCategoryHelper
def issue_category_tree_options_for_select(issue_categories, options={})
s = ''
issue_category_tree(issue_categories) do |category, level|
issue_category_tree(issue_categories, true) do |category, level|
if category.nil? || category.id.nil?
next
end
Expand All @@ -22,15 +22,61 @@ def issue_category_tree_options_for_select(issue_categories, options={})
if !options[:current].nil? && options[:current].id == category.id
tag_options[:disabled] = 'disabled'
end

tag_options.merge!(yield(category)) if block_given?
tag_options.merge!(yield(category)) if block_given?
s << content_tag('option', name_prefix + h(category), tag_options)

end
s.html_safe
end

def issue_category_tree(issue_categories, &block)
IssueCategory.issue_category_tree(issue_categories, &block)
def issue_category_tree(issue_categories, ignore_disabled = false, &block)

if ignore_disabled

cats = []
levels = []

cur_disabled_levels = []
IssueCategory.issue_category_tree(issue_categories) do |category, level|

# Child levels no longer matter if we moved up
while !cur_disabled_levels.empty? && cur_disabled_levels.last >= level
cur_disabled_levels.pop
end

has_disabled_parent_cat = !cur_disabled_levels.empty? && cur_disabled_levels.min < level
disabled_at_current_level = !cur_disabled_levels.empty? && cur_disabled_levels.last == level
current_cat_disabled = category.archived || has_disabled_parent_cat

# If archived here, current disabled level
if category.archived
cur_disabled_levels.push level
# Pop current level if reached again, but honor setting from parent for this one
elsif disabled_at_current_level
while !cur_disabled_levels.empty? && cur_disabled_levels.last == level
cur_disabled_levels.pop
end
end

if !current_cat_disabled
cats.push category
levels.push level
end

end

if !cats.nil?
# How to make a normal for loop?? => for(int i = 0; i < cats.size(); ++i) { ... } ???
len = cats.size - 1
(0..len).each do |i|
yield cats[i], levels[i]
end
end
return cats
else
IssueCategory.issue_category_tree(issue_categories, &block)
end
end

def render_issue_category_tree_list(categories, includeOuterUL=false, &block)
Expand Down Expand Up @@ -67,14 +113,14 @@ def render_issue_category_tree_list(categories, includeOuterUL=false, &block)
end

def render_issue_category_tree_context_menu_list(categories, includeOuterUL=false, &block)
categories = issue_category_tree(categories) { |cat, level| nil }
categories = issue_category_tree(categories, true) { |cat, level| nil }
return '' if categories.size == 0

output = ''
output << '<ul>' if includeOuterUL

path = [nil]
categories.each_with_index do |cat, idx|
if cat.parent_id != path.last
if path.include?(cat.parent_id)
Expand Down
198 changes: 198 additions & 0 deletions app/views/issues/bulk_edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
<h2><%= @copy ? l(:button_copy) : l(:label_bulk_edit_selected_issues) %></h2>

<% if @saved_issues && @unsaved_issues.present? %>
<div id="errorExplanation">
<span>
<%= l(:notice_failed_to_save_issues,
:count => @unsaved_issues.size,
:total => @saved_issues.size,
:ids => @unsaved_issues.map {|i| "##{i.id}"}.join(', ')) %>
</span>
<ul>
<% bulk_edit_error_messages(@unsaved_issues).each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>

<ul id="bulk-selection">
<% @issues.each do |issue| %>
<%= content_tag 'li', link_to_issue(issue) %>
<% end %>
</ul>

<%= form_tag(bulk_update_issues_path, :id => 'bulk_edit_form') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join("\n").html_safe %>
<div class="box tabular">
<fieldset class="attributes">
<legend><%= l(:label_change_properties) %></legend>

<div class="splitcontentleft">
<% if @allowed_projects.present? %>
<p>
<label for="issue_project_id"><%= l(:field_project) %></label>
<%= select_tag('issue[project_id]',
content_tag('option', l(:label_no_change_option), :value => '') +
project_tree_options_for_select(@allowed_projects, :selected => @target_project),
:onchange => "updateBulkEditFrom('#{escape_javascript url_for(:action => 'bulk_edit', :format => 'js')}')") %>
</p>
<% end %>
<p>
<label for="issue_tracker_id"><%= l(:field_tracker) %></label>
<%= select_tag('issue[tracker_id]',
content_tag('option', l(:label_no_change_option), :value => '') +
options_from_collection_for_select(@trackers, :id, :name, @issue_params[:tracker_id])) %>
</p>
<% if @available_statuses.any? %>
<p>
<label for='issue_status_id'><%= l(:field_status) %></label>
<%= select_tag('issue[status_id]',
content_tag('option', l(:label_no_change_option), :value => '') +
options_from_collection_for_select(@available_statuses, :id, :name, @issue_params[:status_id])) %>
</p>
<% end %>

<% if @safe_attributes.include?('priority_id') -%>
<p>
<label for='issue_priority_id'><%= l(:field_priority) %></label>
<%= select_tag('issue[priority_id]',
content_tag('option', l(:label_no_change_option), :value => '') +
options_from_collection_for_select(IssuePriority.active, :id, :name, @issue_params[:priority_id])) %>
</p>
<% end %>

<% if @safe_attributes.include?('assigned_to_id') -%>
<p>
<label for='issue_assigned_to_id'><%= l(:field_assigned_to) %></label>
<%= select_tag('issue[assigned_to_id]',
content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_nobody), :value => 'none', :selected => (@issue_params[:assigned_to_id] == 'none')) +
principals_options_for_select(@assignables, @issue_params[:assigned_to_id])) %>
</p>
<% end %>

<% if @safe_attributes.include?('category_id') -%>
<p>
<label for='issue_category_id'><%= l(:field_category) %></label>
<%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none', :selected => (@issue_params[:category_id] == 'none')) +
options_from_collection_for_select(@categories.reject { |c| c.archived }, :id, :name, @issue_params[:category_id])) %>
</p>
<% end %>

<% if @safe_attributes.include?('fixed_version_id') -%>
<p>
<label for='issue_fixed_version_id'><%= l(:field_fixed_version) %></label>
<%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none', :selected => (@issue_params[:fixed_version_id] == 'none')) +
version_options_for_select(@versions.sort, @issue_params[:fixed_version_id])) %>
</p>
<% end %>

<% @custom_fields.each do |custom_field| %>
<p>
<label><%= h(custom_field.name) %></label>
<%= custom_field_tag_for_bulk_edit('issue', custom_field, @issues, @issue_params[:custom_field_values][custom_field.id.to_s]) %>
</p>
<% end %>

<% if @copy && @attachments_present %>
<%= hidden_field_tag 'copy_attachments', '0' %>
<p>
<label for='copy_attachments'><%= l(:label_copy_attachments) %></label>
<%= check_box_tag 'copy_attachments', '1', params[:copy_attachments] != '0' %>
</p>
<% end %>

<% if @copy && @subtasks_present %>
<%= hidden_field_tag 'copy_subtasks', '0' %>
<p>
<label for='copy_subtasks'><%= l(:label_copy_subtasks) %></label>
<%= check_box_tag 'copy_subtasks', '1', params[:copy_subtasks] != '0' %>
</p>
<% end %>

<%= call_hook(:view_issues_bulk_edit_details_bottom, { :issues => @issues }) %>
</div>

<div class="splitcontentright">
<% if @safe_attributes.include?('is_private') %>
<p>
<label for='issue_is_private'><%= l(:field_is_private) %></label>
<%= select_tag('issue[is_private]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:general_text_Yes), :value => '1', :selected => (@issue_params[:is_private] == '1')) +
content_tag('option', l(:general_text_No), :value => '0', :selected => (@issue_params[:is_private] == '0'))) %>
</p>
<% end %>

<% if @safe_attributes.include?('parent_issue_id') && @project %>
<p>
<label for='issue_parent_issue_id'><%= l(:field_parent_issue) %></label>
<%= text_field_tag 'issue[parent_issue_id]', '', :size => 10, :value => @issue_params[:parent_issue_id] %>
<label class="inline"><%= check_box_tag 'issue[parent_issue_id]', 'none', (@issue_params[:parent_issue_id] == 'none'), :id => nil, :data => {:disables => '#issue_parent_issue_id'} %><%= l(:button_clear) %></label>
</p>
<%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project)}')" %>
<% end %>

<% if @safe_attributes.include?('start_date') %>
<p>
<label for='issue_start_date'><%= l(:field_start_date) %></label>
<%= text_field_tag 'issue[start_date]', '', :value => @issue_params[:start_date], :size => 10 %><%= calendar_for('issue_start_date') %>
<label class="inline"><%= check_box_tag 'issue[start_date]', 'none', (@issue_params[:start_date] == 'none'), :id => nil, :data => {:disables => '#issue_start_date'} %><%= l(:button_clear) %></label>
</p>
<% end %>

<% if @safe_attributes.include?('due_date') %>
<p>
<label for='issue_due_date'><%= l(:field_due_date) %></label>
<%= text_field_tag 'issue[due_date]', '', :value => @issue_params[:due_date], :size => 10 %><%= calendar_for('issue_due_date') %>
<label class="inline"><%= check_box_tag 'issue[due_date]', 'none', (@issue_params[:due_date] == 'none'), :id => nil, :data => {:disables => '#issue_due_date'} %><%= l(:button_clear) %></label>
</p>
<% end %>

<% if @safe_attributes.include?('done_ratio') && Issue.use_field_for_done_ratio? %>
<p>
<label for='issue_done_ratio'><%= l(:field_done_ratio) %></label>
<%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }, @issue_params[:done_ratio]) %>
</p>
<% end %>
</div>
</fieldset>

<fieldset>
<legend><%= l(:field_notes) %></legend>
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
<%= wikitoolbar_for 'notes' %>
</fieldset>
</div>

<p>
<% if @copy %>
<%= hidden_field_tag 'copy', '1' %>
<%= submit_tag l(:button_copy) %>
<%= submit_tag l(:button_copy_and_follow), :name => 'follow' %>
<% elsif @target_project %>
<%= submit_tag l(:button_move) %>
<%= submit_tag l(:button_move_and_follow), :name => 'follow' %>
<% else %>
<%= submit_tag l(:button_submit) %>
<% end %>
</p>

<% end %>

<%= javascript_tag do %>
$(window).load(function(){
$(document).on('change', 'input[data-disables]', function(){
if ($(this).attr('checked')){
$($(this).data('disables')).attr('disabled', true).val('');
} else {
$($(this).data('disables')).attr('disabled', false);
}
});
});
$(document).ready(function(){
$('input[data-disables]').trigger('change');
});
<% end %>
2 changes: 2 additions & 0 deletions app/views/projects/settings/_issue_categories.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
<td class="buttons">
<% if User.current.allowed_to?(:manage_categories, @project) %>
<%= link_to l(:button_edit), edit_issue_category_path(category), :class => 'icon icon-edit' %>
<%= link_to(l(:button_archive), archive_issue_category_path(category), :method => :post, :class => 'icon icon-lock') unless category.archived? %>
<%= link_to(l(:button_unarchive), unarchive_issue_category_path(category), :method => :post, :class => 'icon icon-lock') if category.archived? %>
<%= delete_link issue_category_path(category) %>
<% end %>
</td>
Expand Down
6 changes: 6 additions & 0 deletions assets/stylesheets/styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
tr.issue_category.archived {
color: #aaa;
}
tr.issue_category.archived a {
color: #aaa;
}
12 changes: 12 additions & 0 deletions config/locales/de.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# English strings go here for Rails i18n
de:
label_issue_category_parent_id: "Child category of"
issue_category_move_top: "Move to Top"
issue_category_move_up: "Move Up"
issue_category_move_down: "Move Down"
issue_category_move_bottom: "Move to Bottom"
issue_category_successful_move: "Category moved successfully"
issue_category_not_found: "Failed to load issue category"
plugin_notice_successful_archived: Kategorie wurde archiviert.
plugin_notice_successful_unarchived: Kategorie wurde entarchiviert.
plugin_delete_button_note: Dies wird den Kategorie-Namen auch aus alten Tickets entfernen!
4 changes: 4 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@ en:
issue_category_move_bottom: "Move to Bottom"
issue_category_successful_move: "Category moved successfully"
issue_category_not_found: "Failed to load issue category"
plugin_notice_successful_archived: Category archived successfully.
plugin_notice_successful_unarchived: Category unarchived successfully.
plugin_delete_button_note: This will also remove the category name from old tickets!

4 changes: 4 additions & 0 deletions config/locales/ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@ ru:
issue_category_move_bottom: "Переместить вниз"
issue_category_successful_move: "Категория успешно перемещена"
issue_category_not_found: "Невозможно загрузить категории"
plugin_notice_successful_archived: Category archived successfully.
plugin_notice_successful_unarchived: Category unarchived successfully.
plugin_delete_button_note: This will also remove the category name from old tickets!

9 changes: 9 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
get 'issue_categories/:id/move/:direction', :to => 'issue_categories#move_category'

Rails.application.routes.draw do
resources :issue_categories do
member do
post 'archive'
post 'unarchive'
end
end
end
12 changes: 12 additions & 0 deletions db/migrate/003_change_issue_categories.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class ChangeIssueCategories < ActiveRecord::Migration
class IssueCategory < ActiveRecord::Base
end

def up
add_column :issue_categories, :archived, :boolean, :default => false
end

def down
remove_column :issue_categories, :archived
end
end
2 changes: 1 addition & 1 deletion init.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
name 'Redmine Category Tree'
author 'Brett Patterson'
description 'Adds ability for categories to have "children"'
version '0.0.5'
version '0.0.6'

permission :move_category, :issue_categories => :move_category

Expand Down
Loading