Add optional color column to spool list showing filament color swatches
with multi-select filtering capability.
Backend:
- GET /api/v1/color endpoint to list distinct filament colors
- filament.color_hex query param on spool list for filtering
Frontend:
- ColorFilterColumn component renders color swatches
- useSpoolmanColors() hook fetches available colors
- Filter dropdown shows swatches with hex codes
- Column hidden by default (enable via column selector)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Auth enabled state now stored in database setting (auth_enabled)
- Add POST /auth/toggle endpoint to enable/disable auth from UI
- Add auth toggle section to Settings > General page
- Enabling auth without users prompts to create first admin
- Disabling auth requires admin password confirmation
- Auth setting cached in memory and loaded on startup
Removes need for SPOOLMAN_AUTH_ENABLED env var
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend:
- Add User model with username, hashed password, role, is_active
- Add passlib[bcrypt] and python-jose[cryptography] dependencies
- Create auth.py with JWT utilities, password hashing, role checking
- Add /auth endpoints: status, setup, login, me, users CRUD
- Add role-based permission system (viewer/operator/editor/admin)
- Environment: SPOOLMAN_AUTH_ENABLED, SPOOLMAN_AUTH_SECRET_KEY
- Migration for user table
Frontend:
- Add AuthProvider context with login/logout/setup
- Add LoginPage component with setup mode for first user
- Add ProtectedRoute wrapper for auth-required pages
- Add axios interceptor to attach JWT token to requests
- Add User Management tab in Settings (admin only)
- Add translation keys for auth UI
When SPOOLMAN_AUTH_ENABLED=true:
- Users must login to access the app
- First visit shows setup page to create admin account
- Role-based access control for future endpoint protection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enhances SpoolIcon component with optional showHex prop:
- Displays hex color code next to swatch when enabled
- Click to copy hex code to clipboard
- Shows tooltip with copy hint
- Supports both single and multi-color filaments
Enabled on detail pages:
- Filament show page
- Spool show page
Added translation keys for copy feedback messages.
Closes#33
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds computed spool statistics to filament list:
- spool_count: Number of non-archived spools of this filament
- total_remaining_weight: Sum of remaining weight across all spools
Backend changes:
- Modified database/filament.py find() to compute stats via subquery
- Added fields to Filament pydantic model in api/v1/models.py
- Updated filament API endpoint to include stats in response
Frontend changes:
- Added fields to IFilament interface
- Added columns to filament list table
- Added translation keys
Closes#15
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replaces stat card layout with functional dashboard:
- Prominent spool count with "Add Spool" button
- Paginated list of all spools sorted by last used
- Low stock alert badge (< 100g threshold)
- Color swatch, name, material, and remaining weight columns
- Clickable rows navigate to spool detail
- Secondary stats for filaments and vendors
Closes#12
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create Print Queue page showing pending/completed/cancelled jobs
- Add needs_weighing filter to spool API for flagged spools
- Add IPrintJob interface and needs_weighing to ISpool model
- Add slicer_post_process.py for Elegoo/Orca Slicer integration
- Add translations for print queue feature
- Bump version to 0.23C.3
The workflow:
1. Slicer post-processing script creates pending print job
2. After print, user confirms (deducts filament) or cancels (flags for weighing)
3. Spools needing weigh-in are shown in Print Queue UI
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Filament, spool, and vendor edit pages now have Prev/Next buttons
- Navigate between items without returning to the list
- Buttons are disabled at the beginning/end of the list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Show page now displays temp ranges (min-max) instead of single values
- Fixed label template rendering to handle multiple tags in conditional blocks
- Added "not_set" translation key
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dashboard cards now link to list page when clicked (except + button)
- Added theme color selector in Settings (orange, teal, red, green, blue)
- Theme persists in localStorage
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend:
- New /api/v1/backup/export endpoint - exports all data as single JSON
- New /api/v1/backup/import endpoint - imports JSON with merge or replace
- Handles vendors, filaments, spools, adjustments, settings
- Remaps IDs to maintain relationships during import
Frontend:
- Added Backup & Restore section to Settings page
- Download Backup button for export
- Import with merge or replace options
- Warning confirmation for replace mode
This enables migrating between PostgreSQL and SQLite databases.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Backend: Added ExternalSource enum, Filament3DFP model, and transform function
- Backend: Updated _sync() to fetch from both SpoolmanDB and 3dfilamentprofiles
- Frontend: Added source tabs to FilamentImportModal (All/SpoolmanDB/3DFP)
- Frontend: Updated ExternalFilament interface with source and temp range fields
- Frontend: Updated filament import handler to use temp range fields
Also includes:
- Dev mode styling (teal theme, DEV badge and banner)
- Translation keys for source filtering
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Track history of all spool weight/length adjustments with timestamps and comments:
Backend:
- Add SpoolAdjustment database model with spool_id, timestamp, type, value, comment
- Add Alembic migration for spool_adjustment table
- Add SpoolAdjustment Pydantic model for API responses
- Update use_weight, use_length, and measure functions to record adjustments
- Add GET /api/v1/spool/{id}/adjustments endpoint for history retrieval
- Add optional comment parameter to use/measure endpoints
Frontend:
- Add ISpoolAdjustment interface to spool model
- Add collapsible adjustment history table to spool show page
- Display timestamp, type (weight/length), amount, and comment
- Add translation keys for history table
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Store extruder and bed temperatures as min/max ranges instead of
single values for more accurate filament specifications.
Backend changes:
- Add 4 new columns: settings_extruder_temp_min/max, settings_bed_temp_min/max
- Keep old columns for backward compatibility (marked deprecated)
- Alembic migration copies existing values to both min and max
- Update Pydantic models and API endpoints
Frontend changes:
- Filament model updated with new fields
- Create form uses min/max input pairs with Space.Compact
- Import from external DB populates both min and max with same value
- Label template updated to show ranges: "ET: 190-220 °C"
- Template help includes new tags
Labels now display temperature ranges like "190-220°C" which is more
useful for printing than a single recommended value.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Addresses https://github.com/Donkie/Spoolman/issues/671
Changes:
- Remove fixed 50% max-width constraint on QR code container
- Add qrCodePadding setting (0-10mm, default 2mm) for white space
- Add qrCodeMaxWidth setting (0-100%, 0 = auto/fit-content)
- Add UI controls (slider + input) for both new settings
- Settings are disabled when QR code is turned off
The previous behavior forced QR codes to 50% width when label text
was shown, wasting label space on small labels. New default uses
fit-content for optimal sizing while allowing manual control.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Auto-fill density when entering material type in filament forms:
- Add materialDefaults.ts with standard densities for common materials
(PLA, ABS, PETG, TPU, PC, etc.)
- Material field now uses AutoComplete with suggestions
- Density auto-fills on material select or blur (fuzzy matching)
- New filaments default to 1.75mm diameter and 1.24 g/cm³ (PLA)
- Applied to both full filament create page and quick create modal
Reduces tedious data entry for common materials while still allowing
custom values for specialty filaments.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When creating a spool, users can now create a new filament directly
from the filament dropdown without leaving the page. Similarly, when
creating a filament, users can create a new vendor inline.
New components:
- VendorCreateModal: Simple modal for quick vendor creation
- FilamentCreateModal: Modal with essential fields + nested vendor creation
Changes:
- Added dropdownRender to filament Select in spool create page
- Added dropdownRender to vendor Select in filament create page
- Added translation keys for success messages and placeholders
- Pre-fills sensible defaults (diameter 1.75mm, density 1.24 g/cm³)
Closes#1
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>