KTV/app/Livewire/Forms/SongForm.php
allen.yan 46caedfc10 202508251200
歌曲編輯加入 db_change
2025-08-25 11:58:37 +08:00

186 lines
6.0 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' => '',
'db_change' => 0,
'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:song_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 if($key == 'db_change'){
$this->fields[$key]=0;
}else{
$this->fields[$key] = '' ;
}
}
$this->songId = null;
}
public function render()
{
return view('livewire.forms.song-form');
}
}