Soleprint Wrapper - Development Tools Sidebar
A collapsible sidebar that provides development and testing tools for any soleprint-managed room (like amar) without interfering with the managed application.
Features
👤 Quick Login
- Switch between test users with one click
- Pre-configured admin, vet, and tutor accounts
- Automatic JWT token management
- Shows currently logged-in user
🌍 Environment Info
- Display backend and frontend URLs
- Room name and deployment info
- Quick reference during development
⌨️ Keyboard Shortcuts
- Ctrl+Shift+P - Toggle sidebar
💾 State Persistence
- Sidebar remembers expanded/collapsed state
- Persists across page reloads
Files
wrapper/
├── index.html # Standalone demo
├── sidebar.css # Sidebar styling
├── sidebar.js # Sidebar logic
├── config.json # Configuration (users, URLs)
└── README.md # This file
Quick Start
Standalone Demo
Open index.html in your browser to see the sidebar in action:
cd core_room/wrapper
python3 -m http.server 8080
# Open http://localhost:8080
Click the toggle button on the right edge or press Ctrl+Shift+P.
Integration with Your App
Add these two lines to your HTML:
<link rel="stylesheet" href="/wrapper/sidebar.css">
<script src="/wrapper/sidebar.js"></script>
The sidebar will automatically:
- Load configuration from
/wrapper/config.json - Create the sidebar UI
- Setup keyboard shortcuts
- Check for existing logged-in users
Configuration
Edit config.json to customize:
{
"room_name": "amar",
"wrapper": {
"enabled": true,
"environment": {
"backend_url": "http://localhost:8000",
"frontend_url": "http://localhost:3000"
},
"users": [
{
"id": "admin",
"label": "Admin",
"username": "admin@test.com",
"password": "Amar2025!",
"icon": "👑",
"role": "ADMIN"
}
]
}
}
User Fields
- id: Unique identifier for the user
- label: Display name in the sidebar
- username: Login username (email)
- password: Login password
- icon: Emoji icon to display
- role: User role (ADMIN, VET, USER)
How It Works
Login Flow
- User clicks a user card in the sidebar
sidebar.jscallsPOST {backend_url}/api/token/with credentials- Backend returns JWT tokens:
{ access, refresh, details } - Tokens stored in localStorage
- Page reloads, user is now logged in
Token Storage
Tokens are stored in localStorage:
access_token- JWT access tokenrefresh_token- JWT refresh tokenuser_info- User metadata (username, label, role)
Logout Flow
- User clicks "Logout" button
- Tokens removed from localStorage
- Page reloads, user is logged out
Docker Integration
Approach 1: Static Files
Mount wrapper as static files in docker-compose:
services:
frontend:
volumes:
- ./ctrl/wrapper:/app/public/wrapper:ro
Then in your HTML:
<link rel="stylesheet" href="/wrapper/sidebar.css">
<script src="/wrapper/sidebar.js"></script>
Approach 2: Nginx Injection
Use nginx to inject the sidebar script automatically:
location / {
sub_filter '</head>' '<link rel="stylesheet" href="/wrapper/sidebar.css"><script src="/wrapper/sidebar.js"></script></head>';
sub_filter_once on;
proxy_pass http://frontend:3000;
}
location /wrapper/ {
alias /app/wrapper/;
}
Approach 3: Wrapper Service
Create a dedicated wrapper service:
services:
wrapper:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./ctrl/wrapper:/usr/share/nginx/html/wrapper
environment:
- MANAGED_APP_URL=http://frontend:3000
See ../WRAPPER_DESIGN.md for detailed Docker integration patterns.
Customization
Styling
Edit sidebar.css to customize appearance:
:root {
--sidebar-width: 320px;
--sidebar-bg: #1e1e1e;
--sidebar-text: #e0e0e0;
--sidebar-accent: #007acc;
}
Add New Panels
Add HTML to getSidebarHTML() in sidebar.js:
getSidebarHTML() {
return `
...existing panels...
<div class="panel">
<h3>🆕 My New Panel</h3>
<p>Custom content here</p>
</div>
`;
}
Add New Features
Extend the SoleprintSidebar class in sidebar.js:
class SoleprintSidebar {
async fetchJiraInfo() {
const response = await fetch('https://artery.mcrn.ar/jira/VET-123');
const data = await response.json();
// Update UI with data
}
}
API Requirements
The sidebar expects these endpoints from your backend:
POST /api/token/
Login endpoint that returns JWT tokens.
Request:
{
"username": "admin@test.com",
"password": "Amar2025!"
}
Response:
{
"access": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"details": {
"role": "ADMIN",
"id": 1,
"name": "Admin User"
}
}
Troubleshooting
Sidebar not appearing
- Check browser console for errors
- Verify
sidebar.jsandsidebar.cssare loaded - Check that
config.jsonis accessible
Login fails
- Verify backend URL in
config.json - Check backend is running
- Verify credentials are correct
- Check CORS settings on backend
Tokens not persisting
- Check localStorage is enabled
- Verify domain matches between sidebar and app
- Check browser privacy settings
Security Considerations
⚠️ Important: This sidebar is for development/testing only.
- Passwords are stored in plain text in
config.json - Do NOT use in production
- Do NOT commit real credentials to git
- Add
config.jsonto.gitignoreif it contains sensitive data
For production:
- Disable wrapper via
"enabled": falsein config - Use environment variables for URLs
- Remove or secure test user credentials
Future Enhancements
Planned features (see ../WRAPPER_DESIGN.md):
- 📋 Jira Info Panel - Fetch ticket details from artery
- 📊 Logs Viewer - Stream container logs
- 🎨 Theme Switcher - Light/dark mode
- 🔍 Search - Quick search across tools
- ⚙️ Settings - Customize sidebar behavior
- 📱 Mobile Support - Responsive design improvements
Related Documentation
../WRAPPER_DESIGN.md- Complete architecture design../../../soleprint/CLAUDE.md- Soleprint framework overview../../README.md- Core room documentation
Contributing
To add a new panel or feature:
- Add HTML in
getSidebarHTML() - Add styling in
sidebar.css - Add logic as methods on
SoleprintSidebarclass - Update this README with usage instructions
License
Part of the Soleprint development tools ecosystem.