From 988b22c3f256b8c68c297b632be1cf75d6eb5ab5 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 13 Feb 2025 01:42:48 +1100 Subject: [PATCH 01/36] update issue #605 --- .../Devtools/Modules/ModulesComponent.php | 27 +- .../Devtools/Modules/DevtoolsModules.php | 27 +- .../Views/Default/html/modules/modules.html | 237 +++++++++++------- .../ModulesServiceProvider/Manager.php | 11 +- .../ModulesServiceProvider/Queues.php | 105 ++++---- 5 files changed, 258 insertions(+), 149 deletions(-) diff --git a/apps/Core/Components/Devtools/Modules/ModulesComponent.php b/apps/Core/Components/Devtools/Modules/ModulesComponent.php index 338779a8f..e9c5f834c 100644 --- a/apps/Core/Components/Devtools/Modules/ModulesComponent.php +++ b/apps/Core/Components/Devtools/Modules/ModulesComponent.php @@ -28,6 +28,8 @@ public function initialize() */ public function viewAction() { + $this->view->bundles = false; + $this->view->bundlesjson = false; if (isset($this->getData()['bundles'])) { $this->view->bundles = true; @@ -112,7 +114,9 @@ public function viewAction() $modulesJson = []; foreach ($modules as $moduleKey => $moduleJson) { - if ($moduleKey === 'bundles') { + if ($moduleKey === 'bundles' && + !$this->view->bundles + ) { continue; } @@ -149,6 +153,11 @@ public function viewAction() if ($type !== 'apptypes') { if ($type !== 'core' && $type !== 'bundles') { + if (isset($modules['bundles'])) { + unset($modules['bundles']); + } + $this->view->modules = $modules; + $this->view->categoryArr = ${$type . 'CategoryArr'}; if ($type === 'components') { @@ -388,7 +397,7 @@ public function viewAction() $this->view->apis = $apis; unset($appTypes['core']);//Remove core $this->view->appTypes = $appTypes; - $this->view->bundleModules = $this->modulesPackage->getDefaultDependencies(); + $this->view->bundleModules = $this->modulesPackage->getDefaultDependencies('bundles'); if ($this->getData()['id'] != 0) { $bundle = $this->modules->bundles->getById($this->getData()['id']); @@ -402,10 +411,18 @@ public function viewAction() } $this->view->bundle = $bundle; $this->view->bundleModules = $bundle['bundle_modules']; - } - if (isset($modules['bundles'])) { - unset($modules['bundles']); + if (isset($modules['bundles']['childs'])) { + foreach ($modules['bundles']['childs'] as $childBundleKey => $childBundle) { + if ($bundle['id'] === $childBundle['id']) { + unset($modules['bundles']['childs'][$childBundleKey]); + } + } + + if (count($modules['bundles']['childs']) === 0) { + unset($modules['bundles']); + } + } } $this->view->modules = $modules; diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index d466964e6..a5c78d8ca 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -680,22 +680,29 @@ public function getDefaultDependencies($type = null) 'components' => [], 'packages' => [], 'middlewares' => [], - 'views' => [], - 'external' => [ - 'composer' => [ + 'views' => [] + ]; + + if ($type && $type !== 'views') { + if ($type === 'bundles') { + $defaultDependencies['bundles'] = []; + } + + $defaultDependencies['external'] = + [ + 'composer' => + [ 'require' => [] ], - 'config' => [ + 'config' => + [ 'allow-plugins' => [] ], - 'extra' => [ + 'extra' => + [ 'patches' => [] ] - ] - ]; - - if ($type && $type === 'views') { - unset($defaultDependencies['external']); + ]; } return $this->helper->encode($defaultDependencies); diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index e2d06e5b7..bca43bf43 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -131,8 +131,8 @@ 'fieldJstreeEdit' : false, 'fieldJstreeExpand' : true, 'fieldJstreeCollapse' : true, - 'fieldJstreeFirstOpen' : true, - 'fieldJstreeAllOpen' : true, + 'fieldJstreeFirstOpen' : false, + 'fieldJstreeAllOpen' : false, 'fieldJstreeAllChecked' : false, 'fieldJstreeRootIcon' : 'th', 'fieldJstreeToggleAllChildren' : true, @@ -374,18 +374,18 @@
Select module from the tre $('#{{componentId}}-{{sectionId}}-modules').on('ready.jstree', function(e) { dataCollectionSectionForm['vars']['rootTree'] = $('#{{componentId}}-{{sectionId}}-modules').jstree().get_json('#', {flat:true}); - var selected; + // var selected; - $(dataCollectionSectionForm['vars']['rootTree']).each(function(i, v) { - v.text = v.text.toLowerCase(); - if (v.data.apiid == '1' && v.data.type === 'repo' && v.text.includes('core')) { - selected = v.id; + // $(dataCollectionSectionForm['vars']['rootTree']).each(function(i, v) { + // v.text = v.text.toLowerCase(); + // if (v.data.apiid == '1' && v.data.type === 'repo' && v.text.includes('core')) { + // selected = v.id; - $('#{{componentId}}-{{sectionId}}-modules').jstree().select_node(v.id); + // $('#{{componentId}}-{{sectionId}}-modules').jstree().select_node(v.id); - return false; - } - }); + // return false; + // } + // }); dataCollectionSectionForm['funcs']['applyColorsToTreeIconsAndUpdateText'](null, false, false, false, true); }); @@ -668,13 +668,13 @@
Select module from the tre dataCollectionSectionForm['vars']['initJstree'] = false; } - dataCollectionSectionForm['vars']['filter'] = true; - $('#{{componentId}}-{{sectionId}}-modules-tree-search-input').val('update'); - $('#{{componentId}}-{{sectionId}}-modules').jstree().search('update'); + // dataCollectionSectionForm['vars']['filter'] = true; + // $('#{{componentId}}-{{sectionId}}-modules-tree-search-input').val('update'); + // $('#{{componentId}}-{{sectionId}}-modules').jstree().search('update'); } else if (dataCollectionSectionForm['vars']['new_available'] == 1) { - dataCollectionSectionForm['vars']['filter'] = true; - $('#{{componentId}}-{{sectionId}}-modules-tree-search-input').val('new'); - $('#{{componentId}}-{{sectionId}}-modules').jstree().search('new'); + // dataCollectionSectionForm['vars']['filter'] = true; + // $('#{{componentId}}-{{sectionId}}-modules-tree-search-input').val('new'); + // $('#{{componentId}}-{{sectionId}}-modules').jstree().search('new'); } if (dataCollectionSectionForm['vars']['queue']['total'] > 0) { @@ -693,6 +693,8 @@
Select module from the tre $('#{{componentId}}-{{sectionId}}-modules').on('select_node.jstree', function() { var selected = $('#{{componentId}}-{{sectionId}}-modules').jstree().get_selected(true); + $('#{{componentId}}-{{sectionId}}-modules').jstree('open_all', selected[0].id); + if (selected[0].id.startsWith('j')) { if (selected[0].data.type !== 'repo') { if (selected[0].data.type === 'apptype') { @@ -901,6 +903,10 @@
Select module from the tre moduleData['installed'] = 'No'; } + if (moduleData['module_type'] === 'bundles') { + moduleData['installed'] = '-'; + } + if (moduleData['update_available'] !== '-' && moduleData['update_available'] == 1) { moduleData['update_available'] = 'Yes'; } @@ -928,6 +934,14 @@
Select module from the tre } $('#update_available').html(moduleData.update_available); $('#update_version').html(moduleData.update_version); + $($('#update_available').parents('.col')[0]).attr('hidden', false); + $($('#update_version').parents('.col')[0]).attr('hidden', false); + $($('#installed').parents('.col')[0]).attr('hidden', false); + if (moduleData['module_type'] === 'bundles') { + $($('#update_available').parents('.col')[0]).attr('hidden', true); + $($('#update_version').parents('.col')[0]).attr('hidden', true); + $($('#installed').parents('.col')[0]).attr('hidden', true); + } $('#updated_on').html(moduleData.updated_on); $('#installed').html(moduleData.installed); $('#version').html(moduleData.version); @@ -976,61 +990,65 @@
Select module from the tre $('#{{componentId}}-{{sectionId}}-level_of_update').val(moduleInfo.level_of_update).trigger('change'); } - if (moduleInfo.installed == '1') { - if (moduleInfo.update_available == '1') { - if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type] && - (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type], moduleInfo.id) > -1) - ) { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + if (moduleData['module_type'] === 'bundles') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['install', 'uninstall', 'remove', 'repo-sync']); + } else { + if (moduleInfo.installed == '1') { + if (moduleInfo.update_available == '1') { + if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type] && + (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type], moduleInfo.id) > -1) + ) { + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); + } } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove'], false); + } } } else { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove', 'repo-sync']); + if (dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type] && + (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type], moduleInfo.id) > -1) + ) { + 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'], false); + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', '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) - ) { + if (dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type]) { + index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type], moduleData.id); + } + if (!index && dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type]) { + index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type], moduleData.id); + } + + if (index > -1) { if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel', 'repo-sync']); } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); + dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel'], false); } } else { if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove', 'repo-sync']); + dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove', 'repo-sync']); } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove'], false); + dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove'], false); } } } - } else { - if (dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type]) { - index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type], moduleData.id); - } - if (!index && dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type]) { - index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type], moduleData.id); - } - - if (index > -1) { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel'], false); - } - } else { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove'], false); - } - } } if (moduleData['module_type'] === 'bundles') { @@ -1039,6 +1057,9 @@
Select module from the tre if (moduleData.bundle_modules && Object.keys(moduleData.bundle_modules).length > 0) { for (var bundleModuleType in moduleData.bundle_modules) { if (bundleModuleType === 'core' || bundleModuleType === 'apptype') { + if (moduleData.bundle_modules[bundleModuleType].length === 0) { + continue; + } bundleModuleHtml += ' ' + ' ' + moduleData.bundle_modules[bundleModuleType]['name'] + '' + @@ -1427,10 +1448,13 @@
Select module from the tre } dataCollectionSectionForm['funcs']['processSync'] = function(response) { - var text = 'Sync Complete.
'; + var paginateText; var newCounter = 0; + var newCounterText = ''; var updatesCounter = 0; + var updateCounterText = ''; var noReleaseCounter = 0; + var noReleaseCounterText = ''; var newModule = 'new module'; var update = 'update'; var noRelease = ' module with no release. It was ignored.'; @@ -1439,7 +1463,7 @@
Select module from the tre newCounter = response.responseData.counter.new.count; if (response.responseData.counter.new.api && response.responseData.counter.new.api.name) { - text += response.responseData.counter.new.api.name + ' has ' + newCounterText += response.responseData.counter.new.api.name + ' has ' } } @@ -1447,7 +1471,7 @@
Select module from the tre updatesCounter = response.responseData.counter.updates.count; if (response.responseData.counter.updates.api && response.responseData.counter.updates.api.name) { - text += response.responseData.counter.updates.api.name + ' has ' + updateCounterText += response.responseData.counter.updates.api.name + ' has ' } } @@ -1455,7 +1479,7 @@
Select module from the tre noReleaseCounter = response.responseData.counter.noRelease.count; if (response.responseData.counter.noRelease.api && response.responseData.counter.noRelease.api.name) { - text += response.responseData.counter.noRelease.api.name + ' has ' + noReleaseCounterText += response.responseData.counter.noRelease.api.name + ' has ' } } @@ -1469,22 +1493,57 @@
Select module from the tre if (noReleaseCounter > 1) { noRelease = ' modules with no release. They were ignored.'; } - if (newCounter !== 0 && updatesCounter === 0) { + + if (newCounter > 0) { dataCollectionSectionForm['vars']['new_available'] = newCounter; - text += newCounter + ' ' + newModule + ' available.
No ' + update + ' available.'; - } else if (newCounter === 0 && updatesCounter !== 0) { - text += updatesCounter + ' new ' + update + ' available.
No ' + newModule + ' available.'; - } else if (newCounter !== 0 && updatesCounter !== 0) { - text += updatesCounter + ' new ' + update + ' available.
' + newCounter + ' ' + newModule + ' available.'; + paginateText = 'Sync Complete.
'; + paginateText += newCounterText + newCounter + ' ' + newModule + ' available.'; + + paginatedPNotify('info', { + text : paginateText, + textTrusted : true + }); + } + if (updatesCounter > 0) { + dataCollectionSectionForm['vars']['update_available'] = 1; + dataCollectionSectionForm['vars']['initJstree'] = false; + paginateText = 'Sync Complete.
'; + paginateText += updatesCounter + ' ' + update + ' available.'; + + paginatedPNotify('info', { + text : paginateText, + textTrusted : true + }); } + if (noReleaseCounter > 0) { + paginateText = 'Sync Complete.
'; + paginateText += noReleaseCounter + noRelease; - if ((newCounter !== 0 || updatesCounter !== 0) && noReleaseCounter !== 0) { - text += '
' + noReleaseCounter + noRelease + '
'; - } else if (noReleaseCounter !== 0) { - text += noReleaseCounter + noRelease + '
'; + paginatedPNotify('notice', { + text : paginateText, + textTrusted : true + }); } + // if (newCounter !== 0 && updatesCounter === 0) { + // text += newCounter + ' ' + newModule + ' available.
No ' + update + ' available.'; + // } else if (newCounter === 0 && updatesCounter !== 0) { + // text += updatesCounter + ' new ' + update + ' available.
No ' + newModule + ' available.'; + // } else if (newCounter !== 0 && updatesCounter !== 0) { + // text += updatesCounter + ' new ' + update + ' available.
' + newCounter + ' ' + newModule + ' available.'; + // } + + // if ((newCounter !== 0 || updatesCounter !== 0) && noReleaseCounter !== 0) { + // text += '
' + noReleaseCounter + noRelease + '
'; + // } else if (noReleaseCounter !== 0) { + // text += noReleaseCounter + noRelease + '
'; + // } } else { - text = 'Sync Complete.
No ' + newModule + ' or ' + update + ' available.'; + paginateText += 'No ' + newModule + ' or ' + update + ' available.'; + + paginatedPNotify('info', { + text : paginateText, + textTrusted : true + }); } if (response.responseData.modules) { @@ -1499,6 +1558,10 @@
Select module from the tre ''; $('#{{componentId}}-{{sectionId}}-modules-tree-div').empty().html(modulesHtml); + + if (dataCollectionSection['{{componentId}}-{{sectionId}}-modules']['jstree']) { + delete dataCollectionSection['{{componentId}}-{{sectionId}}-modules']['jstree']; + } } BazContentFields.init({ @@ -1510,22 +1573,22 @@
Select module from the tre dataCollectionSectionForm['funcs']['jstreeSelectNode'](); dataCollectionSectionForm['funcs']['jstreeReady'](); - dataCollectionSectionForm['vars']['syncInfo'] = text; - - if (updatesCounter > 0) { - dataCollectionSectionForm['vars']['update_available'] = 1; - dataCollectionSectionForm['vars']['filter'] = true; - dataCollectionSectionForm['vars']['initJstree'] = false; - } else { - var notificationClass = 'info'; - if (noReleaseCounter > 0) { - notificationClass = 'notice'; - } - paginatedPNotify(notificationClass, { - text : dataCollectionSectionForm['vars']['syncInfo'], - textTrusted : true - }); - } + // dataCollectionSectionForm['vars']['syncInfo'] = text; + + // if (updatesCounter > 0) { + // dataCollectionSectionForm['vars']['update_available'] = 1; + // dataCollectionSectionForm['vars']['filter'] = true; + // dataCollectionSectionForm['vars']['initJstree'] = false; + // } else { + // var notificationClass = 'info'; + // if (noReleaseCounter > 0) { + // notificationClass = 'notice'; + // } + // paginatedPNotify(notificationClass, { + // text : dataCollectionSectionForm['vars']['syncInfo'], + // textTrusted : true + // }); + // } if (dataCollectionSectionForm['vars']['queue']['total'] > 0) { $('#{{componentId}}-{{sectionId}}-analyse-queue').removeClass('disabled'); diff --git a/system/Base/Providers/ModulesServiceProvider/Manager.php b/system/Base/Providers/ModulesServiceProvider/Manager.php index 76f292a63..53f19f1f9 100644 --- a/system/Base/Providers/ModulesServiceProvider/Manager.php +++ b/system/Base/Providers/ModulesServiceProvider/Manager.php @@ -228,12 +228,19 @@ public function updateModuleRepoDetails($module, $data = null) if ($latestRelease) { $module['repo_details']['latestRelease'] = $latestRelease; - $module['update_available'] = '1'; - $module['update_version'] = $module['repo_details']['latestRelease']['name']; $latestReleaseJson = $this->getRemoteModuleJson($module['module_type'], $module, true); if ($latestReleaseJson) { $module['repo_details']['latestRelease']['moduleJson'] = $this->remoteModulesJson[$module['module_type']][$module['name']]; + if ($module['module_type'] === 'bundles') { + $module['update_available'] = null; + $module['update_version'] = null; + $module['installed'] = null; + $module['version'] = $module['repo_details']['latestRelease']['name']; + } else { + $module['update_available'] = '1'; + $module['update_version'] = $module['repo_details']['latestRelease']['name']; + } } } diff --git a/system/Base/Providers/ModulesServiceProvider/Queues.php b/system/Base/Providers/ModulesServiceProvider/Queues.php index 9a32e3fac..e9a23b5ba 100644 --- a/system/Base/Providers/ModulesServiceProvider/Queues.php +++ b/system/Base/Providers/ModulesServiceProvider/Queues.php @@ -420,50 +420,7 @@ public function analyseQueue(&$queue = null, $reAnalyse = false) $this->addToQueueTasksAndResults($taskName, $moduleType, $module); } else { if (isset($module['bundle_modules'])) { - if (is_string($module['bundle_modules'])) { - $module['bundle_modules'] = $this->helper->decode($module['bundle_modules'], true); - } - - if (count($module['bundle_modules']) > 0) { - foreach ($module['bundle_modules'] as $bundleType => $bundles) { - if (count($bundles) === 0) { - continue; - } - - if ($bundleType === 'apptype') { - $bundleModule = $this->apps->types->getAppTypeByRepo($bundles['repo']); - - if ($bundleModule) { - $this->compareAndAddToQueue($bundles, $bundleModule, $taskName, $bundleType); - } else { - $this->addToQueueTasksAndResults($taskName, $bundleType, $bundles, null, 'fail', $this->getApiClientServices($bundles, true)); - } - } else if ($bundleType === 'core') { - $bundleModule = $this->modules->packages->getPackageByRepo($bundles['repo']); - - $this->compareAndAddToQueue($bundles, $bundleModule, 'first', 'packages'); - } else { - if ($bundleType === 'external') { - $this->checkComposerAndAddToQueue($bundles, $module); - - continue; - } - - foreach ($bundles as $bundleKey => $bundle) { - $bundleModuleMethod = 'get' . ucfirst(substr($bundleType, 0, -1)) . 'ByRepo'; - $bundleModuleType = $bundleType; - - $bundleModule = $this->modules->{$bundleModuleType}->$bundleModuleMethod($bundle['repo']); - - if ($bundleModule) { - $this->compareAndAddToQueue($bundle, $bundleModule, $taskName, $bundleType); - } else { - $this->addToQueueTasksAndResults($taskName, $bundleType, $bundle, null, 'fail', $this->getApiClientServices($bundle, true)); - } - } - } - } - } + $this->processBundleModules($taskName, $module); } } } else { @@ -585,6 +542,62 @@ public function analyseQueue(&$queue = null, $reAnalyse = false) return false; } + protected function processBundleModules($taskName, $module) + { + if (is_string($module['bundle_modules'])) { + $module['bundle_modules'] = $this->helper->decode($module['bundle_modules'], true); + } + + if (count($module['bundle_modules']) > 0) { + foreach ($module['bundle_modules'] as $bundleType => $bundles) { + if (count($bundles) === 0) { + continue; + } + + if ($bundleType === 'apptype') { + $bundleModule = $this->apps->types->getAppTypeByRepo($bundles['repo']); + + if ($bundleModule) { + $this->compareAndAddToQueue($bundles, $bundleModule, $taskName, $bundleType); + } else { + $this->addToQueueTasksAndResults($taskName, $bundleType, $bundles, null, 'fail', $this->getApiClientServices($bundles, true)); + } + } else if ($bundleType === 'core') { + $bundleModule = $this->modules->packages->getPackageByRepo($bundles['repo']); + + $this->compareAndAddToQueue($bundles, $bundleModule, 'first', 'packages'); + } else if ($bundleType === 'bundles') { + foreach ($bundles as $bundle) { + $bundleModule = $this->modules->bundles->getBundleByRepo($bundle['repo']); + + if (isset($bundleModule['bundle_modules'])) { + $this->processBundleModules($taskName, $bundleModule); + } + } + } else { + if ($bundleType === 'external') { + $this->checkComposerAndAddToQueue($bundles, $module); + + continue; + } + + foreach ($bundles as $bundleKey => $bundle) { + $bundleModuleMethod = 'get' . ucfirst(substr($bundleType, 0, -1)) . 'ByRepo'; + $bundleModuleType = $bundleType; + + $bundleModule = $this->modules->{$bundleModuleType}->$bundleModuleMethod($bundle['repo']); + + if ($bundleModule) { + $this->compareAndAddToQueue($bundle, $bundleModule, $taskName, $bundleType); + } else { + $this->addToQueueTasksAndResults($taskName, $bundleType, $bundle, null, 'fail', $this->getApiClientServices($bundle, true)); + } + } + } + } + } + } + protected function getApiClientServices($module, $getLogMessage = false) { $appTypeRepo = explode('/', str_replace('https://', '', $module['repo'])); @@ -665,7 +678,9 @@ protected function compareAndAddToQueue($requestedModule, $installedModule, $tas $this->addToQueueTasksAndResults($task, $moduleType, $installedModule, null, 'fail', $analyseLogs); } } else { - if ($installedModule['installed'] != '1') { + if (isset($installedModule['installed']) && + $installedModule['installed'] != '1' + ) { $this->addToQueueTasksAndResults('install', $moduleType, $installedModule); if ($moduleType === 'views' && From 3f93cfbf51a6eab4ca093cc7a53fe9da3353b2f7 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 13 Feb 2025 02:02:07 +1100 Subject: [PATCH 02/36] update #34, fix issue with core version not being updated. --- .../Base/Providers/ModulesServiceProvider/Installer.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system/Base/Providers/ModulesServiceProvider/Installer.php b/system/Base/Providers/ModulesServiceProvider/Installer.php index 9121493ad..ecd86bc25 100644 --- a/system/Base/Providers/ModulesServiceProvider/Installer.php +++ b/system/Base/Providers/ModulesServiceProvider/Installer.php @@ -1201,7 +1201,9 @@ protected function updateVersion($args) $this->queue['results'][$taskName][$module['module_type']][$module['id']]['result'] = 'pass'; $resultQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['result_logs']; - if ($taskName === 'update') { + if ($taskName === 'update' || + $module['name'] === 'Core' + ) { $versionArr = explode(' -> ', $module['version']); if (count($versionArr) !== 2) { @@ -1240,7 +1242,9 @@ protected function updateVersion($args) ); } - if ($taskName === 'update') { + if ($taskName === 'update' || + $module['name'] === 'Core' + ) { $moduleArr['version'] = $moduleArr['update_version']; } From e1de83a93db8cce62d75374c8245cb90c9ddc45a Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 13 Feb 2025 04:34:20 +1100 Subject: [PATCH 03/36] update #34, working on uninstall. --- .../Views/Default/html/modules/modules.html | 11 +- .../ModulesServiceProvider/Installer.php | 105 ++++++++++++++++-- .../Modules/Components.php | 18 ++- 3 files changed, 123 insertions(+), 11 deletions(-) diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index bca43bf43..b3179aaf5 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -1011,8 +1011,15 @@
Select module from the tre } } } else { - if (dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type] && - (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type], moduleInfo.id) > -1) + if ((dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type] && + Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type]).length > 0 && + BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type], moduleInfo.id) > -1) || + (dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type] && + Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type]).length > 0 && + BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type], moduleInfo.id) > -1) || + (dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type] && + Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type]).length > 0 && + BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type], moduleInfo.id) > -1) ) { if (moduleData['module_type'] !== 'externals') { dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); diff --git a/system/Base/Providers/ModulesServiceProvider/Installer.php b/system/Base/Providers/ModulesServiceProvider/Installer.php index ecd86bc25..910777c78 100644 --- a/system/Base/Providers/ModulesServiceProvider/Installer.php +++ b/system/Base/Providers/ModulesServiceProvider/Installer.php @@ -276,27 +276,68 @@ protected function precheckQueueData($args) $taskName = $args[0]; $module = $args[1]; + if ($taskName === 'uninstall' || $taskName === 'remove') { + $sync = false; + } else { + $sync = true; + } + $this->modulesToInstallOrUpdate = $this->modules->manager->getModuleInfo( [ 'module_type' => $module['module_type'], 'module_id' => $module['id'], - 'sync' => true + 'sync' => $sync ] ); if ($this->modulesToInstallOrUpdate) { $this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck'] = 'pass'; - if (is_string($this->modulesToInstallOrUpdate['repo_details'])) { - try { - $this->modulesToInstallOrUpdate['repo_details'] = $this->helper->decode($this->modulesToInstallOrUpdate['repo_details'], true); + if ($sync) { + if (is_string($this->modulesToInstallOrUpdate['repo_details'])) { + try { + $this->modulesToInstallOrUpdate['repo_details'] = $this->helper->decode($this->modulesToInstallOrUpdate['repo_details'], true); + return true; + } catch (\Exception $e) { + //Do Nothings + } + } else { return true; - } catch (\Exception $e) { - //Do Nothings } } else { - return true; + $appBinding = false; + + if ($this->modulesToInstallOrUpdate['apps'] && + is_string($this->modulesToInstallOrUpdate['apps']) + ) { + try { + $this->modulesToInstallOrUpdate['apps'] = $this->helper->decode($this->modulesToInstallOrUpdate['apps'], true); + + if (count($this->modulesToInstallOrUpdate['apps']) > 0) { + foreach ($this->modulesToInstallOrUpdate['apps'] as $appId => $appSettings) { + if (array_key_exists('enabled', $appSettings) && $appSettings['enabled'] == true) { + $this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck'] = 'fail'; + + $preCheckQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck_logs']; + + return $this->queueHasErrors( + 'Module is assigned to app with ID: ' . $appId . '. Cannot ' . $taskName . '!', + $preCheckQueueLogs, + true + ); + } + } + } + + return true; + } catch (\Exception $e) { + //Do Nothings + } + } else { + return true; + } + } } @@ -1259,6 +1300,8 @@ protected function updateVersion($args) if (str_contains($module['module_type'], 'apptype')) { $this->apps->types->update($moduleArr); } else { + $moduleArr['dependencies'] = $moduleArr['repo_details']['latestRelease']['moduleJson']['dependencies']; + $this->modules->{$module['module_type']}->update($moduleArr); } @@ -1473,6 +1516,54 @@ protected function registerRunPrecheckProgressMethods() } } + foreach ($this->queue['tasks']['analysed'] as $taskName => $modulesTypes) { + if ($taskName === 'uninstall' && + count($modulesTypes) > 0 + ) { + foreach ($modulesTypes as $moduleType => $modules) { + if ((is_array($modules) && count($modules) === 0) || + !is_array($modules) + ) { + continue; + } + + foreach ($modules as $module) { + array_push($this->runPrecheckProgressMethods, + [ + 'method' => 'precheckQueueData-' . $module['id'] . '-' . strtolower(str_replace(' ', '', $module['name'])), + 'text' => 'Perform precheck for module ' . $module['name'] . ' (' . ucfirst($module['module_type']) . ') ...', + 'args' => [$taskName, $module], + ] + ); + } + } + } + } + + foreach ($this->queue['tasks']['analysed'] as $taskName => $modulesTypes) { + if ($taskName === 'remove' && + count($modulesTypes) > 0 + ) { + foreach ($modulesTypes as $moduleType => $modules) { + if ((is_array($modules) && count($modules) === 0) || + !is_array($modules) + ) { + continue; + } + + // foreach ($modules as $module) { + // array_push($this->runPrecheckProgressMethods, + // [ + // 'method' => 'precheckQueueData-' . $module['id'] . '-' . strtolower(str_replace(' ', '', $module['name'])), + // 'text' => 'Perform precheck for module ' . $module['name'] . ' (' . ucfirst($module['module_type']) . ') ...', + // 'args' => [$taskName, $module], + // ] + // ); + // } + } + } + } + $this->basepackages->progress->registerMethods($this->runPrecheckProgressMethods); } diff --git a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php index 7054cd0a1..d8d27f556 100644 --- a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php +++ b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php @@ -355,9 +355,7 @@ public function updateComponents(array $data) } if (isset($component['dependencies']['packages']) && count($component['dependencies']['packages']) > 0) { - foreach ($component['dependencies']['packages'] as $key => $dependencyPackage) { - $package = $this->modules->packages->getPackageByNameForRepo($dependencyPackage['name'], $dependencyPackage['repo']); if ($package) { @@ -372,6 +370,22 @@ public function updateComponents(array $data) } } + if (isset($component['dependencies']['views']) && count($component['dependencies']['views']) > 0) { + foreach ($component['dependencies']['views'] as $key => $dependencyView) { + $view = $this->modules->views->getViewByRepo($dependencyView['repo']); + + if ($view) { + $view['apps'] = $this->helper->decode($view['apps'], true); + + $view['apps'][$data['id']]['enabled'] = true; + + $view['apps'] = $this->helper->encode($view['apps']); + + $this->modules->views->update($view); + } + } + } + $component['dependencies'] = $this->helper->encode($component['dependencies'], JSON_UNESCAPED_SLASHES); } else if ($status === false) { From 7a94bbccc752c8b7e2e001065d79134fa8bffa4e Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 13 Feb 2025 16:57:40 +1100 Subject: [PATCH 04/36] issue #34, Add menu to component during install. Fix issue with menu checkboxes not showing up in app. --- apps/Core/Components/Apps/AppsComponent.php | 4 ++-- .../ModulesServiceProvider/MenuInstaller.php | 16 ++++++++++++++-- .../Modules/Components.php | 11 +++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/apps/Core/Components/Apps/AppsComponent.php b/apps/Core/Components/Apps/AppsComponent.php index 70378c4dc..d8591a0ea 100644 --- a/apps/Core/Components/Apps/AppsComponent.php +++ b/apps/Core/Components/Apps/AppsComponent.php @@ -112,10 +112,10 @@ public function viewAction() } } - $this->view->modulesMenus = $this->basepackages->menus->getMenusForApp($app['id']); + $this->view->modulesMenus = $this->basepackages->menus->getMenusForAppType($app['app_type'], false); //Components - $componentsArr = $this->modules->components->getComponentsForAppType($app['app_type']); + $componentsArr = $this->modules->components->getComponentsForAppType($app['app_type'], true); foreach ($componentsArr as $key => &$componentValue) { if ($componentValue['apps']) { if (is_string($componentValue['apps'])) { diff --git a/system/Base/Providers/ModulesServiceProvider/MenuInstaller.php b/system/Base/Providers/ModulesServiceProvider/MenuInstaller.php index 1dbdf239a..60e258e7e 100644 --- a/system/Base/Providers/ModulesServiceProvider/MenuInstaller.php +++ b/system/Base/Providers/ModulesServiceProvider/MenuInstaller.php @@ -28,11 +28,23 @@ public function installMenu($componentClass) if ($menu) { $this->basepackages->menus->updateMenu($menu['id'], $installComponentJsonFile); } else { - $this->basepackages->menus->addMenu($installComponentJsonFile); + $menu = $this->basepackages->menus->addMenu($installComponentJsonFile); + } + + //Assign MenuId + $componentClassArr = array_slice(explode('\\', get_class($componentClass)), 1, -2); + $componentClass = 'Apps\\' . implode('\\', $componentClassArr) . '\\' . $this->helper->last($componentClassArr) . 'Component'; + + $component = $this->modules->components->getComponentByClass($componentClass); + + if ($component) { + $component['menu'] = $installComponentJsonFile['menu']; + $component['menu_id'] = $menu['id']; + + $this->modules->components->update($component); } } } catch (FilesystemException | UnableToCheckExistence | UnableToReadFile | \throwable $e) { - trace([$e]); throw $e; } diff --git a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php index d8d27f556..8dbb0bc71 100644 --- a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php +++ b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php @@ -139,6 +139,17 @@ public function getComponentByNameForAppId($name, $appId) return false; } + public function getComponentByClass($class) + { + foreach($this->components as $component) { + if ($component['class'] === $class) { + return $component; + } + } + + return false; + } + public function getComponentByClassForAppId($class, $appId = null) { if (!$appId) { From 85abe5ee076e781d23852a2cfc07564ca0d94673 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 13 Feb 2025 17:00:01 +1100 Subject: [PATCH 05/36] fix issue #606 --- apps/Core/Components/Apps/AppsComponent.php | 4 ++-- .../Viewssettings/ViewssettingsComponent.php | 5 ++++- .../Providers/DomainsServiceProvider/Domains.php | 2 +- .../ModulesServiceProvider/Modules/Components.php | 7 ++++++- .../ModulesServiceProvider/Modules/Middlewares.php | 8 +++++++- .../ModulesServiceProvider/Modules/Views.php | 12 ++++++++++-- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/apps/Core/Components/Apps/AppsComponent.php b/apps/Core/Components/Apps/AppsComponent.php index d8591a0ea..897350c55 100644 --- a/apps/Core/Components/Apps/AppsComponent.php +++ b/apps/Core/Components/Apps/AppsComponent.php @@ -163,7 +163,7 @@ public function viewAction() } //Middlewares - $middlewaresArr = $this->modules->middlewares->getMiddlewaresForAppType($app['app_type'], $app['id']); + $middlewaresArr = $this->modules->middlewares->getMiddlewaresForAppType($app['app_type'], $app['id'], true); foreach ($middlewaresArr as $key => &$middlewareValue) { if ($middlewareValue['apps']) { if (is_string($middlewareValue['apps'])) { @@ -189,7 +189,7 @@ public function viewAction() } //Views - $viewsArr = $this->modules->views->getViewsForAppType($app['app_type'], false); + $viewsArr = $this->modules->views->getViewsForAppType($app['app_type'], false, true); if (count($viewsArr) === 1) { array_push($mandatoryViews, $this->helper->first($viewsArr)['name']); diff --git a/apps/Core/Components/Viewssettings/ViewssettingsComponent.php b/apps/Core/Components/Viewssettings/ViewssettingsComponent.php index 6b8ae1954..cf639040b 100644 --- a/apps/Core/Components/Viewssettings/ViewssettingsComponent.php +++ b/apps/Core/Components/Viewssettings/ViewssettingsComponent.php @@ -47,7 +47,10 @@ public function viewAction() if (is_string($view['settings'])) { $view['settings'] = $this->helper->decode($view['settings'], true); } - if (is_array($view['settings']['branding'])) { + + if (isset($view['settings']['branding']) && + is_array($view['settings']['branding']) + ) { foreach ($view['settings']['branding'] as $brandKey => $brand) { if (is_array($brand) && !isset($brand['brand'])) { diff --git a/system/Base/Providers/DomainsServiceProvider/Domains.php b/system/Base/Providers/DomainsServiceProvider/Domains.php index a7ffa4a48..e47190b7d 100644 --- a/system/Base/Providers/DomainsServiceProvider/Domains.php +++ b/system/Base/Providers/DomainsServiceProvider/Domains.php @@ -281,7 +281,7 @@ public function generateViewData(int $did = null) foreach ($appsArr as $key => $value) { $apps[$value['id']] = $value; $apps[$value['id']]['views'] = - $this->modules->views->getViewsForAppId($value['id']); + $this->modules->views->getViewsForAppId($value['id'], false); } $this->packagesData->apps = $apps; diff --git a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php index 8dbb0bc71..195bff311 100644 --- a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php +++ b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php @@ -247,12 +247,17 @@ public function getComponentsForCategory($category) return $components; } - public function getComponentsForAppType($appType) + public function getComponentsForAppType($appType, $checkInstalled = false) { $components = []; foreach($this->components as $component) { if ($component['app_type'] === $appType) { + if ($checkInstalled && + $component['installed'] != '1' + ) { + continue; + } $components[$component['id']] = $component; } } diff --git a/system/Base/Providers/ModulesServiceProvider/Modules/Middlewares.php b/system/Base/Providers/ModulesServiceProvider/Modules/Middlewares.php index b31fbbce5..6bf11b1ee 100644 --- a/system/Base/Providers/ModulesServiceProvider/Modules/Middlewares.php +++ b/system/Base/Providers/ModulesServiceProvider/Modules/Middlewares.php @@ -180,12 +180,18 @@ public function getMiddlewaresForCategoryAndSubcategory($category, $appId = null return $middlewares; } - public function getMiddlewaresForAppType($appType, $appId = null) + public function getMiddlewaresForAppType($appType, $appId = null, $checkInstalled = false) { $middlewares = []; foreach($this->middlewares as $middleware) { if ($middleware['app_type'] == $appType) { + if ($checkInstalled && + $middleware['installed'] != '1' + ) { + continue; + } + $middlewares[$middleware['id']] = $middleware; if ($appId) { diff --git a/system/Base/Providers/ModulesServiceProvider/Modules/Views.php b/system/Base/Providers/ModulesServiceProvider/Modules/Views.php index fb375db0b..1f74c5251 100644 --- a/system/Base/Providers/ModulesServiceProvider/Modules/Views.php +++ b/system/Base/Providers/ModulesServiceProvider/Modules/Views.php @@ -303,7 +303,7 @@ public function getViewByNameForAppId($name, $appId) return false; } - public function getViewsForAppId($appId) + public function getViewsForAppId($appId, $includeSubViews = true) { $views = []; @@ -313,6 +313,9 @@ public function getViewsForAppId($appId) if (isset($view['apps'][$appId]['enabled']) && $view['apps'][$appId]['enabled'] == 'true' ) { + if ($view['is_subview'] && !$includeSubViews) { + continue; + } array_push($views, $view); } } @@ -406,12 +409,17 @@ public function getViewsForCategory($category) return $views; } - public function getViewsForAppType($appType, $includeSubViews = true) + public function getViewsForAppType($appType, $includeSubViews = true, $checkInstalled = false) { $views = []; foreach($this->views as $view) { if ($view['app_type'] === $appType) { + if ($checkInstalled && + $view['installed'] != '1' + ) { + continue; + } if ($view['is_subview'] && !$includeSubViews) { continue; } From e2caa7a905978d763bef9c77d1b82cd6d8ef6446 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 13 Feb 2025 17:00:15 +1100 Subject: [PATCH 06/36] update issue #34 --- apps/Core/Views/Default/html/modules/modules.html | 4 ++-- system/Base/Providers/ModulesServiceProvider/Installer.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index b3179aaf5..66b9daf5e 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -1005,9 +1005,9 @@
Select module from the tre } } else { if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove', 'repo-sync']); + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'uninstall', 'remove', 'repo-sync']); } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'remove'], false); + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'uninstall', 'remove'], false); } } } else { diff --git a/system/Base/Providers/ModulesServiceProvider/Installer.php b/system/Base/Providers/ModulesServiceProvider/Installer.php index 910777c78..7d9c8b339 100644 --- a/system/Base/Providers/ModulesServiceProvider/Installer.php +++ b/system/Base/Providers/ModulesServiceProvider/Installer.php @@ -1297,6 +1297,7 @@ protected function updateVersion($args) if ($this->access->auth->account() && isset($this->access->auth->account()['id'])) { $moduleArr['updated_by'] = $this->access->auth->account()['id']; } + if (str_contains($module['module_type'], 'apptype')) { $this->apps->types->update($moduleArr); } else { From 825371d9297a7a2b7d141366b7dcc68a190b6bf5 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 13 Feb 2025 21:30:08 +1100 Subject: [PATCH 07/36] fix issue #607 --- apps/Core/Components/Home/HomeComponent.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/Core/Components/Home/HomeComponent.php b/apps/Core/Components/Home/HomeComponent.php index 3d28243eb..c03bd4496 100644 --- a/apps/Core/Components/Home/HomeComponent.php +++ b/apps/Core/Components/Home/HomeComponent.php @@ -12,15 +12,16 @@ class HomeComponent extends BaseComponent public function viewAction() { try { - $defaultComponentId = $this->app['default_component']; - if ($this->app['default_component'] == 0) { - $dashboardComponent = $this->modules->components->getComponentByRouteForAppId('dashboards'); + return; + } + + $defaultComponent = $this->modules->components->getById($this->app['default_component']); - $defaultComponentId = $dashboardComponent['id']; + if ($defaultComponent['class'] === get_class($this)) { + return; } - $defaultComponent = $this->modules->components->getById($defaultComponentId); $controller = $this->helper->last(explode('/', $defaultComponent['route'])); $routeArr = explode('/', $defaultComponent['route']); unset($routeArr[$this->helper->lastKey($routeArr)]); From 4c85764abaccca375b0a5a15d1e15ba885dc17d8 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 14 Feb 2025 01:19:33 +1100 Subject: [PATCH 08/36] fix issue #608 --- .../Views/Default/html/apps/tables/modules.html | 4 ++-- .../Packages/Menus.php | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/Core/Views/Default/html/apps/tables/modules.html b/apps/Core/Views/Default/html/apps/tables/modules.html index 477527b9c..91caf114e 100644 --- a/apps/Core/Views/Default/html/apps/tables/modules.html +++ b/apps/Core/Views/Default/html/apps/tables/modules.html @@ -124,8 +124,8 @@ {% if moduleType === 'component' %} - {% if module['menu_id'] %} - {% if modulesMenus[module['menu_id']]['apps'][app['id']]['enabled'] is defined and modulesMenus[module['menu_id']]['apps'][app['id']]['enabled'] === true %} + {% if module['menu_id'] and module['menu'] != 'false' %} + {% if modulesMenus[module['menu_id']]['apps'][app['id']]['enabled'] is defined and modulesMenus[module['menu_id']]['apps'][app['id']]['enabled'] == true %} {% set menuChecked = true %} {% else %} {% set menuChecked = false %} diff --git a/system/Base/Providers/BasepackagesServiceProvider/Packages/Menus.php b/system/Base/Providers/BasepackagesServiceProvider/Packages/Menus.php index 8f5786be4..f282eb5be 100644 --- a/system/Base/Providers/BasepackagesServiceProvider/Packages/Menus.php +++ b/system/Base/Providers/BasepackagesServiceProvider/Packages/Menus.php @@ -72,17 +72,28 @@ public function getMenusForApp($appId) return $menus; } - public function getMenusForAppType($appType) + public function getMenusForAppType($appType, $buildMenu = true) { $menus = []; foreach($this->menus as $menu) { if ($menu['app_type'] === $appType) { + if (is_string($menu['menu'])) { + $menu['menu'] = $this->helper->decode($menu['menu'], true); + } + if (is_string($menu['apps'])) { + $menu['apps'] = $this->helper->decode($menu['apps'], true); + } + $menus[$menu['id']] = $menu; } } - return $this->buildMenus($menus); + if ($buildMenu) { + return $this->buildMenus($menus); + } + + return $menus; } public function getMenusByRouteForAppType($route, $appType) From f34fb20b982681be685523af84384781f6a85002 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 14 Feb 2025 14:49:53 +1100 Subject: [PATCH 09/36] fix issue #609 --- .../Default/html/apps/tables/modules.html | 17 +++- .../apps/wizard/modules/form/components.html | 2 +- .../Modules/Components.php | 83 ++++++++++--------- 3 files changed, 61 insertions(+), 41 deletions(-) diff --git a/apps/Core/Views/Default/html/apps/tables/modules.html b/apps/Core/Views/Default/html/apps/tables/modules.html index 91caf114e..b1c669766 100644 --- a/apps/Core/Views/Default/html/apps/tables/modules.html +++ b/apps/Core/Views/Default/html/apps/tables/modules.html @@ -94,6 +94,13 @@ ] %} {% endif %} + {% if module['menu_id'] is defined %} + {% if modulesMenus[module['menu_id']]['apps'][app['id']] is defined and modulesMenus[module['menu_id']]['apps'][app['id']] == true %} + {% set checked = true %} + {% else %} + {% set checked = false %} + {% endif %} + {% endif %} {% if module['name'] in mandatoryModules %} {% set disabled = true %} {% set checked = true %} @@ -163,7 +170,11 @@ {% if module['apps'][app['id']]['needAuth'] is defined and module['apps'][app['id']]['needAuth'] !== 'disabled' %} {% if module['apps'][app['id']]['needAuth'] is defined and module['apps'][app['id']]['needAuth'] === true %} - {% set needAuthChecked = true %} + {% if module['apps'][app['id']]['enabled'] is defined and module['apps'][app['id']]['enabled'] === true %} + {% set needAuthChecked = true %} + {% else %} + {% set needAuthChecked = false %} + {% endif %} {% else %} {% set needAuthChecked = false %} {% endif %} @@ -173,7 +184,9 @@ {% set needAuthDisabled = true %} {% endif %} {% if module['apps'][app['id']]['needAuth'] is defined and module['apps'][app['id']]['needAuth'] === 'mandatory' %} - {% set needAuthChecked = true %} + {% if module['apps'][app['id']]['enabled'] is defined and module['apps'][app['id']]['enabled'] === true %} + {% set needAuthChecked = true %} + {% endif %} {% set needAuthDisabled = true %} {% endif %} diff --git a/apps/Core/Views/Default/html/apps/wizard/modules/form/components.html b/apps/Core/Views/Default/html/apps/wizard/modules/form/components.html index 56e03e970..0c736fc78 100644 --- a/apps/Core/Views/Default/html/apps/wizard/modules/form/components.html +++ b/apps/Core/Views/Default/html/apps/wizard/modules/form/components.html @@ -203,7 +203,7 @@ ) { $('#{{componentId}}-{{sectionId}}-component-menu-' + componentId).attr('disabled', false); $('#{{componentId}}-{{sectionId}}-component-need_auth-' + componentId).attr('disabled', false); - $('#{{componentId}}-{{sectionId}}-component-menu-' + componentId)[0].checked = true; + // $('#{{componentId}}-{{sectionId}}-component-menu-' + componentId)[0].checked = true; window['dataCollection']['{{componentId}}']['{{componentId}}-{{sectionId}}']['data']['menus'][menuId][appId]['enabled'] = true; } else { //matched during onload extractComponentCheckboxData diff --git a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php index 195bff311..665d98b1b 100644 --- a/system/Base/Providers/ModulesServiceProvider/Modules/Components.php +++ b/system/Base/Providers/ModulesServiceProvider/Modules/Components.php @@ -349,64 +349,71 @@ public function updateComponents(array $data) $component['settings'] = $this->helper->decode($component['settings'], true); } - if ($status === true) { - $component['apps'][$data['id']]['enabled'] = true; - - if (isset($needAuths[$componentId])) { - if (isset($component['settings']['needAuth'])) { - if ($component['settings']['needAuth'] === 'mandatory') { - $component['apps'][$data['id']]['needAuth'] = 'mandatory'; - } else if ($component['settings']['needAuth'] === 'disabled') { - $component['apps'][$data['id']]['needAuth'] = 'disabled'; - } - } else { - $component['apps'][$data['id']]['needAuth'] = $needAuths[$componentId]; + // if ($status === true) { + $component['apps'][$data['id']]['enabled'] = (bool) $status; + + if (isset($needAuths[$componentId])) { + if (isset($component['settings']['needAuth'])) { + if ($component['settings']['needAuth'] === 'mandatory') { + $component['apps'][$data['id']]['needAuth'] = 'mandatory'; + } else if ($component['settings']['needAuth'] === 'disabled') { + $component['apps'][$data['id']]['needAuth'] = 'disabled'; } } else { - $component['apps'][$data['id']]['needAuth'] = 'disabled'; + $component['apps'][$data['id']]['needAuth'] = $needAuths[$componentId]; } + } else { + $component['apps'][$data['id']]['needAuth'] = 'disabled'; + } - if (is_string($component['dependencies'])) { - $component['dependencies'] = $this->helper->decode($component['dependencies'], true); - } + if (is_string($component['dependencies'])) { + $component['dependencies'] = $this->helper->decode($component['dependencies'], true); + } - if (isset($component['dependencies']['packages']) && count($component['dependencies']['packages']) > 0) { - foreach ($component['dependencies']['packages'] as $key => $dependencyPackage) { - $package = $this->modules->packages->getPackageByNameForRepo($dependencyPackage['name'], $dependencyPackage['repo']); + //Only enable packages and not disable them as there is a possibility that other component might be using the same package. + if ($status && + isset($component['dependencies']['packages']) && count($component['dependencies']['packages']) > 0 + ) { + foreach ($component['dependencies']['packages'] as $key => $dependencyPackage) { + $package = $this->modules->packages->getPackageByNameForRepo($dependencyPackage['name'], $dependencyPackage['repo']); - if ($package) { - $package['apps'] = $this->helper->decode($package['apps'], true); + if ($package) { + $package['apps'] = $this->helper->decode($package['apps'], true); - $package['apps'][$data['id']]['enabled'] = true; + $package['apps'][$data['id']]['enabled'] = true; - $package['apps'] = $this->helper->encode($package['apps']); + $package['apps'] = $this->helper->encode($package['apps']); - $this->modules->packages->update($package); - } + $this->modules->packages->update($package); } } + } - if (isset($component['dependencies']['views']) && count($component['dependencies']['views']) > 0) { - foreach ($component['dependencies']['views'] as $key => $dependencyView) { - $view = $this->modules->views->getViewByRepo($dependencyView['repo']); + if (isset($component['dependencies']['views']) && count($component['dependencies']['views']) > 0) { + foreach ($component['dependencies']['views'] as $key => $dependencyView) { + $view = $this->modules->views->getViewByRepo($dependencyView['repo']); - if ($view) { - $view['apps'] = $this->helper->decode($view['apps'], true); + if ($view) { + //Only change the subviews to false as main view is being used by other components. + if (!$status && array_key_exists('is_subview', $view) && $view['is_subview'] == false) { + continue; + } + $view['apps'] = $this->helper->decode($view['apps'], true); - $view['apps'][$data['id']]['enabled'] = true; + $view['apps'][$data['id']]['enabled'] = (bool) $status; - $view['apps'] = $this->helper->encode($view['apps']); + $view['apps'] = $this->helper->encode($view['apps']); - $this->modules->views->update($view); - } + $this->modules->views->update($view); } } + } - $component['dependencies'] = $this->helper->encode($component['dependencies'], JSON_UNESCAPED_SLASHES); + $component['dependencies'] = $this->helper->encode($component['dependencies'], JSON_UNESCAPED_SLASHES); - } else if ($status === false) { - $component['apps'][$data['id']]['enabled'] = false; - } + // } else if ($status === false) { + // $component['apps'][$data['id']]['enabled'] = false; + // } $component['apps'] = $this->helper->encode($component['apps']); From 5f5b0e47d3a4f63cc89584dc9e9c453fecc4e7e8 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 14 Feb 2025 14:50:31 +1100 Subject: [PATCH 10/36] update issue #34, add setting for force uninstall a module even if it assigned to an app. --- .../Default/html/modules/queue/analyse.html | 3 + .../Default/html/modules/queue/settings.html | 185 ++++++++++++------ .../ModulesServiceProvider/Installer.php | 9 +- .../ModulesServiceProvider/Queues.php | 16 ++ 4 files changed, 147 insertions(+), 66 deletions(-) diff --git a/apps/Core/Views/Default/html/modules/queue/analyse.html b/apps/Core/Views/Default/html/modules/queue/analyse.html index 0567bf6c9..05e7e0a97 100644 --- a/apps/Core/Views/Default/html/modules/queue/analyse.html +++ b/apps/Core/Views/Default/html/modules/queue/analyse.html @@ -303,6 +303,8 @@ postData['settings']['files'] = { }; postData['settings']['files']['deleteSourceFiles'] = $('#{{componentId}}-{{sectionId}}-delete_source_files')[0].checked; postData['settings']['files']['deleteDestinationFiles'] = $('#{{componentId}}-{{sectionId}}-delete_destination_files')[0].checked; + postData['settings']['installer'] = { }; + postData['settings']['installer']['forceUninstall'] = $('#{{componentId}}-{{sectionId}}-force_uninstall')[0].checked; $.post('{{links.url("modules/saveQueueSettings")}}', postData, function(response) { if (response.tokenKey && response.token) { @@ -666,6 +668,7 @@ '{{componentId}}-{{sectionId}}-email_report' : { }, '{{componentId}}-{{sectionId}}-delete_source_files' : { }, '{{componentId}}-{{sectionId}}-delete_destination_files' : { }, + '{{componentId}}-{{sectionId}}-force_uninstall' : { }, '{{componentId}}-{{sectionId}}-form' : $.extend(dataCollectionSectionForm, { rules: { }, diff --git a/apps/Core/Views/Default/html/modules/queue/settings.html b/apps/Core/Views/Default/html/modules/queue/settings.html index 8e61b4815..67877dcc0 100644 --- a/apps/Core/Views/Default/html/modules/queue/settings.html +++ b/apps/Core/Views/Default/html/modules/queue/settings.html @@ -61,6 +61,10 @@ {% if queue['settings']['files']['deleteDestinationFiles'] == true %} {% set settingsFilesDeleteDestinationFilesChecked = true %} {% endif %} +{% set settingsInstallerForceUninstallChecked = false %} +{% if queue['settings']['installer']['forceUninstall'] == true %} + {% set settingsInstallerForceUninstallChecked = true %} +{% endif %}
@@ -486,72 +490,125 @@
- {{adminltetags.useTag('fields', - [ - 'component' : component, - 'componentName' : componentName, - 'componentId' : componentId, - 'sectionId' : sectionId, - 'fieldId' : 'files_settings', - 'fieldLabel' : 'FILES SETTINGS', - 'fieldLabelLegend' : true, - 'fieldHidden' : false, - 'fieldType' : 'html', - 'fieldBazScan' : false, - 'fieldBazPostOnCreate' : false, - 'fieldBazPostOnUpdate' : false, - 'fieldBazJstreeSearch' : true, - 'fieldHtmlContent' : '' - ] - )}} +
+
+ {{adminltetags.useTag('fields', + [ + 'component' : component, + 'componentName' : componentName, + 'componentId' : componentId, + 'sectionId' : sectionId, + 'fieldId' : 'files_settings', + 'fieldLabel' : 'FILES SETTINGS', + 'fieldLabelLegend' : true, + 'fieldHidden' : false, + 'fieldType' : 'html', + 'fieldBazScan' : false, + 'fieldBazPostOnCreate' : false, + 'fieldBazPostOnUpdate' : false, + 'fieldBazJstreeSearch' : true, + 'fieldHtmlContent' : '' + ] + )}} +
+
+
+
+ {{adminltetags.useTag('fields', + [ + 'component' : component, + 'componentName' : componentName, + 'componentId' : componentId, + 'sectionId' : sectionId, + 'fieldId' : 'delete_source_files', + 'fieldLabel' : false, + 'fieldHelp' : true, + 'fieldHelpTooltipContent' : 'Delete downloaded source files? Files are only deleted on successful installation/upgrade.', + 'fieldRequired' : false, + 'fieldType' : 'checkbox', + 'fieldCheckboxType' : 'success', + 'fieldCheckboxChecked' : settingsFilesDeleteSourceFilesChecked, + 'fieldCheckboxLabel' : 'DELETE SOURCE FILES?', + 'fieldBazJstreeSearch' : true, + 'fieldBazPostOnCreate' : false, + 'fieldBazPostOnUpdate' : false, + 'fieldBazScan' : true + ] + )}} +
+
+ {{adminltetags.useTag('fields', + [ + 'component' : component, + 'componentName' : componentName, + 'componentId' : componentId, + 'sectionId' : sectionId, + 'fieldId' : 'delete_destination_files', + 'fieldLabel' : false, + 'fieldHelp' : true, + 'fieldHelpTooltipContent' : 'RSync delete destination files? Disable if you have any custom code installed, else RSync will delete the files that are not found in the source.', + 'fieldRequired' : false, + 'fieldType' : 'checkbox', + 'fieldCheckboxType' : 'danger', + 'fieldCheckboxChecked' : settingsFilesDeleteDestinationFilesChecked, + 'fieldCheckboxLabel' : 'RSYNC DELETE DESTINATION FILES?', + 'fieldBazJstreeSearch' : true, + 'fieldBazPostOnCreate' : false, + 'fieldBazPostOnUpdate' : false, + 'fieldBazScan' : true + ] + )}} +
+
-
-
- {{adminltetags.useTag('fields', - [ - 'component' : component, - 'componentName' : componentName, - 'componentId' : componentId, - 'sectionId' : sectionId, - 'fieldId' : 'delete_source_files', - 'fieldLabel' : false, - 'fieldHelp' : true, - 'fieldHelpTooltipContent' : 'Delete downloaded source files? Files are only deleted on successful installation/upgrade.', - 'fieldRequired' : false, - 'fieldType' : 'checkbox', - 'fieldCheckboxType' : 'success', - 'fieldCheckboxChecked' : settingsFilesDeleteSourceFilesChecked, - 'fieldCheckboxLabel' : 'DELETE SOURCE FILES?', - 'fieldBazJstreeSearch' : true, - 'fieldBazPostOnCreate' : false, - 'fieldBazPostOnUpdate' : false, - 'fieldBazScan' : true - ] - )}} -
-
- {{adminltetags.useTag('fields', - [ - 'component' : component, - 'componentName' : componentName, - 'componentId' : componentId, - 'sectionId' : sectionId, - 'fieldId' : 'delete_destination_files', - 'fieldLabel' : false, - 'fieldHelp' : true, - 'fieldHelpTooltipContent' : 'RSync delete destination files? Disable if you have any custom code installed, else RSync will delete the files that are not found in the source.', - 'fieldRequired' : false, - 'fieldType' : 'checkbox', - 'fieldCheckboxType' : 'danger', - 'fieldCheckboxChecked' : settingsFilesDeleteDestinationFilesChecked, - 'fieldCheckboxLabel' : 'RSYNC DELETE DESTINATION FILES?', - 'fieldBazJstreeSearch' : true, - 'fieldBazPostOnCreate' : false, - 'fieldBazPostOnUpdate' : false, - 'fieldBazScan' : true - ] - )}} +
+
+ {{adminltetags.useTag('fields', + [ + 'component' : component, + 'componentName' : componentName, + 'componentId' : componentId, + 'sectionId' : sectionId, + 'fieldId' : 'installer', + 'fieldLabel' : 'INSTALLER SETTINGS', + 'fieldLabelLegend' : true, + 'fieldHidden' : false, + 'fieldType' : 'html', + 'fieldBazScan' : false, + 'fieldBazPostOnCreate' : false, + 'fieldBazPostOnUpdate' : false, + 'fieldBazJstreeSearch' : true, + 'fieldHtmlContent' : '' + ] + )}} +
+
+
+
+ {{adminltetags.useTag('fields', + [ + 'component' : component, + 'componentName' : componentName, + 'componentId' : componentId, + 'sectionId' : sectionId, + 'fieldId' : 'force_uninstall', + 'fieldLabel' : false, + 'fieldHelp' : true, + 'fieldHelpTooltipContent' : 'Force the installer to uninstall even when the module is assigned to an app.', + 'fieldRequired' : false, + 'fieldType' : 'checkbox', + 'fieldCheckboxType' : 'warning', + 'fieldCheckboxChecked' : settingsInstallerForceUninstallChecked, + 'fieldCheckboxLabel' : 'FORCE UNINSTALL?', + 'fieldBazJstreeSearch' : true, + 'fieldBazPostOnCreate' : false, + 'fieldBazPostOnUpdate' : false, + 'fieldBazScan' : true + ] + )}} +
+
diff --git a/system/Base/Providers/ModulesServiceProvider/Installer.php b/system/Base/Providers/ModulesServiceProvider/Installer.php index 7d9c8b339..1a6ab3841 100644 --- a/system/Base/Providers/ModulesServiceProvider/Installer.php +++ b/system/Base/Providers/ModulesServiceProvider/Installer.php @@ -138,6 +138,8 @@ public function runProcess(array $data) $this->basepackages->progress->preCheckComplete(); $this->queue['results'] = arrayReplace($this->queue['results'], 'precheck_progress_logs', []); + $this->queue['results'] = arrayReplace($this->queue['results'], 'precheck_logs', '-'); + $this->queue['results'] = arrayReplace($this->queue['results'], 'result_logs', '-'); $this->modules->queues->update($this->queue); foreach ($this->runPrecheckProgressMethods as $method) { @@ -306,6 +308,10 @@ protected function precheckQueueData($args) return true; } } else { + if ($this->queue['settings']['installer']['forceUninstall']) { + return true; + } + $appBinding = false; if ($this->modulesToInstallOrUpdate['apps'] && @@ -322,7 +328,7 @@ protected function precheckQueueData($args) $preCheckQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck_logs']; return $this->queueHasErrors( - 'Module is assigned to app with ID: ' . $appId . '. Cannot ' . $taskName . '!', + 'Module is assigned to app with ID: ' . $appId . '. Either remove it via app or use force uninstall in the queue settings.', $preCheckQueueLogs, true ); @@ -337,7 +343,6 @@ protected function precheckQueueData($args) } else { return true; } - } } diff --git a/system/Base/Providers/ModulesServiceProvider/Queues.php b/system/Base/Providers/ModulesServiceProvider/Queues.php index e9a23b5ba..2fb9a9517 100644 --- a/system/Base/Providers/ModulesServiceProvider/Queues.php +++ b/system/Base/Providers/ModulesServiceProvider/Queues.php @@ -89,6 +89,10 @@ protected function addActiveQueue() 'deleteSourceFiles' => false, 'deleteDestinationFiles' => false ], + 'installer' => + [ + 'forceUninstall' => false + ], 'emailReport' => $this->access->auth->account()['email'] ] ) @@ -282,6 +286,18 @@ public function saveQueueSettings($data) } }); + array_walk($data['settings']['installer'], function(&$setting, $index) { + if ($setting !== '') { + if ($setting == 'true') { + $setting = true; + } else { + $setting = false; + } + } else { + $setting = false; + } + }); + $queue['settings'] = array_replace($queue['settings'], $data['settings']); if ($this->update($queue)) { From d8480624f5d6eac10c72e0fc632ac7f08fdbb8ba Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 14 Feb 2025 21:36:45 +1100 Subject: [PATCH 11/36] Initial commit #610 --- .../Components/Errors/ErrorsComponent.php | 14 +++ .../errors/controllerdependencyerror.html | 27 ++++++ .../html/common/errors/controllererror.html | 27 ++++++ .../Default/html/errors/contollerError.html | 1 + .../errors/controllerDependencyError.html | 1 + system/Base/BaseComponent.php | 85 +++++++++++++++++-- .../ErrorServiceProvider/ErrorsComponent.php | 61 +++++++++++-- .../ExceptionHandlers.php | 8 +- .../View/errors/actionNotFound.html | 28 ------ .../View/errors/actionnotfound.html | 30 +++++++ .../View/errors/badgateway.html | 28 ++++++ .../errors/controllerdependencyerror.html | 27 ++++++ .../View/errors/controllererror.html | 27 ++++++ .../View/errors/controllernotfound.html | 30 +++++++ .../View/errors/error.html | 15 ++++ .../View/errors/gatewaytimeout.html | 28 ++++++ .../View/errors/idnotfound.html | 30 +++++++ .../View/errors/maintenance.html | 23 +++++ .../View/errors/networkerror.html | 28 ++++++ .../View/errors/notFound.html | 22 ----- .../View/errors/notfound.html | 30 +++++++ .../View/errors/permissionDenied.html | 20 ----- .../View/errors/permissiondenied.html | 27 ++++++ .../View/errors/ratelimit.html | 32 +++++++ .../View/errors/routeNotFound.html | 28 ------ .../View/errors/servererror.html | 27 ++++++ .../View/errors/serviceunavailable.html | 28 ++++++ .../View/errors/templateerror.html | 30 +++++++ 28 files changed, 649 insertions(+), 113 deletions(-) create mode 100644 apps/Core/Views/Default/html/common/errors/controllerdependencyerror.html create mode 100644 apps/Core/Views/Default/html/common/errors/controllererror.html create mode 100644 apps/Core/Views/Default/html/errors/contollerError.html create mode 100644 apps/Core/Views/Default/html/errors/controllerDependencyError.html delete mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/actionNotFound.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/actionnotfound.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/badgateway.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/controllerdependencyerror.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/controllererror.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/controllernotfound.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/error.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/gatewaytimeout.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/idnotfound.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/maintenance.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/networkerror.html delete mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/notFound.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/notfound.html delete mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/permissionDenied.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/permissiondenied.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/ratelimit.html delete mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/routeNotFound.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/servererror.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/serviceunavailable.html create mode 100644 system/Base/Providers/ErrorServiceProvider/View/errors/templateerror.html diff --git a/apps/Core/Components/Errors/ErrorsComponent.php b/apps/Core/Components/Errors/ErrorsComponent.php index d040582f4..343c68b8e 100644 --- a/apps/Core/Components/Errors/ErrorsComponent.php +++ b/apps/Core/Components/Errors/ErrorsComponent.php @@ -20,6 +20,13 @@ public function controllerNotFoundAction() $this->addResponse('Component Not Found', 1); } + public function controllerDependencyErrorAction() + { + $this->view->pick('common/errors/controllerdependencyerror'); + + $this->addResponse('Component Dependency Error', 1); + } + public function actionNotFoundAction() { $this->view->pick('common/errors/actionnotfound'); @@ -27,6 +34,13 @@ public function actionNotFoundAction() $this->addResponse('Component Action Not Found', 1); } + public function templateErrorAction() + { + $this->view->pick('common/errors/templateerror'); + + $this->addResponse('Template For Component Not Found', 1); + } + public function routeNotFoundAction() { $this->view->pick('common/errors/routenotfound'); diff --git a/apps/Core/Views/Default/html/common/errors/controllerdependencyerror.html b/apps/Core/Views/Default/html/common/errors/controllerdependencyerror.html new file mode 100644 index 000000000..75cd06b5c --- /dev/null +++ b/apps/Core/Views/Default/html/common/errors/controllerdependencyerror.html @@ -0,0 +1,27 @@ +{% set sectionId = 'controllerDependencyError' %} +
+
+
+
+

+ Server Error! (Error:Controller Dependency Error) +

+

The component's controller is returning an internal error.

+ + Try Again + +
+
+
+
+
+

What happened?

+

A controller dependency error status implies there is a problem with the controller causing it to malfunction.

+
+
+

What can I do?

+

Nothing you can do at the moment. If you need immediate assistance, please + contact us.

+
+
+
\ No newline at end of file diff --git a/apps/Core/Views/Default/html/common/errors/controllererror.html b/apps/Core/Views/Default/html/common/errors/controllererror.html new file mode 100644 index 000000000..2da66953c --- /dev/null +++ b/apps/Core/Views/Default/html/common/errors/controllererror.html @@ -0,0 +1,27 @@ +{% set sectionId = 'controller-error' %} +
+
+
+
+

+ Server Error! (Error:Controller Error) +

+

The component's controller is returning an internal error.

+ + Try Again + +
+
+
+
+
+

What happened?

+

A controller error status implies there is a problem with the controller causing it to malfunction.

+
+
+

What can I do?

+

Nothing you can do at the moment. If you need immediate assistance, please + contact us.

+
+
+
\ No newline at end of file diff --git a/apps/Core/Views/Default/html/errors/contollerError.html b/apps/Core/Views/Default/html/errors/contollerError.html new file mode 100644 index 000000000..fa5706d10 --- /dev/null +++ b/apps/Core/Views/Default/html/errors/contollerError.html @@ -0,0 +1 @@ +Placeholder file. Do not remove \ No newline at end of file diff --git a/apps/Core/Views/Default/html/errors/controllerDependencyError.html b/apps/Core/Views/Default/html/errors/controllerDependencyError.html new file mode 100644 index 000000000..fa5706d10 --- /dev/null +++ b/apps/Core/Views/Default/html/errors/controllerDependencyError.html @@ -0,0 +1 @@ +Placeholder file. Do not remove \ No newline at end of file diff --git a/system/Base/BaseComponent.php b/system/Base/BaseComponent.php index 4531eb35e..62884fbd8 100644 --- a/system/Base/BaseComponent.php +++ b/system/Base/BaseComponent.php @@ -85,9 +85,13 @@ protected function onConstruct() } } - protected function setComponent() + protected function setComponent($componentClass = null) { - $this->reflection = new \ReflectionClass($this); + if (!$componentClass) { + $componentClass = get_class($this); + } + + $this->reflection = new \ReflectionClass($componentClass); $this->componentName = str_replace('Component', '', $this->reflection->getShortName()); @@ -188,13 +192,31 @@ public function beforeExecuteRoute() $this->checkSettingsRoute(); if (!$this->component && $this->app) { - $this->setErrorDispatcher('controllerNotFound'); + $this->setErrorDispatcher('controllerNotFound', ['error' => true]); return false; } else if (!$this->component) { throw new ControllerNotFoundException('Component Not Found!'); } + if (!$this->dispatcher->wasForwarded()) { + $this->checkComponentDependencies(); + } else { + if (!isset($this->dispatcher->getParams()['error'])) { + if ($this->component['class'] !== $this->dispatcher->getHandlerClass()) { + $reflection = new \ReflectionClass($this->dispatcher->getHandlerClass()); + + $component = $this->modules->components->getComponentByClassForAppId( + $reflection->getName(), $this->app['id'] + ); + + if ($component) { + $this->checkComponentDependencies($component); + } + } + } + } + if (!$this->isJson()) { $this->setViewPermissions(false, false, false, false, false, false); @@ -246,6 +268,58 @@ public function beforeExecuteRoute() } } + protected function checkComponentDependencies($component = null) + { + if (!$component) { + $component = $this->component; + } + + if (isset($component['dependencies']['packages']) && count($component['dependencies']['packages']) > 0) { + foreach ($component['dependencies']['packages'] as $package) { + $packageModule = $this->modules->packages->getPackageByNameForRepo($package['name'], $package['repo']); + + if (is_string($packageModule['apps'])) { + $packageModule['apps'] = $this->helper->decode($packageModule['apps'], true); + } + + if (!$packageModule || + ($packageModule && + ($packageModule['installed'] == false || $packageModule['apps'][$this->app['id']]['enabled'] == false) + ) + ) { + $this->setErrorDispatcher('controllerDependencyError', ['error' => true]); + + return false; + } + } + } + + //Check if subview Dependencies for the component is installed and enabled + if (isset($component['dependencies']['views']) && count($component['dependencies']['views']) > 0) { + foreach ($component['dependencies']['views'] as $view) { + $viewModule = $this->modules->views->getViewByAppTypeAndRepoAndName($component['app_type'], $view['repo'], $view['name']); + + if (is_string($viewModule['apps'])) { + $viewModule['apps'] = $this->helper->decode($viewModule['apps'], true); + } + + if (!$viewModule['is_subview']) { + continue; + } + + if (!$viewModule || + ($viewModule && + ($viewModule['installed'] == false || $viewModule['apps'][$this->app['id']]['enabled'] == false) + ) + ) { + $this->setErrorDispatcher('controllerDependencyError', ['error' => true]); + + return false; + } + } + } + } + protected function setViewPermissions( $canView = true, $canAdd = true, @@ -960,7 +1034,7 @@ protected function throwIdNotFound() throw new IdNotFoundException('ID Not Found!'); } - protected function setErrorDispatcher($action) + protected function setErrorDispatcher($action, $params = []) { if ($this->app) { $component = $this->modules->components->getComponentById($this->app['errors_component']); @@ -982,7 +1056,8 @@ protected function setErrorDispatcher($action) [ 'controller' => $errorComponent, 'action' => $action, - 'namespace' => $namespace + 'namespace' => $namespace, + 'params' => $params ] ); } diff --git a/system/Base/Providers/ErrorServiceProvider/ErrorsComponent.php b/system/Base/Providers/ErrorServiceProvider/ErrorsComponent.php index 94a0bfe26..64309aaef 100644 --- a/system/Base/Providers/ErrorServiceProvider/ErrorsComponent.php +++ b/system/Base/Providers/ErrorServiceProvider/ErrorsComponent.php @@ -6,24 +6,73 @@ class ErrorsComponent extends BaseComponent { - public function routeNotFoundAction() + public function beforeExecuteRoute() { $this->view->setViewsDir(base_path('system/Base/Providers/ErrorServiceProvider/View')); - $this->view->pick('errors/routeNotFound'); + parent::beforeExecuteRoute(); } public function controllerNotFoundAction() { - $this->view->setViewsDir(base_path('system/Base/Providers/ErrorServiceProvider/View/')); + $this->view->pick('errors/controllernotfound'); + + $this->addResponse('Component Not Found', 1); + } + + public function controllerDependencyErrorAction() + { + $this->view->pick('errors/controllerdependencyerror'); - $this->view->pick('errors/controllerNotFound'); + $this->addResponse('Component Dependency Error', 1); } public function actionNotFoundAction() { - $this->view->setViewsDir(base_path('system/Base/Providers/ErrorServiceProvider/View')); + $this->view->pick('errors/actionnotfound'); + + $this->addResponse('Component Action Not Found', 1); + } + + public function templateErrorAction() + { + $this->view->pick('errors/templateerror'); + + $this->addResponse('Template For Component Not Found', 1); + } + + public function routeNotFoundAction() + { + $this->view->pick('errors/notfound'); + + $this->addResponse('Not Found', 1); + } + + public function idNotFoundAction() + { + $this->view->pick('errors/idnotfound'); + + $this->addResponse('Id Not Found', 1); + } + + public function permissionDeniedAction() + { + $this->view->pick('errors/permissiondenied'); + + $this->addResponse('Permission denied, contact administrator!', 1); + } + + public function serverErrorAction() + { + $this->view->pick('errors/servererror'); + + $this->addResponse('Server Error, contact administrator!', 1); + } + + public function invalidDataAction(...$params) + { + $this->view->pick('errors/servererror'); - $this->view->pick('errors/actionNotFound'); + $this->addResponse('Invalid data provided. Error: ' . $params[0], 1); } } \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/ExceptionHandlers.php b/system/Base/Providers/ErrorServiceProvider/ExceptionHandlers.php index fe6414656..5ae5ac452 100644 --- a/system/Base/Providers/ErrorServiceProvider/ExceptionHandlers.php +++ b/system/Base/Providers/ErrorServiceProvider/ExceptionHandlers.php @@ -17,7 +17,7 @@ public function handlePermissionDeniedException($exception) return $this->sendJson(); } - return $this->setViewsDir('permissionDenied'); + return $this->setViewsDir('permissiondenied'); } public function handleAppNotAllowedException($exception) @@ -29,7 +29,7 @@ public function handleAppNotAllowedException($exception) return $this->sendJson(); } - return $this->setViewsDir('notFound'); + return $this->setViewsDir('notfound'); } public function handleControllerNotFoundException($exception) @@ -41,7 +41,7 @@ public function handleControllerNotFoundException($exception) return $this->sendJson(); } - return $this->setViewsDir('notFound'); + return $this->setViewsDir('notfound'); } public function handleIdNotFoundException($exception) @@ -53,7 +53,7 @@ public function handleIdNotFoundException($exception) return $this->sendJson(); } - return $this->setViewsDir('notFound'); + return $this->setViewsDir('notfound'); } public function handleValidationException($exception) diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/actionNotFound.html b/system/Base/Providers/ErrorServiceProvider/View/errors/actionNotFound.html deleted file mode 100644 index 8a7137e32..000000000 --- a/system/Base/Providers/ErrorServiceProvider/View/errors/actionNotFound.html +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-

- Not Found! (Error:404) -

-

We couldn't find what you're looking for.

-

App doesn't exist/Default app not set. Install app and set it as default.

-

- - Setup App Defaults - -

-
-
-
-
-
-

What happened?

-

A 404 error status implies that the component you're looking for could not be found.

-
-
-

What can I do?

-

This should not happen. Either it is a bug or site issue. Please - contact us. -

-
-
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/actionnotfound.html b/system/Base/Providers/ErrorServiceProvider/View/errors/actionnotfound.html new file mode 100644 index 000000000..d84817443 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/actionnotfound.html @@ -0,0 +1,30 @@ +{% set sectionId = '404' %} +
+
+
+
+

+ Not Found! (Error:404) +

+

Action Not Found

+

+ + Goto Home + +

+
+
+
+
+
+

What happened?

+

A 404 error status implies that the component you're looking for could not be found.

+
+
+

What can I do?

+

This should not happen. Either it is a bug or site issue. Please + contact us. +

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/badgateway.html b/system/Base/Providers/ErrorServiceProvider/View/errors/badgateway.html new file mode 100644 index 000000000..de3792b9d --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/badgateway.html @@ -0,0 +1,28 @@ +{% set sectionId = '502' %} + \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/controllerdependencyerror.html b/system/Base/Providers/ErrorServiceProvider/View/errors/controllerdependencyerror.html new file mode 100644 index 000000000..75cd06b5c --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/controllerdependencyerror.html @@ -0,0 +1,27 @@ +{% set sectionId = 'controllerDependencyError' %} +
+
+
+
+

+ Server Error! (Error:Controller Dependency Error) +

+

The component's controller is returning an internal error.

+ + Try Again + +
+
+
+
+
+

What happened?

+

A controller dependency error status implies there is a problem with the controller causing it to malfunction.

+
+
+

What can I do?

+

Nothing you can do at the moment. If you need immediate assistance, please + contact us.

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/controllererror.html b/system/Base/Providers/ErrorServiceProvider/View/errors/controllererror.html new file mode 100644 index 000000000..2da66953c --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/controllererror.html @@ -0,0 +1,27 @@ +{% set sectionId = 'controller-error' %} +
+
+
+
+

+ Server Error! (Error:Controller Error) +

+

The component's controller is returning an internal error.

+ + Try Again + +
+
+
+
+
+

What happened?

+

A controller error status implies there is a problem with the controller causing it to malfunction.

+
+
+

What can I do?

+

Nothing you can do at the moment. If you need immediate assistance, please + contact us.

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/controllernotfound.html b/system/Base/Providers/ErrorServiceProvider/View/errors/controllernotfound.html new file mode 100644 index 000000000..3ce855245 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/controllernotfound.html @@ -0,0 +1,30 @@ +{% set sectionId = '404' %} +
+
+
+
+

+ Not Found! (Error:404) +

+

Component Not Found

+

+ + Goto Home + +

+
+
+
+
+
+

What happened?

+

A 404 error status implies that the component you're looking for could not be found.

+
+
+

What can I do?

+

This should not happen. Either it is a bug or site issue. Please + contact us. +

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/error.html b/system/Base/Providers/ErrorServiceProvider/View/errors/error.html new file mode 100644 index 000000000..963ff741a --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/error.html @@ -0,0 +1,15 @@ +{# {% set component = %} #} + \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/gatewaytimeout.html b/system/Base/Providers/ErrorServiceProvider/View/errors/gatewaytimeout.html new file mode 100644 index 000000000..d53a442d2 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/gatewaytimeout.html @@ -0,0 +1,28 @@ +{% set sectionId = '504' %} + \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/idnotfound.html b/system/Base/Providers/ErrorServiceProvider/View/errors/idnotfound.html new file mode 100644 index 000000000..daaceb9c8 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/idnotfound.html @@ -0,0 +1,30 @@ +{% set sectionId = '404' %} +
+
+
+
+

+ Not Found! (Error:404) +

+

ID Not Found

+

+ + Goto Home + +

+
+
+
+
+
+

What happened?

+

A 404 error status implies that the component you're looking for could not be found.

+
+
+

What can I do?

+

This should not happen. Either it is a bug or site issue. Please + contact us. +

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/maintenance.html b/system/Base/Providers/ErrorServiceProvider/View/errors/maintenance.html new file mode 100644 index 000000000..7c955d729 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/maintenance.html @@ -0,0 +1,23 @@ +{% set sectionId = 'maintenance' %} + \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/networkerror.html b/system/Base/Providers/ErrorServiceProvider/View/errors/networkerror.html new file mode 100644 index 000000000..fabcf9cdf --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/networkerror.html @@ -0,0 +1,28 @@ +{% set sectionId = '0' %} + \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/notFound.html b/system/Base/Providers/ErrorServiceProvider/View/errors/notFound.html deleted file mode 100644 index bc64b336f..000000000 --- a/system/Base/Providers/ErrorServiceProvider/View/errors/notFound.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-

- Not Found! (Error:404) -

-

We couldn't find what you're looking for.

-
-
-
-
-
-

What happened?

-

A 404 error status implies that the component you're looking for could not be found.

-
-
-

What can I do?

-

This should not happen. Either it is a bug or site issue. Please - contact us. -

-
-
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/notfound.html b/system/Base/Providers/ErrorServiceProvider/View/errors/notfound.html new file mode 100644 index 000000000..05e1a87c1 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/notfound.html @@ -0,0 +1,30 @@ +{% set sectionId = '404' %} +
+
+
+
+

+ Not Found! (Error:404) +

+

We couldn't find what you're looking for.

+

+ + Goto Home + +

+
+
+
+
+
+

What happened?

+

A 404 error status implies that the component you're looking for could not be found.

+
+
+

What can I do?

+

This should not happen. Either it is a bug or site issue. Please + contact us. +

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/permissionDenied.html b/system/Base/Providers/ErrorServiceProvider/View/errors/permissionDenied.html deleted file mode 100644 index 852427717..000000000 --- a/system/Base/Providers/ErrorServiceProvider/View/errors/permissionDenied.html +++ /dev/null @@ -1,20 +0,0 @@ -
-
-
-
-
-

- Permission Denied -

-

You do not have permission to access this resource.

-

If you believe this is by mistake, please contact your systems administrator for further assistance.

-

- - Home - -

-
-
-
-
-
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/permissiondenied.html b/system/Base/Providers/ErrorServiceProvider/View/errors/permissiondenied.html new file mode 100644 index 000000000..923b3e8b1 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/permissiondenied.html @@ -0,0 +1,27 @@ +{% set sectionId = '403' %} +
+
+
+
+

+ Permission Denied! (Error:403) +

+

Not allowed to access this resource.

+ + Try Again + +
+
+
+
+
+

What happened?

+

A 403 error status implies that you do not have access to this resource.

+
+
+

What can I do?

+

Nothing you can do at the moment. If you need immediate assistance, please + contact us.

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/ratelimit.html b/system/Base/Providers/ErrorServiceProvider/View/errors/ratelimit.html new file mode 100644 index 000000000..0b57419fa --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/ratelimit.html @@ -0,0 +1,32 @@ +{% set sectionId = '114' %} + \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/routeNotFound.html b/system/Base/Providers/ErrorServiceProvider/View/errors/routeNotFound.html deleted file mode 100644 index 8a7137e32..000000000 --- a/system/Base/Providers/ErrorServiceProvider/View/errors/routeNotFound.html +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-

- Not Found! (Error:404) -

-

We couldn't find what you're looking for.

-

App doesn't exist/Default app not set. Install app and set it as default.

-

- - Setup App Defaults - -

-
-
-
-
-
-

What happened?

-

A 404 error status implies that the component you're looking for could not be found.

-
-
-

What can I do?

-

This should not happen. Either it is a bug or site issue. Please - contact us. -

-
-
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/servererror.html b/system/Base/Providers/ErrorServiceProvider/View/errors/servererror.html new file mode 100644 index 000000000..e2914fd62 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/servererror.html @@ -0,0 +1,27 @@ +{% set sectionId = '500' %} +
+
+
+
+

+ Server Error! (Error:500) +

+

The web server is returning an internal error for.

+ + Try Again + +
+
+
+
+
+

What happened?

+

A 500 error status implies there is a problem with the web server's software causing it to malfunction.

+
+
+

What can I do?

+

Nothing you can do at the moment. If you need immediate assistance, please + contact us.

+
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/serviceunavailable.html b/system/Base/Providers/ErrorServiceProvider/View/errors/serviceunavailable.html new file mode 100644 index 000000000..be7bc8841 --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/serviceunavailable.html @@ -0,0 +1,28 @@ +{% set sectionId = '503' %} + \ No newline at end of file diff --git a/system/Base/Providers/ErrorServiceProvider/View/errors/templateerror.html b/system/Base/Providers/ErrorServiceProvider/View/errors/templateerror.html new file mode 100644 index 000000000..d95f4d7ad --- /dev/null +++ b/system/Base/Providers/ErrorServiceProvider/View/errors/templateerror.html @@ -0,0 +1,30 @@ +{% set sectionId = 'templateError' %} + \ No newline at end of file From df821bd48f18537d2a8a3e61b8e25efa6c5b9482 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 14 Feb 2025 21:37:02 +1100 Subject: [PATCH 12/36] update issue #609 --- apps/Core/Views/Default/html/apps/tables/modules.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apps/Core/Views/Default/html/apps/tables/modules.html b/apps/Core/Views/Default/html/apps/tables/modules.html index b1c669766..c35693f56 100644 --- a/apps/Core/Views/Default/html/apps/tables/modules.html +++ b/apps/Core/Views/Default/html/apps/tables/modules.html @@ -94,13 +94,6 @@ ] %} {% endif %} - {% if module['menu_id'] is defined %} - {% if modulesMenus[module['menu_id']]['apps'][app['id']] is defined and modulesMenus[module['menu_id']]['apps'][app['id']] == true %} - {% set checked = true %} - {% else %} - {% set checked = false %} - {% endif %} - {% endif %} {% if module['name'] in mandatoryModules %} {% set disabled = true %} {% set checked = true %} From 126ea4a67e6f068dc0a70ff3601e2a9f6b48b8af Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 14 Feb 2025 21:37:42 +1100 Subject: [PATCH 13/36] update #34, uninstall --- .../ModulesServiceProvider/Installer.php | 102 +++++++++++++++++- .../Modules/Packages.php | 1 - 2 files changed, 97 insertions(+), 6 deletions(-) diff --git a/system/Base/Providers/ModulesServiceProvider/Installer.php b/system/Base/Providers/ModulesServiceProvider/Installer.php index 1a6ab3841..34d672b8c 100644 --- a/system/Base/Providers/ModulesServiceProvider/Installer.php +++ b/system/Base/Providers/ModulesServiceProvider/Installer.php @@ -175,6 +175,7 @@ public function runProcess(array $data) $this->basepackages->progress->preCheckComplete(); $this->queue['results'] = arrayReplace($this->queue['results'], 'progress_progress_logs', []); + $this->queue['results'] = arrayReplace($this->queue['results'], 'result_logs', '-'); $this->modules->queues->update($this->queue); foreach ($this->runProcessProgressMethods as $method) { @@ -1185,11 +1186,25 @@ protected function runModuleInstallScripts($args) { $taskName = $args[0]; $module = $args[1]; + $uninstall = false; + if (isset($args[2])) { + $uninstall = $args[2]; + } $this->queue['results'][$taskName][$module['module_type']][$module['id']]['result'] = 'pass'; $resultQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['result_logs']; if ($module['name'] === 'Core') { + if ($uninstall) { + $this->queue['results'][$taskName][$module['module_type']][$module['id']]['result'] = 'fail'; + + return $this->queueHasErrors( + 'Core cannot be uninstalled!', + $resultQueueLogs, + false + ); + } + try { (new CoreInstall)->init()->install(); } catch (\throwable $e) { @@ -1220,7 +1235,15 @@ protected function runModuleInstallScripts($args) try { if ($this->localContent->fileExists($path)) { - (new $class)->init()->install(); + if ($uninstall) { + $class = new $class; + + if (method_exists($class, 'uninstall')) { + $class->init()->uninstall(); + } + } else { + (new $class)->init()->install(); + } } } catch (FilesystemException | UnableToCheckExistence | \throwable $e) { return true; @@ -1306,7 +1329,9 @@ protected function updateVersion($args) if (str_contains($module['module_type'], 'apptype')) { $this->apps->types->update($moduleArr); } else { - $moduleArr['dependencies'] = $moduleArr['repo_details']['latestRelease']['moduleJson']['dependencies']; + if (isset($moduleArr['repo_details']['latestRelease']['moduleJson']['dependencies'])) { + $moduleArr['dependencies'] = $moduleArr['repo_details']['latestRelease']['moduleJson']['dependencies']; + } $this->modules->{$module['module_type']}->update($moduleArr); } @@ -1716,7 +1741,11 @@ protected function registerRunProcessProgressMethods() $this->addProgressMethods($this->runProcessProgressMethods, $module, $taskName, 'everything_else', false); } } - } else if ($taskName === 'uninstall' && count($modulesTypes) > 0) { + } + } + + foreach ($this->queue['tasks']['analysed'] as $taskName => $modulesTypes) { + if ($taskName === 'uninstall' && count($modulesTypes) > 0) { foreach ($modulesTypes as $moduleType => $modules) { if ((is_array($modules) && count($modules) === 0) || !is_array($modules) @@ -1732,9 +1761,24 @@ protected function registerRunProcessProgressMethods() 'args' => [$taskName, $module], ] ); + if ($module['module_type'] !== 'views' && + $module['module_type'] !== 'apptype' + ) { + array_push($methods, + [ + 'method' => 'runModuleInstallScripts-' . $module['id'] . '-' . strtolower(str_replace(' ', '', $module['name'])), + 'text' => 'Running module install scripts for ' . $module['name'] . ' (' . ucfirst($module['module_type']) . ')...', + 'args' => [$taskName, $module, true], + ] + ); + } } } - } else if ($taskName === 'remove' && count($modulesTypes) > 0) { + } + } + + foreach ($this->queue['tasks']['analysed'] as $taskName => $modulesTypes) { + if ($taskName === 'remove' && count($modulesTypes) > 0) { foreach ($modulesTypes as $moduleType => $modules) { if ((is_array($modules) && count($modules) === 0) || !is_array($modules) @@ -1760,7 +1804,55 @@ protected function registerRunProcessProgressMethods() protected function uninstallModule($args) { - // + $taskName = $args[0]; + $module = $args[1]; + + $this->queue['results'][$taskName][$module['module_type']][$module['id']]['result'] = 'pass'; + $resultQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['result_logs']; + + if ($taskName === 'uninstall' && $module['name'] === 'Core' + ) { + return $this->queueHasErrors( + 'Core cannot be uninstalled!', + $resultQueueLogs, + false + ); + } + + try { + if (str_contains($module['module_type'], 'apptype')) { + $moduleArr = $this->apps->types->getAppTypeById($module['id']); + } else { + $moduleMethod = 'get' . ucfirst(substr($module['module_type'], 0, -1)) . 'ById'; + $moduleArr = $this->modules->{$module['module_type']}->$moduleMethod($module['id']); + } + + if (!$moduleArr) { + return $this->queueHasErrors( + 'Module not found with the ID provided. Please contact developer.', + $resultQueueLogs, + false + ); + } + + $moduleArr['installed'] = 0; + + if (str_contains($module['module_type'], 'apptype')) { + $this->apps->types->update($moduleArr); + } else { + $this->modules->{$module['module_type']}->update($moduleArr); + } + + return true; + } catch (\throwable $e) { + $this->queue['results'][$taskName][$module['module_type']][$module['id']]['result'] = 'fail'; + + return $this->queueHasErrors( + $e->getMessage(), + $resultQueueLogs, + false + ); + } } protected function removeModule($args) diff --git a/system/Base/Providers/ModulesServiceProvider/Modules/Packages.php b/system/Base/Providers/ModulesServiceProvider/Modules/Packages.php index e761cc839..2109db904 100644 --- a/system/Base/Providers/ModulesServiceProvider/Modules/Packages.php +++ b/system/Base/Providers/ModulesServiceProvider/Modules/Packages.php @@ -72,7 +72,6 @@ public function getPackageByClassForAppId($class, $appId = null) return false; } - public function getPackagesByApiId($apiId) { $packages = []; From 12864764e641eec996e89c68f1fce578b16ac84d Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sat, 15 Feb 2025 02:25:03 +1100 Subject: [PATCH 14/36] update issue #610 added check for apptype as well. If app type is not installed, it will throw 404. --- .../html/common/errors/routenotfound.html | 30 +++++++++++++++++++ system/Base/BaseComponent.php | 14 +++++++++ 2 files changed, 44 insertions(+) create mode 100644 apps/Core/Views/Default/html/common/errors/routenotfound.html diff --git a/apps/Core/Views/Default/html/common/errors/routenotfound.html b/apps/Core/Views/Default/html/common/errors/routenotfound.html new file mode 100644 index 000000000..05e1a87c1 --- /dev/null +++ b/apps/Core/Views/Default/html/common/errors/routenotfound.html @@ -0,0 +1,30 @@ +{% set sectionId = '404' %} +
+
+
+
+

+ Not Found! (Error:404) +

+

We couldn't find what you're looking for.

+

+ + Goto Home + +

+
+
+
+
+
+

What happened?

+

A 404 error status implies that the component you're looking for could not be found.

+
+
+

What can I do?

+

This should not happen. Either it is a bug or site issue. Please + contact us. +

+
+
+
\ No newline at end of file diff --git a/system/Base/BaseComponent.php b/system/Base/BaseComponent.php index 62884fbd8..bd86a0f16 100644 --- a/system/Base/BaseComponent.php +++ b/system/Base/BaseComponent.php @@ -191,6 +191,20 @@ public function beforeExecuteRoute() { $this->checkSettingsRoute(); + if ($this->app) { + $appType = $this->apps->types->getAppTypeByType($this->app['app_type']); + + if (!$appType || + ($appType && !$appType['installed']) + ) { + if (!$this->dispatcher->wasForwarded()) { + $this->setErrorDispatcher('routeNotFound', ['error' => true]); + + return false; + } + } + } + if (!$this->component && $this->app) { $this->setErrorDispatcher('controllerNotFound', ['error' => true]); From d00ee124351a4f3ad0bf0052db5b56a2d1e8d69f Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sat, 15 Feb 2025 03:15:09 +1100 Subject: [PATCH 15/36] update #605. Fix bug where if you remove 1 module, it removes all. --- apps/Core/Views/Default/html/devtools/modules/module.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/Core/Views/Default/html/devtools/modules/module.html b/apps/Core/Views/Default/html/devtools/modules/module.html index ff4109049..0f68b6b27 100644 --- a/apps/Core/Views/Default/html/devtools/modules/module.html +++ b/apps/Core/Views/Default/html/devtools/modules/module.html @@ -1972,7 +1972,7 @@ if (dataCollectionSectionForm['vars']['moduleWidgets'].length > 0) { $(dataCollectionSectionForm['vars']['moduleWidgets']).each(function(index, widget) { if (widget['method'] === $('#{{componentId}}-{{sectionId}}-widget-method').val()) { - dataCollectionSectionForm['vars']['moduleWidgets'].splice(index); + dataCollectionSectionForm['vars']['moduleWidgets'].splice(index, 1); } }); @@ -3179,13 +3179,14 @@ }); if (found) { - if (modules === 'views') { + if (modules === 'views' && dataCollectionSectionForm['vars']['module_type'] === 'views') { $('#{{componentId}}-{{sectionId}}-base_view_module_id').val('0'); $('#{{componentId}}-{{sectionId}}-base_view_module')[0].checked = true; $('#{{componentId}}-{{sectionId}}-base_view_module').attr('disabled', false); } - dataCollectionSectionForm['vars']['moduleDependencies'][modules].splice(foundIndex); + + dataCollectionSectionForm['vars']['moduleDependencies'][modules].splice(foundIndex, 1); } } } From 15003fb0e7ab76eb2d1c70f705d9140acff9d522 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sat, 15 Feb 2025 03:17:13 +1100 Subject: [PATCH 16/36] update #605, Fix bug where if you remove 1 module, it removes all. --- apps/Core/Views/Default/html/devtools/modules/module.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/Core/Views/Default/html/devtools/modules/module.html b/apps/Core/Views/Default/html/devtools/modules/module.html index 0f68b6b27..b8f517fa6 100644 --- a/apps/Core/Views/Default/html/devtools/modules/module.html +++ b/apps/Core/Views/Default/html/devtools/modules/module.html @@ -1087,7 +1087,7 @@ }); if (found) { - dataCollectionSectionForm['vars']['bundleModules'][modules].splice(foundIndex); + dataCollectionSectionForm['vars']['bundleModules'][modules].splice(foundIndex, 1); } } } From 8166598d64c9cabef3d583b288ecef91a78ebb19 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sat, 15 Feb 2025 04:50:21 +1100 Subject: [PATCH 17/36] update #34, update uninstall for app type. App type uninstall, uninstalls all modules of that app type. --- .../Views/Default/html/modules/modules.html | 104 +++++++- .../ModulesServiceProvider/Installer.php | 235 +++++++++++++++--- .../Modules/Packages.php | 7 +- 3 files changed, 300 insertions(+), 46 deletions(-) diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index 66b9daf5e..bdfedb996 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -283,7 +283,7 @@
Select module from the tre {% set queue = str_replace('\\', '\\\\', queue) %} {% set modules = json_encode(modules, 16) %}