diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift b/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift index f23fd337..fc6607b1 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/Checkbox.swift @@ -381,7 +381,7 @@ import MVMCore checkWidth = 2 checkAndBypassAnimations(selected: false) } - + public override func updateView(_ size: CGFloat) { super.updateView(size) @@ -391,6 +391,12 @@ import MVMCore } } + private func performCheckboxAction(with actionModel: ActionModelProtocol, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { + if let actionMap = actionModel.toJSON() { + MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) + } + } + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) self.delegateObject = delegateObject @@ -422,10 +428,16 @@ import MVMCore isEnabled = model.enabled - if let action = model.action { - actionBlock = { - if let actionMap = action.toJSON() { - MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) + if (model.action != nil || model.offAction != nil) { + actionBlock = { [weak self] in + guard let self = self else { return } + + if let offAction = model.offAction, !self.isSelected { + self.performCheckboxAction(with: offAction, delegateObject: delegateObject, additionalData: additionalData) + return + } + if let action = model.action { + self.performCheckboxAction(with: action, delegateObject: delegateObject, additionalData: additionalData) } } } diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/CheckboxModel.swift b/MVMCoreUI/Atomic/Atoms/Selectors/CheckboxModel.swift index 43a08aa6..bb21da1b 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/CheckboxModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/CheckboxModel.swift @@ -32,6 +32,7 @@ import Foundation public var invertedColor: Color = Color(uiColor: .mvmWhite) public var invertedBackgroundColor: Color = Color(uiColor: .mvmBlack) public var action: ActionModelProtocol? + public var offAction: ActionModelProtocol? public var fieldKey: String? public var groupName: String = FormValidator.defaultGroupName @@ -61,6 +62,7 @@ import Foundation case action case fieldKey case groupName + case offAction } //-------------------------------------------------- @@ -155,6 +157,7 @@ import Foundation if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } + offAction = try typeContainer.decodeModelIfPresent(codingKey: .offAction) } public func encode(to encoder: Encoder) throws { @@ -179,5 +182,6 @@ import Foundation try container.encodeIfPresent(enabled, forKey: .enabled) try container.encodeModelIfPresent(action, forKey: .action) try container.encodeIfPresent(groupName, forKey: .groupName) + try container.encodeModelIfPresent(offAction, forKey: .offAction) } } diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift index 70c1a6ef..7b8b5703 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift @@ -8,7 +8,7 @@ import Foundation -open class RadioBox: Control { +open class RadioBox: Control, MFButtonProtocol { public let label = Label(fontStyle: .RegularBodySmall) public let subTextLabel = Label(fontStyle: .RegularMicro) public var isOutOfStock = false @@ -22,6 +22,8 @@ open class RadioBox: Control { public var subTextLabelHeightConstraint: NSLayoutConstraint? + private var delegateObject: MVMCoreUIDelegateObject? + public var radioBoxModel: RadioBoxModel? { return model as? RadioBoxModel } @@ -77,6 +79,7 @@ open class RadioBox: Control { open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) guard let model = model as? RadioBoxModel else { return } + self.delegateObject = delegateObject label.text = model.text subTextLabel.text = model.subText isOutOfStock = model.strikethrough @@ -135,6 +138,9 @@ open class RadioBox: Control { guard isEnabled else { return } isSelected = true radioBoxModel?.selected = isSelected + if let actionModel = radioBoxModel?.action { + Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: nil) + } layer.setNeedsDisplay() } diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBoxModel.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBoxModel.swift index 986eefac..923a65e0 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBoxModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBoxModel.swift @@ -17,6 +17,7 @@ import Foundation public var enabled: Bool = true public var strikethrough: Bool = false public var fieldValue: String? + public var action: ActionModelProtocol? private enum CodingKeys: String, CodingKey { case moleculeName @@ -28,6 +29,7 @@ import Foundation case enabled case strikethrough case fieldValue + case action } required public init(from decoder: Decoder) throws { @@ -47,6 +49,7 @@ import Foundation } fieldValue = try typeContainer.decodeIfPresent(String.self, forKey: .fieldValue) + action = try typeContainer.decodeModelIfPresent(codingKey: .action) } public func encode(to encoder: Encoder) throws { @@ -60,5 +63,6 @@ import Foundation try container.encode(enabled, forKey: .enabled) try container.encode(strikethrough, forKey: .strikethrough) try container.encodeIfPresent(fieldValue, forKey: .fieldValue) + try container.encodeModelIfPresent(action, forKey: .action) } } diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift index 36dcde69..3184feb4 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift @@ -9,7 +9,7 @@ import UIKit -open class RadioSwatch: Control { +open class RadioSwatch: Control, MFButtonProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -20,6 +20,8 @@ open class RadioSwatch: Control { private var strikeLayer: CALayer? private var maskLayer: CALayer? + private var delegateObject: MVMCoreUIDelegateObject? + public var radioSwatchModel: RadioSwatchModel? { return model as? RadioSwatchModel } @@ -57,6 +59,7 @@ open class RadioSwatch: Control { open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) guard let model = model as? RadioSwatchModel else { return } + self.delegateObject = delegateObject bottomText.text = model.text isSelected = model.selected isEnabled = model.enabled @@ -117,6 +120,9 @@ open class RadioSwatch: Control { guard isEnabled else { return } isSelected = true radioSwatchModel?.selected = isSelected + if let actionModel = radioSwatchModel?.action { + Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: nil) + } layer.setNeedsDisplay() } diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatchModel.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatchModel.swift index 3aadd467..7acb3999 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatchModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatchModel.swift @@ -17,6 +17,7 @@ import Foundation public var enabled: Bool = true public var strikethrough: Bool = false public var fieldValue: String? + public var action: ActionModelProtocol? private enum CodingKeys: String, CodingKey { case moleculeName @@ -27,6 +28,7 @@ import Foundation case enabled case strikethrough case fieldValue + case action } required public init(from decoder: Decoder) throws { @@ -46,6 +48,7 @@ import Foundation self.strikethrough = strikethrough } fieldValue = try typeContainer.decodeIfPresent(String.self, forKey: .fieldValue) + action = try typeContainer.decodeModelIfPresent(codingKey: .action) } public func encode(to encoder: Encoder) throws { @@ -58,6 +61,7 @@ import Foundation try container.encode(enabled, forKey: .enabled) try container.encode(strikethrough, forKey: .strikethrough) try container.encodeIfPresent(fieldValue, forKey: .fieldValue) + try container.encodeModelIfPresent(action, forKey: .action) } }