'required|string|max:255|unique:device_palettes,name', 'description' => 'nullable|string|max:255', 'grays' => 'required|integer|min:1|max:256', 'colors' => 'nullable|array', 'colors.*' => 'string|regex:/^#[0-9A-Fa-f]{6}$/', 'framework_class' => 'nullable|string|max:255', ]; public function mount() { $this->devicePalettes = DevicePalette::all(); return view('livewire.device-palettes.index'); } public function addColor(): void { $this->validate(['colorInput' => 'required|string|regex:/^#[0-9A-Fa-f]{6}$/'], [ 'colorInput.regex' => 'Color must be a valid hex color (e.g., #FF0000)', ]); if (! in_array($this->colorInput, $this->colors)) { $this->colors[] = $this->colorInput; } $this->colorInput = ''; } public function removeColor(int $index): void { unset($this->colors[$index]); $this->colors = array_values($this->colors); } public $editingDevicePaletteId; public $viewingDevicePaletteId; public function openDevicePaletteModal(?string $devicePaletteId = null, bool $viewOnly = false): void { if ($devicePaletteId) { $devicePalette = DevicePalette::findOrFail($devicePaletteId); if ($viewOnly) { $this->viewingDevicePaletteId = $devicePalette->id; $this->editingDevicePaletteId = null; } else { $this->editingDevicePaletteId = $devicePalette->id; $this->viewingDevicePaletteId = null; } $this->name = $devicePalette->name; $this->description = $devicePalette->description; $this->grays = $devicePalette->grays; // Ensure colors is always an array and properly decoded // The model cast should handle JSON decoding, but we'll be explicit $colors = $devicePalette->getAttribute('colors'); if ($colors === null) { $this->colors = []; } elseif (is_string($colors)) { $decoded = json_decode($colors, true); $this->colors = is_array($decoded) ? array_values($decoded) : []; } elseif (is_array($colors)) { $this->colors = array_values($colors); // Re-index array } else { $this->colors = []; } $this->framework_class = $devicePalette->framework_class; } else { $this->editingDevicePaletteId = null; $this->viewingDevicePaletteId = null; $this->reset(['name', 'description', 'grays', 'colors', 'framework_class']); } $this->colorInput = ''; } public function saveDevicePalette(): void { $rules = [ 'name' => 'required|string|max:255', 'description' => 'nullable|string|max:255', 'grays' => 'required|integer|min:1|max:256', 'colors' => 'nullable|array', 'colors.*' => 'string|regex:/^#[0-9A-Fa-f]{6}$/', 'framework_class' => 'nullable|string|max:255', ]; if ($this->editingDevicePaletteId) { $rules['name'] = 'required|string|max:255|unique:device_palettes,name,'.$this->editingDevicePaletteId; } else { $rules['name'] = 'required|string|max:255|unique:device_palettes,name'; } $this->validate($rules); if ($this->editingDevicePaletteId) { $devicePalette = DevicePalette::findOrFail($this->editingDevicePaletteId); $devicePalette->update([ 'name' => $this->name, 'description' => $this->description, 'grays' => $this->grays, 'colors' => ! empty($this->colors) ? $this->colors : null, 'framework_class' => $this->framework_class, ]); $message = 'Device palette updated successfully.'; } else { DevicePalette::create([ 'name' => $this->name, 'description' => $this->description, 'grays' => $this->grays, 'colors' => ! empty($this->colors) ? $this->colors : null, 'framework_class' => $this->framework_class, 'source' => 'manual', ]); $message = 'Device palette created successfully.'; } $this->reset(['name', 'description', 'grays', 'colors', 'framework_class', 'colorInput', 'editingDevicePaletteId', 'viewingDevicePaletteId']); Flux::modal('device-palette-modal')->close(); $this->devicePalettes = DevicePalette::all(); session()->flash('message', $message); } public function deleteDevicePalette(string $devicePaletteId): void { $devicePalette = DevicePalette::findOrFail($devicePaletteId); $devicePalette->delete(); $this->devicePalettes = DevicePalette::all(); session()->flash('message', 'Device palette deleted successfully.'); } public function duplicateDevicePalette(string $devicePaletteId): void { $devicePalette = DevicePalette::findOrFail($devicePaletteId); $this->editingDevicePaletteId = null; $this->viewingDevicePaletteId = null; $this->name = $devicePalette->name.' (Copy)'; $this->description = $devicePalette->description; $this->grays = $devicePalette->grays; $colors = $devicePalette->getAttribute('colors'); if ($colors === null) { $this->colors = []; } elseif (is_string($colors)) { $decoded = json_decode($colors, true); $this->colors = is_array($decoded) ? array_values($decoded) : []; } elseif (is_array($colors)) { $this->colors = array_values($colors); } else { $this->colors = []; } $this->framework_class = $devicePalette->framework_class; $this->colorInput = ''; $this->js('Flux.modal("device-palette-modal").show()'); } } ?>
|
Description
|
Grays
|
Colors
|
Actions
|
|---|---|---|---|
|
{{ $devicePalette->description ?? $devicePalette->name }}
{{ $devicePalette->name }}
|
{{ $devicePalette->grays }} |
@if ($devicePalette->colors)
@foreach ($devicePalette->colors as $color)
@endforeach
({{ count($devicePalette->colors) }})
@else
Grayscale only
@endif
|
|