Add checklist acceptance criteria

This commit is contained in:
2026-04-24 20:48:59 +00:00
parent 68bc5d8915
commit af6fc66e09
16 changed files with 961 additions and 51 deletions
+71 -8
View File
@@ -2,6 +2,7 @@
namespace App\Actions\Tickets;
use App\Actions\Tickets\Support\TicketAcceptanceCriteriaData;
use App\Enums\TicketWorklogEntryType;
use App\Models\Ticket;
use App\Models\TicketFieldDefinition;
@@ -20,7 +21,14 @@ class UpdateProjectTicket
/**
* @param array{
* acceptance_criteria: string|null,
* acceptance_criteria: array{
* summary: string|null,
* items: array<int, array{
* checked: bool,
* indent: int,
* text: string
* }>
* },
* assignee_user_id?: int|null,
* author_user_id?: int|null,
* blocked_comment: string|null,
@@ -77,6 +85,14 @@ class UpdateProjectTicket
/** @var Collection<int, TicketFieldValue> $existingFieldValues */
$existingFieldValues = $ticket->fieldValues
->keyBy('ticket_field_definition_id');
$currentAcceptanceCriteria = TicketAcceptanceCriteriaData::fromStored(
$ticket->acceptance_criteria_data,
$ticket->acceptance_criteria,
);
$nextAcceptanceCriteria = TicketAcceptanceCriteriaData::fromStored(
$ticketAttributes['acceptance_criteria_data'],
$ticketAttributes['acceptance_criteria'],
);
$changes = [];
$summaryLabels = [];
@@ -97,13 +113,11 @@ class UpdateProjectTicket
$ticket->description,
$ticketAttributes['description'],
);
$this->trackScalarChange(
$this->trackAcceptanceCriteriaChange(
$changes,
$summaryLabels,
'acceptance_criteria',
'acceptance criteria',
$ticket->acceptance_criteria,
$ticketAttributes['acceptance_criteria'],
$currentAcceptanceCriteria,
$nextAcceptanceCriteria,
);
$this->trackScalarChange(
$changes,
@@ -217,7 +231,14 @@ class UpdateProjectTicket
/**
* @param array{
* acceptance_criteria: string|null,
* acceptance_criteria: array{
* summary: string|null,
* items: array<int, array{
* checked: bool,
* indent: int,
* text: string
* }>
* },
* assignee_user_id?: int|null,
* author_user_id?: int|null,
* blocked_comment: string|null,
@@ -231,6 +252,14 @@ class UpdateProjectTicket
* } $validated
* @return array{
* acceptance_criteria: string|null,
* acceptance_criteria_data: array{
* summary: string|null,
* items: array<int, array{
* checked: bool,
* indent: int,
* text: string
* }>
* }|null,
* assignee_user_id: int|null,
* author_user_id: int|null,
* blocked_comment: string|null,
@@ -245,8 +274,13 @@ class UpdateProjectTicket
*/
private function buildTicketAttributes(Ticket $ticket, array $validated): array
{
$acceptanceCriteria = TicketAcceptanceCriteriaData::normalize(
Arr::get($validated, 'acceptance_criteria'),
);
return [
'acceptance_criteria' => Arr::get($validated, 'acceptance_criteria'),
'acceptance_criteria' => TicketAcceptanceCriteriaData::toLegacyText($acceptanceCriteria),
'acceptance_criteria_data' => TicketAcceptanceCriteriaData::forStorage($acceptanceCriteria),
'assignee_user_id' => Arr::exists($validated, 'assignee_user_id')
? Arr::get($validated, 'assignee_user_id')
: $ticket->assignee_user_id,
@@ -266,6 +300,35 @@ class UpdateProjectTicket
];
}
/**
* @param array<string, mixed> $changes
* @param array<int, string> $summaryLabels
* @param array{
* summary: string|null,
* items: array<int, array{checked: bool, indent: int, text: string}>
* } $currentValue
* @param array{
* summary: string|null,
* items: array<int, array{checked: bool, indent: int, text: string}>
* } $newValue
*/
private function trackAcceptanceCriteriaChange(
array &$changes,
array &$summaryLabels,
array $currentValue,
array $newValue,
): void {
if ($currentValue === $newValue) {
return;
}
$changes['acceptance_criteria'] = [
'from' => $currentValue,
'to' => $newValue,
];
$summaryLabels[] = 'acceptance criteria';
}
/**
* @param array<string, mixed> $changes
* @param array<int, string> $summaryLabels