Plain Jane
“Plain Jane” Workpad Editor - Comprehensive Technical Documentation
Overview
The “Plain Jane” is a client-side web application designed for capturing and managing structured records of meetings, customer interactions, and general processes through “workpads.” This HTML5 single-page application implements form-based data entry with dynamic action item management and persistent local storage.
Product Functionality
Core Features
- Create New Workpads: Initiate fresh records for engagements
- Edit Existing Workpads: Modify previously saved records via URL parameter (
?id=<index>) - Dynamic Action Management: Add/remove multiple action items with title and notes
- Local Data Persistence: Browser localStorage with cross-session data retention
- Structured Data Capture: Organized input fields for comprehensive engagement documentation
Application Structure
4 Main Blocks:
- Process: Customer/process identification and meeting logistics
- Actions: Dynamic array of actionable items with titles and notes
- Details: Additional contextual information
- Story: Narrative documentation
Navigation Flow:
- Listing: No filtering, New Button access
- Viewing: 4 Blocks display, Back to List, Edit, Delete options
- Editing: Full form interface with save/cancel operations
Technical Architecture
Technology Stack
- HTML5: Semantic document structure with embedded resources
- CSS3: Inline styling with component-based organization
- JavaScript ES5/6+: Client-side logic and state management
- Jekyll Integration: Static site generation with front matter configuration
- Storage: Browser localStorage API
- Network: None (fully client-side)
File Structure
- Document Type: HTML5 with embedded CSS and JavaScript
- Layout Engine: Jekyll front matter (
layout: default,permalink: /babb/plainjane/workpad-edit) - Routing: URL parameter-based editing mode detection (
?id=<index>)
Data Model
Workpad Object Structure
{
process: String, // Customer/process name
customerName: String, // Backward compatibility alias
date: String, // ISO date format (YYYY-MM-DD)
location: String, // Meeting location
meetingTime: String, // Free-form time string
actions: Array<{ // Dynamic action items
title: String, // Action title
notes: String // Action notes
}>,
details: String, // Additional details textarea
story: String // Narrative textarea
}
Storage Implementation
- Persistence Layer: Browser localStorage with key
'workpads' - Data Format: JSON serialization of workpad array
- State Initialization: URL parameter parsing for edit mode detection
- Data Structure: Single array containing all workpad objects
User Interface Design
Layout System
- Container: Fixed max-width (600px) with auto-centering using
margin: 2rem auto - Box Model: Universal
box-sizing: border-boxon form inputs - Responsive Design: Fluid width with horizontal padding constraints
- Form-Centric Layout: Single form with clearly labeled input fields
Visual Design System
- Typography: System UI font stack (
system-ui, sans-serif) - Color Palette:
- Primary:
#007acc(blue) with hover state#005a99 - Secondary:
#6c757d(gray) with hover state#565e64 - Success:
#28a745(green) with hover state#1e7e34 - Danger:
#dc3545(red) with hover state#a71d2a
- Primary:
- Border Radius: Consistent 4-8px rounded corners throughout
Component Specifications
- Form Controls: Standardized padding (0.5rem), font inheritance, border styling
- Button System: Consistent sizing (0.6rem × 1.2rem padding) with transition effects (0.2s ease)
- Action Items: Card-based layout with white background and gray borders
- Accessibility:
aria-labelattributes on interactive elements
JavaScript Implementation
Execution Architecture
- Scope Management: IIFE wrapper
(function () { ... })();for namespace isolation - DOM Manipulation:
document.getElementById()for element retrieval - Event Handling: Comprehensive listener attachment for form interactions
Core Functions
renderActions()
- Purpose: DOM manipulation for dynamic action item rendering
- Implementation:
- Clears existing container innerHTML
- Iterates through actions array with indexed rendering
- Dynamically creates form inputs with data attributes
- Attaches event listeners for real-time state updates
- Data Binding:
data-indexattributes for array synchronization
State Management Functions
- Form Submission: Prevents default, validates data, updates localStorage, redirects
- Action Management: Add/remove operations with array splicing and re-rendering
- Input Synchronization: Real-time binding between DOM inputs and JavaScript state
- URL Parameter Processing:
URLSearchParamsWeb API for edit mode detection
Form Field Specifications
Input Controls
- Customer Name (
#process): Text input with placeholder “Customer or Process name” - Date (
#date): HTML5 date picker - Meeting Location (
#location): Text input with placeholder “Meeting location” - Meeting Time (
#meetingTime): Free-form text input with placeholder “e.g. 10:00 AM” - Actions: Dynamic array with title/notes pairs and remove functionality
- Details (
#details): Resizable textarea (min-height: 80px) with placeholder “Additional details” - Story (
#story): Resizable textarea with placeholder “Narrative or story”
Dynamic Action System
- Container:
#actions-containerdiv with programmatic child management - Item Structure: Each action rendered as
.action-itemwith two text inputs and remove button - State Binding: Real-time synchronization via
data-indexattributes and event delegation - Add Functionality: Green “Add Action” button appends blank action objects
- Remove Functionality: Red trash icon buttons with array splice operations
Navigation Logic
- Save Redirect: Programmatic navigation to
/babb/plainjane/workpads - Cancel Action: Direct window.location assignment without form processing
- Edit Mode Detection: Conditional UI updates based on URL parameters
Browser Compatibility
Required APIs
- Storage API: localStorage (IE8+, all modern browsers)
- JavaScript Features: ES5+ (URLSearchParams requires polyfill for IE)
- CSS Features: Flexbox layout, CSS transitions
- HTML5: Date input type, semantic form elements
Security Considerations
- XSS Prevention: No innerHTML injection with user data
- Input Validation: Client-side trimming and basic sanitization
- Data Isolation: localStorage scoped to origin domain
- Namespace Protection: IIFE prevents global variable pollution
Technical Limitations and Considerations
Current Implementation Constraints
- Event Handler Efficiency: Re-attachment of all action event listeners on each render
- Data Validation: Limited to basic
.trim()operations without comprehensive validation - Error Handling: No explicit handling for localStorage quota or runtime exceptions
- Identifier Strategy: Array index-based referencing without UUID implementation
Performance Characteristics
- Client-Side Only: No network dependencies for core functionality
- Memory Usage: All data maintained in browser memory during session
- Rendering: Full DOM reconstruction on action list changes
- Storage Limitations: Bounded by browser localStorage quotas
Data Persistence Details
Storage Mechanism
- API: Browser localStorage
- Serialization: JSON.stringify/JSON.parse
- Key:
'workpads'(string literal) - Structure: Single array containing all workpad objects
- Compatibility: Dual field maintenance (
process/customerName) for legacy support
Data Integrity
- Array Validation:
Array.isArray()checks for actions property - Null Safety: Default empty array
|| '[]'for missing localStorage data - Type Consistency: String trimming for text inputs, preserved formatting for textareas