Skip to content

Commit 19fd079

Browse files
author
Dorazil
committed
Refactor buttons and dashboards, introduce reusable components
Created separate CreateButton and PairButton components for improved code reusability and maintainability. Updated dashboard with new SCSS for stylized tiles and section headers. Enhanced dropdown menus and tooltips for better user interaction consistency.
1 parent 67646d3 commit 19fd079

File tree

26 files changed

+721
-110
lines changed

26 files changed

+721
-110
lines changed

app/AccountancyModule/AccountancyHelpers.php

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use DateTimeInterface;
99
use InvalidArgumentException;
1010
use Model\Common\ShouldNotHappen;
11+
use Model\Event\CampState;
12+
use Model\Event\EventState;
1113
use Model\Payment\Payment\State;
1214
use Money\Money;
1315
use Nette\Utils\Html;
@@ -51,17 +53,11 @@ public static function loader(string $filter): callable
5153
*/
5254
public static function eventStateLabel(string $s): string
5355
{
54-
if ($s === 'draft') {
55-
return '<span class=\'badge bg-warning text-dark\'>Rozpracováno</span>';
56-
}
57-
58-
if ($s === 'closed') {
59-
return '<span class=\'badge bg-success\'>Uzavřeno</span>';
60-
}
61-
62-
return '<span class=\'badge bg-danger\'>Zrušeno</span>';
63-
64-
//draft, closed, cancelled
56+
return match ($s) {
57+
EventState::DRAFT->value => '<span class="badge bg-warning text-dark">Rozpracováno</span>',
58+
EventState::CLOSED->value => '<span class="badge bg-success">Uzavřeno</span>',
59+
default => '<span class="badge bg-danger">Zrušeno</span>',
60+
};
6561
}
6662

6763
/**
@@ -170,22 +166,13 @@ public static function grantStateLabel(string $s): string
170166
*/
171167
public static function campStateLabel(string $s): string
172168
{
173-
switch ($s) {
174-
case 'draft':
175-
return '<span class=\'badge bg-warning text-dark\'>Rozpracováno</span>';
176-
177-
case 'approvedParent':
178-
return '<span class=\'badge bg-info text-dark\'>Schválený střediskem</span>';
179-
180-
case 'approvedLeader':
181-
return '<span class=\'badge bg-info text-dark\'>Schválený vedoucím</span>';
182-
183-
case 'real':
184-
return '<span class=\'badge bg-success\'>Skutečnost odevzdána</span>';
185-
186-
default:
187-
return '<span class=\'badge bg-danger\'>Zrušený</span>';
188-
}
169+
return match ($s) {
170+
CampState::DRAFT->value => '<span class=\'badge bg-warning text-dark\'>Rozpracováno</span>',
171+
CampState::APPROVED_PARENT->value => '<span class=\'badge bg-info text-dark\'>Schválený střediskem</span>',
172+
CampState::APPROVED_LEADER->value => '<span class=\'badge bg-info text-dark\'>Schválený vedoucím</span>',
173+
CampState::REAL->value => '<span class=\'badge bg-success\'>Skutečnost odevzdána</span>',
174+
default => '<span class=\'badge bg-danger\'>Zrušený</span>',
175+
};
189176
}
190177

191178
/** @filter */

app/AccountancyModule/CampModule/Components/MissingAutocomputedCategoryControl.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Model\Auth\Resources\Camp;
1010
use Model\Common\Services\CommandBus;
1111
use Model\Common\Services\QueryBus;
12+
use Model\Event\CampState;
1213
use Model\Event\Commands\Camp\ActivateAutocomputedCashbook;
1314
use Model\Event\ReadModel\Queries\CampQuery;
1415
use Model\Event\SkautisCampId;
@@ -39,7 +40,7 @@ public function render(): void
3940

4041
$this->template->setFile(__DIR__ . '/templates/MissingAutocomputedCategoryControl.latte');
4142
$this->template->setParameters([
42-
'isApproved' => in_array($camp->getState(), [\Model\Event\Camp::STATE_APPROVED_PARENT, \Model\Event\Camp::STATE_REAL]),
43+
'isApproved' => in_array($camp->getState(), [CampState::APPROVED_PARENT, CampState::REAL->value]),
4344
'isEditable' => $this->authorizator->isAllowed(Camp::UPDATE_REAL, $this->campId->toInt()),
4445
'canActivate' => $this->authorizator->isAllowed(Camp::UPDATE_REAL_COST, $this->campId->toInt()),
4546
]);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\AccountancyModule\Components;
6+
7+
use function array_merge;
8+
9+
abstract class BaseButtonControl extends BaseControl
10+
{
11+
/** @var string[] */
12+
protected array $css = [];
13+
14+
/** @param array<string, string> $css */
15+
public function addCss(array $css): void
16+
{
17+
$this->css = array_merge($this->css, $css);
18+
}
19+
20+
public function setCss(string $key, string $value): void
21+
{
22+
$this->css[$key] = $value;
23+
}
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\AccountancyModule\PaymentModule\Components;
6+
7+
use App\AccountancyModule\Components\BaseButtonControl;
8+
9+
class CreateButton extends BaseButtonControl
10+
{
11+
public function render(): void
12+
{
13+
$this->template->setParameters([
14+
'css' => $this->css,
15+
]);
16+
$this->template->setFile(__DIR__ . '/templates/CreateButton.latte');
17+
$this->template->render();
18+
}
19+
}

app/AccountancyModule/PaymentModule/components/PairButton.php

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace App\AccountancyModule\PaymentModule\Components;
66

7-
use App\AccountancyModule\Components\BaseControl;
7+
use App\AccountancyModule\Components\BaseButtonControl;
88
use App\Forms\BaseForm;
99
use Model\BankService;
1010
use Model\BankTimeLimit;
@@ -19,10 +19,9 @@
1919
use function array_filter;
2020
use function array_map;
2121
use function assert;
22-
use function bdump;
2322
use function count;
2423

25-
class PairButton extends BaseControl
24+
class PairButton extends BaseButtonControl
2625
{
2726
public const TIMEOUT_MESSAGE = 'Nepodařilo se připojit k bankovnímu serveru. Zkontrolujte svůj API token pro přístup k účtu.';
2827
public const TIME_LIMIT_MESSAGE = 'Mezi dotazy na bankovnictví musí být prodleva 1 minuta!';
@@ -32,6 +31,18 @@ class PairButton extends BaseControl
3231

3332
public function __construct(private PaymentService $payments, private BankService $model, private BankAccountService $bankAccounts)
3433
{
34+
$style = 'primary';
35+
// default
36+
$this->addCss([
37+
'wrap' => 'd-inline-block',
38+
'btn' => 'btn btn-' . $style,
39+
'toggle' => 'btn btn-' . $style . ' dropdown-toggle',
40+
'menu' => 'dropdown-menu pairForm',
41+
'icon' => 'fas fa-university',
42+
'inputGroup' => 'input-group',
43+
'submit' => 'btn btn-primary',
44+
'submitCol' => 'col-4',
45+
]);
3546
}
3647

3748
public function handlePair(): void
@@ -54,6 +65,7 @@ public function render(): void
5465
$this->template->setParameters([
5566
'canPair' => $this->canPair(),
5667
'groupsCount' => count($this->groupIds),
68+
'css' => $this->css,
5769
]);
5870
$this->template->setFile(__DIR__ . '/templates/PairButton.latte');
5971
$this->template->render();
@@ -114,24 +126,26 @@ private function pair(int|null $daysBack = null): void
114126
{
115127
try {
116128
$pairingResults = $this->model->pairAllGroups($this->groupIds, $daysBack);
129+
130+
if (empty($pairingResults)) {
131+
$this->presenter->flashMessage('Nebyla nalezena žádná platby k párování', 'warning');
132+
}
133+
117134
foreach ($pairingResults as $p) {
118135
assert($p instanceof PairingResult);
119-
$this->flashMessage($p->getMessage(), $p->getCount() > 0 ? 'success' : 'info');
136+
$this->presenter->flashMessage($p->getMessage(), $p->getCount() > 0 ? 'success' : 'info');
120137
}
121138
} catch (BankTimeout) {
122-
$this->flashMessage(self::TIMEOUT_MESSAGE, 'danger');
123-
bdump(self::TIMEOUT_MESSAGE);
139+
$this->presenter->flashMessage(self::TIMEOUT_MESSAGE, 'danger');
124140
} catch (BankTimeLimit) {
125-
$this->flashMessage(self::TIME_LIMIT_MESSAGE, 'danger');
126-
bdump(self::TIME_LIMIT_MESSAGE);
141+
$this->presenter->flashMessage(self::TIME_LIMIT_MESSAGE, 'danger');
127142
} catch (BankWrongTokenAccount $e) {
128-
$this->flashMessage($this->wrongTokenAccountMessage($e), 'danger');
129-
bdump($this->wrongTokenAccountMessage($e));
143+
$this->presenter->flashMessage($this->wrongTokenAccountMessage($e), 'danger');
130144
} catch (InvalidOAuth $exc) {
131-
$this->flashMessage($exc->getExplainedMessage(), 'danger');
145+
$this->presenter->flashMessage($exc->getExplainedMessage(), 'danger');
132146
}
133147

134-
$this->redirect('this');
148+
$this->presenter->redirect('this');
135149
}
136150

137151
public static function wrongTokenAccountMessage(BankWrongTokenAccount $exception): string
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<div class="dropdown d-inline-block">
2+
<button class="{$css['button']}" type="button" id="createGroup"
3+
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
4+
<i class="fas fa-plus"></i>
5+
Založit skupinu
6+
<span class="d-none d-md-inline">plateb</span> <span class="caret"></span>
7+
</button>
8+
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="createGroup">
9+
<a href="{$control->getParent()->link(':Accountancy:Payment:Group:newGroup')}" class="dropdown-item"><i class="fas fa-list-alt"></i> Obecná</a>
10+
11+
<div class="dropdown-divider"></div>
12+
13+
<a href="{$control->getParent()->link(':Accountancy:Payment:Camp:SelectForGroup:')}" class="dropdown-item">
14+
<i class="fas fa-campground"></i> Tábor
15+
<span class="small d-block">Umožnuje načíst účastnické poplatky.</span>
16+
</a>
17+
18+
<div class="dropdown-divider"></div>
19+
20+
<a href="{$control->getParent()->link(':Accountancy:Payment:Event:SelectForGroup:')}" class="dropdown-item">
21+
<span class="me-1"><i class="fas fa-calendar"></i></span> Akce
22+
<span class="small d-block">Umožnuje načíst účastnické poplatky.</span>
23+
</a>
24+
25+
<div class="dropdown-divider"></div>
26+
27+
<a href="{$control->getParent()->link(':Accountancy:Payment:Registration:CreateGroup:')}" class="dropdown-item">
28+
<i class="fa fa-users"></i> Registrace
29+
<span class="small d-block">Umožnuje načíst osoby z aktuální registrace.</span>
30+
</a>
31+
32+
<div class="dropdown-divider"></div>
33+
34+
<a href="{$control->getParent()->link(':Accountancy:Payment:Education:SelectForGroup:')}" class="dropdown-item">
35+
<i class="fas fa-user-graduate"></i> Vzdělávačka
36+
<span class="small d-block">Umožnuje načíst účastnické poplatky.</span>
37+
</a>
38+
</div>
39+
</div>
Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,48 @@
1-
{var $errorMessage = $groupsCount === 1 ? 'Skupina nemá nastavený účet pro párování s FIO' : 'Žádná ze skupin plateb nemá nastavený účet pro párování s FIO'}
1+
{* ---- Původní validace/tooltipy ---- *}
2+
{var $errorMessage = $groupsCount === 1
3+
? 'Skupina nemá nastavený účet pro párování s FIO'
4+
: 'Žádná ze skupin plateb nemá nastavený účet pro párování s FIO'}
25

3-
{var $style = $style ?? 'primary'}
46
{var $attrs = ! $canPair && $groupsCount === 1
5-
? ['data-bs-toggle' => 'tooltip', 'data-placement' => 'bottom', 'title' => 'Skupina nemá nastavený účet']
6-
: []
7+
? ['data-bs-toggle' => 'tooltip', 'data-placement' => 'bottom', 'title' => 'Skupina nemá nastavený účet']
8+
: []
79
}
8-
<div class="d-inline-block">
9-
<div class="btn-group" n:attr="$attrs" {if !$canPair} title="Nemáš dostatečné oprávnění nebo není nastaven FIO API token u bankovního účtu." data-bs-toggle="tooltip"{/if}>
10-
<a n:href="pair!" n:class="!$canPair ? disabled, btn, 'btn-' . $style">
11-
<i class="fas fa-university"></i> Párovat <span class="d-none d-md-inline">platby</span>
10+
11+
<div n:class="$css['wrap']">
12+
<div class="btn-group"
13+
n:attr="$attrs"
14+
{if !$canPair}
15+
title="Nemáš dostatečné oprávnění nebo není nastaven FIO API token u bankovního účtu."
16+
data-bs-toggle="tooltip"
17+
{/if}>
18+
<a n:href="pair!" n:class="$css['btn'], disabled => !$canPair">
19+
<i class="{$css['icon']}" aria-hidden="true"></i>
20+
Párovat <span class="d-none d-md-inline">platby</span>
1221
</a>
22+
1323
<button n:attr="!$canPair ? ([disabled => true])"
14-
n:class="btn, 'btn-' . $style, dropdown-toggle" type="button" id="pairPayments"
15-
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="true"><span class="caret"></span></button>
24+
n:class="$css['toggle']"
25+
type="button"
26+
id="pairPayments"
27+
data-bs-toggle="dropdown"
28+
aria-haspopup="true"
29+
aria-expanded="false">
30+
<span class="caret"></span>
31+
<span class="visually-hidden">Další možnosti párování</span>
32+
</button>
1633

17-
<div class="dropdown-menu pairForm" aria-labelledby="pairPayments" n:snippet="form">
18-
<form n:name="form" class="row w-100 p-3">
34+
<div n:class="$css['menu']" aria-labelledby="pairPayments" n:snippet="form">
35+
<form n:name="form" class="row w-100 p-3 g-2">
1936
<div class="col-8 text-nowrap">
20-
<span class="input-group">
21-
<input n:name="days" class="form-control">
22-
<span class="input-group-text">dní</span>
23-
</span>
37+
<span n:class="$css['inputGroup']">
38+
<input n:name="days" class="form-control">
39+
<span class="input-group-text">dní</span>
40+
</span>
2441
</div>
25-
<div class="col-4">
26-
<input n:name="pair" class="btn btn-primary">
42+
<div n:class="$css['submitCol']">
43+
<input n:name="pair" n:class="$css['submit']">
2744
</div>
2845
</form>
2946
</div>
3047
</div>
31-
</div>
48+
</div>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\AccountancyModule\PaymentModule\Factories;
6+
7+
use App\AccountancyModule\PaymentModule\Components\CreateButton;
8+
9+
interface ICreateButtonFactory
10+
{
11+
public function create(): CreateButton;
12+
}

app/AccountancyModule/PaymentModule/presenters/GroupListPresenter.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace App\AccountancyModule\PaymentModule;
66

7+
use App\AccountancyModule\PaymentModule\Components\CreateButton;
78
use App\AccountancyModule\PaymentModule\Components\GroupProgress;
9+
use App\AccountancyModule\PaymentModule\Factories\ICreateButtonFactory;
810
use Model\DTO\Payment\Group;
911
use Model\Payment\BankAccountService;
1012
use Model\Payment\ReadModel\Queries\GetGroupList;
@@ -26,6 +28,7 @@ final class GroupListPresenter extends BasePresenter
2628

2729
public function __construct(
2830
private Factories\IPairButtonFactory $pairButtonFactory,
31+
private readonly ICreateButtonFactory $createButtonFactory,
2932
private PaymentService $groups,
3033
private BankAccountService $bankAccounts,
3134
) {
@@ -78,7 +81,18 @@ public function actionDefault(bool $onlyOpen = true): void
7881

7982
protected function createComponentPairButton(): Components\PairButton
8083
{
81-
return $this->pairButtonFactory->create();
84+
$control = $this->pairButtonFactory->create();
85+
$control->setCss('button', 'btn btn-success dropdown-toggle ms-2');
86+
87+
return $control;
88+
}
89+
90+
protected function createComponentCreateButton(): CreateButton
91+
{
92+
$control = $this->createButtonFactory->create();
93+
$control->setCss('button', 'btn btn-success dropdown-toggle ms-2');
94+
95+
return $control;
8296
}
8397

8498
protected function createComponentProgress(): Multiplier

0 commit comments

Comments
 (0)