Skip to content

Commit

Permalink
Improve admin page for idea
Browse files Browse the repository at this point in the history
  • Loading branch information
tabuna committed Oct 10, 2024
1 parent e4bed0a commit 4c1eb49
Showing 1 changed file with 85 additions and 73 deletions.
158 changes: 85 additions & 73 deletions app/Orchid/Screens/Idea/ListScreen.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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(),
],
Expand All @@ -56,7 +66,7 @@ public function name(): ?string
*/
public function description(): ?string
{
return '';
return 'Вы можете просмотреть детали каждого запроса и статус выдачи ключа.';
}

/**
Expand All @@ -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('<x-icon path="bs.check" height="1.5em" width="1.5em" />');
}

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(),
];
}

Expand Down Expand Up @@ -181,6 +193,6 @@ public function addKeys(Request $request): void
DB::table('idea_keys')->insertOrIgnore($keysForInsertion);

// Display a success message.
Toast::info('Ключи успешно добавлены.');
Toast::info('Ключи успешно добавлены! Теперь они доступны для использования.');
}
}

0 comments on commit 4c1eb49

Please sign in to comment.