From 17591d8dbb6449008022cc3e6259ea9335dfa5f7 Mon Sep 17 00:00:00 2001 From: Benjamin Takats Date: Fri, 2 Dec 2022 16:24:25 +0100 Subject: [PATCH] set timezone --- .blueprint | 2 +- .../Fortify/UpdateUserProfileInformation.php | 16 ++-- app/Http/Kernel.php | 3 + app/Http/Livewire/Tables/EventTable.php | 10 ++- app/Http/Middleware/SetTimezoneMiddleware.php | 31 +++++++ app/Nova/City.php | 4 +- app/Nova/Event.php | 4 +- app/Observers/EventObserver.php | 68 +++++++++++++++ app/Providers/AppServiceProvider.php | 12 +-- app/Providers/EventServiceProvider.php | 3 +- app/Providers/NovaServiceProvider.php | 4 + app/Support/Carbon.php | 32 +++++++ composer.json | 1 + composer.lock | 84 ++++++++++++++++--- ...3043_add_timezone_field_to_users_table.php | 30 +++++++ database/seeders/DatabaseSeeder.php | 4 +- .../update-profile-information-form.blade.php | 6 ++ routes/web.php | 6 +- 18 files changed, 286 insertions(+), 34 deletions(-) create mode 100644 app/Http/Middleware/SetTimezoneMiddleware.php create mode 100644 app/Observers/EventObserver.php create mode 100644 app/Support/Carbon.php create mode 100644 database/migrations/2022_12_02_133043_add_timezone_field_to_users_table.php diff --git a/.blueprint b/.blueprint index b397293d..efb1be90 100644 --- a/.blueprint +++ b/.blueprint @@ -11,5 +11,5 @@ models: Registration: { event_id: biginteger, participant_id: biginteger, active: 'boolean default:1' } Team: { user_id: biginteger, name: string, personal_team: boolean } TeamInvitation: { team_id: biginteger, email: string, role: 'string nullable' } - User: { name: string, public_key: 'string nullable', email: 'string nullable', email_verified_at: 'datetime nullable', password: 'string nullable', remember_token: 'string:100 nullable', current_team_id: 'biginteger nullable', profile_photo_path: 'string:2048 nullable', is_lecturer: 'boolean default:', two_factor_secret: 'text nullable', two_factor_recovery_codes: 'text nullable', two_factor_confirmed_at: 'datetime nullable' } + User: { name: string, public_key: 'string nullable', email: 'string nullable', email_verified_at: 'datetime nullable', password: 'string nullable', remember_token: 'string:100 nullable', current_team_id: 'biginteger nullable', profile_photo_path: 'string:2048 nullable', is_lecturer: 'boolean default:', two_factor_secret: 'text nullable', two_factor_recovery_codes: 'text nullable', two_factor_confirmed_at: 'datetime nullable', timezone: 'string default:Europe/Berlin' } Venue: { city_id: biginteger, name: string, slug: string, street: string } diff --git a/app/Actions/Fortify/UpdateUserProfileInformation.php b/app/Actions/Fortify/UpdateUserProfileInformation.php index 6a6be6c4..c6e4a7ad 100644 --- a/app/Actions/Fortify/UpdateUserProfileInformation.php +++ b/app/Actions/Fortify/UpdateUserProfileInformation.php @@ -20,11 +20,13 @@ class UpdateUserProfileInformation implements UpdatesUserProfileInformation public function update($user, array $input) { Validator::make($input, [ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['nullable', 'email', 'max:255', Rule::unique('users') - ->ignore($user->id) + 'name' => ['required', 'string', 'max:255'], + 'timezone' => ['required', 'string'], + 'email' => [ + 'nullable', 'email', 'max:255', Rule::unique('users') + ->ignore($user->id) ], - 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], + 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], ]) ->validateWithBag('updateProfileInformation'); @@ -37,8 +39,9 @@ class UpdateUserProfileInformation implements UpdatesUserProfileInformation $this->updateVerifiedUser($user, $input); } else { $user->forceFill([ - 'name' => $input['name'], - 'email' => $input['email'], + 'name' => $input['name'], + 'email' => $input['email'], + 'timezone' => $input['timezone'], ]) ->save(); } @@ -57,6 +60,7 @@ class UpdateUserProfileInformation implements UpdatesUserProfileInformation $user->forceFill([ 'name' => $input['name'], 'email' => $input['email'], + 'timezone' => $input['timezone'], 'email_verified_at' => null, ]) ->save(); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 438689c6..163394c6 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -3,6 +3,7 @@ namespace App\Http; use App\Http\Middleware\CustomEnsureEmailVerified; +use App\Http\Middleware\SetTimezoneMiddleware; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel @@ -34,12 +35,14 @@ class Kernel extends HttpKernel \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, + SetTimezoneMiddleware::class, ], 'api' => [ // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, + SetTimezoneMiddleware::class, ], ]; diff --git a/app/Http/Livewire/Tables/EventTable.php b/app/Http/Livewire/Tables/EventTable.php index 9d8f8d0b..77379b68 100644 --- a/app/Http/Livewire/Tables/EventTable.php +++ b/app/Http/Livewire/Tables/EventTable.php @@ -34,9 +34,15 @@ class EventTable extends DataTableComponent ->sortable(), Column::make("Kurs", "course.name") ->sortable(), - Column::make("Erstellt am", "created_at") + Column::make("Von", "from") + ->format( + fn($value, $row, Column $column) => $value->asDateTime() + ) ->sortable(), - Column::make("Zuletzt geƤndert", "updated_at") + Column::make("Bis", "to") + ->format( + fn($value, $row, Column $column) => $value->asDateTime() + ) ->sortable(), /*Column::make("Teilnehmer") ->label( diff --git a/app/Http/Middleware/SetTimezoneMiddleware.php b/app/Http/Middleware/SetTimezoneMiddleware.php new file mode 100644 index 00000000..1ff7ce95 --- /dev/null +++ b/app/Http/Middleware/SetTimezoneMiddleware.php @@ -0,0 +1,31 @@ +segments())->contains('nova') + && $request->user() + && $timezone = $request->user()->timezone + ) { + config(['app.timezone' => $timezone]); + } + config(['app.timezone' => 'Europe/Berlin']); + + return $next($request); + } +} diff --git a/app/Nova/City.php b/app/Nova/City.php index bcf85c1a..9ec1b678 100644 --- a/app/Nova/City.php +++ b/app/Nova/City.php @@ -52,12 +52,12 @@ class City extends Resource Number::make('Latitude') ->rules('required', 'numeric') - ->step(0.00001) + ->step(0.000001) ->help('https://latitude.to/lat/47.72671/lng/10.31688'), Number::make('Longitude') ->rules('required', 'numeric') - ->step(0.00001) + ->step(0.000001) ->help('https://latitude.to/lat/47.72671/lng/10.31688'), BelongsTo::make('Country'), diff --git a/app/Nova/Event.php b/app/Nova/Event.php index 0636213f..fb94a3ea 100644 --- a/app/Nova/Event.php +++ b/app/Nova/Event.php @@ -57,11 +57,11 @@ class Event extends Resource DateTime::make('From') ->rules('required') - ->step(CarbonInterval::minutes(30)), + ->step(CarbonInterval::minutes(30))->displayUsing(fn ($value) => $value->asDateTime()), DateTime::make('To') ->rules('required') - ->step(CarbonInterval::minutes(30)), + ->step(CarbonInterval::minutes(30))->displayUsing(fn ($value) => $value->asDateTime()), BelongsTo::make('Course'), BelongsTo::make('Venue') diff --git a/app/Observers/EventObserver.php b/app/Observers/EventObserver.php new file mode 100644 index 00000000..1b083fed --- /dev/null +++ b/app/Observers/EventObserver.php @@ -0,0 +1,68 @@ +initials(); }); } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index ab8b2cf7..d7efa842 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Observers\EventObserver; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; @@ -27,7 +28,7 @@ class EventServiceProvider extends ServiceProvider */ public function boot() { - // + \App\Models\Event::observe(EventObserver::class); } /** diff --git a/app/Providers/NovaServiceProvider.php b/app/Providers/NovaServiceProvider.php index db2e6c67..f4d69767 100644 --- a/app/Providers/NovaServiceProvider.php +++ b/app/Providers/NovaServiceProvider.php @@ -82,6 +82,10 @@ class NovaServiceProvider extends NovaApplicationServiceProvider // return MIT license and date return sprintf("%s %s - %s", date('Y'), config('app.name'), __('MIT License')); }); + + Nova::userTimezone(function (Request $request) { + return $request->user()->timezone; + }); } /** diff --git a/app/Support/Carbon.php b/app/Support/Carbon.php new file mode 100644 index 00000000..8365158b --- /dev/null +++ b/app/Support/Carbon.php @@ -0,0 +1,32 @@ +timezone(config('app.timezone'))->locale('de'); + return str($dt->day)->padLeft(2, '0').'. '.$dt->monthName.' '.$dt->year; + } + + public function asTime(): string + { + return $this->timezone(config('app.timezone'))->locale('de') + ->format('H:i'); + } + + public function asDateTime(): string + { + $dt = $this->timezone(config('app.timezone'))->locale('de'); + return sprintf("%s. %s %s %s (%s)", + str($dt->day)->padLeft(2, '0'), + $dt->monthName, + $dt->year, + $dt->format('H:i'), + $dt->timezone + ); + } +} diff --git a/composer.json b/composer.json index c184ea68..1edffaf1 100644 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ "ezadr/lnurl-php": "^1.0", "guzzlehttp/guzzle": "^7.2", "itsmejoshua/novaspatiepermissions": "^1.0", + "jackiedo/timezonelist": "^5.1", "laravel/framework": "^9.19", "laravel/jetstream": "^2.12", "laravel/nova": "~4.0", diff --git a/composer.lock b/composer.lock index e06cec19..80cea129 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3b14fa82c7df08a15f0e0584c572402b", + "content-hash": "ff5b859d3c6ae9f19b73878a2e055f42", "packages": [ { "name": "akuechler/laravel-geoly", @@ -2004,6 +2004,66 @@ }, "time": "2022-05-16T01:34:26+00:00" }, + { + "name": "jackiedo/timezonelist", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/JackieDo/Timezone-List.git", + "reference": "f1c64d0159b4401a78c7ab536505175238c38837" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JackieDo/Timezone-List/zipball/f1c64d0159b4401a78c7ab536505175238c38837", + "reference": "f1c64d0159b4401a78c7ab536505175238c38837", + "shasum": "" + }, + "require": { + "illuminate/support": ">=5.0", + "php": ">=5.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + }, + "laravel": { + "aliases": { + "Timezonelist": "Jackiedo\\Timezonelist\\Facades\\Timezonelist" + }, + "providers": [ + "Jackiedo\\Timezonelist\\TimezonelistServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Jackiedo\\Timezonelist\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jackie Do", + "email": "anhvudo@gmail.com" + } + ], + "description": "A small package use to create a timezone list box in Laravel", + "keywords": [ + "laravel", + "timezone", + "timezonelist", + "timezones" + ], + "support": { + "issues": "https://github.com/JackieDo/Timezone-List/issues", + "source": "https://github.com/JackieDo/Timezone-List/tree/5.1.3" + }, + "time": "2022-03-17T15:10:43+00:00" + }, { "name": "jaybizzle/crawler-detect", "version": "v1.2.112", @@ -3656,16 +3716,16 @@ }, { "name": "nesbot/carbon", - "version": "2.63.0", + "version": "2.64.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347" + "reference": "889546413c97de2d05063b8cb7b193c2531ea211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ad35dd71a6a212b98e4b87e97389b6fa85f0e347", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/889546413c97de2d05063b8cb7b193c2531ea211", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211", "shasum": "" }, "require": { @@ -3676,7 +3736,7 @@ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -3754,7 +3814,7 @@ "type": "tidelift" } ], - "time": "2022-10-30T18:34:28+00:00" + "time": "2022-11-26T17:36:00+00:00" }, { "name": "nette/schema", @@ -10996,16 +11056,16 @@ }, { "name": "laravel-lang/lang", - "version": "12.5.4", + "version": "12.5.5", "source": { "type": "git", "url": "https://github.com/Laravel-Lang/lang.git", - "reference": "94ae1763dd0750ed97034c20949e481ccf13baac" + "reference": "6d4f8ccd4694530f0c4c424eded37d5b1308c062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Laravel-Lang/lang/zipball/94ae1763dd0750ed97034c20949e481ccf13baac", - "reference": "94ae1763dd0750ed97034c20949e481ccf13baac", + "url": "https://api.github.com/repos/Laravel-Lang/lang/zipball/6d4f8ccd4694530f0c4c424eded37d5b1308c062", + "reference": "6d4f8ccd4694530f0c4c424eded37d5b1308c062", "shasum": "" }, "require": { @@ -11067,7 +11127,7 @@ "type": "open_collective" } ], - "time": "2022-11-27T15:40:48+00:00" + "time": "2022-12-01T13:15:55+00:00" }, { "name": "laravel-lang/publisher", diff --git a/database/migrations/2022_12_02_133043_add_timezone_field_to_users_table.php b/database/migrations/2022_12_02_133043_add_timezone_field_to_users_table.php new file mode 100644 index 00000000..e7576cd9 --- /dev/null +++ b/database/migrations/2022_12_02_133043_add_timezone_field_to_users_table.php @@ -0,0 +1,30 @@ +string('timezone') + ->default('Europe/Berlin'); + }); + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 5f2c346d..b4fe3216 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -107,9 +107,9 @@ class DatabaseSeeder extends Seeder Event::create([ 'course_id' => 1, 'venue_id' => 1, - 'from' => now()->addDays(10), + 'from' => now()->startOfDay(), 'to' => now() - ->addDays(10) + ->startOfDay() ->addHour(), ]); Registration::create([ diff --git a/resources/views/profile/update-profile-information-form.blade.php b/resources/views/profile/update-profile-information-form.blade.php index e1e84f59..2d46eaa4 100644 --- a/resources/views/profile/update-profile-information-form.blade.php +++ b/resources/views/profile/update-profile-information-form.blade.php @@ -84,6 +84,12 @@ @endif @endif + +
+ + +
diff --git a/routes/web.php b/routes/web.php index 5328213e..9857fffb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -12,7 +12,11 @@ Route::get('/auth/ln', \App\Http\Livewire\Auth\LNUrlAuth::class) ->middleware('guest'); Route::get('/{country:code}/suche/stadt', \App\Http\Livewire\Frontend\SearchCity::class) - ->name('search.city'); + ->name('search.city') + ->where( + 'country', + '(.*)' + ); Route::get('/{country:code}/suche/dozent', \App\Http\Livewire\Frontend\SearchLecturer::class) ->name('search.lecturer');