diff --git a/lang/de.json b/lang/de.json index 499933a..7290af3 100644 --- a/lang/de.json +++ b/lang/de.json @@ -322,5 +322,57 @@ "Öffnen/RSVP": "", "Über den Dozenten": "", "Über den Kurs": "", - "Über uns": "" + "Über uns": "", + "Diverses": "", + "Orte/Gebiete": "", + "Städte/Gebiete": "", + "Veranstaltungsorte": "", + "Copy": "", + "Click to connect": "", + "City successfully created!": "", + "Create City": "", + "Country": "", + "Select a country": "", + "Latitude": "", + "Longitude": "", + "Population": "", + "Population Date": "", + "City successfully updated!": "", + "Edit City": "", + "Update City": "", + "Cities": "", + "Search cities...": "", + "Created By": "", + "Actions": "", + "Edit": "", + "Wann beginnt das Event?": "", + "Endzeit": "", + "Wann endet das Event?": "", + "Veranstaltungsort": "", + "Ort hinzufügen": "", + "Veranstaltungsort auswählen": "", + "Suche nach Ort...": "", + "Link zu weiteren Informationen oder zur Anmeldung": "", + "Veranstaltungsort hinzufügen": "", + "Füge einen neuen Veranstaltungsort zur Datenbank hinzu.": "", + "z.B. Bitcoin Zentrum München": "", + "Straße": "", + "z.B. Hauptstraße 1": "", + "Ort erstellen": "", + "Anmeldungen": "", + "weitere Termine": "", + "Venue successfully created!": "", + "Create Venue": "", + "City": "", + "Select a city": "", + "Street": "", + "Venue successfully updated!": "", + "Edit Venue": "", + "Update Venue": "", + "Venues": "", + "Search venues...": "", + "Basic Information": "", + "Coordinates": "", + "Demographics": "", + "Venue Information": "" } \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index f27acbf..edd56bb 100644 --- a/lang/en.json +++ b/lang/en.json @@ -322,5 +322,57 @@ "Öffnen/RSVP": "Open/RSVP", "Über den Dozenten": "About the lecturer", "Über den Kurs": "About the course", - "Über uns": "About us" -} \ No newline at end of file + "Über uns": "About us", + "Diverses": "Miscellaneous", + "Orte/Gebiete": "Places/Areas", + "Städte/Gebiete": "Cities/Areas", + "Veranstaltungsorte": "Venues", + "Copy": "Copy", + "Click to connect": "Click to connect", + "City successfully created!": "City successfully created!", + "Create City": "Create City", + "Country": "Country", + "Select a country": "Select a country", + "Latitude": "Latitude", + "Longitude": "Longitude", + "Population": "Population", + "Population Date": "Population Date", + "City successfully updated!": "City successfully updated!", + "Edit City": "Edit City", + "Update City": "Update City", + "Cities": "Cities", + "Search cities...": "Search cities...", + "Created By": "Created By", + "Actions": "Actions", + "Edit": "Edit", + "Wann beginnt das Event?": "When does the event start?", + "Endzeit": "End time", + "Wann endet das Event?": "When does the event end?", + "Veranstaltungsort": "Venue", + "Ort hinzufügen": "Add location", + "Veranstaltungsort auswählen": "Select venue", + "Suche nach Ort...": "Search for location...", + "Link zu weiteren Informationen oder zur Anmeldung": "Link to further information or registration", + "Veranstaltungsort hinzufügen": "Add venue", + "Füge einen neuen Veranstaltungsort zur Datenbank hinzu.": "Add a new venue to the database.", + "z.B. Bitcoin Zentrum München": "e.g. Bitcoin Center Munich", + "Straße": "Street", + "z.B. Hauptstraße 1": "e.g. Main Street 1", + "Ort erstellen": "Create location", + "Anmeldungen": "Registrations", + "weitere Termine": "more dates", + "Venue successfully created!": "Venue successfully created!", + "Create Venue": "Create Venue", + "City": "City", + "Select a city": "Select a city", + "Street": "Street", + "Venue successfully updated!": "Venue successfully updated!", + "Edit Venue": "Edit Venue", + "Update Venue": "Update Venue", + "Venues": "Venues", + "Search venues...": "Search venues...", + "Basic Information": "Basic Information", + "Coordinates": "Coordinates", + "Demographics": "Demographics", + "Venue Information": "Venue Information" +} diff --git a/lang/es.json b/lang/es.json index 73bdc3d..6c6e6e6 100644 --- a/lang/es.json +++ b/lang/es.json @@ -321,5 +321,57 @@ "Öffnen/RSVP": "Abrir/RSVP", "Über den Dozenten": "Sobre el profesor", "Über den Kurs": "Sobre el curso", - "Über uns": "Sobre nosotros" -} \ No newline at end of file + "Über uns": "Sobre nosotros", + "Diverses": "Varios", + "Orte/Gebiete": "Lugares/Áreas", + "Städte/Gebiete": "Ciudades/Áreas", + "Veranstaltungsorte": "Lugares de eventos", + "Copy": "Copiar", + "Click to connect": "Haz clic para conectar", + "City successfully created!": "¡Ciudad creada exitosamente!", + "Create City": "Crear ciudad", + "Country": "País", + "Select a country": "Seleccionar país", + "Latitude": "Latitud", + "Longitude": "Longitud", + "Population": "Población", + "Population Date": "Fecha de población", + "City successfully updated!": "¡Ciudad actualizada exitosamente!", + "Edit City": "Editar ciudad", + "Update City": "Actualizar ciudad", + "Cities": "Ciudades", + "Search cities...": "Buscar ciudades...", + "Created By": "Creado por", + "Actions": "Acciones", + "Edit": "Editar", + "Wann beginnt das Event?": "¿Cuándo comienza el evento?", + "Endzeit": "Hora de finalización", + "Wann endet das Event?": "¿Cuándo termina el evento?", + "Veranstaltungsort": "Lugar del evento", + "Ort hinzufügen": "Agregar lugar", + "Veranstaltungsort auswählen": "Seleccionar lugar del evento", + "Suche nach Ort...": "Buscar lugar...", + "Link zu weiteren Informationen oder zur Anmeldung": "Enlace para más información o registro", + "Veranstaltungsort hinzufügen": "Agregar lugar de evento", + "Füge einen neuen Veranstaltungsort zur Datenbank hinzu.": "Agrega un nuevo lugar de evento a la base de datos.", + "z.B. Bitcoin Zentrum München": "ej. Centro Bitcoin Múnich", + "Straße": "Calle", + "z.B. Hauptstraße 1": "ej. Calle Principal 1", + "Ort erstellen": "Crear lugar", + "Anmeldungen": "Registros", + "weitere Termine": "más fechas", + "Venue successfully created!": "¡Lugar creado exitosamente!", + "Create Venue": "Crear lugar", + "City": "Ciudad", + "Select a city": "Seleccionar ciudad", + "Street": "Calle", + "Venue successfully updated!": "¡Lugar actualizado exitosamente!", + "Edit Venue": "Editar lugar", + "Update Venue": "Actualizar lugar", + "Venues": "Lugares", + "Search venues...": "Buscar lugares...", + "Basic Information": "Información básica", + "Coordinates": "Coordenadas", + "Demographics": "Demografía", + "Venue Information": "Información del lugar" +} diff --git a/resources/views/components/layouts/app/sidebar.blade.php b/resources/views/components/layouts/app/sidebar.blade.php index ab30583..a898c16 100644 --- a/resources/views/components/layouts/app/sidebar.blade.php +++ b/resources/views/components/layouts/app/sidebar.blade.php @@ -47,9 +47,23 @@ {{ __('Dozenten') }} - {{-- - --}} + + + + {{ __('Städte/Gebiete') }} + + + {{ __('Veranstaltungsorte') }} + + + diff --git a/resources/views/livewire/cities/create.blade.php b/resources/views/livewire/cities/create.blade.php new file mode 100644 index 0000000..797b45b --- /dev/null +++ b/resources/views/livewire/cities/create.blade.php @@ -0,0 +1,88 @@ +validate([ + 'name' => ['required', 'string', 'max:255', 'unique:cities,name'], + 'country_id' => ['required', 'exists:countries,id'], + 'latitude' => ['required', 'numeric', 'between:-90,90'], + 'longitude' => ['required', 'numeric', 'between:-180,180'], + 'population' => ['nullable', 'integer', 'min:0'], + 'population_date' => ['nullable', 'string', 'max:255'], + ]); + + $validated['slug'] = str($validated['name'])->slug(); + $validated['created_by'] = auth()->id(); + + $city = City::create($validated); + + session()->flash('status', __('City successfully created!')); + + $this->redirect(route_with_country('cities.index'), navigate: true); + } + + public function with(): array + { + return [ + 'countries' => Country::query()->orderBy('name')->get(), + ]; + } +}; ?> + +
+
+ {{ __('Create City') }} +
+ +
+ + {{ __('Basic Information') }} + +
+ + + + + @foreach($countries as $country) + + @endforeach + +
+
+ + + {{ __('Coordinates') }} + +
+ + +
+
+ + + {{ __('Demographics') }} + +
+ + +
+
+ +
+ {{ __('Create City') }} + {{ __('Cancel') }} +
+
+
diff --git a/resources/views/livewire/cities/edit.blade.php b/resources/views/livewire/cities/edit.blade.php new file mode 100644 index 0000000..1fafbd1 --- /dev/null +++ b/resources/views/livewire/cities/edit.blade.php @@ -0,0 +1,99 @@ +city = $city; + $this->name = $city->name; + $this->country_id = $city->country_id; + $this->latitude = $city->latitude; + $this->longitude = $city->longitude; + $this->population = $city->population; + $this->population_date = $city->population_date; + } + + public function updateCity(): void + { + $validated = $this->validate([ + 'name' => ['required', 'string', 'max:255', 'unique:cities,name,'.$this->city->id], + 'country_id' => ['required', 'exists:countries,id'], + 'latitude' => ['required', 'numeric', 'between:-90,90'], + 'longitude' => ['required', 'numeric', 'between:-180,180'], + 'population' => ['nullable', 'integer', 'min:0'], + 'population_date' => ['nullable', 'string', 'max:255'], + ]); + + $validated['slug'] = str($validated['name'])->slug(); + + $this->city->update($validated); + + session()->flash('status', __('City successfully updated!')); + + $this->redirect(route_with_country('cities.index'), navigate: true); + } + + public function with(): array + { + return [ + 'countries' => Country::query()->orderBy('name')->get(), + ]; + } +}; ?> + +
+
+ {{ __('Edit City') }}: {{ $city->name }} +
+ +
+ + {{ __('Basic Information') }} + +
+ + + + + @foreach($countries as $country) + + @endforeach + +
+
+ + + {{ __('Coordinates') }} + +
+ + +
+
+ + + {{ __('Demographics') }} + +
+ + +
+
+ +
+ {{ __('Update City') }} + {{ __('Cancel') }} +
+
+
diff --git a/resources/views/livewire/cities/index.blade.php b/resources/views/livewire/cities/index.blade.php new file mode 100644 index 0000000..767201e --- /dev/null +++ b/resources/views/livewire/cities/index.blade.php @@ -0,0 +1,94 @@ +country = request()->route('country'); + } + + public function with(): array + { + return [ + 'cities' => City::with(['country', 'createdBy']) + ->when($this->search, fn($query) + => $query->where('name', 'ilike', '%'.$this->search.'%'), + ) + ->orderBy('name') + ->paginate(15), + ]; + } +}; ?> + +
+
+ {{ __('Cities') }} +
+ + @auth + + {{ __('Create City') }} + + @endauth +
+
+ + + + {{ __('Name') }} + {{ __('Country') }} + {{ __('Population') }} + {{ __('Created By') }} + {{ __('Actions') }} + + + + @foreach ($cities as $city) + + + {{ $city->name }} + + + @if($city->country) + {{ $city->country->name }} + @endif + + + @if($city->population) + {{ number_format($city->population) }} + @if($city->population_date) + ({{ $city->population_date }}) + @endif + @endif + + + @if($city->createdBy) + {{ $city->createdBy->name }} + @endif + + +
+ @auth + + {{ __('Edit') }} + + @endauth +
+
+
+ @endforeach +
+
+
diff --git a/resources/views/livewire/venues/create.blade.php b/resources/views/livewire/venues/create.blade.php new file mode 100644 index 0000000..9088645 --- /dev/null +++ b/resources/views/livewire/venues/create.blade.php @@ -0,0 +1,71 @@ +validate([ + 'name' => ['required', 'string', 'max:255', 'unique:venues,name'], + 'city_id' => ['required', 'exists:cities,id'], + 'street' => ['required', 'string', 'max:255'], + ]); + + $validated['slug'] = str($validated['name'])->slug(); + $validated['created_by'] = auth()->id(); + + $venue = Venue::create($validated); + + session()->flash('status', __('Venue successfully created!')); + + $this->redirect(route_with_country('venues.index'), navigate: true); + } + + public function with(): array + { + return [ + 'cities' => City::query()->with('country')->orderBy('name')->get(), + ]; + } +}; ?> + +
+
+ {{ __('Create Venue') }} +
+ +
+ + {{ __('Venue Information') }} + +
+ + + + + @foreach($cities as $city) + + @endforeach + + + +
+
+ +
+ {{ __('Create Venue') }} + {{ __('Cancel') }} +
+
+
diff --git a/resources/views/livewire/venues/edit.blade.php b/resources/views/livewire/venues/edit.blade.php new file mode 100644 index 0000000..00a4a12 --- /dev/null +++ b/resources/views/livewire/venues/edit.blade.php @@ -0,0 +1,79 @@ +venue = $venue; + $this->name = $venue->name; + $this->city_id = $venue->city_id; + $this->street = $venue->street; + } + + public function updateVenue(): void + { + $validated = $this->validate([ + 'name' => ['required', 'string', 'max:255', 'unique:venues,name,'.$this->venue->id], + 'city_id' => ['required', 'exists:cities,id'], + 'street' => ['required', 'string', 'max:255'], + ]); + + $validated['slug'] = str($validated['name'])->slug(); + + $this->venue->update($validated); + + session()->flash('status', __('Venue successfully updated!')); + + $this->redirect(route_with_country('venues.index'), navigate: true); + } + + public function with(): array + { + return [ + 'cities' => City::query()->with('country')->orderBy('name')->get(), + ]; + } +}; ?> + +
+
+ {{ __('Edit Venue') }}: {{ $venue->name }} +
+ +
+ + {{ __('Venue Information') }} + +
+ + + + + @foreach($cities as $city) + + @endforeach + + + +
+
+ +
+ {{ __('Update Venue') }} + {{ __('Cancel') }} +
+
+
diff --git a/resources/views/livewire/venues/index.blade.php b/resources/views/livewire/venues/index.blade.php new file mode 100644 index 0000000..d2d3840 --- /dev/null +++ b/resources/views/livewire/venues/index.blade.php @@ -0,0 +1,88 @@ +country = request()->route('country'); + } + + public function with(): array + { + return [ + 'venues' => Venue::with(['city.country', 'createdBy']) + ->when($this->search, fn($query) + => $query->where('name', 'ilike', '%'.$this->search.'%'), + ) + ->orderBy('name') + ->paginate(15), + ]; + } +}; ?> + +
+
+ {{ __('Venues') }} +
+ + @auth + + {{ __('Create Venue') }} + + @endauth +
+
+ + + + {{ __('Name') }} + {{ __('City') }} + {{ __('Created By') }} + {{ __('Actions') }} + + + + @foreach ($venues as $venue) + + + {{ $venue->name }} + + + @if($venue->city) + {{ $venue->city->name }} + @if($venue->city->country) + ({{ $venue->city->country->name }}) + @endif + @endif + + + @if($venue->createdBy) + {{ $venue->createdBy->name }} + @endif + + +
+ @auth + + {{ __('Edit') }} + + @endauth +
+
+
+ @endforeach +
+
+
diff --git a/routes/web.php b/routes/web.php index ba179e9..e3fa224 100644 --- a/routes/web.php +++ b/routes/web.php @@ -42,6 +42,9 @@ Route::middleware([]) Volt::route('course/{course}/event/{event}', 'courses.landingpage-event')->name('courses.landingpage-event'); Volt::route('lecturers', 'lecturers.index')->name('lecturers.index'); + + Volt::route('cities', 'cities.index')->name('cities.index'); + Volt::route('venues', 'venues.index')->name('venues.index'); }); Route::middleware(['auth']) @@ -60,6 +63,12 @@ Route::middleware(['auth']) Volt::route('lecturer-create', 'lecturers.create')->name('lecturers.create'); Volt::route('lecturer-edit/{lecturer}', 'lecturers.edit')->name('lecturers.edit'); + + Volt::route('city-create', 'cities.create')->name('cities.create'); + Volt::route('city-edit/{city}', 'cities.edit')->name('cities.edit'); + + Volt::route('venue-create', 'venues.create')->name('venues.create'); + Volt::route('venue-edit/{venue}', 'venues.edit')->name('venues.edit'); }); Route::middleware(['auth'])