This commit is contained in:
Dennis Eichhorn 2024-01-02 23:34:18 +00:00
parent 42c553240c
commit c213aca9f7
11 changed files with 397 additions and 46 deletions

View File

@ -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": []
}

View File

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

View File

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

View File

@ -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<string, bool>
*
* @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<string, bool>
*
* @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 [];
}
}

View File

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

View File

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

View File

@ -70,7 +70,7 @@ class WikiCategory implements \JsonSerializable
public string $virtualPath = '/';
/**
* Cosntructor
* Constructor
*
* @since 1.0.0
*/

View File

@ -21,22 +21,33 @@ $categories = $this->data['categories'] ?? [];
echo $this->data['nav']->render();
?>
<div class="row">
<div class="box">
<a class="button end-xs save" href="<?= UriFactory::build('{/base}/wiki/category/create'); ?>"><?= $this->getHtml('New', '0', '0'); ?></a>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="portlet">
<div class="portlet-head"><?= $this->getHtml('Categories'); ?><i class="g-icon download btn end-xs">download</i></div>
<div class="portlet-head">
<?= $this->getHtml('Categories'); ?>
<i class="g-icon download btn end-xs">download</i>
</div>
<div class="slider">
<table class="default sticky">
<thead>
<tr>
<td><?= $this->getHtml('ID', '0', '0'); ?>
<td><?= $this->getHtml('App'); ?>
<td class="wf-100"><?= $this->getHtml('Name'); ?>
<td><?= $this->getHtml('Parent'); ?>
<tbody>
<?php foreach ($categories as $key => $value) :
$url = UriFactory::build('{/base}/admin/account/settings?{?}&id=' . $value->id); ?>
$url = UriFactory::build('{/base}/wiki/category/single?id=' . $value->id); ?>
<tr tabindex="0" data-href="<?= $url; ?>">
<td data-label="<?= $this->getHtml('ID', '0', '0'); ?>"><a href="<?= $url; ?>"><?= $value->id; ?></a>
<td data-label="<?= $this->getHtml('App'); ?>"><a href="<?= $url; ?>"><?= $this->printHtml($this->data['apps'][$value->app->id]->name); ?></a>
<td data-label="<?= $this->getHtml('Name'); ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n()); ?></a>
<td data-label="<?= $this->getHtml('Parent'); ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->parent !== null ? $value->parent->getL11n() : ''); ?></a>
<?php endforeach; ?>
@ -45,7 +56,6 @@ echo $this->data['nav']->render();
<?php endif; ?>
</table>
</div>
<div class="portlet-foot"></div>
</div>
</div>
</div>

View File

@ -1,14 +1,29 @@
<?php
/**
* @var \phpOMS\Views\View $this
* Jingga
*
* PHP Version 8.1
*
* @package Modules\Knowledgebase
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
echo $this->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(); ?>
<div class="row">
<div class="col-xs-12">
</div>
<?= $this->data['l11nView']->render(
$this->data['l11nValues'],
[],
'{/api}wiki/category/l11n'
);
?>
</div>

View File

@ -58,9 +58,9 @@ echo $this->data['nav']->render(); ?>
<div class="portlet-head"><?= $this->getHtml('App'); ?></div>
<div class="portlet-body">
<form>
<select name="app">
<select id="iApp" name="app" data-action='[{"listener": "change", "action": [{"key": 1, "type": "redirect", "uri": "{%}&wiki={#iApp}", "target": "self"}]}]'>
<?php foreach ($apps as $app) : ?>
<option><?= $this->printHtml($app->name); ?>
<option value="<?= $app->id; ?>"<?= $this->request->getDataInt('wiki') === $app->id ? ' selected' : ''; ?>><?= $this->printHtml($app->name); ?>
<?php endforeach; ?>
</select>
</form>
@ -72,7 +72,7 @@ echo $this->data['nav']->render(); ?>
<div class="portlet-body">
<ul>
<?php foreach ($categories as $category) : ?>
<li><a href="<?= UriFactory::build('{/base}/wiki/doc/list?{?}&id=' . $category->id); ?>"><?= $this->printHtml($category->getL11n()); ?></a>
<li><a href="<?= UriFactory::build('{/base}/wiki/doc/list?{?}&category=' . $category->id); ?>"><?= $this->printHtml($category->getL11n()); ?></a>
<?php endforeach; ?>
</ul>
</div>

View File

@ -0,0 +1,84 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\Knowledgebase
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
use \phpOMS\Uri\UriFactory;
use phpOMS\Utils\Parser\Markdown\Markdown;
/** @var \phpOMS\Views\View $this */
/** @var \Modules\Knowledgebase\Models\WikiCategory[] $categories */
$categories = $this->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(); ?>
<div class="row">
<div class="col-xs-12 col-md-8 col-lg-9">
<div class="row">
<div class="col-xs-12">
<div class="portlet">
<div class="portlet-head">
<?= $this->getHtml('Docs'); ?>
<i class="g-icon download btn end-xs">download</i>
</div>
<div class="slider">
<table class="default sticky">
<thead>
<tr>
<td class="wf-100"><?= $this->getHtml('Name'); ?>
<tbody>
<?php foreach ($documents as $key => $value) :
$url = UriFactory::build('{/base}/wiki/doc/single?id=' . $value->id); ?>
<tr tabindex="0" data-href="<?= $url; ?>">
<td data-label="<?= $this->getHtml('Name'); ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->name); ?></a>
<?php endforeach; ?>
<?php if (empty($documents)) : ?>
<tr><td colspan="1" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
<?php endif; ?>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-4 col-lg-3">
<section class="portlet">
<div class="portlet-head"><?= $this->getHtml('App'); ?></div>
<div class="portlet-body">
<form>
<select id="iApp" name="app" data-action='[{"listener": "change", "action": [{"key": 1, "type": "redirect", "uri": "{%}&wiki={#iApp}", "target": "self"}]}]'>
<?php foreach ($apps as $app) : ?>
<option value="<?= $app->id; ?>"<?= $this->request->getDataInt('wiki') === $app->id ? ' selected' : ''; ?>><?= $this->printHtml($app->name); ?>
<?php endforeach; ?>
</select>
</form>
</div>
</section>
<section class="portlet">
<div class="portlet-head"><?= $this->getHtml('Categories'); ?></div>
<div class="portlet-body">
<ul>
<?php foreach ($categories as $category) : ?>
<li><a href="<?= UriFactory::build('{/base}/wiki/doc/list?{?}&category=' . $category->id); ?>"><?= $this->printHtml($category->getL11n()); ?></a>
<?php endforeach; ?>
</ul>
</div>
</section>
</div>
</div>