SertifikatDaftarPencabutanCell.swift 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. //
  2. // SertifikatDaftarPencabutanCell.swift
  3. // Sirani
  4. //
  5. // Created by Anhar Solehudin on 26/04/19.
  6. // Copyright © 2019 Anhar Solehudin. All rights reserved.
  7. //
  8. import UIKit
  9. import MaterialComponents.MaterialCards
  10. class SertifikatDaftarPencabutanCell: UITableViewCell {
  11. @IBOutlet weak var card: MDCCard!
  12. @IBOutlet weak var lblAplikasiId: UILabel!
  13. @IBOutlet weak var lblNo: UILabel!
  14. @IBOutlet weak var lblExpDate: UILabel!
  15. @IBOutlet weak var lblCustName: UILabel!
  16. @IBOutlet weak var lblEqpName: UILabel!
  17. @IBOutlet weak var lblModels: UILabel!
  18. @IBOutlet weak var lblKeterangan: UILabel!
  19. @IBOutlet weak var cbKasi: UIImageView!
  20. @IBOutlet weak var cbKasub: UIImageView!
  21. @IBOutlet weak var cbDirektur: UIImageView!
  22. // Modern Programmatic UI Elements
  23. private let modernContainer = UIView()
  24. private let modernBadgeView = UIView()
  25. private let modernBadgeIcon = UIImageView()
  26. private let modernNomorLabel = UILabel()
  27. private let modernCategoryLabel = UILabel()
  28. private let modernStatusPill = UIView()
  29. private let modernStatusLabel = UILabel()
  30. private let modernPerangkatLabel = UILabel()
  31. private let modernCompanyIcon = UIImageView()
  32. private let modernPemohonLabel = UILabel()
  33. private let modernModelsCard = UIView()
  34. private let modernModelsTitle = UILabel()
  35. private let modernModelsVal = UILabel()
  36. private let modernAlasanCard = UIView()
  37. private let modernAlasanIcon = UIImageView()
  38. private let modernAlasanLabel = UILabel()
  39. private let modernApprovalStack = UIStackView()
  40. private let modernKasiBadge = UIView()
  41. private let modernKasiLabel = UILabel()
  42. private let modernKasubBadge = UIView()
  43. private let modernKasubLabel = UILabel()
  44. private let modernDirutBadge = UIView()
  45. private let modernDirutLabel = UILabel()
  46. private let modernValidityCard = UIView()
  47. private let modernCalendarIcon = UIImageView()
  48. private let modernValidityLabel = UILabel()
  49. private let modernAplIdLabel = UILabel()
  50. private var isModernLayoutBuilt = false
  51. override func awakeFromNib() {
  52. super.awakeFromNib()
  53. self.selectionStyle = .none
  54. self.backgroundColor = .clear
  55. setupCardVisuals()
  56. setupModernLayout()
  57. }
  58. private func setupCardVisuals() {
  59. guard let card = card else { return }
  60. card.cornerRadius = 16
  61. card.setShadowElevation(ShadowElevation(rawValue: 2), for: .normal)
  62. card.setShadowColor(UIColor.black.withAlphaComponent(0.06), for: .normal)
  63. card.layer.borderColor = UIColor(red: 228/255, green: 235/255, blue: 245/255, alpha: 1.0).cgColor
  64. card.layer.borderWidth = 1.0
  65. card.backgroundColor = .white
  66. }
  67. private func setupModernLayout() {
  68. guard let card = card, !isModernLayoutBuilt else { return }
  69. isModernLayoutBuilt = true
  70. for subview in card.subviews {
  71. subview.isHidden = true
  72. }
  73. modernContainer.translatesAutoresizingMaskIntoConstraints = false
  74. modernContainer.backgroundColor = .clear
  75. card.addSubview(modernContainer)
  76. NSLayoutConstraint.activate([
  77. modernContainer.topAnchor.constraint(equalTo: card.topAnchor, constant: 14),
  78. modernContainer.bottomAnchor.constraint(equalTo: card.bottomAnchor, constant: -14),
  79. modernContainer.leadingAnchor.constraint(equalTo: card.leadingAnchor, constant: 14),
  80. modernContainer.trailingAnchor.constraint(equalTo: card.trailingAnchor, constant: -14)
  81. ])
  82. // 1. Header Bar
  83. let headerStack = UIStackView()
  84. headerStack.translatesAutoresizingMaskIntoConstraints = false
  85. headerStack.axis = .horizontal
  86. headerStack.alignment = .center
  87. headerStack.spacing = 10
  88. modernContainer.addSubview(headerStack)
  89. modernBadgeView.translatesAutoresizingMaskIntoConstraints = false
  90. modernBadgeView.backgroundColor = UIColor(red: 254/255, green: 226/255, blue: 226/255, alpha: 1.0)
  91. modernBadgeView.layer.cornerRadius = 8
  92. modernBadgeView.layer.masksToBounds = true
  93. modernBadgeIcon.translatesAutoresizingMaskIntoConstraints = false
  94. if #available(iOS 13.0, *) {
  95. modernBadgeIcon.image = UIImage(systemName: "exclamationmark.octagon.fill")
  96. }
  97. modernBadgeIcon.tintColor = UIColor(red: 185/255, green: 28/255, blue: 28/255, alpha: 1.0)
  98. modernBadgeIcon.contentMode = .scaleAspectFit
  99. modernBadgeView.addSubview(modernBadgeIcon)
  100. let titleStack = UIStackView()
  101. titleStack.translatesAutoresizingMaskIntoConstraints = false
  102. titleStack.axis = .vertical
  103. titleStack.spacing = 2
  104. modernCategoryLabel.translatesAutoresizingMaskIntoConstraints = false
  105. modernCategoryLabel.font = UIFont.systemFont(ofSize: 10, weight: .bold)
  106. modernCategoryLabel.textColor = UIColor(red: 185/255, green: 28/255, blue: 28/255, alpha: 1.0)
  107. modernCategoryLabel.text = "SERTIFIKAT DICABUT"
  108. modernNomorLabel.translatesAutoresizingMaskIntoConstraints = false
  109. modernNomorLabel.font = UIFont.systemFont(ofSize: 14, weight: .bold)
  110. modernNomorLabel.textColor = UIColor(red: 26/255, green: 32/255, blue: 44/255, alpha: 1.0)
  111. modernNomorLabel.numberOfLines = 1
  112. titleStack.addArrangedSubview(modernCategoryLabel)
  113. titleStack.addArrangedSubview(modernNomorLabel)
  114. modernStatusPill.translatesAutoresizingMaskIntoConstraints = false
  115. modernStatusPill.layer.cornerRadius = 12
  116. modernStatusPill.layer.masksToBounds = true
  117. modernStatusPill.backgroundColor = UIColor(red: 254/255, green: 226/255, blue: 226/255, alpha: 1.0)
  118. let statusDot = UIView()
  119. statusDot.translatesAutoresizingMaskIntoConstraints = false
  120. statusDot.layer.cornerRadius = 3.5
  121. statusDot.backgroundColor = UIColor(red: 239/255, green: 68/255, blue: 68/255, alpha: 1.0)
  122. modernStatusLabel.translatesAutoresizingMaskIntoConstraints = false
  123. modernStatusLabel.font = UIFont.systemFont(ofSize: 11, weight: .bold)
  124. modernStatusLabel.textColor = UIColor(red: 185/255, green: 28/255, blue: 28/255, alpha: 1.0)
  125. modernStatusLabel.text = "DICABUT"
  126. let pillStack = UIStackView(arrangedSubviews: [statusDot, modernStatusLabel])
  127. pillStack.translatesAutoresizingMaskIntoConstraints = false
  128. pillStack.axis = .horizontal
  129. pillStack.spacing = 5
  130. pillStack.alignment = .center
  131. modernStatusPill.addSubview(pillStack)
  132. headerStack.addArrangedSubview(modernBadgeView)
  133. headerStack.addArrangedSubview(titleStack)
  134. headerStack.addArrangedSubview(modernStatusPill)
  135. // 2. Equipment Name
  136. modernPerangkatLabel.translatesAutoresizingMaskIntoConstraints = false
  137. modernPerangkatLabel.font = UIFont.systemFont(ofSize: 15, weight: .bold)
  138. modernPerangkatLabel.textColor = UIColor(red: 26/255, green: 32/255, blue: 44/255, alpha: 1.0)
  139. modernPerangkatLabel.numberOfLines = 2
  140. modernContainer.addSubview(modernPerangkatLabel)
  141. // 3. Company Row
  142. let companyStack = UIStackView()
  143. companyStack.translatesAutoresizingMaskIntoConstraints = false
  144. companyStack.axis = .horizontal
  145. companyStack.spacing = 6
  146. companyStack.alignment = .center
  147. modernContainer.addSubview(companyStack)
  148. modernCompanyIcon.translatesAutoresizingMaskIntoConstraints = false
  149. if #available(iOS 13.0, *) {
  150. modernCompanyIcon.image = UIImage(systemName: "building.2.fill")
  151. }
  152. modernCompanyIcon.tintColor = UIColor(red: 113/255, green: 128/255, blue: 150/255, alpha: 1.0)
  153. modernCompanyIcon.contentMode = .scaleAspectFit
  154. modernPemohonLabel.translatesAutoresizingMaskIntoConstraints = false
  155. modernPemohonLabel.font = UIFont.systemFont(ofSize: 13, weight: .medium)
  156. modernPemohonLabel.textColor = UIColor(red: 74/255, green: 85/255, blue: 104/255, alpha: 1.0)
  157. modernPemohonLabel.numberOfLines = 1
  158. companyStack.addArrangedSubview(modernCompanyIcon)
  159. companyStack.addArrangedSubview(modernPemohonLabel)
  160. // 4. Models Card
  161. modernModelsCard.translatesAutoresizingMaskIntoConstraints = false
  162. modernModelsCard.backgroundColor = UIColor(red: 248/255, green: 250/255, blue: 253/255, alpha: 1.0)
  163. modernModelsCard.layer.cornerRadius = 8
  164. modernModelsCard.layer.borderColor = UIColor(red: 235/255, green: 240/255, blue: 248/255, alpha: 1.0).cgColor
  165. modernModelsCard.layer.borderWidth = 1
  166. modernContainer.addSubview(modernModelsCard)
  167. modernModelsTitle.translatesAutoresizingMaskIntoConstraints = false
  168. modernModelsTitle.font = UIFont.systemFont(ofSize: 10, weight: .semibold)
  169. modernModelsTitle.textColor = UIColor(red: 113/255, green: 128/255, blue: 150/255, alpha: 1.0)
  170. modernModelsTitle.text = "MERK / MODEL"
  171. modernModelsVal.translatesAutoresizingMaskIntoConstraints = false
  172. modernModelsVal.font = UIFont.systemFont(ofSize: 12, weight: .semibold)
  173. modernModelsVal.textColor = UIColor(red: 45/255, green: 55/255, blue: 72/255, alpha: 1.0)
  174. modernModelsVal.numberOfLines = 1
  175. let modelsStack = UIStackView(arrangedSubviews: [modernModelsTitle, modernModelsVal])
  176. modelsStack.translatesAutoresizingMaskIntoConstraints = false
  177. modelsStack.axis = .vertical
  178. modelsStack.spacing = 2
  179. modernModelsCard.addSubview(modelsStack)
  180. // 5. Alasan Pencabutan Note Card
  181. modernAlasanCard.translatesAutoresizingMaskIntoConstraints = false
  182. modernAlasanCard.backgroundColor = UIColor(red: 255/255, green: 251/255, blue: 235/255, alpha: 1.0)
  183. modernAlasanCard.layer.cornerRadius = 8
  184. modernAlasanCard.layer.borderColor = UIColor(red: 253/255, green: 230/255, blue: 138/255, alpha: 1.0).cgColor
  185. modernAlasanCard.layer.borderWidth = 1
  186. modernContainer.addSubview(modernAlasanCard)
  187. modernAlasanIcon.translatesAutoresizingMaskIntoConstraints = false
  188. if #available(iOS 13.0, *) {
  189. modernAlasanIcon.image = UIImage(systemName: "exclamationmark.triangle.fill")
  190. }
  191. modernAlasanIcon.tintColor = UIColor(red: 217/255, green: 119/255, blue: 6/255, alpha: 1.0)
  192. modernAlasanIcon.contentMode = .scaleAspectFit
  193. modernAlasanLabel.translatesAutoresizingMaskIntoConstraints = false
  194. modernAlasanLabel.font = UIFont.systemFont(ofSize: 11, weight: .medium)
  195. modernAlasanLabel.textColor = UIColor(red: 146/255, green: 64/255, blue: 14/255, alpha: 1.0)
  196. modernAlasanLabel.numberOfLines = 0
  197. let alasanContent = UIStackView(arrangedSubviews: [modernAlasanIcon, modernAlasanLabel])
  198. alasanContent.translatesAutoresizingMaskIntoConstraints = false
  199. alasanContent.axis = .horizontal
  200. alasanContent.spacing = 8
  201. alasanContent.alignment = .top
  202. modernAlasanCard.addSubview(alasanContent)
  203. // 6. Approval Flow Badges (Kasi, Kasub, Direktur)
  204. modernApprovalStack.translatesAutoresizingMaskIntoConstraints = false
  205. modernApprovalStack.axis = .horizontal
  206. modernApprovalStack.distribution = .fillEqually
  207. modernApprovalStack.spacing = 6
  208. modernContainer.addSubview(modernApprovalStack)
  209. func createStepBadge(_ container: UIView, label: UILabel, role: String) {
  210. container.translatesAutoresizingMaskIntoConstraints = false
  211. container.layer.cornerRadius = 6
  212. container.layer.masksToBounds = true
  213. label.translatesAutoresizingMaskIntoConstraints = false
  214. label.font = UIFont.systemFont(ofSize: 10, weight: .bold)
  215. label.textAlignment = .center
  216. label.text = role
  217. container.addSubview(label)
  218. NSLayoutConstraint.activate([
  219. label.topAnchor.constraint(equalTo: container.topAnchor, constant: 4),
  220. label.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: -4),
  221. label.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 4),
  222. label.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -4)
  223. ])
  224. }
  225. createStepBadge(modernKasiBadge, label: modernKasiLabel, role: "Kasi")
  226. createStepBadge(modernKasubBadge, label: modernKasubLabel, role: "Kasub")
  227. createStepBadge(modernDirutBadge, label: modernDirutLabel, role: "Direktur")
  228. modernApprovalStack.addArrangedSubview(modernKasiBadge)
  229. modernApprovalStack.addArrangedSubview(modernKasubBadge)
  230. modernApprovalStack.addArrangedSubview(modernDirutBadge)
  231. // 7. Validity Footer Bar
  232. modernValidityCard.translatesAutoresizingMaskIntoConstraints = false
  233. modernValidityCard.backgroundColor = UIColor(red: 254/255, green: 242/255, blue: 242/255, alpha: 1.0)
  234. modernValidityCard.layer.cornerRadius = 10
  235. modernContainer.addSubview(modernValidityCard)
  236. modernCalendarIcon.translatesAutoresizingMaskIntoConstraints = false
  237. if #available(iOS 13.0, *) {
  238. modernCalendarIcon.image = UIImage(systemName: "calendar")
  239. }
  240. modernCalendarIcon.tintColor = UIColor(red: 185/255, green: 28/255, blue: 28/255, alpha: 1.0)
  241. modernCalendarIcon.contentMode = .scaleAspectFit
  242. modernValidityLabel.translatesAutoresizingMaskIntoConstraints = false
  243. modernValidityLabel.font = UIFont.systemFont(ofSize: 11, weight: .medium)
  244. modernValidityLabel.textColor = UIColor(red: 153/255, green: 27/255, blue: 27/255, alpha: 1.0)
  245. modernAplIdLabel.translatesAutoresizingMaskIntoConstraints = false
  246. modernAplIdLabel.font = UIFont.systemFont(ofSize: 10, weight: .bold)
  247. modernAplIdLabel.textColor = UIColor(red: 185/255, green: 28/255, blue: 28/255, alpha: 1.0)
  248. let validityContentStack = UIStackView(arrangedSubviews: [modernCalendarIcon, modernValidityLabel])
  249. validityContentStack.translatesAutoresizingMaskIntoConstraints = false
  250. validityContentStack.axis = .horizontal
  251. validityContentStack.spacing = 6
  252. validityContentStack.alignment = .center
  253. let footerStack = UIStackView(arrangedSubviews: [validityContentStack, modernAplIdLabel])
  254. footerStack.translatesAutoresizingMaskIntoConstraints = false
  255. footerStack.axis = .horizontal
  256. footerStack.distribution = .equalSpacing
  257. footerStack.alignment = .center
  258. modernValidityCard.addSubview(footerStack)
  259. // Constraints
  260. NSLayoutConstraint.activate([
  261. headerStack.topAnchor.constraint(equalTo: modernContainer.topAnchor),
  262. headerStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  263. headerStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  264. modernBadgeView.widthAnchor.constraint(equalToConstant: 34),
  265. modernBadgeView.heightAnchor.constraint(equalToConstant: 34),
  266. modernBadgeIcon.centerXAnchor.constraint(equalTo: modernBadgeView.centerXAnchor),
  267. modernBadgeIcon.centerYAnchor.constraint(equalTo: modernBadgeView.centerYAnchor),
  268. modernBadgeIcon.widthAnchor.constraint(equalToConstant: 18),
  269. modernBadgeIcon.heightAnchor.constraint(equalToConstant: 18),
  270. statusDot.widthAnchor.constraint(equalToConstant: 7),
  271. statusDot.heightAnchor.constraint(equalToConstant: 7),
  272. pillStack.topAnchor.constraint(equalTo: modernStatusPill.topAnchor, constant: 5),
  273. pillStack.bottomAnchor.constraint(equalTo: modernStatusPill.bottomAnchor, constant: -5),
  274. pillStack.leadingAnchor.constraint(equalTo: modernStatusPill.leadingAnchor, constant: 10),
  275. pillStack.trailingAnchor.constraint(equalTo: modernStatusPill.trailingAnchor, constant: -10),
  276. modernPerangkatLabel.topAnchor.constraint(equalTo: headerStack.bottomAnchor, constant: 10),
  277. modernPerangkatLabel.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  278. modernPerangkatLabel.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  279. companyStack.topAnchor.constraint(equalTo: modernPerangkatLabel.bottomAnchor, constant: 6),
  280. companyStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  281. companyStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  282. modernCompanyIcon.widthAnchor.constraint(equalToConstant: 14),
  283. modernCompanyIcon.heightAnchor.constraint(equalToConstant: 14),
  284. modernModelsCard.topAnchor.constraint(equalTo: companyStack.bottomAnchor, constant: 8),
  285. modernModelsCard.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  286. modernModelsCard.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  287. modelsStack.topAnchor.constraint(equalTo: modernModelsCard.topAnchor, constant: 6),
  288. modelsStack.bottomAnchor.constraint(equalTo: modernModelsCard.bottomAnchor, constant: -6),
  289. modelsStack.leadingAnchor.constraint(equalTo: modernModelsCard.leadingAnchor, constant: 8),
  290. modelsStack.trailingAnchor.constraint(equalTo: modernModelsCard.trailingAnchor, constant: -8),
  291. modernAlasanCard.topAnchor.constraint(equalTo: modernModelsCard.bottomAnchor, constant: 8),
  292. modernAlasanCard.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  293. modernAlasanCard.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  294. modernAlasanIcon.widthAnchor.constraint(equalToConstant: 14),
  295. modernAlasanIcon.heightAnchor.constraint(equalToConstant: 14),
  296. alasanContent.topAnchor.constraint(equalTo: modernAlasanCard.topAnchor, constant: 8),
  297. alasanContent.bottomAnchor.constraint(equalTo: modernAlasanCard.bottomAnchor, constant: -8),
  298. alasanContent.leadingAnchor.constraint(equalTo: modernAlasanCard.leadingAnchor, constant: 8),
  299. alasanContent.trailingAnchor.constraint(equalTo: modernAlasanCard.trailingAnchor, constant: -8),
  300. modernApprovalStack.topAnchor.constraint(equalTo: modernAlasanCard.bottomAnchor, constant: 8),
  301. modernApprovalStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  302. modernApprovalStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  303. modernValidityCard.topAnchor.constraint(equalTo: modernApprovalStack.bottomAnchor, constant: 10),
  304. modernValidityCard.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  305. modernValidityCard.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  306. modernValidityCard.bottomAnchor.constraint(equalTo: modernContainer.bottomAnchor),
  307. modernCalendarIcon.widthAnchor.constraint(equalToConstant: 13),
  308. modernCalendarIcon.heightAnchor.constraint(equalToConstant: 13),
  309. footerStack.topAnchor.constraint(equalTo: modernValidityCard.topAnchor, constant: 8),
  310. footerStack.bottomAnchor.constraint(equalTo: modernValidityCard.bottomAnchor, constant: -8),
  311. footerStack.leadingAnchor.constraint(equalTo: modernValidityCard.leadingAnchor, constant: 10),
  312. footerStack.trailingAnchor.constraint(equalTo: modernValidityCard.trailingAnchor, constant: -10)
  313. ])
  314. }
  315. private func updateBadgeState(_ container: UIView, label: UILabel, role: String, approved: Bool) {
  316. if approved {
  317. container.backgroundColor = UIColor(red: 232/255, green: 248/255, blue: 240/255, alpha: 1.0)
  318. label.textColor = UIColor(red: 16/255, green: 124/255, blue: 65/255, alpha: 1.0)
  319. label.text = "✓ \(role)"
  320. } else {
  321. container.backgroundColor = UIColor(red: 241/255, green: 245/255, blue: 249/255, alpha: 1.0)
  322. label.textColor = UIColor(red: 148/255, green: 163/255, blue: 184/255, alpha: 1.0)
  323. label.text = "○ \(role)"
  324. }
  325. }
  326. func updateViews(sertifikatDaftarPencabutan: SertifikatDaftarPencabutan) {
  327. card?.isInteractable = false
  328. setupModernLayout()
  329. let nomor = sertifikatDaftarPencabutan.nomor.isEmpty ? "-" : sertifikatDaftarPencabutan.nomor
  330. modernNomorLabel.text = nomor
  331. lblNo?.text = nomor
  332. let expFormatted = CommonHelper.formatDate(from: sertifikatDaftarPencabutan.exp)
  333. modernValidityLabel.text = "Kedaluwarsa: \(expFormatted)"
  334. lblExpDate?.text = "EXPIRED: \(expFormatted)"
  335. let cust = sertifikatDaftarPencabutan.cust_name.isEmpty ? "-" : sertifikatDaftarPencabutan.cust_name
  336. modernPemohonLabel.text = cust
  337. lblCustName?.text = cust
  338. let eqp = sertifikatDaftarPencabutan.eqp_name.isEmpty ? "-" : sertifikatDaftarPencabutan.eqp_name
  339. modernPerangkatLabel.text = eqp
  340. lblEqpName?.text = eqp
  341. let models = sertifikatDaftarPencabutan.models.isEmpty ? "-" : sertifikatDaftarPencabutan.models
  342. modernModelsVal.text = models
  343. lblModels?.text = models
  344. let alasan = sertifikatDaftarPencabutan.alasan.isEmpty ? "Tidak ada keterangan" : sertifikatDaftarPencabutan.alasan
  345. modernAlasanLabel.text = "Alasan: \(alasan)"
  346. lblKeterangan?.text = "KETERANGAN: \(alasan)"
  347. modernAplIdLabel.text = "ID: \(sertifikatDaftarPencabutan.apl_id)"
  348. lblAplikasiId?.text = "\(sertifikatDaftarPencabutan.apl_id)"
  349. // Update Approval Badges
  350. let isKasi = sertifikatDaftarPencabutan.kasiBatal()
  351. let isKasub = sertifikatDaftarPencabutan.kasubBatal()
  352. let isDirut = sertifikatDaftarPencabutan.dirutBatal()
  353. updateBadgeState(modernKasiBadge, label: modernKasiLabel, role: "Kasi", approved: isKasi)
  354. updateBadgeState(modernKasubBadge, label: modernKasubLabel, role: "Kasub", approved: isKasub)
  355. updateBadgeState(modernDirutBadge, label: modernDirutLabel, role: "Direktur", approved: isDirut)
  356. // Sync legacy checkboxes for storyboard compatibility
  357. cbKasi?.image = UIImage(named: isKasi ? "checked-box" : "unchecked-box")
  358. cbKasub?.image = UIImage(named: isKasub ? "checked-box" : "unchecked-box")
  359. cbDirektur?.image = UIImage(named: isDirut ? "checked-box" : "unchecked-box")
  360. }
  361. }