From 2ce971537cddf578307f66d2aa1960d3b8929e57 Mon Sep 17 00:00:00 2001 From: fhasse95 <49185957+fhasse95@users.noreply.github.com> Date: Thu, 12 Mar 2026 19:37:39 +0100 Subject: [PATCH 1/2] Added support for Date Picker Ranges in Skip Lite --- README.md | 2 +- .../SkipUI/SkipUI/Controls/DatePicker.swift | 35 +++++++++++++------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 28e6ebdb..6a39ec19 100644 --- a/README.md +++ b/README.md @@ -721,8 +721,8 @@ Support levels: DatePicker (example) diff --git a/Sources/SkipUI/SkipUI/Controls/DatePicker.swift b/Sources/SkipUI/SkipUI/Controls/DatePicker.swift index a62d1380..699837ff 100644 --- a/Sources/SkipUI/SkipUI/Controls/DatePicker.swift +++ b/Sources/SkipUI/SkipUI/Controls/DatePicker.swift @@ -46,8 +46,10 @@ public struct DatePicker : View, Renderable { public init(selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View) { self.selection = selection self.label = ComposeBuilder.from(label) + self.minDate = nil self.maxDate = nil + if displayedComponents.contains(.date) { dateFormatter = DateFormatter() dateFormatter?.dateStyle = .medium @@ -64,18 +66,18 @@ public struct DatePicker : View, Renderable { } } - // SKIP @bridge - public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedDisplayedComponents: Int, bridgedLabel: any View) { - self.init(selection: Binding(get: getSelection, set: setSelection), displayedComponents: DatePickerComponents(rawValue: bridgedDisplayedComponents), label: { bridgedLabel }) - } + public init(selection: Binding, in range: ClosedRange, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View) { + self.selection = selection + self.label = ComposeBuilder.from(label) + + #if SKIP + self.minDate = range.start + self.maxDate = range.endInclusive + #else + self.minDate = range.lowerBound + self.maxDate = range.upperBound + #endif - // SKIP @bridge - public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedMinDate: Date, bridgedMaxDate: Date, bridgedDisplayedComponents: Int, bridgedLabel: any View) { - self.selection = Binding(get: getSelection, set: setSelection) - self.label = ComposeBuilder.from({ bridgedLabel }) - self.minDate = bridgedMinDate - self.maxDate = bridgedMaxDate - let displayedComponents = DatePickerComponents(rawValue: bridgedDisplayedComponents) if displayedComponents.contains(.date) { dateFormatter = DateFormatter() dateFormatter?.dateStyle = .medium @@ -92,6 +94,17 @@ public struct DatePicker : View, Renderable { } } + // SKIP @bridge + public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedDisplayedComponents: Int, bridgedLabel: any View) { + self.init(selection: Binding(get: getSelection, set: setSelection), displayedComponents: DatePickerComponents(rawValue: bridgedDisplayedComponents), label: { bridgedLabel }) + } + + // SKIP @bridge + public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedMinDate: Date, bridgedMaxDate: Date, bridgedDisplayedComponents: Int, bridgedLabel: any View) { + self.init(selection: Binding(get: getSelection, set: setSelection), in: bridgedMinDate...bridgedMaxDate, displayedComponents: DatePickerComponents(rawValue: bridgedDisplayedComponents), label: { bridgedLabel } + ) + } + public init(_ titleKey: LocalizedStringKey, selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) { self.init(selection: selection, displayedComponents: displayedComponents, label: { Text(titleKey) }) } From ea5c990bfda0a9f7fd1e9b00ebf448ff21cea4f9 Mon Sep 17 00:00:00 2001 From: fhasse95 <49185957+fhasse95@users.noreply.github.com> Date: Thu, 12 Mar 2026 20:12:45 +0100 Subject: [PATCH 2/2] Update DatePicker.swift --- Sources/SkipUI/SkipUI/Controls/DatePicker.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Sources/SkipUI/SkipUI/Controls/DatePicker.swift b/Sources/SkipUI/SkipUI/Controls/DatePicker.swift index 699837ff..df81d90a 100644 --- a/Sources/SkipUI/SkipUI/Controls/DatePicker.swift +++ b/Sources/SkipUI/SkipUI/Controls/DatePicker.swift @@ -117,6 +117,18 @@ public struct DatePicker : View, Renderable { self.init(selection: selection, displayedComponents: displayedComponents, label: { Text(verbatim: title) }) } + public init(_ titleKey: LocalizedStringKey, in range: ClosedRange, selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) { + self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(titleKey) }) + } + + public init(_ titleResource: LocalizedStringResource, in range: ClosedRange, selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) { + self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(titleResource) }) + } + + public init(_ title: String, selection: Binding, in range: ClosedRange, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) { + self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(verbatim: title) }) + } + #if SKIP @Composable override func Render(context: ComposeContext) { let contentContext = context.content()