diff --git a/app/Http/Controllers/Admin/EnsembleController.php b/app/Http/Controllers/Admin/EnsembleController.php
new file mode 100644
index 0000000..f666b65
--- /dev/null
+++ b/app/Http/Controllers/Admin/EnsembleController.php
@@ -0,0 +1,51 @@
+get();
+ return view('admin.ensembles.index',compact('events'));
+ }
+
+ public function store(Request $request)
+ {
+ if(! Auth::user()->is_admin) abort(403);
+ request()->validate([
+ 'name' => 'required',
+ 'code' => 'required',
+ 'event_id' => ['required','exists:events,id']
+ ]);
+
+ Ensemble::create([
+ 'name' => request('name'),
+ 'code' => request('code'),
+ 'event_id' => request('event_id'),
+ ]);
+
+ return redirect()->route('admin.ensembles.index')->with('success','Ensemble created successfully');
+ }
+
+ public function updateEnsembleRank(Request $request)
+ {
+ $order = $request->input('order');
+ $eventId = $request->input('event_id');
+
+ foreach ($order as $item) {
+ Ensemble::where('id', $item['id'])
+ ->where('event_id', $eventId)
+ ->update(['rank' => $item['rank']]);
+ }
+
+ return response()->json(['status' => 'success']);
+ }
+}
diff --git a/app/Models/Ensemble.php b/app/Models/Ensemble.php
new file mode 100644
index 0000000..8760051
--- /dev/null
+++ b/app/Models/Ensemble.php
@@ -0,0 +1,18 @@
+belongsTo(Event::class);
+ }
+}
diff --git a/app/Models/Event.php b/app/Models/Event.php
index f904010..2df0d6a 100644
--- a/app/Models/Event.php
+++ b/app/Models/Event.php
@@ -15,4 +15,10 @@ class Event extends Model
{
return $this->hasMany(Audition::class);
}
+
+ public function ensembles(): HasMany
+ {
+ return $this->hasMany(Ensemble::class)
+ ->orderBy('rank');
+ }
}
diff --git a/database/migrations/2024_06_18_220009_create_ensembles_table.php b/database/migrations/2024_06_18_220009_create_ensembles_table.php
new file mode 100644
index 0000000..91c7773
--- /dev/null
+++ b/database/migrations/2024_06_18_220009_create_ensembles_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->foreignIdFor(Event::class)->constrained()->cascadeOnUpdate()->cascadeOnDelete();
+ $table->string('name');
+ $table->string('code');
+ $table->integer('rank')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('ensembles');
+ }
+};
diff --git a/resources/views/admin/ensembles/index-event-table.blade.php b/resources/views/admin/ensembles/index-event-table.blade.php
new file mode 100644
index 0000000..ed6237e
--- /dev/null
+++ b/resources/views/admin/ensembles/index-event-table.blade.php
@@ -0,0 +1,29 @@
+
+
+
+
+
+ @endforeach
+
+ {{-- move help text to a popout modal --}}
+
+