From 7927e3df83bf5868144d73ccae00757cce00eadc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Apr 2026 17:48:23 -0700 Subject: [PATCH] feat: add Form Builder to plugin registry for admin discovery The Form Builder / Contact Form functionality exists in the codebase but was not listed in AVAILABLE_PLUGINS, making it undiscoverable from the admin plugins page. Users had no way to install it. Add form-builder entry to AVAILABLE_PLUGINS array and add the corresponding install handler with sensible defaults. Closes #548 Co-Authored-By: Claude Opus 4.6 --- packages/core/src/routes/admin-plugins.ts | 83 ++++++++++++++++------- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/packages/core/src/routes/admin-plugins.ts b/packages/core/src/routes/admin-plugins.ts index 0419dd212..483ef37e1 100644 --- a/packages/core/src/routes/admin-plugins.ts +++ b/packages/core/src/routes/admin-plugins.ts @@ -23,7 +23,7 @@ const AVAILABLE_PLUGINS = [ version: '2.0.0', author: 'Community Developer', category: 'content', - icon: '❓', + icon: '❓', permissions: ['manage:faqs'], dependencies: [], is_core: false @@ -36,7 +36,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0-beta.1', author: 'SonicJS', category: 'demo', - icon: '🎯', + icon: '🎯', permissions: [], dependencies: [], is_core: false @@ -49,7 +49,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'system', - icon: '🗄️', + icon: '🗄️', permissions: ['manage:database', 'admin'], dependencies: [], is_core: false @@ -62,7 +62,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'development', - icon: '🌱', + icon: '🌱', permissions: ['admin'], dependencies: [], is_core: false @@ -75,7 +75,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0', author: 'SonicJS Team', category: 'editor', - icon: '✍️', + icon: '✍️', permissions: [], dependencies: [], is_core: true @@ -88,7 +88,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0', author: 'SonicJS Team', category: 'editor', - icon: '📝', + icon: '📝', permissions: [], dependencies: [], is_core: false @@ -101,7 +101,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0', author: 'SonicJS Team', category: 'editor', - icon: '📝', + icon: '📝', permissions: [], dependencies: [], is_core: false @@ -114,7 +114,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0', author: 'SonicJS Team', category: 'security', - icon: '🛡️', + icon: '🛡️', permissions: [], dependencies: [], is_core: true @@ -127,7 +127,7 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'security', - icon: '🛡️', + icon: '🛡️', permissions: ['security-audit:view', 'security-audit:manage'], dependencies: [], is_core: false @@ -140,10 +140,23 @@ const AVAILABLE_PLUGINS = [ version: '1.0.0', author: 'SonicJS Team', category: 'search', - icon: '🔍', + icon: '🔍', permissions: [], dependencies: [], is_core: true + }, + { + id: 'form-builder', + name: 'form-builder', + display_name: 'Form Builder', + description: 'Drag-and-drop form builder with conditional logic, file uploads, and email notifications. Create contact forms, surveys, and data collection forms.', + version: '1.0.0', + author: 'SonicJS Team', + category: 'content', + icon: '\u{1F4DD}', + permissions: ['forms:create', 'forms:manage', 'forms:submissions'], + dependencies: [], + is_core: false } ] @@ -418,7 +431,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '2.0.0', author: 'Community Developer', category: 'content', - icon: '❓', + icon: '❓', permissions: ['manage:faqs'], dependencies: [], settings: { @@ -441,7 +454,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0-beta.1', author: 'SonicJS', category: 'demo', - icon: '🎯', + icon: '🎯', permissions: [], dependencies: [], settings: { @@ -464,7 +477,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'security', - icon: '🔐', + icon: '🔐', permissions: ['manage:users', 'manage:roles', 'manage:permissions'], dependencies: [], is_core: true, @@ -484,7 +497,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'media', - icon: '📸', + icon: '📸', permissions: ['manage:media', 'upload:files'], dependencies: [], is_core: true, @@ -504,7 +517,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'content', - icon: '🔄', + icon: '🔄', permissions: ['manage:workflows', 'approve:content'], dependencies: [], is_core: true, @@ -524,7 +537,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'system', - icon: '🗄️', + icon: '🗄️', permissions: ['manage:database', 'admin'], dependencies: [], is_core: false, @@ -549,7 +562,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'development', - icon: '🌱', + icon: '🌱', permissions: ['admin'], dependencies: [], is_core: false, @@ -573,7 +586,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0', author: 'SonicJS Team', category: 'editor', - icon: '✍️', + icon: '✍️', permissions: [], dependencies: [], is_core: true, @@ -598,7 +611,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0', author: 'SonicJS Team', category: 'editor', - icon: '📝', + icon: '📝', permissions: [], dependencies: [], is_core: false, @@ -623,7 +636,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0', author: 'SonicJS Team', category: 'editor', - icon: '📝', + icon: '📝', permissions: [], dependencies: [], is_core: false, @@ -648,7 +661,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0-beta.1', author: 'SonicJS Team', category: 'security', - icon: '🛡️', + icon: '🛡️', permissions: ['security-audit:view', 'security-audit:manage'], dependencies: [], is_core: false, @@ -700,7 +713,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0', author: 'SonicJS Team', category: 'search', - icon: '🔍', + icon: '🔍', permissions: [], dependencies: [], is_core: true, @@ -720,7 +733,7 @@ adminPluginRoutes.post('/install', async (c) => { version: '1.0.0', author: 'SonicJS Team', category: 'security', - icon: '🛡️', + icon: '🛡️', permissions: [], dependencies: [], is_core: true, @@ -740,6 +753,30 @@ adminPluginRoutes.post('/install', async (c) => { return c.json({ success: true, plugin: turnstilePlugin }) } + // Handle Form Builder plugin installation + if (body.name === 'form-builder') { + const formBuilderPlugin = await pluginService.installPlugin({ + id: 'form-builder', + name: 'form-builder', + display_name: 'Form Builder', + description: 'Drag-and-drop form builder with conditional logic, file uploads, and email notifications. Create contact forms, surveys, and data collection forms.', + version: '1.0.0', + author: 'SonicJS Team', + category: 'content', + icon: '\u{1F4DD}', + permissions: ['forms:create', 'forms:manage', 'forms:submissions'], + dependencies: [], + settings: { + enableNotifications: true, + enableFileUploads: true, + maxSubmissionsPerForm: 0, + submissionRetentionDays: 90 + } + }) + + return c.json({ success: true, plugin: formBuilderPlugin }) + } + return c.json({ error: 'Plugin not found in registry' }, 404) } catch (error) { console.error('Error installing plugin:', error)