SertifikatBelumUploadCell.swift 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. //
  2. // SertifikatBelumUploadCell.swift
  3. // Sirani
  4. //
  5. // Created by Anhar Solehudin on 16/04/19.
  6. // Copyright © 2019 Anhar Solehudin. All rights reserved.
  7. //
  8. import UIKit
  9. import MaterialComponents.MaterialCards
  10. protocol SertifikatBelumUploadCellDelegate: NSObjectProtocol {
  11. func download(urlWeb: String?, filename: String?)
  12. func upload(aplikasiId: Int?)
  13. }
  14. class SertifikatBelumUploadCell: UITableViewCell {
  15. @IBOutlet weak var card: MDCCard!
  16. @IBOutlet weak var lblAplikasiId: UILabel!
  17. @IBOutlet weak var lblNo: UILabel!
  18. @IBOutlet weak var lblTgl: UILabel!
  19. @IBOutlet weak var lblPlgId: UILabel!
  20. @IBOutlet weak var lblNib: UILabel!
  21. @IBOutlet weak var lblCustName: UILabel!
  22. @IBOutlet weak var lblEqpName: UILabel!
  23. @IBOutlet weak var lblMerk: UILabel!
  24. @IBOutlet weak var lblModel: UILabel!
  25. @IBOutlet weak var lblBrand: UILabel!
  26. @IBOutlet weak var lblPeringatan1: UILabel!
  27. @IBOutlet weak var lblPeringatan2: UILabel!
  28. @IBOutlet weak var lblPeringatan3: UILabel!
  29. @IBOutlet weak var btnUpload: UIButton!
  30. @IBOutlet weak var btnDownloadSpt: UIButton!
  31. @IBOutlet weak var btnDownloadSt2: UIButton!
  32. @IBOutlet weak var btnDownloadSt1: UIButton!
  33. var cellDelegate: SertifikatBelumUploadCellDelegate?
  34. var aplikasiId = 0
  35. var urlCetakSt1 = ""
  36. var urlCetakSt2 = ""
  37. var urlCetakSpt = ""
  38. // Modern Programmatic UI Elements
  39. private let modernContainer = UIView()
  40. private let modernBadgeView = UIView()
  41. private let modernBadgeIcon = UIImageView()
  42. private let modernNomorLabel = UILabel()
  43. private let modernCategoryLabel = UILabel()
  44. private let modernStatusPill = UIView()
  45. private let modernStatusLabel = UILabel()
  46. private let modernPerangkatLabel = UILabel()
  47. private let modernCompanyIcon = UIImageView()
  48. private let modernCustLabel = UILabel()
  49. private let modernSpecStack = UIStackView()
  50. private let modernMerkCard = UIView()
  51. private let modernMerkTitle = UILabel()
  52. private let modernMerkVal = UILabel()
  53. private let modernNibCard = UIView()
  54. private let modernNibTitle = UILabel()
  55. private let modernNibVal = UILabel()
  56. private let modernPeringatanCard = UIView()
  57. private let modernPeringatanIcon = UIImageView()
  58. private let modernPeringatanLabel = UILabel()
  59. private let modernValidityCard = UIView()
  60. private let modernCalendarIcon = UIImageView()
  61. private let modernValidityLabel = UILabel()
  62. private let modernAplIdLabel = UILabel()
  63. private let modernUploadBtn = UIButton(type: .system)
  64. private let modernDownloadStack = UIStackView()
  65. private let modernBtnSt1 = UIButton(type: .system)
  66. private let modernBtnSt2 = UIButton(type: .system)
  67. private let modernBtnSpt = UIButton(type: .system)
  68. private var isModernLayoutBuilt = false
  69. override func awakeFromNib() {
  70. super.awakeFromNib()
  71. self.selectionStyle = .none
  72. self.backgroundColor = .clear
  73. setupCardVisuals()
  74. setupModernLayout()
  75. }
  76. private func setupCardVisuals() {
  77. guard let card = card else { return }
  78. card.cornerRadius = 16
  79. card.setShadowElevation(ShadowElevation(rawValue: 2), for: .normal)
  80. card.setShadowColor(UIColor.black.withAlphaComponent(0.06), for: .normal)
  81. card.layer.borderColor = UIColor(red: 228/255, green: 235/255, blue: 245/255, alpha: 1.0).cgColor
  82. card.layer.borderWidth = 1.0
  83. card.backgroundColor = .white
  84. }
  85. private func setupModernLayout() {
  86. guard let card = card, !isModernLayoutBuilt else { return }
  87. isModernLayoutBuilt = true
  88. for subview in card.subviews {
  89. subview.isHidden = true
  90. }
  91. modernContainer.translatesAutoresizingMaskIntoConstraints = false
  92. modernContainer.backgroundColor = .clear
  93. card.addSubview(modernContainer)
  94. NSLayoutConstraint.activate([
  95. modernContainer.topAnchor.constraint(equalTo: card.topAnchor, constant: 14),
  96. modernContainer.bottomAnchor.constraint(equalTo: card.bottomAnchor, constant: -14),
  97. modernContainer.leadingAnchor.constraint(equalTo: card.leadingAnchor, constant: 14),
  98. modernContainer.trailingAnchor.constraint(equalTo: card.trailingAnchor, constant: -14)
  99. ])
  100. // 1. Header Bar
  101. let headerStack = UIStackView()
  102. headerStack.translatesAutoresizingMaskIntoConstraints = false
  103. headerStack.axis = .horizontal
  104. headerStack.alignment = .center
  105. headerStack.spacing = 10
  106. modernContainer.addSubview(headerStack)
  107. modernBadgeView.translatesAutoresizingMaskIntoConstraints = false
  108. modernBadgeView.backgroundColor = UIColor(red: 254/255, green: 243/255, blue: 199/255, alpha: 1.0)
  109. modernBadgeView.layer.cornerRadius = 8
  110. modernBadgeView.layer.masksToBounds = true
  111. modernBadgeIcon.translatesAutoresizingMaskIntoConstraints = false
  112. if #available(iOS 13.0, *) {
  113. modernBadgeIcon.image = UIImage(systemName: "photo")
  114. }
  115. modernBadgeIcon.tintColor = UIColor(red: 180/255, green: 83/255, blue: 9/255, alpha: 1.0)
  116. modernBadgeIcon.contentMode = .scaleAspectFit
  117. modernBadgeView.addSubview(modernBadgeIcon)
  118. let titleStack = UIStackView()
  119. titleStack.translatesAutoresizingMaskIntoConstraints = false
  120. titleStack.axis = .vertical
  121. titleStack.spacing = 2
  122. modernCategoryLabel.translatesAutoresizingMaskIntoConstraints = false
  123. modernCategoryLabel.font = UIFont.systemFont(ofSize: 10, weight: .bold)
  124. modernCategoryLabel.textColor = UIColor(red: 180/255, green: 83/255, blue: 9/255, alpha: 1.0)
  125. modernCategoryLabel.text = "FOTO LABEL"
  126. modernNomorLabel.translatesAutoresizingMaskIntoConstraints = false
  127. modernNomorLabel.font = UIFont.systemFont(ofSize: 14, weight: .bold)
  128. modernNomorLabel.textColor = UIColor(red: 26/255, green: 32/255, blue: 44/255, alpha: 1.0)
  129. modernNomorLabel.numberOfLines = 1
  130. titleStack.addArrangedSubview(modernCategoryLabel)
  131. titleStack.addArrangedSubview(modernNomorLabel)
  132. modernStatusPill.translatesAutoresizingMaskIntoConstraints = false
  133. modernStatusPill.layer.cornerRadius = 12
  134. modernStatusPill.layer.masksToBounds = true
  135. modernStatusPill.backgroundColor = UIColor(red: 254/255, green: 243/255, blue: 199/255, alpha: 1.0)
  136. let statusDot = UIView()
  137. statusDot.translatesAutoresizingMaskIntoConstraints = false
  138. statusDot.layer.cornerRadius = 3.5
  139. statusDot.backgroundColor = UIColor(red: 245/255, green: 158/255, blue: 11/255, alpha: 1.0)
  140. modernStatusLabel.translatesAutoresizingMaskIntoConstraints = false
  141. modernStatusLabel.font = UIFont.systemFont(ofSize: 11, weight: .bold)
  142. modernStatusLabel.textColor = UIColor(red: 180/255, green: 83/255, blue: 9/255, alpha: 1.0)
  143. modernStatusLabel.text = "BELUM UPLOAD"
  144. let pillStack = UIStackView(arrangedSubviews: [statusDot, modernStatusLabel])
  145. pillStack.translatesAutoresizingMaskIntoConstraints = false
  146. pillStack.axis = .horizontal
  147. pillStack.spacing = 5
  148. pillStack.alignment = .center
  149. modernStatusPill.addSubview(pillStack)
  150. headerStack.addArrangedSubview(modernBadgeView)
  151. headerStack.addArrangedSubview(titleStack)
  152. headerStack.addArrangedSubview(modernStatusPill)
  153. // 2. Equipment Name
  154. modernPerangkatLabel.translatesAutoresizingMaskIntoConstraints = false
  155. modernPerangkatLabel.font = UIFont.systemFont(ofSize: 15, weight: .bold)
  156. modernPerangkatLabel.textColor = UIColor(red: 26/255, green: 32/255, blue: 44/255, alpha: 1.0)
  157. modernPerangkatLabel.numberOfLines = 2
  158. modernContainer.addSubview(modernPerangkatLabel)
  159. // 3. Company Row
  160. let companyStack = UIStackView()
  161. companyStack.translatesAutoresizingMaskIntoConstraints = false
  162. companyStack.axis = .horizontal
  163. companyStack.spacing = 6
  164. companyStack.alignment = .center
  165. modernContainer.addSubview(companyStack)
  166. modernCompanyIcon.translatesAutoresizingMaskIntoConstraints = false
  167. if #available(iOS 13.0, *) {
  168. modernCompanyIcon.image = UIImage(systemName: "building.2.fill")
  169. }
  170. modernCompanyIcon.tintColor = UIColor(red: 113/255, green: 128/255, blue: 150/255, alpha: 1.0)
  171. modernCompanyIcon.contentMode = .scaleAspectFit
  172. modernCustLabel.translatesAutoresizingMaskIntoConstraints = false
  173. modernCustLabel.font = UIFont.systemFont(ofSize: 13, weight: .medium)
  174. modernCustLabel.textColor = UIColor(red: 74/255, green: 85/255, blue: 104/255, alpha: 1.0)
  175. modernCustLabel.numberOfLines = 1
  176. companyStack.addArrangedSubview(modernCompanyIcon)
  177. companyStack.addArrangedSubview(modernCustLabel)
  178. // 4. Spec Stack (Merk/Model/Brand | NIB/PLG)
  179. modernSpecStack.translatesAutoresizingMaskIntoConstraints = false
  180. modernSpecStack.axis = .horizontal
  181. modernSpecStack.distribution = .fillEqually
  182. modernSpecStack.spacing = 8
  183. modernContainer.addSubview(modernSpecStack)
  184. func styleMiniCard(_ cardView: UIView, titleLabel: UILabel, valLabel: UILabel, title: String) {
  185. cardView.translatesAutoresizingMaskIntoConstraints = false
  186. cardView.backgroundColor = UIColor(red: 248/255, green: 250/255, blue: 253/255, alpha: 1.0)
  187. cardView.layer.cornerRadius = 8
  188. cardView.layer.borderColor = UIColor(red: 235/255, green: 240/255, blue: 248/255, alpha: 1.0).cgColor
  189. cardView.layer.borderWidth = 1
  190. titleLabel.translatesAutoresizingMaskIntoConstraints = false
  191. titleLabel.font = UIFont.systemFont(ofSize: 10, weight: .semibold)
  192. titleLabel.textColor = UIColor(red: 113/255, green: 128/255, blue: 150/255, alpha: 1.0)
  193. titleLabel.text = title
  194. valLabel.translatesAutoresizingMaskIntoConstraints = false
  195. valLabel.font = UIFont.systemFont(ofSize: 12, weight: .semibold)
  196. valLabel.textColor = UIColor(red: 45/255, green: 55/255, blue: 72/255, alpha: 1.0)
  197. valLabel.numberOfLines = 1
  198. let stack = UIStackView(arrangedSubviews: [titleLabel, valLabel])
  199. stack.translatesAutoresizingMaskIntoConstraints = false
  200. stack.axis = .vertical
  201. stack.spacing = 2
  202. cardView.addSubview(stack)
  203. NSLayoutConstraint.activate([
  204. stack.topAnchor.constraint(equalTo: cardView.topAnchor, constant: 6),
  205. stack.bottomAnchor.constraint(equalTo: cardView.bottomAnchor, constant: -6),
  206. stack.leadingAnchor.constraint(equalTo: cardView.leadingAnchor, constant: 8),
  207. stack.trailingAnchor.constraint(equalTo: cardView.trailingAnchor, constant: -8)
  208. ])
  209. }
  210. styleMiniCard(modernMerkCard, titleLabel: modernMerkTitle, valLabel: modernMerkVal, title: "MERK / MODEL / BRAND")
  211. styleMiniCard(modernNibCard, titleLabel: modernNibTitle, valLabel: modernNibVal, title: "NIB & ID PELANGGAN")
  212. modernSpecStack.addArrangedSubview(modernMerkCard)
  213. modernSpecStack.addArrangedSubview(modernNibCard)
  214. // 5. Peringatan Box (Optional warning)
  215. modernPeringatanCard.translatesAutoresizingMaskIntoConstraints = false
  216. modernPeringatanCard.backgroundColor = UIColor(red: 255/255, green: 251/255, blue: 235/255, alpha: 1.0)
  217. modernPeringatanCard.layer.cornerRadius = 8
  218. modernPeringatanCard.layer.borderColor = UIColor(red: 253/255, green: 230/255, blue: 138/255, alpha: 1.0).cgColor
  219. modernPeringatanCard.layer.borderWidth = 1
  220. modernContainer.addSubview(modernPeringatanCard)
  221. modernPeringatanIcon.translatesAutoresizingMaskIntoConstraints = false
  222. if #available(iOS 13.0, *) {
  223. modernPeringatanIcon.image = UIImage(systemName: "exclamationmark.circle.fill")
  224. }
  225. modernPeringatanIcon.tintColor = UIColor(red: 217/255, green: 119/255, blue: 6/255, alpha: 1.0)
  226. modernPeringatanIcon.contentMode = .scaleAspectFit
  227. modernPeringatanLabel.translatesAutoresizingMaskIntoConstraints = false
  228. modernPeringatanLabel.font = UIFont.systemFont(ofSize: 11, weight: .medium)
  229. modernPeringatanLabel.textColor = UIColor(red: 146/255, green: 64/255, blue: 14/255, alpha: 1.0)
  230. modernPeringatanLabel.numberOfLines = 0
  231. let peringatanContent = UIStackView(arrangedSubviews: [modernPeringatanIcon, modernPeringatanLabel])
  232. peringatanContent.translatesAutoresizingMaskIntoConstraints = false
  233. peringatanContent.axis = .horizontal
  234. peringatanContent.spacing = 8
  235. peringatanContent.alignment = .top
  236. modernPeringatanCard.addSubview(peringatanContent)
  237. // 6. Validity Footer Bar
  238. modernValidityCard.translatesAutoresizingMaskIntoConstraints = false
  239. modernValidityCard.backgroundColor = UIColor(red: 244/255, green: 248/255, blue: 254/255, alpha: 1.0)
  240. modernValidityCard.layer.cornerRadius = 10
  241. modernContainer.addSubview(modernValidityCard)
  242. modernCalendarIcon.translatesAutoresizingMaskIntoConstraints = false
  243. if #available(iOS 13.0, *) {
  244. modernCalendarIcon.image = UIImage(systemName: "calendar")
  245. }
  246. modernCalendarIcon.tintColor = UIColor(red: 0/255, green: 82/255, blue: 204/255, alpha: 1.0)
  247. modernCalendarIcon.contentMode = .scaleAspectFit
  248. modernValidityLabel.translatesAutoresizingMaskIntoConstraints = false
  249. modernValidityLabel.font = UIFont.systemFont(ofSize: 11, weight: .medium)
  250. modernValidityLabel.textColor = UIColor(red: 74/255, green: 85/255, blue: 104/255, alpha: 1.0)
  251. modernAplIdLabel.translatesAutoresizingMaskIntoConstraints = false
  252. modernAplIdLabel.font = UIFont.systemFont(ofSize: 10, weight: .bold)
  253. modernAplIdLabel.textColor = UIColor(red: 0/255, green: 82/255, blue: 204/255, alpha: 1.0)
  254. let validityContentStack = UIStackView(arrangedSubviews: [modernCalendarIcon, modernValidityLabel])
  255. validityContentStack.translatesAutoresizingMaskIntoConstraints = false
  256. validityContentStack.axis = .horizontal
  257. validityContentStack.spacing = 6
  258. validityContentStack.alignment = .center
  259. let footerStack = UIStackView(arrangedSubviews: [validityContentStack, modernAplIdLabel])
  260. footerStack.translatesAutoresizingMaskIntoConstraints = false
  261. footerStack.axis = .horizontal
  262. footerStack.distribution = .equalSpacing
  263. footerStack.alignment = .center
  264. modernValidityCard.addSubview(footerStack)
  265. // 7. Primary Action: Upload Button
  266. modernUploadBtn.translatesAutoresizingMaskIntoConstraints = false
  267. modernUploadBtn.setTitle(" Upload Foto Label", for: .normal)
  268. if #available(iOS 13.0, *) {
  269. modernUploadBtn.setImage(UIImage(systemName: "camera.fill"), for: .normal)
  270. }
  271. modernUploadBtn.tintColor = .white
  272. modernUploadBtn.setTitleColor(.white, for: .normal)
  273. modernUploadBtn.titleLabel?.font = UIFont.systemFont(ofSize: 13, weight: .bold)
  274. modernUploadBtn.backgroundColor = UIColor(red: 0/255, green: 82/255, blue: 204/255, alpha: 1.0)
  275. modernUploadBtn.layer.cornerRadius = 10
  276. modernUploadBtn.heightAnchor.constraint(equalToConstant: 38).isActive = true
  277. modernUploadBtn.addTarget(self, action: #selector(onModernUploadTap), for: .touchUpInside)
  278. modernContainer.addSubview(modernUploadBtn)
  279. // 8. Download Buttons Stack (ST1, ST2, SPT)
  280. modernDownloadStack.translatesAutoresizingMaskIntoConstraints = false
  281. modernDownloadStack.axis = .horizontal
  282. modernDownloadStack.distribution = .fillEqually
  283. modernDownloadStack.spacing = 8
  284. modernContainer.addSubview(modernDownloadStack)
  285. func styleDownloadBtn(_ button: UIButton, title: String, action: Selector) {
  286. button.translatesAutoresizingMaskIntoConstraints = false
  287. button.setTitle(" \(title)", for: .normal)
  288. if #available(iOS 13.0, *) {
  289. button.setImage(UIImage(systemName: "arrow.down.doc"), for: .normal)
  290. }
  291. button.tintColor = UIColor(red: 0/255, green: 82/255, blue: 204/255, alpha: 1.0)
  292. button.titleLabel?.font = UIFont.systemFont(ofSize: 11, weight: .semibold)
  293. button.backgroundColor = UIColor(red: 244/255, green: 248/255, blue: 254/255, alpha: 1.0)
  294. button.layer.cornerRadius = 8
  295. button.layer.borderWidth = 1
  296. button.layer.borderColor = UIColor(red: 218/255, green: 230/255, blue: 247/255, alpha: 1.0).cgColor
  297. button.heightAnchor.constraint(equalToConstant: 34).isActive = true
  298. button.addTarget(self, action: action, for: .touchUpInside)
  299. }
  300. styleDownloadBtn(modernBtnSt1, title: "ST1", action: #selector(onModernSt1Tap))
  301. styleDownloadBtn(modernBtnSt2, title: "ST2", action: #selector(onModernSt2Tap))
  302. styleDownloadBtn(modernBtnSpt, title: "SPT", action: #selector(onModernSptTap))
  303. modernDownloadStack.addArrangedSubview(modernBtnSt1)
  304. modernDownloadStack.addArrangedSubview(modernBtnSt2)
  305. modernDownloadStack.addArrangedSubview(modernBtnSpt)
  306. // Constraints
  307. NSLayoutConstraint.activate([
  308. headerStack.topAnchor.constraint(equalTo: modernContainer.topAnchor),
  309. headerStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  310. headerStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  311. modernBadgeView.widthAnchor.constraint(equalToConstant: 34),
  312. modernBadgeView.heightAnchor.constraint(equalToConstant: 34),
  313. modernBadgeIcon.centerXAnchor.constraint(equalTo: modernBadgeView.centerXAnchor),
  314. modernBadgeIcon.centerYAnchor.constraint(equalTo: modernBadgeView.centerYAnchor),
  315. modernBadgeIcon.widthAnchor.constraint(equalToConstant: 18),
  316. modernBadgeIcon.heightAnchor.constraint(equalToConstant: 18),
  317. statusDot.widthAnchor.constraint(equalToConstant: 7),
  318. statusDot.heightAnchor.constraint(equalToConstant: 7),
  319. pillStack.topAnchor.constraint(equalTo: modernStatusPill.topAnchor, constant: 5),
  320. pillStack.bottomAnchor.constraint(equalTo: modernStatusPill.bottomAnchor, constant: -5),
  321. pillStack.leadingAnchor.constraint(equalTo: modernStatusPill.leadingAnchor, constant: 10),
  322. pillStack.trailingAnchor.constraint(equalTo: modernStatusPill.trailingAnchor, constant: -10),
  323. modernPerangkatLabel.topAnchor.constraint(equalTo: headerStack.bottomAnchor, constant: 10),
  324. modernPerangkatLabel.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  325. modernPerangkatLabel.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  326. companyStack.topAnchor.constraint(equalTo: modernPerangkatLabel.bottomAnchor, constant: 6),
  327. companyStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  328. companyStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  329. modernCompanyIcon.widthAnchor.constraint(equalToConstant: 14),
  330. modernCompanyIcon.heightAnchor.constraint(equalToConstant: 14),
  331. modernSpecStack.topAnchor.constraint(equalTo: companyStack.bottomAnchor, constant: 10),
  332. modernSpecStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  333. modernSpecStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  334. modernPeringatanCard.topAnchor.constraint(equalTo: modernSpecStack.bottomAnchor, constant: 8),
  335. modernPeringatanCard.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  336. modernPeringatanCard.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  337. modernPeringatanIcon.widthAnchor.constraint(equalToConstant: 14),
  338. modernPeringatanIcon.heightAnchor.constraint(equalToConstant: 14),
  339. peringatanContent.topAnchor.constraint(equalTo: modernPeringatanCard.topAnchor, constant: 8),
  340. peringatanContent.bottomAnchor.constraint(equalTo: modernPeringatanCard.bottomAnchor, constant: -8),
  341. peringatanContent.leadingAnchor.constraint(equalTo: modernPeringatanCard.leadingAnchor, constant: 8),
  342. peringatanContent.trailingAnchor.constraint(equalTo: modernPeringatanCard.trailingAnchor, constant: -8),
  343. modernValidityCard.topAnchor.constraint(equalTo: modernPeringatanCard.bottomAnchor, constant: 8),
  344. modernValidityCard.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  345. modernValidityCard.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  346. modernCalendarIcon.widthAnchor.constraint(equalToConstant: 13),
  347. modernCalendarIcon.heightAnchor.constraint(equalToConstant: 13),
  348. footerStack.topAnchor.constraint(equalTo: modernValidityCard.topAnchor, constant: 8),
  349. footerStack.bottomAnchor.constraint(equalTo: modernValidityCard.bottomAnchor, constant: -8),
  350. footerStack.leadingAnchor.constraint(equalTo: modernValidityCard.leadingAnchor, constant: 10),
  351. footerStack.trailingAnchor.constraint(equalTo: modernValidityCard.trailingAnchor, constant: -10),
  352. modernUploadBtn.topAnchor.constraint(equalTo: modernValidityCard.bottomAnchor, constant: 10),
  353. modernUploadBtn.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  354. modernUploadBtn.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  355. modernDownloadStack.topAnchor.constraint(equalTo: modernUploadBtn.bottomAnchor, constant: 8),
  356. modernDownloadStack.leadingAnchor.constraint(equalTo: modernContainer.leadingAnchor),
  357. modernDownloadStack.trailingAnchor.constraint(equalTo: modernContainer.trailingAnchor),
  358. modernDownloadStack.bottomAnchor.constraint(equalTo: modernContainer.bottomAnchor)
  359. ])
  360. }
  361. @objc private func onModernUploadTap() {
  362. cellDelegate?.upload(aplikasiId: aplikasiId)
  363. }
  364. @objc private func onModernSt1Tap() {
  365. let filename = "ST1-\(aplikasiId).jpg"
  366. cellDelegate?.download(urlWeb: urlCetakSt1, filename: filename)
  367. }
  368. @objc private func onModernSt2Tap() {
  369. let filename = "ST2-\(aplikasiId).jpg"
  370. cellDelegate?.download(urlWeb: urlCetakSt2, filename: filename)
  371. }
  372. @objc private func onModernSptTap() {
  373. let filename = "SPT-\(aplikasiId).jpg"
  374. cellDelegate?.download(urlWeb: urlCetakSpt, filename: filename)
  375. }
  376. func updateViews(sertBlmUpload: SertifikatBelumUpload) {
  377. card?.isInteractable = false
  378. setupModernLayout()
  379. aplikasiId = sertBlmUpload.apl_id
  380. urlCetakSt1 = sertBlmUpload.cetak_st1
  381. urlCetakSt2 = sertBlmUpload.cetak_st2
  382. urlCetakSpt = sertBlmUpload.cetak_spt
  383. let nomor = sertBlmUpload.nomor.isEmpty ? "-" : sertBlmUpload.nomor
  384. modernNomorLabel.text = nomor
  385. lblNo?.text = nomor
  386. let tglFormatted = CommonHelper.formatDate(from: sertBlmUpload.tgl)
  387. let expFormatted = CommonHelper.formatDate(from: sertBlmUpload.exp)
  388. modernValidityLabel.text = "\(tglFormatted) s/d \(expFormatted)"
  389. lblTgl?.text = "\(tglFormatted) s/d \(expFormatted)"
  390. let plgId = "\(sertBlmUpload.plg_id)"
  391. let nib = sertBlmUpload.nib.isEmpty ? "-" : sertBlmUpload.nib
  392. lblPlgId?.text = "PLG ID: \(plgId)"
  393. lblNib?.text = "NIB: \(nib)"
  394. modernNibVal.text = "NIB: \(nib) | PLG: \(plgId)"
  395. let cust = sertBlmUpload.cust_name.isEmpty ? "-" : sertBlmUpload.cust_name
  396. modernCustLabel.text = cust
  397. lblCustName?.text = cust
  398. let eqp = sertBlmUpload.eqp_name.isEmpty ? "-" : sertBlmUpload.eqp_name
  399. modernPerangkatLabel.text = eqp
  400. lblEqpName?.text = eqp
  401. let merk = sertBlmUpload.merk.isEmpty ? "-" : sertBlmUpload.merk
  402. let model = sertBlmUpload.model.isEmpty ? "-" : sertBlmUpload.model
  403. let brand = sertBlmUpload.brand.isEmpty ? "-" : sertBlmUpload.brand
  404. lblMerk?.text = "Merk: \(merk)"
  405. lblModel?.text = "Model: \(model)"
  406. lblBrand?.text = "Brand: \(brand)"
  407. modernMerkVal.text = "\(merk) / \(model) / \(brand)"
  408. modernAplIdLabel.text = "ID: \(sertBlmUpload.apl_id)"
  409. lblAplikasiId?.text = "\(sertBlmUpload.apl_id)"
  410. // Peringatan handling
  411. var peringatanText = ""
  412. if let p1 = sertBlmUpload.peringatan_pertama, !p1.isEmpty {
  413. peringatanText = "Peringatan 1: \(p1)"
  414. lblPeringatan1?.text = peringatanText
  415. }
  416. if let p2 = sertBlmUpload.peringatan_kedua, !p2.isEmpty {
  417. peringatanText += (peringatanText.isEmpty ? "" : "\n") + "Peringatan 2: \(p2)"
  418. lblPeringatan2?.text = "Peringatan 2: \(p2)"
  419. }
  420. if let p3 = sertBlmUpload.peringatan_ketiga, !p3.isEmpty {
  421. peringatanText += (peringatanText.isEmpty ? "" : "\n") + "Peringatan 3: \(p3)"
  422. lblPeringatan3?.text = "Peringatan 3: \(p3)"
  423. }
  424. if peringatanText.isEmpty {
  425. modernPeringatanCard.isHidden = true
  426. } else {
  427. modernPeringatanCard.isHidden = false
  428. modernPeringatanLabel.text = peringatanText
  429. }
  430. // Button state check
  431. modernBtnSt1.alpha = urlCetakSt1.isEmpty ? 0.4 : 1.0
  432. modernBtnSt2.alpha = urlCetakSt2.isEmpty ? 0.4 : 1.0
  433. modernBtnSpt.alpha = urlCetakSpt.isEmpty ? 0.4 : 1.0
  434. }
  435. @IBAction func onBtnUploadTap(_ sender: Any) {
  436. cellDelegate?.upload(aplikasiId: aplikasiId)
  437. }
  438. @IBAction func onBtnDownloadSt1Tap(_ sender: Any) {
  439. let filename = "ST1-\(aplikasiId).jpg"
  440. cellDelegate?.download(urlWeb: urlCetakSt1, filename: filename)
  441. }
  442. @IBAction func onBtnDownloadSt2Tap(_ sender: Any) {
  443. let filename = "ST2-\(aplikasiId).jpg"
  444. cellDelegate?.download(urlWeb: urlCetakSt2, filename: filename)
  445. }
  446. @IBAction func onBtnDownloadSptTap(_ sender: Any) {
  447. let filename = "SPT-\(aplikasiId).jpg"
  448. cellDelegate?.download(urlWeb: urlCetakSpt, filename: filename)
  449. }
  450. }