route('issue'); // Admins can always edit if ($this->user()->hasRole('admin')) { return true; } // Cannot edit closed issues if ($issue && $issue->isClosed()) { return false; } return $this->user()->can('edit_issues'); } /** * Get the validation rules that apply to the request. * * @return array|string> */ public function rules(): array { return [ 'title' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'issue_type' => ['required', Rule::in([ Issue::TYPE_WORK_ITEM, Issue::TYPE_PROJECT_TASK, Issue::TYPE_MAINTENANCE, Issue::TYPE_MEMBER_REQUEST, ])], 'priority' => ['required', Rule::in([ Issue::PRIORITY_LOW, Issue::PRIORITY_MEDIUM, Issue::PRIORITY_HIGH, Issue::PRIORITY_URGENT, ])], 'assigned_to_user_id' => ['nullable', 'exists:users,id'], 'reviewer_id' => ['nullable', 'exists:users,id'], 'member_id' => ['nullable', 'exists:members,id'], 'parent_issue_id' => ['nullable', 'exists:issues,id'], 'due_date' => ['nullable', 'date'], 'estimated_hours' => ['nullable', 'numeric', 'min:0'], 'labels' => ['nullable', 'array'], 'labels.*' => ['exists:issue_labels,id'], ]; } /** * Get custom messages for validator errors. */ public function messages(): array { return [ 'title.required' => __('Title is required.'), 'issue_type.required' => __('Issue type is required.'), 'issue_type.in' => __('Invalid issue type.'), 'priority.required' => __('Priority is required.'), 'priority.in' => __('Invalid priority level.'), ]; } }