from PySide6.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QProgressBar, QMessageBox from PySide6.QtCore import Signal from pypos.core.base_view import BaseView from pypos.core.utils.ui_message_utils import sanitize_ui_message class SinkronDataView(BaseView, QWidget): sinkronkan_ditekan = Signal() def __init__(self): super().__init__() self.setWindowTitle("Sinkronisasi Data") self.layout = QVBoxLayout(self) self.label_info = QLabel("Tekan tombol untuk sinkronisasi data master dari server pusat (API).") self.progress_bar = QProgressBar() self.progress_bar.setVisible(False) self.btn_sinkron = QPushButton("Sinkronkan") self.btn_sinkron.setStyleSheet(""" QPushButton { background-color: #28a745; /* hijau terang */ color: white; font-weight: bold; padding: 8px 20px; border-radius: 10px; } QPushButton:hover { background-color: #218838; /* hijau gelap saat hover */ } """) self.btn_sinkron.clicked.connect(self.konfirmasi_sinkron) self.layout.addWidget(self.label_info) self.layout.addWidget(self.progress_bar) self.layout.addWidget(self.btn_sinkron) def konfirmasi_sinkron(self): msg = QMessageBox.question( self, "Konfirmasi Sinkron", "Anda yakin ingin sinkron data master dari server pusat?", QMessageBox.Yes | QMessageBox.No ) if msg == QMessageBox.Yes: self.sinkronkan_ditekan.emit() def mulai_progress(self): self.progress_bar.setVisible(True) self.progress_bar.setRange(0, 0) # Mode tak tentu def selesai_progress(self): self.progress_bar.setVisible(False) self.progress_bar.setRange(0, 100) def update_progress(self, percent, status="", detail_log=""): self.progress_bar.setVisible(True) self.progress_bar.setRange(0, 100) self.progress_bar.setValue(int(percent or 0)) if status: self.label_info.setText(f"{status} ({int(percent or 0)}%)") def tampilkan_info(self, sukses: bool, pesan: str): if sukses: safe_message, _ = sanitize_ui_message("information", pesan) QMessageBox.information(self, "Hasil Sinkron", safe_message) return safe_message, _ = sanitize_ui_message("warning", pesan) QMessageBox.warning(self, "Sinkronisasi Gagal", safe_message)