nav dev
This commit is contained in:
parent
5947e5c1ad
commit
90e6dfd084
@ -74,6 +74,7 @@
|
|||||||
0A25209824645B76000FA9F6 /* TextViewEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A25209724645B76000FA9F6 /* TextViewEntryFieldModel.swift */; };
|
0A25209824645B76000FA9F6 /* TextViewEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A25209724645B76000FA9F6 /* TextViewEntryFieldModel.swift */; };
|
||||||
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; };
|
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; };
|
||||||
0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */; };
|
0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */; };
|
||||||
|
0A423A202684E7A0008EC258 /* SelectAllNavigationLabelButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A423A1F2684E7A0008EC258 /* SelectAllNavigationLabelButton.swift */; };
|
||||||
0A51F3E22475CB73002E08B6 /* LoadingSpinnerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A51F3E02475CB73002E08B6 /* LoadingSpinnerModel.swift */; };
|
0A51F3E22475CB73002E08B6 /* LoadingSpinnerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A51F3E02475CB73002E08B6 /* LoadingSpinnerModel.swift */; };
|
||||||
0A51F3E32475CB73002E08B6 /* LoadingSpinner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A51F3E12475CB73002E08B6 /* LoadingSpinner.swift */; };
|
0A51F3E32475CB73002E08B6 /* LoadingSpinner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A51F3E12475CB73002E08B6 /* LoadingSpinner.swift */; };
|
||||||
0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; };
|
0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; };
|
||||||
@ -636,6 +637,7 @@
|
|||||||
0A25209724645B76000FA9F6 /* TextViewEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewEntryFieldModel.swift; sourceTree = "<group>"; };
|
0A25209724645B76000FA9F6 /* TextViewEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewEntryFieldModel.swift; sourceTree = "<group>"; };
|
||||||
0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = "<group>"; };
|
0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = "<group>"; };
|
||||||
0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = "<group>"; };
|
0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = "<group>"; };
|
||||||
|
0A423A1F2684E7A0008EC258 /* SelectAllNavigationLabelButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectAllNavigationLabelButton.swift; sourceTree = "<group>"; };
|
||||||
0A51F3E02475CB73002E08B6 /* LoadingSpinnerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingSpinnerModel.swift; sourceTree = "<group>"; };
|
0A51F3E02475CB73002E08B6 /* LoadingSpinnerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingSpinnerModel.swift; sourceTree = "<group>"; };
|
||||||
0A51F3E12475CB73002E08B6 /* LoadingSpinner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingSpinner.swift; sourceTree = "<group>"; };
|
0A51F3E12475CB73002E08B6 /* LoadingSpinner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingSpinner.swift; sourceTree = "<group>"; };
|
||||||
0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = "<group>"; };
|
0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = "<group>"; };
|
||||||
@ -1755,6 +1757,7 @@
|
|||||||
D23EA801247EBED400D60C34 /* ImageBarButtonItem.swift */,
|
D23EA801247EBED400D60C34 /* ImageBarButtonItem.swift */,
|
||||||
D23EA7FD247EBBB700D60C34 /* NavigationLabelButtonModel.swift */,
|
D23EA7FD247EBBB700D60C34 /* NavigationLabelButtonModel.swift */,
|
||||||
D23EA7FF247EBD6C00D60C34 /* LabelBarButtonItem.swift */,
|
D23EA7FF247EBD6C00D60C34 /* LabelBarButtonItem.swift */,
|
||||||
|
0A423A1F2684E7A0008EC258 /* SelectAllNavigationLabelButton.swift */,
|
||||||
);
|
);
|
||||||
path = Buttons;
|
path = Buttons;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -2730,6 +2733,7 @@
|
|||||||
D264FA8E243BCD9A00D98315 /* CollectionTemplate.swift in Sources */,
|
D264FA8E243BCD9A00D98315 /* CollectionTemplate.swift in Sources */,
|
||||||
0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */,
|
0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */,
|
||||||
AA633B3124989EC000731E80 /* HeadersH2PricingTwoRowsModel.swift in Sources */,
|
AA633B3124989EC000731E80 /* HeadersH2PricingTwoRowsModel.swift in Sources */,
|
||||||
|
0A423A202684E7A0008EC258 /* SelectAllNavigationLabelButton.swift in Sources */,
|
||||||
8DEFA95C243DAC20000D27E5 /* ListThreeColumnDataUsageDividerModel.swift in Sources */,
|
8DEFA95C243DAC20000D27E5 /* ListThreeColumnDataUsageDividerModel.swift in Sources */,
|
||||||
D2092357244FA1EF0044AD09 /* ThreeLayerModelBase.swift in Sources */,
|
D2092357244FA1EF0044AD09 /* ThreeLayerModelBase.swift in Sources */,
|
||||||
D2FD4A4925199BD9000C28A9 /* AccessibilityProtocol.swift in Sources */,
|
D2FD4A4925199BD9000C28A9 /* AccessibilityProtocol.swift in Sources */,
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
@objcMembers public class CheckboxModel: NSObject, MoleculeModelProtocol, SelectableMoleculeModel, FormFieldProtocol {
|
@objcMembers public class CheckboxModel: NSObject, MoleculeModelProtocol, SelectableMoleculeModelProtocol, FormFieldProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
public class ToggleModel: NSObject, MoleculeModelProtocol, FormFieldProtocol, EnableableModelProtocol, SelectableMoleculeModel {
|
public class ToggleModel: NSObject, MoleculeModelProtocol, FormFieldProtocol, EnableableModelProtocol, SelectableMoleculeModelProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -0,0 +1,82 @@
|
|||||||
|
//
|
||||||
|
// SelectAllNavigationLabelButton.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Kevin Christiano on 6/24/21.
|
||||||
|
// Copyright © 2021 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
public class SelectAllNavigationLabelButton: NavigationButtonModelProtocol, MoleculeModelProtocol {
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public var backgroundColor: Color?
|
||||||
|
public static var identifier: String = "selectAllNavigationLabelButton"
|
||||||
|
public var accessibilityIdentifier: String?
|
||||||
|
public var willSelect: Bool
|
||||||
|
public var selectAllTitle: String = "Select All"
|
||||||
|
public var deselectAllTitle: String = "Deselect All"
|
||||||
|
public var action: ActionModelProtocol
|
||||||
|
|
||||||
|
public var selectionTitle: String {
|
||||||
|
willSelect ? selectAllTitle : deselectAllTitle
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializer
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public init(willSelect: Bool, selectAllTitle: String, deselectAllTitle: String, action: ActionModelProtocol) {
|
||||||
|
self.willSelect = willSelect
|
||||||
|
self.action = action
|
||||||
|
self.selectAllTitle = selectAllTitle
|
||||||
|
self.deselectAllTitle = deselectAllTitle
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Keys
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
private enum CodingKeys: String, CodingKey {
|
||||||
|
case moleculeName
|
||||||
|
case accessibilityIdentifier
|
||||||
|
case willSelect
|
||||||
|
case selectAllTitle
|
||||||
|
case deselectAllTitle
|
||||||
|
case action
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Codec
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
required public init(from decoder: Decoder) throws {
|
||||||
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
|
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
|
||||||
|
selectAllTitle = try typeContainer.decode(String.self, forKey: .selectAllTitle)
|
||||||
|
deselectAllTitle = try typeContainer.decode(String.self, forKey: .deselectAllTitle)
|
||||||
|
willSelect = try typeContainer.decode(Bool.self, forKey: .willSelect)
|
||||||
|
action = try typeContainer.decodeModel(codingKey: .action)
|
||||||
|
}
|
||||||
|
|
||||||
|
open func encode(to encoder: Encoder) throws {
|
||||||
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
|
try container.encode(moleculeName, forKey: .moleculeName)
|
||||||
|
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
|
||||||
|
try container.encode(selectAllTitle, forKey: .selectAllTitle)
|
||||||
|
try container.encode(deselectAllTitle, forKey: .deselectAllTitle)
|
||||||
|
try container.encode(willSelect, forKey: .willSelect)
|
||||||
|
try container.encodeModel(action, forKey: .action)
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Methods
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Convenience function that creates a BarButtonItem for the model.
|
||||||
|
public func createNavigationItemButton(delegateObject: MVMCoreUIDelegateObject? = nil, additionalData: [AnyHashable: Any]? = nil) -> UIBarButtonItem {
|
||||||
|
LabelBarButtonItem.create(with: selectionTitle, actionModel: action, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -16,36 +16,7 @@
|
|||||||
public class SelectAllBoxesBehaviorModel: PageBehaviorModelProtocol {
|
public class SelectAllBoxesBehaviorModel: PageBehaviorModelProtocol {
|
||||||
public class var identifier: String { "pageSelectAllBoxesBehavior" }
|
public class var identifier: String { "pageSelectAllBoxesBehavior" }
|
||||||
public var shouldAllowMultipleInstances: Bool { false }
|
public var shouldAllowMultipleInstances: Bool { false }
|
||||||
public var selectAllTitle: String = "Select All"
|
|
||||||
public var deselectAllTitle: String = "Deselect All"
|
|
||||||
public init() { }
|
public init() { }
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Codable
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey {
|
|
||||||
case selectAllTitle
|
|
||||||
case deselectAllTitle
|
|
||||||
}
|
|
||||||
|
|
||||||
required public init(from decoder: Decoder) throws {
|
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
|
||||||
|
|
||||||
if let selectAllTitle = try typeContainer.decodeIfPresent(String.self, forKey: .selectAllTitle) {
|
|
||||||
self.selectAllTitle = selectAllTitle
|
|
||||||
}
|
|
||||||
|
|
||||||
if let deselectAllTitle = try typeContainer.decodeIfPresent(String.self, forKey: .deselectAllTitle) {
|
|
||||||
self.deselectAllTitle = deselectAllTitle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func encode(to encoder: Encoder) throws {
|
|
||||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
||||||
try container.encode(selectAllTitle, forKey: .selectAllTitle)
|
|
||||||
try container.encode(deselectAllTitle, forKey: .deselectAllTitle)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Selects all the control models presented on a page.
|
/// Selects all the control models presented on a page.
|
||||||
@ -83,7 +54,7 @@ public class SelectAllBoxesBehavior: PageCustomActionHandlerBehavior, PageMolecu
|
|||||||
|
|
||||||
public func onPageNew(rootMolecules: [MoleculeModelProtocol], _ delegateObject: MVMCoreUIDelegateObject) {
|
public func onPageNew(rootMolecules: [MoleculeModelProtocol], _ delegateObject: MVMCoreUIDelegateObject) {
|
||||||
|
|
||||||
let selectableModels: [(NSObject & SelectableMoleculeModel)] = rootMolecules.allMoleculesOfType()
|
let selectableModels: [(NSObject & SelectableMoleculeModelProtocol)] = rootMolecules.allMoleculesOfType()
|
||||||
|
|
||||||
guard !selectableModels.isEmpty else { return }
|
guard !selectableModels.isEmpty else { return }
|
||||||
|
|
||||||
@ -95,7 +66,7 @@ public class SelectAllBoxesBehavior: PageCustomActionHandlerBehavior, PageMolecu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func setObserver<T>(_ model: T, fieldKey: String) where T: (NSObject & SelectableMoleculeModel) {
|
func setObserver<T>(_ model: T, fieldKey: String) where T: (NSObject & SelectableMoleculeModelProtocol) {
|
||||||
|
|
||||||
observers[fieldKey] = model.observe(\.selected, options: [.new]) { [weak self] model, change in
|
observers[fieldKey] = model.observe(\.selected, options: [.new]) { [weak self] model, change in
|
||||||
guard let self = self,
|
guard let self = self,
|
||||||
@ -137,7 +108,7 @@ public class SelectAllBoxesBehavior: PageCustomActionHandlerBehavior, PageMolecu
|
|||||||
|
|
||||||
// Verify we have the correct action type and necessary values.
|
// Verify we have the correct action type and necessary values.
|
||||||
guard actionType == "selectAllBoxes",
|
guard actionType == "selectAllBoxes",
|
||||||
let selectableModels: [SelectableMoleculeModel] = delegate?.moleculeDelegate?.getRootMolecules().allMoleculesOfType(),
|
let selectableModels: [SelectableMoleculeModelProtocol] = delegate?.moleculeDelegate?.getRootMolecules().allMoleculesOfType(),
|
||||||
!selectableModels.isEmpty
|
!selectableModels.isEmpty
|
||||||
else { return false }
|
else { return false }
|
||||||
|
|
||||||
@ -170,20 +141,20 @@ public class SelectAllBoxesBehavior: PageCustomActionHandlerBehavior, PageMolecu
|
|||||||
|
|
||||||
/// Updates the navigation UI to correctly reflect the behavior's state.
|
/// Updates the navigation UI to correctly reflect the behavior's state.
|
||||||
func updatePageNavigationUI() {
|
func updatePageNavigationUI() {
|
||||||
|
|
||||||
guard let model = model as? SelectAllBoxesBehaviorModel else { return }
|
guard let model = model as? SelectAllBoxesBehaviorModel else { return }
|
||||||
|
|
||||||
let navButtonTitle: String? = didSelectAllState ? model.deselectAllTitle : model.selectAllTitle
|
// let navButtonTitle: String? = didSelectAllState ? model.deselectAllTitle : model.selectAllTitle
|
||||||
|
// TODO: update
|
||||||
|
|
||||||
MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
|
// MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
|
||||||
guard let controller = self?.delegate?.moleculeDelegate as? ViewController else { return }
|
// guard let controller = self?.delegate?.moleculeDelegate as? PageProtocol else { return }
|
||||||
controller.handleNewDataAndUpdateUI()
|
// controller.handleNewDataAndUpdateUI()
|
||||||
|
// let n = controller.getNavigationModel()
|
||||||
if MVMCoreUIUtility.getCurrentVisibleController() == controller {
|
// let r = n?.additionalRightButtons
|
||||||
controller.navigationItem.rightBarButtonItem?.title = navButtonTitle
|
// for i in r! {
|
||||||
controller.manager?.refreshNavigationUI()
|
// i.moleculeName
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convenience function for readability to confirmt he state of the behavior.
|
/// Convenience function for readability to confirmt he state of the behavior.
|
||||||
@ -201,14 +172,14 @@ public class SelectAllBoxesBehavior: PageCustomActionHandlerBehavior, PageMolecu
|
|||||||
/// Convenience function making it easier to read if a current selectable model should be acted on.
|
/// Convenience function making it easier to read if a current selectable model should be acted on.
|
||||||
/// - Parameter model: A model object assined to the SelectableModel protocol
|
/// - Parameter model: A model object assined to the SelectableModel protocol
|
||||||
/// - Returns: Boolean determining if the passed model should be selected.
|
/// - Returns: Boolean determining if the passed model should be selected.
|
||||||
func toSelect(model: SelectableMoleculeModel) -> Bool {
|
func toSelect(model: SelectableMoleculeModelProtocol) -> Bool {
|
||||||
didSelectAllState && !model.selected
|
didSelectAllState && !model.selected
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convenience function making it easier to read if a current selectable model should be acted on.
|
/// Convenience function making it easier to read if a current selectable model should be acted on.
|
||||||
/// - Parameter model: A model object assined to the SelectableModel protocol
|
/// - Parameter model: A model object assined to the SelectableModel protocol
|
||||||
/// - Returns: Boolean determining if the passed model should be deselected.
|
/// - Returns: Boolean determining if the passed model should be deselected.
|
||||||
func toDeselect(model: SelectableMoleculeModel) -> Bool {
|
func toDeselect(model: SelectableMoleculeModelProtocol) -> Bool {
|
||||||
!didSelectAllState && model.selected
|
!didSelectAllState && model.selected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -129,6 +129,7 @@ open class CoreUIModelMapping: ModelMapping {
|
|||||||
try? ModelRegistry.register(NavigationItemModel.self)
|
try? ModelRegistry.register(NavigationItemModel.self)
|
||||||
try? ModelRegistry.register(NavigationImageButtonModel.self)
|
try? ModelRegistry.register(NavigationImageButtonModel.self)
|
||||||
try? ModelRegistry.register(NavigationLabelButtonModel.self)
|
try? ModelRegistry.register(NavigationLabelButtonModel.self)
|
||||||
|
try? ModelRegistry.register(SelectAllNavigationLabelButton.self)
|
||||||
|
|
||||||
// MARK:- Other Organisms
|
// MARK:- Other Organisms
|
||||||
try? ModelRegistry.register(handler: Carousel.self, for: CarouselModel.self)
|
try? ModelRegistry.register(handler: Carousel.self, for: CarouselModel.self)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user