admin add claim

This commit is contained in:
xiaomlove
2022-07-02 15:08:23 +08:00
parent 579351c0eb
commit 5191a1ba9a
48 changed files with 992 additions and 293 deletions
+8
View File
@@ -7,4 +7,12 @@ trait OptionsTrait
private static array $matchTypes = ['dec' => 'dec', 'hex' => 'hex'];
private static array $yesOrNo = ['yes' => 'yes', 'no' => 'no'];
private static function getEnableDisableOptions($enableValue = 0, $disableValue = 1): array
{
return [
$enableValue => __('label.enabled'),
$disableValue => __('label.disabled'),
];
}
}
@@ -24,6 +24,8 @@ class AgentAllowResource extends Resource
protected static ?string $navigationGroup = 'System';
protected static ?int $navigationSort = 3;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.agent_allows');
@@ -21,6 +21,8 @@ class AgentDenyResource extends Resource
protected static ?string $navigationGroup = 'System';
protected static ?int $navigationSort = 4;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.agent_denies');
+39 -17
View File
@@ -14,6 +14,7 @@ use Filament\Resources\Table;
use Filament\Tables;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Validation\Rule;
class ExamResource extends Resource
{
@@ -25,9 +26,9 @@ class ExamResource extends Resource
protected static ?string $navigationGroup = 'System';
const IS_DISCOVERED_OPTIONS = ['0' => 'No', '1' => 'Yes'];
protected static ?int $navigationSort = 1;
const STATUS_OPTIONS = ['0' => 'Enabled', '1' => 'Disabled'];
const IS_DISCOVERED_OPTIONS = ['0' => 'No', '1' => 'Yes'];
protected static function getNavigationLabel(): string
{
@@ -44,46 +45,67 @@ class ExamResource extends Resource
$userRep = new UserRepository();
return $form
->schema([
Forms\Components\Section::make('Base info')->schema([
Forms\Components\Section::make(__('label.exam.section_base_info'))->schema([
Forms\Components\TextInput::make('name')->required()->columnSpan(['sm' => 2])->label(__('label.name')),
Forms\Components\TextInput::make('priority')
->columnSpan(['sm' => 2])
->label(__("label.priority"))
->helperText('The higher the value, the higher the priority, and when multiple exam match the same user, the one with the highest priority is assigned.'),
Forms\Components\Repeater::make('indexes')->schema([
Forms\Components\Select::make('index')
->options(Exam::listIndex(true))
->label(__('label.exam.index_required_label'))
->rules([Rule::in(array_keys(Exam::$indexes))])
->required(),
Forms\Components\TextInput::make('require_value')
->label(__('label.exam.index_required_value'))
->placeholder(__('label.exam.index_placeholder'))
->integer()
->required(),
Forms\Components\Hidden::make('checked')->default(true),
])
->label(__('label.exam.index_formatted'))
->required(),
Forms\Components\Radio::make('status')
->options(self::STATUS_OPTIONS)
->options(self::getEnableDisableOptions())
->inline()
->required()
->label(__('label.status'))
->columnSpan(['sm' => 2]),
Forms\Components\Radio::make('is_discovered')
->options(self::IS_DISCOVERED_OPTIONS)
->label(__('label.exam.is_discovered'))
->inline()
->required()
->columnSpan(['sm' => 2]),
Forms\Components\TextInput::make('priority')
->columnSpan(['sm' => 2])
->integer()
->label(__("label.priority"))
->helperText(__('label.exam.priority_help')),
])->columns(2),
Forms\Components\Section::make('Time')->schema([
Forms\Components\Section::make(__('label.exam.section_time'))->schema([
Forms\Components\DateTimePicker::make('begin')->label(__('label.begin')),
Forms\Components\DateTimePicker::make('end')->label(__('label.begin')),
Forms\Components\TextInput::make('duration')
->integer()
->columnSpan(['sm' => 2])
->label(__('label.duration'))
->helperText('Unit: days. When assign to user, begin and end are used if they are specified. Otherwise begin time is the time at assignment, and the end time is the time at assignment plus the duration.'),
->helperText(__('label.exam.duration_help')),
])->columns(2),
Forms\Components\Section::make('Select user')->schema([
Forms\Components\Section::make(__('label.exam.section_target_user'))->schema([
Forms\Components\CheckboxList::make('filters.classes')
->options($userRep->listClass())->columnSpan(['sm' => 2])
->columns(4)
->label(__('label.user.class')),
Forms\Components\DateTimePicker::make('filters.register_time_range.0')->label(__("label.exam.register_time_range.begin")),
Forms\Components\DateTimePicker::make('filters.register_time_range.1')->label(__("label.exam.register_time_range.end")),
Forms\Components\Toggle::make('filters.donate_status')->label(__('label.exam.donated')),
Forms\Components\CheckboxList::make('filters.donate_status')
->options(self::$yesOrNo)
->label(__('label.exam.donated')),
])->columns(2),
Forms\Components\Textarea::make('description')->columnSpan(['sm' => 2]),
Forms\Components\Textarea::make('description')->columnSpan(['sm' => 2])->label(__('label.description')),
]);
}
@@ -104,10 +126,10 @@ class ExamResource extends Resource
])
->filters([
Tables\Filters\SelectFilter::make('is_discovered')->options(self::IS_DISCOVERED_OPTIONS)->label(__("label.exam.is_discovered")),
Tables\Filters\SelectFilter::make('status')->options(self::STATUS_OPTIONS)->label(__("label.status")),
Tables\Filters\SelectFilter::make('status')->options(self::getEnableDisableOptions())->label(__("label.status")),
])
->actions([
// Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\DeleteBulkAction::make(),
@@ -125,8 +147,8 @@ class ExamResource extends Resource
{
return [
'index' => Pages\ListExams::route('/'),
// 'create' => Pages\CreateExam::route('/create'),
// 'edit' => Pages\EditExam::route('/{record}/edit'),
'create' => Pages\CreateExam::route('/create'),
'edit' => Pages\EditExam::route('/{record}/edit'),
];
}
}
@@ -3,10 +3,34 @@
namespace App\Filament\Resources\System\ExamResource\Pages;
use App\Filament\Resources\System\ExamResource;
use App\Repositories\ExamRepository;
use Filament\Pages\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateExam extends CreateRecord
{
protected static string $resource = ExamResource::class;
public function create(bool $another = false): void
{
$data = $this->form->getState();
// dd($data);
$examRep = new ExamRepository();
try {
$examRep->store($data);
$this->notify('success', $this->getCreatedNotificationMessage());
if ($another) {
// Ensure that the form record is anonymized so that relationships aren't loaded.
$this->form->model($this->record::class);
$this->record = null;
$this->fillForm();
return;
}
$this->redirect($this->getRedirectUrl());
} catch (\Exception $exception) {
$this->notify('danger', $exception->getMessage());
}
}
}
@@ -3,6 +3,7 @@
namespace App\Filament\Resources\System\ExamResource\Pages;
use App\Filament\Resources\System\ExamResource;
use App\Repositories\ExamRepository;
use Filament\Pages\Actions;
use Filament\Resources\Pages\EditRecord;
@@ -16,4 +17,17 @@ class EditExam extends EditRecord
Actions\DeleteAction::make(),
];
}
public function save(bool $shouldRedirect = true): void
{
$data = $this->form->getState();
$examRep = new ExamRepository();
try {
$examRep->update($data, $this->record->id);
$this->notify('success', $this->getSavedNotificationMessage());
$this->redirect($this->getResource()::getUrl('index'));
} catch (\Exception $exception) {
$this->notify('danger', $exception->getMessage());
}
}
}
@@ -14,7 +14,7 @@ class ListExams extends PageList
protected function getActions(): array
{
return [
// Actions\CreateAction::make(),
Actions\CreateAction::make(),
];
}
}
@@ -21,6 +21,8 @@ class MedalResource extends Resource
protected static ?string $navigationGroup = 'System';
protected static ?int $navigationSort = 2;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.medals_list');
@@ -24,7 +24,7 @@ class SettingResource extends Resource
protected static ?string $navigationGroup = 'System';
protected static bool $shouldRegisterNavigation = true;
protected static ?int $navigationSort = 100;
protected static function getNavigationLabel(): string
{
@@ -21,6 +21,8 @@ class TagResource extends Resource
protected static ?string $navigationGroup = 'Torrent';
protected static ?int $navigationSort = 1;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.tags_list');
@@ -0,0 +1,86 @@
<?php
namespace App\Filament\Resources\User;
use App\Filament\Resources\User\ClaimResource\Pages;
use App\Filament\Resources\User\ClaimResource\RelationManagers;
use App\Models\Claim;
use Filament\Forms;
use Filament\Resources\Form;
use Filament\Resources\Resource;
use Filament\Resources\Table;
use Filament\Tables;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class ClaimResource extends Resource
{
protected static ?string $model = Claim::class;
protected static ?string $navigationIcon = 'heroicon-o-collection';
protected static ?string $navigationGroup = 'User';
protected static ?int $navigationSort = 4;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.claims');
}
public static function getBreadcrumb(): string
{
return self::getNavigationLabel();
}
public static function form(Form $form): Form
{
return $form
->schema([
//
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')->sortable(),
Tables\Columns\TextColumn::make('user.username')->label(__('label.user.label'))->searchable(),
Tables\Columns\TextColumn::make('torrent.name')->limit(50)->label(__('label.torrent.label'))->searchable(),
Tables\Columns\TextColumn::make('torrent.size')->label(__('label.torrent.size'))->formatStateUsing(fn ($record) => mksize($record->size)),
Tables\Columns\TextColumn::make('torrent.added')->label(__('label.torrent.ttl'))->formatStateUsing(fn ($record) => mkprettytime($record->added)),
Tables\Columns\TextColumn::make('created_at')->label(__('label.created_at'))->dateTime(),
Tables\Columns\TextColumn::make('last_settle_at')->label(__('label.claim.last_settle_at'))->dateTime(),
Tables\Columns\TextColumn::make('seedTimeThisMonth')->label(__('label.claim.seed_time_this_month')),
Tables\Columns\TextColumn::make('uploadedThisMonth')->label(__('label.claim.uploaded_this_month')),
Tables\Columns\BooleanColumn::make('isReachedThisMonth')->label(__('label.claim.is_reached_this_month')),
])
->defaultSort('id', 'desc')
->filters([
//
])
->actions([
// Tables\Actions\EditAction::make(),
])
->bulkActions([
// Tables\Actions\DeleteBulkAction::make(),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListClaims::route('/'),
'create' => Pages\CreateClaim::route('/create'),
'edit' => Pages\EditClaim::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\User\ClaimResource\Pages;
use App\Filament\Resources\User\ClaimResource;
use Filament\Pages\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateClaim extends CreateRecord
{
protected static string $resource = ClaimResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\User\ClaimResource\Pages;
use App\Filament\Resources\User\ClaimResource;
use Filament\Pages\Actions;
use Filament\Resources\Pages\EditRecord;
class EditClaim extends EditRecord
{
protected static string $resource = ClaimResource::class;
protected function getActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\User\ClaimResource\Pages;
use App\Filament\PageList;
use App\Filament\Resources\User\ClaimResource;
use Filament\Pages\Actions;
use Filament\Resources\Pages\ListRecords;
class ListClaims extends PageList
{
protected static string $resource = ClaimResource::class;
protected function getActions(): array
{
return [
// Actions\CreateAction::make(),
];
}
}
@@ -25,6 +25,8 @@ class ExamUserResource extends Resource
protected static ?string $navigationGroup = 'User';
protected static ?int $navigationSort = 2;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.exam_users');
@@ -61,7 +63,7 @@ class ExamUserResource extends Resource
Tables\Filters\SelectFilter::make('is_done')->options(['0' => 'No', '1' => 'yes'])->label(__('label.exam.is_done')),
])
->actions([
// Tables\Actions\ViewAction::make(),
Tables\Actions\ViewAction::make(),
])
->prependBulkActions([
Tables\Actions\BulkAction::make('Avoid')->action(function (Collection $records) {
@@ -86,8 +88,9 @@ class ExamUserResource extends Resource
{
return [
'index' => Pages\ListExamUsers::route('/'),
'create' => Pages\CreateExamUser::route('/create'),
'edit' => Pages\EditExamUser::route('/{record}/edit'),
// 'create' => Pages\CreateExamUser::route('/create'),
// 'edit' => Pages\EditExamUser::route('/{record}/edit'),
'view' => Pages\ViewExamUser::route('/{record}'),
];
}
}
@@ -0,0 +1,93 @@
<?php
namespace App\Filament\Resources\User\ExamUserResource\Pages;
use App\Filament\Resources\User\ExamUserResource;
use App\Repositories\ExamRepository;
use Filament\Pages\Actions;
use Filament\Resources\Pages\ViewRecord;
use Filament\Tables\Table;
class ViewExamUser extends ViewRecord
{
protected static string $resource = ExamUserResource::class;
protected static string $view = 'filament.resources.user.exam-user-resource.pages.detail';
private function getDetailCardData(): array
{
// dd($this->record->progressFormatted);
$data = [];
$record = $this->record;
$data[] = [
'label' => 'ID',
'value' => $record->id,
];
$data[] = [
'label' => __('label.status'),
'value' => $record->statusText,
];
$data[] = [
'label' => __('label.username'),
'value' => $record->user->username,
];
$data[] = [
'label' => __('label.exam.label'),
'value' => $record->exam->name,
];
$data[] = [
'label' => __('label.begin'),
'value' => $record->begin,
];
$data[] = [
'label' => __('label.end'),
'value' => $record->end,
];
$data[] = [
'label' => __('label.exam_user.is_done'),
'value' => $record->isDoneText,
];
$data[] = [
'label' => __('label.created_at'),
'value' => $record->created_at,
];
$data[] = [
'label' => __('label.updated_at'),
'value' => $record->updated_at,
];
return $data;
}
protected function getViewData(): array
{
return [
'cardData' => $this->getDetailCardData(),
];
}
protected function getActions(): array
{
return [
Actions\Action::make('Avoid')
->requiresConfirmation()
->action(function () {
$examRep = new ExamRepository();
try {
$examRep->avoidExamUser($this->record->id);
$this->notify('success', 'Success !');
$this->record = $this->resolveRecord($this->record->id);
} catch (\Exception $exception) {
$this->notify('danger', $exception->getMessage());
}
})
->label(__('admin.resources.exam_user.action_avoid')),
Actions\DeleteAction::make(),
];
}
private function getProgress()
{
}
}
@@ -24,6 +24,8 @@ class HitAndRunResource extends Resource
protected static ?string $navigationGroup = 'User';
protected static ?int $navigationSort = 3;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.hit_and_runs');
@@ -34,18 +36,18 @@ class HitAndRunResource extends Resource
return self::getNavigationLabel();
}
public static function form(Form $form): Form
{
return $form
->schema(Forms\Components\Card::make()->schema([
// Forms\Components\Select::make('user')->relationship('user', 'username')->required(),
// Forms\Components\Select::make('torrent_id')->relationship('torrent', 'name')->required(),
Forms\Components\Radio::make('status')->options(HitAndRun::listStatus(true))->inline()->required(),
// Forms\Components\Select::make('snatch_id')->relationship('snatch', 'uploaded'),
Forms\Components\Textarea::make('comment'),
Forms\Components\DateTimePicker::make('created_at')->displayFormat('Y-m-d H:i:s'),
]));
}
// public static function form(Form $form): Form
// {
// return $form
// ->schema(Forms\Components\Card::make()->schema([
//// Forms\Components\Select::make('user')->relationship('user', 'username')->required(),
//// Forms\Components\Select::make('torrent_id')->relationship('torrent', 'name')->required(),
// Forms\Components\Radio::make('status')->options(HitAndRun::listStatus(true))->inline()->required(),
//// Forms\Components\Select::make('snatch_id')->relationship('snatch', 'uploaded'),
// Forms\Components\Textarea::make('comment'),
// Forms\Components\DateTimePicker::make('created_at')->displayFormat('Y-m-d H:i:s'),
// ]));
// }
public static function table(Table $table): Table
{
@@ -74,6 +76,8 @@ class HitAndRunResource extends Resource
$rep->bulkPardon(['id' => $idArr], Auth::user());
})
->deselectRecordsAfterCompletion()
->label(__('admin.resources.hit_and_run.bulk_action_pardon'))
->icon('heroicon-o-x')
]);
}
@@ -4,22 +4,98 @@ namespace App\Filament\Resources\User\HitAndRunResource\Pages;
use App\Filament\Resources\User\HitAndRunResource;
use App\Models\HitAndRun;
use App\Repositories\HitAndRunRepository;
use Filament\Pages\Actions;
use Filament\Resources\Pages\ViewRecord;
use Filament\Forms;
use Illuminate\Support\Facades\Auth;
class ViewHitAndRun extends ViewRecord
{
protected static string $resource = HitAndRunResource::class;
protected function getFormSchema(): array
protected static string $view = 'filament.detail-card';
private function getDetailCardData(): array
{
$data = [];
$record = $this->record;
$data[] = [
'label' => 'ID',
'value' => $record->id,
];
$data[] = [
'label' => __('label.status'),
'value' => $record->statusText,
];
$data[] = [
'label' => __('label.username'),
'value' => $record->user->username,
];
$data[] = [
'label' => __('label.torrent.label'),
'value' => $record->torrent->name,
];
$data[] = [
'label' => __('label.uploaded'),
'value' => $record->snatch->uploadedText,
];
$data[] = [
'label' => __('label.downloaded'),
'value' => $record->snatch->downloadedText,
];
$data[] = [
'label' => __('label.ratio'),
'value' => $record->snatch->shareRatio,
];
$data[] = [
'label' => __('label.seed_time_required'),
'value' => $record->seedTimeRequired,
];
$data[] = [
'label' => __('label.inspect_time_left'),
'value' => $record->inspectTimeLeft,
];
$data[] = [
'label' => __('label.comment'),
'value' => nl2br($record->comment),
];
$data[] = [
'label' => __('label.created_at'),
'value' => $record->created_at,
];
$data[] = [
'label' => __('label.updated_at'),
'value' => $record->updated_at,
];
return $data;
}
protected function getViewData(): array
{
return [
Forms\Components\TextInput::make('id'),
Forms\Components\TextInput::make('uid'),
Forms\Components\Radio::make('status')->options(HitAndRun::listStatus(true))->inline(),
Forms\Components\Textarea::make('comment'),
Forms\Components\DateTimePicker::make('created_at'),
'cardData' => $this->getDetailCardData(),
];
}
protected function getActions(): array
{
return [
Actions\Action::make('Pardon')
->requiresConfirmation()
->action(function () {
$hitAndRunRep = new HitAndRunRepository();
try {
$hitAndRunRep->pardon($this->record->id, Auth::user());
$this->notify('success', 'Success !');
$this->record = $this->resolveRecord($this->record->id);
} catch (\Exception $exception) {
$this->notify('danger', $exception->getMessage());
}
})
->label(__('admin.resources.hit_and_run.action_pardon')),
Actions\DeleteAction::make(),
];
}
@@ -21,9 +21,11 @@ class UserMedalResource extends Resource
protected static ?string $navigationGroup = 'User';
protected static ?int $navigationSort = 5;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.users_medal');
return __('admin.sidebar.users_medals');
}
public static function getBreadcrumb(): string
@@ -26,6 +26,8 @@ class UserResource extends Resource
protected static ?string $navigationGroup = 'User';
protected static ?int $navigationSort = 1;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.users_list');