diff --git a/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php b/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php
index b8674dc5..fbcb447f 100644
--- a/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php
+++ b/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php
@@ -267,11 +267,46 @@ class DashboardModel extends BaseDatabaseModel
{
try
{
- $app = Factory::getApplication();
- $app->get('cache_handler', 'file');
+ // Purge all file-based cache directories
+ $root = JPATH_ROOT;
+ $dirs = [
+ $root . '/cache',
+ $root . '/administrator/cache',
+ ];
- // Clear site and admin caches
- $cache = Factory::getContainer()->get(\Joomla\CMS\Cache\CacheControllerFactoryInterface::class);
+ foreach ($dirs as $dir)
+ {
+ if (!is_dir($dir))
+ {
+ continue;
+ }
+
+ $it = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS),
+ \RecursiveIteratorIterator::CHILD_FIRST
+ );
+
+ foreach ($it as $file)
+ {
+ $name = $file->getFilename();
+
+ if ($name === 'index.html' || $name === '.htaccess')
+ {
+ continue;
+ }
+
+ if ($file->isDir())
+ {
+ @rmdir($file->getPathname());
+ }
+ else
+ {
+ @unlink($file->getPathname());
+ }
+ }
+ }
+
+ // Also run Joomla's built-in cache GC for non-file handlers
Factory::getCache('', '')->gc();
Factory::getCache('', '', 'administrator')->gc();
@@ -281,7 +316,7 @@ class DashboardModel extends BaseDatabaseModel
\opcache_reset();
}
- return ['success' => true, 'message' => 'Cache cleared successfully.'];
+ return ['success' => true, 'message' => 'All cache cleared successfully.'];
}
catch (\Throwable $e)
{
diff --git a/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.ini b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.ini
new file mode 100644
index 00000000..dd3acea8
--- /dev/null
+++ b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.ini
@@ -0,0 +1,3 @@
+MOD_MOKOWAAS_CACHE="MokoWaaS Cache Cleaner"
+MOD_MOKOWAAS_CACHE_DESC="One-click cache cleaner in the admin status bar. Clears all Joomla cache (site, admin, and expired)."
+MOD_MOKOWAAS_CACHE_CLEAR_ALL="Clear All Cache"
diff --git a/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.sys.ini b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.sys.ini
new file mode 100644
index 00000000..25f62d28
--- /dev/null
+++ b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.sys.ini
@@ -0,0 +1,2 @@
+MOD_MOKOWAAS_CACHE="MokoWaaS Cache Cleaner"
+MOD_MOKOWAAS_CACHE_DESC="One-click cache cleaner in the admin status bar. Clears all Joomla cache (site, admin, and expired)."
diff --git a/src/packages/mod_mokowaas_cache/mod_mokowaas_cache.xml b/src/packages/mod_mokowaas_cache/mod_mokowaas_cache.xml
new file mode 100644
index 00000000..f6782c0c
--- /dev/null
+++ b/src/packages/mod_mokowaas_cache/mod_mokowaas_cache.xml
@@ -0,0 +1,24 @@
+
+
+ mod_mokowaas_cache
+ Moko Consulting
+ 2026-06-04
+ Copyright (C) 2026 Moko Consulting. All rights reserved.
+ GPL-3.0-or-later
+ hello@mokoconsulting.tech
+ https://mokoconsulting.tech
+ 02.32.46
+ MOD_MOKOWAAS_CACHE_DESC
+ Moko\Module\MokoWaaSCache
+
+
+ services
+ src
+ tmpl
+
+
+
+ en-GB/mod_mokowaas_cache.ini
+ en-GB/mod_mokowaas_cache.sys.ini
+
+
diff --git a/src/packages/mod_mokowaas_cache/services/provider.php b/src/packages/mod_mokowaas_cache/services/provider.php
new file mode 100644
index 00000000..cf5c25c4
--- /dev/null
+++ b/src/packages/mod_mokowaas_cache/services/provider.php
@@ -0,0 +1,23 @@
+registerServiceProvider(new ModuleDispatcherFactory('\\Moko\\Module\\MokoWaaSCache'));
+ $container->registerServiceProvider(new Module());
+ }
+};
diff --git a/src/packages/mod_mokowaas_cache/src/Dispatcher/Dispatcher.php b/src/packages/mod_mokowaas_cache/src/Dispatcher/Dispatcher.php
new file mode 100644
index 00000000..b67aad8d
--- /dev/null
+++ b/src/packages/mod_mokowaas_cache/src/Dispatcher/Dispatcher.php
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/src/packages/mod_mokowaas_menu/tmpl/default.php b/src/packages/mod_mokowaas_menu/tmpl/default.php
index d95b4df2..794f4b0d 100644
--- a/src/packages/mod_mokowaas_menu/tmpl/default.php
+++ b/src/packages/mod_mokowaas_menu/tmpl/default.php
@@ -2,8 +2,9 @@
/**
* MokoWaaS Admin Sidebar Menu
*
- * Renders a dedicated MokoWaaS section in the admin sidebar,
- * similar to Community Builder's mod_cbadmin.
+ * Collapsible sidebar section — collapsed by default, auto-expands
+ * when on a MokoWaaS page. Mirrors Joomla's own mm-active/mm-show
+ * pattern used by CB's mod_cbadmin.
*/
defined('_JEXEC') or die;
@@ -22,35 +23,75 @@ $items = [
['icon' => 'icon-power-off', 'title' => 'Feature Plugins', 'link' => 'index.php?option=com_plugins&filter[folder]=system&filter[search]=mokowaas'],
];
-$currentOption = \Joomla\CMS\Factory::getApplication()->getInput()->get('option', '');
-$currentView = \Joomla\CMS\Factory::getApplication()->getInput()->get('view', '');
+$app = \Joomla\CMS\Factory::getApplication();
+$currentOption = $app->getInput()->get('option', '');
+$currentView = $app->getInput()->get('view', '');
+
+// Auto-expand when on a MokoWaaS page
+$isMokoPage = ($currentOption === 'com_mokowaas')
+ || ($currentOption === 'com_plugins' && stripos($app->getInput()->get('filter', [], 'array')['search'] ?? $app->getInput()->getString('filter_search', ''), 'mokowaas') !== false);
+
+$collapseId = 'mokowaas-menu-collapse';
?>
-
+
+
diff --git a/src/pkg_mokowaas.xml b/src/pkg_mokowaas.xml
index dc020611..ab3b4e00 100644
--- a/src/pkg_mokowaas.xml
+++ b/src/pkg_mokowaas.xml
@@ -21,6 +21,7 @@
com_mokowaas.zip
mod_mokowaas_cpanel.zip
+ mod_mokowaas_cache.zip
plg_webservices_mokowaas.zip
plg_webservices_perfectpublisher.zip
plg_task_mokowaasdemo.zip
@@ -30,6 +31,6 @@
- https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/raw/branch/main/updates.xml
+ https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/updates.xml
diff --git a/src/script.php b/src/script.php
index 8d659f98..5d55bf36 100644
--- a/src/script.php
+++ b/src/script.php
@@ -58,6 +58,9 @@ class Pkg_MokowaasInstallerScript
// Set up admin sidebar menu module
$this->setupAdminMenuModule();
+ // Set up cache cleaner status bar module
+ $this->setupCacheModule();
+
// Create Support portal menu item on frontend
$this->setupSupportMenuItem();
@@ -773,6 +776,70 @@ class Pkg_MokowaasInstallerScript
}
}
+ /**
+ * Set up the cache cleaner module in the admin status bar position.
+ */
+ private function setupCacheModule(): void
+ {
+ try
+ {
+ $db = Factory::getDbo();
+
+ // Enable the module extension
+ $db->setQuery(
+ $db->getQuery(true)
+ ->update($db->quoteName('#__extensions'))
+ ->set($db->quoteName('enabled') . ' = 1')
+ ->where($db->quoteName('type') . ' = ' . $db->quote('module'))
+ ->where($db->quoteName('element') . ' = ' . $db->quote('mod_mokowaas_cache'))
+ )->execute();
+
+ // Check if module instance exists
+ $db->setQuery(
+ $db->getQuery(true)
+ ->select('COUNT(*)')
+ ->from($db->quoteName('#__modules'))
+ ->where($db->quoteName('module') . ' = ' . $db->quote('mod_mokowaas_cache'))
+ );
+
+ if ((int) $db->loadResult() > 0)
+ {
+ return;
+ }
+
+ $module = (object) [
+ 'title' => 'MokoWaaS Cache Cleaner',
+ 'note' => '',
+ 'content' => '',
+ 'ordering' => 8,
+ 'position' => 'status',
+ 'checked_out' => null,
+ 'checked_out_time' => null,
+ 'publish_up' => null,
+ 'publish_down' => null,
+ 'published' => 1,
+ 'module' => 'mod_mokowaas_cache',
+ 'access' => 3,
+ 'showtitle' => 0,
+ 'params' => '{}',
+ 'client_id' => 1,
+ 'language' => '*',
+ ];
+
+ $db->insertObject('#__modules', $module, 'id');
+
+ if ((int) $module->id)
+ {
+ $mm = (object) ['moduleid' => (int) $module->id, 'menuid' => 0];
+ $db->insertObject('#__modules_menu', $mm, 'moduleid');
+ }
+ }
+ catch (\Throwable $e)
+ {
+ Log::add('Cache module setup error: ' . $e->getMessage(), Log::WARNING, 'mokowaas');
+ }
+ }
+
/**
* Create a "Support" menu item on the frontend main menu.
*/