feat: implement update functionality for receipt aliases and add corresponding tests
Test Suite / backend-pr-quick (24.15.0) (push) Has been skipped
Test Suite / quick-import-pr-quick (24.15.0) (push) Has been skipped
Test Suite / backend-full (24.15.0) (push) Failing after 22s
Test Suite / flutter-quality (push) Failing after 4s

This commit is contained in:
Nils-Johan Gynther
2026-05-12 21:25:48 +02:00
parent fb6b371fb7
commit 46b9be4791
10 changed files with 403 additions and 21 deletions
@@ -93,6 +93,68 @@ class _UserAliasesScreenState extends ConsumerState<UserAliasesScreen> {
}
}
Future<void> _editAlias(ReceiptAlias alias) async {
if (!alias.isPrivate) return;
final controller = TextEditingController(text: alias.receiptName);
final newAliasName = await showDialog<String>(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('Redigera alias'),
content: TextField(
controller: controller,
autofocus: true,
decoration: const InputDecoration(
labelText: 'Kvittonamn (alias)',
border: OutlineInputBorder(),
),
onSubmitted: (value) => Navigator.pop(ctx, value.trim()),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx),
child: const Text('Avbryt'),
),
FilledButton(
onPressed: () => Navigator.pop(ctx, controller.text.trim()),
child: const Text('Spara'),
),
],
),
);
controller.dispose();
if (!mounted || newAliasName == null) return;
final normalizedNew = newAliasName.trim();
if (normalizedNew.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Aliasnamn kan inte vara tomt.')),
);
return;
}
if (normalizedNew == alias.receiptName.trim()) return;
try {
final repo = ref.read(adminRepositoryProvider);
await repo.updateReceiptAlias(
alias.id,
receiptName: normalizedNew,
productId: alias.productId,
);
await _load();
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Alias uppdaterat.')),
);
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Kunde inte uppdatera alias: $e')),
);
}
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
@@ -242,11 +304,21 @@ class _UserAliasesScreenState extends ConsumerState<UserAliasesScreen> {
],
),
trailing: alias.isPrivate
? IconButton(
icon: const Icon(Icons.delete_outline),
tooltip: 'Ta bort alias',
color: theme.colorScheme.error,
onPressed: () => _delete(alias),
? Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: const Icon(Icons.edit_outlined),
tooltip: 'Redigera alias',
onPressed: () => _editAlias(alias),
),
IconButton(
icon: const Icon(Icons.delete_outline),
tooltip: 'Ta bort alias',
color: theme.colorScheme.error,
onPressed: () => _delete(alias),
),
],
)
: null,
);