inventorySearch.ts 1.0 KB

1234567891011121314151617181920212223242526
  1. import type { InventorySpool } from '../api/client';
  2. /**
  3. * Return true when spool matches the search query across all searchable text fields.
  4. * Case-insensitive. Empty query always returns true.
  5. */
  6. export function spoolMatchesQuery(spool: InventorySpool, query: string): boolean {
  7. if (!query) return true;
  8. const q = query.toLowerCase();
  9. return (
  10. String(spool.id).includes(q) ||
  11. spool.material.toLowerCase().includes(q) ||
  12. (spool.brand?.toLowerCase().includes(q) ?? false) ||
  13. (spool.color_name?.toLowerCase().includes(q) ?? false) ||
  14. (spool.subtype?.toLowerCase().includes(q) ?? false) ||
  15. (spool.note?.toLowerCase().includes(q) ?? false) ||
  16. (spool.slicer_filament_name?.toLowerCase().includes(q) ?? false) ||
  17. (spool.storage_location?.toLowerCase().includes(q) ?? false)
  18. );
  19. }
  20. /** Filter a spool list by a free-text search query. */
  21. export function filterSpoolsByQuery(spools: InventorySpool[], query: string): InventorySpool[] {
  22. if (!query) return spools;
  23. return spools.filter((spool) => spoolMatchesQuery(spool, query));
  24. }