Etudes working correctly
This commit is contained in:
parent
a4882d3545
commit
c72b4c32a6
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Actions;
|
||||||
|
|
||||||
|
use App\Models\AuditionEtude;
|
||||||
|
use App\Models\Ensemble;
|
||||||
|
use App\Models\Instrument;
|
||||||
|
use Illuminate\Http\UploadedFile;
|
||||||
|
|
||||||
|
class UpdateEtude
|
||||||
|
{
|
||||||
|
public function __invoke(
|
||||||
|
Ensemble $ensemble,
|
||||||
|
Instrument $instrument,
|
||||||
|
int $set,
|
||||||
|
UploadedFile $file
|
||||||
|
): void {
|
||||||
|
$filename = $ensemble->name.' '.$instrument->instrument.' Set '.$set.'.pdf';
|
||||||
|
$filename = str_replace(' ', '_', $filename);
|
||||||
|
$path = $file->storeAs('/etudes', $filename, 'public');
|
||||||
|
$originalFilename = $file->getClientOriginalName();
|
||||||
|
$fileSize = $file->getSize();
|
||||||
|
|
||||||
|
AuditionEtude::updateOrCreate(
|
||||||
|
[
|
||||||
|
'ensemble_id' => $ensemble->id,
|
||||||
|
'instrument_id' => $instrument->id,
|
||||||
|
'set' => $set,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'ensemble_id' => $ensemble->id,
|
||||||
|
'instrument_id' => $instrument->id,
|
||||||
|
'set' => $set,
|
||||||
|
'file_path' => $path,
|
||||||
|
'original_filename' => $originalFilename,
|
||||||
|
'file_size' => $fileSize,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Models\AuditionEtude;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
|
class EtudesCleanup extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'etudes:cleanup {--dry-run : Show what would be deleted without actually deleting}';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Clean up orphaned etude records and PDF files';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*/
|
||||||
|
public function handle(): int
|
||||||
|
{
|
||||||
|
$dryRun = $this->option('dry-run');
|
||||||
|
|
||||||
|
if ($dryRun) {
|
||||||
|
$this->info('Running in dry-run mode - no changes will be made');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->info('Starting etudes cleanup...');
|
||||||
|
$this->newLine();
|
||||||
|
|
||||||
|
// Part 1: Remove database records with missing PDF files
|
||||||
|
$this->info('Checking for database records with missing PDF files...');
|
||||||
|
$orphanedRecords = 0;
|
||||||
|
|
||||||
|
AuditionEtude::chunk(100, function ($etudes) use (&$orphanedRecords, $dryRun) {
|
||||||
|
foreach ($etudes as $etude) {
|
||||||
|
if (! Storage::disk('public')->exists($etude->file_path)) {
|
||||||
|
$this->warn("Missing file: {$etude->file_path} (Record ID: {$etude->id})");
|
||||||
|
$orphanedRecords++;
|
||||||
|
|
||||||
|
if (! $dryRun) {
|
||||||
|
$etude->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($orphanedRecords > 0) {
|
||||||
|
$action = $dryRun ? 'would be' : 'were';
|
||||||
|
$this->info("✓ {$orphanedRecords} orphaned database record(s) {$action} removed");
|
||||||
|
} else {
|
||||||
|
$this->info('✓ No orphaned database records found');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->newLine();
|
||||||
|
|
||||||
|
// Part 2: Remove PDF files not referenced in the database
|
||||||
|
$this->info('Checking for PDF files not referenced in the database...');
|
||||||
|
|
||||||
|
$referencedPaths = AuditionEtude::pluck('file_path')->toArray();
|
||||||
|
$allFiles = Storage::disk('public')->files('etudes');
|
||||||
|
$orphanedFiles = array_diff($allFiles, $referencedPaths);
|
||||||
|
|
||||||
|
if (count($orphanedFiles) > 0) {
|
||||||
|
foreach ($orphanedFiles as $file) {
|
||||||
|
$this->warn("Orphaned file: {$file}");
|
||||||
|
|
||||||
|
if (! $dryRun) {
|
||||||
|
Storage::disk('public')->delete($file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$action = $dryRun ? 'would be' : 'were';
|
||||||
|
$this->info('✓ '.count($orphanedFiles)." orphaned file(s) {$action} removed");
|
||||||
|
} else {
|
||||||
|
$this->info('✓ No orphaned files found');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->newLine();
|
||||||
|
$this->info('Cleanup completed!');
|
||||||
|
|
||||||
|
return Command::SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers\Admin;
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Actions\UpdateEtude;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Http\Requests\EtudeUploadRequest;
|
use App\Http\Requests\EtudeUploadRequest;
|
||||||
use App\Models\AuditionEtude;
|
use App\Models\AuditionEtude;
|
||||||
|
|
@ -39,25 +40,14 @@ class AuditionEtudeController extends Controller
|
||||||
/**
|
/**
|
||||||
* Store a newly created resource in storage.
|
* Store a newly created resource in storage.
|
||||||
*/
|
*/
|
||||||
public function store(EtudeUploadRequest $request)
|
public function store(EtudeUploadRequest $request, UpdateEtude $updater)
|
||||||
{
|
{
|
||||||
$instrument = Instrument::find($request->instrument_id);
|
$updater(
|
||||||
$ensemble = Ensemble::find($request->ensemble_id);
|
Ensemble::find($request->ensemble_id),
|
||||||
$filename = $ensemble->name.' '.$instrument->instrument.' Set '.$request->set.'.pdf';
|
Instrument::find($request->instrument_id),
|
||||||
$filename = str_replace(' ', '_', $filename);
|
$request->set,
|
||||||
|
$request->file('file_upload')
|
||||||
$path = $request->file('file_upload')->storeAs('etudes', $filename, 'public');
|
);
|
||||||
$originalFilename = $request->file('file_upload')->getClientOriginalName();
|
|
||||||
$fileSize = $request->file('file_upload')->getSize();
|
|
||||||
|
|
||||||
AuditionEtude::create([
|
|
||||||
'instrument_id' => $request->instrument_id,
|
|
||||||
'ensemble_id' => $request->ensemble_id,
|
|
||||||
'set' => $request->set,
|
|
||||||
'file_path' => $path,
|
|
||||||
'original_filename' => $originalFilename,
|
|
||||||
'file_size' => $fileSize,
|
|
||||||
]);
|
|
||||||
|
|
||||||
session([
|
session([
|
||||||
'previous_instrument_id' => $request->instrument_id,
|
'previous_instrument_id' => $request->instrument_id,
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,14 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers\Admin;
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Actions\UpdateEtude;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\EtudeUploadRequest;
|
||||||
|
use App\Models\AuditionEtude;
|
||||||
use App\Models\Ensemble;
|
use App\Models\Ensemble;
|
||||||
use App\Models\Instrument;
|
use App\Models\Instrument;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
class AuditionEtudeGridController extends Controller
|
class AuditionEtudeGridController extends Controller
|
||||||
{
|
{
|
||||||
|
|
@ -15,4 +20,29 @@ class AuditionEtudeGridController extends Controller
|
||||||
|
|
||||||
return view('admin.audition_etude.grid', compact('ensembles', 'instruments'));
|
return view('admin.audition_etude.grid', compact('ensembles', 'instruments'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function store(EtudeUploadRequest $request, UpdateEtude $updater)
|
||||||
|
{
|
||||||
|
$updater(
|
||||||
|
Ensemble::find($request->ensemble_id),
|
||||||
|
Instrument::find($request->instrument_id),
|
||||||
|
$request->set,
|
||||||
|
$request->file('file_upload')
|
||||||
|
);
|
||||||
|
|
||||||
|
return redirect()->route('admin.etude-grid')->with('success', 'Etude updated successfully.');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(Request $request)
|
||||||
|
{
|
||||||
|
$validated = $request->validate([
|
||||||
|
'etude_id' => 'required|integer|exists:audition_etudes,id',
|
||||||
|
]);
|
||||||
|
$etude = AuditionEtude::findOrFail($validated['etude_id']);
|
||||||
|
|
||||||
|
$etude->delete();
|
||||||
|
|
||||||
|
return redirect()->route('admin.etude-grid')->with('success', 'Etude deleted successfully.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ namespace App\Models;
|
||||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
class AuditionEtude extends Model
|
class AuditionEtude extends Model
|
||||||
{
|
{
|
||||||
|
|
@ -12,6 +13,15 @@ class AuditionEtude extends Model
|
||||||
'instrument_id', 'ensemble_id', 'set', 'original_filename', 'file_path', 'file_size',
|
'instrument_id', 'ensemble_id', 'set', 'original_filename', 'file_path', 'file_size',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
protected static function booted(): void
|
||||||
|
{
|
||||||
|
static::deleting(function (AuditionEtude $etude) {
|
||||||
|
if ($etude->file_path) {
|
||||||
|
Storage::disk('public')->delete($etude->file_path);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public function instrument(): BelongsTo
|
public function instrument(): BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Instrument::class);
|
return $this->belongsTo(Instrument::class);
|
||||||
|
|
@ -22,6 +32,11 @@ class AuditionEtude extends Model
|
||||||
return $this->belongsTo(Ensemble::class);
|
return $this->belongsTo(Ensemble::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getLinkToPDF()
|
||||||
|
{
|
||||||
|
return Storage::url($this->file_path);
|
||||||
|
}
|
||||||
|
|
||||||
protected function humanReadableFileSize(): Attribute
|
protected function humanReadableFileSize(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::make(
|
return Attribute::make(
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
<x-form.form method="POST" action="{{ route('admin.etudes.store') }}" enctype="multipart/form-data"
|
<x-form.form method="POST" action="{{ route('admin.etudes.store') }}" enctype="multipart/form-data"
|
||||||
x-data="{ selectedEnsemble: '', selectedInstrument: '', selectedSetNumber: '' }">
|
x-data="{ selectedEnsemble: '', selectedInstrument: '', selectedSetNumber: '' }">
|
||||||
<div>
|
<div>
|
||||||
<x-form.select name="auditioned_ensemble_id" x-model="selectedEnsemble">
|
<x-form.select name="ensemble_id" x-model="selectedEnsemble">
|
||||||
<x-slot:label>Ensemble</x-slot:label>
|
<x-slot:label>Ensemble</x-slot:label>
|
||||||
<option value="">Select Ensemble...</option>
|
<option value="">Select Ensemble...</option>
|
||||||
@foreach($ensembles as $ensemble)
|
@foreach($ensembles as $ensemble)
|
||||||
|
|
|
||||||
|
|
@ -1,49 +1,11 @@
|
||||||
<x-layout.admin x-data="{ ensemble: 'e', instrument: 'i', set: 's', ensemble_id: '', instrument_id: '' }">
|
<x-layout.admin x-data="{ ensemble: 'e', instrument: 'i', set: 's', ensemble_id: '', instrument_id: '', etude_link: '', existing_etude_id: '' }">
|
||||||
<button command="show-modal" commandfor="etude-uploader"
|
@include('admin.audition_etude.grid_update_form')
|
||||||
class="rounded-md bg-gray-950/5 px-2.5 py-1.5 text-sm font-semibold text-gray-900 hover:bg-gray-950/10 dark:bg-white/10 dark:text-white dark:inset-ring dark:inset-ring-white/5 dark:hover:bg-white/20">
|
|
||||||
Open dialog
|
|
||||||
</button>
|
|
||||||
<el-dialog>
|
|
||||||
<dialog id="etude-uploader" aria-labelledby="Upload Etude"
|
|
||||||
class="fixed inset-0 size-auto max-h-none max-w-none overflow-y-auto bg-transparent backdrop:bg-transparent">
|
|
||||||
<el-dialog-backdrop
|
|
||||||
class="fixed inset-0 bg-gray-500/75 transition-opacity data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in dark:bg-gray-900/50"></el-dialog-backdrop>
|
|
||||||
|
|
||||||
<div tabindex="0"
|
|
||||||
class="flex min-h-full items-end justify-center p-2 text-center focus:outline-none sm:items-center sm:p-0">
|
|
||||||
<el-dialog-panel
|
|
||||||
class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all data-closed:translate-y-4 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:my-8 sm:w-full sm:max-w-sm sm:p-6 data-closed:sm:translate-y-0 data-closed:sm:scale-95 dark:bg-gray-800 dark:outline dark:-outline-offset-1 dark:outline-white/10">
|
|
||||||
<x-form method="POST" action="#">
|
|
||||||
<input type="hidden" name="ensemble_id" x-model="ensemble_id"/>
|
|
||||||
<input type="hidden" name="instrument_id" x-model="instrument_id"/>
|
|
||||||
<input type="hidden" name="set" x-model="set"/>
|
|
||||||
<div>
|
|
||||||
<div class="mt-1 text-center sm:mt-3">
|
|
||||||
<h3 id="dialog-title" class="text-base font-semibold text-gray-900 dark:text-white">
|
|
||||||
Update Etude</h3>
|
|
||||||
<div class="mt-2 text-sm text-gray-500 dark:text-gray-400">
|
|
||||||
<span x-text="ensemble"></span>
|
|
||||||
<span x-text="instrument"></span>
|
|
||||||
<span x-text="`Set ${set}`"></span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="mt-3">
|
|
||||||
<x-form.input name="file_upload" type="file" label="Etude PDF"/>
|
|
||||||
</div>
|
|
||||||
<div class="mt-5 sm:mt-6">
|
|
||||||
<button type="button" command="close" commandfor="dialog"
|
|
||||||
class="inline-flex w-full justify-center rounded-md bg-brand-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-brand-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand-600 dark:bg-brand-500 dark:shadow-none dark:hover:bg-brand-400 dark:focus-visible:outline-brand-500">
|
|
||||||
Save Etude
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</x-form>
|
|
||||||
</el-dialog-panel>
|
|
||||||
</div>
|
|
||||||
</dialog>
|
|
||||||
</el-dialog>
|
|
||||||
|
|
||||||
|
@if($errors->any())
|
||||||
|
@foreach($errors->all() as $error)
|
||||||
|
<x-alert>{{ $error }}</x-alert>
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
|
|
||||||
@foreach($ensembles as $ensemble)
|
@foreach($ensembles as $ensemble)
|
||||||
<x-card class="mb-5">
|
<x-card class="mb-5">
|
||||||
|
|
@ -71,10 +33,13 @@
|
||||||
ensemble_id = '{{ $ensemble->id }}';
|
ensemble_id = '{{ $ensemble->id }}';
|
||||||
instrument = '{{ $instrument->instrument }}';
|
instrument = '{{ $instrument->instrument }}';
|
||||||
instrument_id = '{{ $instrument->id }}';
|
instrument_id = '{{ $instrument->id }}';
|
||||||
set = {{ $n }}"
|
set = {{ $n }};
|
||||||
|
etude_link = '{{ $ensemble->getEtude($instrument, $n)->getLinkToPDF() }}';
|
||||||
|
existing_etude_id = '{{ $ensemble->getEtude($instrument, $n)->id }}';"
|
||||||
>
|
>
|
||||||
{{ $ensemble->abbreviation }} - {{ $instrument->instrument }} - Set {{ $n }}
|
{{ $ensemble->abbreviation }} - {{ $instrument->instrument }} - Set {{ $n }}
|
||||||
<br/>
|
<br/>
|
||||||
|
<p class="italic text-xs font-light mt-2">Updated: {{ $ensemble->getEtude($instrument, $n)->updated_at->format('m/d/Y') }}</p>
|
||||||
</x-form.button>
|
</x-form.button>
|
||||||
</x-table.td>
|
</x-table.td>
|
||||||
@else
|
@else
|
||||||
|
|
@ -88,8 +53,11 @@
|
||||||
ensemble_id = '{{ $ensemble->id }}';
|
ensemble_id = '{{ $ensemble->id }}';
|
||||||
instrument = '{{ $instrument->instrument }}';
|
instrument = '{{ $instrument->instrument }}';
|
||||||
instrument_id = '{{ $instrument->id }}';
|
instrument_id = '{{ $instrument->id }}';
|
||||||
set = {{ $n }}"
|
set = {{ $n }};
|
||||||
|
etude_link = '';
|
||||||
|
existing_etude_id = '';"
|
||||||
>
|
>
|
||||||
|
{{ $ensemble->abbreviation }} - {{ $instrument->instrument }} - Set {{ $n }}<br />
|
||||||
No Etude
|
No Etude
|
||||||
</x-form.button>
|
</x-form.button>
|
||||||
</x-table.td>
|
</x-table.td>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
<el-dialog>
|
||||||
|
<dialog id="etude-uploader" aria-labelledby="Upload Etude"
|
||||||
|
class="fixed inset-0 size-auto max-h-none max-w-none overflow-y-auto bg-transparent backdrop:bg-transparent">
|
||||||
|
<el-dialog-backdrop
|
||||||
|
class="fixed inset-0 bg-gray-500/75 transition-opacity data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in dark:bg-gray-900/50"></el-dialog-backdrop>
|
||||||
|
|
||||||
|
<div tabindex="0"
|
||||||
|
class="flex min-h-full items-end justify-center p-2 text-center focus:outline-none sm:items-center sm:p-0">
|
||||||
|
<el-dialog-panel
|
||||||
|
class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all data-closed:translate-y-4 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:my-8 sm:w-full sm:max-w-sm sm:p-6 data-closed:sm:translate-y-0 data-closed:sm:scale-95 dark:bg-gray-800 dark:outline dark:-outline-offset-1 dark:outline-white/10">
|
||||||
|
<x-form method="POST" action="{{ route('admin.etude-grid.store') }}" enctype="multipart/form-data">
|
||||||
|
<input type="hidden" name="ensemble_id" x-model="ensemble_id"/>
|
||||||
|
<input type="hidden" name="instrument_id" x-model="instrument_id"/>
|
||||||
|
<input type="hidden" name="set" x-model="set"/>
|
||||||
|
<div>
|
||||||
|
<div class="mt-1 text-center sm:mt-3">
|
||||||
|
<h3 id="dialog-title" class="text-base font-semibold text-gray-900 dark:text-white">
|
||||||
|
Update Etude
|
||||||
|
</h3>
|
||||||
|
<div class="mt-2 ">
|
||||||
|
<span x-text="ensemble"></span>
|
||||||
|
<span x-text="instrument"></span>
|
||||||
|
<span x-text="`Set ${set}`"></span>
|
||||||
|
<p x-show="etude_link">
|
||||||
|
<a x-bind:href="etude_link" class="underline text-blue-600">
|
||||||
|
View Existing Etude
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-3">
|
||||||
|
<x-form.input name="file_upload" type="file" label="Etude PDF"/>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="mt-5 sm:mt-6">
|
||||||
|
<button type="submit"
|
||||||
|
class="inline-flex w-full justify-center rounded-md bg-brand-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-brand-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand-600 dark:bg-brand-500 dark:shadow-none dark:hover:bg-brand-400 dark:focus-visible:outline-brand-500">
|
||||||
|
Save Etude
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</x-form>
|
||||||
|
<div class="mt-5 sm:mt-6" x-show="existing_etude_id">
|
||||||
|
<x-form method="DELETE" action="{{ route('admin.etude-grid.delete') }}">
|
||||||
|
<input type="hidden" name="etude_id" x-model="existing_etude_id">
|
||||||
|
<button type="submit"
|
||||||
|
class="inline-flex w-full justify-center rounded-md bg-red-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-red-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600 dark:bg-red-500 dark:shadow-none dark:hover:bg-red-400 dark:focus-visible:outline-red-500">
|
||||||
|
Remove Etude
|
||||||
|
</button>
|
||||||
|
</x-form>
|
||||||
|
</div>
|
||||||
|
</el-dialog-panel>
|
||||||
|
</div>
|
||||||
|
</dialog>
|
||||||
|
</el-dialog>
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
</x-slot:header>
|
</x-slot:header>
|
||||||
@foreach($etudes as $etude)
|
@foreach($etudes as $etude)
|
||||||
<tr>
|
<tr>
|
||||||
<x-table.td>{{ $etude->auditionedEnsemble->name }}</x-table.td>
|
<x-table.td>{{ $etude->ensemble->name }}</x-table.td>
|
||||||
<x-table.td>{{ $etude->set }}</x-table.td>
|
<x-table.td>{{ $etude->set }}</x-table.td>
|
||||||
<x-table.td>{{ $etude->instrument->instrument }}</x-table.td>
|
<x-table.td>{{ $etude->instrument->instrument }}</x-table.td>
|
||||||
<x-table.td>
|
<x-table.td>
|
||||||
|
|
|
||||||
|
|
@ -29,4 +29,6 @@ Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function ()
|
||||||
Route::resource('/etudes', AuditionEtudeController::class)->names('etudes');
|
Route::resource('/etudes', AuditionEtudeController::class)->names('etudes');
|
||||||
Route::resource('/news', NewsStoryController::class)->except(['show'])->names('news');
|
Route::resource('/news', NewsStoryController::class)->except(['show'])->names('news');
|
||||||
Route::get('/etude-grid', [AuditionEtudeGridController::class, 'index'])->name('etude-grid');
|
Route::get('/etude-grid', [AuditionEtudeGridController::class, 'index'])->name('etude-grid');
|
||||||
|
Route::post('/etude-grid', [AuditionEtudeGridController::class, 'store'])->name('etude-grid.store');
|
||||||
|
Route::delete('/etude-grid', [AuditionEtudeGridController::class, 'destroy'])->name('etude-grid.delete');
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue