feat(client): 列表屏搜索前置/显示字段记忆/移动端表格切换与工具栏瘦身/退出登录归位
- 库存查询搜索框移到工具栏最前(桌面)/独占首行(移动端) - 修复入库/出库/财务「显示字段」失效:移除 minWidth 运行时强制隐藏, 用户勾选权威、minWidth 仅作首次默认;新增 ColumnPrefs 持久化记忆(四屏独立) - 移动端库存支持表格/卡片列表切换 - 移动端三个列表屏工具栏改 Wrap 紧凑布局、导出/显示字段图标化 - 退出登录统一到左侧导航:删系统设置内与桌面右上角下拉,桌面左侧栏底部新增 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import '../../providers/finance_provider.dart';
|
||||
import '../../widgets/data_table_card.dart';
|
||||
import '../../widgets/mobile_list_card.dart';
|
||||
import '../../widgets/multi_select_dropdown.dart' show ColDef, ColumnToggleButton, FilterableColumnHeader;
|
||||
import '../../core/storage/column_prefs.dart';
|
||||
import '../../widgets/page_scaffold.dart';
|
||||
import '../../providers/connectivity_provider.dart';
|
||||
import '../../core/utils/export_util.dart';
|
||||
@@ -53,7 +54,9 @@ class _FinanceTabState extends ConsumerState<_FinanceTab> {
|
||||
|
||||
Set<String> _filterType = {};
|
||||
Set<String> _filterPartner = {};
|
||||
Set<String> _hiddenCols = {};
|
||||
Set<String>? _hiddenCols; // null = 尚未载入本地存档(回退到 minWidth 首次默认)
|
||||
|
||||
static const _screenId = 'finance';
|
||||
|
||||
static const _colDefs = [
|
||||
ColDef('date', '日期', required: true),
|
||||
@@ -73,6 +76,9 @@ class _FinanceTabState extends ConsumerState<_FinanceTab> {
|
||||
final now = DateTime.now();
|
||||
_month = '${now.year}-${now.month.toString().padLeft(2, '0')}';
|
||||
_fetch();
|
||||
ColumnPrefs.load(_screenId).then((saved) {
|
||||
if (saved != null && mounted) setState(() => _hiddenCols = saved);
|
||||
});
|
||||
}
|
||||
|
||||
void _fetch() {
|
||||
@@ -230,11 +236,15 @@ class _FinanceTabState extends ConsumerState<_FinanceTab> {
|
||||
..sort();
|
||||
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
final visibleCols = _colDefs
|
||||
.where((c) =>
|
||||
!_hiddenCols.contains(c.key) &&
|
||||
(c.minWidth == null || screenWidth >= c.minWidth!))
|
||||
.toList();
|
||||
// 隐藏列:本地存档优先;无存档时按 minWidth 计算首次默认隐藏集。
|
||||
final hidden = _hiddenCols ??
|
||||
_colDefs
|
||||
.where((c) => c.minWidth != null && screenWidth < c.minWidth!)
|
||||
.map((c) => c.key)
|
||||
.toSet();
|
||||
// 列可见性只看用户选择(minWidth 仅作首次默认,不再运行时强制隐藏)。
|
||||
final visibleCols =
|
||||
_colDefs.where((c) => !hidden.contains(c.key)).toList();
|
||||
|
||||
final columns = visibleCols.map((c) {
|
||||
final label = switch (c.key) {
|
||||
@@ -455,8 +465,11 @@ class _FinanceTabState extends ConsumerState<_FinanceTab> {
|
||||
const SizedBox(width: 8),
|
||||
ColumnToggleButton(
|
||||
columns: _colDefs,
|
||||
hidden: _hiddenCols,
|
||||
onChanged: (v) => setState(() => _hiddenCols = v),
|
||||
hidden: hidden,
|
||||
onChanged: (v) {
|
||||
setState(() => _hiddenCols = v);
|
||||
ColumnPrefs.save(_screenId, v);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user