feat: full scaffolding — manifests, Extension, provider, SQL (9 tables), language files
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
PLG_SYSTEM_MOKOSUITEEVENT="System - MokoSuite Event"
|
||||
PLG_SYSTEM_MOKOSUITEEVENT_DESC="Event management — ticketing, registration, check-in, venues, speakers, sponsors."
|
||||
+2
@@ -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 [];
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user