68 lines
1.7 KiB
Dart
68 lines
1.7 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:pshared/models/payment/payment.dart';
|
|
|
|
import 'package:pweb/pages/report/details/row.dart';
|
|
import 'package:pweb/pages/report/details/section.dart';
|
|
|
|
import 'package:pweb/generated/i18n/app_localizations.dart';
|
|
|
|
|
|
class PaymentMetadataSection extends StatelessWidget {
|
|
final Payment payment;
|
|
|
|
const PaymentMetadataSection({
|
|
super.key,
|
|
required this.payment,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final loc = AppLocalizations.of(context)!;
|
|
final metadata = payment.metadata ?? const {};
|
|
const allowedKeys = {'upload_filename', 'upload_rows'};
|
|
final filtered = Map<String, String>.fromEntries(
|
|
metadata.entries.where((entry) => allowedKeys.contains(entry.key)),
|
|
);
|
|
|
|
if (filtered.isEmpty) {
|
|
return DetailsSection(
|
|
title: loc.paymentDetailsMetadata,
|
|
children: [
|
|
Text(
|
|
loc.metadataEmpty,
|
|
style: Theme.of(context).textTheme.bodyMedium,
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
final entries = filtered.entries.toList()
|
|
..sort((a, b) => a.key.compareTo(b.key));
|
|
|
|
return DetailsSection(
|
|
title: loc.paymentDetailsMetadata,
|
|
children: entries
|
|
.map(
|
|
(entry) => DetailRow(
|
|
label: _metadataLabel(loc, entry.key),
|
|
value: entry.value,
|
|
monospaced: true,
|
|
),
|
|
)
|
|
.toList(),
|
|
);
|
|
}
|
|
}
|
|
|
|
String _metadataLabel(AppLocalizations loc, String key) {
|
|
switch (key) {
|
|
case 'upload_filename':
|
|
return loc.metadataUploadFileName;
|
|
case 'upload_rows':
|
|
return loc.metadataTotalRecipients;
|
|
default:
|
|
return key;
|
|
}
|
|
}
|