feat: full scaffolding — manifests, Extension, provider, SQL (9 tables), language files
Universal: Auto Version Bump / Version Bump (push) Successful in 16s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 17s

This commit is contained in:
Jonathan Miller
2026-06-23 11:03:45 -05:00
parent 24c2b2008c
commit 0d092f216f
8 changed files with 277 additions and 0 deletions
@@ -0,0 +1,2 @@
PLG_SYSTEM_MOKOSUITEEVENT="System - MokoSuite Event"
PLG_SYSTEM_MOKOSUITEEVENT_DESC="Event management — ticketing, registration, check-in, venues, speakers, sponsors."
@@ -0,0 +1,2 @@
PLG_SYSTEM_MOKOSUITEEVENT="System - MokoSuite Event"
PLG_SYSTEM_MOKOSUITEEVENT_DESC="Event management — ticketing, registration, check-in, venues, speakers, sponsors."
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="system" method="upgrade">
<name>System - MokoSuite Event</name>
<element>mokosuiteevent</element>
<author>Moko Consulting</author>
<creationDate>2026-06-23</creationDate>
<copyright>Copyright (C) 2026 Moko Consulting. All rights reserved.</copyright>
<license>GPL-3.0-or-later</license>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
<authorUrl>https://mokoconsulting.tech</authorUrl>
<version>01.00.00</version>
<php_minimum>8.3</php_minimum>
<description>PLG_SYSTEM_MOKOSUITEEVENT_DESC</description>
<namespace path="src">Moko\Plugin\System\MokoSuiteEvent</namespace>
<files>
<folder>src</folder>
<folder>services</folder>
<folder>language</folder>
<folder>sql</folder>
</files>
<languages folder="language">
<language tag="en-GB">en-GB/plg_system_mokosuiteevent.ini</language>
<language tag="en-GB">en-GB/plg_system_mokosuiteevent.sys.ini</language>
</languages>
<install><sql><file driver="mysql" charset="utf8">sql/install.mysql.sql</file></sql></install>
<uninstall><sql><file driver="mysql" charset="utf8">sql/uninstall.mysql.sql</file></sql></uninstall>
<config>
<fields name="params">
<fieldset name="basic" label="Event Defaults">
<field name="default_currency" type="text" default="USD" label="Default Currency" />
<field name="enable_waitlist" type="radio" default="1" label="Enable Waitlist" class="btn-group btn-group-yesno">
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field name="checkin_method" type="list" default="qr" label="Check-in Method">
<option value="qr">QR Code Scan</option>
<option value="manual">Manual Name Lookup</option>
</field>
</fieldset>
</fields>
</config>
</extension>
@@ -0,0 +1,27 @@
<?php
defined('_JEXEC') or die;
use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Moko\Plugin\System\MokoSuiteEvent\Extension\Event;
return new class implements ServiceProviderInterface
{
public function register(Container $container): void
{
$container->set(
PluginInterface::class,
function (Container $container) {
$dispatcher = $container->get(DispatcherInterface::class);
$plugin = new Event($dispatcher, (array) PluginHelper::getPlugin('system', 'mokosuiteevent'));
$plugin->setApplication(Factory::getApplication());
return $plugin;
}
);
}
};
@@ -0,0 +1,151 @@
--
-- MokoSuite Event Tables
--
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_events` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`description` TEXT,
`venue_id` INT UNSIGNED DEFAULT NULL,
`start_date` DATETIME NOT NULL,
`end_date` DATETIME NOT NULL,
`timezone` VARCHAR(50) NOT NULL DEFAULT 'UTC',
`capacity` INT UNSIGNED NOT NULL DEFAULT 0,
`registered_count` INT UNSIGNED NOT NULL DEFAULT 0,
`status` ENUM('draft','published','cancelled','completed') NOT NULL DEFAULT 'draft',
`is_recurring` TINYINT NOT NULL DEFAULT 0,
`recurrence_rule` VARCHAR(255) NOT NULL DEFAULT '',
`cover_image` VARCHAR(500) NOT NULL DEFAULT '',
`organizer_contact_id` INT DEFAULT NULL,
`published` TINYINT NOT NULL DEFAULT 1,
`created` DATETIME NOT NULL,
`modified` DATETIME DEFAULT NULL,
`created_by` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_venue` (`venue_id`),
KEY `idx_dates` (`start_date`, `end_date`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_ticket_types` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`event_id` INT UNSIGNED NOT NULL,
`name` VARCHAR(255) NOT NULL,
`description` TEXT,
`price` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
`quantity` INT UNSIGNED NOT NULL DEFAULT 0,
`sold` INT UNSIGNED NOT NULL DEFAULT 0,
`max_per_order` INT UNSIGNED NOT NULL DEFAULT 10,
`sale_start` DATETIME DEFAULT NULL,
`sale_end` DATETIME DEFAULT NULL,
`published` TINYINT NOT NULL DEFAULT 1,
`ordering` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_event` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_registrations` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`event_id` INT UNSIGNED NOT NULL,
`contact_id` INT DEFAULT NULL,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`phone` VARCHAR(50) NOT NULL DEFAULT '',
`status` ENUM('pending','confirmed','cancelled','waitlisted','checked_in') NOT NULL DEFAULT 'pending',
`total_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
`payment_status` ENUM('unpaid','paid','refunded') NOT NULL DEFAULT 'unpaid',
`notes` TEXT,
`registered_at` DATETIME NOT NULL,
`checked_in_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_event` (`event_id`),
KEY `idx_contact` (`contact_id`),
KEY `idx_status` (`status`),
KEY `idx_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_tickets` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`registration_id` INT UNSIGNED NOT NULL,
`ticket_type_id` INT UNSIGNED NOT NULL,
`qr_code` VARCHAR(100) NOT NULL DEFAULT '',
`attendee_name` VARCHAR(255) NOT NULL DEFAULT '',
`checked_in` TINYINT NOT NULL DEFAULT 0,
`checked_in_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_qr` (`qr_code`),
KEY `idx_registration` (`registration_id`),
KEY `idx_type` (`ticket_type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_venues` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`address` TEXT,
`city` VARCHAR(100) NOT NULL DEFAULT '',
`state` VARCHAR(50) NOT NULL DEFAULT '',
`postal_code` VARCHAR(20) NOT NULL DEFAULT '',
`capacity` INT UNSIGNED NOT NULL DEFAULT 0,
`amenities` TEXT,
`contact_name` VARCHAR(255) NOT NULL DEFAULT '',
`contact_phone` VARCHAR(50) NOT NULL DEFAULT '',
`contact_email` VARCHAR(255) NOT NULL DEFAULT '',
`published` TINYINT NOT NULL DEFAULT 1,
`created` DATETIME NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_speakers` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`contact_id` INT DEFAULT NULL,
`name` VARCHAR(255) NOT NULL,
`title` VARCHAR(255) NOT NULL DEFAULT '',
`company` VARCHAR(255) NOT NULL DEFAULT '',
`bio` TEXT,
`photo` VARCHAR(500) NOT NULL DEFAULT '',
`website` VARCHAR(500) NOT NULL DEFAULT '',
`published` TINYINT NOT NULL DEFAULT 1,
`created` DATETIME NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_contact` (`contact_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_sponsors` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`event_id` INT UNSIGNED NOT NULL,
`contact_id` INT DEFAULT NULL,
`name` VARCHAR(255) NOT NULL,
`tier` ENUM('platinum','gold','silver','bronze','community') NOT NULL DEFAULT 'community',
`logo` VARCHAR(500) NOT NULL DEFAULT '',
`website` VARCHAR(500) NOT NULL DEFAULT '',
`amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
`benefits` TEXT,
`published` TINYINT NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
KEY `idx_event` (`event_id`),
KEY `idx_tier` (`tier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_sessions` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`event_id` INT UNSIGNED NOT NULL,
`title` VARCHAR(255) NOT NULL,
`description` TEXT,
`room` VARCHAR(100) NOT NULL DEFAULT '',
`track` VARCHAR(100) NOT NULL DEFAULT '',
`start_time` DATETIME NOT NULL,
`end_time` DATETIME NOT NULL,
`capacity` INT UNSIGNED NOT NULL DEFAULT 0,
`ordering` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_event` (`event_id`),
KEY `idx_time` (`start_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__mokosuiteevent_session_speakers` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`session_id` INT UNSIGNED NOT NULL,
`speaker_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_session_speaker` (`session_id`, `speaker_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@@ -0,0 +1,13 @@
--
-- MokoSuite Event — Uninstall
--
DROP TABLE IF EXISTS `#__mokosuiteevent_session_speakers`;
DROP TABLE IF EXISTS `#__mokosuiteevent_sessions`;
DROP TABLE IF EXISTS `#__mokosuiteevent_sponsors`;
DROP TABLE IF EXISTS `#__mokosuiteevent_speakers`;
DROP TABLE IF EXISTS `#__mokosuiteevent_venues`;
DROP TABLE IF EXISTS `#__mokosuiteevent_tickets`;
DROP TABLE IF EXISTS `#__mokosuiteevent_registrations`;
DROP TABLE IF EXISTS `#__mokosuiteevent_ticket_types`;
DROP TABLE IF EXISTS `#__mokosuiteevent_events`;
@@ -0,0 +1,18 @@
<?php
namespace Moko\Plugin\System\MokoSuiteEvent\Extension;
defined('_JEXEC') or die;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
class Event extends CMSPlugin implements SubscriberInterface
{
protected $autoloadLanguage = true;
public static function getSubscribedEvents(): array
{
return [];
}
}
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<extension type="package" method="upgrade">
<name>Package - MokoSuite Event</name>
<packagename>mokosuiteevent</packagename>
<version>01.00.00</version>
<creationDate>2026-06-23</creationDate>
<author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
<authorUrl>https://mokoconsulting.tech</authorUrl>
<copyright>Copyright (C) 2026 Moko Consulting. All rights reserved.</copyright>
<license>GNU General Public License version 3 or later; see LICENSE</license>
<description>Event management — ticketing, registration, check-in, venues, speakers</description>
<php_minimum>8.3</php_minimum>
<dlid prefix="dlid=" suffix=""/>
<blockChildUninstall>true</blockChildUninstall>
<files folder="packages">
<file type="plugin" id="plg_system_mokosuiteevent" group="system">plg_system_mokosuiteevent.zip</file>
</files>
<updateservers>
<server type="extension" priority="1" name="Package - MokoSuite Event">https://git.mokoconsulting.tech/MokoConsulting/MokoSuiteEvent/updates.xml</server>
</updateservers>
</extension>