ticket type rework

This commit is contained in:
2026-04-12 22:56:59 +02:00
parent f899893a6a
commit 041e79efda
11 changed files with 120 additions and 97 deletions
@@ -3,9 +3,9 @@
namespace App\Http\Controllers;
use App\Actions\Permissions\PermissionService;
use App\Actions\ProjectTicketMetadata\InitializeProjectTicketMetadata;
use App\Enums\Permission;
use App\Http\Requests\StoreProjectNamedSettingRequest;
use App\Http\Requests\StoreProjectTicketTypeRequest;
use App\Http\Requests\StoreTicketFieldDefinitionRequest;
use App\Http\Requests\UpdateProjectNamedSettingRequest;
use App\Http\Requests\UpdateTicketFieldDefinitionRequest;
@@ -26,14 +26,12 @@ use Inertia\Response;
class ProjectTicketMetadataSettingsController extends Controller
{
public function __construct(
private readonly InitializeProjectTicketMetadata $initializeProjectTicketMetadata,
private readonly PermissionService $permissionService,
) {}
public function show(Request $request, Project $project): Response
{
$this->abortUnlessCanManage($request, $project);
$this->initializeProjectTicketMetadata->handle($project);
return Inertia::render('projects/settings/Metadata', [
'fieldTypeOptions' => collect(TicketFieldDefinition::FIELD_TYPES)
@@ -43,6 +41,7 @@ class ProjectTicketMetadataSettingsController extends Controller
])
->all(),
'project' => $project,
'error' => session('error'),
'status' => session('status'),
'ticketFieldDefinitions' => $project->ticketFieldDefinitions()->get(),
'ticketLinkTypes' => $project->ticketLinkTypes()->get(),
@@ -51,27 +50,23 @@ class ProjectTicketMetadataSettingsController extends Controller
]);
}
public function storeType(StoreProjectNamedSettingRequest $request, Project $project): RedirectResponse
public function storeType(StoreProjectTicketTypeRequest $request, Project $project): RedirectResponse
{
$this->abortUnlessCanManage($request, $project);
$this->initializeProjectTicketMetadata->handle($project);
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
$ticketType = DB::transaction(function () use ($project, $name, $position): TicketType {
$ticketType = DB::transaction(function () use ($project, $validated): TicketType {
$ticketType = $project->ticketTypes()->create([
'is_builtin' => false,
'name' => $name,
'name' => Arr::get($validated, 'name'),
'position' => $project->ticketTypes()->count() + 1,
'system_key' => null,
'is_parent' => Arr::get($validated, 'is_parent', false),
]);
$this->reorderModels(
$project->ticketTypes()->whereKeyNot($ticketType->id)->get()->values(),
$ticketType,
$position ?? $project->ticketTypes()->count(),
Arr::get($validated, 'position') ?? $project->ticketTypes()->count(),
);
return $ticketType;
@@ -87,21 +82,19 @@ class ProjectTicketMetadataSettingsController extends Controller
TicketType $ticketType,
): RedirectResponse {
$this->abortUnlessCanManage($request, $project);
$this->initializeProjectTicketMetadata->handle($project);
$validated = $request->validated();
$name = Arr::get($validated, 'name');
$position = Arr::get($validated, 'position');
DB::transaction(function () use ($project, $name, $position, $ticketType): void {
DB::transaction(function () use ($project, $validated, $ticketType): void {
$ticketType->update([
'name' => $name,
'name' => Arr::get($validated, 'name'),
'is_parent' => Arr::get($validated, 'is_parent', false),
]);
$this->reorderModels(
$project->ticketTypes()->whereKeyNot($ticketType->id)->get()->values(),
$ticketType,
$position,
Arr::get($validated, 'position'),
);
});
@@ -113,7 +106,11 @@ class ProjectTicketMetadataSettingsController extends Controller
{
$this->abortUnlessCanManage($request, $project);
abort_if($ticketType->is_builtin, 403);
if ($project->ticketTypes()->count() === 1) {
return to_route('projects.settings.metadata', $project)
->with('error', true)
->with('status', 'The last ticket type cannot be deleted.');
}
$deletedName = $ticketType->name;
@@ -188,6 +185,12 @@ class ProjectTicketMetadataSettingsController extends Controller
): RedirectResponse {
$this->abortUnlessCanManage($request, $project);
if ($project->ticketPriorities()->count() === 1) {
return to_route('projects.settings.metadata', $project)
->with('error', true)
->with('status', 'The last ticket priority cannot be deleted.');
}
$deletedName = $ticketPriority->name;
DB::transaction(function () use ($project, $ticketPriority): void {
@@ -207,21 +210,18 @@ class ProjectTicketMetadataSettingsController extends Controller
$this->abortUnlessCanManage($request, $project);
$validated = $request->validated();
$label = Arr::get($validated, 'label');
$fieldType = Arr::get($validated, 'field_type');
$position = Arr::get($validated, 'position');
$ticketFieldDefinition = DB::transaction(function () use ($project, $fieldType, $label): TicketFieldDefinition {
$ticketFieldDefinition = DB::transaction(function () use ($project, $validated): TicketFieldDefinition {
$ticketFieldDefinition = $project->ticketFieldDefinitions()->create([
'field_type' => $fieldType,
'label' => $label,
'field_type' => Arr::get($validated, 'field_type'),
'label' => Arr::get($validated, 'label'),
'position' => $project->ticketFieldDefinitions()->count() + 1,
]);
$this->reorderModels(
$project->ticketFieldDefinitions()->whereKeyNot($ticketFieldDefinition->id)->get()->values(),
$ticketFieldDefinition,
$position ?? $project->ticketFieldDefinitions()->count(),
Arr::get($validated, 'position') ?? $project->ticketFieldDefinitions()->count(),
);
return $ticketFieldDefinition;
@@ -239,20 +239,17 @@ class ProjectTicketMetadataSettingsController extends Controller
$this->abortUnlessCanManage($request, $project);
$validated = $request->validated();
$label = Arr::get($validated, 'label');
$fieldType = Arr::get($validated, 'field_type');
$position = Arr::get($validated, 'position');
DB::transaction(function () use ($project, $fieldType, $label, $ticketFieldDefinition, $position): void {
DB::transaction(function () use ($project, $ticketFieldDefinition, $validated): void {
$ticketFieldDefinition->update([
'field_type' => $fieldType,
'label' => $label,
'field_type' => Arr::get($validated, 'field_type'),
'label' => Arr::get($validated, 'label'),
]);
$this->reorderModels(
$project->ticketFieldDefinitions()->whereKeyNot($ticketFieldDefinition->id)->get()->values(),
$ticketFieldDefinition,
$position,
Arr::get($validated, 'position'),
);
});