86 lines
2.5 KiB
Dart
86 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:collection/collection.dart';
|
|
|
|
import 'package:pshared/models/invitation/invitation.dart';
|
|
import 'package:pshared/models/invitation/status.dart';
|
|
import 'package:pshared/models/permissions/descriptions/role.dart';
|
|
|
|
import 'package:pweb/generated/i18n/app_localizations.dart';
|
|
|
|
|
|
class InvitationInfoRow extends StatelessWidget {
|
|
final IconData icon;
|
|
final String label;
|
|
final String value;
|
|
|
|
const InvitationInfoRow({
|
|
super.key,
|
|
required this.icon,
|
|
required this.label,
|
|
required this.value,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
return Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(icon, size: 18, color: theme.hintColor),
|
|
const SizedBox(width: 6),
|
|
if (value.isEmpty)
|
|
Text(label, style: theme.textTheme.bodyMedium)
|
|
else
|
|
RichText(
|
|
text: TextSpan(
|
|
style: theme.textTheme.bodyMedium,
|
|
children: [
|
|
TextSpan(text: '$label: ', style: const TextStyle(fontWeight: FontWeight.w600)),
|
|
TextSpan(text: value),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
String invitationStatusLabel(Invitation invitation, AppLocalizations loc) {
|
|
if (invitation.isExpired && invitation.isPending) {
|
|
return loc.invitationStatusExpired;
|
|
}
|
|
switch (invitation.status) {
|
|
case InvitationStatus.created:
|
|
case InvitationStatus.sent:
|
|
return loc.invitationStatusPending;
|
|
case InvitationStatus.accepted:
|
|
return loc.invitationStatusAccepted;
|
|
case InvitationStatus.declined:
|
|
return loc.invitationStatusDeclined;
|
|
case InvitationStatus.revoked:
|
|
return loc.invitationStatusRevoked;
|
|
}
|
|
}
|
|
|
|
Color invitationStatusColor(ThemeData theme, Invitation invitation) {
|
|
if (invitation.isExpired && invitation.isPending) {
|
|
return theme.disabledColor;
|
|
}
|
|
switch (invitation.status) {
|
|
case InvitationStatus.created:
|
|
case InvitationStatus.sent:
|
|
return Colors.amber.shade800;
|
|
case InvitationStatus.accepted:
|
|
return Colors.green.shade700;
|
|
case InvitationStatus.declined:
|
|
case InvitationStatus.revoked:
|
|
return Colors.red.shade700;
|
|
}
|
|
}
|
|
|
|
String invitationRoleLabel(List<RoleDescription> roles, Invitation invitation, AppLocalizations loc) {
|
|
final role = roles.firstWhereOrNull((r) => r.storable.id == invitation.roleRef);
|
|
return role?.describable.name ?? loc.invitationUnknownRole;
|
|
}
|