mirror of
https://github.com/Karaka-Management/oms-Editor.git
synced 2026-01-11 00:58:43 +00:00
update
This commit is contained in:
parent
b544bcc587
commit
ecd3ba4363
|
|
@ -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,
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
86
Theme/Backend/Components/Note/BaseView.php
Normal file
86
Theme/Backend/Components/Note/BaseView.php
Normal 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();
|
||||
}
|
||||
}
|
||||
97
Theme/Backend/Components/Note/base.tpl.php
Normal file
97
Theme/Backend/Components/Note/base.tpl.php
Normal 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>
|
||||
17
Theme/Backend/Components/Note/editor-html.tpl.php
Normal file
17
Theme/Backend/Components/Note/editor-html.tpl.php
Normal 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>
|
||||
|
|
@ -16,6 +16,7 @@ return ['Editor' => [
|
|||
'Add' => 'Hinzufügen',
|
||||
'Created' => 'Erstellt',
|
||||
'Creator' => 'Ersteller',
|
||||
'Content' => 'Inhalt',
|
||||
'Documents' => 'Unterlagen',
|
||||
'Editor' => 'Editor',
|
||||
'GroupUser' => 'Gruppe / Benutzer',
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ return ['Editor' => [
|
|||
'Add' => 'Add',
|
||||
'Created' => 'Created',
|
||||
'Creator' => 'Creator',
|
||||
'Content' => 'Content',
|
||||
'Documents' => 'Documents',
|
||||
'Editor' => 'Editor',
|
||||
'GroupUser' => 'Group/User',
|
||||
|
|
|
|||
|
|
@ -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=""><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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user