diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 853a0c8..f6487d4 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -131,5 +131,31 @@ "foreignKey": "media_id" } } + }, + "media_tag": { + "name": "media_tag", + "fields": { + "media_tag_id": { + "name": "media_tag_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "media_tag_src": { + "name": "media_tag_src", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + }, + "media_tag_dst": { + "name": "task_tag_dst", + "type": "INT", + "null": false, + "foreignTable": "tag", + "foreignKey": "tag_id" + } + } } } \ No newline at end of file diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 1eee18d..6b268f8 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -39,6 +39,9 @@ use phpOMS\System\File\Local\Directory; use phpOMS\System\MimeType; use phpOMS\Utils\Parser\Markdown\Markdown; use phpOMS\Views\View; +use phpOMS\Message\Http\HttpResponse; +use phpOMS\Message\Http\HttpRequest; +use Modules\Tag\Models\NullTag; /** * Media class. @@ -80,6 +83,35 @@ final class ApiController extends Controller $ids = []; foreach ($uploads as $file) { $ids[] = $file->getId(); + + // @todo: maybe improve, this could potentially be done immediately in the createDBEntry, especially if tags replace the type? But probably we need type and tags (both are slightly different e.g. tags are public, types are for modules e.g. itemmanagement item image) + // add tags + if (!empty($tags = $request->getDataJson('tags'))) { + foreach ($tags as $tag) { + if (!isset($tag['id'])) { + $request->setData('title', $tag['title'], true); + $request->setData('color', $tag['color'], true); + $request->setData('icon', $tag['icon'] ?? null, true); + $request->setData('language', $tag['language'], true); + + $internalResponse = new HttpResponse(); + $this->app->moduleManager->get('Tag')->apiTagCreate($request, $internalResponse, null); + $file->addTag($tId = $internalResponse->get($request->uri->__toString())['response']); + } else { + $file->addTag(new NullTag($tId = (int) $tag['id'])); + } + + $this->createModelRelation( + $request->header->account, + $file->getId(), + $tId, + MediaMapper::class, + 'tags', + '', + $request->getOrigin() + ); + } + } } $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Media', 'Media successfully created.', $ids); @@ -198,6 +230,7 @@ final class ApiController extends Controller $this->app->orgId, $this->app->appName, self::MODULE_NAME, + self::MODULE_NAME, PermissionState::MEDIA, $created->getId(), null, @@ -605,7 +638,7 @@ final class ApiController extends Controller * Set header for report/template * * @param View $view Media view - * @param string $name Template name + * @param Media $media Media file * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 6526153..7f17385 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -156,6 +156,7 @@ final class BackendController extends Controller $view->addData('media', $media); $view->addData('path', $path); + $view->addData('account', $this->app->accountManager->get($request->header->account)); return $view; } diff --git a/Controller/FileUploaderTrait.php b/Controller/FileUploaderTrait.php index 76d27d7..ea9c4cc 100755 --- a/Controller/FileUploaderTrait.php +++ b/Controller/FileUploaderTrait.php @@ -43,6 +43,6 @@ trait FileUploaderTrait public static function setUpFileUploaderTrait(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { $head = $response->get('Content')->getData('head'); - $head->addAsset(AssetType::JS, '/Modules/Media/ModuleMedia.js'); + $head->addAsset(AssetType::JS, '/Modules/Media/Controller.js', ['type' => 'module']); } } diff --git a/Models/Media.php b/Models/Media.php index 934c87f..cf9ac3c 100755 --- a/Models/Media.php +++ b/Models/Media.php @@ -16,6 +16,8 @@ namespace Modules\Media\Models; use Modules\Admin\Models\Account; use Modules\Admin\Models\NullAccount; +use Modules\Tag\Models\Tag; +use Modules\Tag\Models\NullTag; /** * Media class. @@ -163,6 +165,14 @@ class Media implements \JsonSerializable */ protected int $collection = 0; + /** + * Tags. + * + * @var Tag[] + * @since 1.0.0 + */ + protected array $tags = []; + /** * Constructor. * @@ -328,6 +338,72 @@ class Media implements \JsonSerializable $this->virtualPath = \str_replace('\\', '/', $path); } + /** + * Adding new tag. + * + * @param Tag $tag Tag + * + * @return int + * + * @since 1.0.0 + */ + public function addTag(Tag $tag) : int + { + $this->tags[] = $tag; + + \end($this->tags); + $key = (int) \key($this->tags); + \reset($this->tags); + + return $key; + } + + /** + * Remove Tag from list. + * + * @param int $id Tag + * + * @return bool + * + * @since 1.0.0 + */ + public function removeTag($id) : bool + { + if (isset($this->tags[$id])) { + unset($this->tags[$id]); + + return true; + } + + return false; + } + + /** + * Get task elements. + * + * @return Tag[] + * + * @since 1.0.0 + */ + public function getTags() : array + { + return $this->tags; + } + + /** + * Get task elements. + * + * @param int $id Element id + * + * @return Tag + * + * @since 1.0.0 + */ + public function getTag(int $id) : Tag + { + return $this->tags[$id] ?? new NullTag(); + } + /** * {@inheritdoc} */ diff --git a/Models/MediaMapper.php b/Models/MediaMapper.php index e707b0f..7d937c7 100755 --- a/Models/MediaMapper.php +++ b/Models/MediaMapper.php @@ -17,6 +17,7 @@ namespace Modules\Media\Models; use Modules\Admin\Models\AccountMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; use phpOMS\DataStorage\Database\RelationType; +use Modules\Tag\Models\TagMapper; /** * Media mapper class. @@ -67,6 +68,21 @@ class MediaMapper extends DataMapperAbstract ], ]; + /** + * Has many relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $hasMany = [ + 'tags' => [ + 'mapper' => TagMapper::class, + 'table' => 'media_tag', + 'external' => 'media_tag_dst', + 'self' => 'media_tag_src', + ], + ]; + /** * Model to use by the mapper. * diff --git a/Theme/Backend/Components/InlinePreview/inline-preview.tpl.php b/Theme/Backend/Components/InlinePreview/inline-preview.tpl.php index de16e03..b7f84aa 100755 --- a/Theme/Backend/Components/InlinePreview/inline-preview.tpl.php +++ b/Theme/Backend/Components/InlinePreview/inline-preview.tpl.php @@ -17,7 +17,7 @@ data-emptyAfter="true" data-autocomplete="off" data-src="api/media/find?search={!#mediaInput}"> -