feat: add hide/show filter buttons for User mode in material validation

Add two buttons (隐藏勾选/显示全部) on the right side of the result
table for non-admin users to hide checked items or show all items.
- Buttons are disabled until validation completes
- Hidden items are tracked and can be restored
- Admin users see the original layout without these buttons

Co-Authored-By: Claude (glm-5) <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-02-26 17:57:11 +08:00
parent b318856394
commit 3a9c6f0978

View File

@@ -273,6 +273,7 @@ class MaterialValidationTab(ttk.Frame):
self.validation_results = None self.validation_results = None
self.material_records_cache = None # 缓存完整的物料记录 self.material_records_cache = None # 缓存完整的物料记录
self.shared_production_ids = [] # 共享的 Production ID 列表 self.shared_production_ids = [] # 共享的 Production ID 列表
self.hidden_items = set() # Track hidden item IDs for User mode
# 负责人筛选相关 # 负责人筛选相关
self.managers: List[str] = [] # 可用负责人列表 self.managers: List[str] = [] # 可用负责人列表
@@ -474,7 +475,68 @@ class MaterialValidationTab(ttk.Frame):
def _create_result_table(self, parent): def _create_result_table(self, parent):
"""创建结果表格""" """创建结果表格"""
# 新列定义:选择、材料名称、材料代码、规格、型号、负责人 # 检查是否为非管理员用户
is_user_only = not self.session_manager.is_admin()
if is_user_only:
# User 模式:创建两列布局(表格 + 按钮)
# 主容器
main_result_container = ttk.Frame(parent)
main_result_container.grid(row=0, column=0, sticky="nsew")
parent.rowconfigure(0, weight=1)
parent.columnconfigure(0, weight=1)
# 表格容器
table_container = ttk.Frame(main_result_container)
table_container.grid(row=0, column=0, sticky="nsew")
main_result_container.rowconfigure(0, weight=1)
main_result_container.columnconfigure(0, weight=1)
# 创建表格
columns = ("选择", "材料名称", "材料代码", "规格", "型号", "负责人")
self.tree = CheckboxTreeview(
table_container,
columns=columns,
show="headings",
height=10,
on_checkbox_change=self._sync_checkbox_by_material_code
)
# 设置列标题和宽度
self.tree.heading("选择", text="选择")
self.tree.heading("材料名称", text="材料名称")
self.tree.heading("材料代码", text="材料代码")
self.tree.heading("规格", text="规格")
self.tree.heading("型号", text="型号")
self.tree.heading("负责人", text="负责人(双击编辑)")
self.tree.column("选择", width=50, anchor="center")
self.tree.column("材料名称", width=250)
self.tree.column("材料代码", width=150)
self.tree.column("规格", width=150)
self.tree.column("型号", width=150)
self.tree.column("负责人", width=150)
# 添加滚动条
scrollbar_y = ttk.Scrollbar(table_container, orient=tk.VERTICAL, command=self.tree.yview)
scrollbar_x = ttk.Scrollbar(table_container, orient=tk.HORIZONTAL, command=self.tree.xview)
self.tree.configure(
yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set
)
# 布局
self.tree.grid(row=0, column=0, sticky="nsew")
scrollbar_y.grid(row=0, column=1, sticky="ns")
scrollbar_x.grid(row=1, column=0, sticky="ew")
table_container.rowconfigure(0, weight=1)
table_container.columnconfigure(0, weight=1)
# 创建筛选按钮(右侧)
self._create_user_filter_buttons(main_result_container)
else:
# Admin 模式:原布局
columns = ("选择", "材料名称", "材料代码", "规格", "型号", "负责人") columns = ("选择", "材料名称", "材料代码", "规格", "型号", "负责人")
self.tree = CheckboxTreeview( self.tree = CheckboxTreeview(
parent, parent,
@@ -520,6 +582,54 @@ class MaterialValidationTab(ttk.Frame):
# 绑定双击事件用于编辑负责人 # 绑定双击事件用于编辑负责人
self.tree.bind("<Double-1>", self._on_cell_double_click) self.tree.bind("<Double-1>", self._on_cell_double_click)
def _create_user_filter_buttons(self, parent):
"""创建 User 用户的筛选按钮"""
button_frame = ttk.Frame(parent)
button_frame.grid(row=0, column=1, sticky="ns", padx=(10, 0))
self.btn_hide_checked = ttk.Button(
button_frame,
text="隐藏勾选",
command=self._hide_checked_items,
state=tk.DISABLED
)
self.btn_hide_checked.pack(fill=tk.X, pady=2)
self.btn_show_all = ttk.Button(
button_frame,
text="显示全部",
command=self._show_all_items,
state=tk.DISABLED
)
self.btn_show_all.pack(fill=tk.X, pady=2)
def _hide_checked_items(self):
"""隐藏所有已勾选的物料"""
checked_items = self.tree.get_checked_items()
if not checked_items:
self.log_text.info("没有已勾选的物料")
return
for item in checked_items:
self.tree.detach(item) # Remove from view but keep data
self.hidden_items.add(item)
self.log_text.info(f"已隐藏 {len(checked_items)} 条勾选的物料")
self.btn_show_all.config(state=tk.NORMAL)
def _show_all_items(self):
"""显示所有物料(包括已隐藏的)"""
if not self.hidden_items:
self.log_text.info("没有隐藏的物料")
return
for item in self.hidden_items:
self.tree.move(item, '', 'end') # Restore to end of tree
count = len(self.hidden_items)
self.hidden_items.clear()
self.log_text.info(f"已显示 {count} 条隐藏的物料")
def _create_log_panel(self, parent): def _create_log_panel(self, parent):
"""创建日志面板""" """创建日志面板"""
self.log_text = LogText(parent, height=8, readonly=True) self.log_text = LogText(parent, height=8, readonly=True)
@@ -967,6 +1077,16 @@ class MaterialValidationTab(ttk.Frame):
self.deselect_all_button.config(state=tk.DISABLED) self.deselect_all_button.config(state=tk.DISABLED)
self.log_text.clear() self.log_text.clear()
# 清空隐藏的项目
self.hidden_items.clear()
# 禁用筛选按钮User 模式)
if not self.session_manager.is_admin():
if hasattr(self, 'btn_hide_checked'):
self.btn_hide_checked.config(state=tk.DISABLED)
if hasattr(self, 'btn_show_all'):
self.btn_show_all.config(state=tk.DISABLED)
# 保存当前筛选状态 # 保存当前筛选状态
self.previously_selected_managers = self._get_selected_managers() self.previously_selected_managers = self._get_selected_managers()
@@ -1080,6 +1200,13 @@ class MaterialValidationTab(ttk.Frame):
): ):
self.execute_delete_button.config(state=tk.NORMAL) self.execute_delete_button.config(state=tk.NORMAL)
# 启用筛选按钮User 模式)
if not self.session_manager.is_admin():
if hasattr(self, 'btn_hide_checked'):
self.btn_hide_checked.config(state=tk.NORMAL)
if hasattr(self, 'btn_show_all'):
self.btn_show_all.config(state=tk.NORMAL)
# 恢复筛选状态 # 恢复筛选状态
if hasattr(self, 'previously_selected_managers') and self.previously_selected_managers: if hasattr(self, 'previously_selected_managers') and self.previously_selected_managers:
self._restore_manager_filter_state(self.previously_selected_managers) self._restore_manager_filter_state(self.previously_selected_managers)