feat(client): 入库/出库录单表单(旗舰屏)斑马行 token 化 + 整屏 golden
录单明细网格斑马行 Colors.white/FFFAFAFA → surface/bg(修暗色破绽,两表单 现 0 硬编码色残留);入库+出库录单表单整屏 golden ×三主题(桌面+移动)入回归闸, 锁住 单据信息卡 + 可编辑明细网格 + 底栏。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
@@ -1024,7 +1024,7 @@ class _StockInFormScreenState extends ConsumerState<StockInFormScreen> {
|
||||
children: [
|
||||
IntrinsicHeight(
|
||||
child: Container(
|
||||
color: index.isEven ? Colors.white : const Color(0xFFFAFAFA),
|
||||
color: index.isEven ? context.tokens.surface : context.tokens.bg,
|
||||
child:
|
||||
Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
|
||||
SizedBox(
|
||||
|
||||
@@ -757,7 +757,7 @@ class _StockOutFormScreenState extends ConsumerState<StockOutFormScreen> {
|
||||
|
||||
return TableRow(
|
||||
decoration: BoxDecoration(
|
||||
color: index.isEven ? Colors.white : const Color(0xFFFAFAFA),
|
||||
color: index.isEven ? context.tokens.surface : context.tokens.bg,
|
||||
),
|
||||
children: [
|
||||
// 序号
|
||||
|
||||
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 32 KiB |
@@ -0,0 +1,88 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:jiu_client/core/models/page_result.dart';
|
||||
import 'package:jiu_client/core/auth/auth_state.dart';
|
||||
import 'package:jiu_client/models/partner.dart';
|
||||
import 'package:jiu_client/models/warehouse.dart';
|
||||
import 'package:jiu_client/models/product_option.dart';
|
||||
import 'package:jiu_client/providers/warehouse_provider.dart';
|
||||
import 'package:jiu_client/providers/partner_provider.dart';
|
||||
import 'package:jiu_client/providers/product_option_provider.dart';
|
||||
import 'package:jiu_client/screens/stock_in/stock_in_form_screen.dart';
|
||||
|
||||
import '../support/golden_harness.dart';
|
||||
|
||||
/// design-distill 阶段4:入库录单表单(旗舰屏)golden × 三主题。
|
||||
/// 锁住 单据信息卡 + 可编辑明细网格 + 底栏 随主题换色(含斑马行 token)。
|
||||
/// 更新基准:flutter test --update-goldens test/golden/stock_in_form_golden_test.dart
|
||||
|
||||
const _warehouses = [
|
||||
Warehouse(id: 1, name: '主仓', isDefault: true),
|
||||
Warehouse(id: 2, name: '二号仓', isDefault: false),
|
||||
];
|
||||
|
||||
class _FakeWarehouses extends WarehouseListNotifier {
|
||||
@override
|
||||
Future<List<Warehouse>> build() async => _warehouses;
|
||||
}
|
||||
|
||||
class _FakeSuppliers extends PartnerListNotifier {
|
||||
@override
|
||||
Future<PageResult<Partner>> build() async =>
|
||||
const PageResult(data: [], total: 0, page: 1, pageSize: 20);
|
||||
@override
|
||||
void setPage(int page) {}
|
||||
@override
|
||||
void setPageSize(int pageSize) {}
|
||||
@override
|
||||
void setKeyword(String keyword) {}
|
||||
@override
|
||||
void reload() {}
|
||||
}
|
||||
|
||||
class _FakeNames extends ProductNameListNotifier {
|
||||
@override
|
||||
Future<List<ProductNameOption>> build() async => const [];
|
||||
}
|
||||
|
||||
class _FakeSeries extends ProductSeriesListNotifier {
|
||||
@override
|
||||
Future<List<ProductSeriesOption>> build() async => const [];
|
||||
}
|
||||
|
||||
class _FakeSpecs extends ProductSpecListNotifier {
|
||||
@override
|
||||
Future<List<ProductSpecOption>> build() async => const [];
|
||||
}
|
||||
|
||||
List<Override> _overrides() => [
|
||||
warehouseListProvider.overrideWith(() => _FakeWarehouses()),
|
||||
supplierListProvider.overrideWith(() => _FakeSuppliers()),
|
||||
productNameListProvider.overrideWith(() => _FakeNames()),
|
||||
productSeriesListProvider.overrideWith(() => _FakeSeries()),
|
||||
productSpecListProvider.overrideWith(() => _FakeSpecs()),
|
||||
isReadonlyProvider.overrideWithValue(false),
|
||||
];
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
|
||||
goldenAcrossThemes(
|
||||
'stock-in form 录单(桌面)',
|
||||
goldenPrefix: 'stock_in_form',
|
||||
child: () => const Scaffold(body: StockInFormScreen()),
|
||||
overrides: _overrides,
|
||||
logical: const Size(1280, 920),
|
||||
);
|
||||
|
||||
goldenAcrossThemes(
|
||||
'stock-in form 录单(移动)',
|
||||
goldenPrefix: 'stock_in_form_mobile',
|
||||
child: () => const Scaffold(body: StockInFormScreen()),
|
||||
overrides: _overrides,
|
||||
logical: const Size(390, 1400),
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:jiu_client/core/models/page_result.dart';
|
||||
import 'package:jiu_client/core/auth/auth_state.dart';
|
||||
import 'package:jiu_client/models/partner.dart';
|
||||
import 'package:jiu_client/models/warehouse.dart';
|
||||
import 'package:jiu_client/providers/warehouse_provider.dart';
|
||||
import 'package:jiu_client/providers/partner_provider.dart';
|
||||
import 'package:jiu_client/screens/stock_out/stock_out_form_screen.dart';
|
||||
|
||||
import '../support/golden_harness.dart';
|
||||
|
||||
/// design-distill 阶段4:出库录单表单(旗舰屏)golden × 三主题。
|
||||
/// 锁住 单据信息卡 + 可编辑明细网格 + 底栏 随主题换色(含斑马行 token)。
|
||||
/// 更新基准:flutter test --update-goldens test/golden/stock_out_form_golden_test.dart
|
||||
|
||||
const _warehouses = [
|
||||
Warehouse(id: 1, name: '主仓', isDefault: true),
|
||||
Warehouse(id: 2, name: '二号仓', isDefault: false),
|
||||
];
|
||||
|
||||
class _FakeWarehouses extends WarehouseListNotifier {
|
||||
@override
|
||||
Future<List<Warehouse>> build() async => _warehouses;
|
||||
}
|
||||
|
||||
class _FakeCustomers extends PartnerListNotifier {
|
||||
@override
|
||||
Future<PageResult<Partner>> build() async =>
|
||||
const PageResult(data: [], total: 0, page: 1, pageSize: 20);
|
||||
@override
|
||||
void setPage(int page) {}
|
||||
@override
|
||||
void setPageSize(int pageSize) {}
|
||||
@override
|
||||
void setKeyword(String keyword) {}
|
||||
@override
|
||||
void reload() {}
|
||||
}
|
||||
|
||||
List<Override> _overrides() => [
|
||||
warehouseListProvider.overrideWith(() => _FakeWarehouses()),
|
||||
customerListProvider.overrideWith(() => _FakeCustomers()),
|
||||
isReadonlyProvider.overrideWithValue(false),
|
||||
];
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
|
||||
goldenAcrossThemes(
|
||||
'stock-out form 录单(桌面)',
|
||||
goldenPrefix: 'stock_out_form',
|
||||
child: () => const Scaffold(body: StockOutFormScreen()),
|
||||
overrides: _overrides,
|
||||
logical: const Size(1280, 920),
|
||||
);
|
||||
|
||||
goldenAcrossThemes(
|
||||
'stock-out form 录单(移动)',
|
||||
goldenPrefix: 'stock_out_form_mobile',
|
||||
child: () => const Scaffold(body: StockOutFormScreen()),
|
||||
overrides: _overrides,
|
||||
logical: const Size(390, 1400),
|
||||
);
|
||||
}
|
||||