reglas: los avisos se calculan del plan actual, no de una marca guardada
Un plato aparecia en la lista de incumplimientos sin explicacion (captura del usuario: "Ensalada campera"): findViolations listaba los slots con isRuleOverridden, una marca puesta al asignar que quedaba obsoleta cuando el conflicto ya se habia resuelto. Y al reves, editar una regla despues de planificar no detectaba nada. - findViolations recorre el plan y reporta solo lo que incumple AHORA, siempre con sus razones (nunca una entrada vacia) - MealSlot.isRuleIgnored: "Ignorar" pasa a ser persistente, porque si no el aviso recalculado volveria enseguida; se resetea al cambiar o quitar el plato del hueco - El triangulo del calendario usa tambien el estado real - Campo en el payload KV (opcional, retrocompatible) y en el esquema CloudKit de Development - 3 tests: marca obsoleta no se lista, regla endurecida despues se detecta, y lo ignorado no reaparece Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013H6bXqGX1ygwib1Dm3n3UG
This commit is contained in:
@@ -201,6 +201,11 @@ struct WeekCalendarView: View {
|
||||
.cornerRadius(10)
|
||||
}
|
||||
|
||||
/// Slots breaking rules right now — the stored flag could be stale.
|
||||
private var violatingSlotIds: Set<UUID> {
|
||||
Set(AutocompleteEngine.findViolations(plan: plan, allDishes: dishes, allTags: tags).map(\.slotId))
|
||||
}
|
||||
|
||||
private func displayedSlot(day: Int, mealType: MealType) -> DisplaySlot? {
|
||||
let key = slotKey(day: day, mealType: mealType.rawValue)
|
||||
if let cached = displaySlotsByKey[key] {
|
||||
@@ -272,7 +277,7 @@ struct WeekCalendarView: View {
|
||||
dishDescription: dishData.descriptionText,
|
||||
tags: dishTags.map { (name: $0.localizedName(language: settings.languageEnum.resolved()), color: $0.color) },
|
||||
mealType: mealType,
|
||||
showsRuleWarning: slot.isRuleOverridden,
|
||||
showsRuleWarning: violatingSlotIds.contains(slot.slotId),
|
||||
photoData: settings.showDishPhotosInPlannerResolved ? dishData.photoData : nil,
|
||||
onRemove: viewModel.canEditCurrentWeek ? {
|
||||
guard let live = liveSlot(for: slot) else { return }
|
||||
|
||||
Reference in New Issue
Block a user