This commit is contained in:
Dennis Eichhorn 2024-01-02 23:34:17 +00:00
parent b544bcc587
commit ecd3ba4363
13 changed files with 319 additions and 12 deletions

View File

@ -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,
],
],
],
];

View File

@ -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;
}
}

View File

@ -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

View File

@ -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

View File

@ -24,7 +24,7 @@
<section class="portlet">
<div class="portlet-head"><?= $this->getHtml('Notes', 'Editor', 'Backend'); ?><i class="g-icon download btn end-xs">download</i></div>
<div class="slider">
<table class="default">
<table class="default sticky">
<thead>
<tr>
<td>

View File

@ -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);
}

View File

@ -0,0 +1,86 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\Editor
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\Editor\Theme\Backend\Components\Note;
use phpOMS\Localization\L11nManager;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Views\View;
/**
* Component view.
*
* @package Modules\Editor
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
* @codeCoverageIgnore
*/
class BaseView extends View
{
/**
* Form id
*
* @var string
* @since 1.0.0
*/
public string $form = '';
/**
* Virtual path of the media file
*
* @var string
* @since 1.0.0
*/
public string $virtualPath = '';
/**
* Name of the image preview
*
* @var string
* @since 1.0.0
*/
public string $name = '';
/**
* Docs docs
*
* @var \Modules\Editor\Models\EditorDoc[]
* @since 1.0.0
*/
public array $docs = [];
/**
* {@inheritdoc}
*/
public function __construct(L11nManager $l11n = null, RequestAbstract $request, ResponseAbstract $response)
{
parent::__construct($l11n, $request, $response);
$this->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();
}
}

View File

@ -0,0 +1,97 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\Editor
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
use phpOMS\Uri\UriFactory;
?>
<div class="row">
<div class="col-xs-12 col-md-6">
<div class="portlet">
<div class="portlet-head"><?= $this->getHtml('Note', 'Editor', 'Backend'); ?></div>
<form id="<?= $this->form; ?>-create">
<div class="portlet-body">
<div class="form-group">
<label for="iNoteTitle"><?= $this->getHtml('Title', 'Editor', 'Backend'); ?></label>
<input type="text" id="iNoteTitle" name="note_title" value="<?= $this->printHtml(''); ?>" required>
</div>
<div class="form-group">
<label for="iNoteContent"><?= $this->getHtml('Content', 'Editor', 'Backend'); ?></label>
<pre id="iNoteContent" class="textarea contenteditable" name="description" contenteditable="true"><?= $this->printHtml(''); ?></pre>
</div>
</div>
</form>
</div>
<section class="portlet">
<div class="portlet-head"><?= $this->getHtml('Notes', 'Editor', 'Backend'); ?><i class="g-icon download btn end-xs">download</i></div>
<div class="slider">
<table id="iNotes" class="default sticky">
<thead>
<tr>
<td>
<td><?= $this->getHtml('ID', '0', '0'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
<td class="wf-100"><?= $this->getHtml('Name', 'Editor', 'Backend'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
<td>
<tbody
id="iNoteInput-tags"
class="tags"
data-action='[{"listener": "change", "action": [{"key": 1, "type": "dom.set", "selector": "#iNoteNote", "value": "<?= UriFactory::build('{/api}editor/export') . '?id={!#iNotes [name=doc_doc]:checked}&type=html'; ?>"}]}]'
data-limit="0"
data-active="true"
data-form="<?= $this->form; ?>"
>
<template id="iNoteInput-tagTemplate">
<tr data-tpl-value="/id" data-value="" data-uuid="" data-name="doc-list">
<td><label class="radio" for="iNote-0">
<input id="iNote-0" type="radio" name="doc_doc" value="">
<span class="checkmark"></span>
</label>
<td data-tpl-text="/id" data-tpl-value="/id" data-value=""></td>
<td data-tpl-text="/name" data-tpl-value="/name" data-value=""></td>
<td>
</template>
<?php foreach ($this->docs as $doc) :
$url = UriFactory::build('{/base}/editor/single?{?}&id=' . $doc->id);
?>
<tr data-tpl-value="/id" data-value="" data-uuid="" data-name="doc-list">
<td><label class="radio" for="iNote-<?= $doc->id; ?>">
<input id="iNote-<?= $doc->id; ?>" type="radio" name="doc_doc" value="<?= $doc->id; ?>"<?= \end($this->docs)->id === $doc->id ? ' checked' : ''; ?>>
<span class="checkmark"></span>
</label>
<td data-tpl-text="/id" data-tpl-value="/id" data-value=""><?= $this->printHtml((string) $doc->id); ?></td>
<td data-tpl-text="/name" data-tpl-value="/name" data-value=""><?= $this->printHtml($doc->title); ?></td>
<td><a href="<?= $url; ?>"><i class="g-icon">attachment</i></a>
<?php endforeach; ?>
<?php if (empty($this->docs)) : ?>
<tr>
<td colspan="4" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
<?php endif; ?>
</table>
</div>
</section>
</div>
<div class="col-xs-12 col-md-6 col-simple">
<section id="docNote" class="portlet col-simple">
<div class="portlet-body col-simple">
<?php if (!empty($this->docs)) : ?>
<iframe class="col-simple" id="iNoteNote" data-src="<?= UriFactory::build('{/api}editor/export') . '?id={!#iNotes [name=doc_doc]:checked}&type=html'; ?>" allowfullscreen></iframe>
<?php else : ?>
<img width="100%" src="Web/Backend/img/logo_grey.png">
<?php endif; ?>
</div>
</section>
</div>
</div>

View File

@ -0,0 +1,17 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Template
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
use phpOMS\Utils\Parser\Markdown\Markdown;
?>
<article><?= Markdown::parse($this->data['doc']->plain); ?></article>

View File

@ -16,6 +16,7 @@ return ['Editor' => [
'Add' => 'Hinzufügen',
'Created' => 'Erstellt',
'Creator' => 'Ersteller',
'Content' => 'Inhalt',
'Documents' => 'Unterlagen',
'Editor' => 'Editor',
'GroupUser' => 'Gruppe / Benutzer',

View File

@ -16,6 +16,7 @@ return ['Editor' => [
'Add' => 'Add',
'Created' => 'Created',
'Creator' => 'Creator',
'Content' => 'Content',
'Documents' => 'Documents',
'Editor' => 'Editor',
'GroupUser' => 'Group/User',

View File

@ -71,7 +71,7 @@ echo $this->data['nav']->render(); ?>
<option>
</select>
<tr><td colspan="2"><label><?= $this->getHtml('GroupUser'); ?></label>
<tr><td><input id="iPermission" name="group" type="text" placeholder="&#xf084;"><td><button><?= $this->getHtml('Add'); ?></button>
<tr><td><input id="iPermission" name="group" type="text" placeholder=""><td><button><?= $this->getHtml('Add'); ?></button>
</table>
</form>
</div>

View File

@ -14,7 +14,6 @@
"name": "Jingga",
"website": "jingga.app"
},
"description": "The administration module.",
"directory": "Editor",
"dependencies": {
"Admin": "1.0.0",