// // TableViewController.swift // VDSSample // // Created by Nadigadda, Sumanth on 24/04/24. // import Foundation import VDS import UIKit import VDSCoreTokens enum TableLineStyle: String, CaseIterable { case none case primary case secondary func lineStyle() -> Line.Style? { switch self { case .primary: return Line.Style.primary case .secondary: return Line.Style.secondary case .none: return nil } } } class TableViewController: BaseViewController { var striped = Toggle() var fillContainer = Toggle() var customColumnWidthSize = NumericField().with { $0.placeholder = "Minimum 50px" } lazy var headerLineStylePicker = { PickerSelectorView(title: "primary", picker: self.picker, items: TableLineStyle.allCases) }() lazy var rowLineStylePicker = { PickerSelectorView(title: "secondary", picker: self.picker, items: TableLineStyle.allCases) }() lazy var paddingPicker = { PickerSelectorView(title: "standard", picker: self.picker, items: Table.Padding.allCases) }() override func viewDidLoad() { super.viewDidLoad() self.setupPicker() self.setupModel() } override func setupForm() { super.setupForm() addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Padding", view: paddingPicker) addFormRow(label: "Striped", view: striped) addFormRow(label: "Header line style", view: headerLineStylePicker) addFormRow(label: "Row line style", view: rowLineStylePicker) addFormRow(label: "Fill container", view: fillContainer) addFormRow(label: "Custom column size", view: customColumnWidthSize) fillContainer.isOn = component.fillContainer updateTextFieldStatus(enable: !fillContainer.isOn) addContentTopView(view: component) striped.onChange = { [weak self] sender in self?.component.striped = sender.isOn let headerStyle = sender.isOn ? nil : TableLineStyle(rawValue: self?.headerLineStylePicker.text ?? "") let rowStyle = sender.isOn ? nil : TableLineStyle(rawValue: self?.rowLineStylePicker.text ?? "") var headers = self?.component.tableHeader ?? [TableRowModel]() self?.updateBottomLineStyle(items:&headers, style: headerStyle?.lineStyle()) self?.component.tableHeader = headers var rows = self?.component.tableRows ?? [TableRowModel]() self?.updateBottomLineStyle(items:&rows, style: rowStyle?.lineStyle()) self?.component.tableRows = rows self?.component.padding = .compact self?.paddingPicker.text = Table.Padding.compact.rawValue } fillContainer.onChange = { [weak self] sender in self?.component.fillContainer = sender.isOn self?.updateTextFieldStatus(enable:!sender.isOn) if let count = self?.component.tableHeader.first?.columnsCount, let text = self?.customColumnWidthSize.text, let width = NumberFormatter().number(from: text) { self?.component.columnWidths = Array(repeating: CGFloat(truncating: width), count: count) } } customColumnWidthSize.numberPublisher.sink { [weak self] text in if let count = self?.component.tableHeader.first?.columnsCount, let text, text.intValue > 50 { self?.component.columnWidths = Array(repeating: CGFloat(truncating: text), count: count) } }.store(in: &subscribers) } func setupPicker() { surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.surface = item self?.contentTopView.backgroundColor = item.color } headerLineStylePicker.onPickerDidSelect = { [weak self] item in var headers = self?.component.tableHeader ?? [TableRowModel]() self?.updateBottomLineStyle(items:&headers, style: item.lineStyle()) self?.component.tableHeader = headers } rowLineStylePicker.onPickerDidSelect = { [weak self] item in var rows = self?.component.tableRows ?? [TableRowModel]() self?.updateBottomLineStyle(items:&rows, style: item.lineStyle()) self?.component.tableRows = rows } paddingPicker.onPickerDidSelect = { [weak self] item in self?.component.padding = item } } func updateTextFieldStatus(enable: Bool) { customColumnWidthSize.isEnabled = enable customColumnWidthSize.backgroundColor = enable ? UIColor.white : VDSColor.paletteGray85 } func updateBottomLineStyle(items:inout [TableRowModel], style: Line.Style?) { for currentRowIndex in 0..