449 lines
13 KiB
Markdown
449 lines
13 KiB
Markdown
# Work Session Summary: Rule and Pack Create/Edit Forms
|
|
|
|
**Date**: 2026-01-19
|
|
**Focus**: Web UI form implementation for rules and packs with config schema support
|
|
**Status**: ✅ Complete
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
Implemented comprehensive create/edit forms for rules and packs in the Attune web UI, enabling users to:
|
|
- Create automation rules with dynamic trigger/action selection
|
|
- Register ad-hoc packs with JSON Schema-based configuration definitions
|
|
- Edit existing rules and packs (form components support both modes)
|
|
|
|
---
|
|
|
|
## Implemented Components
|
|
|
|
### 1. RuleForm Component (`web/src/components/forms/RuleForm.tsx`)
|
|
|
|
**Features**:
|
|
- Dynamic pack selection with cascading trigger/action dropdowns
|
|
- Automatic filtering of triggers and actions by selected pack
|
|
- JSON editor for match criteria with syntax validation
|
|
- JSON editor for action parameters with template variable support
|
|
- Form validation (required fields, JSON syntax)
|
|
- Create and update operations via React Query mutations
|
|
- Disabled fields for immutable data when editing (pack, trigger, action)
|
|
- Auto-navigation to detail page after successful creation
|
|
- Error handling and user feedback
|
|
|
|
**Form Fields**:
|
|
- Pack selection (dropdown, required)
|
|
- Name (text, required)
|
|
- Description (textarea, optional)
|
|
- Enabled toggle (default: true)
|
|
- Trigger selection (dropdown, required, filtered by pack)
|
|
- Match criteria (JSON textarea, optional)
|
|
- Action selection (dropdown, required, filtered by pack)
|
|
- Action parameters (JSON textarea, optional)
|
|
|
|
**Validation**:
|
|
- Name: non-empty string required
|
|
- Pack: must be selected
|
|
- Trigger: must be selected
|
|
- Action: must be selected
|
|
- Criteria: valid JSON or empty
|
|
- Action parameters: valid JSON or empty
|
|
|
|
### 2. PackForm Component (`web/src/components/forms/PackForm.tsx`)
|
|
|
|
**Features**:
|
|
- Pack name format validation (lowercase, numbers, hyphens, underscores)
|
|
- Semantic versioning validation
|
|
- Configuration schema JSON editor with validation
|
|
- Quick-insert buttons for common schema examples (API, Database, Webhook)
|
|
- Additional metadata JSON editor
|
|
- Automatic merging of config_schema into metadata
|
|
- System and enabled toggles
|
|
- Create and update operations
|
|
- Error handling and user feedback
|
|
|
|
**Form Fields**:
|
|
- Name (text, required, immutable when editing)
|
|
- Description (textarea, optional)
|
|
- Version (text, required, semver format)
|
|
- Author (text, optional)
|
|
- Enabled toggle (default: true)
|
|
- System toggle (default: false)
|
|
- Configuration schema (JSON textarea, JSON Schema format)
|
|
- Additional metadata (JSON textarea, optional)
|
|
|
|
**Validation**:
|
|
- Name: required, must match pattern `^[a-z0-9_-]+$`
|
|
- Version: required, must match semver pattern `^\d+\.\d+\.\d+`
|
|
- Config schema: valid JSON, must have `type: "object"` at root
|
|
- Metadata: valid JSON or empty
|
|
|
|
**Quick-Insert Examples**:
|
|
- **API Schema**: API key, endpoint, authentication
|
|
- **Database Schema**: Host, port, database, username, password
|
|
- **Webhook Schema**: Webhook URL, auth token, timeout
|
|
|
|
### 3. Page Components
|
|
|
|
**RuleCreatePage** (`web/src/pages/rules/RuleCreatePage.tsx`):
|
|
- Simple wrapper around RuleForm
|
|
- Header with breadcrumb navigation
|
|
- Descriptive text for user guidance
|
|
|
|
**PackCreatePage** (`web/src/pages/packs/PackCreatePage.tsx`):
|
|
- Simple wrapper around PackForm
|
|
- Header with breadcrumb navigation
|
|
- Descriptive text for user guidance
|
|
|
|
### 4. Routing Updates
|
|
|
|
**Added Routes**:
|
|
- `/rules/new` → RuleCreatePage
|
|
- `/packs/new` → PackCreatePage
|
|
|
|
**Route Order**: New routes placed before `:id` routes to prevent path conflicts
|
|
|
|
### 5. List Page Enhancements
|
|
|
|
**RulesPage**:
|
|
- Added "Create Rule" button in header
|
|
- Button navigates to `/rules/new`
|
|
- Styled consistently with existing UI
|
|
|
|
**PacksPage**:
|
|
- Added "Register Pack" button in header
|
|
- Button navigates to `/packs/new`
|
|
- Enhanced header layout and description
|
|
- Styled consistently with existing UI
|
|
|
|
---
|
|
|
|
## Technical Implementation Details
|
|
|
|
### React Query Integration
|
|
|
|
Both forms use existing hooks:
|
|
- `useCreateRule()` / `useUpdateRule()` for rule operations
|
|
- `useCreatePack()` / `useUpdatePack()` for pack operations
|
|
- `usePacks()` for loading pack list
|
|
- `usePackTriggers()` / `usePackActions()` for filtered dropdowns
|
|
- Automatic query invalidation after mutations
|
|
|
|
### Form State Management
|
|
|
|
- Local state with React `useState` hooks
|
|
- Separate error state for field-level validation
|
|
- JSON parsing/stringification for complex fields
|
|
- Effect hook to reset cascading dropdowns on pack change
|
|
|
|
### Validation Strategy
|
|
|
|
**Client-Side Validation**:
|
|
- Required field checks
|
|
- Format validation (pack name, version)
|
|
- JSON syntax validation
|
|
- Real-time error display
|
|
|
|
**Server-Side Validation**:
|
|
- API error capture and display
|
|
- Generic error handling for network failures
|
|
|
|
### User Experience
|
|
|
|
- Inline validation errors with red borders and messages
|
|
- Submit button disabled during API calls
|
|
- Loading states ("Saving...")
|
|
- Success navigation (redirect to detail page)
|
|
- Cancel button returns to list page
|
|
- Helpful placeholder text and examples
|
|
- Required field indicators (red asterisks)
|
|
- Informational hints below complex fields
|
|
|
|
---
|
|
|
|
## Configuration Schema Support
|
|
|
|
The pack form allows defining a JSON Schema for pack configuration, enabling:
|
|
|
|
1. **Schema Definition**: Define expected configuration structure
|
|
2. **Type Validation**: Specify types (string, integer, object, etc.)
|
|
3. **Constraints**: Min/max values, enums, required fields
|
|
4. **Defaults**: Provide default values
|
|
5. **Documentation**: Add descriptions for each field
|
|
|
|
**Example Schema Structure**:
|
|
```json
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"api_key": {
|
|
"type": "string",
|
|
"description": "API key for authentication"
|
|
},
|
|
"endpoint": {
|
|
"type": "string",
|
|
"description": "Service endpoint URL",
|
|
"default": "https://api.example.com"
|
|
},
|
|
"timeout": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 300,
|
|
"default": 30
|
|
}
|
|
},
|
|
"required": ["api_key"]
|
|
}
|
|
```
|
|
|
|
**Storage**: Config schema is merged into pack metadata under `config_schema` key
|
|
|
|
---
|
|
|
|
## Build and Testing Status
|
|
|
|
### Build Status: ✅ PASSING
|
|
|
|
```
|
|
npm run build
|
|
✓ 474 modules transformed
|
|
✓ built in 3.12s
|
|
```
|
|
|
|
- TypeScript compilation: ✅ No errors
|
|
- Production build: ✅ Success
|
|
- Bundle size: 435.32 kB (122.09 kB gzipped)
|
|
|
|
### Testing Status: ⚠️ MANUAL TESTING REQUIRED
|
|
|
|
**Automated Tests**: None yet (test framework setup pending)
|
|
|
|
**Manual Testing Checklist Created**:
|
|
- 17 test cases for RuleForm
|
|
- 20 test cases for PackForm
|
|
- 4 test cases for list page integration
|
|
- Added to `docs/testing-status.md`
|
|
|
|
**Testing Priorities**:
|
|
1. Component unit tests (Vitest + React Testing Library)
|
|
2. E2E tests (Playwright)
|
|
3. Form validation scenarios
|
|
4. API integration testing
|
|
|
|
---
|
|
|
|
## Documentation Updates
|
|
|
|
### Updated Files
|
|
|
|
1. **work-summary/TODO.md**
|
|
- Marked rule and pack forms as complete
|
|
- Updated in-progress section
|
|
- Adjusted remaining TODO items
|
|
|
|
2. **CHANGELOG.md**
|
|
- Added comprehensive feature descriptions
|
|
- Documented form fields and validation
|
|
- Listed all new routes and components
|
|
|
|
3. **docs/testing-status.md**
|
|
- Added Web UI section
|
|
- Created manual testing checklists
|
|
- Identified automated testing needs
|
|
|
|
---
|
|
|
|
## API Compatibility
|
|
|
|
Forms are compatible with existing API endpoints:
|
|
|
|
### Rule Creation/Update
|
|
- `POST /api/v1/rules` - Create rule
|
|
- `PUT /api/v1/rules/:id` - Update rule
|
|
|
|
**Expected Fields**:
|
|
- `pack_id` (number)
|
|
- `name` (string)
|
|
- `description` (string, optional)
|
|
- `trigger_id` (number)
|
|
- `action_id` (number)
|
|
- `criteria` (object, optional)
|
|
- `action_parameters` (object, optional)
|
|
- `enabled` (boolean)
|
|
|
|
### Pack Creation/Update
|
|
- `POST /api/v1/packs` - Create pack
|
|
- `PUT /api/v1/packs/:ref` - Update pack
|
|
|
|
**Expected Fields**:
|
|
- `name` (string)
|
|
- `description` (string, optional)
|
|
- `version` (string)
|
|
- `author` (string, optional)
|
|
- `enabled` (boolean)
|
|
- `system` (boolean)
|
|
- `metadata` (object, optional, includes `config_schema`)
|
|
|
|
---
|
|
|
|
## User Workflows Enabled
|
|
|
|
### Creating a Rule
|
|
1. Navigate to Rules page
|
|
2. Click "Create Rule" button
|
|
3. Select pack (triggers/actions load automatically)
|
|
4. Enter rule name and description
|
|
5. Select trigger from filtered list
|
|
6. Optionally add match criteria (JSON)
|
|
7. Select action from filtered list
|
|
8. Optionally add action parameters (JSON)
|
|
9. Toggle enabled state if needed
|
|
10. Click "Create Rule"
|
|
11. Redirected to new rule detail page
|
|
|
|
### Registering a Pack
|
|
1. Navigate to Packs page
|
|
2. Click "Register Pack" button
|
|
3. Enter pack name (lowercase format)
|
|
4. Enter description and version
|
|
5. Optionally add author
|
|
6. Click example button or manually edit config schema
|
|
7. Define configuration schema using JSON Schema format
|
|
8. Optionally add additional metadata
|
|
9. Toggle enabled/system flags if needed
|
|
10. Click "Register Pack"
|
|
11. Redirected to new pack detail page
|
|
|
|
---
|
|
|
|
## Future Enhancements
|
|
|
|
### Short Term
|
|
- [ ] Add rule edit mode integration (button on detail page)
|
|
- [ ] Add pack edit mode integration (button on detail page)
|
|
- [ ] Implement action, trigger, and sensor forms
|
|
- [ ] Add form field tooltips with examples
|
|
- [ ] Improve JSON editor UX (syntax highlighting, autocomplete)
|
|
|
|
### Medium Term
|
|
- [ ] Visual criteria builder (alternative to JSON editing)
|
|
- [ ] Visual config schema builder
|
|
- [ ] Parameter autocomplete from action schemas
|
|
- [ ] Template variable suggestions
|
|
- [ ] Form autosave/draft recovery
|
|
|
|
### Long Term
|
|
- [ ] Visual workflow editor integration
|
|
- [ ] Rule testing/simulation before saving
|
|
- [ ] Config schema validation preview
|
|
- [ ] Import/export rule and pack definitions
|
|
- [ ] Bulk operations (create multiple rules)
|
|
|
|
---
|
|
|
|
## Known Limitations
|
|
|
|
1. **No Edit Button Integration**: Edit mode works but no UI button to access it yet
|
|
2. **JSON Editing Only**: No visual builder for complex criteria/schemas
|
|
3. **No Field Dependencies**: Can't show/hide fields based on selections
|
|
4. **No Autosave**: Form data lost if user navigates away
|
|
5. **No Validation Preview**: Can't test criteria/schemas before saving
|
|
6. **Limited Error Context**: API errors don't always show field-specific messages
|
|
|
|
---
|
|
|
|
## Dependencies
|
|
|
|
**Existing Hooks Used**:
|
|
- `useRules`, `useCreateRule`, `useUpdateRule` (from `@/hooks/useRules`)
|
|
- `usePacks`, `useCreatePack`, `useUpdatePack` (from `@/hooks/usePacks`)
|
|
- `usePackTriggers` (from `@/hooks/useTriggers`)
|
|
- `usePackActions` (from `@/hooks/useActions`)
|
|
|
|
**No New Dependencies**: All functionality built with existing libraries
|
|
|
|
---
|
|
|
|
## Success Metrics
|
|
|
|
### Completed
|
|
✅ Rule form implemented and building successfully
|
|
✅ Pack form implemented with config schema support
|
|
✅ Create pages added to routing
|
|
✅ List pages updated with create buttons
|
|
✅ TypeScript compilation clean
|
|
✅ Documentation updated
|
|
✅ Testing checklist created
|
|
|
|
### Pending
|
|
⚠️ Manual testing of all form scenarios
|
|
⚠️ Edit mode UI integration (buttons on detail pages)
|
|
⚠️ Automated test implementation
|
|
⚠️ User acceptance testing
|
|
|
|
---
|
|
|
|
## Architectural Clarification
|
|
|
|
**Important**: During this session, architectural constraints were clarified:
|
|
|
|
### Pack-Based vs UI-Configurable Components
|
|
|
|
**Actions and Sensors** - **NOT UI-Editable**:
|
|
- Implemented as executable code (Python, Node.js, Shell)
|
|
- Registered when a pack is loaded/installed
|
|
- Managed through pack lifecycle, not through Web UI
|
|
- Rationale: Security, performance, code quality, testing
|
|
|
|
**Triggers** - **Mixed Model**:
|
|
- **Pack-based triggers**: Registered with system packs (e.g., `slack.message_received`)
|
|
- **Ad-hoc triggers**: UI-configurable for custom integrations (future feature)
|
|
- Only ad-hoc triggers in ad-hoc packs should be editable via UI
|
|
|
|
**Rules** - **Always UI-Configurable**:
|
|
- Connect triggers to actions with criteria and parameters
|
|
- No code execution, just data mapping
|
|
- Users need flexibility to change business logic
|
|
|
|
**Packs** - **Two Types**:
|
|
- **System packs**: Installed via pack management tools, contain code-based components
|
|
- **Ad-hoc packs**: Registered via UI for custom event types without code deployment
|
|
|
|
**Workflow Actions** - **Future**:
|
|
- Special type of action that will be UI-configurable
|
|
- Part of visual workflow editor implementation
|
|
|
|
### Documentation Created
|
|
|
|
- `docs/pack-management-architecture.md` - Comprehensive architectural guidelines
|
|
- Updated `TODO.md` with architectural notes
|
|
- Updated `CHANGELOG.md` with clarifications
|
|
|
|
### Impact on Implementation Plans
|
|
|
|
**Previously Planned** (now removed):
|
|
- ❌ Action create/edit forms (actions are code-based)
|
|
- ❌ Sensor create/edit forms (sensors are code-based)
|
|
|
|
**Still Needed**:
|
|
- ✅ Trigger create/edit form (for ad-hoc packs only)
|
|
- ✅ Workflow action configuration (future feature)
|
|
|
|
---
|
|
|
|
## Conclusion
|
|
|
|
Successfully implemented full-featured create/edit forms for rules and packs, completing a major milestone in the Attune web UI. The forms provide:
|
|
|
|
- **Intuitive UX** with cascading dropdowns and real-time validation
|
|
- **Powerful Features** like JSON Schema-based pack configuration
|
|
- **Production Quality** with proper error handling and loading states
|
|
- **Extensibility** supporting both create and edit modes
|
|
- **Architectural Clarity** on pack-based vs UI-configurable components
|
|
|
|
The implementation follows established patterns from existing pages and integrates seamlessly with the API and state management layers. Ready for manual testing and user feedback.
|
|
|
|
**Next Steps**:
|
|
1. Conduct manual testing using checklist in `docs/testing-status.md`
|
|
2. Add edit buttons to rule and pack detail pages
|
|
3. Implement trigger create/edit form (for ad-hoc packs only)
|
|
4. Set up automated testing framework (Vitest + Playwright) |