diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index fb24ef5..00d2e00 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -18,7 +18,7 @@ use phpOMS\Account\PermissionType; use phpOMS\Router\RouteVerb; return [ - '^.*/editor.*$' => [ + '^.*/editor(\?+.*|$)' => [ [ 'dest' => '\Modules\Editor\Controller\ApiController:apiEditorCreate', 'verb' => RouteVerb::PUT, @@ -56,4 +56,15 @@ return [ ], ], ], + '^.*/editor/export(\?+.*|$)' => [ + [ + 'dest' => '\Modules\Editor\Controller\ApiController:apiDocExport', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DOC, + ], + ], + ], ]; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 3ff0b31..af6dca4 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -21,6 +21,7 @@ use Modules\Editor\Models\EditorDoc; use Modules\Editor\Models\EditorDocHistory; use Modules\Editor\Models\EditorDocHistoryMapper; use Modules\Editor\Models\EditorDocMapper; +use Modules\Editor\Models\PermissionCategory; use Modules\Media\Models\CollectionMapper; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\NullMedia; @@ -28,10 +29,13 @@ use Modules\Media\Models\PathSettings; use Modules\Media\Models\Reference; use Modules\Media\Models\ReferenceMapper; use Modules\Tag\Models\NullTag; +use phpOMS\Account\PermissionType; +use phpOMS\Asset\AssetType; use phpOMS\Message\Http\HttpResponse; use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; +use phpOMS\Model\Html\Head; use phpOMS\System\MimeType; use phpOMS\Utils\Parser\Markdown\Markdown; use phpOMS\Views\View; @@ -577,4 +581,97 @@ final class ApiController extends Controller $response->header->set('Content-Type', MimeType::M_TEXT); $response->set('', $doc->plain); } + + /** + * Routing end-point for application behavior. + * + * @param \phpOMS\Message\Http\HttpRequest $request Request + * @param HttpResponse $response Response + * @param array $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiDocExport(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void + { + $doc = null; + + if ($request->hasData('id')) { + $doc = EditorDocMapper::get()->where('id', (int) $request->getData('id'))->execute(); + } else { + $response->header->status = RequestStatusCode::R_403; + $this->createInvalidReturnResponse($request, $response, $doc); + + return; + } + + if (!($data['ignorePermission'] ?? false) + && $request->header->account !== $doc->createdBy->id + && !$this->app->accountManager->get($request->header->account)->hasPermission( + PermissionType::READ, + $this->app->unitId, + $this->app->appId, + self::NAME, + PermissionCategory::DOC, + $doc->id + ) + ) { + $response->header->status = RequestStatusCode::R_403; + $this->createInvalidReturnResponse($request, $response, $doc); + + return; + } + + $response->header->set('Content-Type', MimeType::M_HTML, true); + $view = $this->createView($doc, $request, $response); + $view->data['path'] = __DIR__ . '/../../../'; + + $response->set('export', $view); + } + + /** + * Routing end-point for application behavior. + * + * @param EditorDoc $doc Media + * @param \phpOMS\Message\Http\HttpRequest $request Request + * @param HttpResponse $response Response + * + * @return View + * + * @todo Implement pdf export + * @todo Implement spreadsheet (# or ## headline -> new sheet) export + * @todo Implement word export + * @todo Implement raw markdown export + * + * @since 1.0.0 + */ + public function createView(EditorDoc $doc, RequestAbstract $request, ResponseAbstract $response) : View + { + $view = new View($this->app->l11nManager, $request, $response); + $view->data['doc'] = $doc; + + $head = new Head(); + + $css = ''; + if (\is_file(__DIR__ . '/../../../Web/Backend/css/backend-small.css')) { + $css = \file_get_contents(__DIR__ . '/../../../Web/Backend/css/backend-small.css'); + + if ($css === false) { + $css = ''; // @codeCoverageIgnore + } + } + + $css = \preg_replace('!\s+!', ' ', $css); + $head->setStyle('core', $css ?? ''); + + $head->addAsset(AssetType::CSS, 'cssOMS/styles.css?v=1.0.0'); + $view->data['head'] = $head; + + $view->setTemplate('/Modules/Editor/Theme/Backend/Components/Note/editor-html'); + + return $view; + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index b3bdaa8..2f1949d 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -37,7 +37,7 @@ use phpOMS\Views\View; final class BackendController extends Controller { /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -57,7 +57,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -85,7 +85,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -118,7 +118,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -170,7 +170,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response diff --git a/Models/PermissionCategory.php b/Models/PermissionCategory.php index 660be0c..6b3fb1f 100755 --- a/Models/PermissionCategory.php +++ b/Models/PermissionCategory.php @@ -17,7 +17,7 @@ namespace Modules\Editor\Models; use phpOMS\Stdlib\Base\Enum; /** - * Permision state enum. + * Permission category enum. * * @package Modules\Editor\Models * @license OMS License 2.0 diff --git a/Theme/Backend/Components/Compound/compound.tpl.php b/Theme/Backend/Components/Compound/compound.tpl.php index e26f8e2..4bca6a9 100644 --- a/Theme/Backend/Components/Compound/compound.tpl.php +++ b/Theme/Backend/Components/Compound/compound.tpl.php @@ -24,7 +24,7 @@
getHtml('Notes', 'Editor', 'Backend'); ?>download
- +
diff --git a/Theme/Backend/Components/Editor/BaseView.php b/Theme/Backend/Components/Editor/BaseView.php index a071ce3..b04a8f0 100755 --- a/Theme/Backend/Components/Editor/BaseView.php +++ b/Theme/Backend/Components/Editor/BaseView.php @@ -47,8 +47,6 @@ class BaseView extends View parent::__construct($l11n, $request, $response); $this->setTemplate('/Modules/Editor/Theme/Backend/Components/Editor/inline-editor-tools'); - $response->data['Content']->head->addAsset(AssetType::JSLATE, 'Modules/Editor/Controller.js', ['type' => 'module']); - $view = new TextView($l11n, $request, $response); $this->addData('text', $view); } diff --git a/Theme/Backend/Components/Note/BaseView.php b/Theme/Backend/Components/Note/BaseView.php new file mode 100644 index 0000000..ffee9f8 --- /dev/null +++ b/Theme/Backend/Components/Note/BaseView.php @@ -0,0 +1,86 @@ +setTemplate('/Modules/Editor/Theme/Backend/Components/Note/base'); + } + + /** + * {@inheritdoc} + */ + public function render(mixed ...$data) : string + { + /** @var array{0:string, 1?:string, 2?:array} $data */ + $this->form = $data[0]; + $this->name = $data[1] ?? 'UNDEFINED'; + $this->docs = $data[2] ?? $this->docs; + + return parent::render(); + } +} diff --git a/Theme/Backend/Components/Note/base.tpl.php b/Theme/Backend/Components/Note/base.tpl.php new file mode 100644 index 0000000..c3fcaca --- /dev/null +++ b/Theme/Backend/Components/Note/base.tpl.php @@ -0,0 +1,97 @@ + +
+
+
+
getHtml('Note', 'Editor', 'Backend'); ?>
+
+
+
+ + +
+ +
+ +
printHtml(''); ?>
+
+
+
+
+ +
+
getHtml('Notes', 'Editor', 'Backend'); ?>download
+
+ + + + "}]}]' + data-limit="0" + data-active="true" + data-form="form; ?>" + > + + docs as $doc) : + $url = UriFactory::build('{/base}/editor/single?{?}&id=' . $doc->id); + ?> + + + + +
+ getHtml('ID', '0', '0'); ?>expand_lessexpand_more + getHtml('Name', 'Editor', 'Backend'); ?>expand_lessexpand_more + +
+ printHtml((string) $doc->id); ?>printHtml($doc->title); ?>attachment + + docs)) : ?> +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
+ +
+
+
+ docs)) : ?> + + + + +
+
+
+
diff --git a/Theme/Backend/Components/Note/editor-html.tpl.php b/Theme/Backend/Components/Note/editor-html.tpl.php new file mode 100644 index 0000000..a1af791 --- /dev/null +++ b/Theme/Backend/Components/Note/editor-html.tpl.php @@ -0,0 +1,17 @@ + +
data['doc']->plain); ?>
diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index 966932f..39f8da6 100755 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -16,6 +16,7 @@ return ['Editor' => [ 'Add' => 'Hinzufügen', 'Created' => 'Erstellt', 'Creator' => 'Ersteller', + 'Content' => 'Inhalt', 'Documents' => 'Unterlagen', 'Editor' => 'Editor', 'GroupUser' => 'Gruppe / Benutzer', diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 360d946..9cb5c4e 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -16,6 +16,7 @@ return ['Editor' => [ 'Add' => 'Add', 'Created' => 'Created', 'Creator' => 'Creator', + 'Content' => 'Content', 'Documents' => 'Documents', 'Editor' => 'Editor', 'GroupUser' => 'Group/User', diff --git a/Theme/Backend/editor-create.tpl.php b/Theme/Backend/editor-create.tpl.php index 91af00c..166982b 100755 --- a/Theme/Backend/editor-create.tpl.php +++ b/Theme/Backend/editor-create.tpl.php @@ -71,7 +71,7 @@ echo $this->data['nav']->render(); ?>
-
+
diff --git a/info.json b/info.json index 0d51098..34890cf 100755 --- a/info.json +++ b/info.json @@ -14,7 +14,6 @@ "name": "Jingga", "website": "jingga.app" }, - "description": "The administration module.", "directory": "Editor", "dependencies": { "Admin": "1.0.0",