UNPKG

besper-frontend-site-dev-main

Version:

Professional B-esper Frontend Site - Site-wide integration toolkit for full website bot deployment

1,125 lines (897 loc) 42.6 kB
# B-esper Frontend Site - Complete Architecture Developer Guide ## Overview The B-esper Frontend Site is the **client-side component** of our enterprise PowerPages architecture. It provides comprehensive bot functionality, debugging tools, and network monitoring through a well-architected system that automatically integrates with PowerPages using URL auto-detection and professional UI rendering. ## Recent Updates ### BSP Logger System - **Converted from Liquid template to npm site function**: Eliminates Liquid dependencies and provides maintainable JavaScript solution - **JavaScript-based internationalization**: All translations moved from Liquid variables to JavaScript objects - **Network tracing capabilities**: Advanced network monitoring interface with XHR/Fetch interception - **Dual-mode interface**: Toggle between traditional logs and network traces views - **Skeleton loading system**: Page-specific skeleton loading with centrally styled animations ### Build System Improvements - **Linting fixes**: Resolved ESLint errors including unused variables and object shorthand requirements - **API endpoint validation**: Prevents hardcoded endpoints and requires proper environment configuration - **Enhanced error handling**: Better build validation and environment variable checking ## Architecture Role This npm package serves as the **JavaScript business logic layer** in our complete architecture: ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ PowerPages │ │ NPM Site │ │ Function App │ │ (Integration) │───▶│ (Business Logic)│───▶│ (HTML/CSS) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ 6-line integration Auto-detection Server-side storage User data passing Authentication Template serving Language config API calls Style combination ``` **What this package does:** - ✅ Auto-detects page from PowerPages URL - ✅ Loads HTML/CSS templates from function app storage - ✅ Renders professional UI immediately with skeleton loading - ✅ Handles authentication token acquisition in background - ✅ Manages all API calls and data loading - ✅ Provides interactive business logic for all 34 pages **What this package does NOT do:** - ❌ Store HTML templates (served by function app) - ❌ Store CSS styles (served by function app) - ❌ Handle PowerPages authentication flow (uses existing tokens) - ❌ Manage Azure infrastructure (handled by APIM + Function App) ## PowerPages Integration (Primary API) ### Automatic URL Detection Integration (RECOMMENDED) **PowerPages Template Pattern** (copy to all PowerPages): ```html <div id="besper-site-container"></div> <script src="https://unpkg.com/besper-frontend-site-{{ settings.enviroment }}-{{ settings.bsp_branch }}@latest/dist/bespersite.js"></script> <script> window.besperAutoPageIntegration({ user: {% if user %}{ id: "{{ user.id }}", contactid: "{{ user.contactid }}" }{% else %}null{% endif %}, language: "{{ language.code }}" }); </script> ``` **How Auto-Detection Works:** 1. **URL Parsing**: `window.location.pathname` analyzed (e.g., `/manage-workspace`) 2. **Intelligent Mapping**: URL mapped to page ID using smart fallbacks 3. **Environment Detection**: Hostname analyzed for environment (dev/int/prod) 4. **Asset Loading**: HTML/CSS templates loaded from function app storage 5. **Immediate Rendering**: Professional UI shows within ~200ms 6. **Background Processing**: Authentication and data loading happen in parallel ### Manual Override Integration (when needed) ```html <script> window.besperPageIntegration('specific-page-id', { user: {% if user %}{ id: "{{ user.id }}", contactid: "{{ user.contactid }}" }{% else %}null{% endif %}, language: "{{ language.code }}" }); </script> ``` ## Complete Integration Lifecycle ### Phase 1: PowerPages Call (0-50ms) ```javascript // PowerPages liquid template calls: window.besperAutoPageIntegration({ user: { id: 'user123', contactid: 'contact456' }, language: 'en', }); ``` ### Phase 2: Auto-Detection & Environment Analysis (50-100ms) ```javascript // npm site analyzes current context: const pageId = detectPageIdFromUrl(); // '/manage-workspace' → 'manage-workspace' const environment = detectEnvironmentFromUrl(); // 'dev.powerapps.com' → 'dev' const branch = 'main'; // default or from settings ``` ### Phase 3: Template & Style Loading (100-300ms) ```javascript // Load HTML/CSS from function app storage via APIM: const templateLoader = new TemplateLoaderService({ environment, branch }); const { template, styles } = await templateLoader.loadPageAssets(pageId); // → GET /api/besper-site/template?page_id=manage-workspace // → GET /api/besper-site/styles?page_id=manage-workspace ``` ### Phase 4: Immediate UI Rendering (300-500ms) ```javascript // Professional UI renders immediately: const container = document.getElementById('besper-site-container'); container.innerHTML = template; // Professional interface with skeleton loading templateLoader.applyStyles(styles); // Global + page-specific CSS ``` ### Phase 5: Background Authentication (500ms-5s, non-blocking) ```javascript // Token acquisition happens in background: const token = await getAuthTokenWithRetry(); // Multiple strategies attempted // User doesn't wait - UI already rendered and interactive ``` ### Phase 6: Data Loading & Business Logic (1-8s) ```javascript // Page-specific JavaScript loads real data: const pageClass = await import(`./pages/${pageId}/script.js`); const page = new pageClass.default({ token, user, language }); await page.loadData(); // Replace skeleton loaders with real content ``` ## URL Auto-Detection System ### Intelligent URL Mapping The npm site uses sophisticated URL analysis to automatically detect the correct page: ```javascript // URL Detection Strategies (in order of preference): // 1. EXACT MATCHES (primary mappings) const exactMappings = { '/manage-workspace': 'manage-workspace', '/contact-us': 'contact-us', '/account-management': 'account-management', '/user-management': 'user-management-new', '/bot-management': 'bot-management-new', '/cost-pool': 'cost-pool-management', '/pricing': 'pricing', '/home': 'home', '/profile': 'profile', '/notifications': 'notifications', '/support-tickets': 'support-tickets', '/help': 'help', '/about': 'about-us', '/partners': 'partners', '/case-studies': 'case-studies', '/get-started': 'get-started', '/subscription': 'subscription', '/my-bots': 'my-bots', '/workspace': 'workspace', '/workbench': 'workbench', '/users': 'users', '/invite-user': 'invite-user', '/manage-user': 'manage-user', '/technical-insights': 'technical-insights', '/implementation-guide': 'implementation-guide', '/product-purchasing': 'product-purchasing', '/upcoming': 'upcoming', '/demo': 'demo', // ... all 34 pages mapped }; // 2. PARTIAL MATCHES (intelligent fallbacks) // '/manage-workspace/details' → 'manage-workspace' // '/user-management/invite' → 'user-management-new' // '/bot-management/create' → 'bot-management-new' // 3. KEYWORD DETECTION (smart fallbacks) if (pathname.includes('workspace')) return 'manage-workspace'; if (pathname.includes('contact')) return 'contact-us'; if (pathname.includes('user')) return 'user-management-new'; if (pathname.includes('bot')) return 'bot-management-new'; if (pathname.includes('cost')) return 'cost-pool-management'; if (pathname.includes('notification')) return 'notifications'; if (pathname.includes('ticket')) return 'support-tickets'; // 4. DEFAULT FALLBACK return 'home'; // Ultimate fallback ``` ### Environment Auto-Detection ```javascript // Environment Detection from Hostname: const hostname = window.location.hostname.toLowerCase(); if ( hostname.includes('localhost') || hostname.includes('127.0.0.1') || hostname.includes('dev.') ) { return 'development'; } if (hostname.includes('-dev') || hostname.includes('dev-')) { return 'dev'; } if ( hostname.includes('-int') || hostname.includes('int.') || hostname.includes('staging') ) { return 'int'; } return 'prod'; // Default production environment ``` ### Template Loading Service The `TemplateLoaderService` handles all communication with the function app storage: ```javascript class TemplateLoaderService { constructor({ environment, branch }) { this.baseUrl = this.getApiBaseUrl(environment); this.branch = branch || 'main'; } async loadPageAssets(pageId) { // Parallel loading for optimal performance const [templateResponse, stylesResponse] = await Promise.all([ this.loadTemplate(pageId), this.loadStyles(pageId), ]); return { template: templateResponse.content, styles: stylesResponse.content, // Already combined: global.css + page.css }; } async loadTemplate(pageId) { const response = await fetch( `${this.baseUrl}/api/besper-site/template?page_id=${pageId}&branch=${this.branch}` ); return await response.json(); } async loadStyles(pageId) { const response = await fetch( `${this.baseUrl}/api/besper-site/styles?page_id=${pageId}&branch=${this.branch}` ); return await response.json(); } getApiBaseUrl(environment) { switch (environment) { case 'development': case 'dev': return 'https://b-esper-apim-dev.azure-api.net'; case 'int': return 'https://b-esper-apim.azure-api.net/int'; case 'prod': default: return 'https://b-esper-apim.azure-api.net'; } } } ``` ## Page Architecture (All 34 Pages) ### Page Structure Pattern Every page follows the same professional architecture pattern: ``` src/pages/{page-id}/ └── script.js # Business logic, authentication, data management infra/besper_site_serversite/storage/ ├── html/{page-id}/ │ └── template.html # UI structure with skeleton loading └── css/{page-id}/ └── styles.css # Page-specific styles (global.css always included) ``` ### Complete Page Directory Structure **34 Pages with 1:1 Mapping:** | Page Category | Page ID | npm Logic | Function App Template | Function App Styles | | ------------------- | ------------------------------------ | ------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------ | | **Core Management** | | | | | | | `manage-workspace` | ✅ `pages/manage-workspace/script.js` | ✅ `html/manage-workspace/template.html` | ✅ `css/manage-workspace/styles.css` | | | `account-management` | ✅ `pages/account-management/script.js` | ✅ `html/account-management/template.html` | ✅ `css/account-management/styles.css` | | | `profile` | ✅ `pages/profile/script.js` | ✅ `html/profile/template.html` | ✅ `css/profile/styles.css` | | **User Management** | | | | | | | `user-management-new` | ✅ `pages/user-management-new/script.js` | ✅ `html/user-management-new/template.html` | ✅ `css/user-management-new/styles.css` | | | `users` | ✅ `pages/users/script.js` | ✅ `html/users/template.html` | ✅ `css/users/styles.css` | | | `invite-user` | ✅ `pages/invite-user/script.js` | ✅ `html/invite-user/template.html` | ✅ `css/invite-user/styles.css` | | | `manage-user` | ✅ `pages/manage-user/script.js` | ✅ `html/manage-user/template.html` | ✅ `css/manage-user/styles.css` | | **Bot Management** | | | | | | | `bot-management-new` | ✅ `pages/bot-management-new/script.js` | ✅ `html/bot-management-new/template.html` | ✅ `css/bot-management-new/styles.css` | | | `my-bots` | ✅ `pages/my-bots/script.js` | ✅ `html/my-bots/template.html` | ✅ `css/my-bots/styles.css` | | | `workbench` | ✅ `pages/workbench/script.js` | ✅ `html/workbench/template.html` | ✅ `css/workbench/styles.css` | | **Business Pages** | | | | | | | `home` | ✅ `pages/home/script.js` | ✅ `html/home/template.html` | ✅ `css/home/styles.css` | | | `home-auth` | ✅ `pages/home-auth/script.js` | ✅ `html/home-auth/template.html` | ✅ `css/home-auth/styles.css` | | | `home-new` | ✅ `pages/home-new/script.js` | ✅ `html/home-new/template.html` | ✅ `css/home-new/styles.css` | | | `pricing` | ✅ `pages/pricing/script.js` | ✅ `html/pricing/template.html` | ✅ `css/pricing/styles.css` | | | `subscription` | ✅ `pages/subscription/script.js` | ✅ `html/subscription/template.html` | ✅ `css/subscription/styles.css` | | **Support & Help** | | | | | | | `support-tickets` | ✅ `pages/support-tickets/script.js` | ✅ `html/support-tickets/template.html` | ✅ `css/support-tickets/styles.css` | | | `support-ticket-details` | ✅ `pages/support-ticket-details/script.js` | ✅ `html/support-ticket-details/template.html` | ✅ `css/support-ticket-details/styles.css` | | | `help` | ✅ `pages/help/script.js` | ✅ `html/help/template.html` | ✅ `css/help/styles.css` | | | `contact-us` | ✅ `pages/contact-us/script.js` | ✅ `html/contact-us/template.html` | ✅ `css/contact-us/styles.css` | | **Information** | | | | | | | `about-us` | ✅ `pages/about-us/script.js` | ✅ `html/about-us/template.html` | ✅ `css/about-us/styles.css` | | | `case-studies` | ✅ `pages/case-studies/script.js` | ✅ `html/case-studies/template.html` | ✅ `css/case-studies/styles.css` | | | `partners` | ✅ `pages/partners/script.js` | ✅ `html/partners/template.html` | ✅ `css/partners/styles.css` | | | `technical-insights` | ✅ `pages/technical-insights/script.js` | ✅ `html/technical-insights/template.html` | ✅ `css/technical-insights/styles.css` | | **Workflows** | | | | | | | `get-started` | ✅ `pages/get-started/script.js` | ✅ `html/get-started/template.html` | ✅ `css/get-started/styles.css` | | | `implementation-guide` | ✅ `pages/implementation-guide/script.js` | ✅ `html/implementation-guide/template.html` | ✅ `css/implementation-guide/styles.css` | | | `demo` | ✅ `pages/demo/script.js` | ✅ `html/demo/template.html` | ✅ `css/demo/styles.css` | | | `upcoming` | ✅ `pages/upcoming/script.js` | ✅ `html/upcoming/template.html` | ✅ `css/upcoming/styles.css` | | **Notifications** | | | | | | | `notifications` | ✅ `pages/notifications/script.js` | ✅ `html/notifications/template.html` | ✅ `css/notifications/styles.css` | | | `notification-details` | ✅ `pages/notification-details/script.js` | ✅ `html/notification-details/template.html` | ✅ `css/notification-details/styles.css` | | **Advanced** | | | | | | | `cost-pool-management` | ✅ `pages/cost-pool-management/script.js` | ✅ `html/cost-pool-management/template.html` | ✅ `css/cost-pool-management/styles.css` | | | `product-purchasing` | ✅ `pages/product-purchasing/script.js` | ✅ `html/product-purchasing/template.html` | ✅ `css/product-purchasing/styles.css` | | | `workspace-management-new` | ✅ `pages/workspace-management-new/script.js` | ✅ `html/workspace-management-new/template.html` | ✅ `css/workspace-management-new/styles.css` | | **Admin** | | | | | | | `admin_customer_outreach_management` | ✅ `pages/admin_customer_outreach_management/script.js` | ✅ `html/admin_customer_outreach_management/template.html` | ✅ `css/admin_customer_outreach_management/styles.css` | | | `rc-subscription` | ✅ `pages/rc-subscription/script.js` | ✅ `html/rc-subscription/template.html` | ✅ `css/rc-subscription/styles.css` | | | `workspace` | ✅ `pages/workspace/script.js` | ✅ `html/workspace/template.html` | ✅ `css/workspace/styles.css` | ### Example Page Implementation **ManageWorkspacePage** - Complete pattern: ```javascript // src/pages/manage-workspace/script.js class ManageWorkspacePage { constructor(options = {}) { this.options = { containerId: 'besper-site-container', ...options, }; // Template loader handles server-side assets this.templateLoader = new window.TemplateLoaderService({ environment: options.environment, branch: options.branch, }); } async initialize() { try { // 1. Load HTML/CSS from function app storage (immediate) const { template, styles } = await this.templateLoader.loadPageAssets('manage-workspace'); // 2. Render professional UI immediately const container = document.getElementById(this.options.containerId); container.innerHTML = template; // Skeleton loading visible to user this.templateLoader.applyStyles(styles); // Global + page-specific CSS // 3. Setup event listeners for immediate interactivity this.setupEventListeners(); // 4. Load real data in background (token-dependent) this.loadWorkspaceData(); } catch (error) { console.error('Failed to initialize Manage Workspace page:', error); this.showErrorState(); } } setupEventListeners() { // Interactive elements work immediately const createWorkspaceBtn = document.getElementById('create-workspace-btn'); if (createWorkspaceBtn) { createWorkspaceBtn.addEventListener('click', () => this.createWorkspace() ); } // Listen for authentication updates window.addEventListener('powerPagesAuthUpdated', event => { this.handleAuthenticationUpdate(event.detail); }); } async loadWorkspaceData() { // This runs in background while user sees professional UI // Skeleton loaders get replaced with real data when auth is ready const workspaceTable = document.getElementById('workspace-hierarchy-table'); if (this.options.token) { // Token available - load immediately const workspaces = await this.fetchWorkspaces(); this.renderWorkspaces(workspaces, workspaceTable); } else { // Wait for background authentication console.log('[ManageWorkspace] Waiting for authentication token...'); } } handleAuthenticationUpdate({ token, userId }) { // Authentication completed in background this.options.token = token; this.options.userId = userId; // Now load real data this.loadWorkspaceData(); } async fetchWorkspaces() { // API calls with authentication token const response = await fetch('/api/workspaces', { headers: { Authorization: `Bearer ${this.options.token}`, 'Content-Type': 'application/json', }, }); return await response.json(); } renderWorkspaces(workspaces, container) { // Replace skeleton loaders with real workspace data container.innerHTML = workspaces .map( workspace => ` <div class="workspace-stats-card"> <h3>${workspace.name}</h3> <p>Users: ${workspace.userCount}</p> <p>Bots: ${workspace.botCount}</p> </div> ` ) .join(''); } } // Export for global access (required pattern) window.ManageWorkspacePage = ManageWorkspacePage; ``` ## Testing & Validation ### Local Development Testing **Test URL Auto-Detection:** ```javascript // Open browser console on any PowerPages site and run: window.besperAutoPageIntegration({ user: { id: 'test-user', contactid: 'test-contact' }, language: 'en', }); // Should automatically detect page from URL and load appropriate template ``` **Test Manual Page Override:** ```javascript // Force specific page (useful for testing): window.besperPageIntegration('manage-workspace', { user: { id: 'test-user', contactid: 'test-contact' }, language: 'en', }); ``` **Test Template Loading Service:** ```javascript // Test template loading directly: const loader = new window.TemplateLoaderService({ environment: 'dev', branch: 'main', }); const assets = await loader.loadPageAssets('manage-workspace'); console.log('Template:', assets.template); console.log('Styles:', assets.styles); ``` ### Function App Endpoint Testing **Test Template Endpoint:** ```bash # Test template serving: curl "https://b-esper-apim-dev.azure-api.net/api/besper-site/template?page_id=manage-workspace" # Expected response: { "success": true, "page_id": "manage-workspace", "template": "<div class=\"workspace-container\">...</div>", "source": "infra/besper_site_serversite/storage/html/manage-workspace/template.html" } ``` **Test Styles Endpoint:** ```bash # Test combined CSS serving: curl "https://b-esper-apim-dev.azure-api.net/api/besper-site/styles?page_id=manage-workspace" # Expected response: { "success": true, "page_id": "manage-workspace", "styles": "/* === GLOBAL STYLES === */\n:root { ... }\n\n/* === PAGE-SPECIFIC STYLES: MANAGE-WORKSPACE === */\n.workspace-hierarchy-table { ... }", "sources": ["global.css", "manage-workspace/styles.css"], "note": "Combined global + page-specific styles" } ``` ### PowerPages Integration Testing **Copy Template for Testing:** ```html <!-- Test template - copy to any PowerPages page --> <div id="besper-site-container"></div> <script src="https://unpkg.com/besper-frontend-site-dev-main@latest/dist/bespersite.js"></script> <script> window.besperAutoPageIntegration({ user: {% if user %}{ id: "{{ user.id }}", contactid: "{{ user.contactid }}" }{% else %}null{% endif %}, language: "{{ language.code }}" }); </script> ``` **Expected Behavior:** 1. **0-200ms**: Container appears, loading starts 2. **200-500ms**: Professional UI renders with skeleton loading 3. **500ms-2s**: Background authentication token acquisition 4. **2-8s**: Real data loads and replaces skeleton loaders 5. **Result**: Fully interactive page with professional interface ## Deployment Architecture ### Function App Deployment **Static Assets Included** (configured in `.funcignore`): ``` # Function app deployment automatically includes: infra/besper_site_serversite/storage/ ├── css/ │ ├── global.css ← Base styles for ALL pages │ └── [34 page directories]/styles.css └── html/ └── [34 page directories]/template.html # Served via endpoints: GET /api/besper-site/template?page_id={id} GET /api/besper-site/styles?page_id={id} ``` **APIM Integration** (automatic routing): ``` PowerPages → APIM → Function App → Local Storage ↓ /api/besper-site/template → decorated_function_logic/get_page_template.py /api/besper-site/styles → decorated_function_logic/get_page_styles.py ``` ### NPM Package Deployment **Build & Publish Process:** ```bash # Build for specific environment and branch: cd infra/npm_site npm run build:dev # Development build npm run build:int # Integration build npm run build:prod # Production build # Publishes to: # https://unpkg.com/besper-frontend-site-{env}-{branch}@latest/dist/bespersite.js ``` **PowerPages References:** ```html <!-- Development --> <script src="https://unpkg.com/besper-frontend-site-dev-main@latest/dist/bespersite.js"></script> <!-- Integration --> <script src="https://unpkg.com/besper-frontend-site-int-main@latest/dist/bespersite.js"></script> <!-- Production --> <script src="https://unpkg.com/besper-frontend-site-prod-main@latest/dist/bespersite.js"></script> ``` ## Enterprise Benefits Summary **🚀 PERFORMANCE:** - Function app memory serving for immediate UI rendering (< 200ms) - Combined CSS responses reduce HTTP requests from 2 to 1 - Parallel template + JavaScript loading with skeleton states - 24-hour CSS caching with 1-hour template caching **💰 COST OPTIMIZATION:** - Single deployment pipeline for all 34 pages - No separate Azure Storage accounts needed - Function app local storage eliminates bandwidth costs - Reduced PowerPages template complexity (90% reduction) **🔧 MAINTAINABILITY:** - Clear separation: HTML/CSS (function app) ↔ JavaScript (npm package) - Global CSS foundation provides consistency across all pages - 1:1 developer mapping between server assets and client logic - Comprehensive documentation with complete page relationships **🔒 RELIABILITY:** - Single deployment eliminates synchronization issues across 34 pages - Graceful fallbacks for missing templates or styles - Bulletproof URL auto-detection with intelligent mapping - Enterprise-grade error handling and recovery mechanisms **👨‍💻 DEVELOPER EXPERIENCE:** - 6-line PowerPages integration with URL auto-detection - Automatic environment and branch detection - Professional loading states and skeleton interfaces - Complete lifecycle documentation and testing guides This architecture successfully balances all requirements for fast, safe, and reliable operation at enterprise scale. ## Usage Examples ### 1. Chat Widget (Enhanced) ```javascript // Initialize with professional options const widget = await bsp_init_b_esperbot('your-bot-id', { environment: 'prod', position: 'bottom-right', theme: 'auto', // light, dark, or auto }); // Access widget API widget.show(); widget.hide(); widget.destroy(); ``` ### 2. B-esper Bot Management (Professional Interface) ```javascript // Initialize professional management interface const management = await bsp_manage_b_esperbot( { botId: 'your-bot-id', managementId: 'your-management-id', managementSecret: 'your-management-secret', }, { environment: 'prod', theme: 'light', } ); // Professional API access management.switchTab('knowledge'); management.loadAnalytics(); management.exportConfiguration(); management.destroy(); ``` ### 3. Demo Interface (Enhanced) ```javascript // Initialize with enhanced demo capabilities const demo = await bsp_demo_b_esperbot('your-bot-id', { environment: 'prod', showKnowledgePanel: true, autoHideOnMobile: true, }); ``` ## WordPress Plugin Integration ### Ready for Professional Integration ```javascript // WordPress plugin example (function ($) { 'use strict'; $(document).ready(function () { // Initialize B-esper management in WordPress admin if (window.besperConfig) { bsp_manage_b_esperbot(window.besperConfig.credentials, { environment: window.besperConfig.environment, container: '#besper-admin-container', }); } // Initialize chat widget on frontend if (window.besperWidgetConfig) { bsp_init_b_esperbot(window.besperWidgetConfig.botId, { environment: window.besperWidgetConfig.environment, position: window.besperWidgetConfig.position, }); } }); })(jQuery); ``` ## Professional Development ### Build Commands ```bash npm run clean # Clean dist directory npm run build:dev # Development build npm run build:int # Integration build npm run build:prod # Production build npm run build # Build all environments ``` ### Code Quality ```bash npm run lint # ESLint checking npm run format # Prettier formatting npm run validate # Complete validation npm test # Jest testing ``` ### Professional Standards - **Code Style**: ESLint + Prettier configuration - **Type Safety**: TypeScript definitions for all APIs - **Testing**: Jest test framework ready - **Documentation**: Comprehensive JSDoc comments - **Accessibility**: WCAG 2.1 AA compliance ready ## Configuration Schema ### Professional Bot Configuration ```typescript interface BotConfiguration { name: string; bot_title: string; styling: { primary_color: string; secondary_color: string; user_message_color: string; bot_message_color: string; font_family: string; }; welcome_messages: { [language: string]: string }; data_policy_url: string; ai_settings: { system_instructions: string; }; features: { analytics: boolean; file_upload: boolean; web_search: boolean; multi_language: boolean; }; } ``` ## Framework Integration Examples ### React Integration ```typescript import { useEffect, useState } from 'react'; import { bsp_manage_b_esperbot, BesperBotManagement } from 'besper-frontend-toolkit'; const BotManagement: React.FC = () => { const [management, setManagement] = useState<BesperBotManagement | null>(null); useEffect(() => { const initManagement = async () => { const mgmt = await bsp_manage_b_esperbot(credentials, options); setManagement(mgmt); }; initManagement(); return () => { management?.destroy(); }; }, []); return <div id="besper-management-container" />; }; ``` ### Vue Integration ```vue <template> <div id="besper-management-container" /> </template> <script> import { bsp_manage_b_esperbot } from 'besper-frontend-toolkit'; export default { name: 'BotManagement', async mounted() { this.management = await bsp_manage_b_esperbot( this.credentials, this.options ); }, beforeUnmount() { this.management?.destroy(); }, }; </script> ``` ### Angular Integration ```typescript import { Component, OnInit, OnDestroy } from '@angular/core'; import { bsp_manage_b_esperbot, BesperBotManagement, } from 'besper-frontend-toolkit'; @Component({ selector: 'app-bot-management', template: '<div id="besper-management-container"></div>', }) export class BotManagementComponent implements OnInit, OnDestroy { private management: BesperBotManagement | null = null; async ngOnInit() { this.management = await bsp_manage_b_esperbot(credentials, options); } ngOnDestroy() { this.management?.destroy(); } } ``` ## Future Enhancements Ready The professional architecture supports: - **Advanced Analytics**: Timeline graphs with usage metadata - **Multi-language Support**: Internationalization system - **Theme System**: Custom themes and branding - **Plugin Architecture**: Extensible plugin system - **Advanced Knowledge Management**: File analysis and insights - **Real-time Collaboration**: Multi-user management - **API Documentation**: Auto-generated API docs - **E2E Testing**: Playwright test automation ## Migration Guide ### From Previous Version 1. **No Breaking Changes**: Existing `bsp_init_b_esperbot` remains unchanged 2. **Enhanced Types**: New TypeScript definitions available 3. **Professional Management**: Use new `bsp_manage_b_esperbot` function 4. **Improved Styling**: SCSS architecture for customization ## BSP Logger System ### Overview The BSP Logger is a comprehensive debugging and network monitoring tool integrated into the npm site package. It provides dual-mode functionality for traditional logging and advanced network trace analysis. ### Features #### Traditional Logging - **Real-time log capture**: Intercepts console methods and displays formatted logs - **Log filtering**: Filter by log levels (All, Log, Info, Warning, Error) - **Error tracking**: Automatic error capture and stack trace display - **Performance monitoring**: Page load times and user interaction tracking #### Network Tracing - **Request interception**: Monitors all XHR and Fetch requests - **Timing analysis**: Displays response times and transfer sizes - **Status tracking**: HTTP status codes and error detection - **Waterfall visualization**: Visual timing charts for request analysis ### Usage #### PowerPages Integration ```html <!-- BSP Logger WebTemplate Integration --> <div id="bsp-logger-container"></div> <script src="https://unpkg.com/besper-frontend-site-dev-0926@latest/dist/bespersite.js"></script> <script> initBspLogger({ language: '{{ website.selected_language.code }}', }); </script> ``` #### Manual Integration ```javascript // Import and initialize the logger import { initBspLogger } from 'besper-frontend-site'; // Initialize with language preference initBspLogger({ language: 'en', // or 'de' for German }); ``` ### Configuration Options ```javascript initBspLogger({ language: 'en', // Language for UI (en/de) showOnLoad: true, // Show logger on page load position: 'bottom-right', // Logger position enableNetworkTracing: true, // Enable network monitoring maxLogEntries: 1000, // Maximum log entries to keep autoCapture: { console: true, // Capture console logs errors: true, // Capture JavaScript errors network: true, // Capture network requests performance: true, // Capture performance metrics }, }); ``` ### Network Trace Features #### Request Monitoring - **HTTP Methods**: GET, POST, PUT, DELETE, PATCH tracking - **Response Analysis**: Status codes, response times, transfer sizes - **Error Detection**: Failed requests and CORS errors - **Request Types**: Distinguishes between XHR and Fetch requests #### Visual Interface - **Toggle Button**: Switch between logs and network traces views - **Grid Layout**: DevTools-style request listing - **Timing Charts**: Visual waterfall representation - **Status Indicators**: Color-coded status and error highlighting #### Data Export - **Copy Functionality**: Export network traces to clipboard - **CSV Format**: Structured data for analysis tools - **JSON Export**: Complete request/response data - **Performance Reports**: Timing analysis summaries ### Internationalization The logger supports multiple languages with complete UI translations: ```javascript // English translations const translations = { en: { title: 'BSP Logger', clear: 'Clear', copy: 'Copy All', logs: 'Logs', networkTraces: 'Network Traces', method: 'Method', url: 'URL', status: 'Status', duration: 'Duration', size: 'Size', }, de: { title: 'BSP Logger', clear: 'Löschen', copy: 'Alle kopieren', logs: 'Protokolle', networkTraces: 'Netzwerk-Traces', method: 'Methode', url: 'URL', status: 'Status', duration: 'Dauer', size: 'Größe', }, }; ``` ### Development Integration #### Debugging Workflow 1. **Initialize Logger**: Add to your PowerPages template 2. **Monitor Requests**: Use network traces to identify CORS/API issues 3. **Performance Analysis**: Check request timing and bottlenecks 4. **Error Tracking**: Monitor JavaScript errors and stack traces 5. **Export Data**: Copy logs/traces for external analysis #### CORS Troubleshooting The logger is particularly useful for debugging CORS issues: ```javascript // Network trace will show: // - Preflight requests (OPTIONS) // - CORS error responses // - Failed requests with detailed status // - Response headers analysis ``` ### Skeleton Loading System The logger integrates with the site's skeleton loading system: #### Layout Management - **Template Structure**: Skeleton layout defined in page templates - **CSS Styling**: Centralized skeleton animations in global CSS - **Smooth Transitions**: Elements transition from skeleton to loaded state - **Staggered Animation**: 50ms stagger effect for polished experience #### Implementation ```css /* Global skeleton styling */ .skeleton-loading { background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; animation: loading 1.5s infinite; } @keyframes loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } ``` ### Build Requirements #### Environment Variables ```bash # Required for npm package build API_ENDPOINT=https://apimdev0926public.azure-api.net # Build process npm run build:env # Build with API endpoint npm run validate # Complete validation (lint + format + test) npm run test # Run Jest tests ``` #### Code Quality Standards - **ESLint**: No unused variables (prefix with `_` for intentionally unused) - **Prettier**: Consistent code formatting - **Object Shorthand**: Use ES6 shorthand properties - **TypeScript**: Type definitions for all APIs ### API Integration The logger integrates with APIM services for enhanced functionality: #### APIM Configuration ```javascript // Automatic endpoint detection const apiEndpoint = process.env.API_ENDPOINT || 'https://apimdev0926public.azure-api.net'; // CORS configuration matches working bot operations const corsConfig = { origin: origin => (string.IsNullOrEmpty(origin) ? '*' : origin), credentials: true, optionsSuccessStatus: 200, }; ``` ## Support & Documentation - **API Reference**: Complete TypeScript definitions - **Component Documentation**: JSDoc comments throughout - **Integration Examples**: React, Vue, Angular examples - **WordPress Integration**: Ready-to-use plugin templates - **Professional Support**: Enterprise-ready architecture - **BSP Logger Guide**: Comprehensive debugging and monitoring documentation