- Use 'currentPage' instead of 'current' for pagination
- Remove explicit ISpool type on filter callback (inferred)
- Add type assertion for Table dataSource
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fix TypeScript errors by using { result, query } destructuring:
- result.data and result.total for list data
- query.isLoading for loading state
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>
3dfilamentprofiles.com has Vercel bot protection blocking automated requests.
Their GitHub repo only has sample data (~3 filaments).
SpoolmanDB already has 6,957+ filaments, making this unnecessary.
Removed:
- spoolman/externaldb.py: ExternalSource enum, Filament3DFP model, 3dfp sync
- client/src/utils/queryExternalDB.ts: ExternalSource enum, source field
- client/src/components/filamentImportModal.tsx: Source filter tabs
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>
- Fixed temp range display in show page and label templates
- Added prev/next navigation buttons to edit pages
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>
Features in this release:
- Clickable dashboard cards
- Theme color selector (orange, teal, red, green, blue)
- Temperature range fields in filament edit page
- QR code size setting
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>
Changes:
- Add 1400px max-width container in SpoolmanLayout
- Add 800px max-width for forms via CSS override
This prevents the UI from feeling too spread out on wide monitors
and MacBooks, improving readability and reducing eye movement.
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>
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Norwegian Bokmål)
Currently translated at 80.2% (231 of 288 strings)
Translated using Weblate (Norwegian Bokmål)
Currently translated at 78.1% (225 of 288 strings)
Translated using Weblate (Norwegian Bokmål)
Currently translated at 75.3% (217 of 288 strings)
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/nb_NO/
Translation: Spoolman/Web Client
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Romanian)
Currently translated at 100.0% (288 of 288 strings)
Co-authored-by: Cristian <opreacristiann@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ro/
Translation: Spoolman/Web Client
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)
Added translation using Weblate (Turkish)
Co-authored-by: Yücelen Gül <yuceleng@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/tr/
Translation: Spoolman/Web Client