feat(wizard): support OR logic for requirements (at least one dependency satisfies requirements)
All checks were successful
Staging Build / build (push) Successful in 3m32s

This commit is contained in:
DanielS
2026-07-03 14:21:15 +02:00
parent 90ec351d96
commit 5c28fbdea5
2 changed files with 25 additions and 25 deletions

View File

@@ -55,7 +55,7 @@ function toggleModuleInList(
const beforeLength = next.length const beforeLength = next.length
next = next.filter(mId => { next = next.filter(mId => {
const m = modules.find(mod => mod.id === mId) const m = modules.find(mod => mod.id === mId)
return !m?.requirements || m.requirements.every(reqId => next.includes(reqId)) return !m?.requirements || m.requirements.length === 0 || m.requirements.some(reqId => next.includes(reqId))
}) })
changed = next.length !== beforeLength changed = next.length !== beforeLength
} }
@@ -69,7 +69,7 @@ function toggleModuleInList(
function isModuleDisabled(module: ProductModule, selectedModules: string[]): boolean { function isModuleDisabled(module: ProductModule, selectedModules: string[]): boolean {
const requirementsMet = !module.requirements?.length || const requirementsMet = !module.requirements?.length ||
module.requirements.every(reqId => selectedModules.includes(reqId)) module.requirements.some(reqId => selectedModules.includes(reqId))
const isExcluded = module.exclusions?.some(exId => selectedModules.includes(exId)) const isExcluded = module.exclusions?.some(exId => selectedModules.includes(exId))
return !requirementsMet || !!isExcluded return !requirementsMet || !!isExcluded
} }
@@ -237,12 +237,12 @@ export function OrderWizard({
// Requirements check // Requirements check
if (prod.requirements && prod.requirements.length > 0) { if (prod.requirements && prod.requirements.length > 0) {
const missing = prod.requirements.filter(reqId => !selectedProductIds.includes(reqId)) const hasMetRequirement = prod.requirements.some(reqId => selectedProductIds.includes(reqId))
if (missing.length > 0) { if (!hasMetRequirement) {
const names = missing const names = prod.requirements
.map(reqId => products.find(p => p.id === reqId)?.name || reqId) .map(reqId => products.find(p => p.id === reqId)?.name || reqId)
.join(', ') .join(' oder ')
errors.push(`"${prod.name}" benötigt das Produkt: ${names}`) errors.push(`"${prod.name}" benötigt mindestens eines dieser Produkte: ${names}`)
} }
} }
@@ -898,8 +898,8 @@ export function OrderWizard({
)} )}
{disabled && ( {disabled && (
<p className="text-[10px] text-destructive mt-1"> <p className="text-[10px] text-destructive mt-1">
{module.requirements?.some( {module.requirements?.length && !module.requirements.some(
reqId => !sel?.moduleIds.includes(reqId) reqId => sel?.moduleIds.includes(reqId)
) )
? 'Benötigt weitere Module' ? 'Benötigt weitere Module'
: 'Nicht kombinierbar mit aktueller Auswahl'} : 'Nicht kombinierbar mit aktueller Auswahl'}

View File

@@ -90,9 +90,9 @@ export async function submitOrder(params: {
} }
// Requirements check // Requirements check
if (mod.requirements && mod.requirements.length > 0) { if (mod.requirements && mod.requirements.length > 0) {
const missing = mod.requirements.filter(reqId => !sel.moduleIds.includes(reqId)) const hasMetRequirement = mod.requirements.some(reqId => sel.moduleIds.includes(reqId))
if (missing.length > 0) { if (!hasMetRequirement) {
throw new Error(`Das Modul "${mod.name}" setzt die Aktivierung anderer Module voraus.`) throw new Error(`Das Modul "${mod.name}" setzt die Aktivierung mindestens eines der folgenden Module voraus: ${mod.requirements.join(', ')}.`)
} }
} }
// Exclusions check // Exclusions check
@@ -117,12 +117,12 @@ export async function submitOrder(params: {
// Product requirements check // Product requirements check
if (prod.requirements && prod.requirements.length > 0) { if (prod.requirements && prod.requirements.length > 0) {
const missing = prod.requirements.filter(reqId => !selectedProductIds.includes(reqId)) const hasMetRequirement = prod.requirements.some(reqId => selectedProductIds.includes(reqId))
if (missing.length > 0) { if (!hasMetRequirement) {
const missingNames = missing const reqNames = prod.requirements
.map(reqId => dbProducts.find(p => p.id === reqId)?.name || reqId) .map(reqId => dbProducts.find(p => p.id === reqId)?.name || reqId)
.join(', ') .join(' oder ')
throw new Error(`Das Produkt "${prod.name}" erfordert die Auswahl von: ${missingNames}.`) throw new Error(`Das Produkt "${prod.name}" erfordert die Auswahl von mindestens einem dieser Produkte: ${reqNames}.`)
} }
} }
@@ -530,9 +530,9 @@ export async function updateOrder(
} }
// Requirements check // Requirements check
if (mod.requirements && mod.requirements.length > 0) { if (mod.requirements && mod.requirements.length > 0) {
const missing = mod.requirements.filter(reqId => !sel.moduleIds.includes(reqId)) const hasMetRequirement = mod.requirements.some(reqId => sel.moduleIds.includes(reqId))
if (missing.length > 0) { if (!hasMetRequirement) {
throw new Error(`Das Modul "${mod.name}" setzt die Aktivierung anderer Module voraus.`) throw new Error(`Das Modul "${mod.name}" setzt die Aktivierung mindestens eines der folgenden Module voraus: ${mod.requirements.join(', ')}.`)
} }
} }
// Exclusions check // Exclusions check
@@ -557,12 +557,12 @@ export async function updateOrder(
// Product requirements check // Product requirements check
if (prod.requirements && prod.requirements.length > 0) { if (prod.requirements && prod.requirements.length > 0) {
const missing = prod.requirements.filter(reqId => !selectedProductIds.includes(reqId)) const hasMetRequirement = prod.requirements.some(reqId => selectedProductIds.includes(reqId))
if (missing.length > 0) { if (!hasMetRequirement) {
const missingNames = missing const reqNames = prod.requirements
.map(reqId => dbProducts.find(p => p.id === reqId)?.name || reqId) .map(reqId => dbProducts.find(p => p.id === reqId)?.name || reqId)
.join(', ') .join(' oder ')
throw new Error(`Das Produkt "${prod.name}" erfordert die Auswahl von: ${missingNames}.`) throw new Error(`Das Produkt "${prod.name}" erfordert die Auswahl von mindestens einem dieser Produkte: ${reqNames}.`)
} }
} }