diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index f0834c8..0d2f1cc 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -163,6 +163,8 @@ Future loginAPI({ Provider.of(context, listen: false).fetch(), Provider.of(context, listen: false).fetch(), Provider.of(context, listen: false).fetchAll(), + Provider.of(context, listen: false) + .fetchAllRecipients(), Provider.of(context, listen: false).fetch(), Provider.of(context, listen: false).fetch(), Provider.of(context, listen: false).fetch(), diff --git a/filcnaplo/lib/api/providers/sync.dart b/filcnaplo/lib/api/providers/sync.dart index 23089f9..56723f9 100644 --- a/filcnaplo/lib/api/providers/sync.dart +++ b/filcnaplo/lib/api/providers/sync.dart @@ -55,7 +55,7 @@ Future syncAll(BuildContext context) { .fetch(from: DateTime.now().subtract(const Duration(days: 30)))), syncStatus(Provider.of(context, listen: false).fetchAll()), syncStatus( - Provider.of(context, listen: false).fetchRecipients()), + Provider.of(context, listen: false).fetchAllRecipients()), syncStatus(Provider.of(context, listen: false).fetch()), syncStatus(Provider.of(context, listen: false).fetch()), syncStatus(Provider.of(context, listen: false).fetch()), diff --git a/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart b/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart index 5421f06..6a98479 100644 --- a/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart +++ b/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart @@ -62,6 +62,8 @@ class _SidebarState extends State { Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), + Provider.of(context, listen: false) + .restoreRecipients(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), diff --git a/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart index adf9de3..137a69d 100644 --- a/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart @@ -67,6 +67,8 @@ class _SettingsScreenState extends State Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), + Provider.of(context, listen: false) + .restoreRecipients(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), diff --git a/filcnaplo_kreta_api/lib/models/message.dart b/filcnaplo_kreta_api/lib/models/message.dart index 85eb3c6..711f7a9 100644 --- a/filcnaplo_kreta_api/lib/models/message.dart +++ b/filcnaplo_kreta_api/lib/models/message.dart @@ -157,18 +157,18 @@ class SendRecipient { factory SendRecipient.fromJson(Map json, SendRecipientType type) { return SendRecipient( - id: json['azonosito'], + id: int.parse(json['oktatasiAzonosito'] ?? '0'), kretaId: json['kretaAzonosito'], - name: json['name'], + name: json['nev'], type: type, json: json, ); } Object get kretaJson => { - 'azonosito': id, - 'kretaAzonosito': kretaId, - 'nev': name, + 'azonosito': id ?? 0, + 'kretaAzonosito': kretaId ?? 0, + 'nev': name ?? 'Teszt Lajos', 'tipus': { 'azonosito': type.id, 'kod': type.code, diff --git a/filcnaplo_kreta_api/lib/providers/message_provider.dart b/filcnaplo_kreta_api/lib/providers/message_provider.dart index 27f5e12..f704d72 100644 --- a/filcnaplo_kreta_api/lib/providers/message_provider.dart +++ b/filcnaplo_kreta_api/lib/providers/message_provider.dart @@ -21,11 +21,10 @@ class MessageProvider with ChangeNotifier { MessageProvider({ List initialMessages = const [], - List initialRecipients = const [], required BuildContext context, }) { _messages = List.castFrom(initialMessages); - _recipients = List.castFrom(initialRecipients); + _recipients = []; _context = context; if (_messages.isEmpty) restore(); @@ -115,8 +114,13 @@ class MessageProvider with ChangeNotifier { } } + // fetch all recipients + Future fetchAllRecipients() => Future.forEach( + AddresseeType.values, (AddresseeType v) => fetchRecipients(type: v)); + // fetch recipients - Future fetchRecipients() async { + Future fetchRecipients( + {AddresseeType type = AddresseeType.teachers}) async { Map addressable = {}; // check user @@ -163,11 +167,13 @@ class MessageProvider with ChangeNotifier { // parse recipients List recipients = []; - if (addressable.containsKey(AddresseeType.teachers)) { + if (addressable.containsKey(AddresseeType.teachers) && + type == AddresseeType.teachers) { recipients.addAll(recipientTeachersJson.map((e) => SendRecipient.fromJson(e, addressable[AddresseeType.teachers]!))); } - if (addressable.containsKey(AddresseeType.directorate)) { + if (addressable.containsKey(AddresseeType.directorate) && + type == AddresseeType.directorate) { recipients.addAll(recipientDirectorateJson.map((e) => SendRecipient.fromJson(e, addressable[AddresseeType.directorate]!))); } @@ -178,11 +184,17 @@ class MessageProvider with ChangeNotifier { // print(recipients.first.json); // } - storeRecipients(recipients); + await storeRecipients(recipients, type); } // store recipients - Future storeRecipients(List recipients) async { + Future storeRecipients( + List recipients, AddresseeType type) async { + _recipients.removeWhere((r) => (type == AddresseeType.teachers + ? (r.type.code == 'TANAR') + : (type == AddresseeType.directorate + ? (r.type.code == 'IGAZGATOSAG') + : r.type.code != ''))); _recipients.addAll(recipients); User? user = Provider.of(_context, listen: false).user; @@ -207,20 +219,21 @@ class MessageProvider with ChangeNotifier { User? user = Provider.of(_context, listen: false).user; if (user == null) throw "Cannot send Message as User null"; - for (var r in recipients) { - recipientList.add({ - "azonosito": r.id ?? "", - "kretaAzonosito": r.kretaId ?? "", - "nev": r.name ?? "Teszt Lajos", - "tipus": { - "kod": r.type.code, - "leiras": r.type.description, - "azonosito": r.type.id, - "nev": r.type.name, - "rovidNev": r.type.shortName, - } - }); - } + // for (var r in recipients) { + // recipientList.add({ + // "azonosito": r.id ?? "", + // "kretaAzonosito": r.kretaId ?? "", + // "nev": r.name ?? "Teszt Lajos", + // "tipus": { + // "kod": r.type.code, + // "leiras": r.type.description, + // "azonosito": r.type.id, + // "nev": r.type.name, + // "rovidNev": r.type.shortName, + // } + // }); + // } + recipientList.addAll(recipients.map((e) => e.kretaJson)); Object body = { "cimzettLista": recipientList, diff --git a/filcnaplo_mobile_ui/lib/common/profile_image/profile_button.dart b/filcnaplo_mobile_ui/lib/common/profile_image/profile_button.dart index 52142f0..976c7bd 100755 --- a/filcnaplo_mobile_ui/lib/common/profile_image/profile_button.dart +++ b/filcnaplo_mobile_ui/lib/common/profile_image/profile_button.dart @@ -35,6 +35,8 @@ class ProfileButton extends StatelessWidget { Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), + Provider.of(context, listen: false) + .restoreRecipients(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), diff --git a/filcnaplo_mobile_ui/lib/pages/messages/messages_page.dart b/filcnaplo_mobile_ui/lib/pages/messages/messages_page.dart index 76109b6..62a5777 100755 --- a/filcnaplo_mobile_ui/lib/pages/messages/messages_page.dart +++ b/filcnaplo_mobile_ui/lib/pages/messages/messages_page.dart @@ -73,7 +73,7 @@ class MessagesPageState extends State horizontal: 8.0, vertical: 5.0), child: IconButton( splashRadius: 24.0, - onPressed: () { + onPressed: () async { // Navigator.of(context, rootNavigator: true) // .push(PageRouteBuilder( // pageBuilder: (context, animation, secondaryAnimation) => @@ -87,7 +87,7 @@ class MessagesPageState extends State // setSystemChrome(context); // }); // SoonAlert.show(context: context); - showSendMessageSheet(context); + await showSendMessageSheet(context); }, icon: Icon( FeatherIcons.send, @@ -226,8 +226,8 @@ class MessagesPageState extends State ); } - void showSendMessageSheet(BuildContext context) { - messageProvider.fetchRecipients(); + Future showSendMessageSheet(BuildContext context) async { + await messageProvider.fetchAllRecipients(); _scaffoldKey.currentState?.showBottomSheet( (context) => RoundedBottomSheet( diff --git a/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.dart b/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.dart index c452ef6..d527834 100644 --- a/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.dart +++ b/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.dart @@ -1,3 +1,5 @@ +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:filcnaplo/theme/colors/colors.dart'; import 'package:filcnaplo_kreta_api/models/message.dart'; import 'package:filcnaplo_kreta_api/providers/message_provider.dart'; // import 'package:filcnaplo_mobile_ui/common/custom_snack_bar.dart'; @@ -25,9 +27,7 @@ class SendMessageSheetState extends State { double newValue = 5.0; double newWeight = 100.0; - List buildRecipientTiles() { - return []; - } + List selectedRecipients = []; @override Widget build(BuildContext context) { @@ -48,7 +48,81 @@ class SendMessageSheetState extends State { ), // message recipients - Row(children: buildRecipientTiles()), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: DropdownButton2( + items: widget.availableRecipients + .map((item) => DropdownMenuItem( + value: item.kretaId.toString(), + child: Text( + item.name ?? (item.id ?? 'Nincs név').toString(), + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: AppColors.of(context).text, + ), + overflow: TextOverflow.ellipsis, + ), + )) + .toList(), + onChanged: (String? v) async { + int kretaId = int.parse(v ?? '0'); + + setState(() { + selectedRecipients.add(widget.availableRecipients + .firstWhere((e) => e.kretaId == kretaId)); + + widget.availableRecipients + .removeWhere((e) => e.kretaId == kretaId); + }); + }, + iconSize: 14, + iconEnabledColor: AppColors.of(context).text, + iconDisabledColor: AppColors.of(context).text, + underline: const SizedBox(), + itemHeight: 40, + itemPadding: const EdgeInsets.only(left: 14, right: 14), + buttonWidth: 50, + dropdownWidth: 300, + dropdownPadding: null, + buttonDecoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + ), + dropdownDecoration: BoxDecoration( + borderRadius: BorderRadius.circular(14), + ), + dropdownElevation: 8, + scrollbarRadius: const Radius.circular(40), + scrollbarThickness: 6, + scrollbarAlwaysShow: true, + offset: const Offset(-10, -10), + buttonSplashColor: Colors.transparent, + customButton: Container( + width: double.infinity, + decoration: BoxDecoration( + border: Border.all(color: Colors.grey, width: 2), + borderRadius: BorderRadius.circular(12.0), + ), + padding: + const EdgeInsets.symmetric(vertical: 12.0, horizontal: 8.0), + child: Text( + selectedRecipients.isEmpty + ? "select_recipient".i18n + : selectedRecipients + .map((e) => + '${e.name ?? (e.id ?? 'Nincs név').toString()}, ') + .join(), + style: Theme.of(context).textTheme.titleSmall!.copyWith( + fontWeight: FontWeight.w700, + color: AppColors.of(context).text.withOpacity(0.75)), + overflow: TextOverflow.ellipsis, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ), + ), + // Row(children: buildRecipientTiles()), // message content Column(children: [ diff --git a/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.i18n.dart b/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.i18n.dart index 8cfbe50..736b849 100644 --- a/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.i18n.dart +++ b/filcnaplo_mobile_ui/lib/pages/messages/send_message/send_message.i18n.dart @@ -10,6 +10,7 @@ extension Localization on String { "sent": "Message sent successfully.", "message_subject": "Tárgy...", "message_text": "Üzenet szövege...", + "select_recipient": "Add Recipient", }, "hu_hu": { "recipients": "Recipients", @@ -18,6 +19,7 @@ extension Localization on String { "sent": "Message sent successfully.", "message_subject": "Tárgy...", "message_text": "Üzenet szövege...", + "select_recipient": "Címzett hozzáadása", }, "de_de": { "recipients": "Recipients", @@ -26,6 +28,7 @@ extension Localization on String { "sent": "Message sent successfully.", "message_subject": "Tárgy...", "message_text": "Üzenet szövege...", + "select_recipient": "Select Recipient", }, }; diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart index 963f781..957ef81 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart @@ -74,6 +74,8 @@ class _SettingsScreenState extends State Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), + Provider.of(context, listen: false) + .restoreRecipients(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restore(),