From 83364db7270484fa3afd75304eaeb0febedabde8 Mon Sep 17 00:00:00 2001 From: Richard Ward Date: Tue, 30 Dec 2025 14:28:19 +0000 Subject: [PATCH] config: packages,lua,nav (7 files) --- .../nav_menu/seed/scripts/sidebar/header.lua | 18 +++++ .../nav_menu/seed/scripts/sidebar/init.lua | 14 ++++ .../nav_menu/seed/scripts/sidebar/item.lua | 23 ++++++ .../nav_menu/seed/scripts/sidebar/render.lua | 25 +++++++ packages/smtp_config/seed/scripts/init.lua | 7 ++ .../seed/scripts/tests/smtp.cases.json | 71 +++++++++++++++++++ .../seed/scripts/nodes/action.lua | 7 +- 7 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 packages/nav_menu/seed/scripts/sidebar/header.lua create mode 100644 packages/nav_menu/seed/scripts/sidebar/init.lua create mode 100644 packages/nav_menu/seed/scripts/sidebar/item.lua create mode 100644 packages/nav_menu/seed/scripts/sidebar/render.lua create mode 100644 packages/smtp_config/seed/scripts/init.lua create mode 100644 packages/smtp_config/seed/scripts/tests/smtp.cases.json diff --git a/packages/nav_menu/seed/scripts/sidebar/header.lua b/packages/nav_menu/seed/scripts/sidebar/header.lua new file mode 100644 index 000000000..1581765a5 --- /dev/null +++ b/packages/nav_menu/seed/scripts/sidebar/header.lua @@ -0,0 +1,18 @@ +-- Render sidebar header +require("sidebar.types") + +local M = {} + +---@param props SidebarProps +---@return UIComponent +function M.header(props) + return { + type = "Box", + props = { className = "p-4 border-b" }, + children = { + { type = "Typography", props = { variant = "h6", text = props.title or "Menu" } } + } + } +end + +return M diff --git a/packages/nav_menu/seed/scripts/sidebar/init.lua b/packages/nav_menu/seed/scripts/sidebar/init.lua new file mode 100644 index 000000000..f9c63865b --- /dev/null +++ b/packages/nav_menu/seed/scripts/sidebar/init.lua @@ -0,0 +1,14 @@ +-- Sidebar module + +---@class SidebarModule +---@field render fun(props: SidebarProps): UIComponent +---@field header fun(props: SidebarProps): UIComponent +---@field item fun(item: SidebarItem, currentPath: string?): UIComponent + +local M = { + render = require("sidebar.render").render, + header = require("sidebar.header").header, + item = require("sidebar.item").item +} + +return M diff --git a/packages/nav_menu/seed/scripts/sidebar/item.lua b/packages/nav_menu/seed/scripts/sidebar/item.lua new file mode 100644 index 000000000..3ec015fa3 --- /dev/null +++ b/packages/nav_menu/seed/scripts/sidebar/item.lua @@ -0,0 +1,23 @@ +-- Render sidebar item +require("sidebar.types") + +local M = {} + +---@param item SidebarItem +---@param currentPath? string +---@return UIComponent +function M.item(item, currentPath) + local active = currentPath == item.path + return { + type = "Button", + props = { + variant = active and "secondary" or "ghost", + className = "w-full justify-start", + text = item.label, + onClick = "navigate", + data = item.path + } + } +end + +return M diff --git a/packages/nav_menu/seed/scripts/sidebar/render.lua b/packages/nav_menu/seed/scripts/sidebar/render.lua new file mode 100644 index 000000000..db1fd76dc --- /dev/null +++ b/packages/nav_menu/seed/scripts/sidebar/render.lua @@ -0,0 +1,25 @@ +-- Render sidebar component +require("sidebar.types") +local header_module = require("sidebar.header") +local item_module = require("sidebar.item") + +local M = {} + +---@param props SidebarProps +---@return UIComponent +function M.render(props) + local items = {} + for _, item in ipairs(props.items or {}) do + items[#items + 1] = item_module.item(item, props.currentPath) + end + return { + type = "Box", + props = { className = "w-64 border-r h-screen bg-sidebar" }, + children = { + header_module.header(props), + { type = "Stack", props = { spacing = 1, className = "p-4" }, children = items } + } + } +end + +return M diff --git a/packages/smtp_config/seed/scripts/init.lua b/packages/smtp_config/seed/scripts/init.lua new file mode 100644 index 000000000..b34e24c92 --- /dev/null +++ b/packages/smtp_config/seed/scripts/init.lua @@ -0,0 +1,7 @@ +-- SMTP Config Package +-- Provides configurable SMTP configuration UI components + +return { + smtp = require("smtp"), + validate = require("validate") +} diff --git a/packages/smtp_config/seed/scripts/tests/smtp.cases.json b/packages/smtp_config/seed/scripts/tests/smtp.cases.json new file mode 100644 index 000000000..71369ac04 --- /dev/null +++ b/packages/smtp_config/seed/scripts/tests/smtp.cases.json @@ -0,0 +1,71 @@ +{ + "getDefaults": [ + { + "desc": "returns default SMTP configuration", + "expected_keys": ["host", "port", "username", "password", "fromEmail", "fromName", "secure"] + } + ], + "getFields": [ + { + "desc": "returns all field definitions", + "expected_count": 7 + } + ], + "validate": { + "valid": [ + { + "desc": "accepts valid configuration", + "input": { + "host": "smtp.gmail.com", + "port": 587, + "username": "user@example.com", + "password": "password123", + "fromEmail": "noreply@example.com", + "fromName": "Test System", + "secure": true + } + } + ], + "invalid": [ + { + "desc": "rejects missing host", + "input": { + "host": "", + "port": 587, + "username": "user", + "password": "pass", + "fromEmail": "test@example.com", + "fromName": "Test", + "secure": true + }, + "expected_error": "host" + }, + { + "desc": "rejects invalid port", + "input": { + "host": "smtp.example.com", + "port": 99999, + "username": "user", + "password": "pass", + "fromEmail": "test@example.com", + "fromName": "Test", + "secure": true + }, + "expected_error": "port" + }, + { + "desc": "rejects invalid email format", + "input": { + "host": "smtp.example.com", + "port": 587, + "username": "user", + "password": "pass", + "fromEmail": "invalid-email", + "fromName": "Test", + "secure": true + }, + "expected_error": "fromEmail" + } + ] + } +} diff --git a/packages/workflow_editor/seed/scripts/nodes/action.lua b/packages/workflow_editor/seed/scripts/nodes/action.lua index b02f065d8..369318577 100644 --- a/packages/workflow_editor/seed/scripts/nodes/action.lua +++ b/packages/workflow_editor/seed/scripts/nodes/action.lua @@ -5,18 +5,21 @@ ---@field id string Unique node identifier ---@field label string Display label for the node ---@field actionType string The type of action to perform +---@field icon? string Icon name from fakemui icons ---Creates an action node for workflow ---@param id string Unique node identifier ---@param label string Display label for the node ---@param action_type string The type of action to perform +---@param icon? string Icon name from fakemui icons ---@return ActionNodeDefinition -local function action_node(id, label, action_type) +local function action_node(id, label, action_type, icon) return { type = "action", id = id, label = label, - actionType = action_type + actionType = action_type, + icon = icon } end