Dưới đây là 4 bước sửa mã trong file CAMTESST.py để giải quyết chính xác từng yêu cầu của bạn:
1. Đổi màu ô tìm kiếm trong Lịch sử sang nền sáng, chữ đen (dễ nhìn ở mọi theme)
Bạn tìm đến hàm def show_input_history(self): (khoảng dòng 1042).
Tìm dòng mã này:
        ts=QLineEdit(); ts.setStyleSheet(f"color:{t['a']};background:{t['i']};border:1px solid {t['d']};padding:4px;border-radius:4px;")

Thay thế bằng dòng sau (đổi màu chữ thành đen, nền thành trắng):
        ts=QLineEdit(); ts.setStyleSheet(f"color: #000000; background: #FFFFFF; border: 1px solid {t['d']}; padding: 4px; border-radius: 4px; font-weight: bold;")

2. Thêm nhóm "Tất Cả" hiện mặc định khi bấm Cập nhật lịch sử
Bạn kéo xuống một chút bên trong hàm show_input_history(self), tìm đến vòng lặp for it in reversed(hs): thứ hai (khoảng dòng 1146).
Tìm toàn bộ đoạn mã này:
            max_len = 5
            for it in reversed(hs):
                if kw and kw.upper() not in it.get('lot','').upper(): continue
                if self.filter_date:
                    tm = it.get('timestamp', '')
                    if not tm: continue
                    try:
                        if datetime.datetime.strptime(tm, "%Y-%m-%d %H:%M:%S").strftime("%d/%m/%Y") != self.filter_date: continue
                    except: continue
                mh = it.get('ma_hang', '').strip().upper()
                if mh in mh_to_file:
                    fn = mh_to_file[mh] 
                else:
                    fn = it.get('file_name', 'Khác')
                    if fn not in valid_file_names:
                        fn = "Khác"
                if fn not in grps: grps[fn]=[]
                grps[fn].append(it)
                if len(fn) > max_len: max_len = len(fn)
            sorted_grps = {}
            for fname in valid_file_names:
                if fname in grps: sorted_grps[fname] = grps[fname]
            if "Khác" in grps: sorted_grps["Khác"] = grps["Khác"]
            grps = sorted_grps

Thay thế toàn bộ bằng đoạn mã sau:
            max_len = 8 # Đổi thành 8 để chứa vừa chữ Tất Cả
            all_items = [] # Danh sách tổng
            for it in reversed(hs):
                if kw and kw.upper() not in it.get('lot','').upper(): continue
                if self.filter_date:
                    tm = it.get('timestamp', '')
                    if not tm: continue
                    try:
                        if datetime.datetime.strptime(tm, "%Y-%m-%d %H:%M:%S").strftime("%d/%m/%Y") != self.filter_date: continue
                    except: continue
                
                all_items.append(it) # Thêm vào danh sách chung
                
                mh = it.get('ma_hang', '').strip().upper()
                if mh in mh_to_file:
                    fn = mh_to_file[mh] 
                else:
                    fn = it.get('file_name', 'Khác')
                    if fn not in valid_file_names:
                        fn = "Khác"
                if fn not in grps: grps[fn]=[]
                grps[fn].append(it)
                if len(fn) > max_len: max_len = len(fn)
            
            sorted_grps = {"Tất Cả": all_items} # Thêm tab Tất Cả mặc định lên đầu
            for fname in valid_file_names:
                if fname in grps: sorted_grps[fname] = grps[fname]
            if "Khác" in grps: sorted_grps["Khác"] = grps["Khác"]
            grps = sorted_grps

3. Di chuyển nút cái Khóa (🔒) sang trái chữ JNTC
Bạn tìm đến hàm def init_ui(self): (khoảng dòng 175).
Tìm đoạn mã tạo thanh tiêu đề này:
        title_bar=QHBoxLayout(); title_bar.setContentsMargins(4,6,10,0); title_bar.setAlignment(Qt.AlignVCenter)
        self.lbl_title=QLabel("JNTC / FQC Camera Input System"); self.lbl_title.setObjectName("lbl_title"); self.lbl_title.setCursor(Qt.SizeAllCursor); title_bar.addWidget(self.lbl_title); title_bar.addStretch()
        self.tb_to_label = {}
        btn_size = 20; rad = 10; spacing_size = 10
        self.btn_lock = QPushButton("🔒"); self.btn_lock.setFixedSize(btn_size,btn_size); self.btn_lock.setObjectName("btn_lock"); self.btn_lock.setToolTip("Khóa cài đặt"); self.btn_lock.setStyleSheet("background-color: transparent; border: none; font-size: 14px;"); self.btn_lock.clicked.connect(self.open_lock_settings); title_bar.addWidget(self.btn_lock); title_bar.addSpacing(spacing_size)

Thay thế bằng đoạn sau (sắp xếp lại thứ tự widget được add vào layout):
        title_bar=QHBoxLayout(); title_bar.setContentsMargins(4,6,10,0); title_bar.setAlignment(Qt.AlignVCenter)
        self.tb_to_label = {}
        btn_size = 20; rad = 10; spacing_size = 10
        
        self.btn_lock = QPushButton("🔒"); self.btn_lock.setFixedSize(btn_size,btn_size); self.btn_lock.setObjectName("btn_lock"); self.btn_lock.setToolTip("Khóa cài đặt"); self.btn_lock.setStyleSheet("background-color: transparent; border: none; font-size: 14px;"); self.btn_lock.clicked.connect(self.open_lock_settings); title_bar.addWidget(self.btn_lock); title_bar.addSpacing(5)
        
        self.lbl_title=QLabel("JNTC / FQC Camera Input System"); self.lbl_title.setObjectName("lbl_title"); self.lbl_title.setCursor(Qt.SizeAllCursor); title_bar.addWidget(self.lbl_title); title_bar.addStretch()

4. Loại bỏ yêu cầu nhập mật khẩu khi bấm Cài đặt HMĐB (Hình bánh răng)
Bạn tìm đến hàm def open_abbr_settings(self): (khoảng dòng 402).
Xóa (hoặc thêm dấu #) dòng if self.check_settings_locked(): return đầu tiên:
    def open_abbr_settings(self):
        # if self.check_settings_locked(): return  <-- Bạn xóa hoặc bôi đen dòng này
        dlg=QDialog(self); dlg.setWindowTitle("Cài Đặt Viết Tắt HMĐB"); dlg.setFixedSize(300,400); layout=QVBoxLayout(dlg); scroll=QScrollArea(); scroll.setWidgetResizable(True); content=QWidget(); form=QGridLayout(content); form.addWidget(QLabel("Viết tắt"),0,0,Qt.AlignCenter); form.addWidget(QLabel("Từ đầy đủ"),0,1,Qt.AlignCenter); self.abbr_inputs=[]; items=list(self.abbr_map.items())
