fix(spool): Add remaining_weight filter for low stock detection
Some checks failed
CI / style (push) Has been cancelled
CI / build-client (push) Has been cancelled
CI / build-amd64 (push) Has been cancelled
CI / build-tester (push) Has been cancelled
CI / test (cockroachdb) (push) Has been cancelled
CI / test (mariadb) (push) Has been cancelled
CI / test (postgres) (push) Has been cancelled
CI / test (sqlite) (push) Has been cancelled
CI / build-arm64 (push) Has been cancelled
CI / build-armv7 (push) Has been cancelled
CI / publish-images (push) Has been cancelled
CI / publish-release (push) Has been cancelled
Some checks failed
CI / style (push) Has been cancelled
CI / build-client (push) Has been cancelled
CI / build-amd64 (push) Has been cancelled
CI / build-tester (push) Has been cancelled
CI / test (cockroachdb) (push) Has been cancelled
CI / test (mariadb) (push) Has been cancelled
CI / test (postgres) (push) Has been cancelled
CI / test (sqlite) (push) Has been cancelled
CI / build-arm64 (push) Has been cancelled
CI / build-armv7 (push) Has been cancelled
CI / publish-images (push) Has been cancelled
CI / publish-release (push) Has been cancelled
- Add remaining_weight_lt and remaining_weight_gt filter params to spool API - Filter uses computed formula: initial_weight - used_weight (falls back to filament.weight) - Update home page to use queryParams instead of Refine filters - Fixes low stock badge count on dashboard Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -60,20 +60,14 @@ export const Home: React.FC<IResourceComponentsProps> = () => {
|
|||||||
).length;
|
).length;
|
||||||
}, [spoolsResult?.data]);
|
}, [spoolsResult?.data]);
|
||||||
|
|
||||||
// For accurate low stock count, we need all spools
|
// For accurate low stock count, we need all spools with remaining_weight < threshold
|
||||||
const { result: lowStockResult } = useList<ISpool>({
|
const { result: lowStockResult } = useList<ISpool>({
|
||||||
resource: "spool",
|
resource: "spool",
|
||||||
pagination: { pageSize: 1000 },
|
pagination: { pageSize: 1000 },
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
field: "remaining_weight",
|
|
||||||
operator: "lt",
|
|
||||||
value: LOW_STOCK_THRESHOLD,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
meta: {
|
meta: {
|
||||||
queryParams: {
|
queryParams: {
|
||||||
allow_archived: false,
|
allow_archived: false,
|
||||||
|
remaining_weight_lt: LOW_STOCK_THRESHOLD,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -268,6 +268,20 @@ async def find(
|
|||||||
Optional[bool],
|
Optional[bool],
|
||||||
Query(title="Needs Weighing", description="Filter by spools that need manual weigh-in."),
|
Query(title="Needs Weighing", description="Filter by spools that need manual weigh-in."),
|
||||||
] = None,
|
] = None,
|
||||||
|
remaining_weight_lt: Annotated[
|
||||||
|
Optional[float],
|
||||||
|
Query(
|
||||||
|
title="Remaining Weight Less Than",
|
||||||
|
description="Filter by spools with remaining weight (in grams) less than this value.",
|
||||||
|
),
|
||||||
|
] = None,
|
||||||
|
remaining_weight_gt: Annotated[
|
||||||
|
Optional[float],
|
||||||
|
Query(
|
||||||
|
title="Remaining Weight Greater Than",
|
||||||
|
description="Filter by spools with remaining weight (in grams) greater than this value.",
|
||||||
|
),
|
||||||
|
] = None,
|
||||||
sort: Annotated[
|
sort: Annotated[
|
||||||
Optional[str],
|
Optional[str],
|
||||||
Query(
|
Query(
|
||||||
@@ -313,6 +327,8 @@ async def find(
|
|||||||
lot_nr=lot_nr,
|
lot_nr=lot_nr,
|
||||||
allow_archived=allow_archived,
|
allow_archived=allow_archived,
|
||||||
needs_weighing=needs_weighing,
|
needs_weighing=needs_weighing,
|
||||||
|
remaining_weight_lt=remaining_weight_lt,
|
||||||
|
remaining_weight_gt=remaining_weight_gt,
|
||||||
sort_by=sort_by,
|
sort_by=sort_by,
|
||||||
limit=limit,
|
limit=limit,
|
||||||
offset=offset,
|
offset=offset,
|
||||||
|
|||||||
@@ -124,6 +124,8 @@ async def find( # noqa: C901, PLR0912
|
|||||||
lot_nr: Optional[str] = None,
|
lot_nr: Optional[str] = None,
|
||||||
allow_archived: bool = False,
|
allow_archived: bool = False,
|
||||||
needs_weighing: Optional[bool] = None,
|
needs_weighing: Optional[bool] = None,
|
||||||
|
remaining_weight_lt: Optional[float] = None,
|
||||||
|
remaining_weight_gt: Optional[float] = None,
|
||||||
sort_by: Optional[dict[str, SortOrder]] = None,
|
sort_by: Optional[dict[str, SortOrder]] = None,
|
||||||
limit: Optional[int] = None,
|
limit: Optional[int] = None,
|
||||||
offset: int = 0,
|
offset: int = 0,
|
||||||
@@ -170,6 +172,13 @@ async def find( # noqa: C901, PLR0912
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Filter by remaining_weight (computed as initial_weight - used_weight, falling back to filament.weight)
|
||||||
|
remaining_weight_expr = coalesce(models.Spool.initial_weight, models.Filament.weight) - models.Spool.used_weight
|
||||||
|
if remaining_weight_lt is not None:
|
||||||
|
stmt = stmt.where(remaining_weight_expr < remaining_weight_lt)
|
||||||
|
if remaining_weight_gt is not None:
|
||||||
|
stmt = stmt.where(remaining_weight_expr > remaining_weight_gt)
|
||||||
|
|
||||||
total_count = None
|
total_count = None
|
||||||
|
|
||||||
if limit is not None:
|
if limit is not None:
|
||||||
|
|||||||
Reference in New Issue
Block a user