SertifikatSudahUploadCell.swift 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. //
  2. // SertifikatSudahUploadCell.swift
  3. // Sirani
  4. //
  5. // Created by Anhar Solehudin on 14/04/19.
  6. // Copyright © 2019 Anhar Solehudin. All rights reserved.
  7. //
  8. import UIKit
  9. import MaterialComponents.MaterialCards
  10. protocol SertifikatSudahUploadCellDelegate: NSObjectProtocol {
  11. func download(urlWeb: String?)
  12. }
  13. class SertifikatSudahUploadCell: UITableViewCell {
  14. @IBOutlet weak var card: MDCCard!
  15. @IBOutlet weak var lblAplikasiId: UILabel!
  16. @IBOutlet weak var lblNo: UILabel!
  17. @IBOutlet weak var lblTgl: UILabel!
  18. @IBOutlet weak var lblPelangganId: UILabel!
  19. @IBOutlet weak var lblNib: UILabel!
  20. @IBOutlet weak var lblCustName: UILabel!
  21. @IBOutlet weak var lblEqp: UILabel!
  22. @IBOutlet weak var lblMerk: UILabel!
  23. @IBOutlet weak var lblModel: UILabel!
  24. @IBOutlet weak var lblBrand: UILabel!
  25. @IBOutlet weak var btnDwnldPeringatan: UIButton!
  26. @IBOutlet weak var btnDownloadQrCode: UIButton!
  27. @IBOutlet weak var btnDownloadLabel: UIButton!
  28. var cellDelegate: SertifikatSudahUploadCellDelegate?
  29. var urlPeringatan = ""
  30. var urlQrCode = ""
  31. var urlLabel = ""
  32. // Modern Programmatic UI Elements
  33. private let modernContainer = UIView()
  34. private let modernBadgeView = UIView()
  35. private let modernBadgeIcon = UIImageView()
  36. private let modernNomorLabel = UILabel()
  37. private let modernCategoryLabel = UILabel()
  38. private let modernStatusPill = UIView()
  39. private let modernStatusLabel = UILabel()
  40. private let modernPerangkatLabel = UILabel()
  41. private let modernCompanyIcon = UIImageView()
  42. private let modernCustLabel = UILabel()
  43. private let modernSpecStack = UIStackView()
  44. private let modernMerkCard = UIView()
  45. private let modernMerkTitle = UILabel()
  46. private let modernMerkVal = UILabel()
  47. private let modernNibCard = UIView()
  48. private let modernNibTitle = UILabel()
  49. private let modernNibVal = UILabel()
  50. private let modernValidityCard = UIView()
  51. private let modernCalendarIcon = UIImageView()
  52. private let modernValidityLabel = UILabel()
  53. private let modernAplIdLabel = UILabel()
  54. private let modernActionStack = UIStackView()
  55. private let modernBtnPeringatan = UIButton(type: .system)
  56. private let modernBtnQrCode = UIButton(type: .system)
  57. private let modernBtnLabel = UIButton(type: .system)
  58. private var isModernLayoutBuilt = false
  59. override func awakeFromNib() {
  60. super.awakeFromNib()
  61. self.selectionStyle = .none
  62. self.backgroundColor = .clear
  63. setupCardVisuals()
  64. setupModernLayout()
  65. }
  66. private func setupCardVisuals() {
  67. guard let card = card else { return }
  68. card.cornerRadius = 16
  69. card.setShadowElevation(ShadowElevation(rawValue: 2), for: .normal)
  70. card.setShadowColor(UIColor.black.withAlphaComponent(0.06), for: .normal)
  71. card.layer.borderColor = UIColor(red: 228/255, green: 235/255, blue: 245/255, alpha: 1.0).cgColor
  72. card.layer.borderWidth = 1.0
  73. card.backgroundColor = .white
  74. }
  75. private func setupModernLayout() {
  76. guard let card = card, !isModernLayoutBuilt else { return }
  77. isModernLayoutBuilt = true
  78. for subview in card.subviews {
  79. subview.isHidden = true
  80. }
  81. modernContainer.translatesAutoresizingMaskIntoConstraints = false
  82. modernContainer.backgroundColor = .clear
  83. card.addSubview(modernContainer)
  84. NSLayoutConstraint.activate([
  85. modernContainer.topAnchor.constraint(equalTo: card.topAnchor, constant: 14),
  86. modernContainer.bottomAnchor.constraint(equalTo: card.bottomAnchor, constant: -14),
  87. modernContainer.leadingAnchor.constraint(equalTo: card.leadingAnchor, constant: 14),
  88. modernContainer.trailingAnchor.constraint(equalTo: card.trailingAnchor, constant: -14)
  89. ])
  90. // 1. Header Bar
  91. let headerStack = UIStackView()
  92. headerStack.translatesAutoresizingMaskIntoConstraints = false
  93. headerStack.axis = .horizontal
  94. headerStack.alignment = .center
  95. headerStack.spacing = 10
  96. modernContainer.addSubview(headerStack)
  97. modernBadgeView.translatesAutoresizingMaskIntoConstraints = false
  98. modernBadgeView.backgroundColor = UIColor(red: 232/255, green: 248/255, blue: 240/255, alpha: 1.0)
  99. modernBadgeView.layer.cornerRadius = 8
  100. modernBadgeView.layer.masksToBounds = true
  101. modernBadgeIcon.translatesAutoresizingMaskIntoConstraints = false
  102. if #available(iOS 13.0, *) {
  103. modernBadgeIcon.image = UIImage(systemName: "photo.badge.checkmark")
  104. }
  105. modernBadgeIcon.tintColor = UIColor(red: 16/255, green: 124/255, blue: 65/255, alpha: 1.0)
  106. modernBadgeIcon.contentMode = .scaleAspectFit
  107. modernBadgeView.addSubview(modernBadgeIcon)
  108. let titleStack = UIStackView()
  109. titleStack.translatesAutoresizingMaskIntoConstraints = false
  110. titleStack.axis = .vertical
  111. titleStack.spacing = 2
  112. modernCategoryLabel.translatesAutoresizingMaskIntoConstraints = false
  113. modernCategoryLabel.font = UIFont.systemFont(ofSize: 10, weight: .bold)
  114. modernCategoryLabel.textColor = UIColor(red: 16/255, green: 124/255, blue: 65/255, alpha: 1.0)
  115. modernCategoryLabel.text = "FOTO LABEL"
  116. modernNomorLabel.translatesAutoresizingMaskIntoConstraints = false
  117. modernNomorLabel.font = UIFont.systemFont(ofSize: 14, weight: .bold)
  118. modernNomorLabel.textColor = UIColor(red: 26/255, green: 32/255, blue: 44/255, alpha: 1.0)
  119. modernNomorLabel.numberOfLines = 1
  120. titleStack.addArrangedSubview(modernCategoryLabel)
  121. titleStack.addArrangedSubview(modernNomorLabel)
  122. modernStatusPill.translatesAutoresizingMaskIntoConstraints = false
  123. modernStatusPill.layer.cornerRadius = 12
  124. modernStatusPill.layer.masksToBounds = true
  125. modernStatusPill.backgroundColor = UIColor(red: 232/255, green: 248/255, blue: 240/255, alpha: 1.0)
  126. let statusDot = UIView()
  127. statusDot.translatesAutoresizingMaskIntoConstraints = false
  128. statusDot.layer.cornerRadius = 3.5
  129. statusDot.backgroundColor = UIColor(red: 16/255, green: 124/255, blue: 65/255, alpha: 1.0)
  130. modernStatusLabel.translatesAutoresizingMaskIntoConstraints = false
  131. modernStatusLabel.font = UIFont.systemFont(ofSize: 11, weight: .bold)
  132. modernStatusLabel.textColor = UIColor(red: 16/255, green: 124/255, blue: 65/255, alpha: 1.0)
  133. modernStatusLabel.text = "SUDAH UPLOAD"
  134. let pillStack = UIStackView(arrangedSubviews: [statusDot, modernStatusLabel])
  135. pillStack.translatesAutoresizingMaskIntoConstraints = false
  136. pillStack.axis = .horizontal
  137. pillStack.spacing = 5
  138. pillStack.alignment = .center
  139. modernStatusPill.addSubview(pillStack)
  140. headerStack.addArrangedSubview(modernBadgeView)
  141. headerStack.addArrangedSubview(titleStack)
  142. headerStack.addArrangedSubview(modernStatusPill)
  143. // 2. Equipment Name
  144. modernPerangkatLabel.translatesAutoresizingMaskIntoConstraints = false
  145. modernPerangkatLabel.font = UIFont.systemFont(ofSize: 15, weight: .bold)
  146. modernPerangkatLabel.textColor = UIColor(red: 26/255, green: 32/255, blue: 44/255, alpha: 1.0)
  147. modernPerangkatLabel.numberOfLines = 2
  148. modernContainer.addSubview(modernPerangkatLabel)
  149. // 3. Company Row
  150. let companyStack = UIStackView()
  151. companyStack.translatesAutoresizingMaskIntoConstraints = false
  152. companyStack.axis = .horizontal
  153. companyStack.spacing = 6
  154. companyStack.alignment = .center
  155. modernContainer.addSubview(companyStack)
  156. modernCompanyIcon.translatesAutoresizingMaskIntoConstraints = false
  157. if #available(iOS 13.0, *) {
  158. modernCompanyIcon.image = UIImage(systemName: "building.2.fill")
  159. }
  160. modernCompanyIcon.tintColor = UIColor(red: 113/255, green: 128/255, blue: 150/255, alpha: 1.0)
  161. modernCompanyIcon.contentMode = .scaleAspectFit
  162. modernCustLabel.translatesAutoresizingMaskIntoConstraints = false
  163. modernCustLabel.font = UIFont.systemFont(ofSize: 13, weight: .medium)
  164. modernCustLabel.textColor = UIColor(red: 74/255, green: 85/255, blue: 104/255, alpha: 1.0)
  165. modernCustLabel.numberOfLines = 1
  166. companyStack.addArrangedSubview(modernCompanyIcon)
  167. companyStack.addArrangedSubview(modernCustLabel)
  168. // 4. Spec Stack (Merk/Model/Brand | NIB/PLG)
  169. modernSpecStack.translatesAutoresizingMaskIntoConstraints = false
  170. modernSpecStack.axis = .horizontal
  171. modernSpecStack.distribution = .fillEqually
  172. modernSpecStack.spacing = 8
  173. modernContainer.addSubview(modernSpecStack)
  174. func styleMiniCard(_ cardView: UIView, titleLabel: UILabel, valLabel: UILabel, title: String) {
  175. cardView.translatesAutoresizingMaskIntoConstraints = false
  176. cardView.backgroundColor = UIColor(red: 248/255, green: 250/255, blue: 253/255, alpha: 1.0)
  177. cardView.layer.cornerRadius = 8
  178. cardView.layer.borderColor = UIColor(red: 235/255, green: 240/255, blue: 248/255, alpha: 1.0).cgColor
  179. cardView.layer.borderWidth = 1
  180. titleLabel.translatesAutoresizingMaskIntoConstraints = false
  181. titleLabel.font = UIFont.systemFont(ofSize: 10, weight: .semibold)
  182. titleLabel.textColor = UIColor(red: 113/255, green: 128/255, blue: 150/255, alpha: 1.0)
  183. titleLabel.text = title
  184. valLabel.translatesAutoresizingMaskIntoConstraints = false
  185. valLabel.font = UIFont.systemFont(ofSize: 12, weight: .semibold)
  186. valLabel.textColor = UIColor(red: 45/255, green: 55/255, blue: 72/255, alpha: 1.0)
  187. valLabel.numberOfLines = 1
  188. let stack = UIStackView(arrangedSubviews: [titleLabel, valLabel])
  189. stack.translatesAutoresizingMaskIntoConstraints = false
  190. stack.axis = .vertical
  191. stack.spacing = 2
  192. cardView.addSubview(stack)
  193. NSLayoutConstraint.activate([
  194. stack.topAnchor.constraint(equalTo: cardView.topAnchor, constant: 6),
  195. stack.bottomAnchor.constraint(equalTo: cardView.bottomAnchor, constant: -6),
  196. stack.leadingAnchor.constraint(equalTo: cardView.leadingAnchor, constant: 8),
  197. stack.trailingAnchor.constraint(equalTo: cardView.trailingAnchor, constant: -8)
  198. ])
  199. }
  200. styleMiniCard(modernMerkCard, titleLabel: modernMerkTitle, valLabel: modernMerkVal, title: "MERK / MODEL / BRAND")
  201. styleMiniCard(modernNibCard, titleLabel: modernNibTitle, valLabel: modernNibVal, title: "NIB & ID PELANGGAN")
  202. modernSpecStack.addArrangedSubview(modernMerkCard)
  203. modernSpecStack.addArrangedSubview(modernNibCard)
  204. // 5. Validity Footer Bar
  205. modernValidityCard.translatesAutoresizingMaskIntoConstraints = false
  206. modernValidityCard.backgroundColor = UIColor(red: 244/255, green: 248/255, blue: 254/255, alpha: 1.0)
  207. modernValidityCard.layer.cornerRadius = 10
  208. modernContainer.addSubview(modernValidityCard)
  209. modernCalendarIcon.translatesAutoresizingMaskIntoConstraints = false
  210. if #available(iOS 13.0, *) {
  211. modernCalendarIcon.image = UIImage(systemName: "calendar")
  212. }
  213. modernCalendarIcon.tintColor = UIColor(red: 0/255, green: 82/255, blue: 204/255, alpha: 1.0)
  214. modernCalendarIcon.contentMode = .scaleAspectFit
  215. modernValidityLabel.translatesAutoresizingMaskIntoConstraints = false
  216. modernValidityLabel.font = UIFont.systemFont(ofSize: 11, weight: .medium)
  217. modernValidityLabel.textColor = UIColor(red: 74/255, green: 85/255, blue: 104/255, alpha: 1.0)
  218. modernAplIdLabel.translatesAutoresizingMaskIntoConstraints = false
  219. modernAplIdLabel.font = UIFont.systemFont(ofSize: 10, weight: .bold)
  220. modernAplIdLabel.textColor = UIColor(red: 0/255, green: 82/255, blue: 204/255, alpha: 1.0)
  221. let validityContentStack = UIStackView(arrangedSubviews: [modernCalendarIcon, modernValidityLabel])
  222. validityContentStack.translatesAutoresizingMaskIntoConstraints = false
  223. validityContentStack.axis = .horizontal
  224. validityContentStack.spacing = 6
  225. validityContentStack.alignment = .center
  226. let footerStack = UIStackView(arrangedSubviews: [validityContentStack, modernAplIdLabel])
  227. footerStack.translatesAutoresizingMaskIntoConstraints = false
  228. footerStack.axis = .horizontal
  229. footerStack.distribution = .equalSpacing
  230. footerStack.alignment = .center
  231. modernValidityCard.addSubview(footerStack)
  232. // 6. Action Buttons Bar
  233. modernActionStack.translatesAutoresizingMaskIntoConstraints = false
  234. modernActionStack.axis = .horizontal
  235. modernActionStack.distribution = .fillEqually
  236. modernActionStack.spacing = 8
  237. modernContainer.addSubview(modernActionStack)
  238. func styleActionButton(_ button: UIButton, title: String, iconName: String, action: Selector) {
  239. button.translatesAutoresizingMaskIntoConstraints = false
  240. button.setTitle(" \(title)", for: .normal)
  241. if #available(iOS 13.0, *) {
  242. button.setImage(UIImage(systemName: iconName), for: .normal)
  243. }
  244. button.tintColor = UIColor(red: 0/255, green: 82/255, blue: 204/255, alpha: 1.0)
  245. button.titleLabel?.font = UIFont.systemFont(ofSize: 11, weight: .semibold)
  246. button.backgroundColor = UIColor(red: 235/255, green: 242/255, blue: 252/255, alpha: 1.0)
  247. button.layer.cornerRadius = 8
  248. button.layer.borderWidth = 1
  249. button.layer.borderColor = UIColor(red: 218/255, green: 230/255, blue: 247/255, alpha: 1.0).cgColor
  250. button.heightAnchor.constraint(equalToConstant: 34).isActive = true
  251. button.addTarget(self, action: action, for: .touchUpInside)
  252. }
  253. styleActionButton(modernBtnPeringatan, title: "Peringatan", iconName: "doc.text", action: #selector(onModernPeringatanTap))
  254. styleActionButton(modernBtnQrCode, title: "QR Code", iconName: "qrcode", action: #selector(onModernQrTap))
  255. styleActionButton(modernBtnLabel, title: "Label", iconName: "tag", action: #selector(onModernLabelTap))
  256. modernActionStack.addArrangedSubview(modernBtnPeringatan)
  257. modernActionStack.addArrangedSubview(modernBtnQrCode)
  258. modernActionStack.addArrangedSubview(modernBtnLabel)
  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. modernSpecStack.topAnchor.constraint(equalTo: companyStack.bottomAnchor, constant: 10),
  285. modernSpecStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  286. modernSpecStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  287. modernValidityCard.topAnchor.constraint(equalTo: modernSpecStack.bottomAnchor, constant: 10),
  288. modernValidityCard.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  289. modernValidityCard.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  290. modernCalendarIcon.widthAnchor.constraint(equalToConstant: 13),
  291. modernCalendarIcon.heightAnchor.constraint(equalToConstant: 13),
  292. footerStack.topAnchor.constraint(equalTo: modernValidityCard.topAnchor, constant: 8),
  293. footerStack.bottomAnchor.constraint(equalTo: modernValidityCard.bottomAnchor, constant: -8),
  294. footerStack.leadingAnchor.constraint(equalTo: modernValidityCard.leadingAnchor, constant: 10),
  295. footerStack.trailingAnchor.constraint(equalTo: modernValidityCard.trailingAnchor, constant: -10),
  296. modernActionStack.topAnchor.constraint(equalTo: modernValidityCard.bottomAnchor, constant: 10),
  297. modernActionStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  298. modernActionStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  299. modernActionStack.bottomAnchor.constraint(equalTo: modernContainer.bottomAnchor)
  300. ])
  301. }
  302. @objc private func onModernPeringatanTap() {
  303. cellDelegate?.download(urlWeb: urlPeringatan)
  304. }
  305. @objc private func onModernQrTap() {
  306. cellDelegate?.download(urlWeb: urlQrCode)
  307. }
  308. @objc private func onModernLabelTap() {
  309. cellDelegate?.download(urlWeb: urlLabel)
  310. }
  311. func updateViews(sertSdhUpload: SertifikatSudahUpload) {
  312. card?.isInteractable = false
  313. setupModernLayout()
  314. urlPeringatan = sertSdhUpload.file_peringatan
  315. urlQrCode = sertSdhUpload.file_qr_code
  316. urlLabel = sertSdhUpload.file_label
  317. let nomor = sertSdhUpload.nomor.isEmpty ? "-" : sertSdhUpload.nomor
  318. modernNomorLabel.text = nomor
  319. lblNo?.text = nomor
  320. let tglFormatted = CommonHelper.formatDate(from: sertSdhUpload.tgl)
  321. let expFormatted = CommonHelper.formatDate(from: sertSdhUpload.exp)
  322. modernValidityLabel.text = "\(tglFormatted) s/d \(expFormatted)"
  323. lblTgl?.text = "\(tglFormatted) s/d \(expFormatted)"
  324. let plgId = "\(sertSdhUpload.plg_id)"
  325. let nib = sertSdhUpload.nib.isEmpty ? "-" : sertSdhUpload.nib
  326. lblPelangganId?.text = "PLG ID: \(plgId)"
  327. lblNib?.text = "NIB: \(nib)"
  328. modernNibVal.text = "NIB: \(nib) | PLG: \(plgId)"
  329. let cust = sertSdhUpload.cust_name.isEmpty ? "-" : sertSdhUpload.cust_name
  330. modernCustLabel.text = cust
  331. lblCustName?.text = cust
  332. let eqp = sertSdhUpload.eqp_name.isEmpty ? "-" : sertSdhUpload.eqp_name
  333. modernPerangkatLabel.text = eqp
  334. lblEqp?.text = eqp
  335. let merk = sertSdhUpload.merk.isEmpty ? "-" : sertSdhUpload.merk
  336. let model = sertSdhUpload.model.isEmpty ? "-" : sertSdhUpload.model
  337. let brand = sertSdhUpload.brand.isEmpty ? "-" : sertSdhUpload.brand
  338. lblMerk?.text = "Merk: \(merk)"
  339. lblModel?.text = "Model: \(model)"
  340. lblBrand?.text = "Brand: \(brand)"
  341. modernMerkVal.text = "\(merk) / \(model) / \(brand)"
  342. modernAplIdLabel.text = "ID: \(sertSdhUpload.apl_id)"
  343. lblAplikasiId?.text = "\(sertSdhUpload.apl_id)"
  344. // Button state check
  345. modernBtnPeringatan.alpha = urlPeringatan.isEmpty ? 0.4 : 1.0
  346. modernBtnQrCode.alpha = urlQrCode.isEmpty ? 0.4 : 1.0
  347. modernBtnLabel.alpha = urlLabel.isEmpty ? 0.4 : 1.0
  348. }
  349. @IBAction func onBtnDwnldPeringatanTap(_ sender: Any) {
  350. cellDelegate?.download(urlWeb: urlPeringatan)
  351. }
  352. @IBAction func onBtnDwnldQrCodeTap(_ sender: Any) {
  353. cellDelegate?.download(urlWeb: urlQrCode)
  354. }
  355. @IBAction func onBtnDwnldLabelTap(_ sender: Any) {
  356. cellDelegate?.download(urlWeb: urlLabel)
  357. }
  358. }