diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 0648a90..2004dc1 100755 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -34,7 +34,7 @@ "type": 3, "subtype": 1, "name": "Categories", - "uri": "{/base}/wiki/category/list", + "uri": "{/base}/wiki/category/list?{?}", "target": "self", "icon": null, "order": 5, @@ -52,7 +52,7 @@ "uri": "{/base}/wiki/doc/create?{?}", "target": "self", "icon": null, - "order": 10, + "order": 15, "from": "Knowledgebase", "permission": { "permission": 4, "category": null, "element": null }, "parent": 1005901001, @@ -64,12 +64,27 @@ "type": 3, "subtype": 1, "name": "List", - "uri": "{/base}/wiki/list", + "uri": "{/base}/wiki/doc/list?{?}", "target": "self", "icon": null, - "order": 15, + "order": 10, "from": "Knowledgebase", - "permission": { "permission": 2, "category": null, "element": null }, + "permission": { "permission": 4, "category": null, "element": null }, + "parent": 1005901001, + "children": [] + }, + { + "id": 1005906001, + "pid": "/wiki", + "type": 3, + "subtype": 1, + "name": "Apps", + "uri": "{/base}/wiki/app/list?{?}", + "target": "self", + "icon": null, + "order": 20, + "from": "Knowledgebase", + "permission": { "permission": 4, "category": null, "element": null }, "parent": 1005901001, "children": [] } diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index d54faab..9ec1cdb 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -134,4 +134,25 @@ return [ ], ], ], + + '^.*/wiki/category/l11n$' => [ + [ + 'dest' => '\Modules\Knowledgebase\Controller\ApiController:apiWikiCategoryL11nCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::CATEGORY, + ], + ], + [ + 'dest' => '\Modules\Knowledgebase\Controller\ApiController:apiWikiCategoryL11nUpdate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::CATEGORY, + ], + ], + ], ]; diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 04a1451..050649d 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -40,6 +40,7 @@ return [ ], ], ], + '^.*/wiki/category/list.*$' => [ [ 'dest' => '\Modules\Knowledgebase\Controller\BackendController:viewKnowledgebaseCategoryList', @@ -73,6 +74,7 @@ return [ ], ], ], + '^.*/wiki/doc/single.*$' => [ [ 'dest' => '\Modules\Knowledgebase\Controller\BackendController:viewKnowledgebaseDoc', @@ -117,4 +119,38 @@ return [ ], ], ], + + '^.*/wiki/app/list.*$' => [ + [ + 'dest' => '\Modules\Knowledgebase\Controller\BackendController:viewKnowledgebaseAppList', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::CATEGORY, + ], + ], + ], + '^.*/wiki/app/single.*$' => [ + [ + 'dest' => '\Modules\Knowledgebase\Controller\BackendController:viewKnowledgebaseApp', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::CATEGORY, + ], + ], + ], + '^.*/wiki/app/create.*$' => [ + [ + 'dest' => '\Modules\Knowledgebase\Controller\BackendController:viewKnowledgebaseAppCreate', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::CATEGORY, + ], + ], + ], ]; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 9ae2a9c..df07af3 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -257,7 +257,7 @@ final class ApiController extends Controller $request->setData('language', $tag['language'], true); $internalResponse = new HttpResponse(); - $this->app->moduleManager->get('Tag')->apiTagCreate($request, $internalResponse); + $this->app->moduleManager->get('Tag')->apiWikiCategoryL11nCreate($request, $internalResponse); if (!\is_array($data = $internalResponse->getDataArray($request->uri->__toString()))) { continue; @@ -779,4 +779,126 @@ final class ApiController extends Controller $this->deleteModel($request->header->account, $app, WikiAppMapper::class, 'app', $request->getOrigin()); $this->createStandardDeleteResponse($request, $response, $app); } + + /** + * Api method to update CategoryL11n + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiWikiCategoryL11nUpdate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void + { + if (!empty($val = $this->validateCategoryL11nUpdate($request))) { + $response->header->status = RequestStatusCode::R_400; + $this->createInvalidUpdateResponse($request, $response, $val); + + return; + } + + /** @var BaseStringL11n $old */ + $old = WikiCategoryL11nMapper::get()->where('id', (int) $request->getData('id'))->execute(); + $new = $this->updateCategoryL11nFromRequest($request, clone $old); + + $this->updateModel($request->header->account, $old, $new, WikiCategoryL11nMapper::class, 'category_l11n', $request->getOrigin()); + $this->createStandardUpdateResponse($request, $response, $new); + } + + /** + * Method to update CategoryL11n from request. + * + * @param RequestAbstract $request Request + * @param BaseStringL11n $new Model to modify + * + * @return BaseStringL11n + * + * @todo Implement API update function + * + * @since 1.0.0 + */ + public function updateCategoryL11nFromRequest(RequestAbstract $request, BaseStringL11n $new) : BaseStringL11n + { + $new->setLanguage( + $request->getDataString('language') ?? $new->language + ); + $new->content = $request->getDataString('title') ?? $new->content; + + return $new; + } + + /** + * Validate CategoryL11n update request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @todo Implement API validation function + * + * @since 1.0.0 + */ + private function validateCategoryL11nUpdate(RequestAbstract $request) : array + { + $val = []; + if (($val['id'] = !$request->hasData('id'))) { + return $val; + } + + return []; + } + + /** + * Api method to delete CategoryL11n + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiWikiCategoryL11nDelete(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void + { + if (!empty($val = $this->validateCategoryL11nDelete($request))) { + $response->header->status = RequestStatusCode::R_400; + $this->createInvalidDeleteResponse($request, $response, $val); + + return; + } + + /** @var BaseStringL11n $categoryL11n */ + $categoryL11n = WikiCategoryL11nMapper::get()->where('id', (int) $request->getData('id'))->execute(); + $this->deleteModel($request->header->account, $categoryL11n, WikiCategoryL11nMapper::class, 'category_l11n', $request->getOrigin()); + $this->createStandardDeleteResponse($request, $response, $categoryL11n); + } + + /** + * Validate CategoryL11n delete request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @todo Implement API validation function + * + * @since 1.0.0 + */ + private function validateCategoryL11nDelete(RequestAbstract $request) : array + { + $val = []; + if (($val['id'] = !$request->hasData('id'))) { + return $val; + } + + return []; + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 38f1afb..152d03c 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -19,6 +19,7 @@ use Modules\Knowledgebase\Models\NullWikiCategory; use Modules\Knowledgebase\Models\NullWikiDoc; use Modules\Knowledgebase\Models\PermissionCategory; use Modules\Knowledgebase\Models\WikiAppMapper; +use Modules\Knowledgebase\Models\WikiCategoryL11nMapper; use Modules\Knowledgebase\Models\WikiCategoryMapper; use Modules\Knowledgebase\Models\WikiDocMapper; use phpOMS\Account\PermissionType; @@ -42,7 +43,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 @@ -60,7 +61,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 @@ -75,8 +76,10 @@ final class BackendController extends Controller { $view = new View($this->app->l11nManager, $request, $response); - // @todo assign default org app to wiki app and default flag, load the wiki app based on org id and with a default flag set. Use this app in the following line instead of the hardcoded "1" - $app = $request->getDataInt('app') ?? 1; + // @todo assign default org app to wiki app and default flag, + // load the wiki app based on org id and with a default flag set. + // Use this app in the following line instead of the hardcoded "1" + $app = $request->getDataInt('wiki') ?? 1; $view->setTemplate('/Modules/Knowledgebase/Theme/Backend/wiki-dashboard'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005901001, $request, $response); @@ -84,7 +87,7 @@ final class BackendController extends Controller /** @var \Modules\Knowledgebase\Models\WikiCategory[] $categories */ $categories = WikiCategoryMapper::getAll() ->with('name') - ->where('parent', $request->getDataInt('category')) + ->where('parent', null) ->where('app', $app) ->where('name/language', $response->header->l11n->language) ->execute(); @@ -98,7 +101,8 @@ final class BackendController extends Controller ->where('app', $app) ->where('language', $response->header->l11n->language) ->where('tags/title/language', $response->header->l11n->language) - ->limit(25)->sort('createdAt', OrderType::DESC) + ->limit(25) + ->sort('createdAt', OrderType::DESC) ->execute(); $view->data['docs'] = $documents; @@ -111,7 +115,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 @@ -137,7 +141,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 @@ -163,7 +167,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 @@ -186,7 +190,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 @@ -201,20 +205,26 @@ final class BackendController extends Controller { $view = new View($this->app->l11nManager, $request, $response); - $app = $request->getDataInt('app') ?? $this->app->unitId; - $view->setTemplate('/Modules/Knowledgebase/Theme/Backend/wiki-category-list'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005901001, $request, $response); /** @var \Modules\Knowledgebase\Models\WikiCategory[] $list */ - $list = WikiCategoryMapper::getAll()->with('name')->where('app', $app)->where('name/language', $response->header->l11n->language)->execute(); + $list = WikiCategoryMapper::getAll() + ->with('name') + ->where('name/language', $response->header->l11n->language) + ->execute(); + $view->data['categories'] = $list; + /** @var \Modules\Knowledgebase\Models\WikiApp[] $apps */ + $apps = WikiAppMapper::getAll()->execute(); + $view->data['apps'] = $apps; + return $view; } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -233,14 +243,28 @@ final class BackendController extends Controller $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005901001, $request, $response); /** @var \Modules\Knowledgebase\Models\WikiCategory $category */ - $category = WikiCategoryMapper::get()->where('id', (int) $request->getData('id'))->execute(); + $category = WikiCategoryMapper::get() + ->with('name') + ->where('id', (int) $request->getData('id')) + ->where('name/language', $response->header->l11n->language) + ->execute(); + $view->data['category'] = $category; + $view->data['l11nView'] = new \Web\Backend\Views\L11nView($this->app->l11nManager, $request, $response); + + /** @var \phpOMS\Localization\BaseStringL11n[] $l11nValues */ + $l11nValues = WikiCategoryL11nMapper::getAll() + ->where('ref', $category->id) + ->execute(); + + $view->data['l11nValues'] = $l11nValues; + return $view; } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -254,7 +278,7 @@ final class BackendController extends Controller public function viewKnowledgebaseCategoryCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); - $view->setTemplate('/Modules/Knowledgebase/Theme/Backend/wiki-category-single'); + $view->setTemplate('/Modules/Knowledgebase/Theme/Backend/wiki-category-create'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005901001, $request, $response); $view->data['category'] = new NullWikiCategory(); @@ -263,7 +287,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 @@ -276,20 +300,44 @@ final class BackendController extends Controller */ public function viewKnowledgebaseDocList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { + $app = $request->getDataInt('wiki') ?? 1; + $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Knowledgebase/Theme/Backend/wiki-doc-list'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005901001, $request, $response); - /** @var \Modules\Knowledgebase\Models\WikiDoc[] $list */ - $list = WikiDocMapper::getAll()->limit(25)->execute(); - $view->data['docs'] = $list; + /** @var \Modules\Knowledgebase\Models\WikiCategory[] $categories */ + $categories = WikiCategoryMapper::getAll() + ->with('name') + ->where('app', $app) + ->where('name/language', $response->header->l11n->language) + ->execute(); + + $view->data['categories'] = $categories; + + /** @var \Modules\Knowledgebase\Models\WikiDoc[] $documents */ + $documents = WikiDocMapper::getAll() + ->with('tags') + ->with('tags/title') + ->where('app', $app) + ->where('category', $request->getDataInt('category') ?? \reset($categories)->id) + ->where('language', $response->header->l11n->language) + ->where('tags/title/language', $response->header->l11n->language) + ->sort('createdAt', OrderType::DESC) + ->execute(); + + $view->data['docs'] = $documents; + + /** @var \Modules\Knowledgebase\Models\WikiApp[] $apps */ + $apps = WikiAppMapper::getAll()->execute(); + $view->data['apps'] = $apps; return $view; } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -304,7 +352,7 @@ final class BackendController extends Controller { $view = new View($this->app->l11nManager, $request, $response); - $app = $request->getDataInt('app') ?? $this->app->unitId; + $app = $request->getDataInt('wiki') ?? $this->app->unitId; /** @var \Modules\Knowledgebase\Models\WikiDoc $document */ $document = WikiDocMapper::get() @@ -353,7 +401,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 @@ -383,7 +431,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 @@ -399,7 +447,7 @@ final class BackendController extends Controller $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Knowledgebase/Theme/Backend/wiki-doc-create'); - $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000601001, $request, $response); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005901001, $request, $response); $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); $view->data['editor'] = $editor; diff --git a/Models/PermissionCategory.php b/Models/PermissionCategory.php index 25426a5..3688f39 100755 --- a/Models/PermissionCategory.php +++ b/Models/PermissionCategory.php @@ -17,7 +17,7 @@ namespace Modules\Knowledgebase\Models; use phpOMS\Stdlib\Base\Enum; /** - * Permision state enum. + * Permission category enum. * * @package Modules\Knowledgebase\Models * @license OMS License 2.0 diff --git a/Models/WikiCategory.php b/Models/WikiCategory.php index db7bf57..a4def89 100755 --- a/Models/WikiCategory.php +++ b/Models/WikiCategory.php @@ -70,7 +70,7 @@ class WikiCategory implements \JsonSerializable public string $virtualPath = '/'; /** - * Cosntructor + * Constructor * * @since 1.0.0 */ diff --git a/Theme/Backend/wiki-category-list.tpl.php b/Theme/Backend/wiki-category-list.tpl.php index f1b1134..e560b73 100755 --- a/Theme/Backend/wiki-category-list.tpl.php +++ b/Theme/Backend/wiki-category-list.tpl.php @@ -21,22 +21,33 @@ $categories = $this->data['categories'] ?? []; echo $this->data['nav']->render(); ?> + +
-
getHtml('Categories'); ?>download
+
+ getHtml('Categories'); ?> + download +
$value) : - $url = UriFactory::build('{/base}/admin/account/settings?{?}&id=' . $value->id); ?> + $url = UriFactory::build('{/base}/wiki/category/single?id=' . $value->id); ?>
getHtml('ID', '0', '0'); ?> + getHtml('App'); ?> getHtml('Name'); ?> getHtml('Parent'); ?>
id; ?> + printHtml($this->data['apps'][$value->app->id]->name); ?> printHtml($value->getL11n()); ?> printHtml($value->parent !== null ? $value->parent->getL11n() : ''); ?> @@ -45,7 +56,6 @@ echo $this->data['nav']->render();
-
\ No newline at end of file diff --git a/Theme/Backend/wiki-category-single.tpl.php b/Theme/Backend/wiki-category-single.tpl.php index 839f769..3943af1 100755 --- a/Theme/Backend/wiki-category-single.tpl.php +++ b/Theme/Backend/wiki-category-single.tpl.php @@ -1,14 +1,29 @@ data['nav']->render(); -?> +use phpOMS\Uri\UriFactory; +/** @var \Modules\Knowledgebase\Models\WikiCategory */ +$category = $this->data['category']; + +/** @var \phpOMS\Views\View $this */ +echo $this->data['nav']->render(); ?>
-
- -
+ data['l11nView']->render( + $this->data['l11nValues'], + [], + '{/api}wiki/category/l11n' + ); + ?>
\ No newline at end of file diff --git a/Theme/Backend/wiki-dashboard.tpl.php b/Theme/Backend/wiki-dashboard.tpl.php index 888fcae..710cf20 100755 --- a/Theme/Backend/wiki-dashboard.tpl.php +++ b/Theme/Backend/wiki-dashboard.tpl.php @@ -58,9 +58,9 @@ echo $this->data['nav']->render(); ?>
getHtml('App'); ?>
- -
@@ -72,7 +72,7 @@ echo $this->data['nav']->render(); ?> diff --git a/Theme/Backend/wiki-doc-list.tpl.php b/Theme/Backend/wiki-doc-list.tpl.php new file mode 100644 index 0000000..f7bc1e0 --- /dev/null +++ b/Theme/Backend/wiki-doc-list.tpl.php @@ -0,0 +1,84 @@ +data['categories'] ?? []; + +/** @var \Modules\Knowledgebase\Models\WikiDoc[] $documents */ +$documents = $this->data['docs'] ?? []; + +/** @var \Modules\Knowledgebase\Models\WikiApp[] $apps */ +$apps = $this->data['apps'] ?? []; + +echo $this->data['nav']->render(); ?> +
+
+
+
+
+
+ getHtml('Docs'); ?> + download +
+
+ + + + + $value) : + $url = UriFactory::build('{/base}/wiki/doc/single?id=' . $value->id); ?> + +
getHtml('Name'); ?> +
printHtml($value->name); ?> + + +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
+
+
+ +
+
+
getHtml('App'); ?>
+
+
+ +
+
+
+ +
+
getHtml('Categories'); ?>
+ +
+
+
\ No newline at end of file