Skip to content

Commit 609db07

Browse files
authored
Vylepšení vlastních polí (#739)
* odstraneni prijezdu a odjezdu * úprava modelu - customdate, customdatetime * migrate * multiselect * vlastni pole typu multiselect, date, datetime * oprava coding standard * nastaveni roli pro vlastni pole * zobrazeni poli podle roli * oprava CS * prepinani zobrazovani poli * prepinani viditelnosti a povinnosti poli * filtrovani podle select a multiselect * coding standard fix * coding standard fix * build fix
1 parent a5ba383 commit 609db07

38 files changed

+959
-342
lines changed

app/AdminModule/Components/UsersGridControl.php

+52-17
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010
use App\Model\Enums\PaymentType;
1111
use App\Model\Enums\SkautIsEventType;
1212
use App\Model\Settings\CustomInput\CustomCheckbox;
13+
use App\Model\Settings\CustomInput\CustomDate;
14+
use App\Model\Settings\CustomInput\CustomDateTime;
1315
use App\Model\Settings\CustomInput\CustomInputRepository;
16+
use App\Model\Settings\CustomInput\CustomMultiSelect;
1417
use App\Model\Settings\CustomInput\CustomSelect;
1518
use App\Model\Settings\CustomInput\CustomText;
1619
use App\Model\Settings\Settings;
1720
use App\Model\Settings\SettingsException;
1821
use App\Model\User\CustomInputValue\CustomCheckboxValue;
1922
use App\Model\User\CustomInputValue\CustomFileValue;
20-
use App\Model\User\CustomInputValue\CustomSelectValue;
2123
use App\Model\User\CustomInputValue\CustomTextValue;
2224
use App\Model\User\User;
2325
use App\Model\User\UserRepository;
@@ -48,7 +50,6 @@
4850
use Ublaboo\DataGrid\DataGrid;
4951
use Ublaboo\DataGrid\Exception\DataGridColumnStatusException;
5052
use Ublaboo\DataGrid\Exception\DataGridException;
51-
use function array_merge;
5253
use function array_slice;
5354
use function array_values;
5455
use function explode;
@@ -351,8 +352,6 @@ public function createComponentUsersGrid(string $name) : void
351352
return $customInputValue->getValue()
352353
? $this->translator->translate('admin.common.yes')
353354
: $this->translator->translate('admin.common.no');
354-
case $customInputValue instanceof CustomSelectValue:
355-
return $customInputValue->getValueOption();
356355
case $customInputValue instanceof CustomFileValue:
357356
return $customInputValue->getValue()
358357
? Html::el('a')
@@ -365,6 +364,8 @@ public function createComponentUsersGrid(string $name) : void
365364
Html::el('span')->setAttribute('class', 'fa fa-download')
366365
)
367366
: '';
367+
default:
368+
return $customInputValue->getValueText();
368369
}
369370
}
370371

@@ -405,22 +406,56 @@ public function createComponentUsersGrid(string $name) : void
405406
break;
406407

407408
case $customInput instanceof CustomSelect:
408-
$columnCustomInput->setFilterSelect(array_merge(['' => 'admin.common.all'], $customInput->getSelectOptions()))
409-
->setCondition(static function (QueryBuilder $qb, string $value) use ($customInput) : void {
410-
if ($value === '') {
411-
return;
412-
} else {
413-
$qb->leftJoin('u.customInputValues', 'uCIV3')
414-
->leftJoin('uCIV3.input', 'uCIVI3')
415-
->leftJoin('App\Model\User\CustomInputValue\CustomSelectValue', 'uCSV', 'WITH', 'uCIV3.id = uCSV.id')
416-
->andWhere('uCIVI3.id = :iid3 OR uCIVI3.id IS NULL')
417-
->andWhere('uCSV.value = :ivalue3')
418-
->setParameter('iid3', $customInput->getId())
419-
->setParameter('ivalue3', $value);
420-
}
409+
$columnCustomInput->setFilterMultiSelect($customInput->getFilterOptions())
410+
->setCondition(static function (QueryBuilder $qb, ArrayHash $values) use ($customInput) : void {
411+
$qb->leftJoin('u.customInputValues', 'uCIV3')
412+
->leftJoin('uCIV3.input', 'uCIVI3')
413+
->leftJoin('App\Model\User\CustomInputValue\CustomSelectValue', 'uCSV', 'WITH', 'uCIV3.id = uCSV.id')
414+
->andWhere('uCIVI3.id = :iid3 OR uCIVI3.id IS NULL')
415+
->andWhere('uCSV.value in (:ivalues3)')
416+
->setParameter('iid3', $customInput->getId())
417+
->setParameter('ivalues3', (array) $values);
421418
})
422419
->setTranslateOptions();
423420
break;
421+
422+
case $customInput instanceof CustomMultiSelect:
423+
$columnCustomInput->setFilterMultiSelect($customInput->getSelectOptions())
424+
->setCondition(static function (QueryBuilder $qb, ArrayHash $values) use ($customInput) : void {
425+
$qb->leftJoin('u.customInputValues', 'uCIV4')
426+
->leftJoin('uCIV4.input', 'uCIVI4')
427+
->leftJoin('App\Model\User\CustomInputValue\CustomMultiSelectValue', 'uCMSV', 'WITH', 'uCIV4.id = uCMSV.id')
428+
->andWhere('uCIVI4.id = :iid4 OR uCIVI4.id IS NULL')
429+
->andWhere('uCMSV.value in (:ivalues4)')
430+
->setParameter('iid4', $customInput->getId())
431+
->setParameter('ivalues4', (array) $values);
432+
})
433+
->setTranslateOptions();
434+
break;
435+
436+
case $customInput instanceof CustomDate:
437+
$columnCustomInput->setSortable()
438+
->setSortableCallback(static function (QueryBuilder $qb, array $sort) use ($customInput, $columnCustomInputName) : void {
439+
$qb->leftJoin('u.customInputValues', 'uCIV5')
440+
->leftJoin('uCIV5.input', 'uCIVI5')
441+
->leftJoin('App\Model\User\CustomInputValue\CustomDateValue', 'uCDV', 'WITH', 'uCIV5.id = uCDV.id')
442+
->andWhere('uCIVI5.id = :iid5 OR uCIVI5.id IS NULL')
443+
->setParameter('iid5', $customInput->getId())
444+
->orderBy('uCDV.value', $sort[$columnCustomInputName]);
445+
});
446+
break;
447+
448+
case $customInput instanceof CustomDateTime:
449+
$columnCustomInput->setSortable()
450+
->setSortableCallback(static function (QueryBuilder $qb, array $sort) use ($customInput, $columnCustomInputName) : void {
451+
$qb->leftJoin('u.customInputValues', 'uCIV6')
452+
->leftJoin('uCIV6.input', 'uCIVI6')
453+
->leftJoin('App\Model\User\CustomInputValue\CustomDateTimeValue', 'uCDTV', 'WITH', 'uCIV6.id = uCDTV.id')
454+
->andWhere('uCIVI6.id = :iid6 OR uCIVI6.id IS NULL')
455+
->setParameter('iid6', $customInput->getId())
456+
->orderBy('uCDTV.value', $sort[$columnCustomInputName]);
457+
});
458+
break;
424459
}
425460
}
426461

app/AdminModule/ConfigurationModule/Components/CustomInputsGridControl.php

+20-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44

55
namespace App\AdminModule\ConfigurationModule\Components;
66

7+
use App\Model\Acl\Role;
78
use App\Model\Settings\CustomInput\CustomInput;
89
use App\Model\Settings\CustomInput\CustomInputRepository;
10+
use App\Model\Settings\CustomInput\CustomMultiSelect;
911
use App\Model\Settings\CustomInput\CustomSelect;
12+
use App\Services\AclService;
1013
use Doctrine\ORM\NonUniqueResultException;
1114
use Doctrine\ORM\ORMException;
1215
use Nette\Application\AbortException;
@@ -15,6 +18,7 @@
1518
use Ublaboo\DataGrid\DataGrid;
1619
use Ublaboo\DataGrid\Exception\DataGridColumnStatusException;
1720
use Ublaboo\DataGrid\Exception\DataGridException;
21+
use function count;
1822

1923
/**
2024
* Komponenta pro správu vlastních polí přihlášky.
@@ -27,10 +31,16 @@ class CustomInputsGridControl extends Control
2731

2832
private CustomInputRepository $customInputRepository;
2933

30-
public function __construct(ITranslator $translator, CustomInputRepository $customInputRepository)
31-
{
34+
private AclService $aclService;
35+
36+
public function __construct(
37+
ITranslator $translator,
38+
CustomInputRepository $customInputRepository,
39+
AclService $aclService
40+
) {
3241
$this->translator = $translator;
3342
$this->customInputRepository = $customInputRepository;
43+
$this->aclService = $aclService;
3444
}
3545

3646
/**
@@ -59,6 +69,13 @@ public function createComponentCustomInputsGrid(string $name) : void
5969

6070
$grid->addColumnText('name', 'admin.configuration.custom_inputs_name');
6171

72+
$grid->addColumnText('roles', 'admin.configuration.custom_inputs_roles', 'rolesText')
73+
->setRendererOnCondition(function () {
74+
return $this->translator->translate('admin.configuration.custom_inputs_roles_all');
75+
}, function (CustomInput $input) {
76+
return count($this->aclService->getRolesWithoutRolesOptions([Role::GUEST, Role::UNAPPROVED, Role::NONREGISTERED])) === $input->getRoles()->count();
77+
});
78+
6279
$grid->addColumnText('type', 'admin.configuration.custom_inputs_type')
6380
->setRenderer(function (CustomInput $input) {
6481
return $this->translator->translate('admin.common.custom_' . $input->getType());
@@ -76,7 +93,7 @@ public function createComponentCustomInputsGrid(string $name) : void
7693

7794
$grid->addColumnText('options', 'admin.configuration.custom_inputs_options')
7895
->setRenderer(static function (CustomInput $input) {
79-
return $input instanceof CustomSelect ? $input->getOptions() : null;
96+
return $input instanceof CustomSelect || $input instanceof CustomMultiSelect ? $input->getOptionsText() : null;
8097
});
8198

8299
$grid->addToolbarButton('Application:add')

app/AdminModule/ConfigurationModule/Forms/CustomInputFormFactory.php

+57-13
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,27 @@
55
namespace App\AdminModule\ConfigurationModule\Forms;
66

77
use App\AdminModule\Forms\BaseFormFactory;
8+
use App\Model\Acl\Role;
9+
use App\Model\Acl\RoleRepository;
810
use App\Model\Settings\CustomInput\CustomCheckbox;
11+
use App\Model\Settings\CustomInput\CustomDate;
12+
use App\Model\Settings\CustomInput\CustomDateTime;
913
use App\Model\Settings\CustomInput\CustomFile;
1014
use App\Model\Settings\CustomInput\CustomInput;
1115
use App\Model\Settings\CustomInput\CustomInputRepository;
16+
use App\Model\Settings\CustomInput\CustomMultiSelect;
1217
use App\Model\Settings\CustomInput\CustomSelect;
1318
use App\Model\Settings\CustomInput\CustomText;
19+
use App\Services\AclService;
20+
use App\Utils\Helpers;
1421
use Doctrine\ORM\NonUniqueResultException;
1522
use Doctrine\ORM\ORMException;
1623
use Nette;
1724
use Nette\Application\UI\Form;
1825
use stdClass;
26+
use function array_keys;
27+
use function array_map;
1928
use function explode;
20-
use function implode;
2129
use function trim;
2230

2331
/**
@@ -38,10 +46,20 @@ class CustomInputFormFactory
3846

3947
private CustomInputRepository $customInputRepository;
4048

41-
public function __construct(BaseFormFactory $baseFormFactory, CustomInputRepository $customInputRepository)
42-
{
49+
private AclService $aclService;
50+
51+
private RoleRepository $roleRepository;
52+
53+
public function __construct(
54+
BaseFormFactory $baseFormFactory,
55+
CustomInputRepository $customInputRepository,
56+
AclService $aclService,
57+
RoleRepository $roleRepository
58+
) {
4359
$this->baseFormFactory = $baseFormFactory;
4460
$this->customInputRepository = $customInputRepository;
61+
$this->aclService = $aclService;
62+
$this->roleRepository = $roleRepository;
4563
}
4664

4765
/**
@@ -58,8 +76,13 @@ public function create(int $id) : Form
5876
$form->addText('name', 'admin.configuration.custom_inputs_name')
5977
->addRule(Form::FILLED, 'admin.configuration.custom_inputs_name_empty');
6078

79+
$rolesOptions = $this->aclService->getRolesWithoutRolesOptions([Role::GUEST, Role::UNAPPROVED, Role::NONREGISTERED]);
80+
$rolesSelect = $form->addMultiSelect('roles', 'admin.configuration.custom_inputs_roles', $rolesOptions)
81+
->addRule(Form::FILLED, 'admin.configuration.custom_inputs_roles_empty');
82+
6183
$typeSelect = $form->addSelect('type', 'admin.configuration.custom_inputs_type', $this->prepareCustomInputTypesOptions());
6284
$typeSelect->addCondition($form::EQUAL, CustomInput::SELECT)->toggle('custom-input-select');
85+
$typeSelect->addCondition($form::EQUAL, CustomInput::MULTISELECT)->toggle('custom-input-select');
6386

6487
$form->addCheckbox('mandatory', 'admin.configuration.custom_inputs_edit_mandatory');
6588

@@ -79,14 +102,17 @@ public function create(int $id) : Form
79102
$form->setDefaults([
80103
'id' => $id,
81104
'name' => $this->customInput->getName(),
105+
'roles' => Helpers::getIds($this->customInput->getRoles()),
82106
'type' => $this->customInput->getType(),
83107
'mandatory' => $this->customInput->isMandatory(),
84108
]);
85109

86-
if ($this->customInput instanceof CustomSelect) {
110+
if ($this->customInput instanceof CustomSelect || $this->customInput instanceof CustomMultiSelect) {
87111
$customInput = $this->customInput;
88-
$optionsText->setDefaultValue($customInput->getOptions());
112+
$optionsText->setDefaultValue($customInput->getOptionsText());
89113
}
114+
} else {
115+
$rolesSelect->setDefaultValue(array_keys($rolesOptions));
90116
}
91117

92118
$form->onSuccess[] = [$this, 'processForm'];
@@ -118,24 +144,42 @@ public function processForm(Form $form, stdClass $values) : void
118144

119145
case CustomInput::SELECT:
120146
$this->customInput = new CustomSelect();
147+
$options = array_map(
148+
static function (string $o) {
149+
return trim($o);
150+
},
151+
explode(',', $values->options)
152+
);
153+
$this->customInput->setOptions($options);
154+
break;
121155

122-
$options = explode(',', $values->options);
123-
$optionsTrimmed = [];
124-
foreach ($options as $option) {
125-
$optionsTrimmed[] = trim($option);
126-
}
127-
128-
$this->customInput->setOptions(implode(', ', $optionsTrimmed));
129-
156+
case CustomInput::MULTISELECT:
157+
$this->customInput = new CustomMultiSelect();
158+
$options = array_map(
159+
static function (string $o) {
160+
return trim($o);
161+
},
162+
explode(',', $values->options)
163+
);
164+
$this->customInput->setOptions($options);
130165
break;
131166

132167
case CustomInput::FILE:
133168
$this->customInput = new CustomFile();
134169
break;
170+
171+
case CustomInput::DATE:
172+
$this->customInput = new CustomDate();
173+
break;
174+
175+
case CustomInput::DATETIME:
176+
$this->customInput = new CustomDateTime();
177+
break;
135178
}
136179
}
137180

138181
$this->customInput->setName($values->name);
182+
$this->customInput->setRoles($this->roleRepository->findRolesByIds($values->roles));
139183
$this->customInput->setMandatory($values->mandatory);
140184

141185
$this->customInputRepository->save($this->customInput);

app/AdminModule/Forms/AddRoleFormFactory.php

-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ public function processForm(Form $form, stdClass $values) : void
113113
$role->setRegisterable($parent->isRegisterable());
114114
$role->setRegisterableFrom($parent->getRegisterableFrom());
115115
$role->setRegisterableTo($parent->getRegisterableTo());
116-
$role->setDisplayArrivalDeparture($parent->isDisplayArrivalDeparture());
117116
} else {
118117
$nonregistered = $this->roleRepository->findBySystemName(Role::NONREGISTERED);
119118
foreach ($nonregistered->getPages() as $page) {

app/AdminModule/Forms/EditRoleFormFactory.php

-4
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,6 @@ public function create(int $id) : Form
120120

121121
// $form->addCheckbox('syncedWithSkautIs', 'admin.acl.roles_synced_with_skaut_is');
122122

123-
$form->addCheckbox('displayArrivalDeparture', 'admin.acl.roles_display_arrival_departure');
124-
125123
$form->addCheckbox('feeFromSubevents', 'admin.acl.roles_fee_from_subevents_checkbox')
126124
->addCondition(Form::EQUAL, false)
127125
->toggle('fee');
@@ -189,7 +187,6 @@ public function create(int $id) : Form
189187
'capacity' => $this->role->getCapacity(),
190188
'approvedAfterRegistration' => $this->role->isApprovedAfterRegistration(),
191189
// 'syncedWithSkautIs' => $this->role->isSyncedWithSkautIS(),
192-
'displayArrivalDeparture' => $this->role->isDisplayArrivalDeparture(),
193190
'feeFromSubevents' => $this->role->getFee() === null,
194191
'fee' => $this->role->getFee(),
195192
'minimumAge' => $this->role->getMinimumAge(),
@@ -226,7 +223,6 @@ public function processForm(Form $form, stdClass $values) : void
226223
$this->role->setCapacity($capacity);
227224
$this->role->setApprovedAfterRegistration($values->approvedAfterRegistration);
228225
// $this->role->setSyncedWithSkautIS($values->syncedWithSkautIs);
229-
$this->role->setDisplayArrivalDeparture($values->displayArrivalDeparture);
230226
$this->role->setMinimumAge($values->minimumAge);
231227
$this->role->setPermissions($this->permissionRepository->findPermissionsByIds($values->permissions));
232228
$this->role->setPages($this->pageRepository->findPagesBySlugs($values->pages));

0 commit comments

Comments
 (0)