-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConfigurationGridTrait.php
More file actions
127 lines (101 loc) · 3.47 KB
/
Copy pathConfigurationGridTrait.php
File metadata and controls
127 lines (101 loc) · 3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
declare(strict_types=1);
namespace ADT\FancyAdmin\UI\Components\Grids\Configuration;
use ADT\Datagrid\Component\DataGrid;
use ADT\FancyAdmin\Model\Entities\Configuration;
use ADT\FancyAdmin\Model\Entities\Enums\ConfigurationTypeEnum;
use ADT\FancyAdmin\Model\Queries\Factories\ConfigurationQueryFactory;
use ADT\FancyAdmin\UI\Components\Grids\Traits\Editable\Editable;
use Nette\Utils\Html;
use Nette\Utils\Json;
use Nette\Utils\JsonException;
trait ConfigurationGridTrait
{
use Editable;
public function initGrid(DataGrid $grid): void
{
$grid->addColumnText('name', 'fcadmin.presenters.configurations.grid.name');
$grid->addColumnText('value', 'fcadmin.presenters.configurations.grid.value')
->setRenderer(function(Configuration $configuration) {
if ($configuration->getType() === ConfigurationTypeEnum::TYPE_JSON) {
try {
// hodnota může mít v DB navíc koncový středník (legacy serializace)
$rawValue = rtrim(trim((string) $configuration->getValue()), ';');
$decoded = Json::decode($rawValue, Json::FORCE_ARRAY);
// hodnota mohla být v DB uložena dvojitě zakódovaná (string místo objektu)
if (is_string($decoded)) {
$decoded = Json::decode($decoded, Json::FORCE_ARRAY);
}
if (is_array($decoded)) {
return $this->renderConfigurationValueList($decoded);
}
return $configuration->getValue();
} catch (JsonException) {
return $configuration->getValue();
}
} elseif ($configuration->getType() === ConfigurationTypeEnum::TYPE_FILE) {
return $configuration->getFile()->getUrl();
}
if ($this->isSensitiveConfiguration($configuration->getKey())) {
return $this->maskSensitiveValue((string) $configuration->getValue());
}
return $configuration->getValue();
});
}
protected function getQueryObjectFactoryClass(): string
{
return ConfigurationQueryFactory::class;
}
private function isSensitiveConfiguration(string $key): bool
{
foreach (['key', 'secret', 'token', 'password'] as $needle) {
if (str_contains(strtolower($key), $needle)) {
return true;
}
}
return false;
}
private function maskSensitiveValue(string $value): string
{
$length = mb_strlen($value);
// krátké hodnoty schováme celé
if ($length <= 8) {
return str_repeat('•', max($length, 1));
}
$visible = 4;
return mb_substr($value, 0, $visible)
. str_repeat('•', max($length - 2 * $visible, 1))
. mb_substr($value, -$visible);
}
private function renderConfigurationValueList(array $values): Html
{
$container = Html::el();
foreach ($values as $key => $value) {
$container->addHtml(
Html::el('div')
->addHtml(Html::el('strong')->setText($this->translateConfigurationValueKey((string) $key) . ': '))
->addText($this->formatConfigurationValue($value))
);
}
return $container;
}
private function translateConfigurationValueKey(string $key): string
{
$translationKey = 'fcadmin.presenters.configurations.valueKeys.' . $key;
$translated = $this->getTranslator()->translate($translationKey);
return $translated === $translationKey ? $key : $translated;
}
private function formatConfigurationValue(mixed $value): string
{
if (is_bool($value)) {
return $this->getTranslator()->translate($value ? 'fcadmin.appGeneral.model.filters.yes' : 'fcadmin.appGeneral.model.filters.no');
}
if ($value === null) {
return '—';
}
if (is_array($value)) {
return Json::encode($value);
}
return (string) $value;
}
}