From 96981ae385bc8e68d5cceb3449380b25012b7ca5 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 20 Jan 2019 18:17:00 +0100 Subject: [PATCH] Rename reporter->helper --- Admin/Install/Navigation.install.json | 63 +++ Admin/Install/Navigation.php | 43 ++ Admin/Install/db.json | 126 ++++++ Admin/Installer.php | 29 ++ Admin/Routes/Web/Api.php | 42 ++ Admin/Routes/Web/Backend.php | 71 ++++ Admin/Status.php | 30 ++ Admin/Uninstaller.php | 29 ++ Admin/Updater.php | 30 ++ Controller/ApiController.php | 270 +++++++++++++ Controller/BackendController.php | 229 +++++++++++ Controller/Controller.php | 86 ++++ Models/HelperStatus.php | 31 ++ Models/NullReport.php | 27 ++ Models/NullTemplate.php | 27 ++ Models/PermissionState.php | 31 ++ Models/Report.php | 300 ++++++++++++++ Models/ReportMapper.php | 88 +++++ Models/Template.php | 391 +++++++++++++++++++ Models/TemplateDataType.php | 34 ++ Models/TemplateMapper.php | 99 +++++ README.md | 11 + Theme/Backend/Lang/Navigation.en.lang.php | 20 + Theme/Backend/Lang/api.en.lang.php | 14 + Theme/Backend/Lang/en.lang.php | 53 +++ Theme/Backend/dashboard-helper.tpl.php | 3 + Theme/Backend/helper-create.tpl.php | 46 +++ Theme/Backend/helper-edit.tpl.php | 233 +++++++++++ Theme/Backend/helper-list.tpl.php | 58 +++ Theme/Backend/helper-single.tpl.php | 125 ++++++ Theme/Backend/helper-template-create.tpl.php | 53 +++ Views/HelperView.php | 31 ++ info.json | 47 +++ 33 files changed, 2770 insertions(+) create mode 100644 Admin/Install/Navigation.install.json create mode 100644 Admin/Install/Navigation.php create mode 100644 Admin/Install/db.json create mode 100644 Admin/Installer.php create mode 100644 Admin/Routes/Web/Api.php create mode 100644 Admin/Routes/Web/Backend.php create mode 100644 Admin/Status.php create mode 100644 Admin/Uninstaller.php create mode 100644 Admin/Updater.php create mode 100644 Controller/ApiController.php create mode 100644 Controller/BackendController.php create mode 100644 Controller/Controller.php create mode 100644 Models/HelperStatus.php create mode 100644 Models/NullReport.php create mode 100644 Models/NullTemplate.php create mode 100644 Models/PermissionState.php create mode 100644 Models/Report.php create mode 100644 Models/ReportMapper.php create mode 100644 Models/Template.php create mode 100644 Models/TemplateDataType.php create mode 100644 Models/TemplateMapper.php create mode 100644 README.md create mode 100644 Theme/Backend/Lang/Navigation.en.lang.php create mode 100644 Theme/Backend/Lang/api.en.lang.php create mode 100644 Theme/Backend/Lang/en.lang.php create mode 100644 Theme/Backend/dashboard-helper.tpl.php create mode 100644 Theme/Backend/helper-create.tpl.php create mode 100644 Theme/Backend/helper-edit.tpl.php create mode 100644 Theme/Backend/helper-list.tpl.php create mode 100644 Theme/Backend/helper-single.tpl.php create mode 100644 Theme/Backend/helper-template-create.tpl.php create mode 100644 Views/HelperView.php create mode 100644 info.json diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json new file mode 100644 index 0000000..a2fec5c --- /dev/null +++ b/Admin/Install/Navigation.install.json @@ -0,0 +1,63 @@ +[ + { + "id": 1002701001, + "pid": "/backend", + "type": 2, + "subtype": 1, + "name": "Helper", + "uri": "/{/lang}/backend/helper/list?{?}", + "target": "self", + "icon": null, + "order": 60, + "from": "Helper", + "permission": { "permission": 2, "type": null, "element": null }, + "parent": 1003301001, + "children": [ + { + "id": 1002702001, + "pid": "/backend/helper", + "type": 3, + "subtype": 1, + "name": "List", + "uri": "/{/lang}/backend/helper/list?{?}", + "target": "self", + "icon": null, + "order": 1, + "from": "Helper", + "permission": { "permission": 2, "type": null, "element": null }, + "parent": 1002701001, + "children": [] + }, + { + "id": 1002703001, + "pid": "/backend/helper", + "type": 3, + "subtype": 5, + "name": "CreateReport", + "uri": "/{/lang}/backend/helper/report/create?{?}", + "target": "self", + "icon": null, + "order": 5, + "from": "Helper", + "permission": { "permission": 4, "type": null, "element": null }, + "parent": 1002701001, + "children": [] + }, + { + "id": 1002704001, + "pid": "/backend/helper", + "type": 3, + "subtype": 5, + "name": "CreateTemplate", + "uri": "/{/lang}/backend/helper/template/create?{?}", + "target": "self", + "icon": null, + "order": 10, + "from": "Helper", + "permission": { "permission": 4, "type": null, "element": null }, + "parent": 1002701001, + "children": [] + } + ] + } +] diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php new file mode 100644 index 0000000..e53d2ae --- /dev/null +++ b/Admin/Install/Navigation.php @@ -0,0 +1,43 @@ + __DIR__ . '/Navigation.install.json']); + } +} diff --git a/Admin/Install/db.json b/Admin/Install/db.json new file mode 100644 index 0000000..c566e71 --- /dev/null +++ b/Admin/Install/db.json @@ -0,0 +1,126 @@ +{ + "helper_template": { + "name": "helper_template", + "fields": { + "helper_template_id": { + "name": "helper_template_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "helper_template_status": { + "name": "helper_template_status", + "type": "TINYINT", + "null": false + }, + "helper_template_title": { + "name": "helper_template_title", + "type": "VARCHAR(255)", + "null": false + }, + "helper_template_data": { + "name": "helper_template_data", + "type": "TINYINT", + "null": false + }, + "helper_template_standalone": { + "name": "helper_template_standalone", + "type": "TINYINT", + "null": false + }, + "helper_template_expected": { + "name": "helper_template_expected", + "type": "VARCHAR(255)", + "null": false + }, + "helper_template_desc": { + "name": "helper_template_desc", + "type": "TEXT", + "null": false + }, + "helper_template_desc_raw": { + "name": "helper_template_desc_raw", + "type": "TEXT", + "null": false + }, + "helper_template_media": { + "name": "helper_template_media", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + }, + "helper_template_creator": { + "name": "helper_template_creator", + "type": "INT", + "null": false, + "foreignTable": "account", + "foreignKey": "account_id" + }, + "helper_template_created": { + "name": "helper_template_created", + "type": "DATETIME", + "null": false + } + } + }, + "helper_report": { + "name": "helper_report", + "fields": { + "helper_report_id": { + "name": "helper_report_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "helper_report_status": { + "name": "helper_report_status", + "type": "TINYINT", + "null": false + }, + "helper_report_title": { + "name": "helper_report_title", + "type": "VARCHAR(255)", + "null": false + }, + "helper_report_desc": { + "name": "helper_report_desc", + "type": "TEXT", + "null": false + }, + "helper_report_desc_raw": { + "name": "helper_report_desc_raw", + "type": "TEXT", + "null": false + }, + "helper_report_media": { + "name": "helper_report_media", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + }, + "helper_report_template": { + "name": "helper_report_template", + "type": "INT", + "null": false, + "foreignTable": "helper_template", + "foreignKey": "helper_template_id" + }, + "helper_report_creator": { + "name": "helper_report_creator", + "type": "INT", + "null": false, + "foreignTable": "account", + "foreignKey": "account_id" + }, + "helper_report_created": { + "name": "helper_report_created", + "type": "DATETIME", + "null": false + } + } + } +} \ No newline at end of file diff --git a/Admin/Installer.php b/Admin/Installer.php new file mode 100644 index 0000000..ade2094 --- /dev/null +++ b/Admin/Installer.php @@ -0,0 +1,29 @@ + [ + [ + 'dest' => '\Modules\Helper\Controller\ApiController:apiHelperExport', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::REPORT, + ], + ], + ], + '^.*/api/helper/report/template.*$' => [ + [ + 'dest' => '\Modules\Helper\Controller\ApiController:apiTemplateCreate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::TEMPLATE, + ], + ], + ], + '^.*/api/helper/report/report.*$' => [ + [ + 'dest' => '\Modules\Helper\Controller\ApiController:apiReportCreate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::REPORT, + ], + ], + ], +]; diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php new file mode 100644 index 0000000..e3f039f --- /dev/null +++ b/Admin/Routes/Web/Backend.php @@ -0,0 +1,71 @@ + [ + [ + 'dest' => '\Modules\Media\Controller\BackendController::setUpFileUploader', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::TEMPLATE, + ], + ], + [ + 'dest' => '\Modules\Helper\Controller\BackendController:viewTemplateCreate', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::TEMPLATE, + ], + ], + ], + '^.*/backend/helper/report/create.*$' => [ + [ + 'dest' => '\Modules\Media\Controller\BackendController::setUpFileUploader', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::REPORT, + ], + ], + [ + 'dest' => '\Modules\Helper\Controller\BackendController:viewReportCreate', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::REPORT, + ], + ], + ], + '^.*/backend/helper/list.*$' => [ + [ + 'dest' => '\Modules\Helper\Controller\BackendController:viewTemplateList', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::REPORT, + ], + ], + ], + '^.*/backend/helper/report/view.*$' => [ + [ + 'dest' => '\Modules\Helper\Controller\BackendController:viewHelperReport', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::REPORT, + ], + ], + ], +]; diff --git a/Admin/Status.php b/Admin/Status.php new file mode 100644 index 0000000..67bc4b9 --- /dev/null +++ b/Admin/Status.php @@ -0,0 +1,30 @@ +getData('id')); + $accountId = $request->getHeader()->getAccount(); + + if ($template->getCreatedBy()->getId() !== $accountId // todo: also check if report createdBy + && !$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::READ, $this->app->orgId, null, self::MODULE_NAME, PermissionState::REPORT, $template->getId()) + ) { + $response->getHeader()->setStatusCode(RequestStatusCode::R_403); + } + + switch ($request->getData('type')) { + case 'pdf': + $response->getHeader()->set('Content-Type', MimeType::M_PDF, true); + break; + case 'csv': + $response->getHeader()->set('Content-Type', MimeType::M_CONF, true); + break; + case 'xlsx': + $response->getHeader()->set( + 'Content-disposition', 'attachment; filename="' + . ((string) $request->getData('id')) . '.' + . ((string) $request->getData('type')) + . '"' + , true); + $response->getHeader()->set('Content-Type', MimeType::M_XLSX, true); + + $response->getHeader()->set('Content-Type', MimeType::M_XLSX, true); + break; + case 'json': + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + break; + default: + // TODO handle bad request + } + + if ($request->getData('download') !== null) { + $response->getHeader()->set('Content-Type', MimeType::M_BIN, true); + $response->getHeader()->set('Content-Transfer-Encoding', 'Binary', true); + $response->getHeader()->set( + 'Content-disposition', 'attachment; filename="' + . ((string) $request->getData('id')) . '.' + . ((string) $request->getData('type')) + . '"' + , true); + } + + /** @var array $reportLanguage */ + /** @noinspection PhpIncludeInspection */ + include_once __DIR__ . '/Templates/' . $request->getData('id') . '/' . $request->getData('id') . '.lang.php'; + + $exportView = new View($this->app, $request, $response); + $exportView->addData('lang', $reportLanguage[$this->app->accountManager->get($request->getHeader()->getAccount())->getL11n()->getLanguage()]); + $exportView->setTemplate( + '/Modules/Helper/Templates/' + . ((string) $request->getData('id')) . '/' + . ((string) $request->getData('id')) . '.' + . ((string) $request->getData('type')) + ); + $response->set('export', $exportView->render()); + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $collectionId = $this->createMediaCollectionFromRequest($request); + $template = $this->createTemplateFromRequest($request, $collectionId); + + $this->createModel($request, $template, TemplateMapper::class, 'template'); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Template', 'Template successfully created', $template); + } + + private function createMediaCollectionFromRequest(RequestAbstract $request) : int + { + if ($request->getData('media-list') === null) { + return -1; + } + + $files = \json_decode((string) $request->getData('media-list'), true); + // TODO: make sure this user has permissions for provided files + + /* Create collection */ + $mediaCollection = new Collection(); + $mediaCollection->setName((string) ($request->getData('name') ?? 'Empty')); + $mediaCollection->setDescription(Markdown::parse((string) ($request->getData('description') ?? ''))); + $mediaCollection->setDescriptionRaw((string) ($request->getData('description') ?? '')); + $mediaCollection->setCreatedBy($request->getHeader()->getAccount()); + $mediaCollection->setSources($files); + + return (int) CollectionMapper::create($mediaCollection); + } + + private function createTemplateFromRequest(RequestAbstract $request, int $collectionId) : Template + { + $expected = $request->getData('expected'); + + $helperTemplate = new Template(); + $helperTemplate->setName($request->getData('name') ?? 'Empty'); + $helperTemplate->setDescription(Markdown::parse((string) ($request->getData('description') ?? ''))); + $helperTemplate->setDescriptionRaw((string) ($request->getData('description') ?? '')); + + if ($collectionId > 0) { + $helperTemplate->setSource((int) $collectionId); + } + + $helperTemplate->setStandalone((bool) $request->getData('standalone') ?? false); + $helperTemplate->setExpected(!empty($expected) ? \json_decode($expected, true) : []); + $helperTemplate->setCreatedBy($request->getHeader()->getAccount()); + $helperTemplate->setDatatype((int) ($request->getData('datatype') ?? TemplateDataType::OTHER)); + + return $helperTemplate; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiReportCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + // todo: check permission here + + $this->handleTemplateDatabaseFromRequest($request); + $collectionId = $this->createMediaCollectionFromRequest($request); + + $report = $this->createReportFromRequest($request, $response, $collectionId); + $this->createModel($request, $report, ReportMapper::class, 'report'); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Report', 'Report successfully created', $report); + } + + private function createReportFromRequest(RequestAbstract $request, ResponseAbstract $response, int $collectionId) : Report + { + $helperReport = new Report(); + $helperReport->setTitle((string) ($request->getData('name'))); + $helperReport->setSource((int) $collectionId); + $helperReport->setTemplate((int) $request->getData('template')); + $helperReport->setCreatedBy($request->getHeader()->getAccount()); + + return $helperReport; + } + + private function handleTemplateDatabaseFromRequest(RequestAbstract $request) : void + { + $files = \json_decode((string) ($request->getData('files'))); + + // TODO: make sure user has permission for files + // TODO: make sure user has permission for template + + /* Init Template */ + $template = TemplateMapper::get((int) $request->getData('template')); + + if ($template->getDatatype() === TemplateDataType::GLOBAL_DB) { + $templateFiles = MediaMapper::get($template->getSource()); + + foreach ($templateFiles as $templateFile) { + $dbFile = MediaMapper::get($templateFile); + + // Found centralized db + if ($dbFile->getExtension() === '.sqlite') { + $this->app->dbPool->create('helper_1', ['db' => 'sqlite', 'path' => $dbFile->getPath()]); + $csvDbMapper = new CsvDatabaseMapper($this->app->dbPool->get('helper_1')); + $excelDbMapper = new ExcelDatabaseMapper($this->app->dbPool->get('helper_1')); + $csvDbMapper->autoIdentifyCsvSettings(true); + + foreach ($files as $file) { + $mediaFile = MediaMapper::get($file); + + if (StringUtils::endsWith($mediaFile->getFilename(), '.db') && $mediaFile->getExtension() === '.csv') { + $csvDbMapper->addSource($mediaFile->getPath()); + } elseif (StringUtils::endsWith($mediaFile->getFilename(), '.db') && ($mediaFile->getExtension() === '.xls' || $mediaFile->getExtension() === '.xlsx')) { + $excelDbMapper->addSource($mediaFile->getPath()); + } + } + + $csvDbMapper->insert(); + $excelDbMapper->insert(); + + break; + } + } + } + } +} diff --git a/Controller/BackendController.php b/Controller/BackendController.php new file mode 100644 index 0000000..108abcc --- /dev/null +++ b/Controller/BackendController.php @@ -0,0 +1,229 @@ +app, $request, $response); + + $view->setTemplate('/Modules/Helper/Theme/Backend/helper-list'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1002701001, $request, $response)); + + $reports = TemplateMapper::getNewest(25); + $view->addData('reports', $reports); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Helper/Theme/Backend/helper-template-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1002701001, $request, $response)); + $view->addData('media-upload', new BaseView($this->app, $request, $response)); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewReportCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Helper/Theme/Backend/helper-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1002701001, $request, $response)); + $view->addData('media-upload', new BaseView($this->app, $request, $response)); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @throws \Exception + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewHelperReport(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + //$file = preg_replace('([^\w\s\d\-_~,;:\.\[\]\(\).])', '', $template->getName()); + + $template = TemplateMapper::get((int) $request->getData('id')); + $accountId = $request->getHeader()->getAccount(); + + if ($template->getCreatedBy()->getId() !== $accountId // todo: also check if report createdBy + && !$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::READ, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::REPORT, $template->getId()) + ) { + $view->setTemplate('/Web/Backend/Error/403_inline'); + $response->getHeader()->setStatusCode(RequestStatusCode::R_403); + return $view; + } + + $view->setTemplate('/Modules/Helper/Theme/Backend/helper-single'); + + $tcoll = []; + $files = $template->getSource()->getSources(); + + foreach ($files as $tMedia) { + $lowerPath = strtolower($tMedia->getPath()); + + if (StringUtils::endsWith($lowerPath, '.lang.php')) { + $tcoll['lang'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, 'worker.php')) { + $tcoll['worker'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.xlsx.php') || StringUtils::endsWith($lowerPath, '.xls.php')) { + $tcoll['excel'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.docx.php') || StringUtils::endsWith($lowerPath, '.doc.php')) { + $tcoll['word'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.pptx.php') || StringUtils::endsWith($lowerPath, '.ppt.php')) { + $tcoll['powerpoint'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.pdf.php')) { + $tcoll['pdf'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.csv.php')) { + $tcoll['csv'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.json.php')) { + $tcoll['json'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.tpl.php')) { + $tcoll['template'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.css')) { + $tcoll['css'] = $tMedia; + + /** @var Head $head */ + $head = $response->get('Content')->getData('head'); + $head->addAsset(AssetType::CSS, $request->getUri()->getBase() . $tMedia->getPath()); + } elseif (StringUtils::endsWith($lowerPath, '.js')) { + $tcoll['js'] = $tMedia; + } elseif (StringUtils::endsWith($lowerPath, '.sqlite') || StringUtils::endsWith($lowerPath, '.db')) { + $tcoll['db'][] = $tMedia; + } else { + // Do nothing; only the creator knows how to deal with this type of file :) + } + } + + if (!$template->isStandalone()) { + if (!isset($tcoll['template'])) { + throw new \Exception('No template file detected.'); + } + + $report = ReportMapper::getNewest(1, + (new Builder($this->app->dbPool->get()))->where('helper_report.helper_report_template', '=', $template->getId()) + ); + + $rcoll = []; + $report = end($report); + $report = $report === false ? new NullReport() : $report; + + if (!($report instanceof NullReport)) { + /** @var Media[] $files */ + $files = $report->getSource()->getSources(); + + foreach ($files as $media) { + $rcoll[$media->getName() . '.' . $media->getExtension()] = $media; + } + } + + $view->addData('report', $report); + $view->addData('rcoll', $rcoll); + } + + $view->addData('tcoll', $tcoll); + $view->addData('lang', $request->getData('lang') ?? $request->getHeader()->getL11n()->getLanguage()); + $view->addData('template', $template); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1002701001, $request, $response)); + + return $view; + } +} diff --git a/Controller/Controller.php b/Controller/Controller.php new file mode 100644 index 0000000..7a03475 --- /dev/null +++ b/Controller/Controller.php @@ -0,0 +1,86 @@ +createdAt = new \DateTime('now'); + } + + /** + * @return int + * + * @since 1.0.0 + */ + public function getId() : int + { + return $this->id; + } + + /** + * @return int + * + * @since 1.0.0 + */ + public function getStatus() : int + { + return $this->status; + } + + /** + * @param int $status Report status + * + * @return void + * + * @since 1.0.0 + */ + public function setStatus(int $status) : void + { + $this->status = $status; + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getTitle() : string + { + return $this->title; + } + + /** + * @param string $title Title + * + * @return void + * + * @since 1.0.0 + */ + public function setTitle(string $title) : void + { + $this->title = $title; + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getDescription() : string + { + return $this->description; + } + + /** + * @param string $description Description + * + * @return void + * + * @since 1.0.0 + */ + public function setDescription(string $description) : void + { + $this->description = $description; + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getDescriptionRaw() : string + { + return $this->descriptionRaw; + } + + /** + * @param string $descriptionRaw Description + * + * @return void + * + * @since 1.0.0 + */ + public function setDescriptionRaw(string $descriptionRaw) : void + { + $this->descriptionRaw = $descriptionRaw; + } + + /** + * @return \DateTime + * + * @since 1.0.0 + */ + public function getCreatedAt() : \DateTime + { + return $this->createdAt ?? new \DateTime('now'); + } + + /** + * @return mixed + * + * @since 1.0.0 + */ + public function getCreatedBy() + { + return $this->createdBy; + } + + /** + * @param mixed $creator Created by + * + * @return void + * + * @since 1.0.0 + */ + public function setCreatedBy($creator) : void + { + $this->createdBy = $creator; + } + + /** + * @return mixed + * + * @since 1.0.0 + */ + public function getTemplate() + { + return $this->template; + } + + /** + * @param mixed $template Report template + * + * @return void + * + * @since 1.0.0 + */ + public function setTemplate($template) : void + { + $this->template = $template; + } + + /** + * @param mixed $source Report source + * + * @return void + * + * @since 1.0.0 + */ + public function setSource($source) : void + { + $this->source = $source; + } + + /** + * @return mixed + * + * @since 1.0.0 + */ + public function getSource() + { + return $this->source; + } + + public function toArray() : array + { + return [ + 'id' => $this->id, + 'createdBy' => $this->createdBy, + 'createdAt' => $this->createdAt->format('Y-m-d H:i:s'), + 'name' => $this->title, + 'description' => $this->description, + 'status' => $this->status, + ]; + } + + public function jsonSerialize() + { + return $this->toArray(); + } +} diff --git a/Models/ReportMapper.php b/Models/ReportMapper.php new file mode 100644 index 0000000..cebd455 --- /dev/null +++ b/Models/ReportMapper.php @@ -0,0 +1,88 @@ +> + * @since 1.0.0 + */ + protected static $columns = [ + 'helper_report_id' => ['name' => 'helper_report_id', 'type' => 'int', 'internal' => 'id'], + 'helper_report_status' => ['name' => 'helper_report_status', 'type' => 'int', 'internal' => 'status'], + 'helper_report_title' => ['name' => 'helper_report_title', 'type' => 'string', 'internal' => 'title'], + 'helper_report_desc' => ['name' => 'helper_report_desc', 'type' => 'string', 'internal' => 'description'], + 'helper_report_desc_raw' => ['name' => 'helper_report_desc_raw', 'type' => 'string', 'internal' => 'descriptionRaw'], + 'helper_report_media' => ['name' => 'helper_report_media', 'type' => 'int', 'internal' => 'source'], + 'helper_report_template' => ['name' => 'helper_report_template', 'type' => 'int', 'internal' => 'template'], + 'helper_report_creator' => ['name' => 'helper_report_creator', 'type' => 'int', 'internal' => 'createdBy'], + 'helper_report_created' => ['name' => 'helper_report_created', 'type' => 'DateTime', 'internal' => 'createdAt'], + ]; + + /** + * Has one relation. + * + * @var array> + * @since 1.0.0 + */ + protected static $ownsOne = [ + 'source' => [ + 'mapper' => \Modules\Media\Models\CollectionMapper::class, + 'src' => 'helper_report_media', + ], + 'template' => [ + 'mapper' => \Modules\Helper\Models\TemplateMapper::class, + 'src' => 'helper_report_template', + ], + ]; + + protected static $belongsTo = [ + 'createdBy' => [ + 'mapper' => AccountMapper::class, + 'src' => 'helper_report_creator', + ], + ]; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static $table = 'helper_report'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static $primaryField = 'helper_report_id'; + + /** + * Created at. + * + * @var string + * @since 1.0.0 + */ + protected static $createdAt = 'helper_report_created'; +} diff --git a/Models/Template.php b/Models/Template.php new file mode 100644 index 0000000..67880d7 --- /dev/null +++ b/Models/Template.php @@ -0,0 +1,391 @@ +createdAt = new \DateTime('now'); + } + + /** + * @return int + * + * @since 1.0.0 + */ + public function getId() : int + { + return $this->id; + } + + public function getNewestReport() : Report + { + if (!empty($this->reports)) { + return end($this->reports()); + } + + return new NullReport(); + } + + /** + * @param string $name Template name + * + * @return void + * + * @since 1.0.0 + */ + public function setName(string $name) : void + { + $this->name = $name; + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getName() : string + { + return $this->name; + } + + /** + * @param string $description Template description + * + * @return void + * + * @since 1.0.0 + */ + public function setDescription(string $description) : void + { + $this->description = $description; + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getDescription() : string + { + return $this->description; + } + + /** + * @param string $description Template description + * + * @return void + * + * @since 1.0.0 + */ + public function setDescriptionRaw(string $description) : void + { + $this->descriptionRaw = $description; + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getDescriptionRaw() : string + { + return $this->descriptionRaw; + } + + /** + * @param int $source Source + * + * @return mixed + * + * @since 1.0.0 + */ + public function setSource($source) + { + $this->source = $source; + } + + /** + * @return mixed + * + * @since 1.0.0 + */ + public function getSource() + { + return $this->source; + } + + /** + * @param mixed $createdBy Creator + * + * @return void + * + * @since 1.0.0 + */ + public function setCreatedBy($createdBy) : void + { + $this->createdBy = $createdBy; + } + + /** + * @return mixed + * + * @since 1.0.0 + */ + public function getCreatedBy() + { + return $this->createdBy; + } + + /** + * @return \DateTime + * + * @since 1.0.0 + */ + public function getCreatedAt() : \DateTime + { + return $this->createdAt ?? new \DateTime('now'); + } + + /** + * @param array $expected Expected files + * + * @return void + * + * @since 1.0.0 + */ + public function setExpected(array $expected) : void + { + $this->expected = $expected; + } + + /** + * @return \array + * + * @since 1.0.0 + */ + public function getExpected() : array + { + return $this->expected; + } + + /** + * @param string $expected Expected file + * + * @return void + * + * @since 1.0.0 + */ + public function addExpected(string $expected) : void + { + $this->expected[] = $expected; + } + + /** + * @param int $status Template status (is active?) + * + * @return void + * + * @since 1.0.0 + */ + public function setStatus(int $status) : void + { + $this->status = $status; + } + + /** + * @return int + * + * @since 1.0.0 + */ + public function getStatus() : int + { + return $this->status; + } + + /** + * @param int $datatype Template datatype source + * + * @return void + * + * @since 1.0.0 + */ + public function setDatatype(int $datatype) : void + { + $this->datatype = $datatype; + } + + /** + * @return int + * + * @since 1.0.0 + */ + public function getDatatype() : int + { + return $this->datatype; + } + + /** + * @param bool $isStandalone Is template standalone + * + * @return void + * + * @since 1.0.0 + */ + public function setStandalone(bool $isStandalone) : void + { + $this->isStandalone = $isStandalone; + } + + /** + * @return bool + * + * @since 1.0.0 + */ + public function isStandalone() : bool + { + return $this->isStandalone; + } + + public function toArray() : array + { + return [ + 'id' => $this->id, + 'createdBy' => $this->createdBy, + 'createdAt' => $this->createdAt->format('Y-m-d H:i:s'), + 'name' => $this->name, + 'description' => $this->description, + 'status' => $this->status, + 'datatype' => $this->datatype, + 'standalone' => $this->isStandalone, + ]; + } + + public function jsonSerialize() + { + return $this->toArray(); + } +} diff --git a/Models/TemplateDataType.php b/Models/TemplateDataType.php new file mode 100644 index 0000000..a616a5e --- /dev/null +++ b/Models/TemplateDataType.php @@ -0,0 +1,34 @@ +> + * @since 1.0.0 + */ + protected static $columns = [ + 'helper_template_id' => ['name' => 'helper_template_id', 'type' => 'int', 'internal' => 'id'], + 'helper_template_status' => ['name' => 'helper_template_status', 'type' => 'int', 'internal' => 'status'], + 'helper_template_title' => ['name' => 'helper_template_title', 'type' => 'string', 'internal' => 'name'], + 'helper_template_data' => ['name' => 'helper_template_data', 'type' => 'int', 'internal' => 'datatype'], + 'helper_template_standalone' => ['name' => 'helper_template_standalone', 'type' => 'bool', 'internal' => 'isStandalone'], + 'helper_template_expected' => ['name' => 'helper_template_expected', 'type' => 'Json', 'internal' => 'expected'], + 'helper_template_desc' => ['name' => 'helper_template_desc', 'type' => 'string', 'internal' => 'description'], + 'helper_template_desc_raw' => ['name' => 'helper_template_desc_raw', 'type' => 'string', 'internal' => 'descriptionRaw'], + 'helper_template_media' => ['name' => 'helper_template_media', 'type' => 'int', 'internal' => 'source'], + 'helper_template_creator' => ['name' => 'helper_template_creator', 'type' => 'int', + 'internal' => 'createdBy'], + 'helper_template_created' => ['name' => 'helper_template_created', 'type' => 'DateTime', + 'internal' => 'createdAt'], + ]; + + /** + * Has one relation. + * + * @var array> + * @since 1.0.0 + */ + protected static $ownsOne = [ + 'source' => [ + 'mapper' => CollectionMapper::class, + 'src' => 'helper_template_media', + ], + ]; + + protected static $belongsTo = [ + 'createdBy' => [ + 'mapper' => AccountMapper::class, + 'src' => 'helper_template_creator', + ], + ]; + + + protected static $hasMany = [ + 'reports' => [ + 'mapper' => ReportMapper::class, + 'table' => 'helper_report', + 'dst' => 'helper_report_template', + 'src' => null, + ], + ]; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static $table = 'helper_template'; + + /** + * Created at. + * + * @var string + * @since 1.0.0 + */ + protected static $createdAt = 'helper_template_created'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static $primaryField = 'helper_template_id'; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..aac7174 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Helepr + +The Data Evaluation module generates reporting based on provided data. The data can come from the database or csv files. + +## Helepr Files ## + +1. XYZ.pdf.tpl.php +2. XYZ.tpl.php +3. XYZ.lang.php +4. XYZ.css +5. XYZ.js diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php new file mode 100644 index 0000000..ba8c70c --- /dev/null +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -0,0 +1,20 @@ + [ + 'Create' => 'Create', + 'CreateTemplate' => 'Create Template', + 'CreateReport' => 'Create Report', + 'List' => 'List', + 'Helper' => 'Helper', + 'Reporting' => 'Reporting', +]]; diff --git a/Theme/Backend/Lang/api.en.lang.php b/Theme/Backend/Lang/api.en.lang.php new file mode 100644 index 0000000..1101393 --- /dev/null +++ b/Theme/Backend/Lang/api.en.lang.php @@ -0,0 +1,14 @@ + [ + 'Add' => 'Add', + 'CentralizedDB' => 'Centralized DB', + 'CentralizedFiles' => 'Centralized Files', + 'Created' => 'Created', + 'Creator' => 'Creator', + 'CreatedBy' => 'Created By', + 'Data' => 'Data', + 'Database' => 'Database', + 'Dataset' => 'Dataset', + 'Datasets' => 'Datasets', + 'Description' => 'Description', + 'Expected' => 'Expected', + 'Export' => 'Export', + 'Edit' => 'Edit', + 'Files' => 'Files', + 'FileNames' => 'File Names', + 'IndividualDB' => 'Individual DB', + 'Info' => 'Info', + 'Language' => 'Language', + 'Media' => 'Media', + 'MediaDirectory' => 'Media Directory', + 'Modified' => 'Modified', + 'Name' => 'Name', + 'New' => 'New', + 'Other' => 'Other', + 'Overview' => 'Overview', + 'Permission' => 'Permission', + 'Helper' => 'Helper', + 'Reports' => 'Reports', + 'Report' => 'Report', + 'Select' => 'Select', + 'Storage' => 'Storage', + 'Source' => 'Source', + 'Sources' => 'Sources', + 'Standalone' => 'Standalone', + 'Template' => 'Template', + 'Title' => 'Title', + 'Type' => 'Type', + 'Updated' => 'Updated', +]]; diff --git a/Theme/Backend/dashboard-helper.tpl.php b/Theme/Backend/dashboard-helper.tpl.php new file mode 100644 index 0000000..efc5d63 --- /dev/null +++ b/Theme/Backend/dashboard-helper.tpl.php @@ -0,0 +1,3 @@ +
+Reporter +
\ No newline at end of file diff --git a/Theme/Backend/helper-create.tpl.php b/Theme/Backend/helper-create.tpl.php new file mode 100644 index 0000000..6d5767d --- /dev/null +++ b/Theme/Backend/helper-create.tpl.php @@ -0,0 +1,46 @@ +getData('nav')->render(); ?> + +
+
+
+

getHtml('Report'); ?>

+
+
+ + +
+
+
+
+
+
+
+
+
+
+ +
+ getData('media-upload')->render('helper-report-create'); ?> +
+
\ No newline at end of file diff --git a/Theme/Backend/helper-edit.tpl.php b/Theme/Backend/helper-edit.tpl.php new file mode 100644 index 0000000..fb604fd --- /dev/null +++ b/Theme/Backend/helper-edit.tpl.php @@ -0,0 +1,233 @@ +app, $this->request, $this->response); +$tabView->setTemplate('/Web/Templates/Divider/Tabular'); + +echo $this->getData('nav')->render(); ?> + +
+
+ +
+
+
+ app, $this->request, $this->response); + $permissionPanel = clone $overviwPanel; + + $overviwPanel->setTitle($this->getHtml('Create')); + $permissionPanel->setTitle($this->getHtml('Permission')); + + $this->addView('createFormPanel', $overviwPanel); + $this->getView('createFormPanel')->setTemplate('/Web/Templates/Panel/BoxHalf'); + + $this->addView('permissionFormPanel', $permissionPanel); + $this->getView('permissionFormPanel')->setTemplate('/Web/Templates/Panel/BoxHalf'); + + /* + * Overview + */ + + $formOverview = new \Web\Views\Form\FormView($this->app, $this->request, $this->response); + $formOverview->setTemplate('/Web/Templates/Forms/FormFull'); + $formOverview->setSubmit('submit1', $this->getHtml('Edit')); + $formOverview->setSubmit('submit2', $this->getHtml('Delete')); + $formOverview->setAction($this->request->getUri()->getScheme() . '://' . $this->request->getUri()->getHost()); + $formOverview->setMethod(\phpOMS\Message\Http\RequestMethod::POST); + + $formOverview->setElement(0, 0, [ + 'type' => \phpOMS\Html\TagType::INPUT, + 'subtype' => 'text', + 'name' => 'rname', + 'label' => $this->getHtml('Name'), + ]); + + $formOverview->setElement(1, 0, [ + 'type' => \phpOMS\Html\TagType::INPUT, + 'subtype' => 'text', + 'name' => 'mdirectory', + 'label' => $this->getHtml('MediaDirectory'), + 'active' => false, + ]); + + $formOverview->setElement(1, 1, [ + 'type' => \phpOMS\Html\TagType::BUTTON, + 'content' => $this->getHtml('Select'), + ]); + + $formOverview->setElement(2, 0, [ + 'type' => \phpOMS\Html\TagType::INPUT, + 'subtype' => 'text', + 'name' => 'template', + 'label' => $this->getHtml('Template'), + 'active' => false, + ]); + + $formOverview->setElement(2, 1, [ + 'type' => \phpOMS\Html\TagType::BUTTON, + 'content' => $this->getHtml('Select'), + ]); + + $this->getView('createFormPanel')->addView('form', $formOverview); + + /* + * Permission Add + */ + + $formPermissionAdd = new \Web\Views\Form\FormView($this->app, $this->request, $this->response); + $formPermissionAdd->setTemplate('/Web/Templates/Forms/FormFull'); + $formPermissionAdd->setSubmit('submit1', $this->getHtml('Add', 0, 0)); + $formPermissionAdd->setAction($this->request->getUri()->getScheme() . '://' . $this->request->getUri()->getHost()); + $formPermissionAdd->setMethod(\phpOMS\Message\Http\RequestMethod::POST); + + $formPermissionAdd->setElement(0, 0, [ + 'type' => \phpOMS\Html\TagType::SELECT, + 'options' => [ + [ + 'value' => 0, + 'content' => 'Group', + ], + [ + 'value' => 1, + 'content' => 'Account', + ], + ], + 'selected' => '', + 'label' => $this->getHtml('Type'), + 'name' => 'type', + ]); + + $formPermissionAdd->setElement(1, 0, [ + 'type' => \phpOMS\Html\TagType::INPUT, + 'subtype' => 'text', + 'name' => 'id', + 'label' => $this->getHtml('ID'), + ]); + + $formPermissionAdd->setElement(2, 0, [ + 'type' => \phpOMS\Html\TagType::INPUT, + 'subtype' => 'text', + 'name' => 'perm', + 'label' => $this->getHtml('Permission'), + ]); + + $this->getView('permissionFormPanel')->addView('form', $formPermissionAdd); + + /* + * Permission List + */ + $permissionListView = new \Web\Views\Lists\ListView($this->app, $this->request, $this->response); + $headerView = new \Web\Views\Lists\HeaderView($this->app, $this->request, $this->response); + + $permissionListView->setTemplate('/Web/Templates/Lists/ListFull'); + $headerView->setTemplate('/Web/Templates/Lists/Header/HeaderTable'); + + /* + * Header + */ + $headerView->setTitle($this->getHtml('Permission')); + $headerView->setHeader([ + ['title' => $this->getHtml('Type'), 'sortable' => true], + ['title' => $this->getHtml('Name'), 'sortable' => true, 'full' => true], + ['title' => $this->getHtml('Permission'), 'sortable' => true], + ]); + + $permissionListView->addView('header', $headerView); + $this->addView('permissionList', $permissionListView); + + $tabView->addTab($this->getHtml('Overview'), $overviwPanel->render() . $permissionPanel->render() . $permissionListView->render(), 'Backend', 'overview'); + + /* + * UI Logic + */ + $sourceList = new \Web\Views\Lists\ListView($this->app, $this->request, $this->response); + $sourceListHeaderView = new \Web\Views\Lists\HeaderView($this->app, $this->request, $this->response); + + $sourceList->setTemplate('/Web/Templates/Lists/ListFull'); + $sourceListHeaderView->setTemplate('/Web/Templates/Lists/Header/HeaderTable'); + + /* + * Header + */ + $sourceListHeaderView->setTitle($this->getHtml('Sources')); + $sourceListHeaderView->setHeader([ + ['title' => $this->getHtml('ID'), 'sortable' => true], + ['title' => $this->getHtml('Name'), 'sortable' => true, 'full' => true], + ['title' => $this->getHtml('Created'), 'sortable' => true], + ['title' => $this->getHtml('CreatedBy'), 'sortable' => true], + ]); + + $sourceList->setFreeze(3, 2); + $sourceList->addView('header', $sourceListHeaderView); + + $tabView->addTab($this->getHtml('Helper', 'Sources'), $sourceList->render(), 'Backend', 'sources'); + + /* + * Create + */ + $createPanel = new \Web\Views\Panel\PanelView($this->app, $this->request, $this->response); + $mediaPanel = clone $createPanel; + + $createPanel->setTitle($this->getHtml('Create')); + $mediaPanel->setTitle($this->getHtml('Media')); + + $this->addView('createFormPanel', $createPanel); + $this->getView('createFormPanel')->setTemplate('/Web/Templates/Panel/BoxHalf'); + + $this->addView('permissionFormPanel', $mediaPanel); + $this->getView('permissionFormPanel')->setTemplate('/Web/Templates/Panel/BoxHalf'); + + $formCreateForm = new \Web\Views\Form\FormView($this->app, $this->request, $this->response); + $formCreateForm->setTemplate('/Web/Templates/Forms/FormFull'); + $formCreateForm->setSubmit('submit1', $this->getHtml('Submit')); + $formCreateForm->setAction($this->request->getUri()->getScheme() . '://' . $this->request->getUri()->getHost()); + $formCreateForm->setMethod(\phpOMS\Message\Http\RequestMethod::POST); + + $formCreateForm->setElement(0, 0, [ + 'type' => \phpOMS\Html\TagType::INPUT, + 'subtype' => 'text', + 'name' => 'rname', + 'label' => $this->getHtml('Name'), + ]); + + $createPanel->addView('createform', $formCreateForm); + + /* + * Media Add + */ + + // TODO: add media upload drop panel + + $tabView->addTab($this->getHtml('Helper', 'New'), $createPanel->render() . $mediaPanel->render(), 'Backend', 'new'); + ?> + printHtml($tabView->render()); ?> +
+ + diff --git a/Theme/Backend/helper-list.tpl.php b/Theme/Backend/helper-list.tpl.php new file mode 100644 index 0000000..f684b32 --- /dev/null +++ b/Theme/Backend/helper-list.tpl.php @@ -0,0 +1,58 @@ +getData('reports'); +$footerView = new \phpOMS\Views\PaginationView($this->app, $this->request, $this->response); +$footerView->setTemplate('/Web/Templates/Lists/Footer/PaginationBig'); + +$footerView->setPages(count($templates) / 25); +$footerView->setPage(1); +$footerView->setResults(count($templates)); + +echo $this->getData('nav')->render(); ?> + +
+
+
+ + + + + + + + + + +
getHtml('Reports') ?>
getHtml('ID', 0, 0); ?> + getHtml('Name') ?> + getHtml('Creator') ?> + getHtml('Updated') ?> +
+
getHtml('Empty', 0, 0); ?> + + $template) : + $url = \phpOMS\Uri\UriFactory::build('/{/lang}/backend/helper/report/view?{?}&id=' . $template->getId()); ?> +
printHtml($template->getId()); ?> + printHtml($template->getName()); ?> + printHtml($template->getCreatedBy()->getName1()); ?> + printHtml($template->getCreatedAt()->format('Y-m-d')); ?> + +
+
+
+
diff --git a/Theme/Backend/helper-single.tpl.php b/Theme/Backend/helper-single.tpl.php new file mode 100644 index 0000000..960fb1c --- /dev/null +++ b/Theme/Backend/helper-single.tpl.php @@ -0,0 +1,125 @@ +getData('tcoll'); +$rcoll = $this->getData('rcoll'); +$cLang = $this->getData('lang'); +$template = $this->getData('template'); +$report = $this->getData('report'); + +/** @noinspection PhpIncludeInspection */ +$reportLanguage = include __DIR__ . '/../../../' . \ltrim($tcoll['lang']->getPath(), '/'); +$lang = $reportLanguage[$cLang]; + +echo $this->getData('nav')->render(); ?> +
+
+
+ getPath(), '/'); ?> +
+
+ +
+
+

getHtml('Reports') ?>

+ +
+
+ + + + + + +
+
+ isStandalone()) : ?>
+
+ +
+
+
+
+ +
+

getHtml('Export') ?>

+ +
+
+ + + + + +
+
+
+
+
+
+
+ +
+

getHtml('Info') ?>

+ +
+ + + isStandalone()) : ?> + + + + + + + + +
getHtml('Report') ?> +
getHtml('Name'); ?> + printHtml($report->getTitle()); ?> +
getHtml('Creator'); ?> + printHtml($report->getCreatedBy()->getName1()); ?> +
getHtml('Created'); ?> + getCreatedAt()->format('Y-m-d'); ?> + +
getHtml('Template') ?> +
getHtml('Name'); ?> + printHtml($template->getName()); ?> +
getHtml('Creator'); ?> + printHtml($template->getCreatedBy()->getName1()); ?> +
getHtml('Created'); ?> + getCreatedAt()->format('Y-m-d'); ?> +
+
+
+
+
\ No newline at end of file diff --git a/Theme/Backend/helper-template-create.tpl.php b/Theme/Backend/helper-template-create.tpl.php new file mode 100644 index 0000000..40640f0 --- /dev/null +++ b/Theme/Backend/helper-template-create.tpl.php @@ -0,0 +1,53 @@ +getData('nav')->render(); ?> + +
+
+
+

getHtml('Template'); ?>

+
+
+ + +
+
+
+
getData('editor')->render('report-editor'); ?> +
getData('editor')->getData('text')->render('report-editor', 'description', 'helper-template-create'); ?> +
+ + + + +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ getData('media-upload')->render('helper-template-create'); ?> +
+
\ No newline at end of file diff --git a/Views/HelperView.php b/Views/HelperView.php new file mode 100644 index 0000000..41d22ac --- /dev/null +++ b/Views/HelperView.php @@ -0,0 +1,31 @@ +