Add create form.

This commit is contained in:
Matt Young 2025-12-17 12:20:21 -06:00
parent 5ccc48c4c3
commit 39a598c67b
5 changed files with 52 additions and 11 deletions

27
package-lock.json generated
View File

@ -5,7 +5,8 @@
"packages": { "packages": {
"": { "": {
"dependencies": { "dependencies": {
"@tailwindplus/elements": "^1.0.20" "@tailwindplus/elements": "^1.0.20",
"alpinejs": "^3.15.3"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/vite": "^4.0.0", "@tailwindcss/vite": "^4.0.0",
@ -1101,6 +1102,30 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@vue/reactivity": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz",
"integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==",
"license": "MIT",
"dependencies": {
"@vue/shared": "3.1.5"
}
},
"node_modules/@vue/shared": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz",
"integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==",
"license": "MIT"
},
"node_modules/alpinejs": {
"version": "3.15.3",
"resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.3.tgz",
"integrity": "sha512-fSI6F5213FdpMC4IWaup92KhuH3jBX0VVqajRJ6cOTCy1cL6888KyXdGO+seAAkn+g6fnrxBqQEx6gRpQ5EZoQ==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "~3.1.1"
}
},
"node_modules/ansi-regex": { "node_modules/ansi-regex": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",

View File

@ -15,6 +15,7 @@
"vite": "^7.0.7" "vite": "^7.0.7"
}, },
"dependencies": { "dependencies": {
"@tailwindplus/elements": "^1.0.20" "@tailwindplus/elements": "^1.0.20",
"alpinejs": "^3.15.3"
} }
} }

View File

@ -1,2 +1,7 @@
import './bootstrap'; import './bootstrap';
import '@tailwindplus/elements'; import '@tailwindplus/elements';
import Alpine from 'alpinejs';
window.Alpine = Alpine;
Alpine.start();

View File

@ -2,9 +2,9 @@
<x-card class="max-w-xl mx-auto"> <x-card class="max-w-xl mx-auto">
<x-slot:header class="bg-brand-600!">New Etude</x-slot:header> <x-slot:header class="bg-brand-600!">New Etude</x-slot:header>
<x-slot:body class="bg-white border border-brand-600"> <x-slot:body class="bg-white border border-brand-600">
<x-form.form method="POST" action="{{ route('admin.etudes.store') }}"> <x-form.form method="POST" action="{{ route('admin.etudes.store') }}" x-data="{ selectedEnsemble: '', selectedInstrument: '', selectedSetNumber: '' }">
<div> <div>
<x-form.select name="auditioned_ensemble_id"> <x-form.select name="auditioned_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)
@ -13,7 +13,7 @@
</x-form.select> </x-form.select>
</div> </div>
<div class="mt-3"> <div class="mt-3">
<x-form.select name="instrument_id"> <x-form.select name="instrument_id" x-model="selectedInstrument">
<option value="">Select Instrument...</option> <option value="">Select Instrument...</option>
<x-slot:label>Instrument</x-slot:label> <x-slot:label>Instrument</x-slot:label>
@foreach($instruments as $instrument) @foreach($instruments as $instrument)
@ -21,6 +21,12 @@
@endforeach @endforeach
</x-form.select> </x-form.select>
</div> </div>
<div class="mt-3" x-show="selectedEnsemble" x-cloak x-model="selectedSetNumber">
<x-form.input name="set" label="Set Number" type="number" min="1" x-bind:max="selectedEnsemble ? getSetCount(selectedEnsemble) : ''" />
</div>
<div class="mt-3" x-show="selectedEnsemble && selectedInstrument && selectedSetNumber" x-cloak>
<x-form.input name="file" type="file" label="Etude PDF" />
</div>
</x-form.form> </x-form.form>
</x-slot:body> </x-slot:body>
</x-card> </x-card>
@ -28,11 +34,15 @@
let ensembles = { let ensembles = {
@foreach($ensembles as $ensemble) @foreach($ensembles as $ensemble)
{{ $ensemble->id }}: { {{ $ensemble->id }}: {
id: {{ $enemble->id }}, id: {{ $ensemble->id }},
name: {{ $ensemble->name }}, name: '{{ $ensemble->name }}',
setCount: {{ $ensemble->set_count }} setCount: {{ $ensemble->set_count }}
} },
@endforeach @endforeach
}; };
function getSetCount(ensembleId) {
// noinspection JSUnresolvedVariable
return ensembles[ensembleId]?.setCount || '';
}
</script> </script>
</x-layout.admin> </x-layout.admin>

View File

@ -4,7 +4,7 @@
$hasError = $errors->has($name); $hasError = $errors->has($name);
@endphp @endphp
<div {{ $attributes }}> <div>
@if(isset($label) && is_object($label)) @if(isset($label) && is_object($label))
<label for="{{ $id ?? $name }}" {{ $label->attributes->merge(['class' => 'block text-sm/6 font-medium text-gray-900 dark:text-white']) }}> <label for="{{ $id ?? $name }}" {{ $label->attributes->merge(['class' => 'block text-sm/6 font-medium text-gray-900 dark:text-white']) }}>
{{ $label }} {{ $label }}
@ -23,11 +23,11 @@
value="{{ old($name, $value) }}" value="{{ old($name, $value) }}"
placeholder="{{ $placeholder }}" placeholder="{{ $placeholder }}"
@if($hasError) aria-invalid="true" aria-describedby="{{ $id ?? $name }}-error" @endif @if($hasError) aria-invalid="true" aria-describedby="{{ $id ?? $name }}-error" @endif
@class([ {{ $attributes->class([
'block w-full rounded-md bg-white py-1.5 outline-1 -outline-offset-1 focus:outline-2 focus:-outline-offset-2 sm:text-sm/6 dark:bg-white/5', 'block w-full rounded-md bg-white py-1.5 outline-1 -outline-offset-1 focus:outline-2 focus:-outline-offset-2 sm:text-sm/6 dark:bg-white/5',
'col-start-1 row-start-1 pr-10 pl-3 text-red-900 outline-red-300 placeholder:text-red-300 focus:outline-red-600 sm:pr-9 dark:text-red-400 dark:outline-red-500/50 dark:placeholder:text-red-400/70 dark:focus:outline-red-400' => $hasError, 'col-start-1 row-start-1 pr-10 pl-3 text-red-900 outline-red-300 placeholder:text-red-300 focus:outline-red-600 sm:pr-9 dark:text-red-400 dark:outline-red-500/50 dark:placeholder:text-red-400/70 dark:focus:outline-red-400' => $hasError,
'px-3 text-base text-gray-900 outline-gray-300 placeholder:text-gray-400 focus:outline-brand-600 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-brand-500' => !$hasError, 'px-3 text-base text-gray-900 outline-gray-300 placeholder:text-gray-400 focus:outline-brand-600 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-brand-500' => !$hasError,
]) ]) }}
/> />
@if($hasError) @if($hasError)