Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -721,8 +721,8 @@ Support levels:
<summary><code>DatePicker</code> (<a href="https://skip.dev/docs/components/datepicker/">example</a>)</summary>
<ul>
<li><code>init(selection: Binding&lt;Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View)</code></li>
<li><code>init(selection: Binding&lt;Date>, in: ClosedRange&lt;Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View)</code></li>
<li><code>init(_ title: String, selection: Binding&lt;Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date])</code></li>
<li>Date range constraints (<code>in: ClosedRange&lt;Date></code>) are supported via Skip Fuse bridging</li>
</ul>
</details>
</td>
Expand Down
47 changes: 36 additions & 11 deletions Sources/SkipUI/SkipUI/Controls/DatePicker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,10 @@ public struct DatePicker : View, Renderable {
public init(selection: Binding<Date>, 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
Expand All @@ -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<Date>, in range: ClosedRange<Date>, 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
Expand All @@ -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<Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
self.init(selection: selection, displayedComponents: displayedComponents, label: { Text(titleKey) })
}
Expand All @@ -104,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<Date>, selection: Binding<Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(titleKey) })
}

public init(_ titleResource: LocalizedStringResource, in range: ClosedRange<Date>, selection: Binding<Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(titleResource) })
}

public init(_ title: String, selection: Binding<Date>, in range: ClosedRange<Date>, 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()
Expand Down
Loading