From d7d63c8fd21460122c965053542644a440f19e15 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Tue, 10 Jan 2023 17:25:53 +0800 Subject: [PATCH] fix change user class + medal display --- app/Console/Commands/Test.php | 4 +- .../Resources/System/MedalResource.php | 10 +- .../System/MedalResource/Pages/EditMedal.php | 5 + .../System/UsernameChangeLogResource.php | 2 +- .../Resources/User/InviteResource.php | 25 ++++- .../Resources/User/UserMetaResource.php | 105 ++++++++++++++++++ .../UserMetaResource/Pages/CreateUserMeta.php | 12 ++ .../UserMetaResource/Pages/EditUserMeta.php | 19 ++++ .../UserMetaResource/Pages/ListUserMetas.php | 29 +++++ .../User/UserResource/Pages/UserProfile.php | 4 +- app/Models/Medal.php | 2 +- app/Models/UserMeta.php | 5 + app/Repositories/UserRepository.php | 3 +- ..._display_on_medal_page_to_medals_table.php | 32 ++++++ include/constants.php | 2 +- public/medal.php | 2 +- resources/lang/en/admin.php | 1 + resources/lang/zh_CN/admin.php | 1 + resources/lang/zh_CN/label.php | 1 + resources/lang/zh_TW/admin.php | 1 + 20 files changed, 249 insertions(+), 16 deletions(-) create mode 100644 app/Filament/Resources/User/UserMetaResource.php create mode 100644 app/Filament/Resources/User/UserMetaResource/Pages/CreateUserMeta.php create mode 100644 app/Filament/Resources/User/UserMetaResource/Pages/EditUserMeta.php create mode 100644 app/Filament/Resources/User/UserMetaResource/Pages/ListUserMetas.php create mode 100644 database/migrations/2023_01_10_072601_add_display_on_medal_page_to_medals_table.php diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php index 33eb8298..0047c20b 100644 --- a/app/Console/Commands/Test.php +++ b/app/Console/Commands/Test.php @@ -95,8 +95,8 @@ class Test extends Command */ public function handle() { - $r = getLogFile(); - dd($r); + $work = new WorkRepository(); + $work->settleRole(6, 1, true); } } diff --git a/app/Filament/Resources/System/MedalResource.php b/app/Filament/Resources/System/MedalResource.php index fe83e588..f960227a 100644 --- a/app/Filament/Resources/System/MedalResource.php +++ b/app/Filament/Resources/System/MedalResource.php @@ -44,15 +44,18 @@ class MedalResource extends Resource Forms\Components\Radio::make('get_type') ->options(Medal::listGetTypes(true)) ->inline() - ->columnSpan(['sm' => 2]) ->label(__('label.medal.get_type')) ->required(), + Forms\Components\Toggle::make('display_on_medal_page') + ->label(__('label.medal.display_on_medal_page')) + ->required(), Forms\Components\TextInput::make('duration') ->integer() - ->columnSpan(['sm' => 2]) ->label(__('label.medal.duration')) ->helperText(__('label.medal.duration_help')), - Forms\Components\Textarea::make('description')->columnSpan(['sm' => 2])->label(__('label.description')), + Forms\Components\Textarea::make('description') + ->label(__('label.description')) + , ]); } @@ -67,6 +70,7 @@ class MedalResource extends Resource Tables\Columns\TextColumn::make('getTypeText')->label('Get type')->label(__('label.medal.get_type')), Tables\Columns\TextColumn::make('price')->label(__('label.price')), Tables\Columns\TextColumn::make('duration')->label(__('label.medal.duration')), + Tables\Columns\IconColumn::make('display_on_medal_page')->label(__('label.medal.display_on_medal_page'))->boolean(), ]) ->defaultSort('id', 'desc') ->filters([ diff --git a/app/Filament/Resources/System/MedalResource/Pages/EditMedal.php b/app/Filament/Resources/System/MedalResource/Pages/EditMedal.php index a32e9b3f..b5987ea5 100644 --- a/app/Filament/Resources/System/MedalResource/Pages/EditMedal.php +++ b/app/Filament/Resources/System/MedalResource/Pages/EditMedal.php @@ -16,4 +16,9 @@ class EditMedal extends EditRecord Actions\DeleteAction::make(), ]; } + + protected function getRedirectUrl(): ?string + { + return $this->getResource()::getUrl('index'); + } } diff --git a/app/Filament/Resources/System/UsernameChangeLogResource.php b/app/Filament/Resources/System/UsernameChangeLogResource.php index b31a4b35..d2509e12 100644 --- a/app/Filament/Resources/System/UsernameChangeLogResource.php +++ b/app/Filament/Resources/System/UsernameChangeLogResource.php @@ -22,7 +22,7 @@ class UsernameChangeLogResource extends Resource protected static ?string $navigationGroup = 'User'; - protected static ?int $navigationSort = 8; + protected static ?int $navigationSort = 100; protected static function getNavigationLabel(): string { diff --git a/app/Filament/Resources/User/InviteResource.php b/app/Filament/Resources/User/InviteResource.php index e45f28e1..23e7589c 100644 --- a/app/Filament/Resources/User/InviteResource.php +++ b/app/Filament/Resources/User/InviteResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources\User; +use App\Filament\OptionsTrait; use App\Filament\Resources\User\InviteResource\Pages; use App\Filament\Resources\User\InviteResource\RelationManagers; use App\Models\Invite; @@ -15,6 +16,8 @@ use Illuminate\Database\Eloquent\SoftDeletingScope; class InviteResource extends Resource { + use OptionsTrait; + protected static ?string $model = Invite::class; protected static ?string $navigationIcon = 'heroicon-o-user-add'; @@ -52,6 +55,7 @@ class InviteResource extends Resource , Tables\Columns\TextColumn::make('invitee') ->label(__('invite.fields.invitee')) + ->searchable() , Tables\Columns\TextColumn::make('hash') , @@ -64,15 +68,15 @@ class InviteResource extends Resource , Tables\Columns\TextColumn::make('invitee_register_uid') ->label(__('invite.fields.invitee_register_uid')) + ->searchable() , Tables\Columns\TextColumn::make('invitee_register_email') ->label(__('invite.fields.invitee_register_email')) - , - Tables\Columns\TextColumn::make('invitee_register_email') - ->label(__('invite.fields.invitee_register_email')) + ->searchable() , Tables\Columns\TextColumn::make('invitee_register_username') ->label(__('invite.fields.invitee_register_username')) + ->searchable() , Tables\Columns\TextColumn::make('expired_at') ->label(__('invite.fields.expired_at')) @@ -84,7 +88,20 @@ class InviteResource extends Resource , ]) ->filters([ - // + Tables\Filters\Filter::make('inviter') + ->form([ + Forms\Components\TextInput::make('inviter') + ->label(__('invite.fields.inviter')) + ->placeholder('UID') + , + ])->query(function (Builder $query, array $data) { + return $query->when($data['inviter'], fn (Builder $query, $value) => $query->where("inviter", $value)); + }) + , + Tables\Filters\SelectFilter::make('valid') + ->options(self::getYesNoOptions()) + ->label(__('invite.fields.valid')) + , ]) ->actions([ // Tables\Actions\EditAction::make(), diff --git a/app/Filament/Resources/User/UserMetaResource.php b/app/Filament/Resources/User/UserMetaResource.php new file mode 100644 index 00000000..ce67dbe5 --- /dev/null +++ b/app/Filament/Resources/User/UserMetaResource.php @@ -0,0 +1,105 @@ +schema([ + // + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('id'), + Tables\Columns\TextColumn::make('uid') + ->searchable() + ->label(__('label.username')) + ->formatStateUsing(fn ($state) => username_for_admin($state)) + , + Tables\Columns\TextColumn::make('meta_key_text') + ->label(__('label.name')) + , + Tables\Columns\TextColumn::make('deadline') + ->label(__('label.deadline')) + , + Tables\Columns\TextColumn::make('created_at') + ->label(__('label.created_at')) + ->formatStateUsing(fn ($state) => format_datetime($state)) + , + ]) + ->filters([ + Tables\Filters\Filter::make('uid') + ->form([ + Forms\Components\TextInput::make('uid') + ->label(__('label.username')) + ->placeholder('UID') + , + ])->query(function (Builder $query, array $data) { + return $query->when($data['uid'], fn (Builder $query, $value) => $query->where("uid", $value)); + }) + , + Tables\Filters\SelectFilter::make('meta_key') + ->options(UserMeta::listProps()) + ->label(__('label.name')) + , + ]) + ->actions([ +// Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ +// Tables\Actions\DeleteBulkAction::make(), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListUserMetas::route('/'), + 'create' => Pages\CreateUserMeta::route('/create'), + 'edit' => Pages\EditUserMeta::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/User/UserMetaResource/Pages/CreateUserMeta.php b/app/Filament/Resources/User/UserMetaResource/Pages/CreateUserMeta.php new file mode 100644 index 00000000..29c5e4a0 --- /dev/null +++ b/app/Filament/Resources/User/UserMetaResource/Pages/CreateUserMeta.php @@ -0,0 +1,12 @@ +whereIn('meta_key', array_keys(UserMeta::$metaKeys)); + } + + +} diff --git a/app/Filament/Resources/User/UserResource/Pages/UserProfile.php b/app/Filament/Resources/User/UserResource/Pages/UserProfile.php index 535224b3..e3b57e8d 100644 --- a/app/Filament/Resources/User/UserResource/Pages/UserProfile.php +++ b/app/Filament/Resources/User/UserResource/Pages/UserProfile.php @@ -160,7 +160,7 @@ class UserProfile extends ViewRecord ->hidden(fn (\Closure $get) => $get('field') != 'tmp_invites') , - Forms\Components\Textarea::make('reason') + Forms\Components\TextInput::make('reason') ->label(__('admin.resources.user.actions.change_bonus_etc_reason_label')) , ]) @@ -365,7 +365,7 @@ class UserProfile extends ViewRecord ->label(__('admin.resources.user.actions.change_class_btn')) ->form([ Forms\Components\Select::make('class') - ->options(User::listClass()) + ->options(User::listClass(User::CLASS_PEASANT, Auth::user()->class - 1)) ->default($this->record->class) ->label(__('user.labels.class')) ->required() diff --git a/app/Models/Medal.php b/app/Models/Medal.php index 0d58209a..047085ce 100644 --- a/app/Models/Medal.php +++ b/app/Models/Medal.php @@ -15,7 +15,7 @@ class Medal extends NexusModel self::GET_TYPE_GRANT => ['text' => 'Grant'], ]; - protected $fillable = ['name', 'description', 'image_large', 'image_small', 'price', 'duration', 'get_type']; + protected $fillable = ['name', 'description', 'image_large', 'image_small', 'price', 'duration', 'get_type', 'display_on_medal_page']; public $timestamps = true; diff --git a/app/Models/UserMeta.php b/app/Models/UserMeta.php index 975a71f0..f570cc35 100644 --- a/app/Models/UserMeta.php +++ b/app/Models/UserMeta.php @@ -43,4 +43,9 @@ class UserMeta extends NexusModel return $this->status == self::STATUS_NORMAL && ($this->getRawOriginal('deadline') === null || ($this->deadline && $this->deadline->gte(now()))); } + public function user() + { + return $this->belongsTo(User::class, 'uid'); + } + } diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 989c6ec2..723464c5 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -471,7 +471,8 @@ class UserRepository extends BaseRepository user_can('user-change-class', true); $operator = $this->getUser($operator); $targetUser = $this->getUser($targetUser); - if ($operator && $operator->class <= $targetUser->class) { + if ($operator) { + if ($operator->class <= $targetUser->class || $operator->class <= $newClass) throw new InsufficientPermissionException(); } if ($targetUser->class == $newClass) { diff --git a/database/migrations/2023_01_10_072601_add_display_on_medal_page_to_medals_table.php b/database/migrations/2023_01_10_072601_add_display_on_medal_page_to_medals_table.php new file mode 100644 index 00000000..27c93f99 --- /dev/null +++ b/database/migrations/2023_01_10_072601_add_display_on_medal_page_to_medals_table.php @@ -0,0 +1,32 @@ +integer('display_on_medal_page')->default(1)->after('price'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('medals', function (Blueprint $table) { + $table->dropColumn('display_on_medal_page'); + }); + } +}; diff --git a/include/constants.php b/include/constants.php index 72dbc518..542f1ede 100644 --- a/include/constants.php +++ b/include/constants.php @@ -1,6 +1,6 @@ where('display_on_medal_page', 1); $q = htmlspecialchars($_REQUEST['q'] ?? ''); if (!empty($q)) { $query->where('username', 'name', "%{$q}%"); diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index ecc9d234..a0de25d9 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -33,6 +33,7 @@ return [ 'second_icon' => 'Second icons', 'torrent_operation_log' => 'Torrent operation logs', 'invite' => 'Invites', + 'user_props' => 'User props', ], 'resources' => [ 'agent_allow' => [ diff --git a/resources/lang/zh_CN/admin.php b/resources/lang/zh_CN/admin.php index 0e33fd96..ae96c946 100644 --- a/resources/lang/zh_CN/admin.php +++ b/resources/lang/zh_CN/admin.php @@ -31,6 +31,7 @@ return [ 'second_icon' => '第二图标', 'torrent_operation_log' => '种子操作记录', 'invite' => '用户邀请', + 'user_props' => '用户道具', ], 'resources' => [ 'agent_allow' => [ diff --git a/resources/lang/zh_CN/label.php b/resources/lang/zh_CN/label.php index ea118162..f914db22 100644 --- a/resources/lang/zh_CN/label.php +++ b/resources/lang/zh_CN/label.php @@ -111,6 +111,7 @@ return [ 'get_type' => '获取方式', 'duration' => '有效时长', 'duration_help' => '单位:天。如果留空,用户永久拥有', + 'display_on_medal_page' => '展示在勋章页面', ], 'user_medal' => [ 'label' => '用户勋章', diff --git a/resources/lang/zh_TW/admin.php b/resources/lang/zh_TW/admin.php index 8c8e60b6..8e943e88 100644 --- a/resources/lang/zh_TW/admin.php +++ b/resources/lang/zh_TW/admin.php @@ -33,6 +33,7 @@ return [ 'second_icon' => '第二圖標', 'torrent_operation_log' => '種子操作記錄', 'invite' => '用戶邀請', + 'user_props' => '用戶道具', ], 'resources' => [ 'agent_allow' => [