Complete the Post CRUD that was previously stub-only:
- PostModel (AdminModel) for loading/saving individual posts
- Post HtmlView with toolbar (apply, save, cancel, dashboard)
- post.xml form with article selector, service selector, message
textarea, status dropdown, and scheduled_at calendar picker
- Post edit template with results sidebar and re-queue button
- Posts list: New button in toolbar, clickable article titles,
scheduled_at display with clock icon
- 20 new language strings for the post edit UI
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Articles can be marked as "evergreen" in the Cross-Posting fieldset,
with a configurable re-share interval (default 30 days). The queue
processor checks for due articles and re-queues them automatically,
bypassing the duplicate guard for articles whose last successful post
exceeds the interval.
- Per-article: evergreen toggle + interval (days) in article editor
- Global config: enable/disable, default interval, max per run
- QueueProcessor::processEvergreen() finds and re-queues due articles
- Task plugin calls processEvergreen() before processQueue()
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Service edit sidebar now shows a contextual "Setup Guide" button when
a service type is selected. Links to the matching KB article on the
live site (e.g., /kb/mokojoomcross/service-twitter-mokojoomcross).
All 34 service types mapped.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All 13 plugins had copy-paste stub code with literal placeholder URLs
(e.g. '{site_url}/api/endpoint') that were never substituted with
actual credential values. Each plugin now has correct:
- URL construction from credentials
- Auth method (Basic Auth for WP, JWT for Ghost, GraphQL for Hashnode)
- API payload format per platform spec
- Credential validation with live API checks
Fixed: ActivityPub, Blogger, Ghost, Google Business, Hashnode, Matrix,
Medium, Nostr (stub), RSS Feed, Threads, Tumblr, WhatsApp, WordPress.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dashboard link buttons in Logs, Posts, Services, Template, and
Templates views used Toolbar::getInstance() and Route::_ without
importing the classes — causing fatal errors on page load.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix Twitter posting by replacing Bearer token (app-only, read-only)
with OAuth 1.0a HMAC-SHA1 signing using all 4 keys. Add credential
fields for 19 previously missing services and optional fields for
7 existing services. Add Developer Guide wiki page.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaced raw JSON credentials textarea with individual form fields
per service type using Joomla showon directives. Each service now
has labeled inputs with help descriptions:
- Telegram: Chat ID + Bot Token (custom mode only)
- Discord/Slack/Teams/Google Chat: Webhook URL
- Facebook: Page ID + Page Access Token
- Twitter: Bearer Token + API Key + API Secret
- LinkedIn: Access Token + Organization ID
- Mastodon: Instance URL + Access Token
- Bluesky: Handle + App Password
- WhatsApp: Access Token + Phone Number ID + Recipient
- Mailchimp/SendGrid: API Key + List ID
- WordPress: Site URL + Username + App Password
- Webhook: URL + HTTP Method
- Matrix: Homeserver + Token + Room ID
- Ntfy: Server + Topic + Token
- Reddit: Client ID + Secret + Username + Subreddit
- Medium/Dev.to/Ghost/Blogger: API keys/tokens
Default/Custom mode selector for services with MokoWaaS bot support.
Authorize button for OAuth services (Facebook, LinkedIn, Twitter,
Threads) — visible after first save.
Dashboard button added to toolbar on ALL views (Services, Posts,
Templates, Logs, Service edit, Template edit).
Help panel sidebar in service edit with setup steps.
90+ new language strings for credential fields and help text.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Added View/Service/HtmlView.php and tmpl/service/edit.php for the
service edit form (was causing 404 "View not found" error)
- Added credential hint panel in service edit sidebar
- Added 16 more default templates (telegram, discord, slack, facebook,
linkedin, bluesky, threads, teams, medium, wordpress, webhook,
sendgrid, brevo, ntfy, reddit, pinterest) — total 20 default templates
- Added credential hint language strings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes three issues found during dev site testing:
1. All 4 list views (Services, Posts, Logs, Templates) missing
filterForm and activeFilters properties. Joomla searchtools
layout calls getGroup() on null filterForm. Added get('FilterForm')
and get('ActiveFilters') to all list HtmlView classes.
2. Content plugin onContentPrepareForm typed as Form but Joomla 5/6
passes PrepareFormEvent. Now accepts both: extracts Form from
PrepareFormEvent when available, falls back to legacy Form type.
3. WebServices API routes expanded: added templates and logs CRUD
endpoints alongside posts and services.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
MySQL strict mode does not allow default values on TEXT/BLOB columns.
Removes DEFAULT '' from error_message in #__mokojoomcross_posts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>