Project

General

Profile

Feature #16188 ยป 2021-09-25-133700-archive_issue_categories.patch

Thomas Zauner, 2021-09-25 13:38

View differences:

app/controllers/issue_categories_controller.rb
23 23
  before_action :find_model_object, :except => [:index, :new, :create]
24 24
  before_action :find_project_from_association, :except => [:index, :new, :create]
25 25
  before_action :find_project_by_project_id, :only => [:index, :new, :create]
26
  before_action :authorize
27
  accept_api_auth :index, :show, :create, :update, :destroy
26
  before_action :authorize, :except => [:archive, :unarchive]
27
  accept_api_auth :index, :show, :create, :update, :destroy, :archive, :unarchive
28 28

  
29 29
  def index
30 30
    respond_to do |format|
......
94 94
      end
95 95
    end
96 96
  end
97
  
98
  def archive
99
    @category.archived = true
100
    if @category.save
101
      respond_to do |format|
102
        format.html do
103
          flash[:notice] = l(:notice_successful_update)
104
          redirect_to_settings_in_projects
105
        end
106
        format.js
107
        format.api { render :action => 'show', :status => :created, :location => issue_category_path(@category) }
108
      end
109
    end
110
  end
111
    
112
  def unarchive
113
    @category.archived = false
114
    if @category.save
115
      respond_to do |format|
116
        format.html do
117
          flash[:notice] = l(:notice_successful_update)
118
          redirect_to_settings_in_projects
119
        end
120
        format.js
121
        format.api { render :action => 'show', :status => :created, :location => issue_category_path(@category) }
122
      end
123
    end
124
  end
97 125

  
98 126
  def destroy
99 127
    @issue_count = @category.issues.size
app/controllers/issues_controller.rb
316 316
    @assignables = target_projects.map(&:assignable_users).reduce(:&)
317 317
    @versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&)
318 318
    @categories = target_projects.map {|p| p.issue_categories}.reduce(:&)
319
    @active_categories = @categories.reject { |c| c.archived }
319 320
    if @copy
320 321
      @attachments_present = @issues.detect {|i| i.attachments.any?}.present?
321 322
      @subtasks_present = @issues.detect {|i| !i.leaf?}.present?
app/models/issue.rb
982 982
    users.uniq.sort
983 983
  end
984 984

  
985
  def assignable_issue_categories
986
    return [] if project.nil?
987

  
988
    categories = project.active_issue_categories
989
    if category && category.archived
990
      categories << category
991
    end
992
    categories.uniq.sort
993
  end
994
  
985 995
  # Versions that the issue can be assigned to
986 996
  def assignable_versions
987 997
    return @assignable_versions if @assignable_versions
app/models/project.rb
974 974
      value.custom_field.visible_by?(project, user)
975 975
    end
976 976
  end
977
    
978
  def active_issue_categories
979
    issue_categories.reject { |c| c.archived }
980
  end
977 981

  
978 982
  private
979 983

  
app/views/context_menus/issues.html.erb
86 86
  </li>
87 87
  <% end %>
88 88

  
89
  <% if @safe_attributes.include?('category_id') && @project && @project.issue_categories.any? -%>
89
  <% if @safe_attributes.include?('category_id') && @project && @project.active_issue_categories.any? -%>
90 90
  <li class="folder">
91 91
    <a href="#" class="submenu"><%= l(:field_category) %></a>
92 92
    <ul>
93
    <% @project.issue_categories.each do |u| -%>
93
    <% @project.active_issue_categories.each do |u| -%>
94 94
        <li><%= context_menu_link u.name, _bulk_update_issues_path(@issue, :ids => @issue_ids, :issue => {'category_id' => u}, :back_url => @back), :method => :patch,
95 95
                                  :selected => (@issue && u == @issue.category), :disabled => !@can[:edit] %></li>
96 96
    <% end -%>
app/views/issues/_attributes.html.erb
29 29
</p>
30 30
<% end %>
31 31

  
32
<% if @issue.safe_attribute?('category_id') && @issue.project.issue_categories.any? %>
33
<p><%= f.select :category_id, (@issue.project.issue_categories.collect {|c| [c.name, c.id]}),
32
<% if @issue.safe_attribute?('category_id') && @issue.assignable_issue_categories.any? %>
33
<p><%= f.select :category_id, (@issue.assignable_issue_categories.collect {|c| [c.name, c.id]}),
34 34
                {:include_blank => true, :required => @issue.required_attribute?('category_id')},
35 35
                 :onchange => ("updateIssueFrom('#{escape_javascript(update_issue_form_path(@project, @issue))}', this)" if @issue.new_record?) %>
36 36
<%= link_to(l(:label_issue_category_new),
app/views/issues/bulk_edit.html.erb
81 81
  <label for='issue_category_id'><%= l(:field_category) %></label>
82 82
  <%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') +
83 83
                                content_tag('option', l(:label_none), :value => 'none', :selected => (@issue_params[:category_id] == 'none')) +
84
                                options_from_collection_for_select(@categories, :id, :name, @issue_params[:category_id])) %>
84
                                options_from_collection_for_select(@active_categories, :id, :name, @issue_params[:category_id])) %>
85 85
</p>
86 86
<% end %>
87 87

  
app/views/projects/settings/_issue_categories.html.erb
16 16
    <td class="buttons">
17 17
      <% if User.current.allowed_to?(:manage_categories, @project) %>
18 18
        <%= link_to l(:button_edit), edit_issue_category_path(category), :class => 'icon icon-edit' %>
19
        <%= link_to(l(:button_archive), archive_issue_category_path(category), :method => :post, :class => 'icon icon-lock') unless category.archived? %>
20
        <%= link_to(l(:button_unarchive), unarchive_issue_category_path(category), :method => :post, :class => 'icon icon-lock') if category.archived? %>
19 21
        <%= delete_link issue_category_path(category) %>
20 22
      <% end %>
21 23
    </td>
config/routes.rb
405 405
      end
406 406
    end
407 407
  end
408
  
409
  resources :issue_categories do
410
    member do
411
      post 'archive'
412
      post 'unarchive'
413
    end
414
  end
408 415
end
db/migrate/20210908145200_issue_categories_add_column.rb
1
class IssueCategoriesAddColumn < ActiveRecord::Migration[6.1]
2
  def self.up
3
    add_column :issue_categories, :archived, :boolean, :default => false
4
  end
5

  
6
  def self.down
7
    remove_column :issue_categories, :archived
8
  end
9
end
test/functional/issue_categories_controller_test.rb
216 216
    # check that the issue category was nullified
217 217
    assert_nil issue.reload.category_id
218 218
  end
219
  
220
  def test_archive_unarchive
221
    assert_no_difference 'IssueCategory.count' do
222
      put(
223
        :archive,
224
        :params => {
225
          :id => 2,
226
        }
227
      )
228
    end
229
    assert_redirected_to '/projects/ecookbook/settings/categories'
230
    assert_equal true, IssueCategory.find(2).archived
231
    
232
    assert_no_difference 'IssueCategory.count' do
233
          put(
234
            :unarchive,
235
            :params => {
236
              :id => 2,
237
            }
238
          )
239
    end
240
    assert_redirected_to '/projects/ecookbook/settings/categories'
241
    assert_equal false, IssueCategory.find(2).archived
242
  end
219 243
end
test/unit/issue_test.rb
3406 3406

  
3407 3407
    assert_equal [5], issue2.filter_projects_scope('').ids.sort
3408 3408
  end
3409
  
3410
  def test_issue_categories_archived
3411
    issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :subject => 'Default')
3412
    assert_save issue
3413
    
3414
    project = issue.project
3415
    
3416
    assert_nil issue.category_id
3417
    assert_nil issue.category
3418
    assert_equal 1, project.id
3419
    assert_equal 2, project.issue_categories.size  
3420
    assert_equal 2, project.active_issue_categories.size
3421
    assert_equal 2, issue.assignable_issue_categories.size
3422
    
3423
    category = project.issue_categories.first
3424
    category.archived = true    
3425
    
3426
    assert_equal 2, project.issue_categories.size  
3427
    assert_equal 1, project.active_issue_categories.size
3428
    assert_equal 1, issue.assignable_issue_categories.size
3429
    assert_not_equal category, issue.assignable_issue_categories.first
3430
    
3431
    issue.category = category
3432
    assert_equal 1, project.active_issue_categories.size
3433
    assert_equal 2, issue.assignable_issue_categories.size
3434
    
3435
    category.archived = false
3436
    assert_equal 2, project.active_issue_categories.size
3437
    assert_equal 2, issue.assignable_issue_categories.size
3438
  end
3409 3439
end
test/unit/project_test.rb
1127 1127
    assert_equal 'valuea', project.custom_field_value(cf1)
1128 1128
    assert_nil project.custom_field_value(cf2)
1129 1129
  end
1130
  
1131
  def test_issue_categories_archived
1132
    project = Project.find(1)
1133
    assert_equal 2, project.issue_categories.size
1134
    assert_equal 2, project.active_issue_categories.size
1135
    
1136
    project.issue_categories.each do |cat|
1137
      cat.archived = true
1138
    end
1139
    
1140
    assert_equal 2, project.issue_categories.size
1141
    assert_equal 0, project.active_issue_categories.size
1142
    
1143
    project.issue_categories.each do |cat|
1144
      cat.archived = false
1145
    end
1146
    
1147
    assert_equal 2, project.issue_categories.size
1148
    assert_equal 2, project.active_issue_categories.size
1149
  end
1130 1150
end
    (1-1/1)