diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift index 9860cd5b..6ff950f6 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift @@ -22,18 +22,16 @@ import UIKit return calendar }() - public var dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateStyle = .medium - formatter.timeZone = NSTimeZone.system - formatter.locale = .current - formatter.formatterBehavior = .default - return formatter - }() + public var dateFormat: String? { + set { + guard let newValue = newValue else { return } + dateDropdownModel?.dateFormat = newValue + } + get { return dateDropdownModel?.dateFormat } + } - /// Update the property value to alter the format of how the date is presented. - public var dateFormat: String = "MMM d, y" { - didSet { dateFormatter.dateFormat = dateFormat } + public var dateDropdownModel: DateDropdownEntryFieldModel? { + return model as? DateDropdownEntryFieldModel } //-------------------------------------------------- @@ -96,10 +94,12 @@ import UIKit guard let date = date else { return } + dateDropdownModel?.date = date + if calendar.isDate(date, inSameDayAs: Date()) { text = MVMCoreUIUtility.hardcodedString(withKey: "textfield_today_string") } else { - text = dateFormatter.string(from: date) + text = dateDropdownModel?.dateFormatter.string(from: date) } } @@ -114,11 +114,35 @@ import UIKit setTextWith(date: datePicker?.date) } + //-------------------------------------------------- + // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) guard let model = model as? DateDropdownEntryFieldModel else { return } - dateFormat = model.dateFormat + if let date = model.date { + datePicker?.date = date + setTextWith(date: datePicker?.date) + } + + if let minDate = model.minDate { + datePicker?.minimumDate = minDate + } + + if let maxDate = model.maxDate { + datePicker?.maximumDate = maxDate + } + } + + public override func reset() { + super.reset() + + datePicker?.minimumDate = nil + datePicker?.maximumDate = nil + datePicker?.date = Date() + text = nil } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift index 96ec3488..0ac448a2 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift @@ -15,14 +15,33 @@ return "dateDropdownEntryField" } - public var dateFormat: String = "MMM d, y" + public var dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateStyle = .medium + formatter.timeZone = NSTimeZone.system + formatter.locale = .current + formatter.formatterBehavior = .default + return formatter + }() + + /// Update the property value to alter the format of how the date is presented. + public var dateFormat: String = "MMM d, y" { + didSet { dateFormatter.dateFormat = dateFormat } + } + + public var date: Date? + public var minDate: Date? + public var maxDate: Date? //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- private enum CodingKeys: String, CodingKey { + case date case dateFormat + case minDate + case maxDate } //-------------------------------------------------- @@ -35,6 +54,20 @@ if let dateFormat = try typeContainer.decodeIfPresent(String.self, forKey: .dateFormat) { self.dateFormat = dateFormat + dateFormatter.dateFormat = dateFormat + } + + if let date = try typeContainer.decodeIfPresent(String.self, forKey: .date) { + baseValue = date + self.date = dateFormatter.date(from: date) + } + + if let minDate = try typeContainer.decodeIfPresent(String.self, forKey: .minDate) { + self.minDate = dateFormatter.date(from: minDate) + } + + if let maxDate = try typeContainer.decodeIfPresent(String.self, forKey: .maxDate) { + self.maxDate = dateFormatter.date(from: maxDate) } } @@ -42,5 +75,17 @@ try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(dateFormat, forKey: .dateFormat) + + if let date = date { + try container.encode(dateFormatter.string(from: date), forKey: .date) + } + + if let minDate = minDate { + try container.encode(dateFormatter.string(from: minDate), forKey: .minDate) + } + + if let maxDate = maxDate { + try container.encode(dateFormatter.string(from: maxDate), forKey: .maxDate) + } } }