// // SertifikatBelumUploadVC.swift // Sirani // // Created by Anhar Solehudin on 16/04/19. // Copyright © 2019 Anhar Solehudin. All rights reserved. // import UIKit import MobileCoreServices class SertifikatBelumUploadVC: UIViewController { // Outlets @IBOutlet weak var sertBlmUploadTV: UITableView! @IBOutlet weak var noDataLayout: UIView! @IBOutlet weak var progressLayout: UIView! @IBOutlet weak var progress: UIActivityIndicatorView! @IBOutlet weak var modalUploadLayout: UIView! @IBOutlet weak var lblSelectedAplikasiId: UILabel! @IBOutlet weak var lblSelectedNo: UILabel! @IBOutlet weak var lblSelectedTanggal: UILabel! @IBOutlet weak var lblSelectedPlgId: UILabel! @IBOutlet weak var lblSelectedNib: UILabel! @IBOutlet weak var lblSelectedCustName: UILabel! @IBOutlet weak var lblSelectedEqpName: UILabel! @IBOutlet weak var lblSelectedMerk: UILabel! @IBOutlet weak var lblSelectedModel: UILabel! @IBOutlet weak var lblSelectedBrand: UILabel! @IBOutlet weak var btnSelectedSimpan: UIButton! @IBOutlet weak var btnSelectQrCode: UIButton! @IBOutlet weak var btnSelectKeterangan: UIButton! @IBOutlet weak var btnSelectPeringatan: UIButton! @IBOutlet weak var lblSelectedQrCodeFilename: UILabel! @IBOutlet weak var lblSelectedKetFilename: UILabel! @IBOutlet weak var lblSelectedPeringatanFilename: UILabel! // View Id private let cellId = "sertifikatBlmUploadCellId" // Segue Id private let unwindToHomeSegueId = "unwindSertBlmUploadToHomeSegueId" private let searchSegueId = "searchSertifikatBelumUploadSegueId" // String Message private let alertNoConnectionTitle = "Informasi" private let alertNoConnectionMsg = "Sepertinya Anda sedang tidak tersambung pada koneksi internet" private let alertNoConnectionActionYes = "OK" // Initialize private var presenter: SertifikatBelumUploadPresenter! private var dataList: [SertifikatBelumUpload] = [SertifikatBelumUpload]() private var documentInteractorController: UIDocumentInteractionController! private var imagePickerController = UIImagePickerController() // Constants private let QR_CODE_FILE_TAG_ID = 21 private let KETERANGAN_FILE_TAG_ID = 22 private let PERINGATAN_FILE_TAG_ID = 23 // Request Params private var cursor: Int = 0 private var prev: Int = 1 private var jenis: String = "" private var columns: String = "" private var search: String = "" // Variables private var selectedFileTagId = 0 private var plgId = 0 private var aplikasiId = 0 private var urlFileQrCode: URL? private var urlFileKeterangan: URL? private var urlFilePeringatan: URL? private var filenameQrCode: String = "" private var filenameKeterangan: String = "" private var filenamePeringatan: String = "" private var loading = false private var lastDataLoadedEmpty = false private var loadMore = false // View Lifecycles override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } override func viewDidLoad() { super.viewDidLoad() sertBlmUploadTV.delegate = self sertBlmUploadTV.dataSource = self sertBlmUploadTV.separatorStyle = .none sertBlmUploadTV.rowHeight = UITableView.automaticDimension sertBlmUploadTV.estimatedRowHeight = 220 presenter = SertifikatBelumUploadPresenter(siraniApiServices: SiraniApiServices()) presenter.attachView(view: self) loadData() imagePickerController.delegate = self } override func viewWillAppear(_ animated: Bool) { customSomeViews() presenter.attachView(view: self) } override func viewDidDisappear(_ animated: Bool) { presenter.detachView() } // private functions private func customSomeViews() { btnSelectedSimpan.layer.cornerRadius = 5 btnSelectQrCode.layer.borderWidth = 1 btnSelectQrCode.layer.borderColor = #colorLiteral(red: 0.3333333433, green: 0.3333333433, blue: 0.3333333433, alpha: 1) btnSelectKeterangan.layer.borderWidth = 1 btnSelectKeterangan.layer.borderColor = #colorLiteral(red: 0.3333333433, green: 0.3333333433, blue: 0.3333333433, alpha: 1) btnSelectPeringatan.layer.borderWidth = 1 btnSelectPeringatan.layer.borderColor = #colorLiteral(red: 0.3333333433, green: 0.3333333433, blue: 0.3333333433, alpha: 1) btnSelectQrCode.layer.cornerRadius = 5 btnSelectKeterangan.layer.cornerRadius = 5 btnSelectPeringatan.layer.cornerRadius = 5 } private func loadData() { if !loading && !lastDataLoadedEmpty { if ConnectionHelper.isConnectedToNetwork() { presenter.loadData(cursor: cursor, prev: prev, jenis: jenis, columns: columns, search: search) } else { showNoConnection() } } } private func downloadFile(urlWeb: String, filename: String) { if !loading { if ConnectionHelper.isConnectedToNetwork() { presenter.downloadFile(urlWeb: urlWeb, filename: filename) } else { showNoConnection() } } } private func loadUploadDetails(aplikasiId: Int) { if !loading { if ConnectionHelper.isConnectedToNetwork() { presenter.loadUploadDetail(aplikasiId: aplikasiId) } else { showNoConnection() } } } private func uploadFile(plgId: Int, aplId: Int, qrCodeFileURL: URL, keteranganFileURL: URL, peringatanFileURL: URL, qrCodeFilename: String, keteranganFilename: String, peringatanFilename: String) { if !loading { if ConnectionHelper.isConnectedToNetwork() { presenter.uploadSertifikasi( plgId: plgId, aplId: aplId, qrCodeFileURL: qrCodeFileURL, keteranganFileURL: keteranganFileURL, peringatanFileURL: peringatanFileURL, qrCodeFilename: qrCodeFilename, keteranganFilename: keteranganFilename, peringatanFilename: peringatanFilename ) } else { showNoConnection() } } } private func showAlert(title: String, msg: String, actionTitle: String) { let alertNoConnection = UIAlertController( title: title, message: msg, preferredStyle: .alert ) alertNoConnection.addAction( UIAlertAction(title: actionTitle, style: .default, handler: nil) ) self.present(alertNoConnection, animated: true, completion: nil) } private func showPicker() { let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) let gallery = UIAlertAction(title: "Galeri", style: .default) { action in self.showImagePicker() } let fileManager = UIAlertAction(title: "Dokumen", style: .default) { action in self.showDocumentPicker() } let cancel = UIAlertAction(title: "Batal", style: .cancel, handler: nil) actionSheet.addAction(gallery) actionSheet.addAction(fileManager) actionSheet.addAction(cancel) self.present(actionSheet, animated: true, completion: nil) } private func showImagePicker() { imagePickerController.allowsEditing = false imagePickerController.sourceType = .photoLibrary self.present(imagePickerController, animated: true, completion: nil) } private func showDocumentPicker() { let types = [String(kUTTypePDF), String(kUTTypeText), String(kUTTypeJPEG), String(kUTTypePNG)] let picker = UIDocumentPickerViewController(documentTypes: types, in: .import) picker.delegate = self picker.modalPresentationStyle = .formSheet self.present(picker, animated: true, completion: nil) } // Actions @IBAction func onBtnBackTap(_ sender: Any) { performSegue(withIdentifier: unwindToHomeSegueId, sender: self) } @IBAction func onBtnSearchTap(_ sender: Any) { performSegue(withIdentifier: searchSegueId, sender: self) } @IBAction func unwindToSertifikatBelumUpload(segue: UIStoryboardSegue) {} @IBAction func onBtnSelectQrCodeTap(_ sender: Any) { selectedFileTagId = QR_CODE_FILE_TAG_ID showPicker() } @IBAction func onBtnSelectKetTap(_ sender: Any) { selectedFileTagId = KETERANGAN_FILE_TAG_ID showPicker() } @IBAction func onBtnSelectPeringatan(_ sender: Any) { selectedFileTagId = PERINGATAN_FILE_TAG_ID showPicker() } @IBAction func onBtnUploadSave(_ sender: Any) { if (urlFileQrCode != nil && urlFileKeterangan != nil && urlFilePeringatan != nil) { uploadFile( plgId: plgId, aplId: aplikasiId, qrCodeFileURL: urlFileQrCode!, keteranganFileURL: urlFileKeterangan!, peringatanFileURL: urlFilePeringatan!, qrCodeFilename: filenameQrCode, keteranganFilename: filenameKeterangan, peringatanFilename: filenamePeringatan ) } else { showAlert(title: "Informasi", msg: "Mohon Lengkapi Semua File", actionTitle: "OK") } } @IBAction func onBtnUploadCancel(_ sender: Any) { modalUploadLayout.hide() } } // View Delegate Protocols extension SertifikatBelumUploadVC: SertifikatBelumUploadViewDelegate { func showNoConnection() { showAlert(title: alertNoConnectionTitle, msg: alertNoConnectionMsg, actionTitle: alertNoConnectionActionYes) } func showLoading() { loading = true progress.startAnimating() progressLayout.show() } func hideLoading() { loading = false progress.stopAnimating() progressLayout.hide() } func showNoDataLayout() { if cursor == 0 { noDataLayout.show() } } func hideNoDataLayout() { noDataLayout.hide() } func setDataList(dataList: [SertifikatBelumUpload]) { if cursor == 0 { noDataLayout.hide() } if dataList.count > 0 { for data in dataList { self.dataList.append(data) sertBlmUploadTV.beginUpdates() sertBlmUploadTV.insertRows( at: [IndexPath(row: self.dataList.count-1, section: 0)], with: .none ) sertBlmUploadTV.endUpdates() } let totalData = dataList.count cursor += totalData loadMore = true } else { lastDataLoadedEmpty = true loadMore = false } } func onDownloadSuccess(urlFile: URL) { self.documentInteractorController = UIDocumentInteractionController() self.documentInteractorController.delegate = self self.documentInteractorController.url = urlFile self.documentInteractorController.presentPreview(animated: true) } func onDownloadFailed() { showAlert(title: "Informasi", msg: "File Tidak Ditemukan", actionTitle: "OK") } func setModalUploadDetail(sertifikatBelumUploadDetail: SertifikatBelumUploadDetail) { plgId = sertifikatBelumUploadDetail.plg_id aplikasiId = sertifikatBelumUploadDetail.apl_id lblSelectedAplikasiId.text = "\(aplikasiId)" lblSelectedNo.text = "\(sertifikatBelumUploadDetail.nomor)" lblSelectedTanggal.text = "\(sertifikatBelumUploadDetail.tgl) s/d \(sertifikatBelumUploadDetail.exp)" lblSelectedPlgId.text = "PLG ID: \(plgId)" lblSelectedNib.text = "NIB: \(sertifikatBelumUploadDetail.nib)" lblSelectedCustName.text = "\(sertifikatBelumUploadDetail.cust_name)" lblSelectedEqpName.text = "\(sertifikatBelumUploadDetail.eqp_name)" lblSelectedMerk.text = "Merk: \(sertifikatBelumUploadDetail.merk)" lblSelectedModel.text = "Model: \(sertifikatBelumUploadDetail.model)" lblSelectedBrand.text = "Brand: \(sertifikatBelumUploadDetail.brand)" modalUploadLayout.show() } func onUploadSuccess() { modalUploadLayout.hide() showAlert(title: "Informasi", msg: "Proses Simpan Berhasil", actionTitle: "OK") } func onUploadFailed() { showAlert(title: "Gagal", msg: "Proses Simpan Gagal", actionTitle: "OK") } } // UITableController Protocols extension SertifikatBelumUploadVC: UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate, SertifikatBelumUploadCellDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return dataList.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if tableView == sertBlmUploadTV { if let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? SertifikatBelumUploadCell { let data = dataList[indexPath.row] cell.cellDelegate = self cell.btnUpload.tag = indexPath.row cell.btnDownloadSt1.tag = indexPath.row cell.btnDownloadSt2.tag = indexPath.row cell.btnDownloadSpt.tag = indexPath.row cell.updateViews(sertBlmUpload: data) return cell } else { return SertifikatBelumUploadCell() } } else { return SertifikatBelumUploadCell() } } func scrollViewDidScroll(_ scrollView: UIScrollView) { let threshold = -5 let contentOffset = scrollView.contentOffset.y let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height; if loadMore && !loading && (Int(maximumOffset - contentOffset) <= threshold) { loadData() } } func download(urlWeb: String?, filename: String?) { if let url = urlWeb { if !url.isEmpty { if let fileName = filename { self.downloadFile(urlWeb: url, filename: fileName) } else { self.downloadFile(urlWeb: url, filename: "file.jpg") } } else { showAlert(title: "Informasi", msg: "File Tidak Ditemukan", actionTitle: "OK") } } else { showAlert(title: "Informasi", msg: "File Tidak Ditemukan", actionTitle: "OK") } } func upload(aplikasiId: Int?) { if let aplId = aplikasiId { loadUploadDetails(aplikasiId: aplId) } } } // DocumentInteractionController extension SertifikatBelumUploadVC: UIDocumentInteractionControllerDelegate { func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController { guard let navVC = self.navigationController else { return self } return navVC } } // Search Delegate Protocols extension SertifikatBelumUploadVC: SearchSertifikatBelumUploadDelegate { func onSearch(search: String, parameter: String, jenis: String) { presenter.attachView(view: self) loadMore = false loading = false lastDataLoadedEmpty = false self.cursor = 0 self.prev = 1 self.search = search self.jenis = jenis self.columns = parameter dataList.removeAll() sertBlmUploadTV.reloadData() loadData() } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == searchSegueId { let destinationVC: SearchSertifikatBelumUploadVC = segue.destination as! SearchSertifikatBelumUploadVC destinationVC.delegate = self } } } extension SertifikatBelumUploadVC: UIDocumentPickerDelegate, UINavigationControllerDelegate { func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { if urls.count > 0 { let selectedUrlFile = urls[0] as URL let url = selectedUrlFile.absoluteString let urlSplits = url.split(separator: "/") let filename = urlSplits[urlSplits.count-1] if (selectedFileTagId == QR_CODE_FILE_TAG_ID) { urlFileQrCode = selectedUrlFile filenameQrCode = String(filename) lblSelectedQrCodeFilename.text = filenameQrCode } else if (selectedFileTagId == KETERANGAN_FILE_TAG_ID) { urlFileKeterangan = selectedUrlFile filenameKeterangan = String(filename) lblSelectedKetFilename.text = filenameKeterangan } else if (selectedFileTagId == PERINGATAN_FILE_TAG_ID) { urlFilePeringatan = selectedUrlFile filenamePeringatan = String(filename) lblSelectedPeringatanFilename.text = filenamePeringatan } } } func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) { print("document view was cancelled") } } extension SertifikatBelumUploadVC: UIImagePickerControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let selectedUrlFile = info[UIImagePickerController.InfoKey.imageURL] as? URL { let url = selectedUrlFile.absoluteString let urlSplits = url.split(separator: "/") let filename = urlSplits[urlSplits.count-1] if (selectedFileTagId == QR_CODE_FILE_TAG_ID) { urlFileQrCode = selectedUrlFile filenameQrCode = String(filename) lblSelectedQrCodeFilename.text = filenameQrCode } else if (selectedFileTagId == KETERANGAN_FILE_TAG_ID) { urlFileKeterangan = selectedUrlFile filenameKeterangan = String(filename) lblSelectedKetFilename.text = filenameKeterangan } else if (selectedFileTagId == PERINGATAN_FILE_TAG_ID) { urlFilePeringatan = selectedUrlFile filenamePeringatan = String(filename) lblSelectedPeringatanFilename.text = filenamePeringatan } } dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { print("gallery was cancelled") } }