1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
# frozen_string_literal: true
class Projects::LabelsController < Projects::ApplicationController
include ToggleSubscriptionAction
before_action :check_issuables_available!
before_action :label, only: [:edit, :update, :destroy, :promote]
before_action :find_labels, only: [:index, :set_priorities, :remove_priority, :toggle_subscription]
before_action :authorize_read_label!
before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
:generate, :destroy, :remove_priority,
:set_priorities]
before_action :authorize_admin_group_labels!, only: [:promote]
respond_to :js, :html
feature_category :team_planning
urgency :low
def index
respond_to do |format|
format.html do
@prioritized_labels = @available_labels.prioritized(@project)
@labels = @available_labels.unprioritized(@project).page(params[:page])
# preload group, project, and subscription data
Preloaders::LabelsPreloader.new(@prioritized_labels, current_user, @project).preload_all
Preloaders::LabelsPreloader.new(@labels, current_user, @project).preload_all
end
format.json do
render json: LabelSerializer.new.represent_appearance(@available_labels)
end
end
end
def new
@label = @project.labels.new
end
def create
@label = Labels::CreateService.new(label_params).execute(project: @project)
if @label.valid?
respond_to do |format|
format.html { redirect_to project_labels_path(@project) }
format.json { render json: @label }
end
else
respond_to do |format|
format.html { render :new }
format.json { render json: { message: @label.errors.messages }, status: :bad_request }
end
end
end
def edit; end
def update
@label = Labels::UpdateService.new(label_params).execute(@label)
if @label.valid?
redirect_to project_labels_path(@project)
else
render :edit
end
end
def generate
Gitlab::IssuesLabels.generate(@project)
case params[:redirect]
when 'issues'
redirect_to project_issues_path(@project)
when 'merge_requests'
redirect_to project_merge_requests_path(@project)
else
redirect_to project_labels_path(@project)
end
end
def destroy
if @label.destroy
redirect_to project_labels_path(@project), status: :found,
notice: format(_('%{label_name} was removed'), label_name: @label.name)
else
redirect_to project_labels_path(@project), status: :found,
alert: @label.errors.full_messages.to_sentence
end
end
def remove_priority
respond_to do |format|
label = @available_labels.find(params[:id])
if label.unprioritize!(project)
format.json { render json: label }
else
format.json { head :unprocessable_entity }
end
end
end
# rubocop: disable CodeReuse/ActiveRecord
def set_priorities
Label.transaction do
available_labels_ids = @available_labels.where(id: params[:label_ids]).pluck(:id)
label_ids = params[:label_ids].select { |id| available_labels_ids.include?(id.to_i) }
label_ids.each_with_index do |label_id, index|
label = @available_labels.find(label_id)
label.prioritize!(project, index)
end
end
respond_to do |format|
format.json { render json: { message: 'success' } }
end
end
# rubocop: enable CodeReuse/ActiveRecord
def promote
promote_service = Labels::PromoteService.new(@project, @current_user)
begin
return render_404 unless promote_service.execute(@label)
flash[:notice] = flash_notice_for(@label, @project.group)
respond_to do |format|
format.html do
redirect_to(project_labels_path(@project), status: :see_other)
end
format.json do
render json: { url: project_labels_path(@project) }
end
end
rescue ActiveRecord::RecordInvalid => e
Gitlab::AppLogger.error "Failed to promote label \"#{@label.title}\" to group label"
Gitlab::AppLogger.error e
respond_to do |format|
format.html do
redirect_to(
project_labels_path(@project),
notice: _('Failed to promote label due to internal error. Please contact administrators.'))
end
format.js
end
end
end
def flash_notice_for(label, group)
''.html_safe + "#{label.title} promoted to " + view_context.link_to('<u>group label</u>'.html_safe, group_labels_path(group)) + '.'
end
protected
def label_params
allowed = [:title, :description, :color]
allowed << :lock_on_merge if @project.supports_lock_on_merge?
params.require(:label).permit(allowed)
end
def label
@label ||= @project.labels.find(params[:id])
end
def subscribable_resource
@available_labels.find(params[:id])
end
def find_labels
@available_labels ||= LabelsFinder.new(
current_user,
project_id: @project.id,
include_ancestor_groups: true,
search: params[:search],
subscribed: params[:subscribed],
sort: sort
).execute
end
def sort
@sort ||= params[:sort] || 'name_asc'
end
def authorize_admin_labels!
render_404 unless can?(current_user, :admin_label, @project)
end
def authorize_admin_group_labels!
render_404 unless can?(current_user, :admin_label, @project.group)
end
end
|