#19 Per-article cross-posting: Content plugin injects "Cross-Posting"
fieldset into article editor via onContentPrepareForm. Dynamic
checkbox list of all enabled services. Skip toggle. System plugin
reads article attribs for mokojoomcross_services (array of service
IDs) and mokojoomcross_skip (boolean). Unchecked = post to all.
#20 Analytics dashboard: Posts-by-service breakdown table with
success rate column (color-coded). Top cross-posted articles
list. DashboardModel methods: getServiceBreakdown(),
getDailyTrend(), getTopArticles().
#21 OAuth flows: OAuthHelper with authorize URL generation (Facebook,
LinkedIn, Twitter), PKCE for Twitter, code→token exchange, token
storage in service credentials. OauthController with authorize
and callback actions. Reads client ID/secret from plugin params.
#22 Wiki documentation: Services guide (all 9 platforms, default vs
custom mode), REST API reference, Message Templates guide with
examples per platform, Troubleshooting guide.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#12 LinkedIn: plugin config form (OAuth client ID/secret, redirect URI)
#13 Mastodon: plugin config (default instance, visibility, hashtags)
#14 Bluesky: plugin config (default PDS URL, auto link cards)
#15 Mailchimp: plugin config (sender name/email, auto-send toggle)
#17 Template management: full CRUD with TemplatesController,
TemplateController, TemplatesModel, TemplateModel, TemplateTable.
List view with service type badges and body preview. Edit view
with placeholder reference panel showing all 8 placeholders.
Filter form with search, published, service_type filters.
Added Templates submenu item and dashboard quick link.
#18 Logs: added filter form with level and search filters.
#16 WebServices: implementation already in place from scaffold,
routes registered for posts and services CRUD.
Admin component now has 5 submenu items: Dashboard, Post Queue,
Services, Templates, Activity Logs.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#6 PP Pro migration rewritten to read #__autotweet_channels table
directly, mapping channeltype names to MokoJoomCross service types.
Credential extraction per platform (Facebook page tokens, Twitter
OAuth, Telegram bot tokens, Discord/Slack webhooks). Falls back to
component params extraction when channel table doesn't exist.
#7 Facebook plugin: config form with default_page_access_token and
default_page_id. resolveToken() reads from plugin params.
#8 Discord plugin: config form with default_webhook_url and
embed_color. resolveWebhook() reads from plugin params.
#9 Twitter plugin: implementation already complete from scaffold.
#10 Slack plugin: config form with default_webhook_url.
resolveWebhook() reads from plugin params.
All service plugins with universal bot support now store default
credentials in their own plugin params (Extensions → Plugins)
rather than component params. This keeps sensitive tokens scoped
to the plugin that uses them.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three-pronged queue processing:
1. Joomla Scheduled Task (preferred): New plg_task_mokojoomcross plugin
registers "MokoJoomCross - Process Queue" task type. Admin creates
a scheduled task in System → Scheduled Tasks with desired interval.
2. Page-load fallback: System plugin onAfterRender with configurable
throttle interval. Runs on backend, frontend, or both. Small batch
size (5) to avoid slowing page loads.
3. Both can run simultaneously — QueueProcessor uses DB-based lock
to prevent concurrent execution (120s safety timeout).
Shared QueueProcessor helper handles:
- Queued post dispatch to service plugins
- Failed post retry with configurable max retries + delay
- Scheduled post firing (when scheduled_at <= now)
- Log cleanup based on retention period
Dashboard shows warning banner when page-load processing is active,
recommending switch to Joomla Scheduled Tasks for production.
Config options: queue_processing (scheduler/pageload/both),
pageload_client (admin/site/both), pageload_interval (seconds).
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#1 Core engine: System plugin now dispatches to service plugins via
onMokoJoomCrossGetServices event, executes publish() immediately,
handles success/failure, duplicate guard prevents re-posting, listens
to both onContentAfterSave and onContentChangeState events. Template
rendering now resolves {category}, {author}, {date}, {fulltext}.
#3 Services CRUD: Admin list template with service type icons,
default/custom mode badges, publish toggle. Service edit form template.
#4 Post Queue: Admin list template with status badges (color-coded),
article title, service, message preview, platform post ID, error
messages, retry count, timestamps.
#5 Dashboard: Enhanced with recent activity feed from logs table,
migration controller action for PP Pro import, quick links sidebar.
#2 Telegram: Already implemented in scaffold, provider.php fixed.
Also fixes: All 9 service plugin provider.php files had broken
namespace references from bash heredoc escaping.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>