feat(ui): sayım ekranı, tüketim analizi ve sayım hatırlatmaları
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -37,7 +37,7 @@ import {
|
||||
} from "@/components/ui/dropdown-menu";
|
||||
import { tr } from "@/i18n/tr";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { formatStock } from "@/shared/stock";
|
||||
import { formatStock, roundForDisplay } from "@/shared/stock";
|
||||
import { deleteStockMovementAction, setProductTypeArchivedAction } from "../actions";
|
||||
import type { ProductTypeDetail, StockMovementRow, StockOption } from "../service";
|
||||
import {
|
||||
@@ -46,7 +46,14 @@ import {
|
||||
StockMovementDialog,
|
||||
type MovementKindInput,
|
||||
} from "./stock-dialogs";
|
||||
import { ExpiryBadge, LevelBadge, QuickConsumeButton, StockBar, ymdLabel } from "./stock-view";
|
||||
import {
|
||||
ExpiryBadge,
|
||||
LevelBadge,
|
||||
QuickConsumeButton,
|
||||
StockBar,
|
||||
suggestionReasons,
|
||||
ymdLabel,
|
||||
} from "./stock-view";
|
||||
|
||||
const t = tr.stock;
|
||||
|
||||
@@ -156,6 +163,53 @@ export function ProductDetailView({
|
||||
<Stat label={t.detail.suggested}>{q(data.suggestedQuantity)}</Stat>
|
||||
</div>
|
||||
<StockBar item={data} />
|
||||
{suggestionReasons(data).length ? (
|
||||
<p
|
||||
className={cn(
|
||||
"text-xs",
|
||||
data.suggestion.waste
|
||||
? "text-amber-700 dark:text-amber-400"
|
||||
: "text-muted-foreground",
|
||||
)}
|
||||
>
|
||||
{suggestionReasons(data).join(" ")}
|
||||
</p>
|
||||
) : null}
|
||||
<div className="grid grid-cols-1 gap-3 border-t pt-3 sm:grid-cols-2">
|
||||
<Stat label={t.detail.usage}>
|
||||
{data.suggestion.usage ? (
|
||||
t.detail.perWeek(q(roundForDisplay(data.suggestion.usage.perDay * 7)))
|
||||
) : (
|
||||
<span className="font-normal text-muted-foreground">{t.detail.noUsage}</span>
|
||||
)}
|
||||
</Stat>
|
||||
<Stat label={t.detail.countSchedule}>
|
||||
{data.count ? (
|
||||
<span className="flex flex-wrap items-center gap-x-2">
|
||||
<span>{t.detail.countEvery(data.count.everyDays)}</span>
|
||||
<span
|
||||
className={cn(
|
||||
"text-xs font-normal",
|
||||
data.count.due
|
||||
? "text-amber-700 dark:text-amber-400"
|
||||
: "text-muted-foreground",
|
||||
)}
|
||||
>
|
||||
{data.count.due
|
||||
? tr.stock.count.dueBadge(data.count.overdueDays)
|
||||
: t.detail.nextCount(ymdLabel(data.count.nextDate))}
|
||||
{data.count.lastDate
|
||||
? ` · ${tr.stock.count.lastCount(ymdLabel(data.count.lastDate))}`
|
||||
: ""}
|
||||
</span>
|
||||
</span>
|
||||
) : (
|
||||
<span className="font-normal text-muted-foreground">
|
||||
{t.detail.noCountSchedule}
|
||||
</span>
|
||||
)}
|
||||
</Stat>
|
||||
</div>
|
||||
{data.location ? (
|
||||
<p className="text-sm">
|
||||
<span className="text-muted-foreground">{t.detail.location}:</span> {data.location}
|
||||
|
||||
Reference in New Issue
Block a user