From d5278fa8492403ddbc094bc5829e425b58cdcd4e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 7 Oct 2026 00:01:26 +0000 Subject: [PATCH] Sicurezza: niente force unwrap in palette, campi personalizzati e Gantt (#63) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RzjvxG964sdA51yryw1WH5 --- CalenTask/DesignSystem/DSPalette.swift | 2 +- CalenTask/Features/Fields/CustomFieldValueRow.swift | 2 +- CalenTask/Features/Projects/Views/ProjectGanttView.swift | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CalenTask/DesignSystem/DSPalette.swift b/CalenTask/DesignSystem/DSPalette.swift index 4156a60..1323875 100644 --- a/CalenTask/DesignSystem/DSPalette.swift +++ b/CalenTask/DesignSystem/DSPalette.swift @@ -24,7 +24,7 @@ enum DSPalette { Swatch(name: "Ardesia", hex: "#64748B"), ] - static var randomHex: String { swatches.randomElement()!.hex } + static var randomHex: String { swatches.randomElement()?.hex ?? "#3E63DD" } } /// Griglia di scelta colore riusabile (spazi, progetti): swatch tondi, diff --git a/CalenTask/Features/Fields/CustomFieldValueRow.swift b/CalenTask/Features/Fields/CustomFieldValueRow.swift index 742f5de..b930462 100644 --- a/CalenTask/Features/Fields/CustomFieldValueRow.swift +++ b/CalenTask/Features/Fields/CustomFieldValueRow.swift @@ -90,7 +90,7 @@ struct CustomFieldValueRow: View { } } } label: { - Text(value?.valueRaw.isEmpty == false ? value!.valueRaw : "Scegli") + Text(value.flatMap { $0.valueRaw.isEmpty ? nil : $0.valueRaw } ?? "Scegli") .font(.dsMeta) .foregroundStyle(hasContent ? Color.indigo : Color.secondary) .padding(.horizontal, DS.s) diff --git a/CalenTask/Features/Projects/Views/ProjectGanttView.swift b/CalenTask/Features/Projects/Views/ProjectGanttView.swift index 8365630..d3b6bab 100644 --- a/CalenTask/Features/Projects/Views/ProjectGanttView.swift +++ b/CalenTask/Features/Projects/Views/ProjectGanttView.swift @@ -986,9 +986,11 @@ private struct GanttHeader: View { var bands: [MonthBand] = [] var offset = 0 while offset < days { - let day = calendar.date(byAdding: .day, value: offset, to: range.lowerBound)! - let monthEnd = calendar.dateInterval(of: .month, for: day)!.end - let remaining = calendar.dateComponents([.day], from: day, to: monthEnd).day ?? 1 + // Niente force unwrap: se il calendario non risolve la data si chiude + // con una banda di un giorno invece di andare in crash. + guard let day = calendar.date(byAdding: .day, value: offset, to: range.lowerBound) else { break } + let monthEnd = calendar.dateInterval(of: .month, for: day)?.end + let remaining = monthEnd.flatMap { calendar.dateComponents([.day], from: day, to: $0).day } ?? 1 let span = min(remaining, days - offset) bands.append(MonthBand( id: offset,