Commit Graph

67 Commits

Author SHA1 Message Date
gitea-actions[bot] 4a645802ec chore: update development channel 01.00.18-dev [skip ci] development 2026-06-04 19:00:24 +00:00
Jonathan Miller 58d7154805 fix: correct language file structure for offline payment plugin
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Renamed .sys.ini to .ini and added en-US translation to match all other
membership gateway plugins, fixing install failure.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 13:58:15 -05:00
gitea-actions[bot] 81824ab062 chore: update development channel 01.00.18-dev [skip ci] 2026-06-04 18:06:38 +00:00
Jonathan Miller 14e80ef2be feat: Discord-style server channels with categories, threads, reactions
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
4 new tables, ChannelHelper, 11 REST API endpoints, 5 default channels.

Channel system:
- Channel categories (General, Community) with ordering
- Text channels within categories (#general, #announcements, #introductions, #help, #off-topic)
- Channel types: text (anyone posts), announcement (admin-only posting), read-only (archived)

Messages:
- Send/edit/delete with ownership checks
- Thread replies (reply_to_id for message threading)
- Emoji reactions stored as JSON (like Discord: multiple reactions per message)
- Pinned messages (admin-only pin/unpin)
- Slowmode enforcement (configurable seconds between posts)
- Hashtag + mention parsing on send

Read tracking:
- Per-user per-channel last_read_message_id
- Unread indicators per channel
- Mute toggle per channel

REST API (11 endpoints):
- GET/channels, GET/channels/:id, GET/POST channels/:id/messages
- DELETE/PATCH channels/messages/:id, POST messages/:id/pin
- POST messages/:id/react, GET channels/:id/pins
- GET channels/unread, POST channels/:id/mute

Authored-by: Moko Consulting
2026-06-04 12:59:59 -05:00
Jonathan Miller cdc00cc18e chore: consolidate changelog to minor version entries
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Authored-by: Moko Consulting
2026-06-04 12:50:14 -05:00
gitea-actions[bot] 60d75a71a1 chore: update development channel 01.00.18-dev [skip ci] 2026-06-04 16:20:47 +00:00
jmiller a40e04ef82 chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-04 15:56:53 +00:00
Jonathan Miller 4a34c41621 fix: ensure all pre-releases are marked prerelease=true
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 2s
Added explicit API call after release creation to force prerelease flag.
The moko-platform release_create.php was not honoring --prerelease for
RC releases, causing them to appear as stable releases.

Authored-by: Moko Consulting
2026-06-04 10:54:16 -05:00
gitea-actions[bot] 8f7ed4709e chore: update development channel 01.00.18-dev [skip ci] 2026-06-04 15:45:13 +00:00
Jonathan Miller 1f0b9b3585 chore: seed empty updates.xml for CI to populate
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Authored-by: Moko Consulting
2026-06-04 10:44:27 -05:00
jmiller d132d12aae chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-04 15:39:22 +00:00
jmiller 8629fe5e40 chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-04 15:30:30 +00:00
Jonathan Miller 13e42c6f67 chore: remove updates.xml — handled by CI workflows
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Authored-by: Moko Consulting
2026-06-04 10:24:49 -05:00
Jonathan Miller fe66253cb6 fix: register language files in all 38 extension manifests
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Every extension manifest now has a <languages> tag pointing to its
.sys.ini file. This fixes Joomla showing language constants instead
of translated values.

Changes:
- Created 13 missing .sys.ini files for community/admin modules
- Fixed Instagram plugin language files (renamed from Facebook)
- Added <languages> to all 8 payment gateway plugin manifests
- Added <languages> to membership component, system plugin, webservices
- Added <languages> to offline payment plugin (new .sys.ini)
- Added <languages> to webservices membership plugin (new .sys.ini)
- Added language folder to webservices manifest <files>

0 manifests remain without language registration.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 10:20:41 -05:00
Jonathan Miller 6808d97a5a feat: auto-build RC release on PR pushes targeting main
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Joomla: Extension CI / Build RC Pre-Release (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Release configuration (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Branch Policy (pull_request) Successful in 2s
Generic: Repo Health / Access control (pull_request) Successful in 1s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 5s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 7s
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Universal: Build & Release / Promote to RC (pull_request) Successful in 13s
Generic: Repo Health / Access control (push) Successful in 1s
Universal: PR Check / Validate PR (pull_request) Successful in 13s
Universal: Auto Version Bump / Version Bump (push) Failing after 4s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 2m31s
Pre-release workflow now triggers on:
- PR merged to dev → development channel (existing)
- PR opened/synced targeting main → release-candidate channel (new)
- Manual workflow_dispatch (existing)

When a PR to main is open, every push to the PR branch automatically
rebuilds the RC release package. This keeps the RC always up-to-date
with the latest changes before merge.

Changes:
- Added pull_request_target trigger for main branch
- Auto-detect stability as release-candidate for PRs to main
- Checkout PR head SHA for pull_request_target events
- Updated job condition to include new trigger

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 09:43:00 -05:00
gitea-actions[bot] ffb630a28f chore: update development channel 01.00.18-dev [skip ci] 2026-06-04 14:31:57 +00:00
Jonathan Miller ca88636a4d chore: remove update-server workflow, delete wiki dir, clean build artifacts
Universal: Auto Version Bump / Version Bump (push) Failing after 4s
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
- Removed update-server.yml workflow (not needed)
- Removed wiki/ directory — wiki content belongs in Gitea wiki feature,
  not committed to git
- Cleaned build/ and dist/ artifacts

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 09:29:40 -05:00
gitea-actions[bot] 730d611bf2 chore: update development channel 01.00.18-dev [skip ci] 2026-06-04 14:23:10 +00:00
gitea-actions[bot] 73ad69c49c chore(version): auto-bump 01.00.18-dev [skip ci] 2026-06-04 14:23:08 +00:00
Jonathan Miller eb5e19ae4f fix: install errors — media path, MySQL strict mode, remove CB references
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
Universal: Auto Version Bump / Version Bump (push) Failing after 4s
Update Server / Update Server (push) Successful in 12s
Bug fixes for Joomla installation:
- Fixed media folder attribute: folder="css" -> folder="." to prevent
  css/css path duplication that caused "File does not exist" error
- Fixed all TEXT NOT NULL columns to TEXT DEFAULT NULL across all SQL
  files — MySQL strict mode rejects TEXT NOT NULL without a default
  value on INSERT. Affects install.mysql.sql and all migration files.

Removed Community Builder references:
- README.md: removed "fork of Community Builder" and Joomlapolis credit
- CLAUDE.md: removed "fork of Community Builder" from description
- composer.json: cleaned description
- Language files: cleaned package description

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 09:22:49 -05:00
jmiller 12d65b0dc2 chore: sync .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-06-04 14:21:19 +00:00
gitea-actions[bot] 92e53b8dc0 chore: update development channel 01.00.17-dev [skip ci] 2026-06-04 14:03:08 +00:00
gitea-actions[bot] 284fdf780c chore(version): auto-bump 01.00.17-dev [skip ci] 2026-06-04 14:03:07 +00:00
Jonathan Miller af540d4587 feat: 5 admin modules — menu, stats, reports, registrations, revenue
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Update Server / Update Server (push) Successful in 10s
Admin Menu Module (mod_mokojoomcommunity_admin_menu):
- Sidebar navigation to all community management areas
- Sections: Community, Moderation, Membership, Settings
- Badge counts: profiles, topics, groups, events, pending reports,
  pending verifications
- Links to both component configs

Admin Stats Module (mod_mokojoomcommunity_admin_stats):
- 8 stat cards: profiles, new today, active (24h), connections,
  posts, forum topics, groups, upcoming events
- Color-coded with FontAwesome icons

Admin Reports Module (mod_mokojoomcommunity_admin_reports):
- Pending moderation queue table
- Shows reporter, content type, reason, date
- Configurable max items

Admin Registrations Module (mod_mokojoomcommunity_admin_registrations):
- Recent RegGuard log with risk level badges
- Shows user, IP, risk level/score, blocked status, date
- Configurable max items

Membership Revenue Module (mod_mokojoommembership_admin_revenue):
- 4 metric cards: revenue this month, active subscriptions,
  expiring in 7 days, new this month
- Color-coded borders

Package manifest updated to 38 sub-extensions (33 + 5 admin modules).
Update server URL fixed to match Gitea convention.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 09:02:52 -05:00
gitea-actions[bot] 68422865b0 chore: update development channel 01.00.16-dev [skip ci] 2026-06-04 13:37:08 +00:00
gitea-actions[bot] da025f3a47 chore(version): auto-bump 01.00.16-dev [skip ci] 2026-06-04 13:37:06 +00:00
Jonathan Miller aad0bc114e chore: update package manifest with all 33 sub-extensions + sync workflows
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Update Server / Update Server (push) Successful in 9s
Package manifest (pkg_mokojoomcommunity.xml):
- 2 components (community + membership)
- 5 system/user plugins (community, membership, sociallogin)
- 5 social login providers (Discord, Facebook, Google, Instagram, Telegram)
- 8 payment gateways (Stripe, PayPal, Authorize.Net, Braintree, Mollie, Square, Dolibarr, Offline)
- 2 webservices plugins
- 1 quickicon plugin
- 10 site modules (8 community + 2 membership)

Build system already handles this — `make build` loops src/packages/*
and zips each, then assembles the outer package ZIP.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 08:36:54 -05:00
gitea-actions[bot] 8d37787b11 chore: update development channel 01.00.15-dev [skip ci] 2026-06-04 13:22:44 +00:00
gitea-actions[bot] a085b5d14d chore(version): auto-bump 01.00.15-dev [skip ci] 2026-06-04 13:22:42 +00:00
Jonathan Miller 155926f008 feat: push notifications, cross-posting, workflow sync, report on messages
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Update Server / Update Server (push) Successful in 10s
Push Notifications (#88):
- PushHelper: save/remove subscription, send push, get VAPID key
- ServiceWorker (service-worker.js): handles push events, notification
  click opens URL, vibrate pattern, badge icon
- Subscriptions stored in profile params JSON (no new table)
- Config: push_enabled, push_vapid_public, push_vapid_private
- Note: full VAPID JWT signing needs minishlink/web-push composer package

Cross-Post to Facebook/Twitter (#93):
- CrossPostHelper: post to Facebook Graph API and Twitter API v2
- Uses social login OAuth tokens from linked accounts
- Only public posts can be cross-posted
- getAvailablePlatforms() checks which providers user has connected
- Config: crosspost_enabled toggle
- Rate limiting via platform API limits

Report Button on Messages:
- Added report link to conversation messages (message template)
- Completes #91 — report buttons now on: activity, forum topics,
  forum replies, group posts, profiles, and messages

Workflow Sync:
- Imported branch-cleanup.yml from MokoOnyx template
- Synced ci-joomla.yml to latest version from MokoOnyx
- Synced all common workflows from moko-platform templates

Config Updates:
- Added Push Notifications fieldset (enabled, VAPID keys)
- Added Chat enabled toggle
- Added Cross-post enabled toggle

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 08:22:32 -05:00
gitea-actions[bot] f093beceb6 chore: update development channel 01.00.14-dev [skip ci] 2026-06-04 13:07:00 +00:00
gitea-actions[bot] a91b9a19c6 chore(version): auto-bump 01.00.14-dev [skip ci] 2026-06-04 13:06:59 +00:00
Jonathan Miller 5fbf4e5c89 refactor: move license key from session warnings to config + dashboard
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Update Server / Update Server (push) Successful in 9s
Removed persistent session-based license key warnings from all 3 system
plugins (community, membership, sociallogin). The old approach checked
#__update_sites on every admin page load and showed a dismissible warning
once per session — annoying and ineffective.

New approach:
- License key stored in component config (config.xml License fieldset)
- Admin dashboard shows prominent alert if no valid key entered
- Green confirmation with masked key when valid
- Post-install message directs admin to config to enter key
- No session-based persistence, no repeated warnings

Changes:
- plg_system_mokojoomcommunity: removed warnMissingLicenseKey() + constants
- plg_system_mokojoommembership: removed warnMissingLicenseKey()
- plg_system_mokojoomsociallogin: removed warnMissingLicenseKey()
- config.xml: added License fieldset with license_key text field
- dashboard/default.php: license status alert (warning or success)
- script.php: post-install message with link to config
- 8 new language strings for license UI

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 08:06:49 -05:00
gitea-actions[bot] 5725afe11c chore: update development channel 01.00.13-dev [skip ci] 2026-06-04 12:48:20 +00:00
gitea-actions[bot] 19a7050bc5 chore(version): auto-bump 01.00.13-dev [skip ci] 2026-06-04 12:48:18 +00:00
Jonathan Miller e77a4e5e47 feat: Facebook Chat-style real-time messaging widget (#92)
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
Universal: Auto Version Bump / Version Bump (push) Failing after 4s
Update Server / Update Server (push) Successful in 10s
Chat Widget (JavaScript + CSS):
- Floating blue bubble in bottom-right corner (Messenger-style)
- Click to open conversation list with unread indicators
- Open conversation for real-time message thread
- AJAX polling: 5s when chat open, 15s background badge updates
- Safe DOM rendering — no innerHTML with user data (XSS-safe)
- Desktop notifications via Notification API (permission requested)
- Mobile responsive: full-screen on small screens
- Own messages right-aligned (blue), others left (gray)
- Online status based on last_activity (5-minute window)

ChatController (AJAX JSON endpoints):
- chat.status: unread count + conversation list
- chat.messages: message thread for a conversation
- chat.send: send message (POST)
- chat.start: create/get direct conversation with a user
- chat.online: list online users (last_activity < 5min)
- All endpoints return JSON and terminate

System Plugin Integration:
- onAfterRender injects chat CSS/JS before </body>
- Only for logged-in site users (not admin/API/guests)
- Updates last_activity on every page load for online status
- Respects chat_enabled config toggle

Created Gitea issue #93 for cross-posting to Facebook/Twitter.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 07:48:06 -05:00
gitea-actions[bot] 370a32377f chore: update development channel 01.00.12-dev [skip ci] 2026-06-04 12:35:13 +00:00
gitea-actions[bot] f94faecd57 chore(version): auto-bump 01.00.12-dev [skip ci] 2026-06-04 12:35:11 +00:00
Jonathan Miller 5ff977de2d feat: report buttons on all content types for moderation (#91)
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 4s
Update Server / Update Server (push) Successful in 11s
Reusable report button partial (report_button.php):
- Dropdown with 5 reason options (spam, harassment, inappropriate,
  misinformation, other) + optional details textarea
- Posts to moderation.report controller via CSRF-protected form
- Two styles: 'dropdown' (flag icon button) and 'link' (text link)
- Only shown to logged-in users viewing others' content

Report buttons added to:
- Activity posts (activity/default.php)
- Forum topics (forum/topic.php — on the topic body)
- Forum replies (forum/topic.php — on each reply)
- Group posts (group/detail.php)
- User profiles (profile/default.php)

Also added:
- Edit Profile button on own profile view
- 8 new language strings for report reasons and UI

Remaining templates needing report buttons (follow-up):
- Message conversations
- Gallery images
- Event pages
- Activity comments

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 07:34:59 -05:00
gitea-actions[bot] 7cae7d537d chore: update development channel 01.00.11-dev [skip ci] 2026-06-04 12:14:08 +00:00
gitea-actions[bot] bb2a96705c chore(version): auto-bump 01.00.11-dev [skip ci] 2026-06-04 12:14:07 +00:00
Jonathan Miller 676ac2d84d feat: admin CRUD for custom fields and field groups (CB-style)
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 2s
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Failing after 3s
Update Server / Update Server (push) Successful in 9s
Full admin interface for creating/managing custom profile fields,
matching Community Builder's field management capabilities.

FieldController (admin):
- save(): create/update fields with validation (title required,
  JSON params validated, auto-slug from title)
- delete(): removes field + all user values + privacy prefs
- savegroup(): create/update field groups
- deletegroup(): deletes group, ungroups contained fields

Form XML definitions:
- field.xml: title, name, type (text/textarea/select/date/email/url/number),
  group, description, default value, visibility, required, registration,
  published, ordering, params (JSON for type-specific options)
- fieldgroup.xml: title, description, ordering, published

Admin View + Template:
- Fields HtmlView with toolbar
- Split-panel template: fields table (left) + field groups (right)
- Inline create forms for both fields and groups
- Delete with confirmation (warns about data loss)
- Type badges, visibility labels, required/registration/published indicators

Supported field types:
- text, textarea, select (with JSON options array), date, email, url, number
- Params JSON for type-specific config:
  select: {"options":["Option A","Option B"]}
  number: {"min":0,"max":100,"maxlength":10}

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-04 07:11:31 -05:00
Jonathan Miller 0863039d1a feat: v1.1-1.3 features — hashtags, mentions, follows, sharing, reputation, badges
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 1s
Generic: Repo Health / Access control (push) Successful in 1s
7 new tables, 6 new helpers, 8 default badges. SQL migration 01.10.00.

Hashtags [v1.1] (#84):
- HashtagHelper: parse #tags from text, store tag-content links,
  render clickable tag links, trending tags, tag content feed
- Tables: hashtags (tag + use_count), hashtag_content (tag-content links)

Mentions [v1.1] (#86):
- MentionHelper: parse @username from text, store mentions, notify
  mentioned users, render as profile links, autocomplete API
- Table: mentions (mentioned_user_id, author, content ref)

Follow System [v1.2] (#85):
- FollowHelper: follow/unfollow, isFollowing, getFollowers/Following
- Denormalized follower_count/following_count on profiles
- Block-aware (can't follow blocked users)
- Notification on new follow
- Table: follows (follower_id, following_id)

Content Sharing [v1.2] (#87):
- ShareHelper: generates share URLs for Facebook, Twitter, WhatsApp,
  LinkedIn, email, copy link, embed code
- renderShareButtons() produces Bootstrap button group

Reputation [v1.2] (#89):
- ReputationHelper: award points by reason (post=2, reply=1, like=1,
  best_answer=5, topic=3, event=3, report_upheld=-10)
- Denormalized reputation_score on profiles, leaderboard
- Table: reputation_log (user, points, reason, context)

Badges [v1.3] (#90):
- BadgeHelper: auto-award based on criteria JSON, checkAndAward(),
  renderBadges() for profile display, getAllBadgesWithStatus()
- 8 default badges: First Post, Contributor, Prolific Writer,
  Helpful Member, 1 Year Veteran, Verified, Complete Profile,
  Social Butterfly (25 connections)
- Criteria evaluation: post_count, likes_received, member_days,
  id_verified, profile_complete, connection_count
- Tables: badges (definitions), user_badges (awards)

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 22:03:47 -05:00
Jonathan Miller 8db8c2c477 feat: critical v1.0 gaps — profile edit, connections, user directory, admin model
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 1s
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Profile Edit (#80 + #83):
- ProfileController::save() handles bio, avatar upload, field values,
  privacy preferences, and digest frequency in one form submit
- profile/edit.php template: avatar upload, bio textarea, all custom
  fields with per-field privacy selector, digest toggle, account links
- Links to Joomla account settings for password/email change (#83)

Connection Management (#81):
- ConnectionController: request, accept, decline, remove with CSRF
- ConnectionModel: getPending(), getAccepted(), getSent() with user info
- Connections HtmlView + tabbed template (Connections/Pending/Sent)
- Accept/decline buttons, remove with confirmation
- Notifications on connection request/accept

User Directory (#82):
- ProfilesModel: search by name/username, sort (newest/name/active/popular)
- ProfilesHtmlView + card grid template with pagination
- Search bar + sort dropdown
- Avatar display with initial fallback

Admin CRUD Foundation (#79):
- FieldsModel with methods for all admin entities:
  getFields(), getFieldGroups(), getForumCategories(), getGroups(),
  getEvents(), getReports(), getVerifications()
- Admin view directories created for Fields, ForumCategories, Groups,
  Events, Reports, Verifications

Language strings: 13 new keys for profile edit, connections, directory

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 20:31:56 -05:00
Jonathan Miller c46fe93c09 chore: fix ProgressHelper test, create 12 feature gap issues
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 1s
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
- Fixed ProgressHelperTest to avoid DB-dependent getProgressBarHtml()
- All 48 tests pass, 103 assertions
- Validated: 224 PHP files (0 errors), 44 XML manifests (0 errors)
- Created Gitea issues #79-#90 for feature gaps:
  Critical (v1.0): admin CRUD, profile edit, connections UI, user directory
  v1.1: hashtags, follows, mentions, sharing, push, reputation, badges

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 19:29:37 -05:00
Jonathan Miller 02598820a4 feat: SEF Router, Email Digest, and Bookmarks
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 2s
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
SEF Router (#76):
- RouterView with 11 view configurations: profile, activity, forum,
  group, event, message, notification, invite, gallery, search, bookmarks
- MenuRules + StandardRules + NomenuRules for clean URLs
- Supports key-based routing (profile/:id, forum/:category_id, etc.)

Email Digest (#77):
- DigestHelper: builds personalized activity summary per user
- Content: connection activity, forum replies, group posts,
  upcoming events, unread messages, pending connections
- Daily and weekly frequency via profile params JSON
- sendDigests() for cron: throttled, skips empty digests
- setPreference() for user self-service (daily/weekly/off)
- Unsubscribe via profile settings

Bookmarks (#78):
- BookmarkHelper: toggle, isBookmarked, getByUser, getCounts
- 5 content types: activity, forum_topic, event, group, profile
- Resolves title and URL for each bookmarked item
- UNIQUE constraint prevents duplicate bookmarks
- User cleanup on account deletion
- SQL migration 01.09.00: #__mokojoomcommunity_bookmarks table
- REST API: GET/POST/DELETE /api/v1/community/bookmarks + counts
- Digest API: GET/PUT /api/v1/community/digest/preference

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 18:54:48 -05:00
Jonathan Miller a6a169c085 feat: PHPUnit test suite and language file completion
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 2s
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
PHPUnit Setup (#43):
- Added phpunit/phpunit ^10.5 to composer.json require-dev
- Created phpunit.xml with Unit test suite targeting Helper directory
- Created tests/bootstrap.php with Joomla stub classes for isolated testing
  (Factory, ComponentHelper, Registry, OutputFilter, Uri)
- PSR-4 autoload-dev for MokoJoomCommunity\Tests namespace

Test Cases (5 test files, 35+ test methods):
- RegGuardHelperTest: birthday validation (valid, future, too young, too old,
  suspicious pattern, empty, invalid), username checks (normal, short,
  excessive digits, mostly digits, custom pattern), email domain checks
  (blocked, allowed, not in allowlist, empty), risk scoring and classification,
  suggestion generation, IP detection
- ConditionalHelperTest: all 8 operators (equals, not_equals, contains, empty,
  not_empty, greater_than, in, regex), match modes (all, any), empty conditions,
  missing field handling
- ProgressHelperTest: progress bar HTML output, public static method signature
- PrivacyHelperTest: level constants, labels, map coverage
- TaxServiceTest: exclusive/inclusive tax, zero tax, discount + tax,
  discount exceeding price, formatted breakdown

Language File Completion (#44):
- Added missing key COM_MOKOJOOMCOMMUNITY_FORUM_TOPIC
- Synced en-US from en-GB for both site and admin
- Audited: 108 used site keys, 138 defined (all covered)
- Audited: 57 used membership keys, 130 defined (all covered)

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 18:42:53 -05:00
Jonathan Miller ed573c4583 feat: add 8 community modules and admin Quick Icon cpanel
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 1s
Generic: Repo Health / Access control (push) Successful in 2s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Site Modules (8):
- mod_mokojoomcommunity_activity: Recent activity stream posts
- mod_mokojoomcommunity_members: Member directory (newest/active/popular sort)
- mod_mokojoomcommunity_groups: Groups listing with member counts
- mod_mokojoomcommunity_events: Upcoming events with dates and RSVP counts
- mod_mokojoomcommunity_login: Login form with social login integration
- mod_mokojoomcommunity_profile: Mini profile card with avatar and connection count
- mod_mokojoomcommunity_forum: Recent forum topics with reply counts
- mod_mokojoomcommunity_notifications: Bell dropdown with unread count and list

All modules use Joomla 5 AbstractModuleDispatcher pattern with
configurable max_items and sort options.

Admin Dashboard (cpanel):
- plg_quickicon_mokojoomcommunity: Quick icon stats on Joomla admin home
  - Profile count, pending reports (warning), pending ID verifications,
    forum topics, groups, upcoming events
  - Links to community admin views

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 16:39:04 -05:00
Jonathan Miller b50a772542 feat: Instagram login, Google One Tap, migration tool with auto-disable
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 1s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Instagram Login Provider (#12):
- New plg_mokosociallogin_instagram plugin
- Uses Facebook Login with Instagram scopes (same App ID)
- Fetches Instagram business account username and avatar
- Falls back to Facebook profile data if no IG account linked
- Full OAuth2 flow with CSRF state protection

Google One Tap (#13):
- Injects Google Identity Services One Tap prompt when enabled
- Configurable via plugin params (enable_one_tap toggle)
- Uses existing Google client_id and callback URL
- Script loaded with crossorigin="anonymous"

Security:
- Added crossorigin="anonymous" to external scripts
  (Google GSI client, Telegram widget)
- SRI not feasible for dynamically-versioned provider scripts

Migration Tool (MigrationHelper):
- importCommunityBuilder(): profiles, custom fields, connections
- importAkeebaSocialLogin(): both #__user_profiles and #__sociallogin formats
- disableLegacyExtensions(): disables CB + all Akeeba sociallogin plugins
- runFullMigration(): one-call import + disable workflow
- CB fields auto-created with type mapping (text, select, date, etc.)
- Skips duplicates, reports errors per-record

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 15:51:52 -05:00
Jonathan Miller 9e041f373e feat: social login enhancements, GeoIP, group memberships, CB/Akeeba migration
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 1s
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Social Login (#8-15):
- Telegram email fallback (#8): stores auth in session, signals needs_email
  for system plugin to show collection form
- SocialAccountHelper: covers #9-#11, #14-#15
  - User group assignment by provider (#9): reads provider_group_X from params
  - Admin dashboard data (#10): stats by provider, recent linked accounts, search
  - Account linking/unlinking (#11): linkAccount(), unlinkAccount(), getLinkedAccounts()
  - Discord guild verification (#14): verifyDiscordGuild() via Discord API
  - Discord role restrictions (#15): verifyDiscordRoles() via guild member API
- Instagram (#12) and Google One Tap (#13) need provider-level changes (kept open)

RegGuard:
- GeoIP country filtering (#22): ip-api.com lookup, allow/block country lists
- Admin dashboard (#24): getAdminDashboard() with stats by risk level and recent logs

Membership:
- Group/family memberships (#34): GroupMembershipService with add/remove/list members,
  group_max_members in plan params, access grant/revoke for secondary members
- Verified #38 Dolibarr: plugin stub already exists
- Verified #45 Menu items: Router already registers plans/plan/subscribe/profile views
- Verified #47 Modules: both modules already implemented with Dispatchers
- Verified #48-49 Assets: media folder and CSS exist
- Verified #51 SEF Router: already implemented with MenuRules/StandardRules/NomenuRules

Migration:
- MigrationHelper: import from Community Builder and Akeeba Social Login
  - CB profiles -> community profiles (avatar, canvas)
  - CB custom field values -> community field values (auto-creates fields)
  - CB connections -> community connections
  - Akeeba Social Login -> mokojoomsociallogin_accounts (both #__user_profiles
    and #__sociallogin table formats supported)
  - Skips duplicates, reports errors, maps CB field types

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 15:44:07 -05:00