diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index 0986a092..dee7916b 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -29,17 +29,30 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol, } private var isEditting: Bool = false - + + //override for to deal with getting the + //old selectedItem to pass down to the observeDropdownChange + open override var selectId: Int? { + didSet { + guard let observeDropdownChange, let selectedItem else { return } + var oldSelectedItem: DropdownOptionModel? + if let oldValue { + oldSelectedItem = options[oldValue] + } + observeDropdownChange(oldSelectedItem?.text, selectedItem.text) + } + } + //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- public var isValid: Bool = true /// Closure passed here will run as picker changes items. - public var observeDropdownChange: ((String?, String) -> ())? + public var observeDropdownChange: ((_ oldValue: String?, _ newValue: String) -> ())? /// Closure passed here will run upon dismissing the selection picker. - public var observeDropdownSelection: ((String) -> ())? + public var observeDropdownSelection: ((_ newValue: String) -> ())? /// When selecting for first responder, allow initial selected value to appear in empty text field. public var setInitialValueInTextField = true @@ -184,7 +197,7 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol, } } - + public func updateView(_ size: CGFloat) { } /// Sets the textField with the first value of the available picker data. @@ -196,7 +209,6 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol, let pickerIndex = optionsPicker.selectedRow(inComponent: 0) viewModel.selectedIndex = pickerIndex selectId = pickerIndex - observeDropdownChange?(selectedItem?.text, pickerData[pickerIndex]) } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift index f6f20b9f..04d880ae 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift @@ -17,7 +17,7 @@ import VDS public var options: [String] = [] public var selectedIndex: Int? public var showInlineLabel: Bool = false - public var feedbackTextPlacement: VDS.EntryFieldBase.HelperTextPlacement = .bottom + public var feedbackTextPlacement: VDS.DropdownSelect.HelperTextPlacement = .bottom public init(with options: [String], selectedIndex: Int? = nil) { self.options = options diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift b/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift index 60d88693..64224f04 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift @@ -38,6 +38,13 @@ import VDS } } + override open var isSelected: Bool { + didSet { + viewModel?.selected = isSelected + _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) + } + } + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -66,16 +73,6 @@ import VDS isSelected = isChecked } - open override func setup() { - super.setup() - publisher(for: .valueChanged) - .sink { [weak self] control in - guard let self, isEnabled else { return } - viewModel?.selected = isSelected - _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) - }.store(in: &subscribers) - } - //-------------------------------------------------- // MARK: - Actions //-------------------------------------------------- @@ -136,14 +133,18 @@ import VDS //properties isEnabled = viewModel.enabled && !viewModel.readOnly isAnimated = viewModel.animated - isSelected = viewModel.selected - + + //call super here to go around the didSet + //in this class + super.isSelected = viewModel.selected + //events viewModel.updateUI = { MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in guard let self = self else { return } let isValid = viewModel.isValid ?? true - showError = !isValid + //TODO: Fix issue with default state + //showError = !isValid isEnabled = viewModel.enabled }) diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift index 7fe3f9a4..0ecd920b 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift @@ -144,11 +144,6 @@ import VDS //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- - - open func needsToBeConstrained() -> Bool { true } - - public func horizontalAlignment() -> UIStackView.Alignment { .leading } - public func updateView(_ size: CGFloat) {} } diff --git a/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift b/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift index c75ead98..3e02b467 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift @@ -19,22 +19,14 @@ import VDS var fieldKey: String? var fieldValue: JSONValue? var groupName: String? - - //-------------------------------------------------- - // MARK: - Life Cycle - //-------------------------------------------------- - open override func setup() { - super.setup() - - publisher(for: .valueChanged) - .sink { [weak self] control in - guard let self, isEnabled else { return } - viewModel?.checkbox.selected = isSelected - _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) - }.store(in: &subscribers) + override open var isSelected: Bool { + didSet { + viewModel?.checkbox.selected = isSelected + _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) + } } - + //-------------------------------------------------- // MARK: - Atomic //-------------------------------------------------- @@ -73,14 +65,18 @@ import VDS //properties isAnimated = viewModel.checkbox.animated isEnabled = viewModel.checkbox.enabled && !viewModel.checkbox.readOnly - isSelected = viewModel.checkbox.selected + //call super here to go around the didSet + //in this class + super.isSelected = viewModel.checkbox.selected + //events viewModel.checkbox.updateUI = { MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in guard let self = self else { return } let isValid = viewModel.checkbox.isValid ?? true - showError = !isValid + //TODO: Fix issue with default state + //showError = !isValid errorText = viewModel.checkbox.errorMessage isEnabled = viewModel.checkbox.enabled }) diff --git a/MVMCoreUI/Atomic/Protocols/VDSMoleculeViewProtocol.swift b/MVMCoreUI/Atomic/Protocols/VDSMoleculeViewProtocol.swift index 4bebf0c7..2bb95c43 100644 --- a/MVMCoreUI/Atomic/Protocols/VDSMoleculeViewProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/VDSMoleculeViewProtocol.swift @@ -38,5 +38,9 @@ extension VDSMoleculeViewProtocol { public func update(viewModel: ViewModel){ set(with: viewModel, delegateObject, additionalData) } + + public func updateView(_ size: CGFloat) { } + + public static func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { 44 } }