From 324605cdeba16e0ac46331af9d9a9ddc8eacad9d Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 21 Sep 2020 12:17:25 -0400 Subject: [PATCH] prevent double selection and code review items --- .../FormFields/TextFields/BaseDropdownEntryField.swift | 7 +++---- MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift | 8 +++----- MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift | 7 +++---- MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift | 8 +++----- MVMCoreUI/Atomic/Atoms/Views/Toggle.swift | 9 ++++----- MVMCoreUI/BaseClasses/Button.swift | 9 +++++++-- 6 files changed, 23 insertions(+), 25 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift index 38da2bdb..82e46306 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift @@ -92,10 +92,9 @@ import UIKit } func performDropdownAction() { - if let actionModel = baseDropdownEntryFieldModel?.action, let actionMap = actionModel.toJSON() { - var additionalData = self.additionalData ?? [:] - additionalData[KeySourceModel] = baseDropdownEntryFieldModel - MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) + if let baseDropdownEntryFieldModel = baseDropdownEntryFieldModel, let actionModel = baseDropdownEntryFieldModel.action, let actionMap = actionModel.toJSON() { + let additionalDataWithSource = additionalData.dictionaryAdding(key: KeySourceModel, value: baseDropdownEntryFieldModel) + MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalDataWithSource, delegateObject: delegateObject) } } } diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift index 46b4cef5..d4fa0232 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift @@ -137,13 +137,11 @@ open class RadioBox: Control, MFButtonProtocol { } @objc open func selectBox() { - guard isEnabled else { return } + guard isEnabled, !isSelected else { return } isSelected = true radioBoxModel?.selected = isSelected - if let actionModel = radioBoxModel?.action { - var additionalData = self.additionalData ?? [:] - additionalData[KeySourceModel] = radioBoxModel - Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: additionalData) + if let radioBoxModel = radioBoxModel, let actionModel = radioBoxModel.action { + Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: additionalData, sourceModel: radioBoxModel) } layer.setNeedsDisplay() } diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift index 9e18f936..bd720be8 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioButton.swift @@ -95,15 +95,14 @@ import UIKit if !isEnabled { return } + let wasPreviouslySelected = isSelected if let radioButtonModel = radioButtonSelectionHelper { radioButtonModel.selected(self) } else { isSelected = !isSelected } - if let actionModel = radioModel?.action, isSelected { - var additionalData = self.additionalData ?? [:] - additionalData[KeySourceModel] = radioModel - Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: additionalData) + if let radioModel = radioModel, let actionModel = radioModel.action, isSelected, !wasPreviouslySelected { + Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: additionalData, sourceModel: radioModel) } _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) setNeedsDisplay() diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift index e1502515..70f2a459 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift @@ -119,13 +119,11 @@ open class RadioSwatch: Control, MFButtonProtocol { } @objc open func selectSwatch() { - guard isEnabled else { return } + guard isEnabled, !isSelected else { return } isSelected = true radioSwatchModel?.selected = isSelected - if let actionModel = radioSwatchModel?.action { - var additionalData = self.additionalData ?? [:] - additionalData[KeySourceModel] = radioSwatchModel - Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: additionalData) + if let radioSwatchModel = radioSwatchModel, let actionModel = radioSwatchModel.action { + Button.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: additionalData, sourceModel: radioSwatchModel) } layer.setNeedsDisplay() } diff --git a/MVMCoreUI/Atomic/Atoms/Views/Toggle.swift b/MVMCoreUI/Atomic/Atoms/Views/Toggle.swift index dd7dc9f0..5712695b 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Toggle.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Toggle.swift @@ -394,20 +394,19 @@ public typealias ActionBlockConfirmation = () -> (Bool) let actionMap = model.action?.toJSON() let alternateActionMap = model.alternateAction?.toJSON() + let additionalDataWithSource = additionalData.dictionaryAdding(key: KeySourceModel, value: model) if actionMap != nil || alternateActionMap != nil { - var additionalDatatoUpdate = additionalData ?? [:] - additionalDatatoUpdate[KeySourceModel] = model didToggleAction = { [weak self] in guard let self = self else { return } if self.isOn { if actionMap != nil { - MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalDatatoUpdate, delegateObject: delegateObject) + MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalDataWithSource, delegateObject: delegateObject) } } else { if alternateActionMap != nil { - MVMCoreActionHandler.shared()?.handleAction(with: alternateActionMap, additionalData: additionalDatatoUpdate, delegateObject: delegateObject) + MVMCoreActionHandler.shared()?.handleAction(with: alternateActionMap, additionalData: additionalDataWithSource, delegateObject: delegateObject) } else if actionMap != nil { - MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalDatatoUpdate, delegateObject: delegateObject) + MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalDataWithSource, delegateObject: delegateObject) } } } diff --git a/MVMCoreUI/BaseClasses/Button.swift b/MVMCoreUI/BaseClasses/Button.swift index 757855ed..599fc48c 100644 --- a/MVMCoreUI/BaseClasses/Button.swift +++ b/MVMCoreUI/BaseClasses/Button.swift @@ -82,11 +82,16 @@ public typealias ButtonAction = (Button) -> () } } - open class func performButtonAction(with model: ActionModelProtocol, button: MFButtonProtocol, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { + open class func performButtonAction(with model: ActionModelProtocol, button: MFButtonProtocol, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?, sourceModel: MoleculeModelProtocol? = nil) { if let data = try? model.encode(using: JSONEncoder()), let actionMap = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.init()) as? [AnyHashable: Any], delegateObject?.buttonDelegate?.button?(button, shouldPerformActionWithMap: actionMap, additionalData: additionalData) ?? true { - MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) + if let sourceModel = sourceModel { + let additionalDataWithSource = additionalData.dictionaryAdding(key: KeySourceModel, value: sourceModel) + MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalDataWithSource, delegateObject: delegateObject) + } else { + MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) + } } }