is_system) { $this->dispatch('toast', state:'error', text:'System-Domain kann nicht bearbeitet werden.'); $this->dispatch('closeModal'); return; } $this->domain = $d->domain; $this->description = $d->description; $this->is_active = $d->is_active; $this->tags = []; $raw = $d->tags ?? []; if (is_string($raw)) { $raw = array_values(array_filter(array_map('trim', explode(',', $raw)))); foreach ($raw as $lbl) $this->tags[] = ['label'=>$lbl, 'color'=>$this->tagPalette[0]]; } elseif (is_array($raw)) { foreach ($raw as $t) { $label = is_array($t) ? trim((string)($t['label'] ?? '')) : trim((string)$t); if ($label === '') continue; $color = $this->normalizeHex(is_array($t) ? ($t['color'] ?? '') : '') ?? $this->tagPalette[0]; $this->tags[] = ['label'=>$label, 'color'=>$color]; } } if (empty($this->tags)) $this->tags = [['label'=>'', 'color'=>$this->tagPalette[0]]]; } public function addTag(): void { $this->tags[] = ['label'=>'', 'color'=>$this->tagPalette[0]]; } public function removeTag(int $i): void { unset($this->tags[$i]); $this->tags = array_values($this->tags); } public function pickTagColor(int $i, string $hex): void { if (!isset($this->tags[$i])) return; $hex = $this->normalizeHex($hex); if ($hex) $this->tags[$i]['color'] = $hex; } private function normalizeHex(?string $hex): ?string { $hex = trim((string)$hex); if ($hex === '') return null; if ($hex[0] !== '#') $hex = "#{$hex}"; return preg_match('/^#[0-9a-fA-F]{6}$/', $hex) ? strtolower($hex) : null; } public function save() { $this->validate([ 'description' => 'nullable|string|max:500', 'is_active' => 'boolean', 'tags' => 'array|max:50', 'tags.*.label' => 'nullable|string|max:40', 'tags.*.color' => ['nullable','regex:/^#[0-9a-fA-F]{6}$/'], ]); $d = Domain::where('domain', $this->domain)->firstOrFail(); if ($d->is_system) { $this->dispatch('toast', state:'error', text:'System-Domain kann nicht bearbeitet werden.'); return; } $out = []; foreach ($this->tags as $t) { $label = trim((string)($t['label'] ?? '')); if ($label === '') continue; $color = $this->normalizeHex($t['color'] ?? '') ?? $this->tagPalette[0]; $out[] = ['label'=>$label, 'color'=>$color]; } $d->update([ 'description' => $this->description, 'is_active' => $this->is_active, 'tags' => $out, ]); $this->dispatch('domain-updated'); $this->dispatch('closeModal'); $this->dispatch('toast', type: 'done', badge: 'Domain', title: 'Domain aktualisiert', text: 'Die Domain ' . e($d->domain) . ' wurde erfolgreich aktualisiert. Alle Änderungen sind sofort aktiv.', duration: 6000, ); } public function render() { return view('livewire.ui.domain.modal.domain-edit-modal', [ 'tagPalette' => $this->tagPalette, ]); } }