diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml index 41b76d9b..c2d8af81 100644 --- a/.mokogitea/workflows/issue-branch.yml +++ b/.mokogitea/workflows/issue-branch.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: Gitea.Workflow # INGROUP: mokocli.Automation -# VERSION: 01.08.56 +# VERSION: 01.08.57 # BRIEF: Auto-create feature branch when an issue is opened name: "Universal: Issue Branch" diff --git a/CHANGELOG.md b/CHANGELOG.md index 7daf0f9b..7fb057ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ - **TikTok audit warning**: Language string explaining that unverified apps can only create private posts (#164) ### Fixed +- **PreviewController**: Add ACL check and parameterized query to prevent unauthorized article access (IDOR) - Webservices plugin Joomla 6 compatibility — `onBeforeApiRoute` receives `BeforeApiRouteEvent` object, extract router via `$event->getRouter()` ## [01.07.00] --- 2026-06-23 @@ -104,7 +105,7 @@ ## [01.03.00] --- 2026-06-21 - + All notable changes to MokoSuiteCross will be documented in this file. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index de5fecc9..d00f1389 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -14,7 +14,7 @@ DEFGROUP: Template-Joomla INGROUP: Template-Joomla.Documentation REPO: https://github.com/mokoconsulting-tech/Template-Joomla/ - VERSION: 01.08.56 + VERSION: 01.08.57 PATH: ./CODE_OF_CONDUCT.md BRIEF: Community expectations and enforcement guidelines NOTE: Adapted with attribution from the Contributor Covenant v2.1 diff --git a/README.md b/README.md index cf3bb180..bf1dc4b5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MokoSuiteCross - + Cross-posting Joomla content to social media, email marketing, and chat platforms for Joomla 5/6. @@ -16,8 +16,14 @@ MokoSuiteCross automatically publishes your Joomla articles to multiple platform - **Post queue** — Scheduled posting, retry on failure, detailed delivery logs - **Message templates** — Customize post format per platform with placeholders ({title}, {url}, {social}, {short}, {chat}, {email_subject}, {email_body}, {field:xxx}) - **Share Content panel** — Per-article fields for platform-optimized text (social, short, chat, email) with image picker +- **AI caption generation** — Generate platform-optimized captions using Claude or OpenAI with one click +- **Social preview** — AJAX platform mockups (Twitter, Facebook, LinkedIn, Instagram, Mastodon, Bluesky) in the article editor +- **Social image generator** — Generate Open Graph images with article title overlay using PHP GD +- **Link shortening** — Shorten URLs via Bitly, Rebrandly, or YOURLS with {url_short} placeholder - **Caption rotation** — {random:opt1|opt2|opt3} placeholder for varying evergreen re-shares - **UTM tracking** — Auto-append UTM parameters to shared links with {platform} token +- **Post calendar** — Visual monthly calendar view of scheduled and completed cross-posts +- **Posting analytics** — Best time to post heatmap with per-service breakdown and recommendations - **Delete from platforms** — Remove cross-posted content when articles are unpublished/trashed (7 platforms) - **Post history** — Track what was posted where, with platform response data - **Evergreen re-sharing** — Automatically re-share articles on a configurable interval @@ -82,7 +88,7 @@ MokoSuiteCross automatically publishes your Joomla articles to multiple platform | RSS Feed | `plg_mokosuitecross_rssfeed` | Implemented | | ActivityPub | `plg_mokosuitecross_activitypub` | Implemented | | Google Business | `plg_mokosuitecross_googlebusiness` | Implemented | -| Nostr | `plg_mokosuitecross_nostr` | Stub (WebSocket deferred) | +| Nostr | `plg_mokosuitecross_nostr` | Implemented | ## Installation diff --git a/SECURITY.md b/SECURITY.md index 7eb5cdf0..9f51bf26 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -23,7 +23,7 @@ DEFGROUP: Template-Joomla INGROUP: Template-Joomla.Documentation REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla PATH: /SECURITY.md -VERSION: 01.08.56 +VERSION: 01.08.57 BRIEF: Security vulnerability reporting and handling policy --> diff --git a/source/packages/com_mokosuitecross/language/en-GB/com_mokosuitecross.ini b/source/packages/com_mokosuitecross/language/en-GB/com_mokosuitecross.ini index c47aaea6..e0f2b18c 100644 --- a/source/packages/com_mokosuitecross/language/en-GB/com_mokosuitecross.ini +++ b/source/packages/com_mokosuitecross/language/en-GB/com_mokosuitecross.ini @@ -570,20 +570,6 @@ COM_MOKOSUITECROSS_AI_GENERATE_DESC="Generate platform-optimized captions from t COM_MOKOSUITECROSS_AI_GENERATING="Generating captions..." COM_MOKOSUITECROSS_AI_GENERATED="AI captions generated successfully." COM_MOKOSUITECROSS_AI_ERROR="AI generation failed: %s" - -; Social Image Generator -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE="Social Image Generator" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_BG_COLOR="Background Color" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_BG_COLOR_DESC="Default background color for generated OG images when no article image is available." -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_TEXT_COLOR="Text Color" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_TEXT_COLOR_DESC="Color for the title and site name text overlay on generated images." -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_OVERLAY="Image Overlay" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_OVERLAY_DESC="Darken or lighten the background image to improve text readability." -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_OVERLAY_NONE="None" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_OVERLAY_LIGHT="Light" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_OVERLAY_DARK="Dark" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_SITE_NAME="Site Name Override" -COM_MOKOSUITECROSS_CONFIG_SOCIAL_IMAGE_SITE_NAME_DESC="Custom site name shown at the bottom of generated images. Leave blank to use the Joomla site name." COM_MOKOSUITECROSS_AI_NOT_CONFIGURED="AI is not configured. Go to Options to set up a provider and API key." ; Analytics @@ -610,25 +596,14 @@ COM_MOKOSUITECROSS_ANALYTICS_LEGEND_LOW="Low success rate" COM_MOKOSUITECROSS_ANALYTICS_LEGEND_NONE="No data" COM_MOKOSUITECROSS_PERIOD_180_DAYS="Last 180 days" COM_MOKOSUITECROSS_PERIOD_365_DAYS="Last 365 days" + ; Category Rules COM_MOKOSUITECROSS_CONFIG_CATEGORY_RULES="Category Rules" COM_MOKOSUITECROSS_CONFIG_CATEGORY_RULES_NOTE="Category Routing" COM_MOKOSUITECROSS_CONFIG_CATEGORY_RULES_NOTE_DESC="Category routing rules let you map Joomla categories to specific cross-post services. When rules exist for a category, only those services receive posts. When no rules exist, all services are used (default behaviour). Rules are managed in the database table #__mokosuitecross_category_rules. A full admin UI will be added in a future release." -; Posting Analytics -COM_MOKOSUITECROSS_ANALYTICS_FILTER_SERVICE="Service" -COM_MOKOSUITECROSS_ANALYTICS_ALL_SERVICES="All Services" -COM_MOKOSUITECROSS_ANALYTICS_PERIOD="Period" -COM_MOKOSUITECROSS_ANALYTICS_BEST_TIMES="Best Times to Post" -COM_MOKOSUITECROSS_ANALYTICS_POSTS_COUNT="%d posts" -COM_MOKOSUITECROSS_ANALYTICS_HEATMAP="Posting Heatmap" -COM_MOKOSUITECROSS_ANALYTICS_NO_DATA="No posting data available for the selected period." -COM_MOKOSUITECROSS_ANALYTICS_LESS="Less" -COM_MOKOSUITECROSS_ANALYTICS_MORE="More" -COM_MOKOSUITECROSS_ANALYTICS_SERVICE_BREAKDOWN="Service Breakdown" -COM_MOKOSUITECROSS_ANALYTICS_SERVICE="Service" -COM_MOKOSUITECROSS_ANALYTICS_TOTAL="Total" -COM_MOKOSUITECROSS_ANALYTICS_SUCCESS="Success" -COM_MOKOSUITECROSS_ANALYTICS_FAILED="Failed" -COM_MOKOSUITECROSS_ANALYTICS_SUCCESS_RATE="Success Rate" -COM_MOKOSUITECROSS_ANALYTICS_AVG_PER_DAY="Avg/Day" +; Calendar View +COM_MOKOSUITECROSS_CALENDAR_PREV_MONTH="Previous" +COM_MOKOSUITECROSS_CALENDAR_NEXT_MONTH="Next" +COM_MOKOSUITECROSS_CALENDAR_TODAY="Today" +COM_MOKOSUITECROSS_SUBMENU_CALENDAR="Post Calendar" diff --git a/source/packages/com_mokosuitecross/mokosuitecross.xml b/source/packages/com_mokosuitecross/mokosuitecross.xml index c83df209..26ba2acc 100644 --- a/source/packages/com_mokosuitecross/mokosuitecross.xml +++ b/source/packages/com_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ com_mokosuitecross - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/com_mokosuitecross/sql/updates/mysql/01.08.57.sql b/source/packages/com_mokosuitecross/sql/updates/mysql/01.08.57.sql new file mode 100644 index 00000000..f0c936a7 --- /dev/null +++ b/source/packages/com_mokosuitecross/sql/updates/mysql/01.08.57.sql @@ -0,0 +1 @@ +/* 01.08.57 — no schema changes */ diff --git a/source/packages/com_mokosuitecross/src/Controller/AnalyticsController.php b/source/packages/com_mokosuitecross/src/Controller/AnalyticsController.php index 9189243b..fce9f59b 100644 --- a/source/packages/com_mokosuitecross/src/Controller/AnalyticsController.php +++ b/source/packages/com_mokosuitecross/src/Controller/AnalyticsController.php @@ -14,39 +14,11 @@ namespace Joomla\Component\MokoSuiteCross\Administrator\Controller; defined('_JEXEC') or die; use Joomla\CMS\MVC\Controller\BaseController; -use Joomla\CMS\Session\Session; -use Joomla\Component\MokoSuiteCross\Administrator\Helper\AnalyticsHelper; class AnalyticsController extends BaseController { - public function getHeatmapData(): void + public function display($cachable = false, $urlparams = []): static { - if (!Session::checkToken('get')) { - echo json_encode(['success' => false, 'error' => 'Invalid token']); - $this->app->close(); - - return; - } - - if (!$this->app->getIdentity()->authorise('core.manage', 'com_mokosuitecross')) { - echo json_encode(['success' => false, 'error' => 'Permission denied']); - $this->app->close(); - - return; - } - - $serviceType = $this->input->getCmd('service_type', ''); - $days = $this->input->getInt('days', 90); - - $heatmap = AnalyticsHelper::getPostingHeatmap($serviceType, $days); - $bestTimes = AnalyticsHelper::getBestTimes($serviceType, $days); - - $this->app->setHeader('Content-Type', 'application/json; charset=utf-8'); - echo json_encode([ - 'success' => true, - 'heatmap' => $heatmap, - 'best_times' => $bestTimes, - ]); - $this->app->close(); + return parent::display($cachable, $urlparams); } } diff --git a/source/packages/com_mokosuitecross/src/Controller/PreviewController.php b/source/packages/com_mokosuitecross/src/Controller/PreviewController.php index 7dc45502..eb0b05b3 100644 --- a/source/packages/com_mokosuitecross/src/Controller/PreviewController.php +++ b/source/packages/com_mokosuitecross/src/Controller/PreviewController.php @@ -31,6 +31,17 @@ class PreviewController extends BaseController return; } + $user = $this->app->getIdentity(); + + if (!$user->authorise('core.manage', 'com_mokosuitecross') + && !$user->authorise('core.edit', 'com_content') + && !$user->authorise('core.edit.own', 'com_content')) { + echo json_encode(['error' => 'Permission denied']); + $this->app->close(); + + return; + } + $articleId = $this->input->getInt('article_id', 0); $platform = $this->input->getCmd('platform', 'twitter'); @@ -43,10 +54,14 @@ class PreviewController extends BaseController $db = Factory::getDbo(); + $groups = $user->getAuthorisedViewLevels(); + $query = $db->getQuery(true) ->select('*') ->from($db->quoteName('#__content')) - ->where($db->quoteName('id') . ' = ' . $articleId); + ->where($db->quoteName('id') . ' = :id') + ->where($db->quoteName('access') . ' IN (' . implode(',', array_map('intval', $groups)) . ')') + ->bind(':id', $articleId, \Joomla\Database\ParameterType::INTEGER); $db->setQuery($query); $article = $db->loadObject(); diff --git a/source/packages/com_mokosuitecross/src/Helper/MokoSuiteCrossHelper.php b/source/packages/com_mokosuitecross/src/Helper/MokoSuiteCrossHelper.php index 04a29037..84b66d4d 100644 --- a/source/packages/com_mokosuitecross/src/Helper/MokoSuiteCrossHelper.php +++ b/source/packages/com_mokosuitecross/src/Helper/MokoSuiteCrossHelper.php @@ -41,6 +41,8 @@ class MokoSuiteCrossHelper 'services' => 'COM_MOKOSUITECROSS_SUBMENU_SERVICES', 'templates' => 'COM_MOKOSUITECROSS_SUBMENU_TEMPLATES', 'logs' => 'COM_MOKOSUITECROSS_SUBMENU_LOGS', + 'calendar' => 'COM_MOKOSUITECROSS_SUBMENU_CALENDAR', + 'analytics' => 'COM_MOKOSUITECROSS_SUBMENU_ANALYTICS', ]; // Joomla 5+ toolbar submenu diff --git a/source/packages/com_mokosuitecross/src/Model/AnalyticsModel.php b/source/packages/com_mokosuitecross/src/Model/AnalyticsModel.php new file mode 100644 index 00000000..0cad8a80 --- /dev/null +++ b/source/packages/com_mokosuitecross/src/Model/AnalyticsModel.php @@ -0,0 +1,169 @@ + + * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. + * @license GNU General Public License version 3 or later; see LICENSE + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +namespace Joomla\Component\MokoSuiteCross\Administrator\Model; + +defined('_JEXEC') or die; + +use Joomla\CMS\Factory; +use Joomla\CMS\MVC\Model\BaseDatabaseModel; + +class AnalyticsModel extends BaseDatabaseModel +{ + public function getHeatmap(int $days = 90, ?int $serviceId = null): array + { + $db = $this->getDatabase(); + + $cutoff = Factory::getDate('now - ' . $days . ' days')->format('Y-m-d H:i:s'); + + $query = $db->getQuery(true) + ->select([ + 'DAYOFWEEK(' . $db->quoteName('posted_at') . ') AS dow', + 'HOUR(' . $db->quoteName('posted_at') . ') AS hour_of_day', + 'COUNT(*) AS total', + 'SUM(CASE WHEN ' . $db->quoteName('status') . ' = ' . $db->quote('posted') . ' THEN 1 ELSE 0 END) AS success', + ]) + ->from($db->quoteName('#__mokosuitecross_posts')) + ->where($db->quoteName('posted_at') . ' IS NOT NULL') + ->where($db->quoteName('posted_at') . ' >= ' . $db->quote($cutoff)) + ->group('DAYOFWEEK(' . $db->quoteName('posted_at') . '), HOUR(' . $db->quoteName('posted_at') . ')') + ->order('dow ASC, hour_of_day ASC'); + + if ($serviceId !== null && $serviceId > 0) { + $query->where($db->quoteName('service_id') . ' = ' . (int) $serviceId); + } + + $db->setQuery($query); + $rows = $db->loadAssocList() ?: []; + + $grid = []; + + for ($d = 1; $d <= 7; $d++) { + for ($h = 0; $h < 24; $h++) { + $grid[$d][$h] = ['total' => 0, 'success' => 0, 'rate' => 0]; + } + } + + foreach ($rows as $row) { + $d = (int) $row['dow']; + $h = (int) $row['hour_of_day']; + $grid[$d][$h] = [ + 'total' => (int) $row['total'], + 'success' => (int) $row['success'], + 'rate' => (int) $row['total'] > 0 + ? round(((int) $row['success'] / (int) $row['total']) * 100) + : 0, + ]; + } + + return $grid; + } + + public function getBestTimes(int $days = 90, ?int $serviceId = null, int $limit = 5): array + { + $db = $this->getDatabase(); + + $cutoff = Factory::getDate('now - ' . $days . ' days')->format('Y-m-d H:i:s'); + + $query = $db->getQuery(true) + ->select([ + 'DAYOFWEEK(' . $db->quoteName('posted_at') . ') AS dow', + 'HOUR(' . $db->quoteName('posted_at') . ') AS hour_of_day', + 'COUNT(*) AS total', + 'SUM(CASE WHEN ' . $db->quoteName('status') . ' = ' . $db->quote('posted') . ' THEN 1 ELSE 0 END) AS success', + ]) + ->from($db->quoteName('#__mokosuitecross_posts')) + ->where($db->quoteName('posted_at') . ' IS NOT NULL') + ->where($db->quoteName('posted_at') . ' >= ' . $db->quote($cutoff)) + ->group('DAYOFWEEK(' . $db->quoteName('posted_at') . '), HOUR(' . $db->quoteName('posted_at') . ')') + ->having('COUNT(*) >= 3') + ->order('success DESC, total DESC'); + + if ($serviceId !== null && $serviceId > 0) { + $query->where($db->quoteName('service_id') . ' = ' . (int) $serviceId); + } + + $db->setQuery($query, 0, $limit); + + return $db->loadAssocList() ?: []; + } + + public function getHourlyDistribution(int $days = 90, ?int $serviceId = null): array + { + $db = $this->getDatabase(); + + $cutoff = Factory::getDate('now - ' . $days . ' days')->format('Y-m-d H:i:s'); + + $query = $db->getQuery(true) + ->select([ + 'HOUR(' . $db->quoteName('posted_at') . ') AS hour_of_day', + 'COUNT(*) AS total', + 'SUM(CASE WHEN ' . $db->quoteName('status') . ' = ' . $db->quote('posted') . ' THEN 1 ELSE 0 END) AS success', + 'SUM(CASE WHEN ' . $db->quoteName('status') . ' = ' . $db->quote('failed') . ' THEN 1 ELSE 0 END) AS failed', + ]) + ->from($db->quoteName('#__mokosuitecross_posts')) + ->where($db->quoteName('posted_at') . ' IS NOT NULL') + ->where($db->quoteName('posted_at') . ' >= ' . $db->quote($cutoff)) + ->group('HOUR(' . $db->quoteName('posted_at') . ')') + ->order('hour_of_day ASC'); + + if ($serviceId !== null && $serviceId > 0) { + $query->where($db->quoteName('service_id') . ' = ' . (int) $serviceId); + } + + $db->setQuery($query); + + return $db->loadAssocList() ?: []; + } + + public function getDayOfWeekDistribution(int $days = 90, ?int $serviceId = null): array + { + $db = $this->getDatabase(); + + $cutoff = Factory::getDate('now - ' . $days . ' days')->format('Y-m-d H:i:s'); + + $query = $db->getQuery(true) + ->select([ + 'DAYOFWEEK(' . $db->quoteName('posted_at') . ') AS dow', + 'COUNT(*) AS total', + 'SUM(CASE WHEN ' . $db->quoteName('status') . ' = ' . $db->quote('posted') . ' THEN 1 ELSE 0 END) AS success', + 'SUM(CASE WHEN ' . $db->quoteName('status') . ' = ' . $db->quote('failed') . ' THEN 1 ELSE 0 END) AS failed', + ]) + ->from($db->quoteName('#__mokosuitecross_posts')) + ->where($db->quoteName('posted_at') . ' IS NOT NULL') + ->where($db->quoteName('posted_at') . ' >= ' . $db->quote($cutoff)) + ->group('DAYOFWEEK(' . $db->quoteName('posted_at') . ')') + ->order('dow ASC'); + + if ($serviceId !== null && $serviceId > 0) { + $query->where($db->quoteName('service_id') . ' = ' . (int) $serviceId); + } + + $db->setQuery($query); + + return $db->loadAssocList() ?: []; + } + + public function getServices(): array + { + $db = $this->getDatabase(); + + $query = $db->getQuery(true) + ->select([$db->quoteName('id'), $db->quoteName('title'), $db->quoteName('service_type')]) + ->from($db->quoteName('#__mokosuitecross_services')) + ->where($db->quoteName('published') . ' = 1') + ->order($db->quoteName('title') . ' ASC'); + + $db->setQuery($query); + + return $db->loadAssocList() ?: []; + } +} diff --git a/source/packages/com_mokosuitecross/src/View/Analytics/HtmlView.php b/source/packages/com_mokosuitecross/src/View/Analytics/HtmlView.php index f2742736..a79d2830 100644 --- a/source/packages/com_mokosuitecross/src/View/Analytics/HtmlView.php +++ b/source/packages/com_mokosuitecross/src/View/Analytics/HtmlView.php @@ -15,31 +15,41 @@ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; -use Joomla\CMS\Router\Route; -use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Toolbar\ToolbarHelper; -use Joomla\Component\MokoSuiteCross\Administrator\Helper\AnalyticsHelper; use Joomla\Component\MokoSuiteCross\Administrator\Helper\MokoSuiteCrossHelper; class HtmlView extends BaseHtmlView { - public array $heatmap = []; - public array $bestTimes = []; - public array $serviceBreakdown = []; - public array $serviceTypes = []; - public string $serviceFilter = ''; - public int $days = 90; + public $heatmap; + public $bestTimes; + public $hourlyDistribution; + public $dayDistribution; + public $services; + public $serviceId; + public $period; public function display($tpl = null): void { - $input = Factory::getApplication()->input; + /** @var \Joomla\Component\MokoSuiteCross\Administrator\Model\AnalyticsModel $model */ + $model = $this->getModel(); - $this->serviceFilter = $input->getCmd('service_type', ''); - $this->days = $input->getInt('days', 90); - $this->heatmap = AnalyticsHelper::getPostingHeatmap($this->serviceFilter, $this->days); - $this->bestTimes = AnalyticsHelper::getBestTimes($this->serviceFilter, $this->days); - $this->serviceBreakdown = AnalyticsHelper::getServiceBreakdown($this->days); - $this->serviceTypes = AnalyticsHelper::getServiceTypes(); + $input = Factory::getApplication()->input; + $this->period = $input->getInt('period', 90); + $this->serviceId = $input->getInt('service_id', 0); + + $validPeriods = [7, 30, 90, 180, 365]; + + if (!\in_array($this->period, $validPeriods, true)) { + $this->period = 90; + } + + $sid = $this->serviceId > 0 ? $this->serviceId : null; + + $this->heatmap = $model->getHeatmap($this->period, $sid); + $this->bestTimes = $model->getBestTimes($this->period, $sid); + $this->hourlyDistribution = $model->getHourlyDistribution($this->period, $sid); + $this->dayDistribution = $model->getDayOfWeekDistribution($this->period, $sid); + $this->services = $model->getServices(); $this->addToolbar(); @@ -50,14 +60,6 @@ class HtmlView extends BaseHtmlView protected function addToolbar(): void { - ToolbarHelper::title('MokoSuiteCross -- Posting Analytics', 'chart'); - - $toolbar = Toolbar::getInstance('toolbar'); - $toolbar->appendButton( - 'Link', - 'home', - 'COM_MOKOSUITECROSS_SUBMENU_DASHBOARD', - Route::_('index.php?option=com_mokosuitecross&view=dashboard', false) - ); + ToolbarHelper::title('MokoSuiteCross -- Analytics', 'chart'); } } diff --git a/source/packages/com_mokosuitecross/tmpl/analytics/default.php b/source/packages/com_mokosuitecross/tmpl/analytics/default.php index 5c4d2dfa..9fbe6fed 100644 --- a/source/packages/com_mokosuitecross/tmpl/analytics/default.php +++ b/source/packages/com_mokosuitecross/tmpl/analytics/default.php @@ -100,6 +100,7 @@ $dayNames = [ heatmap as $dayData) { foreach ($dayData as $cell) { if ($cell['total'] > $maxTotal) { @@ -113,10 +114,13 @@ $dayNames = [ $cell) : $intensity = $maxTotal > 0 ? $cell['total'] / $maxTotal : 0; - $r = $g = $b = 255; + $r = 255; + $g = 255; + $b = 255; if ($cell['total'] > 0) { $rate = $cell['rate']; + if ($rate >= 80) { $r = (int) (255 - (155 * $intensity)); $g = (int) (255 - (100 * $intensity)); @@ -179,7 +183,10 @@ $dayNames = [ \ No newline at end of file + diff --git a/source/packages/com_mokosuitecross/tmpl/dashboard/default.php b/source/packages/com_mokosuitecross/tmpl/dashboard/default.php index 13be5781..4ac74e7c 100644 --- a/source/packages/com_mokosuitecross/tmpl/dashboard/default.php +++ b/source/packages/com_mokosuitecross/tmpl/dashboard/default.php @@ -282,6 +282,10 @@ $queueProcessing = $componentParams->get('queue_processing', 'scheduler'); class="list-group-item list-group-item-action"> + + + diff --git a/source/packages/plg_content_mokosuitecross/mokosuitecross.xml b/source/packages/plg_content_mokosuitecross/mokosuitecross.xml index 57f3a3b6..8dc812b3 100644 --- a/source/packages/plg_content_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_content_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ Content - MokoSuiteCross - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_activitypub/activitypub.xml b/source/packages/plg_mokosuitecross_activitypub/activitypub.xml index b270f27f..84262a0e 100644 --- a/source/packages/plg_mokosuitecross_activitypub/activitypub.xml +++ b/source/packages/plg_mokosuitecross_activitypub/activitypub.xml @@ -1,7 +1,7 @@ MokoSuiteCross - ActivityPub (Fediverse) - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_blogger/blogger.xml b/source/packages/plg_mokosuitecross_blogger/blogger.xml index 7a23a0b9..dff91d6e 100644 --- a/source/packages/plg_mokosuitecross_blogger/blogger.xml +++ b/source/packages/plg_mokosuitecross_blogger/blogger.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Google Blogger - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_bluesky/bluesky.xml b/source/packages/plg_mokosuitecross_bluesky/bluesky.xml index b0f87ff5..e1c8a758 100644 --- a/source/packages/plg_mokosuitecross_bluesky/bluesky.xml +++ b/source/packages/plg_mokosuitecross_bluesky/bluesky.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Bluesky - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_brevo/brevo.xml b/source/packages/plg_mokosuitecross_brevo/brevo.xml index 607dd163..25441734 100644 --- a/source/packages/plg_mokosuitecross_brevo/brevo.xml +++ b/source/packages/plg_mokosuitecross_brevo/brevo.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Brevo (Sendinblue) - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml b/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml index 063c6664..f6b17a86 100644 --- a/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml +++ b/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Constant Contact - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_convertkit/convertkit.xml b/source/packages/plg_mokosuitecross_convertkit/convertkit.xml index e589d8f3..778f1266 100644 --- a/source/packages/plg_mokosuitecross_convertkit/convertkit.xml +++ b/source/packages/plg_mokosuitecross_convertkit/convertkit.xml @@ -1,7 +1,7 @@ MokoSuiteCross - ConvertKit - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_devto/devto.xml b/source/packages/plg_mokosuitecross_devto/devto.xml index 833ea232..ae8fa60e 100644 --- a/source/packages/plg_mokosuitecross_devto/devto.xml +++ b/source/packages/plg_mokosuitecross_devto/devto.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Dev.to - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_discord/discord.xml b/source/packages/plg_mokosuitecross_discord/discord.xml index ecfa299f..4ac5208f 100644 --- a/source/packages/plg_mokosuitecross_discord/discord.xml +++ b/source/packages/plg_mokosuitecross_discord/discord.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Discord - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_facebook/facebook.xml b/source/packages/plg_mokosuitecross_facebook/facebook.xml index 3dccce6d..c529d59e 100644 --- a/source/packages/plg_mokosuitecross_facebook/facebook.xml +++ b/source/packages/plg_mokosuitecross_facebook/facebook.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Facebook / Meta - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_ghost/ghost.xml b/source/packages/plg_mokosuitecross_ghost/ghost.xml index 2961f4d7..2e227865 100644 --- a/source/packages/plg_mokosuitecross_ghost/ghost.xml +++ b/source/packages/plg_mokosuitecross_ghost/ghost.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Ghost - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml b/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml index 6aa2cc45..a0bc890d 100644 --- a/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml +++ b/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Google Business Profile - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_googlechat/googlechat.xml b/source/packages/plg_mokosuitecross_googlechat/googlechat.xml index 181eba51..3b5e4ab5 100644 --- a/source/packages/plg_mokosuitecross_googlechat/googlechat.xml +++ b/source/packages/plg_mokosuitecross_googlechat/googlechat.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Google Chat - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_hashnode/hashnode.xml b/source/packages/plg_mokosuitecross_hashnode/hashnode.xml index 711fb9bc..c3415f60 100644 --- a/source/packages/plg_mokosuitecross_hashnode/hashnode.xml +++ b/source/packages/plg_mokosuitecross_hashnode/hashnode.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Hashnode - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_instagram/instagram.xml b/source/packages/plg_mokosuitecross_instagram/instagram.xml index e493081b..69b4a881 100644 --- a/source/packages/plg_mokosuitecross_instagram/instagram.xml +++ b/source/packages/plg_mokosuitecross_instagram/instagram.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Instagram - 01.08.56 + 01.08.57 2026-06-23 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_linkedin/linkedin.xml b/source/packages/plg_mokosuitecross_linkedin/linkedin.xml index 1653c577..867be33a 100644 --- a/source/packages/plg_mokosuitecross_linkedin/linkedin.xml +++ b/source/packages/plg_mokosuitecross_linkedin/linkedin.xml @@ -1,7 +1,7 @@ MokoSuiteCross - LinkedIn - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml b/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml index 62ad0636..25e7a3b8 100644 --- a/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml +++ b/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Mailchimp - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mastodon/mastodon.xml b/source/packages/plg_mokosuitecross_mastodon/mastodon.xml index 09a783f5..deef23c5 100644 --- a/source/packages/plg_mokosuitecross_mastodon/mastodon.xml +++ b/source/packages/plg_mokosuitecross_mastodon/mastodon.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Mastodon - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_matrix/matrix.xml b/source/packages/plg_mokosuitecross_matrix/matrix.xml index 836656a3..eb7534e4 100644 --- a/source/packages/plg_mokosuitecross_matrix/matrix.xml +++ b/source/packages/plg_mokosuitecross_matrix/matrix.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Matrix / Element - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_medium/medium.xml b/source/packages/plg_mokosuitecross_medium/medium.xml index 6b9757c4..b2296b47 100644 --- a/source/packages/plg_mokosuitecross_medium/medium.xml +++ b/source/packages/plg_mokosuitecross_medium/medium.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Medium - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml b/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml index 126ec850..e0aa74db 100644 --- a/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml +++ b/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml @@ -1,7 +1,7 @@ MokoSuiteCross - MokoSuiteCalendar Events - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml b/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml index 4e22ec1b..8f964235 100644 --- a/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml +++ b/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml @@ -1,7 +1,7 @@ MokoSuiteCross - MokoSuiteGallery - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_nostr/nostr.xml b/source/packages/plg_mokosuitecross_nostr/nostr.xml index 2c84f038..34ed93fa 100644 --- a/source/packages/plg_mokosuitecross_nostr/nostr.xml +++ b/source/packages/plg_mokosuitecross_nostr/nostr.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Nostr - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_ntfy/ntfy.xml b/source/packages/plg_mokosuitecross_ntfy/ntfy.xml index ee34b96b..49ff87fd 100644 --- a/source/packages/plg_mokosuitecross_ntfy/ntfy.xml +++ b/source/packages/plg_mokosuitecross_ntfy/ntfy.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Ntfy Push Notifications - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_pinterest/pinterest.xml b/source/packages/plg_mokosuitecross_pinterest/pinterest.xml index cd33fb5f..55cfa493 100644 --- a/source/packages/plg_mokosuitecross_pinterest/pinterest.xml +++ b/source/packages/plg_mokosuitecross_pinterest/pinterest.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Pinterest - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_reddit/reddit.xml b/source/packages/plg_mokosuitecross_reddit/reddit.xml index 1d4d429f..fed6be6e 100644 --- a/source/packages/plg_mokosuitecross_reddit/reddit.xml +++ b/source/packages/plg_mokosuitecross_reddit/reddit.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Reddit - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml b/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml index f7f0b1cf..99b413e7 100644 --- a/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml +++ b/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml @@ -1,7 +1,7 @@ MokoSuiteCross - RSS Feed - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml b/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml index 2bab1307..96b4f7b7 100644 --- a/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml +++ b/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml @@ -1,7 +1,7 @@ MokoSuiteCross - SendGrid - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_slack/slack.xml b/source/packages/plg_mokosuitecross_slack/slack.xml index e0cae95c..0b492e36 100644 --- a/source/packages/plg_mokosuitecross_slack/slack.xml +++ b/source/packages/plg_mokosuitecross_slack/slack.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Slack - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_teams/teams.xml b/source/packages/plg_mokosuitecross_teams/teams.xml index effee341..6bd4cbb3 100644 --- a/source/packages/plg_mokosuitecross_teams/teams.xml +++ b/source/packages/plg_mokosuitecross_teams/teams.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Microsoft Teams - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_telegram/telegram.xml b/source/packages/plg_mokosuitecross_telegram/telegram.xml index 38b4595e..f4e6a9f6 100644 --- a/source/packages/plg_mokosuitecross_telegram/telegram.xml +++ b/source/packages/plg_mokosuitecross_telegram/telegram.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Telegram - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_threads/threads.xml b/source/packages/plg_mokosuitecross_threads/threads.xml index b1b3fed2..c316b594 100644 --- a/source/packages/plg_mokosuitecross_threads/threads.xml +++ b/source/packages/plg_mokosuitecross_threads/threads.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Threads (Meta) - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_tiktok/tiktok.xml b/source/packages/plg_mokosuitecross_tiktok/tiktok.xml index 9e8bdbd9..beb831e8 100644 --- a/source/packages/plg_mokosuitecross_tiktok/tiktok.xml +++ b/source/packages/plg_mokosuitecross_tiktok/tiktok.xml @@ -1,7 +1,7 @@ MokoSuiteCross - TikTok - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_tumblr/tumblr.xml b/source/packages/plg_mokosuitecross_tumblr/tumblr.xml index 13983478..2cc4cf4c 100644 --- a/source/packages/plg_mokosuitecross_tumblr/tumblr.xml +++ b/source/packages/plg_mokosuitecross_tumblr/tumblr.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Tumblr - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_twitter/twitter.xml b/source/packages/plg_mokosuitecross_twitter/twitter.xml index b41c6477..7033e766 100644 --- a/source/packages/plg_mokosuitecross_twitter/twitter.xml +++ b/source/packages/plg_mokosuitecross_twitter/twitter.xml @@ -1,7 +1,7 @@ MokoSuiteCross - X / Twitter - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_webhook/webhook.xml b/source/packages/plg_mokosuitecross_webhook/webhook.xml index 7795e92c..b32eb1bc 100644 --- a/source/packages/plg_mokosuitecross_webhook/webhook.xml +++ b/source/packages/plg_mokosuitecross_webhook/webhook.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Generic Webhook - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml b/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml index b2ac8c2f..3201cea0 100644 --- a/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml +++ b/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml @@ -1,7 +1,7 @@ MokoSuiteCross - WhatsApp Business - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_wordpress/wordpress.xml b/source/packages/plg_mokosuitecross_wordpress/wordpress.xml index 83f53020..e79cec3c 100644 --- a/source/packages/plg_mokosuitecross_wordpress/wordpress.xml +++ b/source/packages/plg_mokosuitecross_wordpress/wordpress.xml @@ -1,7 +1,7 @@ MokoSuiteCross - WordPress - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_youtube/youtube.xml b/source/packages/plg_mokosuitecross_youtube/youtube.xml index 08d2367f..a04c6600 100644 --- a/source/packages/plg_mokosuitecross_youtube/youtube.xml +++ b/source/packages/plg_mokosuitecross_youtube/youtube.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Youtube - 01.08.56 + 01.08.57 2026-06-23 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_system_mokosuitecross/mokosuitecross.xml b/source/packages/plg_system_mokosuitecross/mokosuitecross.xml index a7dcc479..5eeb97d2 100644 --- a/source/packages/plg_system_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_system_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ System - MokoSuiteCross - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml b/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml index ed0cd2f9..ea1d1b71 100644 --- a/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml +++ b/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml @@ -1,7 +1,7 @@ System - MokoSuiteCross Events - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml b/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml index 6b2b4a53..9f8b2193 100644 --- a/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml +++ b/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml @@ -1,7 +1,7 @@ System - MokoSuiteCross Gallery - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_task_mokosuitecross/mokosuitecross.xml b/source/packages/plg_task_mokosuitecross/mokosuitecross.xml index 87c5837e..b8911aa8 100644 --- a/source/packages/plg_task_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_task_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ Task - MokoSuiteCross Queue Processor - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml b/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml index e84d598f..06fc0fc4 100644 --- a/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ Web Services - MokoSuiteCross - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/pkg_mokosuitecross.xml b/source/pkg_mokosuitecross.xml index 891e166b..4792c479 100644 --- a/source/pkg_mokosuitecross.xml +++ b/source/pkg_mokosuitecross.xml @@ -2,7 +2,7 @@ MokoSuiteCross mokosuitecross - 01.08.56 + 01.08.57 2026-05-28 Moko Consulting hello@mokoconsulting.tech