//
// 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
}
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..