new forms added for courses

This commit is contained in:
HolgerHatGarKeineNode
2023-02-27 18:37:23 +01:00
parent d1d0d5ce3d
commit ce972e66c6
28 changed files with 612 additions and 49 deletions

View File

@@ -3,6 +3,7 @@
namespace App\Http\Livewire\City\Form;
use App\Models\City;
use Illuminate\Validation\Rule;
use Livewire\Component;
class CityForm extends Component
@@ -21,7 +22,11 @@ class CityForm extends Component
{
return [
'city.country_id' => 'required',
'city.name' => 'required|string',
'city.name' => [
'required',
Rule::unique('cities', 'name')
->ignore($this->city),
],
'city.longitude' => 'required',
'city.latitude' => 'required',
];

View File

@@ -47,7 +47,6 @@ class ContentCreatorForm extends Component
$this->lecturer = new Lecturer([
'intro' => '',
'active' => true,
'team_id' => true,
]);
}
if (!$this->fromUrl) {

View File

@@ -33,7 +33,11 @@ class MeetupForm extends Component
'image' => [Rule::requiredIf(!$this->meetup->id), 'nullable', 'mimes:jpeg,png,jpg,gif', 'max:10240'],
'meetup.city_id' => 'required',
'meetup.name' => 'required',
'meetup.name' => [
'required',
Rule::unique('meetups', 'name')
->ignore($this->meetup),
],
'meetup.community' => 'required',
'meetup.telegram_link' => 'string|nullable|required_without_all:meetup.webpage,meetup.nostr,meetup.twitter_username,meetup.matrix_group',
'meetup.intro' => 'string|nullable',

View File

@@ -0,0 +1,67 @@
<?php
namespace App\Http\Livewire\School\Form;
use App\Models\Course;
use App\Models\CourseEvent;
use Livewire\Component;
use Livewire\WithFileUploads;
use WireUi\Traits\Actions;
class CourseEventForm extends Component
{
use WithFileUploads;
use Actions;
public ?CourseEvent $courseEvent = null;
public ?string $fromUrl = '';
public $image;
protected $queryString = [
'fromUrl' => [
'except' => null,
],
];
public function rules()
{
return [
'courseEvent.course_id' => 'required',
'courseEvent.venue_id' => 'required',
'courseEvent.from' => 'required',
'courseEvent.to' => 'required',
'courseEvent.link' => 'required',
];
}
public function mount()
{
if (!$this->courseEvent) {
$this->courseEvent = new CourseEvent([]);
} elseif (
!auth()
->user()
->can('update', $this->courseEvent)
) {
abort(403);
}
if (!$this->fromUrl) {
$this->fromUrl = url()->previous();
}
}
public function submit()
{
$this->validate();
$this->courseEvent->save();
return redirect($this->fromUrl);
}
public function render()
{
return view('livewire.school.form.course-event-form');
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Http\Livewire\School\Form;
use App\Models\Course;
use App\Models\Tag;
use Illuminate\Validation\Rule;
use Livewire\Component;
use Livewire\WithFileUploads;
use WireUi\Traits\Actions;
class CourseForm extends Component
{
use WithFileUploads;
use Actions;
public ?Course $course = null;
public ?string $fromUrl = '';
public $image;
public array $selectedTags = [];
protected $queryString = [
'fromUrl' => [
'except' => null,
],
];
public function rules()
{
return [
'image' => [Rule::requiredIf(!$this->course->id), 'nullable', 'mimes:jpeg,png,jpg,gif', 'max:10240'],
'course.lecturer_id' => 'required',
'course.name' => [
'required',
Rule::unique('courses', 'name')
->ignore($this->course),
],
'course.description' => 'string|nullable',
];
}
public function mount()
{
if (!$this->course) {
$this->course = new Course([
'description' => '',
]);
} elseif (
!auth()
->user()
->can('update', $this->course)
) {
abort(403);
}
if (!$this->fromUrl) {
$this->fromUrl = url()->previous();
}
}
public function submit()
{
$this->validate();
$this->course->save();
$this->course->syncTagsWithType(
$this->selectedTags,
'course'
);
if ($this->image) {
$this->course->addMedia($this->image)
->usingFileName(md5($this->image->getClientOriginalName()).'.'.$this->image->getClientOriginalExtension())
->toMediaCollection('logo');
}
return redirect($this->fromUrl);
}
public function selectTag($name)
{
$selectedTags = collect($this->selectedTags);
if ($selectedTags->contains($name)) {
$selectedTags = $selectedTags->filter(fn($tag) => $tag !== $name);
} else {
$selectedTags->push($name);
}
$this->selectedTags = $selectedTags->values()
->toArray();
}
public function render()
{
return view('livewire.school.form.course-form', [
'tags' => Tag::query()
->where('type', 'course')
->get(),
]);
}
}

View File

@@ -18,7 +18,7 @@ class CourseTable extends DataTableComponent
public function configure(): void
{
$this->setPrimaryKey('id')
->setAdditionalSelects(['id'])
->setAdditionalSelects(['courses.id', 'courses.created_by'])
->setThAttributes(function (Column $column) {
return [
'class' => 'px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider dark:bg-gray-800 dark:text-gray-400',
@@ -101,7 +101,7 @@ class CourseTable extends DataTableComponent
'tags',
])
->withCount([
'courseEvents',
'courseEvents' => fn($query) => $query->where('course_events.from', '>', now()),
])
->whereHas('courseEvents.venue.city.country',
fn ($query) => $query->where('countries.code', $this->country))

View File

@@ -29,6 +29,7 @@ class EventTable extends DataTableComponent
->setDefaultSort('from', 'asc')
->setAdditionalSelects([
'course_events.id',
'course_events.created_by',
'course_id',
'venue_id',
])