Skip to content

Commit 048da4a

Browse files
committed
Adds file upload support to configurations
Enables uploading files as configuration values. Adds a new `file` type to configuration options, allowing administrators to upload files. Stores the file and associates it with the configuration. Updates the configuration form to include a file upload field. Updates the configuration grid to show a link to the file.
1 parent 3073db3 commit 048da4a

8 files changed

Lines changed: 125 additions & 24 deletions

File tree

src/Model/Entities/Configuration.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66

77
use ADT\DoctrineComponents\Entities\Entity;
88
use ADT\FancyAdmin\Model\Entities\Enums\ConfigurationType;
9+
use ADT\FancyAdmin\Model\Entities\Enums\ConfigurationTypeEnum;
910

1011
interface Configuration extends Entity
1112
{
1213
public function getKey(): string;
1314
public function setKey(string $key): static;
14-
public function getType(): string;
15-
public function setType(ConfigurationType $type): static;
16-
public function getValue(): string;
17-
public function setValue(string $value): static;
15+
public function getType(): ConfigurationTypeEnum;
16+
public function setType(ConfigurationTypeEnum $type): static;
17+
public function getValue(): ?string;
18+
public function setValue(?string $value): static;
19+
public function getFile(): File;
20+
public function setFile(File $file): static;
1821
}

src/Model/Entities/ConfigurationTrait.php

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use ADT\FancyAdmin\Model\Entities\Traits\UpdatedBy;
1111
use Doctrine\DBAL\Types\Types;
1212
use Doctrine\ORM\Mapping\Column;
13+
use Doctrine\ORM\Mapping\JoinColumn;
14+
use Doctrine\ORM\Mapping\OneToOne;
1315
use Nette\Utils\Json;
1416

1517
trait ConfigurationTrait
@@ -19,11 +21,18 @@ trait ConfigurationTrait
1921
#[Column(name: '`key`', nullable: false)]
2022
protected string $key;
2123

24+
#[Column(name: 'name', nullable: false)]
25+
protected string $name;
26+
2227
#[Column(name: '`type`', nullable: false, options: ["default" => ConfigurationTypeEnum::TYPE_PLAINTEXT])]
2328
protected ConfigurationTypeEnum $type = ConfigurationTypeEnum::TYPE_PLAINTEXT;
2429

25-
#[Column(name: '`value`', type: Types::TEXT, nullable: false)]
26-
protected string $value;
30+
#[Column(name: '`value`', type: Types::TEXT, nullable: true)]
31+
protected ?string $value = null;
32+
33+
#[OneToOne(targetEntity: 'File', cascade: ['persist'], orphanRemoval: true)]
34+
#[JoinColumn(nullable: true)]
35+
protected File $file;
2736

2837
#[Column(name: '`options`', type: Types::TEXT, nullable: true)]
2938
protected ?string $options = null;
@@ -39,23 +48,34 @@ public function setKey(string $key): static
3948
return $this;
4049
}
4150

42-
public function getType(): string
51+
public function getName(): string
52+
{
53+
return $this->name;
54+
}
55+
56+
public function setName(string $name): static
57+
{
58+
$this->name = $name;
59+
return $this;
60+
}
61+
62+
public function getType(): ConfigurationTypeEnum
4363
{
44-
return $this->type->value;
64+
return $this->type;
4565
}
4666

47-
public function setType(ConfigurationType $type): static
67+
public function setType(ConfigurationTypeEnum $type): static
4868
{
4969
$this->type = $type;
5070
return $this;
5171
}
5272

53-
public function getValue(): string
73+
public function getValue(): ?string
5474
{
5575
return $this->value;
5676
}
5777

58-
public function setValue(string $value): static
78+
public function setValue(?string $value): static
5979
{
6080
$this->value = $value;
6181
return $this;
@@ -80,4 +100,15 @@ public function setOptions(array|string|null $options): static
80100

81101
return $this;
82102
}
103+
104+
public function getFile(): File
105+
{
106+
return $this->file;
107+
}
108+
109+
public function setFile(File $file): static
110+
{
111+
$this->file = $file;
112+
return $this;
113+
}
83114
}

src/Model/Entities/Enums/ConfigurationTypeEnum.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ enum ConfigurationTypeEnum: string implements ConfigurationType
99
case TYPE_JSON = 'json';
1010
case TYPE_PLAINTEXT = 'plaintext';
1111
case TYPE_SELECT = 'select';
12+
case TYPE_FILE = 'file';
1213

1314
public static function list(): array
1415
{

src/Model/Entities/FIleTrait.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace ADT\FancyAdmin\Model\Entities;
4+
5+
use App\Model\Entities\Abstract\BaseEntity;
6+
7+
#[ORM\Entity]
8+
class FileTrait extends BaseEntity implements \ADT\Files\Entities\File
9+
{
10+
use \ADT\Files\Entities\FileTrait;
11+
}

src/Model/Entities/File.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ADT\FancyAdmin\Model\Entities;
6+
7+
use ADT\DoctrineComponents\Entities\Entity;
8+
9+
interface File extends \ADT\Files\Entities\File
10+
{
11+
}

src/UI/Components/Forms/Configuration/ConfigurationFormTrait.php

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
use ADT\FancyAdmin\DI\Injects\EntityManagerInject;
66
use ADT\FancyAdmin\Model\Entities\Configuration;
77
use ADT\FancyAdmin\Model\Entities\Enums\ConfigurationTypeEnum;
8+
use ADT\FancyAdmin\Model\Entities\File;
89
use ADT\Forms\Form;
910
use App\Model\Entities\Account;
11+
use Nette\Http\FileUpload;
1012

1113
/**
1214
* @property Account $entity
@@ -27,13 +29,28 @@ public function initForm(Form $form): void
2729

2830
$form['type']
2931
->addCondition(Form::Equal, ConfigurationTypeEnum::TYPE_SELECT)
30-
->toggle('options-input');
31-
32-
$form->addTextArea('value', 'Value')
33-
->setHtmlAttribute('rows', 5);
34-
35-
$form->addTextArea('options', 'Options')
36-
->setHtmlAttribute('rows', 5);
32+
->toggle('optionsInput')
33+
->endCondition()
34+
->addCondition(Form::Equal, ConfigurationTypeEnum::TYPE_FILE)
35+
->toggle('fileInput')
36+
->elseCondition()
37+
->toggle('valueInput');
38+
39+
$form->addSection(function() use ($form) {
40+
$form->addTextArea('options', 'Options')
41+
->setHtmlAttribute('rows', 5);
42+
}, 'optionsInput');
43+
44+
$form->addSection(function() use ($form) {
45+
$form->addUpload('_file', 'File')
46+
->addConditionOn($form['type'], Form::EQUAL, ConfigurationTypeEnum::TYPE_FILE)
47+
->setRequired();
48+
}, 'fileInput');
49+
50+
$form->addSection(function() use ($form) {
51+
$form->addTextArea('value', 'Value')
52+
->setHtmlAttribute('rows', 5);
53+
}, 'valueInput');
3754

3855
$form->addSubmit("submit", 'Save');
3956
}
@@ -63,6 +80,15 @@ public function processForm(Configuration $entity, array $inputs): void
6380
if ($entity->getType() === ConfigurationTypeEnum::TYPE_JSON->value) {
6481
$value = json_decode($inputs['value']);
6582
$entity->setValue(json_encode($value, JSON_PRETTY_PRINT));
83+
} elseif ($entity->getType() === ConfigurationTypeEnum::TYPE_FILE->value) {
84+
/** @var FileUpload $fileUpload */
85+
$fileUpload = $inputs['_file'];
86+
87+
/** @var File $fileEntity */
88+
$fileEntity = new ($this->em->findEntityClassByInterface(File::class));
89+
$fileEntity->setTemporaryFile($fileUpload->getTemporaryFile(), $fileUpload->getUntrustedName());
90+
91+
$entity->setFile($fileEntity);
6692
}
6793

6894
$this->_em->flush();
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
1-
{extends $originalTemplate}
2-
{varType App\Model\Entity\Configuration $item}
1+
{varType ADT\FancyAdmin\Model\Entities\Configuration $item}
2+
3+
{define col-value}
4+
{if $item->getType() === \ADT\FancyAdmin\Model\Entities\Enums\ConfigurationTypeEnum::TYPE_JSON}
5+
{= Nette\Utils\Json::encode($item->getValue(), pretty: true)};
6+
{elseif $item->getType() === \ADT\FancyAdmin\Model\Entities\Enums\ConfigurationTypeEnum::TYPE_FILE}
7+
<a href="{$item->getFile()->getUrl()}" target="_blank">{$item->getFile()->getOriginalName()}</a>
8+
{else}
9+
{$item->getValue()}
10+
{/if}
11+
{/define}

src/UI/Components/Grids/Configuration/ConfigurationGridTrait.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
use ADT\Datagrid\Component\DeleteParams;
99
use ADT\Datagrid\Component\EditParams;
1010
use ADT\FancyAdmin\Model\Entities\Enums\AclResourceNameEnum;
11+
use ADT\FancyAdmin\Model\Entities\Enums\ConfigurationTypeEnum;
1112
use ADT\FancyAdmin\Model\Queries\Factories\ConfigurationQueryFactory;
1213
use ADT\FancyAdmin\UI\Components\Grids\Traits\Editable\Editable;
14+
use App\Model\Entities\Configuration;
15+
use Nette\Utils\Json;
1316

1417
trait ConfigurationGridTrait
1518
{
@@ -19,10 +22,16 @@ trait ConfigurationGridTrait
1922

2023
public function initGrid(DataGrid $grid): void
2124
{
22-
$grid->addColumnText('key', 'Key');
23-
$grid->addColumnText('type', 'Type');
24-
$grid->addColumnText('value', 'Value');
25-
$grid->addColumnText('options', 'Options');
25+
$grid->addColumnText('name', 'Name');
26+
$grid->addColumnText('value', 'Value')
27+
->setRenderer(function(Configuration $configuration) {
28+
if ($configuration->getType() === ConfigurationTypeEnum::TYPE_JSON) {
29+
return Json::encode($configuration->getValue(), pretty: true);
30+
} elseif ($configuration->getType() === ConfigurationTypeEnum::TYPE_FILE) {
31+
return $configuration->getFile()->getUrl();
32+
}
33+
return $configuration->getValue();
34+
});
2635
}
2736

2837
protected function allowEdit(): ?EditParams

0 commit comments

Comments
 (0)