catalog search/sort, edit-page characteristics, preferred vendor per article
This commit is contained in:
@@ -72,6 +72,12 @@ export default function AusruestungsanfrageZuBestellung() {
|
||||
queryFn: () => bestellungApi.getVendors(),
|
||||
});
|
||||
|
||||
const { data: catalogItems = [] } = useQuery({
|
||||
queryKey: ['ausruestungsanfrage', 'items-for-edit'],
|
||||
queryFn: () => ausruestungsanfrageApi.getItems({ aktiv: true }),
|
||||
staleTime: 5 * 60 * 1000,
|
||||
});
|
||||
|
||||
const anfrage = detail?.anfrage;
|
||||
const positionen: AusruestungAnfragePosition[] = detail?.positionen ?? [];
|
||||
|
||||
@@ -88,6 +94,27 @@ export default function AusruestungsanfrageZuBestellung() {
|
||||
// Track which position triggered the new-vendor dialog
|
||||
const [newVendorTargetPosId, setNewVendorTargetPosId] = useState<number | null>(null);
|
||||
|
||||
// ── Pre-populate vendor assignments from catalog items' preferred vendor ──
|
||||
useEffect(() => {
|
||||
if (positionen.length === 0 || catalogItems.length === 0 || vendors.length === 0) return;
|
||||
setAssignments(prev => {
|
||||
const next = { ...prev };
|
||||
let changed = false;
|
||||
positionen.forEach(pos => {
|
||||
// Don't overwrite existing manual assignments
|
||||
if (next[pos.id] != null) return;
|
||||
if (!pos.artikel_id) return;
|
||||
const artikel = catalogItems.find(a => a.id === pos.artikel_id);
|
||||
if (!artikel?.bevorzugter_lieferant_id) return;
|
||||
const vendor = vendors.find(v => v.id === artikel.bevorzugter_lieferant_id);
|
||||
if (!vendor) return;
|
||||
next[pos.id] = { lieferantId: vendor.id, lieferantName: vendor.name };
|
||||
changed = true;
|
||||
});
|
||||
return changed ? next : prev;
|
||||
});
|
||||
}, [positionen, catalogItems, vendors]);
|
||||
|
||||
// ── Derived: vendor groups ──
|
||||
const vendorGroups: VendorGroup[] = useMemo(() => {
|
||||
const map = new Map<number, VendorGroup>();
|
||||
|
||||
Reference in New Issue
Block a user