feat(inventory): month/year harvest date picker (schema v3)
Replace the free-text harvest year with a themed month/year picker: a tappable field opens a green-styled dialog with month and year grids (navigable, paginated years), month optional. Lots now read e.g. "September 2021" or just "Year 2021". - schema v3: add nullable Lot.harvest_month (1..12) + migration + tests - repo/cubit propagate harvestMonth; localized month names (en/es) via slang
This commit is contained in:
parent
9e5c82184b
commit
5d4053157f
17 changed files with 3799 additions and 57 deletions
|
|
@ -11,19 +11,30 @@ void main() {
|
|||
verifier = SchemaVerifier(GeneratedHelper());
|
||||
});
|
||||
|
||||
test('freshly created database matches the exported schema v2', () async {
|
||||
final schema = await verifier.schemaAt(2);
|
||||
test('freshly created database matches the exported schema v3', () async {
|
||||
final schema = await verifier.schemaAt(3);
|
||||
final db = AppDatabase(schema.newConnection());
|
||||
await verifier.migrateAndValidate(db, 2);
|
||||
await verifier.migrateAndValidate(db, 3);
|
||||
await db.close();
|
||||
});
|
||||
|
||||
test(
|
||||
'upgrades v1 → v2 (adds Lot.type) and matches the fresh schema',
|
||||
'upgrades v1 → v3 (adds Lot.type, then harvestMonth) and matches the '
|
||||
'fresh schema',
|
||||
() async {
|
||||
final connection = await verifier.startAt(1);
|
||||
final db = AppDatabase(connection);
|
||||
await verifier.migrateAndValidate(db, 2);
|
||||
await verifier.migrateAndValidate(db, 3);
|
||||
await db.close();
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
'upgrades v2 → v3 (adds Lot.harvestMonth) and matches the fresh schema',
|
||||
() async {
|
||||
final connection = await verifier.startAt(2);
|
||||
final db = AppDatabase(connection);
|
||||
await verifier.migrateAndValidate(db, 3);
|
||||
await db.close();
|
||||
},
|
||||
);
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import 'package:drift/drift.dart';
|
|||
import 'package:drift/internal/migrations.dart';
|
||||
import 'schema_v1.dart' as v1;
|
||||
import 'schema_v2.dart' as v2;
|
||||
import 'schema_v3.dart' as v3;
|
||||
|
||||
class GeneratedHelper implements SchemaInstantiationHelper {
|
||||
@override
|
||||
|
|
@ -15,10 +16,12 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
|||
return v1.DatabaseAtV1(db);
|
||||
case 2:
|
||||
return v2.DatabaseAtV2(db);
|
||||
case 3:
|
||||
return v3.DatabaseAtV3(db);
|
||||
default:
|
||||
throw MissingSchemaException(version, versions);
|
||||
}
|
||||
}
|
||||
|
||||
static const versions = const [1, 2];
|
||||
static const versions = const [1, 2, 3];
|
||||
}
|
||||
|
|
|
|||
1399
apps/app_seeds/test/db/schema/schema_v3.dart
Normal file
1399
apps/app_seeds/test/db/schema/schema_v3.dart
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -83,9 +83,13 @@ void main() {
|
|||
await tester.tap(find.byKey(const Key('detail.addLot')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.byKey(const Key('addLot.year')));
|
||||
await tester.tap(find.byKey(const Key('addLot.year'))); // open the picker
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('2023').last); // pick the year from the dropdown
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.yearToggle')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.year.2023')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.ok')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('spoon')); // pick the unit from the scale
|
||||
await tester.pumpAndSettle();
|
||||
|
|
@ -222,9 +226,13 @@ void main() {
|
|||
await tester.tap(find.text('Year 2020 · 1 packet')); // open the lot
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.byKey(const Key('addLot.year')));
|
||||
await tester.tap(find.byKey(const Key('addLot.year'))); // open the picker
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('2024').last);
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.yearToggle')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.year.2024')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.ok')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('addLot.save')));
|
||||
await tester.pumpAndSettle();
|
||||
|
|
@ -233,6 +241,44 @@ void main() {
|
|||
await disposeTree(tester);
|
||||
});
|
||||
|
||||
testWidgets('picking a harvest month shows month + year on the lot', (
|
||||
tester,
|
||||
) async {
|
||||
final repo = newTestRepository(db);
|
||||
final id = await repo.addQuickVariety(label: 'Maize');
|
||||
|
||||
await tester.pumpWidget(
|
||||
wrapDetail(
|
||||
repository: repo,
|
||||
varietyId: id,
|
||||
species: newTestSpeciesRepository(db),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.byKey(const Key('detail.addLot')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.byKey(const Key('addLot.year'))); // open the picker
|
||||
await tester.pumpAndSettle();
|
||||
// Pick year 2022…
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.yearToggle')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.year.2022')));
|
||||
await tester.pumpAndSettle();
|
||||
// …then September (month 9).
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.month.9')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('harvestPicker.ok')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.byKey(const Key('addLot.save')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('September 2022'), findsOneWidget);
|
||||
await disposeTree(tester);
|
||||
});
|
||||
|
||||
testWidgets('deleting a lot removes it', (tester) async {
|
||||
final repo = newTestRepository(db);
|
||||
final id = await repo.addQuickVariety(label: 'Maize');
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue