diff --git a/app/Filament/Resources/UserResource/Pages/EditProfile.php b/app/Filament/Resources/UserResource/Pages/EditProfile.php index c8ce603a5..6dceac4e2 100644 --- a/app/Filament/Resources/UserResource/Pages/EditProfile.php +++ b/app/Filament/Resources/UserResource/Pages/EditProfile.php @@ -13,6 +13,7 @@ use chillerlan\QRCode\Common\EccLevel; use chillerlan\QRCode\Common\Version; use chillerlan\QRCode\QRCode; use chillerlan\QRCode\QROptions; +use DateTimeZone; use Filament\Forms\Components\Actions\Action; use Filament\Forms\Components\Grid; use Filament\Forms\Components\Placeholder; @@ -85,6 +86,12 @@ class EditProfile extends \Filament\Pages\Auth\EditProfile ->visible(fn (Get $get): bool => filled($get('password'))) ->dehydrated(false), + Select::make('timezone') + ->required() + ->prefixIcon('tabler-clock-pin') + ->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz])) + ->searchable(), + Select::make('language') ->label(trans('strings.language')) ->required() @@ -193,8 +200,10 @@ class EditProfile extends \Filament\Pages\Auth\EditProfile ->schema([ Grid::make('asdf')->columns(5)->schema([ Section::make('Create API Key')->columnSpan(3)->schema([ + TextInput::make('description') ->live(), + TagsInput::make('allowed_ips') ->live() ->splitKeys([',', ' ', 'Tab']) diff --git a/app/Models/Model.php b/app/Models/Model.php index 6846dfd42..536edf9b5 100644 --- a/app/Models/Model.php +++ b/app/Models/Model.php @@ -2,7 +2,11 @@ namespace App\Models; +use Carbon\CarbonInterface; +use DateTimeInterface; use Illuminate\Support\Arr; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Date; use Illuminate\Support\Str; use Illuminate\Validation\Rule; use Illuminate\Container\Container; @@ -12,6 +16,7 @@ use App\Exceptions\Model\DataValidationException; use Illuminate\Database\Eloquent\Model as IlluminateModel; use Illuminate\Validation\Factory as ValidationFactory; use Illuminate\Validation\Validator; +use InvalidArgumentException; abstract class Model extends IlluminateModel { @@ -64,6 +69,36 @@ abstract class Model extends IlluminateModel return 'uuid'; } + protected function asDateTime($value) + { + $timezone = auth()->user()?->timezone ?? config('app.timezone', 'UTC'); + + if ($value instanceof CarbonInterface) { + return Date::instance($value->timezone($timezone)); + } + + if ($value instanceof DateTimeInterface) { + return Date::parse($value->format('Y-m-d H:i:s.u'), $timezone); + } + + if (is_numeric($value)) { + return Date::createFromTimestamp($value, $timezone); + } + + if ($this->isStandardDateFormat($value)) { + return Date::instance(Carbon::createFromFormat('Y-m-d', $value)->timezone($timezone)->startOfDay()); + } + + $format = $this->getDateFormat(); + try { + $date = Date::createFromFormat($format, $value)->timezone($timezone); + } catch (InvalidArgumentException) { + $date = false; + } + + return $date ?: Date::parse($value); + } + /** * Returns the validator instance used by this model. */ diff --git a/app/Models/User.php b/app/Models/User.php index c3acfbb46..6639a6a79 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -123,6 +123,7 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac 'name_last', 'password', 'language', + 'timezone', 'use_totp', 'totp_secret', 'totp_authenticated_at', diff --git a/database/migrations/2024_06_04_212155_add_timezone_column.php b/database/migrations/2024_06_04_212155_add_timezone_column.php new file mode 100644 index 000000000..f5a2bb137 --- /dev/null +++ b/database/migrations/2024_06_04_212155_add_timezone_column.php @@ -0,0 +1,28 @@ +string('timezone')->default('UTC')->after('language'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('timezone'); + }); + } +};