diff --git a/apps/Core/Components/Apps/AppsComponent.php b/apps/Core/Components/Apps/AppsComponent.php index 06d87f498..70378c4dc 100644 --- a/apps/Core/Components/Apps/AppsComponent.php +++ b/apps/Core/Components/Apps/AppsComponent.php @@ -14,7 +14,7 @@ class AppsComponent extends BaseComponent */ public function viewAction() { - $typesArr = $this->apps->types->types; + $typesArr = $this->apps->types->getInstalledAppTypes(); $this->view->types = $typesArr; @@ -189,7 +189,7 @@ public function viewAction() } //Views - $viewsArr = $this->modules->views->getViewsForAppType($app['app_type']); + $viewsArr = $this->modules->views->getViewsForAppType($app['app_type'], false); if (count($viewsArr) === 1) { array_push($mandatoryViews, $this->helper->first($viewsArr)['name']); @@ -259,6 +259,8 @@ public function viewAction() return; } $this->view->acceptableUsernames = $this->apps->getAcceptableUsernamesForAppId(); + + $this->view->dashboards = $this->basepackages->dashboards->init()->getDashboardsByAppType($app['app_type']); } else { $this->view->app = null; $domains = $this->domains->domains; @@ -286,9 +288,10 @@ public function viewAction() $this->view->publicStorages = $publicStorages; $this->view->privateStorages = $privateStorages; + + $this->view->dashboards = []; } - $this->view->dashboards = $this->basepackages->dashboards->init()->dashboards; $this->view->roles = $this->basepackages->roles->init()->roles; $this->view->pick('apps/view'); @@ -343,7 +346,7 @@ public function addAction() { $this->requestIsPost(); - $viewsArr = $this->modules->views->getViewsForAppType($this->postData()['app_type']); + $viewsArr = $this->modules->views->getViewsForAppType($this->postData()['app_type'], false); if (count($viewsArr) === 0) { $this->addResponse('No Views Available for app type ' . $this->postData()['app_type'] . ' cannot proceed!', 1); @@ -378,7 +381,7 @@ public function updateAction() $this->apps->packagesData->responseCode ); - $this->addToNotification('update', 'Updated app ' . $this->postData()['name'], null, $this->apps->packagesData->last); + $this->addToNotification('update', 'Updated app', null, $this->apps->packagesData->last ?? []); } /** @@ -517,7 +520,7 @@ public function getViewsForAppTypeAction() { $this->requestIsPost(); - $viewsArr = $this->modules->views->getViewsForAppType($this->postData()['app_type']); + $viewsArr = $this->modules->views->getViewsForAppType($this->postData()['app_type'], false); if ($viewsArr && count($viewsArr) > 0) { $views = []; diff --git a/apps/Core/Components/Auth/AuthComponent.php b/apps/Core/Components/Auth/AuthComponent.php index aa45b934d..6becdbf5e 100644 --- a/apps/Core/Components/Auth/AuthComponent.php +++ b/apps/Core/Components/Auth/AuthComponent.php @@ -172,11 +172,7 @@ public function sendTwoFaEmailAction() { $this->requestIsPost(); - try { - $this->access->auth->twoFa->sendTwoFaEmail($this->postData()); - } catch (\Exception $e) { - var_dump($e);die(); - } + $this->access->auth->twoFa->sendTwoFaEmail($this->postData()); $this->addResponse( $this->access->auth->twoFa->packagesData->responseMessage, diff --git a/apps/Core/Components/Dashboards/DashboardsComponent.php b/apps/Core/Components/Dashboards/DashboardsComponent.php index db53ef1a3..aa405d32b 100644 --- a/apps/Core/Components/Dashboards/DashboardsComponent.php +++ b/apps/Core/Components/Dashboards/DashboardsComponent.php @@ -35,14 +35,11 @@ public function viewAction() $dashboardId = $this->getData()['id']; $dashboard = $this->basepackages->dashboards->getDashboardById($dashboardId, true, false); - $dashboard['is_app_default'] = false; if (isset($this->app['settings']['defaultDashboard'])) { if ($this->app['settings']['defaultDashboard'] == $dashboard['id']) { - $dashboard['is_app_default'] = true; + $dashboard['app_default'] = true; } - - $this->view->isAppDefault = true; } if (isset($dashboard['shared']) && is_string($dashboard['shared'])) { @@ -66,19 +63,31 @@ public function viewAction() $dashboard['shared'] = []; } + //Default + if ($dashboard['user_default']) { + if (is_string($dashboard['user_default'])) { + $dashboard['user_default'] = $this->helper->decode($dashboard['user_default'], true); + } + + if (in_array($this->access->auth->account()['id'], $dashboard['user_default'])) { + $dashboard['user_default'] = true; + } + } + $this->view->dashboard = $dashboard; } $this->view->pick('dashboards/dashboards/dashboard'); return; - } else { + } else {//List of all dashboards + $dashboardId = 0; + if (isset($this->app['settings']['defaultDashboard'])) { $dashboardId = $this->app['settings']['defaultDashboard']; } - $dashboards = $this->basepackages->dashboards->dashboards; - $dashboards = msort($dashboards, 'is_default'); + $dashboards = $this->basepackages->dashboards->getDashboardsByAppType($this->app['app_type']); if ($this->access->auth->account()) { foreach ($dashboards as $dashboardKey => &$dashboard) { @@ -110,18 +119,23 @@ public function viewAction() } //Default - if ($dashboard['is_default'] && !$isShared) { - $dashboardId = $dashboard['id']; + if ($dashboard['user_default']) { + if (is_string($dashboard['user_default'])) { + $dashboard['user_default'] = $this->helper->decode($dashboard['user_default'], true); + } - $dashboard['name'] = $dashboard['name'] . ' (User Default)'; + if (in_array($this->access->auth->account()['id'], $dashboard['user_default'])) { + $dashboard['name'] = $dashboard['name'] . ' (User Default)'; + $dashboardId = $dashboard['id']; + } } } } - $this->view->dashboard = $this->basepackages->dashboards->getDashboardById($dashboardId, true, false); - $this->view->dashboards = $dashboards; + $this->view->dashboard = $this->basepackages->dashboards->getDashboardById($dashboardId, true, false); + $this->view->widgetsTree = $this->basepackages->widgets->getWidgetsTree(); } } @@ -222,6 +236,19 @@ public function getDashboardWidgetsAction() ); } + public function getDashboardsByAppTypeAction() + { + $this->requestIsPost(); + + $this->basepackages->dashboards->getDashboardsByAppType($this->postData()['app_type']); + + $this->addResponse( + $this->basepackages->dashboards->packagesData->responseMessage, + $this->basepackages->dashboards->packagesData->responseCode, + $this->basepackages->dashboards->packagesData->responseData + ); + } + public function searchAccountAction() { $this->requestIsPost(); diff --git a/apps/Core/Components/Devtools/Modules/ModulesComponent.php b/apps/Core/Components/Devtools/Modules/ModulesComponent.php index d8ad40585..338779a8f 100644 --- a/apps/Core/Components/Devtools/Modules/ModulesComponent.php +++ b/apps/Core/Components/Devtools/Modules/ModulesComponent.php @@ -99,7 +99,6 @@ public function viewAction() $modulesArr = $this->processModulesArr(msort($this->modules->{$modulesType}->{$modulesType}, 'name')); ${$modulesType . 'CategoryArr'} = $modulesArr['categoryArr']; } - if ($modulesArr['modules'] && count($modulesArr['modules']) > 0) { $modules[$modulesType]['value'] = ucfirst($modulesType); $modules[$modulesType]['childs'] = $modulesArr['modules']; @@ -193,7 +192,7 @@ public function viewAction() $module['module_details']['category'] === 'providers') ) { if ($module['module_details']['category'] === 'basepackagesApis') { - $moduleLocation = 'system/Base/Installer/Packages/Setup/Register/Modules/Packages/Basepackages/ApiClientServices/Apis/'; + $moduleLocation = 'system/Base/Installer/Packages/Setup/Register/Modules/Packages/Basepackages/Api/Apis/'; } else if (str_starts_with($module['module_details']['category'], 'basepackages')) { $moduleLocation = 'system/Base/Installer/Packages/Setup/Register/Modules/Packages/Basepackages/'; } else if ($module['module_details']['category'] === 'providers') { @@ -236,8 +235,12 @@ public function viewAction() $routePath = implode('/', $pathArr) . '/Install/'; } else if ($module['module_details']['module_type'] === 'views') { - if (isset($module['module_details']['base_view_module_id']) && $module['module_details']['base_view_module_id'] != 0) { - $baseView = $this->modules->views->getViewById($module['module_details']['base_view_module_id']); + if ($module['module_details']['is_subview'] == true) { + if ($module['module_details']['base_view_module_id'] != 0) { + $baseView = $this->modules->views->getViewById($module['module_details']['base_view_module_id']); + } else { + $baseView['name'] = 'Default'; + } $pathArr = preg_split('/(?=[A-Z])/', ucfirst($module['module_details']['name']), -1, PREG_SPLIT_NO_EMPTY); diff --git a/apps/Core/Components/Devtools/Test/TestComponent.php b/apps/Core/Components/Devtools/Test/TestComponent.php index d638054b0..4a34c9334 100644 --- a/apps/Core/Components/Devtools/Test/TestComponent.php +++ b/apps/Core/Components/Devtools/Test/TestComponent.php @@ -7,20 +7,33 @@ class TestComponent extends BaseComponent { - protected $sourceDir = 'system/Base/Providers/BasepackagesServiceProvider/Packages/Geo/Data/'; - /** * @acl(name=view) */ public function viewAction() { - // var_dump($this->opCache->setCache('guru', ['guru'=>123], 'guru')); - // var_dump($this->opCache->getCache('guru', 'guru')); - // var_dump($this->opCache->removeCache()); + // $install = new \Apps\Fintech\Components\Dashboards\Install\Install; + + // $install->init()->install(); + // $adminComponents = $this->basepackages->utils->scanDir('apps/Core/Components/', true); - // $dicData = new DevtoolsDicExtractData; + // foreach ($adminComponents['files'] as $adminComponentKey => $adminComponent) { + // if (strpos($adminComponent, 'component.json')) { + // try { + // $jsonFile = + // $this->helper->decode( + // $this->localContent->read($adminComponent), + // true + // ); + // } catch (\throwable $e) { + // throw new \Exception($e->getMessage() . '. Problem reading component.json at location ' . $adminComponent); + // } - // $dicData->processDicData(); + // if ($jsonFile['menu'] && $jsonFile['menu'] !== 'false') { + // $this->basepackages->menus->addMenu($jsonFile); + // } + // } + // } } /** @@ -28,9 +41,6 @@ public function viewAction() */ public function apiViewAction() { - // usleep(50000); - // sleep(10); - // var_dump($_SESSION); $this->addResponse('Test', 0, ['connection' => $this->connection->getId(), 'session' => $this->session->getId()]); } diff --git a/apps/Core/Components/Home/HomeComponent.php b/apps/Core/Components/Home/HomeComponent.php index fb81ce37d..3d28243eb 100644 --- a/apps/Core/Components/Home/HomeComponent.php +++ b/apps/Core/Components/Home/HomeComponent.php @@ -2,7 +2,6 @@ namespace Apps\Core\Components\Home; -use Phalcon\Helper\Arr; use System\Base\BaseComponent; class HomeComponent extends BaseComponent diff --git a/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php b/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php index 21f1a7497..89ef066d3 100644 --- a/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php +++ b/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php @@ -119,10 +119,10 @@ function ($dataArr) { protected function replaceColumns($dataArr) { foreach ($dataArr as $dataKey => &$data) { - if (isset($data['in_use']) && $data['in_use'] == '0') { - $data['in_use'] = 'No'; - } else if (isset($data['in_use']) && $data['in_use'] == '1') { + if (isset($data['in_use']) && $data['in_use'] == '1') { $data['in_use'] = 'Yes'; + } else { + $data['in_use'] = 'No'; } $data['category'] = ucfirst($data['category']); diff --git a/apps/Core/Components/System/Menus/Install/component.json b/apps/Core/Components/System/Menus/Install/component.json new file mode 100644 index 000000000..5e19fbd99 --- /dev/null +++ b/apps/Core/Components/System/Menus/Install/component.json @@ -0,0 +1,42 @@ +{ + "route" : "system/menus", + "name" : "Menus", + "description" : "Manage menus via this component", + "module_type" : "components", + "app_type" : "core", + "category" : "admin", + "version" : "0.0.0", + "repo" : "https://.../", + "class" : "Apps\\Core\\Components\\System\\Menus\\MenusComponent", + "dependencies" : { + "core" : { + "name" : "Core", + "version" : "0.0.0", + "repo" : "https://.../" + }, + "components" : [], + "packages" : [], + "middlewares" : [], + "views" : [], + "external" : [] + }, + "menu" : { + "seq" : 7, + "system" : { + "icon" : "cogs", + "title" : "system", + "childs" : { + "menus" : { + "title" : "menus", + "icon" : "bars", + "link" : "system/menus" + } + } + } + }, + "settings" : { + "mandatory" : { + "core" : true + } + } +} \ No newline at end of file diff --git a/apps/Core/Components/System/Menus/MenusComponent.php b/apps/Core/Components/System/Menus/MenusComponent.php new file mode 100644 index 000000000..d98120d79 --- /dev/null +++ b/apps/Core/Components/System/Menus/MenusComponent.php @@ -0,0 +1,89 @@ +menus = $this->basepackages->menus; + } + + /** + * @acl(name=view) + */ + public function viewAction() + { + $this->view->appTypes = $this->apps->types->getInstalledAppTypes(); + + if (isset($this->getData()['id'])) { + if ($this->getData()['id'] != 0) { + $menu = $this->menus->getById($this->getData()['id']); + + if (!$menu) { + return $this->throwIdNotFound(); + } + + $this->view->menu = $menu; + } + + $this->view->pick('menus/view'); + + return; + } + + $controlActions = + [ + 'actionsToEnable' => + [ + 'view' => 'system/menus', + ] + ]; + + $this->generateDTContent( + $this->menus, + 'system/menus/view', + null, + ['route', 'app_type'], + true, + ['route', 'app_type'], + $controlActions, + null, + null, + 'id' + ); + + $this->view->pick('menus/list'); + } + + /** + * @acl(name=add) + */ + public function addAction() + { + // + } + + /** + * @acl(name=update) + */ + public function updateAction() + { + // + } + + /** + * @acl(name=remove) + */ + public function removeAction() + { + // + } +} \ No newline at end of file diff --git a/apps/Core/Components/System/Tools/Backuprestore/BackuprestoreComponent.php b/apps/Core/Components/System/Tools/Backuprestore/BackuprestoreComponent.php index aced6f136..6f350f8fe 100644 --- a/apps/Core/Components/System/Tools/Backuprestore/BackuprestoreComponent.php +++ b/apps/Core/Components/System/Tools/Backuprestore/BackuprestoreComponent.php @@ -19,7 +19,7 @@ public function viewAction() $this->getNewToken(); if (isset($this->getData()['analyse']) && $this->getData()['analyse'] == 'info') { - $backupInfoFile = $this->basepackages->backuprestore->init('analyse')->analyseBackinfoFile($this->getData()['id']); + $backupInfoFile = $this->basepackages->backuprestore->init()->analyseBackinfoFile($this->getData()['id']); if ($backupInfoFile) { return $this->view->getPartial('backuprestore/analyse/analysis', ['backupInfoFile' => $backupInfoFile]); @@ -72,7 +72,7 @@ public function backupAction() { $this->requestIsPost(); - if ($this->basepackages->backuprestore->init()->backup($this->postData())) { + if ($this->basepackages->backuprestore->init('backup')->backup($this->postData())) { $this->addResponse( $this->basepackages->backuprestore->packagesData->responseMessage, $this->basepackages->backuprestore->packagesData->responseCode, diff --git a/apps/Core/Install/type.json b/apps/Core/Install/type.json index 87f596ffa..1e2eb3d7a 100644 --- a/apps/Core/Install/type.json +++ b/apps/Core/Install/type.json @@ -1,7 +1,8 @@ { - "name": "Core", - "app_type": "core", - "description": "Core apps type for core modules.", - "repo": "https://.../", - "version": "0.0.0" + "app_type" : "core", + "dashboards" : true, + "name" : "Core", + "description" : "Core apps type for core modules.", + "version" : "0.0.0", + "repo" : "https://.../" } \ No newline at end of file diff --git a/apps/Core/Middlewares/IpFilter/IpFilter.php b/apps/Core/Middlewares/IpFilter/IpFilter.php index 1acd3252d..c3a7adc55 100644 --- a/apps/Core/Middlewares/IpFilter/IpFilter.php +++ b/apps/Core/Middlewares/IpFilter/IpFilter.php @@ -2,7 +2,6 @@ namespace Apps\Core\Middlewares\IpFilter; -use Phalcon\Mvc\View; use System\Base\BaseMiddleware; class IpFilter extends BaseMiddleware diff --git a/apps/Core/Packages/Adminltetags/Tags/Buttons/ApplicationButton.php b/apps/Core/Packages/Adminltetags/Tags/Buttons/ApplicationButton.php new file mode 100644 index 000000000..4ba5498dd --- /dev/null +++ b/apps/Core/Packages/Adminltetags/Tags/Buttons/ApplicationButton.php @@ -0,0 +1,183 @@ +view = $view; + + $this->tag = $tag; + + $this->links = $links; + + $this->escaper = $escaper; + + $this->adminLTETags = new Adminltetags(); + + $this->params = $params; + + $this->buttonParams = $buttonParams; + + $this->buildButtonParamsArr(); + } + + public function getContent() + { + return $this->content; + } + + protected function buildButtonParamsArr() + { + if (isset($this->params['buttons'])) { + $buttons = $this->params['buttons']; + } else { + $this->content .= 'Error: buttons (array) missing'; + + return; + } + + if (!isset($this->params['buttonId'])) { + $this->content .= 'Error: buttonId missing'; + + return; + } + + foreach ($this->params['buttons'] as $buttonKey => $button) { + if (isset($button['title'])) { + if ($button['title'] === false) { + $this->buttonParams['title'] = ''; + } else { + $this->buttonParams['title'] = '' . $button['title'] . ''; + } + } else { + $this->buttonParams['title'] = 'Missing Button Title'; + } + + $this->buttonParams['position'] = + isset($button['position']) ? + 'float-' . $button['position'] : + ''; + + $this->buttonParams['flat'] = + isset($button['flat']) && $button['flat'] === true ? + 'btn-flat' : + ''; + + $this->buttonParams['type'] = + isset($button['type']) ? + 'bg-' . $button['type'] : + 'bg-primary'; + + if (isset($button['buttonId'])) { + $this->buttonParams['id'] = $button['buttonId']; + } else if (isset($this->params['componentId']) && isset($this->params['sectionId'])) { + $this->buttonParams['id'] = + $this->params['componentId'] . '-' . $this->params['sectionId'] . '-' . $buttonKey; + } else { + $this->buttonParams['id'] = $buttonKey; + } + + $this->buttonParams['url'] = + isset($button['url']) ? + $button['url'] : + ''; + + $this->buttonParams['hidden'] = + isset($button['hidden']) && $button['hidden'] === true ? + 'hidden' : + ''; + + if ($this->buttonParams['url'] === '') { + $this->buttonParams['disabled'] = + isset($button['disabled']) && $button['disabled'] === true ? + 'disabled' : + ''; + } else { + $this->buttonParams['disabled'] = ''; + if (isset($button['disabled']) && $button['disabled'] === true) { + if (isset($button['buttonAdditionalClass'])) { + $button['buttonAdditionalClass'] = $button['buttonAdditionalClass'] . ' disabled'; + } else { + $button['buttonAdditionalClass'] = 'disabled'; + } + } + } + + if (isset($button['icon'])) { + if (isset($button['iconHidden']) && $button['iconHidden'] === true) { + $iconHidden = 'hidden'; + } else { + $iconHidden = ''; + } + $this->buttonParams['icon'] = ''; + } else { + $this->buttonParams['icon'] = ''; + } + + $this->buttonParams['additionalClass'] = + isset($button['buttonAdditionalClass']) ? + $button['buttonAdditionalClass'] : + ''; + + $this->buttonParams['tooltipPosition'] = + isset($button['tooltipPosition']) ? + $button['tooltipPosition'] : + 'auto'; + + $this->buttonParams['tooltipTitle'] = + isset($button['tooltipTitle']) ? + $button['tooltipTitle'] : + ''; + + $this->buttonParams['badge'] = ''; + if (isset($button['badge'])) { + $this->buttonParams['badge'] = ''; + if (isset($button['badgeContent'])) { + $this->buttonParams['badge'] .= $button['badgeContent']; + } + $this->buttonParams['badge'] .= ''; + } + + $this->buildButton(); + } + } + + protected function buildButton() + { + $this->content .= + 'buttonParams['disabled'] . ' ' . + $this->buttonParams['hidden'] . '>' . + $this->buttonParams['badge'] . + $this->buttonParams['icon'] . + $this->buttonParams['title'] . + ''; + } +} \ No newline at end of file diff --git a/apps/Core/Packages/Adminltetags/Tags/Buttons/Button.php b/apps/Core/Packages/Adminltetags/Tags/Buttons/Button.php index dc347cb12..d11fbdc08 100644 --- a/apps/Core/Packages/Adminltetags/Tags/Buttons/Button.php +++ b/apps/Core/Packages/Adminltetags/Tags/Buttons/Button.php @@ -62,7 +62,6 @@ protected function buildButtonParamsArr() // } foreach ($buttons as $buttonKey => $button) { - if (isset($button['title'])) { if ($button['title'] === false) { $this->buttonParams['title'] = ''; diff --git a/apps/Core/Packages/Adminltetags/Tags/Buttons/ButtonGroup.php b/apps/Core/Packages/Adminltetags/Tags/Buttons/ButtonGroup.php index 016c6296a..33a63ad07 100644 --- a/apps/Core/Packages/Adminltetags/Tags/Buttons/ButtonGroup.php +++ b/apps/Core/Packages/Adminltetags/Tags/Buttons/ButtonGroup.php @@ -37,6 +37,8 @@ public function __construct($view, $tag, $links, $escaper, $params, $buttonParam $this->params = $params; $this->buttonParams = $buttonParams; + + $this->buildButtonParamsArr(); } public function getContent() @@ -44,114 +46,336 @@ public function getContent() return $this->content; } -// {# Radio Button Group #} -// {% elseif buttonType == 'button-radio-group' %} -// {% if buttonLabel %} -// -// {% endif %} -// {% if buttons %} -// {% if buttonBlock == true %} -// {% set hasButtonBlock = 'btn-block' %} -// {% endif %} -// {% if buttonPosition %} -// {% set hasButtonPosition = 'float-' ~ buttonPosition %} -// {% else %} -// {% set hasButtonPosition = '' %} -// {% endif %} -//
-// {% for buttonKey, button in buttons %} -// {% if not button.title == false %} -// {% if button.title %} -// {% set hasButtonTitle = button.title %} -// {% else %} -// {% set hasButtonTitle = ' missing_button_title' %} -// {% endif %} -// {% elseif button.title == false %} -// {% set hasButtonTitle = '' %} -// {% endif %} -// {% if button.size %} -// {% set hasButtonSize = 'btn-' ~ button.size %} -// {% else %} -// {% set hasButtonSize = 'btn-sm' %} -// {% endif %} -// {% if button.flat == true %} -// {% set hasButtonFlat = 'btn-flat' %} -// {% endif %} -// {% if button.type %} -// {% set hasButtonType = 'btn-' ~ button.type %} -// {% else %} -// {% set hasButtonType = 'btn-primary' %} -// {% endif %} -// {% if button.style == 'outline' %} -// {% set hasButtonType = 'btn-outline-' ~ button.type %} -// {% elseif button.style == 'gradient' %} -// {% set hasButtonType = 'bg-gradient-' ~ button.type %} -// {% endif %} -// {% if button.icon %} -// {% if button.title %} -// {% if button.iconPosition == 'after' %} -// {% set hasButtonIcon = '' %} -// {% else %} -// {% set hasButtonIcon = '' %} -// {% endif %} -// {% else %} -// {% set hasButtonIcon = '' %} -// {% endif %} -// {% else %} -// {% set hasButtonIcon = '' %} -// {% endif %} -// {% if fieldRadioButtonGroupButtonChecked %} -// {% if fieldRadioButtonGroupButtonChecked == button.dataValue %} -// {% set hasButtonChecked = 'checked' %} -// {% set hasButtonCheckedClasses = 'active focus' %} -// {% set hasButtonCheckedBgClass = 'bg-' ~ button.type %} -// {% else %} -// {% set hasButtonChecked = '' %} -// {% set hasButtonCheckedClasses = '' %} -// {% set hasButtonCheckedBgClass = '' %} -// {% endif %} -// {% else %} -// {% if button.checked %} -// {% set hasButtonChecked = 'checked' %} -// {% set hasButtonCheckedClasses = 'active focus' %} -// {% else %} -// {% set hasButtonChecked = '' %} -// {% set hasButtonCheckedClasses = '' %} -// {% endif %} -// {% endif %} -// {% if button.hidden == true %} -// {% set hasButtonHidden = 'hidden' %} -// {% else %} -// {% set hasButtonHidden = '' %} -// {% endif %} -// {% if button.disabled == true %} -// {% set hasButtonDisabled = 'disabled' %} -// {% set hasButtonCursor = 'style=cursor:default;' %} -// {% else %} -// {% set hasButtonDisabled = '' %} -// {% set hasButtonCursor = 'style=cursor:pointer;' %} -// {% endif %} -// {% if componentId and sectionId %} -// {% set hasButtonId = componentId ~ '-' ~ sectionId ~ '-' ~ buttonKey %} -// {% else %} -// {% set hasButtonId = buttonKey %} -// {% endif %} -// -// {% endfor %} -//
-// {% else %} -// {{('TEMPLATE ERROR: buttons (ARRAY) MISSING')}} -// {% endif %} -// {# button-group #} + protected function buildButtonParamsArr() + { + if (isset($this->params['buttons'])) { + $buttons = $this->params['buttons']; + } else { + $this->content .= 'Error: buttons (array) missing'; + + return; + } + + if (!isset($this->params['buttonId'])) { + $this->content .= 'Error: buttonId missing'; + + return; + } + + // groupButtonType : horizontal, vertical, radio + $this->buttonParams['groupButtonType'] = 'btn-group'; + if (isset($this->params['groupButtonType'])) { + if ($this->params['groupButtonType'] === 'vertical') { + $this->buttonParams['groupButtonType'] = 'btn-group-vertical'; + } + } + + $this->buttonParams['groupButtonSize'] = + isset($this->params['groupButtonSize']) ? + $this->params['groupButtonSize'] : + 'md'; + + $this->buttonParams['groupButtonFlat'] = + isset($this->params['groupButtonFlat']) && $this->params['groupButtonFlat'] === true ? + 'btn-flat' : + ''; + + $this->buttonParams['groupButtonBlock'] = + isset($this->params['groupButtonBlock']) && $this->params['groupButtonBlock'] === true ? + 'btn-block' : + ''; + + $this->buttonParams['groupButtonPosition'] = + isset($this->params['groupButtonPosition']) ? + 'float-' . $this->params['groupButtonPosition'] : + ''; + + $this->buildButton(); + } + + protected function buildButton() + { + if ($this->params['groupButtonType'] === 'radio') { + $this->buttonParams['groupButtonType'] = 'btn-group btn-group-toggle'; + + $this->content .= '
'; + foreach ($this->params['buttons'] as $buttonKey => $button) { + + $this->params['groupRadioButtonType'] = 'primary'; + if (isset($button['type'])) { + $this->params['groupRadioButtonType'] = $button['type']; + } + $this->buttonParams['groupRadioButtonType'] = 'bg-' . $this->params['groupRadioButtonType']; + + if (isset($this->params['groupRadioButtonStyle'])) { + if ($this->params['groupRadioButtonStyle'] === 'outline') { + $this->buttonParams['groupRadioButtonType'] = 'btn-outline-' . $this->params['groupRadioButtonType']; + } else if ($this->params['groupRadioButtonStyle'] === 'gradient') { + $this->buttonParams['groupRadioButtonType'] = 'bg-gradient-' . $this->params['groupRadioButtonType']; + } + } + + if (array_key_exists('title', $button) && $button['title'] !== false) { + $hasButtonTitle = $button['title']; + + if ($button['title'] === false) { + $hasButtonTitle = ''; + } + } else { + $hasButtonTitle = 'missing_button_title'; + } + + if (isset($button['icon'])) { + if (isset($button['title'])) { + if (isset($button['iconPosition']) && $button['iconPosition'] === 'after') { + $hasButtonIcon = ''; + } else { + $hasButtonIcon = ''; + } + } else { + $hasButtonIcon = ''; + } + } else { + $hasButtonIcon = ''; + } + + if (isset($this->params['groupRadioButtonChecked'])) { + if ($this->params['groupRadioButtonChecked'] === $button['value']) { + $hasButtonChecked = 'checked'; + $hasButtonCheckedClasses = 'active focus'; + if ($this->params['groupRadioButtonStyle'] === 'outline') { + $hasButtonCheckedBgClass = ''; + } else { + $hasButtonCheckedBgClass = 'bg-' . $button['type']; + } + } else { + $hasButtonChecked = ''; + $hasButtonCheckedClasses = ''; + $hasButtonCheckedBgClass = ''; + } + } else { + if (isset($button['checked']) && $button['checked'] === true) { + $hasButtonChecked = 'checked'; + $hasButtonCheckedClasses = 'active focus'; + if ($this->params['groupRadioButtonStyle'] === 'outline') { + $hasButtonCheckedBgClass = ''; + } else { + $hasButtonCheckedBgClass = 'bg-' . $button['type']; + } + } else { + $hasButtonChecked = ''; + $hasButtonCheckedClasses = ''; + $hasButtonCheckedBgClass = ''; + } + } + + if (isset($buton['disabled']) && $buton['disabled'] === true) { + $hasButtonDisabled = 'disabled'; + $hasButtonCursor = 'style=cursor:default;'; + } else { + $hasButtonDisabled = ''; + $hasButtonCursor = 'style=cursor:pointer;'; + } + + $hasButtonValue = $buttonKey; + $hasButtonId = $buttonKey; + if (isset($button['value'])) { + $hasButtonValue = $button['value']; + $hasButtonId = $button['value']; + } + + $hasButtonAdditionalClass = ''; + if (isset($button['buttonAdditionalClass'])) { + $hasButtonAdditionalClass = $button['buttonAdditionalClass']; + } + + if (isset($this->params['buttonId'])) { + $hasButtonName = $this->params['buttonId']; + } else if (isset($this->params['componentId']) && isset($this->params['sectionId'])) { + $hasButtonName = + $this->params['componentId'] . '-' . $this->params['sectionId'] . '-' . $buttonKey; + } else { + $hasButtonName = $buttonKey; + } + + $this->content .= + ''; + } + } else { + $this->content .= '
'; + + foreach ($this->params['buttons'] as $buttonKey => $button) { + if (isset($button['dropdowns'])) { + if (isset($button['dropdownHover']) && $button['dropdownHover'] === true) { + $button['dropdownHover'] = 'dropdown-hover'; + } else { + $button['dropdownHover'] = ''; + } + + $button['dropdownDirection'] = + isset($button['dropdownDirection']) ? + $button['dropdownDirection'] : + '';//either dropup or '' + + $button['dropdownButtonType'] = + isset($button['dropdownButtonType']) ? + $button['dropdownButtonType'] : + 'primary'; + + $this->content .= '
'; + $this->content .= ''; + + $params = $this->params; + $params['buttonType'] = 'Dropdown'; + $params['dropdowns'] = $button['dropdowns']; + + $this->content .= $this->adminLTETags->useTag('buttons', $params); + + $this->content .= '
'; + } else { + if (isset($button['title'])) { + if ($button['title'] === false) { + $this->buttonParams['title'] = ''; + } else { + $this->buttonParams['title'] = $button['title']; + } + } else { + $this->buttonParams['title'] = 'Missing Button Title'; + } + + if (isset($button['icon']) && isset($button['title'])) { + if (isset($button['iconHidden']) && $button['iconHidden'] === true) { + $iconHidden = 'hidden'; + } else { + $iconHidden = ''; + } + if (isset($button['iconPosition']) && $button['iconPosition'] === 'after') { + $this->buttonParams['icon'] = + ''; + $this->buttonParams['iconPosition'] = 'after'; + } else { + $this->buttonParams['icon'] = + ''; + $this->buttonParams['iconPosition'] = ''; + } + } else { + $this->buttonParams['icon'] = ''; + $this->buttonParams['iconPosition'] = ''; + } + + if (isset($button['buttonId'])) { + $this->buttonParams['id'] = $button['buttonId']; + } else if (isset($this->params['componentId']) && isset($this->params['sectionId'])) { + $this->buttonParams['id'] = + $this->params['componentId'] . '-' . $this->params['sectionId'] . '-' . $buttonKey; + } else { + $this->buttonParams['id'] = $buttonKey; + } + + $this->buttonParams['url'] = + isset($button['url']) ? + $button['url'] : + ''; + + $this->buttonParams['hidden'] = + isset($button['hidden']) && $button['hidden'] === true ? + 'hidden' : + ''; + + if ($this->buttonParams['url'] === '') { + $this->buttonParams['disabled'] = + isset($button['disabled']) && $button['disabled'] === true ? + 'disabled' : + ''; + } else { + $this->buttonParams['disabled'] = ''; + if (isset($button['disabled']) && $button['disabled'] === true) { + if (isset($button['buttonAdditionalClass'])) { + $button['buttonAdditionalClass'] = $button['buttonAdditionalClass'] . ' disabled'; + } else { + $button['buttonAdditionalClass'] = 'disabled'; + } + } + } + + $this->buttonParams['additionalClass'] = + isset($button['buttonAdditionalClass']) ? + $button['buttonAdditionalClass'] : + ''; + + $this->buttonParams['tooltipPosition'] = + isset($button['tooltipPosition']) ? + $button['tooltipPosition'] : + 'auto'; + + $this->buttonParams['tooltipTitle'] = + isset($button['tooltipTitle']) ? + $button['tooltipTitle'] : + ''; + + if ($this->buttonParams['url'] !== '') { + $this->content .= + 'content .= + ''; + } + } + } + } + + $this->content .= '
'; + } } \ No newline at end of file diff --git a/apps/Core/Packages/Adminltetags/Tags/Buttons/Dropdown.php b/apps/Core/Packages/Adminltetags/Tags/Buttons/Dropdown.php new file mode 100644 index 000000000..062b22638 --- /dev/null +++ b/apps/Core/Packages/Adminltetags/Tags/Buttons/Dropdown.php @@ -0,0 +1,115 @@ +view = $view; + + $this->tag = $tag; + + $this->links = $links; + + $this->escaper = $escaper; + + $this->adminLTETags = new Adminltetags(); + + $this->params = $params; + + $this->buttonParams = $buttonParams; + + $this->buildDropdownParamsArr(); + } + + public function getContent() + { + return $this->content; + } + + protected function buildDropdownParamsArr() + { + if (!isset($this->params['dropdowns'])) { + $this->content .= 'Error: dropdowns (array) missing'; + + return; + } + + $this->buttonParams['dropdownAlign'] = + isset($this->params['dropdownAlign']) && $this->params['dropdownAlign'] === 'right' ? + 'dropdown-menu-right' : + ''; + + $this->buildDropdown(); + } + + protected function buildDropdown() + { + $this->content .= + ''; + } +} \ No newline at end of file diff --git a/apps/Core/Packages/Adminltetags/Tags/Buttons/DropdownSplitButtons.php b/apps/Core/Packages/Adminltetags/Tags/Buttons/DropdownSplitButtons.php index 8f78fc87c..8b9e09a2a 100644 --- a/apps/Core/Packages/Adminltetags/Tags/Buttons/DropdownSplitButtons.php +++ b/apps/Core/Packages/Adminltetags/Tags/Buttons/DropdownSplitButtons.php @@ -39,8 +39,6 @@ public function __construct($view, $tag, $links, $escaper, $params, $buttonParam $this->buttonParams = $buttonParams; $this->buildButtonParamsArr(); - - $this->buildButton(); } public function getContent() @@ -50,10 +48,9 @@ public function getContent() protected function buildButtonParamsArr() { - if (isset($this->params['buttons'])) { - $buttons = $this->params['buttons']; - } else { - $this->content .= 'Error: buttons (array) missing'; + if (!isset($this->params['dropdowns'])) { + $this->content .= 'Error: dropdowns (array) missing'; + return; } @@ -78,17 +75,17 @@ protected function buildButtonParamsArr() //Whole Dropdown $this->buttonParams['dropdownHover'] = - isset($this->params['dropdownHover']) ? + (isset($this->params['dropdownHover']) && $this->params['dropdownHover'] === true) ? 'dropdown-hover' : ''; $this->buttonParams['dropdownDirection'] = isset($this->params['dropdownDirection']) ? - 'dropup' : - ''; + $this->params['dropdownDirection'] : + '';//either '' or 'dropup' $this->buttonParams['dropdownAlign'] = - isset($this->params['dropdownAlign']) && $this->params['dropdownAlign'] === 'right' ? + (isset($this->params['dropdownAlign']) && $this->params['dropdownAlign'] === 'right') ? 'dropdown-menu-right' : ''; @@ -98,6 +95,8 @@ protected function buildButtonParamsArr() } else { $this->buildButtonParamsArrSplit(); } + + $this->buildButton(); } protected function buildButtonParamsArrNoSplit() @@ -255,7 +254,7 @@ protected function buildButtonParamsArrSplit() protected function buildButton() { $this->content .= - '
'; + '
'; if (!$this->buttonParams['dropdownSplitButtonsSplit']) { $this->content .= @@ -325,53 +324,10 @@ protected function buildButton() '>Toggle Dropdown'; } - $this->content .= - '
'; + $this->content .= '
'; } } \ No newline at end of file diff --git a/apps/Core/Packages/Adminltetags/Tags/Fields/Files/Croppie.php b/apps/Core/Packages/Adminltetags/Tags/Fields/Files/Croppie.php index a45243f39..f8edb40e5 100644 --- a/apps/Core/Packages/Adminltetags/Tags/Fields/Files/Croppie.php +++ b/apps/Core/Packages/Adminltetags/Tags/Fields/Files/Croppie.php @@ -752,6 +752,7 @@ function uploadAvatar(avatarName) { formData.append("setOrphan", "' . $this->params['setOrphan'] . '"); formData.append("fileName", avatarName); formData.append("storagetype", "' . $this->params['storageType'] . '"); + formData.append($("#security-token").attr("name"), $("#security-token").val()); performUpload(formData); } @@ -892,7 +893,7 @@ function updateProfileThumbnail(remove = false) { } else { $("#profile-portrait").children("i").attr("hidden", true); $("#profile-portrait").children("img").attr("src", window.dataCollection.env.rootPath + window.dataCollection.env.appRoute + - "/system/storages/q/uuid/" + uploadUUIDs[0] + "/w/30"); + "/system/storages/q/uuid/" + uploadUUIDs[uploadUUIDs.length - 1] + "/w/30"); $("#profile-portrait").children("img").attr("hidden", false); window.dataCollection.env.profile.portrait = window.dataCollection.env.rootPath + window.dataCollection.env.appRoute + "/system/storages/q/uuid/" + uploadUUIDs[0] + "/w/80"; diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index 52bc27ffc..d466964e6 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -13,6 +13,7 @@ use Seld\JsonLint\JsonParser; use Seld\JsonLint\ParsingException; use System\Base\BasePackage; +use System\Base\Providers\CoreServiceProvider\Install\Install as CoreInstall; use z4kn4fein\SemVer\Version; class DevtoolsModules extends BasePackage @@ -141,12 +142,16 @@ public function addModule($data) if ($data['createrepo'] == true) { if ($data['module_type'] === 'views' && $data['base_view_module_id'] == 0) {//Create public repository as well if (!$this->checkRepo($data)) { - $newRepo['base'] = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo['base'] = $this->createRepo($data); + } } $data['repo'] = $data['repo'] . '-public'; if (!$this->checkRepo($data)) { - $newRepo['public'] = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo['public'] = $this->createRepo($data); + } } $this->addResponse('Module added & created new repo.', @@ -161,7 +166,9 @@ public function addModule($data) return; } else { if (!$this->checkRepo($data)) { - $newRepo = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo = $this->createRepo($data); + } $this->addResponse('Module added & created new repo.', 0, @@ -233,7 +240,9 @@ public function updateModule($data) if ($this->modules->{$data['module_type']}->update($data)) { if ($data['createrepo'] == true) { if (!$this->checkRepo($data)) { - $newRepo = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo = $this->createRepo($data); + } $this->addResponse('Bundle updated & created new repo.', 0, @@ -294,12 +303,16 @@ public function updateModule($data) if ($data['createrepo'] == true && strtolower($data['name']) !== 'core') { if ($data['module_type'] === 'views' && $data['base_view_module_id'] == 0) {//Create public repository as well if (!$this->checkRepo($data)) { - $newRepo['base'] = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo['base'] = $this->createRepo($data); + } } $data['repo'] = $data['repo'] . '-public'; if (!$this->checkRepo($data)) { - $newRepo['public'] = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo['public'] = $this->createRepo($data); + } } $this->addResponse('Module updated & created new repo.', @@ -314,7 +327,9 @@ public function updateModule($data) return; } else { if (!$this->checkRepo($data)) { - $newRepo = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo = $this->createRepo($data); + } $this->addResponse('Module updated & created new repo.', 0, @@ -340,6 +355,12 @@ public function updateModule($data) $this->core->update($core); } + if ((isset($data['reinstall_table']) && $data['reinstall_table'] == true) || + (isset($data['truncate_table']) && $data['truncate_table'] == true) + ) { + $this->reinstallTruncateTable($data); + } + $this->addResponse('Module updated'); return; @@ -378,6 +399,64 @@ public function removeModule($data) } } + protected function reinstallTruncateTable($data) + { + $moduleToReinstall = $this->modules->manager->getModuleInfo( + [ + 'module_type' => $data['module_type'], + 'module_id' => $data['id'] + ] + ); + + $class = $moduleToReinstall['class']; + + if ($moduleToReinstall['app_type'] !== 'core') { + $classArr = explode('\\', $moduleToReinstall['class']); + $classArr = array_slice($classArr, 0, -1); + $class = implode('\\', $classArr) . '\\Install\\Install'; + } else if ($moduleToReinstall['name'] === 'Core' || + $moduleToReinstall['app_type'] === 'core' + ) {//Core packages. This can be a problem for packages that are not registered in the system, example(modules_packages, modules_external...) + //so, the user has to update whole core. + $class = 'System\\Base\\Providers\\CoreServiceProvider\\Install\\Install'; + } + + $path = lcfirst(str_replace('\\', '/', $class) . '.php'); + + try { + if ($this->localContent->fileExists($path)) { + $module = new $class(); + + if ($data['app_type'] === 'core') { + $coreInstall = new CoreInstall; + + if ($data['type'] === 'core') { + if (isset($data['reinstall_table']) && $data['reinstall_table'] == true) { + $coreInstall->init()->install(); + } + } else if ($data['type'] === 'packages') { + $moduleModel = $module->useModel(); + + if (isset($data['truncate_table']) && $data['truncate_table'] == true) { + $coreInstall->init([$moduleModel->getSource()])->truncate(); + } else if (isset($data['reinstall_table']) && $data['reinstall_table'] == true) { + $coreInstall->init([$moduleModel->getSource()])->install(); + } + } + } else { + $module = new $class(); + if (isset($data['truncate_table']) && $data['truncate_table'] == true && method_exists($module, 'truncate')) { + $module->init()->truncate(); + } else if (isset($data['reinstall_table']) && $data['reinstall_table'] == true) { + $module->init()->install(); + } + } + } + } catch (FilesystemException | UnableToCheckExistence | \throwable $e) { + throw $e; + } + } + protected function checkAppType($data) { if (isset($data['app_type']) && @@ -407,12 +486,13 @@ protected function checkAppType($data) [ 'name' => $data['app_type']['newTags'][0], 'app_type' => strtolower($data['app_type']['newTags'][0]), + 'dashboards' => $data['dashboards'], 'description' => 'Added via devtools module add.', 'version' => $data['version'], 'api_id' => $data['api_id'], 'repo' => $data['repo'], 'updated_by' => '0', - 'installed' => '1' + 'installed' => $data['installed'] ]; $this->apps->types->add($appType); @@ -435,13 +515,15 @@ protected function checkAppType($data) $appType = $this->apps->types->getAppTypeById($data['id']); } - if (isset($appType) && strtolower($appType['app_type']) !== 'core') { + if (isset($appType)) { $appType['name'] = $data['name']; $appType['app_type'] = strtolower($data['app_type']); + $appType['dashboards'] = $data['dashboards']; $appType['description'] = $data['description']; $appType['version'] = $data['version']; $appType['api_id'] = $data['api_id']; $appType['repo'] = $data['repo']; + $appType['installed'] = $data['installed']; $this->apps->types->update($appType); @@ -451,16 +533,19 @@ protected function checkAppType($data) } else { $data['app_type'] = strtolower($data['app_type']); $data['updated_by'] = '0'; - $data['installed'] = '1'; $this->apps->types->add($data); $this->addUpdateAppTypeFiles($data); } - if ($data['createrepo'] == true) { + if (strtolower($data['app_type']) !== 'core' && + $data['createrepo'] == true + ) { if (!$this->checkRepo($data)) { - $newRepo = $this->createRepo($data); + if (strtolower($data['app_type']) !== 'core') { + $newRepo = $this->createRepo($data); + } $this->addResponse('Added new app type', 0, ['newRepo' => $newRepo]); } @@ -498,6 +583,7 @@ protected function addUpdateAppTypeFiles($appType) $jsonFile = 'apps/' . ucfirst($appType['app_type']) . '/Install/type.json'; $jsonContent["app_type"] = $appType["app_type"]; + $jsonContent["dashboards"] = $appType["dashboards"]; $jsonContent["name"] = $appType["name"]; $jsonContent["description"] = $appType["description"]; $jsonContent["version"] = $appType["version"]; @@ -811,7 +897,7 @@ protected function getModuleJsonFileLocation(&$data) $data['category'] === 'providers') ) { if ($data['category'] === 'basepackagesApis') { - $moduleLocation = 'system/Base/Installer/Packages/Setup/Register/Modules/Packages/Basepackages/ApiClientServices/Apis/'; + $moduleLocation = 'system/Base/Installer/Packages/Setup/Register/Modules/Packages/Basepackages/Api/Apis/'; } else if (str_starts_with($data['category'], 'basepackages')) { $moduleLocation = 'system/Base/Installer/Packages/Setup/Register/Modules/Packages/Basepackages/'; } else if ($data['category'] === 'providers') { @@ -830,12 +916,12 @@ protected function getModuleJsonFileLocation(&$data) (str_starts_with($data['category'], 'basepackages') || $data['category'] === 'providers') ) { - if ($data['category'] === 'basepackagesApis') { + // if ($data['category'] === 'basepackagesApis') { $pathArr = preg_split('/(?=[A-Z])/', ucfirst($data['name']), -1, PREG_SPLIT_NO_EMPTY); $path = implode('/', $pathArr); - } else { - $path = ucfirst($data['name']); - } + // } else { + // $path = ucfirst($data['name']); + // } return $moduleLocation . @@ -908,7 +994,7 @@ protected function getNewFilesLocation($data, $viewPublic = false) $data['category'] === 'providers') ) { if ($data['category'] === 'basepackagesApis') { - $moduleLocation = 'system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/Apis/'; + $moduleLocation = 'system/Base/Providers/BasepackagesServiceProvider/Packages/Api/Apis/'; } else if (str_starts_with($data['category'], 'basepackages')) { $moduleLocation = 'system/Base/Providers/BasepackagesServiceProvider/Packages/'; } else if ($data['category'] === 'providers') { @@ -1059,6 +1145,29 @@ protected function generateNewComponentsFiles($moduleFilesLocation, $data) return false; } + try { + $file = $this->localContent->read('apps/Core/Packages/Devtools/Modules/Files/ComponentInstallInstall.txt'); + } catch (FilesystemException | UnableToReadFile $exception) { + $this->addResponse('Unable to read module base component file.'); + + return false; + } + + $moduleFilesLocation = $moduleFilesLocation . 'Install'; + $fileName = $moduleFilesLocation . '/Install.php'; + $moduleFilesLocationClass = str_replace('/', '\\', ucfirst($moduleFilesLocation)); + // $moduleFilesLocationClass = str_replace('\\' . $data['name'], '', $moduleFilesLocationClass); + $file = str_replace('"NAMESPACE"', 'namespace ' . $moduleFilesLocationClass . ';', $file); + + try { + $this->localContent->write($fileName, $file); + array_push($this->newFiles, $fileName); + } catch (FilesystemException | UnableToWriteFile $exception) { + $this->addResponse('Unable to write module component file'); + + return false; + } + return true; } @@ -1090,6 +1199,31 @@ protected function generateNewMiddlewaresFiles($moduleFilesLocation, $data) return false; } + + try { + $file = $this->localContent->read('apps/Core/Packages/Devtools/Modules/Files/MiddlewareInstallInstall.txt'); + } catch (FilesystemException | UnableToReadFile $exception) { + $this->addResponse('Unable to read module base component file.'); + + return false; + } + + $moduleFilesLocation = $moduleFilesLocation . 'Install'; + $fileName = $moduleFilesLocation . '/Install.php'; + $moduleFilesLocationClass = str_replace('/', '\\', ucfirst($moduleFilesLocation)); + // $moduleFilesLocationClass = str_replace('\\' . $data['name'], '', $moduleFilesLocationClass); + $file = str_replace('"NAMESPACE"', 'namespace ' . $moduleFilesLocationClass . ';', $file); + + try { + $this->localContent->write($fileName, $file); + array_push($this->newFiles, $fileName); + } catch (FilesystemException | UnableToWriteFile $exception) { + $this->addResponse('Unable to write module component file'); + + return false; + } + + return true; } protected function generateNewPackagesFiles($moduleFilesLocation, $data) @@ -1170,7 +1304,7 @@ protected function generateNewPackagesInstallFiles($data, $moduleFilesLocation) $moduleFilesLocation = $moduleFilesLocation . 'Install/Schema'; $fileName = $moduleFilesLocation . '/' . $data['name'] . '.php'; $moduleFilesLocationClass = str_replace('/', '\\', ucfirst($moduleFilesLocation)); - $moduleFilesLocationClass = str_replace('\\' . $data['name'], '', $moduleFilesLocationClass); + // $moduleFilesLocationClass = str_replace('\\' . $data['name'], '', $moduleFilesLocationClass); $moduleSchemaClass = $moduleFilesLocationClass . '\\' . $data['name']; } @@ -1189,7 +1323,7 @@ protected function generateNewPackagesInstallFiles($data, $moduleFilesLocation) //Package Installer File only for apps. if (!str_starts_with($data['category'], 'basepackages') && $data['category'] !== 'providers') { try { - $file = $this->localContent->read('apps/Core/Packages/Devtools/Modules/Files/PackageInstallPackage.txt'); + $file = $this->localContent->read('apps/Core/Packages/Devtools/Modules/Files/PackageInstallInstall.txt'); } catch (FilesystemException | UnableToReadFile $exception) { $this->addResponse('Unable to read module base package file.'); @@ -1198,9 +1332,9 @@ protected function generateNewPackagesInstallFiles($data, $moduleFilesLocation) if ($data['category'] !== str_starts_with($data['category'], 'basepackages') && $data['category'] !== 'providers') { $moduleFilesLocation = str_replace('/Schema', '', $moduleFilesLocation); - $fileName = $moduleFilesLocation . '/' . 'Package.php'; + $fileName = $moduleFilesLocation . '/' . 'Install.php'; $moduleFilesLocationClass = str_replace('/', '\\', ucfirst($moduleFilesLocation)); - $moduleFilesLocationClass = str_replace('\\' . $data['name'], '', $moduleFilesLocationClass); + // $moduleFilesLocationClass = str_replace('\\' . $data['name'], '', $moduleFilesLocationClass); $file = str_replace('"NAMESPACE"', 'namespace ' . $moduleFilesLocationClass . ';', $file); $file = str_replace('"PACKAGESCHEMACLASS"', $moduleSchemaClass . ';', $file); $file = str_replace('"PACKAGESCHEMANAME"', $data['name'], $file); @@ -1233,7 +1367,7 @@ protected function generateNewPackagesModelFiles($data, $moduleFilesLocation) if (str_starts_with($data['category'], 'basepackages') || $data['category'] === 'providers') { if (str_starts_with($data['category'], 'basepackages')) { if ($data['category'] === 'basepackagesApis') { - $moduleFilesLocation = 'system/Base/Providers/BasepackagesServiceProvider/Packages/Model/ApiClientServices/Apis/'; + $moduleFilesLocation = 'system/Base/Providers/BasepackagesServiceProvider/Packages/Model/Api/Apis/'; $pathArr = preg_split('/(?=[A-Z])/', $data['name'], -1, PREG_SPLIT_NO_EMPTY); unset($pathArr[$this->helper->lastKey($pathArr)]); @@ -1257,7 +1391,7 @@ protected function generateNewPackagesModelFiles($data, $moduleFilesLocation) $moduleFilesLocation = $moduleFilesLocation . 'Model'; $fileName = $moduleFilesLocation . '/' . 'Apps' . ucfirst($data['app_type']) . ucfirst($data['name']) . '.php'; $moduleFilesLocationClass = str_replace('/', '\\', ucfirst($moduleFilesLocation)); - $moduleFilesLocationClass = str_replace('\\' . ucfirst($data['name']), '', $moduleFilesLocationClass); + // $moduleFilesLocationClass = str_replace('\\' . ucfirst($data['name']), '', $moduleFilesLocationClass); $className = 'Apps' . ucfirst($data['app_type']) . ucfirst($data['name']); } @@ -1373,11 +1507,11 @@ protected function addUpdateComponentMenu($data) $data['menu'] = $this->helper->decode($data['menu'], true); if (isset($menu)) { - $this->basepackages->menus->updateMenu($data['menu_id'], $data['app_type'], $data['menu']); + $this->basepackages->menus->updateMenu($data['menu_id'], $data); return; } else { - $menu = $this->basepackages->menus->addMenu($data['app_type'], $data['menu']); + $menu = $this->basepackages->menus->addMenu($data); if ($menu) { $module = $this->modules->{$data['module_type']}->packagesData->last; @@ -2133,8 +2267,7 @@ public function generateRelease($data) if (isset($data['module_type']) && $data['module_type'] === 'views' && - isset($data['base_view_module_id']) && - $data['base_view_module_id'] == 0 + $module['is_subview'] === false ) { array_push($reposArr, $module['repo'] . '-public'); } @@ -2221,8 +2354,7 @@ public function generateRelease($data) if (isset($data['module_type']) && $data['module_type'] === 'views' && - isset($module['base_view_module_id']) && - $module['base_view_module_id'] == 0 + $module['is_subview'] === false ) { array_push($reposArr, $module['repo'] . '-public'); } @@ -2683,8 +2815,7 @@ protected function checkPullRequests($data) if (isset($data['module_type']) && $data['module_type'] === 'views' && - isset($data['base_view_module_id']) && - $data['base_view_module_id'] == 0 + $data['is_subview'] === false ) { array_push($reposArr, $data['repo'] . '-public'); } @@ -2967,7 +3098,7 @@ public function generateModuleRepoUrl($data) } } - $this->addResponse('Generated Repo Url', 0, ['repo' => $url]); + $this->addResponse('Generated Repo Url', 0, ['repo' => strtolower($url)]); return true; } diff --git a/apps/Core/Packages/Devtools/Modules/Files/ApptypesGitignore.txt b/apps/Core/Packages/Devtools/Modules/Files/ApptypesGitignore.txt index a61ddb138..cc159e3de 100644 --- a/apps/Core/Packages/Devtools/Modules/Files/ApptypesGitignore.txt +++ b/apps/Core/Packages/Devtools/Modules/Files/ApptypesGitignore.txt @@ -1,4 +1,8 @@ Components/* +!Components/.gitkeep Middlewares/* +!Middlewares/.gitkeep Packages/* -Views/* \ No newline at end of file +!Packages/.gitkeep +Views/* +!Views/.gitkeep \ No newline at end of file diff --git a/apps/Core/Packages/Devtools/Modules/Files/ComponentInstallInstall.txt b/apps/Core/Packages/Devtools/Modules/Files/ComponentInstallInstall.txt new file mode 100644 index 000000000..675bf57b6 --- /dev/null +++ b/apps/Core/Packages/Devtools/Modules/Files/ComponentInstallInstall.txt @@ -0,0 +1,18 @@ +preInstall(); + + $this->installDb(); + + $this->postInstall(); + + return true; + } + + protected function preInstall() + { + return true; + } + + protected function installDb() + { + //Refer to Package installation for Core. + return true; + } + + protected function postInstall() + { + return true; + } + + public function uninstall() + { + //Check Relationship + //Drop Table(s) + return true; + } +} \ No newline at end of file diff --git a/apps/Core/Packages/Devtools/Modules/Files/PackageInstallPackage.txt b/apps/Core/Packages/Devtools/Modules/Files/PackageInstallPackage.txt deleted file mode 100644 index 61adb067c..000000000 --- a/apps/Core/Packages/Devtools/Modules/Files/PackageInstallPackage.txt +++ /dev/null @@ -1,119 +0,0 @@ -installSchema(); - } - - public function update() - { - //Run version specific Updates - } - - public function uninstall() - { - //Check Relationship - //Drop Table(s) - $this->dropTable('table_name'); - } - - public function reinstall() - { - //Remove this from production - $this->installSchema(true); - } - - //Install Schema - protected function installSchema(bool $dropTables = false) - { - try { - if ($dropTables) { - $this->createTable('table_name', '', (new "PACKAGESCHEMANAME")->columns(), $dropTables); - $this->addIndex('table_name', (new "PACKAGESCHEMANAME")->indexes());//Add index if any after creating table - } else { - $this->createTable('table_name', '', (new "PACKAGESCHEMANAME")->columns()); - $this->addIndex('table_name', (new "PACKAGESCHEMANAME")->indexes()); - } - - return true; - } catch (\PDOException $e) { - //Do something - } - } - - protected function modifySchema() - { - // Example of adding new column to table - // $this->alterTable( - // 'add', - // 'table_name', - // [ - // new Column( - // 'added', - // [ - // 'type' => Column::TYPE_VARCHAR, - // 'size' => 1024, - // 'notNull' => false, - // 'comment' => 'ADDED' - // ] - // ), - // new Column( - // 'added_2', - // [ - // 'type' => Column::TYPE_VARCHAR, - // 'size' => 1024, - // 'notNull' => false, - // 'comment' => 'ADDED 2' - // ] - // ) - // ] - // ); - - // Example of modifying column to table - // $this->alterTable( - // 'modify', - // 'table_name', - // [ - // new Column( - // 'added', - // [ - // 'type' => Column::TYPE_VARCHAR, - // 'size' => 100, - // 'notNull' => false, - // 'comment' => 'ADDED' - // ] - // ), - // new Column( - // 'added_2', - // [ - // 'type' => Column::TYPE_VARCHAR, - // 'size' => 100, - // 'notNull' => false, - // 'comment' => 'ADDED 2' - // ] - // ) - // ] - // ); - // - // Example of deleting column from table - // $this->alterTable( - // 'drop', - // 'table_name', - // [ - // 'added', - // 'added_2', - // ] - // ); - - // Example of dropping index - // $this->dropIndex('table_name', 'column_contact_mobile_index'); - } -} \ No newline at end of file diff --git a/apps/Core/Packages/Devtools/Modules/Files/PackageInstallSchema.txt b/apps/Core/Packages/Devtools/Modules/Files/PackageInstallSchema.txt index 1cf9c0377..3862c7e5b 100644 --- a/apps/Core/Packages/Devtools/Modules/Files/PackageInstallSchema.txt +++ b/apps/Core/Packages/Devtools/Modules/Files/PackageInstallSchema.txt @@ -58,7 +58,7 @@ class "PACKAGESCHEMANAME" return [ new Index( - 'column_first_name_index', + 'column_INDEX', [ 'first_name' ], diff --git a/apps/Core/Packages/Devtools/Modules/Files/ViewsGitignore.txt b/apps/Core/Packages/Devtools/Modules/Files/ViewsGitignore.txt index 6c6f7e890..b6a8b6077 100644 --- a/apps/Core/Packages/Devtools/Modules/Files/ViewsGitignore.txt +++ b/apps/Core/Packages/Devtools/Modules/Files/ViewsGitignore.txt @@ -4,5 +4,6 @@ html/* !html/ !html/layouts/ !html/common/ +!html/errors/ !README.md !view.json \ No newline at end of file diff --git a/apps/Core/Packages/Devtools/Modules/Install/package.json b/apps/Core/Packages/Devtools/Modules/Install/package.json index c9126ea43..9786533c1 100644 --- a/apps/Core/Packages/Devtools/Modules/Install/package.json +++ b/apps/Core/Packages/Devtools/Modules/Install/package.json @@ -23,6 +23,6 @@ "external" : [] }, "settings" : { - "api_clients" : [] + "api_clients" : [1,2] } } \ No newline at end of file diff --git a/apps/Core/Views/Default/html/apps/wizard/register/form.html b/apps/Core/Views/Default/html/apps/wizard/register/form.html index 4303c79c4..3fda3bf97 100644 --- a/apps/Core/Views/Default/html/apps/wizard/register/form.html +++ b/apps/Core/Views/Default/html/apps/wizard/register/form.html @@ -44,10 +44,8 @@ {% set appAutoUnblockIpMinutes = app['auto_unblock_ip_minutes'] %} {% set appIncorrectLoginAttemptBlockIp = app['incorrect_login_attempt_block_ip'] %} {% set wizard = false %} - {% if appType == 'core' or appType == 'dash' %} - {% set defaultDashboardHidden = '' %} - {% endif %} {% if app['settings']['defaultDashboard'] is defined %} + {% set defaultDashboardHidden = '' %} {% set defaultDashboard = app['settings']['defaultDashboard'] %} {% endif %} {% else %} @@ -165,6 +163,7 @@ 'fieldDataSelect2OptionsKey' : 'app_type', 'fieldDataSelect2OptionsValue' : 'name', 'fieldDataSelect2OptionsArray' : true, + 'fieldDataSelect2AddDataAttrFromData' : ['dashboards'], 'fieldDataSelect2OptionsSelected' : appType ] )}} @@ -226,6 +225,7 @@ {% endif %} \ No newline at end of file diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index ae260ede5..e2d06e5b7 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -392,16 +392,24 @@
Select module from the tre $('#{{componentId}}-{{sectionId}}-modules').on('search.jstree', function(e, res) { if (dataCollectionSectionForm['vars']['syncInfo'] === '') { + var updateTexts = { }; + $(res.nodes).each(function(i, node) { var updateNode = $('#{{componentId}}-{{sectionId}}-modules').jstree().get_node(node); var apiNode = updateNode.parents[updateNode.parents.length - 2]; - var apiNodeObj = $('#{{componentId}}-{{sectionId}}-modules').jstree().get_node(apiNode); var update = 'update'; if (res.nodes.length > 1) { update = 'updates'; } - dataCollectionSectionForm['vars']['syncInfo'] += apiNodeObj.text + ' has ' + res.nodes.length + ' new ' + update + ' available.
'; + var apiNodeObj = $('#{{componentId}}-{{sectionId}}-modules').jstree().get_node(apiNode); + updateTexts[apiNodeObj.text] = ' has ' + res.nodes.length + ' new ' + update + ' available.'; }); + + if (Object.keys(updateTexts).length > 0) { + for (var updateText in updateTexts) { + dataCollectionSectionForm['vars']['syncInfo'] += updateText + updateTexts[updateText] + '
'; + } + } } if (dataCollectionSectionForm['vars']['initJstree'] === true) { @@ -416,7 +424,6 @@
Select module from the tre textTrusted : true }); } - } dataCollectionSectionForm['vars']['syncInfo'] = ''; @@ -476,7 +483,6 @@
Select module from the tre if ($(this)[0].id === '{{componentId}}-{{sectionId}}-modules-repo-sync') { dataCollectionSectionForm['funcs']['toggleJstreeTool']($(this)[0].id); - dataCollectionSectionForm['funcs']['initSync']( $('#{{componentId}}-{{sectionId}}-modules').jstree().get_selected(true)[0].data.apiid ); @@ -689,13 +695,18 @@
Select module from the tre if (selected[0].id.startsWith('j')) { if (selected[0].data.type !== 'repo') { - $('#{{componentId}}-{{sectionId}}-modules').jstree().deselect_node(selected); + if (selected[0].data.type === 'apptype') { + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-sync'); + dataCollectionSectionForm['funcs']['moduleinfo'](['loader']); + dataCollectionSectionForm['funcs']['getSelectedModuleInfo'](selected[0].data.id, true); + } else { + $('#{{componentId}}-{{sectionId}}-modules').jstree().deselect_node(selected); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-add'); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-update'); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-sync'); - dataCollectionSectionForm['funcs']['moduleinfo'](['noinfo']); - return false; + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-update'); + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-sync'); + dataCollectionSectionForm['funcs']['moduleinfo'](['noinfo']); + return false; + } } else if (selected[0].data.type === 'repo') { dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-add', 'success', false); dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-update', 'warning', false); @@ -703,12 +714,10 @@
Select module from the tre 'href', '{{links.url("system/api/client/services/q/id/' + selected[0].data.apiid + '")}}' ); dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-sync', 'primary', false); + dataCollectionSectionForm['funcs']['moduleinfo'](); } - - dataCollectionSectionForm['funcs']['moduleinfo'](); } else { if (selected[0].data.type !== 'repo') { - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-add'); dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-update'); dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-repo-sync'); } @@ -748,7 +757,7 @@
Select module from the tre } } } -dataCollectionSectionForm['funcs']['moduleinfo'] = function(show = ['noinfo'], showButtons = ['cancel'], showSettings = true, showBundleModules = false) { +dataCollectionSectionForm['funcs']['moduleinfo'] = function(show = ['noinfo'], showButtons = ['cancel'], showSettings = true, showBundleModules = false, showChangeLogs = false) { $('#{{componentId}}-{{sectionId}}-tabs-tabLinks a').removeClass('active'); $('#{{componentId}}-{{sectionId}}-tabs-tabContent .tab-pane').removeClass('active show'); $('#{{componentId}}-{{sectionId}}-tabs-info').addClass('active show'); @@ -764,6 +773,11 @@
Select module from the tre } else { $('a[href*="#{{componentId}}-{{sectionId}}-tabs-bundlemodules"]').parent().removeClass('d-none'); } + if (!showChangeLogs) { + $('a[href*="#{{componentId}}-{{sectionId}}-tabs-changelogs"]').parent().addClass('d-none'); + } else { + $('a[href*="#{{componentId}}-{{sectionId}}-tabs-changelogs"]').parent().removeClass('d-none'); + } if (show.length > 0) { var moduleinfos = ['loader', 'info', 'noinfo', 'error', 'buttons']; @@ -776,7 +790,7 @@
Select module from the tre }); } - if (showButtons.length > 0) { + if (showButtons && showButtons.length > 0) { var modulebuttons = ['install', 'update', 'uninstall', 'remove', 'cancel', 'repo-sync']; $(modulebuttons).each(function(e, modulebutton) { if (showButtons.includes(modulebutton)) { @@ -788,26 +802,33 @@
Select module from the tre } } -dataCollectionSectionForm['funcs']['getSelectedModuleInfo'] = function(selected) { +dataCollectionSectionForm['funcs']['getSelectedModuleInfo'] = function(selected, apptype = false) { if (!selected) { return false; } var splitModule, moduleType, moduleId; - splitModule = selected.split('-'); - moduleId = splitModule[1]; - - if (selected.startsWith('components')) { - moduleType = 'components'; - } else if (selected.startsWith('packages')) { - moduleType = 'packages'; - } else if (selected.startsWith('middlewares')) { - moduleType = 'middlewares'; - } else if (selected.startsWith('views')) { - moduleType = 'views'; - } else if (selected.startsWith('bundles')) { - moduleType = 'bundles'; + if (apptype) { + moduleType = 'apptype'; + moduleId = selected; + } else { + splitModule = selected.split('-'); + moduleId = splitModule[1]; + + if (selected.startsWith('components')) { + moduleType = 'components'; + } else if (selected.startsWith('packages')) { + moduleType = 'packages'; + } else if (selected.startsWith('middlewares')) { + moduleType = 'middlewares'; + } else if (selected.startsWith('views')) { + moduleType = 'views'; + } else if (selected.startsWith('bundles')) { + moduleType = 'bundles'; + } else if (selected.startsWith('external')) { + moduleType = 'externals'; + } } if (moduleType && moduleId) { @@ -819,7 +840,7 @@
Select module from the tre return false; } -dataCollectionSectionForm['funcs']['getModuleInfo'] = function(moduleType, moduleId, sync = false) { +dataCollectionSectionForm['funcs']['getModuleInfo'] = function(moduleType, moduleId = null, sync = false) { var postData = { }; postData[$('#security-token').attr('name')] = $('#security-token').val(); postData['module_type'] = moduleType; @@ -835,14 +856,18 @@
Select module from the tre $('#security-token').val(response.token); } - $('#{{componentId}}-{{sectionId}}-moduleinfo-repo-sync').attr('disabled', false); - $('#{{componentId}}-{{sectionId}}-moduleinfo-repo-sync').children("i").removeClass("fa-cog fa-spin").addClass("fa-sync-alt"); + if (moduleType !== 'externals') { + $('#{{componentId}}-{{sectionId}}-moduleinfo-repo-sync').attr('disabled', false); + $('#{{componentId}}-{{sectionId}}-moduleinfo-repo-sync').children("i").removeClass("fa-cog fa-spin").addClass("fa-sync-alt"); + } if (response.responseCode == 0) { if (response.responseData.module) { dataCollectionSectionForm['vars']['module'] = response.responseData.module; - + if (moduleType === 'apptype') { + dataCollectionSectionForm['vars']['module']['module_type'] = 'apptype'; + } dataCollectionSectionForm['funcs']['processModuleInfo'](response.responseData.module); } } else if (response.responseCode == 1) { @@ -886,24 +911,44 @@
Select module from the tre moduleData['version'] = '' + moduleData['version'] + ''; $('#app_type').html(moduleData.app_type); - $('#category').html(moduleData.category); + if (moduleData.category) { + $('#category').html(moduleData.category); + $('#category-field').attr('hidden', false); + $('#developer-field').attr('hidden', true); + $('#developer-field').attr('hidden', true); + $('#required_by-field').attr('hidden', true); + $('#required_by').attr('hidden', true); + } else if (moduleData.developer) { + $('#developer').html(moduleData.developer); + $('#category-field').attr('hidden', true); + $('#developer-field').attr('hidden', false); + $('#required_by-field').attr('hidden', false); + $('#required_by').html(BazHelpers.createHtmlList({'obj': moduleData.required_by})); + $('#required_by').attr('hidden', false); + } $('#update_available').html(moduleData.update_available); $('#update_version').html(moduleData.update_version); $('#updated_on').html(moduleData.updated_on); $('#installed').html(moduleData.installed); $('#version').html(moduleData.version); $('#updated_by').html(moduleData.updated_by); - $('#module_type').html(moduleData.module_type); + if (moduleData.module_type) { + $('#module_type').html(moduleData.module_type); + } else { + $('#module_type').html('-'); + } if (moduleData.display_name) { $('#display_name').html(moduleData.display_name); - $('#display_name').html(moduleData.display_name); } else { $('#display_name').html(moduleData.name); } $('#module_id').html(moduleData.id); $('#description').html(moduleData.description); - if (moduleData.repo_details.latestRelease && moduleData.repo_details.latestRelease.body) { + if (moduleData.module_type !== 'externals' && + moduleData.repo_details.latestRelease && + moduleData.repo_details.latestRelease.body + ) { var changelogText; if (moduleData.repo_details.latestRelease.prerelease === false) { changelogText = @@ -919,7 +964,7 @@
Select module from the tre } $('#{{componentId}}-{{sectionId}}-auto_update')[0].checked = false; - if (moduleInfo.auto_update !== 'null') { + if (moduleInfo.auto_update && moduleInfo.auto_update !== 'null') { if (moduleInfo.auto_update == '0') { $('#{{componentId}}-{{sectionId}}-auto_update')[0].checked = false; } else if (moduleInfo.auto_update == '1') { @@ -927,7 +972,7 @@
Select module from the tre } } - if (moduleInfo.level_of_update !== 'null') { + if (moduleInfo.level_of_update && moduleInfo.level_of_update !== 'null') { $('#{{componentId}}-{{sectionId}}-level_of_update').val(moduleInfo.level_of_update).trigger('change'); } @@ -936,17 +981,33 @@
Select module from the tre if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type] && (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type], moduleInfo.id) > -1) ) { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); + } } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove'], false); + } } } else { if (dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type] && (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type], moduleInfo.id) > -1) ) { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); + } } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove'], false); + } } } } else { @@ -958,9 +1019,17 @@
Select module from the tre } if (index > -1) { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel'], false); + } } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove'], false); + } } } @@ -1027,7 +1096,7 @@
Select module from the tre dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], []); if (moduleData['app_type'] === 'core') { - if (moduleInfo['name'] !== 'Core') { + if (moduleInfo['name'] !== 'Core' && moduleData['module_type'] !== 'externals') { dataCollectionSectionForm['funcs']['moduleinfo'](['info'], [], false); } else { if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleData.module_type]) { @@ -1035,12 +1104,24 @@
Select module from the tre } if (index !== 'undefined' && index > -1) { - dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel'], false); + } } else { - if (moduleInfo.update_available == '1') { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['update', 'repo-sync']); + if (moduleData['module_type'] !== 'externals') { + if (moduleInfo.update_available == '1') { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['update', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['repo-sync']); + } } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['repo-sync']); + if (moduleInfo.update_available == '1') { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['update']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo']([], false, false); + } } } } @@ -1116,9 +1197,13 @@
Select module from the tre dataCollectionSectionForm['funcs']['moduleinfo'](['loader', 'buttons'], ['repo-sync']); + var moduleId = dataCollectionSectionForm['vars']['module']['id']; + if (dataCollectionSectionForm['vars']['module']['module_type'] === 'apptype') { + moduleId = dataCollectionSectionForm['vars']['module']['app_type']; + } dataCollectionSectionForm['funcs']['getModuleInfo']( dataCollectionSectionForm['vars']['module']['module_type'], - dataCollectionSectionForm['vars']['module']['id'], + moduleId, true ); }); @@ -1157,29 +1242,47 @@
Select module from the tre if (task === 'install') { dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-install', 'primary', false); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); - dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id, true); + if (moduleType === 'apptype') { + dataCollectionSectionForm['funcs']['initQueueButtons'](); + } else { + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-install', 'primary', false); + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); + dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id, true); + } } else if (task === 'update') { dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-update', 'info', false); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); - dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id); + if (moduleType === 'apptype') { + dataCollectionSectionForm['funcs']['initQueueButtons'](); + } else { + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-update', 'info', false); + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); + dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id); + } } else if (task === 'uninstall') { dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-uninstall', 'warning', false); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); - dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id, false, true); + if (moduleType === 'apptype') { + dataCollectionSectionForm['funcs']['initQueueButtons'](); + } else { + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-uninstall', 'warning', false); + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); + dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id, false, true); + } } else if (task === 'remove') { dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel']); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-remove', 'danger', false); - dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); - dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id, false, false, true); + if (moduleType === 'apptype') { + dataCollectionSectionForm['funcs']['initQueueButtons'](); + } else { + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-remove', 'danger', false); + dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-queue', 'purple', false); + dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](moduleType + '-' + id, false, false, true); + } } else if (task === 'cancel') { dataCollectionSectionForm['funcs']['processModuleInfo'](dataCollectionSectionForm['vars']['module']); for (var queueTask in dataCollectionSectionForm['vars']['queue']['tasks']) { - if (dataCollectionSectionForm['vars']['queue']['tasks'][queueTask].length === 0) { + if (!dataCollectionSectionForm['vars']['queue']['tasks'][queueTask] || + (dataCollectionSectionForm['vars']['queue']['tasks'][queueTask] && dataCollectionSectionForm['vars']['queue']['tasks'][queueTask].length === 0) + ) { dataCollectionSectionForm['funcs']['toggleJstreeTool']('{{componentId}}-{{sectionId}}-modules-filter-' + queueTask); } } @@ -1187,6 +1290,10 @@
Select module from the tre dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText']( dataCollectionSectionForm['vars']['module']['module_type'] + '-' + dataCollectionSectionForm['vars']['module']['id'] ); + + if (dataCollectionSectionForm['vars']['queue']['total'] === 0) { + dataCollectionSectionForm['funcs']['initQueueButtons'](false); + } } else if (task === 'clearQueue') { dataCollectionSectionForm['funcs']['clearQueue'](); } @@ -1231,20 +1338,7 @@
Select module from the tre BazCore.updateBreadcrumb(); } }); - // dataCollectionSectionForm['funcs']['analyseQueue'](); }); - - // $('#{{componentId}}-{{sectionId}}-perform-precheck').click(function(e) { - // e.preventDefault(); - - // dataCollectionSectionForm['funcs']['processQueue'](); - // }); - - // $('#{{componentId}}-{{sectionId}}-process-queue').click(function(e) { - // e.preventDefault(); - - // dataCollectionSectionForm['funcs']['processQueue']('process'); - // }); } else { $('#{{componentId}}-{{sectionId}}-analyse-queue').addClass('disabled'); $('#{{componentId}}-{{sectionId}}-clear-queue').attr('disabled', true); @@ -1269,34 +1363,6 @@
Select module from the tre dataCollectionSectionForm['funcs']['moduleinfo'](['noinfo']); $('#{{componentId}}-{{sectionId}}-modules').jstree().deselect_all(); } -// dataCollectionSectionForm['funcs']['processQueue'] = function(task = 'precheck') { -// var postData = { }; -// postData[$('#security-token').attr('name')] = $('#security-token').val(); -// postData['queue'] = dataCollectionSectionForm['vars']['queue']['tasks']; -// postData['process'] = 'runprecheck'; -// if (task === 'process') { -// postData['process'] = 'runprocess'; -// } - -// $.post('{{links.url("modules/processQueue")}}', postData, function(response) { -// if (response.tokenKey && response.token) { -// $('#security-token').attr('name', response.tokenKey); -// $('#security-token').val(response.token); -// } - -// if (response.responseCode == 0) { -// paginatedPNotify('success', { -// text : response.responseMessage, -// textTrusted : true -// }); -// } else { -// paginatedPNotify('error', { -// text : response.responseMessage, -// textTrusted : true -// }); -// } -// }, 'json'); -// } dataCollectionSectionForm['funcs']['initSync'] = function(val) { dataCollectionSectionForm['vars']['sync'] = true; diff --git a/apps/Core/Views/Default/html/modules/modules/info.html b/apps/Core/Views/Default/html/modules/modules/info.html index aa6beb68b..7502cabf2 100644 --- a/apps/Core/Views/Default/html/modules/modules/info.html +++ b/apps/Core/Views/Default/html/modules/modules/info.html @@ -22,10 +22,14 @@
-
+ +
@@ -50,6 +54,12 @@
+