From bf9064a9c9d9606b9b3310075f8f3028057aac5b Mon Sep 17 00:00:00 2001 From: Ashutosh Date: Thu, 1 Aug 2024 13:46:46 +0530 Subject: [PATCH] fist commit ftc staff app clone --- .gitignore | 46 + .metadata | 33 + README.md | 22 + analysis_options.yaml | 28 + android/.gitignore | 13 + android/app/build.gradle | 67 + android/app/google-services.json | 29 + android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 38 + .../ftc/app/ftc_mobile_app/MainActivity.kt | 6 + .../src/main/res/drawable-v21/background.png | Bin 0 -> 69 bytes .../res/drawable-v21/launch_background.xml | 6 + .../app/src/main/res/drawable/background.png | Bin 0 -> 69 bytes .../main/res/drawable/launch_background.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1658 bytes .../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 1658 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 873 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 873 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2383 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 2383 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4242 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 4242 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6413 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 6413 bytes .../src/main/res/values-night-v31/styles.xml | 20 + .../app/src/main/res/values-night/styles.xml | 22 + .../app/src/main/res/values-v31/styles.xml | 20 + android/app/src/main/res/values/styles.xml | 22 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 34 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle | 20 + assets/consent-capacity.html | 631 +++++++++ assets/fonts/Roboto-Black.ttf | Bin 0 -> 168060 bytes assets/fonts/Roboto-BlackItalic.ttf | Bin 0 -> 174108 bytes assets/fonts/Roboto-Bold.ttf | Bin 0 -> 167336 bytes assets/fonts/Roboto-BoldItalic.ttf | Bin 0 -> 171508 bytes assets/fonts/Roboto-Italic.ttf | Bin 0 -> 170504 bytes assets/fonts/Roboto-Light.ttf | Bin 0 -> 167000 bytes assets/fonts/Roboto-LightItalic.ttf | Bin 0 -> 173172 bytes assets/fonts/Roboto-Medium.ttf | Bin 0 -> 168644 bytes assets/fonts/Roboto-MediumItalic.ttf | Bin 0 -> 173416 bytes assets/fonts/Roboto-Regular.ttf | Bin 0 -> 168260 bytes assets/fonts/Roboto-Thin.ttf | Bin 0 -> 168488 bytes assets/fonts/Roboto-ThinItalic.ttf | Bin 0 -> 172860 bytes assets/icon/icon.png | Bin 0 -> 61022 bytes assets/images/png/app-logo-icon.png | Bin 0 -> 10018 bytes assets/images/png/app_icon.png | Bin 0 -> 61022 bytes assets/images/png/human_body_front_back.png | Bin 0 -> 48743 bytes assets/images/png/ratings/ic_angry.webp | Bin 0 -> 5248 bytes assets/images/png/ratings/ic_bored.webp | Bin 0 -> 3812 bytes assets/images/png/ratings/ic_calm.webp | Bin 0 -> 4892 bytes assets/images/png/ratings/ic_confident.webp | Bin 0 -> 4556 bytes assets/images/png/ratings/ic_excited.webp | Bin 0 -> 5012 bytes assets/images/png/ratings/ic_happy.webp | Bin 0 -> 4580 bytes assets/images/png/ratings/ic_hopeful.webp | Bin 0 -> 4616 bytes assets/images/png/ratings/ic_nervous.webp | Bin 0 -> 4818 bytes assets/images/png/ratings/ic_proud.webp | Bin 0 -> 5364 bytes assets/images/png/ratings/ic_relaxed.webp | Bin 0 -> 4616 bytes assets/images/png/ratings/ic_sad.webp | Bin 0 -> 4646 bytes assets/images/png/ratings/ic_scared.webp | Bin 0 -> 5050 bytes assets/images/png/ratings/ic_tired.webp | Bin 0 -> 6076 bytes assets/images/png/ratings/ic_worried.webp | Bin 0 -> 4402 bytes assets/images/svg/arrow-next-icon.svg | 3 + assets/images/svg/back_icon.svg | 3 + assets/images/svg/bell_icon.svg | 4 + .../images/svg/calendar_appointment_icon.svg | 3 + .../svg/careNotesCategories/ic_general.svg | 3 + .../svg/careNotesCategories/ic_health.svg | 3 + .../ic_independent_living.svg | 4 + .../careNotesCategories/ic_intractions.svg | 3 + .../ic_mental_wellbeing.svg | 5 + .../careNotesCategories/ic_personal_care.svg | 3 + .../svg/careNotesSubcatgeories/ic_abc.svg | 8 + .../careNotesSubcatgeories/ic_activity.svg | 3 + .../careNotesSubcatgeories/ic_appointment.svg | 3 + .../careNotesSubcatgeories/ic_cleaning.svg | 3 + .../svg/careNotesSubcatgeories/ic_consent.svg | 3 + .../svg/careNotesSubcatgeories/ic_cooking.svg | 3 + .../careNotesSubcatgeories/ic_education.svg | 3 + .../svg/careNotesSubcatgeories/ic_email.svg | 3 + .../svg/careNotesSubcatgeories/ic_finance.svg | 3 + .../careNotesSubcatgeories/ic_hydration.svg | 4 + .../svg/careNotesSubcatgeories/ic_injury.svg | 3 + .../svg/careNotesSubcatgeories/ic_laundry.svg | 3 + .../svg/careNotesSubcatgeories/ic_meeting.svg | 3 + .../svg/careNotesSubcatgeories/ic_mood.svg | 3 + .../ic_mouth_hygiene.svg | 8 + .../svg/careNotesSubcatgeories/ic_note.svg | 3 + .../ic_other_interactions.svg | 11 + .../svg/careNotesSubcatgeories/ic_others.svg | 9 + .../ic_physical_intervention.svg | 3 + .../ic_public_interaction.svg | 3 + .../svg/careNotesSubcatgeories/ic_reviews.svg | 3 + .../ic_safeguarding.svg | 3 + .../svg/careNotesSubcatgeories/ic_search.svg | 3 + .../svg/careNotesSubcatgeories/ic_shower.svg | 3 + .../svg/careNotesSubcatgeories/ic_sleep.svg | 3 + .../careNotesSubcatgeories/ic_telephone.svg | 3 + .../careNotesSubcatgeories/ic_toileting.svg | 3 + .../ic_weight_height.svg | 8 + assets/images/svg/care_plan_icon.svg | 4 + assets/images/svg/clock_icon.svg | 4 + assets/images/svg/dustbin_red.svg | 3 + assets/images/svg/eclipse.svg | 3 + assets/images/svg/flag_icon.svg | 4 + assets/images/svg/folder_icon.svg | 3 + assets/images/svg/got_to_arrow_button.svg | 4 + assets/images/svg/human_body_front_back.svg | 143 ++ assets/images/svg/ic_add.svg | 5 + assets/images/svg/ic_at.svg | 3 + assets/images/svg/lock-icon.svg | 3 + assets/images/svg/man_body_image.svg | 6 + assets/images/svg/man_image.svg | 9 + assets/images/svg/man_image_png.png | Bin 0 -> 11605 bytes assets/images/svg/menu_drawer_icon.svg | 5 + assets/images/svg/menudrawerIcon.svg | 5 + assets/images/svg/microphone_mike.svg | 6 + assets/images/svg/nav_bar_calendar_icon.svg | 3 + assets/images/svg/nav_bar_home_icon.svg | 4 + assets/images/svg/nav_bar_message_icon.svg | 3 + assets/images/svg/nav_bar_people_icon.svg | 4 + .../images/svg/nav_bar_person_main_icon.svg | 4 + assets/images/svg/notes_icon.svg | 3 + assets/images/svg/pencil-icon.svg | 3 + assets/images/svg/pencil_outline_icon.svg | 3 + assets/images/svg/people_unselected.svg | 4 + assets/images/svg/photo_gallery_icon.svg | 5 + assets/images/svg/plus_icon.svg | 4 + assets/images/svg/policies_icon.svg | 3 + assets/images/svg/selected_calendar.svg | 3 + assets/images/svg/setting_icon.svg | 4 + assets/images/svg/triangle.svg | 3 + assets/images/svg/upload_icon.svg | 5 + assets/images/svg/upward_triangle_white.svg | 3 + flutter_launcher_icons.yaml | 6 + ios/.gitignore | 36 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 2 + ios/Flutter/Release.xcconfig | 3 + ios/Podfile | 81 ++ ios/Runner.xcodeproj/project.pbxproj | 790 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 60796 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 285 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 685 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1222 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 457 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1204 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 2085 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 685 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1878 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 3291 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 1026 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 2591 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1092 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 2985 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 3291 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 5845 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 1658 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 4242 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1734 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 4579 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 5230 bytes .../LaunchBackground.imageset/Contents.json | 21 + .../LaunchBackground.imageset/background.png | Bin 0 -> 69 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 69 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 69 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 69 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 44 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/GoogleService-Info.plist | 30 + ios/Runner/Info.plist | 62 + ios/Runner/Runner-Bridging-Header.h | 1 + ios/Runner/Runner.entitlements | 8 + ios/RunnerTests/RunnerTests.swift | 12 + ios/firebase_app_id_file.json | 7 + .../agency_sign_in_controller.dart | 57 + .../auth_module/export_auth_module.dart | 4 + .../auth_module/otp_screen_controller.dart | 53 + .../sing_in_screen_controller.dart | 116 ++ .../auth_module/splash_screen_controller.dart | 119 ++ ...s_to_new_body_point_screen_controller.dart | 100 ++ .../add_new_document_screen_controller.dart | 127 ++ ...new_recent_incident_screen_controller.dart | 166 +++ .../all_care_notes_screen_contorller.dart | 121 ++ .../appointment_screen_controller.dart | 71 + .../ABC_form_screen_controller.dart | 65 + ...ategory_subcategory_widget_controller.dart | 46 + .../common_care_note_forms_controller.dart | 89 ++ ...nsent_capacity_form_screen_controller.dart | 285 ++++ ...e_text_entries_form_screen_controller.dart | 54 + ...h_appointments_form_screen_controller.dart | 76 ++ ...y_health_issue_form_screen_controller.dart | 152 +++ .../mood_rating_form_controller.dart | 60 + ...tion_hydration_form_screen_controller.dart | 67 + .../observations_form_screen_controller.dart | 93 ++ ...l_intervention_form_screen_controller.dart | 209 +++ .../safeguarding_form_screen_controller.dart | 138 ++ ...showering_bath_form_screen_controller.dart | 51 + ...toileting_note_form_screen_controller.dart | 53 + .../weight_height_form_screen_controller.dart | 74 + .../care_note_detail_screen_controller.dart | 75 + .../clients/care_notes_screen_controller.dart | 273 ++++ ...notes_subcategories_screen_controller.dart | 24 + .../care_plan_menu_screen_controller.dart | 42 + .../client_profile_screen_controller.dart | 29 + .../clients_list_screen_controller.dart | 127 ++ ...pacity_add_new_form_screen_controller.dart | 85 ++ ...acity_questionnaire_screen_controller.dart | 93 ++ ...rrent_health_issues_screen_controller.dart | 138 ++ .../document_details_screen_controller.dart | 19 + .../documents_list_screen_controller.dart | 113 ++ .../clients/export_clients_controllers.dart | 20 + ...e_history_and_goals_screen_controller.dart | 22 + .../add_new_pbs_plan_screen_controller.dart | 199 +++ .../crisis_management_screen_controller.dart | 17 + .../export_new_client_module.dart | 12 + .../future_plans_screen_controller.dart | 17 + ...ealth_full_body_map_screen_controller.dart | 36 + .../health_screen_controller.dart | 17 + .../introduction_screen_controller.dart | 17 + .../medication_screen_controller.dart | 21 + .../mental_health_screen_controller.dart | 17 + .../my_current_plan_screen_controller.dart | 17 + .../my_interests_screen_controller.dart | 17 + .../overview_screen_controller.dart | 17 + .../support_plan_screen_controller.dart | 17 + ...want_you_to_help_me_screen_controller.dart | 17 + .../clients/new_note_screen_controller.dart | 34 + .../clients/notes_screen_controller.dart | 32 + .../clients/pbs_plan_screen_controller.dart | 49 + .../photo_gallery_screen_controller.dart | 55 + .../recent_incidents_screen_controller.dart | 70 + .../risk_assessments_screen_controller.dart | 17 + ...ssessments_template_screen_controller.dart | 47 + .../select_note_screen_controller.dart | 32 + .../custom_navigation_drawer_controller.dart | 8 + lib/controllers/export_controllers.dart | 7 + .../home/dashboard_screen_controller.dart | 116 ++ .../home/export_home_controllers.dart | 3 + .../home/inbox_screen_controller.dart | 156 +++ ...elect_user_for_chat_screen_controller.dart | 146 ++ .../export_notifications_controllers.dart | 1 + .../notifications_list_screen_controller.dart | 50 + .../profile/export_profile_controllers.dart | 1 + .../view_profile_screen_controller.dart | 94 ++ .../rota/book_holiday_screen_controller.dart | 136 ++ .../rota/calendar_view_screen_controller.dart | 122 ++ .../rota/export_rota_controller.dart | 5 + .../pick_up_shifts_screen_controller.dart | 61 + .../rota_dashboard_screen_controller.dart | 102 ++ .../rota/your_rota_screen_controller.dart | 46 + lib/dialogs/app_dialogs.dart | 326 +++++ lib/dialogs/widgets/appointment_details.dart | 128 ++ .../widgets/holiday_request_sent_dialog.dart | 75 + lib/dialogs/widgets/holidays_data_dialog.dart | 69 + .../recent_incident_detail_dialog.dart | 88 ++ lib/dialogs/widgets/shift_dialog.dart | 128 ++ lib/firebase_options.dart | 68 + lib/ftc_mobile_app.dart | 6 + lib/main.dart | 60 + .../AppointmentsListResponse.dart | 103 ++ lib/models/chat/ChatModel.dart | 80 ++ lib/models/chat/add_group_message_model.dart | 61 + lib/models/chat/all_group_messages_model.dart | 353 +++++ .../chat/all_single_chat_message_model.dart | 45 + .../all_single_user_chat_server_side.dart | 57 + .../combined_last_messages_model_class.dart | 214 +++ lib/models/chat/single_chat.dart | 53 + .../update_delete_single_message_model.dart | 69 + .../clients/HealthIssuesDetailsModel.dart | 58 + lib/models/clients/PBSPlanModel.dart | 381 ++++++ lib/models/clients/add_pbs_plan_model.dart | 74 + .../AllCareNotesListResponse.dart | 33 + .../clients/allCareNotes/CareNoteData.dart | 42 + .../clients/allCareNotes/CarePlans.dart | 200 +++ .../allClientsList/AllClientsResponse.dart | 734 ++++++++++ lib/models/clients/body_points_category.dart | 116 ++ lib/models/clients/body_points_manager.dart | 50 + .../ABC_form_html_request.dart | 25 + .../HtmlTableOption.dart | 12 + .../consent_capacity_html_request.dart | 313 +++++ ...health_appointments_form_html_request.dart | 23 + ...nutrition_hydration_form_html_request.dart | 35 + .../observations_form_html_request.dart | 48 + ...ysical_intervention_form_html_request.dart | 150 ++ .../safeguarding_form_html_request.dart | 59 + .../showering_and_bath_form_html_request.dart | 20 + .../toileting_form_html_request.dart | 25 + lib/models/clients/care_note_category.dart | 62 + lib/models/clients/client_data_model.dart | 25 + lib/models/clients/consent_details_model.dart | 34 + lib/models/clients/documents_list_model.dart | 338 +++++ .../memoryListResponse/MemoryListData.dart | 52 + .../MemoryListResponse.dart | 30 + .../MemoryListResponseData.dart | 38 + .../clients/recent_incidents_model.dart | 48 + .../GetRiskAssessmentResponse.dart | 35 + .../riskAssessmentResponse/InPlace.dart | 20 + .../PureRiskRating.dart | 24 + .../ResidualRiskRating.dart | 24 + .../RiskAssessmentData.dart | 72 + lib/models/clients/service_users_model.dart | 350 +++++ lib/models/create_care_plan_request.dart | 105 ++ lib/models/export_models.dart | 6 + lib/models/holiday_model.dart | 21 + lib/models/mark_dates_model.dart | 13 + lib/models/messages_list_model.dart | 43 + lib/models/mood_rating_data.dart | 6 + lib/models/profileData/FcmTokens.dart | 23 + lib/models/profileData/LocationData.dart | 22 + lib/models/profileData/ProfileModelData.dart | 792 +++++++++++ lib/models/profileData/user_data.dart | 108 ++ lib/models/profile_screen_model.dart | 670 +++++++++ lib/models/requests/HolidayRequestData.dart | 41 + lib/models/response_model.dart | 39 + lib/models/rota/Days.dart | 62 + lib/models/rota/Diagnosises.dart | 32 + lib/models/rota/LiveRoasterResponseData.dart | 27 + lib/models/rota/LiveRoster.dart | 65 + lib/models/rota/Live_roaster_response.dart | 28 + lib/models/rota/ShiftArray.dart | 113 ++ lib/models/rota/ShiftLocation.dart | 33 + lib/models/rota/ShiftLocationData.dart | 36 + lib/models/rota/StaffHolidays.dart | 27 + lib/models/rota/WeekArrayData.dart | 838 ++++++++++++ lib/models/rota_shift_model.dart | 173 +++ .../staffWorkload/StaffWorkloadResponse.dart | 208 +++ lib/models/training/TrainingResponseData.dart | 168 +++ lib/models/user_model.dart | 224 +++ lib/utilities/app_session_manager.dart | 42 + lib/utilities/assets_manager.dart | 155 +++ lib/utilities/constant_text.dart | 38 + lib/utilities/custom_app_colors.dart | 27 + .../custom_router/custom_route_generator.dart | 555 ++++++++ .../custom_router/custom_route_names.dart | 77 ++ .../custom_router/export_custom_router.dart | 2 + lib/utilities/custom_theme.dart | 38 + lib/utilities/custom_timeago_messages.dart | 33 + lib/utilities/custom_ui_over_lay.dart | 31 + lib/utilities/date_formatter.dart | 108 ++ lib/utilities/enums/api_method.dart | 9 + lib/utilities/enums/body_parts.dart | 54 + lib/utilities/enums/care_note_form_type.dart | 120 ++ lib/utilities/export_utilities.dart | 11 + .../extensions/custom_extensions.dart | 200 +++ .../extensions/export_extensions.dart | 0 lib/utilities/fcm_notifications.dart | 150 ++ lib/utilities/frequent_functions.dart | 221 +++ lib/utilities/image_picker_popup.dart | 216 +++ .../export_local_storage.dart | 2 + .../local_storage_keys.dart | 13 + .../local_storage_manager.dart | 73 + lib/utilities/mixins/export_mixins.dart | 0 lib/utilities/notification_util.dart | 183 +++ .../auth/custom_forget_password_dialog.dart | 165 +++ .../auth/export_auth_widgets.dart | 1 + .../clients/CareNoteOptionCard.dart | 46 + ...category_subcategory_dropdowns_widget.dart | 170 +++ .../clients/custom_icon_tile.dart | 56 + .../clients/show_documents_option_dialog.dart | 161 +++ .../custom_widgets/common_cancel_button.dart | 29 + lib/view/custom_widgets/custom_app_bar.dart | 143 ++ .../custom_app_bar_title_only.dart | 33 + .../custom_app_bar_with_action.dart | 187 +++ .../custom_widgets/custom_app_button.dart | 76 ++ lib/view/custom_widgets/custom_check_box.dart | 51 + lib/view/custom_widgets/custom_error_msg.dart | 26 + .../custom_widgets/custom_image_widgets.dart | 104 ++ .../custom_navigation_drawer.dart | 268 ++++ .../custom_widgets/custom_radio_button.dart | 59 + lib/view/custom_widgets/custom_scaffold.dart | 166 +++ .../custom_text_field_widget.dart | 130 ++ .../custom_widgets/custom_text_widget.dart | 53 + lib/view/custom_widgets/edit_icon.dart | 31 + .../custom_widgets/export_custom_widgets.dart | 16 + .../home/custom_message_dialog.dart | 84 ++ .../home/custom_privacy_policy_dialog.dart | 89 ++ .../home/export_home_widgets.dart | 2 + .../human_body_mapper_widget.dart | 117 ++ .../label_value_box_widget.dart | 57 + lib/view/custom_widgets/loading_widget.dart | 48 + .../multiline_text_field_sheet.dart | 237 ++++ lib/view/custom_widgets/my_circle_image.dart | 35 + lib/view/custom_widgets/my_network_image.dart | 77 ++ .../custom_dialog_notification.dart | 120 ++ .../export_notification_widgets.dart | 2 + .../holiday_request_accept_dialog.dart | 105 ++ .../rota/custom_calendar_widget.dart | 321 +++++ lib/view/custom_widgets/rota/export_rota.dart | 3 + .../custom_widgets/rota/rota_list_item.dart | 130 ++ lib/view/export_view.dart | 2 + .../screens/auth_module/agency_sign_in.dart | 89 ++ .../auth_module/export_auth_module.dart | 4 + lib/view/screens/auth_module/otp_screen.dart | 124 ++ .../screens/auth_module/sign_in_screen.dart | 160 +++ .../screens/auth_module/splash_screen.dart | 41 + .../chat/arguments/chat_screen_args.dart | 20 + .../chat/arguments/group_data_args.dart | 13 + lib/view/screens/chat/chat_screen.dart | 190 +++ .../controller/chat_screen_controller.dart | 503 +++++++ .../widgets/chat_screen_footer_widget.dart | 89 ++ .../screens/chat/widgets/message_bubble.dart | 420 ++++++ .../add_edit_memory_box_screen.dart | 203 +++ ...add_edit_memory_box_screen_controller.dart | 98 ++ .../widget/VideoPlayerWidget.dart | 93 ++ .../add_edit_risk_assessment_screen.dart | 358 +++++ ...dit_risk_assessment_screen_controller.dart | 141 ++ .../add_details_to_new_body_point_screen.dart | 110 ++ .../clients/add_new_document_screen.dart | 183 +++ .../add_new_recent_incident_screen.dart | 237 ++++ .../clients/all_care_notes_screen.dart | 163 +++ .../screens/clients/appointments_screen.dart | 259 ++++ .../careNoteForms/ABC_form_screen.dart | 116 ++ .../consent_capacity_form_screen.dart | 663 +++++++++ .../careNoteForms/export_care_note_forms.dart | 11 + .../free_text_entries_form_screen.dart | 139 ++ .../health_appointments_form_screen.dart | 175 +++ .../injury_health_issue_form_screen.dart | 263 ++++ .../careNoteForms/mood_rating_form.dart | 110 ++ .../nutrition_hydration_form_screen.dart | 153 +++ .../observations_form_screen.dart | 135 ++ .../physical_intervention_form_screen.dart | 329 +++++ .../safeguarding_form_screen.dart | 214 +++ .../showering_bath_form_screen.dart | 142 ++ .../toileting_note_form_screen.dart | 169 +++ .../weight_height_form_screen.dart | 126 ++ .../clients/care_note_detail_screen.dart | 191 +++ .../screens/clients/care_notes_screen.dart | 142 ++ .../care_notes_subcategories_screen.dart | 235 ++++ .../clients/care_plan_menu_screen.dart | 227 ++++ .../clients/client_profile_screen.dart | 321 +++++ .../add_new_pbs_plan_screen.dart | 298 ++++ .../crisis_management_screen.dart | 93 ++ .../export_client_new_view.dart | 12 + .../future_plans_screen.dart | 93 ++ .../health_full_body_map_screen.dart | 566 ++++++++ .../health_screen.dart | 107 ++ .../introduction_screen.dart | 124 ++ .../medication_screen.dart | 152 +++ .../mental_health_screen.dart | 93 ++ .../my_current_plan_screen.dart | 93 ++ .../my_interests_screen.dart | 93 ++ .../overview_screen.dart | 94 ++ .../support_plan_screen.dart | 106 ++ .../things_i_want_you_to_help_me_screen.dart | 93 ++ ...sent_and_capacity_add_new_form_screen.dart | 317 +++++ ...ent_and_capacity_questionnaire_screen.dart | 225 +++ .../current_health_issues_screen.dart | 241 ++++ .../widget/IssueDetailPopupWidget.dart | 260 ++++ .../clients/document_details_screen.dart | 363 +++++ .../documentsList/documents_list_screen.dart | 202 +++ .../clients/export_clients_module.dart | 22 + .../life_history_and_goals_screen.dart | 151 +++ lib/view/screens/clients/new_note_screen.dart | 364 +++++ lib/view/screens/clients/notes_screen.dart | 209 +++ lib/view/screens/clients/pbs_plan_screen.dart | 192 +++ .../screens/clients/photo_gallery_screen.dart | 234 ++++ .../clients/recent_incidents_screen.dart | 185 +++ .../clients/risk_assessments_screen.dart | 258 ++++ .../risk_assessments_template_screen.dart | 383 ++++++ .../screens/clients/select_note_screen.dart | 265 ++++ .../clientsListing/clients_list_screen.dart | 62 + .../widgets/client_card_widget.dart | 42 + .../widgets/clients_list_view.dart | 57 + .../widgets/search_bar_widget.dart | 44 + lib/view/screens/export_screens.dart | 6 + lib/view/screens/home/dashboard_screen.dart | 198 +++ lib/view/screens/home/export_home.dart | 3 + lib/view/screens/home/home_screen.dart | 214 +++ lib/view/screens/home/inbox_screen.dart | 202 +++ .../home/select_user_for_chat_screen.dart | 123 ++ .../screens/home/widgets/home_row_items.dart | 52 + .../screens/home/widgets/line_row_widget.dart | 42 + .../notifications/export_notifications.dart | 1 + .../notifications_list_screen.dart | 239 ++++ lib/view/screens/profile/export_profile.dart | 1 + .../screens/profile/view_profile_screen.dart | 494 +++++++ .../screens/rota/book_holiday_screen.dart | 255 ++++ .../screens/rota/calendar_view_screen.dart | 82 ++ .../screens/rota/export_rota_screens.dart | 5 + .../screens/rota/new_rota_list_widget.dart | 69 + .../screens/rota/pick_up_shifts_screen.dart | 43 + .../screens/rota/rota_dashboard_screen.dart | 206 +++ lib/view/screens/rota/your_rota_screen.dart | 92 ++ .../settings_screen_controller.dart | 21 + .../screens/settings/settings_screen.dart | 73 + .../trainings_screen_controller.dart | 42 + .../training/training_detail_screen.dart | 149 ++ .../screens/training/training_screen.dart | 111 ++ .../controller/webview_screen_controller.dart | 5 + lib/view/screens/webview/webview_screen.dart | 92 ++ lib/web_services/api_services.dart | 40 + lib/web_services/auth_services.dart | 130 ++ lib/web_services/chat_services.dart | 328 +++++ lib/web_services/client_services.dart | 1202 +++++++++++++++++ lib/web_services/export_web_services.dart | 7 + lib/web_services/http_request_client.dart | 774 +++++++++++ lib/web_services/logging_interceptor.dart | 103 ++ lib/web_services/message_services.dart | 14 + lib/web_services/notification_services.dart | 45 + lib/web_services/rota_services.dart | 178 +++ lib/web_services/web_url.dart | 105 ++ pubspec.yaml | 89 ++ 515 files changed, 42796 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/google-services.json create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/ftc/app/ftc_mobile_app/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v21/background.png create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/background.png create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/values-night-v31/styles.xml create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values-v31/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 assets/consent-capacity.html create mode 100644 assets/fonts/Roboto-Black.ttf create mode 100644 assets/fonts/Roboto-BlackItalic.ttf create mode 100644 assets/fonts/Roboto-Bold.ttf create mode 100644 assets/fonts/Roboto-BoldItalic.ttf create mode 100644 assets/fonts/Roboto-Italic.ttf create mode 100644 assets/fonts/Roboto-Light.ttf create mode 100644 assets/fonts/Roboto-LightItalic.ttf create mode 100644 assets/fonts/Roboto-Medium.ttf create mode 100644 assets/fonts/Roboto-MediumItalic.ttf create mode 100644 assets/fonts/Roboto-Regular.ttf create mode 100644 assets/fonts/Roboto-Thin.ttf create mode 100644 assets/fonts/Roboto-ThinItalic.ttf create mode 100644 assets/icon/icon.png create mode 100644 assets/images/png/app-logo-icon.png create mode 100644 assets/images/png/app_icon.png create mode 100644 assets/images/png/human_body_front_back.png create mode 100644 assets/images/png/ratings/ic_angry.webp create mode 100644 assets/images/png/ratings/ic_bored.webp create mode 100644 assets/images/png/ratings/ic_calm.webp create mode 100644 assets/images/png/ratings/ic_confident.webp create mode 100644 assets/images/png/ratings/ic_excited.webp create mode 100644 assets/images/png/ratings/ic_happy.webp create mode 100644 assets/images/png/ratings/ic_hopeful.webp create mode 100644 assets/images/png/ratings/ic_nervous.webp create mode 100644 assets/images/png/ratings/ic_proud.webp create mode 100644 assets/images/png/ratings/ic_relaxed.webp create mode 100644 assets/images/png/ratings/ic_sad.webp create mode 100644 assets/images/png/ratings/ic_scared.webp create mode 100644 assets/images/png/ratings/ic_tired.webp create mode 100644 assets/images/png/ratings/ic_worried.webp create mode 100644 assets/images/svg/arrow-next-icon.svg create mode 100644 assets/images/svg/back_icon.svg create mode 100644 assets/images/svg/bell_icon.svg create mode 100644 assets/images/svg/calendar_appointment_icon.svg create mode 100644 assets/images/svg/careNotesCategories/ic_general.svg create mode 100644 assets/images/svg/careNotesCategories/ic_health.svg create mode 100644 assets/images/svg/careNotesCategories/ic_independent_living.svg create mode 100644 assets/images/svg/careNotesCategories/ic_intractions.svg create mode 100644 assets/images/svg/careNotesCategories/ic_mental_wellbeing.svg create mode 100644 assets/images/svg/careNotesCategories/ic_personal_care.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_abc.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_activity.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_appointment.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_cleaning.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_consent.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_cooking.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_education.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_email.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_finance.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_hydration.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_injury.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_laundry.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_meeting.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_mood.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_mouth_hygiene.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_note.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_other_interactions.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_others.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_physical_intervention.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_public_interaction.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_reviews.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_safeguarding.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_search.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_shower.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_sleep.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_telephone.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_toileting.svg create mode 100644 assets/images/svg/careNotesSubcatgeories/ic_weight_height.svg create mode 100644 assets/images/svg/care_plan_icon.svg create mode 100644 assets/images/svg/clock_icon.svg create mode 100644 assets/images/svg/dustbin_red.svg create mode 100644 assets/images/svg/eclipse.svg create mode 100644 assets/images/svg/flag_icon.svg create mode 100644 assets/images/svg/folder_icon.svg create mode 100644 assets/images/svg/got_to_arrow_button.svg create mode 100644 assets/images/svg/human_body_front_back.svg create mode 100644 assets/images/svg/ic_add.svg create mode 100644 assets/images/svg/ic_at.svg create mode 100644 assets/images/svg/lock-icon.svg create mode 100644 assets/images/svg/man_body_image.svg create mode 100644 assets/images/svg/man_image.svg create mode 100644 assets/images/svg/man_image_png.png create mode 100644 assets/images/svg/menu_drawer_icon.svg create mode 100644 assets/images/svg/menudrawerIcon.svg create mode 100644 assets/images/svg/microphone_mike.svg create mode 100644 assets/images/svg/nav_bar_calendar_icon.svg create mode 100644 assets/images/svg/nav_bar_home_icon.svg create mode 100644 assets/images/svg/nav_bar_message_icon.svg create mode 100644 assets/images/svg/nav_bar_people_icon.svg create mode 100644 assets/images/svg/nav_bar_person_main_icon.svg create mode 100644 assets/images/svg/notes_icon.svg create mode 100644 assets/images/svg/pencil-icon.svg create mode 100644 assets/images/svg/pencil_outline_icon.svg create mode 100644 assets/images/svg/people_unselected.svg create mode 100644 assets/images/svg/photo_gallery_icon.svg create mode 100644 assets/images/svg/plus_icon.svg create mode 100644 assets/images/svg/policies_icon.svg create mode 100644 assets/images/svg/selected_calendar.svg create mode 100644 assets/images/svg/setting_icon.svg create mode 100644 assets/images/svg/triangle.svg create mode 100644 assets/images/svg/upload_icon.svg create mode 100644 assets/images/svg/upward_triangle_white.svg create mode 100644 flutter_launcher_icons.yaml create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Podfile create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/GoogleService-Info.plist create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/Runner/Runner.entitlements create mode 100644 ios/RunnerTests/RunnerTests.swift create mode 100644 ios/firebase_app_id_file.json create mode 100644 lib/controllers/auth_module/agency_sign_in_controller.dart create mode 100644 lib/controllers/auth_module/export_auth_module.dart create mode 100644 lib/controllers/auth_module/otp_screen_controller.dart create mode 100644 lib/controllers/auth_module/sing_in_screen_controller.dart create mode 100644 lib/controllers/auth_module/splash_screen_controller.dart create mode 100644 lib/controllers/clients/add_details_to_new_body_point_screen_controller.dart create mode 100644 lib/controllers/clients/add_new_document_screen_controller.dart create mode 100644 lib/controllers/clients/add_new_recent_incident_screen_controller.dart create mode 100644 lib/controllers/clients/all_care_notes_screen_contorller.dart create mode 100644 lib/controllers/clients/appointment_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/ABC_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/category_subcategory_widget_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/consent_capacity_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/free_text_entries_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/health_appointments_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/injury_health_issue_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/mood_rating_form_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/nutrition_hydration_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/observations_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/physical_intervention_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/safeguarding_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/showering_bath_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/toileting_note_form_screen_controller.dart create mode 100644 lib/controllers/clients/careNoteFormControllers/weight_height_form_screen_controller.dart create mode 100644 lib/controllers/clients/care_note_detail_screen_controller.dart create mode 100644 lib/controllers/clients/care_notes_screen_controller.dart create mode 100644 lib/controllers/clients/care_notes_subcategories_screen_controller.dart create mode 100644 lib/controllers/clients/care_plan_menu_screen_controller.dart create mode 100644 lib/controllers/clients/client_profile_screen_controller.dart create mode 100644 lib/controllers/clients/clients_list_screen_controller.dart create mode 100644 lib/controllers/clients/consent_and_capacity_add_new_form_screen_controller.dart create mode 100644 lib/controllers/clients/consent_and_capacity_questionnaire_screen_controller.dart create mode 100644 lib/controllers/clients/current_health_issues_screen_controller.dart create mode 100644 lib/controllers/clients/document_details_screen_controller.dart create mode 100644 lib/controllers/clients/documents_list_screen_controller.dart create mode 100644 lib/controllers/clients/export_clients_controllers.dart create mode 100644 lib/controllers/clients/life_history_and_goals_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/add_new_pbs_plan_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/crisis_management_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/export_new_client_module.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/future_plans_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/health_full_body_map_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/health_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/introduction_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/medication_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/mental_health_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/my_current_plan_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/my_interests_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/overview_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/support_plan_screen_controller.dart create mode 100644 lib/controllers/clients/new_client_module_controllers/things_i_want_you_to_help_me_screen_controller.dart create mode 100644 lib/controllers/clients/new_note_screen_controller.dart create mode 100644 lib/controllers/clients/notes_screen_controller.dart create mode 100644 lib/controllers/clients/pbs_plan_screen_controller.dart create mode 100644 lib/controllers/clients/photo_gallery_screen_controller.dart create mode 100644 lib/controllers/clients/recent_incidents_screen_controller.dart create mode 100644 lib/controllers/clients/risk_assessments_screen_controller.dart create mode 100644 lib/controllers/clients/risk_assessments_template_screen_controller.dart create mode 100644 lib/controllers/clients/select_note_screen_controller.dart create mode 100644 lib/controllers/custom_navigation_drawer_controller.dart create mode 100644 lib/controllers/export_controllers.dart create mode 100644 lib/controllers/home/dashboard_screen_controller.dart create mode 100644 lib/controllers/home/export_home_controllers.dart create mode 100644 lib/controllers/home/inbox_screen_controller.dart create mode 100644 lib/controllers/home/select_user_for_chat_screen_controller.dart create mode 100644 lib/controllers/notifications/export_notifications_controllers.dart create mode 100644 lib/controllers/notifications/notifications_list_screen_controller.dart create mode 100644 lib/controllers/profile/export_profile_controllers.dart create mode 100644 lib/controllers/profile/view_profile_screen_controller.dart create mode 100644 lib/controllers/rota/book_holiday_screen_controller.dart create mode 100644 lib/controllers/rota/calendar_view_screen_controller.dart create mode 100644 lib/controllers/rota/export_rota_controller.dart create mode 100644 lib/controllers/rota/pick_up_shifts_screen_controller.dart create mode 100644 lib/controllers/rota/rota_dashboard_screen_controller.dart create mode 100644 lib/controllers/rota/your_rota_screen_controller.dart create mode 100644 lib/dialogs/app_dialogs.dart create mode 100644 lib/dialogs/widgets/appointment_details.dart create mode 100644 lib/dialogs/widgets/holiday_request_sent_dialog.dart create mode 100644 lib/dialogs/widgets/holidays_data_dialog.dart create mode 100644 lib/dialogs/widgets/recent_incident_detail_dialog.dart create mode 100644 lib/dialogs/widgets/shift_dialog.dart create mode 100644 lib/firebase_options.dart create mode 100644 lib/ftc_mobile_app.dart create mode 100644 lib/main.dart create mode 100644 lib/models/appointmentsListResponse/AppointmentsListResponse.dart create mode 100644 lib/models/chat/ChatModel.dart create mode 100644 lib/models/chat/add_group_message_model.dart create mode 100644 lib/models/chat/all_group_messages_model.dart create mode 100644 lib/models/chat/all_single_chat_message_model.dart create mode 100644 lib/models/chat/all_single_user_chat_server_side.dart create mode 100644 lib/models/chat/combined_last_messages_model_class.dart create mode 100644 lib/models/chat/single_chat.dart create mode 100644 lib/models/chat/update_delete_single_message_model.dart create mode 100644 lib/models/clients/HealthIssuesDetailsModel.dart create mode 100644 lib/models/clients/PBSPlanModel.dart create mode 100644 lib/models/clients/add_pbs_plan_model.dart create mode 100644 lib/models/clients/allCareNotes/AllCareNotesListResponse.dart create mode 100644 lib/models/clients/allCareNotes/CareNoteData.dart create mode 100644 lib/models/clients/allCareNotes/CarePlans.dart create mode 100644 lib/models/clients/allClientsList/AllClientsResponse.dart create mode 100644 lib/models/clients/body_points_category.dart create mode 100644 lib/models/clients/body_points_manager.dart create mode 100644 lib/models/clients/careNoteFormsRequests/ABC_form_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/HtmlTableOption.dart create mode 100644 lib/models/clients/careNoteFormsRequests/consent_capacity_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/health_appointments_form_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/nutrition_hydration_form_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/observations_form_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/physical_intervention_form_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/safeguarding_form_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/showering_and_bath_form_html_request.dart create mode 100644 lib/models/clients/careNoteFormsRequests/toileting_form_html_request.dart create mode 100644 lib/models/clients/care_note_category.dart create mode 100644 lib/models/clients/client_data_model.dart create mode 100644 lib/models/clients/consent_details_model.dart create mode 100644 lib/models/clients/documents_list_model.dart create mode 100644 lib/models/clients/memoryListResponse/MemoryListData.dart create mode 100644 lib/models/clients/memoryListResponse/MemoryListResponse.dart create mode 100644 lib/models/clients/memoryListResponse/MemoryListResponseData.dart create mode 100644 lib/models/clients/recent_incidents_model.dart create mode 100644 lib/models/clients/riskAssessmentResponse/GetRiskAssessmentResponse.dart create mode 100644 lib/models/clients/riskAssessmentResponse/InPlace.dart create mode 100644 lib/models/clients/riskAssessmentResponse/PureRiskRating.dart create mode 100644 lib/models/clients/riskAssessmentResponse/ResidualRiskRating.dart create mode 100644 lib/models/clients/riskAssessmentResponse/RiskAssessmentData.dart create mode 100644 lib/models/clients/service_users_model.dart create mode 100644 lib/models/create_care_plan_request.dart create mode 100644 lib/models/export_models.dart create mode 100644 lib/models/holiday_model.dart create mode 100644 lib/models/mark_dates_model.dart create mode 100644 lib/models/messages_list_model.dart create mode 100644 lib/models/mood_rating_data.dart create mode 100644 lib/models/profileData/FcmTokens.dart create mode 100644 lib/models/profileData/LocationData.dart create mode 100644 lib/models/profileData/ProfileModelData.dart create mode 100644 lib/models/profileData/user_data.dart create mode 100644 lib/models/profile_screen_model.dart create mode 100644 lib/models/requests/HolidayRequestData.dart create mode 100644 lib/models/response_model.dart create mode 100644 lib/models/rota/Days.dart create mode 100644 lib/models/rota/Diagnosises.dart create mode 100644 lib/models/rota/LiveRoasterResponseData.dart create mode 100644 lib/models/rota/LiveRoster.dart create mode 100644 lib/models/rota/Live_roaster_response.dart create mode 100644 lib/models/rota/ShiftArray.dart create mode 100644 lib/models/rota/ShiftLocation.dart create mode 100644 lib/models/rota/ShiftLocationData.dart create mode 100644 lib/models/rota/StaffHolidays.dart create mode 100644 lib/models/rota/WeekArrayData.dart create mode 100644 lib/models/rota_shift_model.dart create mode 100644 lib/models/staffWorkload/StaffWorkloadResponse.dart create mode 100644 lib/models/training/TrainingResponseData.dart create mode 100644 lib/models/user_model.dart create mode 100644 lib/utilities/app_session_manager.dart create mode 100644 lib/utilities/assets_manager.dart create mode 100644 lib/utilities/constant_text.dart create mode 100644 lib/utilities/custom_app_colors.dart create mode 100644 lib/utilities/custom_router/custom_route_generator.dart create mode 100644 lib/utilities/custom_router/custom_route_names.dart create mode 100644 lib/utilities/custom_router/export_custom_router.dart create mode 100644 lib/utilities/custom_theme.dart create mode 100644 lib/utilities/custom_timeago_messages.dart create mode 100644 lib/utilities/custom_ui_over_lay.dart create mode 100644 lib/utilities/date_formatter.dart create mode 100644 lib/utilities/enums/api_method.dart create mode 100644 lib/utilities/enums/body_parts.dart create mode 100644 lib/utilities/enums/care_note_form_type.dart create mode 100644 lib/utilities/export_utilities.dart create mode 100644 lib/utilities/extensions/custom_extensions.dart create mode 100644 lib/utilities/extensions/export_extensions.dart create mode 100644 lib/utilities/fcm_notifications.dart create mode 100644 lib/utilities/frequent_functions.dart create mode 100644 lib/utilities/image_picker_popup.dart create mode 100644 lib/utilities/local_storage_manager/export_local_storage.dart create mode 100644 lib/utilities/local_storage_manager/local_storage_keys.dart create mode 100644 lib/utilities/local_storage_manager/local_storage_manager.dart create mode 100644 lib/utilities/mixins/export_mixins.dart create mode 100644 lib/utilities/notification_util.dart create mode 100644 lib/view/custom_widgets/auth/custom_forget_password_dialog.dart create mode 100644 lib/view/custom_widgets/auth/export_auth_widgets.dart create mode 100644 lib/view/custom_widgets/clients/CareNoteOptionCard.dart create mode 100644 lib/view/custom_widgets/clients/category_subcategory_dropdowns_widget.dart create mode 100644 lib/view/custom_widgets/clients/custom_icon_tile.dart create mode 100644 lib/view/custom_widgets/clients/show_documents_option_dialog.dart create mode 100644 lib/view/custom_widgets/common_cancel_button.dart create mode 100644 lib/view/custom_widgets/custom_app_bar.dart create mode 100644 lib/view/custom_widgets/custom_app_bar_title_only.dart create mode 100644 lib/view/custom_widgets/custom_app_bar_with_action.dart create mode 100644 lib/view/custom_widgets/custom_app_button.dart create mode 100644 lib/view/custom_widgets/custom_check_box.dart create mode 100644 lib/view/custom_widgets/custom_error_msg.dart create mode 100644 lib/view/custom_widgets/custom_image_widgets.dart create mode 100644 lib/view/custom_widgets/custom_navigation_drawer.dart create mode 100644 lib/view/custom_widgets/custom_radio_button.dart create mode 100644 lib/view/custom_widgets/custom_scaffold.dart create mode 100644 lib/view/custom_widgets/custom_text_field_widget.dart create mode 100644 lib/view/custom_widgets/custom_text_widget.dart create mode 100644 lib/view/custom_widgets/edit_icon.dart create mode 100644 lib/view/custom_widgets/export_custom_widgets.dart create mode 100644 lib/view/custom_widgets/home/custom_message_dialog.dart create mode 100644 lib/view/custom_widgets/home/custom_privacy_policy_dialog.dart create mode 100644 lib/view/custom_widgets/home/export_home_widgets.dart create mode 100644 lib/view/custom_widgets/human_body_mapper_widget.dart create mode 100644 lib/view/custom_widgets/label_value_box_widget.dart create mode 100644 lib/view/custom_widgets/loading_widget.dart create mode 100644 lib/view/custom_widgets/multiline_text_field_sheet.dart create mode 100644 lib/view/custom_widgets/my_circle_image.dart create mode 100644 lib/view/custom_widgets/my_network_image.dart create mode 100644 lib/view/custom_widgets/notifications/custom_dialog_notification.dart create mode 100644 lib/view/custom_widgets/notifications/export_notification_widgets.dart create mode 100644 lib/view/custom_widgets/notifications/holiday_request_accept_dialog.dart create mode 100644 lib/view/custom_widgets/rota/custom_calendar_widget.dart create mode 100644 lib/view/custom_widgets/rota/export_rota.dart create mode 100644 lib/view/custom_widgets/rota/rota_list_item.dart create mode 100644 lib/view/export_view.dart create mode 100644 lib/view/screens/auth_module/agency_sign_in.dart create mode 100644 lib/view/screens/auth_module/export_auth_module.dart create mode 100644 lib/view/screens/auth_module/otp_screen.dart create mode 100644 lib/view/screens/auth_module/sign_in_screen.dart create mode 100644 lib/view/screens/auth_module/splash_screen.dart create mode 100644 lib/view/screens/chat/arguments/chat_screen_args.dart create mode 100644 lib/view/screens/chat/arguments/group_data_args.dart create mode 100644 lib/view/screens/chat/chat_screen.dart create mode 100644 lib/view/screens/chat/controller/chat_screen_controller.dart create mode 100644 lib/view/screens/chat/widgets/chat_screen_footer_widget.dart create mode 100644 lib/view/screens/chat/widgets/message_bubble.dart create mode 100644 lib/view/screens/clients/addEditMemoryBox/add_edit_memory_box_screen.dart create mode 100644 lib/view/screens/clients/addEditMemoryBox/controller/add_edit_memory_box_screen_controller.dart create mode 100644 lib/view/screens/clients/addEditMemoryBox/widget/VideoPlayerWidget.dart create mode 100644 lib/view/screens/clients/addEditRiskAssessment/add_edit_risk_assessment_screen.dart create mode 100644 lib/view/screens/clients/addEditRiskAssessment/controller/add_edit_risk_assessment_screen_controller.dart create mode 100644 lib/view/screens/clients/add_details_to_new_body_point_screen.dart create mode 100644 lib/view/screens/clients/add_new_document_screen.dart create mode 100644 lib/view/screens/clients/add_new_recent_incident_screen.dart create mode 100644 lib/view/screens/clients/all_care_notes_screen.dart create mode 100644 lib/view/screens/clients/appointments_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/ABC_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/consent_capacity_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/export_care_note_forms.dart create mode 100644 lib/view/screens/clients/careNoteForms/free_text_entries_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/health_appointments_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/injury_health_issue_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/mood_rating_form.dart create mode 100644 lib/view/screens/clients/careNoteForms/nutrition_hydration_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/observations_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/physical_intervention_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/safeguarding_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/showering_bath_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/toileting_note_form_screen.dart create mode 100644 lib/view/screens/clients/careNoteForms/weight_height_form_screen.dart create mode 100644 lib/view/screens/clients/care_note_detail_screen.dart create mode 100644 lib/view/screens/clients/care_notes_screen.dart create mode 100644 lib/view/screens/clients/care_notes_subcategories_screen.dart create mode 100644 lib/view/screens/clients/care_plan_menu_screen.dart create mode 100644 lib/view/screens/clients/client_profile_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/add_new_pbs_plan_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/crisis_management_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/export_client_new_view.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/future_plans_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/health_full_body_map_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/health_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/introduction_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/medication_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/mental_health_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/my_current_plan_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/my_interests_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/overview_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/support_plan_screen.dart create mode 100644 lib/view/screens/clients/clients_new_view_module/things_i_want_you_to_help_me_screen.dart create mode 100644 lib/view/screens/clients/consent_and_capacity_add_new_form_screen.dart create mode 100644 lib/view/screens/clients/consent_and_capacity_questionnaire_screen.dart create mode 100644 lib/view/screens/clients/currentHealthIssues/current_health_issues_screen.dart create mode 100644 lib/view/screens/clients/currentHealthIssues/widget/IssueDetailPopupWidget.dart create mode 100644 lib/view/screens/clients/document_details_screen.dart create mode 100644 lib/view/screens/clients/documentsList/documents_list_screen.dart create mode 100644 lib/view/screens/clients/export_clients_module.dart create mode 100644 lib/view/screens/clients/life_history_and_goals_screen.dart create mode 100644 lib/view/screens/clients/new_note_screen.dart create mode 100644 lib/view/screens/clients/notes_screen.dart create mode 100644 lib/view/screens/clients/pbs_plan_screen.dart create mode 100644 lib/view/screens/clients/photo_gallery_screen.dart create mode 100644 lib/view/screens/clients/recent_incidents_screen.dart create mode 100644 lib/view/screens/clients/risk_assessments_screen.dart create mode 100644 lib/view/screens/clients/risk_assessments_template_screen.dart create mode 100644 lib/view/screens/clients/select_note_screen.dart create mode 100644 lib/view/screens/clientsListing/clients_list_screen.dart create mode 100644 lib/view/screens/clientsListing/widgets/client_card_widget.dart create mode 100644 lib/view/screens/clientsListing/widgets/clients_list_view.dart create mode 100644 lib/view/screens/clientsListing/widgets/search_bar_widget.dart create mode 100644 lib/view/screens/export_screens.dart create mode 100644 lib/view/screens/home/dashboard_screen.dart create mode 100644 lib/view/screens/home/export_home.dart create mode 100644 lib/view/screens/home/home_screen.dart create mode 100644 lib/view/screens/home/inbox_screen.dart create mode 100644 lib/view/screens/home/select_user_for_chat_screen.dart create mode 100644 lib/view/screens/home/widgets/home_row_items.dart create mode 100644 lib/view/screens/home/widgets/line_row_widget.dart create mode 100644 lib/view/screens/notifications/export_notifications.dart create mode 100644 lib/view/screens/notifications/notifications_list_screen.dart create mode 100644 lib/view/screens/profile/export_profile.dart create mode 100644 lib/view/screens/profile/view_profile_screen.dart create mode 100644 lib/view/screens/rota/book_holiday_screen.dart create mode 100644 lib/view/screens/rota/calendar_view_screen.dart create mode 100644 lib/view/screens/rota/export_rota_screens.dart create mode 100644 lib/view/screens/rota/new_rota_list_widget.dart create mode 100644 lib/view/screens/rota/pick_up_shifts_screen.dart create mode 100644 lib/view/screens/rota/rota_dashboard_screen.dart create mode 100644 lib/view/screens/rota/your_rota_screen.dart create mode 100644 lib/view/screens/settings/controller/settings_screen_controller.dart create mode 100644 lib/view/screens/settings/settings_screen.dart create mode 100644 lib/view/screens/training/controller/trainings_screen_controller.dart create mode 100644 lib/view/screens/training/training_detail_screen.dart create mode 100644 lib/view/screens/training/training_screen.dart create mode 100644 lib/view/screens/webview/controller/webview_screen_controller.dart create mode 100644 lib/view/screens/webview/webview_screen.dart create mode 100644 lib/web_services/api_services.dart create mode 100644 lib/web_services/auth_services.dart create mode 100644 lib/web_services/chat_services.dart create mode 100644 lib/web_services/client_services.dart create mode 100644 lib/web_services/export_web_services.dart create mode 100644 lib/web_services/http_request_client.dart create mode 100644 lib/web_services/logging_interceptor.dart create mode 100644 lib/web_services/message_services.dart create mode 100644 lib/web_services/notification_services.dart create mode 100644 lib/web_services/rota_services.dart create mode 100644 lib/web_services/web_url.dart create mode 100644 pubspec.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07baad1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +pubspec.lock \ No newline at end of file diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..09a39aa --- /dev/null +++ b/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "ead455963c12b453cdb2358cad34969c76daf180" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: ead455963c12b453cdb2358cad34969c76daf180 + base_revision: ead455963c12b453cdb2358cad34969c76daf180 + - platform: android + create_revision: ead455963c12b453cdb2358cad34969c76daf180 + base_revision: ead455963c12b453cdb2358cad34969c76daf180 + - platform: ios + create_revision: ead455963c12b453cdb2358cad34969c76daf180 + base_revision: ead455963c12b453cdb2358cad34969c76daf180 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..c898bfa --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# ftc_mobile_app +A Mobile App for Android and IOS +## Documentation +1- [FIGMA-VIEW-ONLY](https://www.figma.com/file/62LScCEOiGqin91Esm6ht7/FCT-V04?type=design&node-id=179-4255&mode=design&t=jPwwPCxekItUc7KH-0) + +## Tech Stack + +**Mobile:** Flutter + +## Flutter Version +- Flutter Version 3.13 + +**Available Shifts:** Available Shifts or open shifts are shifts having unassigned staff member or patient. + + +NSAppTransportSecurity + +NSAllowsArbitraryLoads + + + +Remove these lines from info.plist. These are added to view http:// links. Remove them for security \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..64a3dd4 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,67 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.ftc.app.ftc_mobile_app" + compileSdkVersion flutter.compileSdkVersion + ndkVersion "25.1.8937393" + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.ftc.app.ftc_mobile_app" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion 21 + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies {} diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..33a8bfb --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "583559514958", + "project_id": "ftc-services-ea8d6", + "storage_bucket": "ftc-services-ea8d6.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:583559514958:android:89af243ca4a3888a32ec1f", + "android_client_info": { + "package_name": "com.ftc.app.ftc_mobile_app" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyDF2vZbiWQROGvyvLeeCmAjPLnPLYjE6Os" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..740033b --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/ftc/app/ftc_mobile_app/MainActivity.kt b/android/app/src/main/kotlin/com/ftc/app/ftc_mobile_app/MainActivity.kt new file mode 100644 index 0000000..e341968 --- /dev/null +++ b/android/app/src/main/kotlin/com/ftc/app/ftc_mobile_app/MainActivity.kt @@ -0,0 +1,6 @@ +package com.ftc.app.ftc_mobile_app + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png new file mode 100644 index 0000000000000000000000000000000000000000..62420b9a2e37258b7231b7285c268d132f0ca72f GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*|tf$wXX8JPMRmqtuf Rk_L)1c)I$ztaD0e0sx{G4m$t< literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f88598c --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png new file mode 100644 index 0000000000000000000000000000000000000000..62420b9a2e37258b7231b7285c268d132f0ca72f GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*|tf$wXX8JPMRmqtuf Rk_L)1c)I$ztaD0e0sx{G4m$t< literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..f88598c --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc4b4a67e7715903091badc8b9a361c2a547c78 GIT binary patch literal 1658 zcmbuA`9Bj30LCYakmM|PIZ7g7$+m`Rjx832jc7E*vb-jd=3ZlS?B(MqM{?96ibTRR z({j&Qj@)HdZ^cNa8ol*5^!a?B=lS({etPI`XeW7D4OsvHAdhrLocW#3f3!pDw|jnh z>I48t!I22K$90J>`5{CVPnFJJ(3Yn)p}IM5Re}@MfN&XExWOu@#GIp{%of5=mbuHA zb4pey+}-Bx@8rt%D&sHcah+oJ9fH%!>=wLBZH($wQHf{X9x;u;J%vJBimyg}^h#=) zxZNk5-^xbnT0+T7|17}-@k`g4FO>W3Kicw1kc4x7vYCj#gdrI|#4%fBh5Dl(G33Tf zir57tNOb^Ms)Fh9^6)9toc>YQ2WPQ1yfj8FRsEPmOk{hTWHxJ%Hk0-BzzbM@gt3bN z03-dYtE-j%zAu5w%vH4}9m;52?=+9D*ThvDbtbo($IKRRH5I6}Ri<>r+k9(nNtM;+ zLF?%hb`2Jk=6n0tD8=C$L~W#xe!mWDZ(GB)d|uT-QEIlzid>X$(og8fB}6=bl6}eX zVjJ}_Tn@KM@b_tub|N6(3^!%B5|Wtsb7_eW7J;=S+!WpIjs%F5qsf~-@S<0c=OBOn z^O7^CN3duP6l%dI$sH=)3Sm+r^(I9710N~e~U5~hy) z#Iuf^lYkvRzAt>>@w&lfdyVrxSiLQrE8DDPI?Y9AILBB)Z8YSzt^1yM-DNc1o|+uA zDD`CXULt0Cx)r^rCP+|Q%a;=jOdZvZSI%vF6>M7d3 zBZuA@v?1fB64`BK$3pFtqZwEVXM~TS=`vp!Eix zMg{>T>4mq1;0B%Q;yqj|3r1+qSud+71?WX+Nok;(d~T>qD=*`8{HeKyi~FkysrzD2 zMsd96ynDd7toK1F}rSJYpfOk$JSYd@Yz8YK^*5AMn)nW%;P&Hf@DHtZ# z@YnI1!@Fn1hK}?Tv}bWk1138USR6HN(d++R*IapgHorX$H22N+Rc$0ZGX{+^SPQeyhZSjV_Do0&ov-b+xxqnbCyF<)+cb4|1xUt@{+VM#u&OP1IF$W51;*C5@Et8Q zE7*&32fVgxB9KGEH!M9DZdt+3q&8M!LgXf)RO0beT^+PPZxcS$%|^=~vP>=X209|z z7YDmU=T!sMX78&%`#xsvbK~SR8yd>CgvFdeI^-f5wWI2cdpTI@Sv&$tp*RQ|9& zq7Fk$UkRLe<7G7e;OEHofVkZnP4-sFG9#5n+Q2m)4oRAFVUZ%MDuV3}U-~hm+2Drz zsOT4YGaW}0y9yGh&@ORogaJH*$$&gWQ5G^SCrm(fw5iP12I-2|1BE4N=+>0H32$S* zX!K)+@erbyl*{VJNBwwpO#!{4h@fn(m)hpRkNJ&6Kn`6ReJ7=j$*9KGh&LhIm6;(f z1&mP0a(UKD$0RVd+_b2}<8lI(GRCOxzIK8Kn4ruu9X%wyAb?lKoz~>X@f;L5 zrp@B+a+okUFW432lj^QvJ()ybOV}H(&e;{+z*4`K_7IC4_5Vbo*esuvo^Cubr*v1Q zGxgNEgXD!z@mbA8bRA_47=56&_sW-3@52qo%!FP9OV2x_GoavYiU8W&dVS~7?6=7n z5klrBI?NT-rtaS3Eha{XP(&#k*hXj)DNrf?v-5uEHgM&^V4;-uRAgAAZJv)(96-!F z@$>n%@OA;q3-fsXYaWmzy(=o;`VA(=&_u%xvz6Odx#fGYNvoT;*Q+rf8sw(sxHil4 zJgqa6*zel`8~5yDjitBO3uYO-eK1 g+nx3PnzDF6`b)3eyDb98-=6|NI-n7c?fsMf2LZ(Wx&QzG literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc4b4a67e7715903091badc8b9a361c2a547c78 GIT binary patch literal 1658 zcmbuA`9Bj30LCYakmM|PIZ7g7$+m`Rjx832jc7E*vb-jd=3ZlS?B(MqM{?96ibTRR z({j&Qj@)HdZ^cNa8ol*5^!a?B=lS({etPI`XeW7D4OsvHAdhrLocW#3f3!pDw|jnh z>I48t!I22K$90J>`5{CVPnFJJ(3Yn)p}IM5Re}@MfN&XExWOu@#GIp{%of5=mbuHA zb4pey+}-Bx@8rt%D&sHcah+oJ9fH%!>=wLBZH($wQHf{X9x;u;J%vJBimyg}^h#=) zxZNk5-^xbnT0+T7|17}-@k`g4FO>W3Kicw1kc4x7vYCj#gdrI|#4%fBh5Dl(G33Tf zir57tNOb^Ms)Fh9^6)9toc>YQ2WPQ1yfj8FRsEPmOk{hTWHxJ%Hk0-BzzbM@gt3bN z03-dYtE-j%zAu5w%vH4}9m;52?=+9D*ThvDbtbo($IKRRH5I6}Ri<>r+k9(nNtM;+ zLF?%hb`2Jk=6n0tD8=C$L~W#xe!mWDZ(GB)d|uT-QEIlzid>X$(og8fB}6=bl6}eX zVjJ}_Tn@KM@b_tub|N6(3^!%B5|Wtsb7_eW7J;=S+!WpIjs%F5qsf~-@S<0c=OBOn z^O7^CN3duP6l%dI$sH=)3Sm+r^(I9710N~e~U5~hy) z#Iuf^lYkvRzAt>>@w&lfdyVrxSiLQrE8DDPI?Y9AILBB)Z8YSzt^1yM-DNc1o|+uA zDD`CXULt0Cx)r^rCP+|Q%a;=jOdZvZSI%vF6>M7d3 zBZuA@v?1fB64`BK$3pFtqZwEVXM~TS=`vp!Eix zMg{>T>4mq1;0B%Q;yqj|3r1+qSud+71?WX+Nok;(d~T>qD=*`8{HeKyi~FkysrzD2 zMsd96ynDd7toK1F}rSJYpfOk$JSYd@Yz8YK^*5AMn)nW%;P&Hf@DHtZ# z@YnI1!@Fn1hK}?Tv}bWk1138USR6HN(d++R*IapgHorX$H22N+Rc$0ZGX{+^SPQeyhZSjV_Do0&ov-b+xxqnbCyF<)+cb4|1xUt@{+VM#u&OP1IF$W51;*C5@Et8Q zE7*&32fVgxB9KGEH!M9DZdt+3q&8M!LgXf)RO0beT^+PPZxcS$%|^=~vP>=X209|z z7YDmU=T!sMX78&%`#xsvbK~SR8yd>CgvFdeI^-f5wWI2cdpTI@Sv&$tp*RQ|9& zq7Fk$UkRLe<7G7e;OEHofVkZnP4-sFG9#5n+Q2m)4oRAFVUZ%MDuV3}U-~hm+2Drz zsOT4YGaW}0y9yGh&@ORogaJH*$$&gWQ5G^SCrm(fw5iP12I-2|1BE4N=+>0H32$S* zX!K)+@erbyl*{VJNBwwpO#!{4h@fn(m)hpRkNJ&6Kn`6ReJ7=j$*9KGh&LhIm6;(f z1&mP0a(UKD$0RVd+_b2}<8lI(GRCOxzIK8Kn4ruu9X%wyAb?lKoz~>X@f;L5 zrp@B+a+okUFW432lj^QvJ()ybOV}H(&e;{+z*4`K_7IC4_5Vbo*esuvo^Cubr*v1Q zGxgNEgXD!z@mbA8bRA_47=56&_sW-3@52qo%!FP9OV2x_GoavYiU8W&dVS~7?6=7n z5klrBI?NT-rtaS3Eha{XP(&#k*hXj)DNrf?v-5uEHgM&^V4;-uRAgAAZJv)(96-!F z@$>n%@OA;q3-fsXYaWmzy(=o;`VA(=&_u%xvz6Odx#fGYNvoT;*Q+rf8sw(sxHil4 zJgqa6*zel`8~5yDjitBO3uYO-eK1 g+nx3PnzDF6`b)3eyDb98-=6|NI-n7c?fsMf2LZ(Wx&QzG literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed3a53f5720ec61eda29e44d1bd77f25c07e529 GIT binary patch literal 873 zcmV-v1D5=WP)dBi&JqscTiXdJ*2t9dI zFFue$YN;r#lv2fNAE~vE)TT}I*z9inWs$HCM!c zEM4{h)+!%BwtN8D@&RPa2aqivK(>4U+42EoOE^F%0PKwgFfirdRI`aM^Dc&_9c&D# z7@l=ScPAd8v(-X;%tqJgD6T$R!m%9&+8YdND6 z+r*X%jsJE$Adzy{H$X$BhNmC%c=_3eM=z>(-eh2?!1?_a9=y%sa+@WxJ1$`WRY8in z1{|ylpu9|hNl$hu>IFKtvsy>TE)%hchB9i`X{yq;m{)Nj0Bqpbj)c%VQNZ1v3~xKT z&%%|%L4N#d#72D7#tWL6i)}%ebp6fljEJtq0BB^B5z02ffP%`Pib?YN?f9<)WHV&y zv=-bVas?5+mL$wV%q|gA#f1YF7V{o%yv|_7By16%qZzRXFy|DJ&WrmeM+ksJ>7Dt0 zY{5fQwT7+%8=Wm>c+{Wc=P%LXjgJ=i_rrHtv{IcAB_RL>ivE*foAP}C*PkzAI_>de zCT5+fMUStK>9mV8R44BBit#^_FbjS7?(jNrvdQErlUa(1t&1hHluqlUv&F*wzATcN zb!MRz_0#r&MZP+uAV|JvKny_F6l@Nw__pL?ChdvrQv6n8XvW2fMw2p;hav?!neh;% zEyU4n2HsDKt-?&J0vxI@dAZzTRw#mki9y<&vEr1WVq{ZVtcz+GUvLr7N(HKi_C2wv ziaoWZYuG-B-OtkK@$Cja%{e?HMJa0$CMqly<3C)~&@APNQKvfL(L{~WGZU%5&)BK} zv4~35Q{mt9*&=3_J?>!^UDj3`*0{f`DF3tlPnZTZPf<_hibyWI{2GOzTPX7+>E3$U z8?jW%KJ8lr{8?d|p;{U|v)3lFUpWCS<~-h>NZD%xcs!W@V>^rTzo`4`@7MQDtld)n z3yo~~0J7x+$d(TvTRwnn`2e!z1IU&SAX`5H*&rAh2g)$100000NkvXXu0mjfhBuhd literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed3a53f5720ec61eda29e44d1bd77f25c07e529 GIT binary patch literal 873 zcmV-v1D5=WP)dBi&JqscTiXdJ*2t9dI zFFue$YN;r#lv2fNAE~vE)TT}I*z9inWs$HCM!c zEM4{h)+!%BwtN8D@&RPa2aqivK(>4U+42EoOE^F%0PKwgFfirdRI`aM^Dc&_9c&D# z7@l=ScPAd8v(-X;%tqJgD6T$R!m%9&+8YdND6 z+r*X%jsJE$Adzy{H$X$BhNmC%c=_3eM=z>(-eh2?!1?_a9=y%sa+@WxJ1$`WRY8in z1{|ylpu9|hNl$hu>IFKtvsy>TE)%hchB9i`X{yq;m{)Nj0Bqpbj)c%VQNZ1v3~xKT z&%%|%L4N#d#72D7#tWL6i)}%ebp6fljEJtq0BB^B5z02ffP%`Pib?YN?f9<)WHV&y zv=-bVas?5+mL$wV%q|gA#f1YF7V{o%yv|_7By16%qZzRXFy|DJ&WrmeM+ksJ>7Dt0 zY{5fQwT7+%8=Wm>c+{Wc=P%LXjgJ=i_rrHtv{IcAB_RL>ivE*foAP}C*PkzAI_>de zCT5+fMUStK>9mV8R44BBit#^_FbjS7?(jNrvdQErlUa(1t&1hHluqlUv&F*wzATcN zb!MRz_0#r&MZP+uAV|JvKny_F6l@Nw__pL?ChdvrQv6n8XvW2fMw2p;hav?!neh;% zEyU4n2HsDKt-?&J0vxI@dAZzTRw#mki9y<&vEr1WVq{ZVtcz+GUvLr7N(HKi_C2wv ziaoWZYuG-B-OtkK@$Cja%{e?HMJa0$CMqly<3C)~&@APNQKvfL(L{~WGZU%5&)BK} zv4~35Q{mt9*&=3_J?>!^UDj3`*0{f`DF3tlPnZTZPf<_hibyWI{2GOzTPX7+>E3$U z8?jW%KJ8lr{8?d|p;{U|v)3lFUpWCS<~-h>NZD%xcs!W@V>^rTzo`4`@7MQDtld)n z3yo~~0J7x+$d(TvTRwnn`2e!z1IU&SAX`5H*&rAh2g)$100000NkvXXu0mjfhBuhd literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..397b9b8cab5276b17137a893b40ed9a8b81328fd GIT binary patch literal 2383 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 UZ~gG!uYp7tW~f>9(Bakp0R6Avvj6}9 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c8c79b3c32049c92ff15c620d0b4a444a6e16c GIT binary patch literal 4242 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 UZ~gG!uYp7tW~f>9(Bakp0R6Avvj6}9 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a9c2bdb49e117bc55e62a767c2643efc4f870f GIT binary patch literal 6413 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 B7i9nd literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a9c2bdb49e117bc55e62a767c2643efc4f870f GIT binary patch literal 6413 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 B7i9nd literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml new file mode 100644 index 0000000..020eb64 --- /dev/null +++ b/android/app/src/main/res/values-night-v31/styles.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..dbc9ea9 --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml new file mode 100644 index 0000000..345c07c --- /dev/null +++ b/android/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..0d1fa8f --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..0391438 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,34 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.3.0' + // START: FlutterFire Configuration + classpath 'com.google.gms:google-services:4.3.10' + // END: FlutterFire Configuration + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..94adc3a --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3c472b9 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..55c4ca8 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,20 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +include ":app" + +apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/assets/consent-capacity.html b/assets/consent-capacity.html new file mode 100644 index 0000000..8c96d45 --- /dev/null +++ b/assets/consent-capacity.html @@ -0,0 +1,631 @@ + + +
+
+

+ Is an MCA required to be completed? + +

+
+ +
+

Comments

+
+ +
+ +
+
+

+ This Mental Capacity Assessment must adhere to the Act’s 5 + principles: +

+
    +
  • Every adult has the right to make his or her own decisions and must be + assumed + to + have capacity to make them unless proved otherwise. +
  • +
  • A person must be given all practicable help before anyone treat them as not + being + able to make their own decisions. +
  • +
  • Just because an individual makes what may be seen as an unwise decision, + they + should + not be treated as lacking capacity to make that decision +
  • +
  • Anything done or any decision made on behalf of a person who lacks capacity + must + be + done in their best interests. +
  • +
  • Anything done or any decision made on behalf of a person who lacks capacity + should + be the least restrictive of their basic rights and freedoms. +
  • +
+
+
+

This form has been developed to support compliance with the Mental Capacity Act + 2005. + There is a statutory requirement for anyone undertaking an assessment to have + regard + to + the Code of Practice for the Mental Capacity Act. References given below refer + to + the + relevant paragraphs of the Mental Capacity Act Code of Practice. Please also + refer + to + MCA and DoLS Policy and Guidance. (For day to day decisions, please print out/ + fill + in + relevant sections 1.1 - 1.10) +

+

+ Detail + + + +

+
+
+ + +
+
+

+ 1.2 What is the specific decision relevant to this mental capacity + assessment? Please ensure that the decision is phrased in a way to + enable + all viable options to be discussed. The MCA Code paragraph 4.4 states 'An + assessment + of + a person’s capacity must be based on their ability to make a specific decision + at + the + time it needs to be made, and not their ability to make decisions in general.' +

+

+ Detail + + + +

+
+
+ + +
+
+

+ 1.3 Person undertaking/or who has undertaken this assessment of + capacity? The person with greatest responsibility for the specific + decision + is known as the ‘decision-maker’ and should assess capacity. The decision maker + is + the + person intending to make the decision or carry out the action. Complex decisions + may + require specialist assessment - seek guidance. See 4.38 to 4.43 of the Code.

+
+
+

+ Name + + + +

+
+
+

+ Role + + + +

+
+
+

+ Organisation + + + +

+
+
+

+ Address + + + +

+
+
+

+ Tel + + + +

+
+
+

+ Email + + + +

+
+
+

+ Date and time of assessment + + + +

+
+
+ + +
+
+

+ 1.4 What concerns/triggers have given rise to this assessment of + capacity? People have the right to make decisions that others might + think + are unwise. A person who makes a decision that others think is unwise should not + automatically be labelled as lacking the capacity to make a decision. See MCA + Code + 4.35. +

+
+
+

+ What is the reason to believe this person may lack capacity to make this + particular decision? State your evidence:

+

+ Detail + + + +

+
+
+ + +
+
+

+ 1.5 Record your evidence here of the actions you have taken to support + the + person. + Consider what kind of help and support you can give the person to help them + understand, + retain, weigh up information and communicate their decision.

+

+ Have you discussed with the person and/or appropriate others the most + suitable + venue for the assessment? + For example: Does the person feel more comfortable in their own room? Does it + need + to be + quiet? See MCA Code 3.13.

+

+ Have you discussed with the person and/or appropriate others to + establish + timing + of assessment For example: Is there a time of day that is better + for + the + person? Would it help to have a particular person present? See MCA Code 3.14. +

+

+ Does the person have any language/communication issues? For + example: + Do they have hearing or speech difficulties? Do you need an interpreter? Do they + communicate using special equipment e.g. a light talker communication device? + See + MCA + Code 3.11.

+

+ Have you provided all the information, regarding all viable and + available + options that the person needs to consider, to make an informed + decision? See + MCA Code 3.7. The assessor must ensure that the person has:

+
    +
  1. Sufficiently detailed alternative plans explained to them to allow them to + weigh + up + the alternatives and make an informed choice where possible. +
  2. +
  3. Been supported by the assessor to explore the reasonably foreseeable + consequences of + deciding one way or another, or failing to make the decision. +
  4. +
+
+

+ Describe + + + +

+ +

+ Viable options considered + + + +

+ +
+

+ If the decision is not urgent can it be delayed because the person is + likely + to + regain or develop the capacity to make it for themselves?

+
+
+
+ + +
+
+
+
+

+ Explain why you have ticked box(s) + +

+
+
+ + +
+
+

+ 1.6 Two Stage Capacity Assessment Answer the question with + facts. + The + questions cannot be answered with a simple “yes” or “no” and you are asked to + describe + the assessment process. See MCA Code Ch. 4.

+

Stage 1. Is there an impairment or disturbance in the functioning of the + person’s + mind or brain The person may not have a diagnosis but the Code says + that + proof + of an impairment or disturbance of the functioning of the mind or brain is + required. + You + should record here your reasons for believing this to be the case. See 4.11 - + 4.12 + of + the Code. This could be because of, for example, a head injury, a suspected + infection or + stroke, a diagnosed dementia, mental illness, or learning disability.

+
+

+ +

+
+ +

+ Describe + + + +

+
+
+

+ If the person does not meet Stage 1, the assessment should immediately + stop. + Stage 2. Record here how the identified impairment or disturbance in Stage 1 + is + affecting the person’s ability to make the decision. + See 4.13 to 4.30 of the Code.

+

Can the person understand the information relevant to the + decision? + See + 4.16 to 4.19 of the Code.

+
+

+ + +

+
+

+ Describe how you assessed this + + + +

+
+
+

+ Can they retain that information long enough to make the + decision? See + 4.20 to 4.22 of the Code.

+
+

+ + +

+
+

+ Describe how you assessed this + + + +

+ +
+
+

+ Can they use or weigh up that information as part of the process of + making + the + decision? See 4.21 to 4.22 of the Code.

+
+

+ +

+
+

+ Describe how you assessed this + + + +

+
+
+

+ Can they communicate their decision, by any means available to + them? See + 4.23 to 4.25 of the Code.

+
+

+ + +

+
+

+ Describe the reasons for your conclusion + + + +

+
+
+

+ NB. If all of the answers to the four questions above are YES, then + Stage 2 + is + not met and the assessment must end.

+

Stage 3: Causative Nexus There is a causative link between the + impairment or disturbance in the functioning of mind and brain AND the inability + to + make + the required decision. You must be able to evidence that the reason the person + is + unable + to make the decision is because of the impairment or disturbance in the + functioning + of + mind or brain and for no other reason.

+ +
+
+
+ + +
+
+
+
+

+ Evidence + +

+
+
+ + +
+
+

+ 1.7 Lack of mental capacity as a result of an impairment/disturbance in + mind/brain must be distinguished from a situation where a person is unable + to + make + their own decision as a result of duress or undue influence. A person who + has + the + mental capacity to make decisions may have their ability to give free and + true + consent impaired if they are under constraint, coercion or undue influence. + Duress + and undue influence may be affected by eroded confidence due to fear of + reprisal + or + abandonment, sense of obligation, cultural factors, power relationships or + coercive + control within domestic abuse. Do you have a concern that the person may be + under + duress/coercion or undue influence in relation to the making of this + decision? + If + so, this will not satisfy the Stage 1 (Diagnostic) test. You have to have an + impairment or disturbance of the mind or brain to satisfy that + test. +

+

Do you have a concern that the person may be under duress, coercion or + undue + influence?

+ +
+

+ +

+
+

+ If yes, what is your evidence for saying this? + + +

+

If yes, what actions you intend to take (including consideration of seeking + management/legal advice)

+

+ Describe + +

+
+
+ + +
+
+

+ 1.8 Please record here any further information or content of your + interview + with + the person.

+

+ Describe + +

+
+
+ + +
+
+

+ 1.9 Determination of Capacity

+

I have assessed this person’s capacity to make the specific decision and + determined + on + the balance of probability that they do not have the capacity to make this + decision + at + this time.

+
+
+

+ Name + +

+ +
+
+

+ Date + + + +

+
+
+

I have assessed this person’s capacity to make the specific decision and + determined + that + on the balance of probability that they have the capacity to make this decision + at + this + time.

+
+
+

+ Name + +

+
+
+

+ Date + + + +

+
+
+

+ Is an IMCA Required?

+
    +
  • If the person (16+) is unbefriended and the decision is about a change of + accommodation, or serious medical treatment, you MUST involve an IMCA. +
  • +
  • If a friend or family member exists, but they may not act in the person’s + best + interests (for example because they are the alleged victim or abuser in a + Safeguarding Adults investigation) you MAY involve an IMCA. +
  • +
  • If the person is unbefriended and a health or social care review is being + carried + out, you MAY CONSIDER involving an IMCA as good practice. +
  • +
  • Although you may involve an IMCA under the Mental Capacity Act legislation, + if + there + is no appropriate person, for people over age 18, you MUST instruct a Care + Act + Advocate if the person has substantial difficulty engaging with the relevant + assessment & support planning/review/safeguarding process. Please use the + most + appropriate legislation to ensure entitlement to advocacy. +
  • +
+ +

Does the individual require an IMCA?

+
+

+
+

+ If not, please give reasons. + +

+

+ Date + +

+
+
+

+ Assessors Details.

+
+

+ Name + +

+
+
+

+ Designation + +

+
+ +
+

+ Base / Address + +

+ +
+
+

+ Contact Details + +

+
+
+
+
+ + + diff --git a/assets/fonts/Roboto-Black.ttf b/assets/fonts/Roboto-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0112e7da626ca2f959eca850c806779ba55dbfbd GIT binary patch literal 168060 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
TJYyt(6q>rW4S(W4gHIq&3$utU3y8!9=k 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 WVelBb2)1!{_R^~ms-+tiJp5mlrotHj literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-BlackItalic.ttf b/assets/fonts/Roboto-BlackItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b2c6aca57bc0d92ab3197d595766bf9285deea00 GIT binary patch literal 174108 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�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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-Bold.ttf b/assets/fonts/Roboto-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..43da14d84ecb949ca5f5e8ecca3a514aa7fe1c7d GIT binary patch literal 167336 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

CI1`9yZA;krY|pfYv_=)r#TI})&gnG! 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 }T0zx*PitjbVP(pkGu*HnX1(-EMz?0WEMAX) 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-Italic.ttf b/assets/fonts/Roboto-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1b5eaa361c7306b4246c48497c79475c0e05c5e2 GIT binary patch literal 170504 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 JyV?28{{co6(@+2a literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-Light.ttf b/assets/fonts/Roboto-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e7307e72c5e7bced5d36c776d0986bf71b605f15 GIT binary patch literal 167000 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 T&&O!b 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

1!1exG)EK6u~BkmExnKuQI2?mS0J2 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 Og7zwfTI$9`zx;34o!sdF literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-LightItalic.ttf b/assets/fonts/Roboto-LightItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2d277afb231f7613a49d983217c1aba871741433 GIT binary patch literal 173172 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-Medium.ttf b/assets/fonts/Roboto-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ac0f908b9c9c73da558b45d65cc5c6094874d3e8 GIT binary patch literal 168644 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 X76wnEi(n^v8!x?bp_;lO!DIggn3ZN8 literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-MediumItalic.ttf b/assets/fonts/Roboto-MediumItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fc36a4785c50c04c9b18260e4709cda077ed352d GIT binary patch literal 173416 zcma&P2Vhgx7eD^)cuCr(ZQ8U=TT1s}7brBe>^)^~WbeH<$SzB!$es$y)bv>t6hWDS zs6`M5h^RPFz=eRcdHsLxO<$Av_4oh%zJ5vik~Z(&bI(2Jb3W&s8-*x}5{?J1B(`kU zyhTA1*FuF>Xr?H1P|J=Tx*YmFZ=^yi?N^kc)mnDx)@0U#CDRqU<_krMT-%{bX3b4M z<_}S5`S6 z_^VH+DU?|7``IJ#g7rrD8+d;Pu2V;hoibzUH(Tc8{YHusQD@Bf!2?}EmETgxqn{Ne zFn;X7857J6SOTs;!0#uH8#s1o^V})t6`F?6V<8j9Po7dTP{DjEM2q()Od2{N=j-Kv zD>S7m#?(_$@t(pes4j&mCM7_zDxu1F&1wq^3(s*`Z7!uyJeuTVfP4%tR9s5)o-UeM zE}teg=p`={Tqw2%y);f0{H3OPp3I&ni+pkg-qfs~7lJ)6P@5~{X7w6LNnuGWjF2$G zl1Ocm#45P!(X-k51O07cy+fI<6Y6%WuBUrdvwJR`UKB=Wxckw5%V2D;A-=l?ox0&&*etcbdG=RbDP79)k*9L7Dj$pLc_> z7I@L-3dc}wt_b>|7M0pi~-{lZRt7_CEc zppZ(FlB&FuX`516S*RscsfuYRuE0z=y#P!vz?gUym zL`6BG%qElBoZ?JRcREbC%%*xkr(atg3<>K4Vwb*1$682?A+jhjz2d%78-Q_ zMC$gm{jPxf=3#?It|N=uO&sK0@X5h1Bfq+p@aL&{s~DXysNI-hRTqAB0Q+Ccq435HHoRGiR|Ra!>9`eJe!HkVo`9XnUR%a8WCOtHD*3SDuTt`u8-RiD@6Z27gkmk<*~194

>Lm_m;)d~S=y9Q;dl?qBN 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 z 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

S&jh1n&JeeMOkU4{=4@cYr6k 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≤FHXCuU9Qce=@vmZ{%9^5??OaVQJ8!4u8-w;yt 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 Aj{pDw literal 0 HcmV?d00001 diff --git a/assets/fonts/Roboto-ThinItalic.ttf b/assets/fonts/Roboto-ThinItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..084f9c0f5365952d4d860431a1c2dca147e4a9b5 GIT binary patch literal 172860 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 E0iT6KoB#j- literal 0 HcmV?d00001 diff --git a/assets/icon/icon.png b/assets/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1aa2e6c1d093b07f9b04e33ab7a648bb1c982a GIT binary patch literal 61022 zcmeFZ2Uk;3*EM=*A}XRFA|eE(Dhf(f5Q2*IB3-0JdhbnIf+8Z)K|nf6lisA4AfR+Y z?+|(kB|v}>LXt1|yyJf3z4sT~F`hjJoXrWGviDwV%{kZFguYT&puceQ0ssK?N{Vt? z06Gx)Sxxep zJG9s4)y5jdc?t*=)}PdspiW7F$tc0Nr1*GtXGGmvI-B%~gpk$QO98-^O*!SijuZ#o zzawxj@a!GQjal|Tp9Egur1*D2mL~e&5y+%e{7>f<1^0hCKLN)7baa6KUgp1J^KS(H zyKeq#4F7c$|8=7OjST+@2>*?m|3wu4g-QQ~kpF*y*CW@+9N=oiJ3+Q3F}rXq^6ud0 zj@ZXT5;>?)EfqEV`hIv5Qktdk6VyqaWL;tkfkZhr!$(IIk}U12iVq&>vKi-;6y>hg z3D_So6?qC*jm0A3@<(KHhGNa@Su(JCvm54Az}vhta`7|u=M6`zrc76z-5U{mM5(SV zzD=5WD9F$1>l>TDs0p{CIanuAn;6O@K82J373M;JCdr-5aoF^Y;yvrV*w`dHkpo=- z-4U|EsfHNh{HvF6(OL@i3+j-SHKHuQ_LRfY?Yy_zSJK*;g&YY0F8v|D8{jmacB`4p zw(-PhMn6hu+%ko{$mJjRE zge2h{VxX1Fp|DyhheJRO@3`8MvcDtqz`q3v znC2(=c`iJoJIv8I_q+vaIlkm%EI-m`3v}u-JCpZ&Ei!D)<6^73{;AWlV10z<>27h2 zdpP;gd93X z(0y>Dgr+C^Am~l_=zdXeeAMXNB+<&ZnKF}22QV_I!K@%=71dreg-IMbis>2?b{od) z1MrNDnNfyxS6JjXd5%qN+EMFTMKYLIvrmt{n|o^0mpR|o6T=$RZ|ow{U{G&Ryr*RE z31oO+x_BeV=WVH$yCB7U)CLw}pD$pa{{*z{H0C|C6kdVPRz^N?1uOCdJ*|1ll!BJM zck`$o^^u3*wDYM-J1oI7wvO0aV=ZIY1)Hd zLltQUL?q|^9bjg$0Hgn0O;19LkT@+9kTx<0@nXk7;3JRTuTJaN=RV8erkZOSn@)tm z;Yj7O4T!)Bf$=lg&*l4N}q<~P_tT`~K>LBzjB;>P{RdX+X=pMLI_MgY{k zO$OiU$L?9lQ%Ge|kmH+y_FBfPeZ@Hl)4XVo^C6_oz&oIPw1-%pVHSTz*+pMl3;wx! zGen?&jhjRH++x+ClZmvZRUwi*9a1!Bb27rl{IPqzoO+1y6}S;Wti&FCPv+Q2xDY5u zn_4a0LQBLM`Fh8_)wXI)(cJBAUVT3sxZblBque3o55hL#;mBa44%-ZTnq$v3Ezq`JlO%o8*p1~9xOqN*=wTE6 z*JA32$WXRftn`)3sPPid?2u;#{U#a?TB`+WmmB>a^a)%){Y{To2Y`vLGZDe-qmAO- zdg`L6ozf(Lgpd|7=Mad@j9nubGQn5X>PZp~Oy97UzC_ypK^K9)jRsn|s_P z4it}-dx(v58}U6IF=(C4?tG@baP3g%oN2FtKy>4~2jp~f2 zue3uF%?=M1l23v=Qg&W1HcKc6fk`-FY(M|8))x#`1j{4uYYv@~-%D+D`);2LoDQ-* zaF4^d9(|I|uW4}L0)XL zsz--?Ii4!X_{p==EiSL=3~1(e4yjinYJ}^vov@m+OV66$yjX^5r+D1BWU|y8=d>W! zk+_XBauDysy6xNP6EeWBB@j)1V%vs8(aL1ARhK8PgomTtuP>%7HaTa|+c4ap;2cei z!;gP?*gT^p&|>3)v;_C`SlpGm-7|*E2ys+M;BG{UT{p7nE}#~lNHF|L6G5p<+EbZ9 z^@V<+pecc99L0k6z9IG#|?VVh`qUc+Rg0G;ZT(gA%}ZN7u3bF9&hk8;3cRbaqmyQlQ= zEGpa1@B`! zI%aSu$Alw{igVEJQ<}WHB!`N|j04SR1hxdPzAVyZ?xu2x**893A)PV?D;#()!ugQ2 zt(f?WvEjDdNs_fU@)6Qj0xTsZ#hVz@()VM$J>rzW!|gM#l{@!6SS|qd%+LyI(IsEO zKCUWwOH)uhq~X_;?wY=^r;nH}(trG1t24y)#gJfhqO6|s7|+ksPFJ?how2MnwX_@2 zyW&C!eFC<7+fRx1SO$O&L_i@XDx(GcG`$rdGN zBb(a}wr`q=)JzDKlBiDpeapLv6n3NrTEUl&X5Zl&qyz9oB&^ty1HB&C_~>s%1ljgQ z$V@*l|CQd42U$(R;DG9}izltZq@pWjCo#JM_ToR98k3Xm1+tY`m>g?jdI{Fj-8z+y zK`-H}O&&*yj$JZqTe20b#)3O=#R7_6_nq48`WA;QlXs?LQb#WBO-qq#WA%xEPgVTJ zQs<`~p^2H?(v8|Ut|qGG)X%e(L1+PWzun*as=45bmVb%-Ck0n-rs&y9&A;*%mo@noakSO zz7QS>MRdy-=)GC#I8Qe1XJ@7@_T#zIX%?PQgqG0OfkIguW!04#nf(1k_+0XIhpL;j zV_zsq7oD#!=&`>tFJGCpEd1ua`nskcD?4c;gbh`B!mIQdKXZ%dG~k^1x|@^;wqv{2 z>{(YxH6EF-cdX4IcA`*JX|n$tWUy6mX|B7#Q zt0tE?n~{3a>ort0Mrvn#C3PLW7FJp_!h*Efcq=0ke>nx0C9&P4!_{dWW4}0jlB&E* zvPaiMFcZQ9OYE=kmtxjVk?)-PzYC=UDiQn$dB2EzbXiFDQWBEDl!_#~{ zs1q?rqyMm4(`If>+Oy2*CeZ8*Q7hiS&sMq;>xNp(Upkot^=`uU!XKC(gNPQoO#wMs zW7EoTWbLOUWF;3M`&mD$F-O;OB+@Q zt-1b7sut(zzb@jpzX|&^bhjKHKB~A7X<+sWiP#($JwP;gP;%a*%gmZLaoThWZDnJ# zB@(`^RnFmVauE@EGMz_bQn4P27;4$QLjxCeww+pQBT%TXQ8R-Z*|yWpQbTWl#EWH0 zt&XLGYrlPS+Fcm(c`5ux$bH9BrY<}k|A0pmm%O+1If!S|0{7TJa<|ZVnh1bNueC=% zh^_YQUmSWNdymGV-QXtG-(Ut-@$tB~q!BT{nW6Qa#lBu0p^xv;Y0>8}_+V;8smU*{ z1%2b;cAWgoxIL$b%k65FgVjOUT?L6cdRdI zWa$K)&KDU^E)@6Br$u-6)+Hzdm3^&#QGz^H!4&z~$Nfp_BqB38(ovm7y7sV{D@6?L zk%H5=VRVvxQ~O+Zerb=_TZMu*oM6OUdJCS<@q?D|r!%#u&}D*~>OS=DpTxi;d*|u5 z7;6rv<%qqLNU)2U_fVk~|I=~(+){@ce9g?z$2F(yTpv^90pMwUt!Jjx(E|1NWdj71 ziWm{mjr!4e!pV&cZoC(IF5@Chf}T}7rM>n$JWi--g%NNH4tAORyK@6nGGQ|qcb5Xn z`dgyZV`MI3Le$PEp*fHTQg5V<>FZQw?y4y!18IYQA*nysa87M32>V3|fW!*Dhu_C~ zSB`?z=K4E*3=#uC+@Eif6#M5pMPydpQ7mSYe7MR z{T-j>{Zm`*R~qUX6HsWLK0nrL8XbCY5WEpG`Al&rJFAk;&)N^7xMz9T{$TTGoP^AK zu5tCfDsFOWb2$8LfuNp3TZot{3wbu6`;q_R3})rhECI)CD?A~t!~{lzy>wZv;5EC1WAiV{1x(Ec@;wJ((bG({ z_NyZu&njP*dkgCMt$vkk7SO~t@UTN9kzI(6GQ>HcMbwm4mK@aqa_*B1X_^rF zfb2NpL%!17+`SCZfriE8iI=~{(I3l9(?BbUe|^^UvwuU3x6`-5#GkLEA-Rtejg^-X zr85n80n2`)8oV=pHOQcJS?1=WeKd0zyM^*!Y`@2dozy#RuT3@9urJfm1(%+bYJf_T zWUkN$^fnlK%6A;Tk6yEs@8Sqh!)^BHlOLx{`^=G&n=H*gk1E+r_g0#fn4G}TIJ<6P zWh;p`>0L2#+<+Nnjof#aC__G)1H~Vl`?j3FR^ukPy&syik>=77mACu|Qpbrmnp7Nh zkk)I!j9cRh&c(#aP$+LFvsON%0s!q#|K{zR*lIlWR2zhguy0|EJ>XD4u%+n~^SL%( zpg7m%eWwSgMr&%nzzK4UQnc>mqF@l!znsAl^IMMM9dA2{G_OuBRB+#>eJ4O!(*YmalBboDsqAaj!6YncoU zCKt7h)<936zx|${v$k!OYdXYw3u)fFUpqwN5oVFnuo#r|jcA1K_}YeGFTk%R+gbHC z_HyW!gmBhr)3`!_b1Y_-lROR+-~XACdV)fV_$z^nk&?u3@~a5UJ1DJqg58}fPbN|iK>8Vw29e9W1`QEQco7^QP#Sf&25VB zj(ktf?|fW+YmJ^*{|xcrl?vF^C;rUH`~PPKjJ9EK7@P14*|dS}zLTyPokRQ|e zq$uBE+U4t;5q%9gOWXsOdPqGJEszfbz4z4;!+&Aj137i?tkwg!KSVc2R2-8=oUh z%csk`r=NXX1@WCr=YK4_l$?eW#}AnJwxUU@yF&Jo7GH5ARXVd1ihZt%5K6jg7)s9k zE$q+WQ51*s&&`tnh_Chr*83#VZ)EL8wH)Lz%N$zegS)}sU7~U5$wYu>RZ^tiQjL05 zpLNWjSCX|*#Fa$rA43RkCHf7%fj+at)J^AIvf71VKfGK5cjG+0wX+eE@v=XJo3&k= zc2hExG5t*gVjfKP*tmPG2c)7Ja2N zpUC@<5OHO#nHfiod0phfnXKOV^SHWaziT_7#B6@$V$$Vi#{nd}xGLlhM6ds4gw`9u zXSvjg&A(A`(3XhxmQ2_tqR)dOp#KD+Z;YMet4uJxv9 z$E_6d-_+s|x-5vgdYYp+TXQQ#IZ${Z|7cAkmUSp`{-j=*3pXoo8uDTet+0|~CtF?h zqsHBxi_Lcix0m=dDe0qnwiS~U&GJ=j078t*ojv@-Np%B0N2-^}`$MpvOiQt&09w56 zoS}M2p|l#VKf;UmF;$k_;JZb-=yCUqL5+UY+V$k}6ML|jb2=UYe>Y4$uZ3zF(lp0( zoufOlY&VuCz)luE(e;9+%!B$$?0@K2>!f49$Po1p_?w>!O&g?a!sZa$2!+X6XcYQO z-xB;tb$AQwBaI?5m`u2=nUNu>-szJ~>39C6(nK)c<3+&nyICET`*nXm+QKZM>Kxb} z#%9<2!v5lH6w#QyvMcCfx$guyiSSffFg4C6&EvREA!XG&Nrtm49GziXh)$b4Rk;hD zD#70m^K~EksCmM2>Ib&f*xF%jxRhDPJJd?+iq)5JFn^if|Bm41{T8y6M~=zgjP6sN zC(kW8B+Eq+`@*=ZC;%qwiKotc8N_h*F4(GzaoR-u*JkI zVSar@dI1Y!QqvmVp6PrrK9Z8*+&$zKkOIn*Qft(Qlu}}p5l;&P!fPZ#&n`jQ z$TernQR1VJHvRJP_2ihk?G&|;< zU+(9o1iJyMl(Vz&X6qNq8povm+X3{*<{>cx&|mB^I*znWT3hzs2;dap?Ocoeu)=^9 zngGeX%Qn@6M6U*eo|uS~KB;iPW_)BKh1?fjrK#S)?O#J5@FgAB`Qr=fgx8Q>WY) zqSS6OmU!M7PD5(k?kt=&9)5xQx$k3<-YA4YN;pG!v>6#8f~Ddt4R2bhP6*pN{UO3@ z73r5aNc?W<%S}VYF!U#60!e*Ft^e5w{?^gE*|m~Mo*OwB_<_aeA9L=|KOv_LcX1!K zWVU1iz#+xA$a#n1fAr{{V&!9GJaLceD5G@6O0?{fNqHV*(#RjQ1+E8cb{u|o%}ZJ7 z88miLX~C83GQL(O0d&0BdQOAY8id4wxu#I0@peVs8rNa4j!+| zZ`e0~ct(HpP*ElMm|5xo9iRP0hDFJYZSSSQKofYPzvb3xE0#x>d8l%sedjg1X9q7c zTUtrcNpw;UQyhP{zVzd23lVz!0U7<>6{J>Tg_rU_cBaBJfD@rx%`4n!6;2hVFXMt< zeNS|``pIbRf5xD*^N2Qbg1TiP*u>VST(X5+9r@>~2k0q>0g7H5yt-3bbjSxJSIu?8 zT*0!2-d>tO@+`n@?6UM&9F zPTq(45JCscc{c^wljqpi8inP9Ded$i>V)Y#?=NLlLlaWy4j{8z|bF9QkvK#dHf85|1Gnw#O_*n>wnU!Km(HuiO9eD*m>Q$9-hJ4H_ zHI}g3RMoTp;xSZ(J1Py236&CQO%ds24ruYnRKZ==q^{I&t*cmyTrS zRVRz!dm+tBdOQfrCi4s6;iOGtPd!l379LvTpRF3UE1>kT<9_nakCW3%kz7&>3A_KP z?(Rz_S)j$^2N}SVTi}JvGbDfYOV$>ssnkgx0g{UT`R5b6Fglk|>KU+bVB?TGw%r0h z0l~|yc93;LV$1+~m}`^)P0ov~Wk5TRu0-?DN7&P|7{gGQba;)*b^e(19zWNe@EIkeBchw^S;x8n21 zLKkz~k7lm#nJ;$Jk@nf4rL7^{r-tT{&ejRlBh)ho1x-VW^B#4(i0-v+rxin%*~Axa3Mw`) z`tq$4lxYI}|GG;IHDmE|e+^HnApTjFu_6rUN_^tdmkSwvusK#NTs*;g1s|^3y4;<- z9kWYYTC zo5|?SR%N?L*W$DdxtM^R5bK;foLU`+J_qqYnxvtGf)G8cV)@O zR<^w#D1)LY9!QK8Qv<1!7$i#pS!PkvNRGVSdA;uipuw6HOu|p`w z5I#D_Ly7Vhr22gk_0J~4OWvPfg<-6JpxETuqbMN{)hp{%o^;{*ZwN7&)FiE3*tMpmqd7NXS&F(OL_5qTQrmWLPbW+*>Y&GawUiDwV>_mjTa-c_NSG079DfvgDSu=liwVe5#;ssva^e)A z8LO%MSWZiK1SR4_hl_`dWv_LPp->jEuW6=2c@|y?%Cr6a%OU`qJu^$~<1hBeZ=3j@dNR z=&2Lz(tblKL*1-LCQ5=F=U9d?_WFISo3km zG333E4!ddKF5L}_QoM4Kf^_e@SUP1% zt+wB$#@?AYC9t)GN>*1cs?$2cO1{88DhvO9lbF;hJ4qU%OE`%$kG7+|TbC$H0Ksh# z__YkjWG#Y2dv%V#$tnSc_AqR6`#wCri*Eg*6!2|@%~SFRI-t2;_TE*qN-Iby=%Yqp z_(}Tmx3+ARYmG-2g=%`;-HN*$tFI>ArMUB;h~DSzZLJ1t``m81ds6L_Y{u@;Pdwxu zD&M&OR{;NZLyb^6G#p~LV_jomGR9UXl+fSvv*v!s(NxaddJRYnVbmt2tqi#l%P!WP z5#P&w(513s!< z30vcS(8zn5^H|vU2nrMI?l(+0a#m2@CJpp0km?lJa&;hjywSQWI^q+U`A#jf)hURP z(r6J8x?&6d0NEmfpnS&OvR>KJn^Na=^;RK2k2{rRYDp$~v%fxrQa8RSU&PHp_vNx+ z!#nPLzHL?Y!n*8Q3%9dDvV7YCpTZYlKnpe3nNQ~L)4Vvv@@sa6-TpLm}{=SY%(z)YavY zxchof!Npa!a`jycJFHQ*SKnVN3)r?itUaIyspbNTD334`3pP@59eE_c{Lb~Y(iMMi zEjpJ0NZ!&~;TfVklcA>Xg^zNZn7C2AE>}{!MxWpXG1M3hPBCb{?qA#FN;x_GM9*E7 zr!>i4&T6tjz7Lx2AZJkPu>f=C5eWrIN!2%B&F$D=wi_XllckiL+N{eH-UxbF)BPpB zO~&4F%PzQy`)?^9)tVD1?(z?QF>G7)2K=Uy`h%0ruTIKjcmJ=DYrFN^c&Py>;^&G} z-Su6qlG%-;dz8HIRZXLD+t7_B&3eJW=E>ydAA5^B7g-7LNi71;!3z|gM{_{6+UKCr zrF-RO>7y_Twp!lrdzyt&;y*P^{1S9S0dZK=p&~Nc8x6ZvNV=?Z6-=}!z z$hB=47SO<+8a47!gbBO|R+>>&?qPg11X~H_uI%|kU#q2FQm7dTh$Gisy-VSNjo^2xg zA8CKWD>fpbALkhmXSpbs{b?M6_n8{13dl-{808_FOp1UCSCVR-#ey2UzN<9gt;MJE z>&s%DHWiQ4+!o{u6#BWU#!%AY7Uu%(xXY)c+13QktA2pGU@Ky7NDHRF2{bUqgWO7|yJOils+ceXCb7p0Db#|}&api%~ zx6JG3YKl@OSAEQjT5Xz_9w!&^9PHaGMbum~6@Aum8EC2fNxq(HlhT(AwJfQe5v#rL zw<@WLj1TjqG6RkDM57TR{d|w=Qf-8T)*ZqiG(KdT5dD6Jo%g;$q;Ypf^|K!Z{4g;i zi{oiu$ixh&b&Qkz0WRqzDC{uBlAo0Q?CjeLrH89306)z)8*O8X`IjjN-^nMx43f3` zhe;no4|vPCk27rczUl+-Uf`LooKgW^|F`5?n|#$_Q-zU4w8b!iCTW!I4y3Ck_#7~i zq_jFOf6ZXNwM)5eI*e>HF<2LxNBMWg;=;Q$S6h1jP*9DCQ9>`Pna@(Ez|j zLDh5S)}R$7P=?VY8#v%(D7rG}zD&~A`Xj6L|Hrdr+Y3>ZDJM&zIzODx_89_F^yDOGU_LYb-O=Xp&n#%!p(PGJ zr!QbUwcNGxTjX(DJ0md`_&Q3px$4aYG zjS6av6*eyV#sQn_RH$5C{3-zGo($#^;9FZRv!$!YNpeGQ7r%Puup^26v$UxlbetK#J*XPRQ*iaF6`m{4N_)6JOty zGKW<4t&OWoiUc-LvL-aySLsytTyfLIE*82 z{m&4PZ~Y%bh{mK1ylCcoBi@hyuJ|LPV z%4iKWew>#3)rl^6#W>3)3<+$Pfu8cOS&XY@%eZ7)`BFUfDI3F1Z7RRXfR?ed)fK+HcoM2rsk>yS@5XXrviig{L@p%Wp7Q4> z+U`G*c#$f_zOf(89lV20rOXd*s>Q2ylG~O znXjs03Xy}eYdk~K#z#ign4jMIIe|qEC!J;Ehw*h9^Idf;+TyLY4;JozJ`f5``B3(d zsgN6$HeIb$I|(1~nu0Cf5qqqA4hTHUAOZq$gG9x;i5CwObJiRu=DO+d%-o=AO-l66Vg$vsqT@y*P-$hlsRn9NsLf8zeKY*lr z%{0M5(>1GGZ>%$FzlK`^7w}gtYC;734X~--542|!zgkvd3QI%^Vr&kc4aG@+Cbhb zOrXHYxv17hnDSl^}2!rZI&jZ9A8o6<+(|o-3q5%Kg4v%*t4*PjpYNX)L_z zJmJ7SChEC4HMDbD?y;}nQh5rNcAKdvf+#uHH*Y?0XHeB)R^ViFm2I-5-~LIc_5UNc znrx}e)90?RO`^t=RTI>%n^^)V)tyiUiPM(mBB8#RhXLwy#PD+5TX#q&@;(x+6 z26OAnV+usZw?3IXMQTbICaH|5wG^-dfsSW&N%yuUD%i!y74vH3vM5r<$Kr71HALM8 z&RsI{antdsH38?sbyqi(HnHP@)k_T4sybDoD)TNPq1dg*6dDm4cVP)A%|1AHSA{8FgN}Fj<1z z=}-hLpC!me+WPQn^_)1XM{d5CKFXXMgE=!s&HbtLv&*Q zxRdP4Rhm*{4|W6XH2oQLqEofVZZJ^k^8f}P7~B~!bZ(G+cXMh)zR7dj@~+&VdOYi- zdQjYx`|GiR-pw3IEeO~QKgXq1zCSHu(UZ2I=c`pcq-@|H_Z7`T?rwV$HuMXo=>R znyj5Z&xN0Fz~T>kz=yIg0uJ8gLOn{dnu*mB$%3VarTR|Q-yL@Sy)3mlU>)uOT%PvT zd{hW#s;U*MY%eh;Pd-&;Sr!fjQSPa)b|Ky+*}0VS5k1CLaUaKj!DFot^^JyMS2Q-R zola z$ULKafZF7j6$W8FL8D%atWj%!X!_?Rf?}5DOE^=G^33pEWC184bq{4SZd&?MBbV2YInYonFAfrRG6mvW;4M_@M5eym z^H(s2pwsAWCw%;UP8Zdb>brD;{-$k+&;b(^WPmLj%v~~E%W(e3)tCYZ_*9xbTyYm> zDaQW#`BraLi9t0wluE2>u6(-WW!upM!nt!^!!=E5vU<jCqNL7^&z;&uVsX8KK>IV8KX z_Y?MsTFemjQFFY#q-k{W3Uy+#_{irAIWvsM55$*-%%_#IO;cvL*RjviihP7(4SNAq zywCpo=Aw76!?@hlmrp(N{Qh)&|3bLMbDU_E)cgbjlE}#|u9T0JYp9LQ7izL(JF2QD zARDpd|e2oN~^uPA)TiVKfhhgJJn@7G>n1^D(!rg9Q%2qnF8CbKw5)*4{( zTQs?kI7gEcH3epHL4&V^(6EHwkZLC%Y_wY_EV5xpvb^UT9ct6|;GJpq)Nc&*l+X$7)`*iL(TZg(40vi&8fBT_+QE z_Ora@e6^(=W`&aGJ-EPTD_-a?j$G$9FMfvPW+dtKe#}L2T?BN5C}cSR-7Cz{8}Wb$ z44h<4=BfYTG4lzy%$$@d!+NCy#;B|3DWnv>lDsSJ=T6yahJjx53qYXM{|X>LO>dM= zcc-NSX^2&mf|Dv!EYVB7RT=p7q`a-m(nn4;%l8^eTcqths8wSAlS<_5sn82kW1z?no}%oZxo5ch1neQZ#9j<{P&r zF~f~_Pxko*z$NjF=FL?1dI}=s<%BHVZu_V;wr<00W%8yd%SK{?^n@Ph%&q zzU1+r(^3iiDC4LXQ7`J40kVYX&G4T|>R-<(1!}jcWk;s->OlK9<2<65+)6>CM#Z&i zs--sJXg`5z&6>x;AQSY`eJYz+8w>J%y|14AaRRe~eC52j>dmKq0(61R*jhE5F14Lf zHmanwB^;kvoIbIJY5z#nn5NO+WcNdEbej_ls0%1^RW|sW@Hwl=GQDHl=+Mo-r5^_0 zf!CUsPF{D44JpxzsMKiDU!egzj77j5F7$2daRR`rv-&!h>C<(~dZi~-&aEtUpeuFl~Ji|A$Bo2s~5@9K9I^ji@bAN6ht?D)6a$et@C-0w2Yl;QEPYpz85E z7bYmt*)Y^gW5VS-46Z4KuEqLY1Dokq4J`W|j2|6E~n~A=0~&OO19o z&K%TqjR95Q2SWpTS(D8d?st(Td@*kvbUXd>>>(At zdOia28i4|4994#7DWC2wWO-IO%Lu=R{gAlxY`B;kusVc)z#J+*5MvVaZgs+wtNGI| zaQ-GWu^s-|jva#4DJ{XV+bSpNm~r{XX;~8ogRn{ADfqxI2I#5G^s9ZGHaq5^Uj2e` ztu3T^6cyi>K-qh3SdDB%d1!W1;N69UlduDXyBORe?bFXZtkYTSuMIHp+0{CojjHCw2?w^dv4fG2 z)`r)lwe^zMgkT0la>sS6J0hhGo87rQWhyh(1e?-!%%4CZSU-&g<4BkJK1Oi-#k>$~ zWM>I>^0$EQNY%F54?GG?3%S`Z;sn+bGb$p8G6dNd>?U6v#XjR(_bvJSbcw&k21$;q z+SDKN?>8H)tZ_IdZ!VLF3-ywo#rD;(h1DD6?TM@{HgVjt>2h3TIkq-AnhFX^Br@ zsrye*JB00$fUW$Xql~}gZK0JYbF9S3S-l&J$z&%41a+EWBl=;oFb!6B4#@@3Uzgwn zrpf>WGeqcA%yZRuTohx7wpcasUzBST{r1(CXXuJ>YWI-qc$Y()_^#j1YqilhR!_3H z0>c|t8!Z2{zq938J}DfCL%u4DS^SkS6hQ@)(dhj18Ne%wvyM|rTEl%~Oh{B%2&Odd zt-2TSGY?h>=i*(L8*&`P0cjOme|Sn0qeA%JfC{ zH;P{+Z{_zC+BR=H$c?IO`5A{-&IF$lzNL@@bjewr!i|l2|00tcOP+?IhSge4_uu39 zRkN?(92_8gLKwZN`agVqS6CBa*KH_@sEC4yf`Cd@fhb6CR*){e6P2QL=~9xQ2#R!& z-jrUXOD72kNC)X9KPKLevY?*B z@th0NL1l+OKjDU3rO(7`ykmCy0B_3}P@dV+J8W~{BFg-3imcu0>qN!;R*m}_mZk0% zYQTHjCxrUgoUJKbg1D*9F1wygAt2%`S74~f6p{0ZubxQU-lh6sDo1Drr%JE95lD6F)=WQNG$5kaltk&jw4J#`yD#^395$6;kh z=*Vx3Hs4Z}h`Yfi)!_5P4$jt6E1q zO0<3vCG_PZ1e)oP`ZN}GT2GV@)MW85kgJ5T0-`3;^8Jq+NZiml@CB7u4Wjk+g(`kI z3q-de0Z_2BRHf%R9qT~yw7A!N4Ik)h*04V9luTQ+$F(?icP6=04{1q1R%ABfh9D;D z>NQT5hDS5jNMzWKAnz^Q+m3$w*775$ja3ip_#lRXodYy`jkJw z<8+|yTmQQx3t+tm-5NenQ?YC?Z?bI(GDg7uuzaCmb7!rN?OI)p_A>7dQnm>}o%GF} zLBtnA_oIE^x|HtwU3N56Ue(?#=cF!%)Ynl*3#xrwl5vvDDxoO9+*obS+KTvsmeBI! zgC|}=0rMRdQI@p2UX&x625P^OT$Yx_M&Sxh5ee;*(P#1&CW#e=Eva19a3 z%0U@YTMjK}iR+ZPMZ7>*w~;_oafq)wmF#_Q0jX|6tLr==pr^4o!YRw+?x`Tb2!bqU zwDNK~=dcKc3zOuqhKg(rPYHTDYY+MRSR`g8gNuG*^tPk6M!9Y#Z|EX^pwv08u zth@IC#wwOz)^WzEXvlyosb(vFH#9JZY)xe80i>P|F(BEW{odj~^Cp2}wvrP#ZDSSh zrQ&s@RIIX#0+ghhgg24ncrGT{CU%tsGM0Hub+|dm*uqp(^GTBgmt%Te`XQH+dVRQ{ zW3JFjQPOzMA>a?QKEym(7?u<>;7(0D9;Ymhl$bi%ngKj<)-|&*@K<;SNMRG zua*lq=ih&Kb$x9AI;S4oy~P4wumLH${ywb?(6@?3OI1O|!@lT<--0DwN}kiC?5Sfe zuBnmvy(dDx+liViBow$tUz1@eMq23f-pp-sWyNCY-_d}_xg#JKZJdyz~ zu)K?R_VAod%D-EbBx~^;lsLxv%jwP?J`LbHtbetVy|jN#O2n%Ah213qqg&n<&uJgV zANxIHpq84Kv1=!Wbz+K09+!!WL!TW^K$wTA8WXHeC`ccvPKhruG>e}h0b{-voY-^{vw*KvGj+%lW#1L1v< zQQQ_^N0bEzQ~?#maT;>$sJCPF*nr#^hCJ4yYH~HU?ap?T>~tS@e%ZdMpay26XDJIh zj!^BKa?Y7)bPW8%%(Z23EzxJezSg3$T((?pfT*#*213fq|9o*{hvRYt>2u_k*UG^c zq~z~G^8E05%-!D*R^1Obr3yNPkOfBy9r_pQBwPJ?#V~1n^uaLgB(9(YXy-buQQ*=k zGXA=jnRI!#Ks3qYTef8F*1RYG*mv`lyPPdGOrWN%6OF~HxK^3Y_0DetMoBIrn!}1K z@gw`q?%aPFvJzROLzT$-Lp{yZF0@m_&-54qg^X4#qN{hmTVU#vXRGvBZHJsnEo+5b z_gESg>z##heSxlcm|k7Tt+^5hq= z_j~R^pBn@S%Orr=+Vuly=Ijn2H9W;|03$)z#dFISQq>EO?8Bn8FEnnjNI~A$n`!j3@>_QG|4tZ0u+($YYGQT@4hK(DR+7~a+AdV1^yK@I zA`ce)EAJTN9v$5YEX{CC+VeLt-NUI*Bl$%Dy^bZN^}|!l`udUEPenpNn(`o1!nd$3 zSE3Caxf^#3$AVk(HW3=^R}=Wy=5xjN8(0&d?_T-XEwl`u`ermm+Qw-~ zzMrDp^wxm+NY!B!sIs8tBTU#&p&R?u9G#qR)D-%MgJ`ei2uSs9Da@~XseLS`N}2Fe>ysO%@!8)T zL^EVFzwFZdUsoy-^}qo2ZJTcgDZZEWNQ-O1rs-SBCC9|&1!Ubpn--xWd!`**ni33! zyA6sgc+Y^zZ&cJ>s>Q_H%}7VDjkeO%d%u*^htK5~N7h-($k?eJec|3B_XIMrHj#l6 z`Jr)30P>xNi+Kg{D407s4$3{mTQBw-tK@QIN-!wAmc2VmZg6^fG@-(=EdLx5;0<(8 z&i^fb|1_b$)Ei?oZJ_-n@_K2?GJKHdmPlCBo1omUgRJuo*k5}YLFRW|r+`JB0Y^nG zac9Wui!+^mv!5G|2>#gBKj4iub7wk@DpsM`-0t!&8Hdp=`+2iZLK|50m~IqllMY(K z8?R-5fyMEN5kN*S4?t zphSGa>&p=j0IE;GVAvvEdGTrf3hsumFrMM&(HQQW1RY(J@MKwd=SGIYYpUIG^F%~p zah?F~jp0|&SR9)CcKeoW26tRs z^u&mv1vbknhCQPe1@OHxC>Pn?ICQ&2wJbF?O^)NLG@vWLrhRqaUN>TUbsL!~W!EY= zBxTJ~jY**kksryVTZEp23wE7KLBuCLH@*L{`L;KqLMha*2X^=~XB^xrqaa=}f<;~OpST$c1;d2~l-(Uhd3 zRKXB0|A6f>k4fgmuGJcO3Y_v%6FL{igj-|aTnEEFM&(!XXg_uT zBIpcV!%xBYl6>^s$jlI9BcNKxxlD-P$Xr>`0BUa{o|cihYVI`|?|89oIT-&0iiLRe zaS>0YI*u$zB?Z^lPGU4??n*`wXOgM`#zcGA-V8o8bosuWsn9-hXtp-%_s-@?UpB+< zr(H4)1*cTj?suqMdiy(%=S)EyXl`v)B;{>?tiKVpPsO%Z-X9aDjhxiFSNz!7Q%YlZ zIj*GciuJV)@P-cI-6w=&LF2sl9d+5R1E$+lup#>qw%5qL;|nRrfVhaEBDr!fs|PMG z4E>M5)V5Rm`%nC0NTwZk&E{t$$>p6}gdr!KH?qpM#H!%Dj&p|VFjeZEAOT7Tx{?2% zLdJh+BV2{j>w;Oa1>CmZ22_+XlTP!N%pr{3+*56~kq-uAZT%~R)4!Z^|JedvMtisy z*@W-Mh3iALBVm+3`-kE1C96s(c7J-V*R>wcWB#j%!GFEE-mXGGlRybE`_oSx@B@5j zMoO;fz}BP4g1wPK>?)tE5Uf-VyJ0DSN*agj2|GG0MsPRkDCS*{6uv36(M#3F{OUbJ z`R!i0{y{+%!VEHyh9$Yr(van zJ%Y1h{cV~=dPkT^mA1lo2lD{KTHAL^L;lt5==zF6E&ace#gYPZ9!!J}sV2np1kjy}b?gBCIzCLMj8?o&VZg+8Kgbu?1%m0#vo5kiTc)fQdP zZUGWXOn})7D{C-g!Fcq3?aXaQqZ6X1!AV`)tG2OGai0bj54MxMm!DpDNn?al0qPI$ zeej~FJx!kG#d+?o7?9%CuhaLZj1$O{mpn2+(%CAXY-FnL1?<`k!JfivX7DpUcJ*Vu ztROKKaPxO2M={T1Qz_;vP}&>R=Mygj6|Z$_>P^@d1_wQU6|hQYY9}p(bXUve&KAh; zVFhjDUfI>l3k-oG>X#Ul)>%L?8g<)!&nAWg?UsvfEm{%QE=Jb5`P@!Pu)iQKwq*&? zI6A_rmkg950m|;6{BABcIa0k^AuOy6n-sdA0nI}ETzubVLx!3I*d3si$kP0U6u4R6 z9zcK95Zj#KJ(SZp$9Q)i+OSTqRF6$DK;~1O`DiX$2Dd0Ls+?LApn2D`jas894mrMm zY@HLAynj{l{*>JqC+MZazgz4R)eoXJuKp}AE7BcEnvrY;K}nVq`{Cicxpd#Q%_jyd z%IB1KS-Ik#w#iKBVA52dAF)u9lErwBbQQN(LR@lMWpvGq^%V5z+HW=Ihn1+Q)=ydc zK4M`$;e6tRNk7vn^59^yb|0SUu#Jfj6wX zTFH4wwr~+8{Ay&Bx^`NE;92uwx-yz@UK}^a*#o#5E+dDELJTmlAEDQF6ABpI zgRFM)Dx}%kHfuy`di(*~6MCS#kRL#qg%p4rqDT4_r#k4)Dphct;!U3Cb@oB1nDYnp zL{l32(YEi~-sKB3M#af5r>t!yhim%OezON+4kh-oXwDU9h%XH(C!?(U2mzIm*r#G@ zhX=CuB%|N?RAs9+T`Zq@e?5;bj>e{9CvghslRKm3MQIB4Z*2~>AI9Rx_80Inf&Lz7 zr;V}n^!s=*n@7pbh?ukv+k@-ELbCaBI@lj^ZFVZsE|c=rhv>$#c2SX&#A{ z0(*}{;_7_VG1MU=M{z}^JycxIp0$~#kygx8@|bNcBh?}e(s`h$=lKXONKx~B8>v76 zYFAc;?CY-7!Dw2qX)WtI5XmA|qlT<+QY z)}|8@D6}pNF@Gai8bPh00gX@mSK9#~;l#M>Mvw%tC<=blupQSiU%?%oz)q+e zQT@RJyleR}NnAXago)Ip4ke6@1dUK^z1nmS%Q8{59%w3MT0*?|Ve$gGjk(>H-t)(R zL!_c3@(^;o8YUAAB+Mg#sK(Rdz7AGN9}6$meWG&IU+ST0MEIe1GgwH{nfRx{3HRI2 z0@vF7l*>!Kk85m2m4g~&u}Qq3MkF!V_6&Z3!1J;weKngE?*>0+Si#eH2KgHTov%;H_vT9_25Q;;Cs}3CeGAM?Hx2!pu>o~m@8}#1x zv7bU6wWlkjuIe1N`X>N_Jq8?WyQ5MFpy9sLtsdW7g&(?Zedn`&V59$!EXwGZQ;>QQ zI%VemPlgY=`1h zlI+o^g4bp*e~Ni>|1Mnz(6iA+gpYgRAj#LV(lO=xJ(ZfAolbvxN=JES*G;FS`eoe& z-8%{%tdw7AvoBfpWk|H6Gg))Udsc3jDLgOaz7n?%%^UcVt+jqE^BjK4Bxhbr!;D7) zhkT#DA%U)ZS#Wco?4*x1x)fz6)`A?mM>FqYG&)Es_lMW)w27|HLXMS%C7q~WcCg}` zBXdPmvK4X-qb$g^s`QY=3>rCc^SqPk2%};fD_+&_0Nvo=fCt+M@|4I^p~A^@;)LA`jxACG zKih2|5THbR-&O_j-ihV2-HgXCRU;s;9T^Y%EowTy4vpzm3J~obcE*QoGk(0&;(M#$ zSzH9$_`I=Pha#2BRQ)aEMXL^DuKpFgzU(odUDUsD!cf;%niyVrR6r&BIncE$g{Lc; z8!>OI_W0uh_YXr46)tBQGd*~DkTnF~QSSC2!gV0$(wyNEtj zqF;Nyzt24m=Q!xP=+@`Fo^r5y)DE7QVMG?TQn$3# z4H!YQ+b5YU+u1Eu{mq9*UF_CW`T=taZ!MMF&hJL4Y8ML|B>pmsUZ}3`hk-}>g_XPL635WpNp%Z)RYHPdc_RaP*G~1R1WJ7^2;yqe>`FOV(w;G}^mW-H z9J8YQUVCF;ChJ%rr#->2k}_5}M{?ksZ9t|ci*6tTk7*QG*2iRdj;>DR^4w>>*CLYY zg^sUVZgVe>Yw9S)JI8DGY@VsY3cgd0lvTG0q{sWM5F?fDI6k>U&-dIpFIslh_l&t^ ztlg=J4%}>w*+k8)j3>043bH#1I*v*4_uoyibSRUt@RdT%>lS9}y@PPExLd+5sF8*J zto8Xp%{2YLD-R-As^rDrJ+EnGzS+r_LdPzHj5!?D@F}VD_kGmTx^DTr z2NUylI8&3A0m<^Pqz*8Y(69;3pq(Yc$GL8UKqq0|;8Ru zHb9M3vZ2};zdgvMU33pS$3IbVkS5Q^-{ls&v;`yDn8B|1MT`F7o~!U>SvNO{Ykg!S zctaP*3@OVwpe}!Yqd%mwTL?$#{LrzSDCgIq%I=Iw4K_aTMObkTE@8W?6G88!#E&`9 zxCL#C8nYuMBSLuKQT^`I z6i9cfl=+%WCAz+myn{Qq+(x+^u4|hN{z! zsd3Ci!ryCWrYqP``W?PASjz5x(81q?;0(&P*j4H1txJi=;;4ew!0t>FIafF<6|8a(G&3 zr|6ogGYP&y(op?TKZiPAFSL6o1m&BldrkEsV?2{}3Cy5XmH$l~(@%7{aiz{@Of2K5 zD%9)pE^3rFbiR^VYNXQlvf}k6Q8N}z=Rwkz(KKmk!&hH_xf5Z-CC8B+Q znQ-(5h2ysW==!zkKxDRg(l+ux;{|L@UPoj=W$(@ z&@`lLr=_5hXQp#9L~Z|ZU4m6{1D$gNt25`uZCpI}E4Ud1GWc@`Z*K5`ha9QAIR^iX z$a%nvD<^JM3Gb6_W~db&L_8L3p7E;mES!nt4XK1@V5BD`5%SrWUR@6(C2#>uynp?w zW7_jJoI$Ej#OGLPcu?RChpAkB_>=N`JJBUe?eSZ@pRce;m?gw)y#3Bel?E*OJ<&Be zJGufQ&A-N#-b6}&bu{x~9F{a+kVj?DI3#Q)Z?ZIY_Bt0)-7%VjUo<~f2i0%=bw0#i zXkr+k7%#e_NSPji5bV=+(@X)aUAb=nLMSoGelQW6!k%tLt>ga^&lgMoQ@132df^Q2 zSUK0FLhT74pPhV5p!>W}urGB|+#{1W3b&-7P7^Z-a#`ly6dF+QNxUmlk3Q90u=8j?vaibXWpvWO zbo=4hv88z76EZK++N5dRQN^bD!I3a>IfB?rw)b`c)j>~DZE_i3Cc!GP(AzjWx=(gH&a#j^f(v%F5D5a^bD!n zFBw9mwwGaOvnZed9bf|oY5bj~V}vMgs$9+aFv;BKHQc`KkgsAv`@J?bP3ZIun2DSZ zDT*7BaN}q*+z>--q5oah^z380diCVQw}?;+@p73y<)2fR1A2tF1WVXBDyEBAd{Jxf zI^`G#tO?Cvl#LR;RDR^Te@>jZuK3J;K_4;Fx{79WuT8naJvsI022qH=MwF{Z}zjg)eddAy~jS% zQwRU*7BU0qc)2Mh6boJsSag}g!ZDJX2dex8xu}%QtnR;nu$L8B)1Vyx&AF8^%-b9R z&?Uc>`43}0Z4{6u864hYmk>RF%19JB$#MPB^iO)(Z}o3GTcZk?{DV)Wr8tvBcN;V` zUmC(d(H!!>q_>MPicIq{3+L~uJ$9A;2an zzT>CA_fj*1?=}(gm+|yTlofZBqeK54^}O|3lggyV7OwsDlYz9oS_vDd>F@-zcM#M- zb1JqrCHtHSak7BfK`CT2+13tD&RgkqZ(9O|qFFLv`9Bo*qr{kYNpE+lhiO$G@I^PV z%$(l|?Ioqmk*lFJ1w2rMQN?4`K)x4!#ovthzopgqD9}%jw9JJwZqmHq>jXTgXN)59 zzc;_qH+ES4-K&w-XrE{M9$&%yFxPk2O~3ZAq)Va-Noc-|NeF)*-p?cNc|)f?o)z~a zO9J;MBmJ6mJ`%=gf6r$R4R%S)jY%*P#}(^&m8cublu!2px6)AH|JId&a=xn5TMlQ{ z0DjrUwi|m5TyCUuJjn(s2{9j*=Dytt+gumS38X@fJAM*ye}bovcn|}+MpJKh%J^vk zb=#A!pXVwn@GiUrd8D1WtM4ah85QSA2D@jmCfRz#YDJV?iiBAn^-r(aE}MJQ_;koN z<~Hs)va8GvIUW&z<3FpDL$noNCL9yRu^BpmQ~eq$?fZe!2Hb_pJc^+JtykiEiibJ^ z%D-jyH8zI=6!$-#6!-NZjL3@pAH8CBvR!o*_8ArqcvPOFR)b*pi0u?g7PeNad@GdX zG?N3r`>2oa^i!Lq`4+`WX1+WdQ@o)c+c!Fm$Bu6cD$XX%us6Js z0@n*~6DuxIN=tI=ZFt3*7>T)}LV&eu1n{vhv)^UwK29v*Zo}QB_Xpzb+NGVp=}#5% zU08lR%=IlIC`Y$bbH>&J`9K@}vjQu9hZ_n}|7hW^TLgpcNKTMO8~{{&9M#NM`} z75coolF4lLN9X90#~L^~7wasL-Lfa_V=j#C)gjWGdWNB7U)8d{Surjl<&6 ztP~&O3=;mwcGR-&FW^wB=LzNI%+Cdwj)wo*J=Pp~bvf(VBx6}Do&_XQWyC>Lm?~og zNsRM}V6;a4wpj%oUmlFc>2D>utG5v71N<}}yv}}~{QAa_@c>sD^QYKL%?SEom?|Pf zu=DFB1`f8a5xp9>mTbx5hPalmXT$I1bS*U_4qfKn@LWRE(Vro(tYI_O630#mfpVqQ$A|ZCyZ>o7xPtKt zxlPw`hFW%W-$Wr(6k8y;r2fY#Z{D>7FSUX!)zLhMEKo#adi{@Mg2V|6pn$ z*<^11gk4?ylkh`G^wMf6nYyB~k-JHi%R?WJu0hr#D*)dEF6I9X;AZ1Mlymj)OeEyz*#1nHj>=!?R>iEoDQ9W&mPz0rru67le{RZ2DFBp{1$gJ|^(i&k zD&8!UzqpzHp#F-vmL;)0%yYl)4bAHOQr%aHWeg8xZ4|gZ)ouH;!|>A`{_x!*?f%sb zd0qUPgS=?i-sgQXS&d^a!>|VLeT$2#ZGkORFS@Nx1~}gTG%D!%F>UtT6snEcis%sS z6~IekJSHMOz8xL^;2UxF5>b071Sm}LKg^|Rta+V*zwe5)B!1gzm(`ko{87D5v-3`X zPvsw-_6@p8eH=rF9`Cw^yIZKIHOjlsGMq=++=#f$>(1>TkfH7B>e7EKm1D}4V~Kc6 z)q?%RYH!d#d{6lT=<~hLoe-VVE`=?J0(IL$K=es&khLv7dZwV}J1%m`m;gkuM^a0eV0?MPlwqJap ztk=uQA+q(>3FM8_{DZdE5<=(jS-Gg4_d`?IWT&KHhXl_Z zs-P&%JqvYu+rrpMx@}FGGaCZOoh%=4zwp-tldivphEe$kTzi?9{5BKqKts_qXA+KM zOSRO<%xiq{VHE0yb6s~XCG)k^IySF$F`PC~4dkQoky?rz(FH~l;TTHMIg~R1uEVov z{x5+e$Xnkq@$62Ul<7J%ZmW|n#J3yAa1_duE`hfl)@QmV;W; zZmT=xc&RpR)3bw~>Xc4oL)NjaB~N=LZUNfv2fdo<_zW|}P~>I5vCMU-BAx{o9_xe~ z1%{5zO+*}1EhnzlyDU=x+M?u%`2ukK$A!ULqkPR|b$X-VxR`x&b!FGWi?NECr>J1M zvfRS5xXdFt1A{H1ixA~sFZK86Q>ZBvEwu&gO}RV)dj0z}@TJ<`98jCiR8QDNv`boaD=v!7;xkAf~UwkjkLsKNV?lQ;)`roD7BhHdTV-kfmv{n@kT1nY+(ZrbB!^AeqTkmalVTaVVoY{4*2qHMhB3#8>UL#W6Xf z20)Osby6IBH%4gcB2J>K>5e}H8FL}76-|pr%ho#v5`X=D(xi0d)T3QM;gVnFWviU= z#-6LHBDx^dIVj-WQ!m}4OEyY*{`&O7X)CdgjZMBRM*;7L=Z^cQM+V@suew3OD<%=@ zB?U4KzadDLAYq7IAXNxeGC!+;)O}W6RZ`k5Rf>K|jl`6V5hgehvv4(};fXKF$(J&^ zJoc1176gH|$17+2T0hc75OpaHkkqB$Z!%x8}69z zBBil}NnhLLXPEIXBlc*;$%AME$;77}XQ8yVp4>0{&9e<9Zw)Cxj(iSvqFl%OUfv~< z7EU826C(tC)8A9lBBJvRFb35AjlAXWQjU2h*sJmJ zVWCdRPn(o&X5dmi{CBB>9=+=Tha5KZdY-rznk(p1=ZTxEu)KQ}9HKb(hAr}5toX5Q zf(fw~Tb!~&84s`j<9t~mCE(H<6fr_w%X*?r{1*SJ+f;Oc^^R(osygUXGkn^+F*F#} zCuq}i86IQs#+bkr{rFn%RMRQ0;5L41U=E4g(<~7VU59A2)x>azl)N+y!~Zk<>4jqPPYJC z)rVwwF{8r`7Y?>{*1Jsm$tN0;bJL+2ehtgN6GU(|a7D?iBNXL>2`*Jwy+DPG?>khc z?Bj3yO?w7L!*>DKZ*eU3WLh5v4$X3bL-o#F1+J~eiOWualOWBouL?|U-x74^%xJ~$ zJ0QgfJgR$g6X_j*N&xk;Pil8v-xS_JfvqB>)~73k-`d{0NxHv`84x)31vzE`3QON+ zgt?#uS3$oNpd}KOMDY3l&QHOiz>cqGm8ub5;+|H#5}LO^LzO=Q(VXvu-&VV_cjL}F z_5d|wxL#vfmX%LjX0005&%K!vHrTaq69*zxIBu6ir~zpxG9HO4(Sm4eKB>No{`K^G z27b%)&v^MY6D=oiXq~5^&7l87#RMhfB@vLD1%~*&jA?&d;Yjo=@2;**xiy#-=L1Cu zug+2@S|rHEj+SPPxw`Cx?)!qFGKL>w1o<2#3jSi>rcztC8O&4`!)F>`qp} zBVO35HUQ<^vpcB?RBK|+zNWbBs|PpHU6s^C=aTlAMCBVIr@S=sgv9I)yb-m0C%Z|_04d7 zfWJKgCsrBkn-`@lh5T%6{!R;eDOP?0b6Krf)PXSH)b|j;kT20mY5^609J(TAsY5(2 z<2vY!imYlLXg?wxXW`d7zD7e1 z=XY>UT-+-1QtgEA%?BR~f}Ik_9BYFwyCO|n4h^IMLnhJx3g)aij<+T1(i)QssegJK zC`CLe5)ReCc+cLqC1;f(S-(>~uH{=`50)`5d0w4v@1N;*M%D2jW}m$=eZYlJ_m}b{ zXP91|usJuf%65gc_ZhA5nEM&B<}uYOIHiH-5G3u{n@+}%w(EU~YDQ^wz>qsUK z*qFAio&STy@}G-!22!4LX+;+9Tb=sBuQNlMctH0wPu7coUKHb(DK{F$Bi{vGl{B*u zV4RVpYJiRj$fq{N38U-rWBY1W+Z;;(EG}@Tu6G75^-UyHuw5XFy1)n8b4T@JKA^4) zJ{Az@?n(h8cha}6xmxk+i74!W*97B_>HhBwvyesNV&|Fni^0uk(HIiomOB)%J*N-? zw5gqzuf%<`?tWsCCJ}}A6nJ?yKq=VqDQi>5sZp=94_$7{60;jHx#t7;UX%7h-5fo~ zq+P_3_ZPgtkz<-$62q#2Z-FTVMa|a14>B%e)mR@Y9P_9k`q8h7l|W6G|M}~`Rg7Y` znz8Lw$xew>LbII~bLT9ZAbpS%=5&Wtw<@~vA1;KIW6TKU;WDRgG>kEZ-rRF|b=L)0 zkqjqw#Y9KvVVU!P)=NTDOklkVSD5M&bRc%1@#KK$1E7xl!b>P!7$Q^}Gl0vbq^4Q# zWxlv}DuFL-%3k%yMkdE~O}zTDlQ$StaM~on;fGoJ`L2Y0cV+_7|MZh;vH>t6Wa_^I zl*R+47+NVJ?rwCOqgqrVxyL}S^sTVk0sb0Vj_-8z*cQdTHnk8z&2NQdrS%H&x z_u?rUT&?>iwhCzjYL{;6T&MZ|M~n2-iVrXnP82vv4fF(WuhB>gcYFgTRuHGt0@_yP z3a~U~gz}?^eb<}EjqT8L`_MZE73XKKu0W11;r-Ij2njc=mIisW#zfDpX`L)DuYU$m z1+lFNfq*|>nsn=t=qk)e^~U9fu2Wwh$)axzlCJVoMjIR8VYNb zR3Ccuirj@d?Jg{iB>`K;o0HI#D7$+l50uS1h(O4_=JS6k5!i8hl69ikh{xPKA9R&p zB&^jX!C$r`u{1IS*rw&qpJZFZ1*bGYh##6Dak;&jq=55H!46Ny#{!+7N8N6&dO)io zaE~sE$1IBGOh0^=m$3X9J$>$BNs!m1dh2>OSvH(P^*^CFkFZ!REM#FZs z(JRvV1BY4NI?_P1E1DYaoNGG067Z>;9>S9Y4BNVlS;u@)?3!b!q;ZMd*Za zOye`;rk9n^1M?9IFHNS+xPEft`#N-QZvz-rQYOCR!tw7T{*(PzJhOkvRqv~7eCp*V zeP+!XT$G>SRjA~~ShxG&TdXLPnu@cM?Y=WlT8#619at*DigobA%poW-VCmf1Y}p?r zRB>m|kJKrGV92&+Afh!*!-Vm-RN%L-QG>6eeo~K~?(QdT*oMUk0_Ro#j~~K&SpW1H>~eQC719&8s~cPmEKSnB8U41dXG7^veDVHmS7wH_ zMu??}Keu^Z)&j7$>IGF^*z#?JG0VNpJ1ak{$&|{$1kOhUpC>94I7ag@Mc4Mx=f^yF znu?6qbH$G1eyGb?^whKlOW*tB9xqt#-7VIic8v7aBJ0OW=Nr~Cd@OfH2|yR{o6uh#d+i3gq|Iuskh30j+kC2&+CT-?34O`TyEKPT?`;N^v zitrr&PG7;3?W!&X^RsRvuWa-6#Mg_+p0j8=Ob49?$}KQ|sTU9`JudxM!=b{D4L{bZdK9ejh!p zkzVsf5|c|mUcvIvnC69-Xmy~;>9Ti@mJ@@pxjlI7cWlKq*B53c&Md(Ei<4C3-tO1? z$;|RCO+T+@6EH*He-XV>DANV>0oN(EsvtD|-_w)cdsm&Gxn@YpTuMSWIaD^c_N2*D zy&o?YQnTjGFR}e}p5@!#fA$S{Gp{oz;Jbj8iF7ec4AWb(x8B!TF@RG4D^u?JW_ZJ3 zwsS7w6qQofP~s?<6_K-uYg-Tmii?{MPVOSTJY$-u^|vJ(um~~Ys`T#5HHYoTe{142 zk8kLA^>aSq*m9Cuvl$l>rb}F-!!J>jD6I>p$yB(X_Z4APFAQFxa=ipmDn4D=4@x}M zbP@E3mR>a^`*zGNzHYZqYdd$8_8wh8GaHUGU-;beir9R~w_@!~5Z9{--3~+JE6+N! ztz#}Sih^iZZX6~xZ~Ea6W}tX8g91{TJHvSQtEIw#L11N+(W-~eGzmoD$qM|C8! zT~D-^dnPGH$hfw8gll*d@5vFX!2+}sr@;Ty)29CmXwcuSrkd_KRh;|bX&yT$vT5|3 zD0&F`Vpd#KPI(npZ#q_GK0EjuF-B>8knkoiet)xrv@@Q(PcwzfN`L*i?Nh&pX+12} zybuqpl-V*~;ABaA{H%y?xA?{E!(VJd{l&Pp-8Qt>4O*^J+b2s~BGuj;Bmmwnf@gr2 zZreF^cOl;AtWdTSl;9hqH#V5R?r9$oe%iz!j!>ZkTamERe99Q?!CQ?7m zoafhx;7q56dRr5$KeexkTvw-fwIQt`rw-G7m%M3)b!kWkd3liE(WVI}HL z&%T1MOmw(~u)^QO9XK9%r@5*>vEE`;Rg?OOyx}r^Ag=C+3r3;X4aI=E&7O?7$=S?4Yq@;oG4;q2li?y2d1uLhUxAbs zZaAnZc>L2M(DvC3%#b?$4&q}-wLrT?_kMp`xq%9PE!;=Quz=v-AV=~>nL)Km7lD&^ zT~=z;KgjWi+&i|#nI@x$R<1elsTe<3D{3w1A*t@sRQLBwpfc)JeWH-^A&*NQ0RfYc zgU;Q_ySwC590!-o99{8ivz@pH^Ls)QFon~Ndc_>@3iQ30p{aI`qw1`Geyw*V#sI^! z#`c04)SBS{tM-xK#fPs`s_UEM4B*aa@*KiZ#sdVp5Kc-$LF39KfiDFD;bn3G4-VkC zL318>zAl>cE~VNcAPr=SWhBv34sf0vnCf$mfGb6~#yfF&a75reUmR|vZ?52` zwNtL-P@w`H}`mg2UuFUky?Jnc_$&cXW!_ir!nH@#8@ zex4~(+a)G5@in^bLQpLkR>Y=<%;zME@L^-uq{FWM=RBWW!GI^7ndNOX!8Q!yjt$ZQR%?ql zbuFw}8~*nCrkY3+j2S-P7=~UPYjENjfn$e|whG(%bFbI2+I~}MWxLB{Bzqs)Bh%2Y zh6z1>naD}Ne==-;&D=h2d#~lbmY){>>#{;Qb*2-xG{N9AeZdV~?^y5UL?9qiS0po7 z@p#1??6k9=)P-9RaoNbm=!|V6j^x8y@BNautV)=MJ7%ra#GQ%2`u<}4ykcMEhv`gU zPyDwozB7O>wiXuHJ?!T$hi%i_r=Jn;kHW^K|6HjqWmjCa!A@~lcklan zZGTbPSpf(8aVq*bAUZ@bYYjx)v^sg6=wk&rB;@t=)OqY36=-=G;suY>4*4-Kmxe}g zY-vcuiaCL7wN$R)HpqjX$fCGduy5RFiP7}(bAPdARn$0>VAQ2lL|21_9YsxZdN&3Q zdL+eb5q}+Q(&3C+i^Jph`;;eM@mTDj$gP3yONfncD{)3Eqvwd!Ni@Q(A@HZvi{ta{ zm#ZF!lvvb|=60W1Jb`Oyr{frq`V_Yx8>pcwr_b2pxG_DWm&N|haWe<eqYz?d0nqn+lZ*ogURxXemBBQ{*a|f zE;-N{S7lYQ4h-Ge(?;ECwOa!D&n|niew@`OS8<%AQlMq6o570+&p})ZX(iK2-9g6x zO*E=v_{<7O`bu~1Jrk*vHb*Byh4j&kbf?xoqh+XP!;_vgyYT9#oL)#8Icht{tb_n) z-cns`vu6ioM=^3m)?QC<87p`YgnPjVDMU@(BErxt)Q6B4htBd#Cr1W%QWz~6u;wW# zj^$nj^=A-CQkZ>Yf47k4KE1Te4vAQ;tv@1M8s0GTJr1&=O z_d-cjbR}aM<~iA?tJ2AyfEK}sjh-u!jl!fzd52W2jtX& zKjRFXv^f!Jk_0VwZ??8TqeHYa8J~VUTgx~3b41tA1#Q`b-5UpLB5#cI>&u`>&EDRd z!hN3RIK=Enencf^%h7(EF6ZF1Udq-q>_WYhf^SHNwpsM&T+tCd`N#bEbo zc6Vao7jxU{jE#@A=PHE#?Bc`Hpi!P0FaGHS)!1WY)W;KTw6iF7TCw^JZ*544xECZr@X<%eY6 zWKA*jT*6H<{57&Or9e`)QQulAxrz{mi&)viVCBkjYt zV1p&KD?3>BPXT*9$B8$+qGt`>UV_=bew&OY-<-DnD&{f4%@p1 zf0`2C+sy0J+#hB0aU0Rz`iJ8dfg+DktS`}AiZI0d<=w?(H-e-_84iopp_{glO_^3#onlCMg zwHdO0{+N_FM)mk+1lFRMA+i>$v1wDqbe^4}rtxd(^G24M`;bAgnmqH?f}el00Ehkg z6wCHxt|#~j@{M1OwA#SEjN2Qz7iKTmTZ<>n~$(5dcbgsSOEn`3Gdc_ zC0`{qaewV?M-iF|J6T2GUk)elw%KlSHtez7;ci;l(`AdvP^{P;X%6BP4&NQ7u%-T% zc)duZ=#C=`;?D}%p#nIND$+^6hbsoJ-p8AU#CIMmzzvL?Az-WKdJ)(K`NqCy9+TbQ zz!lUIqcomu9rjR83oa7BY$kU2xSgT)Q`>1)TE_k)D*g{NgI!lI>Ql?RRN7Gvh7WFf zS6w_#sEusCm{GOXbNH_dXQZ3i^WJX@yb&z;Kx0$9X)eY7$GeX~`V-Nc(>;;l+QQ9I zjDs0-bvfFo17-5xR7oGSOsRY=-&40|`dv(4kQ?~o)5&*vb-{*fN4OG`Zj;97faepv zH+%Y&LM!{B+sXC!URgXa$Gwr_XulsC%%c>#&z3(x@JwrOeT8E;qFX@E09{ecClpgQ z=CE9>ij`V_SdvI^ThuToTVCj7d{;X1ayOz56d8P@)euE5R}yg51nR&mvpl#TpntClT@nP(Uwg(~Id2$f4Ih zbAKYQDP65?>+}qre)@RfkN1Ob(tkJpah9%h$NpPnta0+zy2ck)L_^cG&~NywAXOH6 z$*%}9oD6$5zqt-jbvVccaudv>rVZVl2R`Cm3A3kEGYyxM=7IVhhlct-Gjd+=|Y zb5=i+D48SUneOc-poj$iwO%79QM@Ucct-b>;PdgzMTFT?!qeQUeZl38X^fi1eZiR# zhIlB_&QX{vV)K;?=(9|0Oc?USgYdbr+A5AU&%#Wxf10{53O|mXDH27GRa`IjBo5*~ zeU2Pn-n;!zp;*kR<#^)!RMgxTcpP;(dkAFnhy^jHf__1Tdij0R z$Ysz1p#Z@-j*OKx#g`fUTZDY6B|rv(j4w$(P00XUZ*C%yb4^GwRZhYbBI?9)!YOjt zi~Q4fZ+~r`K{m7z#Svyxbj&x6ldr6K=1k)~e{r8A$x65RFo~P2-cQ&%CDnfC8QMn! z!D||`msTk|>>KX4d=ae)V37y${gH8WUDP|oMDQ&z%bW_o`B`=wWyyaxw}S3Bc0lf6 zH#|rzvLWizqph;6pFfOXlm)cI*9_q808@)gT~wg(+rwjX>g*9N_B%xCGsAt7+~gxcp3ll6tm0zk&j`|V5ekfG zt=36NZ9dnl2O$~^Ib+M^M(Es~De1EE<@Nh%p2CI&`*rv86U;7sv;pN9j3A_Ogyu8~ zrfxnG3jslhp8&Uq>Cv^V6jo?kHkR7m(9*D)&NlZth1vE^Nk4Tj2!0bg#R}j2F-)7-+N=MA(?A5wNm}DyF8BSEIn-?qlzh1SIE09!xG~ffEHTI5Iq4iVNzS( z;jeib$IeH~shj2!e3pqWv2@Aa`mb`o%WqCr=dufg9`i&v?LWXx$u&SBy)MHDT;u&t%KRW zi7WJh&mQDtHL#H1lV)oW&G$3dN#c%SX#`1A+@}*sd(cJnhqT&D4o8G|UR!OA(ZjHRo?k?jo%$&qdrH=7fuld0*m0xZKk2 z**g)vXecgk&w_8cCFb9X+5ric)Nl@rD>f;GG~V~24*w>S!Bv7@&``GXVnll;(Zj?~%<*|GNhY7ACC&T!w+j6VKj{ z*KXm;xtjc_Q@$)P6soKn#(24#c!;}lpeRQ}*Nm$(RVnb~g3r!@1 z|7j4a+Krv{b+nM~30vNr&}{SDb+X^`ADZ-UWlvoC1j%>aU7N}dc)z8LOwRXtC+d{y zu~&^_=vA02{E`$a0c!ZPnd$`t2$0Iy@{4u3fxb_ft`~g@^q!)Hf)}!y-Ol!Wh<6@5 zBhq=L=mvVZACgc`{%)@tY7z{Q0~31*$(Tt4=U+>KX47wqaCL?)sJZBn{Dp3CLz=#0 zN_-_-eL8g6W2!5(gfFpK37$6N3;jIqk#82@#;QNqIFLogY1HI z&rs@K1FL1dZaS>2@@GGKJr-65p5 z(lTqGpj%qwlGiB6mvOy0&pQTX*x2wtL>(G(n%X9jnaU& zpmtpBqk`IniM!m&wv~SP(Xqz;rik1`uXdsLmX`tNTmn&wD!40e_A8OT!(j*l_3cu- zq?R+doDsSm1qNN~cYN-~ChUli%?6_EBIy{9`kZ4k@+Z0G%z^vHtQ$(brcP{-i67loc%y4{=G_O0W~XclS94F2b0q7i_-kbjSWAN=bsZHskkE zcOLTYC;vNIBVHeO@d*160{aAM`t}XB2%5wuAb=qPl2aEkyNe#3JR#a5!(GaOjK}nx z`_|}l%nathUENU-zIWmsI$2tio**Mv*eGOYvDT}1foEt(x$33Y?N^~c8n#l5hyT8) zRqN~m)_@k#4tJ_jB~+fhX?K3}yPyCRaNxDceN*L~#Zy_*GzRq%Sj$%4YOlMRh{}#` zpOh`9d9Cup7~{xCkr!=9K}QmGp#~%B5T(%%z#E)Y1eGl^K2jdCGGaepRpEFbGT&U` zZowdQKkxfF#4|RM$7>)pR|Z;!vuQmul!H2WSj$sHY<9+vW};t;2BjmV3K6#Nqwr7P zH6*2e!*49Bei#;als()1nIo(d+=ccCr4IYGcVkNTq9$zvq)X-FBJPIFUY;IqICbb~ zc(>r2+as4S#TVah@TC>%;I+{!^hf&pYpP19dUB-r%=AB+US;e8W?n-b656&Scw55> zo}wfNAfsZ|!y3iY<69%!DDiSLQ|$Ku>;KTt_A>8ot-`mb7Jay@0#Rk;u5=u9eX^2T z_&s%`bhEGHOWx6lU2(`p#}Thzuc-2&h6lT6kzK3#|3=OFTVM=IbSF92Ue+z#P)eNL zQM7Sic9OE`JDJ1%di~Kaw~gf%Q4ymhduRHXofD`n54+oMxf9!Sd`i5nCXMay?95L@ zuo=*!;yK%$wy?Qjs`7wcK4?-tLG-m(#4eUfO_OCkRS1$3P`=KkL;D*8GO@1UqV|69_&Tvy1G|3;(5rXBjz*;&oOb(YO;Z8u}DBHV=TTH@G zJiZU|ChmuA#8okWC%)Df2T?C5#f(n!#;&j)B(M#H&|DbJ)q1`9Uuk`@CY{9m><>OD ztVP>u@o&>4&G0E(&x9+bqwtRMi>G$_RWsbR>i&`?E&MA#&ic(ajvt*od)cm~JdAyGA{}7@(u}B^vwxmf&2T9{-_`5NfL3IhJ^iWGh_@-})qOwzqh9 zaDdL`RqvrJIbf+|Z~U=re7t*1wWU3@cE|eH$4x&ARR@D)&OiFbIwGUz+x^h?|BSE! zm1{r)rOhqU?rwo|vqb%$sTyz1JP)CXErQIJ;S$wnL}a)DTwBJOXY7Y-Bq7HYb~j@V zAQQ39smW!0Rn2$GL!Y?0Ba8mxv8yEmJNSy(<^xsjHT!SyKf_Jann!$c_e{U6FvO!E zo${~J@GU&O8ZPVYvczXr9L4eth`b}66^`_s-{-&^0c)FHJ-fl;b^)>yKCir!|C^9H z)+{F0W_z{&cE*VS$RF9T%DksK=v!d%7`^dKmv1}mH zsHD^Kh0e}fooI9(aAcS~9=Sbmw}FXor`X>Q?e}pEBwBWQ+gBjFaXJBGW=eQI#|Ik+ zQ9JVy5KcSPTLZdQOc5N;Ja;)cvTIX@AuBf#Bkmj%D7&{xG}Jt?bZw$}x#ws56_4WCRm#jgpPmf_TeDtU8Mxk2 z^AoupmXzQ{7_hcCdE+4vcPDqHr{P;s{Ly^HuN}lE8rHf1}szXSdAY)hkpBba$CM@^&0@M#bR? zLysKgJ8X78Qe%7W!ztQE8g9EaJ41gV0$dCe8F8a!m=~3EoclC}{RbK11hx)P!|q&6XhHl|6{p{ne| zV00C%$0waF?y%`jYM)`?yxc5R+bWibMn^hlwZJsTvqZ(ep{V4>Zl_6_@%qJ|Lf z1!y|1`O^G}OyiVs6%nYXy0*Q(U9PFf#fY!=a~@qqU?O(_t_T}X7uSN z$LN~>MZy}%EL)7aWXminF-kj2-sk6KdZT62Kzenhwm@z+hw;yJS}~vej5VxS+!Xd_ z{$sj)^g`Rl`gjHKl;_;iULYC&xXO=vj)w!&zPRMUoFC6KCad7NMY#iXu5!I(#Zmo3 z$I%_j{8bI@wr&HY0Z5|nh=T(2EGM~1jpsO)(2`uF(g*okbZ~*o-2Exfj;S%v6Zv~* z02d#|u6SfDH+}`z{a3*?x$fgHSO}`XCbl|F^D32Ad<*^EK*7`~qqDVk(f;;~y<4i@ z^V?OwT;oV~x}2r%-A@ZC4%@MX0>*{**0IY#+vMJnp2m(4|GU^vS)PT0^B)ro6!vl_ zz{=72y$v?lTFDA&M-v6&r*#ALt`TfjrKT)0T+yUmAbS0G077nRjAJNV1548(`1 zp+JE!qSGDPGo&&lzDX(O{nP=-FZfR7Ck1gjFD4ku+4&B5Z*>X{EA>`;+FPu-v2M{$ zU#do`gypSXMj5rvddiz@nIh6uiU1$NuRI-pqKnzUeO+at?TpQkVm?&J zS(WAAhGXAn%_}I8jv99M-rVz5Jc~>yMJ2MQ=uPC#anE(8)AB@N`)e=mXFP*x_?frd zT3wPr_y~WL+ z-%d7m%ZWRdrnHaZl=4i{V%J={vkC&wPUo~?z(w3hxK=GHa`%r<>A#B5dcqwaWd3+y z59!cAF+JP-by_oh_o8Q6K!eHohS9CP*(>y#_eNpNFW~LYizM$6LQVCzZ-9dZH!FF5 zA_mfH^vh;;8+p^Z3G;IFYPoG`&uiG8D-M0T+@0C~G4cqdBaoyXJ%-#6=5>P9{Ql zvpjt^>)|srhttxz1}d;*k0#hco?>>(i**KdmB$yaYL&_3}9%zqNj=8d~3#2hF za`=}m2(Pn07}-#7G81+#%ez!f&3XNc{n8-jOF20?FV>?13&^pa3I2-^T0?pmF9}WU zTCcg@b?8<}O!jV9t}5f1lKqF$0fL+&U&pSB7%V|Wt&G=V*Fsm4t^chwrrFo8KYyzA z@Us|9J}DX;eYLPj=fZa_Qmx+GUS3`p@PTW3@Ox5{_T(zYSvK*oyrwB~r;N(dkY{~* zlSiSSo13gQoX z4FgQS{e5lsgEY@^`gp|T!{P7jm_s&0diCsV|2N6QDQhOe-iic#^QTx}y0PMVbjd%W z@_0doFjXMwRKt?~!^jp=ke@7%yM1#2)*a~ry@T>Ki5z%D{=iB(%==45seo3r?bkV> zgA45Q0(!j|@dB|{XLukfbW>?PpUchXA&0P8xE{(NGZBx zzs9x;MN`{4&H$=6I|6N9M0sjIl_E&w70d% z@}&6t!DxyUE)($*CvkGU{_oV(wVFWaSPW3Ggb zGCExosGf&D@V1!xe1;~B=~J~MS`$3_0U2KF1bIL2kAA*pD~CMo(IS+@K#UaA8-RYt zit62oErP;a|8R`OQ*G&4IEeM}&RKC{l!~0abnVuwuTOrw{D=@<7_G>jtAe#x`ksxq zRiQ~UocJ;BU}ysuU%;1hT;HSIQG`H6g+$~J`!y-?15|pSlw!Clsxc$!VFjbST=PY~ zd&8DS;k|D_o$;93$$LzcVDxrR^B?aeN5RMC`CP+^L=SUD9g#(=yYvgJ`7OnZKjoHq zurEVOV`-@duO0AGvfy{0ncUuuq05YW_f9-ek$GA+ve7b<>{nrT(wZ+{yJhT?##&z0 zqfX_SXc3lgO9n_Q^!H}{;A|CF>a-&==7Kmww|uocmVYKxJvyiQ;BOLcS14So%1(Kf zXtl6SYXxQ&cukq5CZ!_GIS~9qf|UXJ_g%%XV1mJJew?Fb2&~a}!NrQ08sNHmtzL7< z!Aiwi-6|HM}{)1=WNTJd)a73g>^n?ek z|AfKjo3D?R4{P`9G`ypo@J}fp8$pe^m~QM^v(LnC_FA;|B@tc^MtA5t(hjb1yu?FI zBDY2A2k<=oqd;e?%0aa3K&-e=SUBKO5Bhk|G__UtB2)klQ3G~Y{RVcNxR$%zDtOK^ z8X!x#ge_rwe?A9|ndDVFT&jB^y>ZO*!cE%*ZmyldiGT}^6yj;mgq85D3Vr~2l#vG4 zBH3G1mD%O_v!;~By;S2LFyWrPyv<0JvDS7pJYL-C405~t*BaCO>yzNnE`9m++47QJ z=3U{z!y)vgY^2k-mqZWTiTl=_7sN*^54f*bADV2=YE7Trox^AFwWjhc)t64kCXfTo z^Y)mhq4=>xeK&$rePC`xgM8)La-om(?ynKjGX0@2Rk9mjZtYh*GR3}br+N>07Cx`?%IxY!=rnId>l2Z7yukg76uk>~?gtnZ!S z%St0IQOU9?KSqHuXD&!51baq+iM~?Ud|&=E|6+=ky0gjL zxXkBfUiW!vn2N8P!qZjA*My_t)*F{&6Uuq}h0VtNA1TkTHan{W+)79Z6893J?0P^Y zO+j#Bno{}QX(il~Az0>gGpe}tC)h9PZ0AkN&N$d{!0p=>*DbqQ$R=_>)dE52%XdR&T zGxmZJMoajLwR)tEjB$w^vlmzYckY=d*{8=>E7PfIB3K_df$_v~=|NxBjcr(Iag~$e zooA&ei+wgMR1D00fKmby*o|#1p&x1i0e*|i+k})GiCDN?|Lg6Al)$B*$K_~CPDb%pT!v01vuDw7{ z#AQ84>E}HVWtOT=jcrn>Q1;75L^>`_mXq=sX@7`L^em|8Gk!w+&eZz1lPY8{(c7cJ z#H6PEKXrU^4@;B z4IA}Se))2R#;d(kBSjXDU5QwDZY<-vBH* zudpX1I-`^1`*+~Cwl z^3b)ttI*9KsBD5B?#p5#aFaSw?99C#%P&*KPssU`pcU}cyDl|qXEQ#6_K&+H} znVz%{oB9K;F#hE!?)1x4hFKJuom-1#qDaXST&=aM+4IN~ws1WiRv<1L3k~U@A)DU$ zp$u`5F_!x}E%yxcoVzUI&Ses2f8UB(x%Svp7S|$nYfDA)%#q!NyO%c6(GXB;CUU8?R7i<0z`DjA&exJEl)ZUEAAl_nZu4;cKrI}5qQODE?W1H zDdl14o#MF-Z8B9n%lOsmRBJFE6|K{B>5U>>GxGPUfpAr(bk@J8j@5w1FKh3^F42jc z#63&9OmR}_MtQ)Z#BGracEL$*BEnkYX@GV2s+iJ=CPwQ0ML%X|L&t?xnOx>#>V8_5 zdr(cZ!qbukD@TBRi;?iAnS(B(+}84;{;@0;fy~SHTdwvETORx(_s35xDLw5%i1@aQ zS0zSpx7a24gl)#euAb2FIc~O7+N;>jK|;MgMKw}g+!_G%RqzYy^6samEt!7_H~qZy zH<|ZuC0H1pxxBHPu_S0UU`UOJYGIRy zx^{Q;X}LNoX5vw*iVw+tv_D1d5pA{<)PjI^Is3205H%;HE}larv7=s?>cfIm%{pt& zz0Xv^jgYNQ4R&f}BebzLJTAopgvy!cjEOVIK6ZPkGo7(@%Gjt|Kz$mj$E-&=2CL2b z7`#p9&+DS>EUIzpnl_hf2x0Xmj6qzyZVxeQ8^#b(B$=^hOnJHMHwM7%RGORwA5R`-VSz``KMwJ^G}(*TZx^k%Dx9FUi`Id<3woPIdMcbxHCq#kCq#?_GH_| zGE8}?z5+VpP^Me_L>!DKU`sRu%lcc!>N+Kq(V&*q2^$8S&??9u3%Id8QyE)yFD<1B zdS1J*>6p@!uk;Y94l=}b<*+csFRWlcK9UUE?spgmQj!O_n}I)F?^F??AYJyJ24RX% ze0v5aQ>>;7rWZ@a$xiKIc_@#7j-6Z54~jtHZpZ+EwoP~Nt_0MxEex5#UZ5}&=puMF zKO*Am0`*32T{>lqeP3|tM>TXBU>wOT>@kJZIe(!c*CsS{K{YMRbG0(Z9>xiG#qc)l zCGkMMrH&sx6$q>)+cSfzoN#N|Qa(nE3qJpQPo|pOYrX8*$DaP%O0{AhSg&pWUL1bDggFdT+(yN{TdSO@8zss~ z?6>O7Gs9ltOt+)6=b6dmf=s21yr}MhRPzH)+|twOyw;WQJGxNLv;w`OHgz>>3l8tY z%(VxhDOC8ttKhx2{7bggyFa?i??>uLe<=1{NW|^EO2CxnCN={pTe&?bx5{ z>xbuZ!aX-=#LQWNvx}l@u4!#Q)1B*(M%6Sz&2yp#s3ZUZYDmtKgUU_);Z2oxoR+`qe^Kz7?9TGvcM z1j2?+XI&7`#vjhaHmvYwfU|znzW?&gOJ}u=^KY5qUOEzTC!>!~RSOSJHv)tcU8F~0 zC+{_8(mY!Y8Q)x~^l1}dj%!A=5Qhf=pQ=rp7{Oe!_8so0ri{4HM(tLrhN>}$DEZt&Q(KeIko@$R3i8+UN+WozHE#Z%VI zlk$9_&+zD>7j5e{xKmrOW%D4+wM_@!h|XKNmUtRz|? zKl6D;xe(h`$;j7utiBCK!Y&&7XAM{{OmFM?Vq-Qy>Z1qG?>m_(=~tItE#;mXX0`%t z*m}03gl2MR=RMC=F%VG%6WOUSH^wI187PIsp+@;K;#Xw+$2^eAM#h%q+~w9M=zCwr zUivEWykY>x8N6&{Ho@cWCvLj6%EQ|EZMd9DQ>YHOEpc7WNk--mZbEu z)8s3;;lumUUfv|Xvewd5fv22_6Fg`= zjJ<5G`hS)k#`jIk1FKiL?)^)qLMWtz)w`v1h`db z!?n2!XP^BzEeme6)Lxc%-T)BZw|oB3Wn%^!t9YMRIX~^km%jjdiJhzxMh=ahKBOZ^ zyu^OM7QU5_GP8+q-s+jEYVefZ&sI5hx4*c`^Via)n)Kzu{2-sjbX|qhKDIx@r3Vu{ zTHCkKVYu&K#Kjn<50WpoauBv z?!U4GB|q*?>f3SAosop9^HEG?jz(yoRmGHBiBjNrYsDPr1Y&DI(R$J%-&US!FVZRZ z!CCso*+{iPYI(NR%NE3B)X<10{J;rkai+Y;x-V$dp)Jc42PzmDd)+xXtP%$xk{wkEcdm0u zU8oolh6JPYcs485JB>csRzH_x&@9GqXsnLl!$U|C`Qu6KpV-z-&PM`%~ol)FH3apkNs5R^czHc|CYx;ZV6drw>eseDcLQNSjFwjLSw_q z6Fngt7v7jJQWso4)p9n4Q^qB58kIjE@d#BR8!{@R4*q0J*PUAXj9VEk$A=ay-XYY7 zdGo`aW$f1w@|4VpqdJx*2V^+BSf-TRmzk|ZHx$=ap*M)@Z16ANa0ksA4uo*~&ZqGmVFaW-a8qE_prs(;bNUkjR!ep~?}FZ@L_=yjU6>tI?-Qss_4Z=) zfda{Xqpzw52V%cizchC54Y1p)jpqR8zYDSp{fYQ@+CQEp$e?=hHMTTG>aC$BwMMki zx87t2AGO=P4ylOLsUEWwGGg1K29HHf{$d5SA(JHW4-N@^ftOsAIu~T=X^4i zUpr{V=3$EkA7k;Z@8XGT-|b9JUg41|9@dQFd5lVqzzW`vDrn6xw5ERC+*GgMynuty zAQ21x4AT7J$ayDin-m#X*WaTGBIJFBTldMEK3-#yt_Zj&(vfk;$&VR zTIc$nkVTGg$=)je`UgoLSchgP&SCF%ZUeYpzV=ufI7~Kjv62qubJgvWt;Dy-{OR48 zP4O3fIn6RsF>EvJ;jV{-VP{MiZ{reWrF7J@>m5vu;0;JudVFUn6Ir zC@39-vd&LZaNLC%Kbn`gW(h)f?{OS#Escq17N-2igQC+2jVVo8 z5#Ilici0jLbacjS78x9deRjfbCG{M1EYMKnk7d^iCaMF8kKyx$i74f@EydiAE=RNK z&Bh$<9Ct9*p{KQTo%mB7%CaHKmjF#ICB5nP(69r7JhHL<#DaWFAOG>GT~w*Ytx$BA z&qP?LqA2)Ig+D+smvkB#&myiyVwCJ3D`S~B5{+nE31V1&8QXYlD`o*d7)4MShrmJe z5;gZ!ik^W$h4&6jbrX|CoWV>-Z#&=@Uk65RJak+K=lE9*-_kx?By)?jms#k3Fjck$4U{%~BY!|uJWykAi2J3H zC}_$}tW$(_c8&>S&S+cg!@&CH@ZV@3*>O!Z>3qJ(I(M6%a|a0kI{gJUergqW4?t^)G$d_e!)XWfN#9s?_40wdUImR~S?m(=Cj?()CM&&9 ziT3$jbabta9`K7*uT+4on18M^t2x`CLRq?d5`XxyFkAPWS<5ld6Y_6<^P~;J>9m7O zwPJ~3?)6~0(uV;rYnEeMi3r}duRNL!hR+N@%iYu)CI<%7$-WVroUMUSym8>n3uH}^ zm$$1(o>$x5>CL)4cP);{@VEXJmxxcZnfQt6;6J)b+w&lQCJoOrpvh_3U?stKe)(k6 z78UrZ(?c&^8Sy7)1iXCyKU{b9$Trvae5E_PS(yFr5|>1nfU$C=0d3DyduMq?`c~}c z7Xo8Aq(m%wK4j{AfsmPf`P0r3ZK3qGy{^}ec)hO*gBjNQlU~^xb2|I|pX{X`_Z{(e zy^4NB_#3Y>KLqQ+J+1O;1d5FLz&3wXFaC@aT)upp>SwX{ME?iB{#eT|iJ6K^{(mM@ zmI@WWLJB1oukV|U?@eyOrzK)RPS5CELyd>IsLAzVa>^q5U6oQE$3}-j4z6||`FvK1 z^d?(ZtKJGWe@bV<+HG`vb;A1;^MKi+1)<0jw^$?Cc0phiGVNjNKkxpQWL>1Xkqsx} z;sT4^7nQNJceK4SOJcRXOzK_tWsGw?qDK*a=@!TSe%Yl8V>2S`l z2*EvTtqJbT*Y;RQUsB4Xwm2$J?UScj?iNj8f4us0hGXZ6KA}B7ZF1xTJN~1p5M2dk z*6z5(z6=ZGveHZ+Vm>l%@Nw30)bUi?@GXVuJGDEkV$Wx+-BHN?j}=?lD*tHg@7WWs_=OULLqK22O5_SV-*ddX z!1;{ZJXi)x%`46qDP) znFTvCen$mu=Q)9&N|aDSIyL#>=EZ8r`sZ!5_amhv2ZwkEfdA!E?=b}sn6qU_UhTsz zc1E1ZGA4Tm{q&&3h$j8MDpOVKyfRe}qV@RiMrp!_aZlzXYv{~b`FPLA!NR+m`2lV9 z$EW@=C$`oml_4*+>^=1(7TWj8ka9NT#75hRv1dDmEt%+8wcVV@Hii zc>1_MvL`P6$Qao#zSeTxYB{L@5^G&zo;UWiY8n;kTKUuXV9-45*rvguH$ftpm^HDV zQ=SWcu?nxtK(vZGHLvdZ#Ci?)O?XJ_)RZb0DIaa(V4T~&!#AgD^-A2=1l_F?Cee! ze2wRgQ1Sk@l-F95*AkPD6)`(jyg5{Uk>2^nVauSgNulzX6;Fq`OFepe0rX8L*y3Ej z#Ekv=&djm*Y}fl;9UhnPf8*5|Ma;HEZlv+;CHfRra(2NNBDmA=e4_E%nG?DZM)K<$ zMuj6DjEAqfY4drof>y~a7}(p-e4xHvsQZPTu6-JJC7GKdvsGRdf}=h7#yIA7U>To!s`3EWinpgcQg zv@+BDt4C(pry^jxq*7s0V_whB!olu#IV>N^g4DUbc=etAb;0Jl#gP}GQJ93!8;!t% zyEMVzwON0`nFd&o6!`TWRO}f+wb?$$Y6l^SV_d$ruXZXJn@RLsL=-0v<=;o0&35N; zIFi_K$|~)VphIho^;m;@&&Uh??5tP(5Hov;un_6O({Y_eJ3cq%@5GTKl&{!Vk?8I* z{dxX8A?zv55;B2j_c%ZmDuOLsb6Y&43VUE29tXP?eY_|4w;tZ?!Wu1haB=}c=!-in zr-{}nLpU!zTNEvVifo{yW@iye^VoH;v(cN+m18(HP8o|hW`Mj7486j=1 zKyBCrkVRB9-{t-+>+Zhh;jhx1bNd`U=)MXP8WnWs{aQ|y&5{yd8;Rp!*L20o*fjyI zQql7=Sy9PouW0@A;S{rlg28JMO%M;@A1fx9M>zs{)b1R+7R^BXJpuaFb zK*5@v*FWHwwEdq|Y}t^ub%0ZqxMFP(UwR1ZV%UnM8;3g1GOtb`AT6srICiaXKsh9qYA>^qApqu!Pm0n;w{4!g=)_)F^0*$ znSZ9QB}eGm?|HSPFN`$6aMZnf)s-eK4}xysw6I=UCp0!^LbL2G__?C2Nf!FC+~5XR zV~0X9i0>Y@f&J^rVwi@N33Xm$#@c_k4uh!^X)^QQs~Zx<-pErQ4GeDbGDz^CaHq9B zOoK0a(te?(8we0|?N<@sp3 z$tPX@o`0r>iHS4F2RsIJv3`#_+IS^vMfst8b?K=oQEO40pa$;G5+3R;l?nKNG(_{4 zfv3nw9~0;XP#)T*a4kJMq?c_7GqnqyR&J8tC-UtB=@DzkB&D81JZ%we8u^0A)RYF_ zG2XzR%UA+NKFOI2{!-=RN6^ZKfbC`>*LRpn+Q-=^0Z?k+n-d+l61 zRgOpEdnulF@laL#U!T>D0IF}>ovnNU;y;K=D)TnwBL2|s(PXR*wzxmEZvZG|k9802 zKt`_iN0(Y-OJ5jYei7|9qeA+arn7i)~!{OFC?7o{_NQ`!poSM~}T0S+y+u;Pv#j3b>Hp0ofcN4fzqcm8<9rSOXFn)eb zMq!dxSEt1Q=%Ll=9?Y;dV>%SB=}-I;+;-k7Gvem45TxF^G?gaTNbjc4QzJUTWb}qy z99N9VjvC+M8t3nc?D=+dmCLcK@*Wi}rPoW>iqZj~%&6tA^`37N2TtKX_jSKCj!9XG zGIG3weh>4(B_eTJ!PsmQ;~)CyvlXhtc+w_-b;)yvwjwbsOKLB_x}$gOJCAL!&Xcl( z+Z(qxdNF;to$mLNhoIhg3WrY0k+=_RYMms9cZjnCxBJJ>A%lOj?S$yYO-N*84NeBtFQ+;cmzvP&EQOx1$cRb(WhUR$Sf#=u2Huz% zRjpnc!_SMFG*@Cli{0dErEI^>{YrG_8skY_XIu(s{O|DYZDrrrGU1Mzq^%Wf!*jc$A4B^-Y>QbCm;o#AMLRU-OR}vLIYw4VA*p%q7&kbdz3NHGkIOj2vq#F zSd8kvEs-AX$T&q3hk#*>NhmqZix`?X!BTd-{7!oN2I1X~Ledk0j}vBh&p%!y+TG;Z zE7LFYlQv@&6Leo{^uk8z*Jei{A0-bsxMFs12{@`Z8V?@r)|ATiGT=RPtwzYC;{Vz^ z)2JlZc8^;fv)SD?D>aAeZP=n#n)9@^(I&MrR19-g5YU`OpiFHyX}gkgNJ4YS*;G&z z$&nmUOdLQ-O*92bQ4kq?-TQof*I8$uuczjWTK9cjzvrUk2qo84RXULB zBB`z}hx+(Y<2-#N5mu%h_T$eM>(bpu-Oo>x`f-%xoGpIDYNvuCddQ?&3MD`kJ(7hJ z$~a~~9_A!e)aPyHZ<4Z&hw22*U*CN?CHX?QBm7kf-qgfm;AC)py9BAMh8Nz4_wFdh>%L3%5N2?L{D~ zE-&cabS>wX1sA<=zKPHz@0i?DUIV9jIn;pWmS22mQ=Co2Z^VO=i*pa*4aUk+OYCqb zK+!n!Y3&OD9Y|L($rf5`tUsNH8a@ldNI8T##dj6(*;VU(-J0clo(V+MneB)X3b~ge z?;$`@;>tySsLGCN@=Wm4BGNIfN4n2-dy5k=n4#ux;V0%_m7pPZM1~*W=7-;>wt=1T zULNLdi3*l%PK(`0sl3>+)}xO@n1_y+_QxL29E$k3P{n|KAq5rcEKaDh7X@r-&trfu z#Gz0d89o+4VO$Tos~aB1O#ttI;60=`knE{q9Yk@bUwz5{Kwswd7QNS<@wa)d%8r6A zyPViv-4z&r>FTAt$LY@m!0p)5vgL-p+-mzGT^=b}{n9%J-GSAh63l>f^YHPyLd^8s z+&n+OGYqvV&4eaO(#l^=`QWKtO&&9y$T*;ZfMc8VNWWCclNUxUOB(^)g zvNI{n!1c(D4ck!&6oBdc=T1JJj+?q{VHe>{X|VCw29Vc1(}0$ObwFroMaCY3`jQAo z+0bp=8rO!%bgOK2mXAl7u-LTJk_w0&5ct(|+smAw9wpoVYE983jG1}sN6Z?s0C7$Z zC6%NGY=E`a(X|`kJZKqiM3f5uVl*XVHfLQDdQjJYY~dnxNfVETP$>Jcs!NS3n7cUA z%!xvG<$(dDk)9plqj|xiQ4Uzqg3~RZQB+Tm{D{vQ+-Gt-OSV4n@SyTEUJE?S^NUFu zGu9v^1nv(2?{t2&`0zt~>R!FAd zWO7T=YQcpBxg=3}b(r741*Lh`T<62`qDr&UvOgEy0$!eu1Y5qv?6wII*cI$c5F)8Z zMS!HvAEcaI*hbxxhyBm&FX zYh8}lAY=!w=4(}Lw7Jqy5i0%Y=D+88Se=Uja^b*(;NKN?CAdFsxoWT4G%?#y%y`%d zuyJ7CjsA7HsVHdk7uDUCd)rK)9FVDvrS!T==J5NI2-c4^{PCJY6Odu^N{^KMW&7ij zRmkwK)u%>y!@Lus(SE52Wh;k&Vc}EQTlF1R*RSLQOBybZCTj@t7>!1Fm$tUd$mY~O z?mS`S(^T(+PmZxuue(Pek<`o(RPc_1?72{pn`|uB@Ax4$w*hJD{u@l2goPX&eE&!1 zGkDtLSwzCP3e?B_9n2EqP^nfAGe2Cp+ub!hYvJkgBq4X~09+_-?HlecQMwoV+BHQ{ zl5ivu9(cR|tbb{1-OD<++Nts0jy~RspS-v(J1*py)pp2kt~g7FVHhYv(aG&a(D8r( zk-n`wy60ilyRGGWo6I6)Ww8dX&=;}A1(G#)#8>x5R5}2%FCcyT`ZToi5ondLPyo?q zM0`(Z$4P6&$n34POI@VB4d)TNpfT>@&Fa!HY44-eXcq6}WZllxAT2~@*$k!R29^Ex@fDE%8G~oP2OiwvQxj63g$>7TE;W6; zu6iiNTk><>GTb=%s`++(=A|Sxv0|l9xv5@` z3P|=)!c(Ezk+n%V(a|faI%e+?q$-a@Hp%~Q{u@7PgPxsF$d)g2*Gp>GId)PxGmiqC6QHUaY?m-Z3`v$*Gd$< zITk2j0q??nT@dMNBAM6b+U{1UL0C$Qfbp;rTA@J(I;LG$;TQd#xnKWq8A?z6;wCKP zgNSi}9iW4VoaqP7mr}xe;o-;8a_oKxQP zp!(8fuy(fp_j9U8awlcplZ=eKS}-gq7Wp-xc@QBB!8ti-ue{5duN?!OtMcqbeo3X6 z3rOS%y?dPLYd_Wq^@KE~o(@jOAMDF}Yx6_uwh_brEoVX7l z43On6vXhy48ixMKJ<|cdkGim~#Ct*hqTyEsdCM97s1sj|7^G^sv3HH%{k%iWemPV3lL_U%(94LZ z3~HCLH4gqT4mzZ-?IEB!F;?UD-N=1?NMrAL{jVx(aO?}8%&0v~9u*cOZlYZwYnRyFrGTM4fq*4%FpGRbV$|0=D|~jK zl)(3z)E4Gi%KGC?Wj%pt26Nn6Gylk2kWJoov+f84vLWNUFY+}l%C;VAQrUMpc+fXp z8cY}P0PSAJ=`&&mhbNvV9;nyMSRAqIlV{Q(W($y0iw(tNsvvZ>Gg+DRb~O~pf6NPE zsn7u-wq9ElLbgdZC0IJ>upU>&6By^~%G*B{R0Y>u}R_N18PjN?a z3>8j@aI`{5A{_HpL9SLLzU-SP}}X8>yrOlQ95Q}v%r3bol~jqiC^Rz|(LfV=2${v*YB z8}1~|w=9Ob-aq1R{M|J_MmPzJbEP>|DC5kxD5YH!l6Vi|8k84D5A5=iqNB{_S0rE7 zLT!E2e*e4r`Stg|hMA)d8(KmKxpmcLp=?Tq%D{o7&nsxHNi=Luham8}>a<7snAl0A zz2>7$AZpK7FWn__m$MFh6OVO@#dtDJDdekYq)w*OKw&d$LCp0lbrC#YBtrugM4Mv& zUgn=EH}C!TJO7iF^XDV$jQ(#z)1T=66T0UcM7ICH3i}h{e}eeG66*d$_Y>Ve5itME x%g?<0%*%QPe%3>OLHJop{!QWkMHud36hEm8B^?J|uKxAW4(G0&Ew#TB|8G*kULpVh literal 0 HcmV?d00001 diff --git a/assets/images/png/app-logo-icon.png b/assets/images/png/app-logo-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c186b09485a28c8f5616f2ab505311f2aff59d9 GIT binary patch literal 10018 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≫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 literal 0 HcmV?d00001 diff --git a/assets/images/png/human_body_front_back.png b/assets/images/png/human_body_front_back.png new file mode 100644 index 0000000000000000000000000000000000000000..15b784bfe98190256128315aad3cdd8c827a96cc GIT binary patch literal 48743 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

7RC+454s*rAB@o2Lr7N~t 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 abU47#(RoGVrN^oqv)4My%oD~2{pS{E_uN1L literal 0 HcmV?d00001 diff --git a/assets/images/png/ratings/ic_calm.webp b/assets/images/png/ratings/ic_calm.webp new file mode 100644 index 0000000000000000000000000000000000000000..848f3c11232538b46d8a0e955f84507015d69c3e GIT binary patch literal 4892 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 Or&pg$o0LNT<`w`0Mlh)W literal 0 HcmV?d00001 diff --git a/assets/images/png/ratings/ic_confident.webp b/assets/images/png/ratings/ic_confident.webp new file mode 100644 index 0000000000000000000000000000000000000000..ca1a71441571c572671465cdf74c5e526cd2d6a9 GIT binary patch literal 4556 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/ratings/ic_excited.webp b/assets/images/png/ratings/ic_excited.webp new file mode 100644 index 0000000000000000000000000000000000000000..044f52f7699e5ae5c7410214175725d9ae66ea91 GIT binary patch literal 5012 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/ratings/ic_proud.webp b/assets/images/png/ratings/ic_proud.webp new file mode 100644 index 0000000000000000000000000000000000000000..7ad859b2cb1bf9520737f5ce8b73e79970096cc2 GIT binary patch literal 5364 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 S&n$OJTx|C?jf0Kw|2YAQMOBLc literal 0 HcmV?d00001 diff --git a/assets/images/png/ratings/ic_relaxed.webp b/assets/images/png/ratings/ic_relaxed.webp new file mode 100644 index 0000000000000000000000000000000000000000..752cf4231005e5d5b5271813f6b201949e22eede GIT binary patch literal 4616 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/ratings/ic_scared.webp b/assets/images/png/ratings/ic_scared.webp new file mode 100644 index 0000000000000000000000000000000000000000..6816eda33fac3337086defd5a090fe133bf66e57 GIT binary patch literal 5050 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 CidIkn literal 0 HcmV?d00001 diff --git a/assets/images/png/ratings/ic_worried.webp b/assets/images/png/ratings/ic_worried.webp new file mode 100644 index 0000000000000000000000000000000000000000..c64ebf617d5fe4e76317e4d8e7d90eaba7215c9a GIT binary patch literal 4402 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 + + diff --git a/assets/images/svg/back_icon.svg b/assets/images/svg/back_icon.svg new file mode 100644 index 0000000..aaf9e07 --- /dev/null +++ b/assets/images/svg/back_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/bell_icon.svg b/assets/images/svg/bell_icon.svg new file mode 100644 index 0000000..e4f2ba8 --- /dev/null +++ b/assets/images/svg/bell_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/calendar_appointment_icon.svg b/assets/images/svg/calendar_appointment_icon.svg new file mode 100644 index 0000000..4ff7a61 --- /dev/null +++ b/assets/images/svg/calendar_appointment_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesCategories/ic_general.svg b/assets/images/svg/careNotesCategories/ic_general.svg new file mode 100644 index 0000000..93135b3 --- /dev/null +++ b/assets/images/svg/careNotesCategories/ic_general.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesCategories/ic_health.svg b/assets/images/svg/careNotesCategories/ic_health.svg new file mode 100644 index 0000000..2ce1a80 --- /dev/null +++ b/assets/images/svg/careNotesCategories/ic_health.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesCategories/ic_independent_living.svg b/assets/images/svg/careNotesCategories/ic_independent_living.svg new file mode 100644 index 0000000..60c6389 --- /dev/null +++ b/assets/images/svg/careNotesCategories/ic_independent_living.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/careNotesCategories/ic_intractions.svg b/assets/images/svg/careNotesCategories/ic_intractions.svg new file mode 100644 index 0000000..43ec814 --- /dev/null +++ b/assets/images/svg/careNotesCategories/ic_intractions.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesCategories/ic_mental_wellbeing.svg b/assets/images/svg/careNotesCategories/ic_mental_wellbeing.svg new file mode 100644 index 0000000..76fb16c --- /dev/null +++ b/assets/images/svg/careNotesCategories/ic_mental_wellbeing.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/careNotesCategories/ic_personal_care.svg b/assets/images/svg/careNotesCategories/ic_personal_care.svg new file mode 100644 index 0000000..148cb84 --- /dev/null +++ b/assets/images/svg/careNotesCategories/ic_personal_care.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_abc.svg b/assets/images/svg/careNotesSubcatgeories/ic_abc.svg new file mode 100644 index 0000000..9f23300 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_abc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_activity.svg b/assets/images/svg/careNotesSubcatgeories/ic_activity.svg new file mode 100644 index 0000000..93f73f8 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_activity.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_appointment.svg b/assets/images/svg/careNotesSubcatgeories/ic_appointment.svg new file mode 100644 index 0000000..80c93a8 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_appointment.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_cleaning.svg b/assets/images/svg/careNotesSubcatgeories/ic_cleaning.svg new file mode 100644 index 0000000..5cb112f --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_cleaning.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_consent.svg b/assets/images/svg/careNotesSubcatgeories/ic_consent.svg new file mode 100644 index 0000000..09d2c97 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_consent.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_cooking.svg b/assets/images/svg/careNotesSubcatgeories/ic_cooking.svg new file mode 100644 index 0000000..9c74154 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_cooking.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_education.svg b/assets/images/svg/careNotesSubcatgeories/ic_education.svg new file mode 100644 index 0000000..7faafe2 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_education.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_email.svg b/assets/images/svg/careNotesSubcatgeories/ic_email.svg new file mode 100644 index 0000000..4420d74 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_email.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_finance.svg b/assets/images/svg/careNotesSubcatgeories/ic_finance.svg new file mode 100644 index 0000000..f40edd6 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_finance.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_hydration.svg b/assets/images/svg/careNotesSubcatgeories/ic_hydration.svg new file mode 100644 index 0000000..35814ff --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_hydration.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_injury.svg b/assets/images/svg/careNotesSubcatgeories/ic_injury.svg new file mode 100644 index 0000000..5722cbd --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_injury.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_laundry.svg b/assets/images/svg/careNotesSubcatgeories/ic_laundry.svg new file mode 100644 index 0000000..db74e4d --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_laundry.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_meeting.svg b/assets/images/svg/careNotesSubcatgeories/ic_meeting.svg new file mode 100644 index 0000000..d3956a7 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_meeting.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_mood.svg b/assets/images/svg/careNotesSubcatgeories/ic_mood.svg new file mode 100644 index 0000000..39a6121 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_mood.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_mouth_hygiene.svg b/assets/images/svg/careNotesSubcatgeories/ic_mouth_hygiene.svg new file mode 100644 index 0000000..3cd26ff --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_mouth_hygiene.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_note.svg b/assets/images/svg/careNotesSubcatgeories/ic_note.svg new file mode 100644 index 0000000..8133597 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_note.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_other_interactions.svg b/assets/images/svg/careNotesSubcatgeories/ic_other_interactions.svg new file mode 100644 index 0000000..eb4da65 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_other_interactions.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_others.svg b/assets/images/svg/careNotesSubcatgeories/ic_others.svg new file mode 100644 index 0000000..f28f5e2 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_others.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_physical_intervention.svg b/assets/images/svg/careNotesSubcatgeories/ic_physical_intervention.svg new file mode 100644 index 0000000..241b018 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_physical_intervention.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_public_interaction.svg b/assets/images/svg/careNotesSubcatgeories/ic_public_interaction.svg new file mode 100644 index 0000000..c1fa5a9 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_public_interaction.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_reviews.svg b/assets/images/svg/careNotesSubcatgeories/ic_reviews.svg new file mode 100644 index 0000000..55be539 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_reviews.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_safeguarding.svg b/assets/images/svg/careNotesSubcatgeories/ic_safeguarding.svg new file mode 100644 index 0000000..a342a8d --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_safeguarding.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_search.svg b/assets/images/svg/careNotesSubcatgeories/ic_search.svg new file mode 100644 index 0000000..999539b --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_search.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_shower.svg b/assets/images/svg/careNotesSubcatgeories/ic_shower.svg new file mode 100644 index 0000000..21feafc --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_shower.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_sleep.svg b/assets/images/svg/careNotesSubcatgeories/ic_sleep.svg new file mode 100644 index 0000000..3455861 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_sleep.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_telephone.svg b/assets/images/svg/careNotesSubcatgeories/ic_telephone.svg new file mode 100644 index 0000000..8aab804 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_telephone.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_toileting.svg b/assets/images/svg/careNotesSubcatgeories/ic_toileting.svg new file mode 100644 index 0000000..fc5df26 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_toileting.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/careNotesSubcatgeories/ic_weight_height.svg b/assets/images/svg/careNotesSubcatgeories/ic_weight_height.svg new file mode 100644 index 0000000..fa1c4d0 --- /dev/null +++ b/assets/images/svg/careNotesSubcatgeories/ic_weight_height.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/care_plan_icon.svg b/assets/images/svg/care_plan_icon.svg new file mode 100644 index 0000000..20d6551 --- /dev/null +++ b/assets/images/svg/care_plan_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/clock_icon.svg b/assets/images/svg/clock_icon.svg new file mode 100644 index 0000000..723983c --- /dev/null +++ b/assets/images/svg/clock_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/dustbin_red.svg b/assets/images/svg/dustbin_red.svg new file mode 100644 index 0000000..c02ae7f --- /dev/null +++ b/assets/images/svg/dustbin_red.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/eclipse.svg b/assets/images/svg/eclipse.svg new file mode 100644 index 0000000..0127831 --- /dev/null +++ b/assets/images/svg/eclipse.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/flag_icon.svg b/assets/images/svg/flag_icon.svg new file mode 100644 index 0000000..9069431 --- /dev/null +++ b/assets/images/svg/flag_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/folder_icon.svg b/assets/images/svg/folder_icon.svg new file mode 100644 index 0000000..543eacf --- /dev/null +++ b/assets/images/svg/folder_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/got_to_arrow_button.svg b/assets/images/svg/got_to_arrow_button.svg new file mode 100644 index 0000000..0893f13 --- /dev/null +++ b/assets/images/svg/got_to_arrow_button.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/human_body_front_back.svg b/assets/images/svg/human_body_front_back.svg new file mode 100644 index 0000000..bc2c1b2 --- /dev/null +++ b/assets/images/svg/human_body_front_back.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svg/ic_add.svg b/assets/images/svg/ic_add.svg new file mode 100644 index 0000000..898a767 --- /dev/null +++ b/assets/images/svg/ic_add.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/ic_at.svg b/assets/images/svg/ic_at.svg new file mode 100644 index 0000000..4cf2b69 --- /dev/null +++ b/assets/images/svg/ic_at.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/lock-icon.svg b/assets/images/svg/lock-icon.svg new file mode 100644 index 0000000..74677bb --- /dev/null +++ b/assets/images/svg/lock-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/man_body_image.svg b/assets/images/svg/man_body_image.svg new file mode 100644 index 0000000..2412457 --- /dev/null +++ b/assets/images/svg/man_body_image.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/man_image.svg b/assets/images/svg/man_image.svg new file mode 100644 index 0000000..8b9df03 --- /dev/null +++ b/assets/images/svg/man_image.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/man_image_png.png b/assets/images/svg/man_image_png.png new file mode 100644 index 0000000000000000000000000000000000000000..4a16f19057b4efd863002f2984999647c321d252 GIT binary patch literal 11605 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 TRV{_L00000NkvXXu0mjfWuB*h literal 0 HcmV?d00001 diff --git a/assets/images/svg/menu_drawer_icon.svg b/assets/images/svg/menu_drawer_icon.svg new file mode 100644 index 0000000..0b55490 --- /dev/null +++ b/assets/images/svg/menu_drawer_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/menudrawerIcon.svg b/assets/images/svg/menudrawerIcon.svg new file mode 100644 index 0000000..0b55490 --- /dev/null +++ b/assets/images/svg/menudrawerIcon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/microphone_mike.svg b/assets/images/svg/microphone_mike.svg new file mode 100644 index 0000000..bf74cec --- /dev/null +++ b/assets/images/svg/microphone_mike.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/nav_bar_calendar_icon.svg b/assets/images/svg/nav_bar_calendar_icon.svg new file mode 100644 index 0000000..fb6613c --- /dev/null +++ b/assets/images/svg/nav_bar_calendar_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/nav_bar_home_icon.svg b/assets/images/svg/nav_bar_home_icon.svg new file mode 100644 index 0000000..030587b --- /dev/null +++ b/assets/images/svg/nav_bar_home_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/nav_bar_message_icon.svg b/assets/images/svg/nav_bar_message_icon.svg new file mode 100644 index 0000000..38fc18c --- /dev/null +++ b/assets/images/svg/nav_bar_message_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/nav_bar_people_icon.svg b/assets/images/svg/nav_bar_people_icon.svg new file mode 100644 index 0000000..dbe0418 --- /dev/null +++ b/assets/images/svg/nav_bar_people_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/nav_bar_person_main_icon.svg b/assets/images/svg/nav_bar_person_main_icon.svg new file mode 100644 index 0000000..a5ce1b8 --- /dev/null +++ b/assets/images/svg/nav_bar_person_main_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/notes_icon.svg b/assets/images/svg/notes_icon.svg new file mode 100644 index 0000000..a3376e3 --- /dev/null +++ b/assets/images/svg/notes_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/pencil-icon.svg b/assets/images/svg/pencil-icon.svg new file mode 100644 index 0000000..d69ce45 --- /dev/null +++ b/assets/images/svg/pencil-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/pencil_outline_icon.svg b/assets/images/svg/pencil_outline_icon.svg new file mode 100644 index 0000000..82930f0 --- /dev/null +++ b/assets/images/svg/pencil_outline_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/people_unselected.svg b/assets/images/svg/people_unselected.svg new file mode 100644 index 0000000..56b73bc --- /dev/null +++ b/assets/images/svg/people_unselected.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/photo_gallery_icon.svg b/assets/images/svg/photo_gallery_icon.svg new file mode 100644 index 0000000..e6aca9f --- /dev/null +++ b/assets/images/svg/photo_gallery_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/plus_icon.svg b/assets/images/svg/plus_icon.svg new file mode 100644 index 0000000..2b3d4f1 --- /dev/null +++ b/assets/images/svg/plus_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/policies_icon.svg b/assets/images/svg/policies_icon.svg new file mode 100644 index 0000000..7f9532b --- /dev/null +++ b/assets/images/svg/policies_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/selected_calendar.svg b/assets/images/svg/selected_calendar.svg new file mode 100644 index 0000000..bb9c608 --- /dev/null +++ b/assets/images/svg/selected_calendar.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/setting_icon.svg b/assets/images/svg/setting_icon.svg new file mode 100644 index 0000000..732ddf5 --- /dev/null +++ b/assets/images/svg/setting_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/triangle.svg b/assets/images/svg/triangle.svg new file mode 100644 index 0000000..93337ae --- /dev/null +++ b/assets/images/svg/triangle.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/upload_icon.svg b/assets/images/svg/upload_icon.svg new file mode 100644 index 0000000..b894671 --- /dev/null +++ b/assets/images/svg/upload_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/upward_triangle_white.svg b/assets/images/svg/upward_triangle_white.svg new file mode 100644 index 0000000..93337ae --- /dev/null +++ b/assets/images/svg/upward_triangle_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/flutter_launcher_icons.yaml b/flutter_launcher_icons.yaml new file mode 100644 index 0000000..dc1b068 --- /dev/null +++ b/flutter_launcher_icons.yaml @@ -0,0 +1,6 @@ +flutter_launcher_icons: + ios: true + android: true + remove_alpha_ios: true + image_path: assets/images/png/app_icon.png + min_sdk_android: 21 # android min sdk min:16, default 21 diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..993c497 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,36 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 + +Podfile.lock diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..3648d51 --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..293fdc4 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,81 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + # fix xcode 15 DT_TOOLCHAIN_DIR - remove after fix oficially - https://github.com/CocoaPods/CocoaPods/issues/12065 + installer.aggregate_targets.each do |target| + target.xcconfigs.each do |variant, xcconfig| + xcconfig_path = target.client_root + target.xcconfig_relative_path(variant) + IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR")) + end + end + + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + # Start of the permission_handler configuration + target.build_configurations.each do |config| + if config.base_configuration_reference.is_a? Xcodeproj::Project::Object::PBXFileReference + xcconfig_path = config.base_configuration_reference.real_path + IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR")) + end + # https://developer.apple.com/forums/thread/725300 + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + # You can enable the permissions needed here. For example to enable camera + # permission, just remove the `#` character in front so it looks like this: + # + # ## dart: PermissionGroup.camera + # 'PERMISSION_CAMERA=1' + # + # Preprocessor definitions can be found in: https://github.com/Baseflow/flutter-permission-handler/blob/master/permission_handler_apple/ios/Classes/PermissionHandlerEnums.h + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + + ## dart: PermissionGroup.camera + 'PERMISSION_CAMERA=1', + + ## dart: PermissionGroup.photos + 'PERMISSION_PHOTOS=1', + + ## dart: PermissionGroup.notification + 'PERMISSION_NOTIFICATIONS=1', + ] + end + # End of the permission_handler configuration + end +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4d15d25 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,790 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 63520BA4F71FB4D8A253E588 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3EE4C8588930D0F8F2A1412 /* Pods_Runner.framework */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + BF47A67D6C63BD427D9944E9 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2BD1715F0D2EA929B0F99F70 /* GoogleService-Info.plist */; }; + C3C4040E5FC6BC269C0D6024 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8445D989C9B52337F6BA022 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1DB7A3BC1E34CE1D92BE56DC /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 269C7CFC9628089F21B47590 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2BD1715F0D2EA929B0F99F70 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 459EA0914E67519EBF4B25E6 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 562A95AA1491F6355A148CF1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7B57E706E6E3B8CEA8AEA027 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 81280B1ABFF29D2BFED465F1 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 98DDE2FF2C2AAACD00CABB40 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + D8445D989C9B52337F6BA022 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E3EE4C8588930D0F8F2A1412 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6E2C1DA63DD309A920C101B2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C3C4040E5FC6BC269C0D6024 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63520BA4F71FB4D8A253E588 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + DB865E687BC430AF2C927C96 /* Pods */, + C2B1E9E776AB7DBF1AEA9E09 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 2BD1715F0D2EA929B0F99F70 /* GoogleService-Info.plist */, + 98DDE2FF2C2AAACD00CABB40 /* Runner.entitlements */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + C2B1E9E776AB7DBF1AEA9E09 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E3EE4C8588930D0F8F2A1412 /* Pods_Runner.framework */, + D8445D989C9B52337F6BA022 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + DB865E687BC430AF2C927C96 /* Pods */ = { + isa = PBXGroup; + children = ( + 459EA0914E67519EBF4B25E6 /* Pods-Runner.debug.xcconfig */, + 81280B1ABFF29D2BFED465F1 /* Pods-Runner.release.xcconfig */, + 269C7CFC9628089F21B47590 /* Pods-Runner.profile.xcconfig */, + 7B57E706E6E3B8CEA8AEA027 /* Pods-RunnerTests.debug.xcconfig */, + 1DB7A3BC1E34CE1D92BE56DC /* Pods-RunnerTests.release.xcconfig */, + 562A95AA1491F6355A148CF1 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 6A1F8EEDB083D69EAB7B6CA0 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + 6E2C1DA63DD309A920C101B2 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + CA9ADD9C5C86681A0A15E5F9 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + CD9C997104B0ED0A353D7571 /* [CP] Embed Pods Frameworks */, + E5BBEA59BDE07864E2039D22 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + BF47A67D6C63BD427D9944E9 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 6A1F8EEDB083D69EAB7B6CA0 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + CA9ADD9C5C86681A0A15E5F9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + CD9C997104B0ED0A353D7571 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E5BBEA59BDE07864E2039D22 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 11; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = S8LDT32AXN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "FTC Services"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ftcs.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = FTCS_Dev; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7B57E706E6E3B8CEA8AEA027 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ftc.app.ftcMobileApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1DB7A3BC1E34CE1D92BE56DC /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ftc.app.ftcMobileApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 562A95AA1491F6355A148CF1 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ftc.app.ftcMobileApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 11; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = S8LDT32AXN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "FTC Services"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ftcs.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = FTCS_Dev; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 11; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = S8LDT32AXN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "FTC Services"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ftcs.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = FTCS_Dev; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..8e3ca5d --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..75e000f16a477b1cb4765979219728a7295851b8 GIT binary patch literal 60796 zcmeFZ_dnZh`#&DEv^871Mzp;y+S;Wy=~5j=TP<3vsM@QV!S|x2=sF_Y`QzKSH zt=y%k8AQY=K}0A?koArGb3fkqAMw5O!|Tisd5!aU9p~|UK9A!#^Wv7RmFSVcwY|y4hixGxRQDT06@8X{mR9=(R^zJzgK~iP&s;dSt$w?q8CC>)cY$r z_1cXh4gc(ulkpn=y2+xFjzqfe-4I8v3$IK~ar8W?@K z(ZRfo)zf|Frl*gLc^x-UJ>k-9TtRG!C^JrQUN|>B^@?PlcMkXfHnU{Lu1P7r7@F@aI@i^!Viq1N0h@iXWVdVA`s)f) zHeI~q25q>v`fFjHfYSL*xSU;XP~hE*oSx6+3GAp!181%kajG1N`9n8~!^8%8DR$8M zcWZBuTrJuUwY+18M=AfV;cNF$R&d&Ag01>4;rD^1aqY{5F?dDL4=xVWa?G|;YEIZLyORtcQ%DP_jY?@6;IwuqPpci zC&q-kVCX20FB(=DIRN>EDT;azq3khKEu%!!O zbNO=Fb5pUj)^Fi>??%i5tp!_)^pFFz6L@TT_S$`^{34kRDGf{C(Fi4v8056Z9A@?0eMAj2RpNx#n4BiuLV!XO&UXOA}%? z;|^h`4qPxPf^YQqhpvp*wJAGiJXvpKjPw@1JsXbu%sxSXltL|VQyOKc(0z@FbX%i) zY>R8=3Z-1^{PT>+WGXSRkl12TfmqqQYOL;Sw4yZH!4|l1l_w62{@f`8`)j~I9(nIr z7QdB=O#&ZN5kw9a_%*j9T_$q?a&~zn#MH~(DyUJVK)<1u%_=`sSAGMnj%VH=7n4j6 z8;pFbfxtzcYdc^WBfx+oEOW5`Eg@2^cUhuZRCWKla7p_^%$T{1$SdmD^*06pOwCX$ zGc&4ZuIF*S(tDA-f~^+WTDI6_XmHq}tF3C-GRPlR(^8>J`MRTG+v~Rg-AY8F$S0ik zc}JBQd~{%ff2!lSTJ4Nv>gh?qh06UYY}1ci@*;KWQM|onrO&)Pxuof8?C}%<2`6||d&<-hK-9H*>cK!-fo)r2BRrPL^9WsP9`od8c6XpVftEl|pLMYI6@$ z(nmkVQ#-A>;i7LW|0v^g5W()egqB0!%yH~-!I2I6m`BDxP1An~wMBWGkZWFx1*0JR z0IM9HyIXanUxHW2Rm1+&+*X?9E)G_WSJ9k@8D!Rjt^8QwzjXOFw2A(l&zwO_l)8(n zc9}}VvH7p@!ACnR?MG<{Q{@orYpkExtWG3*`-aj+(dKT3-%FM<#MYU zW~U@`53Oxse#8ftJ0pk9Y7wdh`3+6zof7LyLGy723=LLsGZpDkWt6i=8Ss|<`DF6u z^Z(Rn{N*y|QO$aXs)mY1?mE&%7-(u(4%9Bl3#ma=EQh&p-73abNR|i5cO)TkH!^qN z+f7Bch~l8yyV~?Jcj8ytuIo%^RMM%x@)Neyek8T5uiYjbcy_Sm%#lA@VCwl*A ztTJ{9i{lQH96IdUs_&xexN2}xEPJM0=+eZbzzH-X2WvI=!#-i7NzH0*5a$2IJnQ@P z`Lu(ao{R_re(qpF-Y^j3-e6es)j)=rilZcEF2UeSo?A#`%=XGy?4foLXZ$fc1-C#6 z7-=FG>8JpVd4fD%;P+CNjuaqTXWz{umW~Y6-`ku@;%?wzf1KDXHKcrEI98Chv+IX{ zW)aYCxA42~;KCwPd(DARi8FmT?DqxHwmp4k=X>$hIi_QAtuBj8EK{hpiG=WVF}M}L zz*R{XGu`r3;U0z>C7xE-|72=iyJ1>9mp=|S_53>#TEF7GF(p)U2X229q$)YzLUt|@ zy5Lg(js{5a+5pj_M;>r$wa@E`ijae3ZS3Od`FHH%{hS|w+;AD{2^$j?emh?xMYtdi z{V{?3zObY!sK^e?;A~^_g1A3Z`{pvSR^Z#1jG#XFgCghr5F_%{Un~AK%gWCO5;YpA zKR%;=))wcHW1e__Y11a6%?@+P**G$zEh@&u@XLon06@{32a}5ax=v)7Ze~}a>U${b zisWb8z5+{X^X8&bCjXjd>(?Xj2O5#ti1|A33W?AlS^QUAo2Evz=ig#ymLs;bQG-EK zrW`p`(fV%5JR1`WKUP_8_#IvVShmiQO}3IMH~}D)USO>~sNEd3fjb38)gt>fex1ny zx~GmY^Cpi8g0nfCk}-1B-YV9Q^-*>{^wn19g9|zWl?aCIqln#X4vKv87+16yI7cZNAG`dG5ApH&?`xUUf{Kp90@(^*#{) zg3Nd6u(q+e!Ao`p{wF6*oHR(z|1kBq(CF}EGc9gOh+x~!5O~$$=fuWQgX^fLaUzer zvT1U6IsdA)QGrB)B^;7030n`x%|Smw$&tk3QUK^+J21c*18P1mYG_y%#vKD#31?To&g=nDzvHW?IlAya!gRM_qA^JhY zT8Wjw!L8BWJ4OwPk4HAYT)AO5ceJ|@fP{ZDMor{BG}G)@^s8kz78tQTx4j0n2i-r} zJ~AhNCkC6&peDjk6b@$NKlcC~25V$HujWmp;5e6@^*1FEqWFN3?Z;mc5I@dUyQvS7 zn;gW|8mk^1*1UTE9(Oh`k49ctJsGm*HFXtW^m9K{NXdYQ(kswmaeGs~rpx5WEo}&2 zfd64kMA-{pQ1kt9G@!EHb?MWnzgq*hT-MuZ(*IevJ_%aB21H3SV#@ulRXS%gnbcG? z-zsBj;U!vlHAsUdqk%%8@$(kJ2+aX7P~dl7o;O%=t71HL4Q&0R5p7fxd7)KxXtKV5 zOiMQZ{4fSwa$Q+Nv`uRG+Unoxbt*Uhx%8)4CFywp8-aOM`$3;b%qzksYT5(*99)a7r# zeS#0r{y|qkm?-FrY}F~pzQ>j@ICq_WEAg%t4Wh*|gq_$Ur@44ytGw2|?<~U^;9yY# z-g)GPvUBPu*#Qyq_$Cq(W6X-9rCd)TP3f{q0IpFQu}2KJ3EJlm9&zXT-Z@yg(2VN9 z(1-uTrGlFZ;;va4_(J64n4Lur3GQ5i^BfXgb5Dp{B6#8KsAJ?fQ8S$~4!VZhrXh0C z>@;GFbh>uPb7WkYF$)6!_5+ZAKM#21R^;m0&o$fbz3u#~E~1K?7=!EcG=PcT!jjA%=rBhL_B;cXD=eR&#r1x!Lgd zXUgAQJzzb>|1_*AqMy4eix_j|a`&h+BADB*Bf%5_fRR7XCuRXh7KbWtkq;Dmk4TApJu zSp843A+D1M2cI%?pm0IVT}c{5HeEEg8L$}nH+xilZu&v^E%>I8Lzx$H)Er>3J5jCN ztAn?Ua%hQs(0o^5HiX5g*x=CoqS?cb9IAtvX0k3-)jRdgWSBAB#$Gd_k6g0|Jr1Mx z_fOXEBH*hNbc5J#=G#Fxmr`K>Y`)|4bZOyWrRZbQd5V(rPMl+z4}a7xkw8TReLC~NQOag2Zf^y zvYxH?p^CuqZ8Nr1oMtZy`BcQ!w0XXmGD`TJcVDowl6tD_S81_ac_G5FPs0&}ysxk( z_icz^R~l43V|zO~$jhV!L}M<}X;W4#kiwn>3T2UgJ$Xfg@0WYqn#;%{z0nbGa_pw? zdUr5G5+J6q4=i<-2bT-|NQIc_Cr*wDRNDfatTTDx9n+}Ltf8=2Q#7?ZyoYM#FQ1;c zHNPDew%SgN{!}8qakHxY`E8%{UCZ4>r^_mIsT9qD8lBnqQEv(JvAPrRtsCLfHNOZ# zhP};4sDdBBtlz!$zL?W)lAp7Xd?ikF*>qMg9z6hPHn7m z`lYkJfP}R)1!v<>sq*x)4Jt#iC0m!ixAOf%)MYB zSW^Qwwh>3U`+>sP(bi$?32BgE9cK5cWFV&`JKHC5b15COkXYMEnGr!VmYP?Ri>BCQ z%II^dTi$rLFeyoB`uisJ3$dTwdsV&?`fJVbAgS!8x6|2|_o)e$(c1HOIz34c0+Iae z)rjhgu!?3i3@0`Z;OpbGY>S@&j#pp9{PH}OeBiU+0SwenaUeuw^-@}~muve$LvvVB zdX*II)|<(O5DWxhbay{)N7&Ynv~=&zX26cAfPWyK!t>XuJxg)=G1{7>)Y7$LmEG8S z%-C)DtDW719|4vl-O$09-3K+6=HPCm+4Gc$p%Y&wC6!HQjF&mluRIYWE1C+_ek)Yb z7&K?VUw&H~TQGyvM-x9Lq+HL~d~|%EDv0=+<9V|)@&R_yGpqdtvVimLEk8i<@jkCI zLB_W3Zh=d47AwSh@7zX7MYvZzTaxpIkvofoE}#-2Ak99=N)-@Wz@2lp5swdn>mSCI z#_z7!C&Vho=~L?Ohz|pHppEwret@%rN8Xy}Oh2Au{zcQeb~w2T#e~maStC@tPU{?x zjJ3Ry%FmdLNTO^(a9(e|SD5&{?O}^gxyjRD)OpTlud_1SwmYL6TA2}nglFKAOpwd~gc_@{fsz`i><7Y!$mW=9a1F@XN$w0S+3>)_H>gSj zChy^g89toU|QC?u`3zhdCV;yeUuxQ9r!zh^i*-E#|MbDn z$S*XAU5NvwpEh=c77dfsX*^Q@>C*od-r7H8yaZ^8M!7!@SM2C%EH5s)sodkVo|iWU z#Cblj3rBfjm`)fF42mI}pN$IF%v+J{YmV%If(j2-eJKnEgF@gmzB`Zgy3HDn90HIRXd537q(cSMYx4ZD{zs2jz9vF%E$yQ35tCTaQ(WrKxk~mVHOZ%@f9RX z2yojTPc?o)vpP>a2{3#3-$F1C8tS)a+Qzq)KrIGemA8b897y)+39-AfgJPYsg^FYM zNN^IwW^1=PXtHp|JBr#|-$JpFz#;IExj;QzuB2?zT+Kp4XrLd-_%q2!$#ps^uItRE zXX+|{GXb7mJrgP-^%(V{V_yWv^*cM?S1LTq*0Cp!tY$rW8W08#7l|Cyo1|i_%t0E9eXD3Zbj|1j9&`QV`|0b z)=Usja^{Yb8x(fdBtJD<_2?A~)$+qj-e53@{?#-@@G5Tw4E?pg48qGOOpvPty4cZE zG+vIZn>q$r1W4kZZ;@R*wsvC%lzW42H3|($%tGq~L z4Afcfc-}c7=F|ACjbOut-4j|ycv!e6a$6(n=e5AE!;BkIH`_aF7kM|TOE=X*ivR2{# z5biX`y(ly{Kja=8TyiA0Z$rBczYUo9%HKNbIRor#BZWnL{Jrk9JGNT2!b|(=?^Z=} zzS&0kdBe7P^W_F>gm}40Y#>Rhm05^-8h7@3f?YF_$ zj$&x{teLIX4lBoFXNZ*5L3xFjhLid$_FOyzAc{Uf;S+^!gq(vZso2j~%hhzw2+gGi zK@+N4^(v`D^zZ!)#pOaQY~XJ<#Jfi+7Lc$r`6V#e{O^a@2A^8F=Sx%FzlW0z*K14< z0u*oUqe)zMTv#J7jPgzOS2S5J6=wL@ijzO^Qyni7Y8obYG(R4u{H#%k6ZwaEIDWm^4+FY$@VE2W zQ}`A;ESl1}Nfz9`($g6Xi?k z{HeiRm>#G3 zn;II(Aa72_%)B|^J6Qa+k~>u`&;MtW4g)%$SsncD#wc3fbEm-3%|&c>_99!spAUd| zyFar5+)TiOmtLviid9O^f0EHnt0QsiWn*~(V-Ph5!MQ5-@6A0l_YW?3lrMU16$)+T zvWp&F7NL8kLIP>rrtEBTJL^lhO|`LK>au3;S?%4cU=}eN?t%fL!pRdXre7epJQGcz z*7^w2$QagcW-JE7SaR5LcAxaE>ZV8nyt$+&%x<4SLo7Gj0;LGsnf%g>>MCi_nX9Yy zWSqs~M(Umu_d<`&pe;lPk@C2_)@V-&w_t&d(L#%5*NlammOF`dm7^H!oPci5W^zbS zA}E?nH~a!`$e_E}I^?BV%6YM$ahI`q!jQ=N9KmXi_2+~YuzXYNkd(tKw4NK&w@vL5 z=^S7C2i5;;q?x^to5!hgTwW(~@8~gz#oFnQrB{6xx>9#Z`uE&j*1E%OQt9x`Vg#;= z-A4^cq`DR+-6W4}j78-+ko3DBp4~>B6Peq&kv~;=2nqivU&R>#Iv?>th<5DOuZESc zI9O1W7N(oF-I%FJ=fgn412OdkqnWmq+&16I(N(i+_S^OKLWQP!B6djsA|qB#c5WM; z>w}k^Ma(EC2jq>!PIZ!l9O)JG+4)-ujciGEOLk+mfrxu_soxi_Fw#$O4XewlNxp1W z#4!d#&UGOdJPJavliXrZ)W`J>_>=maqaG#UCx#KVZlc1mQmo-(hfC!FJ3U_(o0Z#J zaB6d?w%Yp`SvaCzeE!wp8pA6?Ih>6e$$oLr_UIFH<|Pfcol}G9tKP#K&phh0n-@W1 zN9CS3EwLgrNTpjwwGWa8LB^$(mLuwO+`ZMFwZhMP{IUFi(0BW6WR`}FL%IB&UvFLbWWXf$5zx5$MS#fn8e zVF5zrc#T`3r@O|d?`CrB5r*(K+bSv3SfTBJJkCLiwc4&-pf144COb zm(n9Zfj%dYieLr_uVS1Y0%|k+3X%Rnn|5S67ILx*D`fo^#w6e7*E7Ar`oy1+Jub= zNMP7_^5$Oyd$-2z)x=Ug4and1igT?y6ITnnR;27A-k$SwwzMQtmjYTcxuQTTo|(Z8^vexZJ*Nn^^kc_!=#cDXZeWUsX{_#Y21 zmvPeTXDlDQ_xw*0_6M2T-_|}v6drD!o*%63KgHdbpZ{d+JL|;0v%cR>D4+P-Ot360 zkP+^ad#lo=nw38OM~8TfSbw_R27g~USX(Mv0o?qJDlJE)&vcBl%^Sjt_wZ+@;GVK9 zlh>6pPQl!%s`~56iyk#z>?ZQNqR|!vc9LKf)#*(I$Pn<+cD)z3ddE-Kk#MTsGNabZ z&UO9htebstoRXyu=vG45M6Nzq+5kTz)dF1y%&P2j?+YuDvWP+xr2Em}!hBn(N2mI(WE?PZfZ`U-th&I8<9uV#9Bjv$Z zwOLzFn8x*yRJj(S-y}u0^`_9YW>R(>8-0DETTti(ni#_{p)Jz(_}KO6 z7L%k#YP8mEMVU8`-!3bM*A2tI!WMVPGH&nW-DW>7rDcA#sUqwb;# zF@JV+@?C;+f2xh_dgGfzJswol&FHg|xts3OrASP;-yH^Er)$?Edbi_iFqqSnoqL== z?8bMeE0v%I=+NdG?Lql9jGK8wDU>@N)v${56yB^)`&K!CF+1CVErY^agEZ|D$<5|R zd))$PK#ZQ4<9Of3;LL;wX7g%oe;t0J#iM>|$p`7{e^Sx?Y=;-+)uB)31Kyytu@$44 zW`l~db?o>bA{VAN%SN`f-3I~7B99@qNbYW8@KTqHWYSYb`vv0BZI0J-i;W1B$WmzfgnVV@3FSqjve5!8a4Z?5I%Z z0VZ_Fv54h#$rh9qF*?L0N)~}tPM|ds*%7jK*kdjKf`@(*q29%(l77*qgc4#+x{B?@ zJG`($9x}a$)nXr0ndg}oCjavNNWF{GRi>g!2YU=>kk7-hy}WWZ z!xKRWPnm!HG}^jf>S=emgbF~>V4r*+@;1!^*>uWcbC9MEqxFEdoM`Gc6N2m87;CVk zCp3&j1xy_%2NE>Me$%TZ)TzhocCLZ32f8R&T}q8NC&H8wmwUF#nE*FCLnf&Q-J~ZQ z=It&ow0WwB=PPSb;GfbaweMn~AC3$o&5ZNweYKDGxk>d~Xc7F=O&glAGr~l_1a7d7 zA_VYC(B{&ddI+Ly0r;FWRkJo&7##V;A1sk2XrsRO1h1(wW|hLr5>lOzDymuyrKCP` z(CfI8ih^4dLpmUZw6k8nGQD@^&1P)<+J0i(cAz!x!zA3S@}F1Nhj%L*xbxkBwg2Nv;YS7@+*_ecwd77pjb4Pd}(#*oke;);+3EJ~O<2Dp>vH_3UU1-IcAO ziXy?wHy*|<7F>s7W-z>FiOq2bc{gTt3>7hxZqEO5BM_`)Zx>HE%LKtZB`m_joERHB z1ZohaH3tyd&hw{@fA#b4d7ApBSuS~M$1j{w5jRc1jP|nJq`wwv?Udjd??q)mrTk>^ z+~bk8D(qy7+~=A8Ankk16wMXg!y9WWs;|@dR_UCVCSP9>SYGOMMx{QU<48r2Rdf!n z>gu$$83PaZ%z`3E;D3I<7fb&Hvx|?gwc&psv*iwhE4Dp2SeY@!gGUlHP822r>G~6`;XMMtf|k| z`L^214r@n%k_R@Y*o)fb}{`q5??)^8FHX>_Yuetr=YBckk$QRKwBLh-!GMN9p zF?C-_O3K$1_cYaiFLd2q*oD#OeH#WPy0`#EEuPbwog<7>q^?!e9gg48KW*YwE?X{} z&@6Yl%JJe}e}&uW@s)%b>Yc*oBrITO^>o7$c9YT{kkPPe;%X8kGE(X8OAIJM+9U}x5Ibp?KDHtsID9~`K%WBnl$b2T)Q_VG_ z8EaX*(?QpHs`}$tRghWH&Q`KvuI8&G@A_bQhom!n50QhBT!U?y(VuK6w@(RWi+FS7jpuL5tym8{)-<4(V za-o=Rf*?A4cYC38LsDBKF+<(-axX_+_YgY|{!2!?b=vxrlNxC1gFtNwJ(kI1f#u3P zkr1^s=v`@h34Xk@nrRFcSlsSw)Ejd*OPau+h-^YU-Q&{6mYTV}vJR`2dyC5WbOLFi zkqg@4IPCN=7n+{IsqR(wK-zZNiNOAf>{!{Z!b1tM18tO8i8FlPaL||7X`5!L0&h5t zoJWIf*2(|_`Yg@=Qpu$+CB?C>937}kTXj>d@v+*b*I$Q1BX8;e+Ap5`uh43DD&d@k zuD`g=3^(<5Ya%=$QcZx)=!J+tA}h3oW?G+{9rV4WSshw+J+jJy1LJF4uY%Ypyc&_4;N~vnb0ETnjWMYS@4}g(w8Ga!->)PzB z6-#n)K+SS<=EyFktCG(Bs?^C7OfHoztJs{w^X0-Hrtfdfme}(Ui!FpJ_NZvaY*I#_ z5vw>vv|0u|J~xZ5f7g>UJ-qulsNXg9pjzR2Uw@=iS2poD&RlaI%G{LAA{i128P!u8 zzGp_!CZ6Jm)8hhicBnxQ6#p|osKmZHcwfGD{sVN-!ITa!({px%Yrwc9%Vt6Y)c}?! zYUhhB!G)Mpsc9f{QZR0#echE#*u+9 z@n_PhFjn-)bI`K&Na3@3DeGbxTvU}Ed1YFQFfG>9JJU$9TyMyX9ExSjYztGQBGq_N zp2q$*@`OnK5$cUD_mSGEE;yzwFU2e~zcs*FK{wb%HFI1B6MiXrm8Ni)GW`m=8l#`w zLVR!^ZJFKqqf-8=HxHH+pdf(<4n_Az2Dy9S5f%i;8-|618H zphy{{kfb2|F4o8qHmM9S`(~f{zFF<@*LAZP6MUF3^Q2_){0-NZs&czdreW`-%Lai$ zQG1Qf_NqYmeLsiIN{yXrS-c%?v8YVw@RH_4Rc3=vsuYYA2>!#Enu^mVW4&x^0bL(N zHYWy^@z7nPH23`M*_}K2e?nRsXW3>&Ev}%MgpcpW2U~*l2)Xa_O>!)X+2Usbiu*}e z9-Dn<*nc16TiPl$8PxFitXC9e^HGac`$dUlovuxa-zpkyJq6h7S^93wVXunUr&Mqa z4Lajw_gwcF*el{WV%*C_ zVQg3Xu9wX+(dMpFN6VoLkN?YA&7Ra~o_82;sOO=klpI@ZT4;5ZM1p`SJ97=27!(Ol2fqrpMJm&m4PrIF!jiEe^NgRtANkpWqAbdcFb1V^cF?WSUmP9r*6JCatEV7)IzsVd!r;14a;(J$L8qkrmdAo#YnFBE(yywE$|wKX}IGuo6t|4?v< zd6?58HhTup{_h^e4Ka9h+_tnwWk%1OeW02uVD{@<-qWp5UJM!{R()ivS%`~o#sJ#g zcvdr-@YKm_1}q;5eXq2t4EW*p;?-sN6Toj<-rW<FAng+$lx8}JrA+M zksWSloEV^5_At+53cs9;xB9?f%^u1Z0BGz7+G*KjlVB||h_nEp(fr>(kxn*?)fxr~ z$LcE1kMPGE|M$j?NE6LDcGki+WLH9*QU-Q(X?sai9Q zj-}tHlZF%zJc9tz&+@J-RuHTn7+6uzBa4q~?<~KBEJ{;vVT#8zNEFKh=nytJi@v_+ z!F*uxYSh+b;D^4F-O;46Pj~@dhw}0L({D} zP%8e^&HWcw9Q?Ny-io<3ohN>?COm57Tg-2R3v;%|0Gm@?S&a45>E|rx{GJMZ)reg8 zzhmAr#%EL1L@)+C;hBL~NE4d;a9G7&cK!E8 zHODzW)zuMo_2$x*_~V8c_|m+N2IA$$M9tE_Mz*7^+|B|TXOpB0NITI>KUG*AYT0Br z01vs!iO$ER`s=4j=r!%gV&vdmkmpq7uDkMi?8f}0hm-RZQP<2Dv1%&RKEx|D@IL$d z{2r>_yF|Tleuy4uV?zeNBoYR*dLyh$z&l+}Mv6E;uvT-6D=dh({Se1Ka)9~!NqF_m zPEYz&XMXO+?H5sh*?z%QRl9?t++N{+|MWi!+bFs1Dm<$vYZcySakd2ZeRGwgDW3P~ zI~!Of|gF#;peBk$JIU* z8U#I9cL@p3V=zKVbTBdDi|OR-GhfPW)FaS2OKOwX(BA~R!M9d(9s~>r)=NiD2*2+S zN%Xqe9T=H-+O3vWvGg(xQtKXpiuqM}1|XEoTO9SHi5Q@xNUG|g7ZnY~4y2Z=c04%O zOH#V`=-j%RSS*1~?bB@-tkoJuG~>5E7Rci5j1N9aO+u_SOuHB|1fs)~dtRrlS7)vN zeY(^=i6Ze_vMfPIqoIo8P!Jl>_Q82%SJ-j8;V>YT2k5^}dj-IcPEDN3cM2{XMhTlm_3!CIjw;ECooEF!Rm?5=pMg6vg0Hza8K2LNd*#|vM z$TdDqZ(O(fAan&3uZ72=3-Qx?6bsM6+#N5LR<{)kTCb!Ww!SlPp#28ke75&$#-YZx zA(k>+9Zz+!eW36Vsmr+hGGyR{Saj3+xml;OnMw z4*f5$x4uRb+!L~= z)_5wh-r2dI3g2KaC1be#{dtkT5cTb_ddtCFbUA6mehkx{+?dn3nIK;@A9ts))y`^>(@KBo< z(sP#6@wS>9yo~)F*XT7L_Xm|&r6}j~%!+M@R4WoK3wIArcn4yvj8$7`l>vNC?F;9| zw%fdY8^O8FOmn{Zt>`;R0lcCHhP58co|?LY_n*RZo{o$gP6QTT+{wvy=$i#qB3BPtM^GDNUiM-51nfKAk8TQ{AzP zY>D(4pa1pZHgp|l(2#sxar7`irr#C$Y`oZ3bhS_gn;oS^w3~IQ3J$XdOi#UJw48a2 zGSOItxM{t6`R9E~RGsf*bb0E!CE1zjj0&bz4Q#%U?DttnM&8dwD|ere3TvUEiB|ky z*B)J;*DY|<>{wYfl|_)d!}~9yZ$pX0q;n=;k?H_t<->sZQ^7-{UL{{Z=>(AT!4EzT z_$(a$X8?v|F$HE;5Oj53XcE*v`I#%K1 z23v~I%dk=$4*#-OiKXHrOfWw$qI&>lPCPf3f1!Ip#6(*$pd%i$k(0Tx^WrgUGcaeg z-sm8Q=^Lw!SKVv2Y;*tr*Atafq!ByY3U%x}E z&GYBqZ$F+uSlU0JgK(gY-*?PKmiEK9hv87;7L=SGdFC;)kk^&%xr&|6)*%iasS#1-;dz%f?VKKn1 zbnYt7u*2E0c&;K~zfjr(7WRBVF1BcJv17`pbKsQ~dl=_V&%jL9&Mw;L_yncC^YgOV zFxBrTBi#YNF3gzt10T$$*wW$2*k%M`a;**6pbSXe26fhqaqSUl9eTwwjty&(uT%6M zvj(E_a&$O!oI%G}+LQ6V**KajbCZ-eDX^cJH*FZH!fi&F_F++`U>PwcLpUD7Bekz{ zJf#25cbbGBkR_QSc>61=Y{_TX&4s3T>qYu>4nBJgad87ihfFMF1aAsJ+Ss;iBIXGV;hFx?X+2|MV zp#|hE?0N?~5P#tCvD$(5H$09U+VzDy3mofS z@w{+rbnA^3A>QJk)|q!Z8;>RHVOt5;cW$ih0V8E3m`lkcIy=6{-FV?MIM9~7a=@-a z|HIWGa<7sACPRIzBHKz=?!`g;{3${9nXjqgGgi!%Bba}AU~JF)Lg*={3tB>L=4m;K z>+-;;u_}^W0@q1HPnwiBB33eaJR5wBl0f#}q2cnLLGvcGcpVo*#=_xAG$^Tf~>_w<-Cn}6yV!w(q@^vdzAp2%Pg~0TDv-O8Jfkg zlT4BE@Vb*kR#q%hsK@cl#fOSN&!sUtyU zrkS+rloe$H0rB#_RUTV}?=%S*PW?gwqo6|Au)98vfZ2iTJax(FeXPY~3(8p;Z`j=t zU#|&GZMl`j4+bbJ@_0PmyXyUCYjXhIsn|5N{dU&(Gc&Tr2byXJFWsJQ*m->R^L;zu z{b0&-;&>UiHuP|udErCfu}M|m4T0C+y&)>;AJX1#t9vn+i`|Gk9y$-2;6fiBoGv>ORc@>_{%OV2~;SU3108egh!zR@E9N_TY z$1(sw^ex^KHwK*X&9TnIZW|2sJp?|LP*mz(BjTY;Wa@1nxeM&61al+6IbNq6@3XHE zXDh#C^-er7u7t@`hXhm%;?o8D2Rno90R8!jVVmJ@vV3dX{LApQ1*!N=)4Pn%O$pR1 zsD}2BBw@o@aaUQQ98qDU+ii~`Ft-SvB7Z>z7qM_HQ%D@mkR z-oF`*IoujfWKs!(gIA{L@Ap2y)`nz&4C6B)?p6YT^~8O{1sVvn2c0a2Rnt^jR25v? zFW&jdxnFK;cI_J9M*P0Z4fZxXiD|Oh{^nc$hwxz3>ph10F7Vyoe7)U$YxU-0#g@nl zv_&?G`E$H)dZ9+Dn@$SDEgYhV0HT_-0Tbf;rc7nmxfLk`82NzH4UGFB>No3xh!pIY z7RE8Go?~F#`Vu-#HJ!9=?919+CqY3Yfbr}4@&JIc%Kpht81K3@vq(KkE5z_{d=q%e z=F9y9S36H?)PoN?;4y(WJD1q^JwNXGl!;c3WBa$FkGba!o?I3UZPW<-5(1a6w*-!7 zmq8?|h7a3j{+MSCW+mRLh(1cSy1o)-K^B?n@71@x6 z>SW5vI7{Z`Eh?uo57xJSTF~L%ESHyDh+BW5+RI##%_ftC_iK<74W&t{jS$A(XBgFx zIB|r0uZuC2oUu1#<0i6wz=#*<6vvRMs_NT3E|gf$Lnc#$L!>gRR;=ztDc81po#%FBjiZ$Xx^jYNH*r%?IcE}A@V7gg9;uWtb*wr=4ma6 zz*=!zJ8u#9dsUeLY_xNCl>Yb$%zod`qRtR10T%`dKLsVSZ9c@TwW0MjI(}rHG=s%S z*jC8QtxY|w8Vl$PLQ%bL_7~#RP6Rq20`C3F?nxcwiPi+Kg;`#WqE8j3WvgL`O!M`- zHQjK?{nYr|iGiK+x*wn4>7VZG+_UBh*^Sx#<3Y^xhcWmDq+cWVU7KU4C-<#$SIYW%c{kUYY!GLOv_=^y>qsu1P3t z0CgX>AC};Iq0||#boiymnF!D8Z%zkfUwipGRQ^e$m=Dr0gqYnDLU6rTLNz8iLRTZe z#5M+j8BC1AATQbx9bNnWKepaFEUNDdA00qS8U#e7B$Y-1X#^ytyBm}a=`JZrN$Hes z71~&aL(TQto5#Ut@W-m#m)+>An2{Bdc7aZc%Wax z(G#&r&u0MIIaPBL($CzNgXZZG#Uuq)V~57hQ4UuG^%ME*qFC67T9Y$L1&z!$@4GDmxj zvMc)u1yfO>7(@;6szW}gAUKpP*qPr@$XM^cgJ2wd<;n@cH>UoZ#B&2YU_e-+w9t z``H=;Q2kZWIJ7=u#xnmYLZS}FuL)N|5=9&p;+SZH4*^Ahhrd}M_mLV90vdiqZ@F;a ztJtvlI@P0JOYN_r5WAc#GsPV7&@X(S7Qu+5M>bz6w?Qw~mlDL?9~h5jLDF4&Q`!{f3u$yiy!n3|OO^tune?L!-~a(@*tTpU?j zt*{MTRJh{385iQtFd{Ujm&VxpR#SH*NLHNs#CMFMvdC&m>FrSQ-Bo3pSsZjbIPJis zp3DE1d-Jdx&-(QeA7T?VXpb9s*bBaxE8xGU|LKscW*giP*>W};NAx2DzT7qM@mWw! zk)om~XyYRgsVp#|;x zkG}4pfj2Q+K}=9Iya0QBn=RX(zAHg$@<;(gLhEp81gD zz0bux7A5Vz6$K(UZC`|hISiH9PVEKNRL3aGi)4BD$fv1SvWC{qq>E_-nwwHKAqo)p zw&3^!lUOIxM&C=zD|JkSEnSH{npFGC7g*EGC}lvBCUe&1A^b%*Ze(r)=9NMAX*bh9 z(q{Jh_6KynOjqauxON+njz zk*0=HI*1X7Va!Q99=OwxG}={uMVymEm4^Q(nZ?VB~ zQ+(a!jUZRF{5nyIj#^CwcGwkiiY^zZ-L<^jq6Wl1=Eemc;w1UmKao{JE*IX+pH(z~ zww(raZsB@{I-i&SqKH6%id2`P)MvGx(V>0G^g7TSfH+SZp8t%a?lkMtEtFToRi>A* z;?EYu>4Q@PG%rU3`9|8KzULElRzv6V3CM!*y4-ANG1$uC41Q!!egdEamj)M;Y_A%x zHb+5ho4pi^a22Oq-v7>O{WCShwjkluv;#l|;&dJPuC&0~q)PY2!D`d)LP~kA!Z+cJ z)z3^bx@Gl$^3K3SyqrHKA3395MMQ~za7QP}N{yIqx5=bfAuh@LA&Ima^MyN&eFI5Q z26+iBJMlwwF0}*fbwtI7XYyR=5avG!OOMqJdI~_8Jb5Rz(@^tz8ajRj*41QNqCTQG zQ&75BAYtjfqR#u&-}fkFMGXJBv7chs6JK$pRo&t}%qqv5q_0|Azdw%z14KJc=ElDC zW%ybZ3y6wPG1@QUSK?v$O-ZTXdEPJmsBi<4~Tc0ZZGs3%Okca_@A9iH6ZJ+LR z*_W~ir8sn4Rt66jfS1i_z15CAGk#v6uDcgH0m^zEe$WE?4AND5VZ9+?2F~n$pI3SG z8nNBy)iz7}X8Eu_yqNtJSkDgW)Pd&0cI&i%CpFp2v3QtUmepta4!lKub-csUO=skr zH9AKgCh1f3m?%R?XRd*(Db4hS)Hd>G`V5C>HqCBy<1>E2-tR}4taWHCB}B{yabJ}( zp63`TV$hfoFS#mTi=1icYnl{&%YcmxoqAN<+Z#l>RG_&Br>AlSku6*W#n(i!rx%sP>0~cE z*OgH6;qM6&x1E2WKIvMFNd3V}IwH$ucs>y;yLEBYA3TRtqV-)3(t@3>-}r4^{-lY=x+y$B$gw-C^*YDHIoTqFel*~yy2Rr;)Mv_)MI&!*Q-(c0Vw87wKN*Q*% zJl#I zw%i{K=dDN`*mz@lZkrgKmqL}rucD0JCsuD?Cvcl3;$1tW1TecWZ&EekauOrRCh9mW zp1+Pj-WX3IIM8JNL5B9>gUr^qp0Bpel1CIm*a+VOJUqwXMJ@-Rq|lYsCI;UJVBiN| zBCNgY0j2UfS{LWnBTt~N#uRfnWe1aUCspmTg>X-X)(~T$IjOX^h}KuUn9%tk0CJjK zj{MW=CD}HwNsOp5$^&<@-NrNFoi;BzHSl40jVXi2d;iAJ7Rsm3TAR;?mz~XP|G=qmR-HldJVzB*a{a)e^1~eh{S_M!FFg@{%R<$ZSeNR$?^+{k0)jWNv zD#Xi`oIXA{Pa^Ty2XgV$8UMoDw*cJ!5OQ@x9&r^Fjey5nj-jkF3@AxhulTpd^OfKZ za+_&S@G3U!n#hGB2##P4sv3$k%b>;+xl~a%b7AG7atSK*4pc)Em_DhWLw~a_?eOaH zCqx}BMC1Ak>GdAtVbJQ0pRbP$99oV3ecH8#vWOrY^MpX`bT}@;^U~;Jn`c1=6^a28 z6JK(2gej9KsU7d2Lu5UyX(Q3b;N4e~KIKw10()#yW!&`Ih%^z;wqk>!?bx(1uGxmr&HQ3pmsIzoc_Ppr0hpT_|BIYvBaH)pjQU&KV@uNHsu5AQWZ*6r zcC@p+pwvR%i~N)S0GTs;8OS@4q}*uM^*7QTuIT5c4cBlqDXkuDnv;ND14r!P&``;G z;@Nk(i}LW$lgi?r!s^D%3{H*P;+|tAKpmC`vfT@Gz?HS(yCZmIrd^R`jQaQKnFXNx zlMdTflGj&%e@EQ)iM%UGhF*+~mLAMG>J71qBQ>A3aroXLn816=pHAKo+9R@YSJ}fY zQ=_&wbY1XDpWokS=TaNAlU(~?L%cQ6n3+URrUkg7$e;0{-UH)y-7PgAz`FTqVy*m9 zX3RwV$zm85J?k2`|1_1rbMvec{%U45k*}4QwBbwf@i||B2{;Kp@VzwVeMufe1O5dS zLxI^h+v%sB#!nr%5ClmZ{gG#Azg0*9!Ki6HnTc$EI+ldo7;K7VVSJbilr2!z7)!P~ z=kgx(rqwf2%2vZTknMAm(tsHCoKJLzh7&XWvhfBxwK%gFY7x)cygvDMB1GH%Guy2I zc><>w%NbAsZ+@BO^b9cSNl3(Q8W*Ek`lIeo9}a4VURVthc_p4OR}qu{jUQb}Fa)Fl zkjU`))d2m=C>&omj$?_L?y^M7Yx=fQIiAp&4Ua-O;p~AM3I1C%Z#b>P8o9GYD|-~JeCj>?@86#QbKg?b5+K=;ifJNC$ruYdppg!ygG7FJ4 zg$;&jk48t?>J<}*A#!ab4@NmhPEUKSffnZ0D3RPZyKq*bbAovaBT~<}$GfG;&sxHU zRIGka$2Sz79EPK%FdP4!1HM#jKxYEq+^j_?aJ-Lav^}JIrbd`&57e!}L<2dt7sx4R zrgGh)T{bR+yUrdP$jujKu$yM}vU~0)@Qdu775R3?#^3 z84UK;k`g~y$6LG2WvzEJXPXwAs*nVFwH>tMXk*haQwrm|s3S93i-^AFJ3St0AQoj# zjh)w*WCbf!vF)fx9wYKD?ikOr$#DK(ci<%j@lMfvb^0_D1VQz$<5uv9RJ-{?{VD zMK?NI4TcTaiDxNITq~)Te}PzAeh8;eLw%%ocdr8f>VyzZnTDF*D>2x}^N88fC)Rv! zbNzOe#b-q+ztT3Pk+>znj6~O<>+V)kUcr{4Vu#+B{w?Xy3mjHG8pB>_brPnHNsmgj z(zX~m%RBh(y|wB!SnngyZ{;)NuMe8uASmw}ymxPruBHzm7BjE{4OhW~!gf_>q-S^U zIRgEJ4m3Bz+~=c#3HD#Rgzt|k*%{{F_*pcYMuEW@cSFyfeGC|F_H%zV9ZO{e4B+k8I<~8<99n=#M#Ai~_%NUf-?hi%PSWbbWix+kSdU$T3s$2j_foqdrF&>!Fppx z;6X%;ulOtBVEYb2_z&0C0|k9Sf?o4XwK5m@;-@kQ@z#w&gE^_V{fZrSo7P^8nKM4; zUCc|w8&IOvBW*7R)tkNd5(p;76#GIJNuEm%(43lTLmVmdrWGJW_J&$iluwz<)x2_z z*kH?Gc`>=!Qlt8sxMwf~5-h%XM1p_i0fGM$+$#?1o;w*sd(YuFOY~P#_GLvei<+vS z`v3xHS}<~>`Fyw4d=&^f858{_`C!GzTpM}}*1SBCPy487QV2iKC~R(y-QBc1sZDYN zU8b4sJ=6m#+l^$eppzn5s4}mdx~W#gEQjU==l7f+Wuy?t3S9xS#X1t%<7#c%v;3qIfl`^ILi3592QE9w&&L1lv`n2 z8*Z!gu}ZrA1yY@TUPB&o*dP{d$Pt}DtKF|9*m!U;<>?xvgn!^g{5dp$b%W6x?xdTM z7G3}GHoR*)j)BB{<<(0I^f;H;BK!QGMa5fcy53mzvl%#!nV<1wF>;shK|TX?v^OC; zl2dJ7d1APL5A!i87dky!Veo^Ukz3fs80#h!F_9CofCEw#ff?!V1iK%KevAn?HmvRr zT^9VLZh&^~W}vM+OG+rTT=XuW0QPd28C$FJ={>F@>&&h*7@P-n~$T@DHTJwIV)4 z!*81u%!tiy{qB|We~=1W4UxXeF}9Jrmm%wH{hlMVIJBcXZ;iT4-On1p7f-d4={Kk6 za6!HbX42&_R$Ie01A%RN2dv&UAWXNrMcQC|72JnItr5p}bDOo*XCjg;)$shy zE9@wfR9ADf=wu0qKw+Y+U}b1tzAZVb6A(=ST;t7pHQq4N6JNy=`{oeumciQPfLWh# zj(1+YGhVqFF8iAGBMZ~u&L*dLYJj{D+K&;lr82vG^a6-Y<4azOuA@DE@Lm8DV-x=# z9E0A(v3y;^83qv{84?t7sVyIRD@H&&NMtyF6=K-mqoQr3$xyYi!E8O)p%?G;1Lji0 zOg==^@`~F4%Lz3#fnd1QJVEc7<~ET&3DE$2yPQy-P^_ZoBh`^xrCh-sBih$W@CXJw zA}OkYW&P5HX<=!nz-#@~qcK{F8+pbyTw7OD_sn+EXd8NWNfP7r~DkK=|N{7g$G}y04By zT0Uh4YF0M5yl(s;2eM`CPU{@0Jl#c_ltN^=P}Gm#vjk|aU_w7e{@ClkyV!K%Y46X( zGgsL?Y9T$n`O9k+vQ_oI@)9^{z|oda5~9ISG*&k)&~TsSe-_la`$wGk>Jtz8+EN_9 zfWy#z6U6)C=iHd}oVO2siz`0(|j)*U2MyJ>RBlmfebTMfV! z%0Bx4JH=gG+dRH1#<=-nFi|#Cl&OPNxUZ#1C8YERbE?ExKofA&DV|Cw8k{rUU~EU$ z$4&B88Ss)4&xMa$)1LtNrF!>dAiB*STL!$YhXjxl4E{j-H-EqLQ#w{;E}&oW^^w9j zx}06SQI?F%&_zZ6nEVqRx|dH@1Y^d7B(M^jkUJ_)nhQBXbndceQnEN`GaRdYicazJdI?MGFF5+! z?MnRTO6%kKjg{fvjXSZD(NFaI8RQ=o6Z3v3H&lu;cV+Tf^>Spb9J}kDJgGjGs~Oa+ zJwSWvU(+2X3=RHT4tQ@DZ3vvTjK9_h8|Eciim@Z?60mK5;HTvO^3&fwE1_6kuRj2< z9P3Dmsx7j6$ti$4O@y@;<%6yiYmIJ}n?7T<=^dVzT`m3Tf;P zuk7j3ZheI&cHfd=OZ~mG`DyZ3Z+rv%kfkPcZ|jrbBN2DaRqyQ0FxxKuv4A7#WGvqX ziSf>9 z(`r+GTVmUxBVBTJ3`o@t?WNI_b&R{y8@e1Q5Tf=p?H!Bt?(cj5 zqu@^rOkI`p{M ziajFlM-Cfnam+#RC+X+@l|^DjnA>x6d%r7j5OK@xUp@5y8R<81``G!=-8L&TIVk~Q zJt7>GB}6}R=D7*?6X_cG&jpc=mnljVg_g#T;U)#JjoIYs`W_Q5ftAFit6i`h5E^RF zx>tov*9Ym@5x4z7QRy;~2acG972v)5N^a0bSSsgS&Cf$n%!sEMdBA@F(aVT&(YVdb z!52Cu0{R^3$+bE0X~a-OOcCfh9ZSq8O5g8TRI|T(v!QzOWp^UXkZ)20bmpQ;f-AG@ zPemkhcw>yquq>>EM-et9a<`gdpi#@XbuE*5@f(-7l}2M;7TU8Qf0a7>bFMj~)-Xo% zNhe0dFxe2$eN|2uWrwQfFqJmWbJHll?>qonsC*(|cP_J-81;HkE~#f;E(Jx5Zx!eK zuD;=J){v8uZKRQC`42OCfD#D={v&33T0%&Tstr^~$+t?MmY_$rZbFn|-H@7bXw3ue zm>sLH4-Hq-kzUFmLKMv79xIOm0CNqky(F`~8bA>oNHc00gr|C^81r|s&)SYHkH zqggDBRfkkV8|~j5d$=E%zC=`D`>(k1#@kTkjP8r<^`(M;cc=a;Wr)|sp)kzI=(tqT z3aiDnvAo`uU5ZJhR?8z!6A%r>$uBrSjD6>aGp&dH^(f#seQ~M0Psfvma?YGB+anoV z4#sK&Lz;9r`LGzQ!@#^MZE6IfDW57iU5KgAQ*~s|&2P_UIIA{NPh(mMh+KY%bhZgE z=~1jh*@x)%R%8YC21P_~vk<+ONAu~&&0%RrxQf;v?HfezNj^%AS?78A#}CF7yuHt} ztn#O%Yzuwp_*yuu*Xs#dmK1v(%VSKqKfY?)vdNpRsGB}%ttpeV&bey>zdOHnJrXA* z(h#?m_x{-#Zy0pACLq;cQ=zxdac!!OKxLgpl9%?xc^f#p<9r#qLJ!7~?c ztM4*SSPxcwZ$p&14c;alF)=ZqJqzjjOt0oR6N5)pRs@2&3mu>rz`B6R&GR4%k9}$N zB}Ap-Y(KPjSX2%-g!)jS12L%x;-8zEgBgx&iwUrKieu+upR!&QxjO!i=Bii9ivAR=-=~f2iX-tp-xwW9x#_$D=&dJ8VW;k;BpBdGRvZP)l98XIV)#h|>7_tbwHe@%Qd zSEE7Zt*)oJu*OO&{w`gR7^v(vX!{pE z9;w~?H{C^=eW6Z&!g*+j>0i*=`+&tr^tVX2LWm~Dw;vr2Em)tyhnOx+z0f(W2+eN- z$xcHaMvyVsx7!O(9;&!tb_GbN12%F3uBrwg)0$x}CAfKoljqGY$*MR6&(tyIDdYv+ z6C@gJjN%Vmvc>TPF1gxhPEhny33mrjTYJq(xTF^TBJ|*u8pR2PUf26;HyfEx#bT?J z)-7Y~4;dQTBmMhv8cd0?8m8Z#j=5^Dk5_kk(T_x1-`JVV&N2W3>tdaR3@A|y2|Eb2 zS8IJWKVfv}=f}UXNG8fK*XJstdWmzcv!nm(kL9n5L<7CN5G>b~Fm5o!gf%d3%4^n~ zNYyka$s3u}()4H!u;#m>RSgXQ;<;mpO54!~@S8bfEb57Aec-I@tirT4&kMZp_iy7R zx;O5T)RNR}q3K8KIU4&!-t%WzC07nklhEm6Z)guWAHE^uB_SlX^m&06H$S~=HPIY{ zl>JHUP~;gYJ}k%V9P-Piy?K@p_Kk7Wom)w&m)3_hK&K!dukEOZ2;h8tbYOcl_lgD( z5AS;Ux!h73QI}H)eyC5*(KKpE%bdFT{La^bv}yj_uRW=&`v}kS{ww&R*E&PVU$FPD z^MK@@083ybmoSq(ICVA(QcX^KG(>5qEfmJD8maWM+bTD+XvL?eaRT18LtetB()xyS z)}`xsx`BylCLl{+#%XqUt3gIO*&Zl4`*}~!)(1x(dUH{0fd>b>Y1Eb8GG^HzD&rsV zP-hD$tWQRtZ26cHv%Z6!LK(`|@oHh#J)<7D#S0B9D<^z9f5OjwS1U?9k0t7rYS@9n zkq2$+$iplJ`;#j?8_+g6roEIDzBtAi@>ZdW5WRT@nH$*sQ6VMK<=L6Oa(m_iOz+F; zQR%_+(R<`9k+}&2DnuwyGZb2Q^AcnT!7?YRJwd;g+)vF@cQMf{LR11JmmAn-{VEj+ zHexnf5n2J?i!J(c!RA*q7y+un)o!W?&TvTmKYinVT)OMBFs1@GV~yfkRY%Gpc$&!D zVh}S=YKHZnE4gW!&<=>A+VpLz1Vx?WEqu%^*+tMP+cR18;zx@ybmiuo%s2EQ`VyRu zn(yyDmJC+tbk`#dKI>lJb{1P)fB8bX2l54`R?^xwC)!+ubCVA71&(FdY=c0K<+=J0 zcqDq1%Sud0@^;L0py2IV zhy#l)|JQRwl*AtTHlh!`=|dyB04<}93IfIZYZudx_bY~aQ!7+n*%g_5IduC0hl-pZa!`98 zFFwWeqA8=)>)8m9oEn*b@*tuMo7rl-J%G2YIz7N1*NVUL*?O9%(Oh7WZbo%~O07)6 z@&aq%DZJB@IP3~!IMFLc);^^+;l5_~HksfgrV*~+f6cz&bul@jPUE}^zo}^w2DvsA zID1eN81HJqhUPyY4)PxxND1`M`IO5+_YNf&<7QR=3you%N>8v!#cEL5R-aoceP|yo zw@S#6%XngxAO7e_w=2Atn9^QlAiw(=T zzcIr9QrAUk%71h9@m>J%iu+h4%iVr73o^7rx9SDUQz74TN__55ktYeK^SZ&XqZ;xM z5BnC6iOjq>%`3ip(swBP(?_X*MyW;Wd)<8|?Y8>o++*_*%?wT*tJF7mnzfuEga8`A zuR;xWFKske%&lppG-^UJc#h!SEU`ymXZB>FTN$$WATFB1#1Ku?O9Z>*dh)pA?u1v) z!K&0^7vRb|uHUbwXO^UJ)t(+)4k^J`eG^czuY9Y7pJ8ck52BuNp$6Q0(Gay$yR({! zk=B%E4Z-%!m&EWqxyW=sTTgSk2}tQ9Ht zd=KxSp`Y$dxlQRQU8x;9t=Rmq+P1q>_ZqIBekksK|C$OsGKJY+ogEh2bTe_=P-2OE z`#W6XsN{Dk%{YAKVD3F6(z#HArbI72E8KYu;FblA{x!fuR*pIkF{+^~`E{iC`I5;+ zyMY!1Vz1q^sGhb*1>N1&&7MXOBWaOGWXTOdBcSV!(qj28oqfF|XM5GD&wW*;4!GGm z^k?^%))rt95u~)DxtY+bt!gV3-KB37-EA^%&8R2eOxzH;_dukKLh2(Pck?(t+R!tlWA)GCt;$j94 zBmQA_e*ZNcYZfSAOtFpJ`Ej|`j^VpEZMWIGG^Ob>As6NZxiI8bzNCdxV8zhY3iB2E z8Wkq%n$IbM;kNKx1Hmq$jU>WQiXZQk6J#54Pk(dHsPG_qoc*JZafqfM?2zW{%6UWr zi`r=A^WXZ+)gAOAOT`!6bzLfgc1t~^X-gzi(|XzZgv_j8$hbHI71?u~r!(vco%$uP zEVghk)Z8XJt5iWg0{BUFlUGcRU-kykigmIs?$Opph}_c08>k`dbsN*yz2%1Kph^s9 zQjHpgzy-KF>r|&mf?(VAWPQx{Esc_-8f$!mce!B>Z4Nw3Jt2q%QlLCmb)CA20Ac1N z)uW8|Z(MwNluz_xTx#n4u4zs0ctJ0-LF}h-5bOOsFmndJVp$IymL{jakX(=2h&gUH zcj#mvzDz3JbLZL8Ki1IVOA8rxQkGDf*H?NsZ?MLqi%fqgYkIsd5FE0*rscYUPe7zDMRqiXM@9TjwJ(#l_p%yglDykyCN-PZd9r3o~&c=lpnmf#?H2oyCSy0x}TniXQRqK<}Jl1x5N0 zm2{RXDZ~bZ9=$(5ArPyb>ukLFlMchyC)S^a$vQo@gC_H+bQ;!we?=!mmwseA2YM#K z>M{7bnD7&uBEkHY1azT>_q=7?njf_Pc4>^4;+X&17(JMtXWM!gfN|gNQ*D_aQ<&dZ zZEw*Dzf{TH)>O%et-^1v+FyQ%S9XtXI6*qAf=R#-J=rSOfrzR6QXNn)S{K9XfMCJ| zjF$Lk3Q0b@cBW(>U)N&QhBr7Fq=a9X`U^1Rc+6MNFf_cSo!0G?+6I44qeGG)q9cf*f2zcx=`}_%?v?=Cqq@um>l|mX$s=q$tuIcM#1+G|yvd`o!fmMdfBdEyr2~*^r*=4(vvjGit05YE%k-jU|=Pj3YIEJ&91cEgN=5-?u! z-@S9iKVaS5b07}^Y(7mBX2S}>4>Q<$)j$@)IsDICpH)e*QR5h@|w7eWlBSXEag*c4Ke|2 z>#v|0k+yBiCU4dK&NXTsz8i;=Q6+HQY6t@6XS{X8@zIoU&tFY3_hK3S{f+-&kJb;I zYby^seG)dgp8ot@gYRFA3@-1_0twnFaJ<8qsY-97x<;qetrgX8ZJzWRhI|Vun%jg| zA*$OiFoG0JKIlBOLTsM=Z!4sXtopOH+tnfDs?_$%>NjJ6?U1Y1P$q!ozU|XCZK9~X zstX}1w%j@|h~ha&S-=1qPtrhm%VQ2$=yDRXmS8!jZrHh8td6K~I188Bzf(=R$G<_y zFpuGWD~2<6@Rio_LE$5lV$ji?JmO5hJ^!C}gxHLHyesxxm5u^?!G5XbC$tN6u#^=d zj`iV6?sr!d89^_Fkm!c^WQ(A~L=2%FQ6Ul|<@x*Pdbt(Dj0-bdKl!y!=t+d-z0!t^ zZ!76D&ON*2l}^=mL()*F=PdXr{4?F+Lsp`3)}g-{v#iW61eM&(odqw;?(JGZY7-ss zpN>2HA9~>zwbck!PSq3@!a3zbA6)<#Jf(=vp9YuT*om(44@V@&iWUuU0F}GvD;EW4M~*zBkW|>fZ#Kc`m$@a?Jtg+C3714$ zX^OOW=5Uj~k2<;<6hMdSpRk)e7X-J>FD9y38V-h6>Y#R9zadB|aW#3dh>7F?Wr)a@ zFyh`z-{1&h&_H+p@p)l0^m$(cF3NM5GKyWX2sVWt6i+dD{tgbdZ5s0AQOc>mlav0G z$uxfUq=O3sj%b*b%x$Sbrv(b9R(PIUAYjW4|9}0#hN+nJ>1ops`K!6Zi<{rl88x>^ zzGt@t(DL%alF;cXPjv75-#=lk&Uxjqk=dk6dqZzvLDGB%VLCIq;3r7)`>flF z9-u$S|Dr;R)Ze%!5n}rROSwS_zSNh{W`bUyniB7S#*vXAh5t2PUbYzIZxU1)Rq<@lm*4As?~SP1r2v&_GOoX*Z6K&h-WPD zb?8BwGRoY0=V1bTopXJE7BT;p@aMUe!QQ*@6VelZ(;snn2=AU>A(UE5yAQ`F>^_v5VQO@g%>p9nTT~w(UZ5tu*W#dnS(u2kbJ6_^NHlmbNV1|y_J>9+Ny9^6WJhi@Z-glGc{;OhuY zVH(SR*UwKQLckA$fNgaEPrW)h%KUTO@o~fiHh*h4xjC+kn4CW!`tdSRF+ws>Vz9?# zG5^I;*Bpp75zVzZADG&+V@c#Kv}g>C&Sb?j>|OLeaTgmJHLn)| z{0&1G;3h`@THkorH)#HNE4r$3Ml#^1VKWxLr%BpMZl@bBxiIO*X=N`oT3t_*WUe~9O47piG zRl#Q&M+8CdW(i=xfvSg75r32@^%t(rO1LEg*fTjR{vdQ>QzJdnh|=C*7xKJ@7PeTW zM7F6mwBM&Now^ecYjnJBlUt!nxCW|8oSLh>SjFs;r4%E-5oA-**nD&0Fo;NKD z-4*X`Ub$u|wJQdVAD{f9v^S$twKxK{x0U%ptgT&e%87+2kRxkfw%aBWeVH$nS`CbL zMW6riA>p|=^;=Sh5O|4MD>EO3Hk~XP1#;D1Ir;Z-Pc}N&%p)pwt1^-jyd_mt(2ch^ zyrIQdgK!KrJtn=vy+mS0b?Z;X*zn%(+NomQoy#c)H8v-e(={uqK^FDd!SVxug+y?XG zE@^!B0{K_rFZ;7fe?9Y~Zl9Nn(V%yb#E*q!(=M83s&UEql#vwq%?4&uX_* z$Pqiq%p9&DJ9qFh)cOg6ksPZ1ix3L~AxwQW5#~dz1-?7PrXQC?NQwuVCot!X z3VKe=GXWmjJS~Si%ckoRdNPajVP^$}=o$lAvn6J&1K4LRtM#}t6m23lsN0sQam zf{PnWeO*{jn8$U$is8-_7eX zR3SrTwO9@uzw6KH%&D%t$lNM>3OujLn=Y`QMp;L0m$he%%pT0G6xT+3u{>0#QvNw$ zQe0u1+>=gEKj+uVwCV-dQE2?zdch47H8uv}9YihoB2;@?_FA8jWb2w18v7Qoy?3By zqLEb?Kj&XiJWIx_fl6*rY3`^iMf)FC9?Eo{k;rs<5WRGRGaXFnr&hsFVbbhrHcy(* z1B1Um8{`@EJ>;Vy6=zOUVzw<nehvC7QT z5h1@lds3x?FQ0#(BZI8fa8jPYNpm9=2Tce8xQCO{g|8hwZ99!?;xxdSl32ok!@KZO z^W*wlL-^7Cb@vswLv{D@Jdi3_y7wpaa_v|c_6>bJl;JbqC-veI8K1XiFd~w+;4-Ag z^~TbeJlB7q!uU>>|4@Zh$_qJx-axfC5Z-5B@x1g1??vg6SG3002G=qo-GfrCT-}*@ z>{7PttNZE_{`VwSrRDAb8};<-nsSHn%9l9}ccBc*`rOU(IJ&eBc~Y37-nkAgQ6GJm zfpaJw;5Q$>48(}2&2BNAESvHJDbn~%J5eIS>6v+Y*DmW`zrIDUtSAz3xBXaIYeJ+F z>{0)%{KDZeLjBY2J_5;qwaM6=+_Hoh!j`{?uGnoCuPWO)a;+PvGBN78HTh;{J0fL5 zb6lI2!a*ytI*9P?y*dy(Pv~`uEUmG$ejQX@YymHQ67X8L=uT5B_B>SAmIe=bpj=6> zu(}#zhwFdwwh-)hpgXjGsaD1|$}oSP^(N^K@t|vj{zWCFHA`@^d1U#!u~y+0WW>9P z(R(!%!x$^(bXmP+bv01gw!TPdv5wS%dY;J=<5s~qF58r5mg757e|{uycCg@|amLHR zZqNM^rVxd|Ms4E9r-98F%|KnXg)DKy?~zwtF^s<7p;eR!fYt%DUjEY6j2NY-?9e$( z0wlaaKejKm1(78r_J}VSL8&B=V!=?7n1JDs?#b@_FCOPTnrvz51PGD8Rf8((6_FhD zVXkNN5sS^3;siaa{LyEymuuoTNfo(WkeeTh>##P4)U>Qqd6s6!`2C}KaeQQITWJU# z5_Xx9tr&p6V0Sp?+AH!MK&e~$_G4YS712)lH#&>O{d0FmlWipd$9$ja-BLSqw0Olp zXKCcWvQa9%nf6|#ir*gg_fIiPW+f5pX1?tCk#1u8XsobPv_wR|j6|gBH}*5+?Cu`n zDz@t`O;Qf~1%DbqP$t;o$5=?c&BG+y;)j1rZ>-j^)O=n#&tlhn|5Kmj^5)w#V!Aa= z+(^c-ffCzXo*Wc&-%Kz6lT~~#*QKg z3+{LQmm4i0Yoh5!idw9CoVT^!NX>HnYTc{GcwSWm|qa0UMvr147*MEB971@rs;$7>A2iAq@o1I2P!h&>1 z71jf7U`B4OiR2>nlt-0${~CLJ>0!S%jE}LV<|wRFflySQ>NlbGiu@6H#D3PQ4qE1f z+aCLR3(!^Nl~JyQ+?Xw6K8PtV)3u(zqnH-qC&)x?0^PFgr5FBe}9|O_qY$+joA~}xRqPgT*(;JeBE-FGeMhH^hT%$&*03~@yKCA@& zzm*idmjQ%i$^cYNJ?!xU(2RN*Ua@RuAJCYIHA=qf_>92~@K|_>w21BHU^vzYQZ$u z)wnmxT}3sms?Fz>W}dACMym#)Hgg5fSh~}z_%W?LVjNBl`d^rCGibsbcvr{?Ibs4P1S(jWMe$pONs3KQBT9awM%0tLonr>cA z-*=MaIkY%totmIe(P?rSXRFKlhK&?STZ|?6miU6T;5p4bkXP<(eU*_S7}=sdwJ2o9 z$mdNCL(WFI=-7j>d4cRd$GB^LbT)h9SfpO_TqqMMK`7UxK<7FRS3~eugQS zKHSq0iJt4R9)~%>84BaTfo;9G*FEPxW)pQc zjV<7YkFd#!?Jy>baFCSfM=A9MiPWv6WLym20co-qgo3+=V`c^Ho(2GO-Dlhe0d~IR zvk}#+$vcd(rvTms*ot>!1&AOh=C7ZREbvcBrWPJ{BYc+G73OYEI`l>?42&v{gt+(O z>wnm~5Qk-kf?~H3>f0D>vFM2vSUOv>G^6467GUR9ivHec-ZG=A`^r=^&#g)3VbKEr(7-kn z!#dy~w{0ZkogpkC_-mKDP9e6D68_JVZueX7OdKg9(E>4bI;Vsq9e0>}6C0efJM_hkm9mdVFE~ zleJfnzvF913UjO+?%Nkg)|n>~)gfIV!btqlIv$zB?hSd0cZ(b0S9zC)u~z~CR$O9! z7|2@Yk1KBnj4GrJ6OOpjsY5$VOej7QcpqYB_V}*(!2Yq z3qgL1sb%^*mV^|AO0}@Fqrd6)&)$o9u;nk4k_XG31%y4TTo~5VOZS0GKFm$2bqm&cifp%@?mHn*uiA%b{4rt~I^O0mX zaQ{XVl9`AX@Sbg-R5w`XxhrlMJoBUg9_ncz+PO2|vO>L5aJ=K~Gz1Ewj*n;gN$;vN z&t8~8I^G>5E%>yIdI{M+UG#Hb7`g>7F5Askg1j>9K|Yn{BBk}Vd8a$w799P8uLXSP z1hs~^$KBYocg{Bq$b~U#(^|V^N#1z=Iqm&?7x!VRUG;X4}g_g2IfZEA#evzM*S2IYVZ;oi{M&3@X|jaITpDqYti1&<0o-Dg{J)XHiiF} zF$jAa%KK40$5Ma(hWJ;pETKL9pY^-5&n0;T6`J2up^IP3Mim(E`u-m8pt!03Uqqez zKhyvJ|EWYtgs7ZF$YCg_oRSwRIm`JJIiJtRSyIl2l(U=?QqFST3}Mbo4s+Zv48t&t z&9<-i<@3Y$e|S9Z&*%MdyWVcM*ERndZc4Qp%RwFG&liU(D9CAs*TTw_3!AHI)L$F@ zs!AW;|486}W*%Y-An_N|)(E}JK2i^U-md&;@*ILwO?{d=^Gq%ei0V}MH*zyAeq-^Q zezmn@jlSZ|T;B%|)3Q1q=WH@Z`?iePsR#M$6^DKfB0k1FBk7h(k z6r;&~k#y7Rn8!_-Kg9zZc@SvRMTYN{O%Iy1``t-RjWXv^~n+qA}tVWU$BF;A0z8KJMRp|dZzVVOu zQ4X(?Mbv+z5;Cs+g&X10#?IGTKJh>)l zOR7VW-s4LUwk9YKx-x{4YNS4@0F^FQrza z#OE+8mtT{)YF~{0iI8WpNJA#j5-Ih5@zSBee2*N5mFHUu~CyFlWm?!D924_ zJRiY!5zjm8yWuWgtl(lOHQqO;<^&m=GB$Qoe;&C*@@v5@&B?U@NMC1pI8Ia<9OZ0> z#)Bi~xCvP!F387CfKljqS1wPa`O@R%Gq!0jp8}|Ypbo(-!IorgdE6{PJ|cK>Exw2>xcPR^afT;b0@jhQsz*gEw(4|WpBggCW9?ydw^mlTrw zx7vA9Rmvocx7rz@^~sj15p9qyLms{x$kz7RI~^}x5Ze_$<`$B!DEnq(6%QK=&YrF9 zUhK0#^9tjHbS~fw1Yc1GZ0FIlwuW~U{bR_EV~Bxx0h_G3bVZwbyHmiZ9ZK$N@vf`8 z`i8Hawoha#{<)yj<8%3n&KKyN46N8ko*%s2lDVN)ho7)~9*}omQ-~LuMh& zdxR_k%VN65_a)qCbqbDHS~N`l7Ol7BaUOa_KkCepXx2m3ICrtgj$VAETZEZ;q?wr+ zAk#Z8X$2uWs*3;A0E~zAJY#l_2i;?D-6R*C3bG+R>cK+8yc};R`~!d1^MNHpe>j+L zsfaQg{I}iiw6VgSBT94bnokX&({PR$QVFXaEfAUCX$)W4%n_&WrS4@sh1RRNf6O5f zw9eYKG<5j;lr+1qC~%B1K38Q68T%tO#`}HaxdC@lV-D63noGJ)6TV68tzD?3>-jH_ zGe19Tw9D5%j&lN7qb4$QnZYxxp+lW3lp)IntU~v0va2!2-DqpB{um7YQCi?6`8@x)ZnQvM`=PfgsKCFv7Le~`ZTl&}{#FAw;Ov4(0}eA*zQYeB z7e^w=Kdjc7H-rWlfi?|15J$l57X>y|dV%J;umwzxpToGX&==XgMht03<`GH+8)KIi zST~GG*!tQpJ>7?K z;iIM=suZbs?eY8z0o#mQ#q8rxkTE%1vFMH2_<{SsO2oTvb(>65mcF6+eRRg=u3 z7xf)9G%I}M7EtvgyIJ}l7Ic$ba|iITJG6ct?)&(8Rn~1RHtfMU6lP~XQiEhVp^voh+n23V+(4-Jmpi8=hkA%Rx-|B24Ot%ve9tksY8DkO2lbiUwK&m z^;b^F9@fI93DN!W?xWTczbC5YziC8wqqpnb6*AduaZIY?JTQw!gsWuIF+T7vUa_7^_96qsDEK`hr7Np zJI%kA&PG@MabZ1Wc+ABc!`|@&;1h^f@qLB)v#$*uCFjUkbSZ?e!_>^mgOPX7YL>P4 z$Mr{Ls`a0m2~I{Ian85Ty@~&@sDH7JEqwlCc0c;9;J@tn7I`EmZak41vauXNv+T<7 z_wNnOq>l z=MrbV(mJ=ks&>%$!3nK(750%v2%x|se|&Kn1;(wd*{W3(vb}Hg++|i~&<$H2V#JnK z8@!Qx@!7{&d-KQ{pqmBAbZGtw98S_|W9?WySWa<&!<@aZ4{C)dyfs&vXiW{Vl%iP( z7BHOI)xD`A@orQhl!RrB`5D3LS=aP08@Y2i{Wi!x$FRhIE04Q3V94K5#A&U<@Y(||Rj{Bd&c`UXC5>~8o@L6JXfO|*G?0jT)|9|wsk-NOy z3JAmH-}Fevr?nT2c)5SVZhic_^{{Epp%fp=xd+tRNZzHfX*GP<73kD#R+k2)XZRV` z(B&EWL$WHDG2JqGf8yH3IxmAzY{??cB|r#MjkojX!W~~Z(83tcN6ah=J@W&_xF-uN z;$fG)RTov~?*eWKe(UBA^y#xrX*?PA_q}bWZJdS~9 zKtaSzj8~dkM9DXpnTm6ob$YectdZK#dF?{0?jp%=ysax_PVH<*d1K&OKaDp1d-Xk~ zHVkjbfa!+__bPwu4iZmaqJMvUGLL~0aYe6WP< z5=z^`HlDxEY6uO|>YU{&UE0yG>lHXf_ml4vUN;%&LHl^xKDH|r7E%=eci!N4xdt5N zuWG>)4rumaSIs0+9$jgjMxL@D`L9b^^b(YJ``RTfa5uv(p&|v0elOxa@xM{#qLcV! zcnJ2tjhK64<1Mkbq_5946P?n-7-~LE-^4s%e`W6YT_n!c?opt7d*Nn|AJ9v@hPVWz zQj&-glM+?`!RfW41) zWPE`(oQAS{(XDg%FlJo(5qYygGlO^<8|?YQKGMEDaK}C>L<5xmy7UfX^P$;%$gfMk zRXQk6AxPKEgW(UX4A~TWVs`>%_mi1THJQ8UH+-zF(ETp+gmc)hW5Te|+s+FiaxVL{ z)}o5c*VXT_l*LwZB@q-y!=7WYZLaJyH#uT2vd5+nhfbb;2>LOr{=5JC8=L)S@JuGc zYJ(MQc$L@uCg7mYnFBzG*|RoxSa-7wRiGXTcG}Kii@!Q9H05pu2CCdTm#_J#C`X># zo78SKz{{^?&*~SS;x%V{t$!KjUjZ&$^VI3V_T~Q?Zn?$yddnAheqFc%?4zl-&-w-7 zctSL7oof-OS5LBeu;9Sk^UZ{5axrju=P~i|UySjFnOy`DyZ`ZMVabEzi)<#jlRJ^;*qm zQkc4*Vp~g&UD@TGKAe>34?k7M^WdBBK1ai0%DXo$8SslV8U{ULQ1y;h6O8X}yU?uJT8P&Ub5O6u%`f^beON`u29Wr7(r+DzUi{U( z&vP}Lp%CTs;a0ap!}5o!%(0bK-+m>@NDgQA4be=7{c{kZ zvuk*;7%_e_Yd*Fi^~r+Th(3ul$UO6it01W+ep0@`5e8e{HrPhJ$;OD<%$H`-e}4A> zP>JyZFkiOF*eA7b{pTBxsRnNn(+wHolKZ6{fKiF0BX=v#0Z)8l%U~OT|4>>f_nIOb zlam`C7iJL8sFp09fSgx}fq2!&(;6lY0j*E-&1s@ofqp}P888gCj z4HmBG;Vz8CRsDugm1dLmt}?e|iFd)}8*a4qptajH48km&UWp)f#?q9;z9)5AT$c9Z zuH+AWE`Rr7ReBujM?EnOPsN`LC1x;6pcLha4B1|jA{z=ujU}l4NY$5k{C*-Ex@-Pu zLlY3LD=zUlK*RW}^10F#&oy--EgHq3E51=)1?WKk>U1vf7 zH(RIO;f;gJ3KsME86^Fqkq3ajZ{E-kxaGx_2=6PR?sa$X_m!_M9tbWpq6G+_z9=}c zbx5~TQeF!t42uD0AJ~ye@U*pS;0XWAMQnP3xQv#>{mcDq8=?c{Gk*g4>#37KSFU%T zE-ylt)6QofnmLAvMr{`T?7~q`>X<6E*IYlGP58J;jTveb7i2_9|8wf85YQi8&jn1o-f2hcc3{2J* z-C^D`G8SunSTp6_bpa9{1c6>bnx zk=eI9?Yf{^?bhSIIM}tApyq<#ASDPmY^=G=%3OMAtRLXN%{YT>Hq&)`_@{} zr@_&Hh3R0*@h4?RkIjHc$Azg-rBU(BE`H27@0BSSJN?>m8%St1%(52fTwLN-uyIR+ z2K_9jJoaQenrf(gsiwl~{)=Ii7qr^YA!h4T6ZTKO4=vCnJrA&4)e+YyI=bqB`s}q0 zqJR@yHN7O~9Tw@vd{=wZzdQM@d@K;G)=kK|tvdug`}v~4oA}GkmU`xTF^4aUJp8Ca zTdxm3p_R0wVFoGJ2q>bpZCaoajW&V zed>H(q-r*erVg)XKT-Au3-+oBY^CY!Y+o5z737F&WsI;qS~;W+iKNP1&%Ps4nbX2A zIseKAO7;#!a=Ng3XUV-0Xi4`XO)%Fdc(l%RBqoCvTq=CB+Z`jHcaAmlSzy1oHZ*w$ z)*SuQscP~?c_jbm_F4J{{zh{7cVQJTKP2cPT#+~tKX&J82u2aOgJ!JE-!6Y7={=pP z!n%6c@pi=G#d=J$Afm{+c}0Zpk<k2-UHO<6cJ{oGxv7LNfm~;66{8`NYS%eU1Xs<&|I3BzHNzdW|@>1PGl1PMC#3+P+ zvn$PcDS776<}X+4ZBN%^nW+E~Z9y}kh*->+NVV4M0WMzMTzI8#-2BUXAN#LVtR6}N zI~+-ClXEICRnPXqkk=|(ds36E)#A53zfr(s`yOyU~41^{FCJQYMUrH)&^kgCTSibYlV z@W6;rDW$7>Ap0lYdzHlv1QUNU^N!hI)qa)hJ)*+fdW4->NG*R4CenL40p2w^g}gH8 z84&VhX2`z$YxUcr_;|LKN#`ft&z?fh`3~v%QH(?++?+;SsrGDg4zjbv<)5R4g5cPR zS6^Ei!vcj3&$>Y86NgwXlA771gE`JOdLNh zgTo8zp3wS@*%Zfn`DC}&wjQhG*f0h$@P}S9rTL_MbrHJqQyfs{YYPC?cbr0Bm;J7E z5QJ?Kd^rnE_+@->Zn^>^t#sv-5}J3?ahxH9Ss!`l4-bXLM}Fg2ce~tl!b@|NWHtK*gR)g`o>$ci9)Bs0rZ;kaAZzPxLDmGtgkquh_4 zU&hA2ya%*8b*z~6{in0T`SINGnftf;=FH2!KL+$^H*l2GZj@&VWa7tcn z+wBr z?0YI5&vHX+`Q^e;#y`yClazevG>@q~ws0itwXz1RBXzpF&&6N{Azv_3>-nzb87-p* zdvMRlJKdm71|?#q7gxsD8{6~@IyNDo{*cDvUn_q8D zdFuR>T6LQeIa2sP3O~5Ph)OraS5rXnE>75n7I9@@bXVbw3m(Yk`oH3E?mJCcFY0US;^X*}qBGzf zaMexI;tXsj$L(fl;+Jmrq`*bb3U0c0i-Et=F3}MDY)~V$-=OAPI|{u5pIT|(=mr4K zuG3hWg)j|p7Cho(ZrF*fXbMr8>0$F91s68KXB{5)v018K7e|2cXf_mV)6G~&qbHyW22%4 z<0_ity3XyN3rw8V-ON}w_6j;rH>6K!=V#|%MWI6{T!|=-)>O}1iX)#t)XdnS$Ba^( z`+hS53g~^|v-Q{s3xC-9PMZD};aeRQFZJjP=%@)=H-0dpZ@~?ngTF^WPXo z4v`b9jL4O1PCR^*&E%bAgm)CY=QydW=e&R9{)gbir5lCc<7u)h0hZWLQ@KTU^5Hx- zrD6stxuON=XIrCKi^|7@r+gZ(4y6WxTJvRfnBVtC z%NG}D z-r$FLYspRtqso8Md?`8FHu)ti?dm1ns)oh_S8&%2qmrIEN@6zExKbOZchmvNoIwNJ zML?G53+p@nK@2u>=%Hf%;o?EQbOG=uQOWrRBjsR;HJa|Qi>=@E$#V(bw!}x zl15eI>~?13F@7ocTy2glZWvBoRS`0JED(CZ`h8Nq-WE$z*or3XjDd@j&Fm$f)ovNu zEea&S%Li=PIBZou;SN~6Ue{=M+|K!GJ(S#-DOH_4buT-9HL3~aG@}&XUH!R(y4PC! z(7$+zMqCfku;>f_m(AB&U86xzI;HZits8&P3soTsU;iu=7%Rl~ew{k_*0kPcII1TZ z@jtT(+^(-Hph72H0duF$g09;d@k+3P{_^zkv&0XkVJmlQvi2M&KQ(>nGyL>rS+LXd zJHB_vs_WtpRXmZ{D;9`+e%SnE;}wTBaQp|noFB09Vt%*CF56IFV#4#bVU%Y>gY?M^ z&6Tq!!iWOz(};n;zVt79Y#VQJ)r>c^<^t}^MiBBOmE7P zD{DcQ^bo_j&OV#}MfG1*w=$F%27w-v zrnog8UH8$|nRWlg`|iI5uH;Xif8ncL6Q^WmtsI}qLUZ6Es_br zThThy;>3aA>~pNOWcju+VWo4=^4T`<95p-x(A?8?hGMUP=J3wZh`ygbR;_r3SruWcS* zt=HfWKdbFvcqiI=4-U1JhF5v^9%mN*>puz zG~Y>f`)-aWC*i$h&yhz(lMpr%|;F_fW4G%+HoF|aPU6@dTx zG$f3n3{u@AYICO2o`!F$fKih_uhd$Nj4yLgKJZQoYGs5Y}BbX@oAtUFE%&;~-UWVXn9 z6f{J*WxQ2B!~O-=%BszX)G$Wh6o18zqFcowYI1-7#jN(ygX0C$e|l|Z<>}QWNt_$^ zzx4MEveioE{i{kSRKp6%2125TuV7_M5ddEit`%Ow54}}-gDVPAbc7a#U7J&+GxoOZ zlG%MZwmMbg)Fa4&4Cz~Xd&c*~7K+A?9;J;TDf&&FYiBQb`m21I`nmtR`!q@$%=$eb zEsXbRVx{iP@x$0VK`$!>l@`8Tz>ZR{m7=Dteq}H)5kjiPSJcnc=#|H$+_6XOC!AIB zC*sHZw7)=Kaaphqch;g1(wm(?(+~x#5*rIYbW!fK z|L7sxDUx9RA%&2*lbQXBB)sB6RtFmKWsf50H-&?M!jKk||=WX7ud&Czh$TzcNGbdqSo1vHt~l zckl9r^Gm-~;A|ZlVG+RoAEEmHA*}ZMEQsL?cdzczyUO%j--$5J$HP=mWGIJ_We9Ja z(xYDyc|~_e;{>i=cBp6R6J-6i@=;p&ufnnJJ?I7=PQnUr}90{TjzN+IlYDTwz+PPGa zqWI>1Y+VTT3b<$rzL+}o=@4PJ^sCCgN$N5`1RQf&XN@Qn2$Z6m*d2?6v!0fqX;WL zizfA6+5Yf3rsyffT}zxCY)NPWP5l!5aOBli`q7!FDj!`GC2EH)emzqCuVo20 z)gdhNdS{rJeiNm6$Q?zE3QwP|+EO!V(uhmsA`{jp?o6`UA(!~{Dkmq7iNgo^i1@a> zw=YjY7OkP<{H!Q)=~mG64zd zJL73iM0U+6LnG$^TyWfkY^*P#ZTm*^rOSlP5J&Oc)3pgq?C=R zEWf&o+QOp0ONQH*O_4U~k8TnctJ;RfIkxbvCgvJprZXZwjs9g=cplfcWy|jlus{7L z4m`4BQuiq0CeEqDrvnx~DmKA%!xc>verafKPT)^M^=AcA7)xsSp6;zme+BYNN4%KX zy1!Y4!9(k9q5l4x5$?nS3FFs@ikI*Xb@EkW1Fx&ajSg;!(mPkXcezrbmC6|~-EaIboJYq5fN z3|sXmDy=-4Q3DrMck~|88*PZ{Fx$uPVZp_PPokrIZ+%eOYnCkL3P6QuVh7f74fbe^ z^dJ%e*vus)w&}xKxb$J2xwjmR-;0nVNx+45R7>m4x=1OJ?71a8Y@`G|_GJ59?T%@e z`d)aXDT~7r=7Ud|#`z*|@sGHdMes9KM=s~5N}lW0ooRX;h>sM&KpDiOiS@LQuQhxx z>wU~6nnmj?G;JblbY0@h#^Oxte^$c$*X`wb4_&ApJoj_^k2zvKSbxH$+jUzkSMs5F zRn52_1am<9$3(tO`Cm>N(CPwIa*@Vx**^l0c)!-+V=%eXcLKQx->C#FLI+Ad|BlT# zErpGgbysfxHaF5z6kPJh5911oZyjGfDA&BB`LBGZo!dX~zm4kUTVJ7YvRrPVx5xhb009dJs>a5gz{a#o4l=qm7 zQ%PxE+bA5*4zy+FTP2|+b255LNcws{)(<8+#iY!+x=tL6Z@79ez?9Txym3+XHf-?m zI@^r73@yFD1-q>cbAWo2Pyd(TnFK}O+Ls9!eFhTX;~!c1F#Ffp-q_cvL^3eYP`#q0ERWK|tX+1Py0%HrK6P!)NBE*k zQ&?&s9N%Wacr#Tb&#~QW)}>GNA9%GV8guj2euu5~ZJEk5HqWHG<71OheB9yr!lcwR zuAGrR`R?^bnAkr?w0&(9sLpd)XXUpiNjOXLmtAp99=*W*?K8>F>wn6A$b+ZLz0~|7 zKu37{5t{DpKW-ey-v-ArCW-4^cbV_4H)RdJaA)^Q)#2jmNhYMqD>R}ZUk--i-PbOU zbhOrZS}ca>M0HEMHExyv(T+$$jz1@-4D>8mGIgo3Ylpz+=D%=ay8SOloheOD$TDKK zD=ax(N9-z0aO*-#wa^xzK*(+ zOKI7vGxWz+#mq{#j#9L>K@nr<8+n@siD5q6sY^8zI(+R1Bx7W{;2?22T+`2pq0U#+ zLCU7;QA@QATjPO|FGofN?}A{`nB79U_LPj-PVV7-I2>MsM=fCQeViNQG0+dD&1i#; z!5eGcoNip+T=*&C^Hy8MxH9w9tVnxgzYYgMlOwViRbOgVc7{+w+T|!aCmx3!YMdK%!#8W)o6&25%?Zmod`sIifH)*1WW6QYI}E`<<7Y7V7}<6PqB^#} zP@{&l3jiW)T!m#9>$xQ8eegJ6fe8ju1y48|-pepDuu%sDZE1nEXIWml5QT+|RQ2N+z%@mV7$F%dT2mHFEG$+u_Zsd|TsG5>;+ZpfD8QyV4QNrz!<|jdO~eG@ZdMl2)5mNS+2HWd4Az3P0>bnQgLr zT5BpVU%NBoxQPujtbzD*uNHCjrNpBFf{)&V z+wV=X3L)lTb8$bcjWL+%CsXQ>V)i$Y-TAG9)v&?pBsO{``npu7^Nc2E3mvKj_MWG; zaNFGl;v+e%nCGwm>fFt1fYF86xGyQ$h*`HE1I>GsN6rHYipWs?zn_K&R)absqA+kh zNLjdQ^zNYs!f#>MfTv!7X5x5s;|4Ehg>5jIyw%tP-2_&H;6cY2WPaMXePQj@Uwhqj z=K(b&mMjE1pFQ=I5m8}l5Fx)={4@33d9EH=@f}D$N9d-9sBy37PDgp8 zH0nM^|AOnb?|=og02+($h`YtF)JJ#+{C9cMp7yENR-IB0=a!@xr0tqUr*2Dst@Ho> zrz@cSabh%j?y&RuNQzxkC2v~q>&lL+7oD$X|5U#)D<2qgE1WSRa>PE_ceEguxD5h+ zDR0y6*?lGnRH%^-353p71L~4*j#LcEpe7BF=Cu71$U-%UUVDY0Nv(?Kz59wzQH28? zBW@f{Fl*9MZb%XJ3E7GO(H`pnS*2jcXRxT0B(dLu3=KXvJio(3-CJM@G<}->kBLP0 z+C0m@z+XcbB_pyH^{P_GqGnL+Hl{z;?YmVi)-Nf3brPSA;xczh-kPqRp+|^bCCr}} zcd7c8P*)W~&5;BJwa^OjxU(|8MJbF8?w+6N#vjL@oo5t?qVLXs4Wm>t^N2RQMBfV? zX6e<*@a#YIp~1AEGj-ZN+MzrQxkQ}36VtCyR}E^ELgdI!+i_GUV{O1s=7Z1Pb%|+( zc)yG!pY_nUXcrgYnsS-X7r&j_pOMS(^v4IlvRb!oD7jRFuykvLvU%V6WAy$+%>=Vr zi(H4S?<*kYJhgKeAGTQ6PhYp2#lEhn9k6r=-sUtKMX&Llk2mjO#PR5$SrT-%F*Yj| zkJz~MA&~cN> z4BcX zIxL=hI2Yl%foOJ%qL@mmovzU9Y6ks6{2_brv>d|Zy4yt=78z~0Vf$E}cWbFkn9wWw z>hh=@j1-`5;jE#-!y2XtjfZkEM~6^tsfXm`@(fBcYBtXv7HW2Z`yB_$kXLWf6BV%j zL|C0@rRF?t}mR0KD&xjD5bpSMtOcRk)LvoY|k?K%K0^1%WzBugV1<`jW%8coMfV8(~8K zT{KODI@pU6pS_rH`jl~Gf!J|RE~-rUs#Ev(m`NVZhy zt+yIgpyQ=!JKR5U(;4*8lePO5#>tK**oR5#_z1DSV2V{m&bT(f-U?O6j&1;*msNJy zm2FxwPjIz}r5;tPg;!w5h?`|!H2+-v=4PJ|wElb!1!2V+rcL6T2VZ{=2P7Gdsqe9+ zdrOWNQV$VQq3V@7--};ii}k90C_I@e6OsSfqLaV1Qq(wIu3e6A^~A00?gaxYZ$v(K zio)kygw)88VZ74|}nmcU2z(T8N~ zrQmuHSV}u!EE^p~pcgwJBZ{`m4KdJuXw+fD?gZ$l%J})Q&|Ml-6y#``Iv*OM4LuR* z6uw+ymrmWYZv#b>ze;RFf*$EiDNv3oN5YBXsQE%D2(;^3{oOECN4$T|kq?aQWd2Yn zm)vIZt8g#>JjF6K`ygVOYbTn&sa4Ii4k#n% z2v&%TT@S-k8l4VonPNMZE{0`54TV`PyrYx8xVE1Ttw=4f7sVL5NNi*$I_p$u%x=AI zhE|b|9JpY=e;Pn7W+K}RoCE-YTW#I+gQ zPl|vDeR*-#R4cmZSD=0MY05}?QBE~4`Sdb6tJhqni0T_%Iu$tR{%=(=A%e}8?s(qh z0L>@vYgNS>bHeEILK#u?jjAQIGzqT+63sjZx#1Ob*aCdl^O|2F-m@mPDZu7grW^W>SeM zR<3ZX({pe~1nNKX65ImUx_y=f^Epu=&+6z0V}_U)L9v#K+VRP(X;(q;8*!rp zxl`mN+{CsoigGBQs;-tcmw&9Z)x0TGEO$>b@(#MguPZ1)Dgxki9>QHO?@ z)gR?*0psqNpAVNC!%I<<*>blW7Xx37ae~sZmNtCUg?a2fM5hJPgxNP(wVqs^;S=%i z3=SeMBF}Rda1@Hmn4pr$mml8-t)e!{Fau=RhWn;>A`zOqqTXywsc@#b(kn;7aa0kBVIFnMVFmCp8=rL^(JoO|=L91|-d| zUoB2`DceDfRp;zu)crfK;pvgE;fB^X(Ej$j#RrjqtgPhVF;DXTu_ig0Py?^) zAHfbXuK3tMa6u}YN=|NAN*^D(z$UXaWZJ{vW;OWz0=$!yi`C!`m>uTEO@eoY*ALR% z8GrRR2eL~=>a>_w7IOix_ij{`*?G@3?-w)Z`I_=@d~8u3dTeu+0tePl35jZX zjRfN=u}bXCjKgwoW}MyibVl&XGwL&{9`tMN#}+{3X(V;^-zuKD0^39{XdEb|(>FC#fix0qs|p@6>f#6lW26Yv)A$>k{U~R`VaL*g3UlB>FcK zkZgL13^M&B|eIO+|Dr?RYgFjTyW}5v84tH?7oR^Y=Hr?*S5Lu3pG?)*(#`0X z&XQWsJ-7%5n;Z9bu;)OLM!%=Q}oa{zZ)r9#{G)Z;{JM+Rr$2I_u0oNUPz8 z=yfBGN#oo_i2|-HVf&+pf$8^S4gDnm@rRk-Y#Kil#~)ohK*iQ7F~WLetZ#%HggGJ& z!BG({ZBo^`R9^WMS(Y&6KB7*y%%#B$Vi8l-`Eoz|$FhIY@FR-Xa&70{+cNKn6z>d8 zE#5`G(4Ip-Vgk+6o8k%ZRMMU`!Y67khjg^vcsNfw0n_r*CI{1*qVJ?GuUebupvs_9 zno7Uj@0@O)Y~}Z+Escs!uKQJ42X9)*T1UebwmWwDys}*18x^5${gp&*H2Ft|(speL zj;Y1t`c8&0sXnJqU#(cyF_HuQCKZ$*udnxKV|$6Qp|&*q2q^op_+-=oUZ0z)WP1Nn zu>WXb6=ASTrNYq`ZSb}75AY6339jB|ezCNg-{T{u%RxJ*otddX+xyE5;fx~#*3g(w z%uf#-Zb6<+%u@eq{?euH|M{}_=42IIdUU>U%ooYj9VQwPMez%vR#_sHgDXz%*w#*$ zwQgeuE;RCC|NDIMhUgf%_w*A^Iq3C9g%Ddf`hkvIG}0YC5w=eIW<3`eEC%ni| zkNvx^!BXO3IslI=88h2Z;PUu6Bq1p85wumWTzkZ?HOpNc(%EdKG>u0-iLOo>0JUh2#PxbYjkyWC1=#D7q&YtEFn_BM)&vRvX4yXg%WTi*`t~cbvk)B`5kqVymEv}~R zQp8oxm8pm`wFMq8j?n0XzJh9Dt=P=`PDmhVQt7Ze@33%uTwxnilsoM_V?TZqR1Dtu zZ^LGXH2B|LNPEZm3apy(=l35*tdsxxRUexx)ct9YT)h*yLm5mHWlUJ!s)$>)Mr3Pz zJjKmc5T+~l-$<+l)Zp0aM%_M;OV-Mc3>?XTA?v(J#vJeM|nz$ zTV0V+V@q~dpMvF)Y&^GbxsBYlCQ5GWVL5Q=&Y;uMw)v$JcUe2+pTLti6v*HAXr_(Z z_W*M=bI5xUb1Y&jnUkC0m}|=dw-dNWy$IrIhNu|G8nQLhI&!3EJxwVB?FC$n>Z}&T zs4K6}i3aKKGkL|w7sA8ugG345{~n+Z>seC|+*^ItYcq^C!=9%m5MX?B+r0TCwPVWe z1RHbqsuSoapj`=b*_7QSVyDY3OwyiO#-~Cte>L%o6XFiE}zU?+i+F?4UK#d8(&o$T23{T4tr|B`AKx7Ds_!WkjjdF zjOASft>np?uEEp-B9Q#K!AzB#TbsNVSf%|l5d$9F$XZ0o%lo8a#2Zn7o#JL1Og78h za<_H+G6pb%IB(`tTPR=hr+YrXq2>JVssjCs*T4j@+6SGD>a;Lx(T^S5A1H~<5IW>`?h{$G1n`jzzB zwd-`A?5WHKk7-V2oyR(+rk3bYv9fGb8yr)iGNm*%2Sh=kQ7cpHIL~#+tW-$J2}O>f zqN0)`IUp$-DgpumGC%sP_5K0x_x6W-fBLO^t!wT3`dxePd+mF<)7^FUK^+m<-%!*G zKk?q-I-Mq)uBQN{E9i0I#-7TsJmk$!9?|dHcd;QXe>0;RAr8p*J(q@@en6sk^lwT{ zk??x3K8!@>Tx{7{HBx$W-m2xw7HkR7=gYwz*XIUCd8N>NQ%uqIdWTid-O#UJ}! z^v7F>`oh)8-j;0P7yt1%Ex93&LI;W=mjeV# z$*9k;Qu#7de;{w<>GvDU+s@eb4_b09fsjl$7R2Wi45?1rIE_qO7rTBW>d=)vsOfLd zf&huZsxc+ho{NsI>V+bfdQQL+ODbNK+!&KeJ9`QuOAmTWyJrP0ss$Kz7mh@AV6LiR z_xfTox>nM0_@OR&KAT=;@l^gbsKV{>*1V*-$Fzy;61gT@+?hn#`iANhr3i*Vy0M92 zkma%Ld6Sjxt=R_8bDTXs_u=|Ye7Cp0ifpa}KRhRu@3P!6xz@ZftLm90{ACSjnzi!7 zrBQ&6ap6|)B6=I@=40#bYDdiJOtODGFHOT38yG!;hyK;SI7?l8@N{x&Wsu%uTH*C5 z^9o6JzR4c22k-f&783jbZ9~BVloY)HJ>})a; zSemZ(~OJCDZA=8Z=2-YEBC&3Iq;&)t-dWTYku zMv|CPRo>y`s0pxsg{l32VhYZB8C3UeTS9MNFgBuu zBzfFkS2VnsIv>3?9>!r4fLv-}vR)eE&TeUrT@H3J`=i7@(FCid7n^>nr9yO!1pPCV zYEg1-WI`>_1=WWOYppKsd$=d6nBYt0Ep`#}m6PgvN34uR>s@52!ctmul<>;zsa<4e zP>i&3l0O1~`@ND6l4_5Bk65jY1kQ8zJR^Lz@jH4Je}^yLR<2!o%JJ}w+>&>Ce^6Zm zyRG+=@%n9nV==`$xnF9BO$T*%>jGZH?_GSi-+%DsQ*9oEYW!lgX+DVdAQFqxrT2A% zLiQ`|-}$G`PfX)#E{#Vz5oy8e+kETKDkr(a+w8{mS>Tas$L4kxOH;Yp>B3LuGD_7G zp4V^F(=5mhuJGwb&<1Ox+ZHq;ahx=B6C5y>ALleT+Ek?F#Xmmm6fZK`W9wu}b~%n@ z+?aap8=+{7>zRKZC%#GS!*gP*fJHNL-Tcq_wgql!7xyj}e)}x_x+hKiE!`?>?{iOA9z?7%U(l}{1vPr1#PeZv zsz)!8U2eqS!lzUxi@OCM3anz_O(CaG@xqMjUI7$5B?8n1cZX ze=^WK2u2aH+>_TQJEczJLK-7OtVTlQ@<}krRWz@u}kZ#KE-2C$iAW6Aw%ji-@M-O&HskDJ!Ydzfq zG4Q(@jCSSScnjwZ9qP2;UEEE>Y5V=Fy3av*>Vqs{5N}-aOeo4P<`yUcKp$_5jAxxo z&+lTJL)r*G;O_gbk@GE+-!Egd$eX=GKD`a$2YkzqqbY(czi+Zy-Y*{10@`w}yk)Ag z+J~ckuYeE&$IbRbrq(9Y#L@)L_2mkN1)+!9+)@y(Bbl&+gy8sp(~e~b6(E32g_Gec zHFo%I=QrloG%)VkYevF6xb*iHw2cXjx1ho4_$2Ag#yE8-!KmZd!Ib!0anuZFFYD^* z5@2Py&0$@M24h^`NiA-jqb4qU)|)dCppSk&_BlYzAh;Nerb^0d99)0hYaKdm*D^-e z@B!pAleES?VO8O|eH?6X5HE|R=yffc=8TGpuRm3Q-_onhHV`2&E*+c^t zOh>20f>!mS9IP|h!vX5uMMI;VAtAw?aI4X0JM?y`Wl}o#o8o%$MnLi}ZHT@IOPjf9 zf)E6)!bqNQ_tYQ^KG?Eh7Mjvilkzi9v^#Gb!ZXLizyH2tc@ zfS`p1fi(9)#zye}2#(AGI_i)g(sw6Lm4Xj5acoQUKck=EJW6i2=ZPI<>VYj4PV;i; z6bswq{oGJQh%3`(IG~^qm5P4(5VvlT`xF-V(aD3)7>!XnI|a6=N2|^Oewf2GjH?LN z_CI1PBJ$sJOK_Ua*K9VO@2~hXd}MD~9mB=ms8Z}Ky*96umql_a-%|TrDU~l4p(Uc- zaVeGZ7mO8d1dX)w^bVf>+hA8uwQO=B7RVluyS!-X;S~lA42s4`15}{nA5Kg4r3^NF zFOt_za2f8k*{~OP0YAGHeiVH+NWlopg}H(ieeSd-**)_t@tZM9^|3>PieUWBc+M5+ zsAv;6_u|V%y@{dxAvL1q$CLW^5I7#xRGNsQoef5Sb=H zzYnOfT#qKuQglz1Sb=pol}wa#rSo%TTY`-hxNE!jkf@SRPhjjI zO-3yzY|n@tPxJc1gkc>3kc00)wisA|QC#W?Z=6(9JF-+Fm)zd{LaX}+=xeM{po zZl{b9PPZ!ZYDaO|4rnkc4m*_io=CazTNJ(FUJ~@+KO7)^#Bhr=l96EZJToUrK&gc+ zYj7=(*&0>K4=jLgd3V&}JuEmm+H|`Vi(#WtifCD8+!70o<@Pk_wEOqog7Z0#PIq`= z$gS5)w_4)*H^@+ljmx)H0!6{G%Bz17dUr2W^M`%J7jn9B%zkHCcVBlHGcP@8MbIa3 zNjcQ_>d-E>9^nPJl0c^*E;fSNfQ2t8_?9Jazkg6lwhzra-x;G&AjjbDyt*rN)kcj@ zJWbJhK_1vajdTL+QG!vigmI$ZjLl}ITd3tdMgEAVbg6qb_&>)dBWw0D?|p3QjD_=0 zcCD_`&Hgu=H_Mt-NyA3P zVs3Ymgw=vfx}0aj$d+VLpwBzGF#S5%(1EAnvgIvuG-^dYYm|vL5!CH*3Af;4wz=s7 zv6bUsE0A(1aUV*t&^o792t?ToC~ekHyQ|0uj#7VnrcPJ#&sXi|ZxONNY^kB&dcSqC z2}tUK@Vq^7|CW7Qc9!P>t*tdo^baghdR$XdWCmrZA{JYif6)5&^rWCyTD@#q+c~qF z=!LzYl_g3?MBcJ|VM@6J6@qrKW@}ra^V1^5g!RQc^iP``{Qte0ws%*T=fap)QPSgv zTE;ZmP|8?rFG#}k^Ad|Fl)sbcVGx{)RvtaR+OKh*qgA3S=*VIAk91WF`7b{^2fDdk zkkTh99XG@YvnRkk1iJu#)C_)c}%^^s6g z5JbI{n`p|-CQ+XzbKCvSH9FVgWG{8t-`sY?j*PFUS`;m$B*djhCkh{GxCF|+H!QNv znkxJq^xKpRZ6pm@V(0uHrR1+!=Pr)>APXPlak@@OE+M{d@thqB=P!*Ji@$=!Q8Po3 z{4xA7KUW8na6ssW!@sN}e0XExWHVV0C^ihOES?cEmH9cPT4VXYz>|nCX49EbO}XiN zOkUUflY_NVHN`~#&+3~ASddW(X?8U#e4VF}E0K+9V4}5uV_a5nm1I=yFkaS3R@T)Y6SetQXP^acUly2LFIepajOChN6wK6II-8;yX2vU(f>3G zO4|00!aG{&X^`6Y@Zp^uRT&*#v`xB}9h*TP(HB1X)gP66wk zbCnTiIwj?^4=nbO5RWueSF{)Ic})FDuXFNM7k68ygOkl`PTcgGegm=gEl1al-@MB! zKv7c~?%tmHd{4>CCD7?&yC3+78o_-#f1q{;icIn%(#-UeoAhoM&=ngd-%v5mHiHL% z`_1Yt5nU82``8lHb6?fY05jItCB6k!$~0KzLBWlq8-Ql)#D~JaQJg$Z6`1Fk!!Qqf zw9{cVB!FE;b5;F0NE%w|w;tZ6zmYUaWzLDuDJP~@1Le!*st?;Wv-X^2 zJLDPi#;gj1ot_PgdNcZFmrq|0kFUc2ro7ItvJhPg`F1yfdpgL8t+R}HNg6)Aw7gUc zX^8mUE|2z+#7?rIr60!NJMZV2KLTiEl4v-$Z24}io_R*uN<`t0I_JJPFbt`ckx3|Y zBx)@XLLjj#x_#l%MeNbbEZCg`w9(se7VI#P%3GZuPcz5VHd@s0S?8+*DmKJ}Ex5lm zm1#J0HT*M&MW6{Y@dDg9s`(4y)S6~ht!|0s zk4CK*k~qKesD~E42exGJ6H>oi;Z51CL~r}y?@x}0AsKEicIjpaV&wA6#t6eN4Qd>> z-cbXi1+Sv%wKy957291dDiown@drsdRy*rR8w zOUK_(iW=Ix-BZ{7V}&t1(*=X{S4tkH$!~q0$VojJYC2(>diR6>LpCyH$8!CiHv9v$Brv)1H%A^@*N3U&HpyF&q@D_ zXW>#4!IP}Mlef)1ZfohBVsa%NZMe+s1;ii?$@t@6LNiqTY&r_1mJ=n^OLlte*KyC2 z-Ta8VN~`B%BA~?)Ka{3vB@#qbgiprey;0upDJD{$AUXo-#~)if*qpDVq13(2(zk?Y zTq`(YURSSKdVqmyFe;qDu)EJ;4FR}HNt-mTN!(>MiK<{oys<1;G?CsiqeeTk;>>yO zAVh?uF5Xna;RK9uzM<-y7snHkjKvyvK?3d=rDdK9_XxN()wg!}Hrno)q*y+IM#9Vh zBq-1Mk87wbBz&5HjBMJaHLMI~^oX10kCIzaSazAOyk$}as;|sUR4pZ?mJouFsw#uX zGXx?7*Dx=X%fqgks;f#!urG+H;(=an=GI>c<7`ycxP3qfoi|y*Kop}#M0PABN{=^U zA6q2n5#o@Hg&N+BG|80Li`Gx#YK}CiRZa7bPcnC|Dbo8J*J{ylQxlx2TQ9O47&a(p zbe%i~bGfC6!!SA5Mv8s=n!H}WcP^R92$CQoMKZ=0xHk?bMVk_N2q_#%xtxSq0%IDXf9;lN44#_(=+@Ap9hS lwe#>(DXfC<{~!gm^UbA8C6S($&^7eVopwKkIeGoze*vfdB+vi= literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf55702ee7d319f454cf52dce89059f607a58b1 GIT binary patch literal 285 zcmV+&0pk9NP)JE3pf|SBpW4BJ`4opu$_A^4v=~A4 z1jFX^{&anT^_)PG>~@D1BzbRFG?*7bKqnY*ws%p@3hKw0O+vS4*YArzaI{s(r#Uo1 zb_K)os4zFb0M-qGQbtf_&i!S#4NHc_!GoYI^#n(wAYo9pmgC(oV6s!x?rY#J{O1Cu jdw(S#DGZ|`;2#37_C`s7Rbh2^00000NkvXXu0mjf7HW2f literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e31e117a7888fa60e4837a2339dc0dac9a578914 GIT binary patch literal 685 zcmV;e0#f~nP)2Dh3O0&Z zrC_T~qS)HTV3NsXW<2*6MUYg;Rj1H7B#UHnZ=QSJ_dPS_==4g2Ei5x`fIle#R8<0~ zssvC~381PHKviuIK-U8N065rZ;7ct;r4h-`f8!}c8E}WK;rtOBd%F$He{Ny_PD0ir z)SD4*6&mpa9_lyHpVl#y)#;ppT$hft6~QtzxZJ(oiWzW(Wxe*WhD#HUbZlRbfHh>9 zhk5PQryw3cjqfYR9F(geE>Aj`++)HEZ1mF2U39VZHNe}I0B7?i?!5N?KcLN(gY3I! z#TM=@G%-`)X8Oi8kEZE7!I`{`u9Vg>oD!f=Gl+2ffQ5_W4zADEq?aWxvg-u6i+*_=lD& zAx@6iEO~^NA6pXW)JO_hS6A-8O#!oxCPP@)G?p_0UszZTkk6U&cGkx@DKbh#q}=Be zi+&U#y-uh{i#|*Pm>M#%%06UfBg0^oO(pXO}=Gc1+Jw1JGyl10)f z5xzG6_~_uqvL08HL(%Q%c*EPA0Pjs}Je)3JgD@gk$o0Tj&XA7syg!Fa{6-`}fq?D2 zZVOmqWR$AS-@bqF&To6#&Gh(vXY01dQ1 zjnN2*f|?po8f^d=H$hbF8#G-1`D39AlGSaoQ^szVc29d#qzk}**9s)(w< z=8hzWb0K;r0yL)#%+UQXs*fFYA-r{E0_`_iXkTE#pr7}j@v!5bB(~q3#Kl5{o3keN zeqTg6kZ(&}2(Me>;JqJ9*tRNxXYNbm)dK}&90M;t*nlmcM_thw*d$lV#cF$S1sFp@kpLdibo*#ilzF z2q=la8}!B6yPLCkg}lvpYhy;XDFV_7o0POmnk=kuv$5hP3nwqkC8})#Yg%Iy*!%T> zG{O%pbMW-NDSUjqEGjY=t(J_5ovTyW(4G*_EGO@G&>=7moc6GVirZr=lh}QzfXSkq zFGQpfUVV#=!-F0cq)mK&(iQi<=y&INl3P^4ne=bDNh}YqXsyKSypZCmj z>(jVWitrTm(Owt=o; zA4@6M`zGWm5NU+>^;WQFQx^MrDxzSWxENqBiH~R3rNt-XNm5!b?=N8S4JJA%=eZZV z6cq!PqtZg%hxP=dYD#T0%fFYa7qS0Rlgn4dd z!`Nt_nq`XKj(*l#?-g@+$k0Yd?d5v37HWAOppZ;1#z7jvz zM7f=D;vs^oIPb@MaUbWH@Ir_P;rByYNKjRGC`#NAVhC|-EbKKCex61--iSBkFkRSS z;j76t#nF6#F%lpA?#S%tTI$icQtV+? zVSJdzY!Ux?#3xxAkCQ{WNQjeVG&2v8E@w^7kDVZOmajzkCt9Uu!rf!>37)#nkbZph z?LlagVny~8l6H|BEuLqNlU;qFB07*qoM6N<$g2O*ig#Z8m literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..d86db7ca2f60dfb7b831db3e87d646e2c5c8e141 GIT binary patch literal 457 zcmV;)0XF`LP)jR;pc8F*Uy>rpI*ZS&2B)I>(?2ENN+QsgLU)Vlb4E zaw}5|>9~fvEpY$Fu{3EQK@zH;L5ln@1XH7$=c$Db`#)4xY4!RqYkw{q3=P8~XatR*{~!7Tz`2;-GYGDA00000NkvXXu0mjf%S6I9 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a766b2457aa0c99b21670a7097795ec8e501b90 GIT binary patch literal 1204 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 Zaap}>^cGE}k$&`&!_o|6T5s%{_&-@Gahm`D literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef2186478c1e78c33ecb480b88439fe46d1af91 GIT binary patch literal 3291 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 KMNUMnLSTX@2Ma;~ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1255c37798917e9ea7930127af97ad39c7164d46 GIT binary patch literal 2985 zcmchZc{~%2+i9I}Cr%`saFG4i=4cHY7;MzD2mwriMWW{5vm&g`w zXE4#x#@g1o9}nlVCiaOS)J&BxC?^UhfT<^Pji3-54vK@;0xrI@8Q8WxzB;tUxrPxxkQejd~ESIx7Tq>IwF@;#@ewXF2v4Brvn`pjYjh!DOl7EnMuXp;Wv# zd(@&!PKj^-Fs-6$r)D$mMXs#RaT^dqp!XHMJ?pABT4?k&es4M&gL=u8eBS(52?55x zd~1-ND*L)|B7Nfz#Vnf&bg#-P54Zy0i`Z?<{z1`LhV|?Ss5*i;8}|{y+5n7Sl=e*N z0xaJo%SoFiF9OhhBB(g*Eds^ma`Z4g1zzHKGJf72R3~~AHa(Y|*!{**_OhA8ty~Y#EVcm_o@w=$S08Ie=(kbFl^ zXdg`+01+#$y}u?cY^3#BUcr0J65HC8@-iEO=dOhHA*9D^e+{ztR}q73Dih)Mnh(t; z<9!Cf-M6@d&NAILtGM=L0Rg-K4E8=-dwQOtlczkHS-43f!d_#cas>BAIMt=8&G_m(!@t2O*r&Ng%Fx{H#) zNEm&LVp{!IH9Lg=B6q?@cG4C3^t<%1^gDb_!13mAl+g-D4KKWILxw|nm{u*Tk zz_&K(@|VntqUF1$bpCKG#nZAKm|iImR7%#`0 zmt}*y2?f1(mE9)syh;Hwoj2D<_r&@br5oR$e9XSy=`8%5Df4(}>M1VNqOHwl^Nsrs zYvV;E97dq2eW;Vuw9?P1eIvtXFKgvLtn)2}D0s%Fm+>)Cs(({lJnR?$b<#&J3ENBTl?Gi&fm-41V zLVms8(fsNZ*JF}94_(Av1tA#Nv7r?*oz&e>|M%U^ZurRWIKqAWiXAX&C-lfL=N#VP z#BIUw>+s?hW6@0ZEXTEn8NOTlcv+tl^9lU8AhmAI<~k*%w-1Ww)P7>C<~eg(p&<$I{OEnK_5+o^{=SB1;$6yLEvuaEdWsEWUmp1#`=mSOXjVD3k2b z&=DscFbEFOwWzFk97tiwa$>PUCL9yu6B_w*78``jXZ-ds&i#?Sa!=HayPi6<*+nph z6w&+k^W+~nz&BTT?lt|swY{9PG&Kvv3xs8?)cxHNnyWCUSfH@)YkQ(J{U@n)d`;$Id-9jo>*K^?CNG|ADCsN8Uzzx*!u7$|QD8!MO(9u!p0PNG)~5 zJ#!!NLpjT^Hu)}^V&W_vsu z5%(N+2asskK?SJSfh24p$ycLq^H0Y-*WpgY9Ym@0!2^;d@ z!H!!(_dRRa`e`qpqNHVnDzHCJFBO!;EIkSsngcY$K?Xv=SWe~Y=SvF?q%LZZUq7A8 z_(HEdi;(9F1UeuTU+D{j9uE_{z|T;_03Ywe#;82=tt#1RBR%1c>buUWH65~U3%${K z&IZz#hlx8X5j?>+92Z(Akt?&wqg2gO1$R&Qx*3pKW;_m4U(8b%9@NtJx9<$KlqzERmh0o;3sm@tt?nm|2vdsGYj7kXwuWimF z)^Bt9Lre!?`bz(uv7tY=Pm*<4cbAhv(Yl#_(TNejrLfYM^qQp+j7e|Czq4 z8}^1Sg3Wf^PH#Oz0(qik2c)Jx@iqso?qA9fTGr~oiK+9jHSCkrk3>D%i`Qq5=HzEB zJ|IC9b>(+{v?*@E4^NliauRem>{0*z)ci#omdz{wsWWzhX_0O*BjJUKQoaGMucps` zy~Ct(8b4pYOs(vc$B)P^cN1YDf{TrI&5TZlL@_qPjFiCOdP1Ga@aWBF zF{)TCKNmvEXqw?YsW*>Ss@o>fH_OLo=90d*XiytV_&ymdBGlpnJIa<`e2{F5f8?kg zTdXWFGlv~}z41`ZCg#lj01(Y)O$*$BiXhB*g>E0x1H8sqA~LQ2Td@59AeO~-cBrF_ UQv5FKFM_jKncKnZ&2A<92S8Jo=>Px# literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef2186478c1e78c33ecb480b88439fe46d1af91 GIT binary patch literal 3291 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc4b4a67e7715903091badc8b9a361c2a547c78 GIT binary patch literal 1658 zcmbuA`9Bj30LCYakmM|PIZ7g7$+m`Rjx832jc7E*vb-jd=3ZlS?B(MqM{?96ibTRR z({j&Qj@)HdZ^cNa8ol*5^!a?B=lS({etPI`XeW7D4OsvHAdhrLocW#3f3!pDw|jnh z>I48t!I22K$90J>`5{CVPnFJJ(3Yn)p}IM5Re}@MfN&XExWOu@#GIp{%of5=mbuHA zb4pey+}-Bx@8rt%D&sHcah+oJ9fH%!>=wLBZH($wQHf{X9x;u;J%vJBimyg}^h#=) zxZNk5-^xbnT0+T7|17}-@k`g4FO>W3Kicw1kc4x7vYCj#gdrI|#4%fBh5Dl(G33Tf zir57tNOb^Ms)Fh9^6)9toc>YQ2WPQ1yfj8FRsEPmOk{hTWHxJ%Hk0-BzzbM@gt3bN z03-dYtE-j%zAu5w%vH4}9m;52?=+9D*ThvDbtbo($IKRRH5I6}Ri<>r+k9(nNtM;+ zLF?%hb`2Jk=6n0tD8=C$L~W#xe!mWDZ(GB)d|uT-QEIlzid>X$(og8fB}6=bl6}eX zVjJ}_Tn@KM@b_tub|N6(3^!%B5|Wtsb7_eW7J;=S+!WpIjs%F5qsf~-@S<0c=OBOn z^O7^CN3duP6l%dI$sH=)3Sm+r^(I9710N~e~U5~hy) z#Iuf^lYkvRzAt>>@w&lfdyVrxSiLQrE8DDPI?Y9AILBB)Z8YSzt^1yM-DNc1o|+uA zDD`CXULt0Cx)r^rCP+|Q%a;=jOdZvZSI%vF6>M7d3 zBZuA@v?1fB64`BK$3pFtqZwEVXM~TS=`vp!Eix zMg{>T>4mq1;0B%Q;yqj|3r1+qSud+71?WX+Nok;(d~T>qD=*`8{HeKyi~FkysrzD2 zMsd96ynDd7toK1F}rSJYpfOk$JSYd@Yz8YK^*5AMn)nW%;P&Hf@DHtZ# z@YnI1!@Fn1hK}?Tv}bWk1138USR6HN(d++R*IapgHorX$H22N+Rc$0ZGX{+^SPQeyhZSjV_Do0&ov-b+xxqnbCyF<)+cb4|1xUt@{+VM#u&OP1IF$W51;*C5@Et8Q zE7*&32fVgxB9KGEH!M9DZdt+3q&8M!LgXf)RO0beT^+PPZxcS$%|^=~vP>=X209|z z7YDmU=T!sMX78&%`#xsvbK~SR8yd>CgvFdeI^-f5wWI2cdpTI@Sv&$tp*RQ|9& zq7Fk$UkRLe<7G7e;OEHofVkZnP4-sFG9#5n+Q2m)4oRAFVUZ%MDuV3}U-~hm+2Drz zsOT4YGaW}0y9yGh&@ORogaJH*$$&gWQ5G^SCrm(fw5iP12I-2|1BE4N=+>0H32$S* zX!K)+@erbyl*{VJNBwwpO#!{4h@fn(m)hpRkNJ&6Kn`6ReJ7=j$*9KGh&LhIm6;(f z1&mP0a(UKD$0RVd+_b2}<8lI(GRCOxzIK8Kn4ruu9X%wyAb?lKoz~>X@f;L5 zrp@B+a+okUFW432lj^QvJ()ybOV}H(&e;{+z*4`K_7IC4_5Vbo*esuvo^Cubr*v1Q zGxgNEgXD!z@mbA8bRA_47=56&_sW-3@52qo%!FP9OV2x_GoavYiU8W&dVS~7?6=7n z5klrBI?NT-rtaS3Eha{XP(&#k*hXj)DNrf?v-5uEHgM&^V4;-uRAgAAZJv)(96-!F z@$>n%@OA;q3-fsXYaWmzy(=o;`VA(=&_u%xvz6Odx#fGYNvoT;*Q+rf8sw(sxHil4 zJgqa6*zel`8~5yDjitBO3uYO-eK1 g+nx3PnzDF6`b)3eyDb98-=6|NI-n7c?fsMf2LZ(Wx&QzG literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c8c79b3c32049c92ff15c620d0b4a444a6e16c GIT binary patch literal 4242 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 UZ~gG!uYp7tW~f>9(Bakp0R6Avvj6}9 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5982dd1167b49d2270e498c09aabdd6162ba3ac GIT binary patch literal 1734 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 ZHM!s?sBL4W{6CNQLLH!^{8P~;>Oa+T9`FDF literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json new file mode 100644 index 0000000..9f447e1 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "background.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png new file mode 100644 index 0000000000000000000000000000000000000000..62420b9a2e37258b7231b7285c268d132f0ca72f GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*|tf$wXX8JPMRmqtuf Rk_L)1c)I$ztaD0e0sx{G4m$t< literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..00cabce --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "LaunchImage.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LaunchImage@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LaunchImage@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..71e9c817e8c3531d8b353b9818aeece0e1e64971 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*|ti3tfno(Kc$izVN6 PfGh@2S3j3^P6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..81f05e6 --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyAkJyvTX8oQSY9Ju3L39oupZbdy4Eo-RbA + GCM_SENDER_ID + 583559514958 + PLIST_VERSION + 1 + BUNDLE_ID + com.ftc.app.ftcMobileApp + PROJECT_ID + ftc-services-ea8d6 + STORAGE_BUCKET + ftc-services-ea8d6.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:583559514958:ios:5ec9cd88ca24777932ec1f + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..d432e37 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,62 @@ + + + + + NSPhotoLibraryUsageDescription + This app needs access to the photo library to select photos and videos. + NSCameraUsageDescription + This app needs access to the camera to take photos and videos. + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Ftc Mobile App + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + FTC Services + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + ITSAppUsesNonExemptEncryption + + LSRequiresIPhoneOS + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/ios/firebase_app_id_file.json b/ios/firebase_app_id_file.json new file mode 100644 index 0000000..ee45840 --- /dev/null +++ b/ios/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:583559514958:ios:5ec9cd88ca24777932ec1f", + "FIREBASE_PROJECT_ID": "ftc-services-ea8d6", + "GCM_SENDER_ID": "583559514958" +} \ No newline at end of file diff --git a/lib/controllers/auth_module/agency_sign_in_controller.dart b/lib/controllers/auth_module/agency_sign_in_controller.dart new file mode 100644 index 0000000..2f64a53 --- /dev/null +++ b/lib/controllers/auth_module/agency_sign_in_controller.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; + +class AgencySignInController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + final TextEditingController emailPhoneController = TextEditingController(); + RxString emailPhoneErrorMsg = "".obs; + RxBool isLoading = false.obs; + + bool validateEmailPhone() { + if(emailPhoneController.text.isEmpty) { + emailPhoneErrorMsg.value = ConstantText.kEmailPhoneIsRequired; + } else { + emailPhoneErrorMsg.value = ""; + } + return emailPhoneErrorMsg.isEmpty; + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + void onSendCodeButton() async { + if(validateEmailPhone()){ + isLoading.value = true; + var response = await AuthService().passwordLessLogin( + email: emailPhoneController.text, + ); + if (response is bool) { + await LocalStorageManager.saveSession( + tokenKey: LocalStorageKeys.kSaveEmailKey, + tokenValue: emailPhoneController.text, + ); + isLoading.value = false; + await Navigator.pushNamed( + screenKey.currentContext!, + CustomRouteNames.kOTPScreenRoute, + arguments: emailPhoneController.text, + ); + } else { + isLoading.value = false; + FrequentFunctions.showToast( + message: response["message"], + ); + } + } + } + + + @override + void dispose() { + emailPhoneController.dispose(); + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/controllers/auth_module/export_auth_module.dart b/lib/controllers/auth_module/export_auth_module.dart new file mode 100644 index 0000000..62fe35c --- /dev/null +++ b/lib/controllers/auth_module/export_auth_module.dart @@ -0,0 +1,4 @@ +export 'splash_screen_controller.dart'; +export 'sing_in_screen_controller.dart'; +export 'agency_sign_in_controller.dart'; +export 'otp_screen_controller.dart'; \ No newline at end of file diff --git a/lib/controllers/auth_module/otp_screen_controller.dart b/lib/controllers/auth_module/otp_screen_controller.dart new file mode 100644 index 0000000..3b9df7c --- /dev/null +++ b/lib/controllers/auth_module/otp_screen_controller.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +class OTPScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + // final TextEditingController otpController = TextEditingController(text: ""); + final TextEditingController otpController = TextEditingController(text: "123456"); + RxString otpErrorMsg = "".obs; + RxBool isLoading = false.obs; + + bool validateOTP() { + if(otpController.text.isEmpty) { + otpErrorMsg.value = ConstantText.kPleaseInputOTP; + } else if(otpController.text.length<6) { + otpErrorMsg.value = ConstantText.kInvalidOTP; + } else { + otpErrorMsg.value = ""; + } + return otpErrorMsg.isEmpty; + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + void onSubmitButton() async { + if (validateOTP()) { + var response = await AuthService().verifyOtp( + verificationCode: otpController.text, + ).showLoader(); + if (response is bool && response == true) { + Navigator.pushNamedAndRemoveUntil( + screenKey.currentContext!, + CustomRouteNames.kDashboardScreenRoute, + (route) => false, + ); + } else if (response is String) { + FrequentFunctions.showToast(message: response); + } else { + FrequentFunctions.showToast(message: response.toString()); + } + } + } + + @override + void dispose() { + otpController.dispose(); + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/controllers/auth_module/sing_in_screen_controller.dart b/lib/controllers/auth_module/sing_in_screen_controller.dart new file mode 100644 index 0000000..69b34d5 --- /dev/null +++ b/lib/controllers/auth_module/sing_in_screen_controller.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; + +class SignInScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + // final emailController = TextEditingController(text: ""); + // final passwordController = TextEditingController(text: ""); + final emailController = TextEditingController(text: "ashu@gmail.com"); + final passwordController = TextEditingController(text: "Abc@1234"); + final emailErrorMsg = "".obs, passwordErrorMsg = "".obs; + // final isRememberMe = false.obs; + final isLoading = false.obs; + + @override + void onInit() { + emailController.text = + LocalStorageManager.getSessionToken(tokenKey: LocalStorageKeys.kSaveEmailKey); + // isRememberMe.value = _sessionManagement + // .getSessionToken(tokenKey: SessionKeys.kRememberMeKey) + // .toLowerCase() == + // "true"; + emailController.text = 'ashu@gmail.com'; + super.onInit(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + bool validateEmail() { + if (emailController.text.isEmpty) { + emailErrorMsg.value = ConstantText.kEmailIsRequired; + } else if (!GetUtils.isEmail(emailController.text)) { + emailErrorMsg.value = ConstantText.kInvalidEmail; + } else { + emailErrorMsg.value = ""; + } + return emailErrorMsg.isEmpty; + } + + bool validatePassword() { + if (passwordController.text.isEmpty) { + passwordErrorMsg.value = ConstantText.kPasswordIsRequired; + } else { + passwordErrorMsg.value = ""; + } + return passwordErrorMsg.isEmpty; + } + + void onLogInButton() async { + if (validateEmail() & validatePassword()) { + isLoading.value = true; + var response = await AuthService().loginUser( + email: emailController.text, + password: passwordController.text, + ); + if (response is bool) { + // if (isRememberMe.isTrue) { + // await _sessionManagement.saveSession( + // tokenKey: SessionKeys.kRememberMeKey, + // tokenValue: "${isRememberMe.isTrue}", + // ); + // } + await LocalStorageManager.saveSession( + tokenKey: LocalStorageKeys.kSaveEmailKey, + tokenValue: emailController.text, + ); + isLoading.value = false; + await Navigator.pushNamed( + screenKey.currentContext!, + CustomRouteNames.kOTPScreenRoute, + ); + } else { + isLoading.value = false; + FrequentFunctions.showToast( + message: response["message"], + ); + } + } + } + + void onForgotButton() { + showDialog( + context: screenKey.currentState!.context, + builder: (BuildContext context) { + return CustomForgetPasswordDialog( + dialogButtonCloseText: "Cancel", + dialogButtonAcceptText: "Email Link", + dialogMessageText: + "A password reset link will be sent to your registered email.", + dialogMessageTextBold: "", + headingText: "Send Reset Password Link", + // acceptFunction: (String email) async { + // // await AuthService().forgetPassword(email: email); + // }, + ); + }, + ); + } + + void onAgencyLogInButton() async { + await Navigator.pushNamed( + screenKey.currentContext!, + CustomRouteNames.kAgencySignInScreenRoute, + ); + } + + @override + void dispose() { + emailController.dispose(); + passwordController.dispose(); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/auth_module/splash_screen_controller.dart b/lib/controllers/auth_module/splash_screen_controller.dart new file mode 100644 index 0000000..1a6e6af --- /dev/null +++ b/lib/controllers/auth_module/splash_screen_controller.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/app_session_manager.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class SplashScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + @override + void onInit() { + 5.seconds.delay(() { + // _gotoLoginScreen(); + + if (_loginTokenNotFound) { + _gotoLoginScreen(); + } else { + _checkOngoingShift(); + } + + }); + super.onInit(); + } + + //true if login token found in local storage + bool get _loginTokenNotFound { + return LocalStorageManager.getLoginToken().isEmpty; + } + + DateTime _getDateTimeObjFor({required int hour, required int minute}) { + return DateTime(DateTime.now().year, DateTime.now().month, + DateTime.now().day, hour, minute); + } + + //Todo: If Shift present then logout half an hour before start time + // Else logout 7am uk time + _checkOngoingShift() { + final shift = LocalStorageManager.getOngoingShift(); + + //if shift present + if (shift != null) { + ///boolean value [isShiftExpired] to check + ///if there is an expired shift in local storage. + final isShiftExpired = shift.endTime!.isBefore(TimeOfDay.now()); + if (isShiftExpired) { + LocalStorageManager.removeOngoingShift(); + } else { + final shiftNotStartedYet = shift.startTime!.isAfter(TimeOfDay.now()); + + if (shiftNotStartedYet) { + ///checking if shift is going to start in 30 minutes or less + if ((shift.startTime!.minute - TimeOfDay.now().minute) <= 30) { + _gotoLoginScreen(); + return; + } + + ///checking if shift is going to start in 60 minutes or less, then + ///start session timer which will alert session expire to user + ///if 30minutes left in shift start and logout the user. + if ((shift.startTime!.minute - TimeOfDay.now().minute) <= 60) { + //starting session timer + + final sessionExpireDateTime = _getDateTimeObjFor( + hour: shift.startTime!.hour, + minute: shift.startTime!.minute, + ).subtract(30.minutes); + + final millisLeft = sessionExpireDateTime.millisecondsSinceEpoch - + DateTime.now().millisecondsSinceEpoch; + + AppSessionManager.instance.startSessionTimer(millisLeft); + } + } + } + } else { + final currentTime = TimeOfDay.now(); + const time7am = TimeOfDay(hour: 7, minute: 0); + + ///checking if current time is before [7:00 AM] + if (currentTime.isBefore(time7am)) { + ///checking if remaining 30 minutes or less time + if ((time7am.minute - currentTime.minute) <= 30) { + //starting session timer + final dateTime7am = + _getDateTimeObjFor(hour: time7am.hour, minute: time7am.minute); + + final millisLeft = dateTime7am.millisecondsSinceEpoch - + DateTime.now().millisecondsSinceEpoch; + + AppSessionManager.instance.startSessionTimer(millisLeft); + } + } + } + + _gotoDashboardScreen(); + } + + _gotoLoginScreen() { + Navigator.pushNamedAndRemoveUntil( + screenKey.currentContext!, + CustomRouteNames.kLoginScreenRoute, + (route) => false, + ); + } + + _gotoDashboardScreen() { + Navigator.pushNamedAndRemoveUntil( + screenKey.currentContext!, + CustomRouteNames.kDashboardScreenRoute, + (route) => false, + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/add_details_to_new_body_point_screen_controller.dart b/lib/controllers/clients/add_details_to_new_body_point_screen_controller.dart new file mode 100644 index 0000000..57182c6 --- /dev/null +++ b/lib/controllers/clients/add_details_to_new_body_point_screen_controller.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/HealthIssuesDetailsModel.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'careNoteFormControllers/category_subcategory_widget_controller.dart'; + +class AddDetailsToNewBodyPointScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final healthNoteController = TextEditingController(); + final complaintController = TextEditingController(); + + final catSubCatController = Get.put(CategorySubcategoryWidgetController()); + + ///[isEditing] will be true if using [AddDetailsToNewBodyPointScreen] screen to edit issue details, + /// or say issueData is not null + final isEditing = false.obs; + + String serviceUserId = ""; + HealthIssueDetailsModel? issueData; + + @override + void onReady() { + if (issueData != null) { + isEditing.value = true; + healthNoteController.text = issueData!.healthNote; + complaintController.text = issueData!.complaint; + } + catSubCatController.getBodyParts(); + super.onReady(); + } + + @override + void dispose() { + healthNoteController.dispose(); + complaintController.dispose(); + catSubCatController.dispose(); + super.dispose(); + } + + Future submitButtonPressed(BuildContext context) async { + if (isEditing.isFalse) { + if (catSubCatController.selectedBodyPart() == null) { + FrequentFunctions.showToast( + message: "Please select category first", + ); + return; + } + + if (catSubCatController.selectedBodyPart()!.subCategory.isNotEmpty && + catSubCatController.selectedSubcategory() == null) { + FrequentFunctions.showToast( + message: "Please select subcategory", + ); + return; + } + } + + if (healthNoteController.text.trim().isEmpty) { + FrequentFunctions.showToast(message: "Health Note is required"); + return; + } + if (complaintController.text.trim().isEmpty) { + FrequentFunctions.showToast(message: "Complaint is required"); + return; + } + + var result = (isEditing.isFalse) + ? await ClientService() + .addHealthIssue( + userId: serviceUserId, + category: catSubCatController.selectedSubcategory()?.id ?? + catSubCatController.selectedBodyPart()!.id, + healthNote: healthNoteController.text.trim(), + complaint: complaintController.text.trim()) + .showLoader() + : await ClientService() + .updateHealthIssueData( + issueId: issueData!.id, + categoryId: issueData!.bodyPointsCategory!.id, + healthNote: healthNoteController.text.trim(), + complaint: complaintController.text.trim()) + .showLoader(); + + if (result is! String) { + Navigator.of(context).pop(true); + } else { + if (result.isNotEmpty) { + FrequentFunctions.showToast(message: result); + } + } + + return; + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } +} diff --git a/lib/controllers/clients/add_new_document_screen_controller.dart b/lib/controllers/clients/add_new_document_screen_controller.dart new file mode 100644 index 0000000..d37e094 --- /dev/null +++ b/lib/controllers/clients/add_new_document_screen_controller.dart @@ -0,0 +1,127 @@ +import 'dart:io'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import '../../models/clients/documents_list_model.dart'; + +class AddNewDocumentScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + TextEditingController documentTitleController = TextEditingController(); + TextEditingController documentDetailsController = TextEditingController(); + dynamic arguments; + final docIdReceived = false.obs; + final viewOnly = false.obs; + final serviceUser = Rx(null); + DocumentModel documentModel = DocumentModel.empty(); + final docFile = Rx(null); + RxString docFilePath = "".obs; + + @override + void onInit() { + arguments = CustomRouteGenerator.argument; + if (arguments is List && + arguments[0] is DocumentModel && + arguments[1] is UserData) { + //Open for Editing + documentModel = arguments[0]; + docIdReceived.value = true; + docFilePath.value = documentModel.docPath; + documentTitleController.text = documentModel.title; + documentDetailsController.text = documentModel.details; + serviceUser.value = arguments[1]; + } else if (arguments is List && arguments[1] is bool) { + documentModel = arguments[0]; + docFilePath.value = documentModel.docPath; + viewOnly.value = true; + documentTitleController.text = documentModel.title; + documentDetailsController.text = documentModel.details; + } else if (arguments is UserData) { + //Open to add new document + serviceUser.value = arguments; + } + super.onInit(); + } + + onFileChooseButtonTap() async { + FilePickerResult? result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ["pdf", "doc", "docx", "xlsx", "xls"]); + + if (result != null) { + docFile.value = File(result.files.single.path!); + docFilePath.value = result.files.single.path!; + } + } + + Future submitButtonPressed() async { + if (validateFields()) { + if (docIdReceived.isTrue) { + //update doc code here + + String documentPath = docFilePath.value; + + //If doc file is picked than uploading file to server and will be used to update document + if (docFile() != null) { + final resp = await ClientService() + .uploadDocumentService(docPath: docFile()!.path) + .showLoader(); + if (resp is String) { + documentPath = resp; + } + } + + final response = await ClientService() + .updateDocumentService( + userId: serviceUser()!.id!, + docId: documentModel.id, + docPath: documentPath, + docDetails: documentDetailsController.text, + title: documentTitleController.text, + addedBy: LocalStorageManager.userId) + .showLoader(); + if (response is DocumentModel) { + backButtonPressed(argument: response); + } else { + FrequentFunctions.showToast(message: response); + } + } else if (viewOnly.isTrue) { + //view doc code here + } else { + // add doc code here + var response = await ClientService() + .addDocumentService( + userId: serviceUser()!.id!, + docPath: docFile.value!.path ?? "", + docDetails: documentDetailsController.text, + title: documentTitleController.text, + addedBy: LocalStorageManager.userId) + .showLoader(); + + backButtonPressed(argument: response); + } + } else if (viewOnly.isTrue) { + backButtonPressed(); + } else { + FrequentFunctions.showToast( + message: "Please fill all fields and add Required Document"); + } + } + + void backButtonPressed({dynamic argument}) { + // Get.delete(); + Navigator.of(screenKey.currentContext!).pop(argument); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + bool validateFields() { + return documentTitleController.text.isNotEmpty && + documentDetailsController.text.isNotEmpty && + (docFile.value != null || docIdReceived.isTrue); + } +} diff --git a/lib/controllers/clients/add_new_recent_incident_screen_controller.dart b/lib/controllers/clients/add_new_recent_incident_screen_controller.dart new file mode 100644 index 0000000..9d93e5c --- /dev/null +++ b/lib/controllers/clients/add_new_recent_incident_screen_controller.dart @@ -0,0 +1,166 @@ +import 'package:adoptive_calendar/adoptive_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/screens/clients/add_new_recent_incident_screen.dart'; +import 'package:get/get.dart'; +import 'package:quill_html_editor/quill_html_editor.dart'; + +class AddNewRecentIncidentScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final incidentDateTEC = TextEditingController(); + final incidentTitleTEC = TextEditingController(); + + // TextEditingController incidentDetails = TextEditingController(); + QuillEditorController incidentDetailsQuillFieldController = + QuillEditorController(); + + final selectedDate = DateTime.now().obs; + final isButtonEnabled = false.obs; + + // DateTime? fromDateTime, toDateTime; + // RecentIncidentsModel recentIncidentsModel = RecentIncidentsModel.empty(); + + // String userId = ""; + late final AddNewRecentIncidentsScreenArgs arguments; + + AddNewRecentIncidentScreenController(AddNewRecentIncidentsScreenArgs args) { + arguments = args; + } + + @override + void onInit() { + incidentTitleTEC.addListener(_onIncidentTitleChanged); + selectedDate.listen(_setDateTimeInField); + + _setDateTimeInField(selectedDate()); + + fetchDataFromServiceAndSetToVariables(); + super.onInit(); + } + + _onIncidentTitleChanged() { + isButtonEnabled.value = incidentTitleTEC.text.isNotEmpty; + } + + _setDateTimeInField(DateTime d) { + incidentDateTEC.text = FrequentFunctions.careNoteDateFormatter.format(d); + } + + void fetchDataFromServiceAndSetToVariables() async { + if (arguments.incidentsModel != null) { + selectedDate.value = DateTime.fromMillisecondsSinceEpoch( + arguments.incidentsModel!.incidentDate); + incidentTitleTEC.text = arguments.incidentsModel!.incidentTitle; + await incidentDetailsQuillFieldController + .setText(arguments.incidentsModel!.note); + // isButtonEnabled.value = incidentTitleTEC.text.isNotEmpty; + } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + selectDate(context) async { + Get.focusScope?.unfocus(); + final DateTime? d = await showDialog( + context: context, + builder: (BuildContext context) { + return AdoptiveCalendar( + initialDate: DateTime.now(), + action: true, + ); + }, + ); + + if (d != null) { + selectedDate.value = d; + // incidentDateTEC.text = FrequentFunctions.careNoteDateFormatter.format(d); + } + } + + // Future selectDateFromPicker( + // {required BuildContext context, + // required DateTime minDate, + // required DateTime maxDate}) async { + // try { + // final selected = await showDatePicker( + // context: context, + // initialDate: selectedDate.value, + // firstDate: minDate, + // lastDate: maxDate, + // // initialDate: minDate, + // // firstDate: DateTime.now(), + // // lastDate: DateTime(DateTime.now().year+1), + // // selectableDayPredicate: _showDatesToEnable, + // builder: (BuildContext context, Widget? child) { + // return Theme( + // data: ThemeData.light().copyWith( + // primaryColor: CustomAppColors.kSecondaryColor, + // colorScheme: const ColorScheme.light( + // primary: CustomAppColors.kSecondaryColor), + // buttonTheme: const ButtonThemeData( + // buttonColor: CustomAppColors.kSecondaryColor), + // ), + // child: child!, + // ); + // }); + // if (selected != null) { + // // updating selected date range based on selected week + // // setState(() { + // selectedDate.value = selected; + // // }); + // // widget.onDayPressed?.call( + // // selected, widget.markedDatesMap?.getEvents(selected) ?? const []); + // } + // } catch (e) { + // FrequentFunctions.showDialog( + // context: context, + // title: 'Alert', + // description: + // 'Something went wrong!! Please check your Date and Time Settings', + // type: DialogType.error, + // btnOkColor: CustomAppColors.kRedColor); + // } + // } + + Future submitButtonPressed(BuildContext context) async { + dynamic response; + if (arguments.userId.isNotNullOrEmpty()) { + response = await ClientService() + .addRecentIncidentService( + userId: arguments.userId!, + incidentTitle: incidentTitleTEC.text, + note: await incidentDetailsQuillFieldController.getText(), + incidentDate: selectedDate.value.millisecondsSinceEpoch, + ) + .showLoader(); + } else if (arguments.incidentsModel != null) { + response = await ClientService() + .updateRecentIncidentService( + incidentId: arguments.incidentsModel!.incidentId, + incidentNote: await incidentDetailsQuillFieldController.getText(), + incidentTitle: incidentTitleTEC.text, + incidentDate: selectedDate.value.millisecondsSinceEpoch, + ) + .showLoader(); + } + onBackPress(context, response: response); + } + + void onBackPress(BuildContext context, {dynamic response}) { + // Get.delete(); + Navigator.pop(context, response); + } + + @override + void dispose() { + incidentDateTEC.dispose(); + incidentTitleTEC.dispose(); + incidentTitleTEC.removeListener(_onIncidentTitleChanged); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/all_care_notes_screen_contorller.dart b/lib/controllers/clients/all_care_notes_screen_contorller.dart new file mode 100644 index 0000000..874649e --- /dev/null +++ b/lib/controllers/clients/all_care_notes_screen_contorller.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/allCareNotes/AllCareNotesListResponse.dart'; +import 'package:ftc_mobile_app/models/clients/allCareNotes/CarePlans.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import '../../utilities/frequent_functions.dart'; +import '../../web_services/client_services.dart'; + +class AllCareNotesScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final notesList = RxList(); + final canLoadMore = RxBool(false); + + int _total = 0; + final int _limit = 20; + int _skip = 0; + bool loadingMore = false; + + final _listRC = RefreshController(initialRefresh: false); + + RefreshController get listRC => _listRC; + + final _listSC = ScrollController(); + + ScrollController get listSC => _listSC; + + String serviceUserId = ""; + + @override + void onInit() { + super.onInit(); + + notesList.listen((list) { + canLoadMore.value = list.length < _total; + }); + } + + void onRefresh() async { + await getCareNotesList(); + _listRC.refreshCompleted(); + } + + void onLoading() async { + if (!loadingMore) { + await _loadMore(); + } + + _listRC.loadComplete(); + } + + Future getCareNotesList() async { + _skip = 0; + + var response = await ClientService() + .getCarePlansList( + serviceUserId: serviceUserId, + limit: _limit, + offset: _skip, + ) + .showLoader(); + if (response is AllCareNotesListResponse) { + if (response.data?.carePlans?.isNotEmpty == true) { + _total = response.data?.carePlanCount ?? 0; + _skip += _limit; + notesList.value = (response.data?.carePlans ?? []) + ..sort((a, b) { + if (b.flag == true) { + return 1; + } + return -1; + }); + } else { + notesList.clear(); + } + } else if (response is String && response.isNotEmpty) { + notesList.clear(); + FrequentFunctions.showToast(message: response); + } else { + notesList.clear(); + } + } + + Future _loadMore() async { + if (canLoadMore.isTrue) { + loadingMore = true; + + var response = await ClientService().getCarePlansList( + serviceUserId: serviceUserId, + limit: _limit, + offset: _skip, + ); + loadingMore = false; + + if (response is AllCareNotesListResponse) { + if (response.data?.carePlans?.isNotEmpty == true) { + _skip += _limit; + notesList.addAll(response.data?.carePlans ?? []); + } + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/appointment_screen_controller.dart b/lib/controllers/clients/appointment_screen_controller.dart new file mode 100644 index 0000000..e85fb0d --- /dev/null +++ b/lib/controllers/clients/appointment_screen_controller.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import '../../ftc_mobile_app.dart'; +import '../../models/appointmentsListResponse/AppointmentsListResponse.dart'; + +class AppointmentScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final appointments = [].obs; + + final _listRC = RefreshController(initialRefresh: false); + + RefreshController get listRC => _listRC; + + final _listSC = ScrollController(); + + ScrollController get listSC => _listSC; + + String serviceUserId = ""; + + @override + void onReady() { + super.onReady(); + + getAppointmentsList(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + void onRefresh() async { + await getAppointmentsList(); + _listRC.refreshCompleted(); + } + + Future getAppointmentsList() async { + try { + if (serviceUserId.isEmpty) { + throw Exception("serviceUserId is not assigned"); + } + + final response = await ClientService() + .getAppointmentsList( + serviceId: serviceUserId, + startDate: DateTime.now().subtract(28.days).millisecondsSinceEpoch, + endDate: DateTime.now().add(28.days).millisecondsSinceEpoch, + ) + .showLoader(); + if (response.success == true) { + appointments.value = response.data ?? []; + } else { + if (response.message.isNotNullOrEmpty()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } catch (e) { + debugPrint("getAppointmentsList error"); + debugPrint(e.toString()); + } + } + + @override + void dispose() { + _listSC.dispose(); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/ABC_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/ABC_form_screen_controller.dart new file mode 100644 index 0000000..2e35cf5 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/ABC_form_screen_controller.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/ABC_form_html_request.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +class ABCFormScreenController extends CommonCareNoteFormsController { + final antecedentEventsController = TextEditingController(); + final behaviourController = TextEditingController(); + final consequenceEventsController = TextEditingController(); + + ABCFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + antecedentEventsController.dispose(); + behaviourController.dispose(); + consequenceEventsController.dispose(); + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + if (antecedentEventsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Antecedent Events field is required", + ); + return; + } + if (behaviourController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Behaviour field is required", + ); + return; + } + + if (consequenceEventsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Consequence Events field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: ABCFormHtmlRequest( + antecedentEvents: antecedentEventsController.text.trim(), + behaviour: behaviourController.text.trim(), + consequenceEvents: consequenceEventsController.text.trim(), + ).toHtml()), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/category_subcategory_widget_controller.dart b/lib/controllers/clients/careNoteFormControllers/category_subcategory_widget_controller.dart new file mode 100644 index 0000000..0d67939 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/category_subcategory_widget_controller.dart @@ -0,0 +1,46 @@ +import 'dart:developer'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/physical_intervention_form_html_request.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/safeguarding_form_html_request.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/web_services/client_services.dart'; +import 'package:get/get.dart'; +import '../../../models/clients/body_points_category.dart'; +import 'common_care_note_forms_controller.dart'; + +class CategorySubcategoryWidgetController extends GetxController { + final bodyPointsCategoryList = RxList(); + final selectedBodyPart = Rx(null); + final selectedSubcategory = Rx(null); + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + getBodyParts() async { + var result = await ClientService().getBodyPointsCategoryList().showLoader(); + if (result is List && result is List) { + log('---------------bodyPointsCategoryList length before set -----------${bodyPointsCategoryList.length}'); + + List uniqueList = removeDuplicates(result); + bodyPointsCategoryList.value = uniqueList; + // selectedBodyPart.value = bodyPointsCategoryList.first; + } + } + + List removeDuplicates(List list) { + List uniqueList = []; + Set enumedSet = {}; + + for (var category in list) { + if (!enumedSet.contains(category.idOne)) { + uniqueList.add(category); + enumedSet.add(category.idOne); + } + } + + return uniqueList; + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart b/lib/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart new file mode 100644 index 0000000..aabb298 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart @@ -0,0 +1,89 @@ +import 'dart:convert'; +import 'package:adoptive_calendar/adoptive_calendar.dart'; +import 'package:ftc_mobile_app/models/response_model.dart'; +import 'package:ftc_mobile_app/models/user_model.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/web_services/client_services.dart'; +import 'package:get/get.dart'; +import '../../../models/create_care_plan_request.dart'; +import 'package:flutter/material.dart'; +import '../../../utilities/export_utilities.dart'; + +export '../../../utilities/export_utilities.dart'; +export '../../../models/create_care_plan_request.dart'; + +class CommonCareNoteFormArgs { + final String serviceUserId; + final String noteType; + + CommonCareNoteFormArgs({required this.serviceUserId, required this.noteType}); +} + +abstract class CommonCareNoteFormsController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final dateController = TextEditingController(); + + DateTime? date; + + final CommonCareNoteFormArgs args; + + CommonCareNoteFormsController({required this.args}); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + selectDate(context) async { + Get.focusScope?.unfocus(); + final DateTime? d = await showDialog( + context: context, + builder: (BuildContext context) { + return AdoptiveCalendar( + initialDate: DateTime.now(), + action: true, + ); + }, + ); + + if (d != null) { + date = d; + dateController.text = FrequentFunctions.careNoteDateFormatter.format(d); + } + } + + Future onFormSubmit({required CreateCarePlanRequest request}) async { + // final userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // print("userJson: $userJson"); + // final userModel = UserModel.fromJson(jsonDecode(userJson)); + request.addedby = LocalStorageManager.userId; + request.userId = args.serviceUserId; + request.noteType = args.noteType; + if (date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + request.eventDateTime = date!.toUtc().millisecondsSinceEpoch; + + final response = + await ClientService().createCarePlan(request: request).showLoader(); + + if (response is ResponseModel) { + Navigator.pop(screenKey.currentContext!); + Navigator.pop(screenKey.currentContext!); + FrequentFunctions.showToast(message: response.statusDescription); + } else { + FrequentFunctions.showToast(message: response['message']); + } + } + + @override + void dispose() { + dateController.dispose(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/consent_capacity_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/consent_capacity_form_screen_controller.dart new file mode 100644 index 0000000..388392c --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/consent_capacity_form_screen_controller.dart @@ -0,0 +1,285 @@ +import 'package:adoptive_calendar/adoptive_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../../models/clients/careNoteFormsRequests/HtmlTableOption.dart'; +import '../../../models/clients/careNoteFormsRequests/consent_capacity_html_request.dart'; +import 'common_care_note_forms_controller.dart'; +import 'package:flutter/services.dart' show rootBundle; + +class ConsentCapacityFormScreenController + extends CommonCareNoteFormsController { + final commentsController = TextEditingController(); + final mentalCapacityAssessmentDetailController = TextEditingController(); + final specificDecisionDetailController = TextEditingController(); + final roleController = TextEditingController(); + final organisationController = TextEditingController(); + final addressController = TextEditingController(); + final telController = TextEditingController(); + final emailController = TextEditingController(); + final lackCapacityToMakeParticularDecisionDetailController = + TextEditingController(); + final recordYourEvidenceDescribeController = TextEditingController(); + final viableOptionsConsideredController = TextEditingController(); + final explainWhyTickedBoxController = TextEditingController(); + final impairmentDescribeController = TextEditingController(); + final describeCanPersonDecisionInfoController = TextEditingController(); + final describeCanTheyRetainController = TextEditingController(); + final describeCanTheyUseController = TextEditingController(); + final describeCanTheyCommunicateController = TextEditingController(); + final evidenceController = TextEditingController(); + final whatIsYourEvidenceController = TextEditingController(); + final seekingManagementDescribeController = TextEditingController(); + final recordInterviewDescribeController = TextEditingController(); + final requireIMCAController = TextEditingController(); + final designationController = TextEditingController(); + final baseAddressController = TextEditingController(); + final contactDetailsController = TextEditingController(); + + final name1Controller = TextEditingController(); + final dontHaveDecisionNameController = TextEditingController(); + final haveDecisionNameController = TextEditingController(); + final assessorsName4Controller = TextEditingController(); + + final assessmentDateTimeController = TextEditingController(); + final dontHaveDecisionDateController = TextEditingController(); + final haveDecisionDateController = TextEditingController(); + final whyIMCARequiredDateController = TextEditingController(); + + //Yes/No radio selected options + final selectedMCARequiredOption = Rx(null); + final selectedImpairmentOption = Rx(null); + final selectedCanPersonDecisionInfoOption = Rx(null); + final selectedCanTheyRetainOption = Rx(null); + final selectedCanTheyUseOption = Rx(null); + final selectedCanTheyCommunicateOption = Rx(null); + final selectedDoYouHaveConcernOption = Rx(null); + final selectedDoesRequireIMCAOption = Rx("No"); + + List canDecisionBeDelayedOptions = [ + HtmlTableOption(id: '1', requirements: 'The decision can be delayed'), + HtmlTableOption( + id: '2', requirements: 'Not appropriate to delay the decision'), + HtmlTableOption( + id: '3', + requirements: 'Person not likely to gain or develop capacity '), + ]; + + List causativeNexusOptions = [ + HtmlTableOption(id: '1', requirements: 'Yes, there is a causative link '), + HtmlTableOption( + id: '2', + requirements: + 'No, there is not a causative link, so the person has capacity to make the relevant decision. The decision may therefore be an unwise decision. '), + ]; + + DateTime? assessmentDateTime; + DateTime? dontHaveDecisionDateTime; + DateTime? haveDecisionDateTime; + DateTime? whyIMCARequiredDateTime; + + String consentCapacityHtml = ""; + + ConsentCapacityFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void onInit() { + loadConsentCapacityHtmlFile(); + super.onInit(); + } + + @override + void dispose() { + commentsController.dispose(); + mentalCapacityAssessmentDetailController.dispose(); + specificDecisionDetailController.dispose(); + roleController.dispose(); + organisationController.dispose(); + addressController.dispose(); + telController.dispose(); + emailController.dispose(); + assessmentDateTimeController.dispose(); + lackCapacityToMakeParticularDecisionDetailController.dispose(); + recordYourEvidenceDescribeController.dispose(); + viableOptionsConsideredController.dispose(); + explainWhyTickedBoxController.dispose(); + impairmentDescribeController.dispose(); + describeCanPersonDecisionInfoController.dispose(); + describeCanTheyRetainController.dispose(); + describeCanTheyUseController.dispose(); + describeCanTheyCommunicateController.dispose(); + evidenceController.dispose(); + whatIsYourEvidenceController.dispose(); + seekingManagementDescribeController.dispose(); + recordInterviewDescribeController.dispose(); + requireIMCAController.dispose(); + designationController.dispose(); + baseAddressController.dispose(); + contactDetailsController.dispose(); + + name1Controller.dispose(); + dontHaveDecisionNameController.dispose(); + haveDecisionNameController.dispose(); + assessorsName4Controller.dispose(); + + dontHaveDecisionDateController.dispose(); + haveDecisionDateController.dispose(); + whyIMCARequiredDateController.dispose(); + + Get.delete(); + super.dispose(); + } + + Future loadConsentCapacityHtmlFile() async { + final htmlString = + await rootBundle.loadString(AssetsManager.kConsentCapacityFormHtml); + consentCapacityHtml = htmlString; + } + + Future _unFocusAndPickDate(BuildContext context) async { + Get.focusScope?.unfocus(); + return await showDialog( + context: context, + builder: (BuildContext context) { + return AdoptiveCalendar( + initialDate: DateTime.now(), + action: true, + ); + }, + ); + } + + selectAssessmentDateTime(BuildContext context) async { + final d = await _unFocusAndPickDate(context); + + if (d != null) { + assessmentDateTime = d; + assessmentDateTimeController.text = + FrequentFunctions.careNoteDateFormatter.format(d); + } + } + + selectDontHaveDecisionDateTime(BuildContext context) async { + final d = await _unFocusAndPickDate(context); + + if (d != null) { + dontHaveDecisionDateTime = d; + dontHaveDecisionDateController.text = + FrequentFunctions.careNoteDateFormatter.format(d); + } + } + + selectHaveDecisionDateTime(BuildContext context) async { + final d = await _unFocusAndPickDate(context); + + if (d != null) { + haveDecisionDateTime = d; + haveDecisionDateController.text = + FrequentFunctions.careNoteDateFormatter.format(d); + } + } + + selectDateTimeOfWhyIMCARequired(BuildContext context) async { + final d = await _unFocusAndPickDate(context); + + if (d != null) { + whyIMCARequiredDateTime = d; + whyIMCARequiredDateController.text = + FrequentFunctions.careNoteDateFormatter.format(d); + } + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + + if (commentsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Comments field is required", + ); + return; + } + + super.removeFocus(); + final formatter = DateFormat("dd/MM/yyyy / hh:mm aa"); + + final consentCapacityHtmlString = ConsentCapacityHtmlRequest( + isMCARequired: selectedMCARequiredOption()!, + comments: commentsController.text.trim(), + mentalCapacityAssessmentDetail: + mentalCapacityAssessmentDetailController.text.trim(), + specificDecisionDetail: specificDecisionDetailController.text.trim(), + personUndertakingName: name1Controller.text.trim(), + personUndertakingRole: roleController.text.trim(), + organisation: organisationController.text.trim(), + address: addressController.text.trim(), + tel: telController.text.trim(), + email: emailController.text.trim(), + dateAndTimeOfAssessment: (assessmentDateTime != null) + ? formatter.format(assessmentDateTime!) + : "", + lackCapacityToMakeParticularDecisionDetail: + lackCapacityToMakeParticularDecisionDetailController.text.trim(), + recordYourEvidenceDescribe: + recordYourEvidenceDescribeController.text.trim(), + viableOptionsConsidered: viableOptionsConsideredController.text.trim(), + explainWhyTickedBox: explainWhyTickedBoxController.text.trim(), + canDecisionBeDelayedOptions: canDecisionBeDelayedOptions, + selectedImpairmentOption: selectedImpairmentOption() ?? "", + impairmentDescribe: impairmentDescribeController.text.trim(), + selectedCanPersonDecisionInfoOption: + selectedCanPersonDecisionInfoOption() ?? "", + describeCanPersonDecisionInfo: + describeCanPersonDecisionInfoController.text.trim(), + selectedCanTheyRetainOption: selectedCanTheyRetainOption() ?? "", + describeCanTheyRetain: describeCanTheyRetainController.text.trim(), + selectedCanTheyUseOption: selectedCanTheyUseOption() ?? "", + describeCanTheyUse: describeCanTheyUseController.text.trim(), + selectedCanTheyCommunicateOption: + selectedCanTheyCommunicateOption() ?? "", + describeCanTheyCommunicate: + describeCanTheyCommunicateController.text.trim(), + causativeNexusOptions: causativeNexusOptions, + evidence: evidenceController.text.trim(), + selectedDoYouHaveConcernOption: selectedDoYouHaveConcernOption() ?? "", + whatIsYourEvidence: whatIsYourEvidenceController.text.trim(), + seekingManagementDescribe: + seekingManagementDescribeController.text.trim(), + recordInterviewDescribe: recordInterviewDescribeController.text.trim(), + section9DontHaveDecisionNameData: + dontHaveDecisionNameController.text.trim(), + section9DontHaveDecisionDateData: (dontHaveDecisionDateTime != null) + ? formatter.format(dontHaveDecisionDateTime!) + : "", + section9HaveDecisionNameData: haveDecisionNameController.text.trim(), + section9HaveDecisionDateData: (haveDecisionDateTime != null) + ? formatter.format(haveDecisionDateTime!) + : "", + isIMCARequired: selectedDoesRequireIMCAOption(), + giveWhyIMCARequiredReason: requireIMCAController.text.trim(), + whyIMCARequiredDateTime: (whyIMCARequiredDateTime != null) + ? formatter.format(whyIMCARequiredDateTime!) + : "", + section9AssessorsName: assessorsName4Controller.text.trim(), + assessorsDesignation: designationController.text.trim(), + assessorsBaseAddress: baseAddressController.text.trim(), + assessorsContactDetailsData: contactDetailsController.text.trim(), + ).toHtml(consentCapacityHtml); + + // log("consentCapacityHtmlString: $consentCapacityHtmlString"); + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: consentCapacityHtmlString, + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/free_text_entries_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/free_text_entries_form_screen_controller.dart new file mode 100644 index 0000000..30f5b5d --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/free_text_entries_form_screen_controller.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +class FreeTextEntriesFormScreenController + extends CommonCareNoteFormsController { + final titleController = TextEditingController(); + final noteDetailsController = TextEditingController(); + + final flagForHandover = false.obs; + + FreeTextEntriesFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + titleController.dispose(); + noteDetailsController.dispose(); + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + if (titleController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Title field is required", + ); + return; + } + if (noteDetailsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Note Details field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + title: titleController.text.trim(), + noteDetails: noteDetailsController.text.trim(), + flag: flagForHandover(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/health_appointments_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/health_appointments_form_screen_controller.dart new file mode 100644 index 0000000..3a29b18 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/health_appointments_form_screen_controller.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/health_appointments_form_html_request.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +class HealthAppointmentsFormScreenController + extends CommonCareNoteFormsController { + final reasonController = TextEditingController(); + final commentsController = TextEditingController(); + + final appointmentWith = [ + "GP", + "CAMHS", + "Psychologist", + "A&E", + "Sexual Health", + "Social Worker", + "Other" + ]; + + String? selectedAppointmentWith; + + HealthAppointmentsFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + reasonController.dispose(); + commentsController.dispose(); + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + if (selectedAppointmentWith == null) { + FrequentFunctions.showToast( + message: "Please select appointment with", + ); + return; + } + if (reasonController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Reason for appointment field is required", + ); + return; + } + if (commentsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Comments field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: HealthAppointmentsFormHtmlRequest( + appointmentWith: selectedAppointmentWith!, + reason: reasonController.text.trim(), + comments: commentsController.text.trim(), + ).toHtml(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/injury_health_issue_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/injury_health_issue_form_screen_controller.dart new file mode 100644 index 0000000..acd8dc1 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/injury_health_issue_form_screen_controller.dart @@ -0,0 +1,152 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'category_subcategory_widget_controller.dart'; +import 'common_care_note_forms_controller.dart'; + +class InjuryHealthIssueFormScreenController + extends CommonCareNoteFormsController { + final nameOfWitnesses = TextEditingController(); + final placeOfAccident = TextEditingController(); + final accidentDescription = TextEditingController(); + final recordOfInjury = TextEditingController(); + final conditionOfPatient = TextEditingController(); + final nameOfParentContacted = TextEditingController(); + final parentContactedTime = TextEditingController(); + + final isParentContacted = RxString("No"); + final howParentContacted = Rx(null); + + final catSubCatController = Get.put(CategorySubcategoryWidgetController()); + + InjuryHealthIssueFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void onReady() { + catSubCatController.getBodyParts(); + super.onReady(); + } + + @override + void dispose() { + nameOfWitnesses.dispose(); + placeOfAccident.dispose(); + accidentDescription.dispose(); + recordOfInjury.dispose(); + conditionOfPatient.dispose(); + nameOfParentContacted.dispose(); + parentContactedTime.dispose(); + + catSubCatController.dispose(); + + Get.delete(); + super.dispose(); + } + + selectParentContactTime(context) async { + Get.focusScope?.unfocus(); + TimeOfDay? timeOfDay = await FrequentFunctions.selectTime(context, + selectedTime: TimeOfDay.now(), + themeColor: Get.theme.colorScheme.primary); + + if (timeOfDay != null) { + parentContactedTime.text = timeOfDay.format(context); + } + } + + Future onSaveButtonTap() async { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + + if (nameOfWitnesses.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Name of witnesses/adults present field is required", + ); + return; + } + + if (placeOfAccident.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Place accident occured field is required", + ); + return; + } + + if (accidentDescription.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Description how the accident occured field is required", + ); + return; + } + + if (catSubCatController.selectedBodyPart() == null) { + FrequentFunctions.showToast( + message: "Please select category first", + ); + return; + } + + if (catSubCatController.selectedBodyPart()!.subCategory.isNotEmpty && + catSubCatController.selectedSubcategory() == null) { + FrequentFunctions.showToast( + message: "Please select subcategory", + ); + return; + } + + if (isParentContacted() == "Yes" && + nameOfParentContacted.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Name of parent contacted field is required", + ); + return; + } + + if (isParentContacted() == "Yes" && + parentContactedTime.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Please select parent contacted time", + ); + return; + } + + if (isParentContacted() == "Yes" && howParentContacted() == null) { + FrequentFunctions.showToast( + message: "Please select how parent was contacted", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + category: catSubCatController.selectedSubcategory()?.id ?? + catSubCatController.selectedBodyPart()!.id, + noteDetails: CreateCarePlanRequest.injuryHealthIssueHtmlReq( + nameOfWitnesses: nameOfWitnesses.text.trim(), + placeOfAccident: placeOfAccident.text.trim(), + accidentDescription: accidentDescription.text.trim(), + recordOfInjury: recordOfInjury.text.trim(), + conditionOfPatient: conditionOfPatient.text.trim(), + isParentContacted: isParentContacted(), + nameOfParentContacted: isParentContacted() != "Yes" + ? null + : nameOfParentContacted.text.trim(), + parentContactedTime: isParentContacted() != "Yes" + ? null + : parentContactedTime.text.trim(), + howParentContacted: + isParentContacted() != "Yes" ? null : howParentContacted()!, + ), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/mood_rating_form_controller.dart b/lib/controllers/clients/careNoteFormControllers/mood_rating_form_controller.dart new file mode 100644 index 0000000..cf7f550 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/mood_rating_form_controller.dart @@ -0,0 +1,60 @@ +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../../models/mood_rating_data.dart'; +import 'common_care_note_forms_controller.dart'; + +class MoodRatingFormController extends CommonCareNoteFormsController { + MoodRatingFormController({required super.args}); + + final ratings = [ + MoodRatingData(icon: AssetsManager.ratingsIcAngry, name: 'Angry'), + MoodRatingData(icon: AssetsManager.ratingsIcBored, name: 'Bored'), + MoodRatingData(icon: AssetsManager.ratingsIcCalm, name: 'Calm'), + MoodRatingData(icon: AssetsManager.ratingsIcConfident, name: 'Confident'), + MoodRatingData(icon: AssetsManager.ratingsIcExcited, name: 'Excited'), + MoodRatingData(icon: AssetsManager.ratingsIcHappy, name: 'Happy'), + MoodRatingData(icon: AssetsManager.ratingsIcHopeful, name: 'Hopeful'), + MoodRatingData(icon: AssetsManager.ratingsIcNervous, name: 'Nervous'), + MoodRatingData(icon: AssetsManager.ratingsIcProud, name: 'Proud'), + MoodRatingData(icon: AssetsManager.ratingsIcRelaxed, name: 'Relaxed'), + MoodRatingData(icon: AssetsManager.ratingsIcSad, name: 'Sad'), + MoodRatingData(icon: AssetsManager.ratingsIcScared, name: 'Scared'), + MoodRatingData(icon: AssetsManager.ratingsIcTired, name: 'Tired'), + MoodRatingData(icon: AssetsManager.ratingsIcWorried, name: 'Worried'), + ]; + + final Rx selectedRating = Rx(null); + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + if (selectedRating() == null) { + FrequentFunctions.showToast( + message: "Please select your mood rating", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + title: "Mood Rating is ${selectedRating()!.name}", + noteDetails: + "Mood Rating is ${selectedRating()!.name} at ${DateFormat("hh:mm aa on dd/MM/yyyy").format(date!)}", + moodRating: selectedRating()!.name, + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/nutrition_hydration_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/nutrition_hydration_form_screen_controller.dart new file mode 100644 index 0000000..1ed712b --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/nutrition_hydration_form_screen_controller.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/nutrition_hydration_form_html_request.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +abstract class NutritionHydrationType { + static const String food = "Food"; + static const String fluid = "Fluid"; +} + +class NutritionHydrationFormScreenController + extends CommonCareNoteFormsController { + final mealDrinkTypeController = TextEditingController(); + final amountController = TextEditingController(); + final commentsController = TextEditingController(); + + final selectedType = RxString(NutritionHydrationType.food); + + final typeOptions = [ + NutritionHydrationType.food, + NutritionHydrationType.fluid + ]; + + NutritionHydrationFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + mealDrinkTypeController.dispose(); + amountController.dispose(); + commentsController.dispose(); + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + + if (commentsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Comments field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: NutritionHydrationFormHtmlRequest( + nutritionHydrationType: selectedType(), + foodFluidType: mealDrinkTypeController.text.trim(), + foodFluidAmount: amountController.text.trim(), + comments: commentsController.text.trim(), + ).toHtml(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/observations_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/observations_form_screen_controller.dart new file mode 100644 index 0000000..857830d --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/observations_form_screen_controller.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/observations_form_html_request.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +class ObservationsFormScreenController extends CommonCareNoteFormsController { + final heartRateController = TextEditingController(); + final bloodPressureController = TextEditingController(); + final respiratoryRateController = TextEditingController(); + final oxygenController = TextEditingController(); + final temperatureController = TextEditingController(); + final bloodSugarController = TextEditingController(); + + ObservationsFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + heartRateController.dispose(); + bloodPressureController.dispose(); + respiratoryRateController.dispose(); + oxygenController.dispose(); + temperatureController.dispose(); + bloodSugarController.dispose(); + + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + if (heartRateController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Heart Rate field is required", + ); + return; + } + if (bloodPressureController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Blood Pressure field is required", + ); + return; + } + if (respiratoryRateController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Respiratory Rate field is required", + ); + return; + } + if (oxygenController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Oxygen field is required", + ); + return; + } + if (temperatureController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Temperature field is required", + ); + return; + } + if (bloodSugarController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Blood Sugar field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: ObservationsFormHtmlReq( + heartRate: heartRateController.text.trim(), + bloodPressure: bloodPressureController.text.trim(), + respiratoryRate: respiratoryRateController.text.trim(), + oxygen: oxygenController.text.trim(), + temperature: temperatureController.text.trim(), + bloodSugar: bloodSugarController.text.trim(), + ).toHtml(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/physical_intervention_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/physical_intervention_form_screen_controller.dart new file mode 100644 index 0000000..87df2db --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/physical_intervention_form_screen_controller.dart @@ -0,0 +1,209 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/physical_intervention_form_html_request.dart'; +import 'package:get/get.dart'; +import '../../../models/clients/careNoteFormsRequests/HtmlTableOption.dart'; +import 'category_subcategory_widget_controller.dart'; +import 'common_care_note_forms_controller.dart'; + +class PhysicalInterventionFormScreenController + extends CommonCareNoteFormsController { + final durationOfIncidentController = TextEditingController(); + final staffDebriefFormNumberController = TextEditingController(); + final nameOfWitnessController = TextEditingController(); + final incidentPlaceController = TextEditingController(); + final whatWasUsedController = TextEditingController(); + final wasThePbsFollowedController = TextEditingController(); + final reasonForPhysicalInterventionController = TextEditingController(); + final staffInvolvedController = TextEditingController(); + final conditionOfServiceUserController = TextEditingController(); + final userClamedController = TextEditingController(); + final explainController = TextEditingController(); + final commentsController = TextEditingController(); + + final nameOfParentContacted = TextEditingController(); + final parentContactedTime = TextEditingController(); + + final isParentContacted = RxString("No"); + final howParentContacted = Rx(null); + final howFormSharedRx = Rx(null); + + final catSubCatController = Get.put(CategorySubcategoryWidgetController()); + + List whyForceNecessaryOptions = [ + HtmlTableOption( + id: '1', requirements: 'Service User was placing themselves at risk'), + HtmlTableOption( + id: '2', requirements: 'Service User was placing others at risk'), + HtmlTableOption( + id: '3', requirements: 'Significant Damage to property'), + HtmlTableOption( + id: '4', requirements: 'Illegal offence was being carried out'), + HtmlTableOption(id: '5', requirements: 'Other'), + ]; + + final isParentContactedOptions = ['Yes', 'No']; + final howParentContactedOptions = [ + 'Call', + 'Email', + 'Other', + 'Upon collection/drop off' + ]; + final howFormSharedOptions = ['Paper', 'Email', 'Other']; + + PhysicalInterventionFormScreenController( + {required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void onReady() { + catSubCatController.getBodyParts(); + super.onReady(); + } + + @override + void dispose() { + durationOfIncidentController.dispose(); + staffDebriefFormNumberController.dispose(); + nameOfWitnessController.dispose(); + incidentPlaceController.dispose(); + whatWasUsedController.dispose(); + wasThePbsFollowedController.dispose(); + reasonForPhysicalInterventionController.dispose(); + staffInvolvedController.dispose(); + conditionOfServiceUserController.dispose(); + userClamedController.dispose(); + explainController.dispose(); + commentsController.dispose(); + nameOfParentContacted.dispose(); + parentContactedTime.dispose(); + + catSubCatController.dispose(); + + Get.delete(); + super.dispose(); + } + + selectParentContactTime(context) async { + Get.focusScope?.unfocus(); + TimeOfDay? timeOfDay = await FrequentFunctions.selectTime(context, + selectedTime: TimeOfDay.now(), + themeColor: Get.theme.colorScheme.primary); + + if (timeOfDay != null) { + parentContactedTime.text = timeOfDay.format(context); + } + } + + Future onSaveButtonTap() async { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + + if (durationOfIncidentController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Concerns about the service user field is required", + ); + return; + } + + if (staffDebriefFormNumberController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Voice of the service user field is required", + ); + return; + } + + if (nameOfWitnessController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Are there any immediate risks field is required", + ); + return; + } + + if (catSubCatController.selectedBodyPart() == null) { + FrequentFunctions.showToast( + message: "Please select category first", + ); + return; + } + + if (catSubCatController.selectedBodyPart()!.subCategory.isNotEmpty && + catSubCatController.selectedSubcategory() == null) { + FrequentFunctions.showToast( + message: "Please select subcategory", + ); + return; + } + if (isParentContacted() == "Yes" && + nameOfParentContacted.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Name of parent contacted field is required", + ); + return; + } + + if (isParentContacted() == "Yes" && + parentContactedTime.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Please select parent contacted time", + ); + return; + } + + if (isParentContacted() == "Yes" && howParentContacted() == null) { + FrequentFunctions.showToast( + message: "Please select how parent was contacted", + ); + return; + } + + if (howFormSharedRx() == null) { + FrequentFunctions.showToast( + message: "Please select How was this form shared with parents/carers?", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + category: catSubCatController.selectedSubcategory()?.id ?? + catSubCatController.selectedBodyPart()!.id, + noteDetails: PhysicalInterventionFormHtmlRequest( + durationOfIncidents: durationOfIncidentController.text.trim(), + staffDebriefFormNumber: + staffDebriefFormNumberController.text.trim(), + nameOfWitnesses: nameOfWitnessController.text.trim(), + placeOfIncident: incidentPlaceController.text.trim(), + priorToIntervention: whatWasUsedController.text.trim(), + pbsFollowed: wasThePbsFollowedController.text.trim(), + reasonForPhysicalIntervention: + reasonForPhysicalInterventionController.text.trim(), + staffInvolvedInPI: staffInvolvedController.text.trim(), + conditionOfSU: conditionOfServiceUserController.text.trim(), + howSuCalmed: userClamedController.text.trim(), + useOfForceNecessary: whyForceNecessaryOptions, + pleaseExplain: explainController.text.trim(), + isParentContacted: isParentContacted(), + nameOfParentContacted: isParentContacted() != "Yes" + ? "" + : nameOfParentContacted.text.trim(), + parentContactedTime: isParentContacted() != "Yes" + ? "" + : parentContactedTime.text.trim(), + howParentContacted: + isParentContacted() != "Yes" ? "" : howParentContacted()!, + parentCarersComments: commentsController.text.trim(), + howFormWasShared: howFormSharedRx()!) + .toHtml(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/safeguarding_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/safeguarding_form_screen_controller.dart new file mode 100644 index 0000000..fd8cc20 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/safeguarding_form_screen_controller.dart @@ -0,0 +1,138 @@ +import 'package:adoptive_calendar/adoptive_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/safeguarding_form_html_request.dart'; +import 'package:get/get.dart'; +import 'category_subcategory_widget_controller.dart'; +import 'common_care_note_forms_controller.dart'; + +class SafeguardingFormScreenController extends CommonCareNoteFormsController { + final concernAboutServiceUserController = TextEditingController(); + final voiceOfServiceUserController = TextEditingController(); + final anyImmediateRisksController = TextEditingController(); + final qActionTakenController = TextEditingController(); + final commentsController = TextEditingController(); + final nameController1 = TextEditingController(); + final nameController2 = TextEditingController(); + final anyWitnessesController = TextEditingController(); + final reportingDateTimeController = TextEditingController(); + final actionTakenController = TextEditingController(); + + final catSubCatController = Get.put(CategorySubcategoryWidgetController()); + + SafeguardingFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void onReady() { + catSubCatController.getBodyParts(); + super.onReady(); + } + + @override + void dispose() { + concernAboutServiceUserController.dispose(); + voiceOfServiceUserController.dispose(); + anyImmediateRisksController.dispose(); + qActionTakenController.dispose(); + commentsController.dispose(); + nameController1.dispose(); + nameController2.dispose(); + anyWitnessesController.dispose(); + reportingDateTimeController.dispose(); + actionTakenController.dispose(); + catSubCatController.dispose(); + + Get.delete(); + super.dispose(); + } + + selectDateAndTimeOfReporting(context) async { + Get.focusScope?.unfocus(); + final DateTime? d = await showDialog( + context: context, + builder: (BuildContext context) { + return AdoptiveCalendar( + initialDate: DateTime.now(), + action: true, + ); + }, + ); + // final d = await CommonCode.datePicker(context); + + if (d != null) { + reportingDateTimeController.text = + FrequentFunctions.careNoteDateFormatter.format(d).toLowerCase(); + } + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + + if (concernAboutServiceUserController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Concerns about the service user field is required", + ); + return; + } + + if (voiceOfServiceUserController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Voice of the service user field is required", + ); + return; + } + + if (anyImmediateRisksController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Are there any immediate risks field is required", + ); + return; + } + + if (catSubCatController.selectedBodyPart() == null) { + FrequentFunctions.showToast( + message: "Please select category first", + ); + return; + } + + if (catSubCatController.selectedBodyPart()!.subCategory.isNotEmpty && + catSubCatController.selectedSubcategory() == null) { + FrequentFunctions.showToast( + message: "Please select subcategory", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + category: catSubCatController.selectedSubcategory()?.id ?? + catSubCatController.selectedBodyPart()!.id, + noteDetails: SafeguardingFormHtmlRequest( + concernsAboutServiceUser: + concernAboutServiceUserController.text.trim(), + voiceOfTheServiceUser: voiceOfServiceUserController.text.trim(), + areThereAnyImmediateRisks: anyImmediateRisksController.text.trim(), + whatActionDoYouFeel: qActionTakenController.text.trim(), + comments: commentsController.text.trim(), + yourName: nameController1.text.trim(), + anyWitnesses: anyWitnessesController.text.trim(), + dateTimeReporting: reportingDateTimeController.text.trim(), + yourNameDslDdsl: nameController2.text.trim(), + actionTaken: actionTakenController.text.trim(), + ).toHtml(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/showering_bath_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/showering_bath_form_screen_controller.dart new file mode 100644 index 0000000..6effbf4 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/showering_bath_form_screen_controller.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/showering_and_bath_form_html_request.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +class ShoweringBathFormScreenController extends CommonCareNoteFormsController { + final commentsController = TextEditingController(); + + final selectedOption = Rx('Bath'); + + ShoweringBathFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + commentsController.dispose(); + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + + if (commentsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Comments field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: ShoweringAndBathFormHtmlRequest( + showeringBathType: selectedOption(), + comments: commentsController.text.trim(), + ).toHtml(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/toileting_note_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/toileting_note_form_screen_controller.dart new file mode 100644 index 0000000..8a08ad9 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/toileting_note_form_screen_controller.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/careNoteFormsRequests/toileting_form_html_request.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +class ToiletingNoteFormScreenController extends CommonCareNoteFormsController { + final commentsController = TextEditingController(); + + final selectedOption = Rx(null); + final assistanceRequired = false.obs; + + ToiletingNoteFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + commentsController.dispose(); + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + + if (assistanceRequired() && commentsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Comments field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: ToiletingFormHtmlRequest( + assistanceRequired: assistanceRequired(), + assistanceType: !assistanceRequired() ? "" : (selectedOption() ?? ""), + comments: !assistanceRequired() ? "" : commentsController.text.trim(), + ).toHtml(), + ), + ); + } +} diff --git a/lib/controllers/clients/careNoteFormControllers/weight_height_form_screen_controller.dart b/lib/controllers/clients/careNoteFormControllers/weight_height_form_screen_controller.dart new file mode 100644 index 0000000..c36b4f6 --- /dev/null +++ b/lib/controllers/clients/careNoteFormControllers/weight_height_form_screen_controller.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'common_care_note_forms_controller.dart'; + +class WeightHeightFormScreenController extends CommonCareNoteFormsController { + final heightController = TextEditingController(); + final weightController = TextEditingController(); + final commentsController = TextEditingController(); + + final appointmentWith = [ + "GP", + "CAMHS", + "Psychologist", + "A&E", + "Sexual Health", + "Social Worker", + "Other" + ]; + + WeightHeightFormScreenController({required CommonCareNoteFormArgs args}) + : super(args: args); + + @override + void dispose() { + heightController.dispose(); + weightController.dispose(); + commentsController.dispose(); + Get.delete(); + super.dispose(); + } + + Future onSaveButtonTap() async { + // if (super.date == null || super.time == null) { + if (super.date == null) { + FrequentFunctions.showToast( + message: "Please select date and time first", + ); + return; + } + if (heightController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Height field is required", + ); + return; + } + if (weightController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Weight field is required", + ); + return; + } + if (commentsController.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Comments field is required", + ); + return; + } + + super.removeFocus(); + + await onFormSubmit( + request: CreateCarePlanRequest( + isHTML: true, + flag: false, + title: "", + noteDetails: CreateCarePlanRequest.heightWeightHtmlReq( + heightController.text.trim(), + weightController.text.trim(), + commentsController.text.trim(), + ), + ), + ); + } +} diff --git a/lib/controllers/clients/care_note_detail_screen_controller.dart b/lib/controllers/clients/care_note_detail_screen_controller.dart new file mode 100644 index 0000000..abba24c --- /dev/null +++ b/lib/controllers/clients/care_note_detail_screen_controller.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import '../../models/clients/allCareNotes/CarePlans.dart'; +import '../../view/screens/clients/care_note_detail_screen.dart'; + +class CareNoteDetailScreenController extends GetxController { + final isLoadingWebPage = false.obs; + final webViewHeight = (300.0).obs; + + late final WebViewController webViewController; + + String headerHtml = """

"""; + + final CarePlan data; + + CareNoteDetailScreenController(this.data) { + headerHtml = """

+ ${data.addedby?.name ?? ""} + ${(data.eventDateTime == null) ? "" : DateFormat("dd/MM/yyyy hh:mm aa").format(DateTime.fromMillisecondsSinceEpoch(data.eventDateTime!).toLocal())} +

+ """; + + if (data.isHTML == true) { + final bodyPartHtml = (data.healthIssueId?.category == null) + ? "" + : """

+ Effected Body Part + ${data.healthIssueId!.category!.name} +

"""; + + webViewController = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) {}, + onPageStarted: (String url) { + isLoadingWebPage.value = true; + }, + onPageFinished: (String url) { + updateWebViewHeight(); + }, + onHttpError: (HttpResponseError error) {}, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest request) { + if (request.url.startsWith('https://www.youtube.com/')) { + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadHtmlString(CareNoteDetailScreen.meta + + CareNoteDetailScreen.css + + headerHtml + + data.noteDetails! + + bodyPartHtml); + } + } + + void updateWebViewHeight() async { + final height = await webViewController + .runJavaScriptReturningResult('document.body.scrollHeight;'); + if (height is String) { + double h = double.parse(height); + webViewHeight.value = h; + } else if (height is double) { + webViewHeight.value = height; + } + + isLoadingWebPage.value = false; + } +} diff --git a/lib/controllers/clients/care_notes_screen_controller.dart b/lib/controllers/clients/care_notes_screen_controller.dart new file mode 100644 index 0000000..6080459 --- /dev/null +++ b/lib/controllers/clients/care_notes_screen_controller.dart @@ -0,0 +1,273 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/enums/care_note_form_type.dart'; +import 'package:get/get.dart'; +import '../../ftc_mobile_app.dart'; +import '../../models/clients/care_note_category.dart'; + +class CareNotesScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final List categories = []; + + final categoriesMapList = [ + { + "iconPath": AssetsManager.kIcHealth, + "category": "Health", + "subcategories": [ + { + "iconPath": AssetsManager.kIcInjury, + "name": "Injury / Health Issue", + "formType": CareNotesFormType.injuryHealthIssueForm.text, + "apiValue": CareNotesFormType.injuryHealthIssueForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcWeightHeight, + "name": "Weight / Height", + "formType": CareNotesFormType.weightHeightForm.text, + "apiValue": CareNotesFormType.weightHeightForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcAppointment, + "name": "Health appointments", + "formType": CareNotesFormType.healthAppointmentForm.text, + "apiValue": CareNotesFormType.healthAppointmentForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcSearch, + "name": "Observations", + "formType": CareNotesFormType.observationsForm.text, + "apiValue": CareNotesFormType.observationsForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcOthers, + "name": "Others", + "formType": CareNotesFormType.healthOtherForm.text, + "apiValue": CareNotesFormType.healthOtherForm.apiValue, + } + ] + }, + { + "iconPath": AssetsManager.kIcGeneral, + "category": "General", + "subcategories": [ + { + "iconPath": AssetsManager.kIcNote, + "name": "General Note", + "formType": CareNotesFormType.generalNoteForm.text, + "apiValue": CareNotesFormType.generalNoteForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcActivity, + "name": "Activities", + "formType": CareNotesFormType.activitiesForm.text, + "apiValue": CareNotesFormType.activitiesForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcSleep, + "name": "Sleep", + "formType": CareNotesFormType.sleepForm.text, + "apiValue": CareNotesFormType.sleepForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcSafeguarding, + "name": "Safeguarding", + "formType": CareNotesFormType.safeguardingForm.text, + "apiValue": CareNotesFormType.safeguardingForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcOthers, + "name": "Others", + "formType": CareNotesFormType.generalOtherForm.text, + "apiValue": CareNotesFormType.generalOtherForm.apiValue, + } + ] + }, + { + "iconPath": AssetsManager.kIcPersonalCare, + "category": "Personal Care", + "subcategories": [ + { + "iconPath": AssetsManager.kIcToileting, + "name": "Toileting", + "formType": CareNotesFormType.toiletingNoteForm.text, + "apiValue": CareNotesFormType.toiletingNoteForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcShower, + "name": "Showering / Bath", + "formType": CareNotesFormType.showeringBathForm.text, + "apiValue": CareNotesFormType.showeringBathForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcMouthHygiene, + "name": "Mouth Hygiene", + "formType": CareNotesFormType.mouthHygieneForm.text, + "apiValue": CareNotesFormType.mouthHygieneForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcOthers, + "name": "Others", + "formType": CareNotesFormType.personalCareOtherForm.text, + "apiValue": CareNotesFormType.personalCareOtherForm.apiValue, + } + ] + }, + { + "iconPath": AssetsManager.kIcMentalWellbeing, + "category": "Mental Wellbeing", + "subcategories": [ + { + "iconPath": AssetsManager.kIcMood, + "name": "Mood Rating", + "formType": CareNotesFormType.moodRatingForm.text, + "apiValue": CareNotesFormType.moodRatingForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcAbc, + "name": "ABC", + "formType": CareNotesFormType.ABCForm.text, + "apiValue": CareNotesFormType.ABCForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcPhysicalIntervention, + "name": "Physical Intervention", + "formType": CareNotesFormType.physicalInterventionForm.text, + "apiValue": CareNotesFormType.physicalInterventionForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcConsent, + "name": "Consent, Capacity, MCA & DOLS", + "formType": CareNotesFormType.consentCapacityForm.text, + "apiValue": CareNotesFormType.consentCapacityForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcOthers, + "name": "Others", + "formType": CareNotesFormType.mentalWellbeingOtherForm.text, + "apiValue": CareNotesFormType.mentalWellbeingOtherForm.apiValue, + } + ] + }, + { + "iconPath": AssetsManager.kIcIntractions, + "category": "Professional/family Interactions", + "subcategories": [ + { + "iconPath": AssetsManager.kIcMeeting, + "name": "Meetings", + "formType": CareNotesFormType.meetingsForm.text, + "apiValue": CareNotesFormType.meetingsForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcTelephone, + "name": "Telephone Calls", + "formType": CareNotesFormType.telephoneCallsForm.text, + "apiValue": CareNotesFormType.telephoneCallsForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcReviews, + "name": "Reviews", + "formType": CareNotesFormType.reviewsForm.text, + "apiValue": CareNotesFormType.reviewsForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcEmail, + "name": "Emails", + "formType": CareNotesFormType.emailsForm.text, + "apiValue": CareNotesFormType.emailsForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcOtherInteractions, + "name": "All other interactions", + "formType": CareNotesFormType.allOtherInteractionsForm.text, + "apiValue": CareNotesFormType.allOtherInteractionsForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcOthers, + "name": "Others", + "formType": + CareNotesFormType.professionalFamilyInteractionsOtherForm.text, + "apiValue": + CareNotesFormType.professionalFamilyInteractionsOtherForm.apiValue, + } + ] + }, + { + "iconPath": AssetsManager.kIcIndependentLiving, + "category": "Independent Living", + "subcategories": [ + { + "iconPath": AssetsManager.kIcLaundry, + "name": "Laundry", + "formType": CareNotesFormType.laundryForm.text, + "apiValue": CareNotesFormType.laundryForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcCooking, + "name": "Cooking", + "formType": CareNotesFormType.cookingForm.text, + "apiValue": CareNotesFormType.cookingForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcHydration, + "name": "Nutrition / Hydration", + "formType": CareNotesFormType.nutritionHydrationForm.text, + "apiValue": CareNotesFormType.nutritionHydrationForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcCleaning, + "name": "Cleaning", + "formType": CareNotesFormType.cleaningForm.text, + "apiValue": CareNotesFormType.cleaningForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcFinance, + "name": "Finance", + "formType": CareNotesFormType.financeForm.text, + "apiValue": CareNotesFormType.financeForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcPublicInteraction, + "name": "Public interaction (including transport)", + "formType": CareNotesFormType.publicInteractionForm.text, + "apiValue": CareNotesFormType.publicInteractionForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcEducation, + "name": "Education", + "formType": CareNotesFormType.educationForm.text, + "apiValue": CareNotesFormType.educationForm.apiValue, + }, + { + "iconPath": AssetsManager.kIcOthers, + "name": "Others", + "formType": CareNotesFormType.independentLivingOtherForm.text, + "apiValue": CareNotesFormType.independentLivingOtherForm.apiValue, + } + ] + } + ]; + + @override + void onInit() { + for (var e in categoriesMapList) { + categories.add(CareNoteCategory.fromJson(e)); + } + super.onInit(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/care_notes_subcategories_screen_controller.dart b/lib/controllers/clients/care_notes_subcategories_screen_controller.dart new file mode 100644 index 0000000..4fe2676 --- /dev/null +++ b/lib/controllers/clients/care_notes_subcategories_screen_controller.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/service_users_model.dart'; +import 'package:get/get.dart'; +import '../../ftc_mobile_app.dart'; +import '../../models/clients/care_note_category.dart'; + +class CareNotesSubcategoriesScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/care_plan_menu_screen_controller.dart b/lib/controllers/clients/care_plan_menu_screen_controller.dart new file mode 100644 index 0000000..fedca4d --- /dev/null +++ b/lib/controllers/clients/care_plan_menu_screen_controller.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:get/get.dart'; + +import '../../ftc_mobile_app.dart'; +import '../../models/clients/service_users_model.dart'; + +class CarePlanMenuScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + var argument; + final serviceUser = Rx(null); + + CarePlanMenuScreenController({required UserData data}) { + serviceUser.value = data; + } + + @override + void onInit() { + if (CustomRouteGenerator.argument != null) { + argument = CustomRouteGenerator.argument; + if (argument is ServiceUserModel) { + serviceUser.value = argument; + } + } + super.onInit(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/client_profile_screen_controller.dart b/lib/controllers/clients/client_profile_screen_controller.dart new file mode 100644 index 0000000..b10d898 --- /dev/null +++ b/lib/controllers/clients/client_profile_screen_controller.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/service_users_model.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:get/get.dart'; +import '../../ftc_mobile_app.dart'; + +class ClientProfileScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + final serviceUser = Rx(null); + + ClientProfileScreenController({required UserData data}) { + serviceUser.value = data; + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/clients_list_screen_controller.dart b/lib/controllers/clients/clients_list_screen_controller.dart new file mode 100644 index 0000000..f2078a3 --- /dev/null +++ b/lib/controllers/clients/clients_list_screen_controller.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import '../../utilities/frequent_functions.dart'; +import '../../web_services/client_services.dart'; + +class ClientsListScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + final searchController = TextEditingController(); + + final serviceUsersList = RxList(); + final canLoadMore = RxBool(false); + final searchText = "".obs; + + final int _limit = 20; + int _skip = 0; + bool loadingMore = false; + + final _listRC = RefreshController(initialRefresh: false); + + RefreshController get listRC => _listRC; + + final _listSC = ScrollController(); + + ScrollController get listSC => _listSC; + + @override + void onInit() { + debounce(searchText, onSearch, time: 800.milliseconds); + super.onInit(); + } + + @override + void onReady() { + getClients(); + super.onReady(); + } + + void onRefresh() async { + await getClients(); + _listRC.refreshCompleted(); + } + + void onLoading() async { + if (!loadingMore) { + await _loadMore(); + } + + _listRC.loadComplete(); + } + + onSearch(String text) { + getClients(); + } + + Future getClients() async { + serviceUsersList.clear(); + _skip = 0; + var response = await ClientService() + .getServiceUsersList( + searchText: searchText(), + limit: _limit, + offset: _skip, + ) + .showLoader(); + + if (response.success == true) { + if (response.data?.users?.isNotEmpty == true) { + _skip += _limit; + serviceUsersList.value = response.data?.users ?? []; + canLoadMore.value = true; + } else { + canLoadMore.value = searchText.isEmpty; + } + } else { + if (response.message.isNullOrEmptyNot()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } + + Future _loadMore() async { + if (canLoadMore.isTrue) { + loadingMore = true; + + var response = await ClientService().getServiceUsersList( + searchText: searchText(), + limit: _limit, + offset: _skip, + ); + loadingMore = false; + + if (response.success == true) { + if (response.data?.users?.isNotEmpty == true) { + _skip += _limit; + serviceUsersList.addAll(response.data?.users ?? []); + canLoadMore.value = true; + } else { + canLoadMore.value = false; + } + } else { + if (response.message.isNullOrEmptyNot()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + searchController.dispose(); + _listSC.dispose(); + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/consent_and_capacity_add_new_form_screen_controller.dart b/lib/controllers/clients/consent_and_capacity_add_new_form_screen_controller.dart new file mode 100644 index 0000000..905feaa --- /dev/null +++ b/lib/controllers/clients/consent_and_capacity_add_new_form_screen_controller.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import '../../models/clients/consent_details_model.dart'; + +class ConsentAndCapacityAddNewFormScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + final firstNameController = TextEditingController(); + final lastNameController = TextEditingController(); + final phoneController = TextEditingController(); + final emailController = TextEditingController(); + final genderController = TextEditingController(); + final dobController = TextEditingController(); + final ageController = TextEditingController(); + final descriptionController = TextEditingController(); + + // List dropDownList = ["A","b","C"]; + // RxString selectedDropdownValue = "A".obs; + final isForUpdate = false.obs; + + // String updateConsentId = ""; + // final serviceUser = Rx(null); + ConsentDetailsModel saveResult = ConsentDetailsModel.empty(); + + Future saveButtonPressed(String serviceUserId) async { + var result = await ClientService() + .addConsentDetails( + description: descriptionController.value.text, + staffId: serviceUserId) + .showLoader(); + if (result is ConsentDetailsModel && result.id != "") { + saveResult.description = descriptionController.value.text; + result.description = descriptionController.value.text; + saveResult = result; + FrequentFunctions.showToast(message: "Consent Template added successfully"); + return result; + // return true; + } else { + if (result is String) { + FrequentFunctions.showToast(message: result); + } + return false; + } + } + + Future updateButtonPressed(String consentId) async { + var result = await ClientService() + .updateConsentDetails( + description: descriptionController.value.text, consentId: consentId) + .showLoader(); + if (result is bool && result == true) { + FrequentFunctions.showToast(message: "Consent Template Updated successfully"); + return true; + } else { + if (result is String) { + FrequentFunctions.showToast(message: result); + } + return false; + } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + firstNameController.dispose(); + lastNameController.dispose(); + phoneController.dispose(); + emailController.dispose(); + genderController.dispose(); + dobController.dispose(); + ageController.dispose(); + descriptionController.dispose(); + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/consent_and_capacity_questionnaire_screen_controller.dart b/lib/controllers/clients/consent_and_capacity_questionnaire_screen_controller.dart new file mode 100644 index 0000000..1868ac2 --- /dev/null +++ b/lib/controllers/clients/consent_and_capacity_questionnaire_screen_controller.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +import '../../models/clients/consent_details_model.dart'; +import '../../models/clients/service_users_model.dart'; + +class ConsentAndCapacityQuestionnaireScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + List dropDownList = ["A", "b", "C"]; + RxString selectedDropdownValue = "A".obs; + RxList consentDetailsList = RxList(); + dynamic argument; + final serviceUser = Rx(null); + + ConsentAndCapacityQuestionnaireScreenController({required UserData data}) { + serviceUser.value = data; + } + + @override + void onReady() { + print("serviceUser() != null ---- ${serviceUser() != null}"); + if (serviceUser() != null) { + fetchList(); + } + super.onReady(); + } + + void fetchList() async { + if (CustomRouteGenerator.argument != null) { + argument = CustomRouteGenerator.argument; + if (argument is ServiceUserModel) { + serviceUser.value = argument; + } + } + var result = await ClientService() + .getConsentDetails(staffId: serviceUser()!.id!) + .showLoader(); + if (result is List) { + consentDetailsList.value = result; + } + } + + void deleteConsentPressed( + {required String consentId, required int index}) async { + var result = + await ClientService().deleteConsent(consentId: consentId).showLoader(); + if (result is bool && result == true) { + FrequentFunctions.showToast(message: "Consent Deleted Successfully"); + consentDetailsList.removeAt(index); + } else { + if (result is String) { + FrequentFunctions.showToast(message: result); + } else { + FrequentFunctions.showToast(message: "Consent Deleted Successfully"); + } + } + } + + Future updateButtonPressed( + String description, String id, int index) async { + var result = await ClientService() + .updateConsentDetails(description: description, consentId: id); + if (result is bool && result == true) { + FrequentFunctions.showToast(message: "Consent Template Updated successfully"); + consentDetailsList[index].description = description; + consentDetailsList.refresh(); + return true; + } else { + if (result is String) { + FrequentFunctions.showToast(message: result); + } + return false; + } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/clients/current_health_issues_screen_controller.dart b/lib/controllers/clients/current_health_issues_screen_controller.dart new file mode 100644 index 0000000..343e3eb --- /dev/null +++ b/lib/controllers/clients/current_health_issues_screen_controller.dart @@ -0,0 +1,138 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/HealthIssuesDetailsModel.dart'; +import 'package:ftc_mobile_app/models/clients/body_points_category.dart'; +import 'package:ftc_mobile_app/utilities/enums/body_parts.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +class BodyPointIssueStyleWrapper { + final HealthIssueDetailsModel data; + Color? color; + + BodyPointIssueStyleWrapper({ + required this.data, + this.color, + }); +} + +class CurrentHealthIssuesScreenController extends GetxController { + static const tabAllIssues = "All Issues"; + static const tabActiveIssues = "Active Issues"; + static const tabResolvedIssues = "Resolved Issues"; + + final GlobalKey screenKey = GlobalKey(); + + RxString selectedDropdownValue = "Active".obs; + + final List tabs = [tabAllIssues, tabActiveIssues, tabResolvedIssues]; + Map oIssueBodyParts = {}; + final issueBodyParts = RxMap(); + + String serviceUserId = ''; + String currentTab = tabAllIssues; + + @override + void onInit() { + super.onInit(); + } + + @override + void onReady() { + getPointsDataFromService(); + super.onReady(); + } + + onTabChange(String tabText) { + switch (tabText) { + case tabAllIssues: + issueBodyParts.value = Map.from(oIssueBodyParts); + break; + case tabActiveIssues: + final f = {}; + f.addEntries(oIssueBodyParts.entries.where((e) => e.value.data.status)); + issueBodyParts.value = f; + break; + case tabResolvedIssues: + final f = {}; + f.addEntries( + oIssueBodyParts.entries.where((e) => e.value.data.status == false)); + issueBodyParts.value = f; + break; + } + + currentTab = tabText; + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + static Color getStatusColor(bool status) { + return status == true ? Colors.red : Colors.green; + } + + /// This method fetches health issues and map their body points to related data and color to show for the point, + void getPointsDataFromService() async { + var result = await ClientService() + .getHealthIssues(userId: serviceUserId) + .showLoader(); + + if (result is List) { + final bodyPartsMap = {}; + const bodyParts = BodyPart.values; + + for (final data in result) { + final bodyPartEnum = bodyParts.firstWhereOrNull( + (e1) => e1.apiValue == data.bodyPointsCategory?.enumed); + if (bodyPartEnum != null) { + bodyPartsMap[bodyPartEnum] = BodyPointIssueStyleWrapper( + data: data, + color: getStatusColor(data.status), + ); + } + } + oIssueBodyParts = bodyPartsMap; + onTabChange(currentTab); + } + } + + Future updateHealthIssueStatus( + {required BodyPart bodyPoint, + required HealthIssueDetailsModel data, + required bool status}) async { + final response = await ClientService() + .updateHealthIssueData( + issueId: data.id, + categoryId: data.bodyPointsCategory!.id, + status: status, + ) + .showLoader(); + + if (response is BodyPointsCategory) { + oIssueBodyParts[bodyPoint]! + ..data.status = status + ..color = getStatusColor(status); + + issueBodyParts[bodyPoint]! + ..data.status = status + ..color = getStatusColor(status); + + Get.back(); + onTabChange(currentTab); + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + } + + void onBackPress(BuildContext context) { + Get.delete(); + Navigator.pop(context); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/document_details_screen_controller.dart b/lib/controllers/clients/document_details_screen_controller.dart new file mode 100644 index 0000000..605c915 --- /dev/null +++ b/lib/controllers/clients/document_details_screen_controller.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class DocumentDetailsScreenController extends GetxController{ + + final GlobalKey screenKey = GlobalKey(); + + + void removeFocus(){ + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/documents_list_screen_controller.dart b/lib/controllers/clients/documents_list_screen_controller.dart new file mode 100644 index 0000000..214a172 --- /dev/null +++ b/lib/controllers/clients/documents_list_screen_controller.dart @@ -0,0 +1,113 @@ +import 'dart:io'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/documents_list_model.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart'; + +class DocumentsListScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final searchTEC = TextEditingController(); + List oDocumentsList = []; + + final documentsList = RxList(); + final serviceUser = Rx(null); + + DocumentsListScreenController(UserData data) { + serviceUser.value = data; + } + + @override + void onReady() { + getDocuments(); + super.onReady(); + } + + void getDocuments() async { + final response = await ClientService() + .getDocumentListService(serviceUserId: serviceUser()!.id!) + .showLoader(); + if (response is DocumentsListModel) { + if (response.documentList.isNotEmpty) { + response.documentList + .removeWhere((e) => e.title.isEmpty || e.details.isEmpty); + + oDocumentsList = response.documentList; + documentsList.value = response.documentList; + } + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + } + + onSearch(String text) { + if (text.isEmpty) { + documentsList.value = oDocumentsList; + } else { + documentsList.value = oDocumentsList + .where((e) => e.title.toLowerCase().contains(text.toLowerCase())) + .toList(); + } + } + + downloadDoc({required String path}) async { + if (path.isNotEmpty) { + final f = await _downloadGooglePlacePhoto(path: path).showLoader(); + + if (f != null) { + FrequentFunctions.showToast( + message: "Document downloaded successfully"); + } + } + } + + Future _downloadGooglePlacePhoto({required String path}) async { + try { + // final hasInternet = await FrequentFunctions.hasInternetConnection; + // debugPrint("hasInternet: $hasInternet"); + // + // if (!hasInternet) { + // return null; + // } + + final tempDir = await getApplicationDocumentsDirectory(); + String fullPath = "${tempDir.path}/${basename(path)}"; + + File file = File(fullPath); + + if (file.existsSync()) { + return null; + } + + var dio = Dio(); + + final response = await dio.get( + "${WebUrls.baseUrl}$path", + options: Options(responseType: ResponseType.bytes), + ); + + if (response.statusCode == 200) { + file.writeAsBytesSync(response.data); + return file; + } + return null; + } on DioException catch (_) { + return null; + } catch (e) { + debugPrint("Web Error: $e"); + return null; + } + } + + @override + void dispose() { + Get.delete(); + searchTEC.dispose(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/export_clients_controllers.dart b/lib/controllers/clients/export_clients_controllers.dart new file mode 100644 index 0000000..930edbc --- /dev/null +++ b/lib/controllers/clients/export_clients_controllers.dart @@ -0,0 +1,20 @@ +export 'clients_list_screen_controller.dart'; +export 'client_profile_screen_controller.dart'; +export 'appointment_screen_controller.dart'; +export 'notes_screen_controller.dart'; +export 'select_note_screen_controller.dart'; +export 'new_note_screen_controller.dart'; +export 'care_plan_menu_screen_controller.dart'; +export 'documents_list_screen_controller.dart'; +export 'document_details_screen_controller.dart'; +export 'recent_incidents_screen_controller.dart'; +export 'current_health_issues_screen_controller.dart'; +export 'consent_and_capacity_add_new_form_screen_controller.dart'; +export 'consent_and_capacity_questionnaire_screen_controller.dart'; +export 'life_history_and_goals_screen_controller.dart'; +export 'pbs_plan_screen_controller.dart'; +export 'photo_gallery_screen_controller.dart'; +export 'risk_assessments_screen_controller.dart'; +export 'risk_assessments_template_screen_controller.dart'; +export 'new_client_module_controllers/export_new_client_module.dart'; +export 'care_notes_screen_controller.dart'; \ No newline at end of file diff --git a/lib/controllers/clients/life_history_and_goals_screen_controller.dart b/lib/controllers/clients/life_history_and_goals_screen_controller.dart new file mode 100644 index 0000000..b0ffbfe --- /dev/null +++ b/lib/controllers/clients/life_history_and_goals_screen_controller.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class LifeHistoryAndGoalsScreenController extends GetxController{ + + final GlobalKey screenKey = GlobalKey(); + TextEditingController lastNameController = TextEditingController(); + List dropDownList = ["A","b","C"]; + RxString selectedDropdownValue = "A".obs; + + void removeFocus(){ + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/add_new_pbs_plan_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/add_new_pbs_plan_screen_controller.dart new file mode 100644 index 0000000..2505571 --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/add_new_pbs_plan_screen_controller.dart @@ -0,0 +1,199 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/PBSPlanModel.dart'; +import 'package:ftc_mobile_app/models/clients/add_pbs_plan_model.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/screens/clients/clients_new_view_module/add_new_pbs_plan_screen.dart'; +import 'package:get/get.dart'; + +class AddNewPbsPlanScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + // dynamic argument; + + // final serviceUser = Rx(null); + + // String userId = ""; + final addPbsPlanModel = PbsList.empty().obs; + final enableSubmitButton = true.obs; + + late final AddNewPBSPlanScreenArgs args; + + AddNewPbsPlanScreenController(AddNewPBSPlanScreenArgs data) { + args = data; + if (data.pbsData != null) { + addPbsPlanModel.value = data.pbsData!; + } + } + + @override + void onInit() { + // if (CustomRouteGenerator.argument != null) { + // argument = CustomRouteGenerator.argument; + // if (argument is ServiceUserModel) { + // serviceUser.value = argument; + // } else if (argument is List) { + // if (argument[1] is ServiceUserModel) { + // ServiceUserModel user = argument[1]; + // userId = user.id; + // } + // if (argument[0] is PbsList) { + // PbsList listItem = argument[0]; + // addPbsPlanModel.value.userId = listItem.userIdModelInPbs?.id ?? ""; + // addPbsPlanModel.value.staffId = listItem.staffId?.id ?? ""; + // addPbsPlanModel.value.planId = listItem.id; + // addPbsPlanModel.value.aboutPlanNote = listItem.aboutPlan; + // addPbsPlanModel.value.managementOfBehaviouralPresentationNote = + // listItem.managementOfBehaviorPlan; + // addPbsPlanModel.value.secondaryPreventionNote = + // listItem.secondaryPrevention; + // addPbsPlanModel.value.reactiveStrategiesNote = + // listItem.reactiveStrategies; + // addPbsPlanModel.value.postIncidentSupportRecoveryNote = + // listItem.postIncidentSupport; + // } + // } + // } + super.onInit(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + // void enableDisableSubmitButton() async { + // enableSubmitButton.value = await addPbsPlanModel.value.areAllFieldsEdited; + // } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context, dynamic argument) { + addPbsPlanModel.value.postIncidentSupportRecoveryQuillController.dispose(); + addPbsPlanModel.value.reactiveStrategiesQuillController.dispose(); + addPbsPlanModel.value.secondaryPreventionQuillController.dispose(); + addPbsPlanModel.value.managementOfBehaviouralPresentationQuillController + .dispose(); + addPbsPlanModel.value.aboutPlanQuillController.dispose(); + Get.delete(); + Navigator.of(context).pop(argument); + } + + void submitButtonPressed() async { + //post Incident Support + final postIncidentSupportText = await addPbsPlanModel + .value.postIncidentSupportRecoveryQuillController + .getText(); + + if (postIncidentSupportText.isEmpty) { + FrequentFunctions.showToast(message: "All fields are mandatory."); + return; + } + + //reactive Strategies + final reactiveStrategiesText = + await addPbsPlanModel.value.reactiveStrategiesQuillController.getText(); + + if (reactiveStrategiesText.isEmpty) { + FrequentFunctions.showToast(message: "All fields are mandatory."); + return; + } + + //secondaryPrevention + final secondaryPreventionText = await addPbsPlanModel + .value.secondaryPreventionQuillController + .getText(); + + if (secondaryPreventionText.isEmpty) { + FrequentFunctions.showToast(message: "All fields are mandatory."); + return; + } + + //management Of Behavior Plan + final managementOfBehaviorPlanText = await addPbsPlanModel + .value.managementOfBehaviouralPresentationQuillController + .getText(); + + if (managementOfBehaviorPlanText.isEmpty) { + FrequentFunctions.showToast(message: "All fields are mandatory."); + return; + } + + //about Plan + final aboutPlanText = + await addPbsPlanModel.value.aboutPlanQuillController.getText(); + + if (aboutPlanText.isEmpty) { + FrequentFunctions.showToast(message: "All fields are mandatory."); + return; + } + + dynamic response; + + if (args.pbsData == null) { + response = await ClientService() + .addPbsPlanService( + userId: args.userData.id!, + staffId: LocalStorageManager.userId, + postIncidentSupport: postIncidentSupportText, + reactiveStartegies: reactiveStrategiesText, + secondaryPrevention: secondaryPreventionText, + managementOfBehaviorPlan: managementOfBehaviorPlanText, + aboutPlan: aboutPlanText) + .showLoader(); + } else { + response = await ClientService() + .updatePbsPlanService( + id: addPbsPlanModel().id, + userId: args.userData.id!, + staffId: LocalStorageManager.userId, + postIncidentSupport: postIncidentSupportText, + reactiveStartegies: reactiveStrategiesText, + secondaryPrevention: secondaryPreventionText, + managementOfBehaviorPlan: managementOfBehaviorPlanText, + aboutPlan: aboutPlanText, + ) + .showLoader(); + } + + if (response is AddPBSPlanModel) { + print("-------------response is AddPBSPlanModel-----------"); + print({response.toString()}); + print("------------------------"); + backButtonPressed(screenKey.currentContext!, true); + } else { + FrequentFunctions.showToast(message: response.toString()); + } + } + +// void updateButtonPressed() async { +// dynamic response = await ClientService() +// .updatePbsPlanService( +// id: addPbsPlanModel().id, +// userId: args.userData.id!, +// staffId: FrequentFunctions.userModel.value.id, +// postIncidentSupport: await addPbsPlanModel +// .value.postIncidentSupportRecoveryQuillController +// .getText(), +// reactiveStartegies: await addPbsPlanModel +// .value.reactiveStrategiesQuillController +// .getText(), +// secondaryPrevention: await addPbsPlanModel +// .value.secondaryPreventionQuillController +// .getText(), +// managementOfBehaviorPlan: await addPbsPlanModel +// .value.managementOfBehaviouralPresentationQuillController +// .getText(), +// aboutPlan: +// await addPbsPlanModel.value.aboutPlanQuillController.getText()) +// .showLoader(); +// if (response is AddPBSPlanModel) { +// backButtonPressed(screenKey.currentContext!, true); +// } else { +// FrequentFunctions.showToast(message: response.toString()); +// } +// } +} diff --git a/lib/controllers/clients/new_client_module_controllers/crisis_management_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/crisis_management_screen_controller.dart new file mode 100644 index 0000000..f292773 --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/crisis_management_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class CrisisManagementScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/export_new_client_module.dart b/lib/controllers/clients/new_client_module_controllers/export_new_client_module.dart new file mode 100644 index 0000000..728eade --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/export_new_client_module.dart @@ -0,0 +1,12 @@ +export 'crisis_management_screen_controller.dart'; +export 'future_plans_screen_controller.dart'; +export 'health_full_body_map_screen_controller.dart'; +export 'health_screen_controller.dart'; +export 'medication_screen_controller.dart'; +export 'introduction_screen_controller.dart'; +export 'mental_health_screen_controller.dart'; +export 'my_current_plan_screen_controller.dart'; +export 'my_interests_screen_controller.dart'; +export 'overview_screen_controller.dart'; +export 'things_i_want_you_to_help_me_screen_controller.dart'; +export 'support_plan_screen_controller.dart'; \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/future_plans_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/future_plans_screen_controller.dart new file mode 100644 index 0000000..ba3c571 --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/future_plans_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class FuturePlansScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/health_full_body_map_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/health_full_body_map_screen_controller.dart new file mode 100644 index 0000000..aeef97e --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/health_full_body_map_screen_controller.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class HealthFullBodyMapScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + List activeList = ["Active","Expired"]; + RxString selectedDropdownValue = "Active".obs; + RxBool firstPointVisible = false.obs; + RxString firstPointSelectedDropdownValue = "Active".obs; + RxBool secondPointVisible = false.obs; + RxString secondPointSelectedDropdownValue = "Expired".obs; + RxBool thirdPointVisible = false.obs; + RxString thirdPointSelectedDropdownValue = "Active".obs; + RxBool fourthPointVisible = false.obs; + RxString fourthPointSelectedDropdownValue = "Expired".obs; + RxBool fifthPointVisible = false.obs; + RxString fifthPointSelectedDropdownValue = "Active".obs; + RxBool sixthPointVisible = false.obs; + RxString sixthPointSelectedDropdownValue = "Expired".obs; + + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/health_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/health_screen_controller.dart new file mode 100644 index 0000000..6b7c64f --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/health_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class HealthScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/introduction_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/introduction_screen_controller.dart new file mode 100644 index 0000000..29dc826 --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/introduction_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class ClientsIntroductionScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/medication_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/medication_screen_controller.dart new file mode 100644 index 0000000..c432c0a --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/medication_screen_controller.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class MedicationScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/mental_health_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/mental_health_screen_controller.dart new file mode 100644 index 0000000..345baed --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/mental_health_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class MentalHealthScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/my_current_plan_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/my_current_plan_screen_controller.dart new file mode 100644 index 0000000..a82d5a8 --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/my_current_plan_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class MyCurrentPlanScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/my_interests_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/my_interests_screen_controller.dart new file mode 100644 index 0000000..4658a50 --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/my_interests_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class MyInterestsScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/overview_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/overview_screen_controller.dart new file mode 100644 index 0000000..ffe20af --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/overview_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class OverViewScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/support_plan_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/support_plan_screen_controller.dart new file mode 100644 index 0000000..2e42856 --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/support_plan_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class SupportPlanScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_client_module_controllers/things_i_want_you_to_help_me_screen_controller.dart b/lib/controllers/clients/new_client_module_controllers/things_i_want_you_to_help_me_screen_controller.dart new file mode 100644 index 0000000..83eb0fa --- /dev/null +++ b/lib/controllers/clients/new_client_module_controllers/things_i_want_you_to_help_me_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class ThingsIWantYouToHelpMeWithScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } + +} \ No newline at end of file diff --git a/lib/controllers/clients/new_note_screen_controller.dart b/lib/controllers/clients/new_note_screen_controller.dart new file mode 100644 index 0000000..afd433c --- /dev/null +++ b/lib/controllers/clients/new_note_screen_controller.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../ftc_mobile_app.dart'; + +class NewNoteScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + final TextEditingController titleController = TextEditingController(); + + final UserModel user = UserModel( + name: 'John Doe', + profilePicture: 'assets/profile_picture.jpg', // Replace with the actual path or URL + phoneNumber: '123-456-7890', + homeAddress: '123 Main St, City ville', + nextOfKin: 'Jane Doe', + diagnosisDate: "Dec. 19", + diagnosisHistory: "A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here.", + aboutPatient: 'A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here.', + ); + List users = ["Hailey Johnson","Ryan Porter","Alan Cruz","Jiwon Nguyen","Patrick Lewis","Isabella Garcia","Yin Chiew","Rebecca Nicholson"]; + TextEditingController searchController = TextEditingController(); + + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + titleController.dispose(); + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/controllers/clients/notes_screen_controller.dart b/lib/controllers/clients/notes_screen_controller.dart new file mode 100644 index 0000000..0952b8d --- /dev/null +++ b/lib/controllers/clients/notes_screen_controller.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../ftc_mobile_app.dart'; + +class NotesScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + + final UserModel user = UserModel( + name: 'John Doe', + profilePicture: 'assets/profile_picture.jpg', // Replace with the actual path or URL + phoneNumber: '123-456-7890', + homeAddress: '123 Main St, City ville', + nextOfKin: 'Jane Doe', + diagnosisDate: "Dec. 19", + diagnosisHistory: "A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here.", + aboutPatient: 'A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here.', + ); + List users = ["Hailey Johnson","Ryan Porter","Alan Cruz","Jiwon Nguyen","Patrick Lewis","Isabella Garcia","Yin Chiew","Rebecca Nicholson"]; + TextEditingController searchController = TextEditingController(); + + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/controllers/clients/pbs_plan_screen_controller.dart b/lib/controllers/clients/pbs_plan_screen_controller.dart new file mode 100644 index 0000000..46e8956 --- /dev/null +++ b/lib/controllers/clients/pbs_plan_screen_controller.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/PBSPlanModel.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +class PBSPlanScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final searchTEC = TextEditingController(); + + // dynamic argument; + final serviceUser = Rx(null); + final pbsList = RxList(); + + @override + void onReady() { + fetchPBSPlanList(); + super.onReady(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + Future fetchPBSPlanList() async { + dynamic result = await ClientService() + .getPbsPlanListService(userId: serviceUser.value!.id!) + .showLoader(); + if (result is PBSListDataJson) { + if (result.pbsList.isNotEmpty) { + pbsList.value = result.pbsList.take(1).toList(); + } + } + } + + void onBackPress(BuildContext context) { + Get.delete(); + Navigator.pop(context); + } + + @override + void dispose() { + searchTEC.dispose(); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/photo_gallery_screen_controller.dart b/lib/controllers/clients/photo_gallery_screen_controller.dart new file mode 100644 index 0000000..514bd21 --- /dev/null +++ b/lib/controllers/clients/photo_gallery_screen_controller.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/memoryListResponse/MemoryListData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/utilities/frequent_functions.dart'; +import 'package:ftc_mobile_app/web_services/client_services.dart'; +import 'package:get/get.dart'; + +class PhotoGalleryScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + late final String serviceUserId; + + final memoryList = RxList(); + + @override + void onReady() { + getMemoryList(); + super.onReady(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + Future getMemoryList() async { + // serviceUsersList.clear(); + // _skip = 0; + var response = await ClientService() + .getMemoryList(serviceUserId: serviceUserId + // limit: _limit, + // offset: _skip, + ) + .showLoader(); + + if (response.success == true) { + if (response.data?.list?.isNotEmpty == true) { + // _skip += _limit; + memoryList.value = response.data?.list ?? []; + // canLoadMore.value = true; + } else { + // canLoadMore.value = searchText.isEmpty; + } + } else { + if (response.message.isNullOrEmptyNot()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/recent_incidents_screen_controller.dart b/lib/controllers/clients/recent_incidents_screen_controller.dart new file mode 100644 index 0000000..ca466ee --- /dev/null +++ b/lib/controllers/clients/recent_incidents_screen_controller.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import '../../models/clients/recent_incidents_model.dart'; + +class RecentIncidentsScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final searchTEC = TextEditingController(); + + List oRecentIncidentsList = []; + + RxList recentIncidentsList = RxList(); + final serviceUser = Rx(null); + + RecentIncidentsScreenController(UserData data) { + serviceUser(data); + } + + @override + void onReady() { + fetchRecentIncidentList(); + super.onReady(); + } + + void fetchRecentIncidentList() async { + if (serviceUser() == null) { + return; + } + + var result = await ClientService() + .getRecentIncidentsListService(userId: serviceUser()!.id!) + .showLoader(); + if (result is List) { + oRecentIncidentsList = List.from(result); + recentIncidentsList.value = result; + } else { + FrequentFunctions.showToast(message: result.toString()); + } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + onSearch(String text) { + if (text.isEmpty) { + recentIncidentsList.value = oRecentIncidentsList; + } else { + recentIncidentsList.value = oRecentIncidentsList + .where( + (e) => e.incidentTitle.toLowerCase().contains(text.toLowerCase())) + .toList(); + } + } + + @override + void dispose() { + searchTEC.dispose(); + Get.delete(); + super.dispose(); + } + + void onBackPress(BuildContext context) { + Get.delete(); + Navigator.pop(context); + } +} diff --git a/lib/controllers/clients/risk_assessments_screen_controller.dart b/lib/controllers/clients/risk_assessments_screen_controller.dart new file mode 100644 index 0000000..571f37e --- /dev/null +++ b/lib/controllers/clients/risk_assessments_screen_controller.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class RiskAssessmentsScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + + void removeFocus(){ + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/controllers/clients/risk_assessments_template_screen_controller.dart b/lib/controllers/clients/risk_assessments_template_screen_controller.dart new file mode 100644 index 0000000..3654284 --- /dev/null +++ b/lib/controllers/clients/risk_assessments_template_screen_controller.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/RiskAssessmentData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/utilities/frequent_functions.dart'; +import 'package:ftc_mobile_app/web_services/client_services.dart'; +import 'package:get/get.dart'; + +class RiskAssessmentsTemplateScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + late final String serviceUserId; + final list = RxList(); + + RiskAssessmentsTemplateScreenController(String userId) { + serviceUserId = userId; + } + + @override + void onReady() { + getRiskAssessments(); + super.onReady(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + void getRiskAssessments() async { + var response = await ClientService() + .getRiskAssessments(serviceUserId: serviceUserId) + .showLoader(); + + if (response.success == true) { + list.value = response.data ?? []; + } else { + if (response.message.isNotNullOrEmpty()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/clients/select_note_screen_controller.dart b/lib/controllers/clients/select_note_screen_controller.dart new file mode 100644 index 0000000..d42460c --- /dev/null +++ b/lib/controllers/clients/select_note_screen_controller.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../ftc_mobile_app.dart'; + +class SelectNoteScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + final UserModel user = UserModel( + name: 'John Doe', + profilePicture: 'assets/profile_picture.jpg', // Replace with the actual path or URL + phoneNumber: '123-456-7890', + homeAddress: '123 Main St, City ville', + nextOfKin: 'Jane Doe', + diagnosisDate: "Dec. 19", + diagnosisHistory: "A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here.", + aboutPatient: 'A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here. A quick preview of the diagnosis will be shown here.', + ); + List users = ["Hailey Johnson","Ryan Porter","Alan Cruz","Jiwon Nguyen","Patrick Lewis","Isabella Garcia","Yin Chiew","Rebecca Nicholson"]; + TextEditingController searchController = TextEditingController(); + + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/controllers/custom_navigation_drawer_controller.dart b/lib/controllers/custom_navigation_drawer_controller.dart new file mode 100644 index 0000000..45ccc93 --- /dev/null +++ b/lib/controllers/custom_navigation_drawer_controller.dart @@ -0,0 +1,8 @@ + +import 'package:get/get.dart'; + +class CustomNavigationDrawerController extends GetxController{ + RxInt selectedIndex = 1.obs; + + +} \ No newline at end of file diff --git a/lib/controllers/export_controllers.dart b/lib/controllers/export_controllers.dart new file mode 100644 index 0000000..b6d2f14 --- /dev/null +++ b/lib/controllers/export_controllers.dart @@ -0,0 +1,7 @@ +export 'auth_module/export_auth_module.dart'; +export 'rota/export_rota_controller.dart'; +export 'clients/export_clients_controllers.dart'; +export 'home/export_home_controllers.dart'; +export 'notifications/export_notifications_controllers.dart'; +export 'profile/export_profile_controllers.dart'; +export 'custom_navigation_drawer_controller.dart'; \ No newline at end of file diff --git a/lib/controllers/home/dashboard_screen_controller.dart b/lib/controllers/home/dashboard_screen_controller.dart new file mode 100644 index 0000000..b3d4dc1 --- /dev/null +++ b/lib/controllers/home/dashboard_screen_controller.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/profile_screen_model.dart'; +import 'package:ftc_mobile_app/models/rota/LiveRoasterResponseData.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../ftc_mobile_app.dart'; + +class DashboardScreenController extends GetxController { + static DashboardScreenController get instance => + Get.find(); + + final GlobalKey screenKey = GlobalKey(); + + final selectedIndex = 1.obs; + final myShiftsList = RxList(); + final ongoingShift = Rx(null); + final myProfileData = Rx(null); + + @override + void onInit() { + _initOngoingShift(); + super.onInit(); + } + + @override + void onReady() { + getProfileDetail(); + getMyShifts(); + super.onReady(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + _initOngoingShift() { + final shift = LocalStorageManager.getOngoingShift(); + + if (shift != null) { + //meaning shift expired already + if (shift.endTime != null && shift.endTime!.isBefore(TimeOfDay.now())) { + LocalStorageManager.removeOngoingShift(); + } else { + ongoingShift.value = shift; + } + } + } + + getProfileDetail() async { + final resp = await ClientService().getUserDetails(); + + if (resp is ProfileDataModel) { + myProfileData.value = resp.data?.staffMembers?.firstOrNull; + } + } + + Future getMyShifts() async { + var response = await RotaService().getMyShifts( + startDateMills: DateTime.now().subtract(30.days).millisecondsSinceEpoch, + endDateMills: DateTime.now().add(30.days).millisecondsSinceEpoch); + if (response is LiveRoasterResponseData) { + response.daysArray = (response.daysArray.isNullOrEmpty()) + ? [] + : (response.daysArray! + ..sort((a, b) => a.shiftDate!.compareTo(b.shiftDate!))); + + List todayAndFutureShifts = []; + + //Extracting today's and future shifts + for (final shift in response.daysArray!) { + if (shift.shiftDateTime == null || + shift.startTime == null || + shift.endTime == null) { + debugPrint( + "shiftId: ${shift.id} has missing shiftDateTime or startTime or endTime. Please check"); + return; + } + + //Note: matching only date, month, year + final isTodayShift = + DateFormatter.dateFormatter.format(shift.shiftDateTime!) == + DateFormatter.dateFormatter.format(DateTime.now()); + + final isFutureShift = shift.shiftDateTime!.isAfter(DateTime.now()); + + if (isTodayShift) { + //checking and adding today's not expired shift + + // shift not expired yet + if (shift.endTime!.isAfter(TimeOfDay.now())) { + todayAndFutureShifts.add(shift); + + if (ongoingShift() == null) { + LocalStorageManager.saveShiftData(data: shift); + ongoingShift.value = shift; + } + } + } else if (isFutureShift) { + todayAndFutureShifts.add(shift); + } + } + + myShiftsList.value = todayAndFutureShifts.take(2).toList(); + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/home/export_home_controllers.dart b/lib/controllers/home/export_home_controllers.dart new file mode 100644 index 0000000..b6c266d --- /dev/null +++ b/lib/controllers/home/export_home_controllers.dart @@ -0,0 +1,3 @@ +export 'dashboard_screen_controller.dart'; +export '../../view/screens/chat/controller/chat_screen_controller.dart'; +export 'inbox_screen_controller.dart'; \ No newline at end of file diff --git a/lib/controllers/home/inbox_screen_controller.dart b/lib/controllers/home/inbox_screen_controller.dart new file mode 100644 index 0000000..3657a46 --- /dev/null +++ b/lib/controllers/home/inbox_screen_controller.dart @@ -0,0 +1,156 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/chat/combined_last_messages_model_class.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/screens/chat/arguments/group_data_args.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import '../../ftc_mobile_app.dart'; +import '../../web_services/chat_services.dart'; + +class InboxScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + // CombinedMessageModel combinedMessageModel = CombinedMessageModel.empty(); + final String privacyPolicy = + "A quick preview of the text will be shown here. A quick preview of the text will be shown here. shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.\n shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.\n shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here."; + + final checkBoxValue = false.obs; + final chatsAndGroups = RxList(); + + // final sortedChatsAndGroups = RxList(); + + final canLoadMore = RxBool(false); + final onFirstMessageSend = false.obs; + + // late IO.Socket socket; + // final int _limit = 20; + // int _skip = 0; + bool loadingMore = false; + + final _listRC = RefreshController(initialRefresh: false); + + RefreshController get listRC => _listRC; + + final _listSC = ScrollController(); + + ScrollController get listSC => _listSC; + String myId = ""; + + @override + void onInit() { + //Getting my ID + // String userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // UserModel userModel = UserModel.fromJson(json.decode(userJson)); + myId = LocalStorageManager.userId; + + onFirstMessageSend.listen((isTrue) { + if (isTrue) { + onFirstMessageSend(false); + getChatsAndGroupsList(); + } + }); + super.onInit(); + } + + @override + void onReady() { + // connect(); + getChatsAndGroupsList(); + super.onReady(); + } + + void onBackButtonPressed() { + Get.delete(); + Navigator.pop(screenKey.currentState!.context); + } + + // void showPrivacyDialog() { + // showDialog( + // context: screenKey.currentState!.context, + // builder: (BuildContext context) { + // return PrivacyPolicyDialog( + // privacyPolicy: privacyPolicy, + // checkBoxOnChange: (value) { + // checkBoxValue.value = value; + // }, + // ); + // }, + // ); + // } + + void onRefresh() async { + await getChatsAndGroupsList(); + _listRC.refreshCompleted(); + } + + void onLoading() async { + // if (!loadingMore) { + // await _loadMore(); + // } + + _listRC.loadComplete(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + Future getChatsAndGroupsList() async { + final resp = + await ChatService().combinedLastMessage(userId: myId).showLoader(); + + if (resp is CombinedMessageModel) { + List messages = []; + //Private Messages transform + for (final e in resp.personalMessage) { + messages.add( + MessagesListModel( + otherUserId: (e.senderId == myId) ? e.recieverId : e.senderId, + image: e.image, + title: e.name, + previewOfLastMessage: e.message, + messageType: e.messageType, + date: DateTime.tryParse(e.date)?.millisecondsSinceEpoch ?? + DateTime.now().millisecondsSinceEpoch, + // messageDateTime: FrequentFunctions.toTimesAgo(e.date), + // personalMessageIndex: index, + ), + ); + } + + //Group Messages transform + for (final e in resp.sortedArrayGroup) { + messages.add( + MessagesListModel( + image: e.groupImage, + title: e.groupName, + previewOfLastMessage: e.lastMessages.message, + messageType: MessageType.message.name, + // messageType: e.lastMessages.messageType ?? MessageType.message.name, + date: DateTime.tryParse(e.date)?.millisecondsSinceEpoch ?? + DateTime.now().millisecondsSinceEpoch, + // messageDateTime: FrequentFunctions.toTimesAgo(e.date), + isGroup: true, + groupData: GroupDataArgs( + groupId: e.id, + groupMembersIds: e.groupMembers, + scheduleTime: e.groupWorkingScheduleTime, + ), + ), + ); + } + + chatsAndGroups.value = messages; + } else { + FrequentFunctions.showToast(message: resp["message"]); + } + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/home/select_user_for_chat_screen_controller.dart b/lib/controllers/home/select_user_for_chat_screen_controller.dart new file mode 100644 index 0000000..8ceaf5a --- /dev/null +++ b/lib/controllers/home/select_user_for_chat_screen_controller.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/utilities/local_storage_manager/local_storage_manager.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import '../../utilities/frequent_functions.dart'; +import '../../web_services/client_services.dart'; + +class SelectUserForChatScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + final searchController = TextEditingController(); + + List oStaffUsersList = []; + + final staffUsersList = RxList(); + final canLoadMore = RxBool(false); + final searchText = "".obs; + + final int _limit = 20; + int _skip = 0; + bool loadingMore = false; + + final _listRC = RefreshController(initialRefresh: false); + + RefreshController get listRC => _listRC; + + final _listSC = ScrollController(); + + ScrollController get listSC => _listSC; + + @override + void onInit() { + // debounce(searchText, onSearch, time: 800.milliseconds); + super.onInit(); + } + + @override + void onReady() { + getStaffMembers(); + super.onReady(); + } + + void onRefresh() async { + await getStaffMembers(); + _listRC.refreshCompleted(); + } + + void onLoading() async { + if (!loadingMore) { + await _loadMore(); + } + + _listRC.loadComplete(); + } + + onSearch(String text) { + // getStaffMembers(); + + if (text.isEmpty) { + staffUsersList.value = List.from(oStaffUsersList); + } else { + staffUsersList.value = oStaffUsersList + .where( + (e) => e.displayName.toLowerCase().contains(text.toLowerCase())) + .toList(); + + // Future.forEach(oStaffUsersList, (e) => null); + } + } + + Future getStaffMembers() async { + staffUsersList.clear(); + _skip = 0; + var response = await (ClientService() + .getAllUsersList( + searchText: searchText(), + limit: _limit, + offset: _skip, + ) + .showLoader()); + + if (response.success == true) { + if (response.data?.users?.isNotEmpty == true) { + _skip += _limit; + + final list = response.data!.users! + ..removeWhere((e) => e.id == LocalStorageManager.userId); + + oStaffUsersList = List.from(list); + staffUsersList.value = list; + // canLoadMore.value = false; + } else { + // canLoadMore.value = searchText.isEmpty; + } + } else { + if (response.message.isNullOrEmptyNot()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } + + Future _loadMore() async { + if (canLoadMore.isTrue) { + loadingMore = true; + + var response = await ClientService().getServiceUsersList( + searchText: searchText(), + limit: _limit, + offset: _skip, + ); + loadingMore = false; + + if (response.success == true) { + if (response.data?.users?.isNotEmpty == true) { + _skip += _limit; + staffUsersList.addAll(response.data?.users ?? []); + canLoadMore.value = true; + } else { + canLoadMore.value = false; + } + } else { + if (response.message.isNullOrEmptyNot()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + searchController.dispose(); + _listSC.dispose(); + Get.delete(); + super.dispose(); + } + + void backButtonPressed(BuildContext context) { + Get.delete(); + Navigator.of(context).pop(); + } +} diff --git a/lib/controllers/notifications/export_notifications_controllers.dart b/lib/controllers/notifications/export_notifications_controllers.dart new file mode 100644 index 0000000..71a1588 --- /dev/null +++ b/lib/controllers/notifications/export_notifications_controllers.dart @@ -0,0 +1 @@ +export "notifications_list_screen_controller.dart"; \ No newline at end of file diff --git a/lib/controllers/notifications/notifications_list_screen_controller.dart b/lib/controllers/notifications/notifications_list_screen_controller.dart new file mode 100644 index 0000000..147b16f --- /dev/null +++ b/lib/controllers/notifications/notifications_list_screen_controller.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/utilities/frequent_functions.dart'; +import 'package:ftc_mobile_app/web_services/notification_services.dart'; +import 'package:get/get.dart'; + +class NotificationListScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + RxBool privacyPolicyAccepted = false.obs; + final String privacyPolicy = + "A quick preview of the text will be shown here. A quick preview of the text will be shown here. shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.\n shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.\n shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here."; + + // RxInt selectedIndex = 4.obs; + + @override + void onReady() { + getNotifications(); + super.onReady(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + Future getNotifications() async { + // serviceUsersList.clear(); + // _skip = 0; + var response = await NotificationService().getNotifications().showLoader(); + + if (response.success == true) { + // if (response.data?.users?.isNotEmpty == true) { + // _skip += _limit; + // serviceUsersList.value = response.data?.users ?? []; + // canLoadMore.value = true; + // } else { + // canLoadMore.value = searchText.isEmpty; + // } + } else { + if (response.message.isNullOrEmptyNot()) { + FrequentFunctions.showToast(message: response.message!); + } + } + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/profile/export_profile_controllers.dart b/lib/controllers/profile/export_profile_controllers.dart new file mode 100644 index 0000000..be26eaa --- /dev/null +++ b/lib/controllers/profile/export_profile_controllers.dart @@ -0,0 +1 @@ +export 'view_profile_screen_controller.dart'; \ No newline at end of file diff --git a/lib/controllers/profile/view_profile_screen_controller.dart b/lib/controllers/profile/view_profile_screen_controller.dart new file mode 100644 index 0000000..e4b6b46 --- /dev/null +++ b/lib/controllers/profile/view_profile_screen_controller.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/dialogs/app_dialogs.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; +import '../../models/profile_screen_model.dart'; + +class ViewProfileScreenController extends GetxController { + final nameTEC = TextEditingController(); + final emailTEC = TextEditingController(); + final phoneTEC = TextEditingController(); + final addressTEC = TextEditingController(); + + final GlobalKey screenKey = GlobalKey(); + final dashboardController = DashboardScreenController.instance; + + final viewProfileClient = false.obs; + final covidCheck = false.obs; + final isEditable = false.obs; + + final detail = Rx(null); + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void onInit() { + // FrequentFunctions.profileDataModelNew = ProfileDataModel.fromJson( + // json.decode(LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kProfileModelKey))); + + detail.listen((d) { + nameTEC.text = d?.user?.displayName ?? ""; + emailTEC.text = d?.user!.email ?? ""; + phoneTEC.text = d?.user?.phoneNumber ?? ""; + addressTEC.text = d?.user?.modelId?.homeAddress ?? ""; + }); + + detail.value = dashboardController.myProfileData(); + super.onInit(); + } + + @override + onReady() { + // getProfileDetail(); + super.onReady(); + } + + // getProfileDetail() async { + // final resp = await ClientService().getUserDetails().showLoader(); + // + // if (resp is ProfileDataModel) { + // detail.value = resp.data?.staffMembers?.firstOrNull; + // covidCheck.value = + // resp.data?.staffMembers?.firstOrNull?.covidCheck ?? false; + // } else { + // if (resp.isNotNullOrEmpty()) { + // FrequentFunctions.showToast(message: resp); + // } + // } + // } + + void logoutPressed() { + AppDialog.alertAndLogout(() { + FrequentFunctions().logoutButtonPressed(screenKey.currentState!.context); + }); + // showDialog( + // context: screenKey.currentState!.context, + // builder: (BuildContext context) { + // return CustomForgetPasswordDialog( + // dialogButtonCloseText: "Cancel", + // dialogButtonAcceptText: "YES", + // dialogMessageText: "", + // dialogMessageTextBold: "Are you Sure You want to logout?", + // headingText: "Confirmation", + // showTextField: false, + // acceptFunction: () async{ + // FrequentFunctions().logoutButtonPressed(screenKey.currentState!.context); + // }, + // ); + // }, + // ); + } + + @override + void dispose() { + nameTEC.dispose(); + emailTEC.dispose(); + phoneTEC.dispose(); + addressTEC.dispose(); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/rota/book_holiday_screen_controller.dart b/lib/controllers/rota/book_holiday_screen_controller.dart new file mode 100644 index 0000000..21239ca --- /dev/null +++ b/lib/controllers/rota/book_holiday_screen_controller.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_calendar_carousel/classes/event.dart'; +import 'package:flutter_calendar_carousel/classes/event_list.dart'; +import 'package:ftc_mobile_app/models/requests/HolidayRequestData.dart'; +import 'package:ftc_mobile_app/models/staffWorkload/StaffWorkloadResponse.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import '../../ftc_mobile_app.dart'; + +class BookHolidayScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final targetDateTime = DateTime.now().obs; + + final agreeToRules = false.obs; + + final holidayStartDate = DateTime.now().obs; + final holidayEndDate = Rx(DateTime.now()); + final holidayDays = 0.obs; + final holidayHours = 0.obs; + + final myWorkLoads = Rx(null); + + final _controller = Get.put(RotaDashboardScreenController()); + + Rx> get markedDatesMap => _controller.markedDatesMap; + + @override + void onInit() { + _calculateDaysAndHours(); + super.onInit(); + } + + @override + void onReady() { + fetchRecords(); + super.onReady(); + } + + onRangeSelect( + DateTime rangeStart, DateTime? rangeEnd, List selectedDates) { + print( + "rangeStart: ${rangeStart.toString()}\nrangeEnd: ${rangeEnd.toString()}"); + + holidayStartDate.value = rangeStart; + + holidayEndDate.value = rangeEnd ?? (rangeStart); + _calculateDaysAndHours(); + } + + _calculateDaysAndHours() { + holidayDays.value = holidayEndDate().difference(holidayStartDate()).inDays; + if (DateFormatter.dateFormatter.format(holidayStartDate()) != + DateFormatter.dateFormatter.format(holidayEndDate())) { + holidayDays.value += 1; + } else { + holidayDays.value = 1; + } + + //Filtering out shifts that fall between the holiday ranges + final shifts = _controller.myShiftsList.where((shift) { + final dateNotNull = shift.shiftDateTime != null; + + final isWithinHolidayRange = + shift.shiftDateTime!.isAfter(holidayStartDate()) && + shift.shiftDateTime!.isBefore(holidayEndDate()); + + final onHolidayStartDate = + DateFormatter.dateFormatter.format(shift.shiftDateTime!) == + DateFormatter.dateFormatter.format(holidayStartDate()); + + final onHolidayEndDate = + DateFormatter.dateFormatter.format(shift.shiftDateTime!) == + DateFormatter.dateFormatter.format(holidayEndDate()); + + return (dateNotNull && + (onHolidayStartDate || isWithinHolidayRange || onHolidayEndDate)); + }).toList(); + + holidayHours.value = shifts.fold( + 0, (previousValue, shift) => (shift.workHrs ?? 0) + previousValue); + + // holidayHours.value = + // holidayEndDate().difference(holidayStartDate()).inHours; + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + Future fetchRecords() async { + var response = await RotaService().getStaffWorkload().showLoader(); + if (response is StaffWorkloadResponse) { + final workLoads = response.data?.staffWorkLoads ?? []; + + if (workLoads.isNotEmpty) { + myWorkLoads.value = workLoads.first; + } + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + } + + Future requestHoliday() async { + if (agreeToRules.isFalse) { + FrequentFunctions.showToast( + message: "Please select agree to booking rules first"); + return false; + } + + var response = await RotaService() + .requestHoliday( + request: HolidayRequestData( + hldRqStartDate: holidayStartDate().toUtc().millisecondsSinceEpoch, + hldRqEndDate: holidayEndDate().toUtc().millisecondsSinceEpoch, + hldRqTotalDays: holidayDays(), + hldRqTotalHours: holidayHours(), + hldRqStatus: "pending", + hldRequestType: "holiday", + ), + ) + .showLoader(); + if (response is ResponseModel) { + return true; + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + return false; + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/rota/calendar_view_screen_controller.dart b/lib/controllers/rota/calendar_view_screen_controller.dart new file mode 100644 index 0000000..6093944 --- /dev/null +++ b/lib/controllers/rota/calendar_view_screen_controller.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_calendar_carousel/classes/event.dart'; +import 'package:flutter_calendar_carousel/classes/event_list.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../ftc_mobile_app.dart'; + +class CalendarViewScreenController extends GetxController { + GlobalKey scaffoldKey = GlobalKey(); + + RxBool isLoading = false.obs; + + // Rx> markedDatesMap = EventList(events: {},).obs; + Rx targetDateTime = DateTime(2024, 1, 1).obs; + RxString currentMonthName = + DateFormat.yMMM().format(DateTime(2024, 1, 1)).obs; + Rx> events = EventList( + events: {}, + ).obs; + // RxList markedDatesList = RxList(); + RxList datesToShowList = RxList(); + Rx selectedDate = MarkDatesModel.empty().obs; + + // RxList monthWiseRecord = RxList(); + RxList rotaShiftList = RxList(); + + @override + void onInit() { + fetchRecords(); + super.onInit(); + } + + void markDatesOnCalendar() { + // markedDatesList.removeAt(0); //for removing late initialization error + // for (var rotaShift in rotaShiftList) { + // markedDatesList.add( + // MarkDatesModel.addDate(date: rotaShift.shiftTime, title: "Possible")); + // datesToShowList.add(rotaShift); + // } + + // for (var markedDate in markedDatesList) { + // markedDatesMap.value.add( + // DateTime( + // markedDate.date.year, markedDate.date.month, markedDate.date.day), + // Event( + // date: DateTime( + // markedDate.date.year, markedDate.date.month, markedDate.date.day), + // // date: markedDate.date, + // title: markedDate.title, + // icon: markedDate.title == "Possible" + // ? _underlineIcon( + // markedDate.date.day.toString(), + // ) + // : _shiftIcon( + // markedDate.date.day.toString(), + // ), + // ), + // ); + // } + // datesToShowList = datesToShowList; // to ask from panday G + } + + Widget _shiftIcon(String day) => CircleAvatar( + backgroundColor: CustomAppColors.kSecondaryColor, + child: Text( + day, + style: + const TextStyle(color: CustomAppColors.kWhiteColor, fontSize: 13), + ), + ); + + Widget _underlineIcon(String day) => Container( + alignment: Alignment.center, + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide( + color: CustomAppColors.kSecondaryColor, + width: 3.0, + ), + ), + ), + ); + + void onNextMonthTap() { + targetDateTime.value = DateTime(targetDateTime.value.year, + targetDateTime.value.month + 1, targetDateTime.value.day); + currentMonthName.value = DateFormat.yMMM().format(targetDateTime.value); + } + + void onPreviousMonthTap() { + targetDateTime.value = DateTime(targetDateTime.value.year, + targetDateTime.value.month - 1, targetDateTime.value.day); + currentMonthName.value = DateFormat.yMMM().format(targetDateTime.value); + } + + void removeFocus() { + FocusScope.of(scaffoldKey.currentContext!).unfocus(); + } + + Future fetchRecords() async { + isLoading.value = true; + // markedDatesList.add(MarkDatesModel.addDate( + // date: DateTime(2022, 6, 1), + // title: "Possible")); //for removing late initialization error + for (var index = 1; index <= 12; index++) { + var result = await RotaService().serviceUserShifts( + serviceUserId: "65682ad0a01b6c9e6dcde088", month: index, year: 2024); + if (result is MonthWiseRecord) { + // monthWiseRecord.add(result); + rotaShiftList.addAll(FrequentFunctions().findDaysWithData(result)); + } else { + + } + } + + targetDateTime = rotaShiftList.first.shiftTime.obs; + currentMonthName = + DateFormat.yMMM().format(rotaShiftList.first.shiftTime).obs; + isLoading.value = false; + markDatesOnCalendar(); + } +} diff --git a/lib/controllers/rota/export_rota_controller.dart b/lib/controllers/rota/export_rota_controller.dart new file mode 100644 index 0000000..00de2d3 --- /dev/null +++ b/lib/controllers/rota/export_rota_controller.dart @@ -0,0 +1,5 @@ +export 'calendar_view_screen_controller.dart'; +export 'rota_dashboard_screen_controller.dart'; +export 'book_holiday_screen_controller.dart'; +export 'pick_up_shifts_screen_controller.dart'; +export 'your_rota_screen_controller.dart'; \ No newline at end of file diff --git a/lib/controllers/rota/pick_up_shifts_screen_controller.dart b/lib/controllers/rota/pick_up_shifts_screen_controller.dart new file mode 100644 index 0000000..a61ff1f --- /dev/null +++ b/lib/controllers/rota/pick_up_shifts_screen_controller.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/rota/LiveRoasterResponseData.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import '../../ftc_mobile_app.dart'; + +class PickUpShiftsScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final loadingShifts = false.obs; + final myShiftsList = RxList(); + + @override + void onReady() { + getAvailableShifts(); + super.onReady(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + Future getAvailableShifts() async { + loadingShifts.value = true; + + var response = await RotaService().getAvailableShifts(); + if (response is LiveRoasterResponseData) { + myShiftsList.value = response.daysArray ?? []; + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + + loadingShifts.value = false; + } + + Future claimShifts(int index, DaysArrayData data) async { + if (data.rosterId!.isNullOrEmpty() || + data.id.isNullOrEmpty() || + (data.locationId?.id).isNullOrEmpty()) return; + + var response = await RotaService() + .claimShift( + rosterId: data.rosterId!, + locationId: data.locationId!.id!, + dayId: data.id!) + .showLoader(); + if (response is LiveRoasterResponseData) { + myShiftsList[index].isRequested = true; + myShiftsList.refresh(); + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/rota/rota_dashboard_screen_controller.dart b/lib/controllers/rota/rota_dashboard_screen_controller.dart new file mode 100644 index 0000000..83511b0 --- /dev/null +++ b/lib/controllers/rota/rota_dashboard_screen_controller.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_calendar_carousel/classes/event.dart'; +import 'package:flutter_calendar_carousel/classes/event_list.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../ftc_mobile_app.dart'; +import '../../models/rota/LiveRoasterResponseData.dart'; + +class RotaDashboardScreenController extends GetxController + with GetSingleTickerProviderStateMixin { + late TabController tabController = TabController(length: 2, vsync: this); + final GlobalKey screenKey = GlobalKey(); + + final loadingShifts = false.obs; + final myShiftsList = RxList(); + + //it holds shifts list for the selected date + final dateFilteredShiftsList = RxList(); + + final targetDateTime = DateTime.now().obs; + final markedDatesMap = EventList(events: {}).obs; + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void onInit() { + getMyShifts(); + super.onInit(); + } + + Future getMyShifts() async { + loadingShifts.value = true; + + var response = await RotaService().getMyShifts( + startDateMills: DateTime.now().subtract(30.days).millisecondsSinceEpoch, + endDateMills: DateTime.now().add(30.days).millisecondsSinceEpoch); + if (response is LiveRoasterResponseData) { + myShiftsList.value = response.daysArray ?? []; + + createCalendarEvents(myShiftsList()); + + _filterShifts(targetDateTime()); + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + + loadingShifts.value = false; + } + + createCalendarEvents(List list) { + final Map> map = {}; + for (final data in list) { + // final date = DateTime.fromMillisecondsSinceEpoch(data.shiftDate!); + + if (data.shiftDateTime == null) return; + + map.addAll({ + DateTime(data.shiftDateTime!.year, data.shiftDateTime!.month, + data.shiftDateTime!.day): [ + Event( + date: DateTime(data.shiftDateTime!.year, data.shiftDateTime!.month, + data.shiftDateTime!.day), + title: data.serviceUserId?.displayName ?? "", + icon: CalendarWidget.underlineIcon(), + ) + ], + }); + } + + markedDatesMap.value.events + ..clear() + ..addAll(map); + + markedDatesMap.refresh(); + } + + onDateSelect(DateTime date, List events) { + targetDateTime.value = date; + + if (events.isNotEmpty) { + _filterShifts(date); + } + } + + _filterShifts(DateTime date) { + dateFilteredShiftsList.value = myShiftsList.where((e) { + return DateFormatter.dateFormatter + .format(DateTime.fromMillisecondsSinceEpoch(e.shiftDate!)) == + DateFormatter.dateFormatter.format(date); + }).toList(); + } + + @override + void dispose() { + tabController.dispose(); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/controllers/rota/your_rota_screen_controller.dart b/lib/controllers/rota/your_rota_screen_controller.dart new file mode 100644 index 0000000..a5609f8 --- /dev/null +++ b/lib/controllers/rota/your_rota_screen_controller.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/rota/LiveRoasterResponseData.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:get/get.dart'; + +import '../../ftc_mobile_app.dart'; + +class YourRotaScreenController extends GetxController{ + final GlobalKey screenKey = GlobalKey(); + + final loadingShifts = false.obs; + final myShiftsList = RxList(); + + @override + void onInit() { + getAvailableShifts(); + super.onInit(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + Future getAvailableShifts() async { + loadingShifts.value = true; + + var response = await RotaService().getMyShifts( + startDateMills: + DateTime.now().toUtc().subtract(30.days).millisecondsSinceEpoch, + endDateMills: + DateTime.now().toUtc().add(30.days).millisecondsSinceEpoch); + if (response is LiveRoasterResponseData) { + myShiftsList.value = response.daysArray ?? []; + } else if (response is String && response.isNotEmpty) { + FrequentFunctions.showToast(message: response); + } + + loadingShifts.value = false; + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/dialogs/app_dialogs.dart b/lib/dialogs/app_dialogs.dart new file mode 100644 index 0000000..e956d64 --- /dev/null +++ b/lib/dialogs/app_dialogs.dart @@ -0,0 +1,326 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/appointmentsListResponse/AppointmentsListResponse.dart'; +import 'package:ftc_mobile_app/models/clients/recent_incidents_model.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +import 'widgets/appointment_details.dart'; +import 'widgets/recent_incident_detail_dialog.dart'; + +class AppDialog { + static String areYouSureText = "Are you sure?"; + static bool alreadyShownUnauthorizedAlert = false; + + static Widget titleText(String title) { + return CustomTextWidget( + text: title, + textAlign: TextAlign.center, + fontSize: 20, + fontWeight: FontWeight.w700, + ); + } + + static Widget messageText(String message) { + return CustomTextWidget( + text: message, + textAlign: TextAlign.center, + fontSize: 12, + fontWeight: FontWeight.w400, + ); + } + + static Widget buttonsBar({ + String button1Text = "No", + String button2Text = "Yes", + VoidCallback? onButton1Tap, + required VoidCallback onButton2Tap, + }) { + return SizedBox( + width: double.maxFinite, + height: 40.h, + child: Row( + children: [ + Expanded( + child: CustomAppButton( + onTap: () { + if (onButton1Tap == null) { + Get.back(); + } else { + onButton1Tap(); + } + }, + buttonText: button1Text, + textColor: Colors.black, + borderColor: Colors.grey, + buttonColor: Colors.white, + ), + ), + 16.horizontalSpace, + Expanded( + child: CustomAppButton( + onTap: onButton2Tap, + buttonText: button2Text, + buttonColor: Get.theme.primaryColor, + ), + ), + ], + ), + ); + } + + static Future successDialog({ + required String title, + required String message, + required String buttonText, + required VoidCallback onDoneButtonClick, + bool canDismiss = true, + }) { + return Get.generalDialog( + barrierLabel: "", + barrierDismissible: canDismiss, + pageBuilder: (_, a1, a2) { + return AlertDialog( + shape: 15.toRoundedRectRadius(), + backgroundColor: Colors.white, + elevation: 0, + contentPadding: REdgeInsets.symmetric(horizontal: 24, vertical: 32), + content: WillPopScope( + onWillPop: () async => canDismiss, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // SvgPicture.asset( + // Assets.svgIcCheck, + // width: 50.r, + // height: 50.r, + // ), + // 16.verticalSpace, + titleText(title), + 12.verticalSpace, + messageText(message), + 24.verticalSpace, + CustomAppButton( + onTap: onDoneButtonClick, + buttonText: buttonText, + buttonColor: Get.theme.primaryColor, + ).addPaddingHorizontal(24), + ], + ), + ), + ); + }, + ); + } + + static Future showDialogWithSingleActionButton( + {required String title, + required String message, + required VoidCallback onDoneButtonClick}) { + return Get.generalDialog( + barrierLabel: "", + barrierDismissible: true, + pageBuilder: (_, a1, a2) { + return AlertDialog( + shape: 15.toRoundedRectRadius(), + contentPadding: REdgeInsets.symmetric(horizontal: 32, vertical: 32), + backgroundColor: Colors.white, + elevation: 0, + insetPadding: REdgeInsets.all(24), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + 12.verticalSpace, + titleText(title), + 16.verticalSpace, + messageText(message), + 32.verticalSpace, + CustomAppButton( + onTap: onDoneButtonClick, + buttonText: "Done", + buttonColor: Get.theme.primaryColor, + ).addPaddingHorizontal(24), + ], + ), + ); + }, + ); + } + + static Future showDialogDeleteAccount( + {required VoidCallback onDeleteButtonClick}) { + return Get.generalDialog( + barrierLabel: "", + barrierDismissible: true, + pageBuilder: (_, a1, a2) { + return Center( + child: Card( + shape: 15.toRoundedRectRadius(), + color: Colors.white, + margin: REdgeInsets.symmetric(horizontal: 24), + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 24.0, vertical: 32), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox(width: double.maxFinite, height: 12.h), + titleText("Delete Account?"), + SizedBox(width: double.maxFinite, height: 16.h), + messageText("Are you sure you want to delete your account?"), + SizedBox(width: double.maxFinite, height: 32.h), + buttonsBar(onButton2Tap: onDeleteButtonClick), + ], + ), + ), + ), + ); + }, + ); + } + + static Future showUnauthorizedAlert() async { + if (alreadyShownUnauthorizedAlert) { + return; + } + + alreadyShownUnauthorizedAlert = true; + await Get.dialog( + WillPopScope( + onWillPop: () async => false, + child: UnconstrainedBox( + child: SizedBox( + width: 1.0.sw, + child: AlertDialog( + shape: 15.toRoundedRectRadius(), + contentPadding: + REdgeInsets.symmetric(horizontal: 32, vertical: 32), + insetPadding: + REdgeInsets.symmetric(horizontal: 24, vertical: 24), + backgroundColor: Colors.white, + content: Column( + children: [ + Icon( + Icons.warning_amber_rounded, + color: Colors.red, + size: 65.r, + ), + 24.verticalSpace, + titleText( + "Session Expired", + ), + 12.verticalSpace, + messageText( + "Your session has been expired. Please log-in again to continue using the app.", + ), + 48.verticalSpace, + CustomAppButton( + onTap: () { + Get.back(); + alreadyShownUnauthorizedAlert = false; + // FrequentFunctions.logout(); + }, + buttonText: "Log In", + buttonColor: Get.theme.primaryColor, + ) + ], + ), + ), + ), + ), + ), + barrierDismissible: false) + .then((value) { + alreadyShownUnauthorizedAlert = false; + }); + } + + static Future alertAndLogout(VoidCallback onTapYes) { + return _showLogoutAlert(onTapYes); + } + + static Future _showLogoutAlert(Function() onTapYes) async { + // do not handle dialog dismiss, as it's already done + return openAlertDialog( + title: "Logout!", + message: "$areYouSureText Do you really want to logout from the app?", + onYesTap: onTapYes); + } + + static Future showAlertAppExit() async { + var isOk = false; + + await Get.generalDialog( + barrierLabel: "", + barrierDismissible: true, + pageBuilder: (_, a1, a2) { + return Center( + child: Card( + shape: 15.toRoundedRectRadius(), + color: Colors.white, + margin: REdgeInsets.symmetric(horizontal: 24), + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 24.0, vertical: 32), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox(width: double.maxFinite, height: 12.h), + titleText(areYouSureText), + SizedBox(width: double.maxFinite, height: 16.h), + titleText("Do you really want to exit from the app?"), + SizedBox(width: double.maxFinite, height: 32.h), + buttonsBar(onButton2Tap: () async { + isOk = true; + Get.back(); + }), + ], + ), + ), + ), + ); + }, + ); + + return isOk; + } + + static Future openAlertDialog( + {required String title, + required String message, + required VoidCallback onYesTap}) { + return Get.generalDialog( + barrierLabel: "", + barrierDismissible: true, + pageBuilder: (_, a1, a2) { + return Center( + child: Card( + shape: 15.toRoundedRectRadius(), + color: Colors.white, + margin: REdgeInsets.symmetric(horizontal: 24), + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 24.0, vertical: 32), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox(width: double.maxFinite, height: 12.h), + titleText(title), + 16.verticalSpace, + messageText(message), + SizedBox(width: double.maxFinite, height: 32.h), + buttonsBar(onButton2Tap: onYesTap), + ], + ), + ), + ), + ); + }); + } + + static showAppointmentDetailDialog( + {required AppointmentsListResponseData data}) { + Get.dialog(AppointmentDetailsDialog(data: data)); + } + + static showRecentIncidentDetailDialog({required RecentIncidentsModel data}) { + Get.dialog(RecentIncidentDetailDialog(data: data)); + } +} diff --git a/lib/dialogs/widgets/appointment_details.dart b/lib/dialogs/widgets/appointment_details.dart new file mode 100644 index 0000000..e315cb6 --- /dev/null +++ b/lib/dialogs/widgets/appointment_details.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/appointmentsListResponse/AppointmentsListResponse.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/common_cancel_button.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +class AppointmentDetailsDialog extends StatelessWidget { + final AppointmentsListResponseData data; + + const AppointmentDetailsDialog({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + final appointmentDate = DateFormat("dd/MM/yyyy") + .format(DateTime.fromMillisecondsSinceEpoch(data.appointmentDate!)); + + final appointmentTime = + "${data.appointmentStartTime ?? "NA"} to ${data.appointmentEndTime ?? "NA"}"; + + final d = (data.appointmentMin ?? 0).minutes; + final duration = + "${d.inHours} hours and ${d.inMinutes - (d.inHours.hours.inMinutes)} minutes"; + + return AlertDialog( + insetPadding: REdgeInsets.all(18), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2.r)), + backgroundColor: Colors.white, + surfaceTintColor: Colors.white, + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + data.appointmentTitle ?? "", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16.sp, + ), + textAlign: TextAlign.left, + ), + CustomTextWidget( + text: "$appointmentDate $appointmentTime", + fontSize: 13.sp, + textAlign: TextAlign.left, + ), + 16.verticalSpace, + CustomTextWidget( + text: "Appointment duration:", + fontSize: 14.sp, + fontColor: Colors.black, + fontWeight: FontWeight.w500, + textAlign: TextAlign.left, + ), + CustomTextWidget( + text: duration, + fontSize: 13.sp, + textAlign: TextAlign.left, + ), + 16.verticalSpace, + Text.rich( + TextSpan( + text: "Detail: ", + style: TextStyle( + fontSize: 14.sp, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + children: [ + TextSpan( + text: data.appointmentDetails ?? "", + style: TextStyle( + fontSize: 13.sp, + fontWeight: FontWeight.w400, + ), + ) + ]), + ), + 16.verticalSpace, + CustomTextWidget( + text: "Staff:", + fontSize: 14.sp, + fontColor: Colors.black, + fontWeight: FontWeight.w500, + textAlign: TextAlign.left, + ), + 8.verticalSpace, + Row( + children: [ + MyCircleImage( + imageSize: 32.r, + url: "${WebUrls.baseUrl}${data.staff?.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 32.r, + width: 32.r, + ), + ), + 8.horizontalSpace, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + data.staff?.name ?? "", + style: TextStyle( + fontSize: 13.sp, + fontWeight: FontWeight.w500 + ), + ), + Text( + "Contact No. ${data.staff?.phoneNumber ?? ""}", + style: TextStyle( + fontSize: 13.sp, + ), + ), + ], + ), + ], + ), + ], + ), + actions: const [CommonCloseTextButton()], + ); + } +} diff --git a/lib/dialogs/widgets/holiday_request_sent_dialog.dart b/lib/dialogs/widgets/holiday_request_sent_dialog.dart new file mode 100644 index 0000000..11ae3de --- /dev/null +++ b/lib/dialogs/widgets/holiday_request_sent_dialog.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/common_cancel_button.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/label_value_box_widget.dart'; + +class HolidayRequestSentDialog extends StatelessWidget { + const HolidayRequestSentDialog({ + super.key, + required this.holidayStartDate, + required this.holidayEndDate, + required this.holidayTotalTime, + }); + + final String holidayStartDate; + final String holidayEndDate; + final String holidayTotalTime; + + @override + Widget build(BuildContext context) { + return AlertDialog( + insetPadding: REdgeInsets.all(18), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2.r)), + backgroundColor: Colors.white, + surfaceTintColor: Colors.white, + title: Center( + child: CustomTextWidget( + text: 'Your Holiday Request has been sent', + fontWeight: FontWeight.bold, + isExpanded: false, + alignment: Alignment.center, + fontSize: 16.sp, + ), + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: LabelValueBoxWidget( + label: 'Start Date:', + value: holidayStartDate, + borderColor: + CustomAppColors.kLightGreyColor.withOpacity(0.3), + )), + 5.horizontalSpace, + Expanded( + flex: 1, + child: LabelValueBoxWidget( + label: 'End Date', + value: holidayEndDate, + borderColor: + CustomAppColors.kLightGreyColor.withOpacity(0.3), + )), + ], + ), + 10.verticalSpace, + SizedBox( + width: MediaQuery.of(context).size.width, + child: LabelValueBoxWidget( + label: 'Your remaining Holidays', + value: holidayTotalTime, + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + )), + 10.verticalSpace, + const CustomTextWidget( + text: "Kindly wait as we review your holiday request.") + ], + ), + actions: const [CommonCloseTextButton()], + ); + } +} diff --git a/lib/dialogs/widgets/holidays_data_dialog.dart b/lib/dialogs/widgets/holidays_data_dialog.dart new file mode 100644 index 0000000..a7e0a8f --- /dev/null +++ b/lib/dialogs/widgets/holidays_data_dialog.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/common_cancel_button.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/label_value_box_widget.dart'; + +class HolidaysDataDialog extends StatelessWidget { + const HolidaysDataDialog({ + super.key, + required this.holidayModel, + }); + + final HolidayModel holidayModel; + + @override + Widget build(BuildContext context) { + return AlertDialog( + insetPadding: REdgeInsets.all(18), + surfaceTintColor: CustomAppColors.kPrimaryColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), + backgroundColor: CustomAppColors.kWhiteColor, + title: Center( + child: CustomTextWidget( + text: 'Your Holidays', + fontWeight: FontWeight.w700, + isExpanded: false, + alignment: Alignment.center, + fontSize: 16.sp, + ), + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LabelValueBoxWidget( + label: 'Carried Over:', + value: holidayModel.carriedOver, + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + LabelValueBoxWidget( + label: 'Holiday Entitlement', + value: holidayModel.holidayEntitlement, + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + LabelValueBoxWidget( + label: 'Holiday Allowance', + value: holidayModel.holidayAllowance, + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + LabelValueBoxWidget( + label: 'Your remaining Holidays', + value: holidayModel.remainingHolidays, + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + LabelValueBoxWidget( + label: 'Time left before Year End:', + value: holidayModel.timeLeftBeforeYearEnd, + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + const CommonCloseTextButton() + ], + ), + ); + } +} diff --git a/lib/dialogs/widgets/recent_incident_detail_dialog.dart b/lib/dialogs/widgets/recent_incident_detail_dialog.dart new file mode 100644 index 0000000..a1748b3 --- /dev/null +++ b/lib/dialogs/widgets/recent_incident_detail_dialog.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/recent_incidents_model.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/common_cancel_button.dart'; +import 'package:quill_html_editor/quill_html_editor.dart'; + +class RecentIncidentDetailDialog extends StatelessWidget { + final RecentIncidentsModel data; + + const RecentIncidentDetailDialog({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + insetPadding: REdgeInsets.all(18), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2.r)), + backgroundColor: Colors.white, + surfaceTintColor: Colors.white, + contentPadding: EdgeInsets.zero, + content: SizedBox( + width: double.maxFinite, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 20.verticalSpace, + Text("Incident Date - Time", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.sp, + color: Colors.black, + )).addPaddingHorizontal(16), + Text( + DateFormatter.ddMMyyyyhhmmFormat( + DateTime.parse(data.createdAt).toLocal()), + style: TextStyle( + fontWeight: FontWeight.w400, + fontSize: 12.sp, + color: CustomAppColors.kBlackColor, + )).addPaddingHorizontal(16), + 8.verticalSpace, + Divider( + color: CustomAppColors.kLightGreyColor, + ), + 8.verticalSpace, + CustomTextWidget( + text: data.incidentTitle.isNotEmpty + ? data.incidentTitle + : "Untitled Incident", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + ).addPaddingHorizontal(16), + 4.verticalSpace, + Expanded( + child: QuillHtmlEditor( + text: data.note, + hintText: 'Hint text goes here', + controller: data.quillController, + isEnabled: false, + ensureVisible: false, + minHeight: 50.h, + autoFocus: false, + textStyle: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + // hintTextStyle: _hintTextStyle, + hintTextAlign: TextAlign.start, + loadingBuilder: (context) { + return const Center( + child: CircularProgressIndicator( + strokeWidth: 1, + color: Colors.red, + )); + }, + ).addPaddingHorizontal(16), + ), + const CommonCloseTextButton().addPaddingAll(16), + 8.verticalSpace, + ], + ), + )); + } +} diff --git a/lib/dialogs/widgets/shift_dialog.dart b/lib/dialogs/widgets/shift_dialog.dart new file mode 100644 index 0000000..81fc99a --- /dev/null +++ b/lib/dialogs/widgets/shift_dialog.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/common_cancel_button.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/label_value_box_widget.dart'; + +class ShowRotaAlertDialog extends StatelessWidget { + final DaysArrayData data; + final Function? onClaimShiftTap; + final Function? onCancelShiftTap; + + const ShowRotaAlertDialog( + {super.key, + required this.data, + this.onClaimShiftTap, + this.onCancelShiftTap}); + + @override + Widget build(BuildContext context) { + final isAvailableShift = (data.staffUserId == null); + return AlertDialog( + insetPadding: REdgeInsets.all(18), + contentPadding: REdgeInsets.all(15), + surfaceTintColor: CustomAppColors.kPrimaryColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2.r)), + backgroundColor: CustomAppColors.kPrimaryColor, + title: Center( + child: CustomTextWidget( + text: isAvailableShift + ? 'Available Shift' + : data.staffUserId?.staffMemberName ?? "", + fontWeight: FontWeight.bold, + isExpanded: false, + alignment: Alignment.center, + fontSize: 16.sp, + ), + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LabelValueBoxWidget( + label: 'Service User (Patient):', + value: data.serviceUserId?.displayName ?? 'Unassigned', + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + // LabelValueBoxWidget( + // label: 'Worker Type:', + // value: data.workerType, + // borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + // ), + // 10.verticalSpace, + LabelValueBoxWidget( + label: 'Location:', + value: data.locationId?.shiftLocationName ?? '', + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + // 10.verticalSpace, + // LabelValueBoxWidget( + // label: 'Staff Required:', + // value: data.staffRequired, + // borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + // ), + 10.verticalSpace, + LabelValueBoxWidget( + label: 'Start Time:', + value: DateFormatter() + .roasterShiftFormattedTime(time: data.shiftStartTime ?? ""), + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + LabelValueBoxWidget( + label: 'End Time:', + value: DateFormatter() + .roasterShiftFormattedTime(time: data.shiftEndTime ?? ""), + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + // LabelValueBoxWidget( + // label: 'Break Time:', + // value: data.breakTime, + // borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + // ), + // 10.verticalSpace, + LabelValueBoxWidget( + label: 'Notes:', + value: data.note ?? "NA", + borderColor: CustomAppColors.kLightGreyColor.withOpacity(0.3), + ), + 10.verticalSpace, + ConstrainedBox( + constraints: BoxConstraints(minHeight: 30.h, maxHeight: 30.h), + child: Row( + children: [ + data.isRequested == true + ? FrequentFunctions.noWidget + : Expanded( + child: CustomAppButton( + onTap: () { + Navigator.of(context).pop(); + + if (isAvailableShift) { + if (onClaimShiftTap != null) { + onClaimShiftTap!.call(); + } + } else { + if (onCancelShiftTap != null) { + onCancelShiftTap!.call(); + } + } + }, + buttonText: + isAvailableShift ? "Claim Shift" : "Cancel Shift", + textColor: Colors.white, + borderColor: Colors.transparent, + ), + ), + 10.horizontalSpace, + const Expanded(child: CommonCloseTextButton()), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..fa22502 --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,68 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyDF2vZbiWQROGvyvLeeCmAjPLnPLYjE6Os', + appId: '1:583559514958:android:89af243ca4a3888a32ec1f', + messagingSenderId: '583559514958', + projectId: 'ftc-services-ea8d6', + storageBucket: 'ftc-services-ea8d6.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyAkJyvTX8oQSY9Ju3L39oupZbdy4Eo-RbA', + appId: '1:583559514958:ios:5ec9cd88ca24777932ec1f', + messagingSenderId: '583559514958', + projectId: 'ftc-services-ea8d6', + storageBucket: 'ftc-services-ea8d6.appspot.com', + iosBundleId: 'com.ftc.app.ftcMobileApp', + ); +} diff --git a/lib/ftc_mobile_app.dart b/lib/ftc_mobile_app.dart new file mode 100644 index 0000000..f0fd293 --- /dev/null +++ b/lib/ftc_mobile_app.dart @@ -0,0 +1,6 @@ +export 'models/export_models.dart'; +export 'view/export_view.dart'; +export 'controllers/export_controllers.dart'; +export 'utilities/export_utilities.dart'; +export 'web_services/export_web_services.dart'; +export 'package:flutter_screenutil/flutter_screenutil.dart'; \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..1a17414 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; +import 'package:get_time_ago/get_time_ago.dart'; + +import 'utilities/app_session_manager.dart'; +import 'utilities/custom_timeago_messages.dart'; +import 'utilities/fcm_notifications.dart'; +import 'utilities/notification_util.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await CustomUIOverLay.initialize(); + GetTimeAgo.setCustomLocaleMessages('en', CustomTimeAgoMessages()); + + //Notification initialize + NotificationUtils.init(); + try { + await FcmNotification.getInstance().init(); + } catch (e) { + debugPrint("FcmNotification init error: $e"); + } + + await LocalStorageManager.init(); + Get.lazyPut(() => AppSessionManager(), fenix: true); + + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return ScreenUtilInit( + designSize: Size( + MediaQuery.sizeOf(context).width, + MediaQuery.sizeOf(context).height, + ), + builder: (_, child) { + return GetMaterialApp( + title: ConstantText.kAppName, + debugShowCheckedModeBanner: false, + builder: (context, child) { + return MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaler: const TextScaler.linear(1.0), + ), + child: child!, + ); + }, + theme: CustomTheme.defaultTheme(), + navigatorKey: CustomRouteGenerator.navigatorKey, + initialRoute: CustomRouteNames.kInitialRoute, + onGenerateRoute: CustomRouteGenerator.generateRoute, + ); + }, + ); + } +} diff --git a/lib/models/appointmentsListResponse/AppointmentsListResponse.dart b/lib/models/appointmentsListResponse/AppointmentsListResponse.dart new file mode 100644 index 0000000..45d523b --- /dev/null +++ b/lib/models/appointmentsListResponse/AppointmentsListResponse.dart @@ -0,0 +1,103 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; + +class AppointmentsListResponse { + AppointmentsListResponse({ + this.success, + this.status, + this.message, + this.data,}); + + AppointmentsListResponse.fromJson(dynamic json) { + status = json['status']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data?.add(AppointmentsListResponseData.fromJson(v)); + }); + } + } + + bool? success; + String? status; + String? message; + List? data; + + Map toJson() { + final map = {}; + map['status'] = status; + map['message'] = message; + if (data != null) { + map['data'] = data?.map((v) => v.toJson()).toList(); + } + return map; + } + +} + +class AppointmentsListResponseData { + AppointmentsListResponseData({ + this.id, + this.user, + this.appointmentDate, + this.appointmentStartTime, + this.appointmentEndTime, + this.appointmentMin, + this.staff, + this.addedby, + this.appointmentDetails, + this.status, + this.createdAt, + this.updatedAt, + this.appointmentTitle,}); + + AppointmentsListResponseData.fromJson(dynamic json) { + id = json['_id']; + user = json['user']; + appointmentDate = json['appointmentDate']; + appointmentStartTime = json['appointmentStartTime']; + appointmentEndTime = json['appointmentEndTime']; + appointmentMin = json['appointmentMin']; + staff = json['staff'] != null ? UserData.fromJson(json['staff']) : null; + addedby = json['addedby']; + appointmentDetails = json['appointmentDetails']; + status = json['status']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + appointmentTitle = json['appointmentTitle']; + } + String? id; + String? user; + int? appointmentDate; + String? appointmentStartTime; + String? appointmentEndTime; + int? appointmentMin; + UserData? staff; + String? addedby; + String? appointmentDetails; + String? status; + String? createdAt; + String? updatedAt; + String? appointmentTitle; + + Map toJson() { + final map = {}; + map['_id'] = id; + map['user'] = user; + map['appointmentDate'] = appointmentDate; + map['appointmentStartTime'] = appointmentStartTime; + map['appointmentEndTime'] = appointmentEndTime; + map['appointmentMin'] = appointmentMin; + if (staff != null) { + map['staff'] = staff?.toJson(); + } + map['addedby'] = addedby; + map['appointmentDetails'] = appointmentDetails; + map['status'] = status; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + map['appointmentTitle'] = appointmentTitle; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/chat/ChatModel.dart b/lib/models/chat/ChatModel.dart new file mode 100644 index 0000000..dff501a --- /dev/null +++ b/lib/models/chat/ChatModel.dart @@ -0,0 +1,80 @@ +import '../profileData/user_data.dart'; + +class ChatModel { + static const stateNone = 0; + static const stateError = -1; + static const stateLoading = 1; + static const stateSuccess = 2; + + static const String fileTypeLocalPath = "localPath"; + + ChatModel({ + this.id, + this.from, + this.to, + this.message, + this.messageType, + this.filePath, + this.date, + this.archived, + this.createdAt, + this.updatedAt, + this.localId, + this.fileType, + this.state = stateNone, + }); + + ChatModel.fromJson(dynamic json) { + from = json['from'] != null ? UserData.fromJson(json['from']) : null; + to = json['to'] != null ? UserData.fromJson(json['to']) : null; + id = json['_id']; + message = json['message']; + messageType = json['messageType']; + filePath = json['filePath']; + date = json['date']; + localId = json['localId']; + archived = json['archived']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + + date = DateTime.tryParse(createdAt ?? "")?.millisecondsSinceEpoch ?? 0; + } + + String? id; + UserData? from; + UserData? to; + String? message; + String? messageType; + String? filePath; + int? date; + bool? archived; + String? createdAt; + String? updatedAt; + + //Local usage variables + int state = stateNone; + String? fileType; + String? localId; + + Map toJson() { + final map = {}; + if (from != null) { + map['from'] = from?.toJson(); + } + if (to != null) { + map['to'] = to?.toJson(); + } + map['_id'] = id; + map['message'] = message; + map['messageType'] = messageType; + map['filePath'] = filePath; + map['date'] = date; + map['archived'] = archived; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + map['localId'] = localId; + map['state'] = state; + map['isSent'] = state; + return map; + } +} diff --git a/lib/models/chat/add_group_message_model.dart b/lib/models/chat/add_group_message_model.dart new file mode 100644 index 0000000..1aa339a --- /dev/null +++ b/lib/models/chat/add_group_message_model.dart @@ -0,0 +1,61 @@ +class AddDeleteUpdateGroupMessageModel { + AddDeleteUpdateGroupMessageModel({ + required this.groupId, + required this.userId, + required this.message, + required this.isDeleted, + required this.isHide, + required this.isPin, + required this.id, + required this.seenBy, + required this.createdAt, + required this.updatedAt, + required this.v, + }); + String groupId = ""; + String userId = ""; + String message = ""; + bool isDeleted = false; + bool isHide = false; + bool isPin = false; + String id = ""; + List seenBy = []; + String createdAt = ""; + String updatedAt = ""; + int v = -1; + + AddDeleteUpdateGroupMessageModel.fromJson(Map json){ + groupId = json['groupId']??""; + userId = json['userId']??""; + message = json['message']??""; + isDeleted = json['isDeleted']?? false; + isHide = json['isHide']?? false; + isPin = json['isPin']?? false; + id = json['_id']??""; + seenBy = List.castFrom(json['seenBy']??[]); + createdAt = json['createdAt']??""; + updatedAt = json['updatedAt']??""; + v = json['__v']??-1; + } + + Map toJson() { + final data = {}; + data['groupId'] = groupId; + data['userId'] = userId; + data['message'] = message; + data['isDeleted'] = isDeleted; + data['isHide'] = isHide; + data['isPin'] = isPin; + data['_id'] = id; + data['seenBy'] = seenBy; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = v; + return data; + } + + @override + String toString() { + return 'AddDeleteUpdateGroupMessageModel{groupId: $groupId, userId: $userId, message: $message, isDeleted: $isDeleted, isHide: $isHide, isPin: $isPin, id: $id, seenBy: $seenBy, createdAt: $createdAt, updatedAt: $updatedAt, v: $v}'; + } +} \ No newline at end of file diff --git a/lib/models/chat/all_group_messages_model.dart b/lib/models/chat/all_group_messages_model.dart new file mode 100644 index 0000000..3d7fcf8 --- /dev/null +++ b/lib/models/chat/all_group_messages_model.dart @@ -0,0 +1,353 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; + +import '../profileData/FcmTokens.dart'; +import '../profileData/LocationData.dart'; + +class AllGroupMessages { + AllGroupMessages({ + required this.id, + required this.groupId, + required this.userId, + required this.message, + required this.messageType, + required this.filePath, + required this.isDeleted, + required this.isHide, + required this.isPin, + required this.seenBy, + required this.createdAt, + required this.updatedAt, + required this.v, + }); + + String id = ""; + GroupId groupId = GroupId.empty(); + UserData? userId; + String message = ""; + String messageType = ""; + String filePath = ""; + bool isDeleted = false; + bool isHide = false; + bool isPin = false; + List seenBy = []; + String createdAt = ""; + String updatedAt = ""; + int v = -1; + + AllGroupMessages.empty(); + + AllGroupMessages.fromJson(Map json) { + id = json['_id'] ?? ""; + groupId = GroupId.fromJson(json['groupId'] ?? GroupId.empty()); + userId = UserData.fromJson(json['userId'] ?? {}); + message = json['message'] ?? ""; + messageType = json['messageType'] ?? ""; + filePath = json['filePath'] ?? ""; + isDeleted = json['isDeleted'] ?? false; + isHide = json['isHide'] ?? false; + isPin = json['isPin'] ?? false; + seenBy = List.castFrom(json['seenBy'] ?? []); + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + } + + Map toJson() { + final data = {}; + data['_id'] = id; + data['groupId'] = groupId.toJson(); + data['userId'] = userId?.toJson(); + data['message'] = message; + data['messageType'] = messageType; + data['filePath'] = filePath; + data['isDeleted'] = isDeleted; + data['isHide'] = isHide; + data['isPin'] = isPin; + data['seenBy'] = seenBy; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + return data; + } + + @override + String toString() { + return 'AllGroupMessages{id: $id, groupId: $groupId, userId: $userId, message: $message, isDeleted: $isDeleted, isHide: $isHide, isPin: $isPin, seenBy: $seenBy, createdAt: $createdAt, updatedAt: $updatedAt, v: $v}'; + } +} + +class GroupId { + GroupId({ + required this.lastMessages, + required this.groupWorkingScheduleTime, + required this.id, + required this.groupName, + required this.groupImage, + required this.groupMembers, + required this.isGroup, + required this.date, + required this.isActive, + required this.createdAt, + required this.updatedAt, + required this.v, + }); + + LastMessages lastMessages = LastMessages.empty(); + GroupWorkingScheduleTime groupWorkingScheduleTime = + GroupWorkingScheduleTime.empty(); + String id = ""; + String groupName = ""; + String groupImage = ""; + List groupMembers = []; + bool isGroup = false; + String date = ""; + bool isActive = false; + String createdAt = ""; + String updatedAt = ""; + int v = -1; + + GroupId.empty(); + + GroupId.id({required this.id}); + + GroupId.fromJson(Map json) { + lastMessages = + LastMessages.fromJson(json['lastMessages'] ?? LastMessages.empty()); + groupWorkingScheduleTime = GroupWorkingScheduleTime.fromJson( + json['groupWorkingScheduleTime'] ?? GroupWorkingScheduleTime.empty()); + id = json['_id'] ?? ""; + groupName = json['groupName'] ?? ""; + groupImage = json['groupImage'] ?? ""; + groupMembers = List.castFrom(json['groupMembers'] ?? []); + isGroup = json['isGroup'] ?? false; + date = json['date'] ?? ""; + isActive = json['isActive'] ?? false; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + v = json['__v'] ?? -1; + } + + Map toJson() { + final data = {}; + data['lastMessages'] = lastMessages.toJson(); + data['groupWorkingScheduleTime'] = groupWorkingScheduleTime.toJson(); + data['_id'] = id; + data['groupName'] = groupName; + data['groupImage'] = groupImage; + data['groupMembers'] = groupMembers; + data['isGroup'] = isGroup; + data['date'] = date; + data['isActive'] = isActive; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = v; + return data; + } + + @override + String toString() { + return 'GroupId{lastMessages: $lastMessages, groupWorkingScheduleTime: $groupWorkingScheduleTime, id: $id, groupName: $groupName, groupImage: $groupImage, groupMembers: $groupMembers, isGroup: $isGroup, date: $date, isActive: $isActive, createdAt: $createdAt, updatedAt: $updatedAt, v: $v}'; + } +} + +class LastMessages { + LastMessages({ + required this.message, + required this.messageSentBy, + required this.messageTime, + }); + + String message = ""; + String messageSentBy = ""; + int messageTime = -1; + + LastMessages.empty(); + + LastMessages.fromJson(Map json) { + message = json['message'] ?? ""; + messageSentBy = json['messageSentBy'] ?? ""; + messageTime = json['messageTime'] ?? -1; + } + + Map toJson() { + final data = {}; + data['message'] = message; + data['messageSentBy'] = messageSentBy; + data['messageTime'] = messageTime; + return data; + } + + @override + String toString() { + return 'LastMessages{message: $message, messageSentBy: $messageSentBy, messageTime: $messageTime}'; + } +} + +class GroupWorkingScheduleTime { + GroupWorkingScheduleTime({ + required this.startTime, + required this.endTime, + required this.totalWorkHours, + }); + + int startTime = -1; + int endTime = -1; + String totalWorkHours = ""; + + GroupWorkingScheduleTime.empty(); + + GroupWorkingScheduleTime.fromJson(Map json) { + startTime = json['startTime'] ?? -1; + endTime = json['endTime'] ?? -1; + totalWorkHours = json['totalWorkHours'] ?? ""; + } + + Map toJson() { + final data = {}; + data['startTime'] = startTime; + data['endTime'] = endTime; + data['totalWorkHours'] = totalWorkHours; + return data; + } + + @override + String toString() { + return 'GroupWorkingScheduleTime{startTime: $startTime, endTime: $endTime, totalWorkHours: $totalWorkHours}'; + } +} + +class UserId { + UserId({ + required this.fcmTokens, + required this.location, + required this.id, + required this.userModelName, + required this.name, + required this.version, + required this.email, + required this.phoneNumber, + required this.active, + required this.role, + required this.profilePictureUrl, + required this.deviceId, + required this.verificationCode, + required this.isVerified, + required this.approved, + required this.blocked, + required this.createdAt, + required this.updatedAt, + required this.v, + required this.password, + required this.userSettings, + required this.modelId, + }); + + FcmTokens fcmTokens = FcmTokens.empty(); + LocationData location = LocationData.empty(); + String id = ""; + String userModelName = ""; + String name = ""; + String version = ""; + String email = ""; + String phoneNumber = ""; + bool active = false; + String role = ""; + String profilePictureUrl = ""; + String deviceId = ""; + String verificationCode = ""; + bool isVerified = false; + bool approved = false; + bool blocked = false; + String createdAt = ""; + String updatedAt = ""; + int v = -1; + String password = ""; + String userSettings = ""; + String modelId = ""; + + UserId.empty(); + + UserId.id({required this.id}); + + UserId.fromJson(Map json) { + fcmTokens = FcmTokens.fromJson(json['fcm_tokens'] ?? FcmTokens.empty()); + location = LocationData.fromJson(json['location'] ?? LocationData.empty()); + id = json['_id'] ?? ""; + userModelName = json['userModelName'] ?? ""; + name = json['name'] ?? ""; + version = json['version'] ?? ""; + email = json['email'] ?? ""; + phoneNumber = json['phoneNumber'] ?? ""; + active = json['active'] ?? false; + role = json['role'] ?? ""; + profilePictureUrl = json['profile_picture_url'] ?? ""; + deviceId = json['deviceId'] ?? ""; + verificationCode = json['verification_code'] ?? ""; + isVerified = json['is_verified'] ?? false; + approved = json['approved'] ?? false; + blocked = json['blocked'] ?? false; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + v = json['__v'] ?? -1; + password = json['password'] ?? ""; + userSettings = json['userSettings'] ?? ""; + modelId = json['modelId'] ?? ""; + } + + Map toJson() { + final data = {}; + data['fcm_tokens'] = fcmTokens.toJson(); + data['location'] = location.toJson(); + data['_id'] = id; + data['userModelName'] = userModelName; + data['name'] = name; + data['version'] = version; + data['email'] = email; + data['phoneNumber'] = phoneNumber; + data['active'] = active; + data['role'] = role; + data['profile_picture_url'] = profilePictureUrl; + data['deviceId'] = deviceId; + data['verification_code'] = verificationCode; + data['is_verified'] = isVerified; + data['approved'] = approved; + data['blocked'] = blocked; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = v; + data['password'] = password; + data['userSettings'] = userSettings; + data['modelId'] = modelId; + return data; + } + + @override + String toString() { + return 'UserId{fcmTokens: $fcmTokens, location: $location, id: $id, userModelName: $userModelName, name: $name, version: $version, email: $email, phoneNumber: $phoneNumber, active: $active, role: $role, profilePictureUrl: $profilePictureUrl, deviceId: $deviceId, verificationCode: $verificationCode, isVerified: $isVerified, approved: $approved, blocked: $blocked, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, password: $password, userSettings: $userSettings, modelId: $modelId}'; + } +} + +// class Location { +// Location({ +// required this.type, +// required this.coordinates, +// }); +// String type = ""; +// List coordinates = []; +// +// Location.empty(); +// Location.fromJson(Map json){ +// type = json['type']??""; +// coordinates = List.castFrom(json['coordinates']??[]); +// } +// +// Map toJson() { +// final data = {}; +// data['type'] = type; +// data['coordinates'] = coordinates; +// return data; +// } +// +// @override +// String toString() { +// return 'Location{type: $type, coordinates: $coordinates}'; +// } +// } diff --git a/lib/models/chat/all_single_chat_message_model.dart b/lib/models/chat/all_single_chat_message_model.dart new file mode 100644 index 0000000..f3205a4 --- /dev/null +++ b/lib/models/chat/all_single_chat_message_model.dart @@ -0,0 +1,45 @@ +class AllSingleChatMessages { + AllSingleChatMessages({ + required this.seen, + required this.recieverId, + required this.name, + required this.message, + required this.date, + required this.image, + required this.senderId, + }); + bool seen = false; + String recieverId =""; + String name =""; + String message =""; + String date =""; + String image =""; + String senderId =""; + + AllSingleChatMessages.fromJson(Map json){ + seen = json['seen'] ?? false; + recieverId = json['recieverId'] ?? ""; + name = json['name'] ?? ""; + message = json['message'] ?? ""; + date = json['date'] ?? ""; + image = json['image'] ?? ""; + senderId = json['senderId'] ?? ""; + } + + Map toJson() { + final data = {}; + data['seen'] = seen; + data['recieverId'] = recieverId; + data['name'] = name; + data['message'] = message; + data['date'] = date; + data['image'] = image; + data['senderId'] = senderId; + return data; + } + + @override + String toString() { + return 'AllSingleChatMessages{seen: $seen, recieverId: $recieverId, name: $name, message: $message, date: $date, image: $image, senderId: $senderId}'; + } +} \ No newline at end of file diff --git a/lib/models/chat/all_single_user_chat_server_side.dart b/lib/models/chat/all_single_user_chat_server_side.dart new file mode 100644 index 0000000..1cf3d6b --- /dev/null +++ b/lib/models/chat/all_single_user_chat_server_side.dart @@ -0,0 +1,57 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; + +class AllSingleUsersChats { + AllSingleUsersChats({ + required this.from, + required this.to, + required this.message, + required this.seen, + required this.isDeleted, + required this.isHide, + required this.createdAt, + required this.updatedAt, + required this.seenAt, + required this.id, + }); + + UserData? from; + UserData? to; + String message = ""; + bool seen = false; + bool isDeleted = false; + bool isHide = false; + String createdAt = ""; + String updatedAt = ""; + String seenAt = ""; + String id = ""; + + AllSingleUsersChats.empty(); + + AllSingleUsersChats.fromJson(Map json) { + from = UserData.fromJson(json['from'] ?? {}); + to = UserData.fromJson(json['to'] ?? {}); + message = json['message'] ?? ""; + seen = json['seen'] ?? false; + isDeleted = json['isDeleted'] ?? false; + isHide = json['isHide'] ?? false; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + seenAt = json['seenAt'] ?? ""; + id = json['_id'] ?? ""; + } + + Map toJson() { + final data = {}; + data['from'] = from?.toJson(); + data['to'] = to?.toJson(); + data['message'] = message; + data['seen'] = seen; + data['isDeleted'] = isDeleted; + data['isHide'] = isHide; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['seenAt'] = seenAt; + data['_id'] = id; + return data; + } +} diff --git a/lib/models/chat/combined_last_messages_model_class.dart b/lib/models/chat/combined_last_messages_model_class.dart new file mode 100644 index 0000000..c085bd0 --- /dev/null +++ b/lib/models/chat/combined_last_messages_model_class.dart @@ -0,0 +1,214 @@ +class CombinedMessageModel { + CombinedMessageModel({ + required this.personalMessage, + required this.sortedArrayGroup, + }); + List personalMessage = []; + List sortedArrayGroup = []; + + CombinedMessageModel.empty(); + CombinedMessageModel.fromJson(Map json){ + personalMessage = List.from(json['personalMessage']).map((e)=>PersonalMessage.fromJson(e)).toList(); + sortedArrayGroup = List.from(json['sortedArrayGroup']).map((e)=>SortedArrayGroup.fromJson(e)).toList(); + } + + Map toJson() { + final data = {}; + data['personalMessage'] = personalMessage.map((e)=>e.toJson()).toList(); + data['sortedArrayGroup'] = sortedArrayGroup.map((e)=>e.toJson()).toList(); + return data; + } + + @override + String toString() { + return 'CombinedMessageModel{personalMessage: $personalMessage, sortedArrayGroup: $sortedArrayGroup}'; + } +} + +class PersonalMessage { + PersonalMessage({ + required this.isGroup, + required this.seen, + required this.recieverId, + required this.name, + required this.message, + required this.messageType, + required this.date, + required this.image, + required this.senderId, + }); + bool isGroup = false; + bool seen = false; + String recieverId = ""; + String name = ""; + String message = ""; + String messageType = ""; + String date = ""; //eg. "2024-06-21T09:38:16.352Z" + String image = ""; + String senderId = ""; + + PersonalMessage.empty(); + PersonalMessage.fromJson(Map json){ + isGroup = json['isGroup']??false; + seen = json['seen']??false; + recieverId = json['recieverId']??""; + name = json['name']??""; + message = json['message']??""; + messageType = json['messageType']??""; + date = json['date']??""; + image = json['image']??""; + senderId = json['senderId']??""; + } + + Map toJson() { + final data = {}; + data['isGroup'] = isGroup; + data['seen'] = seen; + data['recieverId'] = recieverId; + data['name'] = name; + data['message'] = message; + data['messageType'] = messageType; + data['date'] = date; + data['image'] = image; + data['senderId'] = senderId; + return data; + } + + @override + String toString() { + return 'PersonalMessage{isGroup: $isGroup, seen: $seen, recieverId: $recieverId, name: $name, message: $message, date: $date, image: $image, senderId: $senderId}'; + } +} + +class SortedArrayGroup { + SortedArrayGroup({ + required this.lastMessages, + required this.groupWorkingScheduleTime, + required this.id, + required this.groupName, + required this.groupImage, + required this.groupMembers, + required this.isGroup, + required this.date, + required this.isActive, + required this.createdAt, + required this.updatedAt, + required this.v, + }); + LastMessages lastMessages = LastMessages.empty(); + GroupWorkingScheduleTime groupWorkingScheduleTime = GroupWorkingScheduleTime.empty(); + String id = ""; + String groupName = ""; + String groupImage = ""; + List groupMembers = []; + bool isGroup = false; + String date = ""; + bool isActive = false; + String createdAt = ""; + String updatedAt = ""; + int v = -1; + + SortedArrayGroup.empty(); + SortedArrayGroup.fromJson(Map json){ + lastMessages = LastMessages.fromJson(json['lastMessages'] ?? LastMessages.empty()); + groupWorkingScheduleTime = GroupWorkingScheduleTime.fromJson(json['groupWorkingScheduleTime'] ?? GroupWorkingScheduleTime.empty()); + id = json['_id'] ?? ""; + groupName = json['groupName'] ?? ""; + groupImage = json['groupImage'] ?? ""; + groupMembers = List.castFrom(json['groupMembers'] ?? []); + isGroup = json['isGroup'] ?? false; + date = json['date'] ?? ""; + isActive = json['isActive'] ?? false; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + v = json['__v'] ?? -1; + } + + Map toJson() { + final data = {}; + data['lastMessages'] = lastMessages.toJson(); + data['groupWorkingScheduleTime'] = groupWorkingScheduleTime.toJson(); + data['_id'] = id; + data['groupName'] = groupName; + data['groupImage'] = groupImage; + data['groupMembers'] = groupMembers; + data['isGroup'] = isGroup; + data['date'] = date; + data['isActive'] = isActive; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = v; + return data; + } + + @override + String toString() { + return 'SortedArrayGroup{lastMessages: $lastMessages, groupWorkingScheduleTime: $groupWorkingScheduleTime, id: $id, groupName: $groupName, groupImage: $groupImage, groupMembers: $groupMembers, isGroup: $isGroup, date: $date, isActive: $isActive, createdAt: $createdAt, updatedAt: $updatedAt, v: $v}'; + } +} + +class LastMessages { + LastMessages({ + required this.message, + required this.messageType, + required this.messageSentBy, + required this.messageTime, + }); + String message = ""; + String messageType = ""; + String messageSentBy = ""; + int messageTime = -1; + + LastMessages.empty(); + LastMessages.fromJson(Map json){ + message = json['message'] ?? ""; + messageType = json['messageType'] ?? ""; + messageSentBy = json['messageSentBy'] ?? ""; + messageTime = json['messageTime'] ?? -1; + } + + Map toJson() { + final data = {}; + data['message'] = message; + data['messageType'] = messageType; + data['messageSentBy'] = messageSentBy; + data['messageTime'] = messageTime; + return data; + } + + @override + String toString() { + return 'LastMessages{message: $message, messageSentBy: $messageSentBy, messageTime: $messageTime}'; + } +} + +class GroupWorkingScheduleTime { + GroupWorkingScheduleTime({ + required this.startTime, + required this.endTime, + required this.totalWorkHours, + }); + int startTime = -1; + int endTime = -1; + String totalWorkHours = ""; + + GroupWorkingScheduleTime.empty(); + GroupWorkingScheduleTime.fromJson(Map json){ + startTime = json['startTime']?? -1; + endTime = json['endTime']?? -1; + totalWorkHours = json['totalWorkHours']?? ""; + } + + Map toJson() { + final data = {}; + data['startTime'] = startTime; + data['endTime'] = endTime; + data['totalWorkHours'] = totalWorkHours; + return data; + } + + @override + String toString() { + return 'GroupWorkingScheduleTime{startTime: $startTime, endTime: $endTime, totalWorkHours: $totalWorkHours}'; + } +} \ No newline at end of file diff --git a/lib/models/chat/single_chat.dart b/lib/models/chat/single_chat.dart new file mode 100644 index 0000000..7076ad2 --- /dev/null +++ b/lib/models/chat/single_chat.dart @@ -0,0 +1,53 @@ +class SingleChatModelClass { + SingleChatModelClass({ + required this.from, + required this.to, + required this.message, + required this.seen, + required this.isDeleted, + required this.isHide, + required this.isPin, + required this.id2, + required this.id, + }); + String from = ""; + String to = ""; + String message = ""; + bool seen = false; + bool isDeleted = false; + bool isHide = false; + bool isPin = false; + String id2 = ""; + String id = ""; + + SingleChatModelClass.fromJson(Map json){ + from = json['from'] ?? ""; + to = json['to'] ?? ""; + message = json['message'] ?? ""; + seen = json['seen'] ?? false; + isDeleted = json['isDeleted'] ?? false; + isHide = json['isHide'] ?? false; + isPin = json['isPin'] ?? false; + id2 = json['_id'] ?? ""; + id = json['id'] ?? ""; + } + + Map toJson() { + final data = {}; + data['from'] = from; + data['to'] = to; + data['message'] = message; + data['seen'] = seen; + data['isDeleted'] = isDeleted; + data['isHide'] = isHide; + data['isPin'] = isPin; + data['_id'] = id2; + data['id'] = id; + return data; + } + + @override + String toString() { + return 'SingleChatModelClass{from: $from, to: $to, message: $message, seen: $seen, isDeleted: $isDeleted, isHide: $isHide, isPin: $isPin, id2: $id2, id: $id}'; + } +} \ No newline at end of file diff --git a/lib/models/chat/update_delete_single_message_model.dart b/lib/models/chat/update_delete_single_message_model.dart new file mode 100644 index 0000000..4145a26 --- /dev/null +++ b/lib/models/chat/update_delete_single_message_model.dart @@ -0,0 +1,69 @@ +class UpdateDeleteSingleMessageModel { + UpdateDeleteSingleMessageModel({ + required this.idOne, + required this.from, + required this.to, + required this.message, + required this.seen, + required this.isDeleted, + required this.isHide, + required this.isPin, + required this.createdAt, + required this.updatedAt, + required this.v, + required this.seenAt, + required this.id, + }); + String idOne = ""; + String from = ""; + String to = ""; + String message = ""; + bool seen = false; + bool isDeleted = false; + bool isHide = false; + bool isPin = false; + String createdAt = ""; + String updatedAt = ""; + int v = -1; + String seenAt = ""; + String id = ""; + + UpdateDeleteSingleMessageModel.fromJson(Map json){ + idOne = json['_id']?? ""; + from = json['from']?? ""; + to = json['to']?? ""; + message = json['message']?? ""; + seen = json['seen']?? false; + isDeleted = json['isDeleted']?? false; + isHide = json['isHide']?? false; + isPin = json['isPin']?? false; + createdAt = json['createdAt']?? ""; + updatedAt = json['updatedAt']?? ""; + v = json['__v']?? -1; + seenAt = json['seenAt']?? ""; + id = json['id']?? ""; + } + + Map toJson() { + final data = {}; + data['_id'] = idOne; + data['from'] = from; + data['to'] = to; + data['message'] = message; + data['seen'] = seen; + data['isDeleted'] = isDeleted; + data['isHide'] = isHide; + data['isPin'] = isPin; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = v; + data['seenAt'] = seenAt; + data['id'] = id; + return data; + } + + @override + String toString() { + return 'UpdateDeleteSingleMessageModel{idOne: $idOne, from: $from, to: $to, message: $message, seen: $seen, isDeleted: $isDeleted, isHide: $isHide, isPin: $isPin, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, seenAt: $seenAt, id: $id}'; + } +} \ No newline at end of file diff --git a/lib/models/clients/HealthIssuesDetailsModel.dart b/lib/models/clients/HealthIssuesDetailsModel.dart new file mode 100644 index 0000000..ee3b4cd --- /dev/null +++ b/lib/models/clients/HealthIssuesDetailsModel.dart @@ -0,0 +1,58 @@ +import 'package:ftc_mobile_app/models/clients/body_points_category.dart'; + +class HealthIssueDetailsModel { + String sId = ""; + BodyPointsCategory? bodyPointsCategory; + bool status = false; + String healthNote = ""; + String complaint = ""; + String userId = ""; + String createdAt = ""; + String updatedAt = ""; + int iV = -1; + String id = ""; + + HealthIssueDetailsModel( + {required this.sId, + required this.bodyPointsCategory, + required this.status, + required this.healthNote, + required this.complaint, + required this.userId, + required this.createdAt, + required this.updatedAt, + required this.iV, + required this.id}); + + HealthIssueDetailsModel.empty(); + + HealthIssueDetailsModel.fromJson(Map json) { + sId = json['_id'] ?? ""; + bodyPointsCategory = json['category'] != null && json['category'] is Map + ? BodyPointsCategory.fromJson(json['category'] ?? {} ) + : null; + status = json['status']??''=="1"; + healthNote = json['healthNote'] ?? ""; + complaint = json['complaint'] ?? ""; + userId = json['userId'] ?? ""; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + iV = json['__v'] ?? ""; + id = json['id'] ?? ""; + } + + Map toJson() { + final Map data = {}; + data['_id'] = sId; + data['category'] = bodyPointsCategory?.toJson(); + data['status'] = status; + data['healthNote'] = healthNote; + data['complaint'] = complaint; + data['userId'] = userId; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = iV; + data['id'] = id; + return data; + } +} \ No newline at end of file diff --git a/lib/models/clients/PBSPlanModel.dart b/lib/models/clients/PBSPlanModel.dart new file mode 100644 index 0000000..3885c06 --- /dev/null +++ b/lib/models/clients/PBSPlanModel.dart @@ -0,0 +1,381 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:quill_html_editor/quill_html_editor.dart'; + +class PBSListDataJson { + PBSListDataJson({ + required this.pbsList, + required this.count, + }); + + List pbsList = []; + int count = -1; + + PBSListDataJson.empty(); + + PBSListDataJson.fromJson(Map json) { + for (var item in json['pbsList']) { + pbsList.add(PbsList.fromJson(item)); + } + // pbsList = List.from(json['pbsList']).map((e)=>PbsList.fromJson(e)).toList(); + count = json['count']; + } + + Map toJson() { + final data = {}; + data['pbsList'] = pbsList.map((e) => e.toJson()).toList(); + data['count'] = count; + return data; + } + + @override + String toString() { + return 'PBSListDataJson{pbsList: $pbsList, count: $count}'; + } +} + +class PbsList { + PbsList({ + required this.id, + required this.userIdModelInPbs, + required this.staffId, + required this.aboutPlan, + required this.managementOfBehaviorPlan, + required this.secondaryPrevention, + required this.reactiveStrategies, + required this.postIncidentSupport, + required this.updatedAt, + required this.createdAt, + }); + + String id = ""; + UserData? userIdModelInPbs; + UserData? staffId; + String aboutPlan = ""; + String managementOfBehaviorPlan = ""; + String secondaryPrevention = ""; + String reactiveStrategies = ""; + String postIncidentSupport = ""; + String updatedAt = ""; + String createdAt = ""; + + QuillEditorController aboutPlanQuillController = QuillEditorController(); + QuillEditorController managementOfBehaviouralPresentationQuillController = QuillEditorController(); + QuillEditorController secondaryPreventionQuillController = QuillEditorController(); + QuillEditorController reactiveStrategiesQuillController = QuillEditorController(); + QuillEditorController postIncidentSupportRecoveryQuillController = QuillEditorController(); + + PbsList.empty(); + + PbsList.addData({ + required this.id, + required this.aboutPlan, + required this.managementOfBehaviorPlan, + required this.secondaryPrevention, + required this.reactiveStrategies, + required this.postIncidentSupport, + }); + + PbsList.fromJson(Map json) { + id = json['_id'] ?? ""; + userIdModelInPbs = UserData.fromJson(json['userId'] ?? {}); + staffId = UserData.fromJson(json['staffId'] ?? {}); + aboutPlan = json['aboutPlan'] ?? ""; + managementOfBehaviorPlan = json['managementOfBehaviorPlan'] ?? ""; + secondaryPrevention = json['secondaryPrevention'] ?? ""; + reactiveStrategies = json['reactiveStartegies'] ?? ""; + postIncidentSupport = json['postIncidentSupport'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + createdAt = json['createdAt'] ?? ""; + } + + Map toJson() { + final data = {}; + data['_id'] = id; + data['userId'] = userIdModelInPbs?.toJson(); + data['staffId'] = staffId?.toJson(); + data['aboutPlan'] = aboutPlan; + data['managementOfBehaviorPlan'] = managementOfBehaviorPlan; + data['secondaryPrevention'] = secondaryPrevention; + data['reactiveStartegies'] = reactiveStrategies; + data['postIncidentSupport'] = postIncidentSupport; + data['updatedAt'] = updatedAt; + data['createdAt'] = createdAt; + return data; + } +} + +// class UserIdModelInPbs { +// UserIdModelInPbs({ +// required this.fcmTokens, +// required this.location, +// required this.id, +// required this.userModelName, +// required this.name, +// required this.version, +// required this.email, +// required this.phoneNumber, +// required this.active, +// required this.role, +// required this.profilePictureUrl, +// required this.deviceId, +// required this.verificationCode, +// required this.isVerified, +// required this.approved, +// required this.blocked, +// required this.createdAt, +// required this.updatedAt, +// required this.v, +// required this.password, +// required this.userSettings, +// required this.modelId, +// }); +// +// FcmTokens fcmTokens = FcmTokens.empty(); +// Location location = Location.empty(); +// String id = ""; +// String userModelName = ""; +// String name = ""; +// String version = ""; +// String email = ""; +// String phoneNumber = ""; +// bool active = false; +// String role = ""; +// String profilePictureUrl = ""; +// String deviceId = ""; +// String verificationCode = ""; +// bool isVerified = false; +// bool approved = false; +// bool blocked = false; +// String createdAt = ""; +// String updatedAt = ""; +// int v = -1; +// String password = ""; +// String userSettings = ""; +// String modelId = ""; +// +// UserIdModelInPbs.empty(); +// +// UserIdModelInPbs.fromJson(Map json) { +// fcmTokens = FcmTokens.fromJson(json['fcm_tokens'] ?? ""); +// location = Location.fromJson(json['location'] ?? ""); +// id = json['_id'] ?? ""; +// userModelName = json['userModelName'] ?? ""; +// name = json['name'] ?? ""; +// version = json['version'] ?? ""; +// email = json['email'] ?? ""; +// phoneNumber = json['phoneNumber'] ?? ""; +// active = json['active'] ?? ""; +// role = json['role'] ?? ""; +// profilePictureUrl = json['profile_picture_url'] ?? ""; +// deviceId = json['deviceId'] ?? ""; +// verificationCode = json['verification_code'] ?? ""; +// isVerified = json['is_verified'] ?? ""; +// approved = json['approved'] ?? ""; +// blocked = json['blocked'] ?? ""; +// createdAt = json['createdAt'] ?? ""; +// updatedAt = json['updatedAt'] ?? ""; +// v = json['__v'] ?? ""; +// password = json['password'] ?? ""; +// userSettings = json['userSettings'] ?? ""; +// modelId = json['modelId'] ?? ""; +// } +// +// Map toJson() { +// final data = {}; +// data['fcm_tokens'] = fcmTokens.toJson(); +// data['location'] = location.toJson(); +// data['_id'] = id; +// data['userModelName'] = userModelName; +// data['name'] = name; +// data['version'] = version; +// data['email'] = email; +// data['phoneNumber'] = phoneNumber; +// data['active'] = active; +// data['role'] = role; +// data['profile_picture_url'] = profilePictureUrl; +// data['deviceId'] = deviceId; +// data['verification_code'] = verificationCode; +// data['is_verified'] = isVerified; +// data['approved'] = approved; +// data['blocked'] = blocked; +// data['createdAt'] = createdAt; +// data['updatedAt'] = updatedAt; +// data['__v'] = v; +// data['password'] = password; +// data['userSettings'] = userSettings; +// data['modelId'] = modelId; +// return data; +// } +// +// @override +// String toString() { +// return 'UserId{fcmTokens: $fcmTokens, location: $location, id: $id, userModelName: $userModelName, name: $name, version: $version, email: $email, phoneNumber: $phoneNumber, active: $active, role: $role, profilePictureUrl: $profilePictureUrl, deviceId: $deviceId, verificationCode: $verificationCode, isVerified: $isVerified, approved: $approved, blocked: $blocked, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, password: $password, userSettings: $userSettings, modelId: $modelId}'; +// } +// } +// +// class FcmTokens { +// FcmTokens({ +// required this.token, +// required this.deviceType, +// }); +// +// String token = ""; +// String deviceType = ""; +// +// FcmTokens.empty(); +// +// FcmTokens.fromJson(Map json) { +// token = json['token'] ?? ""; +// deviceType = json['deviceType'] ?? ""; +// } +// +// Map toJson() { +// final data = {}; +// data['token'] = token; +// data['deviceType'] = deviceType; +// return data; +// } +// +// @override +// String toString() { +// return 'FcmTokens{token: $token, deviceType: $deviceType}'; +// } +// } +// +// class Location { +// Location({ +// required this.type, +// required this.coordinates, +// }); +// +// String type = ""; +// List coordinates = [0, 0]; +// +// Location.empty(); +// +// Location.fromJson(Map json) { +// type = json['type']; +// coordinates = List.castFrom(json['coordinates']); +// } +// +// Map toJson() { +// final data = {}; +// data['type'] = type; +// data['coordinates'] = coordinates; +// return data; +// } +// +// @override +// String toString() { +// return 'Location{type: $type, coordinates: $coordinates}'; +// } +// } +// +// class StaffId { +// StaffId({ +// required this.fcmTokens, +// required this.location, +// required this.id, +// required this.userModelName, +// required this.name, +// required this.version, +// required this.email, +// required this.phoneNumber, +// required this.active, +// required this.role, +// required this.profilePictureUrl, +// required this.deviceId, +// required this.verificationCode, +// required this.isVerified, +// required this.approved, +// required this.blocked, +// required this.createdAt, +// required this.updatedAt, +// required this.v, +// required this.password, +// required this.userSettings, +// required this.modelId, +// }); +// +// FcmTokens fcmTokens = FcmTokens.empty(); +// Location location = Location.empty(); +// String id = ""; +// String userModelName = ""; +// String name = ""; +// String version = ""; +// String email = ""; +// String phoneNumber = ""; +// bool active = false; +// String role = ""; +// String profilePictureUrl = ""; +// String deviceId = ""; +// String verificationCode = ""; +// bool isVerified = false; +// bool approved = false; +// bool blocked = false; +// String createdAt = ""; +// String updatedAt = ""; +// int v = -1; +// String password = ""; +// String userSettings = ""; +// String modelId = ""; +// +// StaffId.empty(); +// +// StaffId.fromJson(Map json) { +// fcmTokens = FcmTokens.fromJson(json['fcm_tokens'] ?? ""); +// location = Location.fromJson(json['location'] ?? ""); +// id = json['_id'] ?? ""; +// userModelName = json['userModelName'] ?? ""; +// name = json['name'] ?? ""; +// version = json['version'] ?? ""; +// email = json['email'] ?? ""; +// phoneNumber = json['phoneNumber'] ?? ""; +// active = json['active'] ?? ""; +// role = json['role'] ?? ""; +// profilePictureUrl = json['profile_picture_url'] ?? ""; +// deviceId = json['deviceId'] ?? ""; +// verificationCode = json['verification_code'] ?? ""; +// isVerified = json['is_verified'] ?? ""; +// approved = json['approved'] ?? ""; +// blocked = json['blocked'] ?? ""; +// createdAt = json['createdAt'] ?? ""; +// updatedAt = json['updatedAt'] ?? ""; +// v = json['__v'] ?? ""; +// password = json['password'] ?? ""; +// userSettings = json['userSettings'] ?? ""; +// modelId = json['modelId'] ?? ""; +// } +// +// Map toJson() { +// final data = {}; +// data['fcm_tokens'] = fcmTokens.toJson(); +// data['location'] = location.toJson(); +// data['_id'] = id; +// data['userModelName'] = userModelName; +// data['name'] = name; +// data['version'] = version; +// data['email'] = email; +// data['phoneNumber'] = phoneNumber; +// data['active'] = active; +// data['role'] = role; +// data['profile_picture_url'] = profilePictureUrl; +// data['deviceId'] = deviceId; +// data['verification_code'] = verificationCode; +// data['is_verified'] = isVerified; +// data['approved'] = approved; +// data['blocked'] = blocked; +// data['createdAt'] = createdAt; +// data['updatedAt'] = updatedAt; +// data['__v'] = v; +// data['password'] = password; +// data['userSettings'] = userSettings; +// data['modelId'] = modelId; +// return data; +// } +// +// @override +// String toString() { +// return 'StaffId{fcmTokens: $fcmTokens, location: $location, id: $id, userModelName: $userModelName, name: $name, version: $version, email: $email, phoneNumber: $phoneNumber, active: $active, role: $role, profilePictureUrl: $profilePictureUrl, deviceId: $deviceId, verificationCode: $verificationCode, isVerified: $isVerified, approved: $approved, blocked: $blocked, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, password: $password, userSettings: $userSettings, modelId: $modelId}'; +// } +// } diff --git a/lib/models/clients/add_pbs_plan_model.dart b/lib/models/clients/add_pbs_plan_model.dart new file mode 100644 index 0000000..98bebf2 --- /dev/null +++ b/lib/models/clients/add_pbs_plan_model.dart @@ -0,0 +1,74 @@ +import 'package:quill_html_editor/quill_html_editor.dart'; + +class AddPBSPlanModel{ + // String incidentTitle = ""; + // String incidentId = ""; + // String userId = ""; + // int incidentDate = 0; + // bool active = false; + // String createdAt = ""; + // String updatedAt = ""; + // int v = 0; + String userId = ""; + String staffId = ""; + String planId = ""; + String aboutPlanNote = ""; + QuillEditorController aboutPlanQuillController = QuillEditorController(); + String managementOfBehaviouralPresentationNote = ""; + QuillEditorController managementOfBehaviouralPresentationQuillController = QuillEditorController(); + String secondaryPreventionNote = ""; + QuillEditorController secondaryPreventionQuillController = QuillEditorController(); + String reactiveStrategiesNote = ""; + QuillEditorController reactiveStrategiesQuillController = QuillEditorController(); + String postIncidentSupportRecoveryNote = ""; + QuillEditorController postIncidentSupportRecoveryQuillController = QuillEditorController(); + + Future get areAllFieldsEdited async { + String aboutPlanText = await aboutPlanQuillController.getText(); + String managementOfBehaviouralPresentationText = + await managementOfBehaviouralPresentationQuillController.getText(); + String secondaryPreventionText = + await secondaryPreventionQuillController.getText(); + String reactiveStrategiesText = + await reactiveStrategiesQuillController.getText(); + String postIncidentSupportRecoveryText = + await postIncidentSupportRecoveryQuillController.getText(); + return aboutPlanText.isNotEmpty && + managementOfBehaviouralPresentationText.isNotEmpty && + secondaryPreventionText.isNotEmpty && + reactiveStrategiesText.isNotEmpty && + postIncidentSupportRecoveryText.isNotEmpty; + } + + AddPBSPlanModel.empty(); + + AddPBSPlanModel.fromJson(Map json){ + userId = json['userId']; + staffId = json['staffId']; + aboutPlanNote = json['aboutPlan']; + managementOfBehaviouralPresentationNote = json['managementOfBehaviorPlan']; + secondaryPreventionNote = json['secondaryPrevention']; + reactiveStrategiesNote = json['reactiveStartegies']; + postIncidentSupportRecoveryNote = json['postIncidentSupport']; + planId = json['_id']; + } + + @override + String toString() { + return 'AddPBSPlanModel{userId: $userId, staffId: $staffId, planId: $planId, aboutPlanNote: $aboutPlanNote, aboutPlanQuillController: $aboutPlanQuillController, managementOfBehaviouralPresentationNote: $managementOfBehaviouralPresentationNote, managementOfBehaviouralPresentationQuillController: $managementOfBehaviouralPresentationQuillController, secondaryPreventionNote: $secondaryPreventionNote, secondaryPreventionQuillController: $secondaryPreventionQuillController, reactiveStrategiesNote: $reactiveStrategiesNote, reactiveStrategiesQuillController: $reactiveStrategiesQuillController, postIncidentSupportRecoveryNote: $postIncidentSupportRecoveryNote, postIncidentSupportRecoveryQuillController: $postIncidentSupportRecoveryQuillController}'; + } + + // Map toJson() { + // final _data = {}; + // _data['userId'] = userId; + // _data['staffId'] = staffId; + // _data['aboutPlan'] = aboutPlan; + // _data['managementOfBehaviorPlan'] = managementOfBehaviorPlan; + // _data['secondaryPrevention'] = secondaryPrevention; + // _data['reactiveStartegies'] = reactiveStartegies; + // _data['postIncidentSupport'] = postIncidentSupport; + // _data['_id'] = _id; + // return _data; + // } + +} \ No newline at end of file diff --git a/lib/models/clients/allCareNotes/AllCareNotesListResponse.dart b/lib/models/clients/allCareNotes/AllCareNotesListResponse.dart new file mode 100644 index 0000000..7ea0941 --- /dev/null +++ b/lib/models/clients/allCareNotes/AllCareNotesListResponse.dart @@ -0,0 +1,33 @@ +import 'CareNoteData.dart'; + +class AllCareNotesListResponse { + AllCareNotesListResponse({ + this.status, + this.message, + this.data, + }); + + AllCareNotesListResponse.success() { + status = "Success"; + } + + AllCareNotesListResponse.fromJson(dynamic json) { + status = json['status']; + message = json['message']; + data = json['data'] != null ? CareNoteData.fromJson(json['data']) : null; + } + + String? status; + String? message; + CareNoteData? data; + + Map toJson() { + final map = {}; + map['status'] = status; + map['message'] = message; + if (data != null) { + map['data'] = data?.toJson(); + } + return map; + } +} diff --git a/lib/models/clients/allCareNotes/CareNoteData.dart b/lib/models/clients/allCareNotes/CareNoteData.dart new file mode 100644 index 0000000..6d6a844 --- /dev/null +++ b/lib/models/clients/allCareNotes/CareNoteData.dart @@ -0,0 +1,42 @@ +import 'CarePlans.dart'; + +class CareNoteData { + CareNoteData({ + this.carePlans, + this.count, + this.carePlanCount, + this.offset, + this.limit, + }); + + CareNoteData.fromJson(dynamic json) { + if (json['carePlans'] != null) { + carePlans = []; + json['carePlans'].forEach((v) { + carePlans?.add(CarePlan.fromJson(v)); + }); + } + count = json['count']; + carePlanCount = json['carePlanCount']; + offset = json['offset']; + limit = json['limit']; + } + + List? carePlans; + int? count; + int? carePlanCount; + int? offset; + int? limit; + + Map toJson() { + final map = {}; + if (carePlans != null) { + map['carePlans'] = carePlans?.map((v) => v.toJson()).toList(); + } + map['count'] = count; + map['carePlanCount'] = carePlanCount; + map['offset'] = offset; + map['limit'] = limit; + return map; + } +} diff --git a/lib/models/clients/allCareNotes/CarePlans.dart b/lib/models/clients/allCareNotes/CarePlans.dart new file mode 100644 index 0000000..08cd76e --- /dev/null +++ b/lib/models/clients/allCareNotes/CarePlans.dart @@ -0,0 +1,200 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import '../body_points_category.dart'; + +class CarePlan { + CarePlan({ + this.id, + this.eventDateTime, + this.userId, + this.addedby, + this.noteDetails, + this.active, + this.noteType, + this.title, + this.flag, + this.isHTML, + this.createdAt, + this.updatedAt, + this.healthIssueId, + this.keycontacts, + this.riskAssesments, + }); + + CarePlan.fromJson(dynamic json) { + id = json['_id']; + eventDateTime = json['eventDateTime']; + userId = json['userId'] is Map ? UserData.fromJson(json['userId']) : null; + addedby = json['addedby'] is Map ? UserData.fromJson(json['addedby']) : null; + noteDetails = json['noteDetails']; + active = json['active']; + noteType = json['noteType']; + title = json['title']; + flag = json['flag']; + isHTML = json['isHTML']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + + healthIssueId = json['healthIssueId'] != null + ? HealthIssueId.fromJson(json['healthIssueId']) + : null; + keycontacts = json['keycontacts'] != null + ? List.from(json['keycontacts']) + : null; + riskAssesments = json['riskAssesments'] != null + ? List.from(json['riskAssesments']) + : null; + } + + String? id; + int? eventDateTime; + UserData? userId; + UserData? addedby; + String? noteDetails; + bool? active; + String? noteType; + String? title; + bool? flag; + bool? isHTML; + String? createdAt; + String? updatedAt; + HealthIssueId? healthIssueId; + List? keycontacts; + List? riskAssesments; + + Map toJson() { + final map = {}; + map['_id'] = id; + map['eventDateTime'] = eventDateTime; + if (userId != null) { + map['userId'] = userId?.toJson(); + } + if (addedby != null) { + map['addedby'] = addedby?.toJson(); + } + map['noteDetails'] = noteDetails; + map['active'] = active; + map['noteType'] = noteType; + map['title'] = title; + map['flag'] = flag; + map['isHTML'] = isHTML; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + if (healthIssueId != null) { + map['healthIssueId'] = healthIssueId?.toJson(); + } + if (keycontacts != null) { + map['keycontacts'] = keycontacts; + } + if (riskAssesments != null) { + map['riskAssesments'] = riskAssesments; + } + return map; + } +} + +class HealthIssueId { + HealthIssueId.fromJson(dynamic json) { + id = json['_id']; + category = + json['category'] != null ? SubCat.fromJson(json['category']) : null; + status = json['status']; + healthNote = json['healthNote']; + complaint = json['complaint']; + userId = json['userId']; + isCarePlanData = json['isCarePlanData']; + isPhysicalIntervention = json['isPhysicalIntervention']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + } + + String? id; + SubCat? category; + bool? status; + String? healthNote; + String? complaint; + String? userId; + bool? isCarePlanData; + bool? isPhysicalIntervention; + String? createdAt; + String? updatedAt; + + Map toJson() { + final map = {}; + map['_id'] = id; + if (category != null) { + map['category'] = category?.toJson(); + } + map['status'] = status; + map['healthNote'] = healthNote; + map['complaint'] = complaint; + map['userId'] = userId; + map['isCarePlanData'] = isCarePlanData; + map['isPhysicalIntervention'] = isPhysicalIntervention; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + return map; + } +} + +// class Category { +// Category.fromJson(dynamic json) { +// id = json['_id']; +// name = json['name']; +// enumValue = json['enum']; +// parentCategory = json['parentCategory'] != null ? ParentCategory.fromJson(json['parentCategory']) : null; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// } +// +// String? id; +// String? name; +// String? enumValue; +// ParentCategory? parentCategory; +// String? createdAt; +// String? updatedAt; +// int? v; +// +// Map toJson() { +// final map = {}; +// map['_id'] = id; +// map['name'] = name; +// map['enum'] = enumValue; +// if (parentCategory != null) { +// map['parentCategory'] = parentCategory?.toJson(); +// } +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// return map; +// } +// } +// +// class ParentCategory { +// ParentCategory.fromJson(dynamic json) { +// id = json['_id']; +// name = json['name']; +// enumValue = json['enum']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// } +// +// String? id; +// String? name; +// String? enumValue; +// String? createdAt; +// String? updatedAt; +// int? v; +// +// Map toJson() { +// final map = {}; +// map['_id'] = id; +// map['name'] = name; +// map['enum'] = enumValue; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// return map; +// } +// } diff --git a/lib/models/clients/allClientsList/AllClientsResponse.dart b/lib/models/clients/allClientsList/AllClientsResponse.dart new file mode 100644 index 0000000..f9d5d7e --- /dev/null +++ b/lib/models/clients/allClientsList/AllClientsResponse.dart @@ -0,0 +1,734 @@ +import '../../profileData/user_data.dart'; + +class AllClientsResponse { + AllClientsResponse({ + this.success, + this.status, + this.message, + this.data,}); + + AllClientsResponse.fromJson(dynamic json) { + status = json['status']; + message = json['message']; + data = json['data'] != null ? AllClientsResponseData.fromJson(json['data']) : null; + } + + //Local var + bool? success; + + String? status; + String? message; + AllClientsResponseData? data; + + Map toJson() { + final map = {}; + map['status'] = status; + map['message'] = message; + if (data != null) { + map['data'] = data?.toJson(); + } + return map; + } + +} + +class AllClientsResponseData { + AllClientsResponseData({ + this.users, + this.count, + this.offset, + this.limit,}); + + AllClientsResponseData.fromJson(dynamic json) { + if (json['users'] != null) { + users = []; + json['users'].forEach((v) { + users?.add(UserData.fromJson(v)); + }); + } + count = json['count']; + offset = json['offset']; + limit = json['limit']; + } + List? users; + int? count; + int? offset; + int? limit; + + Map toJson() { + final map = {}; + if (users != null) { + map['users'] = users?.map((v) => v.toJson()).toList(); + } + map['count'] = count; + map['offset'] = offset; + map['limit'] = limit; + return map; + } + +} + +// class Users { +// Users({ +// this.id, +// this.userModelName, +// this.active, +// this.role, +// this.profilePictureUrl, +// this.profileVideoUrl, +// this.deviceId, +// this.verificationCode, +// this.isVerified, +// this.approved, +// this.blocked, +// this.name, +// this.phoneNumber, +// this.email, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.modelId,}); +// +// Users.fromJson(dynamic json) { +// id = json['_id']; +// userModelName = json['userModelName']; +// active = json['active']; +// role = json['role']; +// profilePictureUrl = json['profile_picture_url']; +// profileVideoUrl = json['profile_video_url']; +// deviceId = json['deviceId']; +// verificationCode = json['verification_code']; +// isVerified = json['is_verified']; +// approved = json['approved']; +// blocked = json['blocked']; +// name = json['name']; +// phoneNumber = json['phoneNumber']; +// email = json['email']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// modelId = json['modelId'] != null ? ModelId.fromJson(json['modelId']) : null; +// } +// String? id; +// String? userModelName; +// bool? active; +// String? role; +// String? profilePictureUrl; +// String? profileVideoUrl; +// String? deviceId; +// String? verificationCode; +// bool? isVerified; +// bool? approved; +// bool? blocked; +// String? name; +// String? phoneNumber; +// String? email; +// String? createdAt; +// String? updatedAt; +// int? v; +// ModelId? modelId; +// +// Map toJson() { +// final map = {}; +// map['_id'] = id; +// map['userModelName'] = userModelName; +// map['active'] = active; +// map['role'] = role; +// map['profile_picture_url'] = profilePictureUrl; +// map['profile_video_url'] = profileVideoUrl; +// map['deviceId'] = deviceId; +// map['verification_code'] = verificationCode; +// map['is_verified'] = isVerified; +// map['approved'] = approved; +// map['blocked'] = blocked; +// map['name'] = name; +// map['phoneNumber'] = phoneNumber; +// map['email'] = email; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// if (modelId != null) { +// map['modelId'] = modelId?.toJson(); +// } +// return map; +// } +// +// } +// +// class ModelId { +// ModelId({ +// this.id, +// this.suProvider, +// this.currSU, +// this.shifts, +// this.serviceUserMedications, +// this.homeVisitSignOut, +// this.srUsShiftsRequired, +// this.suEnquiries, +// this.active, +// this.diagnosises, +// this.suLastName, +// this.name, +// this.addedby, +// this.user, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.lastModifiedBy, +// this.providerName, +// this.referenceId, +// this.seMedicalAlert, +// this.suAddress1, +// this.suAddress2, +// this.suAge, +// this.suCity, +// this.suDOB, +// this.suEmailHome, +// this.suEmailWork, +// this.suEmergencyContact, +// this.suFamilyHead, +// this.suFirstMiddleName, +// this.suFirstVisitDate, +// this.suHomePhone, +// this.suLastVisitDate, +// this.suMobileHomeNo, +// this.suMobileWorkNo, +// this.suNote, +// this.suPrefHomeNo, +// this.suPrefWorkNo, +// this.suPreferredName, +// this.suReferredBY, +// this.suSex, +// this.suSsn, +// this.suState, +// this.suWorkPhone, +// this.suZip,}); +// +// ModelId.fromJson(dynamic json) { +// id = json['_id']; +// if (json['suProvider'] != null) { +// suProvider = []; +// json['suProvider'].forEach((v) { +// suProvider?.add(SuProvider.fromJson(v)); +// }); +// } +// currSU = json['currSU']; +// if (json['shifts'] != null) { +// shifts = []; +// json['shifts'].forEach((v) { +// shifts?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['serviceUserMedications'] != null) { +// serviceUserMedications = []; +// json['serviceUserMedications'].forEach((v) { +// serviceUserMedications?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['homeVisitSignOut'] != null) { +// homeVisitSignOut = []; +// json['homeVisitSignOut'].forEach((v) { +// homeVisitSignOut?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['srUsShiftsRequired'] != null) { +// srUsShiftsRequired = []; +// json['srUsShiftsRequired'].forEach((v) { +// srUsShiftsRequired?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['suEnquiries'] != null) { +// suEnquiries = []; +// json['suEnquiries'].forEach((v) { +// suEnquiries?.add(SuEnquiries.fromJson(v)); +// }); +// } +// active = json['active']; +// if (json['diagnosises'] != null) { +// diagnosises = []; +// json['diagnosises'].forEach((v) { +// diagnosises?.add(Dynamic.fromJson(v)); +// }); +// } +// suLastName = json['suLastName']; +// name = json['name']; +// addedby = json['addedby']; +// user = json['user']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// lastModifiedBy = json['lastModifiedBy']; +// providerName = json['providerName']; +// referenceId = json['referenceId']; +// seMedicalAlert = json['seMedicalAlert']; +// suAddress1 = json['suAddress1']; +// suAddress2 = json['suAddress2']; +// suAge = json['suAge']; +// suCity = json['suCity']; +// suDOB = json['suDOB']; +// suEmailHome = json['suEmailHome']; +// suEmailWork = json['suEmailWork']; +// suEmergencyContact = json['suEmergencyContact']; +// suFamilyHead = json['suFamilyHead']; +// suFirstMiddleName = json['suFirstMiddleName']; +// suFirstVisitDate = json['suFirstVisitDate']; +// suHomePhone = json['suHomePhone']; +// suLastVisitDate = json['suLastVisitDate']; +// suMobileHomeNo = json['suMobileHomeNo']; +// suMobileWorkNo = json['suMobileWorkNo']; +// suNote = json['suNote']; +// suPrefHomeNo = json['suPrefHomeNo']; +// suPrefWorkNo = json['suPrefWorkNo']; +// suPreferredName = json['suPreferredName']; +// suReferredBY = json['suReferredBY']; +// suSex = json['suSex']; +// suSsn = json['suSsn']; +// suState = json['suState']; +// suWorkPhone = json['suWorkPhone']; +// suZip = json['suZip']; +// } +// String? id; +// List? suProvider; +// bool? currSU; +// List? shifts; +// List? serviceUserMedications; +// List? homeVisitSignOut; +// List? srUsShiftsRequired; +// List? suEnquiries; +// bool? active; +// List? diagnosises; +// String? suLastName; +// String? name; +// String? addedby; +// String? user; +// String? createdAt; +// String? updatedAt; +// int? v; +// String? lastModifiedBy; +// String? providerName; +// String? referenceId; +// String? seMedicalAlert; +// String? suAddress1; +// String? suAddress2; +// String? suAge; +// String? suCity; +// String? suDOB; +// String? suEmailHome; +// String? suEmailWork; +// String? suEmergencyContact; +// String? suFamilyHead; +// String? suFirstMiddleName; +// String? suFirstVisitDate; +// String? suHomePhone; +// String? suLastVisitDate; +// String? suMobileHomeNo; +// String? suMobileWorkNo; +// String? suNote; +// String? suPrefHomeNo; +// String? suPrefWorkNo; +// String? suPreferredName; +// String? suReferredBY; +// String? suSex; +// String? suSsn; +// String? suState; +// String? suWorkPhone; +// String? suZip; +// +// Map toJson() { +// final map = {}; +// map['_id'] = id; +// if (suProvider != null) { +// map['suProvider'] = suProvider?.map((v) => v.toJson()).toList(); +// } +// map['currSU'] = currSU; +// if (shifts != null) { +// map['shifts'] = shifts?.map((v) => v.toJson()).toList(); +// } +// if (serviceUserMedications != null) { +// map['serviceUserMedications'] = serviceUserMedications?.map((v) => v.toJson()).toList(); +// } +// if (homeVisitSignOut != null) { +// map['homeVisitSignOut'] = homeVisitSignOut?.map((v) => v.toJson()).toList(); +// } +// if (srUsShiftsRequired != null) { +// map['srUsShiftsRequired'] = srUsShiftsRequired?.map((v) => v.toJson()).toList(); +// } +// if (suEnquiries != null) { +// map['suEnquiries'] = suEnquiries?.map((v) => v.toJson()).toList(); +// } +// map['active'] = active; +// if (diagnosises != null) { +// map['diagnosises'] = diagnosises?.map((v) => v.toJson()).toList(); +// } +// map['suLastName'] = suLastName; +// map['name'] = name; +// map['addedby'] = addedby; +// map['user'] = user; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// map['lastModifiedBy'] = lastModifiedBy; +// map['providerName'] = providerName; +// map['referenceId'] = referenceId; +// map['seMedicalAlert'] = seMedicalAlert; +// map['suAddress1'] = suAddress1; +// map['suAddress2'] = suAddress2; +// map['suAge'] = suAge; +// map['suCity'] = suCity; +// map['suDOB'] = suDOB; +// map['suEmailHome'] = suEmailHome; +// map['suEmailWork'] = suEmailWork; +// map['suEmergencyContact'] = suEmergencyContact; +// map['suFamilyHead'] = suFamilyHead; +// map['suFirstMiddleName'] = suFirstMiddleName; +// map['suFirstVisitDate'] = suFirstVisitDate; +// map['suHomePhone'] = suHomePhone; +// map['suLastVisitDate'] = suLastVisitDate; +// map['suMobileHomeNo'] = suMobileHomeNo; +// map['suMobileWorkNo'] = suMobileWorkNo; +// map['suNote'] = suNote; +// map['suPrefHomeNo'] = suPrefHomeNo; +// map['suPrefWorkNo'] = suPrefWorkNo; +// map['suPreferredName'] = suPreferredName; +// map['suReferredBY'] = suReferredBY; +// map['suSex'] = suSex; +// map['suSsn'] = suSsn; +// map['suState'] = suState; +// map['suWorkPhone'] = suWorkPhone; +// map['suZip'] = suZip; +// return map; +// } +// +// } +// +// class SuEnquiries { +// SuEnquiries({ +// this.id, +// this.initialContactDate, +// this.suEnqContactNo, +// this.suEnqEmail, +// this.reasonForNeed, +// this.suEnqStatus, +// this.requestType, +// this.suEnqComments, +// this.serviceUser, +// this.addedby, +// this.active, +// this.referenceId, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.lastModifiedBy,}); +// +// SuEnquiries.fromJson(dynamic json) { +// id = json['_id']; +// initialContactDate = json['initialContactDate']; +// suEnqContactNo = json['suEnqContactNo']; +// suEnqEmail = json['suEnqEmail']; +// reasonForNeed = json['reasonForNeed']; +// suEnqStatus = json['suEnqStatus']; +// requestType = json['requestType']; +// suEnqComments = json['suEnqComments']; +// serviceUser = json['serviceUser']; +// addedby = json['addedby']; +// active = json['active']; +// referenceId = json['referenceId']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// lastModifiedBy = json['lastModifiedBy']; +// } +// String? id; +// String? initialContactDate; +// String? suEnqContactNo; +// String? suEnqEmail; +// String? reasonForNeed; +// String? suEnqStatus; +// String? requestType; +// String? suEnqComments; +// String? serviceUser; +// String? addedby; +// bool? active; +// String? referenceId; +// String? createdAt; +// String? updatedAt; +// int? v; +// String? lastModifiedBy; +// +// Map toJson() { +// final map = {}; +// map['_id'] = id; +// map['initialContactDate'] = initialContactDate; +// map['suEnqContactNo'] = suEnqContactNo; +// map['suEnqEmail'] = suEnqEmail; +// map['reasonForNeed'] = reasonForNeed; +// map['suEnqStatus'] = suEnqStatus; +// map['requestType'] = requestType; +// map['suEnqComments'] = suEnqComments; +// map['serviceUser'] = serviceUser; +// map['addedby'] = addedby; +// map['active'] = active; +// map['referenceId'] = referenceId; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// map['lastModifiedBy'] = lastModifiedBy; +// return map; +// } +// +// } +// +// class SuProvider { +// SuProvider({ +// this.contractedHours, +// this.id, +// this.staffMemberName, +// this.staffDesignation, +// this.staffOnLeave, +// this.supervisorId, +// this.holidays, +// this.complianceDocuments, +// this.driverFields, +// this.niNumber, +// this.kin, +// this.user, +// this.clients, +// this.staffWorkLoads, +// this.staffHolidayRequests, +// this.staffTrainings, +// this.supervision, +// this.underSupervisions, +// this.staffWorkingDays, +// this.stafDob, +// this.active, +// this.covidCheck, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.staffDisciplinaries, +// this.staffReferences,}); +// +// SuProvider.fromJson(dynamic json) { +// contractedHours = json['contractedHours'] != null ? ContractedHours.fromJson(json['contractedHours']) : null; +// id = json['_id']; +// staffMemberName = json['staffMemberName']; +// staffDesignation = json['staffDesignation']; +// staffOnLeave = json['staffOnLeave']; +// supervisorId = json['supervisorId']; +// if (json['holidays'] != null) { +// holidays = []; +// json['holidays'].forEach((v) { +// holidays?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['complianceDocuments'] != null) { +// complianceDocuments = []; +// json['complianceDocuments'].forEach((v) { +// complianceDocuments?.add(Dynamic.fromJson(v)); +// }); +// } +// driverFields = json['driverFields'] != null ? DriverFields.fromJson(json['driverFields']) : null; +// niNumber = json['niNumber']; +// kin = json['kin']; +// user = json['user']; +// if (json['clients'] != null) { +// clients = []; +// json['clients'].forEach((v) { +// clients?.add(Dynamic.fromJson(v)); +// }); +// } +// staffWorkLoads = json['staffWorkLoads'] != null ? json['staffWorkLoads'].cast() : []; +// if (json['staffHolidayRequests'] != null) { +// staffHolidayRequests = []; +// json['staffHolidayRequests'].forEach((v) { +// staffHolidayRequests?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['staffTrainings'] != null) { +// staffTrainings = []; +// json['staffTrainings'].forEach((v) { +// staffTrainings?.add(Dynamic.fromJson(v)); +// }); +// } +// supervision = json['supervision'] != null ? Supervision.fromJson(json['supervision']) : null; +// if (json['underSupervisions'] != null) { +// underSupervisions = []; +// json['underSupervisions'].forEach((v) { +// underSupervisions?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['staffWorkingDays'] != null) { +// staffWorkingDays = []; +// json['staffWorkingDays'].forEach((v) { +// staffWorkingDays?.add(Dynamic.fromJson(v)); +// }); +// } +// stafDob = json['stafDob']; +// active = json['active']; +// covidCheck = json['covidCheck']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// staffDisciplinaries = json['staffDisciplinaries']; +// staffReferences = json['staffReferences']; +// } +// ContractedHours? contractedHours; +// String? id; +// String? staffMemberName; +// String? staffDesignation; +// bool? staffOnLeave; +// String? supervisorId; +// List? holidays; +// List? complianceDocuments; +// DriverFields? driverFields; +// String? niNumber; +// String? kin; +// String? user; +// List? clients; +// List? staffWorkLoads; +// List? staffHolidayRequests; +// List? staffTrainings; +// Supervision? supervision; +// List? underSupervisions; +// List? staffWorkingDays; +// String? stafDob; +// bool? active; +// bool? covidCheck; +// String? createdAt; +// String? updatedAt; +// int? v; +// String? staffDisciplinaries; +// String? staffReferences; +// +// Map toJson() { +// final map = {}; +// if (contractedHours != null) { +// map['contractedHours'] = contractedHours?.toJson(); +// } +// map['_id'] = id; +// map['staffMemberName'] = staffMemberName; +// map['staffDesignation'] = staffDesignation; +// map['staffOnLeave'] = staffOnLeave; +// map['supervisorId'] = supervisorId; +// if (holidays != null) { +// map['holidays'] = holidays?.map((v) => v.toJson()).toList(); +// } +// if (complianceDocuments != null) { +// map['complianceDocuments'] = complianceDocuments?.map((v) => v.toJson()).toList(); +// } +// if (driverFields != null) { +// map['driverFields'] = driverFields?.toJson(); +// } +// map['niNumber'] = niNumber; +// map['kin'] = kin; +// map['user'] = user; +// if (clients != null) { +// map['clients'] = clients?.map((v) => v.toJson()).toList(); +// } +// map['staffWorkLoads'] = staffWorkLoads; +// if (staffHolidayRequests != null) { +// map['staffHolidayRequests'] = staffHolidayRequests?.map((v) => v.toJson()).toList(); +// } +// if (staffTrainings != null) { +// map['staffTrainings'] = staffTrainings?.map((v) => v.toJson()).toList(); +// } +// if (supervision != null) { +// map['supervision'] = supervision?.toJson(); +// } +// if (underSupervisions != null) { +// map['underSupervisions'] = underSupervisions?.map((v) => v.toJson()).toList(); +// } +// if (staffWorkingDays != null) { +// map['staffWorkingDays'] = staffWorkingDays?.map((v) => v.toJson()).toList(); +// } +// map['stafDob'] = stafDob; +// map['active'] = active; +// map['covidCheck'] = covidCheck; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// map['staffDisciplinaries'] = staffDisciplinaries; +// map['staffReferences'] = staffReferences; +// return map; +// } +// +// } +// +// class Supervision { +// Supervision({ +// this.supervisionName, +// this.sprDueDate, +// this.sprStatus, +// this.sprResult, +// this.templateTitleId,}); +// +// Supervision.fromJson(dynamic json) { +// supervisionName = json['supervisionName']; +// sprDueDate = json['sprDueDate']; +// sprStatus = json['sprStatus']; +// sprResult = json['sprResult']; +// templateTitleId = json['templateTitleId']; +// } +// String? supervisionName; +// String? sprDueDate; +// String? sprStatus; +// String? sprResult; +// String? templateTitleId; +// +// Map toJson() { +// final map = {}; +// map['supervisionName'] = supervisionName; +// map['sprDueDate'] = sprDueDate; +// map['sprStatus'] = sprStatus; +// map['sprResult'] = sprResult; +// map['templateTitleId'] = templateTitleId; +// return map; +// } +// +// } +// +// class DriverFields { +// DriverFields({ +// this.isDriver, +// this.vehicleType,}); +// +// DriverFields.fromJson(dynamic json) { +// isDriver = json['isDriver']; +// vehicleType = json['vehicleType']; +// } +// bool? isDriver; +// String? vehicleType; +// +// Map toJson() { +// final map = {}; +// map['isDriver'] = isDriver; +// map['vehicleType'] = vehicleType; +// return map; +// } +// +// } +// +// class ContractedHours { +// ContractedHours({ +// this.contractedHours, +// this.totalShiftHoursWeek, +// this.noOfShifts,}); +// +// ContractedHours.fromJson(dynamic json) { +// contractedHours = json['contractedHours']; +// totalShiftHoursWeek = json['totalShiftHoursWeek']; +// noOfShifts = json['noOfShifts']; +// } +// int? contractedHours; +// int? totalShiftHoursWeek; +// int? noOfShifts; +// +// Map toJson() { +// final map = {}; +// map['contractedHours'] = contractedHours; +// map['totalShiftHoursWeek'] = totalShiftHoursWeek; +// map['noOfShifts'] = noOfShifts; +// return map; +// } +// +// } \ No newline at end of file diff --git a/lib/models/clients/body_points_category.dart b/lib/models/clients/body_points_category.dart new file mode 100644 index 0000000..0be8293 --- /dev/null +++ b/lib/models/clients/body_points_category.dart @@ -0,0 +1,116 @@ +class BodyPointsCategory { + String idOne = ""; + String name = ""; + String enumed = ""; + String createdAt = ""; + String updatedAt = ""; + int v = 0; + List subCategory = []; + String id = ""; + + BodyPointsCategory({ + required this.idOne, + required this.name, + required this.enumed, + required this.createdAt, + required this.updatedAt, + required this.v, + required this.subCategory, + required this.id, + }); + + @override + String toString() { + return 'BodyPointsCategory{idOne: $idOne, name: $name, enumed: $enumed, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, subCategory: $subCategory, id: $id}'; + } + + // // Override == operator and hashCode getter + // @override + // bool operator ==(other) => + // identical(this, other) || + // other is BodyPointsCategory && runtimeType == other.runtimeType && id == other.id; + // + // @override + // int get hashCode => id.hashCode; + + BodyPointsCategory.empty(); + + BodyPointsCategory.fromJson(Map json) { + idOne = json['_id'] ?? ""; + name = json['name'] ?? ""; + enumed = json['enum'] ?? ""; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + v = json['__v'] ?? 0; + subCategory = json['subcat'] != null + ? List.from(json['subcat']).map((e) => SubCat.fromJson(e)).toList() + : [SubCat.empty()]; + id = json['id'] ?? ""; + } + + Map toJson() { + final data = {}; + data['_id'] = idOne; + data['name'] = name; + data['enum'] = enumed; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = v; + data['subcat'] = subCategory.map((e) => e.toJson()).toList(); + data['id'] = id; + return data; + } +} + +class SubCat { + String idOne = ""; + String name = ""; + String enumed = ""; + dynamic parentCategory; + String createdAt = ""; + String updatedAt = ""; + int v = 0; + String id = ""; + + @override + String toString() { + return 'SubCat{idOne: $idOne, name: $name, enumed: $enumed, parentCategory: $parentCategory, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, id: $id}'; + } + + SubCat({ + required this.idOne, + required this.name, + required this.enumed, + required this.parentCategory, + required this.createdAt, + required this.updatedAt, + required this.v, + required this.id, + }); + + SubCat.empty(); + + SubCat.fromJson(Map json) { + idOne = json['_id'] ?? ""; + name = json['name'] ?? ""; + enumed = json['enum'] ?? ""; + parentCategory = json['parentCategory'] is Map + ? BodyPointsCategory.fromJson(json['parentCategory']) + : json['parentCategory']; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + id = json['id'] ?? ""; + } + + Map toJson() { + final data = {}; + data['_id'] = idOne; + data['name'] = name; + data['enum'] = enumed; + data['parentCategory'] = parentCategory; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['id'] = id; + return data; + } +} diff --git a/lib/models/clients/body_points_manager.dart b/lib/models/clients/body_points_manager.dart new file mode 100644 index 0000000..132ccf0 --- /dev/null +++ b/lib/models/clients/body_points_manager.dart @@ -0,0 +1,50 @@ +import 'package:get/get_rx/src/rx_types/rx_types.dart'; + +class BodyPointsManager { + double? triangleTopPosition; + double? triangleBottomPosition; + double? triangleRightPosition; + double? triangleLeftPosition; + double? dialogTopPosition; + double? dialogBottomPosition; + double? dialogRightPosition; + double? dialogLeftPosition; + String pointName = ""; + String healthNote = ""; + String complaint = ""; + String lastUpdate = ""; + String pointParentId = ""; + String pointId = ""; + String pointIssueId = ""; + RxBool isPointInactive = true.obs; + RxBool pointVisibility = false.obs; + RxString pointStatusSelectedDropdownValue = "Active".obs; + String serviceUserId = ""; + + BodyPointsManager.empty(); + + BodyPointsManager.addPoint({ + required this.pointParentId, + required this.isPointInactive, + required this.pointId, + required this.pointName, + required this.pointVisibility, + required this.pointStatusSelectedDropdownValue, + this.triangleTopPosition, + this.triangleBottomPosition, + this.triangleRightPosition, + this.triangleLeftPosition, + this.dialogTopPosition, + this.dialogBottomPosition, + this.dialogRightPosition, + this.dialogLeftPosition, + required this.healthNote, + required this.complaint, + required this.lastUpdate, + }); + + @override + String toString() { + return 'BodyPointsManager{Point Id $pointId,triangleTopPosition: $triangleTopPosition, triangleBottomPosition: $triangleBottomPosition, triangleRightPosition: $triangleRightPosition, triangleLeftPosition: $triangleLeftPosition, dialogTopPosition: $dialogTopPosition, dialogBottomPosition: $dialogBottomPosition, dialogRightPosition: $dialogRightPosition, dialogLeftPosition: $dialogLeftPosition, pointName: $pointName, healthNote: $healthNote, complaint: $complaint, lastUpdate: $lastUpdate, isPointInactive: $isPointInactive, pointVisibility: $pointVisibility, pointStatusSelectedDropdownValue: $pointStatusSelectedDropdownValue}'; + } +} \ No newline at end of file diff --git a/lib/models/clients/careNoteFormsRequests/ABC_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/ABC_form_html_request.dart new file mode 100644 index 0000000..36213c8 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/ABC_form_html_request.dart @@ -0,0 +1,25 @@ +class ABCFormHtmlRequest { + final String antecedentEvents; + final String behaviour; + final String consequenceEvents; + + ABCFormHtmlRequest({ + required this.antecedentEvents, + required this.behaviour, + required this.consequenceEvents, + }); + + String toHtml() { + return """ +
+

Antecedent Events: $antecedentEvents

+
+
+

Behaviour: $behaviour

+
+
+

Consequence Events: $consequenceEvents

+
+ """; + } +} diff --git a/lib/models/clients/careNoteFormsRequests/HtmlTableOption.dart b/lib/models/clients/careNoteFormsRequests/HtmlTableOption.dart new file mode 100644 index 0000000..d2ee0e5 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/HtmlTableOption.dart @@ -0,0 +1,12 @@ +import 'package:get/get_rx/get_rx.dart'; + +class HtmlTableOption { + String id; + String requirements; + final RxBool isChecked = false.obs; + + HtmlTableOption({ + required this.id, + required this.requirements, + }); +} diff --git a/lib/models/clients/careNoteFormsRequests/consent_capacity_html_request.dart b/lib/models/clients/careNoteFormsRequests/consent_capacity_html_request.dart new file mode 100644 index 0000000..a30dbe1 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/consent_capacity_html_request.dart @@ -0,0 +1,313 @@ +import 'package:html/parser.dart' as htmlparser; +import 'package:html/dom.dart' as dom; +import 'HtmlTableOption.dart'; + +class ConsentCapacityHtmlRequest { + final String comments; + final String isMCARequired; + final String mentalCapacityAssessmentDetail; + final String specificDecisionDetail; + final String personUndertakingName; + final String personUndertakingRole; + final String organisation; + final String address; + final String tel; + final String email; + final String dateAndTimeOfAssessment; + final String lackCapacityToMakeParticularDecisionDetail; + final String recordYourEvidenceDescribe; + final String viableOptionsConsidered; + final String explainWhyTickedBox; + final List canDecisionBeDelayedOptions; + final String selectedImpairmentOption; + final String impairmentDescribe; + final String selectedCanPersonDecisionInfoOption; + final String describeCanPersonDecisionInfo; + final String selectedCanTheyRetainOption; + final String describeCanTheyRetain; + final String selectedCanTheyUseOption; + final String describeCanTheyUse; + final String selectedCanTheyCommunicateOption; + final String describeCanTheyCommunicate; + final List causativeNexusOptions; + final String evidence; + final String selectedDoYouHaveConcernOption; + final String whatIsYourEvidence; + final String seekingManagementDescribe; + final String recordInterviewDescribe; + final String section9DontHaveDecisionNameData; + final String section9DontHaveDecisionDateData; + final String section9HaveDecisionNameData; + final String section9HaveDecisionDateData; + final String isIMCARequired; + final String giveWhyIMCARequiredReason; + final String whyIMCARequiredDateTime; + final String section9AssessorsName; + final String assessorsDesignation; + final String assessorsBaseAddress; + final String assessorsContactDetailsData; + + ConsentCapacityHtmlRequest({ + required this.comments, + required this.isMCARequired, + required this.mentalCapacityAssessmentDetail, + required this.specificDecisionDetail, + required this.personUndertakingName, + required this.personUndertakingRole, + required this.organisation, + required this.address, + required this.tel, + required this.email, + required this.dateAndTimeOfAssessment, + required this.lackCapacityToMakeParticularDecisionDetail, + required this.recordYourEvidenceDescribe, + required this.viableOptionsConsidered, + required this.explainWhyTickedBox, + required this.canDecisionBeDelayedOptions, + required this.selectedImpairmentOption, + required this.impairmentDescribe, + required this.selectedCanPersonDecisionInfoOption, + required this.describeCanPersonDecisionInfo, + required this.selectedCanTheyRetainOption, + required this.describeCanTheyRetain, + required this.selectedCanTheyUseOption, + required this.describeCanTheyUse, + required this.selectedCanTheyCommunicateOption, + required this.describeCanTheyCommunicate, + required this.causativeNexusOptions, + required this.evidence, + required this.selectedDoYouHaveConcernOption, + required this.whatIsYourEvidence, + required this.seekingManagementDescribe, + required this.recordInterviewDescribe, + required this.section9DontHaveDecisionNameData, + required this.section9DontHaveDecisionDateData, + required this.section9HaveDecisionNameData, + required this.section9HaveDecisionDateData, + required this.isIMCARequired, + required this.giveWhyIMCARequiredReason, + required this.whyIMCARequiredDateTime, + required this.section9AssessorsName, + required this.assessorsDesignation, + required this.assessorsBaseAddress, + required this.assessorsContactDetailsData, + }); + + String toHtml(String htmlString) { + // Process the HTML string as needed + dom.Document document = htmlparser.parse(htmlString); + + _addTextToElementId( + id: 'isMCARequiredData', value: isMCARequired, document: document); + _addTextToElementId( + id: 'commentsData', value: comments, document: document); + + final myElement = document.getElementById("ifMcaRequiredContentDiv"); + if (isMCARequired == "No") { + myElement?.attributes['style'] = 'display: none;'; + } else { + myElement?.attributes['style'] = 'display: block;'; + + _addTextToElementId( + id: 'mentalCapacityAssessmentDetail', + value: mentalCapacityAssessmentDetail, + document: document); + + _addTextToElementId( + id: 'specificDecisionDetail', + value: specificDecisionDetail, + document: document); + + _addTextToElementId( + id: 'personUndertakingName', + value: personUndertakingName, + document: document); + + _addTextToElementId( + id: 'personUndertakingRole', + value: personUndertakingRole, + document: document); + + _addTextToElementId( + id: 'organisation', value: organisation, document: document); + + _addTextToElementId(id: 'address', value: address, document: document); + _addTextToElementId(id: 'tel', value: tel, document: document); + _addTextToElementId(id: 'email', value: email, document: document); + _addTextToElementId( + id: 'dateAndTimeOfAssessment', + value: dateAndTimeOfAssessment, + document: document); + _addTextToElementId( + id: 'lackCapacityToMakeParticularDecisionDetail', + value: lackCapacityToMakeParticularDecisionDetail, + document: document); + _addTextToElementId( + id: 'recordYourEvidenceDescribe', + value: recordYourEvidenceDescribe, + document: document); + _addTextToElementId( + id: 'viableOptionsConsidered', + value: viableOptionsConsidered, + document: document); + + //canDecisionBeDelayedTable + final String generatedHtml1 = + generateHtmlRows(canDecisionBeDelayedOptions); + print("table1: $generatedHtml1"); + final tableBody1 = document.getElementById('canDecisionBeDelayedTable'); + // document.querySelector('.canDecisionBeDelayedTable tbody'); + print("is tableBody1 null: ${tableBody1 == null}"); + tableBody1?.innerHtml = generatedHtml1; + + _addTextToElementId( + id: 'explainWhyTickedBox', + value: explainWhyTickedBox, + document: document); + + _addTextToElementId( + id: 'selectedImpairmentOption', + value: selectedImpairmentOption, + document: document); + + _addTextToElementId( + id: 'impairmentDescribe', + value: impairmentDescribe, + document: document); + + _addTextToElementId( + id: 'selectedCanPersonDecisionInfoOption', + value: selectedCanPersonDecisionInfoOption, + document: document); + _addTextToElementId( + id: 'describeCanPersonDecisionInfo', + value: describeCanPersonDecisionInfo, + document: document); + _addTextToElementId( + id: 'selectedCanTheyRetainOption', + value: selectedCanTheyRetainOption, + document: document); + _addTextToElementId( + id: 'describeCanTheyRetain', + value: describeCanTheyRetain, + document: document); + _addTextToElementId( + id: 'selectedCanTheyUseOption', + value: selectedCanTheyUseOption, + document: document); + _addTextToElementId( + id: 'describeCanTheyUse', + value: describeCanTheyUse, + document: document); + _addTextToElementId( + id: 'selectedCanTheyCommunicateOption', + value: selectedCanTheyCommunicateOption, + document: document); + _addTextToElementId( + id: 'describeCanTheyCommunicate', + value: describeCanTheyCommunicate, + document: document); + + final String generatedHtml2 = generateHtmlRows(causativeNexusOptions); + print("table2: $generatedHtml2"); + final tableBody2 = document.getElementById('causativeNexusOptions'); + // final tableBody2 = document.querySelector('.causativeNexusOptions tbody'); + print("is table2 null: ${tableBody2 == null}"); + tableBody2?.innerHtml = generatedHtml2; + + _addTextToElementId(id: 'evidence', value: evidence, document: document); + _addTextToElementId( + id: 'selectedDoYouHaveConcernOption', + value: selectedDoYouHaveConcernOption, + document: document); + _addTextToElementId( + id: 'whatIsYourEvidence', + value: whatIsYourEvidence, + document: document); + _addTextToElementId( + id: 'seekingManagementDescribe', + value: seekingManagementDescribe, + document: document); + _addTextToElementId( + id: 'recordInterviewDescribe', + value: recordInterviewDescribe, + document: document); + _addTextToElementId( + id: 'section9DontHaveDecisionNameData', + value: section9DontHaveDecisionNameData, + document: document); + _addTextToElementId( + id: 'section9DontHaveDecisionDateData', + value: section9DontHaveDecisionDateData, + document: document); + _addTextToElementId( + id: 'section9HaveDecisionNameData', + value: section9HaveDecisionNameData, + document: document); + _addTextToElementId( + id: 'section9HaveDecisionDateData', + value: section9HaveDecisionDateData, + document: document); + _addTextToElementId( + id: 'isIMCARequired', value: isIMCARequired, document: document); + _addTextToElementId( + id: 'giveWhyIMCARequiredReason', + value: giveWhyIMCARequiredReason, + document: document); + _addTextToElementId( + id: 'whyIMCARequiredDateTime', + value: whyIMCARequiredDateTime, + document: document); + _addTextToElementId( + id: 'section9AssessorsName', + value: section9AssessorsName, + document: document); + _addTextToElementId( + id: 'assessorsDesignation', + value: assessorsDesignation, + document: document); + _addTextToElementId( + id: 'assessorsBaseAddress', + value: assessorsBaseAddress, + document: document); + _addTextToElementId( + id: 'assessorsContactDetailsData', + value: assessorsContactDetailsData, + document: document); + } + + return document.outerHtml; + } + + _addTextToElementId({ + required String id, + required String value, + required dom.Document document, + }) { + final myElement = document.getElementById(id); + if (myElement != null) { + myElement.text = value; + } + } + + String generateHtmlRows(List options) { + final StringBuffer htmlBuffer = StringBuffer(); + + for (final option in options) { + final String rowHtml = ''' + ${option.requirements} + + ${option.isChecked.value ? 'Tick' : 'Close'} + + + '''; + + htmlBuffer.write(rowHtml); + } + + return htmlBuffer.toString(); + } +} diff --git a/lib/models/clients/careNoteFormsRequests/health_appointments_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/health_appointments_form_html_request.dart new file mode 100644 index 0000000..4ae81f1 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/health_appointments_form_html_request.dart @@ -0,0 +1,23 @@ +class HealthAppointmentsFormHtmlRequest { + final String appointmentWith; + final String reason; + final String comments; + + HealthAppointmentsFormHtmlRequest({ + required this.appointmentWith, + required this.reason, + required this.comments, + }); + + String toHtml() { + return """
+

Appointment with: $appointmentWith

+
+
+

Reason for appointment: $reason

+
+
+

Comments: $comments

+
"""; + } +} diff --git a/lib/models/clients/careNoteFormsRequests/nutrition_hydration_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/nutrition_hydration_form_html_request.dart new file mode 100644 index 0000000..54329f0 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/nutrition_hydration_form_html_request.dart @@ -0,0 +1,35 @@ +class NutritionHydrationFormHtmlRequest { + final String nutritionHydrationType; + final String foodFluidType; + final String foodFluidAmount; + final String comments; + + NutritionHydrationFormHtmlRequest({ + required this.nutritionHydrationType, + required this.foodFluidType, + required this.foodFluidAmount, + required this.comments, + }); + + String toHtml() { + return """
+

Type: $nutritionHydrationType +

+
+
+

${nutritionHydrationType == "Food" ? "Meal Type: (Breakfast, Lunch, Dinner, Snack etc)" : nutritionHydrationType == "Fluid" ? "Drink Type" : ""}: $foodFluidType

+
+
+

${nutritionHydrationType == "Food" ? "Amount Eaten" : nutritionHydrationType == "Fluid" ? "Amount (ML)" : ""}: $foodFluidAmount

+
+
+

Comments: ${comments.isNotEmpty ? comments : "No assistance required"} +

+
+
+ ${(nutritionHydrationType == "Food") ? """Plat""" : nutritionHydrationType == "Fluid" ? """Glass""" : ""}
+ """; + } +} diff --git a/lib/models/clients/careNoteFormsRequests/observations_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/observations_form_html_request.dart new file mode 100644 index 0000000..013110c --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/observations_form_html_request.dart @@ -0,0 +1,48 @@ +class ObservationsFormHtmlReq { + final String heartRate; + final String bloodPressure; + final String respiratoryRate; + final String oxygen; + final String temperature; + final String bloodSugar; + + ObservationsFormHtmlReq({ + required this.heartRate, + required this.bloodPressure, + required this.respiratoryRate, + required this.oxygen, + required this.temperature, + required this.bloodSugar, + }); + + String toHtml() { + return """
+

Heart Rate (BPM): $heartRate

+
+
+

Blood Pressure (/MMHG): $bloodPressure +

+
+
+

Respiratory Rate: $respiratoryRate +

+
+
+

Oxygen (%): $oxygen +

+
+
+

Temperature (˚C): $temperature +

+
+
+

Blood Sugar (MMOL/L): $bloodSugar +

+
+
+ Observation +
"""; + } +} diff --git a/lib/models/clients/careNoteFormsRequests/physical_intervention_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/physical_intervention_form_html_request.dart new file mode 100644 index 0000000..ffc244a --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/physical_intervention_form_html_request.dart @@ -0,0 +1,150 @@ +import 'HtmlTableOption.dart'; + +class PhysicalInterventionFormHtmlRequest { + final String durationOfIncidents; + final String staffDebriefFormNumber; + final String nameOfWitnesses; + final String placeOfIncident; + final String priorToIntervention; + final String pbsFollowed; + final String reasonForPhysicalIntervention; + final String staffInvolvedInPI; + final String conditionOfSU; + final String howSuCalmed; + final List useOfForceNecessary; + final String pleaseExplain; + final String isParentContacted; + final String nameOfParentContacted; + final String parentContactedTime; + final String howParentContacted; + final String parentCarersComments; + final String howFormWasShared; + + PhysicalInterventionFormHtmlRequest({ + required this.durationOfIncidents, + required this.staffDebriefFormNumber, + required this.nameOfWitnesses, + required this.placeOfIncident, + required this.priorToIntervention, + required this.pbsFollowed, + required this.reasonForPhysicalIntervention, + required this.staffInvolvedInPI, + required this.conditionOfSU, + required this.howSuCalmed, + required this.useOfForceNecessary, + required this.pleaseExplain, + required this.isParentContacted, + required this.nameOfParentContacted, + required this.parentContactedTime, + required this.howParentContacted, + required this.parentCarersComments, + required this.howFormWasShared, + }); + + String toHtml() { + String ifParentContactedHtml = (isParentContacted == "Yes") + ? """
+

Name of Parent Contacted + $nameOfParentContacted

+
+
+

Contact time + $parentContactedTime

+
+
+

How parent was contacted + $howParentContacted

+
""" + : ""; + + return """
+

Duration of incident (Mins) + $durationOfIncidents

+
+
+

Staff Debrief Form Number + $staffDebriefFormNumber

+
+
+

Name of witnesses/adults present + $nameOfWitnesses

+
+
+

Place incident occurred + $placeOfIncident

+
+
+

What was used prior to intervention to defuse/deescalate the situation? + $priorToIntervention

+
+
+

Was the PBS followed and was it sufficient enough to manage this incident? + $pbsFollowed

+
+
+

Reason for physical intervention + $reasonForPhysicalIntervention

+
+
+

Staff involved in the physical intervention + $staffInvolvedInPI

+
+
+

Condition of service user following the incident, including breathing monitoring + $conditionOfSU

+
+
+

How was the service user calmed? + $howSuCalmed

+
+
+

Why was the use of force necessary?

+
+
+
+ + + + ${useOfForceNecessary.map((row) { + return """ + + + """; + }).join()} + +
${row.requirements} + ${row.isChecked() ? """ + Tick""" : """Close """} +
+
+
+
+

If ticked "Other" please explain + $pleaseExplain

+
+
+

Parent Contacted + $isParentContacted

+
+ +$ifParentContactedHtml +
+

Parent/carer’s comments + $parentCarersComments

+
+
+

How was this form shared with parents/carers? + $howFormWasShared

+
"""; + } +} diff --git a/lib/models/clients/careNoteFormsRequests/safeguarding_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/safeguarding_form_html_request.dart new file mode 100644 index 0000000..0e82ae2 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/safeguarding_form_html_request.dart @@ -0,0 +1,59 @@ +class SafeguardingFormHtmlRequest { + final String concernsAboutServiceUser; + final String voiceOfTheServiceUser; + final String areThereAnyImmediateRisks; + final String whatActionDoYouFeel; + final String comments; + final String yourName; + final String anyWitnesses; + final String dateTimeReporting; + final String yourNameDslDdsl; + final String actionTaken; + + SafeguardingFormHtmlRequest({ + required this.concernsAboutServiceUser, + required this.voiceOfTheServiceUser, + required this.areThereAnyImmediateRisks, + required this.whatActionDoYouFeel, + required this.comments, + required this.yourName, + required this.anyWitnesses, + required this.dateTimeReporting, + required this.yourNameDslDdsl, + required this.actionTaken, + }); + + String toHtml() { + return """
+

Concerns about the service user: $concernsAboutServiceUser

+
+
+

Voice of the service user: $voiceOfTheServiceUser

+
+
+

Are there any immediate risks: $areThereAnyImmediateRisks

+
+
+

What action do you feel should be taken?: $whatActionDoYouFeel

+
+
+

Comments: $comments

+
+
+

Your Name: $yourName

+
+
+

Any witnesses: $anyWitnesses

+
+
+

Date and time of reporting + $dateTimeReporting

+
+
+

To be completed by DSL/DDSL
Your Name: $yourNameDslDdsl

+
+
+


Action taken: $actionTaken

+
"""; + } +} diff --git a/lib/models/clients/careNoteFormsRequests/showering_and_bath_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/showering_and_bath_form_html_request.dart new file mode 100644 index 0000000..c2b59e2 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/showering_and_bath_form_html_request.dart @@ -0,0 +1,20 @@ +class ShoweringAndBathFormHtmlRequest { + final String showeringBathType; + final String comments; + + ShoweringAndBathFormHtmlRequest({ + required this.showeringBathType, + required this.comments, + }); + + String toHtml() { + return """ +
+

Type: $showeringBathType

+
+
+

Comments: ${comments.isNotEmpty ? comments : "No assistance required"}

+
+ """; + } +} diff --git a/lib/models/clients/careNoteFormsRequests/toileting_form_html_request.dart b/lib/models/clients/careNoteFormsRequests/toileting_form_html_request.dart new file mode 100644 index 0000000..d24a141 --- /dev/null +++ b/lib/models/clients/careNoteFormsRequests/toileting_form_html_request.dart @@ -0,0 +1,25 @@ +class ToiletingFormHtmlRequest { + final bool assistanceRequired; + final String assistanceType; + final String comments; + + ToiletingFormHtmlRequest({ + required this.assistanceRequired, + required this.assistanceType, + required this.comments, + }); + + String toHtml() { + return """ +
+

Was assistance required with toileting? ${assistanceRequired ? "Yes" : "No"}

+
+
+

Assistance type: ${assistanceType.isNotEmpty ? assistanceType : "Handled alone"}

+
+
+

Comments: ${comments.isNotEmpty ? comments : "No assistance required"}

+
+ """; + } +} diff --git a/lib/models/clients/care_note_category.dart b/lib/models/clients/care_note_category.dart new file mode 100644 index 0000000..32e75ca --- /dev/null +++ b/lib/models/clients/care_note_category.dart @@ -0,0 +1,62 @@ +class CareNoteCategory { + CareNoteCategory({ + this.iconPath, + this.category, + this.subcategories, + }); + + CareNoteCategory.fromJson(dynamic json) { + iconPath = json['iconPath']; + category = json['category']; + if (json['subcategories'] != null) { + subcategories = []; + json['subcategories'].forEach((v) { + subcategories?.add(Subcategories.fromJson(v)); + }); + } + } + + String? iconPath; + String? category; + List? subcategories; + + Map toJson() { + final map = {}; + map['iconPath'] = iconPath; + map['category'] = category; + if (subcategories != null) { + map['subcategories'] = subcategories?.map((v) => v.toJson()).toList(); + } + return map; + } +} + +class Subcategories { + Subcategories({ + this.iconPath, + this.name, + this.formType, + this.apiValue, + }); + + Subcategories.fromJson(dynamic json) { + iconPath = json['iconPath']; + name = json['name']; + formType = json['formType']; + apiValue = json['apiValue']; + } + + String? iconPath; + String? name; + String? formType; + String? apiValue; + + Map toJson() { + final map = {}; + map['iconPath'] = iconPath; + map['name'] = name; + map['formType'] = formType; + map['apiValue'] = apiValue; + return map; + } +} diff --git a/lib/models/clients/client_data_model.dart b/lib/models/clients/client_data_model.dart new file mode 100644 index 0000000..23d7023 --- /dev/null +++ b/lib/models/clients/client_data_model.dart @@ -0,0 +1,25 @@ +class ClientDataModel{ + String firstName = ""; + String lastName = ""; + String mobileNo = ""; + String email = ""; + String gender = ""; + DateTime dob = DateTime.now(); + String age = ""; + + ClientDataModel.empty(); + + ClientDataModel.addData( + {required this.firstName, + required this.lastName, + required this.mobileNo, + required this.email, + required this.gender, + required this.dob, + required this.age}); + + @override + String toString() { + return 'ClientDataModel{firstName: $firstName, lastName: $lastName, mobileNo: $mobileNo, email: $email, gender: $gender, dob: $dob, age: $age}'; + } +} \ No newline at end of file diff --git a/lib/models/clients/consent_details_model.dart b/lib/models/clients/consent_details_model.dart new file mode 100644 index 0000000..3f7e072 --- /dev/null +++ b/lib/models/clients/consent_details_model.dart @@ -0,0 +1,34 @@ +class ConsentDetailsModel{ + String id = ""; + String staffId = ""; + bool active = false; + String description = ""; + int v = 0; + DateTime createdAt =DateTime.now(); + DateTime updatedAt =DateTime.now(); + + ConsentDetailsModel.empty(); + ConsentDetailsModel.addData( + {required this.id, + required this.staffId, + required this.active, + required this.description, + required this.v, + required this.createdAt, + required this.updatedAt}); + + ConsentDetailsModel.fromJson(Map json){ + id = json['_id']??""; + staffId = json['staffId']??""; + active = json['active']??false; + description = json['description']??""; + v = json['__v']??-1; + createdAt = DateTime.tryParse(json['createdAt'])??DateTime.now(); + updatedAt = DateTime.tryParse(json['updatedAt'])??DateTime.now(); + } + + @override + String toString() { + return 'ConsentDetailsModel{id: $id, staffId: $staffId, active: $active, description: $description, v: $v, createdAt: $createdAt, updatedAt: $updatedAt}'; + } +} \ No newline at end of file diff --git a/lib/models/clients/documents_list_model.dart b/lib/models/clients/documents_list_model.dart new file mode 100644 index 0000000..e4ad95d --- /dev/null +++ b/lib/models/clients/documents_list_model.dart @@ -0,0 +1,338 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; + +class DocumentsListModel { + DocumentsListModel({ + required this.documentList, + required this.count, + required this.offset, + required this.limit, + }); + + List documentList = []; + int count = -1; + int offset = -1; + int limit = -1; + + DocumentsListModel.empty(); + + DocumentsListModel.fromJson(Map json) { + documentList = List.from(json['documentList'] ?? []) + .map((e) => DocumentModel.fromJson(e)) + .toList(); + count = json['count'] ?? -1; + offset = json['offset'] ?? -1; + limit = json['limit'] ?? -1; + } + + Map toJson() { + final data = {}; + data['documentList'] = documentList.map((e) => e.toJson()).toList(); + data['count'] = count; + data['offset'] = offset; + data['limit'] = limit; + return data; + } +} + +class DocumentModel { + DocumentModel({ + required this.id, + required this.docPath, + required this.details, + required this.title, + required this.userId, + required this.addedBy, + required this.createdAt, + required this.updatedAt, + }); + + String id = ""; + String docPath = ""; + String details = ""; + String title = ""; + UserData? userId; + UserData? addedBy; + String createdAt = ""; + String updatedAt = ""; + + DocumentModel.empty(); + + DocumentModel.fromJson(Map json) { + id = json['_id'] ?? ""; + docPath = json['docPath'] ?? ""; + details = json['details'] ?? ""; + title = json['title'] ?? ""; + userId = json['userId'] is Map ? UserData.fromJson(json['userId']) : null; + addedBy = + json['addedBy'] is Map ? UserData.fromJson(json['addedBy']) : null; + createdAt = json['createdAt'] ?? ""; + updatedAt = json['updatedAt'] ?? ""; + } + + Map toJson() { + final data = {}; + data['_id'] = id; + data['docPath'] = docPath; + data['details'] = details; + data['title'] = title; + data['userId'] = userId; + data['addedBy'] = addedBy; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + return data; + } +} + +// class UserId { +// UserId({ +// required this.fcmTokens, +// required this.location, +// required this.id, +// required this.userModelName, +// required this.name, +// required this.version, +// required this.email, +// required this.phoneNumber, +// required this.active, +// required this.role, +// required this.profilePictureUrl, +// required this.deviceId, +// required this.verificationCode, +// required this.isVerified, +// required this.approved, +// required this.blocked, +// required this.createdAt, +// required this.updatedAt, +// required this.V, +// required this.password, +// required this.userSettings, +// required this.modelId, +// }); +// +// Location location = Location.empty(); +// String id = ""; +// String userModelName = ""; +// String name = ""; +// String version = ""; +// String email = ""; +// String phoneNumber = ""; +// bool active = false; +// String role = ""; +// String profilePictureUrl = ""; +// String deviceId = ""; +// String verificationCode = ""; +// bool isVerified = false; +// bool approved = false; +// bool blocked = false; +// String createdAt = ""; +// String updatedAt = ""; +// int V = -1; +// String password = ""; +// String userSettings = ""; +// String modelId = ""; +// +// UserId.empty(); +// +// UserId.fromJson(Map json) { +// location = Location.fromJson(json['location'] ?? {}); +// id = json['_id'] ?? ""; +// userModelName = json['userModelName'] ?? ""; +// name = json['name'] ?? ""; +// version = json['version'] ?? ""; +// email = json['email'] ?? ""; +// phoneNumber = json['phoneNumber'] ?? ""; +// active = json['active'] ?? false; +// role = json['role'] ?? ""; +// profilePictureUrl = json['profile_picture_url'] ?? ""; +// deviceId = json['deviceId'] ?? ""; +// verificationCode = json['verification_code'] ?? ""; +// isVerified = json['is_verified'] ?? false; +// approved = json['approved'] ?? false; +// blocked = json['blocked'] ?? false; +// createdAt = json['createdAt'] ?? ""; +// updatedAt = json['updatedAt'] ?? ""; +// V = json['__v'] ?? -1; +// password = json['password'] ?? ""; +// userSettings = json['userSettings'] ?? ""; +// modelId = json['modelId'] ?? ""; +// } +// +// Map toJson() { +// final data = {}; +// data['fcm_tokens'] = fcmTokens.toJson(); +// data['location'] = location.toJson(); +// data['_id'] = id; +// data['userModelName'] = userModelName; +// data['name'] = name; +// data['version'] = version; +// data['email'] = email; +// data['phoneNumber'] = phoneNumber; +// data['active'] = active; +// data['role'] = role; +// data['profile_picture_url'] = profilePictureUrl; +// data['deviceId'] = deviceId; +// data['verification_code'] = verificationCode; +// data['is_verified'] = isVerified; +// data['approved'] = approved; +// data['blocked'] = blocked; +// data['createdAt'] = createdAt; +// data['updatedAt'] = updatedAt; +// data['__v'] = V; +// data['password'] = password; +// data['userSettings'] = userSettings; +// data['modelId'] = modelId; +// return data; +// } +// } +// +// class FcmTokens { +// FcmTokens({ +// required this.token, +// required this.deviceType, +// }); +// +// String token = ""; +// String deviceType = ""; +// +// FcmTokens.empty(); +// +// FcmTokens.fromJson(Map json) { +// token = json['token'] ?? ""; +// deviceType = json['deviceType'] ?? ""; +// } +// +// Map toJson() { +// final data = {}; +// data['token'] = token; +// data['deviceType'] = deviceType; +// return data; +// } +// } +// +// class Location { +// Location({ +// required this.type, +// required this.coordinates, +// }); +// +// String type = ""; +// List coordinates = []; +// +// Location.empty(); +// +// Location.fromJson(Map json) { +// type = json['type'] ?? ""; +// coordinates = List.castFrom(json['coordinates'] ?? []); +// } +// +// Map toJson() { +// final data = {}; +// data['type'] = type; +// data['coordinates'] = coordinates; +// return data; +// } +// } +// +// class AddedBy { +// AddedBy({ +// required this.fcmTokens, +// required this.location, +// required this.id, +// required this.userModelName, +// required this.name, +// required this.version, +// required this.email, +// required this.phoneNumber, +// required this.active, +// required this.role, +// required this.profilePictureUrl, +// required this.deviceId, +// required this.verificationCode, +// required this.isVerified, +// required this.approved, +// required this.blocked, +// required this.createdAt, +// required this.updatedAt, +// required this.V, +// required this.password, +// required this.userSettings, +// required this.modelId, +// }); +// +// FcmTokens fcmTokens = FcmTokens.empty(); +// Location location = Location.empty(); +// String id = ""; +// String userModelName = ""; +// String name = ""; +// String version = ""; +// String email = ""; +// String phoneNumber = ""; +// bool active = 0 == 1; +// String role = ""; +// String profilePictureUrl = ""; +// String deviceId = ""; +// String verificationCode = ""; +// bool isVerified = 1 == 0; +// bool approved = 1 == 0; +// bool blocked = 1 == 0; +// String createdAt = ""; +// String updatedAt = ""; +// int V = 1; +// String password = ""; +// String userSettings = ""; +// String modelId = ""; +// +// AddedBy.empty(); +// +// AddedBy.fromJson(Map json) { +// fcmTokens = FcmTokens.fromJson(json['fcm_tokens'] ?? FcmTokens.empty()); +// location = Location.fromJson(json['location'] ?? Location.empty()); +// id = json['_id'] ?? ""; +// userModelName = json['userModelName'] ?? ""; +// name = json['name'] ?? ""; +// version = json['version'] ?? ""; +// email = json['email'] ?? ""; +// phoneNumber = json['phoneNumber'] ?? ""; +// active = json['active'] ?? false; +// role = json['role'] ?? ""; +// profilePictureUrl = json['profile_picture_url'] ?? ""; +// deviceId = json['deviceId'] ?? ""; +// verificationCode = json['verification_code'] ?? ""; +// isVerified = json['is_verified'] ?? false; +// approved = json['approved'] ?? false; +// blocked = json['blocked'] ?? false; +// createdAt = json['createdAt'] ?? ""; +// updatedAt = json['updatedAt'] ?? ""; +// V = json['__v'] ?? -1; +// password = json['password'] ?? ""; +// userSettings = json['userSettings'] ?? ""; +// modelId = json['modelId'] ?? ""; +// } +// +// Map toJson() { +// final data = {}; +// data['fcm_tokens'] = fcmTokens.toJson(); +// data['location'] = location.toJson(); +// data['_id'] = id; +// data['userModelName'] = userModelName; +// data['name'] = name; +// data['version'] = version; +// data['email'] = email; +// data['phoneNumber'] = phoneNumber; +// data['active'] = active; +// data['role'] = role; +// data['profile_picture_url'] = profilePictureUrl; +// data['deviceId'] = deviceId; +// data['verification_code'] = verificationCode; +// data['is_verified'] = isVerified; +// data['approved'] = approved; +// data['blocked'] = blocked; +// data['createdAt'] = createdAt; +// data['updatedAt'] = updatedAt; +// data['__v'] = V; +// data['password'] = password; +// data['userSettings'] = userSettings; +// data['modelId'] = modelId; +// return data; +// } +// } diff --git a/lib/models/clients/memoryListResponse/MemoryListData.dart b/lib/models/clients/memoryListResponse/MemoryListData.dart new file mode 100644 index 0000000..730a355 --- /dev/null +++ b/lib/models/clients/memoryListResponse/MemoryListData.dart @@ -0,0 +1,52 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; + +class MemoryListData { + MemoryListData({ + this.addedBy, + this.userId, + this.note, + this.filePath, + this.isDeleted, + this.createdAt, + this.updatedAt, + this.id, + }); + + MemoryListData.fromJson(dynamic json) { + id = json['_id']; + addedBy = + json['addedBy'] != null ? UserData.fromJson(json['addedBy']) : null; + userId = json['userId'] != null ? UserData.fromJson(json['userId']) : null; + note = json['note']; + filePath = json['filePath']; + isDeleted = json['isDeleted']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + } + + String? id; + UserData? addedBy; + UserData? userId; + String? note; + String? filePath; + bool? isDeleted; + String? createdAt; + String? updatedAt; + + Map toJson() { + final map = {}; + map['_id'] = id; + if (addedBy != null) { + map['addedBy'] = addedBy?.toJson(); + } + if (userId != null) { + map['userId'] = userId?.toJson(); + } + map['note'] = note; + map['filePath'] = filePath; + map['isDeleted'] = isDeleted; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + return map; + } +} diff --git a/lib/models/clients/memoryListResponse/MemoryListResponse.dart b/lib/models/clients/memoryListResponse/MemoryListResponse.dart new file mode 100644 index 0000000..5c24b68 --- /dev/null +++ b/lib/models/clients/memoryListResponse/MemoryListResponse.dart @@ -0,0 +1,30 @@ +import 'MemoryListResponseData.dart'; + +class MemoryListResponse { + MemoryListResponse({ + this.success, + this.status, + this.message, + this.data,}); + + MemoryListResponse.fromJson(dynamic json) { + status = json['status']; + message = json['message']; + data = json['data'] != null ? MemoryListResponseData.fromJson(json['data']) : null; + } + bool? success; + String? status; + String? message; + MemoryListResponseData? data; + + Map toJson() { + final map = {}; + map['status'] = status; + map['message'] = message; + if (data != null) { + map['data'] = data?.toJson(); + } + return map; + } + +} \ No newline at end of file diff --git a/lib/models/clients/memoryListResponse/MemoryListResponseData.dart b/lib/models/clients/memoryListResponse/MemoryListResponseData.dart new file mode 100644 index 0000000..c0391ea --- /dev/null +++ b/lib/models/clients/memoryListResponse/MemoryListResponseData.dart @@ -0,0 +1,38 @@ +import 'MemoryListData.dart'; + +class MemoryListResponseData { + MemoryListResponseData({ + this.list, + this.count, + this.offset, + this.limit, + }); + + MemoryListResponseData.fromJson(dynamic json) { + if (json['list'] != null) { + list = []; + json['list'].forEach((v) { + list?.add(MemoryListData.fromJson(v)); + }); + } + count = json['count']; + offset = json['offset']; + limit = json['limit']; + } + + List? list; + int? count; + int? offset; + int? limit; + + Map toJson() { + final map = {}; + if (list != null) { + map['list'] = list?.map((v) => v.toJson()).toList(); + } + map['count'] = count; + map['offset'] = offset; + map['limit'] = limit; + return map; + } +} diff --git a/lib/models/clients/recent_incidents_model.dart b/lib/models/clients/recent_incidents_model.dart new file mode 100644 index 0000000..967bd26 --- /dev/null +++ b/lib/models/clients/recent_incidents_model.dart @@ -0,0 +1,48 @@ +import 'package:quill_html_editor/quill_html_editor.dart'; + +class RecentIncidentsModel{ + String incidentTitle = ""; + String incidentId = ""; + String userId = ""; + String note = ""; + int incidentDate = 0; + bool active = false; + String createdAt = ""; + String updatedAt = ""; + int v = 0; + QuillEditorController quillController = QuillEditorController(); + + RecentIncidentsModel.empty(); + + RecentIncidentsModel.fromJson(Map json){ + incidentId = json['_id']??""; + userId = json['userId']??""; + note = json['note']??""; + incidentDate = json['incidentDate']??0; + active = json['active']??false; + createdAt = json['createdAt']??""; + updatedAt = json['updatedAt']??""; + incidentTitle = json['incidentTitle']??""; + v = json['__v']??0; + } + + Map toJson(){ + Map json = { + '_id' : incidentId, + 'userId' : userId, + 'note' : note, + 'incidentDate' : incidentDate, + 'active' : active, + 'createdAt' : createdAt, + 'updatedAt' : updatedAt, + 'incidentTitle' : incidentTitle, + '__v' : v, + }; + return json; + } + + @override + String toString() { + return 'RecentIncidentsModel{incidentId: $incidentId, userId: $userId, note: $note, incidentDate: $incidentDate, active: $active, createdAt: $createdAt, updatedAt: $updatedAt, v: $v}'; + } +} \ No newline at end of file diff --git a/lib/models/clients/riskAssessmentResponse/GetRiskAssessmentResponse.dart b/lib/models/clients/riskAssessmentResponse/GetRiskAssessmentResponse.dart new file mode 100644 index 0000000..7edf746 --- /dev/null +++ b/lib/models/clients/riskAssessmentResponse/GetRiskAssessmentResponse.dart @@ -0,0 +1,35 @@ +import 'RiskAssessmentData.dart'; + +class GetRiskAssessmentResponse { + GetRiskAssessmentResponse({ + this.success, + this.status, + this.message, + this.data,}); + + GetRiskAssessmentResponse.fromJson(dynamic json) { + status = json['status']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data?.add(RiskAssessmentData.fromJson(v)); + }); + } + } + bool? success; + String? status; + String? message; + List? data; + + Map toJson() { + final map = {}; + map['status'] = status; + map['message'] = message; + if (data != null) { + map['data'] = data?.map((v) => v.toJson()).toList(); + } + return map; + } + +} \ No newline at end of file diff --git a/lib/models/clients/riskAssessmentResponse/InPlace.dart b/lib/models/clients/riskAssessmentResponse/InPlace.dart new file mode 100644 index 0000000..d5f3048 --- /dev/null +++ b/lib/models/clients/riskAssessmentResponse/InPlace.dart @@ -0,0 +1,20 @@ +class InPlace { + InPlace({ + this.y, + this.n,}); + + InPlace.fromJson(dynamic json) { + y = json['y']; + n = json['n']; + } + int? y; + int? n; + + Map toJson() { + final map = {}; + map['y'] = y; + map['n'] = n; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/clients/riskAssessmentResponse/PureRiskRating.dart b/lib/models/clients/riskAssessmentResponse/PureRiskRating.dart new file mode 100644 index 0000000..268e237 --- /dev/null +++ b/lib/models/clients/riskAssessmentResponse/PureRiskRating.dart @@ -0,0 +1,24 @@ +class PureRiskRating { + PureRiskRating({ + this.c, + this.l, + this.r,}); + + PureRiskRating.fromJson(dynamic json) { + c = json['c']; + l = json['l']; + r = json['r']; + } + int? c; + int? l; + int? r; + + Map toJson() { + final map = {}; + map['c'] = c; + map['l'] = l; + map['r'] = r; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/clients/riskAssessmentResponse/ResidualRiskRating.dart b/lib/models/clients/riskAssessmentResponse/ResidualRiskRating.dart new file mode 100644 index 0000000..de26291 --- /dev/null +++ b/lib/models/clients/riskAssessmentResponse/ResidualRiskRating.dart @@ -0,0 +1,24 @@ +class ResidualRiskRating { + ResidualRiskRating({ + this.c, + this.l, + this.r,}); + + ResidualRiskRating.fromJson(dynamic json) { + c = json['c']; + l = json['l']; + r = json['r']; + } + int? c; + int? l; + int? r; + + Map toJson() { + final map = {}; + map['c'] = c; + map['l'] = l; + map['r'] = r; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/clients/riskAssessmentResponse/RiskAssessmentData.dart b/lib/models/clients/riskAssessmentResponse/RiskAssessmentData.dart new file mode 100644 index 0000000..a39cd76 --- /dev/null +++ b/lib/models/clients/riskAssessmentResponse/RiskAssessmentData.dart @@ -0,0 +1,72 @@ +import 'PureRiskRating.dart'; +import 'InPlace.dart'; +import 'ResidualRiskRating.dart'; + +class RiskAssessmentData { + RiskAssessmentData({ + this.pureRiskRating, + this.inPlace, + this.residualRiskRating, + this.id, + this.hazard, + this.personsExposedToHazard, + this.riskIdentified, + this.coldMeasureRequired, + this.userId, + this.createdAt, + this.updatedAt, + }); + + RiskAssessmentData.fromJson(dynamic json) { + pureRiskRating = json['pureRiskRating'] != null + ? PureRiskRating.fromJson(json['pureRiskRating']) + : null; + inPlace = + json['inPlace'] != null ? InPlace.fromJson(json['inPlace']) : null; + residualRiskRating = json['residualRiskRating'] != null + ? ResidualRiskRating.fromJson(json['residualRiskRating']) + : null; + id = json['_id']; + hazard = json['hazard']; + personsExposedToHazard = json['personsExposedToHazard']; + riskIdentified = json['riskIdentified']; + coldMeasureRequired = json['coldMeasureRequired']; + userId = json['userId']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + } + + PureRiskRating? pureRiskRating; + InPlace? inPlace; + ResidualRiskRating? residualRiskRating; + String? id; + String? hazard; + String? personsExposedToHazard; + String? riskIdentified; + String? coldMeasureRequired; + String? userId; + String? createdAt; + String? updatedAt; + + Map toJson() { + final map = {}; + if (pureRiskRating != null) { + map['pureRiskRating'] = pureRiskRating?.toJson(); + } + if (inPlace != null) { + map['inPlace'] = inPlace?.toJson(); + } + if (residualRiskRating != null) { + map['residualRiskRating'] = residualRiskRating?.toJson(); + } + map['_id'] = id; + map['hazard'] = hazard; + map['personsExposedToHazard'] = personsExposedToHazard; + map['riskIdentified'] = riskIdentified; + map['coldMeasureRequired'] = coldMeasureRequired; + map['userId'] = userId; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + return map; + } +} diff --git a/lib/models/clients/service_users_model.dart b/lib/models/clients/service_users_model.dart new file mode 100644 index 0000000..6c60a56 --- /dev/null +++ b/lib/models/clients/service_users_model.dart @@ -0,0 +1,350 @@ +class ServiceUserModel { + AboutPatient aboutPatient = AboutPatient.empty(); + String id = ""; + String suLastName = ""; + String suFirstMiddleName = ""; + String suPreferredName = ""; + String name = ""; + String suSsn = ""; + String providerName = ""; + String suSex = ""; + String suTitle = ""; + DateTime suDob = DateTime.now(); + String suAge = ""; + String suReferredBy = ""; + String suFamilyHead = ""; + String suAddress1 = ""; + String suAddress2 = ""; + String suCity = ""; + String suState = ""; + String suZip = ""; + DateTime suFirstVisitDate = DateTime.now(); + DateTime suLastVisitDate = DateTime.now(); + List suProvider = []; + bool currSu = false; + String suHomePhone = ""; + String suWorkPhone = ""; + String suMobileHomeNo = ""; + String suMobileWorkNo = ""; + String suEmailHome = ""; + String suEmailWork = ""; + String suPrefHomeNo = ""; + String suPrefWorkNo = ""; + String suEmergencyContact = ""; + String seMedicalAlert = ""; + String suNote = ""; + List diagnosises = []; + String user = ""; + List shifts = []; + List serviceUserMedications = []; + List homeVisitSignOut = []; + List srUsShiftsRequired = []; + List suEnquiries = []; + bool active = false; + DateTime createdAt = DateTime.now(); + DateTime updatedAt = DateTime.now(); + int v = 0; + + ServiceUserModel({ + required this.aboutPatient, + required this.id, + required this.suLastName, + required this.suFirstMiddleName, + required this.suPreferredName, + required this.name, + required this.suSsn, + required this.providerName, + required this.suSex, + required this.suTitle, + required this.suDob, + required this.suAge, + required this.suReferredBy, + required this.suFamilyHead, + required this.suAddress1, + required this.suAddress2, + required this.suCity, + required this.suState, + required this.suZip, + required this.suFirstVisitDate, + required this.suLastVisitDate, + required this.suProvider, + required this.currSu, + required this.suHomePhone, + required this.suWorkPhone, + required this.suMobileHomeNo, + required this.suMobileWorkNo, + required this.suEmailHome, + required this.suEmailWork, + required this.suPrefHomeNo, + required this.suPrefWorkNo, + required this.suEmergencyContact, + required this.seMedicalAlert, + required this.suNote, + required this.diagnosises, + required this.user, + required this.shifts, + required this.serviceUserMedications, + required this.homeVisitSignOut, + required this.srUsShiftsRequired, + required this.suEnquiries, + required this.active, + required this.createdAt, + required this.updatedAt, + required this.v, + }); + + String get phoneNo { + if (suMobileWorkNo.isNotEmpty) { + return suMobileWorkNo; + } else if (suMobileHomeNo.isNotEmpty) { + return suMobileHomeNo; + } else if (suEmergencyContact.isNotEmpty) { + return suEmergencyContact; + } else if (suPrefHomeNo.isNotEmpty) { + return suPrefHomeNo; + } else if (suPrefWorkNo.isNotEmpty) { + return suPrefWorkNo; + } else if (suWorkPhone.isNotEmpty) { + return suWorkPhone; + } else if (suHomePhone.isNotEmpty) { + return suHomePhone; + } + return "000000000000"; + } + + String get nameOfUser { + if (suFirstMiddleName.isNotEmpty) { + return suFirstMiddleName; + } else if (suLastName.isNotEmpty) { + return suLastName; + } else if (suPreferredName.isNotEmpty) { + return suPreferredName; + } else if (name.isNotEmpty) { + return name; + } + return "Name"; + } + + String get homeAddress { + if (suAddress1.isNotEmpty) { + return suAddress1; + } else if (suAddress2.isNotEmpty) { + return suAddress2; + } + return "Address"; + } + + ServiceUserModel.empty(); + + ServiceUserModel.fromJson(Map json) { + aboutPatient = json['aboutPatient'] != null + ? AboutPatient.fromJson(json['aboutPatient']) + : AboutPatient.empty(); + id = json['_id'] ?? ""; + suLastName = json['suLastName'] ?? ""; + suFirstMiddleName = json['suFirstMiddleName'] ?? ""; + suPreferredName = json['suPreferredName'] ?? ""; + name = json['name'] ?? ""; + suSsn = json['suSsn'] ?? ""; + providerName = json['providerName'] ?? ""; + suSex = json['suSex'] ?? ""; + suTitle = json['suTitle'] ?? ""; + suDob = json['suDOB'] != null + ? DateTime.parse(json['suDOB']).toLocal() + : DateTime.now(); + suAge = json['suAge'] ?? ''; + suReferredBy = json['suReferredBY'] ?? ""; + suFamilyHead = json['suFamilyHead'] ?? ""; + suAddress1 = json['suAddress1'] ?? ""; + suAddress2 = json['suAddress2'] ?? ""; + suCity = json['suCity'] ?? ""; + suState = json['suState'] ?? ""; + suZip = json['suZip'] ?? ""; + suFirstVisitDate = json['suFirstVisitDate'] != null + ? DateTime.parse(json['suFirstVisitDate']).toLocal() + : DateTime.now(); + suLastVisitDate = json['suLastVisitDate'] != null + ? DateTime.parse(json['suLastVisitDate']).toLocal() + : DateTime.now(); + if (json['suProvider'] != null) { + suProvider = []; + json['suProvider'].forEach((v) { + suProvider.add(v); + }); + } + currSu = json['currSU'] ?? false; + suHomePhone = json['suHomePhone'] ?? ''; + suWorkPhone = json['suWorkPhone'] ?? ''; + suMobileHomeNo = json['suMobileHomeNo'] ?? ''; + suMobileWorkNo = json['suMobileWorkNo'] ?? ''; + suEmailHome = json['suEmailHome'] ?? ''; + suEmailWork = json['suEmailWork'] ?? ''; + suPrefHomeNo = json['suPrefHomeNo'] ?? ''; + suPrefWorkNo = json['suPrefWorkNo'] ?? ''; + suEmergencyContact = json['suEmergencyContact'] ?? ''; + seMedicalAlert = json['seMedicalAlert'] ?? ''; + suNote = json['suNote'] ?? ''; + if (json['diagnosises'] != null) { + diagnosises = []; + json['diagnosises'].forEach((v) { + diagnosises.add(Diagnosise.fromJson(v)); + }); + } + user = json['user'] ?? ""; + if (json['shifts'] != null) { + shifts = []; + json['shifts'].forEach((v) { + shifts.add(v); + }); + } + if (json['serviceUserMedications'] != null) { + serviceUserMedications = []; + json['serviceUserMedications'].forEach((v) { + serviceUserMedications.add(v); + }); + } + if (json['homeVisitSignOut'] != null) { + homeVisitSignOut = []; + json['homeVisitSignOut'].forEach((v) { + homeVisitSignOut.add(v); + }); + } + if (json['srUsShiftsRequired'] != null) { + srUsShiftsRequired = []; + json['srUsShiftsRequired'].forEach((v) { + srUsShiftsRequired.add(v); + }); + } + if (json['suEnquiries'] != null) { + suEnquiries = []; + json['suEnquiries'].forEach((v) { + suEnquiries.add(v); + }); + } + active = json['active'] ?? false; + createdAt = json['createdAt'] != null + ? DateTime.parse(json['createdAt']).toLocal() + : DateTime.now(); + updatedAt = json['updatedAt'] != null + ? DateTime.parse(json['updatedAt']).toLocal() + : DateTime.now(); + v = json['__v'] ?? 0; + } + + Map toJson() { + final Map data = {}; + // data['aboutPatient'] = this.aboutPatient.toJson(); + data['_id'] = id; + data['suLastName'] = suLastName; + data['suFirstMiddleName'] = suFirstMiddleName; + data['suPreferredName'] = suPreferredName; + data['name'] = name; + data['suSsn'] = suSsn; + data['providerName'] = providerName; + data['suSex'] = suSex; + data['suTitle'] = suTitle; + data['suDOB'] = suDob; + data['suAge'] = suAge; + data['suReferredBY'] = suReferredBy; + data['suFamilyHead'] = suFamilyHead; + data['suAddress1'] = suAddress1; + data['suAddress2'] = suAddress2; + data['suCity'] = suCity; + data['suState'] = suState; + data['suZip'] = suZip; + data['suFirstVisitDate'] = suFirstVisitDate; + data['suLastVisitDate'] = suLastVisitDate; + data['suProvider'] = suProvider.map((v) => v.toJson()).toList(); + data['currSU'] = currSu; + data['suHomePhone'] = suHomePhone; + data['suWorkPhone'] = suWorkPhone; + data['suMobileHomeNo'] = suMobileHomeNo; + data['suMobileWorkNo'] = suMobileWorkNo; + data['suEmailHome'] = suEmailHome; + data['suEmailWork'] = suEmailWork; + data['suPrefHomeNo'] = suPrefHomeNo; + data['suPrefWorkNo'] = suPrefWorkNo; + data['suEmergencyContact'] = suEmergencyContact; + data['seMedicalAlert'] = seMedicalAlert; + data['suNote'] = suNote; + // data['diagnosises'] = this.diagnosises.map((v) => v.toJson()).toList(); + data['user'] = user; + data['shifts'] = shifts.map((v) => v.toJson()).toList(); + data['serviceUserMedications'] = + serviceUserMedications.map((v) => v.toJson()).toList(); + data['homeVisitSignOut'] = homeVisitSignOut.map((v) => v.toJson()).toList(); + data['srUsShiftsRequired'] = + srUsShiftsRequired.map((v) => v.toJson()).toList(); + data['suEnquiries'] = suEnquiries.map((v) => v.toJson()).toList(); + data['active'] = active; + data['createdAt'] = createdAt; + data['updatedAt'] = updatedAt; + data['__v'] = v; + return data; + } + + @override + String toString() { + return 'ServiceUserModel{aboutPatient: $aboutPatient, id: $id, suLastName: $suLastName, suFirstMiddleName: $suFirstMiddleName, suPreferredName: $suPreferredName, name: $name, suSsn: $suSsn, providerName: $providerName, suSex: $suSex, suTitle: $suTitle, suDob: $suDob, suAge: $suAge, suReferredBy: $suReferredBy, suFamilyHead: $suFamilyHead, suAddress1: $suAddress1, suAddress2: $suAddress2, suCity: $suCity, suState: $suState, suZip: $suZip, suFirstVisitDate: $suFirstVisitDate, suLastVisitDate: $suLastVisitDate, suProvider: $suProvider, currSu: $currSu, suHomePhone: $suHomePhone, suWorkPhone: $suWorkPhone, suMobileHomeNo: $suMobileHomeNo, suMobileWorkNo: $suMobileWorkNo, suEmailHome: $suEmailHome, suEmailWork: $suEmailWork, suPrefHomeNo: $suPrefHomeNo, suPrefWorkNo: $suPrefWorkNo, suEmergencyContact: $suEmergencyContact, seMedicalAlert: $seMedicalAlert, suNote: $suNote, diagnosises: $diagnosises, user: $user, shifts: $shifts, serviceUserMedications: $serviceUserMedications, homeVisitSignOut: $homeVisitSignOut, srUsShiftsRequired: $srUsShiftsRequired, suEnquiries: $suEnquiries, active: $active, createdAt: $createdAt, updatedAt: $updatedAt, v: $v}'; + } +} + +class AboutPatient { + String aboutText = ""; + DateTime aboutDate = DateTime.now(); + String aboutBy = ""; + + AboutPatient({ + required this.aboutText, + required this.aboutDate, + required this.aboutBy, + }); + + AboutPatient.empty(); + + AboutPatient.fromJson(Map json) { + aboutText = json['aboutText'] ?? ""; + aboutDate = json['aboutDate'] != null + ? DateTime.parse(json['aboutDate']).toLocal() + : DateTime.now(); + aboutBy = json['aboutBy'] ?? ""; + } + + @override + String toString() { + return 'AboutPatient{aboutText: $aboutText, aboutDate: $aboutDate, aboutBy: $aboutBy}'; + } +} + +class Diagnosise { + String diagnosisText = ""; + DateTime diagnosisDate = DateTime.now(); + String diagnosisBy = ""; + bool isCurrentDiagnosis = false; + String id = ""; + + Diagnosise({ + required this.diagnosisText, + required this.diagnosisDate, + required this.diagnosisBy, + required this.isCurrentDiagnosis, + required this.id, + }); + + Diagnosise.empty(); + + Diagnosise.fromJson(Map json) { + diagnosisText = json['diagnosisText'] ?? ""; + diagnosisDate = json['diagnosisDate'] != null + ? DateTime.parse(json['diagnosisDate']).toLocal() + : DateTime.now(); + diagnosisBy = json['diagnosisBy'] ?? ""; + isCurrentDiagnosis = json['isCurrentDiagnosis'] ?? false; + id = json['_id'] ?? ""; + } + + @override + String toString() { + return 'Diagnosise{diagnosisText: $diagnosisText, diagnosisDate: $diagnosisDate, diagnosisBy: $diagnosisBy, isCurrentDiagnosis: $isCurrentDiagnosis, id: $id}'; + } +} diff --git a/lib/models/create_care_plan_request.dart b/lib/models/create_care_plan_request.dart new file mode 100644 index 0000000..c02626e --- /dev/null +++ b/lib/models/create_care_plan_request.dart @@ -0,0 +1,105 @@ +class CreateCarePlanRequest { + CreateCarePlanRequest({ + this.eventDateTime, + this.userId, + this.addedby, + this.noteDetails, + this.noteType, + this.title, + this.flag, + this.isHTML, + this.healthNote, + this.category, + this.complaint, + this.moodRating, + }); + + int? eventDateTime; + String? userId; + String? addedby; + String? noteDetails; + String? noteType; + String? title; + bool? flag; + bool? isHTML; + String? healthNote; + String? category; + String? complaint; + String? moodRating; + + //------------------------------------- + Map toJson() { + final map = {}; + if (eventDateTime != null) map['eventDateTime'] = eventDateTime; + if (userId != null) map['userId'] = userId; + if (addedby != null) map['addedby'] = addedby; + if (noteDetails != null) map['noteDetails'] = noteDetails; + if (noteType != null) map['noteType'] = noteType; + if (title != null) map['title'] = title; + map['flag'] = flag ?? false; + map['isHTML'] = isHTML ?? false; + if (healthNote != null) map['healthNote'] = healthNote; + if (category != null) map['category'] = category; + if (complaint != null) map['complaint'] = complaint; + if (moodRating != null) map['moodRating'] = moodRating; + return map; + } + + static String heightWeightHtmlReq( + String height, String weight, String comments) { + return """
+

Height - (CM): $height

+
+
+

Weight - (KG): $weight

+
+
+

Comments: $comments

+
"""; + } + + static String injuryHealthIssueHtmlReq({ + required String nameOfWitnesses, + required String placeOfAccident, + required String accidentDescription, + required String recordOfInjury, + required String conditionOfPatient, + required String isParentContacted, + String? howParentContacted, + String? nameOfParentContacted, + String? parentContactedTime, + }) { + String ifParentContactedHtml = (isParentContacted == "Yes") + ? """
+

If Yes how parent was contacted?: $howParentContacted

+
+
+

Name of Parent Contacted: + $nameOfParentContacted
+ Contacted at: + $parentContactedTime +

+
""" + : ""; + + return """
+

Name of witnesses/adults present: $nameOfWitnesses

+
+
+

Place accident occured: $placeOfAccident

+
+
+

Description how the accident occured: $accidentDescription

+
+
+

Record of any injury and action taken: $recordOfInjury

+
+
+

Condition of the patient following of the accident: $conditionOfPatient

+
+
+

Parent Contacted: $isParentContacted

+
$ifParentContactedHtml + """; + } +} diff --git a/lib/models/export_models.dart b/lib/models/export_models.dart new file mode 100644 index 0000000..22fb0a1 --- /dev/null +++ b/lib/models/export_models.dart @@ -0,0 +1,6 @@ +export 'response_model.dart'; +export 'mark_dates_model.dart'; +export 'rota_shift_model.dart'; +export 'holiday_model.dart'; +export 'user_model.dart'; +export 'messages_list_model.dart'; \ No newline at end of file diff --git a/lib/models/holiday_model.dart b/lib/models/holiday_model.dart new file mode 100644 index 0000000..e2ad05a --- /dev/null +++ b/lib/models/holiday_model.dart @@ -0,0 +1,21 @@ +class HolidayModel{ + + String carriedOver = ""; + String holidayEntitlement = ""; + String holidayAllowance = ""; + String remainingHolidays = ""; + String timeLeftBeforeYearEnd = ""; + + HolidayModel({ + required this.carriedOver, + required this.holidayEntitlement, + required this.holidayAllowance, + required this.remainingHolidays, + required this.timeLeftBeforeYearEnd, + }); + + @override + String toString() { + return 'HolidayModel{carriedOver: $carriedOver, holidayEntitlement: $holidayEntitlement, holidayAllowance: $holidayAllowance, remainingHolidays: $remainingHolidays, timeLeftBeforeYearEnd: $timeLeftBeforeYearEnd}'; + } +} \ No newline at end of file diff --git a/lib/models/mark_dates_model.dart b/lib/models/mark_dates_model.dart new file mode 100644 index 0000000..b25af86 --- /dev/null +++ b/lib/models/mark_dates_model.dart @@ -0,0 +1,13 @@ +class MarkDatesModel{ + DateTime date = DateTime.now(); + String title = "title"; + + MarkDatesModel.empty(); + + MarkDatesModel.addDate({required this.date,required this.title}); + + @override + String toString() { + return 'MarkDatesModel{date: $date, title: $title}'; + } +} \ No newline at end of file diff --git a/lib/models/messages_list_model.dart b/lib/models/messages_list_model.dart new file mode 100644 index 0000000..2b8f389 --- /dev/null +++ b/lib/models/messages_list_model.dart @@ -0,0 +1,43 @@ +import 'package:ftc_mobile_app/view/screens/chat/arguments/group_data_args.dart'; + +class MessagesListModel { + String otherUserId = ""; + String image = ""; + String title = ""; + String previewOfLastMessage = ""; + String messageType = ""; + + //in milliseconds + int date = DateTime.now().millisecondsSinceEpoch; + int noOfMessages = 0; + bool isRecent = false; + bool isGroup = false; + GroupDataArgs? groupData; + + MessagesListModel.empty() { + date = DateTime.now().millisecondsSinceEpoch; + } + + MessagesListModel({ + this.otherUserId = "", + this.image = "", + this.title = "", + this.previewOfLastMessage = "", + this.messageType = "", + required this.date, + // this.messageDateTime = '', + this.noOfMessages = 0, + // this.personalMessageIndex = -1, + // this.groupMessageIndex = -1, + this.isRecent = false, + this.isGroup = false, + this.groupData, + }); + + @override + String toString() { + return 'MessagesListModel{profilePic: $image, nameOfSender: $title, previewOfLastMessage: $previewOfLastMessage, date: $date, ' + // 'messageDayTime: $messageDateTime, ' + 'noOfMessages: $noOfMessages, isRecent: $isRecent, isGroup: $isGroup}'; + } +} diff --git a/lib/models/mood_rating_data.dart b/lib/models/mood_rating_data.dart new file mode 100644 index 0000000..65313ab --- /dev/null +++ b/lib/models/mood_rating_data.dart @@ -0,0 +1,6 @@ +class MoodRatingData { + final String icon; + final String name; + + MoodRatingData({required this.icon, required this.name}); +} diff --git a/lib/models/profileData/FcmTokens.dart b/lib/models/profileData/FcmTokens.dart new file mode 100644 index 0000000..31c6c81 --- /dev/null +++ b/lib/models/profileData/FcmTokens.dart @@ -0,0 +1,23 @@ +class FcmTokens { + FcmTokens({ + this.token, + this.deviceType, + }); + + FcmTokens.empty(); + + FcmTokens.fromJson(dynamic json) { + token = json['token']; + deviceType = json['deviceType']; + } + + String? token; + String? deviceType; + + Map toJson() { + final map = {}; + map['token'] = token; + map['deviceType'] = deviceType; + return map; + } +} diff --git a/lib/models/profileData/LocationData.dart b/lib/models/profileData/LocationData.dart new file mode 100644 index 0000000..e3c93fd --- /dev/null +++ b/lib/models/profileData/LocationData.dart @@ -0,0 +1,22 @@ +class LocationData { + LocationData({ + this.type, + this.coordinates,}); + + LocationData.empty(); + + LocationData.fromJson(dynamic json) { + type = json['type']; + coordinates = json['coordinates'] != null ? json['coordinates'].cast() : []; + } + String? type; + List? coordinates; + + Map toJson() { + final map = {}; + map['type'] = type; + map['coordinates'] = coordinates; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/profileData/ProfileModelData.dart b/lib/models/profileData/ProfileModelData.dart new file mode 100644 index 0000000..eb448db --- /dev/null +++ b/lib/models/profileData/ProfileModelData.dart @@ -0,0 +1,792 @@ +// import 'package:ftc_mobile_app/models/profileData/LocationData.dart'; +// import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +// import 'FcmTokens.dart'; +// +// class ProfileDataModel { +// ProfileDataModel({ +// this.statusCode, +// this.statusDescription, +// this.data, +// }); +// +// ProfileDataModel.fromJson(dynamic json) { +// statusCode = json['statusCode']; +// statusDescription = json['statusDescription']; +// data = json['data'] != null ? Data.fromJson(json['data']) : null; +// } +// +// int? statusCode; +// String? statusDescription; +// Data? data; +// +// Map toJson() { +// final map = {}; +// map['statusCode'] = statusCode; +// map['statusDescription'] = statusDescription; +// if (data != null) { +// map['data'] = data?.toJson(); +// } +// return map; +// } +// } +// +// class Data { +// Data({ +// this.staffMembers, +// this.totalSupervisionsCount, +// this.overdueSupervisionsCount, +// this.assignedSupervisionsCount, +// this.completedSupervisionsCount, +// this.count, +// this.offset, +// this.limit, +// }); +// +// Data.fromJson(dynamic json) { +// if (json['staffMembers'] != null) { +// staffMembers = []; +// json['staffMembers'].forEach((v) { +// staffMembers?.add(StaffMembers.fromJson(v)); +// }); +// } +// totalSupervisionsCount = json['totalSupervisionsCount']; +// overdueSupervisionsCount = json['overdueSupervisionsCount']; +// assignedSupervisionsCount = json['assignedSupervisionsCount']; +// completedSupervisionsCount = json['completedSupervisionsCount']; +// count = json['count']; +// offset = json['offset']; +// limit = json['limit']; +// } +// +// List? staffMembers; +// int? totalSupervisionsCount; +// int? overdueSupervisionsCount; +// int? assignedSupervisionsCount; +// int? completedSupervisionsCount; +// int? count; +// int? offset; +// int? limit; +// +// Map toJson() { +// final map = {}; +// if (staffMembers != null) { +// map['staffMembers'] = staffMembers?.map((v) => v.toJson()).toList(); +// } +// map['totalSupervisionsCount'] = totalSupervisionsCount; +// map['overdueSupervisionsCount'] = overdueSupervisionsCount; +// map['assignedSupervisionsCount'] = assignedSupervisionsCount; +// map['completedSupervisionsCount'] = completedSupervisionsCount; +// map['count'] = count; +// map['offset'] = offset; +// map['limit'] = limit; +// return map; +// } +// } +// +// class StaffMembers { +// StaffMembers({ +// this.contractedHours, +// this.id, +// this.staffMemberName, +// this.staffDesignation, +// this.staffOnLeave, +// this.holidays, +// this.complianceDocuments, +// this.niNumber, +// this.kin, +// this.user, +// this.managerId, +// this.clients, +// this.staffWorkLoads, +// this.staffHolidayRequests, +// this.staffTrainings, +// this.supervision, +// this.underSupervisions, +// this.staffWorkingDays, +// this.stafDob, +// this.active, +// this.covidCheck, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.staffDisciplinaries, +// this.staffReferences, +// this.remainingHolidayHours, +// }); +// +// StaffMembers.fromJson(dynamic json) { +// contractedHours = json['contractedHours'] != null +// ? ContractedHours.fromJson(json['contractedHours']) +// : null; +// id = json['_id']; +// staffMemberName = json['staffMemberName']; +// staffDesignation = json['staffDesignation']; +// staffOnLeave = json['staffOnLeave']; +// holidays = List.castFrom(json['holidays'] ?? ""); +// complianceDocuments = +// List.castFrom(json['complianceDocuments'] ?? ""); +// niNumber = json['niNumber']; +// kin = json['kin']; +// user = json['user'] != null ? UserData.fromJson(json['user']) : null; +// managerId = +// json['managerId'] is Map ? UserData.fromJson(json['managerId']) : null; +// clients = List.castFrom(json['clients']); +// if (json['staffWorkLoads'] != null) { +// staffWorkLoads = []; +// json['staffWorkLoads'].forEach((v) { +// if (v is Map) { +// staffWorkLoads?.add(StaffWorkLoads.fromJson(v)); +// } +// }); +// } +// staffHolidayRequests = +// List.castFrom(json['staffHolidayRequests']); +// staffTrainings = List.castFrom(json['staffTrainings']); +// +// supervision = json['supervision'] != null +// ? Supervision.fromJson(json['supervision']) +// : null; +// underSupervisions = +// List.castFrom(json['underSupervisions']); +// staffWorkingDays = +// List.castFrom(json['staffWorkingDays']); +// stafDob = json['stafDob']; +// active = json['active']; +// covidCheck = json['covidCheck']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// staffDisciplinaries = json['staffDisciplinaries'] is Map +// ? StaffDisciplinaries.fromJson(json['staffDisciplinaries']) +// : null; +// staffReferences = json['staffReferences'] is Map +// ? StaffReferences.fromJson(json['staffReferences']) +// : null; +// remainingHolidayHours = json['remainingHolidayHours']; +// } +// +// ContractedHours? contractedHours; +// String? id; +// String? staffMemberName; +// String? staffDesignation; +// bool? staffOnLeave; +// List? holidays; +// List? complianceDocuments; +// String? niNumber; +// String? kin; +// UserData? user; +// UserData? managerId; +// List? clients; +// List? staffWorkLoads; +// List? staffHolidayRequests; +// List? staffTrainings; +// Supervision? supervision; +// List? underSupervisions; +// List? staffWorkingDays; +// String? stafDob; +// bool? active; +// bool? covidCheck; +// String? createdAt; +// String? updatedAt; +// int? v; +// StaffDisciplinaries? staffDisciplinaries; +// StaffReferences? staffReferences; +// int? remainingHolidayHours; +// +// Map toJson() { +// final map = {}; +// if (contractedHours != null) { +// map['contractedHours'] = contractedHours?.toJson(); +// } +// map['_id'] = id; +// map['staffMemberName'] = staffMemberName; +// map['staffDesignation'] = staffDesignation; +// map['staffOnLeave'] = staffOnLeave; +// if (holidays != null) { +// map['holidays'] = holidays?.map((v) => v.toJson()).toList(); +// } +// if (complianceDocuments != null) { +// map['complianceDocuments'] = +// complianceDocuments?.map((v) => v.toJson()).toList(); +// } +// map['niNumber'] = niNumber; +// map['kin'] = kin; +// if (user != null) { +// map['user'] = user?.toJson(); +// } +// if (managerId != null) { +// map['managerId'] = managerId?.toJson(); +// } +// if (clients != null) { +// map['clients'] = clients?.map((v) => v.toJson()).toList(); +// } +// if (staffWorkLoads != null) { +// map['staffWorkLoads'] = staffWorkLoads?.map((v) => v.toJson()).toList(); +// } +// if (staffHolidayRequests != null) { +// map['staffHolidayRequests'] = +// staffHolidayRequests?.map((v) => v.toJson()).toList(); +// } +// if (staffTrainings != null) { +// map['staffTrainings'] = staffTrainings?.map((v) => v.toJson()).toList(); +// } +// if (supervision != null) { +// map['supervision'] = supervision?.toJson(); +// } +// if (underSupervisions != null) { +// map['underSupervisions'] = +// underSupervisions?.map((v) => v.toJson()).toList(); +// } +// if (staffWorkingDays != null) { +// map['staffWorkingDays'] = +// staffWorkingDays?.map((v) => v.toJson()).toList(); +// } +// map['stafDob'] = stafDob; +// map['active'] = active; +// map['covidCheck'] = covidCheck; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// if (staffDisciplinaries != null) { +// map['staffDisciplinaries'] = staffDisciplinaries?.toJson(); +// } +// if (staffReferences != null) { +// map['staffReferences'] = staffReferences?.toJson(); +// } +// map['remainingHolidayHours'] = remainingHolidayHours; +// return map; +// } +// } +// +// class StaffReferences { +// StaffReferences({ +// this.id, +// this.docPaths, +// this.comments, +// this.staffMember, +// this.active, +// this.createdAt, +// this.updatedAt, +// this.v, +// }); +// +// StaffReferences.empty(); +// +// StaffReferences.fromJson(dynamic json) { +// id = json['_id']; +// docPaths = List.castFrom(json['docPaths']); +// comments = List.castFrom(json['comments']); +// staffMember = json['staffMember']; +// active = json['active']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// } +// +// String? id; +// List? docPaths; +// List? comments; +// String? staffMember; +// bool? active; +// String? createdAt; +// String? updatedAt; +// int? v; +// +// Map toJson() { +// final map = {}; +// map['_id'] = id; +// if (docPaths != null) { +// map['docPaths'] = docPaths?.map((v) => v.toJson()).toList(); +// } +// if (comments != null) { +// map['comments'] = comments?.map((v) => v.toJson()).toList(); +// } +// map['staffMember'] = staffMember; +// map['active'] = active; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// return map; +// } +// } +// +// class StaffDisciplinaries { +// StaffDisciplinaries({ +// this.id, +// this.docPaths, +// this.comments, +// this.staffMember, +// this.active, +// this.createdAt, +// this.updatedAt, +// this.v, +// }); +// +// StaffDisciplinaries.empty(); +// +// StaffDisciplinaries.fromJson(dynamic json) { +// id = json['_id']; +// docPaths = List.castFrom(json['docPaths']); +// comments = List.castFrom(json['comments']); +// staffMember = json['staffMember']; +// active = json['active']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// } +// +// String? id; +// List? docPaths; +// List? comments; +// String? staffMember; +// bool? active; +// String? createdAt; +// String? updatedAt; +// int? v; +// +// Map toJson() { +// final map = {}; +// map['_id'] = id; +// if (docPaths != null) { +// map['docPaths'] = docPaths?.map((v) => v.toJson()).toList(); +// } +// if (comments != null) { +// map['comments'] = comments?.map((v) => v.toJson()).toList(); +// } +// map['staffMember'] = staffMember; +// map['active'] = active; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// return map; +// } +// } +// +// class Supervision { +// Supervision({ +// this.supervisionName, +// this.sprDueDate, +// this.sprStatus, +// this.sprResult, +// this.templateTitleId, +// }); +// +// Supervision.fromJson(dynamic json) { +// supervisionName = json['supervisionName']; +// sprDueDate = json['sprDueDate']; +// sprStatus = json['sprStatus']; +// sprResult = json['sprResult']; +// templateTitleId = json['templateTitleId']; +// } +// +// String? supervisionName; +// String? sprDueDate; +// String? sprStatus; +// String? sprResult; +// String? templateTitleId; +// +// Map toJson() { +// final map = {}; +// map['supervisionName'] = supervisionName; +// map['sprDueDate'] = sprDueDate; +// map['sprStatus'] = sprStatus; +// map['sprResult'] = sprResult; +// map['templateTitleId'] = templateTitleId; +// return map; +// } +// } +// +// class StaffWorkLoads { +// StaffWorkLoads({ +// this.holidayEntitlement, +// this.id, +// this.isCurrentWrkLd, +// this.startDate, +// this.endDate, +// this.holidayAlwnNoOfDys, +// this.holidayAlwnNoOfHours, +// this.holidaysAvailed, +// this.holidaysRemaining, +// this.staffMember, +// this.carriedOverHours, +// this.active, +// this.createdAt, +// this.updatedAt, +// this.v, +// }); +// +// StaffWorkLoads.fromJson(dynamic json) { +// holidayEntitlement = json['holidayEntitlement'] != null +// ? HolidayEntitlement.fromJson(json['holidayEntitlement']) +// : null; +// id = json['_id']; +// isCurrentWrkLd = json['isCurrentWrkLd']; +// startDate = json['startDate']; +// endDate = json['endDate']; +// holidayAlwnNoOfDys = json['holidayAlwnNoOfDys']; +// holidayAlwnNoOfHours = json['holidayAlwnNoOfHours']; +// holidaysAvailed = json['holidaysAvailed']; +// holidaysRemaining = json['holidaysRemaining']; +// staffMember = json['staffMember']; +// carriedOverHours = json['carriedOverHours']; +// active = json['active']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// } +// +// HolidayEntitlement? holidayEntitlement; +// String? id; +// bool? isCurrentWrkLd; +// String? startDate; +// String? endDate; +// int? holidayAlwnNoOfDys; +// int? holidayAlwnNoOfHours; +// int? holidaysAvailed; +// int? holidaysRemaining; +// String? staffMember; +// int? carriedOverHours; +// bool? active; +// String? createdAt; +// String? updatedAt; +// int? v; +// +// Map toJson() { +// final map = {}; +// if (holidayEntitlement != null) { +// map['holidayEntitlement'] = holidayEntitlement?.toJson(); +// } +// map['_id'] = id; +// map['isCurrentWrkLd'] = isCurrentWrkLd; +// map['startDate'] = startDate; +// map['endDate'] = endDate; +// map['holidayAlwnNoOfDys'] = holidayAlwnNoOfDys; +// map['holidayAlwnNoOfHours'] = holidayAlwnNoOfHours; +// map['holidaysAvailed'] = holidaysAvailed; +// map['holidaysRemaining'] = holidaysRemaining; +// map['staffMember'] = staffMember; +// map['carriedOverHours'] = carriedOverHours; +// map['active'] = active; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// return map; +// } +// } +// +// class HolidayEntitlement { +// HolidayEntitlement({ +// this.numberOfDays, +// this.numberOfHours, +// this.numberOfWeeks, +// }); +// +// HolidayEntitlement.fromJson(dynamic json) { +// numberOfDays = json['numberOfDays']; +// numberOfHours = json['numberOfHours']; +// numberOfWeeks = json['numberOfWeeks']; +// } +// +// int? numberOfDays; +// int? numberOfHours; +// int? numberOfWeeks; +// +// Map toJson() { +// final map = {}; +// map['numberOfDays'] = numberOfDays; +// map['numberOfHours'] = numberOfHours; +// map['numberOfWeeks'] = numberOfWeeks; +// return map; +// } +// } +// +// class ManagerId { +// ManagerId({ +// this.fcmTokens, +// this.location, +// this.profileVideoUrl, +// this.id, +// this.userModelName, +// this.name, +// this.version, +// this.email, +// this.phoneNumber, +// this.active, +// this.role, +// this.profilePictureUrl, +// this.deviceId, +// this.verificationCode, +// this.isVerified, +// this.approved, +// this.blocked, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.password, +// this.userSettings, +// this.modelId, +// }); +// +// ManagerId.fromJson(dynamic json) { +// fcmTokens = json['fcm_tokens'] != null +// ? FcmTokens.fromJson(json['fcm_tokens']) +// : null; +// location = json['location'] != null +// ? LocationData.fromJson(json['location']) +// : null; +// profileVideoUrl = json['profile_video_url']; +// id = json['_id']; +// userModelName = json['userModelName']; +// name = json['name']; +// version = json['version']; +// email = json['email']; +// phoneNumber = json['phoneNumber']; +// active = json['active']; +// role = json['role']; +// profilePictureUrl = json['profile_picture_url']; +// deviceId = json['deviceId']; +// verificationCode = json['verification_code']; +// isVerified = json['is_verified']; +// approved = json['approved']; +// blocked = json['blocked']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// password = json['password']; +// userSettings = json['userSettings']; +// modelId = json['modelId']; +// } +// +// FcmTokens? fcmTokens; +// LocationData? location; +// String? profileVideoUrl; +// String? id; +// String? userModelName; +// String? name; +// String? version; +// String? email; +// String? phoneNumber; +// bool? active; +// String? role; +// String? profilePictureUrl; +// String? deviceId; +// String? verificationCode; +// bool? isVerified; +// bool? approved; +// bool? blocked; +// String? createdAt; +// String? updatedAt; +// int? v; +// String? password; +// String? userSettings; +// String? modelId; +// +// Map toJson() { +// final map = {}; +// if (fcmTokens != null) { +// map['fcm_tokens'] = fcmTokens?.toJson(); +// } +// if (location != null) { +// map['location'] = location?.toJson(); +// } +// map['profile_video_url'] = profileVideoUrl; +// map['_id'] = id; +// map['userModelName'] = userModelName; +// map['name'] = name; +// map['version'] = version; +// map['email'] = email; +// map['phoneNumber'] = phoneNumber; +// map['active'] = active; +// map['role'] = role; +// map['profile_picture_url'] = profilePictureUrl; +// map['deviceId'] = deviceId; +// map['verification_code'] = verificationCode; +// map['is_verified'] = isVerified; +// map['approved'] = approved; +// map['blocked'] = blocked; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// map['password'] = password; +// map['userSettings'] = userSettings; +// map['modelId'] = modelId; +// return map; +// } +// } +// +// // class Location { +// // Location({ +// // this.type, +// // this.coordinates,}); +// // +// // Location.fromJson(dynamic json) { +// // type = json['type']; +// // coordinates = json['coordinates'] != null ? json['coordinates'].cast() : []; +// // } +// // String? type; +// // List? coordinates; +// // +// // Map toJson() { +// // final map = {}; +// // map['type'] = type; +// // map['coordinates'] = coordinates; +// // return map; +// // } +// // +// // } +// +// // class FcmTokens { +// // FcmTokens({ +// // this.token, +// // this.deviceType,}); +// // +// // FcmTokens.fromJson(dynamic json) { +// // token = json['token']; +// // deviceType = json['deviceType']; +// // } +// // String? token; +// // String? deviceType; +// // +// // Map toJson() { +// // final map = {}; +// // map['token'] = token; +// // map['deviceType'] = deviceType; +// // return map; +// // } +// // +// // } +// +// // class User { +// // User({ +// // this.fcmTokens, +// // this.location, +// // this.id, +// // this.userModelName, +// // this.name, +// // this.version, +// // this.email, +// // this.phoneNumber, +// // this.active, +// // this.role, +// // this.profilePictureUrl, +// // this.profileVideoUrl, +// // this.deviceId, +// // this.verificationCode, +// // this.isVerified, +// // this.approved, +// // this.blocked, +// // this.createdAt, +// // this.updatedAt, +// // this.v, +// // this.password, +// // this.userSettings, +// // this.modelId,}); +// // +// // User.fromJson(dynamic json) { +// // fcmTokens = json['fcm_tokens'] != null ? FcmTokens.fromJson(json['fcm_tokens']) : null; +// // location = json['location'] != null ? LocationData.fromJson(json['location']) : null; +// // id = json['_id']; +// // userModelName = json['userModelName']; +// // name = json['name']; +// // version = json['version']; +// // email = json['email']; +// // phoneNumber = json['phoneNumber']; +// // active = json['active']; +// // role = json['role']; +// // profilePictureUrl = json['profile_picture_url']; +// // profileVideoUrl = json['profile_video_url']; +// // deviceId = json['deviceId']; +// // verificationCode = json['verification_code']; +// // isVerified = json['is_verified']; +// // approved = json['approved']; +// // blocked = json['blocked']; +// // createdAt = json['createdAt']; +// // updatedAt = json['updatedAt']; +// // v = json['__v']; +// // password = json['password']; +// // userSettings = json['userSettings']; +// // modelId = json['modelId']; +// // } +// // FcmTokens? fcmTokens; +// // LocationData? location; +// // String? id; +// // String? userModelName; +// // String? name; +// // String? version; +// // String? email; +// // String? phoneNumber; +// // bool? active; +// // String? role; +// // String? profilePictureUrl; +// // String? profileVideoUrl; +// // String? deviceId; +// // String? verificationCode; +// // bool? isVerified; +// // bool? approved; +// // bool? blocked; +// // String? createdAt; +// // String? updatedAt; +// // int? v; +// // String? password; +// // String? userSettings; +// // String? modelId; +// // +// // Map toJson() { +// // final map = {}; +// // if (fcmTokens != null) { +// // map['fcm_tokens'] = fcmTokens?.toJson(); +// // } +// // if (location != null) { +// // map['location'] = location?.toJson(); +// // } +// // map['_id'] = id; +// // map['userModelName'] = userModelName; +// // map['name'] = name; +// // map['version'] = version; +// // map['email'] = email; +// // map['phoneNumber'] = phoneNumber; +// // map['active'] = active; +// // map['role'] = role; +// // map['profile_picture_url'] = profilePictureUrl; +// // map['profile_video_url'] = profileVideoUrl; +// // map['deviceId'] = deviceId; +// // map['verification_code'] = verificationCode; +// // map['is_verified'] = isVerified; +// // map['approved'] = approved; +// // map['blocked'] = blocked; +// // map['createdAt'] = createdAt; +// // map['updatedAt'] = updatedAt; +// // map['__v'] = v; +// // map['password'] = password; +// // map['userSettings'] = userSettings; +// // map['modelId'] = modelId; +// // return map; +// // } +// // +// // } +// +// class ContractedHours { +// ContractedHours({ +// this.contractedHours, +// this.totalShiftHoursWeek, +// this.noOfShifts, +// }); +// +// ContractedHours.fromJson(dynamic json) { +// contractedHours = json['contractedHours']; +// totalShiftHoursWeek = json['totalShiftHoursWeek']; +// noOfShifts = json['noOfShifts']; +// } +// +// int? contractedHours; +// int? totalShiftHoursWeek; +// int? noOfShifts; +// +// Map toJson() { +// final map = {}; +// map['contractedHours'] = contractedHours; +// map['totalShiftHoursWeek'] = totalShiftHoursWeek; +// map['noOfShifts'] = noOfShifts; +// return map; +// } +// } diff --git a/lib/models/profileData/user_data.dart b/lib/models/profileData/user_data.dart new file mode 100644 index 0000000..606c9d1 --- /dev/null +++ b/lib/models/profileData/user_data.dart @@ -0,0 +1,108 @@ +import '../clients/service_users_model.dart'; +import 'LocationData.dart'; + +class UserData { + UserData({ + this.location, + this.id, + this.userModelName, + this.name, + this.version, + this.email, + this.phoneNumber, + this.active, + this.role, + this.profilePictureUrl, + this.profileVideoUrl, + this.deviceId, + this.verificationCode, + this.isVerified, + this.approved, + this.blocked, + this.createdAt, + this.updatedAt, + this.userSettings, + this.modelId, + }); + + UserData.fromJson(dynamic json) { + location = json['location'] is Map + ? LocationData.fromJson(json['location']) + : null; + id = json['_id']; + userModelName = json['userModelName']; + name = json['name']; + version = json['version']; + email = json['email']; + phoneNumber = json['phoneNumber']; + active = json['active']; + role = json['role']; + profilePictureUrl = json['profile_picture_url']; + profileVideoUrl = json['profile_video_url']; + deviceId = json['deviceId']; + verificationCode = json['verification_code']; + isVerified = json['is_verified']; + approved = json['approved']; + blocked = json['blocked']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + userSettings = json['userSettings'] is String ? json['userSettings'] : null; + modelId = json['modelId'] is Map + ? ServiceUserModel.fromJson(json['modelId']) + : null; + } + + LocationData? location; + String? id; + String? userModelName; + String? name; + String? version; + String? email; + String? phoneNumber; + bool? active; + String? role; + String? profilePictureUrl; + String? profileVideoUrl; + String? deviceId; + String? verificationCode; + bool? isVerified; + bool? approved; + bool? blocked; + String? createdAt; + String? updatedAt; + String? userSettings; + ServiceUserModel? modelId; + + String get displayName => + (_fullName.trim().isNotEmpty) ? _fullName.trim() : (name ?? ""); + + String get _fullName => + "${modelId?.suFirstMiddleName ?? ""} ${modelId?.suLastName ?? ""}"; + + Map toJson() { + final map = {}; + if (location != null) { + map['location'] = location?.toJson(); + } + map['_id'] = id; + map['userModelName'] = userModelName; + map['name'] = name; + map['version'] = version; + map['email'] = email; + map['phoneNumber'] = phoneNumber; + map['active'] = active; + map['role'] = role; + map['profile_picture_url'] = profilePictureUrl; + map['profile_video_url'] = profileVideoUrl; + map['deviceId'] = deviceId; + map['verification_code'] = verificationCode; + map['is_verified'] = isVerified; + map['approved'] = approved; + map['blocked'] = blocked; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + map['userSettings'] = userSettings; + map['modelId'] = modelId; + return map; + } +} diff --git a/lib/models/profile_screen_model.dart b/lib/models/profile_screen_model.dart new file mode 100644 index 0000000..1811146 --- /dev/null +++ b/lib/models/profile_screen_model.dart @@ -0,0 +1,670 @@ +import 'package:ftc_mobile_app/models/staffWorkload/StaffWorkloadResponse.dart'; + +import 'profileData/user_data.dart'; + +class ProfileDataModel { + ProfileDataModel({ + this.statusCode, + this.statusDescription, + this.data, + }); + + ProfileDataModel.fromJson(dynamic json) { + statusCode = json['statusCode']; + statusDescription = json['statusDescription']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + int? statusCode; + String? statusDescription; + Data? data; + + Map toJson() { + final map = {}; + map['statusCode'] = statusCode; + map['statusDescription'] = statusDescription; + if (data != null) { + map['data'] = data?.toJson(); + } + return map; + } +} + +class Data { + Data({ + this.staffMembers, + this.totalSupervisionsCount, + this.overdueSupervisionsCount, + this.assignedSupervisionsCount, + this.completedSupervisionsCount, + this.count, + this.offset, + this.limit, + }); + + Data.fromJson(dynamic json) { + if (json['staffMembers'] != null) { + staffMembers = []; + json['staffMembers'].forEach((v) { + staffMembers?.add(StaffMembers.fromJson(v)); + }); + } + totalSupervisionsCount = json['totalSupervisionsCount']; + overdueSupervisionsCount = json['overdueSupervisionsCount']; + assignedSupervisionsCount = json['assignedSupervisionsCount']; + completedSupervisionsCount = json['completedSupervisionsCount']; + count = json['count']; + offset = json['offset']; + limit = json['limit']; + } + + List? staffMembers; + int? totalSupervisionsCount; + int? overdueSupervisionsCount; + int? assignedSupervisionsCount; + int? completedSupervisionsCount; + int? count; + int? offset; + int? limit; + + Map toJson() { + final map = {}; + if (staffMembers != null) { + map['staffMembers'] = staffMembers?.map((v) => v.toJson()).toList(); + } + map['totalSupervisionsCount'] = totalSupervisionsCount; + map['overdueSupervisionsCount'] = overdueSupervisionsCount; + map['assignedSupervisionsCount'] = assignedSupervisionsCount; + map['completedSupervisionsCount'] = completedSupervisionsCount; + map['count'] = count; + map['offset'] = offset; + map['limit'] = limit; + return map; + } +} + +class StaffMembers { + StaffMembers({ + this.contractedHours, + this.id, + this.staffMemberName, + this.staffDesignation, + this.staffOnLeave, + this.holidays, + this.complianceDocuments, + this.niNumber, + this.kin, + this.user, + this.managerId, + this.clients, + this.staffWorkLoads, + this.staffHolidayRequests, + this.staffTrainings, + this.supervision, + this.underSupervisions, + this.staffWorkingDays, + this.stafDob, + this.active, + this.covidCheck, + this.createdAt, + this.updatedAt, + this.staffDisciplinaries, + this.staffReferences, + this.remainingHolidayHours, + }); + + StaffMembers.fromJson(dynamic json) { + contractedHours = json['contractedHours'] != null + ? ContractedHours.fromJson(json['contractedHours']) + : null; + id = json['_id']; + staffMemberName = json['staffMemberName']; + staffDesignation = json['staffDesignation']; + staffOnLeave = json['staffOnLeave']; + holidays = List.castFrom(json['holidays'] ?? ""); + complianceDocuments = + List.castFrom(json['complianceDocuments'] ?? ""); + niNumber = json['niNumber']; + kin = json['kin']; + user = json['user'] is Map ? UserData.fromJson(json['user']) : null; + managerId = + json['managerId'] is Map ? UserData.fromJson(json['managerId']) : null; + clients = List.castFrom(json['clients']); + if (json['staffWorkLoads'] is List) { + staffWorkLoads = []; + json['staffWorkLoads'].forEach((v) { + if (v is Map) { + staffWorkLoads?.add(StaffWorkLoads.fromJson(v)); + } + }); + } + staffHolidayRequests = + List.castFrom(json['staffHolidayRequests']); + staffTrainings = List.castFrom(json['staffTrainings']); + + supervision = json['supervision'] != null + ? Supervision.fromJson(json['supervision']) + : null; + underSupervisions = + List.castFrom(json['underSupervisions']); + staffWorkingDays = + List.castFrom(json['staffWorkingDays']); + stafDob = json['stafDob']; + active = json['active']; + covidCheck = json['covidCheck']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + staffDisciplinaries = json['staffDisciplinaries'] is Map + ? StaffDisciplinaries.fromJson(json['staffDisciplinaries']) + : null; + staffReferences = json['staffReferences'] is Map + ? StaffReferences.fromJson(json['staffReferences']) + : null; + remainingHolidayHours = json['remainingHolidayHours']; + } + + ContractedHours? contractedHours; + String? id; + String? staffMemberName; + String? staffDesignation; + bool? staffOnLeave; + List? holidays; + List? complianceDocuments; + String? niNumber; + String? kin; + UserData? user; + UserData? managerId; + List? clients; + List? staffWorkLoads; + List? staffHolidayRequests; + List? staffTrainings; + Supervision? supervision; + List? underSupervisions; + List? staffWorkingDays; + String? stafDob; + bool? active; + bool? covidCheck; + String? createdAt; + String? updatedAt; + StaffDisciplinaries? staffDisciplinaries; + StaffReferences? staffReferences; + int? remainingHolidayHours; + + Map toJson() { + final map = {}; + if (contractedHours != null) { + map['contractedHours'] = contractedHours?.toJson(); + } + map['_id'] = id; + map['staffMemberName'] = staffMemberName; + map['staffDesignation'] = staffDesignation; + map['staffOnLeave'] = staffOnLeave; + if (holidays != null) { + map['holidays'] = holidays?.map((v) => v.toJson()).toList(); + } + if (complianceDocuments != null) { + map['complianceDocuments'] = + complianceDocuments?.map((v) => v.toJson()).toList(); + } + map['niNumber'] = niNumber; + map['kin'] = kin; + if (user != null) { + map['user'] = user?.toJson(); + } + if (managerId != null) { + map['managerId'] = managerId?.toJson(); + } + if (clients != null) { + map['clients'] = clients?.map((v) => v.toJson()).toList(); + } + if (staffWorkLoads != null) { + map['staffWorkLoads'] = staffWorkLoads?.map((v) => v.toJson()).toList(); + } + if (staffHolidayRequests != null) { + map['staffHolidayRequests'] = + staffHolidayRequests?.map((v) => v.toJson()).toList(); + } + if (staffTrainings != null) { + map['staffTrainings'] = staffTrainings?.map((v) => v.toJson()).toList(); + } + if (supervision != null) { + map['supervision'] = supervision?.toJson(); + } + if (underSupervisions != null) { + map['underSupervisions'] = + underSupervisions?.map((v) => v.toJson()).toList(); + } + if (staffWorkingDays != null) { + map['staffWorkingDays'] = + staffWorkingDays?.map((v) => v.toJson()).toList(); + } + map['stafDob'] = stafDob; + map['active'] = active; + map['covidCheck'] = covidCheck; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + if (staffDisciplinaries != null) { + map['staffDisciplinaries'] = staffDisciplinaries?.toJson(); + } + if (staffReferences != null) { + map['staffReferences'] = staffReferences?.toJson(); + } + map['remainingHolidayHours'] = remainingHolidayHours; + return map; + } +} + +class StaffReferences { + StaffReferences({ + this.id, + this.docPaths, + this.comments, + this.staffMember, + this.active, + this.createdAt, + this.updatedAt, + this.v, + }); + + StaffReferences.empty(); + + StaffReferences.fromJson(dynamic json) { + id = json['_id']; + docPaths = List.castFrom(json['docPaths']); + comments = List.castFrom(json['comments']); + staffMember = json['staffMember']; + active = json['active']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + v = json['__v']; + } + + String? id; + List? docPaths; + List? comments; + String? staffMember; + bool? active; + String? createdAt; + String? updatedAt; + int? v; + + Map toJson() { + final map = {}; + map['_id'] = id; + if (docPaths != null) { + map['docPaths'] = docPaths?.map((v) => v.toJson()).toList(); + } + if (comments != null) { + map['comments'] = comments?.map((v) => v.toJson()).toList(); + } + map['staffMember'] = staffMember; + map['active'] = active; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + map['__v'] = v; + return map; + } +} + +class StaffDisciplinaries { + StaffDisciplinaries({ + this.id, + this.docPaths, + this.comments, + this.staffMember, + this.active, + this.createdAt, + this.updatedAt, + this.v, + }); + + StaffDisciplinaries.empty(); + + StaffDisciplinaries.fromJson(dynamic json) { + id = json['_id']; + docPaths = List.castFrom(json['docPaths']); + comments = List.castFrom(json['comments']); + staffMember = json['staffMember']; + active = json['active']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + v = json['__v']; + } + + String? id; + List? docPaths; + List? comments; + String? staffMember; + bool? active; + String? createdAt; + String? updatedAt; + int? v; + + Map toJson() { + final map = {}; + map['_id'] = id; + if (docPaths != null) { + map['docPaths'] = docPaths?.map((v) => v.toJson()).toList(); + } + if (comments != null) { + map['comments'] = comments?.map((v) => v.toJson()).toList(); + } + map['staffMember'] = staffMember; + map['active'] = active; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + map['__v'] = v; + return map; + } +} + +class Supervision { + Supervision({ + this.supervisionName, + this.sprDueDate, + this.sprStatus, + this.sprResult, + this.templateTitleId, + }); + + Supervision.fromJson(dynamic json) { + supervisionName = json['supervisionName']; + sprDueDate = json['sprDueDate']; + sprStatus = json['sprStatus']; + sprResult = json['sprResult']; + templateTitleId = json['templateTitleId']; + } + + String? supervisionName; + String? sprDueDate; + String? sprStatus; + String? sprResult; + String? templateTitleId; + + Map toJson() { + final map = {}; + map['supervisionName'] = supervisionName; + map['sprDueDate'] = sprDueDate; + map['sprStatus'] = sprStatus; + map['sprResult'] = sprResult; + map['templateTitleId'] = templateTitleId; + return map; + } +} + +// class StaffWorkLoads { +// StaffWorkLoads({ +// this.holidayEntitlement, +// this.id, +// this.isCurrentWrkLd, +// this.startDate, +// this.endDate, +// this.holidayAlwnNoOfDys, +// this.holidayAlwnNoOfHours, +// this.holidaysAvailed, +// this.holidaysRemaining, +// this.staffMember, +// this.carriedOverHours, +// this.active, +// this.createdAt, +// this.updatedAt, +// this.v,}); +// +// StaffWorkLoads.fromJson(dynamic json) { +// holidayEntitlement = json['holidayEntitlement'] != null ? HolidayEntitlement.fromJson(json['holidayEntitlement']) : null; +// id = json['_id']; +// isCurrentWrkLd = json['isCurrentWrkLd']; +// startDate = json['startDate']; +// endDate = json['endDate']; +// holidayAlwnNoOfDys = json['holidayAlwnNoOfDys']; +// holidayAlwnNoOfHours = json['holidayAlwnNoOfHours']; +// holidaysAvailed = json['holidaysAvailed']; +// holidaysRemaining = json['holidaysRemaining']; +// staffMember = json['staffMember']; +// carriedOverHours = json['carriedOverHours']; +// active = json['active']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// } +// HolidayEntitlement? holidayEntitlement; +// String? id; +// bool? isCurrentWrkLd; +// String? startDate; +// String? endDate; +// int? holidayAlwnNoOfDys; +// int? holidayAlwnNoOfHours; +// int? holidaysAvailed; +// int? holidaysRemaining; +// String? staffMember; +// int? carriedOverHours; +// bool? active; +// String? createdAt; +// String? updatedAt; +// int? v; +// +// Map toJson() { +// final map = {}; +// if (holidayEntitlement != null) { +// map['holidayEntitlement'] = holidayEntitlement?.toJson(); +// } +// map['_id'] = id; +// map['isCurrentWrkLd'] = isCurrentWrkLd; +// map['startDate'] = startDate; +// map['endDate'] = endDate; +// map['holidayAlwnNoOfDys'] = holidayAlwnNoOfDys; +// map['holidayAlwnNoOfHours'] = holidayAlwnNoOfHours; +// map['holidaysAvailed'] = holidaysAvailed; +// map['holidaysRemaining'] = holidaysRemaining; +// map['staffMember'] = staffMember; +// map['carriedOverHours'] = carriedOverHours; +// map['active'] = active; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// return map; +// } +// +// } +// +// class HolidayEntitlement { +// HolidayEntitlement({ +// this.numberOfDays, +// this.numberOfHours, +// this.numberOfWeeks,}); +// +// HolidayEntitlement.fromJson(dynamic json) { +// numberOfDays = json['numberOfDays']; +// numberOfHours = json['numberOfHours']; +// numberOfWeeks = json['numberOfWeeks']; +// } +// int? numberOfDays; +// int? numberOfHours; +// int? numberOfWeeks; +// +// Map toJson() { +// final map = {}; +// map['numberOfDays'] = numberOfDays; +// map['numberOfHours'] = numberOfHours; +// map['numberOfWeeks'] = numberOfWeeks; +// return map; +// } +// +// } + +// class ManagerId { +// ManagerId({ +// this.fcmTokens, +// this.location, +// this.profileVideoUrl, +// this.id, +// this.userModelName, +// this.name, +// this.version, +// this.email, +// this.phoneNumber, +// this.active, +// this.role, +// this.profilePictureUrl, +// this.deviceId, +// this.verificationCode, +// this.isVerified, +// this.approved, +// this.blocked, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.password, +// this.userSettings, +// this.modelId,}); +// +// ManagerId.fromJson(dynamic json) { +// fcmTokens = json['fcm_tokens'] != null ? FcmTokens.fromJson(json['fcm_tokens']) : null; +// location = json['location'] != null ? LocationData.fromJson(json['location']) : null; +// profileVideoUrl = json['profile_video_url']; +// id = json['_id']; +// userModelName = json['userModelName']; +// name = json['name']; +// version = json['version']; +// email = json['email']; +// phoneNumber = json['phoneNumber']; +// active = json['active']; +// role = json['role']; +// profilePictureUrl = json['profile_picture_url']; +// deviceId = json['deviceId']; +// verificationCode = json['verification_code']; +// isVerified = json['is_verified']; +// approved = json['approved']; +// blocked = json['blocked']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// password = json['password']; +// userSettings = json['userSettings']; +// modelId = json['modelId']; +// } +// FcmTokens? fcmTokens; +// LocationData? location; +// String? profileVideoUrl; +// String? id; +// String? userModelName; +// String? name; +// String? version; +// String? email; +// String? phoneNumber; +// bool? active; +// String? role; +// String? profilePictureUrl; +// String? deviceId; +// String? verificationCode; +// bool? isVerified; +// bool? approved; +// bool? blocked; +// String? createdAt; +// String? updatedAt; +// int? v; +// String? password; +// String? userSettings; +// String? modelId; +// +// Map toJson() { +// final map = {}; +// if (fcmTokens != null) { +// map['fcm_tokens'] = fcmTokens?.toJson(); +// } +// if (location != null) { +// map['location'] = location?.toJson(); +// } +// map['profile_video_url'] = profileVideoUrl; +// map['_id'] = id; +// map['userModelName'] = userModelName; +// map['name'] = name; +// map['version'] = version; +// map['email'] = email; +// map['phoneNumber'] = phoneNumber; +// map['active'] = active; +// map['role'] = role; +// map['profile_picture_url'] = profilePictureUrl; +// map['deviceId'] = deviceId; +// map['verification_code'] = verificationCode; +// map['is_verified'] = isVerified; +// map['approved'] = approved; +// map['blocked'] = blocked; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// map['password'] = password; +// map['userSettings'] = userSettings; +// map['modelId'] = modelId; +// return map; +// } +// +// } + +// class Location { +// Location({ +// this.type, +// this.coordinates,}); +// +// Location.fromJson(dynamic json) { +// type = json['type']; +// coordinates = json['coordinates'] != null ? json['coordinates'].cast() : []; +// } +// String? type; +// List? coordinates; +// +// Map toJson() { +// final map = {}; +// map['type'] = type; +// map['coordinates'] = coordinates; +// return map; +// } +// +// } + +// class FcmTokens { +// FcmTokens({ +// this.token, +// this.deviceType,}); +// +// FcmTokens.fromJson(dynamic json) { +// token = json['token']; +// deviceType = json['deviceType']; +// } +// String? token; +// String? deviceType; +// +// Map toJson() { +// final map = {}; +// map['token'] = token; +// map['deviceType'] = deviceType; +// return map; +// } +// +// } + +class ContractedHours { + ContractedHours({ + this.contractedHours, + this.totalShiftHoursWeek, + this.noOfShifts, + }); + + ContractedHours.fromJson(dynamic json) { + contractedHours = json['contractedHours']; + totalShiftHoursWeek = json['totalShiftHoursWeek']; + noOfShifts = json['noOfShifts']; + } + + int? contractedHours; + int? totalShiftHoursWeek; + int? noOfShifts; + + Map toJson() { + final map = {}; + map['contractedHours'] = contractedHours; + map['totalShiftHoursWeek'] = totalShiftHoursWeek; + map['noOfShifts'] = noOfShifts; + return map; + } +} diff --git a/lib/models/requests/HolidayRequestData.dart b/lib/models/requests/HolidayRequestData.dart new file mode 100644 index 0000000..2118b9c --- /dev/null +++ b/lib/models/requests/HolidayRequestData.dart @@ -0,0 +1,41 @@ +class HolidayRequestData { + HolidayRequestData({ + this.hldRqStartDate, + this.hldRqEndDate, + this.hldRqTotalDays, + this.hldRqTotalHours, + this.hldRqStatus, + this.hldRequestType, + this.staffRequester, + }); + + HolidayRequestData.fromJson(dynamic json) { + hldRqStartDate = json['hldRqStartDate']; + hldRqEndDate = json['hldRqEndDate']; + hldRqTotalDays = json['hldRqTotalDays']; + hldRqTotalHours = json['hldRqTotalHours']; + hldRqStatus = json['hldRqStatus']; + hldRequestType = json['hldRequestType']; + staffRequester = json['staffRequester']; + } + + int? hldRqStartDate; + int? hldRqEndDate; + int? hldRqTotalDays; + int? hldRqTotalHours; + String? hldRqStatus; + String? hldRequestType; + String? staffRequester; + + Map toJson() { + final map = {}; + map['hldRqStartDate'] = hldRqStartDate; + map['hldRqEndDate'] = hldRqEndDate; + map['hldRqTotalDays'] = hldRqTotalDays; + map['hldRqTotalHours'] = hldRqTotalHours; + map['hldRqStatus'] = hldRqStatus; + map['hldRequestType'] = hldRequestType; + map['staffRequester'] = staffRequester; + return map; + } +} diff --git a/lib/models/response_model.dart b/lib/models/response_model.dart new file mode 100644 index 0000000..9eac12e --- /dev/null +++ b/lib/models/response_model.dart @@ -0,0 +1,39 @@ +class ResponseModel{ + int statusCode = -1; + String statusDescription = ""; + dynamic data =""; + String userToken = ""; + Map header = {}; + + ResponseModel(); + + ResponseModel.named({ + required this.statusCode, + required this.statusDescription, + this.data, + }); + + ResponseModel.fromJson(Map json, {this.statusCode = 0}) { + statusDescription = json["message"]??""; + data = json["data"] ?? json; + userToken = json["token"] ?? ""; + } + + ResponseModel.errorFromJson(Map json,{this.statusCode = 0}){ + statusDescription = json['error'] ?? ''; + data = json["data"] ?? json; + } + + Map toJson() { + return { + 'statusCode': statusCode, + 'statusDescription': statusDescription, + 'data': data, + }; + } + + @override + String toString() { + return 'ResponseModel{statusCode: $statusCode, statusDescription: $statusDescription, data: $data, userToken: $userToken, header: $header}'; + } +} \ No newline at end of file diff --git a/lib/models/rota/Days.dart b/lib/models/rota/Days.dart new file mode 100644 index 0000000..cfc3682 --- /dev/null +++ b/lib/models/rota/Days.dart @@ -0,0 +1,62 @@ +import '../profileData/user_data.dart'; + +class Days { + Days({ + this.day, + this.shiftStartTime, + this.shiftEndTime, + this.workHrs, + this.patientId, + this.isSleepOver, + this.isOverNightStay, + this.addedby, + this.note, + this.id, + this.templateId, + }); + + Days.fromJson(dynamic json) { + day = json['day']; + shiftStartTime = json['shiftStartTime']; + shiftEndTime = json['shiftEndTime']; + workHrs = json['workHrs']; + patientId = + json['patientId'] != null ? UserData.fromJson(json['patientId']) : null; + isSleepOver = json['isSleepOver']; + isOverNightStay = json['isOverNightStay']; + addedby = json['addedby']; + note = json['note']; + id = json['_id']; + templateId = json['templateId']; + } + + String? day; + int? shiftStartTime; + int? shiftEndTime; + String? workHrs; + UserData? patientId; + bool? isSleepOver; + bool? isOverNightStay; + String? addedby; + String? note; + String? id; + String? templateId; + + Map toJson() { + final map = {}; + map['day'] = day; + map['shiftStartTime'] = shiftStartTime; + map['shiftEndTime'] = shiftEndTime; + map['workHrs'] = workHrs; + if (patientId != null) { + map['patientId'] = patientId?.toJson(); + } + map['isSleepOver'] = isSleepOver; + map['isOverNightStay'] = isOverNightStay; + map['addedby'] = addedby; + map['note'] = note; + map['_id'] = id; + map['templateId'] = templateId; + return map; + } +} diff --git a/lib/models/rota/Diagnosises.dart b/lib/models/rota/Diagnosises.dart new file mode 100644 index 0000000..6cbbeff --- /dev/null +++ b/lib/models/rota/Diagnosises.dart @@ -0,0 +1,32 @@ +class Diagnosises { + Diagnosises({ + this.diagnosisText, + this.diagnosisDate, + this.diagnosisBy, + this.isCurrentDiagnosis, + this.id,}); + + Diagnosises.fromJson(dynamic json) { + diagnosisText = json['diagnosisText']; + diagnosisDate = json['diagnosisDate']; + diagnosisBy = json['diagnosisBy']; + isCurrentDiagnosis = json['isCurrentDiagnosis']; + id = json['_id']; + } + String? diagnosisText; + String? diagnosisDate; + String? diagnosisBy; + bool? isCurrentDiagnosis; + String? id; + + Map toJson() { + final map = {}; + map['diagnosisText'] = diagnosisText; + map['diagnosisDate'] = diagnosisDate; + map['diagnosisBy'] = diagnosisBy; + map['isCurrentDiagnosis'] = isCurrentDiagnosis; + map['_id'] = id; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/rota/LiveRoasterResponseData.dart b/lib/models/rota/LiveRoasterResponseData.dart new file mode 100644 index 0000000..aa56389 --- /dev/null +++ b/lib/models/rota/LiveRoasterResponseData.dart @@ -0,0 +1,27 @@ +import 'WeekArrayData.dart'; + +class LiveRoasterResponseData { + LiveRoasterResponseData({ + this.daysArray, + }); + + LiveRoasterResponseData.fromJson(dynamic json) { + if (json['data'] != null && json['data'] is List) { + daysArray = []; + json['data'].forEach((v) { + daysArray?.add(DaysArrayData.fromJson(v)); + }); + } + } + + // List? liveRoster; + List? daysArray; + + Map toJson() { + final map = {}; + if (daysArray != null) { + map['data'] = daysArray?.map((v) => v.toJson()).toList(); + } + return map; + } +} diff --git a/lib/models/rota/LiveRoster.dart b/lib/models/rota/LiveRoster.dart new file mode 100644 index 0000000..2af5982 --- /dev/null +++ b/lib/models/rota/LiveRoster.dart @@ -0,0 +1,65 @@ +import 'ShiftLocation.dart'; + +class LiveRoster { + LiveRoster({ + this.id, + this.rotaTemplateId, + this.rosterStartDate, + this.rosterEndDate, + this.templateWeeks, + this.shiftLocation, + this.active, + this.lastModifiedBy, + this.createdAt, + this.updatedAt, + this.v,}); + + LiveRoster.fromJson(dynamic json) { + id = json['_id']; + rotaTemplateId = json['rotaTemplateId']; + rosterStartDate = json['rosterStartDate']; + rosterEndDate = json['rosterEndDate']; + templateWeeks = json['templateWeeks']; + if (json['shiftLocation'] != null && json['shiftLocation'] is List) { + shiftLocation = []; + json['shiftLocation'].forEach((v) { + shiftLocation?.add(ShiftLocation.fromJson(v)); + }); + } + active = json['active']; + lastModifiedBy = json['lastModifiedBy']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + v = json['__v']; + } + String? id; + String? rotaTemplateId; + int? rosterStartDate; + int? rosterEndDate; + int? templateWeeks; + List? shiftLocation; + bool? active; + String? lastModifiedBy; + String? createdAt; + String? updatedAt; + int? v; + + Map toJson() { + final map = {}; + map['_id'] = id; + map['rotaTemplateId'] = rotaTemplateId; + map['rosterStartDate'] = rosterStartDate; + map['rosterEndDate'] = rosterEndDate; + map['templateWeeks'] = templateWeeks; + if (shiftLocation != null) { + map['shiftLocation'] = shiftLocation?.map((v) => v.toJson()).toList(); + } + map['active'] = active; + map['lastModifiedBy'] = lastModifiedBy; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + map['__v'] = v; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/rota/Live_roaster_response.dart b/lib/models/rota/Live_roaster_response.dart new file mode 100644 index 0000000..3f5ebbc --- /dev/null +++ b/lib/models/rota/Live_roaster_response.dart @@ -0,0 +1,28 @@ +import 'LiveRoasterResponseData.dart'; + +class LiveRoasterResponse { + LiveRoasterResponse({ + this.status, + this.message, + this.data,}); + + LiveRoasterResponse.fromJson(dynamic json) { + status = json['status']; + message = json['message']; + data = json['data'] != null ? LiveRoasterResponseData.fromJson(json['data']) : null; + } + String? status; + String? message; + LiveRoasterResponseData? data; + + Map toJson() { + final map = {}; + map['status'] = status; + map['message'] = message; + if (data != null) { + map['data'] = data?.toJson(); + } + return map; + } + +} \ No newline at end of file diff --git a/lib/models/rota/ShiftArray.dart b/lib/models/rota/ShiftArray.dart new file mode 100644 index 0000000..77afaef --- /dev/null +++ b/lib/models/rota/ShiftArray.dart @@ -0,0 +1,113 @@ +import 'package:ftc_mobile_app/models/profile_screen_model.dart'; +import '../profileData/user_data.dart'; +import 'LiveRoster.dart'; +import 'Days.dart'; +import 'StaffHolidays.dart'; + +class ShiftArray { + ShiftArray({ + this.liveRoster, + this.staffHolidays, + this.staffUserId, + this.primaryWeek1EndDate, + this.primaryWeek2EndDate, + this.primaryWeek3EndDate, + this.rosterEndDate, + this.shiftStartTime, + this.shiftEndTime, + this.workHrs, + this.patientId, + this.secondaryWeeks, + this.primaryWeekNo, + this.noOfShifts, + this.addedby, + this.active, + this.isDelete, + this.days, + this.id, + this.templateId,}); + + ShiftArray.fromJson(dynamic json) { + liveRoster = json['liveRoster'] != null ? LiveRoster.fromJson(json['liveRoster']) : null; + staffHolidays = json['staffHolidays'] != null ? StaffHolidays.fromJson(json['staffHolidays']) : null; + staffUserId = json['staffUserId'] != null ? StaffMembers.fromJson(json['staffUserId']) : null; + primaryWeek1EndDate = json['primaryWeek1EndDate']; + primaryWeek2EndDate = json['primaryWeek2EndDate']; + primaryWeek3EndDate = json['primaryWeek3EndDate']; + rosterEndDate = json['rosterEndDate']; + shiftStartTime = json['shiftStartTime']; + shiftEndTime = json['shiftEndTime']; + workHrs = json['workHrs']; + patientId = json['patientId'] != null ? UserData.fromJson(json['patientId']) : null; + secondaryWeeks = json['secondaryWeeks'] != null ? json['secondaryWeeks'].cast() : []; + primaryWeekNo = json['primaryWeekNo']; + noOfShifts = json['noOfShifts']; + addedby = json['addedby']; + active = json['active']; + isDelete = json['isDelete']; + if (json['days'] != null) { + days = []; + json['days'].forEach((v) { + days?.add(Days.fromJson(v)); + }); + } + id = json['_id']; + templateId = json['templateId']; + } + LiveRoster? liveRoster; + StaffHolidays? staffHolidays; + StaffMembers? staffUserId; + int? primaryWeek1EndDate; + int? primaryWeek2EndDate; + int? primaryWeek3EndDate; + int? rosterEndDate; + int? shiftStartTime; + int? shiftEndTime; + int? workHrs; + UserData? patientId; + List? secondaryWeeks; + int? primaryWeekNo; + int? noOfShifts; + String? addedby; + bool? active; + bool? isDelete; + List? days; + String? id; + String? templateId; + + Map toJson() { + final map = {}; + if (liveRoster != null) { + map['liveRoster'] = liveRoster?.toJson(); + } + if (staffHolidays != null) { + map['staffHolidays'] = staffHolidays?.toJson(); + } + if (staffUserId != null) { + map['staffUserId'] = staffUserId?.toJson(); + } + map['primaryWeek1EndDate'] = primaryWeek1EndDate; + map['primaryWeek2EndDate'] = primaryWeek2EndDate; + map['primaryWeek3EndDate'] = primaryWeek3EndDate; + map['rosterEndDate'] = rosterEndDate; + map['shiftStartTime'] = shiftStartTime; + map['shiftEndTime'] = shiftEndTime; + map['workHrs'] = workHrs; + if (patientId != null) { + map['patientId'] = patientId?.toJson(); + } + map['secondaryWeeks'] = secondaryWeeks; + map['primaryWeekNo'] = primaryWeekNo; + map['noOfShifts'] = noOfShifts; + map['addedby'] = addedby; + map['active'] = active; + map['isDelete'] = isDelete; + if (days != null) { + map['days'] = days?.map((v) => v.toJson()).toList(); + } + map['_id'] = id; + map['templateId'] = templateId; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/rota/ShiftLocation.dart b/lib/models/rota/ShiftLocation.dart new file mode 100644 index 0000000..b92f3e0 --- /dev/null +++ b/lib/models/rota/ShiftLocation.dart @@ -0,0 +1,33 @@ +import 'WeekArrayData.dart'; + +class ShiftLocation { + ShiftLocation({ + this.locationId, + this.weekArray, + this.id,}); + + ShiftLocation.fromJson(dynamic json) { + locationId = json['locationId']; + if (json['weekArray'] != null && json['weekArray'] is List) { + weekArray = []; + json['weekArray'].forEach((v) { + weekArray?.add(WeekArrayData.fromJson(v)); + }); + } + id = json['_id']; + } + String? locationId; + List? weekArray; + String? id; + + Map toJson() { + final map = {}; + map['locationId'] = locationId; + if (weekArray != null) { + map['weekArray'] = weekArray?.map((v) => v.toJson()).toList(); + } + map['_id'] = id; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/rota/ShiftLocationData.dart b/lib/models/rota/ShiftLocationData.dart new file mode 100644 index 0000000..274e974 --- /dev/null +++ b/lib/models/rota/ShiftLocationData.dart @@ -0,0 +1,36 @@ +class ShiftLocationData { + ShiftLocationData({ + this.id, + this.shiftLocationName, + this.addedby, + this.active, + this.createdAt, + this.updatedAt,}); + + ShiftLocationData.fromJson(dynamic json) { + id = json['_id']; + shiftLocationName = json['shiftLocationName']; + addedby = json['addedby']; + active = json['active']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + } + String? id; + String? shiftLocationName; + String? addedby; + bool? active; + String? createdAt; + String? updatedAt; + + Map toJson() { + final map = {}; + map['_id'] = id; + map['shiftLocationName'] = shiftLocationName; + map['addedby'] = addedby; + map['active'] = active; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/rota/StaffHolidays.dart b/lib/models/rota/StaffHolidays.dart new file mode 100644 index 0000000..d393ea0 --- /dev/null +++ b/lib/models/rota/StaffHolidays.dart @@ -0,0 +1,27 @@ +class StaffHolidays { + StaffHolidays({ + this.isStaffHolidays, + this.calculatedDates,}); + + StaffHolidays.fromJson(dynamic json) { + isStaffHolidays = json['isStaffHolidays']; + // if (json['calculatedDates'] != null) { + // calculatedDates = []; + // json['calculatedDates'].forEach((v) { + // calculatedDates?.add(Dynamic.fromJson(v)); + // }); + // } + } + bool? isStaffHolidays; + List? calculatedDates; + + Map toJson() { + final map = {}; + map['isStaffHolidays'] = isStaffHolidays; + if (calculatedDates != null) { + map['calculatedDates'] = calculatedDates?.map((v) => v.toJson()).toList(); + } + return map; + } + +} \ No newline at end of file diff --git a/lib/models/rota/WeekArrayData.dart b/lib/models/rota/WeekArrayData.dart new file mode 100644 index 0000000..2180e20 --- /dev/null +++ b/lib/models/rota/WeekArrayData.dart @@ -0,0 +1,838 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/models/profile_screen_model.dart'; +import 'package:ftc_mobile_app/utilities/date_formatter.dart'; + +import 'ShiftLocationData.dart'; + +class WeekArrayData { + WeekArrayData({ + this.weekNo, + this.daysArray, + this.id, + }); + + WeekArrayData.fromJson(dynamic json) { + weekNo = json['weekNo']; + if (json['daysArray'] != null) { + daysArray = []; + json['daysArray'].forEach((v) { + daysArray?.add(DaysArrayData.fromJson(v)); + }); + } + id = json['_id']; + } + + int? weekNo; + List? daysArray; + String? id; + + Map toJson() { + final map = {}; + map['weekNo'] = weekNo; + if (daysArray != null) { + map['daysArray'] = daysArray?.map((v) => v.toJson()).toList(); + } + map['_id'] = id; + return map; + } +} + +class DaysArrayData { + DaysArrayData({ + this.dayName, + this.staffAssigned, + this.serviceUserAssigned, + this.staffUserId, + this.shiftDate, + this.shiftStartTime, + this.shiftEndTime, + this.workHrs, + this.note, + this.serviceUserId, + this.isSleepOver, + this.isOverNightStay, + this.lastModifiedBy, + this.active, + this.isDelete, + this.locationId, + this.rosterId, + this.isRequested, + this.id, + }); + + DaysArrayData.fromJson(dynamic json) { + dayName = json['dayName']; + staffAssigned = json['staffAssigned']; + serviceUserAssigned = json['serviceUserAssigned']; + staffUserId = json['staffUserId'] != null + ? StaffMembers.fromJson(json['staffUserId']) + : null; + shiftDate = json['shiftDate']; + shiftStartTime = json['shiftStartTime']; + shiftEndTime = json['shiftEndTime']; + workHrs = json['workHrs']; + note = json['note']; + serviceUserId = json['serviceUserId'] != null + ? UserData.fromJson(json['serviceUserId']) + : null; + locationId = json['locationId'] is Map + ? ShiftLocationData.fromJson(json['locationId']) + : null; + isSleepOver = json['isSleepOver']; + isOverNightStay = json['isOverNightStay']; + lastModifiedBy = json['lastModifiedBy']; + active = json['active']; + isDelete = json['isDelete']; + rosterId = json['rosterId']; + isRequested = json['isRequested']; + id = json['_id']; + + if (shiftDate != null) { + shiftDateTime = DateTime.fromMillisecondsSinceEpoch(shiftDate!).toLocal(); + } + + final f = DateFormatter(); + startTime = f.time24to12format(time: shiftStartTime ?? ""); + endTime = f.time24to12format(time: shiftEndTime ?? ""); + } + + String? dayName; + bool? staffAssigned; + bool? serviceUserAssigned; + StaffMembers? staffUserId; + int? shiftDate; + String? shiftStartTime; + String? shiftEndTime; + int? workHrs; + String? note; + UserData? serviceUserId; + bool? isSleepOver; + bool? isOverNightStay; + String? lastModifiedBy; + bool? active; + bool? isDelete; + String? rosterId; + bool? isRequested; + String? id; + ShiftLocationData? locationId; + + // local usage vars + DateTime? shiftDateTime; + + ///stores 12hour format of [shiftStartTime] and [shiftEndTime] + TimeOfDay? startTime, endTime; + + Map toJson() { + final map = {}; + map['dayName'] = dayName; + map['staffAssigned'] = staffAssigned; + map['serviceUserAssigned'] = serviceUserAssigned; + if (staffUserId != null) { + map['staffUserId'] = staffUserId?.toJson(); + } + map['shiftDate'] = shiftDate; + map['shiftStartTime'] = shiftStartTime; + map['shiftEndTime'] = shiftEndTime; + map['workHrs'] = workHrs; + map['note'] = note; + if (serviceUserId != null) { + map['serviceUserId'] = serviceUserId?.toJson(); + } + if (locationId != null) { + map['locationId'] = locationId?.toJson(); + } + map['isSleepOver'] = isSleepOver; + map['isOverNightStay'] = isOverNightStay; + map['lastModifiedBy'] = lastModifiedBy; + map['active'] = active; + map['isDelete'] = isDelete; + map['rosterId'] = rosterId; + map['isRequested'] = isRequested; + map['_id'] = id; + return map; + } +} + +// class ServiceUserId { +// ServiceUserId({ +// this.fcmTokens, +// this.location, +// this.profileVideoUrl, +// this.id, +// this.userModelName, +// this.name, +// this.version, +// this.email, +// this.phoneNumber, +// this.active, +// this.role, +// this.profilePictureUrl, +// this.deviceId, +// this.verificationCode, +// this.isVerified, +// this.approved, +// this.blocked, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.password, +// this.userSettings, +// this.modelId,}); +// +// ServiceUserId.fromJson(dynamic json) { +// fcmTokens = json['fcm_tokens'] != null ? FcmTokens.fromJson(json['fcm_tokens']) : null; +// location = json['location'] != null ? Location.fromJson(json['location']) : null; +// profileVideoUrl = json['profile_video_url']; +// id = json['_id']; +// userModelName = json['userModelName']; +// name = json['name']; +// version = json['version']; +// email = json['email']; +// phoneNumber = json['phoneNumber']; +// active = json['active']; +// role = json['role']; +// profilePictureUrl = json['profile_picture_url']; +// deviceId = json['deviceId']; +// verificationCode = json['verification_code']; +// isVerified = json['is_verified']; +// approved = json['approved']; +// blocked = json['blocked']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// password = json['password']; +// userSettings = json['userSettings']; +// modelId = json['modelId'] != null ? ModelId.fromJson(json['modelId']) : null; +// } +// FcmTokens? fcmTokens; +// Location? location; +// String? profileVideoUrl; +// String? id; +// String? userModelName; +// String? name; +// String? version; +// String? email; +// String? phoneNumber; +// bool? active; +// String? role; +// String? profilePictureUrl; +// String? deviceId; +// String? verificationCode; +// bool? isVerified; +// bool? approved; +// bool? blocked; +// String? createdAt; +// String? updatedAt; +// int? v; +// String? password; +// String? userSettings; +// ModelId? modelId; +// +// Map toJson() { +// final map = {}; +// if (fcmTokens != null) { +// map['fcm_tokens'] = fcmTokens?.toJson(); +// } +// if (location != null) { +// map['location'] = location?.toJson(); +// } +// map['profile_video_url'] = profileVideoUrl; +// map['_id'] = id; +// map['userModelName'] = userModelName; +// map['name'] = name; +// map['version'] = version; +// map['email'] = email; +// map['phoneNumber'] = phoneNumber; +// map['active'] = active; +// map['role'] = role; +// map['profile_picture_url'] = profilePictureUrl; +// map['deviceId'] = deviceId; +// map['verification_code'] = verificationCode; +// map['is_verified'] = isVerified; +// map['approved'] = approved; +// map['blocked'] = blocked; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// map['password'] = password; +// map['userSettings'] = userSettings; +// if (modelId != null) { +// map['modelId'] = modelId?.toJson(); +// } +// return map; +// } +// +// } +// +// class ModelId { +// ModelId({ +// this.aboutPatient, +// this.id, +// this.suLastName, +// this.suFirstMiddleName, +// this.suPreferredName, +// this.name, +// this.suSsn, +// this.providerName, +// this.suSex, +// this.suTitle, +// this.suDOB, +// this.suAge, +// this.suReferredBY, +// this.suFamilyHead, +// this.suAddress1, +// this.suAddress2, +// this.suCity, +// this.suState, +// this.suZip, +// this.suFirstVisitDate, +// this.suLastVisitDate, +// this.suProvider, +// this.currSU, +// this.suHomePhone, +// this.suWorkPhone, +// this.suMobileHomeNo, +// this.suMobileWorkNo, +// this.suEmailHome, +// this.suEmailWork, +// this.suPrefHomeNo, +// this.suPrefWorkNo, +// this.suEmergencyContact, +// this.seMedicalAlert, +// this.suNote, +// this.diagnosises, +// this.user, +// this.shifts, +// this.serviceUserMedications, +// this.homeVisitSignOut, +// this.srUsShiftsRequired, +// this.suEnquiries, +// this.active, +// this.createdAt, +// this.updatedAt, +// this.v,}); +// +// ModelId.fromJson(dynamic json) { +// aboutPatient = json['aboutPatient'] != null ? AboutPatient.fromJson(json['aboutPatient']) : null; +// id = json['_id']; +// suLastName = json['suLastName']; +// suFirstMiddleName = json['suFirstMiddleName']; +// suPreferredName = json['suPreferredName']; +// name = json['name']; +// suSsn = json['suSsn']; +// providerName = json['providerName']; +// suSex = json['suSex']; +// suTitle = json['suTitle']; +// suDOB = json['suDOB']; +// suAge = json['suAge']; +// suReferredBY = json['suReferredBY']; +// suFamilyHead = json['suFamilyHead']; +// suAddress1 = json['suAddress1']; +// suAddress2 = json['suAddress2']; +// suCity = json['suCity']; +// suState = json['suState']; +// suZip = json['suZip']; +// suFirstVisitDate = json['suFirstVisitDate']; +// suLastVisitDate = json['suLastVisitDate']; +// if (json['suProvider'] != null) { +// suProvider = []; +// json['suProvider'].forEach((v) { +// suProvider?.add(Dynamic.fromJson(v)); +// }); +// } +// currSU = json['currSU']; +// suHomePhone = json['suHomePhone']; +// suWorkPhone = json['suWorkPhone']; +// suMobileHomeNo = json['suMobileHomeNo']; +// suMobileWorkNo = json['suMobileWorkNo']; +// suEmailHome = json['suEmailHome']; +// suEmailWork = json['suEmailWork']; +// suPrefHomeNo = json['suPrefHomeNo']; +// suPrefWorkNo = json['suPrefWorkNo']; +// suEmergencyContact = json['suEmergencyContact']; +// seMedicalAlert = json['seMedicalAlert']; +// suNote = json['suNote']; +// if (json['diagnosises'] != null) { +// diagnosises = []; +// json['diagnosises'].forEach((v) { +// diagnosises?.add(Diagnosises.fromJson(v)); +// }); +// } +// user = json['user']; +// if (json['shifts'] != null) { +// shifts = []; +// json['shifts'].forEach((v) { +// shifts?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['serviceUserMedications'] != null) { +// serviceUserMedications = []; +// json['serviceUserMedications'].forEach((v) { +// serviceUserMedications?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['homeVisitSignOut'] != null) { +// homeVisitSignOut = []; +// json['homeVisitSignOut'].forEach((v) { +// homeVisitSignOut?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['srUsShiftsRequired'] != null) { +// srUsShiftsRequired = []; +// json['srUsShiftsRequired'].forEach((v) { +// srUsShiftsRequired?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['suEnquiries'] != null) { +// suEnquiries = []; +// json['suEnquiries'].forEach((v) { +// suEnquiries?.add(Dynamic.fromJson(v)); +// }); +// } +// active = json['active']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// } +// AboutPatient? aboutPatient; +// String? id; +// String? suLastName; +// String? suFirstMiddleName; +// String? suPreferredName; +// String? name; +// String? suSsn; +// String? providerName; +// String? suSex; +// String? suTitle; +// String? suDOB; +// String? suAge; +// String? suReferredBY; +// String? suFamilyHead; +// String? suAddress1; +// String? suAddress2; +// String? suCity; +// String? suState; +// String? suZip; +// String? suFirstVisitDate; +// String? suLastVisitDate; +// List? suProvider; +// bool? currSU; +// String? suHomePhone; +// String? suWorkPhone; +// String? suMobileHomeNo; +// String? suMobileWorkNo; +// String? suEmailHome; +// String? suEmailWork; +// String? suPrefHomeNo; +// String? suPrefWorkNo; +// String? suEmergencyContact; +// String? seMedicalAlert; +// String? suNote; +// List? diagnosises; +// String? user; +// List? shifts; +// List? serviceUserMedications; +// List? homeVisitSignOut; +// List? srUsShiftsRequired; +// List? suEnquiries; +// bool? active; +// String? createdAt; +// String? updatedAt; +// int? v; +// +// Map toJson() { +// final map = {}; +// if (aboutPatient != null) { +// map['aboutPatient'] = aboutPatient?.toJson(); +// } +// map['_id'] = id; +// map['suLastName'] = suLastName; +// map['suFirstMiddleName'] = suFirstMiddleName; +// map['suPreferredName'] = suPreferredName; +// map['name'] = name; +// map['suSsn'] = suSsn; +// map['providerName'] = providerName; +// map['suSex'] = suSex; +// map['suTitle'] = suTitle; +// map['suDOB'] = suDOB; +// map['suAge'] = suAge; +// map['suReferredBY'] = suReferredBY; +// map['suFamilyHead'] = suFamilyHead; +// map['suAddress1'] = suAddress1; +// map['suAddress2'] = suAddress2; +// map['suCity'] = suCity; +// map['suState'] = suState; +// map['suZip'] = suZip; +// map['suFirstVisitDate'] = suFirstVisitDate; +// map['suLastVisitDate'] = suLastVisitDate; +// if (suProvider != null) { +// map['suProvider'] = suProvider?.map((v) => v.toJson()).toList(); +// } +// map['currSU'] = currSU; +// map['suHomePhone'] = suHomePhone; +// map['suWorkPhone'] = suWorkPhone; +// map['suMobileHomeNo'] = suMobileHomeNo; +// map['suMobileWorkNo'] = suMobileWorkNo; +// map['suEmailHome'] = suEmailHome; +// map['suEmailWork'] = suEmailWork; +// map['suPrefHomeNo'] = suPrefHomeNo; +// map['suPrefWorkNo'] = suPrefWorkNo; +// map['suEmergencyContact'] = suEmergencyContact; +// map['seMedicalAlert'] = seMedicalAlert; +// map['suNote'] = suNote; +// if (diagnosises != null) { +// map['diagnosises'] = diagnosises?.map((v) => v.toJson()).toList(); +// } +// map['user'] = user; +// if (shifts != null) { +// map['shifts'] = shifts?.map((v) => v.toJson()).toList(); +// } +// if (serviceUserMedications != null) { +// map['serviceUserMedications'] = serviceUserMedications?.map((v) => v.toJson()).toList(); +// } +// if (homeVisitSignOut != null) { +// map['homeVisitSignOut'] = homeVisitSignOut?.map((v) => v.toJson()).toList(); +// } +// if (srUsShiftsRequired != null) { +// map['srUsShiftsRequired'] = srUsShiftsRequired?.map((v) => v.toJson()).toList(); +// } +// if (suEnquiries != null) { +// map['suEnquiries'] = suEnquiries?.map((v) => v.toJson()).toList(); +// } +// map['active'] = active; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// return map; +// } +// +// } +// +// class Diagnosises { +// Diagnosises({ +// this.diagnosisText, +// this.diagnosisDate, +// this.diagnosisBy, +// this.isCurrentDiagnosis, +// this.id,}); +// +// Diagnosises.fromJson(dynamic json) { +// diagnosisText = json['diagnosisText']; +// diagnosisDate = json['diagnosisDate']; +// diagnosisBy = json['diagnosisBy']; +// isCurrentDiagnosis = json['isCurrentDiagnosis']; +// id = json['_id']; +// } +// String? diagnosisText; +// String? diagnosisDate; +// String? diagnosisBy; +// bool? isCurrentDiagnosis; +// String? id; +// +// Map toJson() { +// final map = {}; +// map['diagnosisText'] = diagnosisText; +// map['diagnosisDate'] = diagnosisDate; +// map['diagnosisBy'] = diagnosisBy; +// map['isCurrentDiagnosis'] = isCurrentDiagnosis; +// map['_id'] = id; +// return map; +// } +// +// } +// +// class AboutPatient { +// AboutPatient({ +// this.aboutText, +// this.aboutDate, +// this.aboutBy,}); +// +// AboutPatient.fromJson(dynamic json) { +// aboutText = json['aboutText']; +// aboutDate = json['aboutDate']; +// aboutBy = json['aboutBy']; +// } +// String? aboutText; +// String? aboutDate; +// String? aboutBy; +// +// Map toJson() { +// final map = {}; +// map['aboutText'] = aboutText; +// map['aboutDate'] = aboutDate; +// map['aboutBy'] = aboutBy; +// return map; +// } +// +// } +// +// class Location { +// Location({ +// this.type, +// this.coordinates,}); +// +// Location.fromJson(dynamic json) { +// type = json['type']; +// coordinates = json['coordinates'] != null ? json['coordinates'].cast() : []; +// } +// String? type; +// List? coordinates; +// +// Map toJson() { +// final map = {}; +// map['type'] = type; +// map['coordinates'] = coordinates; +// return map; +// } +// +// } +// +// class FcmTokens { +// FcmTokens({ +// this.token, +// this.deviceType,}); +// +// FcmTokens.fromJson(dynamic json) { +// token = json['token']; +// deviceType = json['deviceType']; +// } +// String? token; +// String? deviceType; +// +// Map toJson() { +// final map = {}; +// map['token'] = token; +// map['deviceType'] = deviceType; +// return map; +// } +// +// } + +// class StaffUserId { +// StaffUserId({ +// this.contractedHours, +// this.id, +// this.staffMemberName, +// this.staffDesignation, +// this.staffOnLeave, +// this.supervisorId, +// this.holidays, +// this.complianceDocuments, +// this.niNumber, +// this.kin, +// this.user, +// this.clients, +// this.staffWorkLoads, +// this.staffHolidayRequests, +// this.staffTrainings, +// this.supervision, +// this.underSupervisions, +// this.staffWorkingDays, +// this.stafDob, +// this.active, +// this.covidCheck, +// this.createdAt, +// this.updatedAt, +// this.v, +// this.staffDisciplinaries, +// this.staffReferences,}); +// +// StaffUserId.fromJson(dynamic json) { +// contractedHours = json['contractedHours'] != null ? ContractedHours.fromJson(json['contractedHours']) : null; +// id = json['_id']; +// staffMemberName = json['staffMemberName']; +// staffDesignation = json['staffDesignation']; +// staffOnLeave = json['staffOnLeave']; +// supervisorId = json['supervisorId']; +// if (json['holidays'] != null) { +// holidays = []; +// json['holidays'].forEach((v) { +// holidays?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['complianceDocuments'] != null) { +// complianceDocuments = []; +// json['complianceDocuments'].forEach((v) { +// complianceDocuments?.add(Dynamic.fromJson(v)); +// }); +// } +// niNumber = json['niNumber']; +// kin = json['kin']; +// user = json['user']; +// if (json['clients'] != null) { +// clients = []; +// json['clients'].forEach((v) { +// clients?.add(Dynamic.fromJson(v)); +// }); +// } +// staffWorkLoads = json['staffWorkLoads'] != null ? json['staffWorkLoads'].cast() : []; +// if (json['staffHolidayRequests'] != null) { +// staffHolidayRequests = []; +// json['staffHolidayRequests'].forEach((v) { +// staffHolidayRequests?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['staffTrainings'] != null) { +// staffTrainings = []; +// json['staffTrainings'].forEach((v) { +// staffTrainings?.add(Dynamic.fromJson(v)); +// }); +// } +// supervision = json['supervision'] != null ? Supervision.fromJson(json['supervision']) : null; +// if (json['underSupervisions'] != null) { +// underSupervisions = []; +// json['underSupervisions'].forEach((v) { +// underSupervisions?.add(Dynamic.fromJson(v)); +// }); +// } +// if (json['staffWorkingDays'] != null) { +// staffWorkingDays = []; +// json['staffWorkingDays'].forEach((v) { +// staffWorkingDays?.add(Dynamic.fromJson(v)); +// }); +// } +// stafDob = json['stafDob']; +// active = json['active']; +// covidCheck = json['covidCheck']; +// createdAt = json['createdAt']; +// updatedAt = json['updatedAt']; +// v = json['__v']; +// staffDisciplinaries = json['staffDisciplinaries']; +// staffReferences = json['staffReferences']; +// } +// ContractedHours? contractedHours; +// String? id; +// String? staffMemberName; +// String? staffDesignation; +// bool? staffOnLeave; +// String? supervisorId; +// List? holidays; +// List? complianceDocuments; +// String? niNumber; +// String? kin; +// String? user; +// List? clients; +// List? staffWorkLoads; +// List? staffHolidayRequests; +// List? staffTrainings; +// Supervision? supervision; +// List? underSupervisions; +// List? staffWorkingDays; +// String? stafDob; +// bool? active; +// bool? covidCheck; +// String? createdAt; +// String? updatedAt; +// int? v; +// String? staffDisciplinaries; +// String? staffReferences; +// +// Map toJson() { +// final map = {}; +// if (contractedHours != null) { +// map['contractedHours'] = contractedHours?.toJson(); +// } +// map['_id'] = id; +// map['staffMemberName'] = staffMemberName; +// map['staffDesignation'] = staffDesignation; +// map['staffOnLeave'] = staffOnLeave; +// map['supervisorId'] = supervisorId; +// if (holidays != null) { +// map['holidays'] = holidays?.map((v) => v.toJson()).toList(); +// } +// if (complianceDocuments != null) { +// map['complianceDocuments'] = complianceDocuments?.map((v) => v.toJson()).toList(); +// } +// map['niNumber'] = niNumber; +// map['kin'] = kin; +// map['user'] = user; +// if (clients != null) { +// map['clients'] = clients?.map((v) => v.toJson()).toList(); +// } +// map['staffWorkLoads'] = staffWorkLoads; +// if (staffHolidayRequests != null) { +// map['staffHolidayRequests'] = staffHolidayRequests?.map((v) => v.toJson()).toList(); +// } +// if (staffTrainings != null) { +// map['staffTrainings'] = staffTrainings?.map((v) => v.toJson()).toList(); +// } +// if (supervision != null) { +// map['supervision'] = supervision?.toJson(); +// } +// if (underSupervisions != null) { +// map['underSupervisions'] = underSupervisions?.map((v) => v.toJson()).toList(); +// } +// if (staffWorkingDays != null) { +// map['staffWorkingDays'] = staffWorkingDays?.map((v) => v.toJson()).toList(); +// } +// map['stafDob'] = stafDob; +// map['active'] = active; +// map['covidCheck'] = covidCheck; +// map['createdAt'] = createdAt; +// map['updatedAt'] = updatedAt; +// map['__v'] = v; +// map['staffDisciplinaries'] = staffDisciplinaries; +// map['staffReferences'] = staffReferences; +// return map; +// } +// +// } +// +// class Supervision { +// Supervision({ +// this.supervisionName, +// this.sprDueDate, +// this.sprStatus, +// this.sprResult, +// this.templateTitleId,}); +// +// Supervision.fromJson(dynamic json) { +// supervisionName = json['supervisionName']; +// sprDueDate = json['sprDueDate']; +// sprStatus = json['sprStatus']; +// sprResult = json['sprResult']; +// templateTitleId = json['templateTitleId']; +// } +// String? supervisionName; +// String? sprDueDate; +// String? sprStatus; +// String? sprResult; +// String? templateTitleId; +// +// Map toJson() { +// final map = {}; +// map['supervisionName'] = supervisionName; +// map['sprDueDate'] = sprDueDate; +// map['sprStatus'] = sprStatus; +// map['sprResult'] = sprResult; +// map['templateTitleId'] = templateTitleId; +// return map; +// } +// +// } +// +// class ContractedHours { +// ContractedHours({ +// this.contractedHours, +// this.totalShiftHoursWeek, +// this.noOfShifts,}); +// +// ContractedHours.fromJson(dynamic json) { +// contractedHours = json['contractedHours']; +// totalShiftHoursWeek = json['totalShiftHoursWeek']; +// noOfShifts = json['noOfShifts']; +// } +// int? contractedHours; +// int? totalShiftHoursWeek; +// int? noOfShifts; +// +// Map toJson() { +// final map = {}; +// map['contractedHours'] = contractedHours; +// map['totalShiftHoursWeek'] = totalShiftHoursWeek; +// map['noOfShifts'] = noOfShifts; +// return map; +// } +// +// } diff --git a/lib/models/rota_shift_model.dart b/lib/models/rota_shift_model.dart new file mode 100644 index 0000000..5726a74 --- /dev/null +++ b/lib/models/rota_shift_model.dart @@ -0,0 +1,173 @@ +class RotaShift { + String managerName = ''; + String name = ''; + String staffRequired = ''; + String workerType = ''; + String location = ''; + String id = ''; //from service + String startTime = ''; //from service + String endTime = ''; //from service + String breakTime = ''; + String notes = ''; + + RotaShift.empty(); + + bool get havingShift { + return id.isNotEmpty || startTime.isNotEmpty || endTime.isNotEmpty; + } + + DateTime get shiftTime { + return DateTime.parse(startTime).toLocal(); + } + + DateTime get shiftStartTime { + return DateTime.parse(startTime).toLocal(); + } + + DateTime get shiftEndTime { + return endTime.isNotEmpty + ? DateTime.parse(endTime).toLocal() + : DateTime.now(); + } + + RotaShift({ + this.id = '', + required this.name, + required this.staffRequired, + required this.workerType, + required this.location, + required this.startTime, + required this.endTime, + required this.breakTime, + required this.notes, + this.managerName = "Emily Smith", + }); + + RotaShift.fromJson(Map json) { + id = json["_id"] ?? ""; + startTime = json["shftStartTime"] ?? ""; + endTime = json["shftEndTime"] ?? ""; + } + + @override + String toString() { + return 'RotaShift{managerName: $managerName, name: $name, staffRequired: $staffRequired, workerType: $workerType, location: $location, id: $id, startTime: $startTime, endTime: $endTime, breakTime: $breakTime, notes: $notes}'; + } +} + +class DayWiseRecord { + bool dayOn = false; + bool sleepOverRequired = false; + RotaShift rotaShift = RotaShift.empty(); + + DayWiseRecord.empty(); + + DayWiseRecord({ + required this.dayOn, + required this.sleepOverRequired, + required this.rotaShift, + }); + + DayWiseRecord.fromJson(Map json) { + dayOn = json["dayOn"] ?? false; + sleepOverRequired = json["sleepOverRequired"] ?? false; + if (json["shifts"] is List && json['shifts'].length != 0) { + rotaShift = RotaShift.fromJson(json["shifts"][0] ?? ""); + } + } + + @override + String toString() { + return 'DayWiseRecord{dayOn: $dayOn, sleepOverRequired: $sleepOverRequired, rotaShift: $rotaShift}'; + } +} + +class WeekWiseRecord { + DayWiseRecord mondayRecord = DayWiseRecord.empty(); + DayWiseRecord tuesdayRecord = DayWiseRecord.empty(); + DayWiseRecord wednesdayRecord = DayWiseRecord.empty(); + DayWiseRecord thursdayRecord = DayWiseRecord.empty(); + DayWiseRecord fridayRecord = DayWiseRecord.empty(); + DayWiseRecord saturdayRecord = DayWiseRecord.empty(); + DayWiseRecord sundayRecord = DayWiseRecord.empty(); + bool weekIncluded = false; + + WeekWiseRecord.empty(); + + WeekWiseRecord({ + required this.mondayRecord, + required this.tuesdayRecord, + required this.wednesdayRecord, + required this.thursdayRecord, + required this.fridayRecord, + required this.saturdayRecord, + required this.sundayRecord, + required this.weekIncluded, + }); + + WeekWiseRecord.fromJson(dynamic json) { + mondayRecord = DayWiseRecord.fromJson(json['monday'] ?? ""); + tuesdayRecord = DayWiseRecord.fromJson(json['tuesday'] ?? ""); + wednesdayRecord = DayWiseRecord.fromJson(json['wednesday'] ?? ""); + thursdayRecord = DayWiseRecord.fromJson(json['thursday'] ?? ""); + fridayRecord = DayWiseRecord.fromJson(json['friday'] ?? ""); + saturdayRecord = DayWiseRecord.fromJson(json['saturday'] ?? ""); + sundayRecord = DayWiseRecord.fromJson(json['sunday'] ?? ""); + weekIncluded = json['weekIncluded'] ?? false; + } + + @override + String toString() { + return 'WeekWiseRecord{mondayRecord: $mondayRecord, tuesdayRecord: $tuesdayRecord, wednesdayRecord: $wednesdayRecord, thursdayRecord: $thursdayRecord, fridayRecord: $fridayRecord, saturdayRecord: $saturdayRecord, sundayRecord: $sundayRecord, weekIncluded: $weekIncluded}'; + } +} + +//make variable for this model +class MonthWiseRecord { + WeekWiseRecord week1 = WeekWiseRecord.empty(); + WeekWiseRecord week2 = WeekWiseRecord.empty(); + WeekWiseRecord week3 = WeekWiseRecord.empty(); + WeekWiseRecord week4 = WeekWiseRecord.empty(); + String id = ""; + String serviceUser = ""; + String addedBy = ""; + String createdAt = ""; + String updatedAt = ""; + bool active = false; + int v = -1; + + MonthWiseRecord.empty(); + + MonthWiseRecord({ + required this.week1, + required this.week2, + required this.week3, + required this.week4, + required this.id, + required this.serviceUser, + required this.addedBy, + required this.createdAt, + required this.updatedAt, + required this.active, + required this.v, + }); + + MonthWiseRecord.fromJson(Map json) { + week1 = WeekWiseRecord.fromJson(json['week1'] ?? {}); + week2 = WeekWiseRecord.fromJson(json['week2'] ?? {}); + week3 = WeekWiseRecord.fromJson(json['week3'] ?? {}); + week4 = WeekWiseRecord.fromJson(json['week4'] ?? {}); + id = json["id"] ?? ""; + serviceUser = json["serviceUser"] ?? ""; + addedBy = json["addedBy"] ?? ""; + createdAt = json["createdAt"] ?? ""; + updatedAt = json["updatedAt"] ?? ""; + active = json["active"] ?? false; + v = json["v"] ?? -1; + } + + @override + String toString() { + return 'MonthWiseRecord{week1: $week1, week2: $week2, week3: $week3, week4: $week4, id: $id, serviceUser: $serviceUser, addedBy: $addedBy, createdAt: $createdAt, updatedAt: $updatedAt, active: $active, v: $v}'; + } +} diff --git a/lib/models/staffWorkload/StaffWorkloadResponse.dart b/lib/models/staffWorkload/StaffWorkloadResponse.dart new file mode 100644 index 0000000..77d9618 --- /dev/null +++ b/lib/models/staffWorkload/StaffWorkloadResponse.dart @@ -0,0 +1,208 @@ +class StaffWorkloadResponse { + StaffWorkloadResponse({ + this.status, + this.message, + this.data,}); + + StaffWorkloadResponse.fromJson(dynamic json) { + status = json['status']; + message = json['message']; + data = json['data'] != null ? StaffWorkloadData.fromJson(json['data']) : null; + } + String? status; + String? message; + StaffWorkloadData? data; + + Map toJson() { + final map = {}; + map['status'] = status; + map['message'] = message; + if (data != null) { + map['data'] = data?.toJson(); + } + return map; + } + +} + +class StaffWorkloadData { + StaffWorkloadData({ + this.staffWorkLoads, + this.count, + this.offset, + this.limit,}); + + StaffWorkloadData.fromJson(dynamic json) { + if (json['staffWorkLoads'] != null) { + staffWorkLoads = []; + json['staffWorkLoads'].forEach((v) { + staffWorkLoads?.add(StaffWorkLoads.fromJson(v)); + }); + } + count = json['count']; + offset = json['offset']; + limit = json['limit']; + } + List? staffWorkLoads; + int? count; + int? offset; + int? limit; + + Map toJson() { + final map = {}; + if (staffWorkLoads != null) { + map['staffWorkLoads'] = staffWorkLoads?.map((v) => v.toJson()).toList(); + } + map['count'] = count; + map['offset'] = offset; + map['limit'] = limit; + return map; + } + +} + +class StaffWorkLoads { + StaffWorkLoads({ + this.holidayEntitlement, + this.id, + this.isCurrentWrkLd, + this.startDate, + this.endDate, + this.holidayAlwnNoOfDys, + this.holidayAlwnNoOfHours, + this.holidaysAvailed, + this.holidaysRemaining, + this.staffMember, + this.carriedOverHours, + this.active, + this.createdAt, + this.updatedAt,}); + + StaffWorkLoads.fromJson(dynamic json) { + holidayEntitlement = json['holidayEntitlement'] != null ? HolidayEntitlement.fromJson(json['holidayEntitlement']) : null; + id = json['_id']; + isCurrentWrkLd = json['isCurrentWrkLd']; + startDate = json['startDate']; + endDate = json['endDate']; + holidayAlwnNoOfDys = json['holidayAlwnNoOfDys']; + holidayAlwnNoOfHours = json['holidayAlwnNoOfHours']; + holidaysAvailed = json['holidaysAvailed']; + holidaysRemaining = json['holidaysRemaining']; + staffMember = json['staffMember'] is Map ? StaffMember.fromJson(json['staffMember']) : null; + carriedOverHours = json['carriedOverHours']; + active = json['active']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + } + HolidayEntitlement? holidayEntitlement; + String? id; + bool? isCurrentWrkLd; + String? startDate; + String? endDate; + int? holidayAlwnNoOfDys; + int? holidayAlwnNoOfHours; + int? holidaysAvailed; + int? holidaysRemaining; + StaffMember? staffMember; + int? carriedOverHours; + bool? active; + String? createdAt; + String? updatedAt; + + Map toJson() { + final map = {}; + if (holidayEntitlement != null) { + map['holidayEntitlement'] = holidayEntitlement?.toJson(); + } + map['_id'] = id; + map['isCurrentWrkLd'] = isCurrentWrkLd; + map['startDate'] = startDate; + map['endDate'] = endDate; + map['holidayAlwnNoOfDys'] = holidayAlwnNoOfDys; + map['holidayAlwnNoOfHours'] = holidayAlwnNoOfHours; + map['holidaysAvailed'] = holidaysAvailed; + map['holidaysRemaining'] = holidaysRemaining; + if (staffMember != null) { + map['staffMember'] = staffMember?.toJson(); + } + map['carriedOverHours'] = carriedOverHours; + map['active'] = active; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + return map; + } + +} + +class StaffMember { + StaffMember({ + this.id, + this.user,}); + + StaffMember.fromJson(dynamic json) { + id = json['_id']; + user = json['user'] != null ? User.fromJson(json['user']) : null; + } + String? id; + User? user; + + Map toJson() { + final map = {}; + map['_id'] = id; + if (user != null) { + map['user'] = user?.toJson(); + } + return map; + } + +} + +class User { + User({ + this.id, + this.name, + this.profilePictureUrl,}); + + User.fromJson(dynamic json) { + id = json['_id']; + name = json['name']; + profilePictureUrl = json['profile_picture_url']; + } + String? id; + String? name; + String? profilePictureUrl; + + Map toJson() { + final map = {}; + map['_id'] = id; + map['name'] = name; + map['profile_picture_url'] = profilePictureUrl; + return map; + } + +} + +class HolidayEntitlement { + HolidayEntitlement({ + this.numberOfDays, + this.numberOfHours, + this.numberOfWeeks,}); + + HolidayEntitlement.fromJson(dynamic json) { + numberOfDays = json['numberOfDays']; + numberOfHours = json['numberOfHours']; + numberOfWeeks = json['numberOfWeeks']; + } + int? numberOfDays; + int? numberOfHours; + int? numberOfWeeks; + + Map toJson() { + final map = {}; + map['numberOfDays'] = numberOfDays; + map['numberOfHours'] = numberOfHours; + map['numberOfWeeks'] = numberOfWeeks; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/training/TrainingResponseData.dart b/lib/models/training/TrainingResponseData.dart new file mode 100644 index 0000000..f651db2 --- /dev/null +++ b/lib/models/training/TrainingResponseData.dart @@ -0,0 +1,168 @@ +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; + +class TrainingResponseData { + TrainingResponseData({ + this.proposedTrainings, + this.count, + this.offset, + this.limit, + }); + + TrainingResponseData.fromJson(dynamic json) { + if (json['proposedTrainings'] != null) { + proposedTrainings = []; + json['proposedTrainings'].forEach((v) { + proposedTrainings?.add(TrainingUsers.fromJson(v)); + }); + } + count = json['count']; + offset = json['offset']; + limit = json['limit']; + } + + List? proposedTrainings; + int? count; + int? offset; + int? limit; + + Map toJson() { + final map = {}; + if (proposedTrainings != null) { + map['proposedTrainings'] = + proposedTrainings?.map((v) => v.toJson()).toList(); + } + map['count'] = count; + map['offset'] = offset; + map['limit'] = limit; + return map; + } +} + +class TrainingUsers { + TrainingUsers({ + this.id, + this.user, + this.trainingId, + this.active, + this.createdAt, + this.updatedAt, + }); + + TrainingUsers.fromJson(dynamic json) { + id = json['_id']; + user = json['user'] != null ? UserData.fromJson(json['user']) : null; + trainingId = json['trainingId'] != null + ? ProposedTrainings.fromJson(json['trainingId']) + : null; + active = json['active']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + } + + String? id; + UserData? user; + ProposedTrainings? trainingId; + bool? active; + String? createdAt; + String? updatedAt; + + Map toJson() { + final map = {}; + map['_id'] = id; + if (user != null) { + map['user'] = user?.toJson(); + } + if (trainingId != null) { + map['trainingId'] = trainingId?.toJson(); + } + map['active'] = active; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + return map; + } +} + +class ProposedTrainings { + ProposedTrainings({ + this.id, + this.prpsName, + this.prpsDescription, + this.prpsTrgType, + this.prpsTrgClass, + this.prpsTrgStatus, + this.prpsTrgStartDate, + this.prpsTrgEndDate, + this.prpsTrgRegisterationDate, + this.addedby, + this.active, + this.contentType, + this.content, + this.createdAt, + this.updatedAt, + // this.users, + }); + + ProposedTrainings.fromJson(dynamic json) { + id = json['_id']; + prpsName = json['prpsName']; + prpsDescription = json['prpsDescription']; + prpsTrgType = json['prpsTrgType']; + prpsTrgClass = json['prpsTrgClass']; + prpsTrgStatus = json['prpsTrgStatus']; + prpsTrgStartDate = json['prpsTrgStartDate']; + prpsTrgEndDate = json['prpsTrgEndDate']; + prpsTrgRegisterationDate = json['prpsTrgRegisterationDate']; + addedby = json['addedby']; + active = json['active']; + contentType = json['contentType']; + content = json['content'] != null ? json['content'].cast() : []; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + // if (json['users'] != null) { + // users = []; + // json['users'].forEach((v) { + // users?.add(TrainingUsers.fromJson(v)); + // }); + // } + } + + String? id; + String? prpsName; + String? prpsDescription; + String? prpsTrgType; + String? prpsTrgClass; + String? prpsTrgStatus; + int? prpsTrgStartDate; + int? prpsTrgEndDate; + int? prpsTrgRegisterationDate; + dynamic addedby; + bool? active; + String? contentType; + List? content; + String? createdAt; + String? updatedAt; + // List? users; + + Map toJson() { + final map = {}; + map['_id'] = id; + map['prpsName'] = prpsName; + map['prpsDescription'] = prpsDescription; + map['prpsTrgType'] = prpsTrgType; + map['prpsTrgClass'] = prpsTrgClass; + map['prpsTrgStatus'] = prpsTrgStatus; + map['prpsTrgStartDate'] = prpsTrgStartDate; + map['prpsTrgEndDate'] = prpsTrgEndDate; + map['prpsTrgRegisterationDate'] = prpsTrgRegisterationDate; + map['addedby'] = addedby; + map['active'] = active; + map['contentType'] = contentType; + map['content'] = content; + map['createdAt'] = createdAt; + map['updatedAt'] = updatedAt; + // if (users != null) { + // map['users'] = users?.map((v) => v.toJson()).toList(); + // } + return map; + } +} diff --git a/lib/models/user_model.dart b/lib/models/user_model.dart new file mode 100644 index 0000000..88233d3 --- /dev/null +++ b/lib/models/user_model.dart @@ -0,0 +1,224 @@ + +class UserModel { + FcmTokenModel fcmTokens = FcmTokenModel.empty(); + LocationModel locationModel = LocationModel.empty(); + String id = ""; + String userModelName = ""; + String name = ""; + String version = "" ; + String email = "" ; + String phoneNumber = ""; + bool active = false; + String role = "" ; + String profilePictureUrl = "" ; + String deviceId = "" ; + String verificationCode = "" ; + bool isVerified = false; + bool approved = false; + bool blocked = false; + String createdAt = "" ; + String updatedAt = "" ; + int v = -1; + String password = "" ; + UserSettingsModel userSettingsModel = UserSettingsModel.empty(); + bool newUser = false; + + //old fields for UI + String profilePicture = ""; + String homeAddress = ""; + String nextOfKin = ""; + String diagnosisHistory = ""; + String diagnosisDate = ""; + String aboutPatient = ""; + + UserModel.empty(); + + UserModel({ + required this.name, + required this.profilePicture, + required this.phoneNumber, + required this.homeAddress, + required this.nextOfKin, + required this.diagnosisHistory, + required this.diagnosisDate, + required this.aboutPatient, + this.role ="", + }); + + + @override + String toString() { + return 'UserModel{fcmTokens: $fcmTokens, locationModel: $locationModel, id: $id, userModelName: $userModelName, name: $name, version: $version, email: $email, phoneNumber: $phoneNumber, active: $active, role: $role, profilePictureUrl: $profilePictureUrl, deviceId: $deviceId, verificationCode: $verificationCode, isVerified: $isVerified, approved: $approved, blocked: $blocked, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, password: $password, userSettingsModel: $userSettingsModel, newUser: $newUser, profilePicture: $profilePicture, homeAddress: $homeAddress, nextOfKin: $nextOfKin, diagnosisHistory: $diagnosisHistory, diagnosisDate: $diagnosisDate, aboutPatient: $aboutPatient}'; + } + + UserModel.fromJson(Map json){ + fcmTokens = FcmTokenModel.fromJson(json['fcm_tokens']??""); + locationModel = LocationModel.fromJson(json['location']??""); + id = json["_id"]??""; + userModelName = json["userModelName"]??""; + name = json["name"]??""; + version = json["version"]??''; + email = json["email"]??''; + phoneNumber = json["phoneNumber"]??''; + active = json["active"]??false; + role = json["role"]??''; + profilePictureUrl = json["profile_picture_url"]??''; + deviceId = json["deviceId"]??''; + verificationCode = json["verification_code"]??''; + isVerified = json["is_verified"]??false; + approved = json["approved"]??false; + blocked = json["blocked"]??false; + createdAt = json["createdAt"]??''; + updatedAt = json["updatedAt"]??''; + v = json["__v"]??-1; + password = json["password"]??''; + userSettingsModel = UserSettingsModel.fromJson(json["userSettings"]??""); + newUser = json['new_user']; + } + + Map toJson(){ + Map json = {}; + json['fcm_tokens'] = fcmTokens.toJson(); + json['location'] = locationModel.toJson(); + json["_id"] = id; + json["userModelName"] = userModelName; + json["name"] = name; + json["version"] = version; + json["email"] = email; + json["phoneNumber"] = phoneNumber; + json["active"] = active; + json["role"] = role; + json["profile_picture_url"] = profilePictureUrl; + json["deviceId"] = deviceId; + json["verification_code"] = verificationCode; + json["is_verified"] = isVerified ; + json["approved"] = approved ; + json["blocked"] = blocked ; + json["createdAt"] = createdAt; + json["updatedAt"] = updatedAt; + json["__v"] = v; + json["password"] = password; + json["userSettings"] = userSettingsModel.toJson(); + json['new_user'] = newUser; + return json; + } +} + +class FcmTokenModel{ + String token = ""; + String deviceType = ""; + + FcmTokenModel.empty(); + + FcmTokenModel.fromJson(Map json){ + token = json["token"] ?? ""; + deviceType = json["deviceType"] ?? ""; + } + + Map toJson(){ + Map json = {}; + json["token"] = token ; + json["deviceType"] = deviceType ; + return json; + } + + @override + String toString() { + return 'FcmTokenModel{token: $token, deviceType: $deviceType}'; + } +} + +class LocationModel{ + String type = ""; + List coordinates = []; + + LocationModel.empty(); + LocationModel.fromJson(Map json){ + type = json["type"]??""; + coordinates = json["coordinates"]??[]; + } + + double getLatitude(){return coordinates.first;} + double getLongitude(){return coordinates.last;} + + Map toJson(){ + Map json = {}; + json["type"] = type ; + json["coordinates"] = coordinates ; + return json; + } + + @override + String toString() { + return 'LocationModel{type: $type, coordinates: $coordinates}'; + } +} + +class UserSettingsModel{ + String id = ""; + String user = ""; + bool active = false; + String createdAt = ""; + String updatedAt = ""; + String v = ""; + NotificationSettings notificationSettings = NotificationSettings.empty(); + + UserSettingsModel.empty(); + + UserSettingsModel.fromJson(Map json){ + id = json["id"]??""; + user = json["user"]??""; + active = json["active"]??false; + createdAt = json["createdAt"]??""; + updatedAt = json["updatedAt"]??""; + v = json["v"]??""; + notificationSettings = + NotificationSettings.fromJson(json["notificationSettings"] ?? {"": ""}); + } + + Map toJson(){ + Map json = {}; + json["id"] = id; + json["user"] = user; + json["active"] = active; + json["createdAt"] = createdAt; + json["updatedAt"] = updatedAt; + json["v"] = v; + return json; + } + + @override + String toString() { + return 'UserSettingsModel{id: $id, user: $user, active: $active, createdAt: $createdAt, updatedAt: $updatedAt, v: $v, notificationSettings: $notificationSettings}'; + } +} + +class NotificationSettings{ + bool showActive = false; + bool pauseNotification = false; + String pauseDuration = ""; + String durationUnit = ""; + + NotificationSettings.empty(); + + NotificationSettings.fromJson(Map json){ + showActive = json["showActive"]??false; + pauseNotification = json["pauseNotification"]??false; + pauseDuration = json["pauseDuration"]??""; + durationUnit = json["durationUnit"]??""; + } + + Map toJson(){ + Map json = {}; + json["showActive"] = showActive; + json["pauseNotification"] = pauseNotification; + json["pauseDuration"] = pauseDuration; + json["durationUnit"] = durationUnit; + return json; + } + + @override + String toString() { + return 'NotificationSettings{showActive: $showActive, pauseNotification: $pauseNotification, pauseDuration: $pauseDuration, durationUnit: $durationUnit}'; + } +} \ No newline at end of file diff --git a/lib/utilities/app_session_manager.dart b/lib/utilities/app_session_manager.dart new file mode 100644 index 0000000..f5f07f5 --- /dev/null +++ b/lib/utilities/app_session_manager.dart @@ -0,0 +1,42 @@ +import 'package:ftc_mobile_app/dialogs/app_dialogs.dart'; +import 'package:get/get.dart'; +import 'package:stop_watch_timer/stop_watch_timer.dart'; + +class AppSessionManager extends GetxService { + static AppSessionManager instance = Get.find(); + + StopWatchTimer? _stopWatchTimer; + + startSessionTimer(int millis) async { + await _stopAndInitTimer(millis); + _stopWatchTimer?.onStartTimer(); + } + + _stopTimer() async { + _stopWatchTimer?.onStopTimer(); + await _stopWatchTimer?.dispose(); + _stopWatchTimer = null; + } + + _stopAndInitTimer(int millis) async { + _stopTimer(); + _initTimer(millis); + } + + _initTimer(int millis) { + _stopWatchTimer = StopWatchTimer( + mode: StopWatchMode.countDown, + presetMillisecond: millis, + onEnded: () { + _stopTimer(); + //Todo: Show session expire dialog and logout from app + + if (Get.isOverlaysOpen) Get.back(); + AppDialog.showUnauthorizedAlert(); + }); + } + + dispose() { + _stopWatchTimer?.dispose(); + } +} diff --git a/lib/utilities/assets_manager.dart b/lib/utilities/assets_manager.dart new file mode 100644 index 0000000..76974f0 --- /dev/null +++ b/lib/utilities/assets_manager.dart @@ -0,0 +1,155 @@ +class AssetsManager { + AssetsManager._(); + + static const String kAppIcon = "assets/images/png/app-logo-icon.png"; + static const String kLockIcon = "assets/images/svg/lock-icon.svg"; + static const String kCalendarIcon = + "assets/images/svg/nav_bar_calendar_icon.svg"; + static const String kHomeIcon = "assets/images/svg/nav_bar_home_icon.svg"; + static const String kMessageIcon = + "assets/images/svg/nav_bar_message_icon.svg"; + static const String kPeopleIcon = "assets/images/svg/nav_bar_people_icon.svg"; + static const String kPersonMainIcon = + "assets/images/svg/nav_bar_person_main_icon.svg"; + static const String kBackIcon = "assets/images/svg/back_icon.svg"; + static const String kCalendarAppointmentIcon = + "assets/images/svg/calendar_appointment_icon.svg"; + static const String kCarePlanIcon = "assets/images/svg/care_plan_icon.svg"; + static const String kNotesIcon = "assets/images/svg/notes_icon.svg"; + static const String kPhotoGalleryIcon = + "assets/images/svg/photo_gallery_icon.svg"; + static const String kGoToArrowIcon = + "assets/images/svg/got_to_arrow_button.svg"; + static const String kUploadIcon = "assets/images/svg/upload_icon.svg"; + static const String kFlagIcon = "assets/images/svg/flag_icon.svg"; + static const String kClockIcon = "assets/images/svg/clock_icon.svg"; + static const String kMicIcon = "assets/images/svg/microphone_mike.svg"; + static const String kBellIcon = "assets/images/svg/bell_icon.svg"; + static const String kManImage = "assets/images/svg/man_image.svg"; + static const String kManImagePng = "assets/images/svg/man_image_png.png"; + static const String kDrawerIcon = "assets/images/svg/menu_drawer_icon.svg"; + static const String kPeopleUnselectedIcon = + "assets/images/svg/people_unselected.svg"; + static const String kPoliciesIcon = "assets/images/svg/policies_icon.svg"; + static const String kSettingsIcon = "assets/images/svg/setting_icon.svg"; + static const String kSelectedCalendar = + "assets/images/svg/selected_calendar.svg"; + static const String kPlusIcon = "assets/images/svg/plus_icon.svg"; + static const String kArrowNextIcon = "assets/images/svg/arrow-next-icon.svg"; + static const String kPencilIcon = "assets/images/svg/pencil-icon.svg"; + static const String kFolderIcon = "assets/images/svg/folder_icon.svg"; + static const String kManBodyImage = "assets/images/svg/man_body_image.svg"; + static const String kPencilOutlineIcon = + "assets/images/svg/pencil_outline_icon.svg"; + static const String kEclipseIcon = "assets/images/svg/eclipse.svg"; + static const String kTriangleIcon = "assets/images/svg/triangle.svg"; + static const String kDustBinRedIcon = "assets/images/svg/dustbin_red.svg"; + + //care notes categories + static const String kIcGeneral = + "assets/images/svg/careNotesCategories/ic_general.svg"; + static const String kIcHealth = + "assets/images/svg/careNotesCategories/ic_health.svg"; + static const String kIcIndependentLiving = + "assets/images/svg/careNotesCategories/ic_independent_living.svg"; + static const String kIcIntractions = + "assets/images/svg/careNotesCategories/ic_intractions.svg"; + static const String kIcMentalWellbeing = + "assets/images/svg/careNotesCategories/ic_mental_wellbeing.svg"; + static const String kIcPersonalCare = + "assets/images/svg/careNotesCategories/ic_personal_care.svg"; + + //care notes Subcategories + static const String kIcAbc = + 'assets/images/svg/careNotesSubcatgeories/ic_abc.svg'; + static const String kIcActivity = + 'assets/images/svg/careNotesSubcatgeories/ic_activity.svg'; + static const String kIcAppointment = + 'assets/images/svg/careNotesSubcatgeories/ic_appointment.svg'; + static const String kIcCleaning = + 'assets/images/svg/careNotesSubcatgeories/ic_cleaning.svg'; + static const String kIcConsent = + 'assets/images/svg/careNotesSubcatgeories/ic_consent.svg'; + static const String kIcCooking = + 'assets/images/svg/careNotesSubcatgeories/ic_cooking.svg'; + static const String kIcEducation = + 'assets/images/svg/careNotesSubcatgeories/ic_education.svg'; + static const String kIcEmail = + 'assets/images/svg/careNotesSubcatgeories/ic_email.svg'; + static const String kIcFinance = + 'assets/images/svg/careNotesSubcatgeories/ic_finance.svg'; + static const String kIcHydration = + 'assets/images/svg/careNotesSubcatgeories/ic_hydration.svg'; + static const String kIcInjury = + 'assets/images/svg/careNotesSubcatgeories/ic_injury.svg'; + static const String kIcLaundry = + 'assets/images/svg/careNotesSubcatgeories/ic_laundry.svg'; + static const String kIcMeeting = + 'assets/images/svg/careNotesSubcatgeories/ic_meeting.svg'; + static const String kIcMood = + 'assets/images/svg/careNotesSubcatgeories/ic_mood.svg'; + static const String kIcMouthHygiene = + 'assets/images/svg/careNotesSubcatgeories/ic_mouth_hygiene.svg'; + static const String kIcNote = + 'assets/images/svg/careNotesSubcatgeories/ic_note.svg'; + static const String kIcOtherInteractions = + 'assets/images/svg/careNotesSubcatgeories/ic_other_interactions.svg'; + static const String kIcPhysicalIntervention = + 'assets/images/svg/careNotesSubcatgeories/ic_physical_intervention.svg'; + static const String kIcPublicInteraction = + 'assets/images/svg/careNotesSubcatgeories/ic_public_interaction.svg'; + static const String kIcReviews = + 'assets/images/svg/careNotesSubcatgeories/ic_reviews.svg'; + static const String kIcSafeguarding = + 'assets/images/svg/careNotesSubcatgeories/ic_safeguarding.svg'; + static const String kIcSearch = + 'assets/images/svg/careNotesSubcatgeories/ic_search.svg'; + static const String kIcShower = + 'assets/images/svg/careNotesSubcatgeories/ic_shower.svg'; + static const String kIcSleep = + 'assets/images/svg/careNotesSubcatgeories/ic_sleep.svg'; + static const String kIcTelephone = + 'assets/images/svg/careNotesSubcatgeories/ic_telephone.svg'; + static const String kIcToileting = + 'assets/images/svg/careNotesSubcatgeories/ic_toileting.svg'; + static const String kIcWeightHeight = + 'assets/images/svg/careNotesSubcatgeories/ic_weight_height.svg'; + static const String kIcOthers = + 'assets/images/svg/careNotesSubcatgeories/ic_others.svg'; + + //rating icons + static const String ratingsIcAngry = + 'assets/images/png/ratings/ic_angry.webp'; + static const String ratingsIcBored = + 'assets/images/png/ratings/ic_bored.webp'; + static const String ratingsIcCalm = 'assets/images/png/ratings/ic_calm.webp'; + static const String ratingsIcConfident = + 'assets/images/png/ratings/ic_confident.webp'; + static const String ratingsIcExcited = + 'assets/images/png/ratings/ic_excited.webp'; + static const String ratingsIcHappy = + 'assets/images/png/ratings/ic_happy.webp'; + static const String ratingsIcHopeful = + 'assets/images/png/ratings/ic_hopeful.webp'; + static const String ratingsIcNervous = + 'assets/images/png/ratings/ic_nervous.webp'; + static const String ratingsIcProud = + 'assets/images/png/ratings/ic_proud.webp'; + static const String ratingsIcRelaxed = + 'assets/images/png/ratings/ic_relaxed.webp'; + static const String ratingsIcSad = 'assets/images/png/ratings/ic_sad.webp'; + static const String ratingsIcScared = + 'assets/images/png/ratings/ic_scared.webp'; + static const String ratingsIcTired = + 'assets/images/png/ratings/ic_tired.webp'; + static const String ratingsIcWorried = + 'assets/images/png/ratings/ic_worried.webp'; + + static const String kConsentCapacityFormHtml = 'assets/consent-capacity.html'; + static const String svgHumanBodyFrontBack = 'assets/images/svg/human_body_front_back.svg'; + static const String pngHumanBodyFrontBack = 'assets/images/png/human_body_front_back.png'; + + static const String svgIcAdd = 'assets/images/svg/ic_add.svg'; + static const String svgIcAt = 'assets/images/svg/ic_at.svg'; + +} diff --git a/lib/utilities/constant_text.dart b/lib/utilities/constant_text.dart new file mode 100644 index 0000000..c663dfb --- /dev/null +++ b/lib/utilities/constant_text.dart @@ -0,0 +1,38 @@ +class ConstantText { + ConstantText._(); + + static const String kAppName = "FTC App"; + static const String kWelcomeBack = "Welcome Back!"; + static const String kPleaseLoginToContinue = "Please login to continue"; + static const String kPleaseInputEmail = "Please input your email"; + static const String kPleaseInputOTP = "Please input your otp"; + static const String kInvalidOTP = "Invalid otp"; + static const String kEmailHeading = "Email"; + static const String kPasswordHeading = "Password"; + static const String kEmailIsRequired = "Email is required"; + static const String kPasswordIsRequired = "Password is required"; + static const String kEmailPhoneIsRequired = "Email or Phone is required"; + static const String kInvalidEmail = "Invalid email"; + static const String kRememberMe = "Remember me"; + static const String kForgotPassword = "Forgot Password?"; + static const String kLogIn = "Log in"; + static const String kSubmit = "Submit"; + static const String kSave = "Save"; + static const String kSendCode = "Send code"; + static const String kAgencyLogin = "Agency log in"; + static const String kEmailOrPhoneHeading = "Email or Phone"; + static const String kInputEmailOrPhone = "Please input email or phone"; + static const String kOTPScreenMsg = "Enter the 6 digit code we sent to your email to log in. Your code is available for the next 12 hours."; + static const String kTwoFactorAuth = "2 Factor Authentication"; + static const String kTypeTitle = "Type Title"; + static const String kTitle = "Title"; + static const String kViewFullBodyMap = "View Full Body Map"; + static const String kFlagForHandover = "Flag for handover?"; + static const String kNoteDetails = "Note Details"; + static const String kNoteDetailsHint = "Enter note details here..."; + + + + static const String termsUrl = "https://ftcaresoftware.co.uk/terms-and-conditions.html"; + static const String privacyUrl = "https://ftcaresoftware.co.uk/app-privacy-policy.html"; +} \ No newline at end of file diff --git a/lib/utilities/custom_app_colors.dart b/lib/utilities/custom_app_colors.dart new file mode 100644 index 0000000..41438af --- /dev/null +++ b/lib/utilities/custom_app_colors.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +class CustomAppColors { + CustomAppColors._(); + + static const Color kTransparentColor = Colors.transparent; + static const Color kPrimaryColor = Color(0xFFFFFFFF); + static const Color kSecondaryColor = Color(0xFF278DEC); + static const Color kIconColor = Color(0xFF1D3F43); + static Color kLightGreyColor = Colors.grey.shade400; + static const Color kSmokeColor = Color(0xFFE9EBEC); + static const Color kLightTextColor = Color(0xFF9F9FA3); + static const Color kRedColor = Colors.red; + static const Color kDarkRedColor= Color(0xffDA0B0B); + static const Color kBlueColor= Color(0xff00577b); + static const Color kSeaGreenColor= Color(0xff00d194); + static const Color kLightPinkColor= Color(0xffff5a6b); + static const Color kBlackColor= Color(0xff000000); + static const Color kWhiteColor= Color(0xffffffff); + static const Color kGreenColor = Color(0xFF7dbe20); + static const Color kDarkGreenColor = Color(0xFF0AC247); + static const Color kDarkestGreenColor = Color(0xFF008000); + static const Color kDarkBlueTextColor = Color(0xff1D3F43); + static const Color kYellowColor = Color(0xffFFB800); + static const Color kDarkYellowColor = Color(0xffF2AE00); + +} diff --git a/lib/utilities/custom_router/custom_route_generator.dart b/lib/utilities/custom_router/custom_route_generator.dart new file mode 100644 index 0000000..b5443ed --- /dev/null +++ b/lib/utilities/custom_router/custom_route_generator.dart @@ -0,0 +1,555 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/view/screens/chat/arguments/chat_screen_args.dart'; +import 'package:ftc_mobile_app/view/screens/clients/addEditMemoryBox/add_edit_memory_box_screen.dart'; +import 'package:ftc_mobile_app/view/screens/clients/addEditRiskAssessment/add_edit_risk_assessment_screen.dart'; +import 'package:ftc_mobile_app/view/screens/clients/add_details_to_new_body_point_screen.dart'; +import 'package:ftc_mobile_app/view/screens/clients/add_new_document_screen.dart'; +import 'package:ftc_mobile_app/view/screens/clients/add_new_recent_incident_screen.dart'; +import 'package:ftc_mobile_app/view/screens/clients/all_care_notes_screen.dart'; +import 'package:ftc_mobile_app/view/screens/clients/careNoteForms/nutrition_hydration_form_screen.dart'; +import 'package:ftc_mobile_app/view/screens/clients/clients_new_view_module/add_new_pbs_plan_screen.dart'; +import 'package:ftc_mobile_app/view/screens/home/select_user_for_chat_screen.dart'; +import 'package:ftc_mobile_app/view/screens/settings/settings_screen.dart'; +import 'package:ftc_mobile_app/view/screens/training/training_detail_screen.dart'; +import 'package:ftc_mobile_app/view/screens/training/training_screen.dart'; +import 'package:ftc_mobile_app/view/screens/webview/webview_screen.dart'; +import '../../models/clients/allCareNotes/CarePlans.dart'; +import '../../view/screens/clients/careNoteForms/mood_rating_form.dart'; +import '../../view/screens/clients/care_note_detail_screen.dart'; + +class CustomRouteGenerator { + static GlobalKey navigatorKey = GlobalKey(); + + CustomRouteGenerator._(); + + static Object? argument; + + static Route? generateRoute(RouteSettings settings) { + debugPrint("Current Route: ${settings.name}"); + argument = settings.arguments; + switch (settings.name) { + // GetPage( + // name: CustomRouteNames.webviewScreen, + // page: () => WebviewScreen( + // args: Get.arguments as WebviewScreenArgument, + // ), + // binding: BindingsBuilder( + // () => Get.lazyPut(() => WebviewScreenController()))), + + case CustomRouteNames.kWebviewScreen: + return MaterialPageRoute( + builder: (context) { + return WebviewScreen( + args: settings.arguments as WebviewScreenArgument, + ); + }, + ); + case CustomRouteNames.kInitialRoute: + return MaterialPageRoute( + builder: (context) { + return const SplashScreen(); + }, + ); + case CustomRouteNames.kLoginScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const SignInScreen(); + }, + ); + case CustomRouteNames.kAgencySignInScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const AgencySignIn(); + }, + ); + case CustomRouteNames.kOTPScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const OTPScreen(); + }, + ); + case CustomRouteNames.kRotaDashboardScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const RotaDashboardScreen(); + }, + ); + // case CustomRouteNames.kCalendarScreenRoute: + // return MaterialPageRoute( + // builder: (context) { + // return CalendarScreen( + // controller: Get.put(CalendarViewScreenController()), + // ); + // }, + // ); + case CustomRouteNames.kBookHolidayScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const BookHolidayScreen(); + }, + ); + case CustomRouteNames.kClientsListScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const ClientsListScreen(); + }, + ); + case CustomRouteNames.kClientsProfileScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ClientProfileScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kAppointmentsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return AppointmentScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kNotesScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const NotesScreen(); + }, + ); + case CustomRouteNames.kSelectNoteScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const SelectNoteScreen(); + }, + ); + case CustomRouteNames.kNewNoteScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const NewNoteScreen(); + }, + ); + case CustomRouteNames.kCarePlanMenuScreenRoute: + return MaterialPageRoute( + builder: (context) { + return CarePlanMenuScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kDashboardScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const DashboardScreen(); + }, + ); + case CustomRouteNames.kPickUpShiftsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const PickUpShiftsScreen(); + }, + ); + case CustomRouteNames.kChatScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ChatScreen( + args: settings.arguments as ChatScreenArgs, + ); + }, + ); + case CustomRouteNames.kNotificationListScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const NotificationListScreen(); + }, + ); + case CustomRouteNames.kViewProfileScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const ViewProfileScreen(); + }, + ); + case CustomRouteNames.kYourRotaScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const YourRotaScreen(); + }, + ); + case CustomRouteNames.kInboxScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const InboxScreen(); + }, + ); + case CustomRouteNames.kDocumentsListScreenRoute: + return MaterialPageRoute( + builder: (context) { + return DocumentsListScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kDocumentDetailsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const DocumentDetailsScreen(); + }, + ); + case CustomRouteNames.kRecentIncidentsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return RecentIncidentsScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kCurrentHealthIssuesScreenRoute: + return MaterialPageRoute( + builder: (context) { + return CurrentHealthIssuesScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kConsentAndCapacityQuestionnaireScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ConsentAndCapacityQuestionnaireScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kConsentAndCapacityAddNewFormScreenRoute: + // ConsentDetailsModel consentDetailsModel = ConsentDetailsModel.empty(); + // if (settings.arguments != null && + // settings.arguments is ConsentDetailsModel && + // consentDetailsModel.description.isNotEmpty) { + // consentDetailsModel = settings.arguments as ConsentDetailsModel; + // } + return MaterialPageRoute( + builder: (context) { + return ConsentAndCapacityAddNewFormScreen( + args: + settings.arguments as ConsentAndCapacityAddNewFormScreenArgs, + ); + }, + ); + case CustomRouteNames.kLifeHistoryAndGoalsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const LifeHistoryAndGoalsScreen(); + }, + ); + case CustomRouteNames.kPBSPlanScreenRoute: + return MaterialPageRoute( + builder: (context) { + return PBSPlanScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kPhotoGalleryScreenRoute: + return MaterialPageRoute( + builder: (context) { + return PhotoGalleryScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kRiskAssessmentsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const RiskAssessmentsScreen(); + }, + ); + case CustomRouteNames.kRiskAssessmentsTemplateScreenRoute: + return MaterialPageRoute( + builder: (context) { + return RiskAssessmentsTemplateScreen( + userData: settings.arguments as UserData, + ); + }, + ); + case CustomRouteNames.kSupportPlanScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const SupportPlanScreen(); + }, + ); + case CustomRouteNames.kOverViewScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const OverviewScreen(); + }, + ); + case CustomRouteNames.kCrisisManagementScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const CrisisManagementScreen(); + }, + ); + case CustomRouteNames.kMentalHealthScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const MentalHealthScreen(); + }, + ); + case CustomRouteNames.kHealthScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const HealthScreen(); + }, + ); + case CustomRouteNames.kFuturePlansScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const FuturePlansScreen(); + }, + ); + case CustomRouteNames.kMyCurrentPlanScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const MyCurrentPlanScreen(); + }, + ); + case CustomRouteNames.kMyInterestsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const MyInterestsScreen(); + }, + ); + case CustomRouteNames.kThingsIWantYouToHelpScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const ThingsIWantYouToHelpScreen(); + }, + ); + case CustomRouteNames.kClientsIntroductionScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const ClientIntroductionScreen(); + }, + ); + case CustomRouteNames.kMedicationScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const MedicationScreen(); + }, + ); + case CustomRouteNames.kHealthFullBodyMapScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const HealthFullBodyMapScreen(); + }, + ); + case CustomRouteNames.kAddDetailsToNewPointScreenRoute: + return MaterialPageRoute( + builder: (context) { + return AddDetailsToNewBodyPointScreen( + args: settings.arguments as AddDetailsToNewBodyPointScreenArgs, + ); + }, + ); + case CustomRouteNames.kAddNewRecentIncidentsScreenRoute: + return MaterialPageRoute( + builder: (context) { + return AddNewRecentIncidentsScreen( + args: settings.arguments as AddNewRecentIncidentsScreenArgs, + ); + }, + ); + case CustomRouteNames.kAddNewPBSPlanScreenRoute: + return MaterialPageRoute( + builder: (context) { + return AddNewPBSPlanScreen( + args: settings.arguments as AddNewPBSPlanScreenArgs, + ); + }, + ); + case CustomRouteNames.kAddNewDocumentScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const AddNewDocumentScreen(); + }, + ); + case CustomRouteNames.kSelectUserForChatScreenRoute: + return MaterialPageRoute( + builder: (context) { + return const SelectUserForChatScreen(); + }, + ); + case CustomRouteNames.kCareNotesScreenRoute: + return MaterialPageRoute( + builder: (context) { + return CareNotesScreen( + args: settings.arguments as CareNotesScreenArgs, + ); + }, + ); + case CustomRouteNames.kCareNotesSubcategoriesScreenRoute: + return MaterialPageRoute( + builder: (context) { + return CareNotesSubcategoriesScreen( + args: settings.arguments as CareNotesSubcategoriesScreenArgs, + ); + }, + ); + case CustomRouteNames.kFreeTextEntriesScreenRoute: + return MaterialPageRoute( + builder: (context) { + return FreeTextEntriesFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kWeightHeightFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return WeightHeightFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kHealthAppointmentsFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return HealthAppointmentsFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kShoweringBathFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ShoweringBathFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kToiletingNoteFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ToiletingNoteFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kMoodRatingFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return MoodRatingFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kABCFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ABCFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kConsentCapacityFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ConsentCapacityFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kInjuryHealthIssueFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return InjuryHealthIssueFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kObservationsFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return ObservationsFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kSafeguardingFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return SafeguardingFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kPhysicalInterventionFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return PhysicalInterventionFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kNutritionHydrationFormScreenRoute: + return MaterialPageRoute( + builder: (context) { + return NutritionHydrationFormScreen( + args: settings.arguments as CommonCareNoteFormArgs, + ); + }, + ); + case CustomRouteNames.kAllCareNotesScreenRoute: + return MaterialPageRoute( + builder: (context) { + return AllCareNotesScreen( + args: settings.arguments as AllCareNotesScreenArgs, + ); + }, + ); + case CustomRouteNames.kCareNoteDetailScreenRoute: + return MaterialPageRoute( + builder: (_) { + return CareNoteDetailScreen(data: settings.arguments as CarePlan); + }, + fullscreenDialog: true); + case CustomRouteNames.kAddEditMemoryBoxScreen: + return MaterialPageRoute( + builder: (_) { + return AddEditMemoryBoxScreen( + args: settings.arguments as AddEditMemoryBoxScreenArgs); + }, + fullscreenDialog: true); + case CustomRouteNames.kAddEditRiskAssessmentScreen: + return MaterialPageRoute( + builder: (_) { + return AddEditRiskAssessmentScreen( + args: settings.arguments as AddEditRiskAssessmentScreenArgs); + }, + fullscreenDialog: true); + case CustomRouteNames.kSettingsScreen: + return MaterialPageRoute( + builder: (_) { + return const SettingsScreen(); + }, + ); + case CustomRouteNames.kTrainingsScreen: + return MaterialPageRoute( + builder: (_) { + return const TrainingsScreen(); + }, + ); + case CustomRouteNames.kTrainingDetailScreen: + return MaterialPageRoute( + builder: (_) { + return TrainingDetailScreen( + args: settings.arguments as TrainingDetailScreenArgs); + }, + fullscreenDialog: true); + + default: + return null; + } + } +} diff --git a/lib/utilities/custom_router/custom_route_names.dart b/lib/utilities/custom_router/custom_route_names.dart new file mode 100644 index 0000000..3ba39ba --- /dev/null +++ b/lib/utilities/custom_router/custom_route_names.dart @@ -0,0 +1,77 @@ +class CustomRouteNames { + CustomRouteNames._(); + + static const String kWebviewScreen = "/WebviewScreen"; + static const String kInitialRoute = "/"; + static const String kLoginScreenRoute = "/LoginScreenRoute"; + static const String kAgencySignInScreenRoute = "/AgencySignInScreenRoute"; + static const String kOTPScreenRoute = "/OTPScreenRoute"; + // static const String kCalendarScreenRoute = "/CalendarScreenRoute"; + static const String kRotaDashboardScreenRoute = "/RotaDashboardScreenRoute"; + static const String kBookHolidayScreenRoute = "/BookHolidayScreenRoute"; + static const String kClientsListScreenRoute = "/ClientsListScreenRoute"; + static const String kClientsProfileScreenRoute = "/ClientsProfileScreenRoute"; + static const String kAppointmentsScreenRoute = "/AppointmentsScreenRoute"; + static const String kNotesScreenRoute = "/NotesScreenRoute"; + static const String kSelectNoteScreenRoute = "/SelectNoteScreenRoute"; + static const String kNewNoteScreenRoute = "/NewNoteScreenRoute"; + static const String kCarePlanMenuScreenRoute = "/CarePlanMenuScreenRoute"; + static const String kDashboardScreenRoute = "/DashboardScreenRoute"; + static const String kPickUpShiftsScreenRoute = "/PickUpShiftScreenRoute"; + static const String kChatScreenRoute = "/ChatScreenRoute"; + static const String kNotificationListScreenRoute = "/NotificationListScreenRoute"; + static const String kViewProfileScreenRoute = "/ViewProfileScreenRoute"; + static const String kYourRotaScreenRoute = "/YourRotaScreenRoute"; + static const String kInboxScreenRoute = "/InboxScreenRoute"; + static const String kDocumentsListScreenRoute = "/kDocumentsListScreenRoute"; + static const String kDocumentDetailsScreenRoute = "/kDocumentDetailsScreenRoute"; + static const String kRecentIncidentsScreenRoute = "/kRecentIncidentsScreenRoute"; + static const String kCurrentHealthIssuesScreenRoute = "/kCurrentHealthIssuesScreenRoute"; + static const String kConsentAndCapacityQuestionnaireScreenRoute = "/kConsentAndCapacityQuestionnaireScreenRoute"; + static const String kConsentAndCapacityAddNewFormScreenRoute = "/kConsentAndCapacityAddNewFormScreenRoute"; + static const String kLifeHistoryAndGoalsScreenRoute = "/kLifeHistoryAndGoalsScreenRoute"; + static const String kPBSPlanScreenRoute = "/kPBSPlanScreenRoute"; + static const String kPhotoGalleryScreenRoute = "/kPhotoGalleryScreenRoute"; + static const String kRiskAssessmentsScreenRoute = "/kRiskAssessmentsScreenRoute"; + static const String kRiskAssessmentsTemplateScreenRoute = "/kRiskAssessmentsTemplateScreenRoute"; + static const String kSupportPlanScreenRoute = "/kSupportPlanScreenRoute"; + static const String kOverViewScreenRoute = "/kOverViewScreenRoute"; + static const String kCrisisManagementScreenRoute = "/kCrisisManagementScreenRoute"; + static const String kMentalHealthScreenRoute = "/kMentalHealthScreenRoute"; + static const String kHealthScreenRoute = "/kHealthScreenRoute"; + static const String kFuturePlansScreenRoute = "/kFuturePlansScreenRoute"; + static const String kMyCurrentPlanScreenRoute = "/kMyCurrentPlanScreenRoute"; + static const String kMyInterestsScreenRoute = "/kMyInterestsScreenRoute"; + static const String kThingsIWantYouToHelpScreenRoute = "/kThingsIWantYouToHelpScreenRoute"; + static const String kClientsIntroductionScreenRoute = "/kClientsIntroductionScreenRoute"; + static const String kMedicationScreenRoute = "/kMedicationScreenRoute"; + static const String kHealthFullBodyMapScreenRoute = "/kHealthFullBodyMapScreenRoute"; + static const String kAddDetailsToNewPointScreenRoute = "/kAddDetailsToNewPoint"; + static const String kAddNewRecentIncidentsScreenRoute = "/kAddNewRecentIncidentsScreenRoute"; + static const String kAddNewPBSPlanScreenRoute = "/kAddNewPBSPlanScreenRoute"; + static const String kAddNewDocumentScreenRoute = "/kAddNewDocumentScreenRoute"; + static const String kSelectUserForChatScreenRoute = "/kSelectUserForChatScreenRoute"; + + static const String kCareNotesScreenRoute = "/kCareNotesScreenRoute"; + static const String kCareNotesSubcategoriesScreenRoute = "/kCareNotesSubcategoriesScreenRoute"; + static const String kFreeTextEntriesScreenRoute = "/kFreeTextEntriesScreenRoute"; + static const String kWeightHeightFormScreenRoute = "/kWeightHeightFormScreenRoute"; + static const String kHealthAppointmentsFormScreenRoute = "/kHealthAppointmentsFormScreenRoute"; + static const String kShoweringBathFormScreenRoute = "/kShoweringBathFormScreenRoute"; + static const String kToiletingNoteFormScreenRoute = "/kToiletingNoteFormScreenRoute"; + static const String kMoodRatingFormScreenRoute = "/kMoodRatingFormScreenRoute"; + static const String kABCFormScreenRoute = "/kABCFormScreenRoute"; + static const String kConsentCapacityFormScreenRoute = "/kConsentCapacityFormScreenRoute"; + static const String kInjuryHealthIssueFormScreenRoute = "/kInjuryHealthIssueFormScreenRoute"; + static const String kObservationsFormScreenRoute = "/kObservationsFormScreenRoute"; + static const String kSafeguardingFormScreenRoute = "/kSafeguardingFormScreenRoute"; + static const String kPhysicalInterventionFormScreenRoute = "/kPhysicalInterventionFormScreenRoute"; + static const String kNutritionHydrationFormScreenRoute = "/kNutritionHydrationFormScreenRoute"; + static const String kAllCareNotesScreenRoute = "/kAllCareNotesScreenRoute"; + static const String kCareNoteDetailScreenRoute = "/kCareNoteDetailScreenRoute"; + static const String kAddEditMemoryBoxScreen = "/kAddEditMemoryBoxScreen"; + static const String kAddEditRiskAssessmentScreen = "/kAddEditRiskAssessmentScreen"; + static const String kSettingsScreen = "/kSettingsScreen"; + static const String kTrainingsScreen = "/kTrainingsScreen"; + static const String kTrainingDetailScreen = "/kTrainingDetailScreen"; +} \ No newline at end of file diff --git a/lib/utilities/custom_router/export_custom_router.dart b/lib/utilities/custom_router/export_custom_router.dart new file mode 100644 index 0000000..eb51a87 --- /dev/null +++ b/lib/utilities/custom_router/export_custom_router.dart @@ -0,0 +1,2 @@ +export 'custom_route_names.dart'; +export 'custom_route_generator.dart'; \ No newline at end of file diff --git a/lib/utilities/custom_theme.dart b/lib/utilities/custom_theme.dart new file mode 100644 index 0000000..4412e79 --- /dev/null +++ b/lib/utilities/custom_theme.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomTheme { + CustomTheme._(); + + static ThemeData defaultTheme() { + return ThemeData( + useMaterial3: true, + fontFamily: "Roboto", + colorScheme: const ColorScheme.light( + primary: CustomAppColors.kSecondaryColor + ), + progressIndicatorTheme: const ProgressIndicatorThemeData( + color: CustomAppColors.kSecondaryColor), + checkboxTheme: CheckboxThemeData( + shape: RoundedRectangleBorder( + side: const BorderSide( + color: CustomAppColors.kSmokeColor, + width: 0.6, + ), + borderRadius: BorderRadius.circular( + 5.r, + ), + ), + ), + // radioTheme: RadioThemeData( + // fillColor: MaterialStateProperty.resolveWith((states) { + // if (states.contains(MaterialState.pressed)) { + // return CustomAppColors.kSecondaryColor; + // } + // return Colors.white; + // }), + // ), + splashColor: CustomAppColors.kTransparentColor, + ); + } +} diff --git a/lib/utilities/custom_timeago_messages.dart b/lib/utilities/custom_timeago_messages.dart new file mode 100644 index 0000000..c6dd16c --- /dev/null +++ b/lib/utilities/custom_timeago_messages.dart @@ -0,0 +1,33 @@ +import 'package:get_time_ago/get_time_ago.dart'; + +class CustomTimeAgoMessages implements Messages { + @override + String prefixAgo() => ''; + + @override + String suffixAgo() => ''; + + @override + String secsAgo(int seconds) => 'a moment ago'; + + @override + String minAgo(int minutes) => 'a minute ago'; + + @override + String minsAgo(int minutes) => '$minutes minutes ago'; + + @override + String hourAgo(int minutes) => 'an hour ago'; + + @override + String hoursAgo(int hours) => '$hours hours ago'; + + @override + String dayAgo(int hours) => 'yesterday'; + + @override + String daysAgo(int days) => '$days days ago'; + + @override + String wordSeparator() => ' '; +} diff --git a/lib/utilities/custom_ui_over_lay.dart b/lib/utilities/custom_ui_over_lay.dart new file mode 100644 index 0000000..fd162ac --- /dev/null +++ b/lib/utilities/custom_ui_over_lay.dart @@ -0,0 +1,31 @@ +import 'package:flutter/services.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomUIOverLay { + CustomUIOverLay._(); + + static Future initialize() async { + _appStatusBarNavBarTheme(); + _setSystemOrientation(); + } + + static void _appStatusBarNavBarTheme() { + SystemChrome.setSystemUIOverlayStyle( + const SystemUiOverlayStyle( + systemNavigationBarColor: CustomAppColors.kTransparentColor, + systemNavigationBarDividerColor: CustomAppColors.kPrimaryColor, + systemNavigationBarIconBrightness: Brightness.dark, + statusBarIconBrightness: Brightness.dark, + statusBarBrightness: Brightness.light, + statusBarColor: CustomAppColors.kTransparentColor, + ), + ); + } + + static void _setSystemOrientation() { + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + // DeviceOrientation.portraitDown, + ]); + } +} diff --git a/lib/utilities/date_formatter.dart b/lib/utilities/date_formatter.dart new file mode 100644 index 0000000..e1f68bc --- /dev/null +++ b/lib/utilities/date_formatter.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class DateFormatter { + static final dateFormatter = DateFormat("dd-MM-yyyy"); + static final dateFormatter2 = DateFormat("dd/MM/yyyy"); + + String todayTomorrowYesterday(DateTime dateToCheck) { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final yesterday = DateTime(now.year, now.month, now.day - 1); + final tomorrow = DateTime(now.year, now.month, now.day + 1); + + final aDate = + DateTime(dateToCheck.year, dateToCheck.month, dateToCheck.day); + if (aDate == today) { + return 'Today'; + } else if (aDate == yesterday) { + return 'Yesterday'; + } else if (aDate == tomorrow) { + return 'Tomorrow'; + } else { + return 'nothing'; + } + } + + // String getRotaHeadingDate(DateTime dateTime) { + // String wordDate = todayTomorrowYesterday(dateTime); + // String date = DateFormat("yMMMMd").format(dateTime); + // return wordDate != 'nothing' + // ? "$wordDate, ${date.split(" ").first.substring(0, 3)} ${dateTime.day}" + // : "${date.split(" ").first.substring(0, 3)} ${dateTime.day}"; + // } + + String getRotaDate(DateTime dateTime) { + //Nov 1, 5AM-0PM + String date = DateFormat("yMMMMd").format(dateTime); + return "${date.split(" ").first.substring(0, 3)} ${dateTime.day}, ${dateTime.hour}AM-${dateTime.minute}PM"; + } + + DateTime? time24to12formatDate({required String time}) { + try { + if (time.isEmpty) { + return null; + } + final f = DateFormat("HH:mm"); + return f.parse(time); + } catch (e) { + debugPrint(e.toString()); + return null; + } + } + + TimeOfDay? time24to12format({required String time}) { + final dateTime = time24to12formatDate(time: time); + return (dateTime == null) ? null : TimeOfDay.fromDateTime(dateTime); + } + + String roasterShiftFormattedTime({required String time}) { + final dateTime = time24to12formatDate(time: time); + return (dateTime == null) ? "" : DateFormat("hh:mm aa").format(dateTime); + } + + String getRotaNewDate( + {required int shiftDate, + required String startShiftTime, + required String endShiftTime}) { + if (shiftDate == 0 || startShiftTime.isEmpty || endShiftTime.isEmpty) { + return ""; + } + + final f = DateFormat("HH:mm"); + final sd = f.parse(startShiftTime); + final ed = f.parse(endShiftTime); + final date = DateTime.fromMillisecondsSinceEpoch(shiftDate); + + return "${DateFormat("MMM dd").format(date)}, ${DateFormat("hha").format(sd)} - ${DateFormat("hha").format(ed)}"; + } + + String getAppointmentTime(DateTime dateTime) { + //Nov 1 + String date = DateFormat("yMMMMd").format(dateTime); + return "${date.split(" ").first.substring(0, 3)} ${dateTime.day}"; + } + + String getHolidayDate(DateTime dateTime) { + //jan 2, 2024 + String date = DateFormat("MMM dd, yyyy").format(dateTime); + return "${date.split(" ").first.substring(0, 3)} ${dateTime.day}, ${dateTime.year}"; + } + + String getFormattedDateFromUtc(String utcTime) { + try { + return DateFormat("yyyy-MM-dd") + .parse(utcTime, true) + .toLocal() + .toString() + .split(" ") + .first; //String 2024-02-22 + } catch (e) { + return ""; + } + } + + static String ddMMyyyyhhmmFormat(DateTime date) { + return DateFormat("dd/MM/yyyy hh:mm aa").format(date); + } +} diff --git a/lib/utilities/enums/api_method.dart b/lib/utilities/enums/api_method.dart new file mode 100644 index 0000000..9edafae --- /dev/null +++ b/lib/utilities/enums/api_method.dart @@ -0,0 +1,9 @@ +enum ApiMethod { + get, + post, + put, + patch, + delete; + + String get value => name; +} \ No newline at end of file diff --git a/lib/utilities/enums/body_parts.dart b/lib/utilities/enums/body_parts.dart new file mode 100644 index 0000000..627668b --- /dev/null +++ b/lib/utilities/enums/body_parts.dart @@ -0,0 +1,54 @@ +enum BodyPart { + fronthead(topPercent: 11, leftPercent: 19.5, apiValue: 'fronthead'), + backhead(topPercent: 11, leftPercent: 77.5, apiValue: 'backhead'), + righteye(topPercent: 14, leftPercent: 17, apiValue: 'righteye'), + lefteye(topPercent: 14, leftPercent: 22, apiValue: 'lefteye'), + rightear(topPercent: 15, leftPercent: 14, apiValue: 'rightear'), + leftear(topPercent: 15, leftPercent: 25.5, apiValue: 'leftear'), + nose(topPercent: 16, leftPercent: 19.5, apiValue: 'nose'), + mouth(topPercent: 18, leftPercent: 19.5, apiValue: 'mouth'), + neck(topPercent: 21, leftPercent: 19.5, apiValue: 'neck'), + nape(topPercent: 20, leftPercent: 77.5, apiValue: 'nape'), + rightshoulder(topPercent: 26, leftPercent: 7.5, apiValue: 'rightshoulder'), + leftshoulder(topPercent: 26, leftPercent: 31.5, apiValue: 'leftshoulder'), + rightshoulderblade(topPercent: 26, leftPercent: 88.5, apiValue: 'rightshoulderblade'), + leftshoulderblade(topPercent: 26, leftPercent: 66.5, apiValue: 'leftshoulderblade'), + rightArm(topPercent: 35, leftPercent: 5.5, apiValue: 'rightArm'), + leftArm(topPercent: 35, leftPercent: 33.5, apiValue: 'leftArm'), + rightforearm(topPercent: 46, leftPercent: 4.5, apiValue: 'rightforearm'), + leftforearm(topPercent: 46, leftPercent: 34.5, apiValue: 'leftforearm'), + rightelbow(topPercent: 41, leftPercent: 93, apiValue: 'rightelbow'), + leftelbow(topPercent: 41, leftPercent: 62, apiValue: 'leftelbow'), + rightwrist(topPercent: 51, leftPercent: 3, apiValue: 'rightwrist'), + leftwrist(topPercent: 51, leftPercent: 36, apiValue: 'leftwrist'), + righthand(topPercent: 55, leftPercent: 3, apiValue: 'righthand'), + lefthand(topPercent: 55, leftPercent: 36, apiValue: 'lefthand'), + chest(topPercent: 30, leftPercent: 19.5, apiValue: 'chest'), + topback(topPercent: 30, leftPercent: 77.5, apiValue: 'topback'), + middleback(topPercent: 38, leftPercent: 77.5, apiValue: 'middleback'), + bottomback(topPercent: 47, leftPercent: 77.5, apiValue: 'bottomback'), + abdomen(topPercent: 40, leftPercent: 19.5, apiValue: 'abdomen'), + lefthip(topPercent: 54, leftPercent: 67, apiValue: 'lefthip'), + righthip(topPercent: 54, leftPercent: 88.3, apiValue: 'righthip'), + rightbuttock(topPercent: 52, leftPercent: 83, apiValue: 'rightbuttock'), + leftbuttock(topPercent: 52, leftPercent: 72, apiValue: 'leftbuttock'), + groin(topPercent: 54, leftPercent: 19.5, apiValue: 'groin'), + rightthigh(topPercent: 61, leftPercent: 13.5, apiValue: 'rightthigh'), + leftthigh(topPercent: 61, leftPercent: 25.5, apiValue: 'leftthigh'), + rightknee(topPercent: 73, leftPercent: 13.5, apiValue: 'rightknee'), + leftknee(topPercent: 73, leftPercent: 25.5, apiValue: 'leftknee'), + rightcalf(topPercent: 81, leftPercent: 84, apiValue: 'rightcalf'), + leftcalf(topPercent: 81, leftPercent: 71.5, apiValue: 'leftcalf'), + leftankle(topPercent: 93, leftPercent: 25, apiValue: 'leftankle'), + rightankle(topPercent: 93, leftPercent: 14.5, apiValue: 'rightankle'), + leftfoot(topPercent: 96, leftPercent: 25, apiValue: 'leftfoot'), + rightfoot(topPercent: 96, leftPercent: 14.5, apiValue: 'rightfoot'), + leftheel(topPercent: 94, leftPercent: 72.5, apiValue: 'leftheel'), + rightheel(topPercent: 94, leftPercent: 83, apiValue: 'rightheel'); + + final double topPercent; + final double leftPercent; + final String apiValue; + + const BodyPart({required this.topPercent, required this.leftPercent, required this.apiValue}); +} \ No newline at end of file diff --git a/lib/utilities/enums/care_note_form_type.dart b/lib/utilities/enums/care_note_form_type.dart new file mode 100644 index 0000000..2d0b799 --- /dev/null +++ b/lib/utilities/enums/care_note_form_type.dart @@ -0,0 +1,120 @@ +///Note: when adding new type, make sure to add condition in [CareNotesFormType.fromText] also +enum CareNotesFormType { + injuryHealthIssueForm("injuryHealthIssueForm", "InjuryHealthIssue"), + weightHeightForm("weightHeightForm", "WeightHeight"), + healthAppointmentForm("healthAppointmentForm", "HealthAppointments"), + observationsForm("observationsForm", "Observations"), + healthOtherForm("healthOtherForm", 'HealthOther'), + generalNoteForm("generalNoteForm", "GeneralNote"), + activitiesForm("activitiesForm", "Activities"), + sleepForm("sleepForm", "Sleep"), + safeguardingForm("safeguardingForm", "Safeguarding"), + generalOtherForm("generalOtherForm", "GeneralOther"), + toiletingNoteForm("toiletingNoteForm", "Toileting"), + showeringBathForm("showeringBathForm", "ShoweringBath"), + mouthHygieneForm("mouthHygieneForm", "MouthHygiene"), + personalCareOtherForm("personalCareOtherForm", "PersonalCareOther"), + moodRatingForm("moodRatingForm", "MoodRating"), + ABCForm("ABCForm", "ABC"), + physicalInterventionForm("physicalInterventionForm", "PhysicalIntervention"), + consentCapacityForm("consentCapacityForm", "ConsentCapacityMCADOLS"), + mentalWellbeingOtherForm("mentalWellbeingOtherForm", "MentalWellbeingOther"), + meetingsForm("meetingsForm", "Meetings"), + telephoneCallsForm("telephoneCallsForm", "TelephoneCalls"), + reviewsForm("reviewsForm", "Reviews"), + emailsForm("emailsForm", "Emails"), + allOtherInteractionsForm("allOtherInteractionsForm", "AllOtherInteractions"), + professionalFamilyInteractionsOtherForm( + "professionalFamilyInteractionsOtherForm", + "ProfessionalFamilyInteractionsOther"), + laundryForm("laundryForm", "Laundry"), + cookingForm("cookingForm", "Cooking"), + nutritionHydrationForm("nutritionHydrationForm", "NutritionHydration"), + cleaningForm("cleaningForm", "Cleaning"), + financeForm("financeForm", "Finance"), + publicInteractionForm("publicInteractionForm", "PublicInteraction"), + educationForm("educationForm", "Education"), + independentLivingOtherForm( + "independentLivingOtherForm", "IndependentLivingOther"), + ; + + final String text; + final String apiValue; + + const CareNotesFormType(this.text, this.apiValue); + + factory CareNotesFormType.fromText(String text) { + if (text == CareNotesFormType.injuryHealthIssueForm.text) { + return CareNotesFormType.injuryHealthIssueForm; + } else if (text == CareNotesFormType.weightHeightForm.text) { + return CareNotesFormType.weightHeightForm; + } else if (text == CareNotesFormType.healthAppointmentForm.text) { + return CareNotesFormType.healthAppointmentForm; + } else if (text == CareNotesFormType.observationsForm.text) { + return CareNotesFormType.observationsForm; + } else if (text == CareNotesFormType.healthOtherForm.text) { + return CareNotesFormType.healthOtherForm; + } else if (text == CareNotesFormType.generalNoteForm.text) { + return CareNotesFormType.generalNoteForm; + } else if (text == CareNotesFormType.activitiesForm.text) { + return CareNotesFormType.activitiesForm; + } else if (text == CareNotesFormType.sleepForm.text) { + return CareNotesFormType.sleepForm; + } else if (text == CareNotesFormType.safeguardingForm.text) { + return CareNotesFormType.safeguardingForm; + } else if (text == CareNotesFormType.generalOtherForm.text) { + return CareNotesFormType.generalOtherForm; + } else if (text == CareNotesFormType.showeringBathForm.text) { + return CareNotesFormType.showeringBathForm; + } else if (text == CareNotesFormType.mouthHygieneForm.text) { + return CareNotesFormType.mouthHygieneForm; + } else if (text == CareNotesFormType.personalCareOtherForm.text) { + return CareNotesFormType.personalCareOtherForm; + } else if (text == CareNotesFormType.moodRatingForm.text) { + return CareNotesFormType.moodRatingForm; + } else if (text == CareNotesFormType.toiletingNoteForm.text) { + return CareNotesFormType.toiletingNoteForm; + } else if (text == CareNotesFormType.ABCForm.text) { + return CareNotesFormType.ABCForm; + } else if (text == CareNotesFormType.physicalInterventionForm.text) { + return CareNotesFormType.physicalInterventionForm; + } else if (text == CareNotesFormType.consentCapacityForm.text) { + return CareNotesFormType.consentCapacityForm; + } else if (text == CareNotesFormType.mentalWellbeingOtherForm.text) { + return CareNotesFormType.mentalWellbeingOtherForm; + } else if (text == CareNotesFormType.meetingsForm.text) { + return CareNotesFormType.meetingsForm; + } else if (text == CareNotesFormType.telephoneCallsForm.text) { + return CareNotesFormType.telephoneCallsForm; + } else if (text == CareNotesFormType.reviewsForm.text) { + return CareNotesFormType.reviewsForm; + } else if (text == CareNotesFormType.emailsForm.text) { + return CareNotesFormType.emailsForm; + } else if (text == CareNotesFormType.allOtherInteractionsForm.text) { + return CareNotesFormType.allOtherInteractionsForm; + } else if (text == + CareNotesFormType.professionalFamilyInteractionsOtherForm.text) { + return CareNotesFormType.professionalFamilyInteractionsOtherForm; + } else if (text == CareNotesFormType.laundryForm.text) { + return CareNotesFormType.laundryForm; + } else if (text == CareNotesFormType.cookingForm.text) { + return CareNotesFormType.cookingForm; + } else if (text == CareNotesFormType.nutritionHydrationForm.text) { + return CareNotesFormType.nutritionHydrationForm; + } else if (text == CareNotesFormType.cleaningForm.text) { + return CareNotesFormType.cleaningForm; + } else if (text == CareNotesFormType.financeForm.text) { + return CareNotesFormType.financeForm; + } else if (text == CareNotesFormType.publicInteractionForm.text) { + return CareNotesFormType.publicInteractionForm; + } else if (text == CareNotesFormType.educationForm.text) { + return CareNotesFormType.educationForm; + } else if (text == CareNotesFormType.independentLivingOtherForm.text) { + return CareNotesFormType.independentLivingOtherForm; + } else { + throw ArgumentError( + '$text doesn\'t match any CareNotesFormTypes. Add following condition in CareNotesFormType.fromText factory constructor: \nelse if (text == CareNotesFormType.$text.text) {return CareNotesFormType.$text;}', + "text"); + } + } +} diff --git a/lib/utilities/export_utilities.dart b/lib/utilities/export_utilities.dart new file mode 100644 index 0000000..1a80ca0 --- /dev/null +++ b/lib/utilities/export_utilities.dart @@ -0,0 +1,11 @@ +export 'custom_router/export_custom_router.dart'; +export 'mixins/export_mixins.dart'; +export 'extensions/export_extensions.dart'; +export 'local_storage_manager/export_local_storage.dart'; +export 'constant_text.dart'; +export 'custom_theme.dart'; +export 'custom_app_colors.dart'; +export 'custom_ui_over_lay.dart'; +export 'assets_manager.dart'; +export 'frequent_functions.dart'; +export 'date_formatter.dart'; \ No newline at end of file diff --git a/lib/utilities/extensions/custom_extensions.dart b/lib/utilities/extensions/custom_extensions.dart new file mode 100644 index 0000000..33f09ab --- /dev/null +++ b/lib/utilities/extensions/custom_extensions.dart @@ -0,0 +1,200 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/loading_widget.dart'; +import 'package:get/get.dart'; + +//BuildContext +extension BuildContextExtensions on BuildContext { + showErrorSnackBar({required String message, Duration? duration}) { + try { + ScaffoldMessenger.of(this).showSnackBar(SnackBar( + content: Text(message), + backgroundColor: Colors.red, + duration: duration ?? const Duration(seconds: 4), + )); + } catch (e) { + debugPrint(e.toString()); + } + } +} + +// num +extension NumExtensions on num { + BorderRadius toRadius() { + return BorderRadius.circular(toDouble().r); + } + + RoundedRectangleBorder toRoundedRectRadius() { + return RoundedRectangleBorder(borderRadius: toRadius()); + } + + num percentOf(num value) { + return value * (this / 100.0); + } + + double toRadian() { + return this * pi / 180; + } + + double toDegree() { + return this * 180 / pi; + } + + double get milesToMeters => this * 1609.344; + + double get metersToMiles => this / 1609.344; +} + +// string +extension StringExtensions on String? { + bool isNullOrEmpty() { + return (this == null || this!.isEmpty); + } + + bool isNullOrEmptyNot() { + return (this != null && this!.isNotEmpty); + } + + String removeSpaces() { + return this?.replaceAll(RegExp(r"\s\b|\b\s"), "") ?? ""; + } + + bool get hasDigitsOnly { + return isNotNullOrEmpty() && RegExp(r'^[0-9]+$').hasMatch(this!); + } +} + +// widgets +extension WidgetsExtension on Widget { + // add click + Widget addInkwell({required Function onClick}) { + return InkWell( + child: this, + onTap: () => onClick(), + ); + } + + // add padding + Widget addPaddingAll(num value) { + return Padding( + padding: REdgeInsets.all(value.toDouble()), + child: this, + ); + } + + // add horizontal padding + Widget addPaddingHorizontal(num value) { + return Padding( + padding: REdgeInsets.symmetric(horizontal: value.toDouble()), + child: this, + ); + } + + // add vertical padding + Widget addPaddingVertical(num value) { + return Padding( + padding: REdgeInsets.symmetric(vertical: value.toDouble()), + child: this, + ); + } + + Widget alignCenterLeft() { + return Align(alignment: Alignment.centerLeft, child: this); + } + + Widget alignCenterRight() { + return Align(alignment: Alignment.centerRight, child: this); + } + + Widget alignCenter() { + return Align(alignment: Alignment.center, child: this); + } +} + +//bool +extension BoolExtensions on bool { + bool get not => !this; +} + +//object +extension ObjectExtension on Object? { + bool isNullObject() => this == null; + + bool isNotNull() => isNullObject().not; + + bool isNullOrEmpty() { + if (this is String) { + return (isNullObject() || (this as String).isEmpty); + } else if (this is List) { + return (isNullObject() || (this as List).isEmpty); + } else { + return isNullObject(); + } + } + + bool isNotNullOrEmpty() => isNullOrEmpty().not; +} + +extension HexColor on Color { + /// String is in the format "aabbcc" or "ffaabbcc" with an optional leading "#". + static Color fromHex(String hexString) { + final buffer = StringBuffer(); + if (hexString.length == 6 || hexString.length == 7) buffer.write('ff'); + buffer.write(hexString.replaceFirst('#', '')); + return Color(int.parse(buffer.toString(), radix: 16)); + } + + /// Prefixes a hash sign if [leadingHashSign] is set to `true` (default is `true`). + String toHex({bool leadingHashSign = true}) => '${leadingHashSign ? '#' : ''}' + '${alpha.toRadixString(16).padLeft(2, '0')}' + '${red.toRadixString(16).padLeft(2, '0')}' + '${green.toRadixString(16).padLeft(2, '0')}' + '${blue.toRadixString(16).padLeft(2, '0')}'; +} + +extension TimeOfDayChecker on TimeOfDay { + bool isBefore(TimeOfDay other) { + // print("now: $hour:$minute"); + // print("other: ${other.hour}:${other.minute}"); + // final int minutes1 = hour * 60 + minute; + // final int minutes2 = other.hour * 60 + other.minute; + // + // return minutes1 < minutes2; + + print("isBefore"); + print("now: $hour:$minute"); + print("other: ${other.hour}:${other.minute}"); + final n = DateTime.now(); + final d1 = DateTime(n.year, n.month, n.day, hour, minute); + final d2 = DateTime(n.year, n.month, n.day, other.hour, other.minute); + // final int minutes1 = hour * 60 + minute; + // final int minutes2 = other.hour * 60 + other.minute; + + return d1.isBefore(d2); + } + + bool isAfter(TimeOfDay other) { + print("isAfter"); + print("now: $hour:$minute"); + print("other: ${other.hour}:${other.minute}"); + final n = DateTime.now(); + final d1 = DateTime(n.year, n.month, n.day, hour, minute); + final d2 = DateTime(n.year, n.month, n.day, other.hour, other.minute); + // final int minutes1 = hour * 60 + minute; + // final int minutes2 = other.hour * 60 + other.minute; + + return d1.isAfter(d2); + } +} + +extension FutureExt on Future { + Future showLoader() { + return Get.showOverlay( + asyncFunction: () async => this, + opacity: 1, + opacityColor: Colors.black.withOpacity(0.5), + loadingWidget: const LoadingWidget(), + ); + } +} diff --git a/lib/utilities/extensions/export_extensions.dart b/lib/utilities/extensions/export_extensions.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/utilities/fcm_notifications.dart b/lib/utilities/fcm_notifications.dart new file mode 100644 index 0000000..04e8006 --- /dev/null +++ b/lib/utilities/fcm_notifications.dart @@ -0,0 +1,150 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/foundation.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter_app_badger/flutter_app_badger.dart'; +import 'notification_util.dart'; +import 'package:get/get.dart'; +import 'extensions/custom_extensions.dart'; + +class FcmNotification { + static FcmNotification? _instance; + + static FcmNotification getInstance() { + _instance ??= FcmNotification(); + return _instance!; + } + + init() async { + FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); + await Firebase.initializeApp(); + _firebaseCloudMessagingListeners(); + } + + Future _firebaseCloudMessagingListeners() async { + // ios permission + if (Platform.isIOS) iOSPermission(); + await FirebaseMessaging.instance + .setForegroundNotificationPresentationOptions( + alert: false, // Required to display a heads up notification + badge: true, + sound: true, + ); + //foreground message + FirebaseMessaging.onMessage.listen((RemoteMessage remoteMessage) async { + // RemoteNotification notificationData = remoteMessage.notification; + + if (kDebugMode) log("new message received: ${remoteMessage.data}"); + + incrementNotificationCount(); + + // final data = Notifications.fromJson(remoteMessage.data); + + // if (Get.currentRoute == AppRoute.individualChatScreen && + // data.contentType == notificationContentTypeMessage) return; + + if (Platform.isAndroid) { + NotificationUtils.showDefaultNotification( + title: "${remoteMessage.notification?.title}", + body: '${remoteMessage.notification?.body}', + payload: remoteMessage.data, + ); + } + }); + // Also handle any interaction when the app is in the background via a + // Stream listener + FirebaseMessaging.onMessageOpenedApp.listen( + (RemoteMessage? remoteMessage) async { + if (remoteMessage != null) { + handleAppNotification(remoteMessage.data); + } + }, + ); + } + + Future iOSPermission() async { + NotificationSettings settings = + await FirebaseMessaging.instance.requestPermission( + alert: true, + announcement: false, + badge: true, + carPlay: false, + criticalAlert: false, + provisional: false, + sound: true, + ); + debugPrint('User granted permission: ${settings.authorizationStatus}'); + } + + void selectNotification(String? payload) async { + debugPrint('selected notification payload: $payload'); + + if (payload != null) { + var messageData = jsonDecode(payload); + handleAppNotification(messageData); + } + } +} + +handleAppNotification(Map payload) { + if (kDebugMode) { + log("Handle App Notification: $payload"); + } + // onNotificationTap(Notifications.fromJson(payload)); +} + +// onNotificationTap(Notifications notification) { +// if (TradePersonNotificationContentTypes.toOpenJobDetailPage +// .contains(notification.contentType)) { +// _gotoJobDetailScreen(notification.content); +// } else if (ClientNotificationContentTypes.toOpenJobDetailPage +// .contains(notification.contentType)) { +// if (notification.content == null) { +// debugPrint("content null"); +// return; +// } +// +// final id = JobDetail.fromJson(notification.content!).id; +// if (id.isNullOrEmpty()) { +// debugPrint("job id missing"); +// return; +// } +// AppRoute.toJobDetailScreen(args: JobDetailScreenArgs(jobId: id)); +// } else if (notification.contentType == notificationContentTypeMessage) { +// if (notification.content == null) { +// debugPrint("content null"); +// return; +// } +// final message = ChatModel.fromJson(notification.content); +// AppRoute.toIndividualChatScreen( +// arguments: IndividualChatScreenArgs( +// otherUserId: message.sentBy!.id!, +// name: message.sentBy!.fullname ?? emptyString, +// profilePicPath: message.sentBy!.profilePic ?? emptyString, +// otherUserType: message.sentBy!.userType!, +// onLastMessageUpdate: (ChatModel message) {}, +// ), +// ); +// } +// } + +incrementNotificationCount() async { + //Todo + // try { + // final appProviderController = AppProviderController.instance; + // appProviderController.notiCountUp(); + // if (await FlutterAppBadger.isAppBadgeSupported()) { + // FlutterAppBadger.updateBadgeCount( + // appProviderController.notificationCount()); + // } + // } catch (e) { + // debugPrint(e.toString()); + // } +} + +Future firebaseMessagingBackgroundHandler(RemoteMessage message) async { + debugPrint("Handling a background message: ${message.data}, ${message.ttl}"); + incrementNotificationCount(); +} diff --git a/lib/utilities/frequent_functions.dart b/lib/utilities/frequent_functions.dart new file mode 100644 index 0000000..31aeca3 --- /dev/null +++ b/lib/utilities/frequent_functions.dart @@ -0,0 +1,221 @@ +import 'package:get_time_ago/get_time_ago.dart'; +import 'extensions/custom_extensions.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:intl/intl.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; + +class FrequentFunctions { + FrequentFunctions._(); + + static final _instance = FrequentFunctions._(); + // static Rx userModel = UserModel.empty().obs; + // static ProfileDataModel profileDataModelNew = ProfileDataModel.fromJson( + // json.decode(LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kProfileModelKey))); + + factory FrequentFunctions() { + return _instance; + } + + static const noWidget = SizedBox.shrink(); + + static const waterDropHeader = WaterDropHeader( + waterDropColor: CustomAppColors.kSecondaryColor, + complete: FrequentFunctions.noWidget, + failed: FrequentFunctions.noWidget, + completeDuration: Duration.zero, + ); + + static DateFormat careNoteDateFormatter = DateFormat("dd/MM/yyyy, hh:mm aa"); + + void logoutButtonPressed(BuildContext context) { + // LocalStorageManager.removeSession(token: LocalStorageKeys.kUserModelKey); + // LocalStorageManager.removeSession(token: LocalStorageKeys.kProfileModelKey); + LocalStorageManager.clear(); + + Navigator.pushNamedAndRemoveUntil( + context, CustomRouteNames.kLoginScreenRoute, (route) => false); + } + + static void showToast( + {required String message, Toast toast = Toast.LENGTH_SHORT}) { + Fluttertoast.showToast( + msg: message, + toastLength: toast, + gravity: ToastGravity.BOTTOM, + timeInSecForIosWeb: 1, + backgroundColor: CustomAppColors.kBlackColor, + textColor: CustomAppColors.kPrimaryColor, + fontSize: 13.0, + ); + } + + // static void showDialog( + // {required BuildContext context, + // required String title, + // required String description, + // required DialogType type, + // Color btnOkColor = CustomAppColors.kSecondaryColor, + // Function? onOkBtnPressed}) { + // AwesomeDialog( + // customHeader: Image.asset(AssetsManager.kAppIcon), + // dismissOnBackKeyPress: true, + // context: context, + // dialogType: type, + // headerAnimationLoop: false, + // animType: AnimType.scale, + // btnOkColor: btnOkColor, + // title: title, + // dismissOnTouchOutside: true, + // desc: description, + // btnOkOnPress: () { + // if (onOkBtnPressed != null) { + // onOkBtnPressed(); + // } + // }, + // ).show(); + // } + + List findDaysWithData(MonthWiseRecord monthWiseRecord) { + // print('Month: ${monthWiseRecord.id}'); + List rotaShiftListReturning = []; + + for (var weekRecord in [ + monthWiseRecord.week1, + monthWiseRecord.week2, + monthWiseRecord.week3, + monthWiseRecord.week4, + ]) { + for (var day in [ + weekRecord.mondayRecord, + weekRecord.tuesdayRecord, + weekRecord.wednesdayRecord, + weekRecord.thursdayRecord, + weekRecord.fridayRecord, + weekRecord.saturdayRecord, + weekRecord.sundayRecord + ]) { + if (day.rotaShift.havingShift && + day.rotaShift.shiftTime.isAfter(DateTime.now())) { + rotaShiftListReturning.add(day.rotaShift); + } + } + } + return rotaShiftListReturning; + } + + static Future datePicker(BuildContext context) async { + return await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime.now(), + lastDate: DateTime.now().add(const Duration(days: 365)), + ); + } + + static Future selectTime(BuildContext context, + {required TimeOfDay selectedTime, required Color themeColor}) => + showTimePicker( + context: context, + initialTime: selectedTime, + initialEntryMode: TimePickerEntryMode.dialOnly, + confirmText: "CONFIRM", + helpText: "Select Time", + builder: (context, child) { + return MediaQuery( + data: + MediaQuery.of(context).copyWith(alwaysUse24HourFormat: false), + child: Theme( + data: Theme.of(context).copyWith( + timePickerTheme: TimePickerThemeData( + backgroundColor: Colors.white, + // hourMinuteShape: const RoundedRectangleBorder( + // borderRadius: BorderRadius.all(Radius.circular(8)), + // side: BorderSide(color: Colors.orange, width: 4), + // ), + dayPeriodBorderSide: + const BorderSide(color: Colors.black, width: 1), + dayPeriodColor: MaterialStateColor.resolveWith((states) => + states.contains(MaterialState.selected) + ? themeColor + : CustomAppColors.kSmokeColor), + // shape: const RoundedRectangleBorder( + // borderRadius: BorderRadius.all(Radius.circular(8)), + // side: BorderSide(color: Colors.orange, width: 4), + // ), + dayPeriodTextColor: Colors.black, + // dayPeriodTextStyle: + // textStyle12w500.copyWith(fontWeight: FontWeight.bold), + // dayPeriodShape: const RoundedRectangleBorder( + // borderRadius: BorderRadius.all(Radius.circular(8)), + // side: BorderSide(color: Colors.orange, width: 4), + // ), + hourMinuteColor: MaterialStateColor.resolveWith((states) => + states.contains(MaterialState.selected) + ? themeColor + : CustomAppColors.kSmokeColor), + hourMinuteTextColor: MaterialStateColor.resolveWith( + (states) => states.contains(MaterialState.selected) + ? Colors.black + : Colors.black), + // hourMinuteTextStyle: const TextStyle( + // fontSize: 32, fontWeight: FontWeight.bold), + + dialHandColor: themeColor, + dialBackgroundColor: CustomAppColors.kSmokeColor, + dialTextColor: MaterialStateColor.resolveWith((states) => + states.contains(MaterialState.selected) + ? Colors.black + : Colors.black), + + // helpTextStyle: textStyle14w600, + inputDecorationTheme: const InputDecorationTheme( + border: InputBorder.none, + contentPadding: EdgeInsets.all(0), + ), + + entryModeIconColor: themeColor, + ), + textButtonTheme: TextButtonThemeData( + style: ButtonStyle( + // backgroundColor: MaterialStateColor.resolveWith((states) => Colors.orange), + foregroundColor: MaterialStateColor.resolveWith( + (states) => Colors.black), + // overlayColor: MaterialStateColor.resolveWith((states) => Colors.deepOrange), + ), + ), + ), + child: child!, + ), + ); + }); + + //eg: a = ["A", "B", "C"], b = ["1", "2"] + // zip(a, b) => ["A", "1", "B", "2", "C"] + static Iterable zip(Iterable a, Iterable b) sync* { + final ita = a.iterator; + final itb = b.iterator; + bool hasa, hasb; + while ((hasa = ita.moveNext()) | (hasb = itb.moveNext())) { + if (hasa) yield ita.current; + if (hasb) yield itb.current; + } + } + + static Widget centerText({required String text}) { + return Center( + child: CustomTextWidget( + text: text, + fontSize: 14.sp, + fontWeight: FontWeight.w600, + )); + } + + static String toTimesAgo(String? dateTime) { + return (dateTime.isNullOrEmpty()) + ? "" + : GetTimeAgo.parse(DateTime.parse(dateTime!).toLocal()); + } +} diff --git a/lib/utilities/image_picker_popup.dart b/lib/utilities/image_picker_popup.dart new file mode 100644 index 0000000..51858b8 --- /dev/null +++ b/lib/utilities/image_picker_popup.dart @@ -0,0 +1,216 @@ +import 'dart:io'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class ImagePickerPopup { + ImagePickerPopup._(); + + static final _picker = ImagePicker(); + + static void showImagePickerDialog( + // BuildContext context, + Function(File? file) onFetchImage, { + double? maxWidth, + double? maxHeight, + }) { + _checkCameraPermission().then((permissionGranted) { + debugPrint("permission status: $permissionGranted"); + if (permissionGranted) { + _showImageUploadBottomSheet( + onFetchImage, + maxWidth: maxWidth, + maxHeight: maxHeight, + ); + } else { + ScaffoldMessenger.of(Get.context!).showSnackBar( + SnackBar( + content: const Text( + 'Please allow permission to access Camera and photos.', + // style: textStyle16w400.copyWith(color: Colors.white), + ), + duration: const Duration(seconds: 5), + backgroundColor: Colors.black, + action: SnackBarAction( + label: 'Setting', onPressed: () => openAppSettings()), + ), + ); + } + }); + } + + static Future _checkCameraPermission() async { + // 1. Checking Initial Permission Status: + const cameraPermission = Permission.camera; + + final cameraPermissionStatus = await cameraPermission.status; + + if (cameraPermissionStatus.isGranted) { + debugPrint("status: true"); + return true; + } else { + Map permissionsResult = await [cameraPermission].request(); + if (permissionsResult.values.isNotEmpty && + permissionsResult[cameraPermission] == PermissionStatus.granted) { + debugPrint("status2: true"); + return true; + } else { + debugPrint("status3: false"); + return await cameraPermission.shouldShowRequestRationale; + } + } + } + + static void _showImageUploadBottomSheet( + // BuildContext context, + Function(File) onFetchImage, { + double? maxWidth, + double? maxHeight, + }) { + Get.bottomSheet( + Container( + padding: const EdgeInsets.all(20), + child: ListView( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + children: [ + const Text( + "Upload Image", + // style: textStyle16w700.copyWith(color: Colors.black), + textAlign: TextAlign.center, + ), + const SizedBox(height: 5), + const Text( + "Click a Photo or upload your image from saved photos.", + // style: textStyle12w500.copyWith(color: Colors.black), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + Row( + children: [ + const SizedBox(width: 30), + Expanded( + child: InkWell( + onTap: () { + Get.back(); + // Navigator.of(context).pop(); + getImageFromSource( + fromCamera: true, + onFetchImage: onFetchImage, + maxWidth: maxWidth, + maxHeight: maxHeight, + ); + }, + borderRadius: + const BorderRadius.all(Radius.circular(20.0)), + child: Container( + padding: const EdgeInsets.all(10.0), + child: Column( + children: [ + Icon( + CupertinoIcons.camera, + size: 50.r, + color: Get.theme.primaryColor, + ), + const SizedBox(height: 8), + const Text( + "Camera", + // style: textStyle16w700.copyWith( + // color: Colors.black) + ), + ], + ), + ), + ), + ), + SizedBox( + width: 40.r, + height: 64.r, + child: const Center( + child: VerticalDivider(color: Colors.grey, width: 2), + ), + ), + Expanded( + child: InkWell( + onTap: () { + // Navigator.of(context).pop(); + Get.back(); + getImageFromSource( + fromCamera: false, onFetchImage: onFetchImage); + }, + borderRadius: + const BorderRadius.all(Radius.circular(20.0)), + child: Container( + padding: const EdgeInsets.all(10.0), + child: Column( + children: [ + // SvgPicture.asset( + // Assets.svgPlaceholderImg2, + // width: 50, + // height: 50, + // ), + Icon( + CupertinoIcons.photo, + size: 50.r, + color: Get.theme.primaryColor, + ), + const SizedBox(height: 8), + const Text( + "Gallery", + // style: textStyle16w700.copyWith( + // color: Colors.black) + ), + ], + ), + ), + ), + ), + const SizedBox( + width: 30, + ), + ], + ) + ], + ), + ), + backgroundColor: Colors.white); + } + + static void getImageFromSource({ + required bool fromCamera, + required Function(File) onFetchImage, + double? maxWidth, + double? maxHeight, + }) async { + final permissionGranted = await _checkCameraPermission(); + debugPrint("permission status: $permissionGranted"); + + if (permissionGranted) { + final pickedFile = await _picker.pickImage( + source: fromCamera ? ImageSource.camera : ImageSource.gallery, + imageQuality: 80, + maxWidth: maxWidth, + maxHeight: maxHeight, + ); + if (pickedFile != null) { + final picture = File(pickedFile.path); + onFetchImage(picture); + } + } else { + ScaffoldMessenger.of(Get.context!).showSnackBar( + SnackBar( + content: const Text( + 'Please allow permission to access Camera and photos.', + ), + duration: const Duration(seconds: 5), + backgroundColor: Colors.black, + action: SnackBarAction( + label: 'Setting', onPressed: () => openAppSettings()), + ), + ); + } + } +} diff --git a/lib/utilities/local_storage_manager/export_local_storage.dart b/lib/utilities/local_storage_manager/export_local_storage.dart new file mode 100644 index 0000000..aeafe71 --- /dev/null +++ b/lib/utilities/local_storage_manager/export_local_storage.dart @@ -0,0 +1,2 @@ +export 'local_storage_keys.dart'; +export 'local_storage_manager.dart'; \ No newline at end of file diff --git a/lib/utilities/local_storage_manager/local_storage_keys.dart b/lib/utilities/local_storage_manager/local_storage_keys.dart new file mode 100644 index 0000000..95a8256 --- /dev/null +++ b/lib/utilities/local_storage_manager/local_storage_keys.dart @@ -0,0 +1,13 @@ +class LocalStorageKeys { + LocalStorageKeys._(); + + static const String kUserTokenKey = "UserTokenKey"; + static const String kUserIdKey = "UserIdKey"; + // static const String kRememberMeKey = "RememberMeKey"; + static const String kSaveEmailKey = "SaveEmailKey"; + // static const String kUserModelKey = "UserModelKey"; + // static const String kProfileModelKey = "ProfileModelKey"; + // static const String kIsUserLoggedInKey = "IsUserLoggedInKey "; + + static const String kCurrentOngoingShift = "CurrentOngoingShift "; +} \ No newline at end of file diff --git a/lib/utilities/local_storage_manager/local_storage_manager.dart b/lib/utilities/local_storage_manager/local_storage_manager.dart new file mode 100644 index 0000000..ae46fec --- /dev/null +++ b/lib/utilities/local_storage_manager/local_storage_manager.dart @@ -0,0 +1,73 @@ +import 'package:flutter/foundation.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:get_storage/get_storage.dart'; + +import 'local_storage_keys.dart'; + +abstract class LocalStorageManager { + // LocalStorageManager._(); + // + // static final LocalStorageManager _instance = LocalStorageManager._(); + // + // factory LocalStorageManager() { + // return _instance; + // } + + static final GetStorage _box = GetStorage(); + + static Future init() => GetStorage.init(); + + static Future saveSession({ + required String tokenKey, + required String tokenValue, + }) async { + await _box.write(tokenKey, tokenValue); + } + + static Future removeSession({required String token}) async { + await _box.remove(token); + } + + static String getSessionToken({required String tokenKey}) { + return _box.read(tokenKey) ?? ''; + } + + static Future setLoginToken(String token) async { + await _box.write(LocalStorageKeys.kUserTokenKey, token); + } + + static String getLoginToken() { + return _box.read(LocalStorageKeys.kUserTokenKey) ?? ''; + } + + static Future setUserId(String id) async { + await _box.write(LocalStorageKeys.kUserIdKey, id); + } + + static String get userId { + return _box.read(LocalStorageKeys.kUserIdKey) ?? ''; + } + + static void saveShiftData({required DaysArrayData data}) { + _box.write(LocalStorageKeys.kCurrentOngoingShift, data.toJson()); + } + + static DaysArrayData? getOngoingShift() { + try { + return DaysArrayData.fromJson( + _box.read(LocalStorageKeys.kCurrentOngoingShift)); + } catch (e) { + debugPrint( + "LocalStorageManager.getCurrentShiftData err: ${e.toString()}"); + return null; + } + } + + static Future removeOngoingShift() async { + await _box.remove(LocalStorageKeys.kCurrentOngoingShift); + } + + static Future clear() { + return _box.erase(); + } +} diff --git a/lib/utilities/mixins/export_mixins.dart b/lib/utilities/mixins/export_mixins.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/utilities/notification_util.dart b/lib/utilities/notification_util.dart new file mode 100644 index 0000000..fe319c1 --- /dev/null +++ b/lib/utilities/notification_util.dart @@ -0,0 +1,183 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'fcm_notifications.dart'; +import 'extensions/custom_extensions.dart'; + +const String packageName = "com.inajam.app"; +const notificationChannelId = packageName; +const notificationChannelName = "inajam"; +const notificationChannelDescription = "In A Jam"; + +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + +//for SDK version 33 +Future requestNotificationPermissions() async { + if (Platform.isIOS || Platform.isMacOS) { + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + critical: true, + ); + } else if (Platform.isAndroid) { + final AndroidFlutterLocalNotificationsPlugin? androidImplementation = + flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>(); + + await androidImplementation?.requestNotificationsPermission(); + } +} + +const AndroidInitializationSettings initializationSettingsAndroid = + AndroidInitializationSettings('@drawable/notification_icon'); + +const DarwinInitializationSettings initializationSettingsDarwin = + DarwinInitializationSettings( + // requestAlertPermission: true, + // requestBadgePermission: true, + // requestSoundPermission: true, + // onDidReceiveLocalNotification: + // (int id, String? title, String? body, String? payload) async { + // didReceiveLocalNotificationStream.add( + // ReceivedNotification( + // id: id, + // title: title, + // body: body, + // payload: payload, + // ), + // ); + // }, + // notificationCategories: darwinNotificationCategories, + ); + +const InitializationSettings initializationSettings = InitializationSettings( + android: initializationSettingsAndroid, + iOS: initializationSettingsDarwin, + macOS: initializationSettingsDarwin, +); + +void selectNotification(String? payload) async { + debugPrint('selected notification payload: $payload'); + debugPrint( + 'is selected notification payload null or empty: ${payload.isNotNullOrEmpty()}'); + + if (payload.isNotNullOrEmpty()) { + var messageData = jsonDecode(payload!); + handleAppNotification(messageData); + } +} + +//----------------------- +//----------------------- +//----------------------- +class NotificationUtils { + NotificationUtils._(); + + static NotificationDetails? platformChannelSpecifics; + static AndroidNotificationChannel? channel; + static AndroidNotificationDetails? androidPlatformChannelSpecifics; + + static Future init() async { + try { + await flutterLocalNotificationsPlugin.initialize(initializationSettings, + onDidReceiveNotificationResponse: (response) => + selectNotification(response.payload) + + // onDidReceiveNotificationResponse: + // (NotificationResponse notificationResponse) { + // switch (notificationResponse.notificationResponseType) { + // case NotificationResponseType.selectedNotification: + // selectNotificationStream.add(notificationResponse.payload); + // break; + // case NotificationResponseType.selectedNotificationAction: + // if (notificationResponse.actionId == navigationActionId) { + // selectNotificationStream.add(notificationResponse.payload); + // } + // break; + // } + // }, + // onDidReceiveBackgroundNotificationResponse: notificationTapBackground, + ); + + platformChannelSpecifics = await getChannelSpecifics(); + } catch (e) { + debugPrint("NotificationUtils: ${e.toString()}"); + } + } + + static Future getChannelSpecifics( + [int? badgeNumber]) async { + if (Platform.isAndroid) { + channel = await _getAndroidDefaultChannel(notificationChannelId, + notificationChannelName, notificationChannelDescription); + } + androidPlatformChannelSpecifics ??= AndroidNotificationDetails( + notificationChannelId, notificationChannelName, + channelDescription: notificationChannelDescription, + importance: channel?.importance ?? Importance.max, + priority: Priority.high, + enableVibration: true, + playSound: false); + + int badgeNum = 0; + + //Todo + // try { + // badgeNum = + // badgeNumber ?? AppProviderController.instance.notificationCount(); + // print("badgeNum: $badgeNum"); + // } catch (e) {} + + var iOSPlatformChannelSpecifics = DarwinNotificationDetails( + presentSound: true, + presentBadge: true, + presentAlert: true, + badgeNumber: badgeNum, + ); + return NotificationDetails( + android: androidPlatformChannelSpecifics, + iOS: iOSPlatformChannelSpecifics, + ); + } + + static Future showDefaultNotification( + {required String title, + required String body, + Map? payload, + int? badgeNumber}) async { + platformChannelSpecifics = await getChannelSpecifics(badgeNumber); + await flutterLocalNotificationsPlugin.show( + 10, + title, + body, + platformChannelSpecifics, + payload: (payload.isNullOrEmpty()) ? null : jsonEncode(payload!), + ); + } + + static Future _getAndroidDefaultChannel( + String channelId, + String channelName, + String? channelDescription, + ) async { + AndroidNotificationChannel channel = AndroidNotificationChannel( + channelId, + channelName, + description: channelDescription, + importance: Importance.max, + enableVibration: true, + playSound: false, + ); + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(channel); + return channel; + } +} diff --git a/lib/view/custom_widgets/auth/custom_forget_password_dialog.dart b/lib/view/custom_widgets/auth/custom_forget_password_dialog.dart new file mode 100644 index 0000000..15363ca --- /dev/null +++ b/lib/view/custom_widgets/auth/custom_forget_password_dialog.dart @@ -0,0 +1,165 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +class CustomForgetPasswordDialog extends StatelessWidget { + const CustomForgetPasswordDialog({ + Key? key, + required this.dialogMessageText, + required this.headingText, + required this.dialogMessageTextBold, + required this.dialogButtonAcceptText, + required this.dialogButtonCloseText, + // this.acceptFunction, + }) : super(key: key); + + final String headingText; + final String dialogMessageText; + final String dialogMessageTextBold; + final String dialogButtonAcceptText; + + // final Function? acceptFunction; + final String dialogButtonCloseText; + + @override + Widget build(BuildContext context) { + TextEditingController emailController = TextEditingController(); + RxString emailErrorMsg = "".obs; + + bool validateEmail() { + if (emailController.text.isEmpty) { + emailErrorMsg.value = ConstantText.kEmailIsRequired; + } else if (!GetUtils.isEmail(emailController.text)) { + emailErrorMsg.value = ConstantText.kInvalidEmail; + } else { + emailErrorMsg.value = ""; + } + return emailErrorMsg.isEmpty; + } + + return AlertDialog( + surfaceTintColor: CustomAppColors.kPrimaryColor, + shape: LinearBorder.top(side: BorderSide.none), + backgroundColor: CustomAppColors.kWhiteColor, + shadowColor: CustomAppColors.kWhiteColor, + titlePadding: EdgeInsets.only(top: 20.h), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + CustomTextWidget( + text: headingText, + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + ), + Container( + padding: EdgeInsets.all(10.sp), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: dialogMessageText, + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w400, + textAlign: TextAlign.center, + ), + SizedBox( + height: 3.h, + ), + dialogMessageTextBold != "" + ? CustomTextWidget( + text: dialogMessageTextBold, + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.bold, + textAlign: TextAlign.left, + ) + : Container(), + ], + ), + ), + // SizedBox(height: 10.h,), + Padding( + padding: EdgeInsets.only(top: 5.0.h), + child: CustomTextFieldWidget( + controller: emailController, + hintText: ConstantText.kPleaseInputEmail, + heading: ConstantText.kEmailHeading, + onChange: (_) { + validateEmail(); + }, + ), + ), + Obx(() { + return CustomErrorMsg( + message: emailErrorMsg.value, + ); + }), + 16.verticalSpace, + Row( + children: [ + Expanded( + child: SizedBox( + height: 32.h, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: Size(double.infinity, 30.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + backgroundColor: CustomAppColors.kSecondaryColor), + onPressed: () async { + if (validateEmail()) { + Navigator.of(context).pop(); + var response = await AuthService() + .forgetPassword(email: emailController.text) + .showLoader(); + if (response == true) { + FrequentFunctions.showToast( + message: + "A password reset link has been sent to your registered email.", + ); + } + // Add functionality for the "Agree" button. + } + }, + child: CustomTextWidget( + text: dialogButtonAcceptText, + fontColor: CustomAppColors.kPrimaryColor, + fontSize: 14.sp, + fontWeight: FontWeight.w400), + ), + ), + ), + SizedBox(width: 10.h), + Expanded( + child: SizedBox( + height: 32.h, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: Size(double.infinity, 30.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + backgroundColor: CustomAppColors.kLightGreyColor), + onPressed: () { + // Add functionality for the "pop" button. + Navigator.of(context).pop(); + }, + child: CustomTextWidget( + text: dialogButtonCloseText, + fontColor: CustomAppColors.kPrimaryColor, + fontSize: 14.sp, + fontWeight: FontWeight.w400), + ), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/view/custom_widgets/auth/export_auth_widgets.dart b/lib/view/custom_widgets/auth/export_auth_widgets.dart new file mode 100644 index 0000000..7077229 --- /dev/null +++ b/lib/view/custom_widgets/auth/export_auth_widgets.dart @@ -0,0 +1 @@ +export 'custom_forget_password_dialog.dart'; \ No newline at end of file diff --git a/lib/view/custom_widgets/clients/CareNoteOptionCard.dart b/lib/view/custom_widgets/clients/CareNoteOptionCard.dart new file mode 100644 index 0000000..41eceb2 --- /dev/null +++ b/lib/view/custom_widgets/clients/CareNoteOptionCard.dart @@ -0,0 +1,46 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; + +class CareNoteOptionCard extends StatelessWidget { + final String icon; + final String name; + + const CareNoteOptionCard({ + super.key, + required this.icon, + required this.name, + }); + + @override + Widget build(BuildContext context) { + return Card( + elevation: 2, + shadowColor: CustomAppColors.kLightGreyColor, + surfaceTintColor: Colors.white, + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4).r), + child: Padding( + padding: REdgeInsets.all(8), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomImageWidget( + imagePath: icon, + height: 24.r, + width: 24.r, + ), + 12.verticalSpace, + CustomTextWidget( + text: name, + alignment: Alignment.center, + isExpanded: false, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + fontSize: 14.sp) + ], + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/clients/category_subcategory_dropdowns_widget.dart b/lib/view/custom_widgets/clients/category_subcategory_dropdowns_widget.dart new file mode 100644 index 0000000..065a6f4 --- /dev/null +++ b/lib/view/custom_widgets/clients/category_subcategory_dropdowns_widget.dart @@ -0,0 +1,170 @@ +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/category_subcategory_widget_controller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/body_points_category.dart'; +import 'package:get/get.dart'; + +class CategorySubcategoryDropdownsWidget extends StatelessWidget { + final CategorySubcategoryWidgetController controller; + + const CategorySubcategoryDropdownsWidget( + {super.key, required this.controller}); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _bodyPartsDropdown, + _subcategoryDropdown, + ], + ); + } + + Widget get _bodyPartsDropdown { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + border: Border.all( + color: CustomAppColors.kLightGreyColor, + width: 1.sp, + ), + ), + padding: EdgeInsets.symmetric( + vertical: 5.h, + horizontal: 15.w, + ), + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: "Select Category", + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + alignment: Alignment.centerLeft, + ), + Obx(() { + return DropdownButtonHideUnderline( + child: DropdownButtonFormField( + onTap: () { + FocusScopeNode().unfocus(); + }, + dropdownColor: Colors.white, + decoration: const InputDecoration( + border: InputBorder.none, + ), + hint: Text( + "Select...", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.sp, + color: CustomAppColors.kLightTextColor, + ), + ), + items: controller.bodyPointsCategoryList + .map( + (e) => DropdownMenuItem( + value: e, + child: Text(e.name), + ), + ) + .toList(), + isExpanded: true, + iconSize: 20.h, + icon: Padding( + padding: REdgeInsets.only(right: 4.0), + child: const Icon(Icons.arrow_drop_down_sharp, + color: Colors.grey), + ), + onChanged: (category) { + controller.selectedBodyPart.value = category; + + if ((category?.subCategory ?? []).isEmpty) { + controller.selectedSubcategory.value = null; + } + }, + ), + ); + }), + ], + ), + ); + } + + Widget get _subcategoryDropdown { + return Obx(() { + return (controller.selectedBodyPart.value?.subCategory ?? []).isEmpty + ? const SizedBox.shrink() + : Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + border: Border.all( + color: CustomAppColors.kLightGreyColor, + width: 1.sp, + ), + ), + margin: REdgeInsets.only(top: 20.r), + padding: EdgeInsets.symmetric(vertical: 5.h, horizontal: 15.w), + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: "Select Subcategory", + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + alignment: Alignment.centerLeft, + ), + DropdownButtonHideUnderline( + child: DropdownButtonFormField( + onTap: () { + FocusScopeNode().unfocus(); + }, + dropdownColor: Colors.white, + decoration: const InputDecoration( + border: InputBorder.none, + ), + hint: Text( + "Select...", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.sp, + color: CustomAppColors.kLightTextColor, + ), + ), + items: controller.selectedBodyPart.value!.subCategory + .map( + (e) => DropdownMenuItem( + value: e, + child: Text(e.name), + ), + ) + .toList(), + isExpanded: true, + iconSize: 20.h, + icon: Padding( + padding: REdgeInsets.only(right: 4.0), + child: const Icon(Icons.arrow_drop_down_sharp, + color: Colors.grey), + ), + onChanged: (value) { + if (value != null) { + controller.selectedSubcategory.value = value; + } + }, + ), + ), + ], + ), + ); + }); + } +} diff --git a/lib/view/custom_widgets/clients/custom_icon_tile.dart b/lib/view/custom_widgets/clients/custom_icon_tile.dart new file mode 100644 index 0000000..4978c4c --- /dev/null +++ b/lib/view/custom_widgets/clients/custom_icon_tile.dart @@ -0,0 +1,56 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomIconTile extends StatelessWidget { + const CustomIconTile({ + super.key, + required this.iconPath, + required this.text, + required this.route, + this.arguments, + }); + + final String iconPath; + final String text; + final String route; + final Object? arguments; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + if (route.isNotEmpty) { + Navigator.pushNamed(context, route, arguments: arguments); + } + }, + child: Container( + padding: REdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2.r), + border: Border.all(color: CustomAppColors.kSecondaryColor)), + child: Row( + children: [ + CustomImageWidget( + imagePath: iconPath, + height: 16.r, + width: 16.r, + ), + 8.horizontalSpace, + Expanded( + child: CustomTextWidget( + text: text, + alignment: Alignment.centerLeft, + isExpanded: false, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + fontSize: 14.sp), + ), + Icon(Icons.arrow_forward_ios_rounded, + size: 12.r, color: CustomAppColors.kSecondaryColor) + ], + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/clients/show_documents_option_dialog.dart b/lib/view/custom_widgets/clients/show_documents_option_dialog.dart new file mode 100644 index 0000000..313f238 --- /dev/null +++ b/lib/view/custom_widgets/clients/show_documents_option_dialog.dart @@ -0,0 +1,161 @@ +// +// +// import 'package:flutter/material.dart'; +// import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +// import 'package:ftc_mobile_app/models/clients/service_users_model.dart'; +// import 'package:get/get.dart'; +// import '../../../models/clients/documents_list_model.dart'; +// +// class ShowDocumentsOptionDialog extends StatelessWidget { +// final DocumentModel documentModel; +// +// const ShowDocumentsOptionDialog({ +// super.key,required this.documentModel, +// }); +// +// @override +// Widget build(BuildContext context) { +// final DocumentsListScreenController controller = Get.find(); +// return AlertDialog( +// surfaceTintColor: CustomAppColors.kPrimaryColor, +// shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2.r)), +// backgroundColor: CustomAppColors.kPrimaryColor, +// title: Center( +// child: CustomTextWidget( +// text: 'Please Select what you wanna do', +// fontWeight: FontWeight.bold, +// isExpanded: false, +// alignment: Alignment.center, +// fontSize: 16.sp, +// ), +// ), +// content: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisSize: MainAxisSize.min, +// children: [ +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceAround, +// children: [ +// InkWell( +// onTap: () async{ +// var response = await Navigator.pushNamed(controller.screenKey.currentContext!, +// CustomRouteNames.kAddNewDocumentScreenRoute, +// arguments: [documentModel,controller.serviceUser.value]); +// if(response is List){ +// int index = controller.documentsList.value.documentList.indexWhere((item) => item == documentModel); +// controller.documentsList.value.documentList[index].title = response[0]; +// controller.documentsList.value.documentList[index].details = response[1]; +// controller.documentsList.refresh(); +// } +// }, +// child: Container( +// padding: EdgeInsets.all(1.sp), +// decoration: BoxDecoration( +// color: CustomAppColors.kYellowColor.withOpacity(0.5), +// borderRadius: BorderRadius.circular(50.r), +// ), +// child: const Icon(Icons.edit,color: CustomAppColors.kDarkYellowColor,size: 40,)), +// ), +// SizedBox(width: 3.w,), +// InkWell( +// onTap: () async { +// dynamic response = await ClientService().deleteDocumentService(docId: documentModel.id); +// if (response is bool) { +// controller.removeDocumentItem(documentModel); +// Navigator.pop(controller.screenKey.currentState!.context); +// } +// }, +// child: Container( +// padding: EdgeInsets.all(1.sp), +// decoration: BoxDecoration( +// color: CustomAppColors.kRedColor.withOpacity(0.5), +// borderRadius: BorderRadius.circular(50.r), +// ), +// child: const Icon(Icons.delete,color: CustomAppColors.kRedColor,size: 40,)), +// ), +// SizedBox(width: 3.w,), +// InkWell( +// onTap: () async{ +// dynamic response = await Navigator.pushNamed( +// controller.screenKey.currentContext!, +// CustomRouteNames.kAddNewDocumentScreenRoute, +// arguments: controller.serviceUser.value +// ); +// if(response is DocumentModel){ +// controller.documentsList.value.documentList.insert(0,response); +// controller.documentsList.refresh(); +// } +// }, +// child: Container( +// padding: EdgeInsets.all(1.sp), +// decoration: BoxDecoration( +// color: CustomAppColors.kSecondaryColor.withOpacity(0.5), +// borderRadius: BorderRadius.circular(50.r), +// ), +// child: const Icon(Icons.add,color: CustomAppColors.kSecondaryColor,size: 40,)), +// ), +// SizedBox(width: 3.w,), +// InkWell( +// onTap: () { +// Navigator.pushNamed( +// controller.screenKey.currentContext!, +// CustomRouteNames.kAddNewDocumentScreenRoute, +// arguments: [documentModel,true] +// ); +// }, +// child: Container( +// padding: EdgeInsets.all(1.sp), +// decoration: BoxDecoration( +// color: CustomAppColors.kGreenColor.withOpacity(0.5), +// borderRadius: BorderRadius.circular(50.r), +// ), +// child: const Icon(Icons.visibility,color: CustomAppColors.kGreenColor,size: 40,)), +// ), +// ], +// ), +// ], +// ), +// actions: [ +// Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Visibility( +// visible: false, +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// minimumSize: Size(double.infinity, 30.h), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(5.r), +// ), +// backgroundColor: CustomAppColors.kSecondaryColor +// ), +// +// onPressed: () { +// // Add functionality for the "Cancel Shift" button. +// Navigator.of(context).pop(); +// }, +// child: const CustomTextWidget(text: 'Cancel Shift',fontColor: CustomAppColors.kPrimaryColor), +// ), +// ), +// ElevatedButton( +// style: ElevatedButton.styleFrom( +// minimumSize: Size(double.infinity, 30.h), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(5.r), +// ), +// backgroundColor: CustomAppColors.kPrimaryColor +// ), +// +// onPressed: () { +// // Add functionality for the "Close" button. +// Navigator.of(context).pop(); +// }, +// child: CustomTextWidget(text: 'Close',fontColor: CustomAppColors.kBlackColor,fontSize: 15.sp), +// ), +// ], +// ), +// ], +// ); +// } +// } \ No newline at end of file diff --git a/lib/view/custom_widgets/common_cancel_button.dart b/lib/view/custom_widgets/common_cancel_button.dart new file mode 100644 index 0000000..df2ae78 --- /dev/null +++ b/lib/view/custom_widgets/common_cancel_button.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CommonCloseTextButton extends StatelessWidget { + final VoidCallback? onTap; + + const CommonCloseTextButton({super.key, this.onTap}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap ?? () => Navigator.of(context).pop(), + child: Container( + height: 30.h, + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightGreyColor), + borderRadius: BorderRadius.circular(5.r), + ), + alignment: Alignment.center, + child: CustomTextWidget( + text: 'Close', + fontColor: CustomAppColors.kBlackColor, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_app_bar.dart b/lib/view/custom_widgets/custom_app_bar.dart new file mode 100644 index 0000000..a86f3cc --- /dev/null +++ b/lib/view/custom_widgets/custom_app_bar.dart @@ -0,0 +1,143 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { + final VoidCallback? onBackButtonPressed; + final Widget? action; + final Widget? leadingButton; + final Widget? titleWidget; + final String titleText; + final bool showBoxShadow; + + const CustomAppBar({ + Key? key, + this.onBackButtonPressed, + this.showBoxShadow = true, + this.leadingButton, + this.action, + this.titleWidget, + this.titleText = "", + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final ModalRoute? parentRoute = ModalRoute.of(context); + final bool canPop = parentRoute?.canPop ?? false; + return PreferredSize( + preferredSize: preferredSize, + child: Container( + decoration: BoxDecoration( + color: CustomAppColors.kPrimaryColor, + boxShadow: showBoxShadow + ? [ + BoxShadow( + color: CustomAppColors.kLightGreyColor, + spreadRadius: 1.2, + blurRadius: 4, + offset: const Offset(0, 2), + ), + ] + : null, + ), + width: MediaQuery.of(context).size.width, + alignment: Alignment.center, + padding: EdgeInsets.only( + top: GetPlatform.isIOS ? 40.0 : 20.0, + ), + child: Stack( + children: [ + Container( + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.only(top: 4.sp, left: 20.0.sp, right: 20.sp), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Builder(builder: (context) { + if (titleWidget != null) { + return titleWidget!; + } + return FittedBox( + child: CustomTextWidget( + text: titleText, + fontColor: CustomAppColors.kIconColor, + fontSize: 22.0.sp, + fontWeight: FontWeight.w500, + ), + ); + }), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Visibility( + visible: canPop || leadingButton != null, + child: Padding( + padding: EdgeInsets.only( + left: 10.0.sp, + top: 32.0.sp, + ), + child: leadingButton != null + ? leadingButton! + : GestureDetector( + onTap: () { + if (onBackButtonPressed != null) { + onBackButtonPressed!(); + } else { + Navigator.pop(context); + } + }, + child: SizedBox( + width: 30.0, + height: 30.0, + child: Container( + padding: Platform.isIOS + ? const EdgeInsets.symmetric( + horizontal: 10.0, + vertical: 5.0, + ) + : null, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.sp), + color: CustomAppColors.kLightGreyColor, + ), + alignment: Alignment.center, + child: Icon( + Icons.adaptive.arrow_back, + color: CustomAppColors.kIconColor, + size: 20.0, + ), + ), + ), + ), + ), + ), + const Spacer(), + Visibility( + visible: action != null, + child: Padding( + padding: EdgeInsets.only( + right: 15.0, + top: 25.0.sp, + ), + child: action, + ), + ), + ], + ), + ], + ), + ), + ); + } + + @override + Size get preferredSize => const Size.fromHeight(56.0); +} diff --git a/lib/view/custom_widgets/custom_app_bar_title_only.dart b/lib/view/custom_widgets/custom_app_bar_title_only.dart new file mode 100644 index 0000000..3023d35 --- /dev/null +++ b/lib/view/custom_widgets/custom_app_bar_title_only.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomAppBarTitleOnly extends AppBar { + CustomAppBarTitleOnly(BuildContext context, + {super.key, required String titleText}) + : super( + toolbarHeight: 56.r, + leading: IconButton( + icon: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + onPressed: () { + Navigator.pop(context); + }, + ), + centerTitle: false, + titleSpacing: 0, + leadingWidth: 50.r, + surfaceTintColor: Colors.white, + title: CustomTextWidget( + text: titleText, + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + maxLines: 1, + textOverflow: TextOverflow.ellipsis, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ); +} diff --git a/lib/view/custom_widgets/custom_app_bar_with_action.dart b/lib/view/custom_widgets/custom_app_bar_with_action.dart new file mode 100644 index 0000000..8572e15 --- /dev/null +++ b/lib/view/custom_widgets/custom_app_bar_with_action.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomAppBarWithAction extends AppBar { + CustomAppBarWithAction( + BuildContext context, { + super.key, + required String titleText, + required String actionText, + Color? actionTextColor, + required Function() onActionTap, + }) : super( + toolbarHeight: 56.r, + leading: IconButton( + icon: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + onPressed: () { + Navigator.pop(context); + }, + ), + centerTitle: false, + titleSpacing: 0, + leadingWidth: 50.r, + surfaceTintColor: Colors.white, + title: CustomTextWidget( + text: titleText, + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + maxLines: 1, + textOverflow: TextOverflow.ellipsis, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + actions: [ + TextButton( + onPressed: onActionTap, + child: Text( + actionText, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: actionTextColor ?? CustomAppColors.kLightTextColor, + ), + ), + ) + ], + ); +} + +// class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { +// final VoidCallback? onBackButtonPressed; +// final String titleText; +// final bool showBoxShadow; +// +// const CustomAppBar({ +// Key? key, +// this.onBackButtonPressed, +// this.showBoxShadow = true, +// this.titleText = "", +// }) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// final ModalRoute? parentRoute = ModalRoute.of(context); +// final bool canPop = parentRoute?.canPop ?? false; +// return PreferredSize( +// preferredSize: preferredSize, +// child: Container( +// decoration: BoxDecoration( +// color: CustomAppColors.kPrimaryColor, +// boxShadow: showBoxShadow +// ? [ +// BoxShadow( +// color: CustomAppColors.kLightGreyColor, +// spreadRadius: 1.2, +// blurRadius: 4, +// offset: const Offset(0, 2), +// ), +// ] +// : null, +// ), +// width: MediaQuery.of(context).size.width, +// alignment: Alignment.center, +// padding: EdgeInsets.only( +// top: GetPlatform.isIOS ? 40.0 : 20.0, +// ), +// child: Stack( +// children: [ +// Container( +// width: MediaQuery.of(context).size.width, +// padding: EdgeInsets.only(top: 4.sp, left: 20.0.sp, right: 20.sp), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.center, +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Builder(builder: (context) { +// CustomTextWidget( +// text: titleText, +// isExpanded: false, +// fontSize: 16.sp, +// fontWeight: FontWeight.w700, +// fontColor: CustomAppColors.kDarkBlueTextColor, +// ); +// return FittedBox( +// child: CustomTextWidget( +// text: titleText, +// fontColor: CustomAppColors.kIconColor, +// fontSize: 22.0.sp, +// fontWeight: FontWeight.w500, +// ), +// ); +// }), +// ], +// ), +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// mainAxisSize: MainAxisSize.min, +// children: [ +// Visibility( +// visible: canPop || leadingButton != null, +// child: Padding( +// padding: EdgeInsets.only( +// left: 10.0.sp, +// top: 32.0.sp, +// ), +// child: leadingButton != null +// ? leadingButton! +// : GestureDetector( +// onTap: () { +// if (onBackButtonPressed != null) { +// onBackButtonPressed!(); +// } else { +// Navigator.pop(context); +// } +// }, +// child: SizedBox( +// width: 30.0, +// height: 30.0, +// child: Container( +// padding: Platform.isIOS +// ? const EdgeInsets.symmetric( +// horizontal: 10.0, +// vertical: 5.0, +// ) +// : null, +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(4.sp), +// color: CustomAppColors.kLightGreyColor, +// ), +// alignment: Alignment.center, +// child: Icon( +// Icons.adaptive.arrow_back, +// color: CustomAppColors.kIconColor, +// size: 20.0, +// ), +// ), +// ), +// ), +// ), +// ), +// const Spacer(), +// Visibility( +// visible: action != null, +// child: Padding( +// padding: EdgeInsets.only( +// right: 15.0, +// top: 25.0.sp, +// ), +// child: action, +// ), +// ), +// ], +// ), +// ], +// ), +// ), +// ); +// } +// +// @override +// Size get preferredSize => const Size.fromHeight(56.0); +// } diff --git a/lib/view/custom_widgets/custom_app_button.dart b/lib/view/custom_widgets/custom_app_button.dart new file mode 100644 index 0000000..c7a9818 --- /dev/null +++ b/lib/view/custom_widgets/custom_app_button.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomAppButton extends StatelessWidget { + final String buttonText; + final VoidCallback? onTap; + final Color? buttonColor; + final Color? textColor; + final Color? borderColor; + final bool isLoading; + + const CustomAppButton({ + super.key, + this.buttonColor, + this.textColor, + required this.buttonText, + this.onTap, + this.isLoading = false, + this.borderColor, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + if(isLoading) { + return; + } + FocusScope.of(context).unfocus(); + if(onTap!=null) { + onTap!(); + } + }, + child: Container( + height: 48.h, + decoration: BoxDecoration( + color: buttonColor ?? CustomAppColors.kSecondaryColor, + borderRadius: BorderRadius.circular(3.r), + border: Border.all( + color: borderColor ?? CustomAppColors.kSecondaryColor, + ), + ), + // padding: EdgeInsets.symmetric(vertical: 15.h,), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CustomTextWidget( + text: buttonText, + fontWeight: FontWeight.w600, + isExpanded: false, + fontSize: 16.sp, + fontColor: textColor ?? CustomAppColors.kPrimaryColor, + ), + + Visibility( + visible: isLoading, + child: Padding( + padding: EdgeInsets.only(left: 8.0.w), + child: SizedBox( + height: 15.h, + width: 15.w, + child: CircularProgressIndicator( + color: textColor ?? CustomAppColors.kPrimaryColor, + strokeWidth: 3.0.w, + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_check_box.dart b/lib/view/custom_widgets/custom_check_box.dart new file mode 100644 index 0000000..20536ee --- /dev/null +++ b/lib/view/custom_widgets/custom_check_box.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomCheckBox extends StatelessWidget { + final bool checkBoxValue; + final String titleText; + final VoidCallback? onTap; + + const CustomCheckBox({ + super.key, + required this.checkBoxValue, + required this.titleText, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 25.h, + width: 25.w, + child: Checkbox( + value: checkBoxValue, + activeColor: CustomAppColors.kSecondaryColor, + onChanged: (_) { + if(onTap!=null) { + onTap!(); + } + }, + ), + ), + Padding( + padding: EdgeInsets.only(left: 8.0.w), + child: GestureDetector( + onTap: onTap, + child: CustomTextWidget( + text: titleText, + isExpanded: false, + fontWeight: FontWeight.w500, + fontSize: 12.sp, + ), + ), + ), + ], + ); + } +} diff --git a/lib/view/custom_widgets/custom_error_msg.dart b/lib/view/custom_widgets/custom_error_msg.dart new file mode 100644 index 0000000..d07006f --- /dev/null +++ b/lib/view/custom_widgets/custom_error_msg.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomErrorMsg extends StatelessWidget { + final String message; + final Alignment? alignment; + + const CustomErrorMsg({ + super.key, + required this.message, + this.alignment, + }); + + @override + Widget build(BuildContext context) { + return Visibility( + visible: message.isNotEmpty, + child: CustomTextWidget( + text: message, + fontColor: CustomAppColors.kRedColor, + fontWeight: FontWeight.w500, + alignment: alignment ?? Alignment.centerRight, + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_image_widgets.dart b/lib/view/custom_widgets/custom_image_widgets.dart new file mode 100644 index 0000000..433b2ac --- /dev/null +++ b/lib/view/custom_widgets/custom_image_widgets.dart @@ -0,0 +1,104 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomImageWidget extends StatelessWidget { + final String imagePath; + final BoxFit? fit; + final double? width; + final double? height; + final Color? imageColor; + + const CustomImageWidget({ + Key? key, + this.imagePath = "", + this.fit, + this.width, + this.height, + this.imageColor, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + if (imagePath.startsWith("http")) { + // handel network image here. + return Image.network( + imagePath, + fit: fit, + height: height, + width: width, + color: imageColor, + errorBuilder: (ctx, obj, stc) { + return _ErrorWidget( + size: height ?? 50.0, + color: imageColor, + ); + }, + ); + } else if (imagePath.trim().isEmpty) { + return _ErrorWidget( + size: height ?? 50.0, + color: imageColor, + ); + } else if (imagePath.startsWith("assets/") && imagePath.endsWith(".png")) { + return Image.asset( + imagePath, + fit: fit, + height: height, + width: width, + color: imageColor, + errorBuilder: (ctx, obj, stc) { + return _ErrorWidget( + size: height ?? 50.0, + color: imageColor, + ); + }, + ); + } else if(imagePath.startsWith("assets/") && imagePath.endsWith(".svg")) { + return SvgPicture.asset( + imagePath, + height: height, + width: width, + colorFilter: imageColor!=null? ColorFilter.mode(imageColor!, BlendMode.srcIn):null, + // color: imageColor, + ); + } + return Image.file( + File(imagePath), + fit: fit, + height: height, + width: width, + errorBuilder: (ctx, obj, stc) { + return _ErrorWidget( + size: height ?? 50.0, + color: imageColor, + ); + }, + ); + } +} + +class _ErrorWidget extends StatelessWidget { + final double size; + final Color? color; + + const _ErrorWidget({ + Key? key, + this.size = 50.0, + this.color, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.center, + child: Icon( + Icons.error_outline, + size: size, + color: color ?? CustomAppColors.kIconColor, + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_navigation_drawer.dart b/lib/view/custom_widgets/custom_navigation_drawer.dart new file mode 100644 index 0000000..038d7be --- /dev/null +++ b/lib/view/custom_widgets/custom_navigation_drawer.dart @@ -0,0 +1,268 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/view/screens/webview/webview_screen.dart'; +import 'package:get/get.dart'; +import 'my_circle_image.dart'; + +class CustomDrawer extends StatefulWidget { + const CustomDrawer({Key? key}) : super(key: key); + + @override + State createState() => _CustomDrawerState(); +} + +class _CustomDrawerState extends State { + DashboardScreenController dashboardController = + Get.put(DashboardScreenController()); + CustomNavigationDrawerController drawerController = + Get.put(CustomNavigationDrawerController()); + + @override + Widget build(BuildContext context) { + return Drawer( + elevation: 5, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(1.r)), + backgroundColor: CustomAppColors.kPrimaryColor, + surfaceTintColor: CustomAppColors.kPrimaryColor, + child: SafeArea( + child: Column( + children: [ + 40.verticalSpace, + SizedBox( + width: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Center( + child: GestureDetector( + onTap: () { + drawerController.selectedIndex.value = -1; + Navigator.pop(context); + Navigator.pushNamed( + context, CustomRouteNames.kViewProfileScreenRoute); + }, + child: Obx(() { + return MyCircleImage( + imageSize: 80.r, + url: + "${WebUrls.baseUrl}${DashboardScreenController.instance.myProfileData()?.user?.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + imageColor: CustomAppColors.kDarkBlueTextColor, + height: 80.r, + width: 80.r, + ), + ); + }), + ), + ), + 10.verticalSpace, + Obx( + () => CustomTextWidget( + text: DashboardScreenController.instance + .myProfileData() + ?.staffMemberName ?? + "", + textAlign: TextAlign.center, + fontColor: CustomAppColors.kBlackColor, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + ), + ), + Obx( + () => CustomTextWidget( + text: DashboardScreenController.instance + .myProfileData() + ?.staffDesignation ?? + "", + fontColor: CustomAppColors.kLightGreyColor, + fontSize: 10.sp, + fontWeight: FontWeight.w500), + ), + ], + ), + ), + Expanded( + child: Container( + width: double.infinity, + padding: EdgeInsets.only(top: 20.h, bottom: 20.h), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + _getDrawerNavItem( + title: "Home", + iconPath: AssetsManager.kHomeIcon, + color: CustomAppColors.kLightGreyColor, + selected: drawerController.selectedIndex.value == 1, + onTap: () { + Navigator.pop(context); + dashboardController.selectedIndex.value = 1; + drawerController.selectedIndex.value = 1; + // Navigator.pushNamed( + // context, + // CustomRouteNames.kDashboardScreenRoute, + // ); + }), + 6.verticalSpace, + _getDrawerNavItem( + title: "Rota", + iconPath: AssetsManager.kPersonMainIcon, + color: CustomAppColors.kLightGreyColor, + selected: drawerController.selectedIndex.value == 0, + onTap: () { + Navigator.pop(context); + // dashboardController.selectedIndex.value = 0; + // drawerController.selectedIndex.value = 0; + Navigator.pushNamed( + context, + CustomRouteNames.kRotaDashboardScreenRoute, + ); + }), + 6.verticalSpace, + _getDrawerNavItem( + title: "Clients", + iconPath: AssetsManager.kPeopleIcon, + color: CustomAppColors.kLightGreyColor, + selected: drawerController.selectedIndex.value == 3, + onTap: () { + Navigator.pop(context); + dashboardController.selectedIndex.value = 3; + drawerController.selectedIndex.value = 3; + // Navigator.pushNamed( + // context, + // CustomRouteNames.kClientsListScreenRoute, + // ); + }), + 6.verticalSpace, + _getDrawerNavItem( + title: "Inbox", + iconPath: AssetsManager.kMessageIcon, + color: CustomAppColors.kLightGreyColor, + selected: drawerController.selectedIndex.value == 2, + onTap: () { + Navigator.pop(context); + dashboardController.selectedIndex.value = 2; + drawerController.selectedIndex.value = 2; + // Navigator.pushNamed( + // context, + // CustomRouteNames.kInboxScreenRoute, + // ); + }), + 6.verticalSpace, + _getDrawerNavItem( + title: "Policies and Procedures", + iconPath: AssetsManager.kPoliciesIcon, + color: CustomAppColors.kLightGreyColor, + onTap: () { + Navigator.pop(context); + Navigator.pushNamed( + context, + CustomRouteNames.kWebviewScreen, + arguments: WebviewScreenArgument( + title: 'Policies and Procedures', + url: ConstantText.privacyUrl), + ); + }), + 6.verticalSpace, + _getDrawerNavItem( + title: "Settings", + iconPath: AssetsManager.kSettingsIcon, + color: CustomAppColors.kLightGreyColor, + onTap: () { + Navigator.pop(context); + //Todo: uncomment when start working + // Navigator.pushNamed( + // context, + // CustomRouteNames.kSettingsScreen, + // ); + }), + 6.verticalSpace, + _getDrawerNavItem( + title: "Notifications", + iconPath: AssetsManager.kBellIcon, + color: CustomAppColors.kLightGreyColor, + selected: drawerController.selectedIndex.value == 6, + onTap: () { + Navigator.pop(context); + //Todo: uncomment + // Navigator.pushNamed( + // context, + // CustomRouteNames.kNotificationListScreenRoute, + // ); + }), + const Expanded(child: FrequentFunctions.noWidget), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomTextWidget( + text: "Shift end at ", + fontColor: CustomAppColors.kLightGreyColor, + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + ), + CustomTextWidget( + text: "07Hrs 50Sec", + fontColor: CustomAppColors.kSecondaryColor, + isExpanded: false, + fontWeight: FontWeight.w700, + fontSize: 16.sp, + ), + ], + ) + ], + ), + ), + ), + ], + ), + ), + ); + } + + Widget _getDrawerNavItem( + {required String title, + required String iconPath, + Color color = CustomAppColors.kSecondaryColor, + bool selected = false, + required Function() onTap}) { + return Container( + color: selected + ? CustomAppColors.kSecondaryColor + : CustomAppColors.kPrimaryColor, + padding: REdgeInsets.symmetric(horizontal: 26, vertical: 12), + child: GestureDetector( + onTap: onTap, + // onTap: ()=> controller.onTap(title), + child: Row( + children: [ + // Icon( + // icon, + // size: 27, + // color: selected ? CustomAppColors.kWhiteColor : color, + // ), + CustomImageWidget( + imagePath: iconPath, + width: title == "Clients" ? 20.w : 22.w, + height: title == "Clients" ? 20.h : 26.h, + // height: 26.h, + imageColor: selected ? CustomAppColors.kWhiteColor : color, + ), + 10.horizontalSpace, + Expanded( + child: CustomTextWidget( + text: title, + textAlign: TextAlign.left, + fontColor: selected + ? CustomAppColors.kWhiteColor + : CustomAppColors.kIconColor, + fontSize: 18.sp, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_radio_button.dart b/lib/view/custom_widgets/custom_radio_button.dart new file mode 100644 index 0000000..7094670 --- /dev/null +++ b/lib/view/custom_widgets/custom_radio_button.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:ftc_mobile_app/utilities/custom_app_colors.dart'; +import 'package:get/get.dart'; +import 'custom_text_widget.dart'; + +class RadioButton extends StatelessWidget { + final String value; + final Rx selectedOption; + final bool isEnabled; + + const RadioButton({ + super.key, + required this.value, + required this.selectedOption, + this.isEnabled = true, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + selectedOption(value); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Ink( + width: 32.r, + height: 32.r, + child: Obx(() { + return Radio( + value: value, + groupValue: selectedOption(), + onChanged: selectedOption, + fillColor: MaterialStateProperty.resolveWith((states) { + if (!isEnabled) return CustomAppColors.kLightGreyColor; + + if (states.contains(MaterialState.selected)) { + return CustomAppColors.kSecondaryColor; + } + return Colors.black; + }), + ); + }), + ), + CustomTextWidget( + text: value, + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: + isEnabled ? Colors.black : CustomAppColors.kLightGreyColor, + ) + ], + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_scaffold.dart b/lib/view/custom_widgets/custom_scaffold.dart new file mode 100644 index 0000000..4b47007 --- /dev/null +++ b/lib/view/custom_widgets/custom_scaffold.dart @@ -0,0 +1,166 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomScaffold extends StatelessWidget { + final VoidCallback? onBackButton; + final VoidCallback? onScreenTap; + final String? titleText; + final bool avoidBottomInsets; + final bool? showShadow; + final bool showAppBar; + final bool enableLayoutBuilder; + final GlobalKey screenKey; + final PreferredSizeWidget? appBar; + final Widget? body; + final Widget? sideDrawer; + final Widget? customTabViewWidget; + final Widget? bottomMenu; + final Widget? floatingActionButton; + final Color? backgroundColor; + + const CustomScaffold({ + Key? key, + this.onBackButton, + this.customTabViewWidget, + this.titleText, + this.appBar, + this.body, + this.showShadow, + this.bottomMenu, + this.floatingActionButton, + this.onScreenTap, + this.avoidBottomInsets = true, + this.showAppBar = false, + this.enableLayoutBuilder = true, + required this.screenKey, + this.backgroundColor, + this.sideDrawer, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final ModalRoute? parentRoute = ModalRoute.of(context); + final bool canPop = parentRoute?.canPop ?? false; + return GestureDetector( + onHorizontalDragEnd: GetPlatform.isIOS + ? (details) { + if (details.velocity.pixelsPerSecond.dx > 0) { + if (onBackButton != null) { + onBackButton!(); + } else { + if (canPop) { + Navigator.pop(context); + } + } + } + } + : null, + onTap: () { + if (onScreenTap != null) onScreenTap!(); + }, + child: WillPopScope( + onWillPop: () async { + if (onBackButton != null) { + onBackButton!(); + } else { + if (canPop) { + Navigator.pop(context); + } + } + return false; + }, + child: LayoutBuilder( + builder: (context, constraint) { + if (constraint.maxWidth > 600 && enableLayoutBuilder) { + return Scaffold( + drawer: sideDrawer, + key: screenKey, + resizeToAvoidBottomInset: avoidBottomInsets, + drawerEnableOpenDragGesture: false, + endDrawerEnableOpenDragGesture: false, + backgroundColor: backgroundColor ?? CustomAppColors.kPrimaryColor, + body: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Spacer(), + Expanded( + flex: 2, + child: customTabViewWidget ?? + Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 2.0.sp, + ), + color: backgroundColor ?? + CustomAppColors.kPrimaryColor, + ), + padding: EdgeInsets.all( + 10.0.sp, + ), + child: body, + ), + ], + ), + ), + const Spacer(), + ], + ), + appBar: showAppBar + ? appBar ?? + CustomAppBar( + titleText: titleText ?? "titleText", + onBackButtonPressed: () { + if (onBackButton != null) { + onBackButton!(); + return; + } + if (canPop) { + Navigator.pop(context); + } + }, + ) + : null, + floatingActionButton: floatingActionButton, + ); + } + return Scaffold( + drawer: sideDrawer, + resizeToAvoidBottomInset: avoidBottomInsets, + key: screenKey, + floatingActionButton: floatingActionButton, + appBar: showAppBar + ? appBar ?? + CustomAppBar( + showBoxShadow: showShadow ?? false, + titleText: titleText ?? "titleText", + onBackButtonPressed: () { + if (onBackButton != null) { + onBackButton!(); + return; + } + if (canPop) { + Navigator.pop(context); + } + }, + ) + : null, + body: body ?? Container(), + backgroundColor: + backgroundColor ?? CustomAppColors.kPrimaryColor, + bottomNavigationBar: bottomMenu, + ); + }, + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_text_field_widget.dart b/lib/view/custom_widgets/custom_text_field_widget.dart new file mode 100644 index 0000000..c29365c --- /dev/null +++ b/lib/view/custom_widgets/custom_text_field_widget.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomTextFieldWidget extends StatelessWidget { + final TextEditingController? controller; + final int? minLines; + final int? maxLines; + final int? maxLength; + final String hintText; + final String heading; + final ValueChanged? onChange; + final bool isEnabled; + final bool isObscure; + final BorderRadius? borderRadius; + final Color? borderColor; + final double? borderWidth; + final Widget? bottomChild; + final TextInputType? inputType; + final TextCapitalization? textCapitalization; + final List? inputFormatters; + + const CustomTextFieldWidget({ + super.key, + this.controller, + required this.heading, + this.minLines = 1, + this.maxLines = 1, + this.maxLength, + this.hintText = "", + this.onChange, + this.isEnabled = true, + this.isObscure = false, + this.borderRadius, + this.borderColor, + this.borderWidth = 1.0, + this.bottomChild, + this.textCapitalization, + this.inputType, + this.inputFormatters, + }); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + borderRadius: borderRadius, + border: Border.all( + color: borderColor ?? CustomAppColors.kSmokeColor, + width: borderWidth ?? 1.5.sp, + ), + ), + padding: EdgeInsets.symmetric( + vertical: 10.h, + horizontal: 15.w, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // CustomTextWidget( + // text: heading, + // fontSize: 10.sp, + // fontWeight: FontWeight.w500, + // fontColor: CustomAppColors.kLightTextColor, + // alignment: Alignment.centerLeft, + // textAlign: TextAlign.left, + // ), + Text( + heading, + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 10.sp, + fontWeight: FontWeight.w500, + color: CustomAppColors.kLightTextColor, + ), + ), + 4.verticalSpace, + TextField( + controller: controller, + enabled: isEnabled, + obscureText: isObscure, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + inputFormatters: inputFormatters, + onChanged: (_) { + if (onChange != null) { + onChange!(_); + } + }, + keyboardType: inputType, + textCapitalization: textCapitalization ?? TextCapitalization.none, + cursorColor: CustomAppColors.kSecondaryColor, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.sp, + color: CustomAppColors.kIconColor, + ), + decoration: InputDecoration( + isDense: true, + hintText: hintText, + hintStyle: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.sp, + color: CustomAppColors.kLightTextColor, + ), + counterText: "", + contentPadding: EdgeInsets.zero, + border: const OutlineInputBorder( + borderSide: BorderSide.none, + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide.none, + ), + disabledBorder: const OutlineInputBorder( + borderSide: BorderSide.none, + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide.none, + ), + ), + ), + if (bottomChild != null) bottomChild!, + ], + ), + ); + } +} diff --git a/lib/view/custom_widgets/custom_text_widget.dart b/lib/view/custom_widgets/custom_text_widget.dart new file mode 100644 index 0000000..856e320 --- /dev/null +++ b/lib/view/custom_widgets/custom_text_widget.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomTextWidget extends StatelessWidget { + final String text; + final double? fontSize; + final bool isExpanded; + final FontWeight? fontWeight; + final Color? fontColor; + final String? fontFamily; + final Alignment? alignment; + final TextOverflow? textOverflow; + final TextAlign textAlign; + final TextDecoration textDecoration; + final int? maxLines; + + const CustomTextWidget({ + Key? key, + required this.text, + this.fontSize, + this.fontWeight, + this.fontColor, + this.alignment, + this.isExpanded = true, + this.fontFamily, + this.textOverflow, + this.textAlign = TextAlign.center, + this.textDecoration = TextDecoration.none, + this.maxLines, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: alignment, + width: isExpanded ? MediaQuery.of(context).size.width : null, + child: Text( + text, + textAlign: textAlign, + maxLines: maxLines, + style: TextStyle( + fontSize: fontSize, + fontWeight: fontWeight, + color: fontColor ?? CustomAppColors.kIconColor, + fontFamily: fontFamily, + decoration: textDecoration, + decorationColor: fontColor ?? CustomAppColors.kIconColor, + ), + overflow: textOverflow, + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/custom_widgets/edit_icon.dart b/lib/view/custom_widgets/edit_icon.dart new file mode 100644 index 0000000..1a37785 --- /dev/null +++ b/lib/view/custom_widgets/edit_icon.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:ftc_mobile_app/utilities/custom_app_colors.dart'; + +class EditIcon extends StatelessWidget { + final VoidCallback onTap; + + const EditIcon({super.key, required this.onTap}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Container( + width: 24.r, + height: 24.r, + // padding: REdgeInsets.all(8), + decoration: BoxDecoration( + color: CustomAppColors.kYellowColor.withOpacity(0.5), + borderRadius: BorderRadius.circular(50.r), + ), + child: Center( + child: Icon( + Icons.edit, + color: CustomAppColors.kDarkYellowColor, + size: 16.r, + ), + )), + ); + } +} diff --git a/lib/view/custom_widgets/export_custom_widgets.dart b/lib/view/custom_widgets/export_custom_widgets.dart new file mode 100644 index 0000000..5793967 --- /dev/null +++ b/lib/view/custom_widgets/export_custom_widgets.dart @@ -0,0 +1,16 @@ +export 'custom_text_widget.dart'; +export 'custom_app_bar.dart'; +export 'custom_scaffold.dart'; +export 'custom_image_widgets.dart'; +export 'custom_text_field_widget.dart'; +export 'custom_error_msg.dart'; +export 'custom_check_box.dart'; +export 'custom_app_button.dart'; +export 'rota/export_rota.dart'; +export 'home/export_home_widgets.dart'; +export 'notifications/export_notification_widgets.dart'; +export 'custom_navigation_drawer.dart'; +export 'auth/export_auth_widgets.dart'; +export 'custom_radio_button.dart'; +export 'loading_widget.dart'; +export 'custom_app_bar_title_only.dart'; \ No newline at end of file diff --git a/lib/view/custom_widgets/home/custom_message_dialog.dart b/lib/view/custom_widgets/home/custom_message_dialog.dart new file mode 100644 index 0000000..bca0a23 --- /dev/null +++ b/lib/view/custom_widgets/home/custom_message_dialog.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class CustomMessageDialog extends StatelessWidget { + const CustomMessageDialog({Key? key, required this.dialogMessageText, required this.headingText, required this.dialogMessageTextBold, required this.dialogButtonText}) : super(key: key); + + final String headingText; + final String dialogMessageText; + final String dialogMessageTextBold; + final String dialogButtonText; + + @override + Widget build(BuildContext context) { + return AlertDialog( + surfaceTintColor: CustomAppColors.kPrimaryColor, + insetPadding: REdgeInsets.all(18), + contentPadding: REdgeInsets.all(15), + shape: LinearBorder.top(side: BorderSide.none), + backgroundColor: CustomAppColors.kWhiteColor, + shadowColor: CustomAppColors.kWhiteColor, + // titlePadding: EdgeInsets.only(top: 20.h), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + CustomTextWidget( + text: headingText, + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + ), + 8.verticalSpace, + Container( + padding: EdgeInsets.all(10.sp), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightGreyColor)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: dialogMessageText, + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w400, + textAlign: TextAlign.left, + ), + 12.verticalSpace, + dialogMessageTextBold != "" + ? CustomTextWidget( + text: dialogMessageTextBold, + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.bold, + textAlign: TextAlign.left, + ) + : Container(), + ], + ), + ), + 12.verticalSpace, + SizedBox( + height: 32.h, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: Size(double.infinity, 30.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + backgroundColor: CustomAppColors.kSecondaryColor), + onPressed: () { + // Add functionality for the "Agree" button. + Navigator.of(context).pop(); + }, + child: CustomTextWidget( + text: dialogButtonText, + fontColor: CustomAppColors.kPrimaryColor, + fontSize: 14.sp, + fontWeight: FontWeight.w400), + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/custom_widgets/home/custom_privacy_policy_dialog.dart b/lib/view/custom_widgets/home/custom_privacy_policy_dialog.dart new file mode 100644 index 0000000..6497ab7 --- /dev/null +++ b/lib/view/custom_widgets/home/custom_privacy_policy_dialog.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class PrivacyPolicyDialog extends StatelessWidget { + const PrivacyPolicyDialog({Key? key, required this.privacyPolicy, required this.checkBoxOnChange}) : super(key: key); + + final String privacyPolicy; + final ValueChanged? checkBoxOnChange; + + @override + Widget build(BuildContext context) { + return AlertDialog( + surfaceTintColor: CustomAppColors.kPrimaryColor, + insetPadding: EdgeInsets.only(right: 18.w,left: 18.w, top:40.h ,bottom: MediaQuery.of(context).size.height/3.h), + contentPadding: EdgeInsets.only(left: 15.w,right: 15.w,top: 11.h,bottom: 0.h), + shape: LinearBorder.top(side: BorderSide.none), + backgroundColor: CustomAppColors.kWhiteColor, + shadowColor: CustomAppColors.kWhiteColor, + titlePadding: EdgeInsets.only(top: 20.h), + title: CustomTextWidget( + text: "New Policy", + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + ), + content: Column( + children: [ + Container( + padding: EdgeInsets.all(10.sp), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightGreyColor)), + child: CustomTextWidget( + text: privacyPolicy, + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w400, + textAlign: TextAlign.left, + ), + ), + const Spacer(), + SizedBox( + height: 30.h, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Checkbox( + activeColor: CustomAppColors.kSecondaryColor, + value: true, + onChanged: (value) { + if (checkBoxOnChange != null && value!= null) { + checkBoxOnChange!(value); + } + }), + CustomTextWidget( + text: "Agree to the new policy", + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w400, + ), + ], + ), + ), + Container( + // padding: EdgeInsets.only(bottom: 50.h), + // height: 25.h, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: Size(double.infinity, 30.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + backgroundColor: CustomAppColors.kSecondaryColor), + onPressed: () { + // Add functionality for the "Agree" button. + Navigator.of(context).pop(); + }, + child: CustomTextWidget( + text: 'Agree', + fontColor: CustomAppColors.kPrimaryColor, + fontSize: 14.sp, + fontWeight: FontWeight.w400), + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/custom_widgets/home/export_home_widgets.dart b/lib/view/custom_widgets/home/export_home_widgets.dart new file mode 100644 index 0000000..2e999ef --- /dev/null +++ b/lib/view/custom_widgets/home/export_home_widgets.dart @@ -0,0 +1,2 @@ +export 'custom_privacy_policy_dialog.dart'; +export 'custom_message_dialog.dart'; \ No newline at end of file diff --git a/lib/view/custom_widgets/human_body_mapper_widget.dart b/lib/view/custom_widgets/human_body_mapper_widget.dart new file mode 100644 index 0000000..dc556f5 --- /dev/null +++ b/lib/view/custom_widgets/human_body_mapper_widget.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import '../../utilities/enums/body_parts.dart'; + +class HumanBodyWidget extends StatefulWidget { + final double width; + final Map visibleBodyPoints; + final Function(BodyPart, Offset position)? onPointTap; + + const HumanBodyWidget({ + super.key, + required this.visibleBodyPoints, + required this.width, + this.onPointTap, + }); + + @override + State createState() => _HumanBodyWidgetState(); +} + +class _HumanBodyWidgetState extends State { + final GlobalKey _imageKey = GlobalKey(); + + //Note: change the size if changing [AssetsManager.pngHumanBodyFrontBack] image + final _actualImageSize = const Size(500, 681); + + late double height; + + @override + void initState() { + super.initState(); + + height = widget.width / _actualImageSize.aspectRatio; + + WidgetsBinding.instance.addPostFrameCallback((_) { + Size? imageSize = _imageKey.currentContext?.size; + // Now you can use imageSize.width and imageSize.height + + print("image size: $imageSize"); + }); + } + + @override + Widget build(BuildContext context) { + return UnconstrainedBox( + child: SizedBox( + width: widget.width, + height: height, + child: LayoutBuilder(builder: (_, constrains) { + return Stack( + fit: StackFit.loose, + children: [ + Positioned.fill( + child: Image.asset( + AssetsManager.pngHumanBodyFrontBack, + key: _imageKey, + width: MediaQuery.of(context).size.width, + fit: BoxFit.contain, + ), + ), + ...widget.visibleBodyPoints.entries + .map((e) => _pointWidget( + bodyPart: e.key, + color: e.value, + constrains: constrains, + onPointTap: widget.onPointTap, + )) + .toList() + ], + ); + }), + ), + ); + } + + Positioned _pointWidget({ + required BodyPart bodyPart, + required BoxConstraints constrains, + Color? color, + Function(BodyPart, Offset position)? onPointTap, + }) { + return Positioned( + top: constrains.maxHeight * (bodyPart.topPercent / 100.0), + left: constrains.maxWidth * (bodyPart.leftPercent / 100.0), + child: InkWell( + onTap: () { + // RenderBox? button = context.findRenderObject() as RenderBox?; + // RenderBox? overlay = + // Overlay.of(context).context.findRenderObject() as RenderBox?; + // Rect? buttonRect = (button == null) + // ? null + // : Rect.fromPoints( + // button.localToGlobal(Offset.zero, ancestor: overlay), + // button.localToGlobal(button.size.bottomRight(Offset.zero), + // ancestor: overlay), + // ); + // double screenHeight = MediaQuery.of(context).size.height; + // double popupHeight = screenHeight - (buttonRect?.bottom ?? 0.5.sh); + }, + onTapUp: (d) { + if (onPointTap != null) { + onPointTap(bodyPart, d.globalPosition); + } + }, + child: Container( + width: 12.r, + height: 12.r, + decoration: BoxDecoration( + color: color ?? CustomAppColors.kRedColor, + border: Border.all(color: CustomAppColors.kWhiteColor, width: 2), + borderRadius: BorderRadius.circular(6.r), + ), + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/label_value_box_widget.dart b/lib/view/custom_widgets/label_value_box_widget.dart new file mode 100644 index 0000000..f10dd86 --- /dev/null +++ b/lib/view/custom_widgets/label_value_box_widget.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class LabelValueBoxWidget extends StatelessWidget { + const LabelValueBoxWidget({ + super.key, + required this.label, + required this.value, + this.trailing, + this.borderColor, + }); + + final String label; + final String value; + final Color? borderColor; + final Widget? trailing; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.h), + decoration: BoxDecoration( + border: Border.all(color: borderColor ?? Colors.grey), + ), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: label, + fontColor: CustomAppColors.kLightGreyColor, + fontWeight: FontWeight.w500, + isExpanded: false, + textAlign: TextAlign.left, + fontSize: 10.sp, + ), + 6.verticalSpace, + CustomTextWidget( + text: value, + fontColor: CustomAppColors.kBlackColor, + fontWeight: FontWeight.w600, + fontSize: 14.0.sp, + textAlign: TextAlign.left, + isExpanded: false, + ), + ], + ), + ), + trailing ?? const SizedBox.shrink() + ], + ), + ); + } +} + diff --git a/lib/view/custom_widgets/loading_widget.dart b/lib/view/custom_widgets/loading_widget.dart new file mode 100644 index 0000000..e0c1a4f --- /dev/null +++ b/lib/view/custom_widgets/loading_widget.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class LoadingWidget extends StatelessWidget { + const LoadingWidget({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Material( + type: MaterialType.transparency, + child: Center( + child: Container( + width: 150.w, + height: 170.h, + decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(8.r)), + child: LoaderColumn( + loadingText: "Loading", + textColor: Colors.black, + ), + ), + )); + } +} + +class LoaderColumn extends Column { + LoaderColumn({Key? key, String? loadingText, Color? color, Color? textColor}) + : super( + key: key, + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircularProgressIndicator(color: color), + (loadingText == null || loadingText.isEmpty) + ? const SizedBox.shrink() + : Padding( + padding: REdgeInsets.only(top: 16.0), + child: CustomTextWidget( + text: loadingText!, + textAlign: TextAlign.center, + ), + ), + ], + ); +} diff --git a/lib/view/custom_widgets/multiline_text_field_sheet.dart b/lib/view/custom_widgets/multiline_text_field_sheet.dart new file mode 100644 index 0000000..61eaa44 --- /dev/null +++ b/lib/view/custom_widgets/multiline_text_field_sheet.dart @@ -0,0 +1,237 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +class MultilineTextFieldSheet { + final String appBarTitle; + final String textFieldHint; + final String buttonLabel; + final bool wantLeadingIcon; + final String prevValueForField; + final int minLines; + final int maxLines; + + // final ContentSheetAction action; + final Function(String text) onButtonClick; + + MultilineTextFieldSheet({ + required this.buttonLabel, + required this.appBarTitle, + required this.textFieldHint, + this.prevValueForField = "", + this.wantLeadingIcon = true, + required this.onButtonClick, + this.minLines = 5, + this.maxLines = 5, + }); + + show() { + Get.bottomSheet( + _ContentWidget( + key: const ValueKey(1), + appBarTitle: appBarTitle, + buttonLabel: buttonLabel, + onButtonClick: onButtonClick, + textFieldHint: textFieldHint, + prevValueForField: prevValueForField, + // action: action, + wantLeadingIcon: wantLeadingIcon, + minLines: minLines, + maxLines: maxLines, + ), + clipBehavior: Clip.none, + backgroundColor: Colors.transparent, + elevation: 4, + isScrollControlled: true, + shape: RoundedRectangleBorder( + borderRadius: const BorderRadius.vertical(top: Radius.circular(32)).r, + ), + ); + } +} + +class _ContentWidget extends StatefulWidget { + final String appBarTitle; + final String textFieldHint; + final String buttonLabel; + final String prevValueForField; + final bool wantLeadingIcon; + final Function onButtonClick; + final int minLines; + final int maxLines; + + const _ContentWidget({ + super.key, + required this.appBarTitle, + required this.buttonLabel, + required this.textFieldHint, + this.prevValueForField = "", + required this.onButtonClick, + required this.wantLeadingIcon, + this.minLines = 5, + this.maxLines = 5, + }); + + @override + _ContentWidgetState createState() => _ContentWidgetState(); +} + +class _ContentWidgetState extends State<_ContentWidget> { + final ContentController _controller = ContentController(); + + @override + void initState() { + _controller.initData(widget.prevValueForField, ""); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + padding: MediaQuery.of(context).viewPadding, + child: ListView( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + children: [ + bottomSheetAppBar(context), + 24.verticalSpace, + _textField().addPaddingHorizontal(24), + 32.verticalSpace, + _addButton(context).addPaddingHorizontal(24), + 24.verticalSpace, + ], + ), + ); + } + + AppBar bottomSheetAppBar(BuildContext context) { + return AppBar( + automaticallyImplyLeading: false, + title: Text( + widget.appBarTitle, + style: const TextStyle(color: Colors.black), + ), + centerTitle: false, + titleSpacing: 24, + backgroundColor: Colors.transparent, + elevation: 0, + actions: [ + InkWell( + child: const Icon( + Icons.close, + color: Colors.black, + ), + onTap: () { + Navigator.pop(context); + }), + 16.horizontalSpace, + ], + ); + } + + Widget _textField() { + return DecoratedBox( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: (8).toRadius(), + border: Border.all(color: Colors.grey, width: 1)), + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 16.0, vertical: 12), + child: TextField( + controller: _controller.textFieldTEC, + textCapitalization: TextCapitalization.sentences, + textInputAction: TextInputAction.next, + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w400), + onChanged: (text) { + _controller.isButtonEnable( + text.isNotNullOrEmpty() && text != widget.prevValueForField); + }, + minLines: widget.minLines, + maxLines: widget.maxLines, + decoration: InputDecoration( + isDense: true, + hintText: widget.textFieldHint, + hintStyle: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w400) + .copyWith(color: Colors.grey), + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + errorBorder: InputBorder.none, + focusedErrorBorder: InputBorder.none, + ), + ), + ), + ); + } + + Widget _addButton(context) { + return InkWell( + onTap: () { + if (_controller.isButtonEnable()) { + Get.back(); + widget.onButtonClick(_controller.textFieldTEC.text); + } + }, + child: Obx(() { + return Container( + decoration: BoxDecoration( + color: _controller.isButtonEnable() + ? Get.theme.primaryColor + : Colors.grey.withOpacity(0.5), + borderRadius: BorderRadius.circular(4.r), + boxShadow: [ + BoxShadow( + color: Get.theme.primaryColor.withOpacity(0.2), + spreadRadius: _controller.isButtonEnable() ? 4 : 0, + blurRadius: _controller.isButtonEnable() ? 8 : 0, + offset: _controller.isButtonEnable() + ? const Offset(4, 8) + : const Offset(0, 0)) + ]), + width: double.maxFinite, + height: 48, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Visibility( + visible: widget.wantLeadingIcon, + child: const Padding( + padding: EdgeInsets.only(right: 8.0), + child: Icon( + Icons.add, + color: Colors.white, + size: 20, + ), + ), + ), + Text(widget.buttonLabel, + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w700) + .copyWith(color: Colors.white)), + ], + ), + ); + }), + ); + } +} + +class ContentController extends GetxController { + final TextEditingController textFieldTEC = TextEditingController(); + final FocusNode textFieldFN = FocusNode(); + + final isButtonEnable = false.obs; + + initData(String prevText, String prevColor) { + textFieldTEC.text = (prevText.isNullOrEmptyNot()) ? prevText : ""; + } + + @override + void onClose() { + textFieldTEC.dispose(); + textFieldFN.unfocus(); + super.onClose(); + } +} diff --git a/lib/view/custom_widgets/my_circle_image.dart b/lib/view/custom_widgets/my_circle_image.dart new file mode 100644 index 0000000..eacdb68 --- /dev/null +++ b/lib/view/custom_widgets/my_circle_image.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'my_network_image.dart'; + +class MyCircleImage extends StatelessWidget { + final double imageSize; + final String url; + final Widget? loadingWidget; + final Widget? errorWidget; + final BoxFit? fit; + + const MyCircleImage( + {Key? key, + required this.imageSize, + required this.url, + this.loadingWidget, + this.errorWidget, + this.fit}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return ClipOval( + child: SizedBox( + width: imageSize, + height: imageSize, + child: MyNetworkImage( + url: url, + errorWidget: errorWidget, + loadingWidget: loadingWidget, + fit: fit, + ), + ), + ); + } +} diff --git a/lib/view/custom_widgets/my_network_image.dart b/lib/view/custom_widgets/my_network_image.dart new file mode 100644 index 0000000..b272a52 --- /dev/null +++ b/lib/view/custom_widgets/my_network_image.dart @@ -0,0 +1,77 @@ +import 'dart:io'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:get/utils.dart'; +import 'package:path/path.dart' as path; + +class MyNetworkImage extends StatelessWidget { + final String url; + final Widget? loadingWidget; + final Widget? errorWidget; + final BoxFit? fit; + final int? memCacheWidth; + final int? memCacheHeight; + + const MyNetworkImage({ + Key? key, + required this.url, + this.loadingWidget, + this.errorWidget, + this.fit, + this.memCacheWidth, + this.memCacheHeight, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final errWidget = + (errorWidget ?? ColoredBox(color: Colors.grey.withOpacity(0.3))); + return (url.isEmpty || !url.isImageFileName) + ? errWidget + : _media; + } + + Widget get _media { + return (path.extension(url).toLowerCase() == ".svg") + ? SvgPicture.network( + url, + fit: fit ?? BoxFit.cover, + placeholderBuilder: (_) { + return Center( + child: SizedBox.square( + dimension: 32, + child: (Platform.isIOS) + ? const CupertinoActivityIndicator(radius: 20) + : const CircularProgressIndicator( + strokeWidth: 2, + ), + ), + ); + }, + ) + : CachedNetworkImage( + imageUrl: url, + fit: fit ?? BoxFit.cover, + memCacheWidth: memCacheWidth, + memCacheHeight: memCacheHeight, + placeholder: (context, url) { + return loadingWidget ?? + Center( + child: SizedBox.square( + dimension: 32, + child: (Platform.isIOS) + ? const CupertinoActivityIndicator(radius: 20) + : const CircularProgressIndicator( + strokeWidth: 2, + ), + ), + ); + }, + errorWidget: (context, url, error) { + return errorWidget ?? Icon(Icons.image_not_supported_outlined); + }, + ); + } +} diff --git a/lib/view/custom_widgets/notifications/custom_dialog_notification.dart b/lib/view/custom_widgets/notifications/custom_dialog_notification.dart new file mode 100644 index 0000000..08dc082 --- /dev/null +++ b/lib/view/custom_widgets/notifications/custom_dialog_notification.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + + +class ShowDialogNotification extends StatelessWidget { + const ShowDialogNotification({ + super.key, + required this.rotaShift, + }); + + final RotaShift rotaShift; + + @override + Widget build(BuildContext context) { + return AlertDialog( + surfaceTintColor: CustomAppColors.kPrimaryColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), + backgroundColor: CustomAppColors.kPrimaryColor, + title: Center( + child: CustomTextWidget( + text: rotaShift.managerName, + fontWeight: FontWeight.bold, + isExpanded: false, + alignment: Alignment.center, + fontSize: 16.sp, + ), + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + NotificationInfoRow( label: 'Service User:', value: rotaShift.name,), + const SizedBox(height: 5,), + NotificationInfoRow(label: 'Worker Type Role:', value: rotaShift.workerType), + const SizedBox(height: 5,), + NotificationInfoRow(label: 'Location:',value: rotaShift.location), + const SizedBox(height: 5,), + NotificationInfoRow(label: 'Start Time:', value: rotaShift.startTime), + const SizedBox(height: 5,), + NotificationInfoRow(label: 'End Time:',value: rotaShift.endTime), + const SizedBox(height: 5,), + NotificationInfoRow(label: 'Break Time:',value: rotaShift.breakTime), + const SizedBox(height: 5,), + NotificationInfoRow(label: 'Notes:',value: rotaShift.notes), + ], + ), + actions: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Visibility( + visible: false, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + maximumSize: Size(MediaQuery.of(context).size.width/3.5, 30.h), + minimumSize: Size(MediaQuery.of(context).size.width/3.5, 30.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.r), + ), + backgroundColor: CustomAppColors.kRedColor + ), + onPressed: () { + // Add functionality for the "Decline" button. + Navigator.of(context).pop(); + }, + child: const CustomTextWidget(text: 'Decline',fontColor: CustomAppColors.kPrimaryColor), + ), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + // maximumSize: Size(MediaQuery.of(context).size.width/3.5, 30.h), + maximumSize: Size(MediaQuery.of(context).size.width/1.8, 30.h), + // minimumSize: Size(MediaQuery.of(context).size.width/3.5, 30.h), + minimumSize: Size(MediaQuery.of(context).size.width/1.8, 30.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.r), + ), + backgroundColor: CustomAppColors.kPrimaryColor + ), + onPressed: () { + // Add functionality for the "Close" button. + Navigator.of(context).pop(); + }, + child: CustomTextWidget(text: 'Close',fontColor: CustomAppColors.kBlackColor,fontSize: 15.sp), + ), + ], + ), + ], + ); + } +} + +class NotificationInfoRow extends StatelessWidget { + const NotificationInfoRow({ + super.key,required this.label, required this.value, this.half = false + }); + + final String label, value; + final bool half; + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + border: Border.all(width: 1.w, color: CustomAppColors.kLightGreyColor), + borderRadius: BorderRadius.circular(5.r)), + padding: EdgeInsets.only(left: 10.w,top: 1.h,bottom: 1.h), + width: half ? null : MediaQuery.of(context).size.width, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget(text: label,isExpanded: false,fontSize: 12.sp), + CustomTextWidget(text: value,fontWeight: FontWeight.w600,isExpanded: false,fontSize: 14,), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/custom_widgets/notifications/export_notification_widgets.dart b/lib/view/custom_widgets/notifications/export_notification_widgets.dart new file mode 100644 index 0000000..6606b80 --- /dev/null +++ b/lib/view/custom_widgets/notifications/export_notification_widgets.dart @@ -0,0 +1,2 @@ +export 'custom_dialog_notification.dart'; +export 'holiday_request_accept_dialog.dart'; \ No newline at end of file diff --git a/lib/view/custom_widgets/notifications/holiday_request_accept_dialog.dart b/lib/view/custom_widgets/notifications/holiday_request_accept_dialog.dart new file mode 100644 index 0000000..fe250ae --- /dev/null +++ b/lib/view/custom_widgets/notifications/holiday_request_accept_dialog.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + + +class HolidayRequestAcceptDialog extends StatelessWidget { + const HolidayRequestAcceptDialog({ + super.key, required this.startDate, required this.endDate, required this.noOfDays, + }); + + final String startDate; + final String endDate; + final String noOfDays; + + @override + Widget build(BuildContext context) { + return AlertDialog( + insetPadding: EdgeInsets.only(right: 18.w,left: 18.w, top:40.h ,bottom: 230.h), + contentPadding: EdgeInsets.only(left: 15.w,right: 15.w,top: 11.h,bottom: 0.h), + surfaceTintColor: CustomAppColors.kPrimaryColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), + backgroundColor: CustomAppColors.kPrimaryColor, + title: Center( + child: CustomTextWidget( + text: "Your Holiday Request has been sent", + fontWeight: FontWeight.w700, + isExpanded: false, + alignment: Alignment.center, + fontSize: 14.sp, + ), + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded(child: DateInfo( label: 'Start Date', value: startDate,half: true)), + SizedBox(width: 5.w,), + Expanded(child: DateInfo(label: 'End Date', value: endDate,half: true)), + ], + ), + SizedBox(height: 10.h,), + DateInfo(label: 'Holiday Total Time',value: noOfDays), + SizedBox(height: 10.h,), + CustomTextWidget(text: "Kindly wait as we review your holiday request.",fontSize: 12.sp), + SizedBox(height: 10.h,), + + ], + ), + actions: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.r), + ), + backgroundColor: CustomAppColors.kPrimaryColor, + surfaceTintColor: CustomAppColors.kPrimaryColor, + ), + onPressed: () { + // Add functionality for the "Close" button. + Navigator.of(context).pop(); + }, + child: CustomTextWidget( + text: 'Close', + fontColor: CustomAppColors.kBlackColor, + fontSize: 15.sp), + ), + ], + ); + } +} + +class DateInfo extends StatelessWidget { + const DateInfo({ + super.key,required this.label, required this.value, this.half = false + }); + + final String label, value; + final bool half; + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + border: Border.all(width: 1.w, color: CustomAppColors.kLightGreyColor), + borderRadius: BorderRadius.circular(5.r)), + padding: EdgeInsets.only(left: 10.w,top: 1.h,bottom: 1.h), + width: half ? null : MediaQuery.of(context).size.width, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget(text: label, isExpanded: false, fontSize: 12.sp), + CustomTextWidget( + text: value, + fontWeight: FontWeight.w600, + isExpanded: false, + fontSize: 14, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/custom_widgets/rota/custom_calendar_widget.dart b/lib/view/custom_widgets/rota/custom_calendar_widget.dart new file mode 100644 index 0000000..6ecc6ef --- /dev/null +++ b/lib/view/custom_widgets/rota/custom_calendar_widget.dart @@ -0,0 +1,321 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_calendar_carousel/classes/event.dart'; +import 'package:flutter_calendar_carousel/flutter_calendar_carousel.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../../ftc_mobile_app.dart'; + +// class SetMonthAndYearWidget extends StatelessWidget { +// const SetMonthAndYearWidget({ +// super.key, +// required this.currentMonthName, +// required this.previousMonthTap, +// required this.nextMonthTap, +// }); +// +// final String currentMonthName; +// final VoidCallback previousMonthTap; +// final VoidCallback nextMonthTap; +// +// @override +// Widget build(BuildContext context) { +// return Container( +// padding: const EdgeInsets.only(left: 20.0, right: 20.0), +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GestureDetector( +// onTap: previousMonthTap, +// child: Transform.rotate( +// angle: 3.1415 * 2.5, +// child: const Icon(Icons.arrow_drop_down), +// ), +// ), +// CustomTextWidget( +// isExpanded: false, +// text: currentMonthName, +// textAlign: TextAlign.center, +// fontColor: CustomAppColors.kBlackColor, +// fontSize: 13, +// fontWeight: FontWeight.bold), +// GestureDetector( +// onTap: nextMonthTap, +// child: Transform.rotate( +// angle: 3.1415 * 3.5, +// child: const Icon(Icons.arrow_drop_down), +// ), +// ), +// ], +// ), +// ); +// } +// } + +typedef OnRangeSelect = Function( + DateTime rangeStart, DateTime? rangeEnd, List selectedDates); + +class CalendarWidget extends StatefulWidget { + static final dateFormat = DateFormat("dd-MM-yyyy"); + + const CalendarWidget({ + super.key, + this.minDate, + this.maxDate, + this.onEventTap, + required this.targetDateTime, + required this.markedDatesMap, + this.onDayTap, + this.rangeStart, + this.rangeEnd, + this.canSelectRange = false, + this.onRangeSelect, + }); + + final DateTime? minDate; + final DateTime? maxDate; + final DateTime targetDateTime; + final EventList markedDatesMap; + final ValueChanged>? onEventTap; + final Function(DateTime, List)? onDayTap; + final bool canSelectRange; + + ///[selectedDates] will be in format dd-MM-yyyy + final OnRangeSelect? onRangeSelect; + final DateTime? rangeStart; + final DateTime? rangeEnd; + + @override + State createState() => _CalendarWidgetState(); + + ///This method checks if [start] and [end] dates are at proper position i.e., + ///[start] date should be before [end] date. If not, this method corrects the two dates and + ///return proper [start] [end] dates + static ({DateTime start, DateTime end}) rectifyStartEndDates( + DateTime start, DateTime end) { + final first = start.isBefore(end) ? start : end; + final last = end.isAfter(start) ? end : start; + return (start: first, end: last); + } + + static List getDatesFromStartEndRange(DateTime start, DateTime end) { + final List dates = []; + // final first = start.isBefore(end) ? start : end; + // final last = end.isAfter(start) ? end : start; + + final record = rectifyStartEndDates(start, end); + for (int i = 0; i <= record.end.difference(record.start).inDays; i++) { + dates.add(dateFormat.format(record.start.add(i.days))); + } + return dates; + } + + static Widget shiftIcon(String day) => CircleAvatar( + backgroundColor: CustomAppColors.kSecondaryColor, + child: Text( + day, + style: + const TextStyle(color: CustomAppColors.kWhiteColor, fontSize: 13), + ), + ); + + static Widget underlineIcon() => Container( + alignment: Alignment.center, + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide( + color: CustomAppColors.kSecondaryColor, + width: 3.0, + ), + ), + ), + ); +} + +class _CalendarWidgetState extends State { + //Selected dates will be in format dd-MM-yyyy + final selectedDates = RxList(); + + DateTime? start, end; + + @override + void initState() { + super.initState(); + + if (widget.canSelectRange && + widget.rangeStart != null && + widget.rangeEnd != null) { + start = widget.rangeStart; + end = widget.rangeEnd; + + selectedDates.value = + CalendarWidget.getDatesFromStartEndRange(start!, end!); + } else { + selectedDates.value = [ + CalendarWidget.dateFormat.format(widget.targetDateTime) + ]; + } + } + + @override + Widget build(BuildContext context) { + double width = MediaQuery.of(context).size.width; + double height = MediaQuery.of(context).size.height; + double textScaleFactor = MediaQuery.of(context).textScaleFactor; + double itemHeight = (height * textScaleFactor - kToolbarHeight - 24) / 4; + double calHeight = (height * textScaleFactor) / 2.9; + double itemWidth = width * 0.7; + + return Container( + height: calHeight, + margin: const EdgeInsets.only(top: 10, bottom: 3), + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: CalendarCarousel( + targetDateTime: widget.targetDateTime, + firstDayOfWeek: 0, + dayPadding: 1.0, + minSelectedDate: widget.minDate, + maxSelectedDate: widget.maxDate, + todayTextStyle: const TextStyle( + color: CustomAppColors.kBlackColor, + fontWeight: FontWeight.normal, + fontSize: 13.0, + ), + weekdayTextStyle: const TextStyle( + color: CustomAppColors.kBlueColor, + fontWeight: FontWeight.bold, + fontSize: 13.0, + ), + weekendTextStyle: const TextStyle( + color: CustomAppColors.kBlackColor, + fontSize: 13.0, + ), + customDayBuilder: (bool isSelectable, + int index, + bool isSelectedDay, + bool isToday, + bool isPrevMonthDay, + TextStyle textStyle, + bool isNextMonthDay, + bool isThisMonthDay, + DateTime day) { + if (selectedDates.contains(CalendarWidget.dateFormat.format(day))) { + return Container( + width: double.maxFinite, + height: double.maxFinite, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Theme.of(context).primaryColor, + ), + child: Center( + child: Text( + day.day.toString(), + style: textStyle.copyWith(color: Colors.white), + ), + ), + ); + } + return null; + }, + onDayPressed: (DateTime date, List events) { + if (widget.onEventTap != null) { + widget.onEventTap!(events); + } + if (widget.onDayTap != null) { + widget.onDayTap!(date, events); + } + if (widget.canSelectRange) { + rangeSelectionHandler(date); + } + }, + childAspectRatio: textScaleFactor > 1.5 + ? ((itemWidth / itemHeight) * 1.1) + : textScaleFactor > 1 + ? ((itemWidth / itemHeight) * 1.05) + : (itemWidth / itemHeight), + todayButtonColor: Colors.transparent, + todayBorderColor: Colors.transparent, + daysHaveCircularBorder: true, + isScrollable: true, + shouldShowTransform: false, + pageSnapping: true, + // selectedDateTime: DateTime(2024, 5, 25), + thisMonthDayBorderColor: Colors.transparent, + daysTextStyle: const TextStyle( + fontSize: 13.0, + color: CustomAppColors.kBlackColor, + ), + weekFormat: false, + showOnlyCurrentMonthDate: true, + width: width, + onHeaderTitlePressed: () {}, + customGridViewPhysics: const NeverScrollableScrollPhysics(), + markedDatesMap: widget.markedDatesMap, + //marked up dates + markedDateIconBuilder: (event) => event.icon, + markedDateCustomTextStyle: TextStyle( + fontSize: 13.sp, + color: CustomAppColors.kWhiteColor, + ), + markedDateShowIcon: true, + markedDateIconMaxShown: 1, + markedDateMoreShowTotal: null, + showHeader: true, + leftButtonIcon: const Icon( + Icons.arrow_left, + color: Colors.black, + ), + rightButtonIcon: const Icon( + Icons.arrow_right, + color: Colors.black, + ), + headerTextStyle: const TextStyle( + color: CustomAppColors.kBlackColor, + fontSize: 13, + fontWeight: FontWeight.bold), + onCalendarChanged: (DateTime date) {}, + onDayLongPressed: (DateTime date) {}, + ), + ); + } + + rangeSelectionHandler(DateTime selectedDay) { + final d = CalendarWidget.dateFormat.format(selectedDay); + + if (selectedDates.contains(d)) { + selectedDates.remove(d); + } else { + selectedDates.add(d); + } + + //meaning either no range selected or range already been selected + if (start == null || (start != null && end != null)) { + start = selectedDay; + end = null; + selectedDates + ..clear() + ..add(CalendarWidget.dateFormat.format(selectedDay)); + + if (widget.onRangeSelect != null) { + widget.onRangeSelect!(start!, null, selectedDates()); + } + return; + } + + //Already selected start date now selecting range end date + if (end == null) { + final record = CalendarWidget.rectifyStartEndDates(start!, selectedDay); + + start = record.start; + end = record.end; + + selectedDates.clear(); + selectedDates.value = + CalendarWidget.getDatesFromStartEndRange(start!, end!); + } + print("start: ${start.toString()}\nEnd:${end.toString()}"); + + if (widget.onRangeSelect != null) { + widget.onRangeSelect!(start!, end, selectedDates()); + } + } +} diff --git a/lib/view/custom_widgets/rota/export_rota.dart b/lib/view/custom_widgets/rota/export_rota.dart new file mode 100644 index 0000000..9a5f46c --- /dev/null +++ b/lib/view/custom_widgets/rota/export_rota.dart @@ -0,0 +1,3 @@ +export 'custom_calendar_widget.dart'; +export "package:ftc_mobile_app/dialogs/widgets/shift_dialog.dart"; +export 'rota_list_item.dart'; \ No newline at end of file diff --git a/lib/view/custom_widgets/rota/rota_list_item.dart b/lib/view/custom_widgets/rota/rota_list_item.dart new file mode 100644 index 0000000..9ff96d2 --- /dev/null +++ b/lib/view/custom_widgets/rota/rota_list_item.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import '../../../ftc_mobile_app.dart'; + +class RotaWidget extends StatelessWidget { + const RotaWidget( + {super.key, required this.data, required this.onViewShiftTap}); + + final DaysArrayData data; + final Function() onViewShiftTap; + + @override + Widget build(BuildContext context) { + return Container( + // height: 150, + alignment: Alignment.center, + padding: EdgeInsets.all(10.sp), + width: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + color: Colors.white, + border: Border( + left: BorderSide( + width: 6.r, + color: CustomAppColors.kSecondaryColor, + ), + top: const BorderSide( + color: CustomAppColors.kSecondaryColor, + ), + right: const BorderSide( + color: CustomAppColors.kSecondaryColor, + ), + bottom: const BorderSide( + color: CustomAppColors.kSecondaryColor, + ), + ), + borderRadius: BorderRadius.all(Radius.circular(2.0.r)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text.rich( + TextSpan( + text: data.locationId?.shiftLocationName ?? "", + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + children: [ + const TextSpan(text: ' ('), + TextSpan( + text: ((data.serviceUserId?.displayName ?? + "Unassigned")) + .trim(), + style: TextStyle( + color: data.serviceUserId?.displayName + .isNotNullOrEmpty() == + true + ? Colors.black + : Colors.red)), + const TextSpan(text: ')'), + ], + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + CustomTextWidget( + fontWeight: FontWeight.w500, + fontSize: 10.sp, + text: DateFormatter().getRotaNewDate( + shiftDate: data.shiftDate ?? 0, + startShiftTime: data.shiftStartTime ?? '0', + endShiftTime: data.shiftEndTime ?? '0', + ), + isExpanded: false), + 6.verticalSpace, + CustomTextWidget( + text: '${int.parse(data.workHrs?.toString() ?? "0")}hrs', + fontSize: 14.sp, + fontWeight: FontWeight.w600, + isExpanded: false, + ), + ], + ), + ], + ), + 10.verticalSpace, + ShiftButtonWidget(onTap: onViewShiftTap) + ], + ), + ); + } +} + +class ShiftButtonWidget extends StatelessWidget { + final VoidCallback onTap; + + const ShiftButtonWidget({ + super.key, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Container( + width: MediaQuery.of(context).size.width, + height: 26.h, + alignment: Alignment.center, + decoration: BoxDecoration( + color: CustomAppColors.kSecondaryColor, + borderRadius: BorderRadius.circular(2.r), + ), + child: const Text( + "View Shift", + style: TextStyle(color: CustomAppColors.kPrimaryColor), + ), + ), + ); + } +} diff --git a/lib/view/export_view.dart b/lib/view/export_view.dart new file mode 100644 index 0000000..fc94be5 --- /dev/null +++ b/lib/view/export_view.dart @@ -0,0 +1,2 @@ +export 'custom_widgets/export_custom_widgets.dart'; +export 'screens/export_screens.dart'; \ No newline at end of file diff --git a/lib/view/screens/auth_module/agency_sign_in.dart b/lib/view/screens/auth_module/agency_sign_in.dart new file mode 100644 index 0000000..89a85c5 --- /dev/null +++ b/lib/view/screens/auth_module/agency_sign_in.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; + +class AgencySignIn extends StatefulWidget { + const AgencySignIn({super.key}); + + @override + State createState() => _AgencySignInState(); +} + +class _AgencySignInState extends State { + final AgencySignInController _controller = Get.put(AgencySignInController()); + + + @override + Widget build(BuildContext context) { + return CustomScaffold( + screenKey: _controller.screenKey, + onScreenTap: _controller.removeFocus, + showAppBar: true, + titleText: "", + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 15.0.w), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CustomImageWidget( + imagePath: AssetsManager.kAppIcon, + imageColor: CustomAppColors.kIconColor, + height: 132.h, + width: 203.w, + ), + + CustomTextWidget( + text: ConstantText.kAgencyLogin, + fontColor: CustomAppColors.kIconColor, + fontWeight: FontWeight.w700, + fontSize: 24.sp, + ), + + CustomTextWidget( + text: ConstantText.kPleaseLoginToContinue, + fontColor: CustomAppColors.kIconColor, + fontWeight: FontWeight.w400, + fontSize: 14.sp, + ), + + Padding( + padding: EdgeInsets.only(top: 30.0.h), + child: CustomTextFieldWidget( + controller: _controller.emailPhoneController, + hintText: ConstantText.kInputEmailOrPhone, + heading: ConstantText.kEmailOrPhoneHeading, + onChange: (_){ + _controller.validateEmailPhone(); + }, + ), + ), + Obx((){ + return CustomErrorMsg( + message: _controller.emailPhoneErrorMsg.value, + ); + }), + + Padding( + padding: EdgeInsets.only(top: 25.0.h), + child: Obx((){ + return CustomAppButton( + isLoading: _controller.isLoading.value, + buttonText: ConstantText.kSendCode.toUpperCase(), + onTap: _controller.onSendCodeButton, + ); + }), + ), + ], + ), + ), + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/auth_module/export_auth_module.dart b/lib/view/screens/auth_module/export_auth_module.dart new file mode 100644 index 0000000..aced0a1 --- /dev/null +++ b/lib/view/screens/auth_module/export_auth_module.dart @@ -0,0 +1,4 @@ +export 'splash_screen.dart'; +export 'sign_in_screen.dart'; +export 'agency_sign_in.dart'; +export 'otp_screen.dart'; \ No newline at end of file diff --git a/lib/view/screens/auth_module/otp_screen.dart b/lib/view/screens/auth_module/otp_screen.dart new file mode 100644 index 0000000..bc60c14 --- /dev/null +++ b/lib/view/screens/auth_module/otp_screen.dart @@ -0,0 +1,124 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; +import 'package:pin_code_fields/pin_code_fields.dart'; + +class OTPScreen extends StatefulWidget { + const OTPScreen({super.key}); + + @override + State createState() => _OTPScreenState(); +} + +class _OTPScreenState extends State { + final OTPScreenController _controller = Get.put(OTPScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + screenKey: _controller.screenKey, + onScreenTap: _controller.removeFocus, + avoidBottomInsets: false, + showAppBar: true, + titleText: "", + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 15.0.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomImageWidget( + imagePath: AssetsManager.kLockIcon, + imageColor: CustomAppColors.kIconColor, + height: 84.h, + width: 75.w, + ), + + Padding( + padding: EdgeInsets.only(top: 30.0.h), + child: CustomTextWidget( + text: ConstantText.kTwoFactorAuth, + fontColor: CustomAppColors.kIconColor, + fontWeight: FontWeight.w700, + fontSize: 24.sp, + alignment: Alignment.centerLeft, + ), + ), + + CustomTextWidget( + text: ConstantText.kOTPScreenMsg, + fontColor: CustomAppColors.kIconColor, + fontWeight: FontWeight.w400, + fontSize: 14.sp, + alignment: Alignment.centerLeft, + textAlign: TextAlign.start, + ), + + Padding( + padding: EdgeInsets.only(top: 20.0.h), + child: PinCodeTextField( + keyboardType: TextInputType.number, + textInputAction: TextInputAction.done, + autoDisposeControllers: false, + controller: _controller.otpController, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + ], + onAutoFillDisposeAction: AutofillContextAction.cancel, + appContext: context, + length: 6, + onChanged: (otp) { + _controller.validateOTP(); + }, + cursorColor: CustomAppColors.kIconColor, + textStyle: TextStyle( + color: CustomAppColors.kIconColor.withOpacity(0.6), + ), + pinTheme: PinTheme( + shape: PinCodeFieldShape.box, + borderRadius: BorderRadius.circular(2.r), + fieldHeight: 56.0.h, + fieldWidth: 43.33.w, + borderWidth: 0.5.w, + fieldOuterPadding: EdgeInsets.symmetric(vertical: 10.0.h,), + activeFillColor: CustomAppColors.kIconColor.withOpacity(0.6), + activeColor: CustomAppColors.kIconColor.withOpacity(0.6), + errorBorderColor: CustomAppColors.kIconColor.withOpacity(0.6), + selectedColor: CustomAppColors.kIconColor.withOpacity(0.6), + inactiveColor: CustomAppColors.kIconColor.withOpacity(0.6), + selectedFillColor: CustomAppColors.kIconColor.withOpacity(0.6), + ), + ), + ), + Obx(() { + return CustomErrorMsg( + message: _controller.otpErrorMsg.value, + ); + }), + const Spacer(), + + Padding( + padding: EdgeInsets.only( + bottom: Platform.isIOS ? 30.0.h : 20.0.h, + ), + child: Obx((){ + return CustomAppButton( + isLoading: _controller.isLoading.value, + buttonText: ConstantText.kSubmit.toUpperCase(), + onTap: _controller.onSubmitButton, + ); + }), + ), + ], + ), + ), + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/auth_module/sign_in_screen.dart b/lib/view/screens/auth_module/sign_in_screen.dart new file mode 100644 index 0000000..e81e522 --- /dev/null +++ b/lib/view/screens/auth_module/sign_in_screen.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; + +class SignInScreen extends StatefulWidget { + const SignInScreen({super.key}); + + @override + State createState() => _SignInScreenState(); +} + +class _SignInScreenState extends State { + final SignInScreenController _controller = Get.put(SignInScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + screenKey: _controller.screenKey, + onScreenTap: _controller.removeFocus, + showAppBar: true, + titleText: "", + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 15.0.w), + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CustomImageWidget( + imagePath: AssetsManager.kAppIcon, + imageColor: CustomAppColors.kIconColor, + height: 132.h, + width: 203.w, + ), + + CustomTextWidget( + text: ConstantText.kWelcomeBack, + fontColor: CustomAppColors.kIconColor, + fontWeight: FontWeight.w700, + fontSize: 24.sp, + ), + + CustomTextWidget( + text: ConstantText.kPleaseLoginToContinue, + fontColor: CustomAppColors.kIconColor, + fontWeight: FontWeight.w400, + fontSize: 14.sp, + ), + + Padding( + padding: EdgeInsets.only(top: 30.0.h), + child: CustomTextFieldWidget( + controller: _controller.emailController, + hintText: ConstantText.kPleaseInputEmail, + heading: ConstantText.kEmailHeading, + onChange: (_){ + _controller.validateEmail(); + }, + ), + ), + Obx((){ + return CustomErrorMsg( + message: _controller.emailErrorMsg.value, + ); + }), + + Padding( + padding: EdgeInsets.only(top: 15.0.h), + child: CustomTextFieldWidget( + controller: _controller.passwordController, + hintText: "******", + heading: ConstantText.kPasswordHeading, + onChange: (_){ + _controller.validatePassword(); + }, + isObscure: true, + maxLines: 1, + ), + ), + Obx((){ + return CustomErrorMsg( + message: _controller.passwordErrorMsg.value, + ); + }), + Padding( + padding: EdgeInsets.only( + top: 15.0.h, + bottom: 25.h, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Obx((){ + // return CustomCheckBox( + // checkBoxValue: _controller.isRememberMe.value, + // titleText: ConstantText.kRememberMe, + // onTap: () { + // _controller.isRememberMe.toggle(); + // }, + // ); + // }), + + // const Spacer(), + GestureDetector( + onTap: _controller.onForgotButton, + child: CustomTextWidget( + text: ConstantText.kForgotPassword, + isExpanded: false, + fontSize: 12.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + + Padding( + padding: EdgeInsets.only(bottom: 8.0.h), + child: Obx((){ + return CustomAppButton( + isLoading: _controller.isLoading.value, + buttonText: ConstantText.kLogIn.toUpperCase(), + onTap: _controller.onLogInButton, + ); + }), + ), + ], + ), + ), + ), + // Padding( + // padding: EdgeInsets.only( + // bottom: Platform.isIOS ? 30.0.h : 20.0.h, + // ), + // child: CustomAppButton( + // buttonText: ConstantText.kAgencyLogin.toUpperCase(), + // buttonColor: CustomAppColors.kPrimaryColor, + // textColor: CustomAppColors.kSecondaryColor, + // onTap: _controller.onAgencyLogInButton, + // ), + // ), + ], + ), + ), + ); + } + + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/auth_module/splash_screen.dart b/lib/view/screens/auth_module/splash_screen.dart new file mode 100644 index 0000000..95f7693 --- /dev/null +++ b/lib/view/screens/auth_module/splash_screen.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/notification_util.dart'; +import 'package:get/get.dart'; + +class SplashScreen extends StatefulWidget { + const SplashScreen({super.key}); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + final _controller = Get.put(SplashScreenController()); + + @override + void initState() { + requestNotificationPermissions(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + screenKey: _controller.screenKey, + backgroundColor: CustomAppColors.kSecondaryColor, + body: const Center( + child: CustomImageWidget( + imagePath: AssetsManager.kAppIcon, + height: 200, + ), + ), + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/chat/arguments/chat_screen_args.dart b/lib/view/screens/chat/arguments/chat_screen_args.dart new file mode 100644 index 0000000..26e7883 --- /dev/null +++ b/lib/view/screens/chat/arguments/chat_screen_args.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/chat/ChatModel.dart'; +import 'group_data_args.dart'; + +class ChatScreenArgs { + final String name; + final String profilePicPath; + final String otherUserId; + final GroupDataArgs? groupData; + + final ValueChanged? onLastMessageUpdate; + + ChatScreenArgs({ + required this.name, + required this.profilePicPath, + required this.otherUserId, + this.groupData, + this.onLastMessageUpdate, + }); +} diff --git a/lib/view/screens/chat/arguments/group_data_args.dart b/lib/view/screens/chat/arguments/group_data_args.dart new file mode 100644 index 0000000..bfb3f65 --- /dev/null +++ b/lib/view/screens/chat/arguments/group_data_args.dart @@ -0,0 +1,13 @@ +import 'package:ftc_mobile_app/models/chat/combined_last_messages_model_class.dart'; + +class GroupDataArgs { + final String groupId; + final List groupMembersIds; + final GroupWorkingScheduleTime scheduleTime; + + GroupDataArgs({ + required this.groupId, + required this.groupMembersIds, + required this.scheduleTime, + }); +} diff --git a/lib/view/screens/chat/chat_screen.dart b/lib/view/screens/chat/chat_screen.dart new file mode 100644 index 0000000..83aa845 --- /dev/null +++ b/lib/view/screens/chat/chat_screen.dart @@ -0,0 +1,190 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/chat/ChatModel.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:get/get.dart'; +import 'package:grouped_list/grouped_list.dart'; +import 'package:intl/intl.dart'; +import 'arguments/chat_screen_args.dart'; +import 'widgets/chat_screen_footer_widget.dart'; +import 'widgets/message_bubble.dart'; + +class ChatScreen extends StatefulWidget { + final ChatScreenArgs args; + + const ChatScreen({Key? key, required this.args}) : super(key: key); + + @override + State createState() => _ChatScreenState(); +} + +class _ChatScreenState extends State { + late final ChatScreenController controller; + final sepFormatter = DateFormat("dd MMM yyyy"); + + @override + void initState() { + controller = Get.put(ChatScreenController(widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: Colors.white, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: _appBar, + body: SafeArea( + child: Column( + children: [ + Expanded(child: messagesList()), + Obx(() { + return controller.isSocketConnected() + ? ChatScreenFooterWidget( + controller: controller, + enabled: controller.isSocketConnected(), + ) + : FrequentFunctions.noWidget; + }) + ], + ), + ), + ); + } + + AppBar get _appBar { + return AppBar( + toolbarHeight: 56.r, + leading: IconButton( + icon: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + onPressed: () { + Navigator.pop(context); + }, + ), + centerTitle: false, + titleSpacing: 0, + leadingWidth: 50.r, + surfaceTintColor: Colors.white, + title: Row( + mainAxisSize: MainAxisSize.min, + children: [ + MyCircleImage( + imageSize: 32.r, + url: "${WebUrls.baseUrl}${widget.args.profilePicPath}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + imageColor: CustomAppColors.kDarkBlueTextColor, + height: 32.r, + width: 32.r, + ), + ), + 10.horizontalSpace, + CustomTextWidget( + text: widget.args.name, + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ); + } + + Widget messagesList() { + return Obx(() { + final messages = controller.messages; + return (messages.isEmpty) + ? FrequentFunctions.noWidget + : _messagesList(messages()); + }); + } + + Widget _messagesList(List list) { + final now = DateTime.now(); + + return GroupedListView( + reverse: true, + elements: list, + padding: REdgeInsets.symmetric(horizontal: 18), + order: GroupedListOrder.DESC, + groupBy: (message) { + final messageDate = + DateTime.fromMillisecondsSinceEpoch(message.date ?? 0); + return DateFormatter.dateFormatter.format(messageDate); + }, + groupSeparatorBuilder: (String date) { + final isToday = (date == DateFormatter.dateFormatter.format(now)); + return _buildGroupSeparatorWidget(isToday + ? "Today" + : sepFormatter.format(DateFormatter.dateFormatter.parse(date))); + }, + itemBuilder: (_, e) => _buildItemWidget(list.indexOf(e), e), + sort: false, + separator: 8.verticalSpace, + ); + } + + Widget _buildGroupSeparatorWidget(String susTag) { + return Padding( + padding: REdgeInsets.symmetric(vertical: 12.0), + child: Row( + children: [ + Expanded( + child: Divider( + height: 1, + color: Colors.grey.withOpacity(0.3), + )), + Text( + susTag, + style: TextStyle(fontSize: 14.sp, fontWeight: FontWeight.w500), + ).addPaddingHorizontal(10), + Expanded( + child: Divider( + height: 1, + color: Colors.grey.withOpacity(0.3), + )), + ], + ), + ); + } + + Widget _buildItemWidget(int index, ChatModel message) { + final isMyMessage = (message.from?.id == controller.myId); + final hasFile = message.filePath.isNotNullOrEmpty(); + print("filePath: ${message.filePath}"); + + return MessageBubble( + senderName: message.from?.name ?? "", + profilePic: !isMyMessage ? (message.from?.profilePictureUrl ?? "") : "", + content: hasFile ? (message.filePath ?? '') : (message.message ?? ''), + type: isMyMessage ? MessageType.sent : MessageType.received, + contentType: hasFile + ? (message.fileType == ChatModel.fileTypeLocalPath) + ? MessageContentType.file + : MessageContentType.url + : MessageContentType.text, + sentMessageColor: CustomAppColors.kSmokeColor, + receivedMessageColor: CustomAppColors.kSecondaryColor, + messageTime: (message.date == null) + ? "" + : DateTime.fromMillisecondsSinceEpoch(message.date!) + .toIso8601String(), + state: MessageState.stateNone, + status: MessageSeenStatus.seen, + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/chat/controller/chat_screen_controller.dart b/lib/view/screens/chat/controller/chat_screen_controller.dart new file mode 100644 index 0000000..86d5589 --- /dev/null +++ b/lib/view/screens/chat/controller/chat_screen_controller.dart @@ -0,0 +1,503 @@ +import 'dart:developer'; +import 'dart:io'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:ftc_mobile_app/controllers/home/inbox_screen_controller.dart'; +import 'package:ftc_mobile_app/models/chat/all_group_messages_model.dart'; +import 'package:ftc_mobile_app/models/chat/single_chat.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/utilities/frequent_functions.dart'; +import 'package:ftc_mobile_app/utilities/image_picker_popup.dart'; +import 'package:ftc_mobile_app/utilities/local_storage_manager/export_local_storage.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/home/custom_message_dialog.dart'; +import 'package:ftc_mobile_app/view/screens/chat/arguments/chat_screen_args.dart'; +import 'package:ftc_mobile_app/web_services/chat_services.dart'; +import 'package:ftc_mobile_app/web_services/web_url.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:socket_io_client/socket_io_client.dart'; +import '../../../../models/chat/ChatModel.dart'; + +class ChatScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final messageTEC = TextEditingController(); + final messageFN = FocusNode(); + + final messages = RxList(); + final isSocketConnected = false.obs; + + late final ChatScreenArgs args; + + String myId = ""; + + ChatScreenController(ChatScreenArgs data) { + args = data; + } + + late Socket _socketIO; + String listenId = ""; + + @override + void onInit() { + //Getting my ID + // String userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // UserModel userModel = UserModel.fromJson(json.decode(userJson)); + myId = LocalStorageManager.userId; + + if (_canChat) { + initializeSocket(); + } + + super.onInit(); + } + + @override + void onReady() { + if (isGroup) { + fetchGroupMessagesFromService(args.groupData!.groupId); + } else { + fetchSingleMessagesFromService(); + } + + if (_canChat.not) { + showCantMessageDialog(); + } + super.onReady(); + } + + bool get isGroup => args.groupData != null; + + /// This method checks the current date if it lies within schedule time or not. + /// If it does, it means chat is enabled else chat will be disabled. + /// If schedule times not available, it returns true; + bool get _canChat { + final startMills = args.groupData?.scheduleTime.startTime ?? 0; + final endMills = args.groupData?.scheduleTime.endTime ?? 0; + + if (startMills > 0 && endMills > 0) { + // Schedule times are available + + final scheduleTime = _getScheduleTime(startMills, endMills); + final currentTime = TimeOfDay.now(); + + // Current time within start, end schedule time + return (currentTime.isAfter(scheduleTime.start) && + currentTime.isBefore(scheduleTime.end)); + } else { + // Schedule times not available + return true; + } + } + + //Make sure to pass correct millis values + ({TimeOfDay start, TimeOfDay end}) _getScheduleTime( + int startMills, int endMills) { + final sd = DateTime.fromMillisecondsSinceEpoch(startMills); + final ed = DateTime.fromMillisecondsSinceEpoch(endMills); + + final startTime = TimeOfDay(hour: sd.hour, minute: sd.minute); + final endTime = TimeOfDay(hour: ed.hour, minute: ed.minute); + + return (start: startTime, end: endTime); + } + + initializeSocket() { + debugPrint('Socket address: ${WebUrls.socketUrl}'); + + _socketIO = io( + WebUrls.socketUrl, + OptionBuilder() + .setTransports(['websocket']) // for Flutter or Dart VM + .enableForceNewConnection() + .enableAutoConnect() + .setExtraHeaders({'foo': 'bar'}) // optional + .build()); + + isSocketConnected.value = true; + _socketIO.onConnect((_) { + isSocketConnected.value = true; + debugPrint('Socket Connected'); + }); + _socketIO.onDisconnect((_) { + debugPrint('Socket Disconnected'); + // isSocketConnected.value = false; + }); + _socketIO.onConnectError((e) { + debugPrint('Socket Connection Error: ${e.toString()}'); + // isSocketConnected.value = false; + }); + _socketIO.onConnectTimeout((e) { + debugPrint('Socket timeout Error: ${e.toString()}'); + // isSocketConnected.value = false; + }); + + //listenIdReceive + listenId = (isGroup) ? args.groupData!.groupId : (myId + args.otherUserId); + debugPrint('listen on: $listenId'); + _socketIO.on(listenId, (data) { + debugPrint('listen on listenId: $data'); + _handleIncomingMessages(data); + }); + } + + _handleIncomingMessages(Map chatJson) { + log("chat listen: $chatJson"); + // _total += 1; + // _skip += 1; + final chatModel = ChatModel.fromJson(chatJson); + + if (chatJson.containsKey('createdAt')) { + chatModel.date = + DateTime.tryParse(chatJson["createdAt"])?.millisecondsSinceEpoch ?? 0; + } else { + chatModel.date = DateTime.now().millisecondsSinceEpoch; + } + + if (isGroup) { + if (chatJson.containsKey('userId') && chatJson["userId"] is Map) { + chatModel.from = UserData.fromJson(chatJson["userId"]); + } + _onFirstMessageSent(); + } else { + chatModel.from = UserData( + id: args.otherUserId, + name: args.name, + profilePictureUrl: args.profilePicPath); + chatModel.to = UserData(id: chatJson['to']); + } + messages.insert(0, chatModel); + args.onLastMessageUpdate?.call(chatModel); + } + + Future fetchSingleMessagesFromService() async { + // _skip = 0; + final response = await ChatService() + .allSingleUsersChatMessagesServerAdmin( + from: myId, + to: args.otherUserId, + ) + .showLoader(); + + if (response is List) { + if (response.isNotEmpty) { + //Note: Converting this response to List of ChatModel objects + // List chats = []; + // await Future.forEach(response.reversed, (e) { + // chats.add(ChatModel( + // id: e.id, + // from: e.from, + // to: e.to, + // message: e.message, + // date: + // DateTime.tryParse(e.createdAt)?.millisecondsSinceEpoch ?? 0)); + // }); + messages.value = response.reversed.toList(); + } + } else if (response is String) { + FrequentFunctions.showToast(message: response); + } + } + + void fetchGroupMessagesFromService(String idOfGroup) async { + dynamic response = await ChatService().allGroupMessages( + sortOrder: -1, + offset: 0, + limit: 100000, + groupId: idOfGroup, + isDeleted: false).showLoader(); + + if (response is List) { + if (response.isNotEmpty) { + //Note: Converting this response to List of ChatModel objects + List chats = []; + await Future.forEach(response, (e) { + chats.add(ChatModel( + id: e.id, + from: e.userId, + message: e.message, + messageType: e.messageType, + filePath: e.filePath, + date: + DateTime.tryParse(e.createdAt)?.millisecondsSinceEpoch ?? 0)); + }); + messages.value = chats; + } + } else if (response is String) { + FrequentFunctions.showToast(message: response); + } + } + + void sendMessageButtonPressed() async { + if (messageTEC.text.trim().isEmpty) { + return; + } + + _sendMessage( + message: messageTEC.text.trim(), + ); + messageTEC.clear(); + } + + //if sending first message, then updating chat list screen by calling it's listing api + _onFirstMessageSent() { + if (messages.length == 1) { + try { + final iController = Get.find(); + iController.onFirstMessageSend.value = true; + print("Got controller"); + } catch (e) { + debugPrint(e.toString()); + } + } + } + + _sendMessage({ + String? message, + File? file, + }) { + if (isGroup) { + _sendGroupMessage( + message: message, + file: file, + ); + } else { + _sendPrivateMessage( + message: message, + file: file, + ); + } + } + + ///Note: no need to update ui for sent message here because + ///it's gonna handled by socket event + _sendGroupMessage({ + String? message, + File? file, + }) async { + await ChatService().addGroupMessageService( + message: message ?? "", + messageType: (file != null) ? MessageType.file : MessageType.message, + file: file, + userId: myId, + groupId: args.groupData!.groupId, + ); + } + + ///Note: handling messages list update also here + _sendPrivateMessage({ + String? message, + File? file, + }) async { + final id = DateTime.now().millisecondsSinceEpoch; + + final model = ChatModel( + id: id.toString(), + from: UserData(id: LocalStorageManager.userId), + to: UserData( + id: args.otherUserId, + name: args.name, + profilePictureUrl: args.profilePicPath, + ), + message: message, + messageType: + (file != null) ? MessageType.file.name : MessageType.message.name, + fileType: (file != null) ? ChatModel.fileTypeLocalPath : null, + date: id, + state: ChatModel.stateLoading, + ); + + messages.insert(0, model); + args.onLastMessageUpdate?.call(model); + + dynamic response = await ChatService().addSingleMessage( + message: message ?? "", + messageType: (file != null) ? MessageType.file : MessageType.message, + file: file, + senderId: LocalStorageManager.userId, + receiverId: args.otherUserId, + ); + + final msg = messages.firstWhereOrNull((e) { + return e.id == id.toString(); + }); + + if (msg != null) { + final index = messages.indexOf(msg); + + if (response is SingleChatModelClass) { + //message sent successfully + msg.id = response.id; + msg.fileType = null; + msg.state = ChatModel.stateSuccess; + + messages + ..removeAt(index) + ..insert(index, msg); + + _onFirstMessageSent(); + } else { + msg.state = ChatModel.stateError; + messages.removeAt(index); + } + } + } + + pickAndSendFile() async { + Get.focusScope?.unfocus(); + Get.bottomSheet(CupertinoActionSheet( + actions: [ + ListTile( + onTap: () { + Get.back(); + ImagePickerPopup.getImageFromSource( + fromCamera: true, + onFetchImage: (f) { + _sendMessage(file: f); + }); + }, + leading: const Icon(CupertinoIcons.camera), + title: const Text("Camera"), + trailing: Icon( + Icons.arrow_forward_ios_rounded, + size: 18.r, + ), + ), + ListTile( + onTap: () async { + Get.back(); + FilePickerResult? result = + await FilePicker.platform.pickFiles(type: FileType.media); + + if (result != null && result.files.single.path != null) { + if (result.files.single.path!.isImageFileName) { + _sendMessage(file: File(result.files.single.path!)); + } else { + FrequentFunctions.showToast(message: "File doesn't supported "); + } + } + }, + leading: const Icon(CupertinoIcons.photo_on_rectangle), + title: const Text("Gallery"), + trailing: Icon( + Icons.arrow_forward_ios_rounded, + size: 18.r, + ), + ), + ListTile( + onTap: () async { + Get.back(); + final FilePickerResult? result = await FilePicker.platform + .pickFiles( + type: FileType.custom, + allowedExtensions: ["pdf", "doc", "docx", "xlsx", "xls"]); + + if (result != null) { + _sendMessage(file: File(result.files.single.path!)); + } + }, + leading: const Icon(Icons.attach_file), + title: const Text("File"), + trailing: Icon( + Icons.arrow_forward_ios_rounded, + size: 18.r, + ), + ), + ], + )); + } + + // _sendImage(File file) async { + // debugPrint("file: ${file.path}"); + // // + // // ChatModel model = ChatModel( + // // sentBy: UserData(id: myId), + // // sentTo: otherUser, + // // date: DateTime.now().toUtc().millisecondsSinceEpoch, + // // files: [file.path], + // // fileType: fileTypeLocalPath, + // // state: ChatModel.stateLoading); + // // + // // final modelHash = model.hashCode.toString(); + // // model.localId = modelHash; + // // + // // debugPrint("message modelHash: $modelHash"); + // // _handleChat(model.toJson()); + // // + // // // return; + // // var res = await repository.sendChatAttachmentApi( + // // req: ChatMessageRequest( + // // sentBy: myId, + // // sentTo: otherUser.id!, + // // files: [file], + // // fileType: "image"), + // // ); + // // + // // final i = messages.indexWhere((e) => e.localId == modelHash); + // // + // // if (res.success == true) { + // // if (i != -1) { + // // messages[i].state = ChatModel.stateSuccess; + // // messages.refresh(); + // // } + // // } else { + // // if (i != -1) { + // // messages[i].state = ChatModel.stateError; + // // messages.refresh(); + // // } + // // } + // } + + //Always call this method if _canChat is false + void showCantMessageDialog() { + final startMills = args.groupData!.scheduleTime.startTime; + final endMills = args.groupData!.scheduleTime.endTime; + + final scheduleTime = _getScheduleTime(startMills, endMills); + final sd = DateTime( + 2024, 1, 1, scheduleTime.start.hour, scheduleTime.start.minute, 0); + final ed = + DateTime(2024, 1, 1, scheduleTime.end.hour, scheduleTime.end.minute, 0); + + showDialog( + context: screenKey.currentState!.context, + builder: (BuildContext context) { + return CustomMessageDialog( + dialogButtonText: "Close", + dialogMessageText: + "It is currently outside the working hours. You can only send message during the working hours", + dialogMessageTextBold: + "Working hours: ${DateFormat("hh:mm aa").format(sd)} - ${DateFormat("hh:mm aa").format(ed)}", + headingText: "You Can't message right now", + ); + }, + ); + } + + // new + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + try { + _socketIO.clearListeners(); + _socketIO.disconnect(); + _socketIO.destroy(); + _socketIO.dispose(); + } catch (e) { + print(e); + } + messageTEC.dispose(); + messageFN.dispose(); + // scrollController.dispose(); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/chat/widgets/chat_screen_footer_widget.dart b/lib/view/screens/chat/widgets/chat_screen_footer_widget.dart new file mode 100644 index 0000000..8ff3f9e --- /dev/null +++ b/lib/view/screens/chat/widgets/chat_screen_footer_widget.dart @@ -0,0 +1,89 @@ +import 'package:flutter_svg/svg.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +class ChatScreenFooterWidget extends StatelessWidget { + const ChatScreenFooterWidget({ + super.key, + required this.controller, + required this.enabled, + }); + + final ChatScreenController controller; + final bool enabled; + + @override + Widget build(BuildContext context) { + return Padding( + padding: REdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Align( + alignment: Alignment.bottomCenter, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + IconButton( + onPressed: controller.pickAndSendFile, + icon: SvgPicture.asset( + AssetsManager.svgIcAdd, + width: 32.r, + height: 32.r, + ), + ), + Expanded( + child: TextField( + minLines: 1, + maxLines: 5, + textAlign: TextAlign.left, + controller: controller.messageTEC, + keyboardType: TextInputType.multiline, + focusNode: controller.messageFN, + enabled: enabled, + decoration: InputDecoration( + hintText: 'Type Message...', + // border: InputBorder.none, + enabledBorder: OutlineInputBorder( + borderRadius: 4.toRadius(), + borderSide: BorderSide( + width: 1, + color: Colors.grey.withOpacity(0.3), + ), + ), + focusedBorder: OutlineInputBorder( + borderRadius: 4.toRadius(), + borderSide: BorderSide( + width: 1, + color: Get.theme.primaryColor, + ), + ), + contentPadding: EdgeInsets.symmetric(horizontal: 10.w), + ), + ), + ), + 5.horizontalSpace, + SizedBox( + width: 80.w, + height: 40.r, + child: IgnorePointer( + ignoring: enabled.not, + child: CustomAppButton( + buttonText: "Send", + buttonColor: + enabled ? Get.theme.primaryColor : Colors.grey, + borderColor: + enabled ? Get.theme.primaryColor : Colors.grey, + onTap: controller.sendMessageButtonPressed, + ), + )), + ], + ), + 8.verticalSpace, + ], + ), + )); + } +} diff --git a/lib/view/screens/chat/widgets/message_bubble.dart b/lib/view/screens/chat/widgets/message_bubble.dart new file mode 100644 index 0000000..20f36cd --- /dev/null +++ b/lib/view/screens/chat/widgets/message_bubble.dart @@ -0,0 +1,420 @@ +import 'dart:io'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../../custom_widgets/my_circle_image.dart'; +import 'package:path/path.dart' as path; + +enum MessageType { sent, received } + +enum MessageSeenStatus { delivered, seen } + +enum MessageContentType { text, file, url } + +enum MessageState { + stateNone(0), + stateError(-1), + stateSending(1), + stateSuccess(2); + + final int intValue; + + static MessageState stateFromIntValue(int value) { + switch (value) { + case -1: + return MessageState.stateError; + case 1: + return MessageState.stateSending; + case 2: + return MessageState.stateSuccess; + default: + return MessageState.stateNone; + } + } + + const MessageState(this.intValue); +} + +class MessageBubble extends StatelessWidget { + final String senderName; + final String content; + final MessageState state; + final MessageContentType contentType; + final String profilePic; + final MessageType type; + final MessageSeenStatus status; + final String messageTime; + final Color? sentMessageColor; + final Color? receivedMessageColor; + final Color? sentMessageTextColor; + final Color? receivedMessageTextColor; + final bool showReportButton; + + const MessageBubble({ + Key? key, + required this.senderName, + required this.content, + required this.contentType, + required this.state, + required this.profilePic, + required this.type, + required this.status, + required this.messageTime, + this.sentMessageColor, + this.receivedMessageColor, + this.sentMessageTextColor, + this.receivedMessageTextColor, + this.showReportButton = true, + }) : super(key: key); + + Color get _backgroundColor => (type == MessageType.sent) + ? (sentMessageColor ?? Get.theme.primaryColor) + : (receivedMessageColor ?? const Color(0xffC1C1C5)); + + Color get messageColor => (type == MessageType.sent) + ? (sentMessageTextColor ?? Colors.black) + : (receivedMessageTextColor ?? Colors.white); + + // double get _paddingLeft => (type == MessageType.sent) ? 0.15.sw : 0; + + final radius = 16.0; + + @override + Widget build(BuildContext context) { + final loader = Visibility( + visible: (state == MessageState.stateSending), + child: Align( + alignment: Alignment.topCenter, + child: SizedBox.square( + dimension: 18, + child: CircularProgressIndicator( + color: Get.theme.primaryColor, + strokeWidth: 2, + )), + ), + ); + + final messageBox = SizedBox( + width: 0.7.sw, + child: Padding( + padding: REdgeInsets.symmetric(vertical: 5), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (type == MessageType.received) + ? MyCircleImage( + imageSize: 20.r, + url: WebUrls.baseUrl + profilePic, + errorWidget: const DecoratedBox( + decoration: BoxDecoration(color: Color(0xffC1C1C5)), + child: Center( + child: Icon( + Icons.image_not_supported_outlined, + color: Colors.black, + size: 12, + ), + ), + ), + ).paddingOnly(right: 8.r) + : FrequentFunctions.noWidget, + Expanded( + child: (contentType == MessageContentType.text) + ? _textMessage() + : (content.isImageFileName) + ? _imageWidget() + : _documentFileWidget(), + ), + ], + ), + 4.verticalSpace, + Row( + children: [ + (type == MessageType.received) + ? SizedBox(width: 28.r) + : FrequentFunctions.noWidget, + (state == MessageState.stateSending) + ? loader + : (state == MessageState.stateError) + ? Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.warning_amber_rounded, + color: Colors.red, + size: 14.r, + ), + 4.horizontalSpace, + Text( + 'Message not sent', + style: const TextStyle().copyWith( + color: Colors.red, + ), + ) + ], + ) + : FrequentFunctions.noWidget + ], + ) + ], + ), + ), + ); + + return SizedBox( + width: double.maxFinite, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: (type == MessageType.sent) + ? MainAxisAlignment.end + : MainAxisAlignment.start, + children: [messageBox], + ), + ); + } + + Widget _textMessage() => Container( + padding: REdgeInsets.symmetric(horizontal: 14, vertical: 12), + decoration: + BoxDecoration(color: _backgroundColor, borderRadius: 10.toRadius()), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + (type == MessageType.received) + ? CustomTextWidget( + text: senderName, + fontColor: messageColor, + textAlign: TextAlign.left, + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ).paddingOnly(bottom: 10.r) + : FrequentFunctions.noWidget, + CustomTextWidget( + text: content, + fontColor: messageColor, + textAlign: TextAlign.left, + fontSize: 12.sp, + fontWeight: FontWeight.w400, + ), + 4.verticalSpace, + Align( + alignment: Alignment.centerRight, + child: _messageTimeWidget(), + ) + ], + ), + ); + + Widget _imageWidget() { + return InkWell( + onTap: _openPreviewDialog, + child: Container( + width: 200.r, + height: 250.r, + clipBehavior: Clip.antiAlias, + padding: REdgeInsets.all(4), + decoration: BoxDecoration( + color: _backgroundColor, + borderRadius: radius.toRadius()), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + //Sender Name + (type == MessageType.received) + ? CustomTextWidget( + text: senderName, + fontColor: messageColor, + textAlign: TextAlign.left, + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ).paddingOnly(bottom: 10.r) + : FrequentFunctions.noWidget, + + //image + Expanded( + child: ClipRRect( + clipBehavior: Clip.antiAlias, + borderRadius: (radius - 4).toRadius(), + child: (contentType == MessageContentType.file) + ? Image.file(File(content), fit: BoxFit.cover) + : CachedNetworkImage( + imageUrl: (WebUrls.baseUrl + content), + fit: BoxFit.cover, + ), + ), + ), + + 8.verticalSpace, + + //Time + Align( + alignment: Alignment.centerRight, + child: _messageTimeWidget(), + ).addPaddingHorizontal(12), + 8.verticalSpace, + ], + ), + ), + ); + } + + Widget _documentFileWidget() { + return Container( + decoration: BoxDecoration( + color: _backgroundColor, + borderRadius: radius.toRadius(), + ), + clipBehavior: Clip.antiAlias, + padding: REdgeInsets.all(4), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + //Sender Name + (type == MessageType.received) + ? CustomTextWidget( + text: senderName, + fontColor: messageColor, + textAlign: TextAlign.left, + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ).paddingOnly(bottom: 10.r) + : FrequentFunctions.noWidget, + + //File + InkWell( + onTap: () { + if (contentType == MessageContentType.url) { + _launchUrl(WebUrls.baseUrl + content); + } else { + _launchUrl(content); + } + }, + child: Card( + elevation: 0, + surfaceTintColor: Colors.white, + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 12, vertical: 12), + child: Row( + children: [ + CircleAvatar( + radius: 24.r, + backgroundColor: + CustomAppColors.kSecondaryColor.withOpacity(0.1), + child: const Icon( + Icons.file_copy_outlined, + color: CustomAppColors.kSecondaryColor, + ), + ), + 12.horizontalSpace, + Expanded( + child: CustomTextWidget( + text: path.basename(content), + fontColor: messageColor, + textAlign: TextAlign.left, + fontSize: 12.sp, + fontWeight: FontWeight.w400, + ), + ) + ], + ), + ), + ), + ), + 4.verticalSpace, + + //Time + Align( + alignment: Alignment.centerRight, + child: _messageTimeWidget(), + ).addPaddingHorizontal(12), + ], + ), + ); + } + + Widget _messageTimeWidget() { + return (messageTime.isNotEmpty) + ? Text( + DateFormat("hh:mm aa") + .format(DateTime.parse(messageTime).toLocal()), + style: TextStyle( + color: (type == MessageType.sent) ? Colors.grey : Colors.white, + fontSize: 10.sp, + fontWeight: FontWeight.w400, + ), + ) + : FrequentFunctions.noWidget; + } + + void _openPreviewDialog() { + final img = (contentType == MessageContentType.file) + ? FileImage(File(content)) + : CachedNetworkImageProvider(WebUrls.baseUrl + content); + Get.dialog( + Material( + type: MaterialType.transparency, + child: SizedBox( + width: double.maxFinite, + height: double.maxFinite, + child: Stack( + fit: StackFit.expand, + children: [ + Positioned.fill( + child: PhotoViewGestureDetectorScope( + axis: Axis.vertical, + child: PhotoView( + tightMode: true, + backgroundDecoration: const BoxDecoration( + color: Colors.transparent, + ), + minScale: PhotoViewComputedScale.contained, + maxScale: PhotoViewComputedScale.covered * 1.1, + initialScale: PhotoViewComputedScale.contained, + imageProvider: img as ImageProvider, + heroAttributes: + const PhotoViewHeroAttributes(tag: "someTag"), + ), + ), + ), + Positioned( + right: 12, + top: 12, + child: InkWell( + onTap: Get.back, + child: Card( + color: Colors.white, + shape: 24.toRoundedRectRadius(), + elevation: 4, + child: RSizedBox.square( + dimension: 40, + child: Icon( + Icons.close, + color: Colors.black, + size: 24.r, + ), + ), + ), + ), + ) + ], + ), + ), + ), + ); + } + + Future _launchUrl(String url) async { + try { + await launchUrl(Uri.parse(url)); + } catch (e) { + debugPrint(e.toString()); + } + } +} diff --git a/lib/view/screens/clients/addEditMemoryBox/add_edit_memory_box_screen.dart b/lib/view/screens/clients/addEditMemoryBox/add_edit_memory_box_screen.dart new file mode 100644 index 0000000..4d73cb9 --- /dev/null +++ b/lib/view/screens/clients/addEditMemoryBox/add_edit_memory_box_screen.dart @@ -0,0 +1,203 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/memoryListResponse/MemoryListData.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_network_image.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'controller/add_edit_memory_box_screen_controller.dart'; +import 'widget/VideoPlayerWidget.dart'; + +class AddEditMemoryBoxScreenArgs { + final UserData userData; + final MemoryListData? data; + final bool viewOnly; + + AddEditMemoryBoxScreenArgs({ + required this.userData, + this.data, + this.viewOnly = false, + }); +} + +//This screen is used to view, add and edit memory box +class AddEditMemoryBoxScreen extends StatefulWidget { + final AddEditMemoryBoxScreenArgs args; + + const AddEditMemoryBoxScreen({super.key, required this.args}); + + @override + State createState() => _AddEditMemoryBoxScreenState(); +} + +class _AddEditMemoryBoxScreenState extends State { + final controller = Get.put(AddEditMemoryBoxScreenController()); + + @override + void initState() { + controller.serviceUserId = widget.args.userData.id!; + + if (forUpdate) { + controller.filePath.value = + '${WebUrls.baseUrl}${widget.args.data!.filePath ?? ""}'; + controller.noteDetailsController.text = widget.args.data!.note ?? ""; + } + super.initState(); + } + + bool get forUpdate => widget.args.data != null; + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: + "${widget.args.viewOnly ? "View" : forUpdate ? "Update" : "Add"} Memory Box", + ), + body: SafeArea( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20.r), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: (widget.args.viewOnly) + ? _viewOnlyWidgets + : [ + 12.verticalSpace, + Obx(() { + final path = controller.filePath(); + return mediaViewer(path: path); + }), + CustomTextWidget( + text: "Upload File", + textAlign: TextAlign.left, + fontSize: 16.sp, + fontColor: Colors.black, + fontWeight: FontWeight.w600, + ), + // CustomTextWidget( + // text: "Please upload a file that is 1MB or smaller.", + // textAlign: TextAlign.left, + // fontSize: 12.sp, + // fontColor: Colors.grey, + // ), + 12.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 1, + child: SizedBox( + height: 32.r, + child: CustomAppButton( + buttonColor: Get.theme.primaryColor, + buttonText: "Choose File", + onTap: controller.onFileChooseButtonTap, + ), + ).paddingOnly(right: 8.r), + ), + Expanded( + flex: 2, + child: Obx(() { + return controller.filePath.isNotEmpty + ? Obx( + () => CustomTextWidget( + text: controller.filePath.value + .split("/") + .last, + isExpanded: false, + textAlign: TextAlign.left, + ), + ) + : FrequentFunctions.noWidget; + }), + ), + ], + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + controller: controller.noteDetailsController, + heading: "Note Details", + hintText: "Type here...", + minLines: 6, + maxLines: 6, + onChange: (_) {}, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: forUpdate ? "Update" : "Save", + onTap: () { + forUpdate + ? controller + .updateButtonPress(widget.args.data!.id!) + : controller.saveButtonPress(); + }, + ), + 5.verticalSpace, + ], + ), + ), + ), + ), + ); + } + + List get _viewOnlyWidgets { + return [ + 12.verticalSpace, + mediaViewer( + path: '${WebUrls.baseUrl}${widget.args.data?.filePath ?? ""}'), + 20.verticalSpace, + Column( + children: [ + CustomTextWidget( + text: "Note Details", + textAlign: TextAlign.left, + fontSize: 16.sp, + fontWeight: FontWeight.w600, + fontColor: Colors.black, + ), + CustomTextWidget( + text: widget.args.data?.note ?? "", + textAlign: TextAlign.left, + fontSize: 14.sp, + fontColor: Colors.black, + ), + ], + ) + ]; + } + + Widget mediaViewer({required String path}) { + if (path.isVideoFileName) { + return VideoPlayerWidget( + path: path, + type: path.startsWith("http") + ? VideoSourceType.network + : VideoSourceType.file, + ); + } else if (path.isImageFileName) { + if (path.startsWith("http")) { + return MyNetworkImage(url: path); + } else { + return Image.file(File(path)); + } + } else { + return FrequentFunctions.noWidget; + } + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/addEditMemoryBox/controller/add_edit_memory_box_screen_controller.dart b/lib/view/screens/clients/addEditMemoryBox/controller/add_edit_memory_box_screen_controller.dart new file mode 100644 index 0000000..14d3270 --- /dev/null +++ b/lib/view/screens/clients/addEditMemoryBox/controller/add_edit_memory_box_screen_controller.dart @@ -0,0 +1,98 @@ +import 'dart:io'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/utilities/frequent_functions.dart'; +import 'package:ftc_mobile_app/web_services/client_services.dart'; +import 'package:get/get.dart'; + +class AddEditMemoryBoxScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + TextEditingController documentTitleController = TextEditingController(); + TextEditingController noteDetailsController = TextEditingController(); + + late final String serviceUserId; + + final file = Rx(null); + + //Should stores full path of file or url + final filePath = "".obs; + + onFileChooseButtonTap() async { + FilePickerResult? result = + await FilePicker.platform.pickFiles(type: FileType.media); + + if (result != null && result.files.single.path != null) { + if (result.files.single.path!.isVideoFileName || + result.files.single.path!.isImageFileName) { + file.value = File(result.files.single.path!); + filePath.value = result.files.single.path!; + } else { + FrequentFunctions.showToast(message: "Unsupported File"); + } + } + } + + Future saveButtonPress() async { + if (file() == null) { + FrequentFunctions.showToast(message: "Please select file first"); + return; + } + if (noteDetailsController.text.trim().isEmpty) { + FrequentFunctions.showToast(message: "Note details field is required"); + return; + } + + var response = await ClientService() + .addMemoryBoxFile( + userId: serviceUserId, + filePath: file.value!.path, + noteDetails: noteDetailsController.text, + ) + .showLoader(); + + if (response == true) { + backButtonPressed(argument: true); + } else { + FrequentFunctions.showToast(message: response); + } + } + + Future updateButtonPress(String id) async { + if (noteDetailsController.text.trim().isEmpty) { + FrequentFunctions.showToast(message: "Note details field is required"); + return; + } + + var response = await ClientService() + .updateMemoryBoxFile( + id: id, + userId: serviceUserId, + filePath: file.value?.path ?? "", + noteDetails: noteDetailsController.text, + ) + .showLoader(); + + if (response == true) { + backButtonPressed(argument: true); + } else { + FrequentFunctions.showToast(message: response); + } + } + + void backButtonPressed({dynamic argument}) { + Navigator.of(screenKey.currentContext!).pop(argument); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + noteDetailsController.dispose(); + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/addEditMemoryBox/widget/VideoPlayerWidget.dart b/lib/view/screens/clients/addEditMemoryBox/widget/VideoPlayerWidget.dart new file mode 100644 index 0000000..232691f --- /dev/null +++ b/lib/view/screens/clients/addEditMemoryBox/widget/VideoPlayerWidget.dart @@ -0,0 +1,93 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:video_player/video_player.dart'; + +enum VideoSourceType { file, network } + +class VideoPlayerWidget extends StatefulWidget { + final String path; + final VideoSourceType type; + + const VideoPlayerWidget({ + super.key, + required this.path, + required this.type, + }); + + @override + State createState() => _VideoPlayerWidgetState(); +} + +class _VideoPlayerWidgetState extends State { + VideoPlayerController? _videoPlayerController; + final RxBool isInitialized = false.obs; + final RxBool isError = false.obs; + final RxBool isPlaying = false.obs; + double aspectRatio = 16.0 / 9.0; + + @override + void initState() { + print("Video path: ${widget.path}"); + if (widget.type == VideoSourceType.network) { + print("VideoSourceType.network"); + _videoPlayerController = + VideoPlayerController.networkUrl(Uri.parse(widget.path)); + } else { + print("VideoSourceType.file"); + _videoPlayerController = VideoPlayerController.file(File(widget.path)); + } + + _videoPlayerController?.initialize().then((_) { + isInitialized.value = true; + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AspectRatio( + aspectRatio: aspectRatio, + child: Obx(() { + return (isError()) + ? FrequentFunctions.centerText(text: "Something went wrong") + : isInitialized.isFalse + ? FrequentFunctions.centerText(text: "Loading video...") + : Stack( + children: [ + Positioned.fill( + child: VideoPlayer(_videoPlayerController!), + ), + Center( + child: Obx(() { + return (isPlaying()) + ? FrequentFunctions.noWidget + : InkWell( + onTap: () { + if (isPlaying.isFalse) { + isPlaying.value = true; + _videoPlayerController?.play(); + } + }, + child: Icon( + Icons.play_circle, + color: Get.theme.primaryColor, + size: 56.r, + ), + ); + }), + ) + ], + ); + }), + ); + } + + @override + void dispose() { + _videoPlayerController?.dispose(); + _videoPlayerController = null; + super.dispose(); + } +} diff --git a/lib/view/screens/clients/addEditRiskAssessment/add_edit_risk_assessment_screen.dart b/lib/view/screens/clients/addEditRiskAssessment/add_edit_risk_assessment_screen.dart new file mode 100644 index 0000000..9b63b21 --- /dev/null +++ b/lib/view/screens/clients/addEditRiskAssessment/add_edit_risk_assessment_screen.dart @@ -0,0 +1,358 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/RiskAssessmentData.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'controller/add_edit_risk_assessment_screen_controller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class AddEditRiskAssessmentScreenArgs { + final UserData userData; + + //If [issueData] is not null, then this screen will update its content instead + final RiskAssessmentData? riskAssessmentData; + + AddEditRiskAssessmentScreenArgs({ + required this.userData, + this.riskAssessmentData, + }); +} + +class AddEditRiskAssessmentScreen extends StatefulWidget { + final AddEditRiskAssessmentScreenArgs args; + + const AddEditRiskAssessmentScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _AddDetailsToNewBodyPointScreenState(); +} + +class _AddDetailsToNewBodyPointScreenState + extends State { + final AddEditRiskAssessmentScreenController controller = + Get.put(AddEditRiskAssessmentScreenController()); + + @override + void initState() { + //Note: Important + controller.serviceUserId = widget.args.userData.id!; + + if (widget.args.riskAssessmentData != null) { + controller.isEditing.value = true; + + controller.hazardTEC.text = widget.args.riskAssessmentData!.hazard ?? ""; + controller.personsExposedToHazardTEC.text = + widget.args.riskAssessmentData!.personsExposedToHazard ?? ""; + controller.riskIdentifiedTEC.text = + widget.args.riskAssessmentData!.riskIdentified ?? ""; + controller.controlMeasuresRequiredTEC.text = + widget.args.riskAssessmentData!.coldMeasureRequired ?? ""; + + //Pure Risk Rating + controller.pureRiskRatingCTEC.text = + widget.args.riskAssessmentData!.pureRiskRating?.c?.toString() ?? ""; + controller.pureRiskRatingLTEC.text = + widget.args.riskAssessmentData!.pureRiskRating?.l?.toString() ?? ""; + controller.pureRiskRatingRTEC.text = + widget.args.riskAssessmentData!.pureRiskRating?.r?.toString() ?? ""; + + //In Place Rating + controller.inPlaceYTEC.text = + widget.args.riskAssessmentData!.inPlace?.y?.toString() ?? ""; + controller.inPlaceNTEC.text = + widget.args.riskAssessmentData!.inPlace?.n?.toString() ?? ""; + + //Residual Risk Rating + controller.residualRiskRatingCTEC.text = + widget.args.riskAssessmentData!.residualRiskRating?.c?.toString() ?? + ""; + controller.residualRiskRatingLTEC.text = + widget.args.riskAssessmentData!.residualRiskRating?.l?.toString() ?? + ""; + controller.residualRiskRatingRTEC.text = + widget.args.riskAssessmentData!.residualRiskRating?.r?.toString() ?? + ""; + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Obx(() { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly(context, + titleText: controller.isEditing() + ? "Update Risk Assessment" + : "Add New Risk Assessment"), + body: SafeArea( + child: ListView( + padding: EdgeInsets.symmetric(horizontal: 16.r), + children: [ + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.hazardTEC, + textCapitalization: TextCapitalization.sentences, + heading: "Hazard", + hintText: "", + ), + 20.verticalSpace, + headingText("Pure Risk Rating"), + 8.verticalSpace, + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("C"), + 4.verticalSpace, + dropdown( + textEditingController: + controller.pureRiskRatingCTEC), + ], + ), + ), + 8.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("L"), + 4.verticalSpace, + dropdown( + textEditingController: + controller.pureRiskRatingLTEC), + ], + ), + ), + 8.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("R"), + 4.verticalSpace, + dropdown( + textEditingController: + controller.pureRiskRatingRTEC), + ], + ), + ), + ], + ), + 20.verticalSpace, + headingText("In Place"), + 8.verticalSpace, + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("Y"), + 4.verticalSpace, + dropdown(textEditingController: controller.inPlaceYTEC), + ], + ), + ), + 8.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("N"), + 4.verticalSpace, + dropdown(textEditingController: controller.inPlaceNTEC), + ], + ), + ), + ], + ), + 20.verticalSpace, + headingText("Residual Risk Rating"), + 8.verticalSpace, + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("C"), + 4.verticalSpace, + dropdown( + textEditingController: + controller.residualRiskRatingCTEC), + ], + ), + ), + 8.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("L"), + 4.verticalSpace, + dropdown( + textEditingController: + controller.residualRiskRatingLTEC), + ], + ), + ), + 8.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text("R"), + 4.verticalSpace, + dropdown( + textEditingController: + controller.residualRiskRatingRTEC), + ], + ), + ), + ], + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.personsExposedToHazardTEC, + inputType: TextInputType.multiline, + textCapitalization: TextCapitalization.sentences, + heading: "Personal (s) Exposed to hazard", + hintText: "", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.riskIdentifiedTEC, + inputType: TextInputType.multiline, + textCapitalization: TextCapitalization.sentences, + heading: "Risk Identified", + hintText: "", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.controlMeasuresRequiredTEC, + inputType: TextInputType.multiline, + textCapitalization: TextCapitalization.sentences, + heading: "Control Measures Required", + hintText: "", + onChange: (_) {}, + ), + 20.verticalSpace, + Obx( + () => CustomAppButton( + buttonText: controller.isEditing() ? "Update" : "Save", + onTap: () => controller.submitButtonPressed(context), + ), + ), + ], + ), + ), + ); + }); + } + + Widget headingText(String text) => CustomTextWidget( + text: text, + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w600, + textAlign: TextAlign.left, + ); + + Widget dropdown({ + required TextEditingController textEditingController, + }) { + return SizedBox( + height: 48.r, + child: DropdownButtonFormField( + value: textEditingController.text, + isDense: true, + onTap: () { + FocusScopeNode().unfocus(); + }, + dropdownColor: Colors.white, + decoration: InputDecoration( + contentPadding: REdgeInsets.symmetric(horizontal: 12), + border: OutlineInputBorder( + borderSide: BorderSide( + color: CustomAppColors.kLightGreyColor.withOpacity(0.2)), + borderRadius: 8.toRadius(), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: CustomAppColors.kLightGreyColor), + borderRadius: 8.toRadius(), + ), + ), + hint: Text( + "Select...", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.sp, + color: CustomAppColors.kLightTextColor, + ), + ), + items: controller.ratings + .map( + (e) => DropdownMenuItem( + value: e.toString(), + child: Text(e.toString()), + ), + ) + .toList(), + isExpanded: true, + iconSize: 20.h, + icon: Padding( + padding: REdgeInsets.only(right: 4.0), + child: const Icon(Icons.arrow_drop_down_sharp, color: Colors.grey), + ), + onChanged: (v) { + textEditingController.text = v ?? "1"; + }, + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/addEditRiskAssessment/controller/add_edit_risk_assessment_screen_controller.dart b/lib/view/screens/clients/addEditRiskAssessment/controller/add_edit_risk_assessment_screen_controller.dart new file mode 100644 index 0000000..7303169 --- /dev/null +++ b/lib/view/screens/clients/addEditRiskAssessment/controller/add_edit_risk_assessment_screen_controller.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/InPlace.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/PureRiskRating.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/ResidualRiskRating.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/RiskAssessmentData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; + +class AddEditRiskAssessmentScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final ratings = List.generate(9, (i) => i + 1); + + final hazardTEC = TextEditingController(); + final personsExposedToHazardTEC = TextEditingController(); + final riskIdentifiedTEC = TextEditingController(); + final controlMeasuresRequiredTEC = TextEditingController(); + + final pureRiskRatingCTEC = TextEditingController(text: "1"); + final pureRiskRatingLTEC = TextEditingController(text: "1"); + final pureRiskRatingRTEC = TextEditingController(text: "1"); + + final residualRiskRatingCTEC = TextEditingController(text: "1"); + final residualRiskRatingLTEC = TextEditingController(text: "1"); + final residualRiskRatingRTEC = TextEditingController(text: "1"); + + final inPlaceYTEC = TextEditingController(text: "1"); + final inPlaceNTEC = TextEditingController(text: "1"); + + ///[isEditing] will be true if using [AddDetailsToNewBodyPointScreen] screen to edit issue details, + /// or say issueData is not null + final isEditing = false.obs; + + String serviceUserId = ""; + RiskAssessmentData? issueData; + + @override + void onReady() { + if (issueData != null) { + isEditing.value = true; + hazardTEC.text = issueData!.hazard ?? ""; + personsExposedToHazardTEC.text = issueData!.personsExposedToHazard ?? ""; + } + super.onReady(); + } + + Future submitButtonPressed(BuildContext context) async { + if (hazardTEC.text.trim().isEmpty) { + FrequentFunctions.showToast(message: "Hazard is required"); + return; + } + if (personsExposedToHazardTEC.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Personal (s) Exposed to hazard is required"); + return; + } + if (riskIdentifiedTEC.text.trim().isEmpty) { + FrequentFunctions.showToast(message: "Risk Identified is required"); + return; + } + if (controlMeasuresRequiredTEC.text.trim().isEmpty) { + FrequentFunctions.showToast( + message: "Control Measures Required is required"); + return; + } + + // var result = (isEditing.isFalse) + final result = await ClientService() + .createRiskAssesments( + data: RiskAssessmentData( + userId: serviceUserId, + hazard: hazardTEC.text.trim(), + personsExposedToHazard: personsExposedToHazardTEC.text.trim(), + riskIdentified: riskIdentifiedTEC.text.trim(), + coldMeasureRequired: controlMeasuresRequiredTEC.text.trim(), + pureRiskRating: PureRiskRating( + c: int.parse(pureRiskRatingCTEC.text.trim()), + l: int.parse(pureRiskRatingLTEC.text.trim()), + r: int.parse(pureRiskRatingRTEC.text.trim()), + ), + residualRiskRating: ResidualRiskRating( + c: int.parse(residualRiskRatingCTEC.text.trim()), + l: int.parse(residualRiskRatingLTEC.text.trim()), + r: int.parse(residualRiskRatingRTEC.text.trim()), + ), + inPlace: InPlace( + y: int.parse(inPlaceYTEC.text.trim()), + n: int.parse(inPlaceNTEC.text.trim()), + ), + ), + ) + .showLoader(); + if (result == true) { + Navigator.of(screenKey.currentContext!).pop(true); + } else { + FrequentFunctions.showToast(message: result); + } + // : await ClientService() + // .updateHealthIssueData( + // issueId: issueData!.id, + // categoryId: issueData!.bodyPointsCategory!.id, + // healthNote: healthNoteController.text.trim(), + // complaint: complaintController.text.trim()) + // .showLoader(); + // + // if (result is! String) { + // Navigator.of(context).pop(true); + // } else { + // if (result.isNotEmpty) { + // FrequentFunctions.showToast(message: result); + // } + // } + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + hazardTEC.dispose(); + personsExposedToHazardTEC.dispose(); + riskIdentifiedTEC.dispose(); + controlMeasuresRequiredTEC.dispose(); + + pureRiskRatingCTEC.dispose(); + pureRiskRatingLTEC.dispose(); + pureRiskRatingRTEC.dispose(); + + residualRiskRatingCTEC.dispose(); + residualRiskRatingLTEC.dispose(); + residualRiskRatingRTEC.dispose(); + + inPlaceYTEC.dispose(); + inPlaceNTEC.dispose(); + + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/add_details_to_new_body_point_screen.dart b/lib/view/screens/clients/add_details_to_new_body_point_screen.dart new file mode 100644 index 0000000..77359c8 --- /dev/null +++ b/lib/view/screens/clients/add_details_to_new_body_point_screen.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/HealthIssuesDetailsModel.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:get/get.dart'; +import '../../../controllers/clients/add_details_to_new_body_point_screen_controller.dart'; +import '../../../ftc_mobile_app.dart'; +import '../../custom_widgets/clients/category_subcategory_dropdowns_widget.dart'; + +class AddDetailsToNewBodyPointScreenArgs { + final UserData userData; + + //If [issueData] is not null, then this screen will update its content instead + final HealthIssueDetailsModel? issueData; + + AddDetailsToNewBodyPointScreenArgs({ + required this.userData, + this.issueData, + }); +} + +class AddDetailsToNewBodyPointScreen extends StatefulWidget { + final AddDetailsToNewBodyPointScreenArgs args; + + const AddDetailsToNewBodyPointScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _AddDetailsToNewBodyPointScreenState(); +} + +class _AddDetailsToNewBodyPointScreenState + extends State { + final AddDetailsToNewBodyPointScreenController controller = + Get.put(AddDetailsToNewBodyPointScreenController()); + + @override + void initState() { + controller.serviceUserId = widget.args.userData.id!; + controller.issueData = widget.args.issueData; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Obx(() { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly(context, + titleText: controller.isEditing() + ? "Update Health Issue - ${widget.args.issueData!.bodyPointsCategory?.name}" + : "Add Health Issue"), + body: SafeArea( + child: ListView( + padding: EdgeInsets.symmetric(horizontal: 16.r), + children: [ + controller.isEditing() + ? FrequentFunctions.noWidget + : CategorySubcategoryDropdownsWidget( + controller: controller.catSubCatController), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.healthNoteController, + textCapitalization: TextCapitalization.sentences, + heading: "Health Note", + hintText: "Example: Eye Pain / Headache", + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.complaintController, + inputType: TextInputType.multiline, + textCapitalization: TextCapitalization.sentences, + heading: "Complaint", + hintText: "Example: Minor Pain on right Side", + onChange: (_) {}, + ), + 20.verticalSpace, + Obx( + () => CustomAppButton( + buttonText: + controller.isEditing() ? "Update Issue" : "Add Issue", + onTap: () => controller.submitButtonPressed(context), + ), + ), + ], + ), + ), + ); + }); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/add_new_document_screen.dart b/lib/view/screens/clients/add_new_document_screen.dart new file mode 100644 index 0000000..474dad3 --- /dev/null +++ b/lib/view/screens/clients/add_new_document_screen.dart @@ -0,0 +1,183 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../controllers/clients/add_new_document_screen_controller.dart'; +import '../../../ftc_mobile_app.dart'; + +class AddNewDocumentScreen extends StatefulWidget { + const AddNewDocumentScreen({Key? key}) : super(key: key); + + @override + State createState() => _AddNewDocumentScreenState(); +} + +class _AddNewDocumentScreenState extends State { + final controller = Get.put(AddNewDocumentScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + // onBackButton: () => controller.backButtonPressed(), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: controller.docIdReceived.value + ? " Update Document" + : controller.viewOnly.value + ? " View Document" + : " Add Document", + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + controller: controller.documentTitleController, + hintText: "Document title", + heading: "Title", + onChange: (_) {}, + ), + // ConsentScreenTextField( + // headingText: "Document title", + // hintText: "Title of Document", + // viewOnly: controller.viewOnly.value, + // fieldController: controller.documentTitleController), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + controller: controller.documentDetailsController, + heading: "Document Details", + hintText: "Details Of Document", + minLines: 6, + maxLines: 6, + onChange: (_) {}, + ), + // ConsentScreenTextField( + // headingText: "Document Details", + // hintText: "Details Of Document", + // viewOnly: controller.viewOnly.isTrue, + // fieldController: controller.documentDetailsController), + 20.verticalSpace, + + // Text( + // "Upload document", + // style: TextStyle( + // fontSize: 14.sp, + // fontWeight: FontWeight.w400, + // color: CustomAppColors.kDarkBlueTextColor, + // ), + // ), + // 6.verticalSpace, + + // Obx(() { + // + // }), + + // SizedBox( + // width: 150.r, + // height: 32.r, + // child: const CustomAppButton(buttonText: "Choose file"), + // ), + + controller.viewOnly.value + ? controller.docFilePath.isNotEmpty + ? Row( + children: [ + SizedBox( + width: MediaQuery.of(context).size.width / 3, + child: CustomTextWidget( + text: "Document:", + fontSize: 20.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + isExpanded: false, + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width / 2, + child: Obx( + () => CustomTextWidget( + text: controller.docFilePath.value + .split("/") + .last, + isExpanded: false, + ), + ), + ), + ], + ) + : Container( + width: MediaQuery.of(context).size.width / 2, + ) + : Obx( + () => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + controller.docFilePath.isNotEmpty + ? Expanded( + flex: 1, + child: SizedBox( + width: + MediaQuery.of(context).size.width / 2, + child: Obx( + () => CustomTextWidget( + text: controller.docFilePath.value + .split("/") + .last, + isExpanded: false, + ), + ), + ), + ) + : Container( + width: MediaQuery.of(context).size.width / 2, + ), + Expanded( + flex: 1, + child: CustomAppButton( + buttonColor: CustomAppColors.kIconColor, + borderColor: CustomAppColors.kIconColor, + buttonText: controller.docIdReceived.value + ? "Change Document File" + : "Add Document File", + onTap: controller.onFileChooseButtonTap, + ), + ), + ], + ), + ), + 32.verticalSpace, + Obx( + () => CustomAppButton( + buttonText: controller.docIdReceived.value + ? "Update Document" + : controller.viewOnly.value + ? "Ok" + : "Add Document", + onTap: () => controller.submitButtonPressed(), + ), + ), + 5.verticalSpace, + ], + ), + ), + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/add_new_recent_incident_screen.dart b/lib/view/screens/clients/add_new_recent_incident_screen.dart new file mode 100644 index 0000000..5ebaf19 --- /dev/null +++ b/lib/view/screens/clients/add_new_recent_incident_screen.dart @@ -0,0 +1,237 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/add_new_recent_incident_screen_controller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/recent_incidents_model.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:quill_html_editor/quill_html_editor.dart'; + +class AddNewRecentIncidentsScreenArgs { + final String? userId; + final RecentIncidentsModel? incidentsModel; + + AddNewRecentIncidentsScreenArgs({this.userId, this.incidentsModel}); +} + +class AddNewRecentIncidentsScreen extends StatefulWidget { + final AddNewRecentIncidentsScreenArgs args; + + const AddNewRecentIncidentsScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _AddNewRecentIncidentsScreenState(); +} + +class _AddNewRecentIncidentsScreenState + extends State { + late final AddNewRecentIncidentScreenController controller; + + @override + void initState() { + controller = Get.put(AddNewRecentIncidentScreenController(widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.onBackPress(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + controller.onBackPress(context); + // Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: widget.args.userId.isNotNullOrEmpty() + ? 'Add Recent Incident' + : 'Update Recent Incident', + // text: 'Add New Recent Incidents', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: SafeArea( + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 20.0), + child: Column( + children: [ + Column( + children: [ + // const CustomTextWidget( + // text: "Select Incident Date", + // textAlign: TextAlign.left, + // fontSize: 14, + // fontWeight: FontWeight.w500, + // ), + + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.incidentDateTEC, + hintText: "Select Incident Date", + heading: "Select Incident Date", + isEnabled: false, + onChange: (_) {}, + ), + ), + + // InkWell( + // onTap: () => controller.selectDateFromPicker( + // context: context, + // maxDate: DateTime(DateTime.now().year + 1), + // minDate: DateTime(DateTime.now().year - 4)), + // child: Row( + // children: [ + // Obx( + // () => CustomTextWidget( + // text: DateFormatter() + // .getHolidayDate(controller.selectedDate.value), + // isExpanded: false, + // fontWeight: FontWeight.w500, + // fontColor: CustomAppColors.kSecondaryColor, + // ), + // ), + // const Spacer(), + // const Icon(Icons.calendar_today_outlined), + // ], + // ), + // ), + ], + ), + // Container( + // padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 5.h), + // child: CustomTextFieldWidget( + // controller: controller.incidentTitleTEC, + // heading: "Incident Title"), + // ), + + 12.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.incidentTitleTEC, + textCapitalization: TextCapitalization.words, + hintText: "Incident Title", + heading: "Incident Title", + onChange: (_) {}, + ), + + 12.verticalSpace, + + ToolBar( + toolBarColor: Colors.cyan.shade50, + activeIconColor: Colors.green, + padding: const EdgeInsets.all(8), + iconSize: 20, + toolBarConfig: ToolBarStyle.values + .where((e) => [ + ToolBarStyle.image, + ToolBarStyle.video, + ].contains(e).not) + .toList(), + controller: controller.incidentDetailsQuillFieldController, + ), + + Expanded( + child: LayoutBuilder(builder: (_, c) { + return QuillHtmlEditor( + hintText: 'Recent Incident Details', + controller: controller.incidentDetailsQuillFieldController, + isEnabled: true, + minHeight: c.maxHeight, + text: widget.args.incidentsModel?.note ?? "", + hintTextAlign: TextAlign.start, + padding: REdgeInsets.only(left: 10, top: 5, right: 5), + hintTextPadding: + REdgeInsets.only(left: 10, top: 5, right: 5), + backgroundColor: Colors.grey.withOpacity(0.1), + onFocusChanged: (hasFocus) { + debugPrint('has focus $hasFocus'); + if (hasFocus && FocusScope.of(context).hasFocus) { + controller.removeFocus(); + } + }, + // onTextChanged: (text) => + // debugPrint('widget text change $text'), + // onEditorCreated: () => debugPrint('Editor has been loaded'), + // onEditingComplete: (s) => debugPrint('Editing completed $s'), + onEditorResized: (height) => + debugPrint('Editor resized $height'), + onSelectionChanged: (sel) => + debugPrint('${sel.index},${sel.length}'), + loadingBuilder: (context) { + return Center( + child: CircularProgressIndicator( + strokeWidth: 0.4.r, + ), + ); + }, + ); + }), + ), + 24.verticalSpace, + Obx(() { + return IgnorePointer( + ignoring: controller.isButtonEnabled.isFalse, + child: CustomAppButton( + buttonText: widget.args.incidentsModel == null + ? "Submit" + : "Update", + buttonColor: controller.isButtonEnabled() + ? CustomAppColors.kSecondaryColor + : CustomAppColors.kLightGreyColor, + borderColor: controller.isButtonEnabled() + ? CustomAppColors.kSecondaryColor + : CustomAppColors.kLightGreyColor, + onTap: () { + controller.submitButtonPressed(context); + }, + ), + ); + }), + ], + ), + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/all_care_notes_screen.dart b/lib/view/screens/clients/all_care_notes_screen.dart new file mode 100644 index 0000000..25cf8fe --- /dev/null +++ b/lib/view/screens/clients/all_care_notes_screen.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/all_care_notes_screen_contorller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/allCareNotes/CarePlans.dart'; +import 'package:ftc_mobile_app/utilities/enums/care_note_form_type.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; + +class AllCareNotesScreenArgs { + final String serviceUserId; + + AllCareNotesScreenArgs({required this.serviceUserId}); +} + +class AllCareNotesScreen extends StatefulWidget { + final AllCareNotesScreenArgs args; + + const AllCareNotesScreen({super.key, required this.args}); + + @override + State createState() => _AllCareNotesScreenState(); +} + +class _AllCareNotesScreenState extends State { + final AllCareNotesScreenController controller = + Get.put(AllCareNotesScreenController()); + + @override + void initState() { + super.initState(); + + //Important + controller.serviceUserId = widget.args.serviceUserId; + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + controller.getCareNotesList(); + }); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kSmokeColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'All Care Notes', + ), + body: SafeArea( + child: _listView(), + ), + ); + } + + Widget _listView() { + return Obx(() { + final list = controller.notesList(); + final canLoadMore = controller.canLoadMore.value; + return SmartRefresher( + controller: controller.listRC, + scrollController: controller.listSC, + header: FrequentFunctions.waterDropHeader, + enablePullUp: canLoadMore, + onRefresh: controller.onRefresh, + onLoading: controller.onLoading, + child: (list.isEmpty) + ? Container( + color: Colors.white, + child: const Center( + child: Text("No data found"), + ), + ) + : ListView.separated( + itemCount: list.length, + itemBuilder: (_, index) { + final item = list[index]; + return _listItem(item); + }, + separatorBuilder: (_, i) => 8.verticalSpace, + ), + ); + }); + } + + Widget _listItem(CarePlan item) { + final isMoodRatingForm = + item.noteType == CareNotesFormType.moodRatingForm.apiValue; + + return InkWell( + onTap: () { + _onListItemTap(item); + }, + child: Container( + decoration: const BoxDecoration(color: Colors.white), + padding: REdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomTextWidget( + text: item.noteType ?? "", + textAlign: TextAlign.left, + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + (item.eventDateTime == null) + ? FrequentFunctions.noWidget + : CustomTextWidget( + text: DateFormatter.ddMMyyyyhhmmFormat( + DateTime.fromMillisecondsSinceEpoch( + item.eventDateTime!) + .toLocal()), + fontColor: Colors.grey, + textAlign: TextAlign.left, + fontSize: 10.sp, + ), + (item.isHTML != true) + ? CustomTextWidget( + text: isMoodRatingForm + ? (item.title ?? "") + : (item.noteDetails ?? ""), + textAlign: TextAlign.left, + fontColor: Colors.black54, + fontSize: 12.sp, + maxLines: 3, + fontWeight: FontWeight.w400, + ).paddingOnly(top: 6.r) + : FrequentFunctions.noWidget, + (item.flag == true) + ? CustomTextWidget( + text: "Handover Review", + fontColor: Colors.green, + textAlign: TextAlign.left, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ).paddingOnly(top: 6.r) + : FrequentFunctions.noWidget, + ], + ), + ), + const Icon(Icons.keyboard_arrow_right_rounded) + ], + ), + ), + ); + } + + void _onListItemTap(CarePlan item) { + Navigator.pushNamed(context, CustomRouteNames.kCareNoteDetailScreenRoute, + arguments: item); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/appointments_screen.dart b/lib/view/screens/clients/appointments_screen.dart new file mode 100644 index 0000000..83e6819 --- /dev/null +++ b/lib/view/screens/clients/appointments_screen.dart @@ -0,0 +1,259 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/dialogs/app_dialogs.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:get/get.dart'; +import 'package:grouped_list/grouped_list.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import '../../../ftc_mobile_app.dart'; +import '../../../models/appointmentsListResponse/AppointmentsListResponse.dart'; +import '../../custom_widgets/my_circle_image.dart'; + +class AppointmentScreen extends StatefulWidget { + final UserData userData; + + const AppointmentScreen({Key? key, required this.userData}) : super(key: key); + + @override + State createState() => _AppointmentScreenState(); +} + +class _AppointmentScreenState extends State { + final controller = Get.put(AppointmentScreenController()); + + @override + void initState() { + controller.serviceUserId = widget.userData.id ?? ""; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Appointments', + ), + body: Column( + children: [ + 16.verticalSpace, + MyCircleImage( + imageSize: 80.r, + url: "${WebUrls.baseUrl}${widget.userData.profilePictureUrl}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 80.r, + width: 80.r, + ), + ), + 16.verticalSpace, + CustomTextWidget( + text: widget.userData.displayName, + fontSize: 14.sp, + fontWeight: FontWeight.w600), + 16.verticalSpace, + Expanded(child: _appointmentsList()), + ], + ), + ); + } + + Widget _appointmentsList() { + return ObxValue((RxList appointments) { + return SmartRefresher( + key: const ValueKey("refreshListAppointments"), + controller: controller.listRC, + scrollController: controller.listSC, + enablePullUp: false, + header: FrequentFunctions.waterDropHeader, + onRefresh: controller.onRefresh, + child: (appointments.isEmpty) + ? FrequentFunctions.centerText(text: "No appointments yet") + : GroupedListView( + elements: appointments(), + groupBy: (d) { + return DateTime.fromMillisecondsSinceEpoch(d.appointmentDate!) + .toLocal() + .isAfter(DateTime.now()) + ? 0 + : 1; + }, + groupSeparatorBuilder: (int groupByValue) { + final label = groupByValue == 0 + ? "Upcoming Appointments" + : "Previous Appointments"; + + return _buildGroupSeparatorWidget(label); + }, + itemBuilder: (context, element) => + _buildItemWidget(appointments.indexOf(element), element), + separator: 8.verticalSpace, + groupComparator: (item1, item2) { + return item1.compareTo(item2); + }, + ), + ); + }, controller.appointments); + } + + Widget _buildGroupSeparatorWidget(String susTag) { + return Container( + padding: EdgeInsets.only(left: 20.w), + child: CustomTextWidget( + alignment: Alignment.centerLeft, + isExpanded: false, + text: susTag, + fontSize: 16.sp, + fontWeight: FontWeight.w700), + ); + } + + Widget _buildItemWidget(int index, AppointmentsListResponseData data) { + return AppointmentWidget(data: data); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +class AppointmentWidget extends StatelessWidget { + final AppointmentsListResponseData data; + + const AppointmentWidget({ + super.key, + required this.data, + }); + + @override + Widget build(BuildContext context) { + return Container( + // height: 150, + alignment: Alignment.center, + margin: EdgeInsets.only(left: 20.w, bottom: 5.h, right: 10.w, top: 10.h), + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h), + width: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + color: Colors.white, + border: Border( + left: BorderSide(color: Get.theme.primaryColor, width: 6), + top: BorderSide(color: Get.theme.primaryColor, width: 1), + right: BorderSide(color: Get.theme.primaryColor, width: 1), + bottom: BorderSide(color: Get.theme.primaryColor, width: 1), + ), + borderRadius: BorderRadius.all( + Radius.circular(2.0.r), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomTextWidget( + text: data.staff?.name ?? "", + fontWeight: FontWeight.bold, + isExpanded: false), + CustomTextWidget( + text: data.appointmentStartTime ?? "", + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + isExpanded: false), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: CustomTextWidget( + text: data.appointmentDetails ?? "", + fontSize: 12.sp, + isExpanded: false, + maxLines: 2, + textAlign: TextAlign.left, + ), + ), + 10.horizontalSpace, + CustomTextWidget( + text: DateFormatter().getAppointmentTime( + DateTime.fromMillisecondsSinceEpoch(data.appointmentDate!)), + fontSize: 14.sp, + isExpanded: false, + fontWeight: FontWeight.w600, + ), + ], + ), + 10.verticalSpace, + SizedBox( + height: 32.r, + child: CustomAppButton( + onTap: () { + AppDialog.showAppointmentDetailDialog(data: data); + }, + buttonText: "View Appointment", + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + ), + ), + // SizedBox( + // height: 5.h, + // ), + // const ViewAppointmentButtonWidget( + // text: "+Add Note", + // textColor: CustomAppColors.kSecondaryColor, + // buttonColor: CustomAppColors.kPrimaryColor, + // borderColor: CustomAppColors.kSecondaryColor, + // ), + ], + ), + ); + } +} + +class ViewAppointmentButtonWidget extends StatelessWidget { + const ViewAppointmentButtonWidget({ + super.key, + required this.text, + required this.textColor, + required this.buttonColor, + this.borderColor, + }); + + final String text; + final Color textColor; + final Color buttonColor; + final Color? borderColor; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () {}, + child: Container( + width: MediaQuery.of(context).size.width, + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 5.h), + margin: EdgeInsets.symmetric(horizontal: 2.w), + decoration: BoxDecoration( + border: borderColor != null ? Border.all(color: borderColor!) : null, + color: buttonColor, + borderRadius: BorderRadius.circular(2.r), + ), + child: CustomTextWidget( + text: text, + fontColor: textColor, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/careNoteForms/ABC_form_screen.dart b/lib/view/screens/clients/careNoteForms/ABC_form_screen.dart new file mode 100644 index 0000000..ab9451f --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/ABC_form_screen.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import '../../../../controllers/clients/careNoteFormControllers/ABC_form_screen_controller.dart'; + +class ABCFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const ABCFormScreen({Key? key, required this.args}) : super(key: key); + + @override + State createState() => _ABCFormScreenState(); +} + +class _ABCFormScreenState extends State { + late final ABCFormScreenController controller; + + @override + void initState() { + controller = Get.put(ABCFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add ABC Note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () =>controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.antecedentEventsController, + textCapitalization: TextCapitalization.sentences, + heading: 'Antecedent Events', + hintText: 'Type here...', + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.behaviourController, + textCapitalization: TextCapitalization.sentences, + heading: 'Behaviour', + hintText: 'Type here...', + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.consequenceEventsController, + textCapitalization: TextCapitalization.sentences, + heading: 'Consequence Events', + hintText: 'Type here...', + onChange: (_) {}, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/consent_capacity_form_screen.dart b/lib/view/screens/clients/careNoteForms/consent_capacity_form_screen.dart new file mode 100644 index 0000000..679d346 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/consent_capacity_form_screen.dart @@ -0,0 +1,663 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/consent_capacity_form_screen_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class ConsentCapacityFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const ConsentCapacityFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _ConsentCapacityFormScreenState(); +} + +class _ConsentCapacityFormScreenState extends State { + late final ConsentCapacityFormScreenController controller; + + @override + void initState() { + controller = + Get.put(ConsentCapacityFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Consent, Capacity, MCA & DOLS note', + ), + body: SafeArea( + child: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.commentsController, + heading: "Comments", + hintText: "Type comments here...", + onChange: (_) {}, + ), + 20.verticalSpace, + Padding( + padding: REdgeInsets.only(left: 8.0), + child: CustomTextWidget( + text: "Is an MCA required to be completed?", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + ), + ), + 8.verticalSpace, + _radioGroup(controller.selectedMCARequiredOption), + 20.verticalSpace, + Obx(() { + return controller.selectedMCARequiredOption() == "Yes" + ? Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: _otherFormWidgets(), + ) + : const SizedBox.shrink(); + }), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ), + ); + } + + Widget _radioGroup(Rx selectedOption) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: RadioButton( + value: 'Yes', + selectedOption: selectedOption, + ), + ), + 16.horizontalSpace, + Flexible( + child: RadioButton( + value: 'No', + selectedOption: selectedOption, + ), + ), + ], + ); + } + + List _otherFormWidgets() { + return [ + Html(data: """
+
+

This Mental Capacity Assessment must adhere to the Act’s 5 principles: +

+
    +
  • Every adult has the right to make his or her own decisions and must be assumed to + have capacity to make them unless proved otherwise. +
  • +
  • A person must be given all practicable help before anyone treat them as not being + able to make their own decisions. +
  • +
  • Just because an individual makes what may be seen as an unwise decision, they should + not be treated as lacking capacity to make that decision +
  • +
  • Anything done or any decision made on behalf of a person who lacks capacity must be + done in their best interests. +
  • +
  • Anything done or any decision made on behalf of a person who lacks capacity should + be the least restrictive of their basic rights and freedoms. +
  • +
+
+

This form has been developed to support compliance with the Mental + Capacity Act 2005. There is a statutory requirement for anyone undertaking an assessment to + have regard to the Code of Practice for the Mental Capacity Act. References given below + refer to the relevant paragraphs of the Mental Capacity Act Code of Practice. Please also + refer to MCA and DoLS Policy and Guidance. (For day to day decisions, please print out/ fill + in relevant sections 1.1 - 1.10)

+
+
"""), + 10.verticalSpace, + _multilineTextField( + controller: controller.mentalCapacityAssessmentDetailController, + heading: "Detail", + hintText: "Type here...", + ), + Html( + data: """
+

1.2 What is the specific decision relevant to this mental + capacity assessment? Please ensure that the decision is phrased in a way to enable + all viable options to be discussed. The MCA Code paragraph 4.4 states 'An assessment of a + person’s capacity must be based on their ability to make a specific decision at the time it + needs to be made, and not their ability to make decisions in general.'

+
+
""", + ), + 10.verticalSpace, + _multilineTextField( + controller: controller.specificDecisionDetailController, + heading: "Detail", + hintText: "Type here...", + ), + Html( + data: + """

1.3 Person undertaking/or who has undertaken this assessment of + capacity? The person with greatest responsibility for the specific decision is known as + the ‘decision-maker’ and should assess capacity. The decision maker is the person intending to + make the decision or carry out the action. Complex decisions may require specialist assessment - + seek guidance. See 4.38 to 4.43 of the Code.

+ """, + ), + 10.verticalSpace, + _singleLineTextField( + controller: controller.name1Controller, + heading: "Name", + hintText: "Type here...", + inputType: TextInputType.name, + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.roleController, + heading: "Role", + hintText: "Type here...", + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.organisationController, + heading: "Organisation", + hintText: "Type here...", + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.addressController, + heading: "Address", + hintText: "Type here...", + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.telController, + heading: "Tel", + hintText: "Type here...", + inputType: TextInputType.phone, + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.emailController, + heading: "Email", + hintText: "Type here...", + inputType: TextInputType.emailAddress, + ), + 20.verticalSpace, + InkWell( + onTap: () => controller.selectAssessmentDateTime(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.assessmentDateTimeController, + hintText: "Select...", + heading: "Date and time of assessment", + isEnabled: false, + onChange: (_) {}, + ), + ), + Html( + data: + """

1.4 What concerns/triggers have given rise to this assessment of + capacity? People have the right to make decisions that others might think are unwise. A + person who makes a decision that others think is unwise should not automatically be labelled as + lacking the capacity to make a decision. See MCA Code 4.35.

+

What is the reason to believe this person may lack capacity to make this particular decision? State your evidence:

+ """, + ), + 10.verticalSpace, + _multilineTextField( + controller: + controller.lackCapacityToMakeParticularDecisionDetailController, + heading: "Detail", + hintText: "Type here...", + ), + Html( + data: + """

1.5 Record your evidence here of the actions you have taken to + support the person. Consider what kind of help and support you can give the person to + help them understand, retain, weigh up information and communicate their decision.

+

Have you discussed with the person and/or appropriate others the most suitable venue + for the assessment? For example: Does the person feel more comfortable in their own + room? Does it need to be quiet? See MCA Code 3.13.

+

Have you discussed with the person and/or appropriate others to establish timing of + assessment For example: Is there a time of day that is better for the person? Would + it help to have a particular person present? See MCA Code 3.14.

+

Does the person have any language/communication issues? For example: Do + they have hearing or speech difficulties? Do you need an interpreter? Do they communicate + using special equipment e.g. a light talker communication device? See MCA Code 3.11.

+

Have you provided all the information, regarding all viable and available options + that the person needs to consider, to make an informed decision? See MCA Code 3.7. + The assessor must ensure that the person has:

+
    +
  1. Sufficiently detailed alternative plans explained to them to allow them to weigh up the + alternatives and make an informed choice where possible. +
  2. +
  3. Been supported by the assessor to explore the reasonably foreseeable consequences of + deciding one way or another, or failing to make the decision. +
  4. +
+
""", + ), + 10.verticalSpace, + _multilineTextField( + controller: controller.recordYourEvidenceDescribeController, + heading: "Describe", + hintText: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + controller: controller.viableOptionsConsideredController, + heading: "Viable options considered", + hintText: "Type here...", + ), + Html( + data: + """

If the decision is not urgent can it be delayed because the person + is likely to regain or develop the capacity to make it for themselves?

+
""", + ), + 10.verticalSpace, + ...List.generate(controller.canDecisionBeDelayedOptions.length, (index) { + final e = controller.canDecisionBeDelayedOptions[index]; + return ObxValue((RxBool isChecked) { + return CheckboxListTile( + value: isChecked(), + onChanged: isChecked, + controlAffinity: ListTileControlAffinity.trailing, + shape: const RoundedRectangleBorder( + side: BorderSide(color: CustomAppColors.kSmokeColor)), + tileColor: + (index % 2 == 0) ? CustomAppColors.kSmokeColor : Colors.white, + title: CustomTextWidget( + text: e.requirements, + isExpanded: false, + fontSize: 13.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + textAlign: TextAlign.left, + ), + ); + }, e.isChecked); + }), + 20.verticalSpace, + _multilineTextField( + controller: controller.explainWhyTickedBoxController, + heading: "Explain why you have ticked box(s)", + hintText: "Type here...", + ), + Html( + data: + """

1.6 Two Stage Capacity Assessment Answer the question + with facts. The questions cannot be answered with a simple “yes” or “no” and you are asked to + describe the assessment process. See MCA Code Ch. 4.

+

Stage 1. Is there an impairment or disturbance in the functioning of the person’s + mind or brain The person may not have a diagnosis but the Code says that proof of + an impairment or disturbance of the functioning of the mind or brain is required. You should + record here your reasons for believing this to be the case. See 4.11 - 4.12 of the Code. + This could be because of, for example, a head injury, a suspected infection or stroke, a + diagnosed dementia, mental illness, or learning disability.

+
""", + ), + _radioGroup(controller.selectedImpairmentOption), + 20.verticalSpace, + _multilineTextField( + controller: controller.impairmentDescribeController, + heading: "Describe", + hintText: "Type here...", + ), + Html( + data: """
+

If the person does not meet Stage 1, the assessment should immediately stop. Stage 2. + Record here how the identified impairment or disturbance in Stage 1 is affecting the + person’s ability to make the decision.See 4.13 to 4.30 of the Code.

+

Can the person understand the information relevant to the decision? See + 4.16 to 4.19 of the Code.

+
""", + ), + _radioGroup(controller.selectedCanPersonDecisionInfoOption), + 20.verticalSpace, + _multilineTextField( + controller: controller.describeCanPersonDecisionInfoController, + heading: "Describe how you assessed this", + hintText: "Type here...", + ), + Html( + data: + """

Can they retain that information long enough to make the decision? See 4.20 to 4.22 of the Code.

""", + ), + _radioGroup(controller.selectedCanTheyRetainOption), + 20.verticalSpace, + _multilineTextField( + controller: controller.describeCanTheyRetainController, + heading: "Describe how you assessed this", + hintText: "Type here...", + ), + Html( + data: + """

Can they use or weigh up that information as part of the process of making the decision? See 4.21 to 4.22 of the Code.

""", + ), + _radioGroup(controller.selectedCanTheyUseOption), + 20.verticalSpace, + _multilineTextField( + controller: controller.describeCanTheyUseController, + heading: "Describe how you assessed this", + hintText: "Type here...", + ), + Html( + data: + """

Can they communicate their decision, by any means available to them? See 4.23 to 4.25 of the Code.

""", + ), + _radioGroup(controller.selectedCanTheyCommunicateOption), + 20.verticalSpace, + _multilineTextField( + controller: controller.describeCanTheyCommunicateController, + heading: "Describe how you assessed this", + hintText: "Type here...", + ), + Html( + data: """
+

NB. If all of the answers to the four questions above are YES, then Stage 2 is not + met + and the assessment must end.

+

Stage 3: Causative Nexus There is a causative link between the impairment or + disturbance in the functioning of mind and brain AND the inability to make the required + decision. You must be able to evidence that the reason the person is unable to make the + decision is because of the impairment or disturbance in the functioning of mind or brain and + for no other reason.

+
""", + ), + ...List.generate(controller.causativeNexusOptions.length, (index) { + final e = controller.causativeNexusOptions[index]; + return ObxValue((RxBool isChecked) { + return CheckboxListTile( + value: isChecked(), + onChanged: isChecked, + controlAffinity: ListTileControlAffinity.trailing, + shape: const RoundedRectangleBorder( + side: BorderSide(color: CustomAppColors.kSmokeColor)), + tileColor: + (index % 2 == 0) ? CustomAppColors.kSmokeColor : Colors.white, + title: CustomTextWidget( + text: e.requirements, + isExpanded: false, + fontSize: 13.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + textAlign: TextAlign.left, + ), + ); + }, e.isChecked); + }), + 20.verticalSpace, + _multilineTextField( + controller: controller.evidenceController, + heading: "Evidence", + hintText: "Type here...", + ), + Html( + data: + """

1.7 Lack of mental capacity as a result of an impairment/disturbance in mind/brain + must + be distinguished from a situation where a person is unable to make their own decision as a + result of duress or undue influence. A person who has the mental capacity to make decisions may + have their ability to give free and true consent impaired if they are under constraint, coercion + or undue influence. Duress and undue influence may be affected by eroded confidence due to fear + of reprisal or abandonment, sense of obligation, cultural factors, power relationships or + coercive control within domestic abuse. Do you have a concern that the person may be under + duress/coercion or undue influence in relation to the making of this decision? If so, this will + not satisfy the Stage 1 (Diagnostic) test. You have to have an impairment or disturbance of the + mind or brain to satisfy that test.

Do you have a concern that the person may be under duress, coercion or undue influence?

""", + ), + _radioGroup(controller.selectedDoYouHaveConcernOption), + 20.verticalSpace, + _multilineTextField( + controller: controller.whatIsYourEvidenceController, + heading: "If yes, what is your evidence for saying this?", + hintText: "Type here...", + ), + 10.verticalSpace, + Html( + data: + """

If yes, what actions you intend to take (including consideration of seeking management/legal advice)

"""), + _multilineTextField( + controller: controller.seekingManagementDescribeController, + heading: "Describe", + hintText: "Type here...", + ), + Html( + data: + """

1.8 Please record here any further information or content of your interview with the person.

"""), + _multilineTextField( + controller: controller.recordInterviewDescribeController, + heading: "Describe", + hintText: "Type here...", + ), + Html( + data: + """

1.9 Determination of Capacity

+

I have assessed this person’s capacity to make the specific decision and determined on the + balance of probability that they do not have the capacity to make this decision at this + time.

"""), + _singleLineTextField( + controller: controller.dontHaveDecisionNameController, + heading: "Name", + hintText: "Type here...", + inputType: TextInputType.name, + ), + 20.verticalSpace, + InkWell( + onTap: () => controller.selectDontHaveDecisionDateTime(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dontHaveDecisionDateController, + hintText: "Select...", + heading: "Date", + isEnabled: false, + onChange: (_) {}, + ), + ), + Html( + data: + """

I have assessed this person’s capacity to make the specific decision and + determined that on the balance of probability that they have the capacity to make this decision + at this time.

"""), + _singleLineTextField( + controller: controller.haveDecisionNameController, + heading: "Name", + hintText: "Type here...", + inputType: TextInputType.name, + ), + 20.verticalSpace, + InkWell( + onTap: () => controller.selectHaveDecisionDateTime(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.haveDecisionDateController, + hintText: "Select...", + heading: "Date", + isEnabled: false, + onChange: (_) {}, + ), + ), + Html( + data: + """

Is an IMCA Required?

+
    +
  • If the person (16+) is unbefriended and the decision is about a change of accommodation, + or serious medical treatment, you MUST involve an IMCA. +
  • +
  • If a friend or family member exists, but they may not act in the person’s best interests + (for example because they are the alleged victim or abuser in a Safeguarding Adults + investigation) you MAY involve an IMCA. +
  • +
  • If the person is unbefriended and a health or social care review is being carried out, + you MAY CONSIDER involving an IMCA as good practice. +
  • +
  • Although you may involve an IMCA under the Mental Capacity Act legislation, if there is + no appropriate person, for people over age 18, you MUST instruct a Care Act Advocate if + the person has substantial difficulty engaging with the relevant assessment & + support planning/review/safeguarding process. Please use the most appropriate + legislation to ensure entitlement to advocacy. +
  • +
+

Does the individual require an IMCA?

+
"""), + _radioGroup(controller.selectedDoesRequireIMCAOption), + 20.verticalSpace, + _multilineTextField( + controller: controller.requireIMCAController, + heading: "If not, please give reasons.", + hintText: "Type here...", + ), + 20.verticalSpace, + InkWell( + onTap: () => controller.selectDateTimeOfWhyIMCARequired(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.whyIMCARequiredDateController, + hintText: "Select...", + heading: "Date and time of assessment", + isEnabled: false, + onChange: (_) {}, + ), + ), + Html( + data: """

Assessors Details.

""", + ), + 10.verticalSpace, + _singleLineTextField( + controller: controller.assessorsName4Controller, + heading: "Name", + hintText: "Type here...", + inputType: TextInputType.name, + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.designationController, + heading: "Designation", + hintText: "Type here...", + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.baseAddressController, + heading: "Base / Address", + hintText: "Type here...", + ), + 20.verticalSpace, + _singleLineTextField( + controller: controller.contactDetailsController, + heading: "Contact Details", + hintText: "Type here...", + ), + ]; + } + + Widget _multilineTextField( + {required TextEditingController controller, + required String heading, + required String hintText}) { + return CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller, + heading: heading, + hintText: hintText, + onChange: (_) {}, + ); + } + + Widget _singleLineTextField( + {required TextEditingController controller, + required String heading, + required String hintText, + TextInputType inputType = TextInputType.text}) { + return CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller, + heading: heading, + hintText: hintText, + inputType: inputType, + onChange: (_) {}, + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/export_care_note_forms.dart b/lib/view/screens/clients/careNoteForms/export_care_note_forms.dart new file mode 100644 index 0000000..183a917 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/export_care_note_forms.dart @@ -0,0 +1,11 @@ +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/ABC_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/consent_capacity_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/free_text_entries_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/health_appointments_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/injury_health_issue_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/observations_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/physical_intervention_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/safeguarding_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/showering_bath_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/toileting_note_form_screen.dart'; +export 'package:ftc_mobile_app/view/screens/clients/careNoteForms/weight_height_form_screen.dart'; \ No newline at end of file diff --git a/lib/view/screens/clients/careNoteForms/free_text_entries_form_screen.dart b/lib/view/screens/clients/careNoteForms/free_text_entries_form_screen.dart new file mode 100644 index 0000000..9fd3bff --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/free_text_entries_form_screen.dart @@ -0,0 +1,139 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/free_text_entries_form_screen_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class FreeTextEntriesFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const FreeTextEntriesFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _FreeTextEntriesFormScreenState(); +} + +class _FreeTextEntriesFormScreenState extends State { + late final FreeTextEntriesFormScreenController controller; + + @override + void initState() { + controller = + Get.put(FreeTextEntriesFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () =>controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select date and time", + heading: "Event Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.titleController, + textCapitalization: TextCapitalization.words, + hintText: ConstantText.kTypeTitle, + heading: ConstantText.kTitle, + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.noteDetailsController, + textCapitalization: TextCapitalization.sentences, + heading: ConstantText.kNoteDetails, + hintText: ConstantText.kNoteDetailsHint, + onChange: (_) {}, + ), + 10.verticalSpace, + SizedBox( + height: 30.h, + child: GestureDetector( + onTap: controller.flagForHandover.toggle, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Obx( + () => Ink( + width: 32.r, + height: 32.r, + child: Checkbox( + value: controller.flagForHandover.value, + activeColor: CustomAppColors.kSecondaryColor, + onChanged: (value) { + controller.flagForHandover.value = value ?? false; + }, + ), + ), + ), + CustomTextWidget( + text: ConstantText.kFlagForHandover, + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w400, + ), + ], + ), + ), + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/health_appointments_form_screen.dart b/lib/view/screens/clients/careNoteForms/health_appointments_form_screen.dart new file mode 100644 index 0000000..8a4c408 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/health_appointments_form_screen.dart @@ -0,0 +1,175 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/health_appointments_form_screen_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class HealthAppointmentsFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const HealthAppointmentsFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _HealthAppointmentsFormScreenState(); +} + +class _HealthAppointmentsFormScreenState + extends State { + late final HealthAppointmentsFormScreenController controller; + + @override + void initState() { + controller = + Get.put(HealthAppointmentsFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Health Appointments note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + _appointmentWithDropdown, + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.reasonController, + heading: "Reason for appointment", + hintText: "Reason for appointment", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.commentsController, + heading: "Comments", + hintText: "Type comments here...", + onChange: (_) {}, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + Widget get _appointmentWithDropdown { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + border: Border.all( + color: CustomAppColors.kLightGreyColor, + width: 1.sp, + ), + ), + padding: EdgeInsets.symmetric( + vertical: 5.h, + horizontal: 15.w, + ), + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: "Appointment With", + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + alignment: Alignment.centerLeft, + ), + DropdownButtonHideUnderline( + child: DropdownButtonFormField( + onTap: () { + FocusScopeNode().unfocus(); + }, + dropdownColor: Colors.white, + decoration: const InputDecoration( + border: InputBorder.none, + ), + hint: Text( + "Appointment With", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.sp, + color: CustomAppColors.kLightTextColor, + ), + ), + items: controller.appointmentWith + .map( + (e) => DropdownMenuItem( + value: e, + child: Text(e), + ), + ) + .toList(), + isExpanded: true, + iconSize: 20.h, + icon: Padding( + padding: REdgeInsets.only(right: 4.0), + child: + const Icon(Icons.arrow_drop_down_sharp, color: Colors.grey), + ), + onChanged: (category) { + controller.selectedAppointmentWith = category; + }, + ), + ), + ], + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/injury_health_issue_form_screen.dart b/lib/view/screens/clients/careNoteForms/injury_health_issue_form_screen.dart new file mode 100644 index 0000000..9dc4b9e --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/injury_health_issue_form_screen.dart @@ -0,0 +1,263 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/injury_health_issue_form_screen_controller.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/clients/category_subcategory_dropdowns_widget.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class InjuryHealthIssueFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const InjuryHealthIssueFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _InjuryHealthIssueFormScreenState(); +} + +class _InjuryHealthIssueFormScreenState + extends State { + late final InjuryHealthIssueFormScreenController controller; + + @override + void initState() { + controller = + Get.put(InjuryHealthIssueFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Injury Health Issue note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () =>controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select date and time", + heading: "Date and time of accident", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.nameOfWitnesses, + heading: "Name of witnesses/adults present", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.placeOfAccident, + heading: "Place accident occured", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.accidentDescription, + heading: "Description how the accident occured", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.recordOfInjury, + heading: "Record of any injury and action taken", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.conditionOfPatient, + heading: "Condition of the patient following of the accident", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CategorySubcategoryDropdownsWidget( + controller: controller.catSubCatController, + ), + 20.verticalSpace, + Padding( + padding: REdgeInsets.only(left: 8.0), + child: CustomTextWidget( + text: "Parent Contacted", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + ), + ), + 8.verticalSpace, + radioGroup(), + Obx(() => controller.isParentContacted() == "Yes" + ? Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: widgetsIfParentContacted(), + ) + : const SizedBox.shrink()), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + List widgetsIfParentContacted() { + return [ + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.nameOfParentContacted, + heading: "Name of parent contacted", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + InkWell( + onTap: () => controller.selectParentContactTime(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.parentContactedTime, + hintText: "Contact time", + heading: "Contact time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + Padding( + padding: REdgeInsets.only(left: 8.0), + child: CustomTextWidget( + text: "How parent was contacted", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + ), + ), + 8.verticalSpace, + howParentContactedRadioGroup(), + ]; + } + + Widget radioGroup() { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: RadioButton( + value: 'Yes', + selectedOption: controller.isParentContacted, + ), + ), + 16.horizontalSpace, + Flexible( + child: RadioButton( + value: 'No', + selectedOption: controller.isParentContacted, + ), + ), + ], + ); + } + + Widget howParentContactedRadioGroup() { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: RadioButton( + value: 'Call', + selectedOption: controller.howParentContacted, + ), + ), + 16.horizontalSpace, + Flexible( + child: RadioButton( + value: 'Email', + selectedOption: controller.howParentContacted, + ), + ), + 16.horizontalSpace, + Flexible( + child: RadioButton( + value: 'Text', + selectedOption: controller.howParentContacted, + ), + ), + ], + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/mood_rating_form.dart b/lib/view/screens/clients/careNoteForms/mood_rating_form.dart new file mode 100644 index 0000000..a549259 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/mood_rating_form.dart @@ -0,0 +1,110 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import '../../../../controllers/clients/careNoteFormControllers/mood_rating_form_controller.dart'; + +class MoodRatingFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const MoodRatingFormScreen({super.key, required this.args}); + + @override + State createState() => _MoodRatingFormScreenState(); +} + +class _MoodRatingFormScreenState extends State { + late final MoodRatingFormController controller; + + @override + void initState() { + controller = Get.put(MoodRatingFormController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Mood Rating note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + children: [ + 16.verticalSpace, + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select date and time", + heading: "Event Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + //...Other widgets + ListView.separated( + shrinkWrap: true, + itemCount: controller.ratings.length, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (_, index) { + return Obx(() { + return CheckboxListTile( + value: controller.selectedRating() == + controller.ratings[index], + contentPadding: const EdgeInsets.symmetric(horizontal: 0), + secondary: Image.asset( + controller.ratings[index].icon, + width: 40.r, + height: 40.r, + ), + title: CustomTextWidget( + text: controller.ratings[index].name, + textAlign: TextAlign.left, + fontSize: 16.sp, + fontWeight: FontWeight.w600, + ), + controlAffinity: ListTileControlAffinity.trailing, + onChanged: (bool? value) { + if (value == true) { + controller.selectedRating.value = + controller.ratings[index]; + } + }, + ); + }); + }, + separatorBuilder: (_, index) => 10.verticalSpace, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/nutrition_hydration_form_screen.dart b/lib/view/screens/clients/careNoteForms/nutrition_hydration_form_screen.dart new file mode 100644 index 0000000..0710dec --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/nutrition_hydration_form_screen.dart @@ -0,0 +1,153 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/nutrition_hydration_form_screen_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class NutritionHydrationFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const NutritionHydrationFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _NutritionHydrationFormScreenState(); +} + +class _NutritionHydrationFormScreenState + extends State { + late final NutritionHydrationFormScreenController controller; + + @override + void initState() { + controller = + Get.put(NutritionHydrationFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Nutrition Hydration Note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select date and time", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + _radioGroup(controller.typeOptions, controller.selectedType), + 20.verticalSpace, + Obx(() { + return CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.mealDrinkTypeController, + textCapitalization: TextCapitalization.words, + heading: + (controller.selectedType() == NutritionHydrationType.food) + ? "Meal Type: (Breakfast, Lunch, Dinner, Snack etc)" + : 'Drink Type', + hintText: "Type here...", + onChange: (_) {}, + ); + }), + 20.verticalSpace, + Obx(() { + return CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.amountController, + textCapitalization: TextCapitalization.words, + heading: + (controller.selectedType() == NutritionHydrationType.food) + ? "Amount Eaten" + : "Amount (ML)", + hintText: "Type here...", + onChange: (_) {}, + ); + }), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.commentsController, + textCapitalization: TextCapitalization.sentences, + heading: "Comments", + hintText: "Type comments here...", + onChange: (_) {}, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + Widget _radioGroup(List options, Rx selected) { + options.map((e) => Flexible( + child: RadioButton( + value: e, + selectedOption: selected, + ), + )); + return Wrap( + runAlignment: WrapAlignment.start, + direction: Axis.horizontal, + runSpacing: 8.r, + spacing: 16.r, + children: options + .map((e) => RadioButton( + value: e, + selectedOption: selected, + )) + .toList(), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/observations_form_screen.dart b/lib/view/screens/clients/careNoteForms/observations_form_screen.dart new file mode 100644 index 0000000..15ada9a --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/observations_form_screen.dart @@ -0,0 +1,135 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/observations_form_screen_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class ObservationsFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const ObservationsFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => _ObservationsFormScreenState(); +} + +class _ObservationsFormScreenState extends State { + late final ObservationsFormScreenController controller; + + @override + void initState() { + controller = Get.put(ObservationsFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Health Observations note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () =>controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + _singleLineTextField( + textEditingController: controller.heartRateController, + hint: "Heart Rate (BPM)", + heading: "Heart Rate (BPM)", + ), + 20.verticalSpace, + _singleLineTextField( + textEditingController: controller.bloodPressureController, + hint: "Blood Pressure (/MMHG)", + heading: "Blood Pressure (/MMHG)", + ), + 20.verticalSpace, + _singleLineTextField( + textEditingController: controller.respiratoryRateController, + hint: "Respiratory Rate", + heading: "Respiratory Rate", + ), + 20.verticalSpace, + _singleLineTextField( + textEditingController: controller.oxygenController, + hint: "Oxygen (%)", + heading: "Oxygen (%)", + ), + 20.verticalSpace, + _singleLineTextField( + textEditingController: controller.temperatureController, + hint: "Temperature (°C)", + heading: "Temperature (°C)", + ), + 20.verticalSpace, + _singleLineTextField( + textEditingController: controller.bloodSugarController, + hint: "Blood Sugar (MMOL/L)", + heading: "Blood Sugar (MMOL/L)", + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + Widget _singleLineTextField( + {required TextEditingController textEditingController, + required String heading, + required String hint}) { + return CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + maxLength: 4, + controller: textEditingController, + heading: heading, + hintText: hint, + inputType: const TextInputType.numberWithOptions(), + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + onChange: (_) {}, + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/physical_intervention_form_screen.dart b/lib/view/screens/clients/careNoteForms/physical_intervention_form_screen.dart new file mode 100644 index 0000000..6a6f44a --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/physical_intervention_form_screen.dart @@ -0,0 +1,329 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/physical_intervention_form_screen_controller.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/clients/category_subcategory_dropdowns_widget.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class PhysicalInterventionFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const PhysicalInterventionFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _PhysicalInterventionFormScreenState(); +} + +class _PhysicalInterventionFormScreenState + extends State { + late final PhysicalInterventionFormScreenController controller; + + @override + void initState() { + controller = + Get.put(PhysicalInterventionFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Physical Intervention note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.durationOfIncidentController, + heading: "Duration of incident (Mins)", + hintText: "Type here...", + inputType: const TextInputType.numberWithOptions(), + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.staffDebriefFormNumberController, + heading: "Staff Debrief Form Number", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.nameOfWitnessController, + heading: "Name of witnesses/adults present", + hint: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.incidentPlaceController, + heading: "Place incident occured", + hint: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.whatWasUsedController, + heading: + "What was used prior to intervention to defuse/deescalae the situation?", + hint: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.wasThePbsFollowedController, + heading: + "Was the PBS followed and was it sufficient enough to manage this incident?", + hint: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.reasonForPhysicalInterventionController, + heading: "Reason for physical intervention", + hint: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.staffInvolvedController, + heading: "Staff involved in the physical intervention", + hint: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.conditionOfServiceUserController, + heading: + "Condition of service user following the incident, including breathing monitoring", + hint: "Type here...", + ), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.userClamedController, + heading: "How was the service user calmed?", + hint: "Type here...", + ), + 32.verticalSpace, + CustomTextWidget( + text: "Why was the use of force necessary?", + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w500, + fontColor: Colors.black, + ), + 12.verticalSpace, + ...List.generate(controller.whyForceNecessaryOptions.length, + (index) { + final e = controller.whyForceNecessaryOptions[index]; + return ObxValue((RxBool isChecked) { + return CheckboxListTile( + value: isChecked(), + onChanged: isChecked, + controlAffinity: ListTileControlAffinity.trailing, + shape: const RoundedRectangleBorder( + side: BorderSide(color: CustomAppColors.kSmokeColor)), + tileColor: (index % 2 == 0) + ? CustomAppColors.kSmokeColor + : Colors.white, + title: CustomTextWidget( + text: e.requirements, + isExpanded: false, + fontSize: 13.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + textAlign: TextAlign.left, + ), + ); + }, e.isChecked); + }), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.explainController, + heading: "If ticked \"Other\" please explain", + hint: "Type here...", + ), + 20.verticalSpace, + CategorySubcategoryDropdownsWidget( + controller: controller.catSubCatController, + ), + 20.verticalSpace, + Padding( + padding: REdgeInsets.only(left: 8.0), + child: CustomTextWidget( + text: "Parent Contacted", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + ), + ), + 8.verticalSpace, + _radioGroup(controller.isParentContactedOptions, + controller.isParentContacted), + Obx(() => controller.isParentContacted() == "Yes" + ? Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: widgetsIfParentContacted(), + ) + : const SizedBox.shrink()), + 20.verticalSpace, + _multilineTextField( + textEditingController: controller.commentsController, + heading: "Parent/carer's comments", + hint: "Type here...", + ), + 20.verticalSpace, + Padding( + padding: REdgeInsets.only(left: 8.0), + child: CustomTextWidget( + text: "How was this form shared with parents/carers?", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + ), + ), + 8.verticalSpace, + _radioGroup( + controller.howFormSharedOptions, controller.howFormSharedRx), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + Widget _multilineTextField( + {required TextEditingController textEditingController, + required String heading, + required String hint}) { + return CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: textEditingController, + heading: heading, + hintText: hint, + onChange: (_) {}, + ); + } + + List widgetsIfParentContacted() { + return [ + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.nameOfParentContacted, + heading: "Name of parent contacted", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + InkWell( + onTap: () => controller.selectParentContactTime(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.parentContactedTime, + hintText: "Contact time", + heading: "Contact time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + Padding( + padding: REdgeInsets.only(left: 8.0), + child: CustomTextWidget( + text: "How parent was contacted", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + ), + ), + 8.verticalSpace, + _radioGroup( + controller.howParentContactedOptions, controller.howParentContacted), + ]; + } + + Widget _radioGroup(List options, Rx selected) { + options.map((e) => Flexible( + child: RadioButton( + value: e, + selectedOption: selected, + ), + )); + return Wrap( + runAlignment: WrapAlignment.start, + direction: Axis.horizontal, + runSpacing: 8.r, + spacing: 16.r, + children: options + .map((e) => RadioButton( + value: e, + selectedOption: selected, + )) + .toList(), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/safeguarding_form_screen.dart b/lib/view/screens/clients/careNoteForms/safeguarding_form_screen.dart new file mode 100644 index 0000000..dd07cd6 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/safeguarding_form_screen.dart @@ -0,0 +1,214 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/safeguarding_form_screen_controller.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/clients/category_subcategory_dropdowns_widget.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class SafeguardingFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const SafeguardingFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => _SafeguardingFormScreenState(); +} + +class _SafeguardingFormScreenState extends State { + late final SafeguardingFormScreenController controller; + + @override + void initState() { + controller = Get.put(SafeguardingFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Safeguarding note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select date and time", + heading: "Date and time of disclosure/findings", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.concernAboutServiceUserController, + heading: "Concerns about the service user", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.voiceOfServiceUserController, + heading: "Voice of the service user", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.anyImmediateRisksController, + heading: "Are there any immediate risks", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.qActionTakenController, + heading: "What action do you feel should be taken?", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 4, + maxLines: 4, + controller: controller.commentsController, + heading: "Comments", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CategorySubcategoryDropdownsWidget( + controller: controller.catSubCatController), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.nameController1, + heading: "Your Name", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.anyWitnessesController, + heading: "Any witnesses", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + InkWell( + onTap: () => controller.selectDateAndTimeOfReporting(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.reportingDateTimeController, + hintText: "Select date and time", + heading: "Date and time of reporting", + isEnabled: false, + onChange: (_) {}, + ), + ), + 32.verticalSpace, + CustomTextWidget( + text: "To be completed by DSL/DDSL", + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w500, + fontColor: Colors.black, + ), + 12.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.nameController2, + heading: "Your Name", + hintText: "Type here...", + onChange: (_) {}, + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.actionTakenController, + heading: "Action taken", + hintText: "Type here...", + onChange: (_) {}, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/showering_bath_form_screen.dart b/lib/view/screens/clients/careNoteForms/showering_bath_form_screen.dart new file mode 100644 index 0000000..58b6ed0 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/showering_bath_form_screen.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/showering_bath_form_screen_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class ShoweringBathFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const ShoweringBathFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _ShoweringBathFormScreenState(); +} + +class _ShoweringBathFormScreenState extends State { + late final ShoweringBathFormScreenController controller; + + @override + void initState() { + controller = Get.put(ShoweringBathFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add ShoweringBath note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () =>controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + radioGroup(), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.commentsController, + heading: "Comments", + hintText: "Type comments here...", + onChange: (_) {}, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + Widget radioGroup() { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: RadioButton( + value: 'Bath', + selectedOption: controller.selectedOption, + ), + ), + Expanded( + child: RadioButton( + value: 'Shower', + selectedOption: controller.selectedOption, + ), + ), + Expanded( + child: RadioButton( + value: 'Wash', + selectedOption: controller.selectedOption, + ), + ), + ], + ); + } + + // _selectDate() async { + // Get.focusScope?.unfocus(); + // final date = await CommonCode.datePicker(context); + // + // if (date != null) { + // controller.date = date; + // controller.dateController.text = + // CommonCode.careNoteDateFormatter.format(date); + // } + // } + + // _selectTime() async { + // TimeOfDay? timeOfDay = await CommonCode.selectTime(context, + // selectedTime: TimeOfDay.now(), + // themeColor: Get.theme.colorScheme.primary); + // + // if (timeOfDay != null) { + // controller.timeController.text = timeOfDay.toString(); + // controller.time = timeOfDay; + // } + // } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/toileting_note_form_screen.dart b/lib/view/screens/clients/careNoteForms/toileting_note_form_screen.dart new file mode 100644 index 0000000..3ac3227 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/toileting_note_form_screen.dart @@ -0,0 +1,169 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import '../../../../controllers/clients/careNoteFormControllers/toileting_note_form_screen_controller.dart'; + +class ToiletingNoteFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const ToiletingNoteFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _ToiletingNoteFormScreenState(); +} + +class _ToiletingNoteFormScreenState extends State { + late final ToiletingNoteFormScreenController controller; + + @override + void initState() { + controller = Get.put(ToiletingNoteFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Toileting note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () =>controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + SizedBox( + height: 30.h, + child: GestureDetector( + onTap: controller.assistanceRequired.toggle, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Obx( + () => Ink( + width: 32.r, + height: 32.r, + child: Checkbox( + value: controller.assistanceRequired.value, + activeColor: CustomAppColors.kSecondaryColor, + onChanged: (value) { + controller.assistanceRequired.value = + value ?? false; + }, + ), + ), + ), + CustomTextWidget( + text: "Was assistance required with toileting?", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + ], + ), + ), + ), + 20.verticalSpace, + Padding( + padding: REdgeInsets.only(left: 8.0), + child: CustomTextWidget( + text: "If yes, what assistance?", + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + fontColor: Colors.black, + ), + ), + 8.verticalSpace, + radioGroup(), + 20.verticalSpace, + Obx(() { + return CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + isEnabled: controller.assistanceRequired(), + controller: controller.commentsController, + heading: "Comments", + hintText: "Type comments here...", + onChange: (_) {}, + ); + }), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + Widget radioGroup() { + return Obx(() { + return IgnorePointer( + ignoring: controller.assistanceRequired.isFalse, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: RadioButton( + value: 'Bowel', + selectedOption: controller.selectedOption, + isEnabled: controller.assistanceRequired(), + ), + ), + 16.horizontalSpace, + Flexible( + child: RadioButton( + value: 'Urine', + selectedOption: controller.selectedOption, + isEnabled: controller.assistanceRequired(), + ), + ), + ], + ), + ); + }); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/careNoteForms/weight_height_form_screen.dart b/lib/view/screens/clients/careNoteForms/weight_height_form_screen.dart new file mode 100644 index 0000000..8d0d8f7 --- /dev/null +++ b/lib/view/screens/clients/careNoteForms/weight_height_form_screen.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/weight_height_form_screen_controller.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +class WeightHeightFormScreen extends StatefulWidget { + final CommonCareNoteFormArgs args; + + const WeightHeightFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => _WeightHeightFormScreenState(); +} + +class _WeightHeightFormScreenState extends State { + late final WeightHeightFormScreenController controller; + + @override + void initState() { + controller = Get.put(WeightHeightFormScreenController(args: widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Add Weight/Height note', + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 16.verticalSpace, + InkWell( + onTap: () => controller.selectDate(context), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.dateController, + hintText: "Select...", + heading: "Date / Time", + isEnabled: false, + onChange: (_) {}, + ), + ), + 20.verticalSpace, + Row( + children: [ + Expanded( + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + maxLength: 3, + controller: controller.heightController, + hintText: "Height (CM)", + heading: "Height (CM)", + inputType: const TextInputType.numberWithOptions(), + onChange: (_) {}, + ), + ), + 16.horizontalSpace, + Expanded( + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + maxLength: 3, + controller: controller.weightController, + hintText: 'Weight (KG)', + heading: 'Weight (KG', + inputType: const TextInputType.numberWithOptions(), + onChange: (_) {}, + ), + ), + ], + ), + 20.verticalSpace, + CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 6, + maxLines: 6, + controller: controller.commentsController, + heading: "Comments", + hintText: "Type comments here...", + onChange: (_) {}, + ), + 32.verticalSpace, + CustomAppButton( + buttonText: ConstantText.kSave, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: controller.onSaveButtonTap, + ), + 20.verticalSpace, + ], + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/care_note_detail_screen.dart b/lib/view/screens/clients/care_note_detail_screen.dart new file mode 100644 index 0000000..3c7a71b --- /dev/null +++ b/lib/view/screens/clients/care_note_detail_screen.dart @@ -0,0 +1,191 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/enums/body_parts.dart'; +import 'package:ftc_mobile_app/utilities/enums/care_note_form_type.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import '../../../controllers/clients/care_note_detail_screen_controller.dart'; +import '../../../models/clients/allCareNotes/CarePlans.dart'; +import '../../custom_widgets/human_body_mapper_widget.dart'; + +class CareNoteDetailScreen extends StatefulWidget { + final CarePlan data; + + const CareNoteDetailScreen({super.key, required this.data}); + + static const meta = + """ +"""; + + static const css = """ +"""; + + @override + State createState() => _CareNoteDetailScreenState(); +} + +class _CareNoteDetailScreenState extends State { + late final CareNoteDetailScreenController controller; + + final commonHtmlStyle = { + "strong": Style( + display: Display.block, + fontSize: FontSize(16), + fontWeight: FontWeight.w700, + ), + "p, small": Style( + display: Display.block, + fontSize: FontSize(14), + ), + }; + + @override + void initState() { + super.initState(); + controller = Get.put(CareNoteDetailScreenController(widget.data)); + } + + @override + Widget build(BuildContext context) { + if (kDebugMode) { + log("CarePlan data: ${jsonEncode(widget.data.toJson())}"); + } + + final isMoodRatingForm = + widget.data.noteType == CareNotesFormType.moodRatingForm.apiValue; + + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + automaticallyImplyLeading: false, + title: const CustomTextWidget( + text: 'View Care Note', + fontColor: Colors.white, + textAlign: TextAlign.left, + ), + backgroundColor: Theme.of(context).primaryColor, + centerTitle: false, + actions: const [ + CloseButton(color: Colors.white), + ], + ), + body: SafeArea( + child: (widget.data.isHTML == true) + ? Obx(() { + return (controller.isLoadingWebPage()) + ? Center( + child: SizedBox.square( + dimension: 48.r, + child: const CircularProgressIndicator()), + ) + : ListView( + children: [ + Obx(() { + return SizedBox( + height: controller.webViewHeight(), + child: WebViewWidget( + controller: controller.webViewController), + ); + }), + // Flexible(child: WebViewWidget(controller: controller)), + bodyPoints(), + ], + ); + }) + : ListView( + children: [ + Html( + data: controller.headerHtml, + style: { + "strong": Style( + display: Display.block, + fontSize: FontSize(16), + fontWeight: FontWeight.w700, + ), + }, + ), + Html( + data: (widget.data.isHTML == true) + ? widget.data.noteDetails + : """

+ Title + ${widget.data.title ?? ""} +

+ ${(!isMoodRatingForm && widget.data.noteDetails.isNotNullOrEmpty()) ? "

${widget.data.noteDetails!}

" : ''} + ${(!isMoodRatingForm && widget.data.flag == true) ? """

Handover Review

""" : ''} + """, + shrinkWrap: true, + style: commonHtmlStyle, + ), + (widget.data.healthIssueId?.category == null) + ? FrequentFunctions.noWidget + : Html( + data: """

+ Effected Body Part + ${widget.data.healthIssueId!.category!.name} +

""", + style: commonHtmlStyle, + ), + bodyPoints().paddingOnly(top: 20.r), + ], + ), + ), + ); + } + + Widget bodyPoints() { + if (widget.data.healthIssueId?.category == null) { + return FrequentFunctions.noWidget; + } + + final Map map = {}; + + BodyPart.values + .where((e) => e.apiValue == widget.data.healthIssueId!.category!.enumed) + .forEach((e) { + map[e] = Colors.red; + }); + + return HumanBodyWidget( + width: Get.width * 0.8, + visibleBodyPoints: map, + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/care_notes_screen.dart b/lib/view/screens/clients/care_notes_screen.dart new file mode 100644 index 0000000..0c136cd --- /dev/null +++ b/lib/view/screens/clients/care_notes_screen.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/care_note_category.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/clients/CareNoteOptionCard.dart'; +import 'package:get/get.dart'; + +import 'all_care_notes_screen.dart'; + +class CareNotesScreenArgs { + final String serviceUserId; + + CareNotesScreenArgs({required this.serviceUserId}); +} + +class CareNotesScreen extends StatefulWidget { + final CareNotesScreenArgs args; + + const CareNotesScreen({super.key, required this.args}); + + @override + State createState() => _CareNotesScreenState(); +} + +class _CareNotesScreenState extends State { + final CareNotesScreenController controller = + Get.put(CareNotesScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () => controller.backButtonPressed(context), + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Care Notes', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: SafeArea( + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 18), + child: ListView( + children: [ + Row( + children: [ + Expanded( + child: AspectRatio( + aspectRatio: 1, + child: InkWell( + onTap: () { + Navigator.pushNamed(context, + CustomRouteNames.kAllCareNotesScreenRoute, + arguments: AllCareNotesScreenArgs( + serviceUserId: widget.args.serviceUserId)); + }, + child: const CareNoteOptionCard( + icon: AssetsManager.kIcGeneral, + name: "All Care Notes", + ), + ), + ), + ), + const Expanded(child: SizedBox.shrink()), + ], + ), + 16.verticalSpace, + CustomTextWidget( + alignment: Alignment.centerLeft, + isExpanded: false, + text: "Common Options", + fontSize: 16.sp, + fontWeight: FontWeight.w700), + 10.verticalSpace, + _categoriesList(), + // Flexible(child: ), + ], + ), + ), + ), + ); + } + + Widget _categoriesList() { + return GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, mainAxisSpacing: 6.r, crossAxisSpacing: 6.r), + itemCount: controller.categories.length, + itemBuilder: (_, index) { + return InkWell( + onTap: () => _onCategoryCardTap(controller.categories[index]), + child: CareNoteOptionCard( + icon: controller.categories[index].iconPath ?? "", + name: controller.categories[index].category ?? "", + ), + ); + }, + ); + } + + // ---------Methods----------- + void _onCategoryCardTap(CareNoteCategory category) { + Navigator.pushNamed( + context, + CustomRouteNames.kCareNotesSubcategoriesScreenRoute, + arguments: CareNotesSubcategoriesScreenArgs( + serviceUserId: widget.args.serviceUserId, + category: category, + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/care_notes_subcategories_screen.dart b/lib/view/screens/clients/care_notes_subcategories_screen.dart new file mode 100644 index 0000000..c45aaa7 --- /dev/null +++ b/lib/view/screens/clients/care_notes_subcategories_screen.dart @@ -0,0 +1,235 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/careNoteFormControllers/common_care_note_forms_controller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/enums/care_note_form_type.dart'; +import 'package:get/get.dart'; +import '../../../controllers/clients/care_notes_subcategories_screen_controller.dart'; +import '../../../models/clients/care_note_category.dart'; + +class CareNotesSubcategoriesScreenArgs { + final String serviceUserId; + final CareNoteCategory category; + + CareNotesSubcategoriesScreenArgs( + {required this.serviceUserId, required this.category}); +} + +class CareNotesSubcategoriesScreen extends StatefulWidget { + final CareNotesSubcategoriesScreenArgs args; + + const CareNotesSubcategoriesScreen({super.key, required this.args}); + + @override + State createState() => + _CareNotesSubcategoriesScreenState(); +} + +class _CareNotesSubcategoriesScreenState + extends State { + final CareNotesSubcategoriesScreenController controller = + Get.put(CareNotesSubcategoriesScreenController()); + + List get _subcategories => + widget.args.category.subcategories ?? []; + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: widget.args.category.category ?? "", + ), + // appBar: CustomAppBar( + // leadingButton: Container(), + // showBoxShadow: false, + // titleWidget: Row( + // children: [ + // InkWell( + // onTap: () => controller.backButtonPressed(context), + // child: CustomImageWidget( + // imagePath: AssetsManager.kBackIcon, + // height: 11.53.h, + // width: 8.66.w, + // ), + // ), + // SizedBox( + // width: 15.w, + // ), + // CustomTextWidget( + // text: widget.args.category.category ?? "", + // isExpanded: false, + // fontSize: 16.sp, + // fontWeight: FontWeight.w700, + // fontColor: CustomAppColors.kDarkBlueTextColor, + // ), + // ], + // ), + // ), + body: Padding( + padding: REdgeInsets.symmetric(horizontal: 18), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 10.verticalSpace, + Expanded(child: _categoriesList()), + ], + ), + ), + ); + } + + Widget _categoriesList() { + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, mainAxisSpacing: 6.r, crossAxisSpacing: 6.r), + itemCount: _subcategories.length, + itemBuilder: (_, index) { + return InkWell( + onTap: () { + _onSubcategoryCardTap(_subcategories[index]); + }, + child: Card( + elevation: 2, + shadowColor: CustomAppColors.kLightGreyColor, + surfaceTintColor: Colors.white, + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4).r), + child: Padding( + padding: REdgeInsets.all(8), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomImageWidget( + imagePath: _subcategories[index].iconPath ?? "", + height: 24.r, + width: 24.r, + ), + 12.verticalSpace, + CustomTextWidget( + text: _subcategories[index].name ?? "", + alignment: Alignment.center, + isExpanded: false, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + fontSize: 14.sp) + ], + ), + ), + ), + ); + }, + ); + } + + void _onSubcategoryCardTap(Subcategories subcategory) { + final args = CommonCareNoteFormArgs( + serviceUserId: widget.args.serviceUserId, + noteType: subcategory.apiValue!); + switch (CareNotesFormType.fromText(subcategory.formType ?? "")) { + case CareNotesFormType.injuryHealthIssueForm: + Navigator.pushNamed( + context, + CustomRouteNames.kInjuryHealthIssueFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.weightHeightForm: + Navigator.pushNamed( + context, + CustomRouteNames.kWeightHeightFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.healthAppointmentForm: + Navigator.pushNamed( + context, + CustomRouteNames.kHealthAppointmentsFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.observationsForm: + Navigator.pushNamed( + context, + CustomRouteNames.kObservationsFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.safeguardingForm: + Navigator.pushNamed( + context, + CustomRouteNames.kSafeguardingFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.showeringBathForm: + Navigator.pushNamed( + context, + CustomRouteNames.kShoweringBathFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.toiletingNoteForm: + Navigator.pushNamed( + context, + CustomRouteNames.kToiletingNoteFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.moodRatingForm: + Navigator.pushNamed( + context, + CustomRouteNames.kMoodRatingFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.ABCForm: + Navigator.pushNamed( + context, + CustomRouteNames.kABCFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.physicalInterventionForm: + Navigator.pushNamed( + context, + CustomRouteNames.kPhysicalInterventionFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.consentCapacityForm: + Navigator.pushNamed( + context, + CustomRouteNames.kConsentCapacityFormScreenRoute, + arguments: args, + ); + break; + case CareNotesFormType.nutritionHydrationForm: + Navigator.pushNamed( + context, + CustomRouteNames.kNutritionHydrationFormScreenRoute, + arguments: args, + ); + break; + default: + Navigator.pushNamed( + context, + CustomRouteNames.kFreeTextEntriesScreenRoute, + arguments: args, + ); + break; + } + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/care_plan_menu_screen.dart b/lib/view/screens/clients/care_plan_menu_screen.dart new file mode 100644 index 0000000..908eb58 --- /dev/null +++ b/lib/view/screens/clients/care_plan_menu_screen.dart @@ -0,0 +1,227 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../ftc_mobile_app.dart'; +import '../../../models/profileData/user_data.dart'; +import '../../custom_widgets/my_circle_image.dart'; + +class CarePlanMenuScreen extends StatefulWidget { + final UserData userData; + + const CarePlanMenuScreen({Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => _CarePlanMenuScreenState(); +} + +class _CarePlanMenuScreenState extends State { + late final CarePlanMenuScreenController controller; + + @override + void initState() { + controller = Get.put(CarePlanMenuScreenController(data: widget.userData)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: "Care Plan Menu", + ), + body: Obx(() { + if (controller.serviceUser() == null) { + return FrequentFunctions.centerText(text: "User detail not found"); + } + + final detail = controller.serviceUser()!; + + return ListView( + children: [ + 16.verticalSpace, + UnconstrainedBox( + child: MyCircleImage( + imageSize: 80.r, + url: "${WebUrls.baseUrl}${detail.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 80.r, + width: 80.r, + ), + ), + ), + SizedBox(height: 16.h), + CustomTextWidget( + text: detail.displayName, + fontSize: 14.sp, + fontWeight: FontWeight.w600), + 16.verticalSpace, + Container( + padding: EdgeInsets.only(left: 20.w), + child: CustomTextWidget( + alignment: Alignment.centerLeft, + isExpanded: false, + text: "Care Plans", + fontSize: 16.sp, + fontWeight: FontWeight.w700), + ), + // 5.verticalSpace, + // const LineWidget( + // text: "Key Contacts", + // ), + 5.verticalSpace, + LineWidget( + text: "Care Notes", + onItemTap: () { + Navigator.pushNamed( + controller.screenKey.currentContext!, + CustomRouteNames.kCareNotesScreenRoute, + arguments: CareNotesScreenArgs( + serviceUserId: controller.serviceUser()!.id!), + ); + }, + ), + 5.verticalSpace, + LineWidget( + text: "Risk Assesments", + onItemTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kRiskAssessmentsTemplateScreenRoute, + arguments: controller.serviceUser(), + ); + }), + 5.verticalSpace, + LineWidget( + text: "Consent and capacity", + onItemTap: () { + Navigator.pushNamed( + context, + CustomRouteNames + .kConsentAndCapacityQuestionnaireScreenRoute, + arguments: controller.serviceUser()!, + ); + }), + 5.verticalSpace, + LineWidget( + text: "Current Health Issues", + onItemTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kCurrentHealthIssuesScreenRoute, + arguments: controller.serviceUser()!, + ); + }), + 5.verticalSpace, + // LineWidget( + // text: "Life History & Goals", + // onItemTap: () { + // Navigator.pushNamed( + // context, + // CustomRouteNames.kLifeHistoryAndGoalsScreenRoute, + // arguments: controller.serviceUser.value, + // ); + // }), + // 5.verticalSpace, + // LineWidget( + // text: "Support Plan", + // onItemTap: () { + // Navigator.pushNamed( + // context, + // CustomRouteNames.kSupportPlanScreenRoute, + // arguments: controller.serviceUser.value, + // ); + // }), + // 5.verticalSpace, + // const LineWidget( + // text: "Medication Profile", + // ), + // 5.verticalSpace, + LineWidget( + text: "PBS Plan", + onItemTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kPBSPlanScreenRoute, + arguments: controller.serviceUser.value, + ); + }), + 5.verticalSpace, + LineWidget( + text: "Recent Incidents", + onItemTap: () { + Navigator.pushNamed( + context, CustomRouteNames.kRecentIncidentsScreenRoute, + arguments: controller.serviceUser.value); + }), + 5.verticalSpace, + LineWidget( + text: "Documents", + onItemTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kDocumentsListScreenRoute, + arguments: controller.serviceUser.value, + ); + }), + ], + ); + }), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +class LineWidget extends StatelessWidget { + const LineWidget({ + super.key, + required this.text, + this.onItemTap, + }); + + final Function? onItemTap; + final String text; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + if (onItemTap != null) { + onItemTap!(); + } + }, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 15.w, vertical: 2.h), + padding: EdgeInsets.symmetric(horizontal: 10.r, vertical: 12.r), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kSecondaryColor)), + child: Row( + children: [ + CustomTextWidget( + text: text, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 16.sp), + const Spacer(), + Icon( + Icons.keyboard_arrow_right_rounded, + color: CustomAppColors.kSecondaryColor, + size: 18.r, + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/client_profile_screen.dart b/lib/view/screens/clients/client_profile_screen.dart new file mode 100644 index 0000000..1909cb1 --- /dev/null +++ b/lib/view/screens/clients/client_profile_screen.dart @@ -0,0 +1,321 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:get/get.dart'; +import '../../../models/profileData/user_data.dart'; +import 'all_care_notes_screen.dart'; + +class ClientProfileScreen extends StatefulWidget { + final UserData userData; + + const ClientProfileScreen({Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => _ClientProfileScreenState(); +} + +class _ClientProfileScreenState extends State { + late final ClientProfileScreenController controller; + + @override + void initState() { + controller = Get.put(ClientProfileScreenController(data: widget.userData)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () => controller.backButtonPressed(context), + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + const SizedBox( + width: 15, + ), + CustomTextWidget( + text: 'Client: ${controller.serviceUser()?.displayName ?? ""}', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor), + ], + ), + ), + body: Obx(() { + if (controller.serviceUser() == null) { + return FrequentFunctions.centerText(text: "User detail not found"); + } + + final detail = controller.serviceUser()!; + + return SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: 16.h), + MyCircleImage( + imageSize: 80.r, + url: "${WebUrls.baseUrl}${detail.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 53.h, + width: 53.w, + ), + ), + 16.verticalSpace, + CustomTextWidget( + text: detail.displayName, + fontSize: 14.sp, + fontWeight: FontWeight.w600), + 16.verticalSpace, + BuildDetailRow( + title: 'Contact Number', + value: detail.modelId?.phoneNo ?? "", + ), + BuildDetailRow( + title: 'Home Address', + value: detail.modelId?.homeAddress ?? ""), + BuildDetailRow( + title: 'Next of Kin', + value: detail.modelId?.suFamilyHead ?? ""), + const BuildDetailRow(title: 'Diagnosis History', value: ''), + BuildRoundOutlinedBox( + context: context, + child: BuildDiagnosisHistoryList( + history: + (detail.modelId?.diagnosises.isNotNullOrEmpty() == true) + ? detail.modelId!.diagnosises.first.diagnosisText + : "", + date: (detail.modelId?.aboutPatient.aboutDate + .isNotNullOrEmpty() == + true) + ? DateFormatter().getAppointmentTime( + detail.modelId!.aboutPatient.aboutDate) + : "", + ), + ), + const BuildDetailRow(title: 'About the Patient', value: ''), + BuildRoundOutlinedBox( + context: context, + child: BuildDiagnosisHistoryList( + history: detail.modelId?.aboutPatient.aboutText ?? "", + date: (detail.modelId?.aboutPatient.aboutDate + .isNotNullOrEmpty() == + true) + ? DateFormatter().getAppointmentTime( + detail.modelId!.aboutPatient.aboutDate) + : "", + ), + ), + 16.verticalSpace, + BuildIconButton( + iconPath: AssetsManager.kNotesIcon, + text: 'Notes', + route: CustomRouteNames.kAllCareNotesScreenRoute, + arguments: AllCareNotesScreenArgs( + serviceUserId: controller.serviceUser()!.id!), + ), + BuildIconButton( + iconPath: AssetsManager.kCarePlanIcon, + text: 'Care Plan', + route: CustomRouteNames.kCarePlanMenuScreenRoute, + arguments: controller.serviceUser()!, + ), + BuildIconButton( + iconPath: AssetsManager.kCalendarAppointmentIcon, + text: 'Appointments', + route: CustomRouteNames.kAppointmentsScreenRoute, + arguments: controller.serviceUser()!, + ), + BuildIconButton( + iconPath: AssetsManager.kPhotoGalleryIcon, + text: 'Photo Gallery', + route: CustomRouteNames.kPhotoGalleryScreenRoute, + arguments: controller.serviceUser()!, + ), + ], + ), + ); + }), + ); + } +} + +class BuildIconButton extends StatelessWidget { + const BuildIconButton({ + super.key, + required this.iconPath, + required this.text, + required this.route, + required this.arguments, + }); + + final String iconPath; + final String text; + final String route; + final dynamic arguments; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + if (route.isNotEmpty) { + Navigator.pushNamed(context, route, arguments: arguments); + } + }, + child: Container( + margin: EdgeInsets.symmetric(vertical: 5.h, horizontal: 25.w), + padding: EdgeInsets.symmetric(horizontal: 10.r, vertical: 8.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2.r), + border: Border.all( + color: CustomAppColors.kLightGreyColor.withOpacity(0.5))), + child: Row( + children: [ + CustomImageWidget( + imagePath: iconPath, + height: 20.r, + width: 20.r, + ), + 12.horizontalSpace, + CustomTextWidget( + text: text, + isExpanded: false, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + fontSize: 14.sp), + const Spacer(), + Icon( + Icons.arrow_forward_ios_rounded, + size: 12.sp, + ) + ], + ), + ), + ); + } +} + +class BuildDiagnosisHistoryList extends StatelessWidget { + const BuildDiagnosisHistoryList({ + super.key, + required this.date, + required this.history, + }); + + final String date; + final String history; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: date, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 10.sp, + fontColor: CustomAppColors.kLightGreyColor, + ), + CustomTextWidget( + alignment: Alignment.centerLeft, + textAlign: TextAlign.left, + text: history, + isExpanded: false, + fontSize: 10.sp, + fontColor: CustomAppColors.kBlackColor, + ), + ], + ); + } +} + +class BuildRoundOutlinedBox extends StatelessWidget { + const BuildRoundOutlinedBox({ + super.key, + required this.context, + required this.child, + }); + + final BuildContext context; + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.centerLeft, + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.symmetric(horizontal: 22.r), + padding: EdgeInsets.all(10.sp), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightGreyColor), + borderRadius: BorderRadius.circular(10.r), + ), + child: child, + ); + } +} + +class BuildDetailRow extends StatelessWidget { + const BuildDetailRow({ + super.key, + required this.title, + required this.value, + }); + + final String title; + final String value; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 20.w), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 4, + child: CustomTextWidget( + isExpanded: false, + text: '$title: ', + fontWeight: FontWeight.w600, + textAlign: TextAlign.left, + fontColor: CustomAppColors.kDarkBlueTextColor, + fontSize: 14.sp, + ), + ), + Expanded( + flex: 6, + child: CustomTextWidget( + text: value, + isExpanded: false, + maxLines: 2, + textAlign: TextAlign.right, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + fontSize: 14.sp), + ) + ], + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/add_new_pbs_plan_screen.dart b/lib/view/screens/clients/clients_new_view_module/add_new_pbs_plan_screen.dart new file mode 100644 index 0000000..a277b23 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/add_new_pbs_plan_screen.dart @@ -0,0 +1,298 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/new_client_module_controllers/add_new_pbs_plan_screen_controller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/PBSPlanModel.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:get/get.dart'; +import 'package:quill_html_editor/quill_html_editor.dart'; + +class AddNewPBSPlanScreenArgs { + final UserData userData; + final PbsList? pbsData; + final bool viewOnly; + + AddNewPBSPlanScreenArgs({ + required this.userData, + this.pbsData, + this.viewOnly = false, + }); +} + +class AddNewPBSPlanScreen extends StatefulWidget { + final AddNewPBSPlanScreenArgs args; + + const AddNewPBSPlanScreen({Key? key, required this.args}) : super(key: key); + + @override + State createState() => _AddNewPBSPlanScreenState(); +} + +class _AddNewPBSPlanScreenState extends State { + late final AddNewPbsPlanScreenController controller; + + @override + void initState() { + controller = Get.put(AddNewPbsPlanScreenController(widget.args)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.backButtonPressed(context, null), + screenKey: controller.screenKey, + backgroundColor: CustomAppColors.kPrimaryColor, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + controller.backButtonPressed(context, null); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: (widget.args.viewOnly) + ? "View PBS Plan" + : widget.args.pbsData == null + ? 'Add New PBS Plan' + : 'Update PBS Plan', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: SafeArea( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: SingleChildScrollView( + child: Obx( + () => Column( + children: [ + //About Plan + SeparateQuillEditorForFields( + headingText: 'About Plan', + headingBackGroundColor: + CustomAppColors.kLightGreyColor.withAlpha(150), + headingTextColor: CustomAppColors.kBlackColor, + // noteHintText: "About Plan hint", + noteText: controller.addPbsPlanModel.value.aboutPlan, + quillEditorController: controller + .addPbsPlanModel.value.aboutPlanQuillController, + viewOnly: (widget.args.viewOnly), + ), + Divider( + color: CustomAppColors.kLightGreyColor, + ), + + //Management of behavioural presentation + 10.verticalSpace, + SeparateQuillEditorForFields( + headingText: 'Management of behavioural presentation', + headingBackGroundColor: CustomAppColors.kDarkestGreenColor, + // noteHintText: "Management of behavioural presentation hint", + noteText: + controller.addPbsPlanModel().managementOfBehaviorPlan, + quillEditorController: controller.addPbsPlanModel.value + .managementOfBehaviouralPresentationQuillController, + viewOnly: (widget.args.viewOnly), + ), + Divider( + color: CustomAppColors.kLightGreyColor, + ), + + //Secondary Prevention + 10.verticalSpace, + SeparateQuillEditorForFields( + headingText: 'Secondary Prevention', + headingBackGroundColor: CustomAppColors.kDarkYellowColor, + // noteHintText: "Secondary Prevention hint", + noteText: + controller.addPbsPlanModel.value.secondaryPrevention, + quillEditorController: controller.addPbsPlanModel.value + .secondaryPreventionQuillController, + viewOnly: (widget.args.viewOnly), + ), + Divider( + color: CustomAppColors.kLightGreyColor, + ), + + //Reactive Strategies + 10.verticalSpace, + SeparateQuillEditorForFields( + headingText: 'Reactive Strategies', + headingBackGroundColor: CustomAppColors.kDarkRedColor, + // noteHintText: "Reactive Strategies hint", + noteText: + controller.addPbsPlanModel.value.reactiveStrategies, + quillEditorController: controller.addPbsPlanModel.value + .reactiveStrategiesQuillController, + viewOnly: (widget.args.viewOnly), + ), + Divider( + color: CustomAppColors.kLightGreyColor, + ), + + //Post Incident Support- Recovery + 10.verticalSpace, + SeparateQuillEditorForFields( + headingText: 'Post Incident Support- Recovery', + headingBackGroundColor: const Color(0xff3c78d8), + // noteHintText: "Post Incident Support- Recovery hint", + noteText: + controller.addPbsPlanModel.value.postIncidentSupport, + quillEditorController: controller.addPbsPlanModel.value + .postIncidentSupportRecoveryQuillController, + viewOnly: (widget.args.viewOnly), + ), + + //Submit Button + (widget.args.viewOnly) + ? FrequentFunctions.noWidget + : Obx( + () => CustomAppButton( + buttonText: widget.args.pbsData == null + ? "Submit" + : "Update", + buttonColor: controller.enableSubmitButton.isTrue + ? CustomAppColors.kSecondaryColor + : CustomAppColors.kLightGreyColor, + borderColor: controller.enableSubmitButton.isTrue + ? CustomAppColors.kSecondaryColor + : CustomAppColors.kLightGreyColor, + onTap: () { + if (controller.enableSubmitButton.isTrue) { + controller.submitButtonPressed(); + } + }, + ), + ), + 10.verticalSpace, + ], + ), + ), + ), + ), + ), + ); + } +} + +class SeparateQuillEditorForFields extends StatefulWidget { + const SeparateQuillEditorForFields({ + super.key, + required this.headingText, + this.headingTextColor = CustomAppColors.kWhiteColor, + required this.headingBackGroundColor, + this.headingBorderColor = CustomAppColors.kLightTextColor, + required this.noteText, + required this.quillEditorController, + // required this.noteHintText, + required this.viewOnly, + }); + + final String headingText; + final Color headingTextColor; + final Color headingBackGroundColor; + final Color headingBorderColor; + final String noteText; + + // final String noteHintText; + final bool viewOnly; + final QuillEditorController quillEditorController; + + @override + State createState() => + _SeparateQuillEditorForFieldsState(); +} + +class _SeparateQuillEditorForFieldsState + extends State { + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + decoration: BoxDecoration( + color: widget.headingBackGroundColor, + border: Border.all(color: widget.headingBorderColor)), + padding: REdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: CustomTextWidget( + text: widget.headingText, + fontColor: widget.headingTextColor, + textAlign: TextAlign.left, + fontSize: 16.sp, + fontWeight: FontWeight.bold, + ), + ), + (widget.viewOnly) + ? FrequentFunctions.noWidget + : ToolBar( + toolBarColor: Colors.cyan.shade50, + activeIconColor: Colors.green, + padding: const EdgeInsets.all(8), + iconSize: 20, + controller: widget.quillEditorController, + ), + Container( + padding: EdgeInsets.only(bottom: 10.h), + child: QuillHtmlEditor( + hintText: "Type here...", + controller: widget.quillEditorController, + isEnabled: !widget.viewOnly, + minHeight: 250, + text: widget.noteText, + hintTextAlign: TextAlign.start, + hintTextStyle: TextStyle(fontSize: 14.sp, color: Colors.black54), + padding: const EdgeInsets.only(left: 10, top: 5, right: 5), + hintTextPadding: const EdgeInsets.only(left: 10, top: 5, right: 5), + backgroundColor: widget.headingBackGroundColor.withAlpha(25), + onFocusChanged: (hasFocus) { + // if (hasFocus && FocusScope.of(context).hasFocus) { + // controller.removeFocus(); + // } + }, + onTextChanged: (text) { + // controller.enableDisableSubmitButton(); + }, + // onEditorCreated: () => debugPrint('Editor has been loaded'), + onEditingComplete: (s) { + // controller.enableDisableSubmitButton(); + }, + onEditorResized: (height) => debugPrint('Editor resized $height'), + onSelectionChanged: (sel) => + debugPrint('${sel.index},${sel.length}'), + loadingBuilder: (context) { + return const Center( + child: CircularProgressIndicator( + strokeWidth: 0.4, + ), + ); + }, + ), + ), + ], + ); + } + + @override + void dispose() { + // Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/crisis_management_screen.dart b/lib/view/screens/clients/clients_new_view_module/crisis_management_screen.dart new file mode 100644 index 0000000..3e65b1a --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/crisis_management_screen.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../ftc_mobile_app.dart'; + +class CrisisManagementScreen extends StatefulWidget { + const CrisisManagementScreen({Key? key}) : super(key: key); + + @override + State createState() => _CrisisManagementScreenState(); +} + +class _CrisisManagementScreenState extends State { + final CrisisManagementScreenController controller = + Get.put(CrisisManagementScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Crisis management', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "What crisis looks like to me", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "How can I effectively be supported?", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/export_client_new_view.dart b/lib/view/screens/clients/clients_new_view_module/export_client_new_view.dart new file mode 100644 index 0000000..e91de21 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/export_client_new_view.dart @@ -0,0 +1,12 @@ +export 'crisis_management_screen.dart'; +export 'future_plans_screen.dart'; +export 'health_full_body_map_screen.dart'; +export 'health_screen.dart'; +export 'introduction_screen.dart'; +export 'medication_screen.dart'; +export 'my_current_plan_screen.dart'; +export 'mental_health_screen.dart'; +export 'my_interests_screen.dart'; +export 'support_plan_screen.dart'; +export 'overview_screen.dart'; +export 'things_i_want_you_to_help_me_screen.dart'; \ No newline at end of file diff --git a/lib/view/screens/clients/clients_new_view_module/future_plans_screen.dart b/lib/view/screens/clients/clients_new_view_module/future_plans_screen.dart new file mode 100644 index 0000000..c012d3e --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/future_plans_screen.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class FuturePlansScreen extends StatefulWidget { + const FuturePlansScreen({Key? key}) : super(key: key); + + @override + State createState() => _FuturePlansScreenState(); +} + +class _FuturePlansScreenState extends State { + final FuturePlansScreenController controller = Get.put(FuturePlansScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Future Plans', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "What are my future plans?", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "How am I going to achieve them?", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/health_full_body_map_screen.dart b/lib/view/screens/clients/clients_new_view_module/health_full_body_map_screen.dart new file mode 100644 index 0000000..d8e41d9 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/health_full_body_map_screen.dart @@ -0,0 +1,566 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class HealthFullBodyMapScreen extends StatefulWidget { + const HealthFullBodyMapScreen({super.key}); + + @override + State createState() => _HealthFullBodyMapState(); +} + +class _HealthFullBodyMapState extends State { + HealthFullBodyMapScreenController controller = + Get.put(HealthFullBodyMapScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Health Full Body Map', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 8.h), + SizedBox( + width: MediaQuery.of(context).size.width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + listHeading(), + SizedBox( + height: 15.h, + ), + InkWell( + onTap: () { + controller.firstPointVisible.value = false; + controller.secondPointVisible.value = false; + controller.thirdPointVisible.value = false; + controller.fourthPointVisible.value = false; + controller.fifthPointVisible.value = false; + controller.sixthPointVisible.value = false; + }, + child: SizedBox( + height: MediaQuery.of(context).size.height / 1.22, + width: MediaQuery.of(context).size.width, + child: Stack( + children: [ + const Positioned( + // left: 60, + bottom: 0, + child: CustomImageWidget( + imagePath: AssetsManager.kEclipseIcon), + ), + const Positioned( + left: 100, + top: 5, + child: CustomImageWidget( + imagePath: AssetsManager.kManBodyImage), + ), + pointWidgets( + leftPosition: 162, + topPosition: 10, + colorOfPoint: CustomAppColors.kRedColor, + onPointTap: () { + controller.firstPointVisible.toggle(); + controller.secondPointVisible.value = false; + controller.thirdPointVisible.value = false; + controller.fourthPointVisible.value = false; + controller.fifthPointVisible.value = false; + controller.sixthPointVisible.value = false; + }, + ), + pointWidgets( + leftPosition: 218, + topPosition: 90, + colorOfPoint: CustomAppColors.kSecondaryColor, + onPointTap: () { + controller.secondPointVisible.toggle(); + controller.firstPointVisible.value = false; + controller.thirdPointVisible.value = false; + controller.fourthPointVisible.value = false; + controller.fifthPointVisible.value = false; + controller.sixthPointVisible.value = false; + }, + ), + pointWidgets( + leftPosition: 118, + topPosition: 140, + colorOfPoint: + CustomAppColors.kRedColor.withAlpha(250), + onPointTap: () { + controller.firstPointVisible.value = false; + controller.secondPointVisible.value = false; + controller.fourthPointVisible.value = false; + controller.fifthPointVisible.value = false; + controller.sixthPointVisible.value = false; + controller.thirdPointVisible.toggle(); + }, + ), + pointWidgets( + leftPosition: 150, + topPosition: 155, + colorOfPoint: + CustomAppColors.kRedColor.withAlpha(250), + onPointTap: () { + controller.firstPointVisible.value = false; + controller.secondPointVisible.value = false; + controller.thirdPointVisible.value = false; + controller.fifthPointVisible.value = false; + controller.sixthPointVisible.value = false; + controller.fourthPointVisible.toggle(); + }, + ), + pointWidgets( + leftPosition: 145, + topPosition: 320, + colorOfPoint: + CustomAppColors.kRedColor.withAlpha(250), + onPointTap: () { + controller.firstPointVisible.value = false; + controller.secondPointVisible.value = false; + controller.thirdPointVisible.value = false; + controller.fourthPointVisible.value = false; + controller.sixthPointVisible.value = false; + controller.fifthPointVisible.toggle(); + }, + ), + pointWidgets( + leftPosition: 190, + bottomPosition: 105, + colorOfPoint: + CustomAppColors.kRedColor.withAlpha(250), + onPointTap: () { + controller.firstPointVisible.value = false; + controller.secondPointVisible.value = false; + controller.thirdPointVisible.value = false; + controller.fourthPointVisible.value = false; + controller.fifthPointVisible.value = false; + controller.sixthPointVisible.toggle(); + }, + ), + triangleView( + leftPosition: 158, + topPosition: 22, + visibility: controller.firstPointVisible, + ), + issueDetailsDialog( + topPosition: 28, + leftPosition: 15, + showTriangle: false, + visibility: controller.firstPointVisible, + healthNote: "Headache", + selectedDropDownValue: + controller.firstPointSelectedDropdownValue, + complaint: "Issue No. 01, Issue No. 02", + lastUpdate: "Jul/0/2023", + ), + triangleView( + leftPosition: 213, + topPosition: 102, + visibility: controller.secondPointVisible, + ), + issueDetailsDialog( + topPosition: 108, + leftPosition: 35, + showTriangle: false, + visibility: controller.secondPointVisible, + healthNote: "Shoulders Muscle Pain", + selectedDropDownValue: + controller.secondPointSelectedDropdownValue, + complaint: "Issue No. 01, Issue No. 02", + lastUpdate: "Jul/0/2023", + ), + triangleView( + leftPosition: 114, + topPosition: 152, + visibility: controller.thirdPointVisible, + ), + issueDetailsDialog( + topPosition: 158, + leftPosition: 10, + showTriangle: false, + visibility: controller.thirdPointVisible, + healthNote: "Elbow Pain", + selectedDropDownValue: + controller.thirdPointSelectedDropdownValue, + complaint: "Issue No. 01, Issue No. 02", + lastUpdate: "Jul/0/2023", + ), + triangleView( + leftPosition: 146, + topPosition: 168, + visibility: controller.fourthPointVisible, + ), + issueDetailsDialog( + topPosition: 175, + leftPosition: 10, + showTriangle: false, + visibility: controller.fourthPointVisible, + healthNote: "Stomach Pain", + selectedDropDownValue: + controller.fourthPointSelectedDropdownValue, + complaint: "Issue No. 01, Issue No. 02", + lastUpdate: "Jul/0/2023", + ), + triangleView( + leftPosition: 140, + topPosition: 333, + visibility: controller.fifthPointVisible, + ), + issueDetailsDialog( + topPosition: 340, + leftPosition: 10, + showTriangle: false, + visibility: controller.fifthPointVisible, + healthNote: "Knee Pain", + selectedDropDownValue: + controller.fifthPointSelectedDropdownValue, + complaint: "Issue No. 01, Issue No. 02", + lastUpdate: "Jul/0/2023", + ), + triangleView( + leftPosition: 185, + bottomPosition: 95, + visibility: controller.sixthPointVisible, + ), + issueDetailsDialog( + topPosition: 430, + leftPosition: 10, + showTriangle: false, + visibility: controller.sixthPointVisible, + healthNote: "Foot Pain", + selectedDropDownValue: + controller.sixthPointSelectedDropdownValue, + complaint: "Issue No. 01, Issue No. 02", + lastUpdate: "Jul/0/2023", + ), + ], + ), + ), + ), + SizedBox( + height: 15.h, + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + Positioned triangleView({ + double? topPosition, + double? bottomPosition, + double? rightPosition, + double? leftPosition, + required RxBool visibility, + bool colorShow = false, + }) { + return Positioned( + top: topPosition, + left: leftPosition, + right: rightPosition, + bottom: bottomPosition, + child: Obx( + () => Container( + color: colorShow ? CustomAppColors.kGreenColor : null, + child: Visibility( + visible: visibility.value, + child: const CustomImageWidget( + imagePath: AssetsManager.kTriangleIcon, + ), + ), + ), + ), + ); + } + + Positioned pointWidgets({ + double? topPosition, + double? bottomPosition, + double? rightPosition, + double? leftPosition, + required Color colorOfPoint, + required VoidCallback onPointTap, + }) { + return Positioned( + top: topPosition, + left: leftPosition, + right: rightPosition, + bottom: bottomPosition, + child: InkWell( + onTap: onPointTap, + child: CircleAvatar( + radius: 5, + backgroundColor: colorOfPoint, + child: const CustomTextWidget( + text: "", + isExpanded: false, + ), + ), + ), + ); + } + + Widget issueDetailsDialog({ + double? topPosition, + double? bottomPosition, + double? rightPosition, + double? leftPosition, + bool showTriangle = true, + required RxBool visibility, + required String healthNote, + required String complaint, + required String lastUpdate, + required RxString selectedDropDownValue, + }) { + return Obx( + () => Positioned( + top: topPosition, + left: leftPosition, + right: rightPosition, + bottom: bottomPosition, + child: Visibility( + visible: visibility.value, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Visibility( + visible: showTriangle, + child: const CustomImageWidget( + imagePath: AssetsManager.kTriangleIcon, + ), + ), + Container( + width: 300, + height: 90, + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightGreyColor), + color: CustomAppColors.kWhiteColor, + boxShadow: [ + BoxShadow( + color: CustomAppColors.kLightGreyColor.withOpacity(0.5), + spreadRadius: 2, + blurRadius: 5, + offset: const Offset(0, 3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.only(left: 10.sp), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: 'Health Note', + isExpanded: false, + fontSize: 12.sp, + ), + CustomTextWidget( + text: healthNote, + fontSize: 14.sp, + fontWeight: FontWeight.bold, + isExpanded: false), + ], + ), + ), + Align( + alignment: Alignment.topRight, + child: Container( + alignment: Alignment.topRight, + margin: EdgeInsets.only(right: 5.w, top: 5.h), + height: 30.h, + width: 60.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30.r), + color: selectedDropDownValue.value + .contains("Expired") + ? CustomAppColors.kRedColor.withAlpha(80) + : CustomAppColors.kGreenColor.withAlpha(80), + ), + child: FittedBox( + fit: BoxFit.scaleDown, + child: DropdownButtonHideUnderline( + child: DropdownButton( + padding: const EdgeInsets.all(0), + borderRadius: BorderRadius.circular(5.r), + isExpanded: false, + items: controller.activeList + .map( + (e) => DropdownMenuItem( + value: e, + child: CustomTextWidget( + alignment: Alignment.center, + fontColor: selectedDropDownValue + .value + .contains("Expired") + ? CustomAppColors.kRedColor + : CustomAppColors.kGreenColor, + text: e.toString(), + isExpanded: false, + ), + ), + ) + .toList(), + value: selectedDropDownValue.value, + onChanged: (value) { + selectedDropDownValue.value = + value.toString(); + }, + ), + ), + ), + ), + ), + // ), + ], + ), + Divider(color: CustomAppColors.kLightGreyColor, height: 5), + Container( + padding: EdgeInsets.only(left: 17.sp, top: 3.sp), + child: Text.rich( + textAlign: TextAlign.left, + TextSpan( + children: [ + TextSpan( + text: "Complaint: ", + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w600), + ), + TextSpan( + text: complaint, + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w400), + ), + ], + ), + ), + ), + Container( + padding: EdgeInsets.only(left: 17.sp, top: 3.sp), + child: Text.rich( + textAlign: TextAlign.left, + TextSpan( + children: [ + TextSpan( + text: "Last Update: ", + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w600), + ), + TextSpan( + text: lastUpdate, + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w400), + ), + ], + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + Widget listHeading() { + return Container( + decoration: const BoxDecoration( + border: Border( + top: BorderSide( + color: CustomAppColors.kSmokeColor, + ), + bottom: BorderSide(color: CustomAppColors.kSmokeColor), + ), + ), + child: Container( + padding: const EdgeInsets.only(left: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + color: CustomAppColors.kBlueColor.withAlpha(150), + border: Border.all(color: CustomAppColors.kBlueColor), + borderRadius: BorderRadius.circular(50.r), + ), + padding: + const EdgeInsets.only(right: 5, left: 5, top: 5, bottom: 5), + child: CustomTextWidget( + textAlign: TextAlign.left, + text: "All Issues", + isExpanded: false, + fontWeight: FontWeight.w400, + fontSize: 14.sp), + ), + Container( + padding: const EdgeInsets.only(right: 0, top: 10, bottom: 10), + child: const CustomTextWidget( + textAlign: TextAlign.left, + text: "Head Pain", + isExpanded: false, + fontWeight: FontWeight.w400), + ), + Container( + padding: const EdgeInsets.only(right: 0, top: 10, bottom: 10), + child: CustomTextWidget( + text: "Nose Bone fracture", + isExpanded: false, + fontWeight: FontWeight.w400, + fontSize: 14.sp), + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/health_screen.dart b/lib/view/screens/clients/clients_new_view_module/health_screen.dart new file mode 100644 index 0000000..4501f38 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/health_screen.dart @@ -0,0 +1,107 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class HealthScreen extends StatefulWidget { + const HealthScreen({Key? key}) : super(key: key); + + @override + State createState() => _HealthScreenState(); +} + +class _HealthScreenState extends State { + final HealthScreenController controller = Get.put(HealthScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Health', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "What are we worried about and why?", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "What can we do to support?", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 140.h), + + Padding( + padding: EdgeInsets.zero, + child: CustomAppButton( + buttonText: ConstantText.kViewFullBodyMap, + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kHealthFullBodyMapScreenRoute); + }, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/introduction_screen.dart b/lib/view/screens/clients/clients_new_view_module/introduction_screen.dart new file mode 100644 index 0000000..4db904c --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/introduction_screen.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import '../../../../ftc_mobile_app.dart'; + +class ClientIntroductionScreen extends StatefulWidget { + const ClientIntroductionScreen({super.key}); + + @override + State createState() => _ClientIntroductionScreenState(); +} + +class _ClientIntroductionScreenState extends State { + ClientsIntroductionScreenController controller = ClientsIntroductionScreenController(); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox(width: 15.w,), + CustomTextWidget( + text: "Introduction", + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + + body: Container( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + // ClipRRect( + // borderRadius: BorderRadius.circular(50.r), + // child: CustomImageWidget( + // imagePath: FrequentFunctions + // .userModel.value.profilePictureUrl.isNotEmpty + // ? "${WebUrls.baseUrl}${FrequentFunctions.userModel.value.profilePictureUrl}" + // : AssetsManager.kPersonMainIcon, + // imageColor: FrequentFunctions + // .userModel.value.profilePictureUrl.isNotEmpty + // ? null + // : CustomAppColors.kLightTextColor, + // height: 80.h, + // width: 80.w, + // ), + // ), + SizedBox(height: 16.h), + CustomTextWidget( + text: 'user', + fontSize: 14.sp, + fontWeight: FontWeight.w600), + SizedBox(height: 16.h), + const Row( + children: [ + Expanded(child: BuildDetailSingleItem(title: 'Email', value: "jaylon.n@ftcservices.com",)), + Expanded(child: BuildDetailSingleItem(title: 'Contact Number', value: "+44 (0) 00 0000 0000",)), + ], + ), + const Row( + children: [ + Expanded(child: BuildDetailSingleItem(title: 'NI Number', value: "QQ 123456 C",)), + Expanded(child: BuildDetailSingleItem(title: 'DOB', value:"15/11/1996")), + ], + ), + const Row( + children: [ + Expanded(child: BuildDetailSingleItem(title: 'Post Code', value: "GL55 8PN",)), + Expanded(child: BuildDetailSingleItem(title: 'Kin', value:"12PO025")), + ], + ), + const Row( + children: [ + BuildDetailSingleItem(title: 'Address', value: "Gloucester, 1-2 Street Name",), + ], + ), + SizedBox(height: 16.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + + ], + ), + ), + ), + ), + ); + + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/medication_screen.dart b/lib/view/screens/clients/clients_new_view_module/medication_screen.dart new file mode 100644 index 0000000..e1fab25 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/medication_screen.dart @@ -0,0 +1,152 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class MedicationScreen extends StatefulWidget { + const MedicationScreen({super.key}); + + @override + State createState() => _MedicationScreenState(); +} + +class _MedicationScreenState extends State { + final MedicationScreenController controller = + Get.put(MedicationScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton:()=> controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap:()=> controller.backButtonPressed(context), + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Medication', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + totalMedicinesNameRowField( + normalText: "Total medicines:", boldText: "2"), + SizedBox(height: 4.h), + + SizedBox(height: 24.h), + medicationHeading(headingText: "Pregabalin 50mg"), + SizedBox(height: 24.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + Divider(), + SizedBox(height: 8.h), + medicationHeading(headingText: "Lamotrigene"), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } + + ListTile medicationHeading({required String headingText}) { + return ListTile( + contentPadding: EdgeInsets.only(left: 12.w, right: 0.w), + title: CustomTextWidget( + text: headingText, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + // tileColor: Colors.black.withOpacity(0.2), + trailing: SizedBox( + width: 60.w, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () {}, + child: Container( + padding: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + color: CustomAppColors.kYellowColor.withOpacity(0.5), + borderRadius: BorderRadius.circular(50.r), + ), + child: const Icon(Icons.edit,color: CustomAppColors.kDarkYellowColor,)), + ), + SizedBox(width: 3.w,), + InkWell( + onTap: () {}, + child: Container( + padding: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + color: CustomAppColors.kRedColor.withOpacity(0.5), + borderRadius: BorderRadius.circular(50.r), + ), + child: const Icon(Icons.delete,color: CustomAppColors.kRedColor,)), + ), + ], + ), + ), + ); + } + + Row totalMedicinesNameRowField({required String boldText, required String normalText}) { + return Row( + children: [ + CustomTextWidget( + text: normalText, + isExpanded: false, + fontWeight: FontWeight.w400, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + + CustomTextWidget( + text: boldText, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + ], + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/mental_health_screen.dart b/lib/view/screens/clients/clients_new_view_module/mental_health_screen.dart new file mode 100644 index 0000000..2a8667d --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/mental_health_screen.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class MentalHealthScreen extends StatefulWidget { + const MentalHealthScreen({Key? key}) : super(key: key); + + @override + State createState() => _MentalHealthScreenState(); +} + +class _MentalHealthScreenState extends State { + final MentalHealthScreenController controller = Get.put(MentalHealthScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Mental Health', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "the current presentation of mental health", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "Need Support to my current mental health", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/my_current_plan_screen.dart b/lib/view/screens/clients/clients_new_view_module/my_current_plan_screen.dart new file mode 100644 index 0000000..783dfc8 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/my_current_plan_screen.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class MyCurrentPlanScreen extends StatefulWidget { + const MyCurrentPlanScreen({Key? key}) : super(key: key); + + @override + State createState() => _MyCurrentPlanScreenState(); +} + +class _MyCurrentPlanScreenState extends State { + final MyCurrentPlanScreenController controller = Get.put(MyCurrentPlanScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'My current plan', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "My current plan", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "Current support that I need", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/my_interests_screen.dart b/lib/view/screens/clients/clients_new_view_module/my_interests_screen.dart new file mode 100644 index 0000000..44413b3 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/my_interests_screen.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class MyInterestsScreen extends StatefulWidget { + const MyInterestsScreen({Key? key}) : super(key: key); + + @override + State createState() => _MyInterestsScreenState(); +} + +class _MyInterestsScreenState extends State { + final MyInterestsScreenController controller = Get.put(MyInterestsScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'My Interests', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "Things I like doing", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "How I can support these activities?", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/overview_screen.dart b/lib/view/screens/clients/clients_new_view_module/overview_screen.dart new file mode 100644 index 0000000..7ea66e1 --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/overview_screen.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class OverviewScreen extends StatefulWidget { + const OverviewScreen({Key? key}) : super(key: key); + + @override + State createState() => _OverviewScreenState(); +} + +class _OverviewScreenState extends State { + final OverViewScreenController controller = + Get.put(OverViewScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Overview (What I want you to know about me)', + isExpanded: false, + fontSize: 13.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "What I want you to know about me", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "Current support that I need", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/support_plan_screen.dart b/lib/view/screens/clients/clients_new_view_module/support_plan_screen.dart new file mode 100644 index 0000000..d080f0f --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/support_plan_screen.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../ftc_mobile_app.dart'; + +class SupportPlanScreen extends StatefulWidget { + const SupportPlanScreen({Key? key}) : super(key: key); + + @override + State createState() => _SupportPlanScreenState(); +} + +class _SupportPlanScreenState extends State { + SupportPlanScreenController controller = + Get.put(SupportPlanScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox(width: 15.w,), + CustomTextWidget( + text: 'Support Plan Menu', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Center( + child: SingleChildScrollView( + child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: 16.h), + LineWidget( + text: "Medications", + onItemTap: () { + Navigator.pushNamed(context, + CustomRouteNames.kMedicationScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "Mental Health",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kMentalHealthScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "Future Plans",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kFuturePlansScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "Introduction",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kClientsIntroductionScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "Overview",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kOverViewScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "My Current Plan",onItemTap:(){ + Navigator.pushNamed(context, CustomRouteNames.kMyCurrentPlanScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "Things I want you to help me with",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kThingsIWantYouToHelpScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "My interests",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kMyInterestsScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "Health",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kHealthScreenRoute); + }), + SizedBox(height: 5.h,), + LineWidget(text: "Crisis Management",onItemTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kCrisisManagementScreenRoute); + }), + SizedBox(height: 5.h,), + + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/clients_new_view_module/things_i_want_you_to_help_me_screen.dart b/lib/view/screens/clients/clients_new_view_module/things_i_want_you_to_help_me_screen.dart new file mode 100644 index 0000000..50b943c --- /dev/null +++ b/lib/view/screens/clients/clients_new_view_module/things_i_want_you_to_help_me_screen.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../ftc_mobile_app.dart'; + +class ThingsIWantYouToHelpScreen extends StatefulWidget { + const ThingsIWantYouToHelpScreen({Key? key}) : super(key: key); + + @override + State createState() => _ThingsIWantYouToHelpScreenState(); +} + +class _ThingsIWantYouToHelpScreenState extends State { + final ThingsIWantYouToHelpMeWithScreenController controller = + Get.put(ThingsIWantYouToHelpMeWithScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Things I want you to help me with', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "Things I want you to help me with", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took"), + SizedBox(height: 8.h), + CustomTextWidget( + text: "How I can help?", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + SizedBox(height: 8.h), + CustomTextWidget( + fontSize: 14.sp, + textAlign: TextAlign.left, + isExpanded: false, + text: + "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus."), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/consent_and_capacity_add_new_form_screen.dart b/lib/view/screens/clients/consent_and_capacity_add_new_form_screen.dart new file mode 100644 index 0000000..5d1ac23 --- /dev/null +++ b/lib/view/screens/clients/consent_and_capacity_add_new_form_screen.dart @@ -0,0 +1,317 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../../ftc_mobile_app.dart'; +import '../../../models/clients/consent_details_model.dart'; +import '../../../models/profileData/user_data.dart'; + +class ConsentAndCapacityAddNewFormScreenArgs { + final UserData userData; + final ConsentDetailsModel? consentData; + + ConsentAndCapacityAddNewFormScreenArgs({ + required this.userData, + this.consentData, + }); +} + +class ConsentAndCapacityAddNewFormScreen extends StatefulWidget { + final ConsentAndCapacityAddNewFormScreenArgs args; + + const ConsentAndCapacityAddNewFormScreen({Key? key, required this.args}) + : super(key: key); + + @override + State createState() => + _ConsentAndCapacityAddNewFormScreenState(); +} + +class _ConsentAndCapacityAddNewFormScreenState + extends State { + final controller = Get.put(ConsentAndCapacityAddNewFormScreenController()); + + @override + void initState() { + controller.isForUpdate.value = (widget.args.consentData != null); + + controller.firstNameController.text = + widget.args.userData.modelId?.suFirstMiddleName ?? ""; + controller.lastNameController.text = + widget.args.userData.modelId?.suLastName ?? ""; + controller.phoneController.text = + widget.args.userData.modelId?.phoneNo ?? ""; + controller.emailController.text = + widget.args.userData.modelId?.suEmailWork ?? ""; + controller.genderController.text = + widget.args.userData.modelId?.suSex ?? ""; + controller.dobController.text = (widget.args.userData.modelId?.suDob == + null) + ? "" + : DateFormat("MMM/dd/yyyy").format(widget.args.userData.modelId!.suDob); + controller.ageController.text = widget.args.userData.modelId?.suAge ?? ""; + controller.descriptionController.text = + widget.args.consentData?.description ?? ""; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Column( + children: [ + Row( + children: [ + InkWell( + onTap: () => controller.backButtonPressed(context), + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + 15.horizontalSpace, + Obx( + () => CustomTextWidget( + text: controller.isForUpdate.value + ? 'Update Consent And Capacity' + : 'Consent And Capacity', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ), + ], + ), + CustomTextWidget( + alignment: Alignment.topLeft, + textAlign: TextAlign.left, + text: ' Add New Form', + isExpanded: false, + fontSize: 12.sp, + fontColor: CustomAppColors.kLightGreyColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "Young Information", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + 20.verticalSpace, + _textField( + controller: controller.firstNameController, + enabled: false, + headingText: "First & Middle Name", + hintText: "First & Middle Name", + ), + 20.verticalSpace, + _textField( + controller: controller.lastNameController, + enabled: false, + headingText: "Last Name", + hintText: "Last Name", + ), + 20.verticalSpace, + _textField( + controller: controller.phoneController, + enabled: false, + headingText: "Phone No.", + hintText: "Phone No.", + ), + 20.verticalSpace, + _textField( + controller: controller.emailController, + enabled: false, + headingText: "Email", + hintText: "Email", + ), + 20.verticalSpace, + _textField( + controller: controller.genderController, + enabled: false, + headingText: "Sex", + hintText: "Sex", + ), + 20.verticalSpace, + Row( + children: [ + Expanded( + flex: 2, + child: _textField( + controller: controller.dobController, + enabled: false, + headingText: "Date Of Birth", + hintText: "Date Of Birth", + ), + ), + 10.horizontalSpace, + Expanded( + flex: 1, + child: _textField( + controller: controller.ageController, + enabled: false, + headingText: "Age", + hintText: "Age", + ), + ), + ], + ), + 20.verticalSpace, + CustomTextFieldWidget( + controller: controller.descriptionController, + heading: "Description", + minLines: 4, + maxLines: 4, + ), + 20.verticalSpace, + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.r), + ), + backgroundColor: CustomAppColors.kSecondaryColor), + onPressed: () async { + controller.isForUpdate.value + ? controller.updateButtonPressed( + widget.args.consentData!.id) + : await controller + .saveButtonPressed(widget.args.userData.id!); + + Navigator.of(context).pop(controller.isForUpdate.value + ? controller.descriptionController.text + : controller.saveResult); + }, + child: Obx( + () => CustomTextWidget( + text: controller.isForUpdate.value + ? "Update" + : 'Save', + fontColor: CustomAppColors.kPrimaryColor), + ), + ), + ), + 5.horizontalSpace, + Expanded( + child: ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + side: const BorderSide( + color: CustomAppColors.kSecondaryColor), + borderRadius: BorderRadius.circular(5.r), + ), + backgroundColor: CustomAppColors.kPrimaryColor, + ), + onPressed: () { + Navigator.of(context).pop(); + }, + child: CustomTextWidget( + text: 'Cancel', + fontColor: CustomAppColors.kSecondaryColor, + fontSize: 15.sp, + ), + ), + ), + ], + ), + 20.verticalSpace, + ], + ), + ), + ), + ); + } + + TextField _textField({ + required String headingText, + required String hintText, + int minLines = 1, + int maxLines = 1, + TextEditingController? controller, + bool enabled = true, + TextInputType? inputType, + }) { + return TextField( + enabled: enabled, + maxLines: maxLines, + minLines: minLines, + controller: controller, + textAlign: TextAlign.left, + keyboardType: inputType, + decoration: InputDecoration( + isDense: true, + border: const OutlineInputBorder(), + hintText: hintText, + labelText: headingText, + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} + +class ConsentScreenTextField extends StatelessWidget { + const ConsentScreenTextField({ + super.key, + required this.headingText, + required this.hintText, + this.minLines, + this.maxLines, + this.fieldIcon, + this.fieldController, + this.viewOnly, + }); + + final String headingText; + + final String hintText; + + final int? minLines; + final int? maxLines; + final IconData? fieldIcon; + final bool? viewOnly; + final TextEditingController? fieldController; + + @override + Widget build(BuildContext context) { + return TextField( + enabled: !(viewOnly != null ? viewOnly == true : fieldController == null), + maxLines: maxLines, + minLines: minLines, + textAlign: TextAlign.left, + controller: fieldController ?? (TextEditingController()..text = hintText), + decoration: InputDecoration( + suffixIcon: Icon(fieldIcon), + border: const OutlineInputBorder(), + hintText: hintText, + labelText: headingText, + ), + ); + } +} diff --git a/lib/view/screens/clients/consent_and_capacity_questionnaire_screen.dart b/lib/view/screens/clients/consent_and_capacity_questionnaire_screen.dart new file mode 100644 index 0000000..0f34c9f --- /dev/null +++ b/lib/view/screens/clients/consent_and_capacity_questionnaire_screen.dart @@ -0,0 +1,225 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/custom_app_bar_with_action.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../../ftc_mobile_app.dart'; +import '../../../models/clients/consent_details_model.dart'; +import '../../../models/profileData/user_data.dart'; + +class ConsentAndCapacityQuestionnaireScreen extends StatefulWidget { + final UserData userData; + + const ConsentAndCapacityQuestionnaireScreen( + {Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => + _ConsentAndCapacityQuestionnaireScreenState(); +} + +class _ConsentAndCapacityQuestionnaireScreenState + extends State { + late final ConsentAndCapacityQuestionnaireScreenController controller; + + @override + void initState() { + controller = Get.put( + ConsentAndCapacityQuestionnaireScreenController(data: widget.userData)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + // onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + // sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: _appBar(context), + body: SafeArea( + child: Obx(() { + if (controller.serviceUser() == null) { + return FrequentFunctions.centerText(text: "User detail not found"); + } + + final detail = controller.serviceUser()!; + return Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget( + text: "Questionnaire", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + 16.verticalSpace, + nameRowField(boldText: "Name:", normalText: detail.displayName), + 4.verticalSpace, + nameRowField( + boldText: "DOB:", + normalText: detail.modelId?.suDob == null + ? "" + : DateFormatter() + .getHolidayDate(detail.modelId!.suDob)), + 4.verticalSpace, + nameRowField( + boldText: "Sex:", + normalText: detail.modelId?.suSex ?? ""), + 4.verticalSpace, + nameRowField( + boldText: "Contact No:", + normalText: detail.modelId?.phoneNo ?? ""), + 4.verticalSpace, + nameRowField( + boldText: "Email:", + normalText: detail.modelId?.suEmailWork ?? ""), + 24.verticalSpace, + Obx( + () => ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (context, index) => 8.verticalSpace, + itemCount: controller.consentDetailsList.length, + itemBuilder: (BuildContext context, int index) { + return _listItem( + index, controller.consentDetailsList[index]); + }, + ), + ), + 24.verticalSpace, + ], + ), + ), + ); + }), + ), + ); + } + + AppBar _appBar(BuildContext context) { + return CustomAppBarWithAction( + context, + titleText: "Consent And Capacity", + actionText: '+ Add New', + onActionTap: () async { + final result = await Navigator.pushNamed( + context, CustomRouteNames.kConsentAndCapacityAddNewFormScreenRoute, + arguments: ConsentAndCapacityAddNewFormScreenArgs( + userData: widget.userData, + )); + if (result is ConsentDetailsModel) { + controller.consentDetailsList.insert(0, result); + } + }, + ); + } + + Widget _listItem(int index, ConsentDetailsModel data) { + return Container( + key: ObjectKey(data), + decoration: BoxDecoration( + color: CustomAppColors.kLightGreyColor.withOpacity(0.2), + ), + padding: REdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + CustomTextWidget( + text: data.description, + isExpanded: false, + textAlign: TextAlign.left, + fontSize: 16, + ).paddingSymmetric(horizontal: 8.r), + 6.verticalSpace, + Row( + children: [ + Expanded( + child: CustomTextWidget( + text: DateFormat("dd/MM/yyyy / hh:mm:ss aa") + .format(data.updatedAt) + .toUpperCase(), + isExpanded: false, + textAlign: TextAlign.left, + fontSize: 14, + ).paddingSymmetric(horizontal: 8.r), + ), + // InkWell( + // borderRadius: 24.toRadius(), + // onTap: () { + // _onEditClick(index, data); + // }, + // child: + // Icon(Icons.mode_edit_outlined, size: 22.r).addPaddingAll(4), + // ), + + ], + ) + ], + ), + ); + } + + Row nameRowField({required String boldText, required String normalText}) { + return Row( + children: [ + CustomTextWidget( + text: boldText, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 16.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + 8.horizontalSpace, + Expanded( + child: CustomTextWidget( + text: normalText, + isExpanded: false, + fontWeight: FontWeight.w400, + fontSize: 14.sp, + textAlign: TextAlign.left, + alignment: Alignment.topLeft), + ), + ], + ); + } + + _onEditClick(int index, ConsentDetailsModel data) async { + final result = await Navigator.pushNamed( + context, + CustomRouteNames.kConsentAndCapacityAddNewFormScreenRoute, + arguments: ConsentAndCapacityAddNewFormScreenArgs( + userData: widget.userData, + consentData: data, + ), + ); + + if (result is String) { + controller.consentDetailsList[index].description = result; + controller.consentDetailsList.refresh(); + } + // MultilineTextFieldSheet( + // buttonLabel: 'Submit', + // appBarTitle: '', + // textFieldHint: 'Type here...', + // prevValueForField: data.description, + // wantLeadingIcon: false, + // onButtonClick: (String text) { + // controller.updateButtonPressed(text, data.id, index); + // }, + // ).show(); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/currentHealthIssues/current_health_issues_screen.dart b/lib/view/screens/clients/currentHealthIssues/current_health_issues_screen.dart new file mode 100644 index 0000000..58ebb82 --- /dev/null +++ b/lib/view/screens/clients/currentHealthIssues/current_health_issues_screen.dart @@ -0,0 +1,241 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/HealthIssuesDetailsModel.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/enums/body_parts.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/custom_app_bar_with_action.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/human_body_mapper_widget.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:get/get.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import '../add_details_to_new_body_point_screen.dart'; +import 'widget/IssueDetailPopupWidget.dart'; + +class CurrentHealthIssuesScreen extends StatefulWidget { + final UserData userData; + + const CurrentHealthIssuesScreen({Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => + _CurrentHealthIssuesScreenState(); +} + +class _CurrentHealthIssuesScreenState extends State { + final CurrentHealthIssuesScreenController controller = + Get.put(CurrentHealthIssuesScreenController()); + + @override + void initState() { + controller.serviceUserId = widget.userData.id!; + + super.initState(); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: controller.tabs.length, + child: CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + onBackButton: () => controller.onBackPress(context), + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: _appBar(context), + body: SingleChildScrollView( + child: Column( + children: [ + //User details + serviceUserDetailWidget(), + + Divider( + height: 1, + color: CustomAppColors.kLightGreyColor, + ), + TabBar( + onTap: (i) { + controller.onTabChange(controller.tabs[i]); + }, + tabs: controller.tabs + .map((e) => Tab( + text: e, + )) + .toList()), + Divider( + height: 1, + color: CustomAppColors.kLightGreyColor, + ), + 8.verticalSpace, + Obx(() { + final entries = controller.issueBodyParts.entries; + + if (entries.isEmpty) { + return FrequentFunctions.noWidget; + } + + final map = {}; + for (var e in entries) { + map[e.key] = e.value.color; + } + + return HumanBodyWidget( + visibleBodyPoints: map, + width: Get.width * 0.9, + onPointTap: (b, p) { + RenderBox? overlay = Overlay.of(context) + .context + .findRenderObject() as RenderBox?; + + showMenu( + context: context, + surfaceTintColor: Colors.white, + position: RelativeRect.fromRect( + p & const Size(40, 40), + // Smaller rect, the touch area + Offset.zero & + (overlay?.size ?? + Get.mediaQuery + .size), // Bigger rect, the entire screen + ), + items: [ + PopupMenuItem( + padding: EdgeInsets.zero, + child: IssueDetailPopupWidget( + userData: widget.userData, + data: controller.issueBodyParts[b]!.data, + onActionChange: (status, data) { + if (data.status != status) { + controller.updateHealthIssueStatus( + bodyPoint: b, data: data, status: status); + } + }, + onUpdateButtonTap: (data) async { + Get.back(); + onAddOrUpdateButtonTap(context, data); + }, + ), + ), + ]); + }, + ); + }), + ], + ), + ), + ), + ); + } + + AppBar _appBar(BuildContext context) { + return CustomAppBarWithAction( + context, + titleText: "Current Health Issues", + actionText: '+ Add New', + onActionTap: () => onAddOrUpdateButtonTap(context), + ); + } + + Widget serviceUserDetailWidget() { + return Padding( + padding: REdgeInsets.symmetric(horizontal: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Align( + alignment: Alignment.center, + child: MyCircleImage( + imageSize: 80.r, + url: + "${WebUrls.baseUrl}${widget.userData.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 53.r, + width: 53.r, + ), + ), + ), + 10.verticalSpace, + CustomTextWidget( + text: widget.userData.displayName, + fontSize: 14.sp, + fontWeight: FontWeight.w600), + 32.verticalSpace, + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: _labelValueWidgets( + 'Email:', + widget.userData.email ?? "", + ), + )), + 8.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: _labelValueWidgets( + 'Contact Number:', + widget.userData.modelId?.phoneNo ?? "", + ), + )), + ], + ), + 16.verticalSpace, + ..._labelValueWidgets( + 'Address 1:', + widget.userData.modelId?.suAddress1 ?? "", + ), + 16.verticalSpace, + ..._labelValueWidgets( + 'Address 2:', + widget.userData.modelId?.suAddress2 ?? "", + ), + 16.verticalSpace, + ], + ), + ); + } + + List _labelValueWidgets(String label, String value) { + return [ + CustomTextWidget( + textAlign: TextAlign.left, + isExpanded: false, + text: label, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + fontSize: 12.sp), + 4.verticalSpace, + CustomTextWidget( + textAlign: TextAlign.left, + text: value, + isExpanded: false, + fontWeight: FontWeight.w400, + fontColor: CustomAppColors.kBlackColor, + fontSize: 13.sp), + ]; + } + + Future onAddOrUpdateButtonTap(BuildContext context, + [HealthIssueDetailsModel? data]) async { + dynamic result = await Navigator.of(context) + .pushNamed(CustomRouteNames.kAddDetailsToNewPointScreenRoute, + arguments: AddDetailsToNewBodyPointScreenArgs( + userData: widget.userData, + issueData: data, + )); + if (result == true) { + controller.getPointsDataFromService(); + } + } +} diff --git a/lib/view/screens/clients/currentHealthIssues/widget/IssueDetailPopupWidget.dart b/lib/view/screens/clients/currentHealthIssues/widget/IssueDetailPopupWidget.dart new file mode 100644 index 0000000..de3dce6 --- /dev/null +++ b/lib/view/screens/clients/currentHealthIssues/widget/IssueDetailPopupWidget.dart @@ -0,0 +1,260 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/HealthIssuesDetailsModel.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +class IssueDetailPopupWidget extends StatefulWidget { + const IssueDetailPopupWidget({ + super.key, + required this.userData, + required this.data, + required this.onActionChange, + required this.onUpdateButtonTap, + }); + + final UserData userData; + final HealthIssueDetailsModel data; + final Function(bool status, HealthIssueDetailsModel data) onActionChange; + final Function(HealthIssueDetailsModel data) onUpdateButtonTap; + + static const actionActive = "Active"; + static const actionResolved = "Resolved"; + + @override + State createState() => _IssueDetailPopupWidgetState(); +} + +class _IssueDetailPopupWidgetState extends State { + final Map actionsMap = { + IssueDetailPopupWidget.actionActive: true, + IssueDetailPopupWidget.actionResolved: false + }; + + String selectedValue = IssueDetailPopupWidget.actionActive; + + @override + void initState() { + selectedValue = widget.data.status + ? IssueDetailPopupWidget.actionActive + : IssueDetailPopupWidget.actionResolved; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + width: Get.width, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.maxFinite, + padding: REdgeInsets.symmetric(horizontal: 12), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Health Note', + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w400, + ), + ), + CustomTextWidget( + text: widget.data.healthNote, + fontSize: 14.sp, + fontWeight: FontWeight.bold, + textAlign: TextAlign.left, + isExpanded: false), + ], + ), + ), + Container( + width: 90.r, + height: 32.r, + decoration: BoxDecoration( + borderRadius: 24.toRadius(), + color: (selectedValue == + IssueDetailPopupWidget.actionActive) + ? Colors.red.withOpacity(0.3) + : Colors.green.withOpacity(0.3), + ), + child: DropdownButtonHideUnderline( + child: DropdownButtonFormField( + onTap: () { + FocusScopeNode().unfocus(); + }, + value: selectedValue, + dropdownColor: Colors.white, + borderRadius: 4.toRadius(), + decoration: InputDecoration( + isDense: true, + border: InputBorder.none, + suffixIcon: Icon(Icons.arrow_drop_down_sharp, + size: 18, + color: (selectedValue == + IssueDetailPopupWidget.actionActive) + ? Colors.red + : Colors.green) + .paddingOnly(right: 12.r), + suffixIconConstraints: BoxConstraints.tightFor( + width: 24.r, height: 32.r), + // contentPadding: REdgeInsets.only(left: 0), + ), + elevation: 4, + icon: FrequentFunctions.noWidget, + style: TextStyle( + fontWeight: FontWeight.w400, + fontSize: 10.sp, + color: Colors.black), + hint: Text( + "Select...", + style: TextStyle( + fontWeight: FontWeight.w400, + fontSize: 12.sp, + color: CustomAppColors.kLightTextColor, + ), + ), + selectedItemBuilder: (_) { + return actionsMap.keys.map( + (e) { + return DropdownMenuItem( + value: e, + child: Container( + // color: (selectedValue == e) + // ? (selectedValue == + // IssueDetailPopupWidget + // .actionActive) + // ? Colors.red.withOpacity(0.3) + // : Colors.green.withOpacity(0.3) + // : Colors.white, + alignment: Alignment.center, + child: Text( + e, + style: TextStyle( + color: (selectedValue == e) + ? (selectedValue == + IssueDetailPopupWidget + .actionActive) + ? Colors.red + : Colors.green + : Colors.black), + ), + ), + ); + }, + ).toList(); + }, + items: actionsMap.keys + .map( + (e) => DropdownMenuItem( + value: e, + child: Text(e), + ), + ) + .toList(), + // padding: EdgeInsets.zero, + isExpanded: true, + // iconSize: 20.h, + // icon: Padding( + // padding: REdgeInsets.only(right: 0.0), + // child: Icon(Icons.arrow_drop_down_sharp, + // size: 18, + // color: Colors.black), + // ), + onChanged: (v) { + if (v != null) { + setState(() { + selectedValue = v; + widget.onActionChange( + actionsMap[v]!, widget.data); + }); + } + }, + ), + ), + ) + ], + ), + ), + 8.verticalSpace, + Divider( + height: 1, + color: Colors.grey.withOpacity(0.3), + ), + Container( + width: double.maxFinite, + padding: REdgeInsets.symmetric(horizontal: 12, vertical: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text.rich( + textAlign: TextAlign.left, + TextSpan( + children: [ + TextSpan( + text: "Complaint: ", + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w600), + ), + TextSpan( + text: widget.data.complaint, + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w400), + ), + ], + ), + ), + 4.verticalSpace, + Text.rich( + textAlign: TextAlign.left, + TextSpan( + children: [ + TextSpan( + text: "Last Update: ", + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w600), + ), + TextSpan( + text: DateFormat("MMM/dd/yyyy").format( + DateTime.parse(widget.data.updatedAt) + .toLocal()), + style: TextStyle( + fontSize: 12.sp, fontWeight: FontWeight.w400), + ), + ], + ), + ), + ], + ), + ), + 16.verticalSpace, + Center( + child: SizedBox( + width: 120.r, + height: 32.r, + child: CustomAppButton( + onTap: () => widget.onUpdateButtonTap(widget.data), + buttonText: "Update", + ), + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/view/screens/clients/document_details_screen.dart b/lib/view/screens/clients/document_details_screen.dart new file mode 100644 index 0000000..7415ac0 --- /dev/null +++ b/lib/view/screens/clients/document_details_screen.dart @@ -0,0 +1,363 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; + +class DocumentDetailsScreen extends StatefulWidget { + const DocumentDetailsScreen({Key? key}) : super(key: key); + + @override + State createState() => _DocumentDetailsScreenState(); +} + +class _DocumentDetailsScreenState extends State { + final DocumentDetailsScreenController controller = + Get.put(DocumentDetailsScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Documents', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + const Spacer(), + InkWell( + onTap: () async { + // await Navigator.pushNamed( + // controller.screenKey.currentContext!, + // CustomRouteNames.kNewNoteScreenRoute, + // ); + }, + child: CustomTextWidget( + text: '+ Add New', + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + ), + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: SingleChildScrollView( + child: Column( + children: [ + // ClipRRect( + // borderRadius: BorderRadius.circular(50.r), + // child: CustomImageWidget( + // imagePath: FrequentFunctions + // .userModel.value.profilePictureUrl.isNotEmpty + // ? "${WebUrls.baseUrl}${FrequentFunctions.userModel.value.profilePictureUrl}" + // : AssetsManager.kPersonMainIcon, + // imageColor: FrequentFunctions + // .userModel.value.profilePictureUrl.isNotEmpty + // ? null + // : CustomAppColors.kLightTextColor, + // height: 80.h, + // width: 80.w, + // ), + // ), + SizedBox(height: 16.h), + CustomTextWidget( + text: 'user', fontSize: 14.sp, fontWeight: FontWeight.w600), + SizedBox(height: 16.h), + const Row( + children: [ + Expanded( + child: BuildDetailSingleItem( + title: 'Email', + value: "jaylon.n@ftcservices.com", + )), + Expanded( + child: BuildDetailSingleItem( + title: 'Contact Number', + value: "+44 (0) 00 0000 0000", + )), + ], + ), + const Row( + children: [ + Expanded( + child: BuildDetailSingleItem( + title: 'NI Number', + value: "QQ 123456 C", + )), + Expanded( + child: BuildDetailSingleItem( + title: 'DOB', value: "15/11/1996")), + ], + ), + const Row( + children: [ + Expanded( + child: BuildDetailSingleItem( + title: 'Post Code', + value: "GL55 8PN", + )), + Expanded( + child: BuildDetailSingleItem( + title: 'Kin', value: "12PO025")), + ], + ), + const Row( + children: [ + BuildDetailSingleItem( + title: 'Address', + value: "Gloucester, 1-2 Street Name", + ), + ], + ), + SizedBox(height: 16.h), + Container( + height: 30, + margin: EdgeInsets.symmetric(horizontal: 5.w, vertical: 10.h), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kDarkBlueTextColor, + ), + borderRadius: BorderRadius.circular(5.r), + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.only(left: 5, right: 10), + child: const Center( + child: Icon(Icons.search), + ), + ), + CustomTextWidget( + text: "Search...", + fontSize: 18.sp, + fontWeight: FontWeight.w400, + fontColor: CustomAppColors.kLightGreyColor, + isExpanded: false, + ), + ], + ), + ), + SizedBox(height: 8.h), + SizedBox( + width: MediaQuery.of(context).size.width, + child: Column( + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + listHeading(), + listItemWidget( + text1: "Health Report and data", + text3: "Aug/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Sept/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Aug/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Sept/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Aug/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Sept/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Aug/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Sept/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Aug/01/2024", + color: false), + listItemWidget( + text1: "Health Report and data", + text3: "Sept/01/2024", + color: false), + ], + ), + ) + ], + ), + ), + ), + ); + } + + Widget listHeading() { + return Container( + decoration: const BoxDecoration( + border: Border( + top: BorderSide( + color: CustomAppColors.kSmokeColor, + ), + bottom: BorderSide(color: CustomAppColors.kSmokeColor), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 2, + child: Container( + padding: const EdgeInsets.only(right: 0, top: 10, bottom: 10), + child: const CustomTextWidget( + textAlign: TextAlign.left, + text: "All Documents", + isExpanded: false, + fontWeight: FontWeight.w700), + ), + ), + Expanded( + flex: 1, + child: Container( + padding: const EdgeInsets.only(right: 0, top: 10, bottom: 10), + child: CustomTextWidget( + text: "+ Add New", + isExpanded: false, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightGreyColor), + ), + ), + ], + ), + ); + } + + Widget listItemWidget( + {required String text1, required String text3, required bool color}) { + return Container( + decoration: BoxDecoration( + color: color ? CustomAppColors.kBlueColor.withAlpha(20) : null, + border: const Border( + top: BorderSide( + color: CustomAppColors.kSmokeColor, + ), + bottom: BorderSide(color: CustomAppColors.kSmokeColor), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 2, + child: Container( + padding: const EdgeInsets.only(top: 10, bottom: 10), + child: Row( + children: [ + const CustomImageWidget(imagePath: AssetsManager.kFolderIcon), + SizedBox( + width: 5.sp, + ), + Container( + padding: const EdgeInsets.only( + left: 5, + ), + child: CustomTextWidget( + text: text1, + textAlign: TextAlign.left, + fontSize: 11.sp, + isExpanded: false, + ), + ), + ], + ), + ), + ), + Expanded( + flex: 1, + child: Container( + padding: const EdgeInsets.only(top: 10, bottom: 10, left: 3), + child: CustomTextWidget( + text: text3, + fontSize: 11.sp, + isExpanded: false, + ), + ), + ), + ], + ), + ); + } +} + +class BuildDetailSingleItem extends StatelessWidget { + const BuildDetailSingleItem({ + super.key, + required this.title, + required this.value, + }); + + final String title; + final String value; + + @override + Widget build(BuildContext context) { + return Container( + height: 52.h, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 5.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + textAlign: TextAlign.left, + isExpanded: false, + text: '$title: ', + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + fontSize: 12.sp), + const Spacer(), + CustomTextWidget( + textAlign: TextAlign.left, + text: value, + isExpanded: false, + fontWeight: FontWeight.w400, + fontColor: CustomAppColors.kBlackColor, + fontSize: + title.toLowerCase().contains("email") ? 11.sp : 13.sp), + ], + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/documentsList/documents_list_screen.dart b/lib/view/screens/clients/documentsList/documents_list_screen.dart new file mode 100644 index 0000000..3a2baa6 --- /dev/null +++ b/lib/view/screens/clients/documentsList/documents_list_screen.dart @@ -0,0 +1,202 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/documents_list_model.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/custom_app_bar_with_action.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/edit_icon.dart'; +import 'package:ftc_mobile_app/view/screens/clientsListing/widgets/search_bar_widget.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +class DocumentsListScreen extends StatefulWidget { + final UserData userData; + + const DocumentsListScreen({Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => _DocumentsListScreenState(); +} + +class _DocumentsListScreenState extends State { + late final DocumentsListScreenController controller; + + @override + void initState() { + controller = Get.put(DocumentsListScreenController(widget.userData)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + appBar: _appBar(context), + body: Column( + children: [ + SearchBarWidget( + controller: controller.searchTEC, + onSearchTextChange: controller.onSearch, + ), + Expanded( + child: Obx( + () { + return controller.documentsList.isEmpty + ? FrequentFunctions.centerText(text: "No data found") + : listView(); + }, + ), + ), + ], + ), + ); + } + + AppBar _appBar(BuildContext context) { + return CustomAppBarWithAction( + context, + titleText: "Documents", + actionText: '+ Add New', + onActionTap: () async { + dynamic response = await Navigator.pushNamed( + context, CustomRouteNames.kAddNewDocumentScreenRoute, + arguments: controller.serviceUser.value); + if (response is DocumentModel) { + controller.documentsList.insert(0, response); + controller.documentsList.refresh(); + } + }, + ); + } + + Widget _tableHeading(String text) { + return TableCell( + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 12, vertical: 12), + child: Text( + text, + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + ); + } + + Widget listView() { + return InteractiveViewer( + constrained: false, + scaleEnabled: false, + child: SizedBox( + width: Get.width + 100.r, + child: Table( + border: TableBorder.all( + color: CustomAppColors.kSmokeColor, + ), + columnWidths: const { + 0: FlexColumnWidth(30.2), + 1: FlexColumnWidth(35.0), + 2: FlexColumnWidth(25.0), + // 3: FlexColumnWidth(15.0), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + children: [ + TableRow( + children: [ + _tableHeading("Document Name"), + _tableHeading("Details"), + _tableHeading("Date"), + // _tableHeading("Actions"), + ], + ), + ...controller.documentsList + .map((e) => tableRow(controller.documentsList.indexOf(e), e)) + .toList() + ], + ), + ), + ); + } + + TableRow tableRow(index, DocumentModel e) { + return TableRow( + decoration: BoxDecoration( + color: controller.documentsList.indexOf(e) % 2 == 0 + ? CustomAppColors.kLightGreyColor.withOpacity(0.25) + : Colors.white), + children: [ + Padding( + padding: REdgeInsets.symmetric(vertical: 8.0, horizontal: 12), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const CustomImageWidget(imagePath: AssetsManager.kFolderIcon), + Expanded( + child: Container( + padding: const EdgeInsets.only(left: 5), + child: CustomTextWidget( + text: e.title, + textAlign: TextAlign.left, + fontSize: 11.sp, + isExpanded: false, + ), + ), + ), + ], + ), + ), + Padding( + padding: REdgeInsets.symmetric(vertical: 8.0, horizontal: 12), + child: CustomTextWidget( + text: e.details, + textAlign: TextAlign.left, + fontSize: 11.sp, + isExpanded: false, + ), + ), + Padding( + padding: REdgeInsets.symmetric(vertical: 8.0, horizontal: 12), + child: CustomTextWidget( + text: DateFormat("MMM/dd/yyyy").format( + DateTime.tryParse(e.createdAt)?.toLocal() ?? DateTime.now()), + textAlign: TextAlign.left, + fontSize: 11.sp, + isExpanded: false, + ), + ), + // Padding( + // padding: REdgeInsets.symmetric(vertical: 8.0, horizontal: 12), + // child: Row( + // mainAxisSize: MainAxisSize.min, + // children: [ + // EditIcon( + // onTap: () => _onEditTap(index, e), + // ), + // ], + // ), + // ) + ], + ); + } + + // _onEditTap(int index, documentModel) async { + // var response = await Navigator.pushNamed( + // context, CustomRouteNames.kAddNewDocumentScreenRoute, + // arguments: [documentModel, controller.serviceUser()]); + // if (response is DocumentModel) { + // // int index = controller.documentsList.value.documentList.indexWhere((item) => item == documentModel); + // controller.documentsList[index] + // ..title = response.title + // ..details = response.details + // ..docPath = response.docPath; + // controller.documentsList.refresh(); + // } + // } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/export_clients_module.dart b/lib/view/screens/clients/export_clients_module.dart new file mode 100644 index 0000000..734ebb4 --- /dev/null +++ b/lib/view/screens/clients/export_clients_module.dart @@ -0,0 +1,22 @@ +export '../clientsListing/clients_list_screen.dart'; +export 'client_profile_screen.dart'; +export 'appointments_screen.dart'; +export 'notes_screen.dart'; +export 'select_note_screen.dart'; +export 'new_note_screen.dart'; +export 'care_plan_menu_screen.dart'; +export 'documentsList/documents_list_screen.dart'; +export 'document_details_screen.dart'; +export 'recent_incidents_screen.dart'; +export 'currentHealthIssues/current_health_issues_screen.dart'; +export 'consent_and_capacity_add_new_form_screen.dart'; +export 'consent_and_capacity_questionnaire_screen.dart'; +export 'life_history_and_goals_screen.dart'; +export 'risk_assessments_screen.dart'; +export 'pbs_plan_screen.dart'; +export 'photo_gallery_screen.dart'; +export 'risk_assessments_template_screen.dart'; +export 'clients_new_view_module/export_client_new_view.dart'; +export 'care_notes_screen.dart'; +export 'care_notes_subcategories_screen.dart'; +export 'careNoteForms/export_care_note_forms.dart'; \ No newline at end of file diff --git a/lib/view/screens/clients/life_history_and_goals_screen.dart b/lib/view/screens/clients/life_history_and_goals_screen.dart new file mode 100644 index 0000000..17e1bf4 --- /dev/null +++ b/lib/view/screens/clients/life_history_and_goals_screen.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/clients/export_clients_controllers.dart'; +import 'package:get/get.dart'; + +import '../../../ftc_mobile_app.dart'; + +class LifeHistoryAndGoalsScreen extends StatefulWidget { + const LifeHistoryAndGoalsScreen({Key? key}) : super(key: key); + + @override + State createState() => _LifeHistoryAndGoalsScreenState(); +} + +class _LifeHistoryAndGoalsScreenState extends State { + + LifeHistoryAndGoalsScreenController controller = Get.put(LifeHistoryAndGoalsScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'Life History & Goals ', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTextWidget(text: "Questionnaire",isExpanded: false,fontWeight: FontWeight.w600,fontSize: 14.sp,textAlign: TextAlign.left,alignment: Alignment.topLeft), + SizedBox(height: 22.h), + LifeHistoryQuestionCard(imagePath: AssetsManager.kManImagePng,name: "Leo Hurwitz",question: "Q: If there was one thing you could change about your health, what would it be?",date: "Aug/02/2023/7:30pm"), + LifeHistoryAnswerCard(imagePath: AssetsManager.kPersonMainIcon,name: "Leo Hurwitz",answer: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.",date: "Aug/02/2023/7:30pm"), + LifeHistoryQuestionCard(imagePath: AssetsManager.kManImagePng,name: "Leo Hurwitz",question: "Q: If there was one thing you could change about your health, what would it be?",date: "Aug/02/2023/7:30pm"), + LifeHistoryAnswerCard(imagePath: AssetsManager.kPersonMainIcon,name: "Leo Hurwitz",answer: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.",date: "Aug/02/2023/7:30pm"), + LifeHistoryQuestionCard(imagePath: AssetsManager.kManImagePng,name: "Leo Hurwitz",question: "Q: If there was one thing you could change about your health, what would it be?",date: "Aug/02/2023/7:30pm"), + LifeHistoryAnswerCard(imagePath: AssetsManager.kPersonMainIcon,name: "Leo Hurwitz",answer: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.",date: "Aug/02/2023/7:30pm"), + ], + ), + ), + ), + ); + } +} + +class LifeHistoryQuestionCard extends StatelessWidget { + const LifeHistoryQuestionCard({ + super.key, required this.imagePath, required this.name, required this.question, required this.date, + }); + + final String imagePath; + final String name; + final String question; + final String date; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CustomImageWidget(imagePath: imagePath,width: 32.w,height: 32.h,), + SizedBox(width: 12.w,), + CustomTextWidget(text: name,isExpanded: false), + ], + ), + SizedBox(height: 8.h), + CustomTextWidget(text: question,isExpanded: false,fontWeight: FontWeight.bold,textAlign: TextAlign.left,alignment: Alignment.centerLeft,fontSize: 14.sp), + SizedBox(height: 8.h), + CustomTextWidget(text: date,isExpanded: false,textAlign: TextAlign.left,alignment: Alignment.centerLeft,fontSize: 12.sp), + SizedBox(height: 24.h), + ], + ); + } +} + +class LifeHistoryAnswerCard extends StatelessWidget { + const LifeHistoryAnswerCard({ + super.key, required this.imagePath, required this.name, required this.answer, required this.date, + }); + + final String imagePath; + final String name; + final String answer; + final String date; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CustomImageWidget(imagePath: imagePath,width: 32.w,height: 32.h,), + SizedBox(width: 12.w,), + CustomTextWidget(text: name,isExpanded: false), + const Spacer(), + CustomImageWidget(imagePath: AssetsManager.kPencilOutlineIcon,width: 14.w,height: 14.h,), + ], + ), + SizedBox(height: 8.h), + Text.rich( + TextSpan( + children: [ + const TextSpan( + text: 'A: ', + style: TextStyle(fontWeight: FontWeight.bold), + ), + TextSpan(style: TextStyle(fontSize: 14.sp,color: CustomAppColors.kBlackColor.withAlpha(180),),text: answer), + ], + ), + ), + SizedBox(height: 8.h), + CustomTextWidget(text: date,isExpanded: false,textAlign: TextAlign.left,alignment: Alignment.centerLeft,fontSize: 12.sp), + SizedBox(height: 24.h), + ], + ); + } +} diff --git a/lib/view/screens/clients/new_note_screen.dart b/lib/view/screens/clients/new_note_screen.dart new file mode 100644 index 0000000..b07974e --- /dev/null +++ b/lib/view/screens/clients/new_note_screen.dart @@ -0,0 +1,364 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../ftc_mobile_app.dart'; + +class NewNoteScreen extends StatefulWidget { + const NewNoteScreen({Key? key}) : super(key: key); + + @override + State createState() => _NewNoteScreenState(); +} + +class _NewNoteScreenState extends State { + NewNoteScreenController controller = Get.put(NewNoteScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: 'New Note for ${controller.user.name}', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 18.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + + Padding( + padding: EdgeInsets.only(top: 20.h,bottom: 15.h), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + minLines: 1, + maxLines: 1, + controller: controller.titleController, + hintText: ConstantText.kTypeTitle, + heading: ConstantText.kTitle, + onChange: (_){}, + ), + ), + + Padding( + padding: EdgeInsets.only(bottom: 15.0.h), + child: const UploadWidget(), + ), + Row( + children: [ + Expanded(child: Padding( + padding: EdgeInsets.only(right: 7.5.w), + child: const FlagWidget(text1: "Flag",text2: "Choose Flag",flagIcon: AssetsManager.kFlagIcon), + )), + Expanded(child: Padding( + padding: EdgeInsets.only(left: 7.5.w), + child: const FlagWidget(text1: "Red Flag: How long?",text2: "Choose",chooseIcon: AssetsManager.kClockIcon), + )), + ], + ), + Padding( + padding: EdgeInsets.only(top: 20.h,bottom: 15.h), + child: CustomTextFieldWidget( + borderRadius: BorderRadius.circular(10.r), + borderColor: CustomAppColors.kLightGreyColor, + borderWidth: 1.0.sp, + maxLines: 6, + minLines: 6, + controller: controller.titleController, + hintText: ConstantText.kTypeTitle, + heading: ConstantText.kTitle, + onChange: (_){}, + bottomChild: Align( + alignment: Alignment.bottomRight, + child: Padding( + padding: EdgeInsets.only(right: 10.0.w,bottom: 10.h), + child: InkWell( + onTap: () {}, + child: const CustomImageWidget( + imagePath:AssetsManager.kMicIcon, + ), + ), + ), + ), + ), + ), + const TitleWidget( + text1: "Link Note (Optional)", + text2: "Choose", + showDropDownButton: true, + showSwitchButton: false), + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0.h), + child: const TitleWidget( + text1: "Handover To (Optional)", + text2: "Choose", + showDropDownButton: true, + showSwitchButton: false), + ), + const TitleWidget( + text1: "Notify Management?", + text2: "No", + showDropDownButton: false, + showSwitchButton: true), + // const SubmitButtonWidget( + // text: "Submit", + // buttonColor: CustomAppColors.kSecondaryColor, + // textColor: CustomAppColors.kPrimaryColor, + // ), + + + Padding( + padding: EdgeInsets.only( + top: 15.h, + bottom: Platform.isIOS ? 30.0.h : 20.0.h, + ), + child: CustomAppButton( + buttonText: ConstantText.kSubmit.toUpperCase(), + buttonColor: CustomAppColors.kSecondaryColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: (){}, + ), + ), + ], + ), + ), + ); + } +} + +class UploadWidget extends StatelessWidget { + const UploadWidget({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width, + // height: 50, + padding: EdgeInsets.symmetric(vertical: 12.h,), + // margin: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kLightGreyColor, + ), + borderRadius: BorderRadius.circular(8.r)), + child: Column( + children: [ + CustomImageWidget( + imagePath: AssetsManager.kUploadIcon, + height: 24.h, + width: 24.w, + ), + CustomTextWidget( + text: "Upload Image", + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + isExpanded: false), + ], + ), + ); + } +} + +class TitleWidget extends StatelessWidget { + const TitleWidget({ + super.key, + required this.text1, + required this.text2, + required this.showDropDownButton, + required this.showSwitchButton, + }); + + final String text1; + final String text2; + final bool showDropDownButton; + final bool showSwitchButton; + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.all(10.sp,), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kLightGreyColor, + ), + borderRadius: BorderRadius.circular(8.r)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomTextWidget( + text: text1, + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + isExpanded: false), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomTextWidget( + text: text2, + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + isExpanded: false), + showDropDownButton + ? const Icon(Icons.arrow_drop_down_outlined) + : showSwitchButton + ? SizedBox( + height: 20.h, + width: 48.w, + child: Switch( + inactiveTrackColor: CustomAppColors.kPrimaryColor, + activeTrackColor: CustomAppColors.kSecondaryColor, + value: false, + onChanged: (val) {}), + ) + : Container(), + ], + ), + ], + ), + ); + } +} + +class SubmitButtonWidget extends StatelessWidget { + const SubmitButtonWidget({ + super.key, + required this.text, + required this.textColor, + required this.buttonColor, + this.borderColor, + }); + + final String text; + final Color textColor; + final Color buttonColor; + final Color? borderColor; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () {}, + child: Container( + width: MediaQuery.of(context).size.width, + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 10.h), + decoration: BoxDecoration( + border: borderColor != null ? Border.all(color: borderColor!) : null, + color: buttonColor, + borderRadius: BorderRadius.circular(2.r), + ), + child: CustomTextWidget( + text: text, + fontColor: textColor, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ); + } +} + +class FlagWidget extends StatelessWidget { + const FlagWidget({ + super.key, + required this.text1, + required this.text2, + this.flagIcon, + this.chooseIcon, + }); + + final String text1; + final String text2; + final String? flagIcon; + final String? chooseIcon; + + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(left: 10.w,right: 10.w,top: 5.h,bottom: 5.h), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kLightGreyColor, + ), + borderRadius: BorderRadius.circular(10.r)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 6.0.h), + child: CustomTextWidget( + text: text1, + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + isExpanded: false), + ), + Row( + children: [ + flagIcon!=null? + CustomImageWidget( + imagePath: flagIcon!, + height: 18.66.h, + width: 18.w, + ): Container(), + + Expanded( + child: CustomTextWidget( + alignment: Alignment.centerLeft, + text: text2, + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + isExpanded: false), + ), + + chooseIcon!=null? + CustomImageWidget( + imagePath: chooseIcon!, + height: 18.66.h, + width: 18.w, + ): Container(), + ], + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/clients/notes_screen.dart b/lib/view/screens/clients/notes_screen.dart new file mode 100644 index 0000000..699f404 --- /dev/null +++ b/lib/view/screens/clients/notes_screen.dart @@ -0,0 +1,209 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../ftc_mobile_app.dart'; + +class NotesScreen extends StatefulWidget { + const NotesScreen({Key? key}) : super(key: key); + + @override + State createState() => _NotesScreenState(); +} + +class _NotesScreenState extends State { + NotesScreenController controller = + Get.put(NotesScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.pushNamed( + controller.screenKey.currentContext!, + CustomRouteNames.kNewNoteScreenRoute, + ); + }, + shape: const CircleBorder(), + backgroundColor: CustomAppColors.kPrimaryColor, + child: CustomImageWidget( + imagePath: AssetsManager.kPlusIcon, + height: 35.h, + width: 35.w, + imageColor: CustomAppColors.kSecondaryColor, + ), + ), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox(width: 15.w,), + CustomTextWidget( + text: 'Notes for ${controller.user.name}', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + ), + body: Center( + child: SingleChildScrollView( + child: Column( + children: [ + Container( + height: 40, + margin: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kLightGreyColor, + ), + borderRadius: BorderRadius.circular(40.r)), + child: Row( + children: [ + IconButton( + onPressed: () { + Navigator.pushNamed(context, CustomRouteNames.kSelectNoteScreenRoute); + }, icon: const Icon(Icons.search)), + CustomTextWidget( + text: "Search...", + fontSize: 18.sp, + fontWeight: FontWeight.w400, + fontColor: CustomAppColors.kLightGreyColor, + isExpanded: false), + ], + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height / 1.2, + child: ListView.builder( + itemCount: controller.users.length + 1, + itemBuilder: (BuildContext context, int index) { + return index < controller.users.length + ? NotesRoundOutlinedBox( + context: context, + child: BuildNotesList( + history: controller.user.aboutPatient, + date: controller.user.diagnosisDate, + userName: controller.users[index], + ), + ) + : SizedBox(height: 60.h,); + }, + ), + ), + ], + ), + ), + ), + ); + } +} + +class NotesRoundOutlinedBox extends StatelessWidget { + const NotesRoundOutlinedBox({ + super.key, + required this.context, + required this.child, + }); + + final BuildContext context; + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + + alignment: Alignment.centerLeft, + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.symmetric(horizontal: 25.w,vertical: 5.h), + padding: EdgeInsets.symmetric(horizontal: 13.sp,vertical: 10), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kSecondaryColor), + borderRadius: BorderRadius.circular(10.r), + ), + child: child, + ); + } +} + +class BuildNotesList extends StatelessWidget { + const BuildNotesList({ + super.key, + required this.date, + required this.history, required this.userName, + }); + + final String date; + final String history; + final String userName; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextWidget( + text: 'Note Title', + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + CustomTextWidget( + text: date, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 10.sp, + fontColor: CustomAppColors.kLightGreyColor, + ), + CustomTextWidget( + alignment: Alignment.centerLeft, + textAlign: TextAlign.left, + text: history, + isExpanded: false, + fontSize: 10.sp, + fontColor: CustomAppColors.kBlackColor, + ), + Padding( + padding: EdgeInsets.only(top: 8.0.h), + child: Row( + children: [ + CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 18.h, + width: 18.w, + ), + SizedBox(width: 8.w,), + CustomTextWidget( + alignment: Alignment.centerLeft, + text: userName, + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kBlackColor, + ), + ], + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/view/screens/clients/pbs_plan_screen.dart b/lib/view/screens/clients/pbs_plan_screen.dart new file mode 100644 index 0000000..b1771d8 --- /dev/null +++ b/lib/view/screens/clients/pbs_plan_screen.dart @@ -0,0 +1,192 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/PBSPlanModel.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/custom_app_bar_with_action.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:ftc_mobile_app/view/screens/clients/clients_new_view_module/add_new_pbs_plan_screen.dart'; +import 'package:get/get.dart'; +import '../../../ftc_mobile_app.dart'; + +class PBSPlanScreen extends StatefulWidget { + final UserData userData; + + const PBSPlanScreen({Key? key, required this.userData}) : super(key: key); + + @override + State createState() => _PBSPlanScreenState(); +} + +class _PBSPlanScreenState extends State { + final controller = Get.put(PBSPlanScreenController()); + + @override + void initState() { + controller.serviceUser.value = widget.userData; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + // onBackButton: () => controller.onBackPress(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + // sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: _appBar(context), + body: Column( + children: [ + // SearchBarWidget(onSearchTextChange: (_) {}), + Expanded(child: Obx(() { + if (controller.pbsList.isEmpty) { + return FrequentFunctions.centerText(text: "No data found"); + } + + return listView(controller.pbsList()); + })), + ], + ), + ); + } + + AppBar _appBar(BuildContext context) { + return CustomAppBarWithAction( + context, + titleText: "PBS Plan", + actionText: '+ Add Form', + onActionTap: _onAddNewTap, + ); + } + + Widget listView(List list) { + return DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightGreyColor)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: REdgeInsets.symmetric(horizontal: 16.0, vertical: 12), + child: Text( + "Staff Member", + style: TextStyle( + color: CustomAppColors.kBlackColor, + fontSize: 14.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + child: ListView.separated( + itemCount: list.length, + separatorBuilder: (_, index) => Divider( + color: CustomAppColors.kLightGreyColor, + height: 1, + ), + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + // listItemTap(index, list[index]); + }, + child: listItem(index: index, data: list[index]), + ); + }, + ), + ), + ], + ), + ); + } + + Widget listItem({required int index, required PbsList data}) { + return InkWell( + onTap: () async { + Navigator.pushNamed( + context, + CustomRouteNames.kAddNewPBSPlanScreenRoute, + arguments: AddNewPBSPlanScreenArgs( + userData: widget.userData, pbsData: data, viewOnly: true), + ); + }, + child: Container( + padding: REdgeInsets.symmetric(vertical: 9, horizontal: 16), + color: index % 2 == 0 + ? CustomAppColors.kLightGreyColor.withOpacity(0.1) + : Colors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + MyCircleImage( + imageSize: 53.r, + url: "${WebUrls.baseUrl}${data.staffId?.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + imageColor: CustomAppColors.kDarkBlueTextColor, + height: 53.r, + width: 53.r, + ), + ), + 12.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + data.staffId?.name ?? "", + style: TextStyle( + color: CustomAppColors.kDarkBlueTextColor, + fontSize: 16.sp, + fontWeight: FontWeight.w600, + ), + ), + (data.createdAt.isNullOrEmpty()) + ? FrequentFunctions.noWidget + : Text( + DateFormatter.ddMMyyyyhhmmFormat( + DateTime.parse(data.createdAt).toLocal()), + style: TextStyle( + color: CustomAppColors.kLightGreyColor, + fontSize: 12.sp, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + // EditIcon(onTap: () async { + // dynamic res = await Navigator.pushNamed( + // context, CustomRouteNames.kAddNewPBSPlanScreenRoute, + // arguments: AddNewPBSPlanScreenArgs( + // userData: widget.userData, pbsData: data)); + // if (res == true) { + // controller.fetchPBSPlanList(); + // } + // }), + ], + ), + ), + ); + } + + _onAddNewTap() async { + dynamic res = await Navigator.pushNamed( + controller.screenKey.currentContext!, + CustomRouteNames.kAddNewPBSPlanScreenRoute, + arguments: AddNewPBSPlanScreenArgs( + userData: widget.userData, + )); + if (res == true) { + controller.fetchPBSPlanList(); + } + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/photo_gallery_screen.dart b/lib/view/screens/clients/photo_gallery_screen.dart new file mode 100644 index 0000000..14e15e3 --- /dev/null +++ b/lib/view/screens/clients/photo_gallery_screen.dart @@ -0,0 +1,234 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/memoryListResponse/MemoryListData.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/custom_app_bar_with_action.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_network_image.dart'; +import 'package:get/get.dart'; +import 'package:video_thumbnail/video_thumbnail.dart'; +import '../../../ftc_mobile_app.dart'; +import 'addEditMemoryBox/add_edit_memory_box_screen.dart'; + +class PhotoGalleryScreen extends StatefulWidget { + final UserData userData; + + const PhotoGalleryScreen({Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => _PhotoGalleryScreenState(); +} + +class _PhotoGalleryScreenState extends State { + final controller = Get.put(PhotoGalleryScreenController()); + + @override + void initState() { + controller.serviceUserId = widget.userData.id!; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + // sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: _appBar(context), + body: SafeArea(child: Obx(() { + if (controller.memoryList.isEmpty) { + return FrequentFunctions.centerText(text: "No data found"); + } + + return listView(controller.memoryList()); + })), + ); + } + + AppBar _appBar(BuildContext context) { + return CustomAppBarWithAction( + context, + titleText: 'Photo Gallery', + actionText: '+ Add New', + onActionTap: () async { + final result = await _gotoAddEditMemoryBoxScreen(); + + if (result == true) { + controller.getMemoryList(); + } + }, + ); + } + + listView(List list) { + return ListView.separated( + itemCount: list.length, + padding: REdgeInsets.symmetric(horizontal: 16), + separatorBuilder: (_, index) => 12.verticalSpace, + itemBuilder: (BuildContext context, int index) { + return listItem(index: index, data: list[index]); + }, + ); + } + + Widget listItem({required int index, required MemoryListData data}) { + return InkWell( + onTap: () { + _gotoAddEditMemoryBoxScreen(data, true); + }, + child: Container( + height: 130.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: CustomAppColors.kSecondaryColor), + borderRadius: 16.toRadius(), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 4, + child: Container( + width: double.maxFinite, + height: double.maxFinite, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.2), + borderRadius: + const BorderRadius.horizontal(left: Radius.circular(16)), + ), + child: (data.filePath.isNullOrEmpty()) + ? const Center( + child: Icon(Icons.image_not_supported_outlined), + ) + : (data.filePath!.isImageFileName) + ? MyNetworkImage( + url: WebUrls.baseUrl + data.filePath!, + fit: BoxFit.cover, + errorWidget: const Icon( + Icons.image_not_supported_outlined, + color: Colors.black, + ), + ) + : FutureBuilder( + future: VideoThumbnail.thumbnailFile( + video: WebUrls.baseUrl + data.filePath!, + imageFormat: ImageFormat.WEBP, + maxHeight: 150, + quality: 75, + ), + builder: (_, snap) { + if (snap.connectionState == + ConnectionState.waiting) { + return Center( + child: SizedBox.square( + dimension: 32.r, + child: const CircularProgressIndicator(), + ), + ); + } + if (snap.connectionState == + ConnectionState.done) { + if (snap.data != null) { + return Stack( + children: [ + Positioned.fill( + child: Image.file( + File(snap.data!), + fit: BoxFit.cover, + ), + ), + Center( + child: DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + blurRadius: 2, + spreadRadius: 2, + color: Colors.black + .withOpacity(0.2)), + ], + ), + child: Icon( + Icons.play_circle_outline_rounded, + color: Colors.white, + size: 32.r, + ), + ), + ) + ], + ); + } + } + + return FrequentFunctions.noWidget; + }), + ), + ), + 12.horizontalSpace, + Expanded( + flex: 8, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomTextWidget( + text: data.note ?? "", + fontSize: 14.sp, + fontWeight: FontWeight.w400, + maxLines: 3, + textAlign: TextAlign.left, + ), + 8.verticalSpace, + CustomTextWidget( + text: "Staff Member: ${data.addedBy?.name ?? ""}", + fontSize: 14.sp, + fontWeight: FontWeight.w400, + textAlign: TextAlign.left, + ), + ], + ).addPaddingVertical(12), + ), + // EditIcon( + // onTap: () async { + // final result = await _gotoAddEditMemoryBoxScreen(data); + // + // if (result == true) { + // controller.getMemoryList(); + // } + // }, + // ).addPaddingVertical(12), + // 12.horizontalSpace, + ], + ), + ), + ); + } + + Future _gotoAddEditMemoryBoxScreen([data, bool viewOnly = false]) async { + final res = await Navigator.pushNamed( + context, + CustomRouteNames.kAddEditMemoryBoxScreen, + arguments: AddEditMemoryBoxScreenArgs( + userData: widget.userData, + data: data, + viewOnly: viewOnly, + ), + ); + + if (res == true) { + controller.getMemoryList(); + } + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/recent_incidents_screen.dart b/lib/view/screens/clients/recent_incidents_screen.dart new file mode 100644 index 0000000..a862061 --- /dev/null +++ b/lib/view/screens/clients/recent_incidents_screen.dart @@ -0,0 +1,185 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/dialogs/app_dialogs.dart'; +import 'package:ftc_mobile_app/models/clients/recent_incidents_model.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/custom_app_bar_with_action.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/edit_icon.dart'; +import 'package:ftc_mobile_app/view/screens/clientsListing/widgets/search_bar_widget.dart'; +import 'package:get/get.dart'; +import '../../../ftc_mobile_app.dart'; +import 'add_new_recent_incident_screen.dart'; + +class RecentIncidentsScreen extends StatefulWidget { + final UserData userData; + + const RecentIncidentsScreen({Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => _RecentIncidentsScreenState(); +} + +class _RecentIncidentsScreenState extends State { + late final RecentIncidentsScreenController controller; + + @override + void initState() { + controller = Get.put(RecentIncidentsScreenController(widget.userData)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + // onBackButton: () => controller.onBackPress(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + // sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: _appBar(context), + body: SafeArea( + child: Column( + children: [ + 8.verticalSpace, + SearchBarWidget( + controller: controller.searchTEC, + onSearchTextChange: controller.onSearch, + ), + 8.verticalSpace, + Expanded( + child: Obx( + () => controller.recentIncidentsList.isEmpty + ? FrequentFunctions.centerText(text: "No data found") + : ListView.separated( + itemCount: controller.recentIncidentsList.length, + separatorBuilder: (_, index) => 12.verticalSpace, + padding: REdgeInsets.symmetric(horizontal: 20.r), + itemBuilder: (_, int index) { + return RecentIncidentTile( + data: controller.recentIncidentsList[index], + onTap: () { + AppDialog.showRecentIncidentDetailDialog( + data: controller.recentIncidentsList[index]); + }, + onEdit: () async { + dynamic result = await Navigator.pushNamed( + context, + CustomRouteNames + .kAddNewRecentIncidentsScreenRoute, + arguments: AddNewRecentIncidentsScreenArgs( + incidentsModel: controller + .recentIncidentsList[index])); + + if (result is RecentIncidentsModel) { + controller.recentIncidentsList + .replaceRange(index, index + 1, [result]); + controller.recentIncidentsList.refresh(); + } + }, + ); + }), + ), + ), + ], + ), + ), + ); + } + + AppBar _appBar(BuildContext context) { + return CustomAppBarWithAction( + context, + titleText: "Recent Incidents", + actionText: '+ Add New', + onActionTap: () async { + dynamic result = await Navigator.pushNamed( + context, CustomRouteNames.kAddNewRecentIncidentsScreenRoute, + arguments: AddNewRecentIncidentsScreenArgs( + userId: controller.serviceUser()!.id!)); + if (result is RecentIncidentsModel) { + controller.recentIncidentsList.insert(0, result); + controller.recentIncidentsList = controller.recentIncidentsList; + } + }, + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +class RecentIncidentTile extends StatelessWidget { + final RecentIncidentsModel data; + final VoidCallback onTap; + final VoidCallback onEdit; + + const RecentIncidentTile({ + super.key, + required this.data, + required this.onTap, + required this.onEdit, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Container( + alignment: Alignment.centerLeft, + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.symmetric(horizontal: 13.sp, vertical: 10), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kSecondaryColor), + borderRadius: BorderRadius.circular(10.r), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: CustomTextWidget( + text: data.incidentTitle.isNotEmpty + ? data.incidentTitle + : "Untitled Incident", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + maxLines: 1, + textAlign: TextAlign.left, + fontColor: CustomAppColors.kSecondaryColor, + ), + ), + // 8.horizontalSpace, + // EditIcon(onTap: onEdit), + ], + ), + Text.rich(TextSpan(children: [ + TextSpan( + text: "Incident Date - Time : ", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 12.sp, + color: Colors.black, + )), + TextSpan( + text: DateFormatter.ddMMyyyyhhmmFormat( + DateTime.fromMillisecondsSinceEpoch(data.incidentDate) + .toLocal()), + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 12.sp, + color: CustomAppColors.kLightGreyColor, + )), + ])), + ], + ), + ), + ); + } +} diff --git a/lib/view/screens/clients/risk_assessments_screen.dart b/lib/view/screens/clients/risk_assessments_screen.dart new file mode 100644 index 0000000..a7b3561 --- /dev/null +++ b/lib/view/screens/clients/risk_assessments_screen.dart @@ -0,0 +1,258 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../ftc_mobile_app.dart'; + +class RiskAssessmentsScreen extends StatefulWidget { + const RiskAssessmentsScreen({Key? key}) : super(key: key); + + @override + State createState() => _RiskAssessmentsScreenState(); +} + +class _RiskAssessmentsScreenState extends State { + RiskAssessmentsScreenController controller = Get.put(RiskAssessmentsScreenController()); + + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + // sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox(width: 15.w,), + CustomTextWidget( + text: 'Risk Assessments', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + const Spacer(), + InkWell( + onTap: () async { + // await Navigator.pushNamed( + // controller.screenKey.currentContext!, + // CustomRouteNames.kNewNoteScreenRoute, + // ); + }, + child: CustomTextWidget( + text: '+ Add New', + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + ), + ), + ], + ), + ), + + body: Container( + // padding: EdgeInsets.symmetric(horizontal: 10.w), + child: SingleChildScrollView( + child: Column( + children: [ + Container( + height: 40, + margin: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kLightGreyColor, + ), + borderRadius: BorderRadius.circular(5.r)), + child: Row( + children: [ + IconButton( + onPressed: () {}, icon: const Icon(Icons.search)), + CustomTextWidget( + text: "Search...", + fontSize: 18.sp, + fontWeight: FontWeight.w400, + fontColor: CustomAppColors.kLightGreyColor, + isExpanded: false), + ], + ), + ), + InkWell( + // onTap: () { + // Navigator.pushNamed( + // controller.screenKey.currentContext!, + // CustomRouteNames.kDocumentDetailsScreenRoute, + // ); + // }, + child: SizedBox( + width: MediaQuery.of(context).size.width, + child: Column( + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + raListHeading(), + raListItemWidget(text1: "Jaylon George",text2: "High",text3: "Aug/01/2024",color: true), + raListItemWidget(text1: "Jaylon George",text2: "Low",text3: "Sept/01/2024",color: false), + raListItemWidget(text1: "Jaylon George",text2: "Medium",text3: "Aug/01/2024",color: true), + raListItemWidget(text1: "Jaylon George",text2: "High",text3: "Sept/01/2024",color: false), + raListItemWidget(text1: "Jaylon George",text2: "Low",text3: "Aug/01/2024",color: true), + raListItemWidget(text1: "Jaylon George",text2: "High",text3: "Sept/01/2024",color: false), + raListItemWidget(text1: "Jaylon George",text2: "Low",text3: "Aug/01/2024",color: true), + raListItemWidget(text1: "Jaylon George",text2: "Medium",text3: "Sept/01/2024",color: false), + raListItemWidget(text1: "Jaylon George",text2: "High",text3: "Aug/01/2024",color: true), + raListItemWidget(text1: "Jaylon George",text2: "Low",text3: "Sept/01/2024",color: false), + ], + ), + ), + ) + ], + ), + ), + ), + ); + + } + + Widget raListHeading() { + return Container( + padding: EdgeInsets.symmetric(horizontal: 10.w), + decoration: const BoxDecoration( + border: Border( + top: BorderSide( + color: CustomAppColors.kSmokeColor, + ), + bottom: BorderSide(color: CustomAppColors.kSmokeColor), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 2, + child: Container( + // decoration: const BoxDecoration( + // border: Border( + // right: BorderSide( + // color: CustomAppColors.kSmokeColor, + // ), + // ), + // ), + padding: const EdgeInsets.only(right: 0, top: 10, bottom: 10), + child: CustomTextWidget( + text: "Service User", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 12.sp, + ), + ), + ), + Container( + width: 2.w, + color: CustomAppColors.kSmokeColor, + ), + Expanded( + flex: 1, + child: Container( + decoration: BoxDecoration( + border: Border( + left: BorderSide( + color: CustomAppColors.kSmokeColor, + width: 2.w + ), + ), + ), + padding: const EdgeInsets.only(right: 0, top: 10, bottom: 10), + child: CustomTextWidget( + text: "Risk", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 12.sp, + ), + ), + ), + ], + ), + ); + } + + Widget raListItemWidget({required String text1,required String text2,required String text3,required bool color, Color? centerBorderColor}) { + return InkWell( + onTap: (){ + Navigator.pushNamed(context, CustomRouteNames.kRiskAssessmentsTemplateScreenRoute); + }, + child: Container( + padding: EdgeInsets.only(right: 3.w,left: 10.w), + height: 50.h, + decoration: BoxDecoration( + color: color ? CustomAppColors.kBlueColor.withAlpha(20) : null, + border: Border( + top: BorderSide( + color: CustomAppColors.kSmokeColor, + ), + bottom: BorderSide(color: CustomAppColors.kSmokeColor), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 2, + child: Container( + padding: const EdgeInsets.only(top: 10, bottom: 10), + child: Row( + children: [ + CustomImageWidget(imagePath: AssetsManager.kManImagePng,width: 24.w,height: 24.h), + Container( + padding: const EdgeInsets.only(left: 5,), + child: CustomTextWidget( + text: text1, + textAlign: TextAlign.left, + fontSize: 11.sp, + isExpanded: false,), + ), + ], + ), + ), + ), + Container( + width: 2.w, + color: text2.toLowerCase() == "low" + ? CustomAppColors.kDarkGreenColor + : text2.toLowerCase() == "medium" + ? CustomAppColors.kYellowColor + : text2.toLowerCase() == "high" + ? CustomAppColors.kDarkRedColor + : centerBorderColor ?? CustomAppColors.kLightGreyColor, + ), + Expanded( + flex: 1, + child: Container( + padding: EdgeInsets.only(top: 10.h, bottom: 10.h,left: 12.w,right: 19.w), + child: CustomTextWidget( + text: text2, + textAlign: TextAlign.left, + fontSize: 12.sp, + isExpanded: false,), + ), + ), + ], + ), + ), + ); + } + +} diff --git a/lib/view/screens/clients/risk_assessments_template_screen.dart b/lib/view/screens/clients/risk_assessments_template_screen.dart new file mode 100644 index 0000000..e38efa7 --- /dev/null +++ b/lib/view/screens/clients/risk_assessments_template_screen.dart @@ -0,0 +1,383 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/RiskAssessmentData.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/custom_app_bar_with_action.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:get/get.dart'; +import '../../../ftc_mobile_app.dart'; +import 'addEditRiskAssessment/add_edit_risk_assessment_screen.dart'; + +class RiskAssessmentsTemplateScreen extends StatefulWidget { + final UserData userData; + + const RiskAssessmentsTemplateScreen({Key? key, required this.userData}) + : super(key: key); + + @override + State createState() => + _RiskAssessmentsTemplateScreenState(); +} + +class _RiskAssessmentsTemplateScreenState + extends State { + late final RiskAssessmentsTemplateScreenController controller; + + @override + void initState() { + controller = + Get.put(RiskAssessmentsTemplateScreenController(widget.userData.id!)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + appBar: _appBar(context), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: Column( + children: [ + serviceUserDetailWidget(), + 16.verticalSpace, + Expanded(child: Obx(() { + return controller.list.isEmpty + ? FrequentFunctions.centerText(text: "No data found") + : listView(); + })), + ], + ), + ), + ); + } + + AppBar _appBar(BuildContext context) { + return CustomAppBarWithAction( + context, + titleText: 'Risk Assessments Template', + actionText: '+ Add New', + onActionTap: () async { + final result = await Navigator.pushNamed( + context, CustomRouteNames.kAddEditRiskAssessmentScreen, + arguments: AddEditRiskAssessmentScreenArgs( + userData: widget.userData, + )); + if (result == true) { + controller.getRiskAssessments(); + } + }, + ); + } + + Widget serviceUserDetailWidget() { + return Padding( + padding: REdgeInsets.symmetric(horizontal: 10), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Align( + alignment: Alignment.center, + child: MyCircleImage( + imageSize: 80.r, + url: + "${WebUrls.baseUrl}${widget.userData.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 53.r, + width: 53.r, + ), + ), + ), + 10.verticalSpace, + CustomTextWidget( + text: widget.userData.displayName, + fontSize: 14.sp, + fontWeight: FontWeight.w600), + 32.verticalSpace, + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: _labelValueWidgets( + 'Email:', + widget.userData.email ?? "", + ), + )), + 8.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: _labelValueWidgets( + 'Contact Number:', + widget.userData.modelId?.phoneNo ?? "", + ), + )), + ], + ), + 16.verticalSpace, + ..._labelValueWidgets( + 'Address 1:', + widget.userData.modelId?.suAddress1 ?? "", + ), + 16.verticalSpace, + ..._labelValueWidgets( + 'Address 2:', + widget.userData.modelId?.suAddress2 ?? "", + ), + 16.verticalSpace, + ], + ), + ); + } + + List _labelValueWidgets(String label, String value) { + return [ + CustomTextWidget( + textAlign: TextAlign.left, + isExpanded: false, + text: label, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + fontSize: 12.sp), + 4.verticalSpace, + CustomTextWidget( + textAlign: TextAlign.left, + text: value, + isExpanded: false, + fontWeight: FontWeight.w400, + fontColor: CustomAppColors.kBlackColor, + fontSize: 13.sp), + ]; + } + + Widget _tableHeading(String text) { + return TableCell( + child: Padding( + padding: REdgeInsets.symmetric(horizontal: 12, vertical: 12), + child: Text( + text, + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + ); + } + + Widget listView() { + return InteractiveViewer( + constrained: false, + scaleEnabled: false, + child: Table( + border: TableBorder.all( + color: CustomAppColors.kSmokeColor, + ), + columnWidths: { + 0: FixedColumnWidth(200.r), + 1: FixedColumnWidth(300.r), + 2: FixedColumnWidth(300.r), + 3: FixedColumnWidth(250.r), + 4: FixedColumnWidth(400.r), + 5: FixedColumnWidth(250.r), + 6: FixedColumnWidth(250.r), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + children: [ + TableRow( + children: [ + _tableHeading("Hazard"), + _tableHeading("Person (s) exposed to Hazard"), + _tableHeading("Risk Identified"), + _splitColumn("Pure Risk Rating", splitCells: [ + _splitCellExpanded("C", borderRight: true), + _splitCellExpanded("L", borderRight: true), + _splitCellExpanded("R"), + ]), + _tableHeading("Control Measures Required"), + _splitColumn("In Place", splitCells: [ + _splitCellExpanded("Y", borderRight: true), + _splitCellExpanded("N"), + ]), + _splitColumn("Residual Risk Rating", splitCells: [ + _splitCellExpanded("C", borderRight: true), + _splitCellExpanded("L", borderRight: true), + _splitCellExpanded("R"), + ]), + ], + ), + ...controller.list + .map((e) => tableRow(controller.list.indexOf(e), e)) + .toList() + ], + ), + ); + } + + Widget _splitColumn(String heading, {List splitCells = const []}) { + return TableCell( + child: Column( + children: [ + Padding( + padding: REdgeInsets.all(8.0), + child: Text( + heading, + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + const Divider( + height: 1, + color: CustomAppColors.kSmokeColor, + ), + Row(children: splitCells) + ], + ), + ); + } + + Expanded _splitCellExpanded(String text, {bool borderRight = false}) => + Expanded( + child: Container( + padding: REdgeInsets.all(8.0), + alignment: Alignment.center, + decoration: !borderRight + ? null + : const BoxDecoration( + border: Border( + right: BorderSide( + color: CustomAppColors.kSmokeColor, + ))), + child: Text( + text, + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + ); + + TableRow tableRow(index, RiskAssessmentData e) { + return TableRow( + decoration: BoxDecoration( + color: controller.list.indexOf(e) % 2 == 0 + ? CustomAppColors.kLightGreyColor.withOpacity(0.25) + : Colors.white), + children: [ + _dataCell(e.hazard ?? ""), + _dataCell(e.personsExposedToHazard ?? ""), + _dataCell(e.riskIdentified ?? ""), + + //Pure risk rating + Row(children: [ + Expanded( + child: _dataCell( + (e.pureRiskRating?.c ?? 0).toString(), + borderRight: true, + )), + Expanded( + child: _dataCell( + (e.pureRiskRating?.l ?? 0).toString(), + borderRight: true, + )), + Expanded( + child: _dataCell( + (e.pureRiskRating?.r ?? 0).toString(), + borderLeft: true, + borderColorLeft: getRatingColor(e.pureRiskRating?.r ?? 0), + ), + ), + ]), + + _dataCell(e.coldMeasureRequired ?? ""), + + //In Place + Row(children: [ + Expanded( + child: _dataCell( + (e.inPlace?.y ?? 0).toString(), + borderRight: true, + ), + ), + Expanded(child: _dataCell((e.inPlace?.n ?? 0).toString())), + ]), + + //Residual Risk Rating + Row(children: [ + Expanded( + child: _dataCell( + (e.residualRiskRating?.c ?? 0).toString(), + borderRight: true, + ), + ), + Expanded( + child: _dataCell( + (e.residualRiskRating?.l ?? 0).toString(), + borderRight: true, + ), + ), + Expanded( + child: _dataCell( + (e.residualRiskRating?.r ?? 0).toString(), + borderLeft: true, + borderColorLeft: getRatingColor(e.residualRiskRating?.r ?? 0), + ), + ), + ]), + ], + ); + } + + //1-3 Green + // 4-6 Yellow + // 7-9 Red + Color getRatingColor(int r) { + if (r >= 0 && r <= 3) return Colors.green; + if (r >= 4 && r <= 6) return Colors.amberAccent; + if (r >= 7) return Colors.red; + return Colors.transparent; + } + + Widget _dataCell(String text, + {bool borderRight = false, + bool borderLeft = false, + Color borderColorLeft = Colors.transparent}) { + return Container( + height: 80.h, + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border( + left: BorderSide( + width: borderLeft ? 3.r : 0, + color: borderColorLeft, + ), + right: BorderSide( + width: borderRight ? 1 : 0, + color: CustomAppColors.kSmokeColor, + ), + ), + ), + padding: REdgeInsets.symmetric(vertical: 8.0, horizontal: 12), + child: Text( + text, + style: TextStyle( + fontSize: 11.sp, + ), + textAlign: TextAlign.left, + maxLines: 3, + overflow: TextOverflow.ellipsis, + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/clients/select_note_screen.dart b/lib/view/screens/clients/select_note_screen.dart new file mode 100644 index 0000000..028fa48 --- /dev/null +++ b/lib/view/screens/clients/select_note_screen.dart @@ -0,0 +1,265 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../ftc_mobile_app.dart'; + +class SelectNoteScreen extends StatefulWidget { + const SelectNoteScreen({Key? key}) : super(key: key); + + @override + State createState() => _SelectNoteScreenState(); +} + +class _SelectNoteScreenState extends State { + + SelectNoteScreenController controller = Get.put(SelectNoteScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBar( + leadingButton: Container(), + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox(width: 15.w,), + CustomTextWidget( + text: 'Select Note', + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + const Spacer(), + InkWell( + onTap: () async { + await Navigator.pushNamed( + controller.screenKey.currentContext!, + CustomRouteNames.kNewNoteScreenRoute, + ); + }, + child: CustomTextWidget( + text: '+ Add New', + isExpanded: false, + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kLightTextColor, + ), + ), + ], + ), + ), + body: Center( + child: SingleChildScrollView( + child: Column( + children: [ + Container( + height: 40, + margin: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kLightGreyColor, + ), + borderRadius: BorderRadius.circular(40.r)), + child: Row( + children: [ + IconButton( + onPressed: () {}, icon: const Icon(Icons.search)), + CustomTextWidget( + text: "Search...", + fontSize: 18.sp, + fontWeight: FontWeight.w400, + fontColor: CustomAppColors.kLightGreyColor, + isExpanded: false), + ], + ), + ), + Container( + padding: EdgeInsets.only(left: 20.w,right: 20.w), + alignment: Alignment.topLeft, + height: 60.h, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomTextWidget( + text: "Choose Categories", + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + isExpanded: false), + const SizedBox(height: 10,), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + const SelectCategoryWidget(selected: true), + SizedBox(width: 5.w,), + const SelectCategoryWidget(textOfButton: "Category 2"), + SizedBox(width: 5.w,), + const SelectCategoryWidget(textOfButton: "Category 3"), + SizedBox(width: 5.w,), + const SelectCategoryWidget(textOfButton: "Category 4"), + SizedBox(width: 5.w,), + const SelectCategoryWidget(textOfButton: "Category 5"), + SizedBox(width: 5.w,), + const SelectCategoryWidget(textOfButton: "Category 6"), + SizedBox(width: 5.w,), + const SelectCategoryWidget(textOfButton: "Category 7"), + SizedBox(width: 5.w,), + const SelectCategoryWidget(textOfButton: "Category 8"), + ], + ), + ), + ], + ), + ), + Container( + padding: EdgeInsets.only(left: 25.w,top: 10), + child: CustomTextWidget( + alignment: Alignment.topLeft, + text: "Notes", + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + isExpanded: false), + ), + SizedBox( + height: MediaQuery.of(context).size.height/1.45, + child: ListView.builder( + itemCount: controller.users.length, + itemBuilder: (BuildContext context, int index) { + return NotesRoundOutlinedBox2( + context: context, + child: BuildNotesList2( + history: controller.user.aboutPatient, + date: controller.user.diagnosisDate, + userName: controller.users[index], + ), + ); + }, + ), + ), + ], + ), + ), + ), + ); + } +} + +class SelectCategoryWidget extends StatelessWidget { + const SelectCategoryWidget({ + super.key,this.selected,this.textOfButton + }); + + final String? textOfButton; + final bool? selected; + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only( + left: 5.w, right: 5.w, bottom: 3.h, top: 3.h), + decoration: BoxDecoration( + color: selected!=null? CustomAppColors.kSecondaryColor:CustomAppColors.kPrimaryColor, + borderRadius: BorderRadius.circular(20.r), + border: Border.all(color: CustomAppColors.kSecondaryColor), + ), + child: CustomTextWidget( + text: textOfButton??"Category 1", + fontSize: 12.sp, + fontWeight: FontWeight.w400, + fontColor: selected!=null?CustomAppColors.kWhiteColor : CustomAppColors.kSecondaryColor, + isExpanded: false), + ); + } +} + +class NotesRoundOutlinedBox2 extends StatelessWidget { + const NotesRoundOutlinedBox2({ + super.key, + required this.context, + required this.child, + }); + + final BuildContext context; + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + + alignment: Alignment.centerLeft, + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.symmetric(horizontal: 25.w,vertical: 5.h), + padding: EdgeInsets.all(16.sp), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kSecondaryColor), + borderRadius: BorderRadius.circular(18.r), + ), + child: child, + ); + } +} + +class BuildNotesList2 extends StatelessWidget { + const BuildNotesList2({ + super.key, + required this.date, + required this.history, required this.userName, + }); + + final String date; + final String history; + final String userName; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CustomTextWidget( + text: 'Note Title', + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + const Spacer(), + CustomImageWidget( + imagePath: AssetsManager.kGoToArrowIcon, + height: 18.66.h, + width: 18.w, + ), + ], + ), + SizedBox(height: 5.h), + CustomTextWidget( + alignment: Alignment.centerLeft, + textAlign: TextAlign.left, + text: history, + isExpanded: false, + fontSize: 10.sp, + fontColor: CustomAppColors.kBlackColor, + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/view/screens/clientsListing/clients_list_screen.dart b/lib/view/screens/clientsListing/clients_list_screen.dart new file mode 100644 index 0000000..9a59c96 --- /dev/null +++ b/lib/view/screens/clientsListing/clients_list_screen.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; +import '../../../models/profileData/user_data.dart'; +import 'widgets/clients_list_view.dart'; +import 'widgets/search_bar_widget.dart'; + +class ClientsListScreen extends StatefulWidget { + const ClientsListScreen({Key? key}) : super(key: key); + + @override + State createState() => _ClientsListScreenState(); +} + +class _ClientsListScreenState extends State { + final controller = Get.put(ClientsListScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + body: SafeArea( + child: Column( + children: [ + SearchBarWidget( + controller: controller.searchController, + onSearchTextChange: controller.searchText, + ), + Expanded( + child: Obx(() { + final list = controller.serviceUsersList(); + final canLoadMore = controller.canLoadMore.value; + + return UsersListView( + refreshController: controller.listRC, + scrollController: controller.listSC, + canLoadMore: canLoadMore, + list: list, + onRefresh: controller.onRefresh, + onLoading: controller.onLoading, + listItemTap: (int index, UserData userData) { + Navigator.pushNamed( + context, CustomRouteNames.kClientsProfileScreenRoute, + arguments: controller.serviceUsersList[index]); + }, + ); + }), + ), + ], + ), + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/clientsListing/widgets/client_card_widget.dart b/lib/view/screens/clientsListing/widgets/client_card_widget.dart new file mode 100644 index 0000000..9c18e98 --- /dev/null +++ b/lib/view/screens/clientsListing/widgets/client_card_widget.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; + +class UserCardWidget extends StatelessWidget { + const UserCardWidget({ + super.key, + required this.index, + required this.userData, + }); + + final UserData userData; + final int index; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(left: 20.w, top: 10.h, bottom: 10.h), + child: Row( + children: [ + MyCircleImage( + imageSize: 53.r, + url: "${WebUrls.baseUrl}${userData.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + height: 53.h, + width: 53.w, + ), + ), + 10.horizontalSpace, + CustomTextWidget( + text: userData.displayName, + fontSize: 16.sp, + fontWeight: FontWeight.w600, + isExpanded: false, + ) + ], + ), + ); + } +} diff --git a/lib/view/screens/clientsListing/widgets/clients_list_view.dart b/lib/view/screens/clientsListing/widgets/clients_list_view.dart new file mode 100644 index 0000000..3465d78 --- /dev/null +++ b/lib/view/screens/clientsListing/widgets/clients_list_view.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/profileData/user_data.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import 'client_card_widget.dart'; + +class UsersListView extends StatelessWidget { + final RefreshController refreshController; + final ScrollController scrollController; + final bool canLoadMore; + final List list; + final VoidCallback onRefresh; + final VoidCallback onLoading; + final Function(int index, UserData userData) listItemTap; + + const UsersListView({ + super.key, + required this.listItemTap, + required this.refreshController, + required this.scrollController, + required this.canLoadMore, + required this.onRefresh, + required this.onLoading, + required this.list, + }); + + @override + Widget build(BuildContext context) { + return SmartRefresher( + key: const ValueKey("clients_list"), + controller: refreshController, + scrollController: scrollController, + header: FrequentFunctions.waterDropHeader, + enablePullUp: canLoadMore, + onRefresh: onRefresh, + onLoading: onLoading, + child: (list.isEmpty) + ? Container( + color: Colors.white, + child: const Center( + child: Text("No users found"), + ), + ) + : ListView.builder( + itemCount: list.length, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + listItemTap(index, list[index]); + }, + child: UserCardWidget(index: index, userData: list[index]), + ); + }, + ), + ); + } +} diff --git a/lib/view/screens/clientsListing/widgets/search_bar_widget.dart b/lib/view/screens/clientsListing/widgets/search_bar_widget.dart new file mode 100644 index 0000000..b167a3e --- /dev/null +++ b/lib/view/screens/clientsListing/widgets/search_bar_widget.dart @@ -0,0 +1,44 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; + +class SearchBarWidget extends StatelessWidget { + final TextEditingController? controller; + final ValueChanged onSearchTextChange; + + const SearchBarWidget( + {super.key, required this.onSearchTextChange, this.controller}); + + @override + Widget build(BuildContext context) { + return Container( + height: 48.h, + margin: REdgeInsets.symmetric(horizontal: 16, vertical: 10), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kLightGreyColor, + ), + borderRadius: BorderRadius.circular(40.r)), + child: Row( + children: [ + IconButton(onPressed: () {}, icon: const Icon(Icons.search)), + Expanded( + child: TextField( + controller: controller, + onChanged: onSearchTextChange, + autofocus: false, + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w400, + ), + decoration: const InputDecoration( + isDense: true, + border: InputBorder.none, + hintText: "Search...", + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/export_screens.dart b/lib/view/screens/export_screens.dart new file mode 100644 index 0000000..22ef693 --- /dev/null +++ b/lib/view/screens/export_screens.dart @@ -0,0 +1,6 @@ +export 'auth_module/export_auth_module.dart'; +export 'clients/export_clients_module.dart'; +export 'home/export_home.dart'; +export 'notifications/export_notifications.dart'; +export 'profile/export_profile.dart'; +export 'rota/export_rota_screens.dart'; \ No newline at end of file diff --git a/lib/view/screens/home/dashboard_screen.dart b/lib/view/screens/home/dashboard_screen.dart new file mode 100644 index 0000000..7acc4aa --- /dev/null +++ b/lib/view/screens/home/dashboard_screen.dart @@ -0,0 +1,198 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; +import 'home_screen.dart'; + +class DashboardScreen extends StatefulWidget { + const DashboardScreen({Key? key}) : super(key: key); + + @override + State createState() => _DashboardScreenState(); +} + +class _DashboardScreenState extends State { + final controller = Get.put(DashboardScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + appBar: appBar, + sideDrawer: const CustomDrawer(), + bottomMenu: Obx( + () => BottomNavigationBar( + type: BottomNavigationBarType.fixed, + currentIndex: controller.selectedIndex.value, + onTap: (value) { + if (value == 0) { + Navigator.pushNamed( + context, CustomRouteNames.kRotaDashboardScreenRoute); + return; + } + controller.selectedIndex.value = value; + }, + items: [ + BottomNavigationBarItem( + label: "", + icon: Column( + children: [ + CustomImageWidget( + imagePath: AssetsManager.kCalendarIcon, + height: 26.h, + width: 26.w, + imageColor: controller.selectedIndex.value == 0 + ? CustomAppColors.kSecondaryColor + : null, + ), + CustomTextWidget( + text: "Rota", + isExpanded: false, + fontSize: 12.sp, + fontColor: controller.selectedIndex.value == 0 + ? CustomAppColors.kSecondaryColor + : null), + ], + ), + ), + BottomNavigationBarItem( + label: "", + icon: Column( + children: [ + CustomImageWidget( + imagePath: AssetsManager.kHomeIcon, + height: 26.h, + width: 26.w, + imageColor: controller.selectedIndex.value == 1 + ? CustomAppColors.kSecondaryColor + : null, + ), + CustomTextWidget( + text: "Dashboard", + isExpanded: false, + fontSize: 12.sp, + fontColor: controller.selectedIndex.value == 1 + ? CustomAppColors.kSecondaryColor + : null, + ), + ], + ), + ), + BottomNavigationBarItem( + label: "", + icon: Column( + children: [ + CustomImageWidget( + imagePath: AssetsManager.kMessageIcon, + height: 26.h, + width: 26.w, + imageColor: controller.selectedIndex.value == 2 + ? CustomAppColors.kSecondaryColor + : null, + ), + CustomTextWidget( + text: "Inbox", + isExpanded: false, + fontSize: 12.sp, + fontColor: controller.selectedIndex.value == 2 + ? CustomAppColors.kSecondaryColor + : null, + ), + ], + ), + ), + BottomNavigationBarItem( + label: "", + icon: Column( + children: [ + CustomImageWidget( + imagePath: AssetsManager.kPeopleUnselectedIcon, + height: 26.h, + width: 26.w, + imageColor: controller.selectedIndex.value == 3 + ? CustomAppColors.kSecondaryColor + : null, + ), + CustomTextWidget( + text: "Clients", + isExpanded: false, + fontSize: 12.sp, + fontColor: controller.selectedIndex.value == 3 + ? CustomAppColors.kSecondaryColor + : null, + ), + ], + ), + ), + ], + ), + ), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + body: SafeArea( + child: Obx(() => selectedScreen()[controller.selectedIndex.value])), + ); + } + + PreferredSizeWidget get appBar => CustomAppBar( + showBoxShadow: false, + titleWidget: Row( + children: [ + InkWell( + onTap: () => controller.screenKey.currentState!.openDrawer(), + child: CustomImageWidget( + imagePath: AssetsManager.kDrawerIcon, + height: 27.h, + width: 27.w, + ), + ), + Padding( + padding: EdgeInsets.only(left: 15.0.w), + child: Obx(() { + return CustomTextWidget( + text: controller.selectedIndex.value == 0 + ? 'Home' + : controller.selectedIndex.value == 1 + ? 'Home' + : controller.selectedIndex.value == 2 + ? 'Inbox' + : controller.selectedIndex.value == 3 + ? 'Clients' + : "", + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + fontColor: CustomAppColors.kDarkBlueTextColor, + ); + }), + ), + const Spacer(), + Obx(() { + return Visibility( + visible: controller.selectedIndex.value == 0, + child: CustomImageWidget( + imagePath: AssetsManager.kBellIcon, + height: 23.h, + width: 22.w, + ), + ); + }), + ], + ), + ); + + List selectedScreen() { + return [ + const RotaDashboardScreen(), + const HomeScreen(), + const InboxScreen(), + const ClientsListScreen(), + ]; + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/home/export_home.dart b/lib/view/screens/home/export_home.dart new file mode 100644 index 0000000..6f51457 --- /dev/null +++ b/lib/view/screens/home/export_home.dart @@ -0,0 +1,3 @@ +export 'dashboard_screen.dart'; +export '../chat/chat_screen.dart'; +export 'inbox_screen.dart'; \ No newline at end of file diff --git a/lib/view/screens/home/home_screen.dart b/lib/view/screens/home/home_screen.dart new file mode 100644 index 0000000..ad22278 --- /dev/null +++ b/lib/view/screens/home/home_screen.dart @@ -0,0 +1,214 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:ftc_mobile_app/view/screens/rota/new_rota_list_widget.dart'; +import 'package:ftc_mobile_app/view/screens/webview/webview_screen.dart'; +import 'package:get/get.dart'; + +import 'widgets/home_row_items.dart'; +import 'widgets/line_row_widget.dart'; + +class HomeScreen extends StatelessWidget { + const HomeScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final controller = Get.find(); + return Stack( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 60.verticalSpace, + Container( + height: 400.h, + padding: EdgeInsets.only(top: 100.h), + decoration: BoxDecoration( + color: CustomAppColors.kSecondaryColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20.r), + topRight: Radius.circular(20.r), + ), + ), + ), + ], + ), + SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + 16.verticalSpace, + + //profile picture + Obx(() { + return MyCircleImage( + imageSize: 80.r, + url: + "${WebUrls.baseUrl}${DashboardScreenController.instance.myProfileData()?.user?.profilePictureUrl ?? ""}", + errorWidget: CircleAvatar( + backgroundColor: Colors.white, + child: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + imageColor: CustomAppColors.kDarkBlueTextColor, + height: 80.r, + width: 80.r, + ), + ), + ); + }), + 3.verticalSpace, + + //Name + Obx( + () => CustomTextWidget( + text: DashboardScreenController.instance + .myProfileData() + ?.staffMemberName ?? + "", + fontSize: 14.sp, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kPrimaryColor, + ), + ), + + //designation + Obx( + () => CustomTextWidget( + text: DashboardScreenController.instance + .myProfileData() + ?.staffDesignation ?? + "", + fontSize: 14.sp, + fontColor: CustomAppColors.kPrimaryColor, + fontWeight: FontWeight.w600, + ), + ), + 16.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + HomeRowItems( + iconUrl: AssetsManager.kCalendarIcon, + textOfItem: "Rota", + onTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kRotaDashboardScreenRoute, + ); + }, + ), + HomeRowItems( + iconUrl: AssetsManager.kPeopleUnselectedIcon, + textOfItem: "Clients", + color: CustomAppColors.kLightTextColor, + onTap: () { + Get.find() + .selectedIndex + .value = 3; + }, + ), + HomeRowItems( + iconUrl: AssetsManager.kMessageIcon, + textOfItem: "Message", + onTap: () { + Get.find() + .selectedIndex + .value = 2; + }, + ), + ], + ), + 10.verticalSpace, + Container( + height: MediaQuery.of(context).size.height / 1.5, + decoration: BoxDecoration( + color: CustomAppColors.kWhiteColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20.r), + topRight: Radius.circular(20.r), + ), + ), + child: Column( + children: [ + Obx(() { + return (controller.myShiftsList.isEmpty) + ? FrequentFunctions.noWidget + : Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.r, vertical: 10.r), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + CustomTextWidget( + text: "Your next Shifts", + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 16.sp), + InkWell( + onTap: () { + Navigator.pushNamed( + context, + CustomRouteNames + .kYourRotaScreenRoute); + }, + child: CustomTextWidget( + text: "See all", + isExpanded: false, + fontSize: 12.sp, + fontWeight: FontWeight.w600), + ), + ], + ), + ); + }), + Obx( + () => (controller.myShiftsList.isEmpty) + ? FrequentFunctions.noWidget + : NewRotaListWidget( + shifts: controller.myShiftsList, + physics: const NeverScrollableScrollPhysics(), + ), + ), + 10.verticalSpace, + InkWell( + onTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kWebviewScreen, + arguments: WebviewScreenArgument( + title: 'Policies and Procedures', + url: ConstantText.privacyUrl), + ); + }, + child: const LineRowWidget( + text: "Policies & Procedures", + icon: AssetsManager.kPoliciesIcon), + ), + InkWell( + onTap: () { + //Todo: uncomment when start working + // Navigator.pushNamed( + // context, + // CustomRouteNames.kSettingsScreen, + // ); + }, + child: const LineRowWidget( + text: "Settings", + icon: AssetsManager.kSettingsIcon), + ), + ], + ), + ), + ], + ), + ), + ), + ], + ); + } +} diff --git a/lib/view/screens/home/inbox_screen.dart b/lib/view/screens/home/inbox_screen.dart new file mode 100644 index 0000000..2bc008b --- /dev/null +++ b/lib/view/screens/home/inbox_screen.dart @@ -0,0 +1,202 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/chat/ChatModel.dart'; +import 'package:ftc_mobile_app/view/screens/chat/arguments/chat_screen_args.dart'; +import 'package:ftc_mobile_app/web_services/chat_services.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; +import '../../custom_widgets/my_circle_image.dart'; + +class InboxScreen extends StatefulWidget { + const InboxScreen({Key? key}) : super(key: key); + + @override + State createState() => _InboxScreenState(); +} + +class _InboxScreenState extends State { + final InboxScreenController controller = Get.put(InboxScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + // onBackButton: controller.onBackButtonPressed, + onScreenTap: controller.removeFocus, + showAppBar: false, + body: Obx(() { + final list = controller.chatsAndGroups(); + list.sort((a, b) => b.date.compareTo(a.date)); + + final canLoadMore = controller.canLoadMore.value; + + return SmartRefresher( + key: const ValueKey("clients_list"), + controller: controller.listRC, + scrollController: controller.listSC, + header: FrequentFunctions.waterDropHeader, + enablePullUp: canLoadMore, + onRefresh: controller.onRefresh, + onLoading: controller.onLoading, + child: (list.isEmpty) + ? Container( + color: Colors.white, + child: const Center( + child: Text("Your inbox is empty"), + ), + ) + : ListView.separated( + shrinkWrap: true, + itemCount: list.length, + padding: REdgeInsets.symmetric(horizontal: 20), + separatorBuilder: (_, int index) => 8.verticalSpace, + itemBuilder: (BuildContext context, int index) { + return SenderListWidget( + messagesListModel: controller.chatsAndGroups[index], + onTap: (messagesListModel) async { + await Navigator.pushNamed( + context, + CustomRouteNames.kChatScreenRoute, + arguments: ChatScreenArgs( + name: messagesListModel.title, + profilePicPath: messagesListModel.image, + otherUserId: messagesListModel.otherUserId, + groupData: messagesListModel.groupData, + onLastMessageUpdate: (m) => + _onLastMessageUpdate(index, m), + ), + ); + }, + ); + }, + ), + ); + }), + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.pushNamed( + context, CustomRouteNames.kSelectUserForChatScreenRoute); + }, + child: const Icon(Icons.add), + ), + ); + } + + _onLastMessageUpdate(int index, ChatModel model) { + if (mounted) { + controller.chatsAndGroups[index].previewOfLastMessage = + model.message ?? ""; + controller.chatsAndGroups[index].date = + model.date ?? DateTime.now().millisecondsSinceEpoch; + + controller.chatsAndGroups.refresh(); + } + } +} + +class SenderListWidget extends StatefulWidget { + const SenderListWidget({ + super.key, + required this.messagesListModel, + required this.onTap, + }); + + final MessagesListModel messagesListModel; + final ValueChanged onTap; + + @override + State createState() => _SenderListWidgetState(); +} + +class _SenderListWidgetState extends State { + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => widget.onTap(widget.messagesListModel), + child: Container( + padding: REdgeInsets.symmetric(vertical: 9), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + MyCircleImage( + imageSize: 53.r, + url: "${WebUrls.baseUrl}${widget.messagesListModel.image}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + imageColor: CustomAppColors.kDarkBlueTextColor, + height: 53.r, + width: 53.r, + ), + ), + 12.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomTextWidget( + text: widget.messagesListModel.title, + fontColor: CustomAppColors.kDarkBlueTextColor, + fontSize: 16.sp, + fontWeight: FontWeight.w600, + isExpanded: false, + ), + 4.verticalSpace, + (widget.messagesListModel.messageType == + MessageType.message.name) + ? CustomTextWidget( + text: widget.messagesListModel.previewOfLastMessage, + fontColor: widget.messagesListModel.isRecent == true + ? CustomAppColors.kDarkBlueTextColor + : CustomAppColors.kLightGreyColor, + fontSize: 12.sp, + maxLines: 1, + fontWeight: FontWeight.w600, + textAlign: TextAlign.left, + isExpanded: false, + ) + : FrequentFunctions.noWidget, + ], + ), + ), + Container( + padding: REdgeInsets.only(right: 2), + child: Column( + children: [ + CustomTextWidget( + text: FrequentFunctions.toTimesAgo( + DateTime.fromMillisecondsSinceEpoch( + widget.messagesListModel.date) + .toIso8601String()), + fontColor: CustomAppColors.kLightGreyColor, + fontSize: 12.sp, + fontWeight: FontWeight.w600, + isExpanded: false, + ), + widget.messagesListModel.noOfMessages != 0 + ? Padding( + padding: EdgeInsets.only(top: 8.0.h), + child: CircleAvatar( + minRadius: 8.sp, + maxRadius: 8.sp, + backgroundColor: CustomAppColors.kBlackColor, + child: CustomTextWidget( + text: "${widget.messagesListModel.noOfMessages}", + isExpanded: false, + fontSize: 8.sp, + fontColor: CustomAppColors.kPrimaryColor, + ), + ), + ) + : Container(), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/screens/home/select_user_for_chat_screen.dart b/lib/view/screens/home/select_user_for_chat_screen.dart new file mode 100644 index 0000000..9023a15 --- /dev/null +++ b/lib/view/screens/home/select_user_for_chat_screen.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/controllers/home/select_user_for_chat_screen_controller.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/view/screens/chat/arguments/chat_screen_args.dart'; +import 'package:get/get.dart'; +import '../../../models/profileData/user_data.dart'; +import '../clientsListing/widgets/clients_list_view.dart'; +import '../clientsListing/widgets/search_bar_widget.dart'; + +class SelectUserForChatScreen extends StatefulWidget { + const SelectUserForChatScreen({Key? key}) : super(key: key); + + @override + State createState() => + _SelectUserForChatScreenState(); +} + +class _SelectUserForChatScreenState extends State { + final controller = Get.put(SelectUserForChatScreenController()); + + // final controller = + // Get.put(ClientsListScreenController(), tag: "select_clients"); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + // onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + appBar: CustomAppBarTitleOnly(context, titleText: 'Select Contact'), + onScreenTap: controller.removeFocus, + showAppBar: true, + body: SafeArea( + child: Column( + children: [ + SearchBarWidget( + onSearchTextChange: controller.onSearch, + ), + Expanded( + child: Obx(() { + final list = controller.staffUsersList(); + final canLoadMore = controller.canLoadMore.value; + + return UsersListView( + refreshController: controller.listRC, + scrollController: controller.listSC, + canLoadMore: canLoadMore, + list: list, + onRefresh: controller.onRefresh, + onLoading: controller.onLoading, + listItemTap: (int index, UserData userData) { + Navigator.popAndPushNamed( + controller.screenKey.currentContext!, + CustomRouteNames.kChatScreenRoute, + arguments: ChatScreenArgs( + otherUserId: userData.id!, + name: userData.displayName, + profilePicPath: userData.profilePictureUrl ?? "", + ), + ); + }, + ); + }), + ), + ], + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +// class UserListWidgetItem extends StatelessWidget { +// final SelectUserForChatScreenController controller = +// Get.find(); +// +// UserListWidgetItem({ +// super.key, +// required this.nameOfPerson, +// required this.index, +// }); +// +// final String nameOfPerson; +// final int index; +// +// @override +// Widget build(BuildContext context) { +// return InkWell( +// onTap: () { +// // Navigator.pop(controller.screenKey.currentContext!, controller.serviceUsersList[index]); +// Navigator.pushNamed(controller.screenKey.currentContext!, +// CustomRouteNames.kGroupChatScreenRoute, +// arguments: controller.serviceUsersList[index]); +// }, +// child: Container( +// padding: EdgeInsets.only(left: 20.w, top: 20.h), +// child: Row( +// children: [ +// CustomImageWidget( +// imagePath: AssetsManager.kPersonMainIcon, +// height: 53.h, +// width: 53.w, +// ), +// SizedBox( +// width: 10.w, +// ), +// CustomTextWidget( +// text: nameOfPerson, +// fontSize: 16.sp, +// fontWeight: FontWeight.w600, +// isExpanded: false, +// ) +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/view/screens/home/widgets/home_row_items.dart b/lib/view/screens/home/widgets/home_row_items.dart new file mode 100644 index 0000000..7d8853b --- /dev/null +++ b/lib/view/screens/home/widgets/home_row_items.dart @@ -0,0 +1,52 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; + +class HomeRowItems extends StatelessWidget { + const HomeRowItems({ + super.key, + required this.iconUrl, + required this.textOfItem, + this.color, + this.onTap, + }); + + final String iconUrl; + final String textOfItem; + final Color? color; + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(vertical: 10.w, horizontal: 10.h), + height: 80.h, + width: 80.h, + decoration: BoxDecoration( + color: CustomAppColors.kPrimaryColor, + borderRadius: BorderRadius.circular(15.r), + ), + child: Column( + children: [ + CustomImageWidget( + width: 33.w, + height: 38.h, + imagePath: iconUrl, + imageColor: CustomAppColors.kBlackColor, + ), + SizedBox( + height: 5.h, + ), + CustomTextWidget( + text: textOfItem, + isExpanded: false, + fontSize: 12.sp, + fontWeight: FontWeight.w600, + ) + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/screens/home/widgets/line_row_widget.dart b/lib/view/screens/home/widgets/line_row_widget.dart new file mode 100644 index 0000000..d57b99e --- /dev/null +++ b/lib/view/screens/home/widgets/line_row_widget.dart @@ -0,0 +1,42 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; + +class LineRowWidget extends StatelessWidget { + const LineRowWidget({super.key, required this.text, required this.icon}); + + final String text; + final String icon; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 20.w, vertical: 5.h), + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightGreyColor)), + child: Row( + children: [ + CustomImageWidget( + imagePath: icon, + width: 19, + height: 22, + ), + SizedBox( + width: 25.w, + ), + CustomTextWidget( + text: text, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp), + const Spacer(), + CustomTextWidget( + text: ">", + isExpanded: false, + fontSize: 15.sp, + fontWeight: FontWeight.w500), + ], + ), + ); + } +} diff --git a/lib/view/screens/notifications/export_notifications.dart b/lib/view/screens/notifications/export_notifications.dart new file mode 100644 index 0000000..f399065 --- /dev/null +++ b/lib/view/screens/notifications/export_notifications.dart @@ -0,0 +1 @@ +export 'notifications_list_screen.dart'; \ No newline at end of file diff --git a/lib/view/screens/notifications/notifications_list_screen.dart b/lib/view/screens/notifications/notifications_list_screen.dart new file mode 100644 index 0000000..8af17f1 --- /dev/null +++ b/lib/view/screens/notifications/notifications_list_screen.dart @@ -0,0 +1,239 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_app_badger/flutter_app_badger.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; + +class NotificationListScreen extends StatefulWidget { + const NotificationListScreen({Key? key}) : super(key: key); + + @override + State createState() => _NotificationListScreenState(); +} + +class _NotificationListScreenState extends State { + final controller = Get.put(NotificationListScreenController()); + + @override + void initState() { + try { + FlutterAppBadger.removeBadge(); + } catch (e) { + debugPrint(e.toString()); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + // sideDrawer: const CustomDrawer(), + showAppBar: true, + appBar: CustomAppBarTitleOnly(context, titleText: 'Notifications'), + body: Container( + padding: EdgeInsets.symmetric(horizontal: 25.w), + child: SingleChildScrollView( + child: Column( + children: [ + const DateTextWidget(), + NotificationListItemWidget(totalNotifications: "4"), + SizedBox( + height: 4.h, + ), + NotificationListItemWidget(), + SizedBox( + height: 4.h, + ), + const DateTextWidget(), + NotificationListItemWidget(), + const DateTextWidget(), + NotificationListItemWidget(), + SizedBox( + height: 4.h, + ), + NotificationListItemWidget(totalNotifications: "8"), + SizedBox( + height: 4.h, + ), + const DateTextWidget(), + NotificationListItemWidget(), + const DateTextWidget(), + NotificationListItemWidget(), + SizedBox( + height: 4.h, + ), + NotificationListItemWidget(), + SizedBox( + height: 4.h, + ), + const DateTextWidget(), + NotificationListItemWidget(), + SizedBox(height: 8.h), + ], + ), + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +class DateTextWidget extends StatelessWidget { + const DateTextWidget({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(vertical: 5.h), + child: CustomTextWidget( + alignment: Alignment.centerLeft, + textAlign: TextAlign.left, + text: "21 Dec, 2022", + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + ), + ); + } +} + +class NotificationListItemWidget extends StatelessWidget { + NotificationListItemWidget({ + super.key, + this.totalNotifications = '0', + }); + + final NotificationListScreenController controller = Get.find(); + final String totalNotifications; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + final rotaShift = RotaShift( + name: 'Dr. John Doe', + staffRequired: '2', + workerType: 'Nurse', + location: 'Hospital A', + startTime: '8:00 AM', + endTime: '4:00 PM', + breakTime: '30 min', + notes: 'NA', + ); + showDialog( + context: context, + builder: (BuildContext context) { + return ShowDialogNotification( + rotaShift: rotaShift, + ); + }, + ); + }, + onDoubleTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + return const HolidayRequestAcceptDialog( + startDate: "Dec 18, 2022", + endDate: "Dec 19, 2022", + noOfDays: "2 days (16 hours)", + ); + }, + ); + }, + onLongPress: () { + showDialog( + context: context, + builder: (BuildContext context) { + return PrivacyPolicyDialog( + privacyPolicy: controller.privacyPolicy, + checkBoxOnChange: (value) { + controller.privacyPolicyAccepted.value = value; + }, + ); + }, + ); + }, + child: Container( + alignment: Alignment.centerLeft, + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 6.h), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kSecondaryColor), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CustomTextWidget( + text: 'New Shift: Dec 21, 7AM - 7PM', + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + const Spacer(), + CustomTextWidget( + text: '07:30 PM', + isExpanded: false, + fontWeight: FontWeight.w500, + fontSize: 10.sp, + fontColor: CustomAppColors.kLightTextColor, + ), + ], + ), + SizedBox(height: 5.h), + Row( + children: [ + CustomTextWidget( + alignment: Alignment.centerLeft, + textAlign: TextAlign.left, + text: "You have been assigned a new shift.", + isExpanded: false, + fontSize: 10.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kLightTextColor, + ), + const Spacer(), + totalNotifications != '0' + ? ClipRRect( + borderRadius: BorderRadius.circular(80.r), + child: Container( + alignment: Alignment.center, + height: 22.h, + width: 22.w, + decoration: const BoxDecoration( + color: CustomAppColors.kRedColor, + ), + child: CustomTextWidget( + alignment: Alignment.center, + textAlign: TextAlign.left, + text: totalNotifications, + isExpanded: false, + fontSize: 12.sp, + fontWeight: FontWeight.w500, + fontColor: CustomAppColors.kWhiteColor, + ), + ), + ) + : Container(), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/screens/profile/export_profile.dart b/lib/view/screens/profile/export_profile.dart new file mode 100644 index 0000000..2a63f07 --- /dev/null +++ b/lib/view/screens/profile/export_profile.dart @@ -0,0 +1 @@ +export 'view_profile_screen.dart'; \ No newline at end of file diff --git a/lib/view/screens/profile/view_profile_screen.dart b/lib/view/screens/profile/view_profile_screen.dart new file mode 100644 index 0000000..5113b49 --- /dev/null +++ b/lib/view/screens/profile/view_profile_screen.dart @@ -0,0 +1,494 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/dialogs/app_dialogs.dart'; +import 'package:ftc_mobile_app/dialogs/widgets/holidays_data_dialog.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/view/custom_widgets/my_circle_image.dart'; +import 'package:get/get.dart'; +import '../../../models/staffWorkload/StaffWorkloadResponse.dart'; + +class ViewProfileScreen extends StatefulWidget { + const ViewProfileScreen({Key? key}) : super(key: key); + + @override + State createState() => _ViewProfileScreenState(); +} + +class _ViewProfileScreenState extends State { + final controller = Get.put(ViewProfileScreenController()); + + @override + Widget build(BuildContext context) { + return ObxValue((RxBool isEditable) { + final editable = isEditable(); + + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: + // isEditable() ? + CustomAppBarTitleOnly(context, titleText: "Your Profile"), + // : CustomAppBarWithAction( + // context, + // titleText: 'Your Profile', + // actionText: '\u270E Edit', + // actionTextColor: Get.theme.primaryColor, + // onActionTap: () { + // isEditable.value = true; + // }, + // ), + body: SingleChildScrollView( + child: Obx(() { + if (controller.detail()?.user == null) { + return FrequentFunctions.noWidget; + } + + final detail = controller.detail()!; + + return Padding( + padding: REdgeInsets.symmetric(horizontal: 20), + child: Column( + children: [ + Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + MyCircleImage( + imageSize: 80.r, + url: + "${WebUrls.baseUrl}${detail.user!.profilePictureUrl ?? ""}", + errorWidget: CustomImageWidget( + imagePath: AssetsManager.kPersonMainIcon, + imageColor: CustomAppColors.kDarkBlueTextColor, + height: 80.r, + width: 80.r, + ), + ), + 4.verticalSpace, + CustomTextWidget( + text: detail.user!.displayName, + fontWeight: FontWeight.w500, + fontColor: Colors.black, + ) + ], + ), + ), + // Container( + // padding: EdgeInsets.only(left: 18.w, top: 15.h), + // child: Row( + // children: [ + // // Obx( + // // () => TabBarWidget( + // // title: "Profile (Client View)", + // // selected: controller.viewProfileClient.value, + // // onTapFunction: () { + // // controller.viewProfileClient.value = true; + // // }, + // // ), + // // ), + // // SizedBox( + // // width: 12.w, + // // ), + // // Expanded( + // // child: SizedBox( + // // width: , + // // child: Obx( + // // () => TabBarWidget( + // // title: "Staff Profile", + // // selected: controller.viewProfileClient.isFalse, + // // onTapFunction: () => + // // controller.viewProfileClient.value = false, + // // ), + // // ), + // // ), + // // ), + // + // Expanded( + // child: SizedBox( + // width: 12.w, + // ), + // ), + // InkWell( + // onTap: () {}, + // borderRadius: 20.toRadius(), + // child: Padding( + // padding: REdgeInsets.symmetric(horizontal: 12, vertical: 6), + // child: Row( + // mainAxisSize: MainAxisSize.min, + // children: [ + // CustomImageWidget( + // imagePath: AssetsManager.kPencilIcon, + // width: 10.w, + // height: 10.h, + // ), + // 4.horizontalSpace, + // CustomTextWidget( + // text: "Edit", + // isExpanded: false, + // fontSize: 10.sp, + // fontWeight: FontWeight.w700, + // fontColor: CustomAppColors.kSecondaryColor), + // ], + // ), + // ), + // ), + // 12.horizontalSpace, + // ], + // ), + // ), + 16.verticalSpace, + Padding( + padding: EdgeInsets.symmetric( + vertical: 6.r, + ), + child: CustomTextFieldWidget( + controller: controller.nameTEC, + heading: "Name", + isEnabled: editable, + ), + // child: isEditable() + // ? CustomTextFieldWidget( + // controller: controller.nameTEC, + // heading: "Name", + // ) + // : SingleItem( + // heading: "Name", value: detail.user!.displayName), + ), + 16.verticalSpace, + Obx( + () => controller.viewProfileClient.isTrue + ? profileClientView + : Column( + children: [ + Row( + children: [ + Expanded( + child: CustomTextFieldWidget( + controller: controller.emailTEC, + heading: "Email", + isEnabled: false, + ), + // child: SingleItem( + // heading: "Email", + // value: detail.user!.email ?? ""), + ), + 8.horizontalSpace, + Expanded( + child: CustomTextFieldWidget( + controller: controller.phoneTEC, + heading: "Phone", + isEnabled: editable, + ), + // child: SingleItem( + // heading: "Phone", + // value: + // (detail.user!.phoneNumber ?? "")), + ), + ], + ), + 16.verticalSpace, + // SingleItem( + // heading: "Address", + // value: + // detail.user!.modelId?.homeAddress ?? ""), + CustomTextFieldWidget( + controller: controller.addressTEC, + heading: "Address", + isEnabled: false, + ), + 16.verticalSpace, + CustomTextFieldWidget( + controller: TextEditingController( + text: detail.kin ?? ""), + heading: "Next of kin", + isEnabled: false, + ), + 16.verticalSpace, + // SingleItem( + // heading: "Next of kin", + // value: detail.kin ?? ""), + SingleItem( + heading: "Total Holidays Left", + value: + "${detail.staffWorkLoads?.firstOrNull?.holidayAlwnNoOfDys ?? "0"} Days (${detail.staffWorkLoads?.firstOrNull?.holidayAlwnNoOfHours ?? "0"} hours)", + onTap: () { + if (detail.staffWorkLoads?.firstOrNull != + null) {} + _onTotalHolidaysBoxTap( + detail.staffWorkLoads!.first); + }, + ), + SingleItem( + heading: "", + value: "Training", + onTap: () { + Get.toNamed( + CustomRouteNames.kTrainingsScreen); + }), + // SingleItem( + // heading: "", + // value: "COVID Checks", + // onTap: () {}), + 12.verticalSpace, + Obx(() { + return Align( + alignment: Alignment.centerLeft, + child: IgnorePointer( + ignoring: true, + child: CustomCheckBox( + checkBoxValue: controller.covidCheck(), + titleText: "COVID Check", + onTap: () { + // controller.covidCheck.toggle(); + }, + ), + ), + ); + }), + ], + ), + ), + 20.verticalSpace, + editable + ? AppDialog.buttonsBar( + onButton1Tap: () { + isEditable(false); + }, + onButton2Tap: () {}, + button1Text: "Cancel", + button2Text: "Update") + .paddingOnly(bottom: 12.r) + : FrequentFunctions.noWidget, + + CustomAppButton( + buttonText: "LOGOUT", + buttonColor: CustomAppColors.kRedColor, + borderColor: CustomAppColors.kRedColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: () { + controller.logoutPressed(); + }, + ), + + 18.verticalSpace, + ], + ), + ); + }), + ), + ); + }, controller.isEditable); + } + + Column get profileClientView { + return const Column( + children: [ + BuildDetailsWidget( + title: "My Experience", + details: + "A quick preview of the text will be shown here. A quick preview of the text will be shown here. shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.", + ), + BuildDetailsWidget( + title: "About Me", + details: + "A quick preview of the text will be shown here. A quick preview of the text will be shown here. shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.", + ), + BuildDetailsWidget( + title: "Things I like to do in my spare time", + details: + "A quick preview of the text will be shown here. A quick preview of the text will be shown here. shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.", + ), + ], + ); + } + + _onTotalHolidaysBoxTap(StaffWorkLoads? workLoads) { + DateTime date = DateTime.now(); + if (workLoads?.endDate.isNotNullOrEmpty() == true) { + date = DateTime.parse(workLoads!.endDate!); + } + + final holidayData = HolidayModel( + carriedOver: "${workLoads?.carriedOverHours ?? 0} hours", + holidayEntitlement: + "${workLoads?.holidayEntitlement?.numberOfWeeks ?? 0} weeks (${workLoads?.holidayEntitlement?.numberOfDays ?? 0} days, ${workLoads?.holidayEntitlement?.numberOfHours ?? 0} hours)", + holidayAllowance: + "${workLoads?.holidayAlwnNoOfDys ?? 0} days (${workLoads?.holidayAlwnNoOfHours ?? 0} hours)", + remainingHolidays: + "${workLoads?.holidaysRemaining ?? 0} days (${workLoads?.holidayAlwnNoOfHours ?? 0} hours)", + timeLeftBeforeYearEnd: "${date.difference(DateTime.now()).inDays} days", + ); + + showDialog( + context: context, + builder: (BuildContext context) { + return HolidaysDataDialog(holidayModel: holidayData); + }); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +class SingleItem extends StatelessWidget { + const SingleItem({ + super.key, + required this.heading, + required this.value, + this.onTap, + }); + + final String heading; + final String value; + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + return Padding( + padding: REdgeInsets.symmetric(vertical: 10.0), + child: InkWell( + onTap: onTap, + child: Container( + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kSmokeColor)), + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 10.h), + child: Row( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (heading.isEmpty) + ? FrequentFunctions.noWidget + : CustomTextWidget( + alignment: Alignment.topLeft, + textAlign: TextAlign.left, + text: heading, + fontWeight: FontWeight.w500, + isExpanded: false, + fontSize: 10.sp, + fontColor: CustomAppColors.kLightTextColor, + ).paddingOnly(bottom: 4), + CustomTextWidget( + alignment: Alignment.topLeft, + textAlign: TextAlign.left, + text: value, + fontWeight: FontWeight.w600, + isExpanded: false, + fontSize: 13.sp, + fontColor: CustomAppColors.kDarkBlueTextColor, + ), + ], + ), + onTap != null ? const Spacer() : Container(), + onTap != null + ? Transform.rotate( + angle: 3.1415 * 3.5, + child: const Icon( + Icons.arrow_drop_down, + ), + ) + : Container(), + ], + ), + ), + ), + ); + } +} + +class TabBarWidget extends StatelessWidget { + const TabBarWidget({ + super.key, + required this.selected, + required this.title, + this.onTapFunction, + }); + + final bool selected; + final String title; + final VoidCallback? onTapFunction; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTapFunction, + child: Container( + // width: 141.w, + height: 22.h, + padding: EdgeInsets.symmetric(horizontal: 12.w), + decoration: BoxDecoration( + color: selected + ? CustomAppColors.kSecondaryColor + : CustomAppColors.kPrimaryColor, + borderRadius: BorderRadius.circular(20.r), + border: Border.all( + color: selected + ? CustomAppColors.kSecondaryColor + : CustomAppColors.kSmokeColor), + ), + child: CustomTextWidget( + text: title, + isExpanded: false, + fontColor: selected + ? CustomAppColors.kPrimaryColor + : CustomAppColors.kBlackColor, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ); + } +} + +class BuildDetailsWidget extends StatelessWidget { + const BuildDetailsWidget({ + super.key, + required this.details, + required this.title, + }); + + final String title; + final String details; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 20.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.only(bottom: 8.h), + child: CustomTextWidget( + isExpanded: false, + text: title, + fontWeight: FontWeight.w600, + fontColor: CustomAppColors.kDarkBlueTextColor, + fontSize: 14.sp), + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h), + decoration: BoxDecoration( + border: Border.all(color: CustomAppColors.kLightTextColor), + borderRadius: BorderRadius.circular(10.r)), + child: CustomTextWidget( + alignment: Alignment.centerLeft, + textAlign: TextAlign.left, + text: details, + isExpanded: false, + fontSize: 10.sp, + fontColor: CustomAppColors.kBlackColor, + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/rota/book_holiday_screen.dart b/lib/view/screens/rota/book_holiday_screen.dart new file mode 100644 index 0000000..0e03f50 --- /dev/null +++ b/lib/view/screens/rota/book_holiday_screen.dart @@ -0,0 +1,255 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/dialogs/widgets/holiday_request_sent_dialog.dart'; +import 'package:ftc_mobile_app/dialogs/widgets/holidays_data_dialog.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/staffWorkload/StaffWorkloadResponse.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import '../../custom_widgets/label_value_box_widget.dart'; + +class BookHolidayScreen extends StatefulWidget { + const BookHolidayScreen({Key? key}) : super(key: key); + + @override + State createState() => _BookHolidayScreenState(); +} + +class _BookHolidayScreenState extends State { + final controller = Get.put(BookHolidayScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: 'Book a Holiday', + ), + body: ListView( + children: [ + Obx(() { + return InkWell( + onTap: () => _onTotalHolidaysBoxTap(controller.myWorkLoads()), + child: LabelValueBoxWidget( + label: 'Total Holidays Left', + value: + '${controller.myWorkLoads()?.holidaysRemaining ?? 0} days (${controller.myWorkLoads()?.holidayAlwnNoOfHours ?? 0} hours)', + trailing: const Icon( + Icons.arrow_right_rounded, + color: Colors.black, + ), + ).addPaddingHorizontal(16), + ); + }), + 10.verticalSpace, + Obx( + () => CalendarWidget( + markedDatesMap: controller.markedDatesMap(), + minDate: DateTime.now().subtract(10.days), + targetDateTime: controller.targetDateTime.value, + canSelectRange: true, + rangeStart: controller.holidayStartDate(), + rangeEnd: controller.holidayEndDate(), + onRangeSelect: controller.onRangeSelect, + onDayTap: (date, _) => controller.targetDateTime(date), + ), + ), + 10.verticalSpace, + Padding( + padding: REdgeInsets.symmetric(horizontal: 16.0, vertical: 10), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //Start End date boxes + Row( + children: [ + Expanded( + child: Obx( + () => LabelValueBoxWidget( + label: "Start Date", + value: DateFormatter() + .getHolidayDate(controller.holidayStartDate()), + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 14.r), + child: Icon( + Icons.arrow_forward, + size: 20.0.sp, + ), + ), + Expanded( + child: Obx( + () => LabelValueBoxWidget( + label: "End Date", + value: DateFormatter() + .getHolidayDate(controller.holidayEndDate()), + ), + ), + ), + ], + ), + 10.verticalSpace, + SizedBox( + width: double.infinity, + child: Obx(() => LabelValueBoxWidget( + label: "Holiday Request", + value: + "${controller.holidayDays()} Days (${controller.holidayHours()} Hours)", + ))), + 20.verticalSpace, + AgreeToRulesWidget( + agreeToRules: controller.agreeToRules, + onTapViewBookingRules: () {}, + ), + 25.verticalSpace, + RequestHolidayButton( + onTap: _onRequestHolidayButtonTap, + ), + ], + ), + ), + ], + ), + ); + } + + _onTotalHolidaysBoxTap(StaffWorkLoads? workLoads) { + DateTime date = DateTime.now(); + if (workLoads?.endDate.isNotNullOrEmpty() == true) { + date = DateTime.parse(workLoads!.endDate!); + } + + final holidayData = HolidayModel( + carriedOver: "${workLoads?.carriedOverHours ?? 0} hours", + holidayEntitlement: + "${workLoads?.holidayEntitlement?.numberOfWeeks ?? 0} weeks (${workLoads?.holidayEntitlement?.numberOfDays ?? 0} days, ${workLoads?.holidayEntitlement?.numberOfHours ?? 0} hours)", + holidayAllowance: + "${workLoads?.holidayAlwnNoOfDys ?? 0} days (${workLoads?.holidayAlwnNoOfHours ?? 0} hours)", + remainingHolidays: + "${workLoads?.holidaysRemaining ?? 0} days (${workLoads?.holidayAlwnNoOfHours ?? 0} hours)", + timeLeftBeforeYearEnd: "${date.difference(DateTime.now()).inDays} days", + ); + + showDialog( + context: context, + builder: (BuildContext context) { + return HolidaysDataDialog(holidayModel: holidayData); + }); + } + + _onRequestHolidayButtonTap() async { + final isSuccess = await controller.requestHoliday(); + + if (isSuccess) { + Get.dialog(HolidayRequestSentDialog( + holidayStartDate: + DateFormatter().getHolidayDate(controller.holidayStartDate.value), + holidayEndDate: + DateFormatter().getHolidayDate(controller.holidayEndDate.value), + holidayTotalTime: + "${controller.holidayDays()} Days (${controller.holidayHours()} Hours)", + )); + } + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +class AgreeToRulesWidget extends StatelessWidget { + final RxBool agreeToRules; + final VoidCallback onTapViewBookingRules; + + const AgreeToRulesWidget({ + super.key, + required this.agreeToRules, + required this.onTapViewBookingRules, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + InkWell( + onTap: agreeToRules.toggle, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Obx( + () => Ink( + width: 24.r, + height: 24.r, + child: Checkbox( + value: agreeToRules.value, + activeColor: CustomAppColors.kSecondaryColor, + onChanged: (value) { + agreeToRules.value = value ?? false; + }, + ), + ), + ), + 10.horizontalSpace, + CustomTextWidget( + isExpanded: false, + text: 'Agree to the booking rules', + fontColor: Colors.black, + fontSize: 10.0.sp, + fontWeight: FontWeight.w400, + ), + ], + ), + ), + // const Spacer(), + // InkWell( + // onTap: () {}, + // child: Padding( + // padding: REdgeInsets.only(left: 8.0, top: 4.r, bottom: 4.r), + // child: CustomTextWidget( + // isExpanded: false, + // text: 'View Booking Rules', + // fontColor: CustomAppColors.kBlackColor, + // fontWeight: FontWeight.bold, + // fontSize: 10.sp, + // ), + // ), + // ), + ], + ); + } +} + +class RequestHolidayButton extends StatelessWidget { + final VoidCallback onTap; + + const RequestHolidayButton({super.key, required this.onTap}); + + @override + Widget build(BuildContext context) { + // final BookHolidayScreenController controller = + // Get.put(BookHolidayScreenController()); + return GestureDetector( + onTap: onTap, + child: Container( + width: MediaQuery.of(context).size.width, + height: 60.h, + alignment: Alignment.center, + decoration: BoxDecoration( + color: CustomAppColors.kSecondaryColor, + borderRadius: BorderRadius.circular(2.r), + ), + child: const CustomTextWidget( + text: "REQUEST HOLIDAY", fontColor: CustomAppColors.kPrimaryColor), + ), + ); + } +} diff --git a/lib/view/screens/rota/calendar_view_screen.dart b/lib/view/screens/rota/calendar_view_screen.dart new file mode 100644 index 0000000..f0966fe --- /dev/null +++ b/lib/view/screens/rota/calendar_view_screen.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; + +class CalendarScreen extends StatefulWidget { + const CalendarScreen({Key? key}) : super(key: key); + + @override + State createState() => _CalendarScreenState(); +} + +class _CalendarScreenState extends State { + final CalendarViewScreenController controller = + Get.find(); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.scaffoldKey, + onScreenTap: controller.removeFocus, + body: Obx( + () => controller.isLoading.value + ? const Center( + child: CircularProgressIndicator(), + ) + : Column( + children: [ + // Obx( + // () => SetMonthAndYearWidget( + // currentMonthName: controller.currentMonthName.value, + // nextMonthTap: controller.onNextMonthTap, + // previousMonthTap: controller.onPreviousMonthTap), + // ), + Obx( + () => CalendarWidget( + markedDatesMap: controller.events(), + targetDateTime: controller.targetDateTime.value, + onEventTap: (events) { + if (events.isNotEmpty) { + controller.selectedDate.value = + MarkDatesModel.addDate( + date: events.first.date, + title: events.first.title ?? ""); + controller.datesToShowList.value = [ + RotaShift( + name: "", + staffRequired: "", + workerType: "", + location: "", + startTime: controller.selectedDate.value.date + .toIso8601String(), + endTime: "", + breakTime: "", + notes: "") + ]; + } + }), + ), + 10.verticalSpace, + Expanded( + child: Obx( + () => ListView.builder( + itemCount: controller.datesToShowList.length, + itemBuilder: (BuildContext context, int index) { + Rx dateModel = + controller.datesToShowList[index].obs; + //Todo: RotaWidget need to reconfigure here + return SizedBox.shrink(); + // return RotaWidget( + // startDateTime: dateModel.value.shiftStartTime, + // endDateTime: dateModel.value.shiftEndTime); + }, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/screens/rota/export_rota_screens.dart b/lib/view/screens/rota/export_rota_screens.dart new file mode 100644 index 0000000..9b4e6fb --- /dev/null +++ b/lib/view/screens/rota/export_rota_screens.dart @@ -0,0 +1,5 @@ +export 'calendar_view_screen.dart'; +export 'rota_dashboard_screen.dart'; +export 'book_holiday_screen.dart'; +export 'pick_up_shifts_screen.dart'; +export 'your_rota_screen.dart'; \ No newline at end of file diff --git a/lib/view/screens/rota/new_rota_list_widget.dart b/lib/view/screens/rota/new_rota_list_widget.dart new file mode 100644 index 0000000..17c5f58 --- /dev/null +++ b/lib/view/screens/rota/new_rota_list_widget.dart @@ -0,0 +1,69 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; + +class NewRotaListWidget extends StatelessWidget { + final List shifts; + final Function(int index, DaysArrayData data)? onClaimShiftTap; + final Function(int index, DaysArrayData data)? onCancelShiftTap; + + final ScrollPhysics? physics; + + const NewRotaListWidget({ + super.key, + required this.shifts, + this.onClaimShiftTap, + this.onCancelShiftTap, + this.physics, + }); + + @override + Widget build(BuildContext context) { + return (shifts.isEmpty) + ? FrequentFunctions.centerText(text: "No shifts found") + : ListView.separated( + shrinkWrap: true, + itemCount: shifts.length, + physics: physics, + padding: REdgeInsets.symmetric(horizontal: 20), + separatorBuilder: (_, index) => 10.verticalSpace, + itemBuilder: (_, index) { + return RotaWidget( + data: shifts[index], + onViewShiftTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + return ShowRotaAlertDialog( + data: shifts[index], + onClaimShiftTap: () { + if (onClaimShiftTap != null) { + onClaimShiftTap!.call(index, shifts[index]); + } + }, + onCancelShiftTap: () { + if (onCancelShiftTap != null) { + onCancelShiftTap!.call(index, shifts[index]); + } + }, + ); + }); + + // onViewShiftTap(index, shifts[index]) + }, + ); + }, + ); + } + +// Container _upperTextWidget({required String text}) { +// return Container( +// padding: const EdgeInsets.only(left: 20), +// child: Text( +// text, +// style: const TextStyle( +// color: CustomAppColors.kLightTextColor, fontSize: 12), +// ), +// ); +// } +} diff --git a/lib/view/screens/rota/pick_up_shifts_screen.dart b/lib/view/screens/rota/pick_up_shifts_screen.dart new file mode 100644 index 0000000..0fa8c6d --- /dev/null +++ b/lib/view/screens/rota/pick_up_shifts_screen.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; +import 'new_rota_list_widget.dart'; + +class PickUpShiftsScreen extends StatefulWidget { + const PickUpShiftsScreen({Key? key}) : super(key: key); + + @override + State createState() => _PickUpShiftsScreenState(); +} + +class _PickUpShiftsScreenState extends State { + final _controller = Get.put(PickUpShiftsScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + screenKey: _controller.screenKey, + onScreenTap: _controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly(context, titleText: "Available Shifts"), + body: _getBody(), + ); + } + + Widget _getBody() { + return Obx( + () => _controller.loadingShifts() + ? const Center(child: CircularProgressIndicator()) + : NewRotaListWidget( + shifts: _controller.myShiftsList(), + onClaimShiftTap: _controller.claimShifts, + ), + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/rota/rota_dashboard_screen.dart b/lib/view/screens/rota/rota_dashboard_screen.dart new file mode 100644 index 0000000..d486d27 --- /dev/null +++ b/lib/view/screens/rota/rota_dashboard_screen.dart @@ -0,0 +1,206 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:get/get.dart'; +import 'new_rota_list_widget.dart'; + +class RotaDashboardScreen extends StatefulWidget { + const RotaDashboardScreen({Key? key}) : super(key: key); + + @override + State createState() => _RotaDashboardScreenState(); +} + +class _RotaDashboardScreenState extends State { + final _controller = Get.put(RotaDashboardScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + screenKey: _controller.screenKey, + onScreenTap: _controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly(context, titleText: 'Rota'), + body: _tabWidget(), + ); + } + + Widget _tabWidget() { + return Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 18.0.w, + ), + child: Row( + children: [ + Expanded( + child: _buttons( + onTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kPickUpShiftsScreenRoute, + ); + }, + text: "Pick up Shifts")), + 24.horizontalSpace, + Expanded( + child: _buttons( + onTap: () { + Navigator.pushNamed( + context, + CustomRouteNames.kBookHolidayScreenRoute, + ); + }, + text: "Book a Holiday")), + ], + ), + ), + Container( + width: Get.width, + alignment: Alignment.center, + child: TabBar( + controller: _controller.tabController, + unselectedLabelColor: CustomAppColors.kLightGreyColor, + labelColor: CustomAppColors.kSecondaryColor, + labelPadding: const EdgeInsets.all(0), + indicatorSize: TabBarIndicatorSize.tab, + indicatorColor: CustomAppColors.kSecondaryColor, + tabs: const [ + Tab( + child: Text( + "List", + textAlign: TextAlign.center, + maxLines: 2, + ), + ), + Tab( + child: Text( + "Calendar", + textAlign: TextAlign.center, + maxLines: 2, + ), + ), + ], + //Change + ), + ), + Expanded( + child: TabBarView( + controller: _controller.tabController, + children: [_yourRotaListTabView, _calandarTabView()], + ), + ), + ], + ); + } + + Widget _calandarTabView() { + return Column( + children: [ + Flexible( + child: Obx( + () { + return CalendarWidget( + key: UniqueKey(), + markedDatesMap: _controller.markedDatesMap(), + minDate: DateTime.now().subtract(40.days), + targetDateTime: _controller.targetDateTime(), + canSelectRange: false, + onDayTap: _controller.onDateSelect, + ); + }, + ), + ), + Expanded( + child: Obx( + () => NewRotaListWidget( + shifts: _controller.dateFilteredShiftsList(), + onCancelShiftTap: (int index, DaysArrayData data) {}, + ), + ), + ), + ], + ); + } + + Widget get _yourRotaListTabView { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _yourRotaHeader(), + Expanded( + child: Obx( + () => _controller.loadingShifts() + ? const Center(child: CircularProgressIndicator()) + : NewRotaListWidget( + shifts: _controller.myShiftsList(), + onCancelShiftTap: (int index, DaysArrayData data) {}, + ), + ), + ), + ], + ); + } + + Widget _yourRotaHeader() { + return InkWell( + onTap: () { + Navigator.pushNamed(context, CustomRouteNames.kYourRotaScreenRoute); + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomTextWidget( + text: "Your Rota", + fontSize: 16.sp, + fontWeight: FontWeight.w700, + isExpanded: false, + ), + const CustomImageWidget( + imagePath: AssetsManager.kArrowNextIcon, + ), + ], + ), + ), + ); + } + + Widget _buttons({required VoidCallback onTap, required String text}) { + return InkWell( + onTap: onTap, + child: Container( + height: 42.r, + width: double.maxFinite, + padding: REdgeInsets.all(10).copyWith(right: 2.r), + decoration: BoxDecoration( + border: Border.all( + color: CustomAppColors.kSecondaryColor, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomTextWidget( + text: text, + isExpanded: false, + fontWeight: FontWeight.w600, + fontSize: 14.sp), + Icon( + Icons.keyboard_arrow_right, + size: 20.r, + ), + ], + ), + ), + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/rota/your_rota_screen.dart b/lib/view/screens/rota/your_rota_screen.dart new file mode 100644 index 0000000..bbd4074 --- /dev/null +++ b/lib/view/screens/rota/your_rota_screen.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart'; +import 'package:get/get.dart'; + +import 'new_rota_list_widget.dart'; + +class YourRotaScreen extends StatefulWidget { + const YourRotaScreen({Key? key}) : super(key: key); + + @override + State createState() => _YourRotaScreenState(); +} + +class _YourRotaScreenState extends State { + final controller = Get.put(YourRotaScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBar( + showBoxShadow: false, + leadingButton: Container(), + titleWidget: Row( + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: CustomImageWidget( + imagePath: AssetsManager.kBackIcon, + height: 11.53.h, + width: 8.66.w, + ), + ), + SizedBox( + width: 15.w, + ), + CustomTextWidget( + text: "Your Rota", + isExpanded: false, + fontSize: 16.sp, + fontWeight: FontWeight.w700), + ], + ), + ), + body: _getBody(), + ); + } + + Widget _getBody() { + return Obx( + () => controller.loadingShifts() + ? const Center(child: CircularProgressIndicator()) + : NewRotaListWidget( + shifts: controller.myShiftsList(), + onCancelShiftTap: (int index, DaysArrayData data) {}, + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} + +// class UpperTextWidget extends StatelessWidget { +// const UpperTextWidget({ +// super.key, +// required this.text, +// }); +// +// final String text; +// +// @override +// Widget build(BuildContext context) { +// return Container( +// padding: const EdgeInsets.only(left: 20), +// child: Text( +// text, +// style: const TextStyle( +// color: CustomAppColors.kLightTextColor, fontSize: 12), +// ), +// ); +// } +// } diff --git a/lib/view/screens/settings/controller/settings_screen_controller.dart b/lib/view/screens/settings/controller/settings_screen_controller.dart new file mode 100644 index 0000000..2c94ccd --- /dev/null +++ b/lib/view/screens/settings/controller/settings_screen_controller.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class SettingsScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + @override + void onInit() { + super.onInit(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/view/screens/settings/settings_screen.dart b/lib/view/screens/settings/settings_screen.dart new file mode 100644 index 0000000..e5712e9 --- /dev/null +++ b/lib/view/screens/settings/settings_screen.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/dialogs/app_dialogs.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:get/get.dart'; +import '../../../ftc_mobile_app.dart'; +import 'controller/settings_screen_controller.dart'; + +class SettingsScreen extends StatefulWidget { + const SettingsScreen({Key? key}) : super(key: key); + + @override + State createState() => _SettingsScreenState(); +} + +class _SettingsScreenState extends State { + final controller = Get.put(SettingsScreenController()); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return CustomScaffold( + // onBackButton: () => controller.backButtonPressed(context), + backgroundColor: CustomAppColors.kPrimaryColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: "Settings", + ), + body: ListView( + children: [ + 16.verticalSpace, + const BuildIconButton( + iconPath: AssetsManager.kBellIcon, + text: 'Notification', + route: CustomRouteNames.kAllCareNotesScreenRoute, + arguments: null, + ), + const BuildIconButton( + iconPath: AssetsManager.kLockIcon, + text: 'Change Password', + route: CustomRouteNames.kCarePlanMenuScreenRoute, + arguments: null, + ), + 20.verticalSpace, + CustomAppButton( + buttonText: "LOGOUT", + buttonColor: CustomAppColors.kRedColor, + borderColor: CustomAppColors.kRedColor, + textColor: CustomAppColors.kPrimaryColor, + onTap: () { + AppDialog.alertAndLogout(() { + FrequentFunctions().logoutButtonPressed(context); + }); + }, + ).addPaddingHorizontal(22), + 18.verticalSpace, + ], + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/training/controller/trainings_screen_controller.dart b/lib/view/screens/training/controller/trainings_screen_controller.dart new file mode 100644 index 0000000..577e08d --- /dev/null +++ b/lib/view/screens/training/controller/trainings_screen_controller.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/training/TrainingResponseData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import 'package:ftc_mobile_app/utilities/frequent_functions.dart'; +import 'package:ftc_mobile_app/web_services/api_services.dart'; +import 'package:get/get.dart'; + +class TrainingsScreenController extends GetxController { + final GlobalKey screenKey = GlobalKey(); + + final trainings = [].obs; + + @override + void onReady() { + super.onReady(); + + getAllTrainings(); + } + + void removeFocus() { + FocusScope.of(screenKey.currentContext!).unfocus(); + } + + getAllTrainings() async { + final resp = await ApiService().allTrainingsList().showLoader(); + + if (resp is TrainingResponseData) { + //Todo: change this static user id here + trainings.value = resp.proposedTrainings ?? []; + } else { + if (resp.isNotNullOrEmpty()) { + FrequentFunctions.showToast(message: resp); + } + } + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} diff --git a/lib/view/screens/training/training_detail_screen.dart b/lib/view/screens/training/training_detail_screen.dart new file mode 100644 index 0000000..c69d9d5 --- /dev/null +++ b/lib/view/screens/training/training_detail_screen.dart @@ -0,0 +1,149 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/widgets.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/models/training/TrainingResponseData.dart'; +import 'package:get/get.dart'; + +class TrainingDetailScreenArgs { + final TrainingUsers data; + + TrainingDetailScreenArgs({required this.data}); +} + +class TrainingDetailScreen extends StatefulWidget { + final TrainingDetailScreenArgs args; + + const TrainingDetailScreen({super.key, required this.args}); + + @override + State createState() => _TrainingDetailScreenState(); +} + +class _TrainingDetailScreenState extends State { + ProposedTrainings? get _data => widget.args.data.trainingId; + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kWhiteColor, + screenKey: GlobalKey(), + onScreenTap: Get.focusScope?.unfocus, + showAppBar: true, + appBar: AppBar( + automaticallyImplyLeading: false, + title: CustomTextWidget( + text: "${_data?.prpsTrgType?.capitalizeFirst ?? ""} Training", + fontColor: Colors.white, + textAlign: TextAlign.left, + ), + backgroundColor: Theme.of(context).primaryColor, + centerTitle: false, + actions: const [ + CloseButton(color: Colors.white), + ], + ), + body: SafeArea( + child: ListView( + padding: REdgeInsets.symmetric(horizontal: 20), + children: [ + 16.verticalSpace, + _headerValueWidget( + heading: 'Training Title', + value: _data?.prpsName ?? "", + ), + 16.verticalSpace, + _headerValueWidget( + heading: 'Introduction', + value: _data?.prpsDescription ?? "", + ), + 16.verticalSpace, + Row( + children: [ + Expanded( + child: _headerValueWidget( + heading: 'Training Start Date', + value: DateFormatter.dateFormatter2.format( + DateTime.fromMillisecondsSinceEpoch( + _data?.prpsTrgStartDate ?? 0)), + ), + ), + Expanded( + child: _headerValueWidget( + heading: 'Training End Date', + value: DateFormatter.dateFormatter2.format( + DateTime.fromMillisecondsSinceEpoch( + _data?.prpsTrgEndDate ?? 0)), + ), + ), + ], + ), + 16.verticalSpace, + _headerValueWidget( + heading: 'Training Registration Date', + value: DateFormatter.dateFormatter2.format( + DateTime.fromMillisecondsSinceEpoch( + _data?.prpsTrgRegisterationDate ?? 0)), + ), + 16.verticalSpace, + Row( + children: [ + Expanded( + child: _headerValueWidget( + heading: 'Training Type', + value: _data?.prpsTrgType?.capitalizeFirst ?? "", + ), + ), + 12.horizontalSpace, + Expanded( + child: _headerValueWidget( + heading: 'Training Type', + value: _data?.prpsTrgClass?.capitalizeFirst ?? "", + ), + ), + ], + ), + 16.verticalSpace, + _headerValueWidget( + heading: 'Training Status', + value: _data?.prpsTrgStatus?.capitalizeFirst ?? "", + ), + ], + ), + ), + ); + } + + Widget _headerValueWidget({required String heading, required String value}) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _heading(heading), + 3.verticalSpace, + _subtext(value), + ], + ); + } + + Widget _heading(String text) { + return Text( + text, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w700, + color: Colors.black, + ), + ); + } + + Widget _subtext(String text) { + return Text( + text, + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w400, + ), + ); + } +} diff --git a/lib/view/screens/training/training_screen.dart b/lib/view/screens/training/training_screen.dart new file mode 100644 index 0000000..0d29cf5 --- /dev/null +++ b/lib/view/screens/training/training_screen.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/training/TrainingResponseData.dart'; +import 'package:get/get.dart'; + +import 'controller/trainings_screen_controller.dart'; +import 'training_detail_screen.dart'; + +class TrainingsScreen extends StatefulWidget { + const TrainingsScreen({Key? key}) : super(key: key); + + @override + State createState() => _TrainingsScreenState(); +} + +class _TrainingsScreenState extends State { + final controller = Get.put(TrainingsScreenController()); + + @override + Widget build(BuildContext context) { + return CustomScaffold( + backgroundColor: CustomAppColors.kSmokeColor, + screenKey: controller.screenKey, + onScreenTap: controller.removeFocus, + showAppBar: true, + appBar: CustomAppBarTitleOnly( + context, + titleText: "Training", + ), + body: SafeArea( + child: _listView(), + ), + ); + } + + Widget _listView() { + return Obx(() { + final list = controller.trainings(); + return (list.isEmpty) + ? Container( + color: Colors.white, + child: const Center( + child: Text("No data found"), + ), + ) + : ListView.separated( + itemCount: list.length, + itemBuilder: (_, index) { + final item = list[index]; + return _listItem(item); + }, + separatorBuilder: (_, i) => 8.verticalSpace, + ); + }); + } + + Widget _listItem(TrainingUsers item) { + return InkWell( + onTap: () { + Get.toNamed(CustomRouteNames.kTrainingDetailScreen, + arguments: TrainingDetailScreenArgs(data: item)); + }, + child: Container( + decoration: const BoxDecoration(color: Colors.white), + padding: REdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomTextWidget( + text: item.trainingId?.prpsName ?? "", + textAlign: TextAlign.left, + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + CustomTextWidget( + text: + "Start date: ${DateFormatter.dateFormatter2.format(DateTime.fromMillisecondsSinceEpoch(item.trainingId?.prpsTrgStartDate ?? 0).toLocal())}", + fontColor: Colors.grey, + textAlign: TextAlign.left, + fontSize: 12.sp, + ), + 4.verticalSpace, + CustomTextWidget( + text: + "Status: ${item.trainingId?.prpsTrgStatus?.capitalizeFirst ?? ""}", + textAlign: TextAlign.left, + fontColor: Colors.black, + fontSize: 14.sp, + maxLines: 3, + fontWeight: FontWeight.w500, + ) + ], + ), + ), + const Icon(Icons.keyboard_arrow_right_rounded) + ], + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/view/screens/webview/controller/webview_screen_controller.dart b/lib/view/screens/webview/controller/webview_screen_controller.dart new file mode 100644 index 0000000..cb68d9d --- /dev/null +++ b/lib/view/screens/webview/controller/webview_screen_controller.dart @@ -0,0 +1,5 @@ +import 'package:get/get.dart'; + +class WebviewScreenController extends GetxController { + final isLoading = false.obs; +} diff --git a/lib/view/screens/webview/webview_screen.dart b/lib/view/screens/webview/webview_screen.dart new file mode 100644 index 0000000..ce930b2 --- /dev/null +++ b/lib/view/screens/webview/webview_screen.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:get/get.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import 'controller/webview_screen_controller.dart'; + +class WebviewScreenArgument { + final String title; + final String url; + final bool willPop; + + WebviewScreenArgument( + {Key? key, required this.title, required this.url, this.willPop = true}); +} + +class WebviewScreen extends StatefulWidget { + final WebviewScreenArgument args; + + const WebviewScreen({Key? key, required this.args}) : super(key: key); + + @override + _WebviewScreenState createState() => _WebviewScreenState(); +} + +class _WebviewScreenState extends State { + final controller = + Get.put(WebviewScreenController()); + late final WebViewController webViewController; + + @override + void initState() { + super.initState(); + + webViewController = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) {}, + onPageStarted: (String url) { + controller.isLoading.value = true; + }, + onPageFinished: (String url) { + controller.isLoading.value = false; + }, + onHttpError: (HttpResponseError error) {}, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest request) { + if (request.url.startsWith('https://www.youtube.com/')) { + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.args.url)); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: CustomAppBarTitleOnly( + context, + titleText: widget.args.title, + ), + body: Obx(() { + return Stack( + children: [ + Positioned.fill( + // child: WebViewWidget(controller: webController), + child: WebViewWidget(controller: webViewController), + ), + Positioned.fill( + child: (controller.isLoading()) + ? Center( + child: CircularProgressIndicator( + color: Get.theme.primaryColor)) + : FrequentFunctions.noWidget, + ), + ], + ); + }), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} diff --git a/lib/web_services/api_services.dart b/lib/web_services/api_services.dart new file mode 100644 index 0000000..eda0961 --- /dev/null +++ b/lib/web_services/api_services.dart @@ -0,0 +1,40 @@ +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/training/TrainingResponseData.dart'; +import 'package:ftc_mobile_app/utilities/enums/api_method.dart'; + +class ApiService { + static final ApiService _instance = ApiService._private(); + + ApiService._private(); + + factory ApiService() { + return _instance; + } + + final HttpRequestClient _httpClient = HttpRequestClient(); + + Future allTrainingsList() async { + Map requestBody = { + "sortorder": -1, + "offset": 0, + "limit": 50, + "query": { + "critarion": { + "user": "658adee559e19fef22ce1a17" + } + } + }; + + ResponseModel responseModel = await _httpClient.safeApiCall( + method: ApiMethod.post, + url: WebUrls.allTrainings, + body: requestBody, + ); + + if ((responseModel.statusCode ~/ 100) == 2) { + return TrainingResponseData.fromJson(responseModel.data); + } else { + return responseModel.statusDescription; + } + } +} diff --git a/lib/web_services/auth_services.dart b/lib/web_services/auth_services.dart new file mode 100644 index 0000000..1807ab7 --- /dev/null +++ b/lib/web_services/auth_services.dart @@ -0,0 +1,130 @@ +import '../ftc_mobile_app.dart'; + +class AuthService { + static final AuthService _instance = AuthService._constructor(); + + AuthService._constructor(); + + factory AuthService() { + return _instance; + } + + final HttpRequestClient _httpClient = HttpRequestClient(); + + // final LocalStorageManager _sessionManagement = LocalStorageManager(); + + Future loginUser( + {required String email, + required String password, + bool isRememberMe = false}) async { + Map requestBody = { + "email": email, + "password": password, + "fcm_tokens": { + "token": + "fY6_DGfGQ06OW4BUVEsEwG:APA91bGUFza2uhaaR0miN2jtY0ut7RuA5ObleZvqv2X8KLOBgksmDmgc9sHDdea-DBvHmz1aUwX1uhkysk92x50WQCLHPDD1VwGX5ybKhUwVdq4aBfI24vhXqMB-FksWXEZwzDAi9BA_", + // "token": "${await FirebaseMessaging.instance.getToken()}", + "deviceType": "android" + } + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.signInUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + //verify Otp and if success storing token and user data + Future verifyOtp({required String verificationCode}) async { + Map requestBody = { + "email": LocalStorageManager.getSessionToken( + tokenKey: LocalStorageKeys.kSaveEmailKey), + "verification_code": verificationCode, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.verifyCodeUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription == "Code verified successfully") { + + final data = UserModel.fromJson(responseModel.data ?? {}); + + LocalStorageManager.setLoginToken(responseModel.userToken); + LocalStorageManager.setUserId(data.id); + // await LocalStorageManager.saveSession( + // tokenKey: LocalStorageKeys.kUserModelKey, + // tokenValue: + // json.encode(UserModel.fromJson(responseModel.data ?? "").toJson()), + // ); + // FrequentFunctions.userModel.value = + // UserModel.fromJson(responseModel.data ?? ""); + return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future passwordLessLogin( + {required String email, bool isRememberMe = false}) async { + Map requestBody = { + "email": email, + "expiryTime": "3m", + "fcm_tokens": { + "token": + "fY6_DGfGQ06OW4BUVEsEwG:APA91bGUFza2uhaaR0miN2jtY0ut7RuA5ObleZvqv2X8KLOBgksmDmgc9sHDdea-DBvHmz1aUwX1uhkysk92x50WQCLHPDD1VwGX5ybKhUwVdq4aBfI24vhXqMB-FksWXEZwzDAi9BA_", + "deviceType": "android" + } + }; + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.passwordLessSignInUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future forgetPassword({required String email}) async { + Map requestBody = { + "email": email, + // "fcm_tokens": { + // "token": + // "fY6_DGfGQ06OW4BUVEsEwG:APA91bGUFza2uhaaR0miN2jtY0ut7RuA5ObleZvqv2X8KLOBgksmDmgc9sHDdea-DBvHmz1aUwX1uhkysk92x50WQCLHPDD1VwGX5ybKhUwVdq4aBfI24vhXqMB-FksWXEZwzDAi9BA_", + // "deviceType": "android" + // } + }; + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.forgetPasswordUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return true; + } else { + return responseModel.statusDescription; + } + } +} diff --git a/lib/web_services/chat_services.dart b/lib/web_services/chat_services.dart new file mode 100644 index 0000000..4959d6b --- /dev/null +++ b/lib/web_services/chat_services.dart @@ -0,0 +1,328 @@ +import 'dart:io'; + +import 'package:dio/dio.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/chat/ChatModel.dart'; +import 'package:ftc_mobile_app/models/chat/add_group_message_model.dart'; +import 'package:ftc_mobile_app/models/chat/all_group_messages_model.dart'; +import 'package:ftc_mobile_app/models/chat/all_single_chat_message_model.dart'; +import 'package:ftc_mobile_app/models/chat/combined_last_messages_model_class.dart'; +import '../models/chat/single_chat.dart'; + +enum MessageType { file, message } + +class ChatService { + static final ChatService _instance = ChatService._private(); + + ChatService._private(); + + factory ChatService() { + return _instance; + } + + final HttpRequestClient _httpClient = HttpRequestClient(); + + Future _uploadFile({ + required String filePath, + }) async { + final formData = FormData(); + formData.files.add(MapEntry( + "attachment", + MultipartFile.fromFileSync(filePath), + )); + + ResponseModel responseModel = await _httpClient.safeFormDataRequest( + url: WebUrls.uploadMessageAttachmentsURL, + body: formData, + ); + + print("responseModel is : ${responseModel.toJson()}"); + + if ((responseModel.statusCode ~/ 100) == 2) { + //Success response + return responseModel.data; // returning file path from response + } else { + return { + "message": responseModel.statusDescription, + }; + } + + // final files = {"attachment": filePath}; + // ResponseModel responseModel = await _httpClient.postMultipartRequest( + // files: files, + // url: WebUrls.uploadMessageAttachmentsURL, + // ); + // + // if (responseModel.statusCode ~/ 100 == 2) { + // print("got data as: ${responseModel.data}"); + // return responseModel.data; + // } else { + // return { + // "message": responseModel.statusDescription, + // }; + // } + } + + Future addSingleMessage({ + required String message, + required MessageType messageType, + File? file, + required String senderId, + required String receiverId, + }) async { + Map requestBody = { + "from": senderId, + "to": receiverId, + "message": message, + "messageType": messageType.name, + }; + + if (messageType == MessageType.file) { + if (file == null) { + return { + "message": "Please select file to upload", + }; + } + + final resp = await _uploadFile(filePath: file.path); + print("upload resp: $resp"); + if (resp is String) { + requestBody['message'] = resp; //overriding message in case of file send + requestBody['filePath'] = resp; + } else { + return { + "message": "Failed to send file", + }; + } + } + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addSingleMessageChatURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("message added")) { + if (responseModel.data is List && responseModel.data.length > 0) { + SingleChatModelClass singleChatModelClass = + SingleChatModelClass.fromJson(responseModel.data[0]); + return singleChatModelClass; + } else { + SingleChatModelClass singleChatModelClass = + SingleChatModelClass.fromJson(responseModel.data); + return singleChatModelClass; + } + // return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future addGroupMessageService( + {required String message, + required MessageType messageType, + File? file, + required String groupId, + required String userId}) async { + Map requestBody = { + "groupId": groupId, + "userId": userId, + "message": message, + "messageType": messageType.name, + }; + + if (messageType == MessageType.file) { + if (file == null) { + return { + "message": "Please select file to upload", + }; + } + + final resp = await _uploadFile(filePath: file.path); + print("upload resp: $resp"); + if (resp is String) { + requestBody['message'] = resp; //overriding message in case of file send + requestBody['filePath'] = resp; + } else { + return { + "message": "Failed to send file", + }; + } + } + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addGroupMessageServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + if (responseModel.data is List && responseModel.data.length > 0) { + AddDeleteUpdateGroupMessageModel addGroupMessage = + AddDeleteUpdateGroupMessageModel.fromJson(responseModel.data[0]); + return addGroupMessage; + } else { + AddDeleteUpdateGroupMessageModel addGroupMessage = + AddDeleteUpdateGroupMessageModel.fromJson(responseModel.data); + return addGroupMessage; + } + // return true; + } else { + return responseModel.statusDescription; + } + } + + Future combinedLastMessage({required String userId}) async { + Map requestBody = { + "userId": userId, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.combinedLastMessageURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("group messages")) { + if (responseModel.data is List && responseModel.data.length > 0) { + CombinedMessageModel combinedMessageModel = + CombinedMessageModel.fromJson(responseModel.data[0]); + return combinedMessageModel; + } else { + CombinedMessageModel combinedMessageModel = + CombinedMessageModel.fromJson(responseModel.data); + return combinedMessageModel; + } + // return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future allGroupMessages({ + required int sortOrder, + required int offset, + required int limit, + required String groupId, + required bool isDeleted, + }) async { + Map requestBody = { + "sortProperty": "createdAt", + "sortOrder": sortOrder, + "offset": offset, + "limit": limit, + "query": { + "critarion": {"groupId": groupId, "isDeleted": false} + } + }; + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.allGroupMessagesURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + if (responseModel.data is List && responseModel.data.length > 0) { + List listOfMessages = []; + for (final item in responseModel.data) { + listOfMessages.add(AllGroupMessages.fromJson(item)); + } + return listOfMessages; + } else { + return []; + } + } else { + return responseModel.statusDescription; + } + } + + Future allSingleChatMessages({required String userId}) async { + Map requestBody = { + "userId": userId, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.allSingleChatMessagesURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("all messages load")) { + if (responseModel.data is List && responseModel.data.length > 0) { + List listOfMessages = []; + for (var item in responseModel.data) { + listOfMessages.add(AllSingleChatMessages.fromJson(item)); + } + return listOfMessages; + } else { + AllSingleChatMessages allSingleChatMessages = + AllSingleChatMessages.fromJson(responseModel.data); + return allSingleChatMessages; + } + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future allSingleUsersChatMessagesServerAdmin({ + required String to, + required String from, + }) async { + Map requestBody = { + "to": to, + "from": from, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.allSingleChatMessagesServiceAdminURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + if (responseModel.data is List && responseModel.data.length > 0) { + List listOfMessages = []; + for (final item in responseModel.data) { + listOfMessages.add(ChatModel.fromJson(item)); + } + return listOfMessages; + } else { + // AllSingleUsersChats allSingleUsersChats = + // AllSingleUsersChats.fromJson(responseModel.data); + return []; + } + } else { + return responseModel.statusDescription; + } + } +} diff --git a/lib/web_services/client_services.dart b/lib/web_services/client_services.dart new file mode 100644 index 0000000..9c4d0bd --- /dev/null +++ b/lib/web_services/client_services.dart @@ -0,0 +1,1202 @@ +import 'package:dio/dio.dart'; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:ftc_mobile_app/models/clients/PBSPlanModel.dart'; +import 'package:ftc_mobile_app/models/clients/allCareNotes/AllCareNotesListResponse.dart'; +import 'package:ftc_mobile_app/models/clients/allCareNotes/CareNoteData.dart'; +import 'package:ftc_mobile_app/models/clients/body_points_category.dart'; +import 'package:ftc_mobile_app/models/clients/consent_details_model.dart'; +import 'package:ftc_mobile_app/models/clients/memoryListResponse/MemoryListResponse.dart'; +import 'package:ftc_mobile_app/models/clients/memoryListResponse/MemoryListResponseData.dart'; +import 'package:ftc_mobile_app/models/clients/recent_incidents_model.dart'; +import 'package:ftc_mobile_app/models/clients/add_pbs_plan_model.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/GetRiskAssessmentResponse.dart'; +import 'package:ftc_mobile_app/models/clients/riskAssessmentResponse/RiskAssessmentData.dart'; +import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; +import '../models/appointmentsListResponse/AppointmentsListResponse.dart'; +import '../models/clients/HealthIssuesDetailsModel.dart'; +import '../models/clients/allClientsList/AllClientsResponse.dart'; +import '../models/clients/documents_list_model.dart'; +import '../models/create_care_plan_request.dart'; +import '../models/profile_screen_model.dart'; + +class ClientService { + static final ClientService _instance = ClientService._private(); + + ClientService._private(); + + factory ClientService() { + return _instance; + } + + final HttpRequestClient _httpClient = HttpRequestClient(); + + Future getUserDetails() async { + // String userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // UserModel userModel = UserModel.fromJson(json.decode(userJson)); + Map requestBody = { + "sortproperty": "createdAt", + "sortorder": -1, + "offset": 0, + "limit": 1, + "query": { + "critarion": { + "active": true, + "_id": LocalStorageManager.userId, + }, + "addedby": "_id email name", + "lastModifiedBy": "_id email name" + }, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.userProfileUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + final profileDataModel = ProfileDataModel.fromJson({ + 'status': "${responseModel.statusCode}", + "data": responseModel.data, + 'message': responseModel.statusDescription, + }); + // await LocalStorageManager.saveSession( + // tokenKey: LocalStorageKeys.kProfileModelKey, + // tokenValue: json.encode(profileDataModel.toJson()), + // ); + return profileDataModel; + } else { + return responseModel.statusDescription; + } + } + + Future addConsentDetails( + {required String description, required String staffId}) async { + Map requestBody = { + "staffId": staffId, + "active": true, + "description": description, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addConsentUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .contains("Consent Template added successfully")) { + if (responseModel.data is List && responseModel.data.length > 0) { + ConsentDetailsModel consentDetailsModel = + ConsentDetailsModel.fromJson(responseModel.data[0]); + return consentDetailsModel; + } else { + ConsentDetailsModel consentDetailsModel = + ConsentDetailsModel.fromJson(responseModel.data); + return consentDetailsModel; + } + // return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getConsentDetails({required String staffId}) async { + Map requestBody = { + "sortproperty": "createdAt", + "sortorder": -1, + "staffId": staffId, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getConsentListUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + List consentList = []; + if (responseModel.data is List) { + for (var singleEntry in responseModel.data) { + consentList.add(ConsentDetailsModel.fromJson(singleEntry)); + } + } else {} + return consentList; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future deleteConsent({required String consentId}) async { + Map requestBody = { + "templateId": consentId, + }; + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.deleteConsentUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase() == + "template removed successfully") { + return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future updateConsentDetails( + {required String description, required String consentId}) async { + Map requestBody = { + "templateId": consentId, + "description": description, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.updateConsentUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription == "Updated successfully") { + return true; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getServiceUsersList({ + String searchText = "", + int limit = 20, + int offset = 0, + }) async { + Map requestBody = { + "sortproperty": "createdAt", + "sortorder": -1, + "offset": offset, + "limit": limit, + "searchText": searchText, + "query": { + "critarion": {"role": "serviceuser"} + } + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getServiceUsersListUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + final resp = AllClientsResponseData.fromJson(responseModel.data); + + // List serviceUsers = []; + // for (var singleUser in responseModel.data['serviceUsers']) { + // serviceUsers.add(ServiceUserModel.fromJson(singleUser)); + // } + return AllClientsResponse(success: true, data: resp); + } else { + return AllClientsResponse( + success: false, + message: responseModel.statusDescription, + ); + } + } + + Future getAllUsersList({ + String searchText = "", + int limit = 20, + int offset = 0, + }) async { + Map requestBody = { + "sortproperty": "createdAt", + "sortorder": -1, + "offset": 0, + "query": { + "critarion": {"active": true, "role": "staffmember"} + } + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.listAllUsers, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + final resp = AllClientsResponseData.fromJson(responseModel.data); + + // List serviceUsers = []; + // for (var singleUser in responseModel.data['serviceUsers']) { + // serviceUsers.add(ServiceUserModel.fromJson(singleUser)); + // } + return AllClientsResponse(success: true, data: resp); + } else { + return AllClientsResponse( + success: false, + message: responseModel.statusDescription, + ); + } + } + + Future getBodyPointsCategoryList() async { + Map requestBody = {}; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getBodyPointsCategoryListURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("category list")) { + List bodyPointsCategoryList = []; + for (var singleUser in responseModel.data) { + bodyPointsCategoryList.add(BodyPointsCategory.fromJson(singleUser)); + } + return bodyPointsCategoryList; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future addHealthIssue({ + required String userId, + required String category, + required String healthNote, + required String complaint, + }) async { + Map requestBody = { + "userId": userId, + "category": category, + "healthNote": healthNote, + "complaint": complaint, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addHealthIssuesURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return HealthIssueDetailsModel.fromJson(responseModel.data); + } else { + return responseModel.statusDescription; + } + } + + Future getHealthIssues({required String userId}) async { + // String userJson = _sessionManagement.getSessionToken( + // tokenKey: SessionKeys.kUserModelKey, + // ); + // UserModel userModel = UserModel.fromJson(json.decode(userJson)); + + Map requestBody = { + "userId": userId, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getHealthIssuesListURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("health issues list")) { + List healthIssuesDetailsList = []; + for (var singleHealthIssue in responseModel.data) { + healthIssuesDetailsList + .add(HealthIssueDetailsModel.fromJson(singleHealthIssue)); + } + return healthIssuesDetailsList; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future updateHealthIssueData({ + required String issueId, + required String categoryId, + bool? status, + String? complaint, + String? healthNote, + }) async { + Map requestBody = { + "issueId": issueId, + "category": categoryId, + }; + + if (status != null) { + requestBody['status'] = status; + } + + if (complaint.isNotNullOrEmpty()) { + requestBody['complaint'] = complaint; + } + + if (healthNote.isNotNullOrEmpty()) { + requestBody['healthNote'] = healthNote; + } + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.updateHealthIssueURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return BodyPointsCategory.fromJson(responseModel.data); + } else { + return responseModel.statusDescription; + } + } + + Future healthIssueChildCategory({required String categoryId}) async { + Map requestBody = { + "categoryId": categoryId, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getHealthIssueChildCategoryListURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + List subCatList = []; + for (var singleSubCat in responseModel.data) { + subCatList.add(SubCat.fromJson(singleSubCat)); + } + return subCatList; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future addRecentIncidentService( + {required String userId, + required String incidentTitle, + required String note, + required int incidentDate}) async { + Map requestBody = { + "userId": userId, + "note": note, + "incidentTitle": incidentTitle, + "incidentDate": incidentDate, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addRecentIncidentServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + RecentIncidentsModel recentIncidentsModel = + RecentIncidentsModel.fromJson(responseModel.data); + return recentIncidentsModel; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getRecentIncidentsListService( + {required String userId}) async { + Map requestBody = { + "query": { + "critarion": { + "userId": userId, + "active": true, + }, + }, + "sortProperty": "createdAt", + "sortOrder": -1, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getRecentIncidentsListServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + List recentIncidentsModelList = []; + if (responseModel.data is List) { + for (var data in responseModel.data) { + recentIncidentsModelList.add(RecentIncidentsModel.fromJson(data)); + } + return recentIncidentsModelList; + } else { + return responseModel.statusDescription; + } + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future updateRecentIncidentService({ + required String incidentId, + required String incidentTitle, + required String incidentNote, + required int incidentDate, + }) async { + Map requestBody = { + "id": incidentId, + "incidentDate": incidentDate, + "incidentTitle": incidentTitle, + "note": incidentNote, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.updateRecentIncidentServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + if (responseModel.data is Map) { + return RecentIncidentsModel.fromJson(responseModel.data); + } else { + return responseModel.statusDescription; + } + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future deleteRecentIncident({required String incidentId}) async { + Map requestBody = { + "id": incidentId, + }; + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.deleteRecentIncidentUrl, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("success")) { + if (responseModel.data is Map) { + return RecentIncidentsModel.fromJson(responseModel.data); + } else { + return responseModel.statusDescription; + } + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future addPbsPlanService( + {required String userId, + required String staffId, + required String postIncidentSupport, + required String reactiveStartegies, + required String secondaryPrevention, + required String managementOfBehaviorPlan, + required String aboutPlan}) async { + Map requestBody = { + "userId": userId, + "staffId": staffId, + "postIncidentSupport": postIncidentSupport, + "reactiveStartegies": reactiveStartegies, + "secondaryPrevention": secondaryPrevention, + "managementOfBehaviorPlan": managementOfBehaviorPlan, + "aboutPlan": aboutPlan, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addPbsPlanServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("added")) { + print( + '---------data is not null returning PBSListDataJson model from service'); + AddPBSPlanModel addPBSPlanModel = + AddPBSPlanModel.fromJson(responseModel.data); + return addPBSPlanModel; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future updatePbsPlanService( + {required String id, + required String userId, + required String staffId, + required String postIncidentSupport, + required String reactiveStartegies, + required String secondaryPrevention, + required String managementOfBehaviorPlan, + required String aboutPlan}) async { + Map requestBody = { + "userId": userId, + "staffId": staffId, + "postIncidentSupport": postIncidentSupport, + "reactiveStartegies": reactiveStartegies, + "secondaryPrevention": secondaryPrevention, + "managementOfBehaviorPlan": managementOfBehaviorPlan, + "aboutPlan": aboutPlan, + "id": id, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.updatePbsPlanServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("pbsplan updated")) { + return AddPBSPlanModel.fromJson(responseModel.data); + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getPbsPlanListService({required String userId}) async { + Map requestBody = { + "query": { + "critarion": {"userId": userId} + }, + "sortProperty": "createdAt", + "sortOrder": -1 + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getPbsPlanServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("pbs plan list")) { + PBSListDataJson pbsDataJsonModel = PBSListDataJson.empty(); + if (responseModel.data != null) { + pbsDataJsonModel = PBSListDataJson.fromJson(responseModel.data); + return pbsDataJsonModel; + } else { + return responseModel.statusDescription; + } + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future deletePbsPlanService({required String pbsId}) async { + Map requestBody = { + "pbsId": pbsId, + }; + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.deletePbsPlanServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription.toLowerCase().contains("deleted")) { + return true; + // if(responseModel.data is Map){ + // return RecentIncidentsModel.fromJson(responseModel.data); + // } + // else{ + // return responseModel.statusDescription; + // } + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getDocumentListService( + {required String serviceUserId}) async { + Map requestBody = { + "sortProperty": "createdAt", + "sortOrder": -1, + // "offset": 0, + // "limit": 10, + "query": { + "critarion": {"userId": serviceUserId} + } + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getDocumentsListServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("document list")) { + if (responseModel.data != null) { + return DocumentsListModel.fromJson(responseModel.data); + } else { + return DocumentsListModel.empty(); + } + } else { + return responseModel.statusDescription; + } + } + + Future addDocumentService({ + required String userId, + required String docPath, + required String docDetails, + required String title, + required String addedBy, + }) async { + if (docPath.isEmpty) { + return "Please select document file first"; + } + + final resp = await uploadDocumentService(docPath: docPath); + + if (resp is! String) { + return; + } + + Map requestBody = { + "userId": userId, + "docPath": resp, + "details": docDetails, + "title": title, + "addedBy": addedBy, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addDocumentServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + (responseModel.statusDescription + .toLowerCase() + .contains("dcoument added") || + responseModel.statusDescription + .toLowerCase() + .contains("document added"))) { + print( + '---------data is not null returning Dcoument Added model from service'); + DocumentModel documentModel = DocumentModel.fromJson(responseModel.data); + return documentModel; + } else { + responseModel.statusDescription; + } + } + + Future updateDocumentService({ + required String userId, + required String docId, + required String docPath, + required String docDetails, + required String title, + required String addedBy, + }) async { + Map requestBody = { + "userId": userId, + "documentId": docId, + "docPath": docPath, + "details": docDetails, + "title": title, + "addedBy": addedBy, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.updateDocumentServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return DocumentModel.fromJson(responseModel.data); + } else { + return responseModel.statusDescription; + } + } + + Future deleteDocumentService({required String docId}) async { + Map requestBody = { + "documentId": docId, + }; + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.deleteDocServiceURL, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && + responseModel.statusCode <= 230 && + responseModel.statusDescription + .toLowerCase() + .contains("document removed successfully")) { + if (responseModel.data['deletedCount'] == 0) { + return true; + } else { + return false; + } + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future uploadDocumentService({ + required String docPath, + }) async { + final files = {"attachements": docPath}; + ResponseModel responseModel = await _httpClient.postMultipartRequest( + files: files, + url: WebUrls.uploadDocServiceURL, + ); + + if (responseModel.statusDescription + .toLowerCase() + .contains("file uploaded successfully")) { + return responseModel.data[0] + ["fileNameInDirectory"]; // returning file path from response + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future createCarePlan({ + required CreateCarePlanRequest request, + }) async { + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.createCarePlanURL, + requestBody: request.toJson(), + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return responseModel; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getCarePlansList( + {required String serviceUserId, int limit = 20, int offset = 0}) async { + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getCarePlansListURL, + requestBody: { + "query": { + "critarion": { + "userId": serviceUserId, + "active": true + } + }, + "sortproperty": "eventDateTime", + "sortorder": -1, + "limit": limit, + "offset": offset + }, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + print("getCarePlansList responseModel: ${responseModel.toJson()}"); + return AllCareNotesListResponse.success() + ..message = responseModel.statusDescription + ..data = CareNoteData.fromJson(responseModel.data); + } else { + return responseModel.statusDescription; + } + } + + Future getAppointmentsList( + {required String serviceId, + required int startDate, + required int endDate}) async { + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getAppointmentsByDate, + requestBody: { + "userId": serviceId, + "startDate": startDate, + "endDate": endDate, + }, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + if (responseModel.data is List && + (responseModel.data as List).isNotNullOrEmpty()) { + return AppointmentsListResponse( + success: true, + data: (responseModel.data as List) + .map((e) => AppointmentsListResponseData.fromJson(e)) + .toList()); + } + + return AppointmentsListResponse(success: true, data: []); + // print("getCarePlansList responseModel: ${responseModel.toJson()}"); + // return AllCareNotesListResponse.success() + // ..message = responseModel.statusDescription + // ..data = CareNoteData.fromJson(responseModel.data); + } else { + return AppointmentsListResponse( + success: false, message: responseModel.statusDescription); + } + } + + Future getRiskAssessments( + {required String serviceUserId}) async { + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getRiskAssesments, + requestBody: {"userId": serviceUserId}, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + if (responseModel.data is List && + (responseModel.data as List).isNotNullOrEmpty()) { + return GetRiskAssessmentResponse( + success: true, + data: (responseModel.data as List) + .map((e) => RiskAssessmentData.fromJson(e)) + .toList()); + } + + return GetRiskAssessmentResponse(success: true, data: []); + } else { + return GetRiskAssessmentResponse( + success: false, message: responseModel.statusDescription); + } + } + + Future getMemoryList( + {required String serviceUserId}) async { + final req = { + "query": { + "critarion": {"userId": serviceUserId} + }, + "sortproperty": "createdAt", + "sortorder": -1 + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.getMemoryList, + requestBody: req, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + if (responseModel.data is Map) { + return MemoryListResponse( + success: true, + data: MemoryListResponseData.fromJson(responseModel.data)); + } + + return MemoryListResponse(success: false); + } else { + return MemoryListResponse( + success: false, message: responseModel.statusDescription); + } + } + + Future createRiskAssesments( + {required RiskAssessmentData data}) async { + final req = { + "userId": data.userId, + "hazard": data.hazard, + "personsExposedToHazard": data.personsExposedToHazard, + "riskIdentified": data.riskIdentified, + "coldMeasureRequired": data.coldMeasureRequired, + "pureRiskRating": { + "c": data.pureRiskRating?.c ?? 1, + "l": "${data.pureRiskRating?.l ?? 1}", + "r": "${data.pureRiskRating?.r ?? 1}", + }, + "inPlace": { + "y": "${data.inPlace?.y ?? 1}", + "n": "${data.inPlace?.n ?? 1}", + }, + "residualRiskRating": { + "c": "${data.residualRiskRating?.c ?? 1}", + "l": "${data.residualRiskRating?.l ?? 1}", + "r": "${data.residualRiskRating?.r ?? 1}", + } + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.createRiskAssesments, + requestBody: req, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + + if ((responseModel.statusCode ~/ 100) == 2) { + return true; + } else { + return responseModel.statusDescription; + } + } + + Future uploadMemoryBoxFile({ + required String filePath, + }) async { + final formData = FormData(); + formData.files.add(MapEntry( + "file", + MultipartFile.fromFileSync(filePath), + )); + + ResponseModel responseModel = await _httpClient.safeFormDataRequest( + url: WebUrls.uploadMemoryBoxFile, + body: formData, + ); + + print("responseModel is : ${responseModel.toJson()}"); + + if ((responseModel.statusCode ~/ 100) == 2) { + //Success response + return responseModel.data; // returning file path from response + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + //return true if success else error message string + Future addMemoryBoxFile({ + required String userId, + required String filePath, + required String noteDetails, + }) async { + if (filePath.isEmpty) { + return "Please select file first"; + } + + final resp = await uploadMemoryBoxFile(filePath: filePath); + if (resp is Map) { + return resp['message']; + } + + // String userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // UserModel userModel = UserModel.fromJson(json.decode(userJson)); + + Map requestBody = { + "addedBy": LocalStorageManager.userId, + "userId": userId, + "filePath": resp, + "note": noteDetails, + }; + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.addMemoryBox, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + // DocumentModel documentModel = DocumentModel.fromJson(responseModel.data); + return true; + } else { + responseModel.statusDescription; + } + } + + Future updateMemoryBoxFile({ + required String userId, + required String id, + required String filePath, + required String noteDetails, + }) async { + dynamic resp; + + if (filePath.isNotEmpty) { + //upload file + resp = await uploadMemoryBoxFile(filePath: filePath); + + // On error + if (resp is Map) { + return resp['message']; + } + } + + // String userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // UserModel userModel = UserModel.fromJson(json.decode(userJson)); + + Map requestBody = { + "addedBy": LocalStorageManager.userId, + "userId": userId, + "memoryBoxId": id, + }; + + if (resp is String) { + requestBody['filePath'] = resp; + } + + if (noteDetails.isNotEmpty) { + requestBody['note'] = noteDetails; + } + + ResponseModel responseModel = await _httpClient.customRequest( + "POST", + url: WebUrls.updateMemoryBox, + requestBody: requestBody, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + // return DocumentModel.fromJson(responseModel.data); + return true; + } else { + return responseModel.statusDescription; + } + } +} diff --git a/lib/web_services/export_web_services.dart b/lib/web_services/export_web_services.dart new file mode 100644 index 0000000..891c2ee --- /dev/null +++ b/lib/web_services/export_web_services.dart @@ -0,0 +1,7 @@ +export 'auth_services.dart'; +export 'client_services.dart'; +export 'message_services.dart'; +export 'notification_services.dart'; +export 'rota_services.dart'; +export 'http_request_client.dart'; +export 'web_url.dart'; \ No newline at end of file diff --git a/lib/web_services/http_request_client.dart b/lib/web_services/http_request_client.dart new file mode 100644 index 0000000..6daa6de --- /dev/null +++ b/lib/web_services/http_request_client.dart @@ -0,0 +1,774 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; +import 'dart:typed_data'; +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; +import 'package:ftc_mobile_app/utilities/enums/api_method.dart'; +import 'package:http/http.dart' as http; +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; +import 'package:http_parser/src/media_type.dart'; + +import '../dialogs/app_dialogs.dart'; +import 'logging_interceptor.dart'; + +class HttpRequestClient { + HttpRequestClient._(); + + static final HttpRequestClient _instance = HttpRequestClient._(); + + factory HttpRequestClient() { + return _instance; + } + + static const int _kSecondsTimeout = 60; + static const String _kTimeOutMessage = "Unable to process request"; + static const String _kInternetIssue = + "Your internet connection is not stable"; + static const String _kOtherException = "Unable to process request"; + + Map errorResponse(String message) { + return Map.of({"success": false, "message": message}); + } + + Map _dioErrorHandler(DioException e) { + if (e.type == DioExceptionType.connectionError) { + return errorResponse(_kInternetIssue); + } + + // The request was made and the server responded with a status code + // that falls out of the range of 2xx and is also not 304. + if (e.response != null) { + debugPrint('Dio error!'); + debugPrint('STATUS: ${e.response?.statusCode}'); + debugPrint('DATA: ${e.response?.data}'); + debugPrint('HEADERS: ${e.response?.headers}'); + + if (e.response!.statusCode == HttpStatus.unauthorized || + e.response!.statusCode == HttpStatus.forbidden) { + AppDialog.showUnauthorizedAlert(); + return errorResponse(''); + } + + if (e.response!.data != null && + e.response!.data is Map && + (e.response!.data as Map).containsKey('message')) { + return errorResponse(e.response!.data['message'].toString()); + } + + // if (e.response!.statusCode == 401) { + // return decoder(errorResponse(e.response!.data.toString())); + // } + } else { + // Error due to setting up or sending the request + debugPrint('Error sending request!'); + debugPrint(e.message); + } + + debugPrint('Dio ERROR ${e.error}\n'); + + return errorResponse(_kOtherException); + } + + Map exceptionHandler(e) { + debugPrint("Web Error: $e"); + debugPrint("e Type: ${e.runtimeType.toString()}"); + if (e is SocketException) { + return errorResponse(_kInternetIssue); + } else if (e is TimeoutException) { + return errorResponse(_kInternetIssue); + } else if (e is FormatException) { + return errorResponse(_kOtherException); + } else { + return errorResponse(_kOtherException); + } + } + + //---------------------------------------------------------------- + Future getRequestWithOutHeader({required String url}) async { + try { + http.Response response = await http + .get( + Uri.parse(url), + ) + .timeout( + const Duration( + seconds: _kSecondsTimeout, + ), + ); + ResponseModel responseModel = ResponseModel(); + if (response.body.isNotEmpty && response.body.length > 4) { + responseModel.statusCode = response.statusCode; + responseModel.statusDescription = "Success"; + responseModel.data = response.body; + } + // log('----------------response model is---------------${responseModel.toString()}'); + return responseModel; + } on TimeoutException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future getRequestWithRequestBody({ + required String url, + dynamic requestBody, + Map? requestHeader, + }) async { + try { + Map header = {}; + if (requestHeader == null) { + header = await getRequestHeader(); + } + final uri = Uri.parse(url); + final uriWithBody = uri.replace( + queryParameters: requestBody, + ); + http.Response response = await http + .get( + uriWithBody, + headers: requestHeader ?? header, + ) + .timeout( + const Duration( + seconds: _kSecondsTimeout, + ), + ); + ResponseModel responseModel = ResponseModel(); + if ((response.statusCode >= 200 && response.statusCode <= 230)) { + responseModel = ResponseModel.fromJson( + jsonDecode(response.body), + statusCode: response.statusCode, + ); + } else { + responseModel = ResponseModel.errorFromJson( + jsonDecode(response.body), + statusCode: response.statusCode, + ); + } + // log('----------------response model is---------------${responseModel.toString()}'); + return responseModel; + } on TimeoutException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future postRequest({ + required String url, + dynamic requestBody, + bool doJsonEncodeRequestBody = false, + bool isTokenRequired = false, + dynamic requestHeader, + }) async { + try { + ResponseModel responseModel = ResponseModel(); + Map header = {}; + if (isTokenRequired) { + header = await getRequestHeader(isBearer: true); + } + http.Response response = await http + .post( + Uri.parse(url), + body: + doJsonEncodeRequestBody ? jsonEncode(requestBody) : requestBody, + headers: isTokenRequired ? header : requestHeader, + ) + .timeout( + const Duration( + seconds: _kSecondsTimeout, + ), + ); + if ((response.statusCode >= 200 && response.statusCode <= 230)) { + responseModel = ResponseModel.fromJson( + jsonDecode(response.body), + statusCode: response.statusCode, + ); + } else { + responseModel = ResponseModel.errorFromJson( + jsonDecode(response.body), + statusCode: response.statusCode, + ); + } + // log('----------------response model is---------------${responseModel.toString()}'); + return responseModel; + } on TimeoutException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future uploadImageRequest({ + required String url, + required String filePath, + }) async { + try { + ResponseModel responseModel = ResponseModel(); + Map header = {}; + header = await getRequestHeader(isBearer: true); + http.MultipartRequest request = http.MultipartRequest( + "POST", + Uri.parse(url), + ); + request.files.add( + await http.MultipartFile.fromPath( + "photo", + filePath, + ), + ); + request.headers.addAll(header); + http.StreamedResponse response = await request.send().timeout( + const Duration( + seconds: _kSecondsTimeout, + ), + ); + if ((response.statusCode >= 200 && response.statusCode <= 230)) { + responseModel = ResponseModel.fromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + } else { + responseModel = ResponseModel.errorFromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + } + // log('----------------response model is---------------${responseModel.toString()}'); + return responseModel; + } on TimeoutException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future patchRequest({ + required String url, + dynamic requestBody, + bool isBearerHeaderRequired = false, + bool isContentType = true, + }) async { + try { + ResponseModel responseModel = ResponseModel(); + Map header = {}; + if (isBearerHeaderRequired) { + header = await getRequestHeader( + isBearer: true, + isContentType: isContentType, + ); + } + http.Request request = http.Request( + 'PATCH', + Uri.parse(url), + ); + request.body = jsonEncode(requestBody); + request.headers.addAll(header); + http.StreamedResponse response = await request.send().timeout( + const Duration( + seconds: _kSecondsTimeout, + ), + ); + if ((response.statusCode >= 200 && response.statusCode <= 230)) { + responseModel = ResponseModel.fromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + } else { + responseModel = ResponseModel.errorFromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + } + // log('----------------response model is---------------${responseModel.toString()}'); + return responseModel; + } on TimeoutException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future deleteRequest({ + required String url, + bool isBearerHeaderRequired = false, + dynamic requestBody, + }) async { + try { + ResponseModel responseModel = ResponseModel(); + Map header = {}; + if (isBearerHeaderRequired) { + header = await getRequestHeader(isBearer: true); + } + http.Request request = http.Request( + 'DELETE', + Uri.parse(url), + ); + request.headers.addAll(header); + if (requestBody != null) { + request.body = jsonEncode(requestBody); + } + http.StreamedResponse response = await request.send().timeout( + const Duration( + seconds: _kSecondsTimeout, + ), + ); + if ((response.statusCode >= 200 && response.statusCode <= 230)) { + responseModel = ResponseModel.fromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + } else { + responseModel = ResponseModel.errorFromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + } + // log('----------------response model is---------------${responseModel.toString()}'); + return responseModel; + } on TimeoutException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future customRequest( + String requestType, { + required String url, + bool isBearerHeaderRequired = false, + bool isBearer = true, + dynamic requestBody, + dynamic requestHeader, + }) async { + try { + ResponseModel responseModel = ResponseModel(); + Map header = {}; + if (isBearerHeaderRequired) { + header = await getRequestHeader(isBearer: isBearer); + } + http.Request request = http.Request( + requestType, + Uri.parse(url), + ); + request.headers.addAll(isBearerHeaderRequired ? header : requestHeader); + request.body = json.encode(requestBody); + log('--------------request.url----------------------------($requestType) ${request.url.origin}${request.url.path}'); + log('--------------request.headers----------------------------${request.headers}'); + log('--------------request.body----------------------------${request.body}'); + http.StreamedResponse response = await request.send().timeout( + const Duration( + seconds: _kSecondsTimeout, + ), + ); + if ((response.statusCode >= 200 && response.statusCode <= 230)) { + responseModel = ResponseModel.fromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + log("Api Response($url):\n${jsonEncode(responseModel.toJson())}"); + } else { + responseModel = ResponseModel.errorFromJson( + jsonDecode(await response.stream.bytesToString()), + statusCode: response.statusCode, + ); + print("FUTURE Expection"); + print(responseModel); + } + // log('----------------response model is---------------${responseModel.toString()}'); + return responseModel; + } on TimeoutException catch (e) { + print("TimeOut Expection"); + print(e); + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + print("SOCKET Expection"); + print(e); + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + print("FUTURE Expection"); + print(e); + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future uploadVideoRequest({ + required String uploadUrl, + required Uint8List chunkStream, + }) async { + try { + ResponseModel responseModel = ResponseModel(); + http.StreamedRequest request = http.StreamedRequest( + "PUT", + Uri.parse(uploadUrl), + ); + request.headers.addAll({ + 'Content-Length': "${chunkStream.length}", + 'Content-Type': 'video/mp4', + 'content-type': 'application/octet-stream' + }); + request.sink.add(chunkStream); + request.sink.close(); + http.StreamedResponse response = await request.send(); + responseModel.statusCode = response.statusCode; + responseModel.statusDescription = response.reasonPhrase ?? ''; + responseModel.header = response.headers; + return responseModel; + } on TimeoutException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 408, + statusDescription: _kTimeOutMessage, + data: e.toString(), + ), + ); + } on SocketException catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 400, + statusDescription: _kInternetIssue, + data: e.toString(), + ), + ); + } catch (e) { + return Future.value( + ResponseModel.named( + statusCode: 500, + statusDescription: _kOtherException, + data: e.toString(), + ), + ); + } + } + + Future> getRequestHeader({ + bool isBearer = true, + bool isContentType = true, + }) async { + // String token = SessionManagement().getSessionToken( + // tokenKey: SessionKeys.kUserTokenKey, + // ); + //todo remove this in end + String token = + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhIjp0cnVlLCJuIjoiSmFtc2hhaWQgU2FiaXIiLCJlIjoiamFtc2hhaWRzYWJpcjQxMTk4MEBnbWFpbC5jb20iLCJkIjoiNjQ2NTEyN2E3MmJjNzEzY2E4NDYwY2IzIiwicCI6Ii91cGxvYWRzL2RwL2RlZmF1bHQucG5nIiwiciI6Il9hIiwiaWF0IjoxNjkzMjIzNTIzfQ.EtpS_o0kEhdlNzCyFdFNNQzHd0IipTw8BEuUBVgfYok'; + Map header = { + 'Authorization': isBearer ? 'Bearer $token' : token, + if (isContentType) 'Content-Type': 'application/json' + }; + return header; + } + + Future safeApiCall({ + required ApiMethod method, + required String url, + Map? headers, + Map? body, + Map? param, + }) async { + try { + // final hasInternet = await FrequentFunctions.hasInternetConnection; + // debugPrint("hasInternet: $hasInternet"); + // + // if (!hasInternet) { + // return decoder(errorResponse(errorMsgNoInternet)); + // } + + Map customHeader = await getRequestHeader(); + if(headers != null) customHeader.addAll(headers!); + + final dio = Dio() + ..interceptors.add(Logging()) + ..options.headers.addAll(customHeader); + + if (headers != null) { + dio.options.headers.addAll(headers); + } + + Response response; + switch (method) { + case ApiMethod.get: + response = await dio.get(url, queryParameters: param); + break; + case ApiMethod.post: + response = await dio.post( + url, + data: (body == null) ? null : json.encode(body), + queryParameters: param, + ); + break; + case ApiMethod.put: + response = await dio.put( + url, + data: (body == null) ? null : json.encode(body), + queryParameters: param, + ); + break; + case ApiMethod.patch: + response = await dio.patch( + url, + data: (body == null) ? null : json.encode(body), + queryParameters: param, + ); + break; + case ApiMethod.delete: + response = await dio.delete( + url, + data: (body == null) ? null : json.encode(body), + queryParameters: param, + ); + break; + } + + return ResponseModel.fromJson(jsonDecode(response.toString())) + ..statusCode = response.statusCode ?? 0; + + } on DioException catch (e) { + return ResponseModel.named( + statusCode: e.response?.statusCode ?? 0, + statusDescription: _dioErrorHandler(e)['message'], + ); + } catch (e) { + debugPrint("Web Error: $e"); + + return ResponseModel.named( + statusCode: 0, + statusDescription: exceptionHandler(e)['message'], + ); + } + } + + Future safeFormDataRequest({ + required String url, + required FormData body, + }) async { + try { + Map customHeader = await getRequestHeader(); + + final dio = Dio() + ..interceptors.add(Logging()) + ..options.headers.addAll(customHeader); + + final response = await dio.post( + url, + data: body, + onSendProgress: (int sent, int total) { + debugPrint('$sent $total'); + }, + ); + + return ResponseModel.fromJson(jsonDecode(response.toString())) + ..statusCode = response.statusCode ?? 0; + } on DioException catch (e) { + return ResponseModel.named( + statusCode: e.response?.statusCode ?? 0, + statusDescription: _dioErrorHandler(e)['message'], + ); + } catch (e) { + debugPrint("Web Error: $e"); + + return ResponseModel.named( + statusCode: 0, + statusDescription: exceptionHandler(e)['message'], + ); + } + } + + Future postMultipartRequest( + {required String url, + Map fields = const {}, + Map files = const {}}) async { + try { + Map customHeader = await getRequestHeader(); + // customHeader['Connection'] = 'keep-alive'; + // customHeader['Accept'] = 'application/json'; + // customHeader['Content-Type'] = 'multipart/form-data'; + http.MultipartRequest request = + http.MultipartRequest('POST', Uri.parse(url)); + + request.headers.addAll(customHeader); + request.fields.addAll(fields); + + for (MapEntry file in files.entries) { + String type = file.value.substring(file.value.lastIndexOf('.') + 1); + String name = file.value.substring(file.value.lastIndexOf('/') + 1); + + request.files.add(await http.MultipartFile.fromPath( + file.key, + file.value, + filename: name, + contentType: MediaType('image', type), + )); + } + + http.StreamedResponse streamedResponse = await request.send(); + http.Response httpResponse = + await http.Response.fromStream(streamedResponse); + log('────────────────────url> $url'); + log('────────────────────files> $files'); + log('────────────────────fields> $fields'); + log('────────────────────Response.body> ${httpResponse.body}'); + ResponseModel response = + ResponseModel.fromJson(jsonDecode(httpResponse.body)); + return Future.value(response); + } on HttpException catch (e) { + return Future.value(ResponseModel.named( + statusCode: 405, statusDescription: e.message, data: e.toString())); + } on TimeoutException { + return Future.value(ResponseModel.named( + statusCode: 408, + statusDescription: "Request TimeOut", + data: "Request TimeOut")); + } on SocketException { + return Future.value(ResponseModel.named( + statusCode: 400, + statusDescription: "Bad Request", + data: "Bad Request")); + } catch (e) { + return Future.value(ResponseModel.named( + statusCode: 500, + statusDescription: "Service Error", + data: "Service Error")); + } + } +} diff --git a/lib/web_services/logging_interceptor.dart b/lib/web_services/logging_interceptor.dart new file mode 100644 index 0000000..502331f --- /dev/null +++ b/lib/web_services/logging_interceptor.dart @@ -0,0 +1,103 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; + +class Logging extends Interceptor { + // String get _token => LocalStorage.token ?? emptyString; + + // String get _userId => GetStorage().read(keyUserId) ?? emptyString; + + // Map get headers => {HttpHeaders.authorizationHeader: _token}; + + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) { + // if (_token.isNotEmpty) { + // options.headers.addAll({HttpHeaders.authorizationHeader: _token}); + // } + + if (kDebugMode) { + // Logger.print(options); + _CurlLogger.print(options); + } + + return super.onRequest(options, handler); + } + + @override + void onResponse(Response response, ResponseInterceptorHandler handler) { + if (kDebugMode) { + log('RESPONSE(${response.statusCode}) => ${response.requestOptions.baseUrl + response.requestOptions.path}' + '\n' + "api response: ${jsonEncode(response.data)}"); + } + return super.onResponse(response, handler); + } + + @override + void onError(DioException err, ErrorInterceptorHandler handler) { + if (kDebugMode) { + debugPrint( + 'ERROR(${err.response?.statusCode}) => ${err.requestOptions.baseUrl + err.requestOptions.path}', + ); + } + return super.onError(err, handler); + } +} + +abstract class _SimpleLogger { + static print(RequestOptions options) { + debugPrint('REQUEST(${options.method}) => ${options.uri.toString()}'); + debugPrint('Headers: ${options.headers}'); + if (options.queryParameters.isNotEmpty) { + log("queryParameters: ${options.queryParameters}"); + } + + if (options.data != null) { + if (options.data is FormData) { + debugPrint("data: "); + for (var value in (options.data as FormData).fields) { + log(value.toString()); + } + + debugPrint("files: "); + for (var value in (options.data as FormData).files) { + log("${value.key}: ${value.value.filename}"); + } + } else { + log("data: ${options.data}"); + } + } + } +} + +abstract class _CurlLogger { + static print(RequestOptions options) { + String curl = 'curl'; + curl += " --location '${options.uri}'"; + if (options.data != null) { + // Add the data + + if (options.data is FormData) { + for (MapEntry entry in (options.data as FormData).fields) { + curl += " --form '${entry.key}=\"${entry.value}\"'"; + } + + for (MapEntry entry + in (options.data as FormData).files) { + curl += " --form '${entry.key}=@\"${entry.value.filename}\"'"; + } + } else { + curl += ' --data \'${options.data}\''; + } + } + + if (options.headers.isNotEmpty) { + // Add the headers + options.headers.forEach((key, value) { + curl += ' --header \'$key: $value\''; + }); + } + log(curl); + } +} diff --git a/lib/web_services/message_services.dart b/lib/web_services/message_services.dart new file mode 100644 index 0000000..e15e64e --- /dev/null +++ b/lib/web_services/message_services.dart @@ -0,0 +1,14 @@ +import 'http_request_client.dart'; + +class MessageService { + static final MessageService _instance = MessageService._private(); + + MessageService._private(); + + factory MessageService() { + return _instance; + } + + final HttpRequestClient _httpClient = HttpRequestClient(); +// final SessionManagement _sessionManagement = SessionManagement(); +} diff --git a/lib/web_services/notification_services.dart b/lib/web_services/notification_services.dart new file mode 100644 index 0000000..bb71fd2 --- /dev/null +++ b/lib/web_services/notification_services.dart @@ -0,0 +1,45 @@ +import 'http_request_client.dart'; +import 'web_url.dart'; + +class NotificationService { + static final NotificationService _instance = NotificationService._private(); + + NotificationService._private(); + + factory NotificationService() { + return _instance; + } + + final HttpRequestClient _httpClient = HttpRequestClient(); + +// final SessionManagement _sessionManagement = SessionManagement(); + + Future getNotifications() async { + final responseModel = await _httpClient.customRequest( + "GET", + url: WebUrls.getNotifications, + requestHeader: {'Content-Type': 'application/json'}, + isBearerHeaderRequired: true, + isBearer: true, + ); + + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + // if (responseModel.data is List && + // (responseModel.data as List).isNotNullOrEmpty()) { + // return GetRiskAssessmentResponse( + // success: true, + // data: (responseModel.data as List) + // .map((e) => RiskAssessmentData.fromJson(e)) + // .toList()); + // } + // + // return GetRiskAssessmentResponse(success: true, data: []); + + return []; + } else { + return responseModel.statusDescription; + // return GetRiskAssessmentResponse( + // success: false, message: responseModel.statusDescription); + } + } +} diff --git a/lib/web_services/rota_services.dart b/lib/web_services/rota_services.dart new file mode 100644 index 0000000..1ab2a7d --- /dev/null +++ b/lib/web_services/rota_services.dart @@ -0,0 +1,178 @@ +import 'dart:convert'; + +import 'package:ftc_mobile_app/ftc_mobile_app.dart'; + +import '../models/requests/HolidayRequestData.dart'; +import '../models/rota/LiveRoasterResponseData.dart'; +import '../models/staffWorkload/StaffWorkloadResponse.dart'; + +class RotaService { + static final RotaService _instance = RotaService._private(); + + RotaService._private(); + + factory RotaService() { + return _instance; + } + + final HttpRequestClient _httpClient = HttpRequestClient(); + + Future getMyShifts( + {required int startDateMills, required int endDateMills}) async { + // final userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // final userModel = UserModel.fromJson(jsonDecode(userJson)); + + Map requestBody = { + "startDate": startDateMills, + "endDate": endDateMills, + "staffUserId": LocalStorageManager.userId, + // "startDate": 1720983600000, + // "endDate": 1721502000000, + // "staffUserId": "659653a31faf0d9fa4e15d5d", + }; + ResponseModel responseModel = await _httpClient.customRequest('POST', + requestBody: requestBody, + url: WebUrls.myShifts, + requestHeader: {'Content-Type': 'application/json'}, + isBearer: true, + isBearerHeaderRequired: true); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return LiveRoasterResponseData.fromJson({'data': responseModel.data}); + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getAvailableShifts() async { + Map requestBody = { + "startDate": DateTime.now().millisecondsSinceEpoch + }; + ResponseModel responseModel = await _httpClient.customRequest('POST', + requestBody: requestBody, + url: WebUrls.unassignedShifts, + requestHeader: {'Content-Type': 'application/json'}, + isBearer: true, + isBearerHeaderRequired: true); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return LiveRoasterResponseData.fromJson({'data': responseModel.data}); + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future claimShift({ + required String rosterId, + required String locationId, + required String dayId, + }) async { + // final userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // final userModel = UserModel.fromJson(jsonDecode(userJson)); + Map requestBody = { + "rosterId": rosterId, + "locationId": locationId, + "staffUserId": LocalStorageManager.userId, + "dayId": dayId, + }; + ResponseModel responseModel = await _httpClient.customRequest('POST', + requestBody: requestBody, + url: WebUrls.assignStaffToShift, + requestHeader: {'Content-Type': 'application/json'}, + isBearer: true, + isBearerHeaderRequired: true); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + print("responseModel.data type: ${responseModel.data.runtimeType}"); + return LiveRoasterResponseData.fromJson({'data': responseModel.data}); + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future serviceUserShifts( + {required String serviceUserId, + required int month, + required int year}) async { + Map requestBody = { + "serviceUser": serviceUserId, + "month": month, //Dec + "year": year, + }; + ResponseModel responseModel = await _httpClient.customRequest('POST', + requestBody: requestBody, + url: WebUrls.rotaServiceUserShiftsListUrl, + requestHeader: {'Content-Type': 'application/json'}, + isBearer: true, + isBearerHeaderRequired: true); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return (responseModel.data['filteredShifts'] is List) && + responseModel.data['filteredShifts'].isNotEmpty + ? MonthWiseRecord.fromJson(responseModel.data['filteredShifts'][0]) + : false; + } else { + return { + "message": responseModel.statusDescription, + }; + } + } + + Future getStaffWorkload() async { + // final userJson = LocalStorageManager.getSessionToken( + // tokenKey: LocalStorageKeys.kUserModelKey, + // ); + // print("userJson: $userJson"); + // final userModel = UserModel.fromJson(jsonDecode(userJson)); + + Map requestBody = { + "sortproperty": "createdAt", + "sortorder": -1, + "offset": 0, + "limit": 1, + "query": { + "critarion": {"staffMember": LocalStorageManager.userId}, + "staffMemberfields": "staffMemberName", + "usersFields": "profile_picture_url name", + "addedby": "_id email name", + "lastModifiedBy": "_id email name" + } + }; + ResponseModel responseModel = await _httpClient.customRequest('POST', + requestBody: requestBody, + url: WebUrls.getStaffWorkload, + requestHeader: {'Content-Type': 'application/json'}, + isBearer: true, + isBearerHeaderRequired: true); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return StaffWorkloadResponse.fromJson({'data': responseModel.data}) + ..status = "Success" + ..message = responseModel.statusDescription; + } else { + return responseModel.statusDescription; + } + } + + Future requestHoliday({required HolidayRequestData request}) async { + Map requestBody = + (request..staffRequester = LocalStorageManager.userId).toJson(); + + final ResponseModel responseModel = await _httpClient.customRequest('POST', + requestBody: requestBody, + url: WebUrls.requestHoliday, + requestHeader: {'Content-Type': 'application/json'}, + isBearer: true, + isBearerHeaderRequired: true); + if (responseModel.statusCode >= 200 && responseModel.statusCode <= 230) { + return responseModel; + } else { + return responseModel.statusDescription; + } + } +} diff --git a/lib/web_services/web_url.dart b/lib/web_services/web_url.dart new file mode 100644 index 0000000..3b1725d --- /dev/null +++ b/lib/web_services/web_url.dart @@ -0,0 +1,105 @@ +class WebUrls extends _BaseUrl { + WebUrls._(); + + static String baseUrl = _BaseUrl.baseUrl; //Test + // static String baseUrl = _BaseUrl.liveBaseUrl; //Live + + static String socketUrl = 'http://16.171.242.62:3000'; + + static String signInUrl = "$baseUrl/users/signin"; + static String passwordLessSignInUrl = "$baseUrl/users/passwordLessLogin"; + static String forgetPasswordUrl = "$baseUrl/users/forgot-password"; + static String verifyCodeUrl = "$baseUrl/users/verify-code"; + static String verifyTokenUrl = "$baseUrl/users/verifyToken"; + static String rotaServiceUserShiftsListUrl = + "$baseUrl/serviceUserShifts/getSrUsShiftsRequiredsListForAMonth"; + static String userProfileUrl = + "$baseUrl/staffMembers/getStaffMembersWithFullDetails"; + static String addConsentUrl = + "$baseUrl/consentTemplateRoute/addConsentTemplate"; + static String getConsentListUrl = + "$baseUrl/consentTemplateRoute/getconsentTemplate"; + static String deleteConsentUrl = + "$baseUrl/consentTemplateRoute/removeConsentTemplate"; + static String updateConsentUrl = + "$baseUrl/consentTemplateRoute/updateConsentTemplate"; + + // static String getServiceUsersListUrl = + // "${baseUrl}/serviceUsers/getServiceUsersWithFullDetails"; + static String getServiceUsersListUrl = "$baseUrl/users/listAllServiceUsers"; + static String getBodyPointsCategoryListURL = + "$baseUrl/consentTemplateRoute/getHealthCategories"; + static String addHealthIssuesURL = + "$baseUrl/consentTemplateRoute/addHealthIssues"; + static String getHealthIssuesListURL = + "$baseUrl/consentTemplateRoute/getHealthIssues"; + static String updateHealthIssueURL = + "$baseUrl/consentTemplateRoute/updateHealthIssues"; + static String getHealthIssueChildCategoryListURL = + "$baseUrl/consentTemplateRoute/getChildHealthCategories"; + static String addRecentIncidentServiceURL = "$baseUrl/incident/addIncident"; + static String getRecentIncidentsListServiceURL = + "$baseUrl/incident/getIncidentWithFullDetails"; + static String updateRecentIncidentServiceURL = + "$baseUrl/incident/updateIncident"; + static String deleteRecentIncidentUrl = "$baseUrl/incident/removeIncident"; + static String addPbsPlanServiceURL = "$baseUrl/pbsplans/addPbsplan"; + static String updatePbsPlanServiceURL = "$baseUrl/pbsplans/updatePbsplan"; + static String getPbsPlanServiceURL = "$baseUrl/pbsplans/getPbsPlanList"; + static String deletePbsPlanServiceURL = "$baseUrl/pbsplans/deletePbsPlanList"; + static String getDocumentsListServiceURL = "$baseUrl/document/documentList"; + static String addDocumentServiceURL = "$baseUrl/document/addDocument"; + static String updateDocumentServiceURL = "$baseUrl/document/updateDocument"; + static String deleteDocServiceURL = "$baseUrl/document/removeDocument"; + static String uploadDocServiceURL = "$baseUrl/uploads/uploadReferenceDoc"; + static String addSingleMessageChatURL = "$baseUrl/messages/addMessage"; + static String uploadMessageAttachmentsURL = + "$baseUrl/messages/uploadMessageAttachments"; + static String addGroupMessageServiceURL = "$baseUrl/messages/addGroupMessage"; + static String deleteGroupMessageServiceURL = + "$baseUrl/messages/deleteGroupMessage"; + static String updateGroupMessageServiceURL = + "$baseUrl/messages/updateGroupMessage"; + static String combinedLastMessageURL = + "$baseUrl/messages/combinedLastMessages"; + static String allGroupMessagesURL = "$baseUrl/messages/messageByGroupId"; + static String allSingleChatMessagesURL = "$baseUrl/messages/getAllMessage"; + static String allSingleChatMessagesServiceAdminURL = + "$baseUrl/messages/getMessage"; + static String updateSingleChatMessageURL = "$baseUrl/messages/updateMessage"; + static String deleteSingleChatMessageURL = "$baseUrl/messages/deleteMessage"; + + static String deleteChatURL = "$baseUrl/messages/deleteChat"; + + static String createCarePlanURL = "$baseUrl/carePlans/createCarePlan"; + static String getCarePlansListURL = "$baseUrl/carePlans/getCarePlansList"; + static String getStaffWorkload = + "$baseUrl/staffWorkLoads/getStaffWorkLoadsWithFullDetails"; + static String requestHoliday = + "$baseUrl/staffHolidayRequests/createStaffHolidayRequest"; + static String myShifts = "$baseUrl/liveRoster/checkExistShiftByStaffId"; + static String unassignedShifts = "$baseUrl/liveRoster/unassignedShifts"; + static String assignStaffToShift = "$baseUrl/liveRoster/assignStaffToShift"; + + static String getAppointmentsByDate = + "$baseUrl/appointment/getAppointmentsByDate"; + + static String getRiskAssesments = "$baseUrl/riskassesments/getRiskAssesments"; + + static String getNotifications = "$baseUrl/notifications/getNotifications"; + + static String getMemoryList = "$baseUrl/carePlans/getMemoryList"; + static String uploadMemoryBoxFile = "$baseUrl/carePlans/uploadMemoryBoxFile"; + static String addMemoryBox = "$baseUrl/carePlans/addMemoryBox"; + static String updateMemoryBox = "$baseUrl/carePlans/updateMemoryBox"; + static String createRiskAssesments = + "$baseUrl/riskassesments/createRiskAssesments"; + static String listAllUsers = "$baseUrl/users/listAllUsers"; + static String allTrainings = + "$baseUrl/proposedTrainings/getProposedTrainingsByStaff"; +} + +abstract class _BaseUrl { + static const baseUrl = "http://16.171.242.62:3000"; + static const liveBaseUrl = "https://ftcaresoftware.co.uk/ft_care_server"; +} diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..06d6f04 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,89 @@ +name: ftc_mobile_app +description: A new Flutter project. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +version: 1.0.0+1 + +environment: + sdk: '>=3.0.0 <4.0.0' +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.2 + http: ^1.2.0 +# http: ^0.13.6 + get: 4.6.6 + get_storage: ^2.1.1 + flutter_screenutil: ^5.9.0 + flutter_svg: ^2.0.9 + pin_code_fields: ^8.0.1 + flutter_calendar_carousel: ^2.4.3 + intl: ^0.18.1 + fluttertoast: ^8.2.4 + flutter_keyboard_visibility: ^5.4.1 + quill_html_editor: ^2.1.9 +# awesome_dialog: ^3.2.0 + file_picker: ^6.2.1 +# file_picker: ^8.0.1 + path_provider: ^2.1.3 + socket_io_client: ^2.0.3+1 + adoptive_calendar: ^0.1.5 + flutter_html: ^3.0.0-beta.2 + webview_flutter: ^4.8.0 + pull_to_refresh_flutter3: ^2.0.2 + cached_network_image: ^3.3.1 + get_time_ago: ^1.3.1 + grouped_list: ^5.1.2 + dio: ^5.4.3+1 + video_thumbnail: ^0.5.3 + video_player: ^2.9.0 + firebase_messaging: ^14.7.18 + flutter_local_notifications: ^16.3.3 + firebase_core: ^2.26.0 + flutter_app_badger: ^1.5.0 + stop_watch_timer: ^3.1.1 + photo_view: ^0.14.0 + url_launcher: ^6.3.0 + image_picker: ^1.1.2 + permission_handler: ^11.3.1 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + flutter_launcher_icons: ^0.13.1 + flutter_native_splash: ^2.2.11 + +# For generating Splash Screen +flutter_native_splash: + color: "#278DEC" + + android_12: + color: "#278DEC" + +flutter: + uses-material-design: true + assets: + - assets/fonts/ + - assets/images/png/ + - assets/images/svg/ + - assets/images/svg/careNotesCategories/ + - assets/images/svg/careNotesSubcatgeories/ + - assets/images/png/ratings/ + - assets/consent-capacity.html + + fonts: + - family: Roboto + fonts: + - asset: assets/fonts/Roboto-Black.ttf + - asset: assets/fonts/Roboto-BlackItalic.ttf + - asset: assets/fonts/Roboto-Bold.ttf + - asset: assets/fonts/Roboto-BoldItalic.ttf + - asset: assets/fonts/Roboto-Italic.ttf + - asset: assets/fonts/Roboto-Light.ttf + - asset: assets/fonts/Roboto-LightItalic.ttf + - asset: assets/fonts/Roboto-Medium.ttf + - asset: assets/fonts/Roboto-MediumItalic.ttf + - asset: assets/fonts/Roboto-Regular.ttf + - asset: assets/fonts/Roboto-Thin.ttf + - asset: assets/fonts/Roboto-ThinItalic.ttf \ No newline at end of file