*/ public array $data = []; public string $newLogNote = ''; public function mount(Organization $organization, FlexibleAssetType $type, ?FlexibleAsset $asset = null): void { $this->organization = $organization; $this->type = $type; if ($asset?->exists) { $this->asset = $asset; } foreach ($type->fields as $field) { $existing = $this->asset?->data[$field->name] ?? null; $this->data[$field->name] = match ($field->field_type) { 'checkbox' => (bool) $existing, 'tag' => $existing ?? [], default => $existing ?? '', }; } } public function save(): void { $rules = []; foreach ($this->type->fields as $field) { $rule = $field->is_required ? 'required' : 'nullable'; if ($field->field_type === 'checkbox') { $rule = 'boolean'; } $rules["data.{$field->name}"] = $rule; } $this->validate($rules); $primaryField = $this->type->fields->firstWhere('field_type', 'text') ?? $this->type->fields->first(); $name = $primaryField ? (string) ($this->data[$primaryField->name] ?? '') : $this->type->name; if ($this->asset?->exists) { $previousData = $this->asset->data ?? []; $this->asset->update(['name' => $name ?: $this->asset->name, 'data' => $this->data]); $this->logFieldChanges($previousData, $this->data); session()->flash('status', "\"{$this->asset->name}\" mis à jour."); } else { $this->organization->flexibleAssets()->create([ 'flexible_asset_type_id' => $this->type->id, 'name' => $name ?: $this->type->name, 'data' => $this->data, 'created_by' => auth()->id(), ]); session()->flash('status', "\"{$name}\" créé."); } $this->redirectRoute('organizations.assets.index', [$this->organization, $this->type], navigate: true); } public function addLogEntry(): void { $this->validate(['newLogNote' => 'required|string']); $this->asset->logs()->create([ 'note' => $this->newLogNote, 'created_by' => auth()->id(), ]); $this->newLogNote = ''; } /** * @param array $previousData * @param array $newData */ private function logFieldChanges(array $previousData, array $newData): void { $changes = []; foreach ($this->type->fields as $field) { $before = $previousData[$field->name] ?? null; $after = $newData[$field->name] ?? null; if ($this->normalizeFieldValue($before) === $this->normalizeFieldValue($after)) { continue; } if ($field->field_type === 'password') { $changes[] = "{$field->label} modifié"; continue; } $changes[] = "{$field->label} : « ".$this->formatFieldValue($field, $before)." » → « ".$this->formatFieldValue($field, $after)." »"; } if (empty($changes)) { return; } $this->asset->logs()->create([ 'note' => "Modification automatique :\n".implode("\n", $changes), 'created_by' => auth()->id(), ]); } private function normalizeFieldValue(mixed $value): mixed { if (is_array($value)) { sort($value); return $value; } return blank($value) ? null : $value; } private function formatFieldValue(\App\Models\FlexibleAssetField $field, mixed $value): string { if (blank($value) && $value !== false) { return '—'; } return match ($field->field_type) { 'checkbox' => $value ? 'Oui' : 'Non', 'tag' => is_array($value) ? implode(', ', $value) : (string) $value, 'related_asset' => $field->relatedOptions($this->organization)->firstWhere('id', (int) $value)['label'] ?? '—', default => (string) $value, }; } }; ?>

{{ $organization->name }} · {{ $type->name }}

{{ $asset?->exists ? 'Modifier l\'enregistrement' : 'Nouvel enregistrement' }}

@foreach ($type->fields as $field)
@switch($field->field_type) @case('textarea') @break @case('password') @break @case('checkbox')
@break @case('date') @break @case('select') @break @case('tag') @break @case('related_asset') @break @default @endswitch @error("data.{$field->name}")

{{ $message }}

@enderror
@endforeach
Annuler
@if ($asset?->exists)

Journal MCO

@error('newLogNote')

{{ $message }}

@enderror
@forelse ($asset->logs as $log) @empty @endforelse
Note Par Quand
{{ $log->note }} {{ $log->creator?->name ?? 'système' }} {{ $log->created_at->diffForHumans() }}
Aucune entrée pour le moment.
@endif