diff --git a/app/Orchid/Screens/Idea/ListScreen.php b/app/Orchid/Screens/Idea/ListScreen.php index f2ad30c5..7efc1e1c 100644 --- a/app/Orchid/Screens/Idea/ListScreen.php +++ b/app/Orchid/Screens/Idea/ListScreen.php @@ -4,12 +4,14 @@ use App\Models\IdeaKey; use App\Models\IdeaRequest; +use App\Orchid\Layouts\BasicIndicators; +use Carbon\Carbon; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use Orchid\Screen\Actions\Link; use Orchid\Screen\Actions\ModalToggle; +use Orchid\Screen\Components\Cells\Boolean; use Orchid\Screen\Components\Cells\DateTimeSplit; use Orchid\Screen\Fields\Input; use Orchid\Screen\Layouts\Persona; @@ -27,12 +29,20 @@ class ListScreen extends Screen */ public function query(): iterable { + $start = Carbon::now()->subMonth(); + $end = Carbon::now(); + return [ + 'charts' => [ + IdeaRequest::countByDays($start, $end)->toChart('Запросы'), + IdeaKey::where('activated', 1)->countByDays($start, $end, 'updated_at')->toChart('Одобрения'), + ], 'ideaRequests' => IdeaRequest::with(['user', 'key']) ->defaultSort('created_at', 'desc') ->filters() ->paginate(), 'metrics' => [ + 'used_keys_month' => IdeaKey::where('activated', 1)->whereDate('updated_at', '>', $start)->count(), 'unused_keys' => IdeaKey::where('activated', 0)->count(), 'used_keys' => IdeaKey::where('activated', 1)->count(), ], @@ -56,7 +66,7 @@ public function name(): ?string */ public function description(): ?string { - return ''; + return 'Вы можете просмотреть детали каждого запроса и статус выдачи ключа.'; } /** @@ -69,89 +79,91 @@ public function commandBar(): iterable return [ ModalToggle::make('Добавить ключи') ->modal('addKeys') - ->method('addKeys'), + ->method('addKeys') + ->icon('file-earmark-arrow-up') ]; } /** * The screen's layout elements. * - * @throws \ReflectionException - * * @return \Orchid\Screen\Layout[]|string[] */ public function layout(): iterable { return [ - Layout::metrics([ - 'Выдано ключей:' => 'metrics.used_keys', - 'Не использовано ключей:' => 'metrics.unused_keys', - ]), - - Layout::table('ideaRequests', [ - - TD::make('Пользователь') - ->cantHide() - ->width(230) - ->render(fn (IdeaRequest $ideaRequest) => new Persona($ideaRequest->user->presenter())), - - /* - TD::make('first_name','Имя') - ->width(150), - TD::make('last_name','Фамилия') - ->width(150), - - TD::make('city','Город') - ->width(150), - TD::make('email','email') - ->width(150), - */ - - TD::make('message', 'Сообщение') - ->alignLeft() - ->render(fn (IdeaRequest $ideaRequest) => Str::of($ideaRequest->message)->trim()->words(10).Link::make() - ->class('hidden') - ->route('platform.idea.request', $ideaRequest->id) - ->stretched() - ) - ->width(300), - - TD::make('key', 'Статус') - ->align(TD::ALIGN_RIGHT) - ->render(function (IdeaRequest $ideaRequest) { - if ($ideaRequest->key()->exists()) { - return Blade::render(''); - } - - return '—'; - }), - - TD::make('created_at', __('Created')) - ->width(120) - ->usingComponent(DateTimeSplit::class) - ->align(TD::ALIGN_RIGHT) - ->defaultHidden() - ->sort(), - - TD::make('updated_at', 'Последнее обновление') - ->width(120) - ->usingComponent(DateTimeSplit::class) - ->defaultHidden() - ->align(TD::ALIGN_RIGHT) - ->sort(), - ]), - - Layout::modal('addKeys', [ - Layout::rows([ - Input::make('file') - ->type('file') - ->accept('.txt') - ->required() - ->title('Выберите файл с ключами Laravel Idea') - ->help('Пожалуйста, выберите файл формата .txt, содержащий ключи для Laravel Idea. Каждый ключ должен быть на новой строке.'), + Layout::split([ + BasicIndicators::make('charts') + ->description('Отслеживайте динамику запросов и выдачи ключей. Старайтесь не откладывать выдачу на последний день — это отражается на пиках на графике.') + ->title('Статистика за последние 30 дней') + ->height(285), + + Layout::metrics([ + 'Выдано за месяц:' => 'metrics.used_keys_month', + 'Общее количество выданных:' => 'metrics.used_keys', + 'Неактивированные ключи:' => 'metrics.unused_keys', ]), - ])->title('Загрузка ключей Laravel Idea'), + ])->ratio('80/20'), + + Layout::table('ideaRequests', $this->getIdeaRequestsTableColumns()), + + Layout::modal('addKeys', Layout::rows([ + Input::make('file') + ->type('file') + ->accept('.txt') + ->required() + ->title('Выберите файл с ключами для Laravel Idea') + ->help('Пожалуйста, выберите файл формата .txt, содержащий ключи, где каждый ключ на новой строчке.'), + ]))->title('Загрузка ключей'), + ]; + } + + /** + * Get the columns for the idea requests table. + * + * @return TD[] + * @throws \ReflectionException + */ + private function getIdeaRequestsTableColumns(): array + { + return [ + TD::make('Пользователь') + ->cantHide() + ->width(230) + ->render(fn (IdeaRequest $ideaRequest) => new Persona($ideaRequest->user->presenter())), + + TD::make('message', 'Сообщение') + ->alignLeft() + ->render(fn (IdeaRequest $ideaRequest) => Str::of($ideaRequest->message)->trim()->words(10) + .Link::make()->class('hidden') + ->route('platform.idea.request', $ideaRequest->id) + ->stretched()) + ->width(400), + + TD::make('city', 'Город') + ->width(120) + ->align(TD::ALIGN_RIGHT), + + TD::make('key', 'Статус') + ->width(50) + ->align(TD::ALIGN_RIGHT) + ->render(function (IdeaRequest $ideaRequest) { + return \Orchid\Support\Blade::renderComponent(Boolean::class, ['value' => $ideaRequest->key()->exists()]); + }), + + TD::make('created_at', 'Создано') + ->width(120) + ->usingComponent(DateTimeSplit::class) + ->align(TD::ALIGN_RIGHT) + ->sort(), + + TD::make('updated_at', 'Последнее обновление') + ->width(120) + ->usingComponent(DateTimeSplit::class) + ->defaultHidden() + ->align(TD::ALIGN_RIGHT) + ->sort(), ]; } @@ -181,6 +193,6 @@ public function addKeys(Request $request): void DB::table('idea_keys')->insertOrIgnore($keysForInsertion); // Display a success message. - Toast::info('Ключи успешно добавлены.'); + Toast::info('Ключи успешно добавлены! Теперь они доступны для использования.'); } }