KTV/app/Livewire/Forms/SongForm.php
allen.yan 2769e82a37 功能調整
API 收到包廂指令先押資料
加入 包廂列表
加入 包廂控制介面
加入 包廂記錄
補上正規劃
20250729
2025-07-29 00:24:03 +08:00

184 lines
5.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Livewire\Forms;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use WireUi\Traits\WireUiActions;
use Illuminate\Validation\Rules\Enum;
use App\Enums\SongLanguageType;
use App\Enums\SongSituation;
use App\Models\Song;
use App\Models\SongCategory;
class SongForm extends Component
{
use WireUiActions;
protected $listeners = ['openModal','closeModal', 'deleteSong'];
public bool $canCreate;
public bool $canEdit;
public bool $canDelect;
public bool $showModal = false;
public $songCategories =[];
public $songLanguageType =[];
public $songSituation =[];
public $selectedCategories=[];
public $selectedArtists=[];
public ?int $songId = null;
public array $fields = [
'id' =>'',
'name' => '',
'adddate' => '',
'filename' => '',
'language_type' => '',
'vocal' => true,
'situation' => '',
'copyright01' => '',
'copyright02' => '',
'note01' => '',
'note02' => '',
'note03' => '',
'note04' => '',
'enable' => true,
];
public function rules()
{
return [
'fields.name' => 'required|string|max:255',
'fields.adddate' => 'required|date', // 或 required, 依照你的需求
'fields.filename' => 'required|string|max:255',
'fields.language_type'=> ['required',new Enum(SongLanguageType::class)],
'fields.vocal' => 'required|boolean',
'fields.situation' => ['required',new Enum(SongSituation::class)],
'fields.copyright01' => 'nullable|string|max:255',
'fields.copyright02' => 'nullable|string|max:255',
'fields.note01' => 'nullable|string|max:255',
'fields.note02' => 'nullable|string|max:255',
'fields.note03' => 'nullable|string|max:255',
'fields.note04' => 'nullable|string|max:255',
'fields.enable' => 'required|boolean',
// 如果你在表單中也綁定了 selectedArtists / selectedCategories
'selectedArtists' => 'required|array',
'selectedArtists.*' => 'integer|exists:artists,id',
'selectedCategories' => 'nullable|array',
'selectedCategories.*'=> 'integer|exists:categories,id',
];
}
public function mount()
{
$this->songCategories = SongCategory::all();
$this->songLanguageType = collect(SongLanguageType::cases())->map(fn ($languageType) => [
'name' => $languageType->labels(),
'value' => $languageType->value,
])->toArray();
$this->songSituation = collect(SongSituation::cases())->map(fn ($situation) => [
'name' => $situation->labels(),
'value' => $situation->value,
])->toArray();
$this->canCreate = Auth::user()?->can('song-edit') ?? false;
$this->canEdit = Auth::user()?->can('song-edit') ?? false;
$this->canDelect = Auth::user()?->can('song-delete') ?? false;
}
public function openModal($id = null)
{
$this->resetFields();
if ($id) {
$song = Song::findOrFail($id);
$this->songId = $song->id;
$this->fields = $song->only(array_keys($this->fields));
$this->selectedCategories = $song->categories()->pluck('id')->toArray();
$this->selectedArtists = $song->artists()->pluck('id')->toArray();
//dd($this->fields,$this->selectedCategories,$this->selectedArtists);
}
$this->showModal = true;
}
public function closeModal()
{
$this->resetFields();
$this->showModal = false;
}
public function save()
{
$validated = $this->validate($this->rules());
if ($this->songId) {
if ($this->canEdit) {
$song = Song::findOrFail($this->songId);
$song->update($this->fields);
// ⭐ 同步多對多關聯
$song->artists()->sync($this->selectedArtists ?? []);
$song->categories()->sync($this->selectedCategories ?? []);
$this->notification()->send([
'icon' => 'success',
'title' => '成功',
'description' => '歌曲已更新',
]);
}
} else {
if ($this->canCreate) {
$song = Song::create($this->fields);
// ⭐ 同步多對多關聯
$song->artists()->sync($this->selectedArtists ?? []);
$song->categories()->sync($this->selectedCategories ?? []);
$this->notification()->send([
'icon' => 'success',
'title' => '成功',
'description' => '歌曲已新增',
]);
}
}
$this->resetFields();
$this->showModal = false;
$this->dispatch('pg:eventRefresh-song-table');
}
public function deleteSong($id)
{
if ($this->canDelect) {
Song::findOrFail($id)->delete();
$this->notification()->send([
'icon' => 'success',
'title' => '成功',
'description' => '歌曲已刪除',
]);
}
}
public function resetFields()
{
foreach ($this->fields as $key => $value) {
if($key == 'vocal' || $key == 'enable'){
$this->fields[$key] = true ;
}else if($key == 'adddate'){
$this->fields[$key] = now()->format('Y-m-d');
}else{
$this->fields[$key] = '' ;
}
}
$this->songId = null;
}
public function render()
{
return view('livewire.forms.song-form');
}
}