From a7bc7df92de28cc2597c0ad2268036ec16b30964 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Thu, 17 Nov 2022 11:29:33 +0300 Subject: [PATCH 1/9] Backend Structure 1.0 --- android/app/build.gradle | 7 +- android/app/google-services.json | 82 +++ android/build.gradle | 1 + lib/{api => api_repo}/login_api_client.dart | 2 +- lib/api_repo/login_api_repo.dart | 36 + lib/app_state/app_state.dart | 73 +- lib/classes/consts.dart | 8 +- lib/config/dependencies.dart | 22 + lib/config/routes.dart | 9 - lib/dialogs/otp_dialog.dart | 5 +- lib/exceptions/api_exception.dart | 2 +- lib/main.dart | 15 +- lib/model/base/generic_response_model.dart | 743 ++++++++++++++++++++ lib/model/base/post_params_model.dart | 104 +++ lib/model/login/imei_details.dart | 128 ++++ lib/provider/helper/provider_helper.dart | 46 ++ lib/{api => services}/api_client.dart | 142 ++-- lib/services/firebase_service.dart | 24 + lib/ui/login/splash_page.dart | 30 +- pubspec.lock | 63 ++ pubspec.yaml | 6 + test/widget_test.dart | 2 +- 22 files changed, 1394 insertions(+), 156 deletions(-) create mode 100644 android/app/google-services.json rename lib/{api => api_repo}/login_api_client.dart (94%) create mode 100644 lib/api_repo/login_api_repo.dart create mode 100644 lib/config/dependencies.dart create mode 100644 lib/model/base/generic_response_model.dart create mode 100644 lib/model/base/post_params_model.dart create mode 100644 lib/model/login/imei_details.dart create mode 100644 lib/provider/helper/provider_helper.dart rename lib/{api => services}/api_client.dart (62%) create mode 100644 lib/services/firebase_service.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index e01cb68..c0b3c9a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion flutter.compileSdkVersion + compileSdkVersion 33 ndkVersion flutter.ndkVersion compileOptions { @@ -44,10 +44,10 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.untitled1" + applicationId "com.hmg.hmgDr" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. - minSdkVersion flutter.minSdkVersion + minSdkVersion 23 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName @@ -69,3 +69,4 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..e656079 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,82 @@ +{ + "project_info": { + "project_number": "934365232760", + "project_id": "hmg-dr-app", + "storage_bucket": "hmg-dr-app.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:934365232760:android:024b3569972f1c09f9778d", + "android_client_info": { + "package_name": "COM.HMG.HMGDR" + } + }, + "oauth_client": [ + { + "client_id": "934365232760-bobv1r1sn222le020jeni6u1bdbjdu1v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCpYwrmuntOBdZv6GV6KEnLj8nQRvEnZ6I" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "934365232760-bobv1r1sn222le020jeni6u1bdbjdu1v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "934365232760-57v2ld1qqulc4nt4o5pgjfbpc47fj3qf.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "COM.HMG.HMGDR" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:934365232760:android:e0e185e68c0d7690f9778d", + "android_client_info": { + "package_name": "com.hmg.hmgDr" + } + }, + "oauth_client": [ + { + "client_id": "934365232760-bobv1r1sn222le020jeni6u1bdbjdu1v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCpYwrmuntOBdZv6GV6KEnLj8nQRvEnZ6I" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "934365232760-bobv1r1sn222le020jeni6u1bdbjdu1v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "934365232760-57v2ld1qqulc4nt4o5pgjfbpc47fj3qf.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "COM.HMG.HMGDR" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 83ae220..1d20ff2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,6 +8,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.3' } } diff --git a/lib/api/login_api_client.dart b/lib/api_repo/login_api_client.dart similarity index 94% rename from lib/api/login_api_client.dart rename to lib/api_repo/login_api_client.dart index 6b03fa6..bb7f0ff 100644 --- a/lib/api/login_api_client.dart +++ b/lib/api_repo/login_api_client.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:hmg_nurses/api/api_client.dart'; +import 'package:hmg_nurses/services/api_client.dart'; import 'package:hmg_nurses/app_state/app_state.dart'; import 'package:hmg_nurses/classes/consts.dart'; diff --git a/lib/api_repo/login_api_repo.dart b/lib/api_repo/login_api_repo.dart new file mode 100644 index 0000000..da136a1 --- /dev/null +++ b/lib/api_repo/login_api_repo.dart @@ -0,0 +1,36 @@ +import 'package:hmg_nurses/exceptions/api_exception.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/services/api_client.dart'; +import 'package:hmg_nurses/classes/consts.dart'; +import 'package:hmg_nurses/model/base/generic_response_model.dart'; +import 'package:hmg_nurses/model/login/imei_details.dart'; +import 'package:injector/injector.dart'; + +import '../services/firebase_service.dart'; + +abstract class ILoginApiRepo { + Future> getDeviceInfoByIMEI(); +} + +class LoginApiRepo implements ILoginApiRepo { + final IFirebaseService _firebaseService = Injector.appInstance.get(); + + @override + Future> getDeviceInfoByIMEI() async { + String url = "${ApiConsts.baseUrlServices}DoctorApplication.svc/REST/DoctorApp_GetDeviceDetailsByIMEI"; + String token = await _firebaseService.getFirebaseToke(); + logger.d("firebase_token: " + token); + + Map postParams = {}; + postParams.addAll(appState.postParamsJson); + postParams["stamp"] = DateTime.now().toIso8601String(); + postParams["IMEI"] = token; + GenericResponseModel response; + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return response.listDoctorDeviceDetails ?? []; + } +} diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 3e43f18..4181ea5 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -1,13 +1,14 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; +import 'package:hmg_nurses/model/base/post_params_model.dart'; class AppState { - static final AppState _instance = AppState._internal(); - - AppState._internal(); - - factory AppState() => _instance; + // static final AppState _instance = AppState._internal(); + // + // AppState._internal(); + // + // factory AppState() => _instance; bool isAuthenticated = false; @@ -31,18 +32,38 @@ class AppState { String? get getForgetPasswordTokenID => forgetPasswordTokenID; - //Wifi info - String? _mohemmWifiSSID; - - set setMohemmWifiSSID(v) => _mohemmWifiSSID = v; - - String? get getMohemmWifiSSID => _mohemmWifiSSID; - - String? _mohemmWifiPassword; - - set setMohemmWifiPassword(v) => _mohemmWifiPassword = v; - - String? get getMohemmWifiPassword => _mohemmWifiPassword; + final PostParamsModel _postParamsInitConfig = PostParamsModel( + imei: "", + tokenID: "@dm!n", + languageID: 2, + stamp: "", + iPAdress: "9.9.9.9", + versionID: 8.3, + channel: 9, + sessionID: "", + isLoginForDoctorApp: true, + patientOutSA: false, + vidaAuthTokenID: null, + vidaRefreshTokenID: null, + deviceTypeID: 1, + ); + + void setPostParamsInitConfig() { + isAuthenticated = false; + isLogged = false; + _postParams = _postParamsInitConfig; + } + + PostParamsModel? _postParams; + + PostParamsModel? get postParamsObject => _postParams; + + // Map get postParamsJson => isLogged ? (_postParams?.toJsonAfterLogin() ?? {}) : (_postParams?.toJson() ?? {}); + Map get postParamsJson => (_postParams?.toJson() ?? {}); + + void setPostParamsModel(PostParamsModel _postParams) { + this._postParams = _postParams; + } bool isArabic(context) => EasyLocalization.of(context)?.locale.languageCode == "ar"; @@ -50,25 +71,7 @@ class AppState { String? _username; - // todo ''sikander' added password for now, later will remove & improve - String? password; - set setUserName(v) => _username = v; String? get getUserName => _username; - - set setUserPassword(_password) => password = _password; - - int? workListIndex; - - set setWorkListIndex(int? _workListIndex) => workListIndex = _workListIndex; - - int? itgWorkListIndex; - - set setItgWorkListIndex(int? _itgWorkListIndex) => itgWorkListIndex = _itgWorkListIndex; - - String? _base64ImageEmp = - "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"; - - String? get getBase64ImageEmp => _base64ImageEmp; } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 646e498..c1e9dfa 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,18 +1,18 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - // static String baseUrl = "https://hmgwebservices.com"; // Live server + //static String baseUrl = 'https://hmgwebservices.com/'; + static String baseUrl = 'https://uat.hmgwebservices.com/'; static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; static String erpRest = baseUrlServices + "ERP.svc/REST/"; static String swpRest = baseUrlServices + "SWP.svc/REST/"; - static String user = baseUrlServices + "api/User/"; + static String user = baseUrlServices + "api_repo/User/"; static String cocRest = baseUrlServices + "COCWS.svc/REST/"; //Chat static String chatServerBaseUrl = "https://apiderichat.hmg.com"; - static String chatServerBaseApiUrl = "https://apiderichat.hmg.com/api/"; + static String chatServerBaseApiUrl = "https://apiderichat.hmg.com/api_repo/"; static String chatHubConnectionUrl = chatServerBaseUrl + "/ConnectionChatHub"; static String chatSearchMember = "user/getUserWithStatusAndFavAsync/"; static String chatRecentUrl = "UserChatHistory/getchathistorybyuserid"; //For a Mem diff --git a/lib/config/dependencies.dart b/lib/config/dependencies.dart new file mode 100644 index 0000000..6e2f047 --- /dev/null +++ b/lib/config/dependencies.dart @@ -0,0 +1,22 @@ +// import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +// import 'package:flutter/material.dart'; +import 'package:hmg_nurses/app_state/app_state.dart'; +import 'package:hmg_nurses/services/api_client.dart'; +import 'package:hmg_nurses/api_repo/login_api_repo.dart'; +import 'package:hmg_nurses/services/firebase_service.dart'; +import 'package:injector/injector.dart'; + +class AppDependencies { + static void addDependencies() { + Injector injector = Injector.appInstance; + + //add dependencies as needed + //services + injector.registerSingleton(() => AppState()); + injector.registerSingleton(() => ApiClient()); + injector.registerSingleton(() => FirebaseService()); + + //repos + injector.registerSingleton(() => LoginApiRepo()); + } +} diff --git a/lib/config/routes.dart b/lib/config/routes.dart index eca978f..b821f1f 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,25 +1,16 @@ import 'package:flutter/material.dart'; import 'package:hmg_nurses/ui/login/splash_page.dart'; - - class AppRoutes { - //Login static const String splash = "/splash"; static const String registerSelection = "/registerSelection"; static const String loginVerifyAccount = "/loginVerifyAccount"; static const String login = "/login"; - - static final Map routes = { - //Login splash: (BuildContext context) => SplashPage(), // login: (BuildContext context) => LoginScreen(), - - - }; } diff --git a/lib/dialogs/otp_dialog.dart b/lib/dialogs/otp_dialog.dart index 28b1fc0..c12dce2 100644 --- a/lib/dialogs/otp_dialog.dart +++ b/lib/dialogs/otp_dialog.dart @@ -9,7 +9,6 @@ import 'package:hmg_nurses/extensions/string_extensions.dart'; import 'package:hmg_nurses/widgets/button/default_button.dart'; import 'package:hmg_nurses/widgets/otp_widget.dart'; - final ValueNotifier otpFieldClear = ValueNotifier(""); class OtpDialog { @@ -132,8 +131,8 @@ class OtpDialog { children: [ Expanded( child: "LocaleKeys.codeExpire.tr()".toText16( - color: MyColors.redColor, - ), + color: MyColors.redColor, + ), ), 12.width, Image.asset( diff --git a/lib/exceptions/api_exception.dart b/lib/exceptions/api_exception.dart index e5676b6..0161b21 100644 --- a/lib/exceptions/api_exception.dart +++ b/lib/exceptions/api_exception.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:hmg_nurses/api/api_client.dart'; +import 'package:hmg_nurses/services/api_client.dart'; class APIException implements Exception { static const String BAD_REQUEST = 'api_common_bad_request'; diff --git a/lib/main.dart b/lib/main.dart index e7941d0..501bee7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,14 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_nurses/app_state/app_state.dart'; +import 'package:hmg_nurses/config/dependencies.dart'; import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; import 'package:hmg_nurses/theme/app_theme.dart'; +import 'package:injector/injector.dart'; import 'package:logger/logger.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; @@ -12,6 +16,8 @@ import 'package:sizer/sizer.dart'; import 'generated/codegen_loader.g.dart'; +late AppState appState; + Logger logger = Logger( // filter: null, // Use the default LogFilter (-> only log in debug mode) printer: PrettyPrinter( @@ -32,6 +38,7 @@ Future main() async { await EasyLocalization.ensureInitialized(); // AppState().setPostParamsInitConfig(); HttpOverrides.global = MyHttpOverrides(); + await Firebase.initializeApp(); runApp( EasyLocalization( supportedLocales: const [ @@ -46,7 +53,7 @@ Future main() async { create: (_) => DashboardProviderModel(), ) ], - child: const MyApp(), + child: MyApp(), ), ), ); @@ -59,7 +66,11 @@ Future main() async { // command to generate languages data from json class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + MyApp({super.key}) { + AppDependencies.addDependencies(); + appState = Injector.appInstance.get(); + appState.setPostParamsInitConfig(); + } @override Widget build(BuildContext context) { diff --git a/lib/model/base/generic_response_model.dart b/lib/model/base/generic_response_model.dart new file mode 100644 index 0000000..d498008 --- /dev/null +++ b/lib/model/base/generic_response_model.dart @@ -0,0 +1,743 @@ +// To parse this JSON data, do +// +// final genericResponseModel = genericResponseModelFromJson(jsonString); + +import 'dart:convert'; + +import 'package:hmg_nurses/model/login/imei_details.dart'; + +GenericResponseModel genericResponseModelFromJson(String str) => GenericResponseModel.fromJson(json.decode(str)); + +String genericResponseModelToJson(GenericResponseModel data) => json.encode(data.toJson()); + +class GenericResponseModel { + GenericResponseModel({ + this.date, + this.languageId, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenId, + this.data, + this.dataw, + this.dietType, + this.dietTypeId, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iosLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.vidaUpdatedResponse, + this.admissionDiagnosisList, + this.admissionMasterList, + this.admissionProcedureList, + this.admissionRequestList, + this.appointmentDate, + this.appointmentId, + this.assessmentList, + this.boxQuantity, + this.chkStatusUpdated, + this.chiefComplaintAuditLogList, + this.clinicId, + this.created, + this.dietTypeList, + this.doctorDetails, + this.doctorHaveOneClinic, + this.doctorId, + this.doctorNotRepliedCounts, + this.doctorSesId, + this.doctorTokId, + this.drugToDrugResponse, + this.erlcInsertPatientInHisgenxList, + this.erlcIsInserted, + this.erlcRequestList, + this.endTime, + this.episodeId, + this.getErAppointmentFeesList, + this.getEpisodeNo, + this.getPatientErSessionStatusList, + this.getVcStatusBySessionIdList, + this.hasAppointment, + this.hasVirtualClinic, + this.httpStatusCode, + this.icdCodesList, + this.isAccepted, + this.isChangePassword, + this.isLogout, + this.isPatientErRequestVcSessionAndTokenUpdated, + this.isPatientSessionStatusInserted, + this.isPatientSessionStatusUpdated, + this.isSent, + this.labResultType, + this.listSickLeavesToExtent, + this.listAdmissionOrders, + this.listAllergies, + this.listApprovalMainInPatient, + this.listChiefComplaint, + this.listClinicAll, + this.listDiabeticChartValues, + this.listDiagnosisForInPatient, + this.listDischargeSummary, + this.listDoctorDeviceDetails, + this.listDoctorProfile, + this.listDoctorProgressNote, + this.listDoctorsClinic, + this.listDoctorsAll, + this.listDrugToDrugTherapy, + this.listGetLabNormal, + this.listGetLabOreders, + this.listGetLabSpecial, + this.listGetMedicationForInpatient, + this.listGetPatientVitalSign, + this.listGetPregressNoteForInPatient, + this.listGetRadOreders, + this.listGtMyPatientsQuestions, + this.listHistory, + this.listIcdCodes, + this.listInterventionHistory, + this.listInterventionMedications, + this.listMyDischargePatient, + this.listMyDischargeReferralPatient, + this.listMyDischargeReferredPatient, + this.listMyInPatient, + this.listMyOutPatient, + this.listMyOutPatientReferral, + this.listMyReferralPatient, + this.listMyReferredOutPatient, + this.listMyReferredPatient, + this.listMyTomorrowPatient, + this.listNursingProgressNote, + this.listOtReservationDetails, + this.listOperationDetails, + this.listPendingDischargeSummary, + this.listPendingOrders, + this.listPendingPatientAdminList, + this.listPendingPatientList, + this.listPrescriptionAuditLogInfo, + this.listPrescriptionReportByPatientId, + this.listPrescriptionReportForInPatient, + this.listRxAuditLogInfo, + this.listStpMasterList, + this.listSpecialClinicalCareList, + this.listSpecialClinicalCareMappingList, + this.logInTokenId, + this.masterLookUpList, + this.medicationList, + this.memberId, + this.orderedProcedureList, + this.patientDetails, + this.patientFileList, + this.patientInfoList, + this.patientInforBySearchCriteriaHisgenxList, + this.patientInforBySearchCriteriaList, + this.patientOutSa, + this.patientsFileInfoList, + this.pendingReferralList, + this.physicalExamAuditLogList, + this.physicalExamList, + this.prescriptionList, + this.procedureList, + this.progressNoteList, + this.progressNotesAuditLogList, + this.projectId, + this.projectInfo, + this.referralList, + this.requestCompleted, + this.requisitionResponse, + this.returnValue, + this.rowCount, + this.smsCode, + this.searchAdmissionList, + this.searchCriteriaKindList, + this.sickLeaveStatistics, + this.sickLeavesList, + this.sserviceId, + this.startTime, + this.statusMessage, + this.strAppointmentDate, + this.totalUnUsedCount, + this.ucafResponse, + this.validateProcedureList, + this.validationErrors, + this.verificationCode, + this.vidaAuthTokenId, + this.vidaRefreshTokenId, + this.vitalSignsHistory, + this.vitalSignsList, + this.admissionResponse, + this.coveringDoctorList, + this.isActiveCode, + this.isSmsSent, + this.listCategories, + this.listClinics, + this.listDoctorDashboarKpi, + this.listItemByMedicineCode, + this.listKeywords, + this.listProcedureCategories, + this.listProcedureResult, + this.memberInformation, + this.patientArrivalList, + this.requisitionList, + this.requisitionScheduleList, + this.requisitionStatusList, + this.resultValue, + this.specialAuthenticate, + }); + + final dynamic date; + final int? languageId; + final int? serviceName; + final dynamic time; + final dynamic androidLink; + final dynamic authenticationTokenId; + final dynamic data; + final bool? dataw; + final int? dietType; + final int? dietTypeId; + final dynamic errorCode; + final dynamic errorEndUserMessage; + final dynamic errorEndUserMessageN; + final dynamic errorMessage; + final int? errorType; + final int? foodCategory; + final dynamic iosLink; + final bool? isAuthenticated; + final int? mealOrderStatus; + final int? mealType; + final int? messageStatus; + final int? numberOfResultRecords; + final dynamic patientBlodType; + final dynamic successMsg; + final dynamic successMsgN; + final dynamic vidaUpdatedResponse; + final dynamic admissionDiagnosisList; + final dynamic admissionMasterList; + final dynamic admissionProcedureList; + final dynamic admissionRequestList; + final dynamic appointmentDate; + final dynamic appointmentId; + final dynamic assessmentList; + final int? boxQuantity; + final int? chkStatusUpdated; + final dynamic chiefComplaintAuditLogList; + final int? clinicId; + final bool? created; + final dynamic dietTypeList; + final dynamic doctorDetails; + final bool? doctorHaveOneClinic; + final int? doctorId; + final int? doctorNotRepliedCounts; + final dynamic doctorSesId; + final dynamic doctorTokId; + final dynamic drugToDrugResponse; + final dynamic erlcInsertPatientInHisgenxList; + final int? erlcIsInserted; + final dynamic erlcRequestList; + final dynamic endTime; + final int? episodeId; + final dynamic getErAppointmentFeesList; + final int? getEpisodeNo; + final dynamic getPatientErSessionStatusList; + final dynamic getVcStatusBySessionIdList; + final bool? hasAppointment; + final dynamic hasVirtualClinic; + final dynamic httpStatusCode; + final dynamic icdCodesList; + final bool? isAccepted; + final bool? isChangePassword; + final bool? isLogout; + final bool? isPatientErRequestVcSessionAndTokenUpdated; + final bool? isPatientSessionStatusInserted; + final bool? isPatientSessionStatusUpdated; + final bool? isSent; + final int? labResultType; + final dynamic listSickLeavesToExtent; + final dynamic listAdmissionOrders; + final dynamic listAllergies; + final dynamic listApprovalMainInPatient; + final dynamic listChiefComplaint; + final dynamic listClinicAll; + final dynamic listDiabeticChartValues; + final dynamic listDiagnosisForInPatient; + final dynamic listDischargeSummary; + final List? listDoctorDeviceDetails; + final dynamic listDoctorProfile; + final dynamic listDoctorProgressNote; + final dynamic listDoctorsClinic; + final dynamic listDoctorsAll; + final dynamic listDrugToDrugTherapy; + final dynamic listGetLabNormal; + final dynamic listGetLabOreders; + final dynamic listGetLabSpecial; + final dynamic listGetMedicationForInpatient; + final dynamic listGetPatientVitalSign; + final dynamic listGetPregressNoteForInPatient; + final dynamic listGetRadOreders; + final dynamic listGtMyPatientsQuestions; + final dynamic listHistory; + final dynamic listIcdCodes; + final dynamic listInterventionHistory; + final dynamic listInterventionMedications; + final dynamic listMyDischargePatient; + final dynamic listMyDischargeReferralPatient; + final dynamic listMyDischargeReferredPatient; + final dynamic listMyInPatient; + final dynamic listMyOutPatient; + final dynamic listMyOutPatientReferral; + final dynamic listMyReferralPatient; + final dynamic listMyReferredOutPatient; + final dynamic listMyReferredPatient; + final dynamic listMyTomorrowPatient; + final dynamic listNursingProgressNote; + final dynamic listOtReservationDetails; + final dynamic listOperationDetails; + final dynamic listPendingDischargeSummary; + final dynamic listPendingOrders; + final dynamic listPendingPatientAdminList; + final dynamic listPendingPatientList; + final dynamic listPrescriptionAuditLogInfo; + final dynamic listPrescriptionReportByPatientId; + final dynamic listPrescriptionReportForInPatient; + final dynamic listRxAuditLogInfo; + final dynamic listStpMasterList; + final dynamic listSpecialClinicalCareList; + final dynamic listSpecialClinicalCareMappingList; + final dynamic logInTokenId; + final dynamic masterLookUpList; + final dynamic medicationList; + final int? memberId; + final dynamic orderedProcedureList; + final dynamic patientDetails; + final dynamic patientFileList; + final dynamic patientInfoList; + final dynamic patientInforBySearchCriteriaHisgenxList; + final dynamic patientInforBySearchCriteriaList; + final bool? patientOutSa; + final dynamic patientsFileInfoList; + final dynamic pendingReferralList; + final dynamic physicalExamAuditLogList; + final dynamic physicalExamList; + final dynamic prescriptionList; + final dynamic procedureList; + final dynamic progressNoteList; + final dynamic progressNotesAuditLogList; + final int? projectId; + final dynamic projectInfo; + final dynamic referralList; + final bool? requestCompleted; + final dynamic requisitionResponse; + final int? returnValue; + final int? rowCount; + final dynamic smsCode; + final dynamic searchAdmissionList; + final dynamic searchCriteriaKindList; + final dynamic sickLeaveStatistics; + final dynamic sickLeavesList; + final dynamic sserviceId; + final dynamic startTime; + final dynamic statusMessage; + final dynamic strAppointmentDate; + final int? totalUnUsedCount; + final dynamic ucafResponse; + final dynamic validateProcedureList; + final dynamic validationErrors; + final dynamic verificationCode; + final dynamic vidaAuthTokenId; + final dynamic vidaRefreshTokenId; + final dynamic vitalSignsHistory; + final dynamic vitalSignsList; + final dynamic admissionResponse; + final dynamic coveringDoctorList; + final bool? isActiveCode; + final bool? isSmsSent; + final dynamic listCategories; + final dynamic listClinics; + final dynamic listDoctorDashboarKpi; + final dynamic listItemByMedicineCode; + final dynamic listKeywords; + final dynamic listProcedureCategories; + final dynamic listProcedureResult; + final dynamic memberInformation; + final dynamic patientArrivalList; + final dynamic requisitionList; + final dynamic requisitionScheduleList; + final dynamic requisitionStatusList; + final int? resultValue; + final bool? specialAuthenticate; + + factory GenericResponseModel.fromJson(Map json) => GenericResponseModel( + date: json["Date"], + languageId: json["LanguageID"] == null ? null : json["LanguageID"], + serviceName: json["ServiceName"] == null ? null : json["ServiceName"], + time: json["Time"], + androidLink: json["AndroidLink"], + authenticationTokenId: json["AuthenticationTokenID"], + data: json["Data"], + dataw: json["Dataw"] == null ? null : json["Dataw"], + dietType: json["DietType"] == null ? null : json["DietType"], + dietTypeId: json["DietTypeID"] == null ? null : json["DietTypeID"], + errorCode: json["ErrorCode"], + errorEndUserMessage: json["ErrorEndUserMessage"], + errorEndUserMessageN: json["ErrorEndUserMessageN"], + errorMessage: json["ErrorMessage"], + errorType: json["ErrorType"] == null ? null : json["ErrorType"], + foodCategory: json["FoodCategory"] == null ? null : json["FoodCategory"], + iosLink: json["IOSLink"], + isAuthenticated: json["IsAuthenticated"] == null ? null : json["IsAuthenticated"], + mealOrderStatus: json["MealOrderStatus"] == null ? null : json["MealOrderStatus"], + mealType: json["MealType"] == null ? null : json["MealType"], + messageStatus: json["MessageStatus"] == null ? null : json["MessageStatus"], + numberOfResultRecords: json["NumberOfResultRecords"] == null ? null : json["NumberOfResultRecords"], + patientBlodType: json["PatientBlodType"], + successMsg: json["SuccessMsg"], + successMsgN: json["SuccessMsgN"], + vidaUpdatedResponse: json["VidaUpdatedResponse"], + admissionDiagnosisList: json["AdmissionDiagnosisList"], + admissionMasterList: json["AdmissionMasterList"], + admissionProcedureList: json["AdmissionProcedureList"], + admissionRequestList: json["AdmissionRequestList"], + appointmentDate: json["AppointmentDate"], + appointmentId: json["AppointmentID"], + assessmentList: json["AssessmentList"], + boxQuantity: json["BoxQuantity"] == null ? null : json["BoxQuantity"], + chkStatusUpdated: json["CHK_StatusUpdated"] == null ? null : json["CHK_StatusUpdated"], + chiefComplaintAuditLogList: json["ChiefComplaintAuditLogList"], + clinicId: json["ClinicID"] == null ? null : json["ClinicID"], + created: json["Created"] == null ? null : json["Created"], + dietTypeList: json["DietTypeList"], + doctorDetails: json["DoctorDetails"], + doctorHaveOneClinic: json["DoctorHaveOneClinic"] == null ? null : json["DoctorHaveOneClinic"], + doctorId: json["DoctorID"] == null ? null : json["DoctorID"], + doctorNotRepliedCounts: json["DoctorNotRepliedCounts"] == null ? null : json["DoctorNotRepliedCounts"], + doctorSesId: json["DoctorSesID"], + doctorTokId: json["DoctorTokID"], + drugToDrugResponse: json["DrugToDrugResponse"], + erlcInsertPatientInHisgenxList: json["ERLC_InsertPatientInHISGENXList"], + erlcIsInserted: json["ERLC_IsInserted"] == null ? null : json["ERLC_IsInserted"], + erlcRequestList: json["ERLC_RequestList"], + endTime: json["EndTime"], + episodeId: json["EpisodeID"] == null ? null : json["EpisodeID"], + getErAppointmentFeesList: json["GetERAppointmentFeesList"], + getEpisodeNo: json["GetEpisodeNo"] == null ? null : json["GetEpisodeNo"], + getPatientErSessionStatusList: json["GetPatientERSessionStatusList"], + getVcStatusBySessionIdList: json["GetVCStatusBySessionIDList"], + hasAppointment: json["HasAppointment"] == null ? null : json["HasAppointment"], + hasVirtualClinic: json["HasVirtualClinic"], + httpStatusCode: json["HttpStatusCode"], + icdCodesList: json["ICDCodesList"], + isAccepted: json["IsAccepted"] == null ? null : json["IsAccepted"], + isChangePassword: json["IsChangePassword"] == null ? null : json["IsChangePassword"], + isLogout: json["IsLogout"] == null ? null : json["IsLogout"], + isPatientErRequestVcSessionAndTokenUpdated: json["IsPatientERRequestVCSessionAndTokenUpdated"] == null ? null : json["IsPatientERRequestVCSessionAndTokenUpdated"], + isPatientSessionStatusInserted: json["IsPatientSessionStatusInserted"] == null ? null : json["IsPatientSessionStatusInserted"], + isPatientSessionStatusUpdated: json["IsPatientSessionStatusUpdated"] == null ? null : json["IsPatientSessionStatusUpdated"], + isSent: json["IsSent"] == null ? null : json["IsSent"], + labResultType: json["LabResultType"] == null ? null : json["LabResultType"], + listSickLeavesToExtent: json["ListSickLeavesToExtent"], + listAdmissionOrders: json["List_AdmissionOrders"], + listAllergies: json["List_Allergies"], + listApprovalMainInPatient: json["List_ApprovalMain_InPatient"], + listChiefComplaint: json["List_ChiefComplaint"], + listClinicAll: json["List_Clinic_All"], + listDiabeticChartValues: json["List_DiabeticChartValues"], + listDiagnosisForInPatient: json["List_DiagnosisForInPatient"], + listDischargeSummary: json["List_DischargeSummary"], + listDoctorDeviceDetails: json["List_DoctorDeviceDetails"] == null ? null : List.from(json["List_DoctorDeviceDetails"].map((x) => x)), + listDoctorProfile: json["List_DoctorProfile"], + listDoctorProgressNote: json["List_DoctorProgressNote"], + listDoctorsClinic: json["List_DoctorsClinic"], + listDoctorsAll: json["List_Doctors_All"], + listDrugToDrugTherapy: json["List_DrugToDrugTherapy"], + listGetLabNormal: json["List_GetLabNormal"], + listGetLabOreders: json["List_GetLabOreders"], + listGetLabSpecial: json["List_GetLabSpecial"], + listGetMedicationForInpatient: json["List_GetMedicationForInpatient"], + listGetPatientVitalSign: json["List_GetPatientVitalSign"], + listGetPregressNoteForInPatient: json["List_GetPregressNoteForInPatient"], + listGetRadOreders: json["List_GetRadOreders"], + listGtMyPatientsQuestions: json["List_GtMyPatientsQuestions"], + listHistory: json["List_History"], + listIcdCodes: json["List_ICDCodes"], + listInterventionHistory: json["List_InterventionHistory"], + listInterventionMedications: json["List_InterventionMedications"], + listMyDischargePatient: json["List_MyDischargePatient"], + listMyDischargeReferralPatient: json["List_MyDischargeReferralPatient"], + listMyDischargeReferredPatient: json["List_MyDischargeReferredPatient"], + listMyInPatient: json["List_MyInPatient"], + listMyOutPatient: json["List_MyOutPatient"], + listMyOutPatientReferral: json["List_MyOutPatientReferral"], + listMyReferralPatient: json["List_MyReferralPatient"], + listMyReferredOutPatient: json["List_MyReferredOutPatient"], + listMyReferredPatient: json["List_MyReferredPatient"], + listMyTomorrowPatient: json["List_MyTomorrowPatient"], + listNursingProgressNote: json["List_NursingProgressNote"], + listOtReservationDetails: json["List_OTReservationDetails"], + listOperationDetails: json["List_OperationDetails"], + listPendingDischargeSummary: json["List_PendingDischargeSummary"], + listPendingOrders: json["List_PendingOrders"], + listPendingPatientAdminList: json["List_PendingPatientAdminList"], + listPendingPatientList: json["List_PendingPatientList"], + listPrescriptionAuditLogInfo: json["List_PrescriptionAuditLogInfo"], + listPrescriptionReportByPatientId: json["List_PrescriptionReportByPatientID"], + listPrescriptionReportForInPatient: json["List_PrescriptionReportForInPatient"], + listRxAuditLogInfo: json["List_RxAuditLogInfo"], + listStpMasterList: json["List_STPMasterList"], + listSpecialClinicalCareList: json["List_SpecialClinicalCareList"], + listSpecialClinicalCareMappingList: json["List_SpecialClinicalCareMappingList"], + logInTokenId: json["LogInTokenID"], + masterLookUpList: json["MasterLookUpList"], + medicationList: json["MedicationList"], + memberId: json["MemberID"] == null ? null : json["MemberID"], + orderedProcedureList: json["OrderedProcedureList"], + patientDetails: json["PatientDetails"], + patientFileList: json["PatientFileList"], + patientInfoList: json["PatientInfo_List"], + patientInforBySearchCriteriaHisgenxList: json["PatientInforBySearchCriteriaHISGENX_List"], + patientInforBySearchCriteriaList: json["PatientInforBySearchCriteria_List"], + patientOutSa: json["PatientOutSA"] == null ? null : json["PatientOutSA"], + patientsFileInfoList: json["PatientsFileInfo_List"], + pendingReferralList: json["PendingReferralList"], + physicalExamAuditLogList: json["PhysicalExamAuditLogList"], + physicalExamList: json["PhysicalExamList"], + prescriptionList: json["PrescriptionList"], + procedureList: json["ProcedureList"], + progressNoteList: json["ProgressNoteList"], + progressNotesAuditLogList: json["ProgressNotesAuditLogList"], + projectId: json["ProjectID"] == null ? null : json["ProjectID"], + projectInfo: json["ProjectInfo"], + referralList: json["ReferralList"], + requestCompleted: json["RequestCompleted"] == null ? null : json["RequestCompleted"], + requisitionResponse: json["RequisitionResponse"], + returnValue: json["ReturnValue"] == null ? null : json["ReturnValue"], + rowCount: json["RowCount"] == null ? null : json["RowCount"], + smsCode: json["SMSCode"], + searchAdmissionList: json["SearchAdmissionList"], + searchCriteriaKindList: json["SearchCriteriaKindList"], + sickLeaveStatistics: json["SickLeaveStatistics"], + sickLeavesList: json["SickLeavesList"], + sserviceId: json["SserviceID"], + startTime: json["StartTime"], + statusMessage: json["StatusMessage"], + strAppointmentDate: json["StrAppointmentDate"], + totalUnUsedCount: json["TotalUnUsedCount"] == null ? null : json["TotalUnUsedCount"], + ucafResponse: json["UcafResponse"], + validateProcedureList: json["ValidateProcedureList"], + validationErrors: json["ValidationErrors"], + verificationCode: json["VerificationCode"], + vidaAuthTokenId: json["VidaAuthTokenID"], + vidaRefreshTokenId: json["VidaRefreshTokenID"], + vitalSignsHistory: json["VitalSignsHistory"], + vitalSignsList: json["VitalSignsList"], + admissionResponse: json["admissionResponse"], + coveringDoctorList: json["coveringDoctorList"], + isActiveCode: json["isActiveCode"] == null ? null : json["isActiveCode"], + isSmsSent: json["isSMSSent"] == null ? null : json["isSMSSent"], + listCategories: json["listCategories"], + listClinics: json["listClinics"], + listDoctorDashboarKpi: json["listDoctorDashboarKPI"], + listItemByMedicineCode: json["listItemByMedicineCode"], + listKeywords: json["listKeywords"], + listProcedureCategories: json["listProcedureCategories"], + listProcedureResult: json["listProcedureResult"], + memberInformation: json["memberInformation"], + patientArrivalList: json["patientArrivalList"], + requisitionList: json["requisitionList"], + requisitionScheduleList: json["requisitionScheduleList"], + requisitionStatusList: json["requisitionStatusList"], + resultValue: json["resultValue"] == null ? null : json["resultValue"], + specialAuthenticate: json["specialAuthenticate"] == null ? null : json["specialAuthenticate"], + ); + + Map toJson() => { + "Date": date, + "LanguageID": languageId == null ? null : languageId, + "ServiceName": serviceName == null ? null : serviceName, + "Time": time, + "AndroidLink": androidLink, + "AuthenticationTokenID": authenticationTokenId, + "Data": data, + "Dataw": dataw == null ? null : dataw, + "DietType": dietType == null ? null : dietType, + "DietTypeID": dietTypeId == null ? null : dietTypeId, + "ErrorCode": errorCode, + "ErrorEndUserMessage": errorEndUserMessage, + "ErrorEndUserMessageN": errorEndUserMessageN, + "ErrorMessage": errorMessage, + "ErrorType": errorType == null ? null : errorType, + "FoodCategory": foodCategory == null ? null : foodCategory, + "IOSLink": iosLink, + "IsAuthenticated": isAuthenticated == null ? null : isAuthenticated, + "MealOrderStatus": mealOrderStatus == null ? null : mealOrderStatus, + "MealType": mealType == null ? null : mealType, + "MessageStatus": messageStatus == null ? null : messageStatus, + "NumberOfResultRecords": numberOfResultRecords == null ? null : numberOfResultRecords, + "PatientBlodType": patientBlodType, + "SuccessMsg": successMsg, + "SuccessMsgN": successMsgN, + "VidaUpdatedResponse": vidaUpdatedResponse, + "AdmissionDiagnosisList": admissionDiagnosisList, + "AdmissionMasterList": admissionMasterList, + "AdmissionProcedureList": admissionProcedureList, + "AdmissionRequestList": admissionRequestList, + "AppointmentDate": appointmentDate, + "AppointmentID": appointmentId, + "AssessmentList": assessmentList, + "BoxQuantity": boxQuantity == null ? null : boxQuantity, + "CHK_StatusUpdated": chkStatusUpdated == null ? null : chkStatusUpdated, + "ChiefComplaintAuditLogList": chiefComplaintAuditLogList, + "ClinicID": clinicId == null ? null : clinicId, + "Created": created == null ? null : created, + "DietTypeList": dietTypeList, + "DoctorDetails": doctorDetails, + "DoctorHaveOneClinic": doctorHaveOneClinic == null ? null : doctorHaveOneClinic, + "DoctorID": doctorId == null ? null : doctorId, + "DoctorNotRepliedCounts": doctorNotRepliedCounts == null ? null : doctorNotRepliedCounts, + "DoctorSesID": doctorSesId, + "DoctorTokID": doctorTokId, + "DrugToDrugResponse": drugToDrugResponse, + "ERLC_InsertPatientInHISGENXList": erlcInsertPatientInHisgenxList, + "ERLC_IsInserted": erlcIsInserted == null ? null : erlcIsInserted, + "ERLC_RequestList": erlcRequestList, + "EndTime": endTime, + "EpisodeID": episodeId == null ? null : episodeId, + "GetERAppointmentFeesList": getErAppointmentFeesList, + "GetEpisodeNo": getEpisodeNo == null ? null : getEpisodeNo, + "GetPatientERSessionStatusList": getPatientErSessionStatusList, + "GetVCStatusBySessionIDList": getVcStatusBySessionIdList, + "HasAppointment": hasAppointment == null ? null : hasAppointment, + "HasVirtualClinic": hasVirtualClinic, + "HttpStatusCode": httpStatusCode, + "ICDCodesList": icdCodesList, + "IsAccepted": isAccepted == null ? null : isAccepted, + "IsChangePassword": isChangePassword == null ? null : isChangePassword, + "IsLogout": isLogout == null ? null : isLogout, + "IsPatientERRequestVCSessionAndTokenUpdated": isPatientErRequestVcSessionAndTokenUpdated == null ? null : isPatientErRequestVcSessionAndTokenUpdated, + "IsPatientSessionStatusInserted": isPatientSessionStatusInserted == null ? null : isPatientSessionStatusInserted, + "IsPatientSessionStatusUpdated": isPatientSessionStatusUpdated == null ? null : isPatientSessionStatusUpdated, + "IsSent": isSent == null ? null : isSent, + "LabResultType": labResultType == null ? null : labResultType, + "ListSickLeavesToExtent": listSickLeavesToExtent, + "List_AdmissionOrders": listAdmissionOrders, + "List_Allergies": listAllergies, + "List_ApprovalMain_InPatient": listApprovalMainInPatient, + "List_ChiefComplaint": listChiefComplaint, + "List_Clinic_All": listClinicAll, + "List_DiabeticChartValues": listDiabeticChartValues, + "List_DiagnosisForInPatient": listDiagnosisForInPatient, + "List_DischargeSummary": listDischargeSummary, + "List_DoctorDeviceDetails": listDoctorDeviceDetails == null ? null : List.from(listDoctorDeviceDetails!.map((x) => x)), + "List_DoctorProfile": listDoctorProfile, + "List_DoctorProgressNote": listDoctorProgressNote, + "List_DoctorsClinic": listDoctorsClinic, + "List_Doctors_All": listDoctorsAll, + "List_DrugToDrugTherapy": listDrugToDrugTherapy, + "List_GetLabNormal": listGetLabNormal, + "List_GetLabOreders": listGetLabOreders, + "List_GetLabSpecial": listGetLabSpecial, + "List_GetMedicationForInpatient": listGetMedicationForInpatient, + "List_GetPatientVitalSign": listGetPatientVitalSign, + "List_GetPregressNoteForInPatient": listGetPregressNoteForInPatient, + "List_GetRadOreders": listGetRadOreders, + "List_GtMyPatientsQuestions": listGtMyPatientsQuestions, + "List_History": listHistory, + "List_ICDCodes": listIcdCodes, + "List_InterventionHistory": listInterventionHistory, + "List_InterventionMedications": listInterventionMedications, + "List_MyDischargePatient": listMyDischargePatient, + "List_MyDischargeReferralPatient": listMyDischargeReferralPatient, + "List_MyDischargeReferredPatient": listMyDischargeReferredPatient, + "List_MyInPatient": listMyInPatient, + "List_MyOutPatient": listMyOutPatient, + "List_MyOutPatientReferral": listMyOutPatientReferral, + "List_MyReferralPatient": listMyReferralPatient, + "List_MyReferredOutPatient": listMyReferredOutPatient, + "List_MyReferredPatient": listMyReferredPatient, + "List_MyTomorrowPatient": listMyTomorrowPatient, + "List_NursingProgressNote": listNursingProgressNote, + "List_OTReservationDetails": listOtReservationDetails, + "List_OperationDetails": listOperationDetails, + "List_PendingDischargeSummary": listPendingDischargeSummary, + "List_PendingOrders": listPendingOrders, + "List_PendingPatientAdminList": listPendingPatientAdminList, + "List_PendingPatientList": listPendingPatientList, + "List_PrescriptionAuditLogInfo": listPrescriptionAuditLogInfo, + "List_PrescriptionReportByPatientID": listPrescriptionReportByPatientId, + "List_PrescriptionReportForInPatient": listPrescriptionReportForInPatient, + "List_RxAuditLogInfo": listRxAuditLogInfo, + "List_STPMasterList": listStpMasterList, + "List_SpecialClinicalCareList": listSpecialClinicalCareList, + "List_SpecialClinicalCareMappingList": listSpecialClinicalCareMappingList, + "LogInTokenID": logInTokenId, + "MasterLookUpList": masterLookUpList, + "MedicationList": medicationList, + "MemberID": memberId == null ? null : memberId, + "OrderedProcedureList": orderedProcedureList, + "PatientDetails": patientDetails, + "PatientFileList": patientFileList, + "PatientInfo_List": patientInfoList, + "PatientInforBySearchCriteriaHISGENX_List": patientInforBySearchCriteriaHisgenxList, + "PatientInforBySearchCriteria_List": patientInforBySearchCriteriaList, + "PatientOutSA": patientOutSa == null ? null : patientOutSa, + "PatientsFileInfo_List": patientsFileInfoList, + "PendingReferralList": pendingReferralList, + "PhysicalExamAuditLogList": physicalExamAuditLogList, + "PhysicalExamList": physicalExamList, + "PrescriptionList": prescriptionList, + "ProcedureList": procedureList, + "ProgressNoteList": progressNoteList, + "ProgressNotesAuditLogList": progressNotesAuditLogList, + "ProjectID": projectId == null ? null : projectId, + "ProjectInfo": projectInfo, + "ReferralList": referralList, + "RequestCompleted": requestCompleted == null ? null : requestCompleted, + "RequisitionResponse": requisitionResponse, + "ReturnValue": returnValue == null ? null : returnValue, + "RowCount": rowCount == null ? null : rowCount, + "SMSCode": smsCode, + "SearchAdmissionList": searchAdmissionList, + "SearchCriteriaKindList": searchCriteriaKindList, + "SickLeaveStatistics": sickLeaveStatistics, + "SickLeavesList": sickLeavesList, + "SserviceID": sserviceId, + "StartTime": startTime, + "StatusMessage": statusMessage, + "StrAppointmentDate": strAppointmentDate, + "TotalUnUsedCount": totalUnUsedCount == null ? null : totalUnUsedCount, + "UcafResponse": ucafResponse, + "ValidateProcedureList": validateProcedureList, + "ValidationErrors": validationErrors, + "VerificationCode": verificationCode, + "VidaAuthTokenID": vidaAuthTokenId, + "VidaRefreshTokenID": vidaRefreshTokenId, + "VitalSignsHistory": vitalSignsHistory, + "VitalSignsList": vitalSignsList, + "admissionResponse": admissionResponse, + "coveringDoctorList": coveringDoctorList, + "isActiveCode": isActiveCode == null ? null : isActiveCode, + "isSMSSent": isSmsSent == null ? null : isSmsSent, + "listCategories": listCategories, + "listClinics": listClinics, + "listDoctorDashboarKPI": listDoctorDashboarKpi, + "listItemByMedicineCode": listItemByMedicineCode, + "listKeywords": listKeywords, + "listProcedureCategories": listProcedureCategories, + "listProcedureResult": listProcedureResult, + "memberInformation": memberInformation, + "patientArrivalList": patientArrivalList, + "requisitionList": requisitionList, + "requisitionScheduleList": requisitionScheduleList, + "requisitionStatusList": requisitionStatusList, + "resultValue": resultValue == null ? null : resultValue, + "specialAuthenticate": specialAuthenticate == null ? null : specialAuthenticate, + }; +} diff --git a/lib/model/base/post_params_model.dart b/lib/model/base/post_params_model.dart new file mode 100644 index 0000000..839ce4b --- /dev/null +++ b/lib/model/base/post_params_model.dart @@ -0,0 +1,104 @@ +class PostParamsModel { + String? imei; + String? tokenID; + int? languageID; + String? stamp; + String? iPAdress; + double? versionID; + int? channel; + String? sessionID; + bool? isLoginForDoctorApp; + bool? patientOutSA; + String? vidaAuthTokenID; + String? vidaRefreshTokenID; + int? deviceTypeID; + + PostParamsModel({ + this.imei, + this.tokenID, + this.languageID, + this.stamp, + this.iPAdress, + this.versionID, + this.channel, + this.sessionID, + this.isLoginForDoctorApp, + this.patientOutSA, + this.vidaAuthTokenID, + this.vidaRefreshTokenID, + this.deviceTypeID, + }); + + PostParamsModel.fromJson(Map json) { + imei = json['IMEI']; + tokenID = json['TokenID']; + languageID = json['LanguageID']; + stamp = json['stamp']; + iPAdress = json['IPAdress']; + versionID = json['VersionID']; + channel = json['Channel']; + sessionID = json['SessionID']; + isLoginForDoctorApp = json['IsLoginForDoctorApp']; + patientOutSA = json['PatientOutSA']; + vidaAuthTokenID = json['VidaAuthTokenID']; + vidaRefreshTokenID = json['VidaRefreshTokenID']; + deviceTypeID = json['DeviceTypeID']; + } + + Map toJson() { + Map data = new Map(); + data['IMEI'] = this.imei; + data['TokenID'] = this.tokenID; + data['LanguageID'] = this.languageID; + data['stamp'] = this.stamp; + data['IPAdress'] = this.iPAdress; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['SessionID'] = this.sessionID; + data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp; + data['PatientOutSA'] = this.patientOutSA; + data['VidaAuthTokenID'] = this.vidaAuthTokenID; + data['VidaRefreshTokenID'] = this.vidaRefreshTokenID; + data['DeviceTypeID'] = this.deviceTypeID; + return data; + } + + // Map toJsonAfterLogin() { + // Map data = new Map(); + // data['VersionID'] = this.versionID; + // data['Channel'] = this.channel; + // data['LanguageID'] = this.languageID; + // data['MobileType'] = this.mobileType; + // data['LogInTokenID'] = this.logInTokenID; + // data['TokenID'] = this.tokenID; + // data['MobileNumber'] = this.mobileNumber; + // data['UserName'] = this.userName; + // data['P_EMAIL_ADDRESS'] = this.pEmailAddress; + // data['P_SESSION_ID'] = this.pSessionId; + // data['PayrollCodeStr'] = this.payrollCodeStr; + // data['LegislationCodeStr'] = this.pLegislationCode; + // data['P_SELECTED_EMPLOYEE_NUMBER'] = this.pSelectedEmployeeNumber; + // data['P_USER_NAME'] = this.pUserName; + // return data; + // } + // + // set setLogInTokenID(String? token) => logInTokenID = token; + // + // set setTokenID(String? token) => tokenID = token; + // + // set setMobileNumer(String? v) => mobileNumber = v; + // + // set setUserName(String? v) => userName = v; + // + // set setPEmailAddress(String? v) => pEmailAddress = v; + // + // set setPSessionId(int? v) => pSessionId = v; + // + // set setPUserName(String? v) => pUserName = v; + // + // set setPSelectedEmployeeNumber(String? v) => pSelectedEmployeeNumber = v; + // + // set setPLegislationCode(String? v) => pLegislationCode = v; + // + // set setPayrollCodeStr(String? v) => payrollCodeStr = v; +} diff --git a/lib/model/login/imei_details.dart b/lib/model/login/imei_details.dart new file mode 100644 index 0000000..e2611a5 --- /dev/null +++ b/lib/model/login/imei_details.dart @@ -0,0 +1,128 @@ +class GetIMEIDetailsModel { + int? iD; + String? iMEI; + int? logInTypeID; + bool? outSA; + String? mobile; + dynamic identificationNo; + int? doctorID; + String? doctorName; + String? doctorNameN; + int? clinicID; + String? clinicDescription; + dynamic clinicDescriptionN; + int? projectID; + String? projectName; + String? genderDescription; + dynamic genderDescriptionN; + String? titleDescription; + dynamic titleDescriptionN; + dynamic zipCode; + String? createdOn; + dynamic createdBy; + String? editedOn; + dynamic editedBy; + bool? biometricEnabled; + dynamic preferredLanguage; + bool? isActive; + String? vidaAuthTokenID; + String? vidaRefreshTokenID; + String? password; + + GetIMEIDetailsModel( + {this.iD, + this.iMEI, + this.logInTypeID, + this.outSA, + this.mobile, + this.identificationNo, + this.doctorID, + this.doctorName, + this.doctorNameN, + this.clinicID, + this.clinicDescription, + this.clinicDescriptionN, + this.projectID, + this.projectName, + this.genderDescription, + this.genderDescriptionN, + this.titleDescription, + this.titleDescriptionN, + this.zipCode, + this.createdOn, + this.createdBy, + this.editedOn, + this.editedBy, + this.biometricEnabled, + this.preferredLanguage, + this.isActive, + this.vidaAuthTokenID, + this.vidaRefreshTokenID, + this.password}); + + GetIMEIDetailsModel.fromJson(Map json) { + iD = json['ID']; + iMEI = json['IMEI']; + logInTypeID = json['LogInTypeID']; + outSA = json['OutSA']; + mobile = json['Mobile']; + identificationNo = json['IdentificationNo']; + doctorID = json['DoctorID']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + clinicID = json['ClinicID']; + clinicDescription = json['ClinicDescription']; + clinicDescriptionN = json['ClinicDescriptionN']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + genderDescription = json['Gender_Description']; + genderDescriptionN = json['Gender_DescriptionN']; + titleDescription = json['Title_Description']; + titleDescriptionN = json['Title_DescriptionN']; + zipCode = json['ZipCode']; + createdOn = json['CreatedOn']; + createdBy = json['CreatedBy']; + editedOn = json['EditedOn']; + editedBy = json['EditedBy']; + biometricEnabled = json['BiometricEnabled']; + preferredLanguage = json['PreferredLanguage']; + isActive = json['IsActive']; + vidaAuthTokenID = json['VidaAuthTokenID']; + vidaRefreshTokenID = json['VidaRefreshTokenID']; + password = json['Password']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['IMEI'] = this.iMEI; + data['LogInTypeID'] = this.logInTypeID; + data['OutSA'] = this.outSA; + data['Mobile'] = this.mobile; + data['IdentificationNo'] = this.identificationNo; + data['DoctorID'] = this.doctorID; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['ClinicID'] = this.clinicID; + data['ClinicDescription'] = this.clinicDescription; + data['ClinicDescriptionN'] = this.clinicDescriptionN; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['Gender_Description'] = this.genderDescription; + data['Gender_DescriptionN'] = this.genderDescriptionN; + data['Title_Description'] = this.titleDescription; + data['Title_DescriptionN'] = this.titleDescriptionN; + data['ZipCode'] = this.zipCode; + data['CreatedOn'] = this.createdOn; + data['CreatedBy'] = this.createdBy; + data['EditedOn'] = this.editedOn; + data['EditedBy'] = this.editedBy; + data['BiometricEnabled'] = this.biometricEnabled; + data['PreferredLanguage'] = this.preferredLanguage; + data['IsActive'] = this.isActive; + data['VidaAuthTokenID'] = this.vidaAuthTokenID; + data['VidaRefreshTokenID'] = this.vidaRefreshTokenID; + data['Password'] = this.password; + return data; + } +} diff --git a/lib/provider/helper/provider_helper.dart b/lib/provider/helper/provider_helper.dart new file mode 100644 index 0000000..9981f63 --- /dev/null +++ b/lib/provider/helper/provider_helper.dart @@ -0,0 +1,46 @@ +import 'package:flutter/widgets.dart'; + +enum _Action { + increment, + decrement, +} + +class MyStore extends ValueNotifier { + MyStore() : super(0); + + void increment() => value++; + + void decrement() => value--; +} + +class Bar {} + +class Initial implements Bar {} + +class Loading implements Bar {} + +class Error implements Bar { + Error(this.err); + + final Object err; +} + +class Loaded implements Bar { + Loaded(this.value); + + final int value; +} + +class Foo extends ValueNotifier { + Foo() : super(Initial()); + + Future fetch() async { + value = Loading(); + try { + final result = await Future.delayed(Duration(seconds: 1)); + value = Loaded(result); + } catch (err) { + value = Error(err); + } + } +} diff --git a/lib/api/api_client.dart b/lib/services/api_client.dart similarity index 62% rename from lib/api/api_client.dart rename to lib/services/api_client.dart index 4a0b6a8..c00d0aa 100644 --- a/lib/api/api_client.dart +++ b/lib/services/api_client.dart @@ -18,8 +18,7 @@ class APIError { APIError(this.errorCode, this.errorMessage); - Map toJson() => - {'errorCode': errorCode, 'errorMessage': errorMessage}; + Map toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; @override String toString() { @@ -54,27 +53,33 @@ APIException _throwAPIException(Response response) { return APIException(APIException.INTERNAL_SERVER_ERROR); case 444: var downloadUrl = response.headers["location"]; - return APIException(APIException.UPGRADE_REQUIRED, - arguments: downloadUrl); + return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); default: return APIException(APIException.OTHER); } } -class ApiClient { - static final ApiClient _instance = ApiClient._internal(); +abstract class IApiClient { + Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, + {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isFormData = false}); - ApiClient._internal(); + Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isFormData = false}); - factory ApiClient() => _instance; + Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); - Future postJsonForObject( - FactoryConstructor factoryConstructor, String url, T jsonObject, - {String? token, - Map? queryParameters, - Map? headers, - int retryTimes = 0, - bool isFormData = false}) async { + void setHomeUrl(String url); +} + +class ApiClient implements IApiClient { + // static final ApiClient _instance = ApiClient._internal(); + + // ApiClient._internal(); + + // factory ApiClient() => _instance; + + @override + Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, + {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isFormData = false}) async { var _headers = {'Accept': 'application/json'}; if (headers != null && headers.isNotEmpty) { _headers.addAll(headers); @@ -84,12 +89,7 @@ class ApiClient { var bodyJson = json.encode(jsonObject); print("body:$bodyJson"); } - var response = await postJsonForResponse(url, jsonObject, - token: token, - queryParameters: queryParameters, - headers: _headers, - retryTimes: retryTimes, - isFormData: isFormData); + var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes, isFormData: isFormData); // try { if (!kReleaseMode) { logger.i("res: " + response.body); @@ -102,8 +102,7 @@ class ApiClient { return factoryConstructor(jsonData); } else { APIError? apiError; - apiError = - APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); + apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); throw APIException(APIException.BAD_REQUEST, error: apiError); } // } catch (ex) { @@ -115,12 +114,9 @@ class ApiClient { // } } + @override Future postJsonForResponse(String url, T jsonObject, - {String? token, - Map? queryParameters, - Map? headers, - int retryTimes = 0, - bool isFormData = false}) async { + {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isFormData = false}) async { String? requestBody; late Map stringObj; if (jsonObject != null) { @@ -134,22 +130,13 @@ class ApiClient { if (isFormData) { headers = {'Content-Type': 'application/x-www-form-urlencoded'}; - stringObj = ((jsonObject ?? {}) as Map) - .map((key, value) => MapEntry(key, value?.toString() ?? "")); + stringObj = ((jsonObject ?? {}) as Map).map((key, value) => MapEntry(key, value?.toString() ?? "")); } - return await _postForResponse(url, isFormData ? stringObj : requestBody, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes); + return await _postForResponse(url, isFormData ? stringObj : requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); } - Future _postForResponse(String url, requestBody, - {String? token, - Map? queryParameters, - Map? headers, - int retryTimes = 0}) async { + Future _postForResponse(String url, requestBody, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { try { var _headers = {}; if (token != null) { @@ -164,9 +151,7 @@ class ApiClient { var queryString = new Uri(queryParameters: queryParameters).query; url = url + '?' + queryString; } - var response = - await _post(Uri.parse(url), body: requestBody, headers: _headers) - .timeout(Duration(seconds: 120)); + var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 120)); if (response.statusCode >= 200 && response.statusCode < 300) { return response; @@ -177,11 +162,7 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); } else { throw APIException(APIException.OTHER, arguments: e); } @@ -189,11 +170,7 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); } else { throw APIException(APIException.OTHER, arguments: e); } @@ -203,39 +180,24 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); } else { throw APIException(APIException.OTHER, arguments: e); } } } - Future getJsonForResponse(String url, - {String? token, - Map? queryParameters, - Map? headers, - int retryTimes = 0}) async { + @override + Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { if (headers == null) { headers = {'Content-Type': 'application/json'}; } else { headers['Content-Type'] = 'application/json'; } - return await _getForResponse(url, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes); + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); } - Future _getForResponse(String url, - {String? token, - Map? queryParameters, - Map? headers, - int retryTimes = 0}) async { + Future _getForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { try { var _headers = {}; if (token != null) { @@ -250,8 +212,7 @@ class ApiClient { var queryString = new Uri(queryParameters: queryParameters).query; url = url + '?' + queryString; } - var response = await _get(Uri.parse(url), headers: _headers) - .timeout(Duration(seconds: 60)); + var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60)); if (response.statusCode >= 200 && response.statusCode < 300) { return response; @@ -262,11 +223,7 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _getForResponse(url, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1); + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); } else { throw APIException(APIException.OTHER, arguments: e); } @@ -274,11 +231,7 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _getForResponse(url, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1); + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); } else { throw APIException(APIException.OTHER, arguments: e); } @@ -288,19 +241,14 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _getForResponse(url, - token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1); + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); } else { throw APIException(APIException.OTHER, arguments: e); } } } - Future _get(url, {Map? headers}) => - _withClient((client) => client.get(url, headers: headers)); + Future _get(url, {Map? headers}) => _withClient((client) => client.get(url, headers: headers)); bool _certificateCheck(X509Certificate cert, String host, int port) => true; @@ -314,8 +262,10 @@ class ApiClient { } } - Future _post(url, - {Map? headers, body, Encoding? encoding}) => - _withClient((client) => - client.post(url, headers: headers, body: body, encoding: encoding)); + Future _post(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); + + @override + void setHomeUrl(String url) { + // TODO: implement setHomeUrl + } } diff --git a/lib/services/firebase_service.dart b/lib/services/firebase_service.dart new file mode 100644 index 0000000..01a53f3 --- /dev/null +++ b/lib/services/firebase_service.dart @@ -0,0 +1,24 @@ +import 'dart:io'; + +import 'package:firebase_messaging/firebase_messaging.dart'; + +abstract class IFirebaseService { + Future getFirebaseToke(); +} + +class FirebaseService implements IFirebaseService { + final FirebaseMessaging? _firebaseMessaging = FirebaseMessaging.instance; + + FirebaseService() { + _firebaseMessaging!.setAutoInitEnabled(true); + if (Platform.isIOS) { + _firebaseMessaging!.requestPermission(); + } + } + + @override + Future getFirebaseToke() async { + var token = await _firebaseMessaging!.getToken(); + return token ?? ""; + } +} diff --git a/lib/ui/login/splash_page.dart b/lib/ui/login/splash_page.dart index 8d8bfb7..8f77303 100644 --- a/lib/ui/login/splash_page.dart +++ b/lib/ui/login/splash_page.dart @@ -1,6 +1,34 @@ import 'package:flutter/material.dart'; +import 'package:hmg_nurses/api_repo/login_api_repo.dart'; +import 'package:hmg_nurses/services/firebase_service.dart'; +import 'package:injector/injector.dart'; + +import '../../classes/utils.dart'; + +class SplashPage extends StatefulWidget { + @override + State createState() => _SplashPageState(); +} + +class _SplashPageState extends State { + final ILoginApiRepo _loginApiRepo = Injector.appInstance.get(); + + @override + void initState() { + super.initState(); + getData(); + } + + getData() async { + try { + await _loginApiRepo.getDeviceInfoByIMEI(); + } catch (e) { + Utils.handleException(e, context, (msg) { + Utils.confirmDialog(context, msg); + }); + } + } -class SplashPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold(); diff --git a/pubspec.lock b/pubspec.lock index 72e9cac..0f2db6f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.8" args: dependency: transitive description: @@ -43,6 +50,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "5.8.5" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.5" collection: dependency: transitive description: @@ -99,6 +120,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.4" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "4.5.2" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + url: "https://pub.dartlang.org" + source: hosted + version: "14.1.0" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.6" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.6" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index c593a83..c03a35e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -50,6 +50,12 @@ dependencies: shimmer: ^2.0.0 sizer: ^2.0.15 + + # Firebase + firebase_messaging: ^14.1.0 + firebase_core: ^2.2.0 + + dev_dependencies: flutter_test: sdk: flutter diff --git a/test/widget_test.dart b/test/widget_test.dart index 04e9ac2..d9e33cb 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -13,7 +13,7 @@ import 'package:hmg_nurses/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); + await tester.pumpWidget(MyApp()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); From ca7c923429d36cd53358bc648ded9cb09eba7bf9 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Sun, 20 Nov 2022 09:23:41 +0300 Subject: [PATCH 2/9] Backend Structure 2.0 --- lib/api_repo/login_api_repo.dart | 42 ++++++++++++++++++- lib/app_state/app_state.dart | 8 ++-- lib/model/base/generic_response_model.dart | 8 ++-- lib/model/base/post_params_model.dart | 1 - ...i_details.dart => imei_details_model.dart} | 0 lib/model/login/project_info_model.dart | 23 ++++++++++ lib/ui/login/splash_page.dart | 2 + 7 files changed, 75 insertions(+), 9 deletions(-) rename lib/model/login/{imei_details.dart => imei_details_model.dart} (100%) create mode 100644 lib/model/login/project_info_model.dart diff --git a/lib/api_repo/login_api_repo.dart b/lib/api_repo/login_api_repo.dart index da136a1..d246bff 100644 --- a/lib/api_repo/login_api_repo.dart +++ b/lib/api_repo/login_api_repo.dart @@ -1,15 +1,20 @@ import 'package:hmg_nurses/exceptions/api_exception.dart'; import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/model/login/project_info_model.dart'; import 'package:hmg_nurses/services/api_client.dart'; import 'package:hmg_nurses/classes/consts.dart'; import 'package:hmg_nurses/model/base/generic_response_model.dart'; -import 'package:hmg_nurses/model/login/imei_details.dart'; +import 'package:hmg_nurses/model/login/imei_details_model.dart'; import 'package:injector/injector.dart'; import '../services/firebase_service.dart'; abstract class ILoginApiRepo { Future> getDeviceInfoByIMEI(); + + Future> getProjectInfo(String userId); + + Future memberLogin(String userId, String password, int projectId); } class LoginApiRepo implements ILoginApiRepo { @@ -23,7 +28,6 @@ class LoginApiRepo implements ILoginApiRepo { Map postParams = {}; postParams.addAll(appState.postParamsJson); - postParams["stamp"] = DateTime.now().toIso8601String(); postParams["IMEI"] = token; GenericResponseModel response; try { @@ -33,4 +37,38 @@ class LoginApiRepo implements ILoginApiRepo { } return response.listDoctorDeviceDetails ?? []; } + + @override + Future> getProjectInfo(String userId) async { + String url = "${ApiConsts.baseUrlServices}DoctorApplication.svc/REST/GetProjectInfo"; + + Map postParams = {}; + postParams.addAll(appState.postParamsJson); + postParams["MemberID"] = "13777"; + GenericResponseModel response; + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return response.projectInfo ?? []; + } + + @override + Future memberLogin(String userId, String password, int projectId) async { + String url = "${ApiConsts.baseUrlServices}Sentry.svc/REST/MemberLogIN_New"; + + Map postParams = {}; + postParams.addAll(appState.postParamsJson); + postParams["UserID"] = userId; + postParams["Password"] = password; + postParams["ProjectID"] = projectId; + GenericResponseModel response; + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return response; + } } diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 4181ea5..9014d77 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -33,14 +33,13 @@ class AppState { String? get getForgetPasswordTokenID => forgetPasswordTokenID; final PostParamsModel _postParamsInitConfig = PostParamsModel( - imei: "", tokenID: "@dm!n", languageID: 2, stamp: "", iPAdress: "9.9.9.9", versionID: 8.3, channel: 9, - sessionID: "", + sessionID: "BlUSkYymTt", isLoginForDoctorApp: true, patientOutSA: false, vidaAuthTokenID: null, @@ -59,7 +58,10 @@ class AppState { PostParamsModel? get postParamsObject => _postParams; // Map get postParamsJson => isLogged ? (_postParams?.toJsonAfterLogin() ?? {}) : (_postParams?.toJson() ?? {}); - Map get postParamsJson => (_postParams?.toJson() ?? {}); + Map get postParamsJson{ + _postParams!.stamp=DateTime.now().toIso8601String(); + return _postParams?.toJson() ?? {}; + } void setPostParamsModel(PostParamsModel _postParams) { this._postParams = _postParams; diff --git a/lib/model/base/generic_response_model.dart b/lib/model/base/generic_response_model.dart index d498008..d7d14f2 100644 --- a/lib/model/base/generic_response_model.dart +++ b/lib/model/base/generic_response_model.dart @@ -4,7 +4,9 @@ import 'dart:convert'; -import 'package:hmg_nurses/model/login/imei_details.dart'; +import 'package:hmg_nurses/model/login/imei_details_model.dart'; + +import '../login/project_info_model.dart'; GenericResponseModel genericResponseModelFromJson(String str) => GenericResponseModel.fromJson(json.decode(str)); @@ -332,7 +334,7 @@ class GenericResponseModel { final dynamic progressNoteList; final dynamic progressNotesAuditLogList; final int? projectId; - final dynamic projectInfo; + final List? projectInfo; final dynamic referralList; final bool? requestCompleted; final dynamic requisitionResponse; @@ -514,7 +516,7 @@ class GenericResponseModel { progressNoteList: json["ProgressNoteList"], progressNotesAuditLogList: json["ProgressNotesAuditLogList"], projectId: json["ProjectID"] == null ? null : json["ProjectID"], - projectInfo: json["ProjectInfo"], + projectInfo: json["ProjectInfo"] == null ? null : List.from(json["ProjectInfo"].map((x) => ProjectInfoModel.fromJson(x))), referralList: json["ReferralList"], requestCompleted: json["RequestCompleted"] == null ? null : json["RequestCompleted"], requisitionResponse: json["RequisitionResponse"], diff --git a/lib/model/base/post_params_model.dart b/lib/model/base/post_params_model.dart index 839ce4b..e1844bd 100644 --- a/lib/model/base/post_params_model.dart +++ b/lib/model/base/post_params_model.dart @@ -47,7 +47,6 @@ class PostParamsModel { Map toJson() { Map data = new Map(); - data['IMEI'] = this.imei; data['TokenID'] = this.tokenID; data['LanguageID'] = this.languageID; data['stamp'] = this.stamp; diff --git a/lib/model/login/imei_details.dart b/lib/model/login/imei_details_model.dart similarity index 100% rename from lib/model/login/imei_details.dart rename to lib/model/login/imei_details_model.dart diff --git a/lib/model/login/project_info_model.dart b/lib/model/login/project_info_model.dart new file mode 100644 index 0000000..c8168f0 --- /dev/null +++ b/lib/model/login/project_info_model.dart @@ -0,0 +1,23 @@ +class ProjectInfoModel { + ProjectInfoModel({ + this.facilityGroupId, + this.facilityId, + this.facilityName, + }); + + final String? facilityGroupId; + final int? facilityId; + final String? facilityName; + + factory ProjectInfoModel.fromJson(Map json) => ProjectInfoModel( + facilityGroupId: json["facilityGroupId"] == null ? null : json["facilityGroupId"], + facilityId: json["facilityId"] == null ? null : json["facilityId"], + facilityName: json["facilityName"] == null ? null : json["facilityName"], + ); + + Map toJson() => { + "facilityGroupId": facilityGroupId == null ? null : facilityGroupId, + "facilityId": facilityId == null ? null : facilityId, + "facilityName": facilityName == null ? null : facilityName, + }; +} diff --git a/lib/ui/login/splash_page.dart b/lib/ui/login/splash_page.dart index 8f77303..884417d 100644 --- a/lib/ui/login/splash_page.dart +++ b/lib/ui/login/splash_page.dart @@ -22,6 +22,8 @@ class _SplashPageState extends State { getData() async { try { await _loginApiRepo.getDeviceInfoByIMEI(); + await _loginApiRepo.getProjectInfo("userId"); + await _loginApiRepo.memberLogin("13777", "Rr123456", 12); } catch (e) { Utils.handleException(e, context, (msg) { Utils.confirmDialog(context, msg); From a0a162df4cfabe53331a6e13b3494d9afcbc96dd Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Sun, 20 Nov 2022 09:59:01 +0300 Subject: [PATCH 3/9] Merge issue 2.0 --- lib/config/routes.dart | 8 +- lib/dialogs/otp_dialog.dart | 144 ++++++++++++++++-------------------- lib/main.dart | 3 + lib/ui/login/login_vm.dart | 20 ++--- pubspec.lock | 56 ++++++++++++++ 5 files changed, 137 insertions(+), 94 deletions(-) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index b821f1f..117506d 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,16 +1,20 @@ import 'package:flutter/material.dart'; +import 'package:hmg_nurses/ui/login/login_method_page.dart'; +import 'package:hmg_nurses/ui/login/login_page.dart'; import 'package:hmg_nurses/ui/login/splash_page.dart'; class AppRoutes { //Login static const String splash = "/splash"; static const String registerSelection = "/registerSelection"; - static const String loginVerifyAccount = "/loginVerifyAccount"; + static const String loginMethodsPage = "/loginMethodsPage"; static const String login = "/login"; static final Map routes = { //Login splash: (BuildContext context) => SplashPage(), - // login: (BuildContext context) => LoginScreen(), + login: (BuildContext context) => const LoginPage(), + loginMethodsPage: (BuildContext context) => const LoginMethodsPage(), + }; } diff --git a/lib/dialogs/otp_dialog.dart b/lib/dialogs/otp_dialog.dart index c12dce2..da0bc54 100644 --- a/lib/dialogs/otp_dialog.dart +++ b/lib/dialogs/otp_dialog.dart @@ -1,11 +1,12 @@ import 'dart:async'; -import 'package:easy_localization/src/public_ext.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/extensions/string_extensions.dart'; +import 'package:hmg_nurses/generated/locale_keys.g.dart'; import 'package:hmg_nurses/widgets/button/default_button.dart'; import 'package:hmg_nurses/widgets/otp_widget.dart'; @@ -16,18 +17,13 @@ class OtpDialog { final int? mobileNo; final Function(String, TextEditingController _pinPutController) onSuccess; final Function onFailure; - final BuildContext context; final Function onResendCode; int remainingTime = 120; Future? timer; - static BuildContext? _context; - - static bool? _loading; - - OtpDialog(this.context, this.type, this.mobileNo, this.onSuccess, this.onFailure, {required this.onResendCode}); + OtpDialog({required this.type, required this.mobileNo, required this.onSuccess, required this.onFailure, required this.onResendCode}); GlobalKey? verifyAccountForm = GlobalKey(); @@ -52,7 +48,6 @@ class OtpDialog { // ProjectViewModel projectProvider; String displayTime = ''; - String? _code; dynamic setState; bool stopTimer = false; @@ -74,7 +69,7 @@ class OtpDialog { } return Container( - padding: EdgeInsets.all(21), + padding: const EdgeInsets.all(21), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -83,78 +78,73 @@ class OtpDialog { type == 1 ? "assets/images/login/verify_sms.svg" : type == 2 - ? "assets/images/login/verify_whatsapp.svg" - : type == 3 - ? "assets/images/login/verify_face.svg" - : 'assets/images/login/verify_thumb.svg', + ? "assets/images/login/verify_whatsapp.svg" + : type == 3 + ? "assets/images/login/verify_face.svg" + : 'assets/images/login/verify_thumb.svg', height: 50, width: 50, ), 12.height, - "LocaleKeys.otp.tr()".toText14(), - "LocaleKeys.verification.tr()".toText24(isBold: true), + LocaleKeys.otp.tr().toText14(), + LocaleKeys.verification.tr().toText24(isBold: true), 6.height, - ("LocaleKeys.pleaseEnterTheVerificationCodeSentTo.tr()" + ' xxxxxxxx' + mobileNo.toString().substring(mobileNo.toString().length - 3)).toText16(), + ('${LocaleKeys.pleaseEnterTheVerificationCodeSentTo.tr()} xxxxxxxx${mobileNo.toString().substring(mobileNo.toString().length - 3)}').toText16(), 18.height, ValueListenableBuilder( builder: (BuildContext context, String value, Widget? child) { - // This builder will only get called when the _counter - // is updated. return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: OTPWidget( - autoFocus: true, - controller: _pinPutController, - defaultBorderColor: const Color(0xffD8D8D8), - maxLength: 4, - onTextChanged: (text) {}, - pinBoxColor: Colors.white, - onDone: (code) => _onOtpCallBack(code, null), - textBorderColor: const Color(0xffD8D8D8), - pinBoxWidth: 60, - pinBoxHeight: 60, - pinTextStyle: const TextStyle(fontSize: 24.0, color: MyColors.darkTextColor), - pinTextAnimatedSwitcherTransition: ProvidedPinBoxTextAnimation.scalingTransition, - pinTextAnimatedSwitcherDuration: const Duration(milliseconds: 300), - pinBoxRadius: 10, - keyboardType: TextInputType.number, - ), + Center( + child: OTPWidget( + autoFocus: true, + controller: _pinPutController, + defaultBorderColor: const Color(0xffD8D8D8), + maxLength: 4, + onTextChanged: (text) {}, + pinBoxColor: Colors.white, + onDone: (code) => _onOtpCallBack(code, null), + textBorderColor: const Color(0xffD8D8D8), + pinBoxWidth: 60, + pinBoxHeight: 60, + pinTextStyle: const TextStyle(fontSize: 24.0, color: MyColors.darkTextColor), + pinTextAnimatedSwitcherTransition: ProvidedPinBoxTextAnimation.scalingTransition, + pinTextAnimatedSwitcherDuration: const Duration(milliseconds: 300), + pinBoxRadius: 10, + keyboardType: TextInputType.number, ), ), 10.height, stopTimer ? Row( - children: [ - Expanded( - child: "LocaleKeys.codeExpire.tr()".toText16( - color: MyColors.redColor, - ), - ), - 12.width, - Image.asset( - "assets/icons/ic_alarm.png", - width: 20, - height: 20, - color: MyColors.redColor, - ), - ], - ) + children: [ + Expanded( + child: LocaleKeys.codeExpire.tr().toText16( + color: MyColors.redColor, + ), + ), + 12.width, + Image.asset( + "assets/icons/ic_alarm.png", + width: 20, + height: 20, + color: MyColors.redColor, + ), + ], + ) : RichText( - text: TextSpan( - text: "LocaleKeys.theVerificationCodeWillExpireIn.tr()" + '\n', - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48), - children: [ - TextSpan( - text: displayTime, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48), - ), - ], - ), + text: TextSpan( + text: '${LocaleKeys.theVerificationCodeWillExpireIn.tr()}\n', + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48), + children: [ + TextSpan( + text: displayTime, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48), ), + ], + ), + ), ], ); }, @@ -162,8 +152,8 @@ class OtpDialog { ), 18.height, DefaultButton( - stopTimer ? "LocaleKeys.resend.tr()" : "LocaleKeys.cancel.tr()", - () async { + stopTimer ? LocaleKeys.resend.tr() : LocaleKeys.cancel.tr(), + () async { if (stopTimer) { hideSMSBox(context); onResendCode(); @@ -176,9 +166,9 @@ class OtpDialog { colors: stopTimer ? null : [ - MyColors.pinkDarkColor, - MyColors.pinkDarkColor, - ], + MyColors.redColor, + MyColors.redColor, + ], ), ], ), @@ -210,16 +200,6 @@ class OtpDialog { ); } - // String validateCodeDigit(value) { - // if (value.isEmpty) { - // return ' '; - // } else if (value.length == 3) { - // print(value); - // } else { - // return null; - // } - // } - String getSecondsAsDigitalClock(int inputSeconds) { int secNum = int.parse(inputSeconds.toString()); // don't forget the second param int hours = (secNum / 3600).floor(); @@ -227,9 +207,9 @@ class OtpDialog { double seconds = secNum - hours * 3600 - minutes * 60; String minutesString = ""; String secondsString = ""; - minutesString = minutes < 10 ? "0" + minutes.toString() : minutes.toString(); - secondsString = seconds < 10 ? "0" + seconds.toStringAsFixed(0) : seconds.toStringAsFixed(0); - return minutesString + ":" + secondsString; + minutesString = minutes < 10 ? "0$minutes" : minutes.toString(); + secondsString = seconds < 10 ? "0${seconds.toStringAsFixed(0)}" : seconds.toStringAsFixed(0); + return "$minutesString:$secondsString"; } void startTimer(setState) { @@ -269,4 +249,4 @@ class OtpDialog { // // return null; // // } // } -} +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 501bee7..0d97113 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,6 +18,8 @@ import 'generated/codegen_loader.g.dart'; late AppState appState; +GlobalKey navigatorKey = GlobalKey(); + Logger logger = Logger( // filter: null, // Use the default LogFilter (-> only log in debug mode) printer: PrettyPrinter( @@ -82,6 +84,7 @@ class MyApp extends StatelessWidget { ) { List> delegates = context.localizationDelegates; return MaterialApp( + key: navigatorKey, theme: AppTheme.getTheme( EasyLocalization.of(context)?.locale.languageCode == "ar", ), diff --git a/lib/ui/login/login_vm.dart b/lib/ui/login/login_vm.dart index b35b025..cc418a5 100644 --- a/lib/ui/login/login_vm.dart +++ b/lib/ui/login/login_vm.dart @@ -127,15 +127,15 @@ class LoginViewModel extends BaseViewModel { startSMSService(AuthMethodTypes type, {isSilentLogin = false, required BuildContext context}) { OtpDialog( - type: 1, - mobileNo: 0504278212, - onSuccess: (String otpCode, TextEditingController pinPut) { - Utils.showLoading(); - //TODO: API CALL - // performDirectApiCall(_title, _icon, _flag, value); - }, - onFailure: () => Navigator.pop(context), - onResendCode: () {}) - .displayDialog(context); + type: 1, + mobileNo: 0504278212, + onSuccess: (String otpCode, TextEditingController pinPut) { + Utils.showLoading(); + //TODO: API CALL + // performDirectApiCall(_title, _icon, _flag, value); + }, + onFailure: () => Navigator.pop(context), + onResendCode: () {}, + ).displayDialog(context); } } diff --git a/pubspec.lock b/pubspec.lock index 0f2db6f..1e09fe7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -179,6 +179,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" flutter_svg: dependency: "direct main" description: @@ -203,6 +210,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.1.1" + get_it: + dependency: "direct main" + description: + name: get_it + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.0" + hexcolor: + dependency: "direct main" + description: + name: hexcolor + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" http: dependency: "direct main" description: @@ -245,6 +266,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + local_auth: + dependency: "direct main" + description: + name: local_auth + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.15" + local_auth_ios: + dependency: transitive + description: + name: local_auth_ios + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.10" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" logger: dependency: "direct main" description: From 5b155690b10663a3bfa79a6572381ac869db27da Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Sun, 20 Nov 2022 10:12:22 +0300 Subject: [PATCH 4/9] Merge issue fixed --- lib/classes/utils.dart | 2 +- lib/{app_state => config}/app_state.dart | 0 lib/config/dependencies.dart | 5 +++-- lib/config/routes.dart | 3 +++ lib/dependency_injection.dart | 18 ------------------ lib/main.dart | 4 ++-- .../get_mobile_login_info_list_model.dart | 0 lib/{base => provider}/base_vm.dart | 0 lib/services/api_client.dart | 2 +- .../api_repo/login_api_client.dart | 2 +- .../api_repo/login_api_repo.dart | 3 ++- lib/ui/login/login_page.dart | 6 +++++- lib/ui/login/login_vm.dart | 5 +++-- lib/ui/login/splash_page.dart | 2 +- lib/{ => widgets}/dialogs/otp_dialog.dart | 0 pubspec.lock | 7 ------- pubspec.yaml | 2 +- 17 files changed, 23 insertions(+), 38 deletions(-) rename lib/{app_state => config}/app_state.dart (100%) delete mode 100644 lib/dependency_injection.dart rename lib/{models => model}/get_mobile_login_info_list_model.dart (100%) rename lib/{base => provider}/base_vm.dart (100%) rename lib/{ => services}/api_repo/login_api_client.dart (94%) rename lib/{ => services}/api_repo/login_api_repo.dart (97%) rename lib/{ => widgets}/dialogs/otp_dialog.dart (100%) diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 43204fa..fc59c0c 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -7,7 +7,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; -import 'package:hmg_nurses/app_state/app_state.dart'; +import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/exceptions/api_exception.dart'; diff --git a/lib/app_state/app_state.dart b/lib/config/app_state.dart similarity index 100% rename from lib/app_state/app_state.dart rename to lib/config/app_state.dart diff --git a/lib/config/dependencies.dart b/lib/config/dependencies.dart index 6e2f047..1d0b653 100644 --- a/lib/config/dependencies.dart +++ b/lib/config/dependencies.dart @@ -1,8 +1,9 @@ // import 'package:firebase_crashlytics/firebase_crashlytics.dart'; // import 'package:flutter/material.dart'; -import 'package:hmg_nurses/app_state/app_state.dart'; +import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/services/api_client.dart'; -import 'package:hmg_nurses/api_repo/login_api_repo.dart'; +import 'package:hmg_nurses/services/api_repo/login_api_repo.dart'; + import 'package:hmg_nurses/services/firebase_service.dart'; import 'package:injector/injector.dart'; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 117506d..d8a9abc 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -4,6 +4,9 @@ import 'package:hmg_nurses/ui/login/login_page.dart'; import 'package:hmg_nurses/ui/login/splash_page.dart'; class AppRoutes { + + static const String initialPage =login; + //Login static const String splash = "/splash"; static const String registerSelection = "/registerSelection"; diff --git a/lib/dependency_injection.dart b/lib/dependency_injection.dart deleted file mode 100644 index 40bda74..0000000 --- a/lib/dependency_injection.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:get_it/get_it.dart'; -import 'package:hmg_nurses/ui/login/login_vm.dart'; - -GetIt getIt = GetIt.instance; - - -void initDependencies () { - // TODO; WE WILL REGISTER ALL THE SERVICES HERE AS LAZY SINGLETON - - - - //TODO: WE WILL REGISTER ALL THE VIEW MODELS AS FACTORY HERE - - /// View Model - getIt.registerFactory(() => LoginViewModel()); - - -} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 0d97113..4a4dab3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; -import 'package:hmg_nurses/app_state/app_state.dart'; +import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/config/dependencies.dart'; import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; @@ -92,7 +92,7 @@ class MyApp extends StatelessWidget { localizationsDelegates: delegates, supportedLocales: context.supportedLocales, locale: context.locale, - initialRoute: AppRoutes.splash, + initialRoute: AppRoutes.initialPage, routes: AppRoutes.routes, ); }, diff --git a/lib/models/get_mobile_login_info_list_model.dart b/lib/model/get_mobile_login_info_list_model.dart similarity index 100% rename from lib/models/get_mobile_login_info_list_model.dart rename to lib/model/get_mobile_login_info_list_model.dart diff --git a/lib/base/base_vm.dart b/lib/provider/base_vm.dart similarity index 100% rename from lib/base/base_vm.dart rename to lib/provider/base_vm.dart diff --git a/lib/services/api_client.dart b/lib/services/api_client.dart index c00d0aa..70e4a0e 100644 --- a/lib/services/api_client.dart +++ b/lib/services/api_client.dart @@ -5,7 +5,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart'; import 'package:http/io_client.dart'; -import 'package:hmg_nurses/app_state/app_state.dart'; +import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/exceptions/api_exception.dart'; import 'package:hmg_nurses/main.dart'; // ignore_for_file: avoid_annotating_with_dynamic diff --git a/lib/api_repo/login_api_client.dart b/lib/services/api_repo/login_api_client.dart similarity index 94% rename from lib/api_repo/login_api_client.dart rename to lib/services/api_repo/login_api_client.dart index bb7f0ff..e0d6ae0 100644 --- a/lib/api_repo/login_api_client.dart +++ b/lib/services/api_repo/login_api_client.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:hmg_nurses/services/api_client.dart'; -import 'package:hmg_nurses/app_state/app_state.dart'; +import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/classes/consts.dart'; diff --git a/lib/api_repo/login_api_repo.dart b/lib/services/api_repo/login_api_repo.dart similarity index 97% rename from lib/api_repo/login_api_repo.dart rename to lib/services/api_repo/login_api_repo.dart index d2edc10..88b6d9a 100644 --- a/lib/api_repo/login_api_repo.dart +++ b/lib/services/api_repo/login_api_repo.dart @@ -5,9 +5,10 @@ import 'package:hmg_nurses/services/api_client.dart'; import 'package:hmg_nurses/classes/consts.dart'; import 'package:hmg_nurses/model/base/generic_response_model.dart'; import 'package:hmg_nurses/model/login/imei_details_model.dart'; +import 'package:hmg_nurses/services/firebase_service.dart'; import 'package:injector/injector.dart'; -import '../services/firebase_service.dart'; + abstract class ILoginApiRepo { Future> getDeviceInfoByIMEI(); diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index 007201a..9c7215d 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -58,7 +58,11 @@ class _LoginPageState extends State { padding: EdgeInsets.symmetric(horizontal: 8.w), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ buildSpacer20h(), - CustomTextField(LocaleKeys.userID.tr(), userIdController, isEnableBorder: true, ), + CustomTextField( + LocaleKeys.userID.tr(), + userIdController, + isEnableBorder: true, + ), buildSpacer20h(), CustomTextField(LocaleKeys.password.tr(), passwordController, isTextIsPassword: true), buildSpacer20h(), diff --git a/lib/ui/login/login_vm.dart b/lib/ui/login/login_vm.dart index cc418a5..27b1e7e 100644 --- a/lib/ui/login/login_vm.dart +++ b/lib/ui/login/login_vm.dart @@ -3,11 +3,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:hmg_nurses/base/base_vm.dart'; +import 'package:hmg_nurses/provider/base_vm.dart'; import 'package:hmg_nurses/classes/enums.dart'; import 'package:hmg_nurses/classes/utils.dart'; -import 'package:hmg_nurses/dialogs/otp_dialog.dart'; + import 'package:hmg_nurses/generated/locale_keys.g.dart'; +import 'package:hmg_nurses/widgets/dialogs/otp_dialog.dart'; import 'package:local_auth/local_auth.dart'; class LoginViewModel extends BaseViewModel { diff --git a/lib/ui/login/splash_page.dart b/lib/ui/login/splash_page.dart index 884417d..a877c60 100644 --- a/lib/ui/login/splash_page.dart +++ b/lib/ui/login/splash_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:hmg_nurses/api_repo/login_api_repo.dart'; +import 'package:hmg_nurses/services/api_repo/login_api_repo.dart'; import 'package:hmg_nurses/services/firebase_service.dart'; import 'package:injector/injector.dart'; diff --git a/lib/dialogs/otp_dialog.dart b/lib/widgets/dialogs/otp_dialog.dart similarity index 100% rename from lib/dialogs/otp_dialog.dart rename to lib/widgets/dialogs/otp_dialog.dart diff --git a/pubspec.lock b/pubspec.lock index 1e09fe7..0d40ef3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -210,13 +210,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.1.1" - get_it: - dependency: "direct main" - description: - name: get_it - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" hexcolor: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 4ce772b..7a5bf24 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -50,7 +50,7 @@ dependencies: shimmer: ^2.0.0 sizer: ^2.0.15 local_auth: ^2.1.2 - get_it: ^7.2.0 +# get_it: ^7.2.0 hexcolor: ^2.0.4 From 0ba98d1d32eaf7242345fabf01fde57a34c21dbf Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Sun, 20 Nov 2022 14:43:49 +0300 Subject: [PATCH 5/9] API's implementation 1.0 --- assets/images/loading_mohemm_logo.gif | Bin 0 -> 97273 bytes lib/classes/consts.dart | 4 +- lib/classes/enums.dart | 26 +++++++- lib/config/app_state.dart | 2 +- lib/main.dart | 4 ++ lib/provider/base_vm.dart | 4 +- lib/provider/login_provider_model.dart | 22 +++++++ lib/ui/login/login_page.dart | 81 ++++++++++++++++++++++--- lib/widgets/cupertino_picker.dart | 81 +++++++++++++------------ lib/widgets/loading_dialog.dart | 2 +- 10 files changed, 170 insertions(+), 56 deletions(-) create mode 100644 assets/images/loading_mohemm_logo.gif create mode 100644 lib/provider/login_provider_model.dart diff --git a/assets/images/loading_mohemm_logo.gif b/assets/images/loading_mohemm_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffefdb00a07c0c906a5e135a3ca82b631d1f2f5f GIT binary patch literal 97273 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]i;9t#<8;Rg6K9PhQ# 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

D+*e(F$VD`)4@PH9li6;PfX6cLGk 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 literal 0 HcmV?d00001 diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index c9db991..30f160e 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -4,8 +4,8 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - //static String baseUrl = 'https://hmgwebservices.com/'; - static String baseUrl = 'https://uat.hmgwebservices.com/'; + static String baseUrl = 'https://hmgwebservices.com/'; + // static String baseUrl = 'https://uat.hmgwebservices.com/'; static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; diff --git a/lib/classes/enums.dart b/lib/classes/enums.dart index c1026c2..6dbb839 100644 --- a/lib/classes/enums.dart +++ b/lib/classes/enums.dart @@ -1,3 +1,23 @@ -enum APPSTATUS { loading, unAuthenticated, authenticated, unverified } -enum AuthMethodTypes { sms, whatsApp, fingerPrint, faceID, moreOptions } -enum ViewState { idle, busy, error, busyLocal, errorLocal } +enum APPSTATUS { + loading, + unAuthenticated, + authenticated, + unverified, +} + +enum AuthMethodTypes { + sms, + whatsApp, + fingerPrint, + faceID, + moreOptions, +} + +enum ViewState { + hide, + idle, + busy, + error, + busyLocal, + errorLocal, +} diff --git a/lib/config/app_state.dart b/lib/config/app_state.dart index 9014d77..219254e 100644 --- a/lib/config/app_state.dart +++ b/lib/config/app_state.dart @@ -37,7 +37,7 @@ class AppState { languageID: 2, stamp: "", iPAdress: "9.9.9.9", - versionID: 8.3, + versionID: 9, channel: 9, sessionID: "BlUSkYymTt", isLoginForDoctorApp: true, diff --git a/lib/main.dart b/lib/main.dart index 4a4dab3..698ab60 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,7 @@ import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/config/dependencies.dart'; import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; +import 'package:hmg_nurses/provider/login_provider_model.dart'; import 'package:hmg_nurses/theme/app_theme.dart'; import 'package:injector/injector.dart'; import 'package:logger/logger.dart'; @@ -53,6 +54,9 @@ Future main() async { providers: [ ChangeNotifierProvider( create: (_) => DashboardProviderModel(), + ), + ChangeNotifierProvider( + create: (_) => LoginProviderModel(), ) ], child: MyApp(), diff --git a/lib/provider/base_vm.dart b/lib/provider/base_vm.dart index bb5383b..c8f0d4d 100644 --- a/lib/provider/base_vm.dart +++ b/lib/provider/base_vm.dart @@ -12,10 +12,12 @@ class BaseViewModel extends ChangeNotifier { String error = ""; //TODO add the user login model when we need it + void setOnlyState(ViewState viewState) { + _state = viewState; + } void setState(ViewState viewState) { _state = viewState; - notifyListeners(); } diff --git a/lib/provider/login_provider_model.dart b/lib/provider/login_provider_model.dart new file mode 100644 index 0000000..ec9fb99 --- /dev/null +++ b/lib/provider/login_provider_model.dart @@ -0,0 +1,22 @@ +import 'package:hmg_nurses/classes/enums.dart'; +import 'package:hmg_nurses/model/login/project_info_model.dart'; +import 'package:hmg_nurses/provider/base_vm.dart'; +import 'package:hmg_nurses/services/api_repo/login_api_repo.dart'; +import 'package:injector/injector.dart'; + +class LoginProviderModel extends BaseViewModel { + LoginProviderModel() { + setOnlyState(ViewState.hide); + } + + final ILoginApiRepo _loginApiRepo = Injector.appInstance.get(); + + late List assignedBranches; + + getAssignedBranches(String userId) async { + setState(ViewState.busy); + assignedBranches = await _loginApiRepo.getProjectInfo(userId); + print(assignedBranches.length); + setState(ViewState.idle); + } +} diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index 9c7215d..5803499 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -1,13 +1,23 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_nurses/classes/colors.dart'; +import 'package:hmg_nurses/classes/enums.dart'; +import 'package:hmg_nurses/classes/utils.dart'; import 'package:hmg_nurses/config/routes.dart'; +import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/generated/locale_keys.g.dart'; +import 'package:hmg_nurses/model/login/imei_details_model.dart'; +import 'package:hmg_nurses/model/login/project_info_model.dart'; +import 'package:hmg_nurses/provider/login_provider_model.dart'; import 'package:hmg_nurses/widgets/button/default_button.dart'; import 'package:hmg_nurses/widgets/cupertino_picker.dart'; import 'package:hmg_nurses/widgets/input_widget.dart'; +import 'package:injector/injector.dart'; +import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; +import '../../services/api_repo/login_api_repo.dart'; + class LoginPage extends StatefulWidget { const LoginPage({Key? key}) : super(key: key); @@ -16,6 +26,10 @@ class LoginPage extends StatefulWidget { } class _LoginPageState extends State { + final ILoginApiRepo _loginApiRepo = Injector.appInstance.get(); + + int branchID=0; + final loginFormKey = GlobalKey(); var projectIdController = TextEditingController(); var userIdController = TextEditingController(); @@ -23,8 +37,24 @@ class _LoginPageState extends State { SizedBox buildSpacer20h() => SizedBox(height: 3.h); + @override + void initState() { + super.initState(); + checkLastSession(); + } + + checkLastSession() async { + try { + Utils.showLoading(); + List deviceInfo = await _loginApiRepo.getDeviceInfoByIMEI(); + Utils.showToast(deviceInfo.length.toString()); + Utils.showLoading(); + } catch (e) {} + } + @override Widget build(BuildContext context) { + final provider = Provider.of(context); return Scaffold( body: SingleChildScrollView( child: Column( @@ -64,19 +94,48 @@ class _LoginPageState extends State { isEnableBorder: true, ), buildSpacer20h(), - CustomTextField(LocaleKeys.password.tr(), passwordController, isTextIsPassword: true), - buildSpacer20h(), CustomTextField( - LocaleKeys.branch.tr(), - projectIdController, - hasSelection: true, - isEnable: false, - onClick: () => CustomCupertinoPicker.showCupertinoPicker(context, [], () {}), + LocaleKeys.password.tr(), + passwordController, + isTextIsPassword: true, + onChange: (v) { + if (v.length > 0) { + provider.getAssignedBranches(userIdController.text); + } + }, + ), + buildSpacer20h(), + Consumer( + builder: (_, data, w) { + return data.state == ViewState.hide + ? Container() + : data.state == ViewState.busy + ? const Center(child: CircularProgressIndicator()) + : CustomTextField( + LocaleKeys.branch.tr(), + projectIdController, + hasSelection: true, + isEnable: false, + onClick: () => CustomCupertinoPicker.showCupertinoPicker( + context, + provider.assignedBranches, + (index) { + projectIdController.text=provider.assignedBranches[index].facilityName!; + branchID=provider.assignedBranches[index].facilityId as int; + print(branchID); + provider.notifyListeners(); + }, + ), + ); + }, + ), + buildSpacer20h(), + SizedBox( + height: 12.h, ), - buildSpacer20h() ]), ), - ) + ), ], ), ), @@ -96,7 +155,9 @@ class _LoginPageState extends State { Navigator.pushNamed(context, AppRoutes.loginMethodsPage); }, colors: const [MyColors.redColor, MyColors.redColor]), ), - SizedBox(height: 3.h) + SizedBox( + height: 3.h, + ) ], ), ), diff --git a/lib/widgets/cupertino_picker.dart b/lib/widgets/cupertino_picker.dart index c45ef8b..ad0a16f 100644 --- a/lib/widgets/cupertino_picker.dart +++ b/lib/widgets/cupertino_picker.dart @@ -5,7 +5,7 @@ import 'package:hmg_nurses/generated/locale_keys.g.dart'; import 'package:sizer/sizer.dart'; class CustomCupertinoPicker { - static TextStyle textStyle(context) => TextStyle(color: Theme.of(context).primaryColor); + static TextStyle textStyle(context) => TextStyle(color: Colors.black); static int cupertinoPickerIndex = 0; @@ -21,7 +21,7 @@ class CustomCupertinoPicker { children: items.map((item) { return Text( '${item.facilityName}', - style: TextStyle(fontSize: 12.sp), + style: TextStyle(fontSize: 12.sp, color: Colors.black), ); }).toList(), ); @@ -29,43 +29,48 @@ class CustomCupertinoPicker { static showCupertinoPicker(context, List items, onSelectFun) { showModalBottomSheet( - isDismissible: false, - context: context, - builder: (BuildContext builder) { - return Container( - height: 40.h, - color: const Color(0xfff7f7f7), - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Container( - color: const Color(0xfff7f7f7), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - CupertinoButton( - child: Text(LocaleKeys.userID.tr(), style: textStyle(context)), - onPressed: () { - Navigator.pop(context); - }, + isDismissible: false, + context: context, + builder: (BuildContext builder) { + return Container( + height: 40.h, + color: const Color(0xfff7f7f7), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + color: const Color(0xfff7f7f7), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + CupertinoButton( + child: Text(LocaleKeys.userID.tr(), style: textStyle(context)), + onPressed: () { + Navigator.pop(context); + }, + ), + CupertinoButton( + child: Text( + LocaleKeys.userID.tr(), + style: textStyle(context), ), - CupertinoButton( - child: Text( - LocaleKeys.userID.tr(), - style: textStyle(context), - ), - onPressed: () { - Navigator.pop(context); - onSelectFun(cupertinoPickerIndex); - }, - ) - ], - ), + onPressed: () { + Navigator.pop(context); + onSelectFun(cupertinoPickerIndex); + }, + ) + ], ), - Container(height: 3.h, color: const Color(0xfff7f7f7), child: buildPickerItems(context, items, onSelectFun)) - ], - ), - ); - }); + ), + Container( + height: 30.h, + color: const Color(0xfff7f7f7), + child: buildPickerItems(context, items, onSelectFun), + ) + ], + ), + ); + }, + ); } } diff --git a/lib/widgets/loading_dialog.dart b/lib/widgets/loading_dialog.dart index 9c88a39..540c094 100644 --- a/lib/widgets/loading_dialog.dart +++ b/lib/widgets/loading_dialog.dart @@ -36,7 +36,7 @@ class _LoadingDialogState extends State { textDirection: TextDirection.rtl, child: Center( child: Image.asset( - "assets/images/logos/loading_mohemm_logo.gif", + "assets/images/loading_mohemm_logo.gif", height: 96.0, width: 96.0, ), From 2b9afe5b588dacb68139ebb80d3f8c4bb4cec733 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Thu, 24 Nov 2022 15:47:33 +0300 Subject: [PATCH 6/9] 1st login flow completed --- android/app/src/main/AndroidManifest.xml | 3 + .../com/example/untitled1/MainActivity.kt | 15 +- assets/langs/ar-SA.json | 3 +- assets/langs/en-US.json | 3 +- lib/classes/enums.dart | 19 +- lib/classes/utils.dart | 15 +- lib/config/app_state.dart | 27 +- lib/config/routes.dart | 2 +- lib/generated/codegen_loader.g.dart | 6 +- lib/main.dart | 52 +- lib/model/base/generic_response_model.dart | 14 +- lib/model/base/generic_response_model2.dart | 911 ++++++++++++++++++ lib/model/base/post_params_model.dart | 4 + lib/model/login/doctor_profile_model.dart | 195 ++++ .../login/list_doctors_clinic_model.dart | 35 + lib/model/login/member_information_model.dart | 92 ++ lib/model/login/member_login_model.dart | 245 +++++ lib/provider/login_provider_model.dart | 164 +++- lib/services/api_repo/login_api_repo.dart | 99 +- lib/ui/login/login_method_page.dart | 206 ++-- lib/ui/login/login_page.dart | 204 ++-- lib/ui/login/login_vm.dart | 42 +- .../widgets/verification_method_card.dart | 110 ++- lib/widgets/cupertino_picker.dart | 4 +- lib/widgets/dialogs/otp_dialog.dart | 73 +- lib/widgets/input_widget.dart | 42 +- pubspec.lock | 30 +- pubspec.yaml | 3 +- 28 files changed, 2230 insertions(+), 388 deletions(-) create mode 100644 lib/model/base/generic_response_model2.dart create mode 100644 lib/model/login/doctor_profile_model.dart create mode 100644 lib/model/login/list_doctors_clinic_model.dart create mode 100644 lib/model/login/member_information_model.dart create mode 100644 lib/model/login/member_login_model.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 41cb775..3309a2e 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,8 @@ + + + LoadingDialog(), ).then((value) { @@ -69,12 +69,17 @@ class Utils { }); } - static void hideLoading(BuildContext context) { - if (_isLoadingVisible) { + static void hideLoading() { + try{ + if (_isLoadingVisible) { + _isLoadingVisible = false; + Navigator.of(navigatorKey.currentContext!).pop(); + } _isLoadingVisible = false; - Navigator.of(context).pop(); + }catch(e){ + print("exp_while_hide_dialog: "+e.toString()); } - _isLoadingVisible = false; + } static Future getStringFromPrefs(String key) async { diff --git a/lib/config/app_state.dart b/lib/config/app_state.dart index 219254e..138c5e9 100644 --- a/lib/config/app_state.dart +++ b/lib/config/app_state.dart @@ -2,6 +2,8 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:hmg_nurses/model/base/post_params_model.dart'; +import 'package:hmg_nurses/model/login/list_doctors_clinic_model.dart'; +import 'package:hmg_nurses/model/login/member_login_model.dart'; class AppState { // static final AppState _instance = AppState._internal(); @@ -10,6 +12,15 @@ class AppState { // // factory AppState() => _instance; + //Tokens + String? imei, logInTokenID, vidaAuthTokenID, vidaRefreshTokenID, authenticationTokenID; + + int projectID = 0; + int clinicId = 0; + + List? listDoctorsClinic; + String? password; + bool isAuthenticated = false; set setIsAuthenticated(v) => isAuthenticated = v; @@ -32,7 +43,7 @@ class AppState { String? get getForgetPasswordTokenID => forgetPasswordTokenID; - final PostParamsModel _postParamsInitConfig = PostParamsModel( + PostParamsModel _postParamsInitConfig = PostParamsModel( tokenID: "@dm!n", languageID: 2, stamp: "", @@ -45,6 +56,7 @@ class AppState { vidaAuthTokenID: null, vidaRefreshTokenID: null, deviceTypeID: 1, + generalID: 'Cs2020@2016\$2958', ); void setPostParamsInitConfig() { @@ -58,8 +70,11 @@ class AppState { PostParamsModel? get postParamsObject => _postParams; // Map get postParamsJson => isLogged ? (_postParams?.toJsonAfterLogin() ?? {}) : (_postParams?.toJson() ?? {}); - Map get postParamsJson{ - _postParams!.stamp=DateTime.now().toIso8601String(); + Map get postParamsJson { + _postParams!.stamp = DateTime.now().toIso8601String(); + _postParams?.vidaAuthTokenID = vidaAuthTokenID; + _postParams?.vidaRefreshTokenID = vidaRefreshTokenID; + _postParams?.imei = imei; return _postParams?.toJson() ?? {}; } @@ -76,4 +91,10 @@ class AppState { set setUserName(v) => _username = v; String? get getUserName => _username; + + MemberLoginModel? _memberBeforeLogin; + + MemberLoginModel? get memberBeforeLogin => _memberBeforeLogin; + + set setMemberBeforeLogin(MemberLoginModel? _memberBeforeLogin) => this._memberBeforeLogin = _memberBeforeLogin; } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index d8a9abc..b820e3a 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -16,7 +16,7 @@ class AppRoutes { static final Map routes = { //Login splash: (BuildContext context) => SplashPage(), - login: (BuildContext context) => const LoginPage(), + login: (BuildContext context) => LoginPage(), loginMethodsPage: (BuildContext context) => const LoginMethodsPage(), }; diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 7d7ca5b..372810d 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -63,7 +63,8 @@ class CodegenLoader extends AssetLoader{ "verification": "تَحَقّق", "resend": "إعادة إرسال", "codeExpire": "انتهت صلاحية رمز التحقق", - "moreVerificationOpts": "المزيد من خيارات التحقق" + "moreVerificationOpts": "المزيد من خيارات التحقق", + "select": "Select" }; static const Map en_US = { "mohemm": "Mohemm", @@ -114,7 +115,8 @@ static const Map en_US = { "verification": "Verification", "resend": "Resend", "codeExpire": "The verification code has been expired", - "moreVerificationOpts": "More verification options" + "moreVerificationOpts": "More verification options", + "select": "Select" }; static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; } diff --git a/lib/main.dart b/lib/main.dart index 698ab60..77bbf8a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,12 +3,14 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_nurses/classes/size_config.dart'; import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/config/dependencies.dart'; import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; import 'package:hmg_nurses/provider/login_provider_model.dart'; import 'package:hmg_nurses/theme/app_theme.dart'; +import 'package:hmg_nurses/ui/login/login_vm.dart'; import 'package:injector/injector.dart'; import 'package:logger/logger.dart'; import 'package:provider/provider.dart'; @@ -19,7 +21,8 @@ import 'generated/codegen_loader.g.dart'; late AppState appState; -GlobalKey navigatorKey = GlobalKey(); +// GlobalKey navigatorKey = GlobalKey(); +final navigatorKey = GlobalKey(); Logger logger = Logger( // filter: null, // Use the default LogFilter (-> only log in debug mode) @@ -57,6 +60,9 @@ Future main() async { ), ChangeNotifierProvider( create: (_) => LoginProviderModel(), + ), + ChangeNotifierProvider( + create: (_) => LoginViewModel(), ) ], child: MyApp(), @@ -80,26 +86,32 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return Sizer( - builder: ( - BuildContext context, - Orientation orientation, - DeviceType deviceType, - ) { - List> delegates = context.localizationDelegates; - return MaterialApp( - key: navigatorKey, - theme: AppTheme.getTheme( - EasyLocalization.of(context)?.locale.languageCode == "ar", - ), - debugShowCheckedModeBanner: false, - localizationsDelegates: delegates, - supportedLocales: context.supportedLocales, - locale: context.locale, - initialRoute: AppRoutes.initialPage, - routes: AppRoutes.routes, + return LayoutBuilder( + builder: (context, constraints) { + return Sizer( + builder: ( + BuildContext context, + Orientation orientation, + DeviceType deviceType, + ) { + SizeConfig().init(constraints, orientation); + List> delegates = context.localizationDelegates; + return MaterialApp( + // key: navigatorKey, + navigatorKey: navigatorKey, + theme: AppTheme.getTheme( + EasyLocalization.of(context)?.locale.languageCode == "ar", + ), + debugShowCheckedModeBanner: false, + localizationsDelegates: delegates, + supportedLocales: context.supportedLocales, + locale: context.locale, + initialRoute: AppRoutes.initialPage, + routes: AppRoutes.routes, + ); + }, ); - }, + } ); } } diff --git a/lib/model/base/generic_response_model.dart b/lib/model/base/generic_response_model.dart index d7d14f2..bda03b2 100644 --- a/lib/model/base/generic_response_model.dart +++ b/lib/model/base/generic_response_model.dart @@ -5,6 +5,8 @@ import 'dart:convert'; import 'package:hmg_nurses/model/login/imei_details_model.dart'; +import 'package:hmg_nurses/model/login/list_doctors_clinic_model.dart'; +import 'package:hmg_nurses/model/login/member_information_model.dart'; import '../login/project_info_model.dart'; @@ -275,7 +277,7 @@ class GenericResponseModel { final List? listDoctorDeviceDetails; final dynamic listDoctorProfile; final dynamic listDoctorProgressNote; - final dynamic listDoctorsClinic; + final List? listDoctorsClinic; final dynamic listDoctorsAll; final dynamic listDrugToDrugTherapy; final dynamic listGetLabNormal; @@ -369,7 +371,7 @@ class GenericResponseModel { final dynamic listKeywords; final dynamic listProcedureCategories; final dynamic listProcedureResult; - final dynamic memberInformation; + final MemberInformation? memberInformation; final dynamic patientArrivalList; final dynamic requisitionList; final dynamic requisitionScheduleList; @@ -457,7 +459,7 @@ class GenericResponseModel { listDoctorDeviceDetails: json["List_DoctorDeviceDetails"] == null ? null : List.from(json["List_DoctorDeviceDetails"].map((x) => x)), listDoctorProfile: json["List_DoctorProfile"], listDoctorProgressNote: json["List_DoctorProgressNote"], - listDoctorsClinic: json["List_DoctorsClinic"], + listDoctorsClinic: json["List_DoctorsClinic"] == null ? null : List.from(json["List_DoctorsClinic"].map((x) => ListDoctorsClinicModel.fromJson(x))), listDoctorsAll: json["List_Doctors_All"], listDrugToDrugTherapy: json["List_DrugToDrugTherapy"], listGetLabNormal: json["List_GetLabNormal"], @@ -551,7 +553,7 @@ class GenericResponseModel { listKeywords: json["listKeywords"], listProcedureCategories: json["listProcedureCategories"], listProcedureResult: json["listProcedureResult"], - memberInformation: json["memberInformation"], + memberInformation: json["memberInformation"] == null ? null : MemberInformation.fromJson(json["memberInformation"]), patientArrivalList: json["patientArrivalList"], requisitionList: json["requisitionList"], requisitionScheduleList: json["requisitionScheduleList"], @@ -640,7 +642,7 @@ class GenericResponseModel { "List_DoctorDeviceDetails": listDoctorDeviceDetails == null ? null : List.from(listDoctorDeviceDetails!.map((x) => x)), "List_DoctorProfile": listDoctorProfile, "List_DoctorProgressNote": listDoctorProgressNote, - "List_DoctorsClinic": listDoctorsClinic, + "List_DoctorsClinic": listDoctorsClinic == null ? null : List.from(listDoctorsClinic!.map((x) => x.toJson())), "List_Doctors_All": listDoctorsAll, "List_DrugToDrugTherapy": listDrugToDrugTherapy, "List_GetLabNormal": listGetLabNormal, @@ -734,7 +736,7 @@ class GenericResponseModel { "listKeywords": listKeywords, "listProcedureCategories": listProcedureCategories, "listProcedureResult": listProcedureResult, - "memberInformation": memberInformation, + "memberInformation": memberInformation == null ? null : memberInformation!.toJson(), "patientArrivalList": patientArrivalList, "requisitionList": requisitionList, "requisitionScheduleList": requisitionScheduleList, diff --git a/lib/model/base/generic_response_model2.dart b/lib/model/base/generic_response_model2.dart new file mode 100644 index 0000000..40e7d46 --- /dev/null +++ b/lib/model/base/generic_response_model2.dart @@ -0,0 +1,911 @@ +// To parse this JSON data, do +// +// final genericResponseModel2 = genericResponseModel2FromJson(jsonString); + +import 'dart:convert'; + +import 'package:hmg_nurses/model/login/doctor_profile_model.dart'; + +GenericResponseModel2 genericResponseModel2FromJson(String str) => GenericResponseModel2.fromJson(json.decode(str)); + +String genericResponseModel2ToJson(GenericResponseModel2 data) => json.encode(data.toJson()); + +class GenericResponseModel2 { + GenericResponseModel2({ + this.date, + this.languageId, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenId, + this.data, + this.dataw, + this.dietType, + this.dietTypeId, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iosLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.vidaUpdatedResponse, + this.ageError, + this.allowedBooking, + this.ancillaryOrderInvoiceList, + this.ancillaryOrderList, + this.ancillaryOrderListCount, + this.ancillaryOrderProcList, + this.appoimentAllHistoryResultList, + this.appoimentAllResultList, + this.appointmentActiveNumber, + this.appointmentNo, + this.appointmentQr, + this.avgDoctorRatingList, + this.covid19AppointmentResponse, + this.covid19FreeTimeSlots, + this.covid19InvoiceResponse, + this.covid19PatientShare, + this.covid19TestProceduresList, + this.clinicCategoryList, + this.clinicInsertedId, + this.clinicsHaveScheduleList, + this.continueBookAppointment, + this.dappTemplateGetList, + this.decimalDoctorRate, + this.dentalProcedure, + this.dentalProcedureName, + this.diseasesByClinicList, + this.doctorBasicScheduleList, + this.doctorByClinicIdList, + this.doctorByDiseaseList, + this.doctorCalenderList, + this.doctorInformationAsHtml, + this.doctorInformationRaw, + this.doctorList, + this.doctorPrePostImagesList, + this.doctorProfileList, + this.doctorRate, + this.doctorRatingDetailsList, + this.doctorScheduleMappingInsert, + this.doctorSchedulesByClinicList, + this.doctorscheduleslotInsert, + this.doctorscheduleslotSelectList, + this.erAppointmentFeesObject, + this.erAdvancePaymentResponse, + this.erOnlinePaymentDetailsResponse, + this.erPatientShare, + this.erTriageQuestionsList, + this.errCode, + this.errorSearchMsg, + this.formId, + this.freeTimeSlots, + this.genderError, + this.getDoctorMobileNo, + this.getPatientInfoByPatientIdList, + this.getPatientMedicalStatus, + this.hisGetAllAppoimentHistoryList, + this.hisGetDoctorOffDaysList, + this.hisObgyneUltrasoundDoctorsList, + this.hisProcedureTemplateDetailsList, + this.hisProcedureTemplateList, + this.hisWaitingCheckDoctorAvailableForWaitingAppointmentList, + this.hisObGyneProcedureGetResponse, + this.hisPrmGetApprovalRemarkList, + this.hoursDiff, + this.isDentalplan, + this.isMobileAppDentalAllow, + this.initialSlotDuration, + this.isAllowToBookWaitingAppointment, + this.isAllowVClinic, + this.isAllowWaitList, + this.isAppointmentAllowed, + this.isClinicEnabledForIcdCodes, + this.isDoctorExist, + this.isInsertOrUpdate, + this.isLastAppoitmentRatedList, + this.isShowInsuranceUpdateModule, + this.isSlotAvailable, + this.lcGetClinicScheduleList, + this.listHoursDiff, + this.listReqTypes, + this.listAllClinicRate, + this.listAllDoctorRate, + this.listAllProjectRate, + this.listCovid19DoctorsByClinicAndProject, + this.listCovid19ProjectDriveThroughTestingCenter, + this.listCalculationTable, + this.listDdAdminMembers, + this.listDentalChiefComplain, + this.listDentalDdDetails, + this.listDentalDoctorChiefComplaintMapping, + this.listDentalPediatricDoctor, + this.listDoctorAll, + this.listDoctorByIpAddressCheckIn, + this.listDoctorByProjectClinicAr, + this.listDoctorByProjectClinicEn, + this.listDoctorCases, + this.listDoctorClinics, + this.listDoctorDetailsList, + this.listDoctorDetailsListAr, + this.listDoctorLanguages, + this.listDoctorMappinsgs, + this.listDoctorPatientVitalSign, + this.listDoctorProcedureMapping, + this.listDoctorProfileImage, + this.listDoctorProject, + this.listDoctorQualifications, + this.listDoctorSlotFirstVisit, + this.listDoctorSpeciality, + this.listDoctorSpecializations, + this.listDoctorWorkingHoursTable, + this.listDoctorblacklistModel, + this.listDoctorinfo, + this.listEnglish, + this.listGetAllCancelAppointmentReasons, + this.listGetAllClinicsRoomNo, + this.listGetAllDoctorsOnProject, + this.listGetAllDoctorsbyProject, + this.listGetAppForCancel, + this.listGetClinicsInfobyProject, + this.listGetClinicsbyProject, + this.listGetDoctorsbyProject, + this.listGetIpAddressForDd, + this.listGetIpAddressForDentalDd, + this.listGetInfoForDentalClinicsDd, + this.listGetLoginDetails, + this.listGetPatientCancelAppointment, + this.listHisDoctorProject, + this.listHisGetContactLensPerscription, + this.listHisGetGlassPerscription, + this.listHmgPartTimeDoctor, + this.listInvoiceDetails, + this.listIsPatientHasOnGoingEstimation, + this.listLaserDoctors, + this.listLaserProcedures, + this.listMedicalReportByAppointment, + this.listNonAdminProjectMapping, + this.listPatientErAdminServiceModel, + this.listPatientErDoctorBlackListModel, + this.listPhysioDoctors, + this.listProjectErpMapping, + this.listRecordByIpAddress, + this.listRecordByIpAddressNew, + this.listRecordByIpAddressNewCheckIn, + this.listRecordByIpAddressNewForDubai, + this.listRescahdualOnlineModel, + this.message, + this.notesDoctorRatingForCocList, + this.notesDoctorRatingList, + this.onlineCheckInAppointments, + this.onlineCheckinBeforeHour, + this.prmAdmissionInfoList, + this.prmDentalEstimationDetailList, + this.prmDentalEstimationList, + this.prmDoctorsForRadiologyList, + this.prmGetErToOpdRequestStatusList, + this.prmGetDoctorRatingList, + this.prmGetProceureAndPackagesList, + this.prmHisAppointmentqueuegetList, + this.prmHisCheckDoctorIsFullyBookedList, + this.prmHisGetDentalEstimationPlanList, + this.prmHisGetDischargeInfoList, + this.prmHisGetUpcomingConfirmedAppoimentList, + this.prmHisQueueErToOpList, + this.prmQueueERreferralHistoryGetList, + this.prmSpecialClinicalCareMappingList, + this.patientDoctorAppointmentResultExit, + this.patientDoctorAppointmentResultList, + this.patientErDoctorFreeSlots, + this.patientErGetAllClinicsList, + this.patientErGetDoctorClincByServiceIdList, + this.patientErGetServiceList, + this.patientErLogininsert, + this.patientErPrescriptionLogin, + this.patientErSelectAdmin, + this.patientErSelectRole2, + this.patientErUpdateLiveCareStatus, + this.patientErInsert, + this.patientInformationList, + this.patientNumber, + this.paymentModes, + this.physioIsPatientHasApproval, + this.physiotherapyError, + this.procedureNeedeTime, + this.riskScore, + this.rowCount, + this.sameClinicApptList, + this.searchDoctorsByTimeIsVoiceCommandList, + this.slotDuration, + this.statusCode, + this.tamaraIntegrationLogsInsertResponse, + this.tamaraIntegrationLogsUpdateResponse, + this.transactionNo, + this.userDentalPlanMessage, + this.waitingAppointmentNoPerDay, + this.age, + this.erpDoctorDetails, + this.returnValue, + }); + + final dynamic date; + final int? languageId; + final int? serviceName; + final dynamic time; + final dynamic androidLink; + final dynamic authenticationTokenId; + final dynamic data; + final bool? dataw; + final int? dietType; + final int? dietTypeId; + final dynamic errorCode; + final dynamic errorEndUserMessage; + final dynamic errorEndUserMessageN; + final dynamic errorMessage; + final int? errorType; + final int? foodCategory; + final dynamic iosLink; + final bool? isAuthenticated; + final int? mealOrderStatus; + final int? mealType; + final int? messageStatus; + final int? numberOfResultRecords; + final dynamic patientBlodType; + final dynamic successMsg; + final dynamic successMsgN; + final dynamic vidaUpdatedResponse; + final bool? ageError; + final bool? allowedBooking; + final dynamic ancillaryOrderInvoiceList; + final dynamic ancillaryOrderList; + final int? ancillaryOrderListCount; + final dynamic ancillaryOrderProcList; + final dynamic appoimentAllHistoryResultList; + final dynamic appoimentAllResultList; + final int? appointmentActiveNumber; + final dynamic appointmentNo; + final dynamic appointmentQr; + final dynamic avgDoctorRatingList; + final dynamic covid19AppointmentResponse; + final dynamic covid19FreeTimeSlots; + final dynamic covid19InvoiceResponse; + final dynamic covid19PatientShare; + final dynamic covid19TestProceduresList; + final dynamic clinicCategoryList; + final int? clinicInsertedId; + final dynamic clinicsHaveScheduleList; + final bool? continueBookAppointment; + final dynamic dappTemplateGetList; + final int? decimalDoctorRate; + final dynamic dentalProcedure; + final dynamic dentalProcedureName; + final dynamic diseasesByClinicList; + final dynamic doctorBasicScheduleList; + final dynamic doctorByClinicIdList; + final dynamic doctorByDiseaseList; + final dynamic doctorCalenderList; + final dynamic doctorInformationAsHtml; + final dynamic doctorInformationRaw; + final dynamic doctorList; + final dynamic doctorPrePostImagesList; + final List? doctorProfileList; + final int? doctorRate; + final dynamic doctorRatingDetailsList; + final int? doctorScheduleMappingInsert; + final dynamic doctorSchedulesByClinicList; + final int? doctorscheduleslotInsert; + final dynamic doctorscheduleslotSelectList; + final dynamic erAppointmentFeesObject; + final dynamic erAdvancePaymentResponse; + final dynamic erOnlinePaymentDetailsResponse; + final dynamic erPatientShare; + final dynamic erTriageQuestionsList; + final dynamic errCode; + final dynamic errorSearchMsg; + final int? formId; + final dynamic freeTimeSlots; + final bool? genderError; + final dynamic getDoctorMobileNo; + final dynamic getPatientInfoByPatientIdList; + final dynamic getPatientMedicalStatus; + final dynamic hisGetAllAppoimentHistoryList; + final dynamic hisGetDoctorOffDaysList; + final dynamic hisObgyneUltrasoundDoctorsList; + final dynamic hisProcedureTemplateDetailsList; + final dynamic hisProcedureTemplateList; + final dynamic hisWaitingCheckDoctorAvailableForWaitingAppointmentList; + final dynamic hisObGyneProcedureGetResponse; + final dynamic hisPrmGetApprovalRemarkList; + final int? hoursDiff; + final bool? isDentalplan; + final bool? isMobileAppDentalAllow; + final int? initialSlotDuration; + final bool? isAllowToBookWaitingAppointment; + final bool? isAllowVClinic; + final bool? isAllowWaitList; + final bool? isAppointmentAllowed; + final bool? isClinicEnabledForIcdCodes; + final bool? isDoctorExist; + final int? isInsertOrUpdate; + final dynamic isLastAppoitmentRatedList; + final bool? isShowInsuranceUpdateModule; + final int? isSlotAvailable; + final dynamic lcGetClinicScheduleList; + final dynamic listHoursDiff; + final dynamic listReqTypes; + final dynamic listAllClinicRate; + final dynamic listAllDoctorRate; + final dynamic listAllProjectRate; + final dynamic listCovid19DoctorsByClinicAndProject; + final dynamic listCovid19ProjectDriveThroughTestingCenter; + final dynamic listCalculationTable; + final dynamic listDdAdminMembers; + final dynamic listDentalChiefComplain; + final dynamic listDentalDdDetails; + final dynamic listDentalDoctorChiefComplaintMapping; + final dynamic listDentalPediatricDoctor; + final dynamic listDoctorAll; + final dynamic listDoctorByIpAddressCheckIn; + final dynamic listDoctorByProjectClinicAr; + final dynamic listDoctorByProjectClinicEn; + final dynamic listDoctorCases; + final dynamic listDoctorClinics; + final dynamic listDoctorDetailsList; + final dynamic listDoctorDetailsListAr; + final dynamic listDoctorLanguages; + final dynamic listDoctorMappinsgs; + final dynamic listDoctorPatientVitalSign; + final dynamic listDoctorProcedureMapping; + final dynamic listDoctorProfileImage; + final dynamic listDoctorProject; + final dynamic listDoctorQualifications; + final dynamic listDoctorSlotFirstVisit; + final dynamic listDoctorSpeciality; + final dynamic listDoctorSpecializations; + final dynamic listDoctorWorkingHoursTable; + final dynamic listDoctorblacklistModel; + final dynamic listDoctorinfo; + final dynamic listEnglish; + final dynamic listGetAllCancelAppointmentReasons; + final dynamic listGetAllClinicsRoomNo; + final dynamic listGetAllDoctorsOnProject; + final dynamic listGetAllDoctorsbyProject; + final dynamic listGetAppForCancel; + final dynamic listGetClinicsInfobyProject; + final dynamic listGetClinicsbyProject; + final dynamic listGetDoctorsbyProject; + final dynamic listGetIpAddressForDd; + final dynamic listGetIpAddressForDentalDd; + final dynamic listGetInfoForDentalClinicsDd; + final dynamic listGetLoginDetails; + final dynamic listGetPatientCancelAppointment; + final dynamic listHisDoctorProject; + final dynamic listHisGetContactLensPerscription; + final dynamic listHisGetGlassPerscription; + final dynamic listHmgPartTimeDoctor; + final dynamic listInvoiceDetails; + final dynamic listIsPatientHasOnGoingEstimation; + final dynamic listLaserDoctors; + final dynamic listLaserProcedures; + final dynamic listMedicalReportByAppointment; + final dynamic listNonAdminProjectMapping; + final dynamic listPatientErAdminServiceModel; + final dynamic listPatientErDoctorBlackListModel; + final dynamic listPhysioDoctors; + final dynamic listProjectErpMapping; + final dynamic listRecordByIpAddress; + final dynamic listRecordByIpAddressNew; + final dynamic listRecordByIpAddressNewCheckIn; + final dynamic listRecordByIpAddressNewForDubai; + final dynamic listRescahdualOnlineModel; + final dynamic message; + final dynamic notesDoctorRatingForCocList; + final dynamic notesDoctorRatingList; + final dynamic onlineCheckInAppointments; + final int? onlineCheckinBeforeHour; + final dynamic prmAdmissionInfoList; + final dynamic prmDentalEstimationDetailList; + final dynamic prmDentalEstimationList; + final dynamic prmDoctorsForRadiologyList; + final dynamic prmGetErToOpdRequestStatusList; + final dynamic prmGetDoctorRatingList; + final dynamic prmGetProceureAndPackagesList; + final dynamic prmHisAppointmentqueuegetList; + final dynamic prmHisCheckDoctorIsFullyBookedList; + final dynamic prmHisGetDentalEstimationPlanList; + final dynamic prmHisGetDischargeInfoList; + final dynamic prmHisGetUpcomingConfirmedAppoimentList; + final dynamic prmHisQueueErToOpList; + final dynamic prmQueueERreferralHistoryGetList; + final dynamic prmSpecialClinicalCareMappingList; + final bool? patientDoctorAppointmentResultExit; + final dynamic patientDoctorAppointmentResultList; + final dynamic patientErDoctorFreeSlots; + final dynamic patientErGetAllClinicsList; + final dynamic patientErGetDoctorClincByServiceIdList; + final dynamic patientErGetServiceList; + final int? patientErLogininsert; + final dynamic patientErPrescriptionLogin; + final dynamic patientErSelectAdmin; + final dynamic patientErSelectRole2; + final int? patientErUpdateLiveCareStatus; + final int? patientErInsert; + final dynamic patientInformationList; + final int? patientNumber; + final dynamic paymentModes; + final bool? physioIsPatientHasApproval; + final int? physiotherapyError; + final dynamic procedureNeedeTime; + final int? riskScore; + final int? rowCount; + final dynamic sameClinicApptList; + final dynamic searchDoctorsByTimeIsVoiceCommandList; + final int? slotDuration; + final int? statusCode; + final int? tamaraIntegrationLogsInsertResponse; + final int? tamaraIntegrationLogsUpdateResponse; + final dynamic transactionNo; + final dynamic userDentalPlanMessage; + final int? waitingAppointmentNoPerDay; + final int? age; + final dynamic erpDoctorDetails; + final int? returnValue; + + factory GenericResponseModel2.fromJson(Map json) => GenericResponseModel2( + date: json["Date"], + languageId: json["LanguageID"] == null ? null : json["LanguageID"], + serviceName: json["ServiceName"] == null ? null : json["ServiceName"], + time: json["Time"], + androidLink: json["AndroidLink"], + authenticationTokenId: json["AuthenticationTokenID"], + data: json["Data"], + dataw: json["Dataw"] == null ? null : json["Dataw"], + dietType: json["DietType"] == null ? null : json["DietType"], + dietTypeId: json["DietTypeID"] == null ? null : json["DietTypeID"], + errorCode: json["ErrorCode"], + errorEndUserMessage: json["ErrorEndUserMessage"], + errorEndUserMessageN: json["ErrorEndUserMessageN"], + errorMessage: json["ErrorMessage"], + errorType: json["ErrorType"] == null ? null : json["ErrorType"], + foodCategory: json["FoodCategory"] == null ? null : json["FoodCategory"], + iosLink: json["IOSLink"], + isAuthenticated: json["IsAuthenticated"] == null ? null : json["IsAuthenticated"], + mealOrderStatus: json["MealOrderStatus"] == null ? null : json["MealOrderStatus"], + mealType: json["MealType"] == null ? null : json["MealType"], + messageStatus: json["MessageStatus"] == null ? null : json["MessageStatus"], + numberOfResultRecords: json["NumberOfResultRecords"] == null ? null : json["NumberOfResultRecords"], + patientBlodType: json["PatientBlodType"], + successMsg: json["SuccessMsg"], + successMsgN: json["SuccessMsgN"], + vidaUpdatedResponse: json["VidaUpdatedResponse"], + ageError: json["AgeError"] == null ? null : json["AgeError"], + allowedBooking: json["AllowedBooking"] == null ? null : json["AllowedBooking"], + ancillaryOrderInvoiceList: json["AncillaryOrderInvoiceList"], + ancillaryOrderList: json["AncillaryOrderList"], + ancillaryOrderListCount: json["AncillaryOrderListCount"] == null ? null : json["AncillaryOrderListCount"], + ancillaryOrderProcList: json["AncillaryOrderProcList"], + appoimentAllHistoryResultList: json["AppoimentAllHistoryResultList"], + appoimentAllResultList: json["AppoimentAllResultList"], + appointmentActiveNumber: json["AppointmentActiveNumber"] == null ? null : json["AppointmentActiveNumber"], + appointmentNo: json["AppointmentNo"], + appointmentQr: json["AppointmentQR"], + avgDoctorRatingList: json["AvgDoctorRatingList"], + covid19AppointmentResponse: json["COVID19_AppointmentResponse"], + covid19FreeTimeSlots: json["COVID19_FreeTimeSlots"], + covid19InvoiceResponse: json["COVID19_InvoiceResponse"], + covid19PatientShare: json["COVID19_PatientShare"], + covid19TestProceduresList: json["COVID19_TestProceduresList"], + clinicCategoryList: json["ClinicCategoryList"], + clinicInsertedId: json["ClinicInsertedID"] == null ? null : json["ClinicInsertedID"], + clinicsHaveScheduleList: json["ClinicsHaveScheduleList"], + continueBookAppointment: json["ContinueBookAppointment"] == null ? null : json["ContinueBookAppointment"], + dappTemplateGetList: json["DAPP_TemplateGetList"], + decimalDoctorRate: json["DecimalDoctorRate"] == null ? null : json["DecimalDoctorRate"], + dentalProcedure: json["DentalProcedure"], + dentalProcedureName: json["DentalProcedureName"], + diseasesByClinicList: json["DiseasesByClinicList"], + doctorBasicScheduleList: json["DoctorBasicScheduleList"], + doctorByClinicIdList: json["DoctorByClinicIDList"], + doctorByDiseaseList: json["DoctorByDiseaseList"], + doctorCalenderList: json["DoctorCalenderList"], + doctorInformationAsHtml: json["DoctorInformationAsHTML"], + doctorInformationRaw: json["DoctorInformationRAW"], + doctorList: json["DoctorList"], + doctorPrePostImagesList: json["DoctorPrePostImagesList"], + doctorProfileList: json["DoctorProfileList"] == null ? null : List.from(json["DoctorProfileList"].map((x) => DoctorProfileListModel.fromJson(x))), + doctorRate: json["DoctorRate"] == null ? null : json["DoctorRate"], + doctorRatingDetailsList: json["DoctorRatingDetailsList"], + doctorScheduleMappingInsert: json["DoctorScheduleMapping_Insert"] == null ? null : json["DoctorScheduleMapping_Insert"], + doctorSchedulesByClinicList: json["DoctorSchedulesByClinicList"], + doctorscheduleslotInsert: json["Doctorscheduleslot_Insert"] == null ? null : json["Doctorscheduleslot_Insert"], + doctorscheduleslotSelectList: json["Doctorscheduleslot_SelectList"], + erAppointmentFeesObject: json["ERAppointmentFeesObject"], + erAdvancePaymentResponse: json["ER_AdvancePaymentResponse"], + erOnlinePaymentDetailsResponse: json["ER_OnlinePaymentDetailsResponse"], + erPatientShare: json["ER_PatientShare"], + erTriageQuestionsList: json["ER_TriageQuestionsList"], + errCode: json["ErrCode"], + errorSearchMsg: json["ErrorSearchMsg"], + formId: json["FormID"] == null ? null : json["FormID"], + freeTimeSlots: json["FreeTimeSlots"], + genderError: json["GenderError"] == null ? null : json["GenderError"], + getDoctorMobileNo: json["GetDoctorMobileNo"], + getPatientInfoByPatientIdList: json["GetPatientInfoByPatientIDList"], + getPatientMedicalStatus: json["GetPatientMedicalStatus"], + hisGetAllAppoimentHistoryList: json["HIS_GetAllAppoimentHistoryList"], + hisGetDoctorOffDaysList: json["HIS_GetDoctorOffDaysList"], + hisObgyneUltrasoundDoctorsList: json["HIS_ObgyneUltrasoundDoctorsList"], + hisProcedureTemplateDetailsList: json["HIS_ProcedureTemplateDetailsList"], + hisProcedureTemplateList: json["HIS_ProcedureTemplateList"], + hisWaitingCheckDoctorAvailableForWaitingAppointmentList: json["HIS_Waiting_CheckDoctorAvailableForWaitingAppointment_List"], + hisObGyneProcedureGetResponse: json["His_ObGyneProcedureGet_Response"], + hisPrmGetApprovalRemarkList: json["His_PRM_GetApprovalRemarkList"], + hoursDiff: json["HoursDiff"] == null ? null : json["HoursDiff"], + isDentalplan: json["ISDentalplan"] == null ? null : json["ISDentalplan"], + isMobileAppDentalAllow: json["ISMobileAppDentalAllow"] == null ? null : json["ISMobileAppDentalAllow"], + initialSlotDuration: json["InitialSlotDuration"] == null ? null : json["InitialSlotDuration"], + isAllowToBookWaitingAppointment: json["IsAllowToBookWaitingAppointment"] == null ? null : json["IsAllowToBookWaitingAppointment"], + isAllowVClinic: json["IsAllowVClinic"] == null ? null : json["IsAllowVClinic"], + isAllowWaitList: json["IsAllowWaitList"] == null ? null : json["IsAllowWaitList"], + isAppointmentAllowed: json["IsAppointmentAllowed"] == null ? null : json["IsAppointmentAllowed"], + isClinicEnabledForIcdCodes: json["IsClinicEnabledForICDCodes"] == null ? null : json["IsClinicEnabledForICDCodes"], + isDoctorExist: json["IsDoctorExist"] == null ? null : json["IsDoctorExist"], + isInsertOrUpdate: json["IsInsertOrUpdate"] == null ? null : json["IsInsertOrUpdate"], + isLastAppoitmentRatedList: json["IsLastAppoitmentRatedList"], + isShowInsuranceUpdateModule: json["IsShowInsuranceUpdateModule"] == null ? null : json["IsShowInsuranceUpdateModule"], + isSlotAvailable: json["IsSlotAvailable"] == null ? null : json["IsSlotAvailable"], + lcGetClinicScheduleList: json["LC_GetClinicScheduleList"], + listHoursDiff: json["ListHoursDiff"], + listReqTypes: json["ListReqTypes"], + listAllClinicRate: json["List_AllClinicRate"], + listAllDoctorRate: json["List_AllDoctorRate"], + listAllProjectRate: json["List_AllProjectRate"], + listCovid19DoctorsByClinicAndProject: json["List_COVID19_DoctorsByClinicAndProject"], + listCovid19ProjectDriveThroughTestingCenter: json["List_COVID19_ProjectDriveThroughTestingCenter"], + listCalculationTable: json["List_CalculationTable"], + listDdAdminMembers: json["List_DDAdmin_Members"], + listDentalChiefComplain: json["List_DentalChiefComplain"], + listDentalDdDetails: json["List_DentalDDDetails"], + listDentalDoctorChiefComplaintMapping: json["List_DentalDoctorChiefComplaintMapping"], + listDentalPediatricDoctor: json["List_DentalPediatricDoctor"], + listDoctorAll: json["List_DoctorAll"], + listDoctorByIpAddressCheckIn: json["List_DoctorByIPAddressCheckIn"], + listDoctorByProjectClinicAr: json["List_DoctorByProjectClinicAr"], + listDoctorByProjectClinicEn: json["List_DoctorByProjectClinicEn"], + listDoctorCases: json["List_DoctorCases"], + listDoctorClinics: json["List_DoctorClinics"], + listDoctorDetailsList: json["List_DoctorDetailsList"], + listDoctorDetailsListAr: json["List_DoctorDetailsListAr"], + listDoctorLanguages: json["List_DoctorLanguages"], + listDoctorMappinsgs: json["List_DoctorMappinsgs"], + listDoctorPatientVitalSign: json["List_DoctorPatientVitalSign"], + listDoctorProcedureMapping: json["List_DoctorProcedureMapping"], + listDoctorProfileImage: json["List_DoctorProfileImage"], + listDoctorProject: json["List_DoctorProject"], + listDoctorQualifications: json["List_DoctorQualifications"], + listDoctorSlotFirstVisit: json["List_DoctorSlotFirstVisit"], + listDoctorSpeciality: json["List_DoctorSpeciality"], + listDoctorSpecializations: json["List_DoctorSpecializations"], + listDoctorWorkingHoursTable: json["List_DoctorWorkingHoursTable"], + listDoctorblacklistModel: json["List_DoctorblacklistModel"], + listDoctorinfo: json["List_Doctorinfo"], + listEnglish: json["List_English"], + listGetAllCancelAppointmentReasons: json["List_GetAllCancelAppointmentReasons"], + listGetAllClinicsRoomNo: json["List_GetAllClinicsRoomNo"], + listGetAllDoctorsOnProject: json["List_GetAllDoctorsOnProject"], + listGetAllDoctorsbyProject: json["List_GetAllDoctorsbyProject"], + listGetAppForCancel: json["List_GetAppForCancel"], + listGetClinicsInfobyProject: json["List_GetClinicsInfobyProject"], + listGetClinicsbyProject: json["List_GetClinicsbyProject"], + listGetDoctorsbyProject: json["List_GetDoctorsbyProject"], + listGetIpAddressForDd: json["List_GetIPAddressForDD"], + listGetIpAddressForDentalDd: json["List_GetIPAddressForDentalDD"], + listGetInfoForDentalClinicsDd: json["List_GetInfoForDentalClinicsDD"], + listGetLoginDetails: json["List_GetLoginDetails"], + listGetPatientCancelAppointment: json["List_GetPatientCancelAppointment"], + listHisDoctorProject: json["List_HISDoctorProject"], + listHisGetContactLensPerscription: json["List_HIS_GetContactLensPerscription"], + listHisGetGlassPerscription: json["List_HIS_GetGlassPerscription"], + listHmgPartTimeDoctor: json["List_HmgPartTimeDoctor"], + listInvoiceDetails: json["List_InvoiceDetails"], + listIsPatientHasOnGoingEstimation: json["List_IsPatientHasOnGoingEstimation"], + listLaserDoctors: json["List_LaserDoctors"], + listLaserProcedures: json["List_LaserProcedures"], + listMedicalReportByAppointment: json["List_MedicalReportByAppointment"], + listNonAdminProjectMapping: json["List_NonAdminProjectMapping"], + listPatientErAdminServiceModel: json["List_PatientER_AdminServiceModel"], + listPatientErDoctorBlackListModel: json["List_PatientER_DoctorBlackListModel"], + listPhysioDoctors: json["List_PhysioDoctors"], + listProjectErpMapping: json["List_ProjectERPMapping"], + listRecordByIpAddress: json["List_RecordByIPAddress"], + listRecordByIpAddressNew: json["List_RecordByIPAddressNew"], + listRecordByIpAddressNewCheckIn: json["List_RecordByIPAddressNewCheckIn"], + listRecordByIpAddressNewForDubai: json["List_RecordByIPAddressNewForDubai"], + listRescahdualOnlineModel: json["List_RescahdualOnlineModel"], + message: json["Message"], + notesDoctorRatingForCocList: json["NotesDoctorRatingForCOC_List"], + notesDoctorRatingList: json["NotesDoctorRatingList"], + onlineCheckInAppointments: json["OnlineCheckInAppointments"], + onlineCheckinBeforeHour: json["OnlineCheckinBeforeHour"] == null ? null : json["OnlineCheckinBeforeHour"], + prmAdmissionInfoList: json["PRM_AdmissionInfoList"], + prmDentalEstimationDetailList: json["PRM_DentalEstimationDetailList"], + prmDentalEstimationList: json["PRM_DentalEstimationList"], + prmDoctorsForRadiologyList: json["PRM_DoctorsForRadiologyList"], + prmGetErToOpdRequestStatusList: json["PRM_GET_ERToOPDRequestStatusList"], + prmGetDoctorRatingList: json["PRM_GetDoctorRatingList"], + prmGetProceureAndPackagesList: json["PRM_GetProceureAndPackagesList"], + prmHisAppointmentqueuegetList: json["PRM_HIS_AppointmentqueuegetList"], + prmHisCheckDoctorIsFullyBookedList: json["PRM_HIS_CheckDoctorIsFullyBookedList"], + prmHisGetDentalEstimationPlanList: json["PRM_HIS_GetDentalEstimationPlan_List"], + prmHisGetDischargeInfoList: json["PRM_HIS_GetDischargeInfo_List"], + prmHisGetUpcomingConfirmedAppoimentList: json["PRM_HIS_GetUpcomingConfirmedAppoimentList"], + prmHisQueueErToOpList: json["PRM_HIS_QueueERToOP_List"], + prmQueueERreferralHistoryGetList: json["PRM_QueueERreferralHistory_getList"], + prmSpecialClinicalCareMappingList: json["PRM_SpecialClinicalCareMapping_List"], + patientDoctorAppointmentResultExit: json["PatientDoctorAppointmentResultExit"] == null ? null : json["PatientDoctorAppointmentResultExit"], + patientDoctorAppointmentResultList: json["PatientDoctorAppointmentResultList"], + patientErDoctorFreeSlots: json["PatientER_DoctorFreeSlots"], + patientErGetAllClinicsList: json["PatientER_GetAllClinics_List"], + patientErGetDoctorClincByServiceIdList: json["PatientER_GetDoctorClincByServiceID_List"], + patientErGetServiceList: json["PatientER_GetServiceList"], + patientErLogininsert: json["PatientER_Logininsert"] == null ? null : json["PatientER_Logininsert"], + patientErPrescriptionLogin: json["PatientER_PrescriptionLogin"], + patientErSelectAdmin: json["PatientER_SelectAdmin"], + patientErSelectRole2: json["PatientER_SelectRole2"], + patientErUpdateLiveCareStatus: json["PatientER_UpdateLiveCareStatus"] == null ? null : json["PatientER_UpdateLiveCareStatus"], + patientErInsert: json["PatientER_insert"] == null ? null : json["PatientER_insert"], + patientInformationList: json["PatientInformationList"], + patientNumber: json["PatientNumber"] == null ? null : json["PatientNumber"], + paymentModes: json["PaymentModes"], + physioIsPatientHasApproval: json["Physio_IsPatientHasApproval"] == null ? null : json["Physio_IsPatientHasApproval"], + physiotherapyError: json["PhysiotherapyError"] == null ? null : json["PhysiotherapyError"], + procedureNeedeTime: json["ProcedureNeedeTime"], + riskScore: json["RiskScore"] == null ? null : json["RiskScore"], + rowCount: json["RowCount"] == null ? null : json["RowCount"], + sameClinicApptList: json["SameClinicApptList"], + searchDoctorsByTimeIsVoiceCommandList: json["SearchDoctorsByTime_IsVoiceCommandList"], + slotDuration: json["SlotDuration"] == null ? null : json["SlotDuration"], + statusCode: json["StatusCode"] == null ? null : json["StatusCode"], + tamaraIntegrationLogsInsertResponse: json["Tamara_IntegrationLogsInsert_Response"] == null ? null : json["Tamara_IntegrationLogsInsert_Response"], + tamaraIntegrationLogsUpdateResponse: json["Tamara_IntegrationLogsUpdate_Response"] == null ? null : json["Tamara_IntegrationLogsUpdate_Response"], + transactionNo: json["TransactionNo"], + userDentalPlanMessage: json["UserDentalPlanMessage"], + waitingAppointmentNoPerDay: json["WaitingAppointmentNoPerDay"] == null ? null : json["WaitingAppointmentNoPerDay"], + age: json["age"] == null ? null : json["age"], + erpDoctorDetails: json["erpDoctorDetails"], + returnValue: json["returnValue"] == null ? null : json["returnValue"], + ); + + Map toJson() => { + "Date": date, + "LanguageID": languageId == null ? null : languageId, + "ServiceName": serviceName == null ? null : serviceName, + "Time": time, + "AndroidLink": androidLink, + "AuthenticationTokenID": authenticationTokenId, + "Data": data, + "Dataw": dataw == null ? null : dataw, + "DietType": dietType == null ? null : dietType, + "DietTypeID": dietTypeId == null ? null : dietTypeId, + "ErrorCode": errorCode, + "ErrorEndUserMessage": errorEndUserMessage, + "ErrorEndUserMessageN": errorEndUserMessageN, + "ErrorMessage": errorMessage, + "ErrorType": errorType == null ? null : errorType, + "FoodCategory": foodCategory == null ? null : foodCategory, + "IOSLink": iosLink, + "IsAuthenticated": isAuthenticated == null ? null : isAuthenticated, + "MealOrderStatus": mealOrderStatus == null ? null : mealOrderStatus, + "MealType": mealType == null ? null : mealType, + "MessageStatus": messageStatus == null ? null : messageStatus, + "NumberOfResultRecords": numberOfResultRecords == null ? null : numberOfResultRecords, + "PatientBlodType": patientBlodType, + "SuccessMsg": successMsg, + "SuccessMsgN": successMsgN, + "VidaUpdatedResponse": vidaUpdatedResponse, + "AgeError": ageError == null ? null : ageError, + "AllowedBooking": allowedBooking == null ? null : allowedBooking, + "AncillaryOrderInvoiceList": ancillaryOrderInvoiceList, + "AncillaryOrderList": ancillaryOrderList, + "AncillaryOrderListCount": ancillaryOrderListCount == null ? null : ancillaryOrderListCount, + "AncillaryOrderProcList": ancillaryOrderProcList, + "AppoimentAllHistoryResultList": appoimentAllHistoryResultList, + "AppoimentAllResultList": appoimentAllResultList, + "AppointmentActiveNumber": appointmentActiveNumber == null ? null : appointmentActiveNumber, + "AppointmentNo": appointmentNo, + "AppointmentQR": appointmentQr, + "AvgDoctorRatingList": avgDoctorRatingList, + "COVID19_AppointmentResponse": covid19AppointmentResponse, + "COVID19_FreeTimeSlots": covid19FreeTimeSlots, + "COVID19_InvoiceResponse": covid19InvoiceResponse, + "COVID19_PatientShare": covid19PatientShare, + "COVID19_TestProceduresList": covid19TestProceduresList, + "ClinicCategoryList": clinicCategoryList, + "ClinicInsertedID": clinicInsertedId == null ? null : clinicInsertedId, + "ClinicsHaveScheduleList": clinicsHaveScheduleList, + "ContinueBookAppointment": continueBookAppointment == null ? null : continueBookAppointment, + "DAPP_TemplateGetList": dappTemplateGetList, + "DecimalDoctorRate": decimalDoctorRate == null ? null : decimalDoctorRate, + "DentalProcedure": dentalProcedure, + "DentalProcedureName": dentalProcedureName, + "DiseasesByClinicList": diseasesByClinicList, + "DoctorBasicScheduleList": doctorBasicScheduleList, + "DoctorByClinicIDList": doctorByClinicIdList, + "DoctorByDiseaseList": doctorByDiseaseList, + "DoctorCalenderList": doctorCalenderList, + "DoctorInformationAsHTML": doctorInformationAsHtml, + "DoctorInformationRAW": doctorInformationRaw, + "DoctorList": doctorList, + "DoctorPrePostImagesList": doctorPrePostImagesList, + "DoctorProfileList": doctorProfileList == null ? null : List.from(doctorProfileList!.map((x) => x.toJson())), + "DoctorRate": doctorRate == null ? null : doctorRate, + "DoctorRatingDetailsList": doctorRatingDetailsList, + "DoctorScheduleMapping_Insert": doctorScheduleMappingInsert == null ? null : doctorScheduleMappingInsert, + "DoctorSchedulesByClinicList": doctorSchedulesByClinicList, + "Doctorscheduleslot_Insert": doctorscheduleslotInsert == null ? null : doctorscheduleslotInsert, + "Doctorscheduleslot_SelectList": doctorscheduleslotSelectList, + "ERAppointmentFeesObject": erAppointmentFeesObject, + "ER_AdvancePaymentResponse": erAdvancePaymentResponse, + "ER_OnlinePaymentDetailsResponse": erOnlinePaymentDetailsResponse, + "ER_PatientShare": erPatientShare, + "ER_TriageQuestionsList": erTriageQuestionsList, + "ErrCode": errCode, + "ErrorSearchMsg": errorSearchMsg, + "FormID": formId == null ? null : formId, + "FreeTimeSlots": freeTimeSlots, + "GenderError": genderError == null ? null : genderError, + "GetDoctorMobileNo": getDoctorMobileNo, + "GetPatientInfoByPatientIDList": getPatientInfoByPatientIdList, + "GetPatientMedicalStatus": getPatientMedicalStatus, + "HIS_GetAllAppoimentHistoryList": hisGetAllAppoimentHistoryList, + "HIS_GetDoctorOffDaysList": hisGetDoctorOffDaysList, + "HIS_ObgyneUltrasoundDoctorsList": hisObgyneUltrasoundDoctorsList, + "HIS_ProcedureTemplateDetailsList": hisProcedureTemplateDetailsList, + "HIS_ProcedureTemplateList": hisProcedureTemplateList, + "HIS_Waiting_CheckDoctorAvailableForWaitingAppointment_List": hisWaitingCheckDoctorAvailableForWaitingAppointmentList, + "His_ObGyneProcedureGet_Response": hisObGyneProcedureGetResponse, + "His_PRM_GetApprovalRemarkList": hisPrmGetApprovalRemarkList, + "HoursDiff": hoursDiff == null ? null : hoursDiff, + "ISDentalplan": isDentalplan == null ? null : isDentalplan, + "ISMobileAppDentalAllow": isMobileAppDentalAllow == null ? null : isMobileAppDentalAllow, + "InitialSlotDuration": initialSlotDuration == null ? null : initialSlotDuration, + "IsAllowToBookWaitingAppointment": isAllowToBookWaitingAppointment == null ? null : isAllowToBookWaitingAppointment, + "IsAllowVClinic": isAllowVClinic == null ? null : isAllowVClinic, + "IsAllowWaitList": isAllowWaitList == null ? null : isAllowWaitList, + "IsAppointmentAllowed": isAppointmentAllowed == null ? null : isAppointmentAllowed, + "IsClinicEnabledForICDCodes": isClinicEnabledForIcdCodes == null ? null : isClinicEnabledForIcdCodes, + "IsDoctorExist": isDoctorExist == null ? null : isDoctorExist, + "IsInsertOrUpdate": isInsertOrUpdate == null ? null : isInsertOrUpdate, + "IsLastAppoitmentRatedList": isLastAppoitmentRatedList, + "IsShowInsuranceUpdateModule": isShowInsuranceUpdateModule == null ? null : isShowInsuranceUpdateModule, + "IsSlotAvailable": isSlotAvailable == null ? null : isSlotAvailable, + "LC_GetClinicScheduleList": lcGetClinicScheduleList, + "ListHoursDiff": listHoursDiff, + "ListReqTypes": listReqTypes, + "List_AllClinicRate": listAllClinicRate, + "List_AllDoctorRate": listAllDoctorRate, + "List_AllProjectRate": listAllProjectRate, + "List_COVID19_DoctorsByClinicAndProject": listCovid19DoctorsByClinicAndProject, + "List_COVID19_ProjectDriveThroughTestingCenter": listCovid19ProjectDriveThroughTestingCenter, + "List_CalculationTable": listCalculationTable, + "List_DDAdmin_Members": listDdAdminMembers, + "List_DentalChiefComplain": listDentalChiefComplain, + "List_DentalDDDetails": listDentalDdDetails, + "List_DentalDoctorChiefComplaintMapping": listDentalDoctorChiefComplaintMapping, + "List_DentalPediatricDoctor": listDentalPediatricDoctor, + "List_DoctorAll": listDoctorAll, + "List_DoctorByIPAddressCheckIn": listDoctorByIpAddressCheckIn, + "List_DoctorByProjectClinicAr": listDoctorByProjectClinicAr, + "List_DoctorByProjectClinicEn": listDoctorByProjectClinicEn, + "List_DoctorCases": listDoctorCases, + "List_DoctorClinics": listDoctorClinics, + "List_DoctorDetailsList": listDoctorDetailsList, + "List_DoctorDetailsListAr": listDoctorDetailsListAr, + "List_DoctorLanguages": listDoctorLanguages, + "List_DoctorMappinsgs": listDoctorMappinsgs, + "List_DoctorPatientVitalSign": listDoctorPatientVitalSign, + "List_DoctorProcedureMapping": listDoctorProcedureMapping, + "List_DoctorProfileImage": listDoctorProfileImage, + "List_DoctorProject": listDoctorProject, + "List_DoctorQualifications": listDoctorQualifications, + "List_DoctorSlotFirstVisit": listDoctorSlotFirstVisit, + "List_DoctorSpeciality": listDoctorSpeciality, + "List_DoctorSpecializations": listDoctorSpecializations, + "List_DoctorWorkingHoursTable": listDoctorWorkingHoursTable, + "List_DoctorblacklistModel": listDoctorblacklistModel, + "List_Doctorinfo": listDoctorinfo, + "List_English": listEnglish, + "List_GetAllCancelAppointmentReasons": listGetAllCancelAppointmentReasons, + "List_GetAllClinicsRoomNo": listGetAllClinicsRoomNo, + "List_GetAllDoctorsOnProject": listGetAllDoctorsOnProject, + "List_GetAllDoctorsbyProject": listGetAllDoctorsbyProject, + "List_GetAppForCancel": listGetAppForCancel, + "List_GetClinicsInfobyProject": listGetClinicsInfobyProject, + "List_GetClinicsbyProject": listGetClinicsbyProject, + "List_GetDoctorsbyProject": listGetDoctorsbyProject, + "List_GetIPAddressForDD": listGetIpAddressForDd, + "List_GetIPAddressForDentalDD": listGetIpAddressForDentalDd, + "List_GetInfoForDentalClinicsDD": listGetInfoForDentalClinicsDd, + "List_GetLoginDetails": listGetLoginDetails, + "List_GetPatientCancelAppointment": listGetPatientCancelAppointment, + "List_HISDoctorProject": listHisDoctorProject, + "List_HIS_GetContactLensPerscription": listHisGetContactLensPerscription, + "List_HIS_GetGlassPerscription": listHisGetGlassPerscription, + "List_HmgPartTimeDoctor": listHmgPartTimeDoctor, + "List_InvoiceDetails": listInvoiceDetails, + "List_IsPatientHasOnGoingEstimation": listIsPatientHasOnGoingEstimation, + "List_LaserDoctors": listLaserDoctors, + "List_LaserProcedures": listLaserProcedures, + "List_MedicalReportByAppointment": listMedicalReportByAppointment, + "List_NonAdminProjectMapping": listNonAdminProjectMapping, + "List_PatientER_AdminServiceModel": listPatientErAdminServiceModel, + "List_PatientER_DoctorBlackListModel": listPatientErDoctorBlackListModel, + "List_PhysioDoctors": listPhysioDoctors, + "List_ProjectERPMapping": listProjectErpMapping, + "List_RecordByIPAddress": listRecordByIpAddress, + "List_RecordByIPAddressNew": listRecordByIpAddressNew, + "List_RecordByIPAddressNewCheckIn": listRecordByIpAddressNewCheckIn, + "List_RecordByIPAddressNewForDubai": listRecordByIpAddressNewForDubai, + "List_RescahdualOnlineModel": listRescahdualOnlineModel, + "Message": message, + "NotesDoctorRatingForCOC_List": notesDoctorRatingForCocList, + "NotesDoctorRatingList": notesDoctorRatingList, + "OnlineCheckInAppointments": onlineCheckInAppointments, + "OnlineCheckinBeforeHour": onlineCheckinBeforeHour == null ? null : onlineCheckinBeforeHour, + "PRM_AdmissionInfoList": prmAdmissionInfoList, + "PRM_DentalEstimationDetailList": prmDentalEstimationDetailList, + "PRM_DentalEstimationList": prmDentalEstimationList, + "PRM_DoctorsForRadiologyList": prmDoctorsForRadiologyList, + "PRM_GET_ERToOPDRequestStatusList": prmGetErToOpdRequestStatusList, + "PRM_GetDoctorRatingList": prmGetDoctorRatingList, + "PRM_GetProceureAndPackagesList": prmGetProceureAndPackagesList, + "PRM_HIS_AppointmentqueuegetList": prmHisAppointmentqueuegetList, + "PRM_HIS_CheckDoctorIsFullyBookedList": prmHisCheckDoctorIsFullyBookedList, + "PRM_HIS_GetDentalEstimationPlan_List": prmHisGetDentalEstimationPlanList, + "PRM_HIS_GetDischargeInfo_List": prmHisGetDischargeInfoList, + "PRM_HIS_GetUpcomingConfirmedAppoimentList": prmHisGetUpcomingConfirmedAppoimentList, + "PRM_HIS_QueueERToOP_List": prmHisQueueErToOpList, + "PRM_QueueERreferralHistory_getList": prmQueueERreferralHistoryGetList, + "PRM_SpecialClinicalCareMapping_List": prmSpecialClinicalCareMappingList, + "PatientDoctorAppointmentResultExit": patientDoctorAppointmentResultExit == null ? null : patientDoctorAppointmentResultExit, + "PatientDoctorAppointmentResultList": patientDoctorAppointmentResultList, + "PatientER_DoctorFreeSlots": patientErDoctorFreeSlots, + "PatientER_GetAllClinics_List": patientErGetAllClinicsList, + "PatientER_GetDoctorClincByServiceID_List": patientErGetDoctorClincByServiceIdList, + "PatientER_GetServiceList": patientErGetServiceList, + "PatientER_Logininsert": patientErLogininsert == null ? null : patientErLogininsert, + "PatientER_PrescriptionLogin": patientErPrescriptionLogin, + "PatientER_SelectAdmin": patientErSelectAdmin, + "PatientER_SelectRole2": patientErSelectRole2, + "PatientER_UpdateLiveCareStatus": patientErUpdateLiveCareStatus == null ? null : patientErUpdateLiveCareStatus, + "PatientER_insert": patientErInsert == null ? null : patientErInsert, + "PatientInformationList": patientInformationList, + "PatientNumber": patientNumber == null ? null : patientNumber, + "PaymentModes": paymentModes, + "Physio_IsPatientHasApproval": physioIsPatientHasApproval == null ? null : physioIsPatientHasApproval, + "PhysiotherapyError": physiotherapyError == null ? null : physiotherapyError, + "ProcedureNeedeTime": procedureNeedeTime, + "RiskScore": riskScore == null ? null : riskScore, + "RowCount": rowCount == null ? null : rowCount, + "SameClinicApptList": sameClinicApptList, + "SearchDoctorsByTime_IsVoiceCommandList": searchDoctorsByTimeIsVoiceCommandList, + "SlotDuration": slotDuration == null ? null : slotDuration, + "StatusCode": statusCode == null ? null : statusCode, + "Tamara_IntegrationLogsInsert_Response": tamaraIntegrationLogsInsertResponse == null ? null : tamaraIntegrationLogsInsertResponse, + "Tamara_IntegrationLogsUpdate_Response": tamaraIntegrationLogsUpdateResponse == null ? null : tamaraIntegrationLogsUpdateResponse, + "TransactionNo": transactionNo, + "UserDentalPlanMessage": userDentalPlanMessage, + "WaitingAppointmentNoPerDay": waitingAppointmentNoPerDay == null ? null : waitingAppointmentNoPerDay, + "age": age == null ? null : age, + "erpDoctorDetails": erpDoctorDetails, + "returnValue": returnValue == null ? null : returnValue, + }; +} diff --git a/lib/model/base/post_params_model.dart b/lib/model/base/post_params_model.dart index e1844bd..3e2e4a4 100644 --- a/lib/model/base/post_params_model.dart +++ b/lib/model/base/post_params_model.dart @@ -12,6 +12,7 @@ class PostParamsModel { String? vidaAuthTokenID; String? vidaRefreshTokenID; int? deviceTypeID; + String? generalID; PostParamsModel({ this.imei, @@ -27,6 +28,7 @@ class PostParamsModel { this.vidaAuthTokenID, this.vidaRefreshTokenID, this.deviceTypeID, + this.generalID, }); PostParamsModel.fromJson(Map json) { @@ -43,6 +45,7 @@ class PostParamsModel { vidaAuthTokenID = json['VidaAuthTokenID']; vidaRefreshTokenID = json['VidaRefreshTokenID']; deviceTypeID = json['DeviceTypeID']; + deviceTypeID = json['generalid']; } Map toJson() { @@ -59,6 +62,7 @@ class PostParamsModel { data['VidaAuthTokenID'] = this.vidaAuthTokenID; data['VidaRefreshTokenID'] = this.vidaRefreshTokenID; data['DeviceTypeID'] = this.deviceTypeID; + data['generalid']=this.generalID; return data; } diff --git a/lib/model/login/doctor_profile_model.dart b/lib/model/login/doctor_profile_model.dart new file mode 100644 index 0000000..258af4e --- /dev/null +++ b/lib/model/login/doctor_profile_model.dart @@ -0,0 +1,195 @@ +class DoctorProfileListModel { + DoctorProfileListModel({ + this.doctorId, + this.doctorName, + this.doctorNameN, + this.clinicId, + this.clinicDescription, + this.clinicDescriptionN, + this.licenseExpiry, + this.employmentType, + this.setupId, + this.projectId, + this.projectName, + this.nationalityId, + this.nationalityName, + this.nationalityNameN, + this.gender, + this.genderDescription, + this.genderDescriptionN, + this.doctorTitle, + this.projectNameN, + this.isAllowWaitList, + this.titleDescription, + this.titleDescriptionN, + this.isRegistered, + this.isDoctorDummy, + this.isActive, + this.isDoctorAppointmentDisplayed, + this.doctorClinicActive, + this.isbookingAllowed, + this.doctorCases, + this.doctorPicture, + this.doctorProfileInfo, + this.specialty, + this.actualDoctorRate, + this.consultationFee, + this.decimalDoctorRate, + this.doctorImageUrl, + this.doctorMobileNumber, + this.doctorRate, + this.doctorStarsRate, + this.doctorTitleForProfile, + this.isAppointmentAllowed, + this.isDoctorHasPrePostImages, + this.nationalityFlagUrl, + this.noOfPatientsRate, + this.qr, + this.serviceId, + }); + + final int? doctorId; + final String? doctorName; + final dynamic doctorNameN; + final int? clinicId; + final String? clinicDescription; + final dynamic clinicDescriptionN; + final dynamic licenseExpiry; + final int? employmentType; + final dynamic setupId; + final int? projectId; + final String? projectName; + final String? nationalityId; + final String? nationalityName; + final dynamic nationalityNameN; + final int? gender; + final String? genderDescription; + final dynamic genderDescriptionN; + final dynamic doctorTitle; + final dynamic projectNameN; + final bool? isAllowWaitList; + final String? titleDescription; + final dynamic titleDescriptionN; + final dynamic isRegistered; + final dynamic isDoctorDummy; + final bool? isActive; + final dynamic isDoctorAppointmentDisplayed; + final bool? doctorClinicActive; + final dynamic isbookingAllowed; + final String? doctorCases; + final dynamic doctorPicture; + final String? doctorProfileInfo; + final List? specialty; + final int? actualDoctorRate; + final String? consultationFee; + final double? decimalDoctorRate; + final String? doctorImageUrl; + final String? doctorMobileNumber; + final int? doctorRate; + final int? doctorStarsRate; + final String? doctorTitleForProfile; + final bool? isAppointmentAllowed; + final bool? isDoctorHasPrePostImages; + final String? nationalityFlagUrl; + final int? noOfPatientsRate; + final String? qr; + final int? serviceId; + + factory DoctorProfileListModel.fromJson(Map json) => DoctorProfileListModel( + doctorId: json["DoctorID"] == null ? null : json["DoctorID"], + doctorName: json["DoctorName"] == null ? null : json["DoctorName"], + doctorNameN: json["DoctorNameN"], + clinicId: json["ClinicID"] == null ? null : json["ClinicID"], + clinicDescription: json["ClinicDescription"] == null ? null : json["ClinicDescription"], + clinicDescriptionN: json["ClinicDescriptionN"], + licenseExpiry: json["LicenseExpiry"], + employmentType: json["EmploymentType"] == null ? null : json["EmploymentType"], + setupId: json["SetupID"], + projectId: json["ProjectID"] == null ? null : json["ProjectID"], + projectName: json["ProjectName"] == null ? null : json["ProjectName"], + nationalityId: json["NationalityID"] == null ? null : json["NationalityID"], + nationalityName: json["NationalityName"] == null ? null : json["NationalityName"], + nationalityNameN: json["NationalityNameN"], + gender: json["Gender"] == null ? null : json["Gender"], + genderDescription: json["Gender_Description"] == null ? null : json["Gender_Description"], + genderDescriptionN: json["Gender_DescriptionN"], + doctorTitle: json["DoctorTitle"], + projectNameN: json["ProjectNameN"], + isAllowWaitList: json["IsAllowWaitList"] == null ? null : json["IsAllowWaitList"], + titleDescription: json["Title_Description"] == null ? null : json["Title_Description"], + titleDescriptionN: json["Title_DescriptionN"], + isRegistered: json["IsRegistered"], + isDoctorDummy: json["IsDoctorDummy"], + isActive: json["IsActive"] == null ? null : json["IsActive"], + isDoctorAppointmentDisplayed: json["IsDoctorAppointmentDisplayed"], + doctorClinicActive: json["DoctorClinicActive"] == null ? null : json["DoctorClinicActive"], + isbookingAllowed: json["IsbookingAllowed"], + doctorCases: json["DoctorCases"] == null ? null : json["DoctorCases"], + doctorPicture: json["DoctorPicture"], + doctorProfileInfo: json["DoctorProfileInfo"] == null ? null : json["DoctorProfileInfo"], + specialty: json["Specialty"] == null ? null : List.from(json["Specialty"].map((x) => x)), + actualDoctorRate: json["ActualDoctorRate"] == null ? null : json["ActualDoctorRate"], + consultationFee: json["ConsultationFee"] == null ? null : json["ConsultationFee"], + decimalDoctorRate: json["DecimalDoctorRate"] == null ? null : json["DecimalDoctorRate"].toDouble(), + doctorImageUrl: json["DoctorImageURL"] == null ? null : json["DoctorImageURL"], + doctorMobileNumber: json["DoctorMobileNumber"] == null ? null : json["DoctorMobileNumber"], + doctorRate: json["DoctorRate"] == null ? null : json["DoctorRate"], + doctorStarsRate: json["DoctorStarsRate"] == null ? null : json["DoctorStarsRate"], + doctorTitleForProfile: json["DoctorTitleForProfile"] == null ? null : json["DoctorTitleForProfile"], + isAppointmentAllowed: json["IsAppointmentAllowed"] == null ? null : json["IsAppointmentAllowed"], + isDoctorHasPrePostImages: json["IsDoctorHasPrePostImages"] == null ? null : json["IsDoctorHasPrePostImages"], + nationalityFlagUrl: json["NationalityFlagURL"] == null ? null : json["NationalityFlagURL"], + noOfPatientsRate: json["NoOfPatientsRate"] == null ? null : json["NoOfPatientsRate"], + qr: json["QR"] == null ? null : json["QR"], + serviceId: json["ServiceID"] == null ? null : json["ServiceID"], + ); + + Map toJson() => { + "DoctorID": doctorId == null ? null : doctorId, + "DoctorName": doctorName == null ? null : doctorName, + "DoctorNameN": doctorNameN, + "ClinicID": clinicId == null ? null : clinicId, + "ClinicDescription": clinicDescription == null ? null : clinicDescription, + "ClinicDescriptionN": clinicDescriptionN, + "LicenseExpiry": licenseExpiry, + "EmploymentType": employmentType == null ? null : employmentType, + "SetupID": setupId, + "ProjectID": projectId == null ? null : projectId, + "ProjectName": projectName == null ? null : projectName, + "NationalityID": nationalityId == null ? null : nationalityId, + "NationalityName": nationalityName == null ? null : nationalityName, + "NationalityNameN": nationalityNameN, + "Gender": gender == null ? null : gender, + "Gender_Description": genderDescription == null ? null : genderDescription, + "Gender_DescriptionN": genderDescriptionN, + "DoctorTitle": doctorTitle, + "ProjectNameN": projectNameN, + "IsAllowWaitList": isAllowWaitList == null ? null : isAllowWaitList, + "Title_Description": titleDescription == null ? null : titleDescription, + "Title_DescriptionN": titleDescriptionN, + "IsRegistered": isRegistered, + "IsDoctorDummy": isDoctorDummy, + "IsActive": isActive == null ? null : isActive, + "IsDoctorAppointmentDisplayed": isDoctorAppointmentDisplayed, + "DoctorClinicActive": doctorClinicActive == null ? null : doctorClinicActive, + "IsbookingAllowed": isbookingAllowed, + "DoctorCases": doctorCases == null ? null : doctorCases, + "DoctorPicture": doctorPicture, + "DoctorProfileInfo": doctorProfileInfo == null ? null : doctorProfileInfo, + "Specialty": specialty == null ? null : List.from(specialty!.map((x) => x)), + "ActualDoctorRate": actualDoctorRate == null ? null : actualDoctorRate, + "ConsultationFee": consultationFee == null ? null : consultationFee, + "DecimalDoctorRate": decimalDoctorRate == null ? null : decimalDoctorRate, + "DoctorImageURL": doctorImageUrl == null ? null : doctorImageUrl, + "DoctorMobileNumber": doctorMobileNumber == null ? null : doctorMobileNumber, + "DoctorRate": doctorRate == null ? null : doctorRate, + "DoctorStarsRate": doctorStarsRate == null ? null : doctorStarsRate, + "DoctorTitleForProfile": doctorTitleForProfile == null ? null : doctorTitleForProfile, + "IsAppointmentAllowed": isAppointmentAllowed == null ? null : isAppointmentAllowed, + "IsDoctorHasPrePostImages": isDoctorHasPrePostImages == null ? null : isDoctorHasPrePostImages, + "NationalityFlagURL": nationalityFlagUrl == null ? null : nationalityFlagUrl, + "NoOfPatientsRate": noOfPatientsRate == null ? null : noOfPatientsRate, + "QR": qr == null ? null : qr, + "ServiceID": serviceId == null ? null : serviceId, + }; +} diff --git a/lib/model/login/list_doctors_clinic_model.dart b/lib/model/login/list_doctors_clinic_model.dart new file mode 100644 index 0000000..96f1e80 --- /dev/null +++ b/lib/model/login/list_doctors_clinic_model.dart @@ -0,0 +1,35 @@ +class ListDoctorsClinicModel { + ListDoctorsClinicModel({ + this.setupId, + this.projectId, + this.doctorId, + this.clinicId, + this.isActive, + this.clinicName, + }); + + final dynamic setupId; + final int? projectId; + final int? doctorId; + final int? clinicId; + final bool? isActive; + final String? clinicName; + + factory ListDoctorsClinicModel.fromJson(Map json) => ListDoctorsClinicModel( + setupId: json["SetupID"], + projectId: json["ProjectID"] == null ? null : json["ProjectID"], + doctorId: json["DoctorID"] == null ? null : json["DoctorID"], + clinicId: json["ClinicID"] == null ? null : json["ClinicID"], + isActive: json["IsActive"] == null ? null : json["IsActive"], + clinicName: json["ClinicName"] == null ? null : json["ClinicName"], + ); + + Map toJson() => { + "SetupID": setupId, + "ProjectID": projectId == null ? null : projectId, + "DoctorID": doctorId == null ? null : doctorId, + "ClinicID": clinicId == null ? null : clinicId, + "IsActive": isActive == null ? null : isActive, + "ClinicName": clinicName == null ? null : clinicName, + }; +} diff --git a/lib/model/login/member_information_model.dart b/lib/model/login/member_information_model.dart new file mode 100644 index 0000000..a3f22c1 --- /dev/null +++ b/lib/model/login/member_information_model.dart @@ -0,0 +1,92 @@ +class MemberInformation { + MemberInformation({ + this.clinics, + this.doctorId, + this.email, + this.employeeId, + this.memberId, + this.memberName, + this.memberNameArabic, + this.preferredLanguage, + this.roles, + }); + + final List? clinics; + final int? doctorId; + final String? email; + final int? employeeId; + final int? memberId; + final dynamic memberName; + final dynamic memberNameArabic; + final String? preferredLanguage; + final List? roles; + + factory MemberInformation.fromJson(Map json) => MemberInformation( + clinics: json["clinics"] == null ? null : List.from(json["clinics"].map((x) => Clinic.fromJson(x))), + doctorId: json["doctorId"] == null ? null : json["doctorId"], + email: json["email"] == null ? null : json["email"], + employeeId: json["employeeId"] == null ? null : json["employeeId"], + memberId: json["memberId"] == null ? null : json["memberId"], + memberName: json["memberName"], + memberNameArabic: json["memberNameArabic"], + preferredLanguage: json["preferredLanguage"] == null ? null : json["preferredLanguage"], + roles: json["roles"] == null ? null : List.from(json["roles"].map((x) => Role.fromJson(x))), + ); + + Map toJson() => { + "clinics": clinics == null ? null : List.from(clinics!.map((x) => x.toJson())), + "doctorId": doctorId == null ? null : doctorId, + "email": email == null ? null : email, + "employeeId": employeeId == null ? null : employeeId, + "memberId": memberId == null ? null : memberId, + "memberName": memberName, + "memberNameArabic": memberNameArabic, + "preferredLanguage": preferredLanguage == null ? null : preferredLanguage, + "roles": roles == null ? null : List.from(roles!.map((x) => x.toJson())), + }; +} + + +class Clinic { + Clinic({ + this.defaultClinic, + this.id, + this.name, + }); + + final bool? defaultClinic; + final int? id; + final String? name; + + factory Clinic.fromJson(Map json) => Clinic( + defaultClinic: json["defaultClinic"] == null ? null : json["defaultClinic"], + id: json["id"] == null ? null : json["id"], + name: json["name"] == null ? null : json["name"], + ); + + Map toJson() => { + "defaultClinic": defaultClinic == null ? null : defaultClinic, + "id": id == null ? null : id, + "name": name == null ? null : name, + }; +} + +class Role { + Role({ + this.name, + this.roleId, + }); + + final String? name; + final int? roleId; + + factory Role.fromJson(Map json) => Role( + name: json["name"] == null ? null : json["name"], + roleId: json["roleId"] == null ? null : json["roleId"], + ); + + Map toJson() => { + "name": name == null ? null : name, + "roleId": roleId == null ? null : roleId, + }; +} diff --git a/lib/model/login/member_login_model.dart b/lib/model/login/member_login_model.dart new file mode 100644 index 0000000..04eeb4d --- /dev/null +++ b/lib/model/login/member_login_model.dart @@ -0,0 +1,245 @@ +// To parse this JSON data, do +// +// final memberLoginModel = memberLoginModelFromJson(jsonString); + +import 'dart:convert'; + +MemberLoginModel memberLoginModelFromJson(String str) => MemberLoginModel.fromJson(json.decode(str)); + +String memberLoginModelToJson(MemberLoginModel data) => json.encode(data.toJson()); + +class MemberLoginModel { + MemberLoginModel({ + this.date, + this.languageId, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenId, + this.data, + this.dataw, + this.dietType, + this.dietTypeId, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iosLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.vidaUpdatedResponse, + this.doctorHaveOneClinic, + this.doctorId, + this.erpSessionId, + this.listConsentMember, + this.listConsentMemberNew, + this.listDoctorProfile, + this.listDoctorsClinic, + this.listMemberInformation, + this.listModelDbConnect, + this.logInTokenId, + this.mobileNumber, + this.selectDeviceImeIbyImeiList, + this.userId, + this.zipCode, + this.isActiveCode, + this.isSmsSent, + }); + + final dynamic date; + final int? languageId; + final int? serviceName; + final dynamic time; + final dynamic androidLink; + final dynamic authenticationTokenId; + final dynamic data; + final bool? dataw; + final int? dietType; + final int? dietTypeId; + final dynamic errorCode; + final dynamic errorEndUserMessage; + final dynamic errorEndUserMessageN; + final dynamic errorMessage; + final int? errorType; + final int? foodCategory; + final dynamic iosLink; + final bool? isAuthenticated; + final int? mealOrderStatus; + final int? mealType; + final int? messageStatus; + final int? numberOfResultRecords; + final dynamic patientBlodType; + final dynamic successMsg; + final dynamic successMsgN; + final dynamic vidaUpdatedResponse; + final bool? doctorHaveOneClinic; + final int? doctorId; + final dynamic erpSessionId; + final dynamic listConsentMember; + final dynamic listConsentMemberNew; + final dynamic listDoctorProfile; + final dynamic listDoctorsClinic; + final List? listMemberInformation; + final dynamic listModelDbConnect; + final String? logInTokenId; + final String? mobileNumber; + final dynamic selectDeviceImeIbyImeiList; + final int? userId; + final String? zipCode; + final bool? isActiveCode; + final bool? isSmsSent; + + factory MemberLoginModel.fromJson(Map json) => MemberLoginModel( + date: json["Date"], + languageId: json["LanguageID"] == null ? null : json["LanguageID"], + serviceName: json["ServiceName"] == null ? null : json["ServiceName"], + time: json["Time"], + androidLink: json["AndroidLink"], + authenticationTokenId: json["AuthenticationTokenID"], + data: json["Data"], + dataw: json["Dataw"] == null ? null : json["Dataw"], + dietType: json["DietType"] == null ? null : json["DietType"], + dietTypeId: json["DietTypeID"] == null ? null : json["DietTypeID"], + errorCode: json["ErrorCode"], + errorEndUserMessage: json["ErrorEndUserMessage"], + errorEndUserMessageN: json["ErrorEndUserMessageN"], + errorMessage: json["ErrorMessage"], + errorType: json["ErrorType"] == null ? null : json["ErrorType"], + foodCategory: json["FoodCategory"] == null ? null : json["FoodCategory"], + iosLink: json["IOSLink"], + isAuthenticated: json["IsAuthenticated"] == null ? null : json["IsAuthenticated"], + mealOrderStatus: json["MealOrderStatus"] == null ? null : json["MealOrderStatus"], + mealType: json["MealType"] == null ? null : json["MealType"], + messageStatus: json["MessageStatus"] == null ? null : json["MessageStatus"], + numberOfResultRecords: json["NumberOfResultRecords"] == null ? null : json["NumberOfResultRecords"], + patientBlodType: json["PatientBlodType"], + successMsg: json["SuccessMsg"], + successMsgN: json["SuccessMsgN"], + vidaUpdatedResponse: json["VidaUpdatedResponse"], + doctorHaveOneClinic: json["DoctorHaveOneClinic"] == null ? null : json["DoctorHaveOneClinic"], + doctorId: json["DoctorID"] == null ? null : json["DoctorID"], + erpSessionId: json["ERP_SessionID"], + listConsentMember: json["List_Consent_Member"], + listConsentMemberNew: json["List_Consent_MemberNew"], + listDoctorProfile: json["List_DoctorProfile"], + listDoctorsClinic: json["List_DoctorsClinic"], + listMemberInformation: json["List_MemberInformation"] == null ? null : List.from(json["List_MemberInformation"].map((x) => ListMemberInformation.fromJson(x))), + listModelDbConnect: json["List_Model_DB_Connect"], + logInTokenId: json["LogInTokenID"] == null ? null : json["LogInTokenID"], + mobileNumber: json["MobileNumber"] == null ? null : json["MobileNumber"], + selectDeviceImeIbyImeiList: json["SELECTDeviceIMEIbyIMEI_List"], + userId: json["UserID"] == null ? null : json["UserID"], + zipCode: json["ZipCode"] == null ? null : json["ZipCode"], + isActiveCode: json["isActiveCode"] == null ? null : json["isActiveCode"], + isSmsSent: json["isSMSSent"] == null ? null : json["isSMSSent"], + ); + + Map toJson() => { + "Date": date, + "LanguageID": languageId == null ? null : languageId, + "ServiceName": serviceName == null ? null : serviceName, + "Time": time, + "AndroidLink": androidLink, + "AuthenticationTokenID": authenticationTokenId, + "Data": data, + "Dataw": dataw == null ? null : dataw, + "DietType": dietType == null ? null : dietType, + "DietTypeID": dietTypeId == null ? null : dietTypeId, + "ErrorCode": errorCode, + "ErrorEndUserMessage": errorEndUserMessage, + "ErrorEndUserMessageN": errorEndUserMessageN, + "ErrorMessage": errorMessage, + "ErrorType": errorType == null ? null : errorType, + "FoodCategory": foodCategory == null ? null : foodCategory, + "IOSLink": iosLink, + "IsAuthenticated": isAuthenticated == null ? null : isAuthenticated, + "MealOrderStatus": mealOrderStatus == null ? null : mealOrderStatus, + "MealType": mealType == null ? null : mealType, + "MessageStatus": messageStatus == null ? null : messageStatus, + "NumberOfResultRecords": numberOfResultRecords == null ? null : numberOfResultRecords, + "PatientBlodType": patientBlodType, + "SuccessMsg": successMsg, + "SuccessMsgN": successMsgN, + "VidaUpdatedResponse": vidaUpdatedResponse, + "DoctorHaveOneClinic": doctorHaveOneClinic == null ? null : doctorHaveOneClinic, + "DoctorID": doctorId == null ? null : doctorId, + "ERP_SessionID": erpSessionId, + "List_Consent_Member": listConsentMember, + "List_Consent_MemberNew": listConsentMemberNew, + "List_DoctorProfile": listDoctorProfile, + "List_DoctorsClinic": listDoctorsClinic, + "List_MemberInformation": listMemberInformation == null ? null : List.from(listMemberInformation!.map((x) => x.toJson())), + "List_Model_DB_Connect": listModelDbConnect, + "LogInTokenID": logInTokenId == null ? null : logInTokenId, + "MobileNumber": mobileNumber == null ? null : mobileNumber, + "SELECTDeviceIMEIbyIMEI_List": selectDeviceImeIbyImeiList, + "UserID": userId == null ? null : userId, + "ZipCode": zipCode == null ? null : zipCode, + "isActiveCode": isActiveCode == null ? null : isActiveCode, + "isSMSSent": isSmsSent == null ? null : isSmsSent, + }; +} + +class ListMemberInformation { + ListMemberInformation({ + this.setupId, + this.memberId, + this.memberName, + this.memberNameN, + this.preferredLang, + this.pin, + this.saltHash, + this.referenceId, + this.employeeId, + this.roleId, + this.projectid, + }); + + final dynamic setupId; + final int? memberId; + final String? memberName; + final dynamic memberNameN; + final String? preferredLang; + final dynamic pin; + final dynamic saltHash; + final int? referenceId; + final int? employeeId; + final int? roleId; + final int? projectid; + + factory ListMemberInformation.fromJson(Map json) => ListMemberInformation( + setupId: json["SetupID"], + memberId: json["MemberID"] == null ? null : json["MemberID"], + memberName: json["MemberName"] == null ? null : json["MemberName"], + memberNameN: json["MemberNameN"], + preferredLang: json["PreferredLang"] == null ? null : json["PreferredLang"], + pin: json["PIN"], + saltHash: json["SaltHash"], + referenceId: json["ReferenceID"] == null ? null : json["ReferenceID"], + employeeId: json["EmployeeID"] == null ? null : json["EmployeeID"], + roleId: json["RoleID"] == null ? null : json["RoleID"], + projectid: json["projectid"] == null ? null : json["projectid"], + ); + + Map toJson() => { + "SetupID": setupId, + "MemberID": memberId == null ? null : memberId, + "MemberName": memberName == null ? null : memberName, + "MemberNameN": memberNameN, + "PreferredLang": preferredLang == null ? null : preferredLang, + "PIN": pin, + "SaltHash": saltHash, + "ReferenceID": referenceId == null ? null : referenceId, + "EmployeeID": employeeId == null ? null : employeeId, + "RoleID": roleId == null ? null : roleId, + "projectid": projectid == null ? null : projectid, + }; +} diff --git a/lib/provider/login_provider_model.dart b/lib/provider/login_provider_model.dart index ec9fb99..81ce17e 100644 --- a/lib/provider/login_provider_model.dart +++ b/lib/provider/login_provider_model.dart @@ -1,17 +1,107 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:hmg_nurses/classes/enums.dart'; +import 'package:hmg_nurses/classes/utils.dart'; +import 'package:hmg_nurses/config/routes.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/model/base/generic_response_model.dart'; +import 'package:hmg_nurses/model/login/imei_details_model.dart'; +import 'package:hmg_nurses/model/login/member_login_model.dart'; import 'package:hmg_nurses/model/login/project_info_model.dart'; import 'package:hmg_nurses/provider/base_vm.dart'; import 'package:hmg_nurses/services/api_repo/login_api_repo.dart'; +import 'package:hmg_nurses/widgets/dialogs/otp_dialog.dart'; import 'package:injector/injector.dart'; +import 'package:local_auth/auth_strings.dart'; +import 'package:local_auth/local_auth.dart'; class LoginProviderModel extends BaseViewModel { + //UI variables + late LocalAuthentication auth; + late bool isFaceBioAvailable, isFingerBioAvailable; + late List _availableBiometrics; + + //API's variables + late List assignedBranches; + final ILoginApiRepo _loginApiRepo = Injector.appInstance.get(); + LoginProviderModel() { setOnlyState(ViewState.hide); + checkBiosAvailblity(); } - final ILoginApiRepo _loginApiRepo = Injector.appInstance.get(); + checkBiosAvailblity() async { + auth = LocalAuthentication(); + await _getAvailableBiometrics(); + isFaceBioAvailable = checkBiometricIsAvailable(BiometricType.face); + isFingerBioAvailable = checkBiometricIsAvailable(BiometricType.fingerprint); + } - late List assignedBranches; + /// check specific biometric if it available or not + bool checkBiometricIsAvailable(BiometricType biometricType) { + bool isAvailable = false; + for (int i = 0; i < _availableBiometrics.length; i++) { + if (biometricType == _availableBiometrics[i]) { + isAvailable = true; + break; + } + } + return isAvailable; + } + + /// get all available biometric on the device for local Auth service + Future _getAvailableBiometrics() async { + try { + _availableBiometrics = await auth.getAvailableBiometrics(); + print(_availableBiometrics); + } on PlatformException catch (e) { + // AppToast.showErrorToast(message: e.message); + print("_getAvailableBiometrics"); + print(e); + } + } + + Future loginWithFaceIDAndBiometrics() async { + IOSAuthMessages iosStrings = + const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID'); + bool authenticated = false; + try { + authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, biometricOnly: true, iOSAuthStrings: iosStrings); + } on PlatformException catch (e) { + print(e); + Utils.hideLoading(); + Utils.showToast("Please enable your Touch or Face ID"); + } + return authenticated; + } + + int getLoginMethodId(AuthMethodTypes authMethodTypes) { + switch (authMethodTypes) { + case AuthMethodTypes.sms: + return 1; + case AuthMethodTypes.whatsApp: + return 2; + case AuthMethodTypes.fingerPrint: + return 3; + case AuthMethodTypes.faceID: + return 4; + default: + return 1; + } + } + + //API Calls + checkLastSession() async { + try { + Utils.showLoading(); + List deviceInfo = await _loginApiRepo.getDeviceInfoByIMEI(); + Utils.showToast(deviceInfo.length.toString()); + Utils.hideLoading(); + } catch (e) { + Utils.hideLoading(); + } + } getAssignedBranches(String userId) async { setState(ViewState.busy); @@ -19,4 +109,74 @@ class LoginProviderModel extends BaseViewModel { print(assignedBranches.length); setState(ViewState.idle); } + + performLogin(String userID, String password, int branchId) async { + try { + Utils.showLoading(); + MemberLoginModel memberLogin = await _loginApiRepo.memberLogin(userID, password, branchId); + // Utils.showToast(deviceInfo.length.toString()); + appState.setMemberBeforeLogin = memberLogin; + appState.projectID = branchId; + appState.logInTokenID = memberLogin.logInTokenId; + Utils.hideLoading(); + Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); + } catch (e) { + Utils.hideLoading(); + Utils.handleException(e, navigatorKey.currentContext!, (msg) { + Utils.confirmDialog(navigatorKey.currentContext!, msg); + }); + } + } + + Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType,bool isFromSilentLogin) async { + try { + Utils.showLoading(); + GenericResponseModel memberLogin = await _loginApiRepo.sendActivationCode(memberLoginModel, facilityID, sendOtpType); + // Utils.showToast(deviceInfo.length.toString()); + Utils.hideLoading(); + // Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); + + startSMSService(sendOtpType,isFromSilentLogin); + return memberLogin; + } catch (e) { + Utils.hideLoading(); + Utils.handleException(e, navigatorKey.currentContext!, (msg) { + Utils.confirmDialog(navigatorKey.currentContext!, msg); + }); + } + } + + Future checkActivationCode(String activationCode, int sendOtpType, bool isFromSilentLogin) async { + try { + Utils.showLoading(); + GenericResponseModel memberLogin = await _loginApiRepo.checkActivationCode(activationCode, sendOtpType, isFromSilentLogin); + + // Utils.showToast(deviceInfo.length.toString()); + _loginApiRepo.getDoctorProfile(); + Utils.hideLoading(); + + return memberLogin; + } catch (e) { + Utils.hideLoading(); + Utils.handleException(e, navigatorKey.currentContext!, (msg) { + Utils.confirmDialog(navigatorKey.currentContext!, msg); + }); + } + return null; + } + + startSMSService(int sendOtpType, bool isFromSilentLogin) { + OtpDialog( + type: sendOtpType, + mobileNo: appState.memberBeforeLogin!.mobileNumber, + onSuccess: (String otpCode, TextEditingController pinPut) { + Navigator.pop(navigatorKey.currentContext!); + Utils.showLoading(); + checkActivationCode(otpCode, sendOtpType, isFromSilentLogin); + Utils.hideLoading(); + }, + onFailure: () => Navigator.pop(navigatorKey.currentContext!), + onResendCode: () {}, + ).displayDialog(navigatorKey.currentContext!); + } } diff --git a/lib/services/api_repo/login_api_repo.dart b/lib/services/api_repo/login_api_repo.dart index 88b6d9a..cbaad24 100644 --- a/lib/services/api_repo/login_api_repo.dart +++ b/lib/services/api_repo/login_api_repo.dart @@ -1,5 +1,9 @@ +import 'dart:convert'; + import 'package:hmg_nurses/exceptions/api_exception.dart'; import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/model/base/generic_response_model2.dart'; +import 'package:hmg_nurses/model/login/member_login_model.dart'; import 'package:hmg_nurses/model/login/project_info_model.dart'; import 'package:hmg_nurses/services/api_client.dart'; import 'package:hmg_nurses/classes/consts.dart'; @@ -8,14 +12,18 @@ import 'package:hmg_nurses/model/login/imei_details_model.dart'; import 'package:hmg_nurses/services/firebase_service.dart'; import 'package:injector/injector.dart'; - - abstract class ILoginApiRepo { Future> getDeviceInfoByIMEI(); Future> getProjectInfo(String userId); - Future memberLogin(String userId, String password, int projectId); + Future memberLogin(String userId, String password, int projectId); + + Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType); + + Future checkActivationCode(String activationCode, int sendOtpType, bool isFromSilentLogin); + + getDoctorProfile(); } class LoginApiRepo implements ILoginApiRepo { @@ -26,6 +34,7 @@ class LoginApiRepo implements ILoginApiRepo { String url = "${ApiConsts.baseUrlServices}DoctorApplication.svc/REST/DoctorApp_GetDeviceDetailsByIMEI"; String token = await _firebaseService.getFirebaseToke(); logger.d("firebase_token: " + token); + appState.imei = token; Map postParams = {}; postParams.addAll(appState.postParamsJson); @@ -57,7 +66,7 @@ class LoginApiRepo implements ILoginApiRepo { } @override - Future memberLogin(String userId, String password, int projectId) async { + Future memberLogin(String userId, String password, int projectId) async { String url = "${ApiConsts.baseUrlServices}Sentry.svc/REST/MemberLogIN_New"; Map postParams = {}; @@ -65,12 +74,94 @@ class LoginApiRepo implements ILoginApiRepo { postParams["UserID"] = userId; postParams["Password"] = password; postParams["ProjectID"] = projectId; + MemberLoginModel response; + try { + response = await Injector.appInstance.get().postJsonForObject((json) => MemberLoginModel.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return response; + } + + @override + Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType) async { + String url = "${ApiConsts.baseUrlServices}DoctorApplication.svc/REST/SendActivationCodeForDoctorApp"; + Map postParams = {}; + + postParams.addAll(appState.postParamsJson); + postParams["MemberID"] = memberLoginModel.listMemberInformation!.first.memberId; + postParams["facilityId"] = facilityID; + postParams["OTP_SendType"] = sendOtpType.toString(); + postParams["LoginDoctorID"] = memberLoginModel.doctorId; + postParams["DoctorID"] = memberLoginModel.doctorId; + postParams["TokenID"] = appState.logInTokenID; + GenericResponseModel response; + print(jsonEncode(postParams)); + // return GenericResponseModel(); + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + appState.logInTokenID = response.logInTokenId.toString(); + } catch (e) { + rethrow; + } + return response; + } + + @override + Future checkActivationCode(String activationCode, int sendOtpType, bool isFromSilentLogin) async { + String url = "${ApiConsts.baseUrlServices}DoctorApplication.svc/REST/CheckActivationCodeForDoctorApp"; + Map postParams = {}; + MemberLoginModel memberLoginModel = appState.memberBeforeLogin ?? MemberLoginModel(); + postParams.addAll(appState.postParamsJson); + postParams["MobileNumber"] = memberLoginModel.mobileNumber; + postParams["ProjectID"] = appState.projectID; + postParams["LogInTokenID"] = appState.logInTokenID; + postParams["activationCode"] = activationCode; + postParams["OTP_SendType"] = sendOtpType; + postParams["facilityId"] = appState.projectID; + postParams["MemberID"] = appState.memberBeforeLogin!.listMemberInformation!.first.memberId; + postParams["Password"] = appState.password; + postParams["IsForSilentLogin"] = isFromSilentLogin; + postParams["LoginDoctorID"] = appState.memberBeforeLogin?.doctorId; + postParams["DoctorID"] = appState.memberBeforeLogin?.doctorId; + postParams["IMEI"] = appState.imei; + postParams["ZipCode"] = appState.memberBeforeLogin?.zipCode; + postParams["TokenID"] = appState.logInTokenID; + GenericResponseModel response; try { response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + appState.vidaAuthTokenID = response.vidaAuthTokenId; + appState.vidaRefreshTokenID = response.vidaRefreshTokenId; + appState.authenticationTokenID = response.authenticationTokenId; + appState.listDoctorsClinic = response.listDoctorsClinic; + appState.projectID = response.listDoctorsClinic!.first.projectId!; + appState.clinicId = response.listDoctorsClinic!.first.clinicId!; } catch (e) { rethrow; } return response; } + + @override + getDoctorProfile() async { + String url = "${ApiConsts.baseUrlServices}Doctors.svc/REST/GetDocProfiles"; + Map postParams = {}; + postParams.addAll(appState.postParamsJson); + postParams["ProjectID"] = appState.projectID; + postParams["ClinicID"] = appState.clinicId; + postParams["doctorID"] = appState.memberBeforeLogin!.doctorId; + postParams["IsRegistered"] = true; + postParams["License"] = true; + postParams["TokenID"] = appState.authenticationTokenID; + postParams["DoctorID"] = appState.memberBeforeLogin!.doctorId; + postParams["PatientOutSA"] = false; + + GenericResponseModel2 response; + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel2.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + } } diff --git a/lib/ui/login/login_method_page.dart b/lib/ui/login/login_method_page.dart index 224674e..a3cf133 100644 --- a/lib/ui/login/login_method_page.dart +++ b/lib/ui/login/login_method_page.dart @@ -3,13 +3,17 @@ import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/classes/enums.dart'; +import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/extensions/string_extensions.dart'; import 'package:hmg_nurses/extensions/util_extensions.dart'; import 'package:hmg_nurses/extensions/widget_extensions.dart'; import 'package:hmg_nurses/generated/locale_keys.g.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/provider/login_provider_model.dart'; import 'package:hmg_nurses/ui/login/login_vm.dart'; import 'package:hmg_nurses/ui/login/widgets/verification_method_card.dart'; import 'package:hmg_nurses/widgets/button/default_button.dart'; +import 'package:local_auth/local_auth.dart'; import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; @@ -31,10 +35,126 @@ class LoginMethodsPageState extends State { late AuthMethodTypes fingerPrintBefore; late AuthMethodTypes selectedOption; late LoginViewModel loginViewModel; + LoginType? loginType; + late LoginProviderModel loginProviderModel; @override Widget build(BuildContext context) { + if (loginType == null) { + loginType = ModalRoute.of(context)!.settings.arguments as LoginType; + } loginViewModel = context.read(); + loginProviderModel = context.read(); + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), + onPressed: () => Navigator.pop(context), + ), + // actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width], + ), + body: Container( + width: double.infinity, + height: double.infinity, + padding: const EdgeInsets.all(21), + child: Column( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.REGISTER_NEW_BIO) + Column( + children: [ + LocaleKeys.pleaseVerifyForBio.tr().toText14(), + 21.height, + ], + ), + if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.DIRECT_LOGIN) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: VerificationMethodsList( + authMethodType: AuthMethodTypes.faceID, + isBioAvailable: loginProviderModel.isFaceBioAvailable, + authenticateUser: (AuthMethodTypes authMethodType, isActive) async { + // loginViewModel.startSMSService(authMethodType, context: context); + // appState.setMemberBeforeLogin + bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); + if (isAuthenticated) { + if (loginType == LoginType.FROM_LOGIN) { + print("Authentacted"); + print(loginType); + loginType = LoginType.REGISTER_NEW_BIO; + setState(() {}); + } + } else { + print("Authentaction Failded"); + } + }, + ), + ), + 21.width, + Expanded( + child: VerificationMethodsList( + authMethodType: AuthMethodTypes.fingerPrint, + isBioAvailable: loginProviderModel.isFingerBioAvailable, + onShowMore: () async { + bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); + if (isAuthenticated) { + if (loginType == LoginType.FROM_LOGIN) { + print("Authentacted"); + print(loginType); + loginType = LoginType.REGISTER_NEW_BIO; + setState(() {}); + } + } else { + print("Authentaction Failded"); + } + }, + ), + ), + ], + ), + 21.height, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: VerificationMethodsList( + authMethodType: AuthMethodTypes.sms, + authenticateUser: (AuthMethodTypes authMethodType, isActive) { + // loginViewModel.startSMSService(authMethodType, context: context); + loginProviderModel.sendActivationCode( + appState.memberBeforeLogin!, + appState.projectID, + loginProviderModel.getLoginMethodId(AuthMethodTypes.sms), + false, + ); + }, + ), + ), + 21.width, + Expanded( + child: VerificationMethodsList( + authMethodType: AuthMethodTypes.whatsApp, + onShowMore: () { + setState(() { + isMoreOption = true; + }); + }, + ), + ), + ], + ), + ], + ), + ], + ), + ), + ); return Scaffold( appBar: AppBar( backgroundColor: Colors.transparent, @@ -55,16 +175,19 @@ class LoginMethodsPageState extends State { heightSpacer1per(), if (loginViewModel.isFromLogin) InkWell( - onTap: () { - loginViewModel.setUnverified(false, isFromLogin: false); - loginViewModel.setAppStatus(APPSTATUS.unAuthenticated); - }, - child: const Icon(Icons.arrow_back_ios, color: MyColors.darkTextColor)), + onTap: () { + // loginViewModel.setUnverified(false, isFromLogin: false); + // loginViewModel.setAppStatus(APPSTATUS.unAuthenticated); + }, + child: const Icon( + Icons.arrow_back_ios, + color: MyColors.darkTextColor, + ), + ), Column( children: [ heightSpacer1per(), - - isMoreOption != null && isMoreOption == false + isMoreOption == false ? Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.start, @@ -98,62 +221,13 @@ class LoginMethodsPageState extends State { "${loginViewModel.getType(1)}".toText11(isBold: true), ], ), - // child: RichText( - // text: TextSpan( - // text: "${LocaleKeys.verificationType.tr()} ", - // style: TextStyle( - // color: const Color(0xFF575757), - // fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - // fontFamily: 'Poppins', - // fontWeight: FontWeight.w600, - // letterSpacing: -0.4), - // children: [ - // TextSpan( - // text: loginViewModel.getType(1), - // style: TextStyle( - // color: MyColors.darkTextColor, - // fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - // fontFamily: 'Poppins', - // fontWeight: FontWeight.w600, - // letterSpacing: -0.48), - // ) - // ]), - // ), ), ], ), Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.end, - children: [ - "12 NOV, 2022".toText11(isBold: true), - heightSpacer06per(), - "09:56 AM".toText10() - // AppText( - // loginViewModel.user.editedOn != null - // ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(loginViewModel.user.editedOn), isMonthShort: true) - // : loginViewModel.user.createdOn != null - // ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(loginViewModel.user.createdOn), isMonthShort: true) - // : '--', - // textAlign: TextAlign.right, - // fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 4.5, - // color: Color(0xFF2E303A), - // fontWeight: FontWeight.w700, - // letterSpacing: -0.48, - // ), - // AppText( - // loginViewModel.user.editedOn != null - // ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(loginViewModel.user.editedOn)) - // : loginViewModel.user.createdOn != null - // ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(loginViewModel.user.createdOn)) - // : '--', - // textAlign: TextAlign.right, - // fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - // fontWeight: FontWeight.w600, - // letterSpacing: -0.48, - // color: Color(0xFF575757), - // ) - ], + children: ["12 NOV, 2022".toText11(isBold: true), heightSpacer06per(), "09:56 AM".toText10()], ) ], ), @@ -163,15 +237,18 @@ class LoginMethodsPageState extends State { heightSpacer2per(), ], ) - : Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.start, children: [ - LocaleKeys.pleaseVerifyForBio.tr().toText14().paddingAll(10), - ]), - isMoreOption != null && isMoreOption == false + : Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.pleaseVerifyForBio.tr().toText14().paddingAll(10), + ], + ), + isMoreOption == false ? Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: VerificationMethodsList( - loginViewModel: loginViewModel, authMethodType: SelectedAuthMethodTypesService.getMethodsTypeService(1), authenticateUser: (AuthMethodTypes authMethodType, isActive) { loginViewModel.startSMSService(authMethodType, context: context); @@ -180,7 +257,6 @@ class LoginMethodsPageState extends State { ), Expanded( child: VerificationMethodsList( - loginViewModel: loginViewModel, authMethodType: AuthMethodTypes.moreOptions, onShowMore: () { setState(() { @@ -197,7 +273,6 @@ class LoginMethodsPageState extends State { children: [ Expanded( child: VerificationMethodsList( - loginViewModel: loginViewModel, authMethodType: AuthMethodTypes.fingerPrint, authenticateUser: (AuthMethodTypes authMethodType, isActive) { loginViewModel.startSMSService(authMethodType, context: context); @@ -205,7 +280,6 @@ class LoginMethodsPageState extends State { )), Expanded( child: VerificationMethodsList( - loginViewModel: loginViewModel, authMethodType: AuthMethodTypes.faceID, authenticateUser: (AuthMethodTypes authMethodType, isActive) { loginViewModel.startSMSService(authMethodType, context: context); @@ -219,7 +293,6 @@ class LoginMethodsPageState extends State { children: [ Expanded( child: VerificationMethodsList( - loginViewModel: loginViewModel, authMethodType: AuthMethodTypes.sms, authenticateUser: (AuthMethodTypes authMethodType, isActive) { loginViewModel.startSMSService(authMethodType, context: context); @@ -227,7 +300,6 @@ class LoginMethodsPageState extends State { )), Expanded( child: VerificationMethodsList( - loginViewModel: loginViewModel, authMethodType: AuthMethodTypes.whatsApp, authenticateUser: (AuthMethodTypes authMethodType, isActive) { loginViewModel.startSMSService(authMethodType, context: context); diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index ae5d7a7..ebe86f2 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -1,5 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/classes/enums.dart'; import 'package:hmg_nurses/classes/utils.dart'; @@ -8,13 +9,16 @@ import 'package:hmg_nurses/extensions/string_extensions.dart'; import 'package:hmg_nurses/extensions/widget_extensions.dart'; import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/generated/locale_keys.g.dart'; +import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/model/login/imei_details_model.dart'; +import 'package:hmg_nurses/model/login/member_login_model.dart'; import 'package:hmg_nurses/model/login/project_info_model.dart'; import 'package:hmg_nurses/provider/login_provider_model.dart'; import 'package:hmg_nurses/widgets/button/default_button.dart'; import 'package:hmg_nurses/widgets/cupertino_picker.dart'; import 'package:hmg_nurses/widgets/input_widget.dart'; import 'package:injector/injector.dart'; +import 'package:local_auth/local_auth.dart'; import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; @@ -28,130 +32,122 @@ class LoginPage extends StatefulWidget { } class _LoginPageState extends State { - final ILoginApiRepo _loginApiRepo = Injector.appInstance.get(); - - int branchID=0; + int branchID = 0; + late LoginProviderModel provider; final loginFormKey = GlobalKey(); var projectIdController = TextEditingController(); var userIdController = TextEditingController(); var passwordController = TextEditingController(); - FocusNode projectIdFocusNode = FocusNode(); - FocusNode userIdFocusNode = FocusNode(); - FocusNode passwordIdFocusNode = FocusNode(); @override void initState() { super.initState(); - checkLastSession(); - } - - checkLastSession() async { - try { - Utils.showLoading(); - List deviceInfo = await _loginApiRepo.getDeviceInfoByIMEI(); - Utils.showToast(deviceInfo.length.toString()); - Utils.showLoading(); - } catch (e) {} + provider = Provider.of(navigatorKey.currentContext!); + provider.checkLastSession(); } @override Widget build(BuildContext context) { - final provider = Provider.of(context); return Scaffold( body: SafeArea( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.welcomeTo.tr().toText14(color: MyColors.blackColor), - LocaleKeys.drSulaiman.tr().toText20(isBold: true, color: MyColors.blackColor), - "Nurses App".toText16(color: MyColors.redColor), - ], - ), - ), - SizedBox(height: 4.h), - Form( - key: loginFormKey, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 8.w), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - buildSpacer20h(), - CustomTextField( - LocaleKeys.userID.tr(), - userIdController, - isEnableBorder: true, - ), - buildSpacer20h(), - CustomTextField( - LocaleKeys.password.tr(), - passwordController, - isTextIsPassword: true, - onChange: (v) { - if (v.length > 0) { - provider.getAssignedBranches(userIdController.text); - } - }, - ), - buildSpacer20h(), - Consumer( - builder: (_, data, w) { - return data.state == ViewState.hide - ? Container() - : data.state == ViewState.busy - ? const Center(child: CircularProgressIndicator()) - : CustomTextField( - LocaleKeys.branch.tr(), - projectIdController, - hasSelection: true, - isEnable: false, - onClick: () => CustomCupertinoPicker.showCupertinoPicker( - context, - provider.assignedBranches, - (index) { - projectIdController.text=provider.assignedBranches[index].facilityName!; - branchID=provider.assignedBranches[index].facilityId as int; - print(branchID); - provider.notifyListeners(); - }, - ), - ); - }, + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: SizedBox( + height: MediaQuery.of(context).size.height / 1.2, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.welcomeTo.tr().toText14(color: MyColors.blackColor), + LocaleKeys.drSulaiman.tr().toText20(isBold: true, color: MyColors.blackColor), + "Nurses App".toText16(color: MyColors.redColor), + ], + ), + ), + Expanded( + flex: 3, + child: Form( + key: loginFormKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextField( + LocaleKeys.userID.tr(), + userIdController, + isEnableBorder: true, + isInputTypeNum: true, + ), + 16.height, + CustomTextField( + LocaleKeys.password.tr(), + passwordController, + isTextIsPassword: true, + onChange: (v) { + if (v.length == 1) { + provider.getAssignedBranches(userIdController.text); + } + }, + ), + 16.height, + Consumer( + builder: (_, data, w) { + // if (data.state == ViewState.idle && provider.assignedBranches.isNotEmpty) { + // projectIdController.text = provider.assignedBranches.first.facilityName!; + // branchID = provider.assignedBranches.first.facilityId as int; + // print(branchID); + // provider.notifyListeners(); + // } + return data.state == ViewState.hide + ? Container() + : data.state == ViewState.busy + ? const Center(child: CircularProgressIndicator()) + : CustomTextField( + LocaleKeys.branch.tr(), + projectIdController, + hasSelection: true, + isEnable: false, + onClick: () => CustomCupertinoPicker.showCupertinoPicker( + context, + provider.assignedBranches, + (index) { + projectIdController.text = provider.assignedBranches[index].facilityName!; + branchID = provider.assignedBranches[index].facilityId as int; + provider.notifyListeners(); + }, + ), + ); + }, + ), + ], + ), + ), + ), + ], ), - buildSpacer20h(), - SizedBox( - height: 12.h, - ), - ]), + ), ), ), - ], - ), - ), - bottomSheet: Container( - height: 12.h, - color: MyColors.backgroundColor, - width: double.infinity, - child: Center( - child: FractionallySizedBox( - widthFactor: 0.89, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 4.w), - child: DefaultButton(LocaleKeys.login.tr(), () { - Navigator.pushNamed(context, AppRoutes.loginMethodsPage); - }, colors: const [MyColors.redColor, MyColors.redColor]), - ), - heightSpacer3per(), + 21.height, + DefaultButton( + LocaleKeys.login.tr(), + () async { + appState.password = passwordController.text; + provider.performLogin(userIdController.text, passwordController.text, branchID); + }, + colors: const [ + MyColors.redColor, + MyColors.redColor, ], ), - ), - ), + ], + ).paddingAll(21), ), ); } diff --git a/lib/ui/login/login_vm.dart b/lib/ui/login/login_vm.dart index 27b1e7e..4003b2d 100644 --- a/lib/ui/login/login_vm.dart +++ b/lib/ui/login/login_vm.dart @@ -15,7 +15,6 @@ class LoginViewModel extends BaseViewModel { bool isLogin = false; bool unverified = false; bool isFromLogin = false; - APPSTATUS appStatus = APPSTATUS.loading; String localToken = ""; String nurseProfile = ""; @@ -26,7 +25,7 @@ class LoginViewModel extends BaseViewModel { LoginViewModel(); /// get type name based on id. - getType(type) { + String getType(type) { switch (type) { case 1: return LocaleKeys.sms.tr(); @@ -41,6 +40,20 @@ class LoginViewModel extends BaseViewModel { } } + int getLoginMethodId(AuthMethodTypes authMethodTypes) { + switch (authMethodTypes) { + case AuthMethodTypes.sms: + return 1; + case AuthMethodTypes.whatsApp: + return 2; + case AuthMethodTypes.fingerPrint: + return 3; + case AuthMethodTypes.faceID: + return 4; + default: + return 1; + } + } /// ask user to add his biometric showIOSAuthMessages() async { try { @@ -77,28 +90,7 @@ class LoginViewModel extends BaseViewModel { } } - /// determine the status of the app - APPSTATUS get status { - if (state == ViewState.busy) { - appStatus = APPSTATUS.loading; - } else { - if (nurseProfile != null) { - appStatus = APPSTATUS.authenticated; - } else if (unverified) { - appStatus = APPSTATUS.unverified; - } else if (isLogin) { - appStatus = APPSTATUS.authenticated; - } else { - appStatus = APPSTATUS.unAuthenticated; - } - } - return appStatus; - } - - setAppStatus(APPSTATUS status) { - appStatus = status; - notifyListeners(); - } + /// determine the status of the ap setUnverified(bool unverified, {bool isFromLogin = false}) { this.unverified = unverified; @@ -129,7 +121,7 @@ class LoginViewModel extends BaseViewModel { startSMSService(AuthMethodTypes type, {isSilentLogin = false, required BuildContext context}) { OtpDialog( type: 1, - mobileNo: 0504278212, + mobileNo: "0504278212", onSuccess: (String otpCode, TextEditingController pinPut) { Utils.showLoading(); //TODO: API CALL diff --git a/lib/ui/login/widgets/verification_method_card.dart b/lib/ui/login/widgets/verification_method_card.dart index 09a7bb5..0199585 100644 --- a/lib/ui/login/widgets/verification_method_card.dart +++ b/lib/ui/login/widgets/verification_method_card.dart @@ -9,58 +9,62 @@ import 'package:hmg_nurses/generated/locale_keys.g.dart'; import 'package:hmg_nurses/ui/login/login_vm.dart'; import 'package:local_auth/local_auth.dart'; -class VerificationMethodsList extends StatefulWidget { +class VerificationMethodsList extends StatelessWidget { final AuthMethodTypes authMethodType; final Function(AuthMethodTypes type, bool isActive)? authenticateUser; final Function? onShowMore; - final LoginViewModel loginViewModel; + final bool isBioAvailable; - const VerificationMethodsList({Key? key, required this.authMethodType, this.authenticateUser, this.onShowMore, required this.loginViewModel}) : super(key: key); - - @override - VerificationMethodsListState createState() => VerificationMethodsListState(); -} - -class VerificationMethodsListState extends State { - final LocalAuthentication auth = LocalAuthentication(); + const VerificationMethodsList({ + Key? key, + required this.authMethodType, + this.authenticateUser, + this.onShowMore, + this.isBioAvailable = true, + }) : super(key: key); @override Widget build(BuildContext context) { - switch (widget.authMethodType) { + switch (authMethodType) { case AuthMethodTypes.whatsApp: return MethodTypeCard( assetPath: 'assets/images/login/verify_whatsapp.svg', - onTap: () => {widget.authenticateUser!(AuthMethodTypes.whatsApp, true)}, + onTap: () => {authenticateUser!(AuthMethodTypes.whatsApp, true)}, label: LocaleKeys.verifyThroughWhatsapp.tr(), + isBioAvailable: isBioAvailable, ); case AuthMethodTypes.sms: return MethodTypeCard( assetPath: "assets/images/login/verify_sms.svg", - onTap: () => {widget.authenticateUser!(AuthMethodTypes.sms, true)}, + onTap: () => {authenticateUser!(AuthMethodTypes.sms, true)}, label: LocaleKeys.verifyThroughSMS.tr(), + isBioAvailable: isBioAvailable, ); case AuthMethodTypes.fingerPrint: return MethodTypeCard( assetPath: 'assets/images/login/verify_thumb.svg', - onTap: () => {widget.authenticateUser!(AuthMethodTypes.fingerPrint, true)}, + onTap: () => {authenticateUser!(AuthMethodTypes.fingerPrint, true)}, label: LocaleKeys.verifyThroughFingerprint.tr(), + isBioAvailable: isBioAvailable, ); case AuthMethodTypes.faceID: return MethodTypeCard( assetPath: 'assets/images/login/verify_face.svg', - onTap: () => {widget.authenticateUser!(AuthMethodTypes.faceID, true)}, + onTap: () => {authenticateUser!(AuthMethodTypes.faceID, true)}, label: LocaleKeys.verifyThroughFace.tr(), + isBioAvailable: isBioAvailable, ); default: return MethodTypeCard( assetPath: 'assets/images/login/more_icon.png', onTap: () { - widget.onShowMore!(); + onShowMore!(); }, isSvg: false, label: LocaleKeys.moreVerificationOpts.tr(), height: 0, + isBioAvailable: isBioAvailable, ); } } @@ -74,12 +78,14 @@ class MethodTypeCard extends StatelessWidget { required this.label, this.height = 20, this.isSvg = true, + required this.isBioAvailable, }) : super(key: key); final String assetPath; final GestureTapCallback onTap; final String label; final double height; final bool isSvg; + final bool isBioAvailable; @override Widget build(BuildContext context) { @@ -92,44 +98,44 @@ class MethodTypeCard extends StatelessWidget { return InkWell( onTap: onTap, child: Container( - margin: const EdgeInsets.all(10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(10)), - border: Border.all(color: HexColor('#707070'), width: 0.1), - ), - height: cardHeight, - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - isSvg - ? SvgPicture.asset(assetPath, width: SizeConfig.widthMultiplier! * (14), height: cardHeight * 0.20) - : Image.asset( - assetPath, - width: SizeConfig.widthMultiplier! * (12), - height: cardHeight * 0.35, - // height: , - ), - SizedBox( - height: height, + decoration: BoxDecoration( + color: isBioAvailable ? Colors.white : Colors.grey[400], + borderRadius: const BorderRadius.all(Radius.circular(10)), + border: Border.all(color: HexColor('#707070'), width: 0.1), + ), + height: cardHeight, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + isSvg + ? SvgPicture.asset(assetPath, width: SizeConfig.widthMultiplier! * (14), height: cardHeight * 0.20) + : Image.asset( + assetPath, + width: SizeConfig.widthMultiplier! * (12), + height: cardHeight * 0.35, + // height: , + ), + SizedBox( + height: height, + ), + Text( + label, + style: TextStyle( + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * (SizeConfig.isHeightVeryShort ? 3 : 3.7), + color: MyColors.darkTextColor, + fontWeight: FontWeight.w600, + letterSpacing: -0.48, ), - Text( - label, - style: TextStyle( - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * (SizeConfig.isHeightVeryShort ? 3 : 3.7), - color: MyColors.darkTextColor, - fontWeight: FontWeight.w600, - letterSpacing: -0.48, - ), - ) - ], - ), + ) + ], ), - )), + ), + ), + ), ); } } diff --git a/lib/widgets/cupertino_picker.dart b/lib/widgets/cupertino_picker.dart index ad0a16f..8cd48f8 100644 --- a/lib/widgets/cupertino_picker.dart +++ b/lib/widgets/cupertino_picker.dart @@ -44,14 +44,14 @@ class CustomCupertinoPicker { mainAxisAlignment: MainAxisAlignment.end, children: [ CupertinoButton( - child: Text(LocaleKeys.userID.tr(), style: textStyle(context)), + child: Text(LocaleKeys.cancel.tr(), style: textStyle(context)), onPressed: () { Navigator.pop(context); }, ), CupertinoButton( child: Text( - LocaleKeys.userID.tr(), + LocaleKeys.select.tr(), style: textStyle(context), ), onPressed: () { diff --git a/lib/widgets/dialogs/otp_dialog.dart b/lib/widgets/dialogs/otp_dialog.dart index 324ff70..873fad8 100644 --- a/lib/widgets/dialogs/otp_dialog.dart +++ b/lib/widgets/dialogs/otp_dialog.dart @@ -14,7 +14,7 @@ final ValueNotifier otpFieldClear = ValueNotifier(""); class OtpDialog { final int type; - final int? mobileNo; + final String? mobileNo; final Function(String, TextEditingController _pinPutController) onSuccess; final Function onFailure; final Function onResendCode; @@ -78,10 +78,10 @@ class OtpDialog { type == 1 ? "assets/images/login/verify_sms.svg" : type == 2 - ? "assets/images/login/verify_whatsapp.svg" - : type == 3 - ? "assets/images/login/verify_face.svg" - : 'assets/images/login/verify_thumb.svg', + ? "assets/images/login/verify_whatsapp.svg" + : type == 3 + ? "assets/images/login/verify_face.svg" + : 'assets/images/login/verify_thumb.svg', height: 50, width: 50, ), @@ -118,33 +118,34 @@ class OtpDialog { 10.height, stopTimer ? Row( - children: [ - Expanded( - child: LocaleKeys.codeExpire.tr().toText16( - color: MyColors.redColor, - ), - ), - 12.width, - Image.asset( - "assets/icons/ic_alarm.png", - width: 20, - height: 20, - color: MyColors.redColor, - ), - ], - ) + children: [ + Expanded( + child: LocaleKeys.codeExpire.tr().toText16( + color: MyColors.redColor, + maxlines: 1, + ), + ), + 12.width, + Image.asset( + "assets/icons/ic_alarm.png", + width: 20, + height: 20, + color: MyColors.redColor, + ), + ], + ) : RichText( - text: TextSpan( - text: '${LocaleKeys.theVerificationCodeWillExpireIn.tr()}\n', - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48), - children: [ - TextSpan( - text: displayTime, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48), + text: TextSpan( + text: '${LocaleKeys.theVerificationCodeWillExpireIn.tr()}\n', + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48), + children: [ + TextSpan( + text: displayTime, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48), + ), + ], + ), ), - ], - ), - ), ], ); }, @@ -153,7 +154,7 @@ class OtpDialog { 18.height, DefaultButton( stopTimer ? LocaleKeys.resend.tr() : LocaleKeys.cancel.tr(), - () async { + () async { if (stopTimer) { hideSMSBox(context); onResendCode(); @@ -166,9 +167,9 @@ class OtpDialog { colors: stopTimer ? null : [ - MyColors.redColor, - MyColors.redColor, - ], + MyColors.redColor, + MyColors.redColor, + ], ), ], ), @@ -215,7 +216,7 @@ class OtpDialog { void startTimer(setState) { remainingTime--; if (stopTimer) return; - setState(() { + setState(() { displayTime = getSecondsAsDigitalClock(remainingTime); }); @@ -249,4 +250,4 @@ class OtpDialog { // // return null; // // } // } -} \ No newline at end of file +} diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index 1a38198..9674e28 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -19,6 +19,8 @@ class CustomTextField extends StatefulWidget { final double verticalPadding; final double horizontalPadding; final Function(String)? onChange; + final Function()? onEditComplete; + final Function(String)? onSubmit; final Function? onClick; final FocusNode? focusNode; @@ -34,6 +36,8 @@ class CustomTextField extends StatefulWidget { this.isEnableBorder = true, this.lines = 1, this.onChange, + this.onEditComplete, + this.onSubmit, this.onClick, this.isInputTypeNum = false, this.isBackgroundEnable = false, @@ -48,10 +52,12 @@ class CustomTextField extends StatefulWidget { class CustomTextFieldState extends State { late bool isObscureText; + late FocusNode focusNode; @override void initState() { super.initState(); + focusNode = FocusNode(); isObscureText = widget.isTextIsPassword; } @@ -62,24 +68,20 @@ class CustomTextFieldState extends State { @override Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.only(left: widget.horizontalPadding, right: widget.horizontalPadding, bottom: widget.verticalPadding, top: widget.verticalPadding), - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - color: widget.isBackgroundEnable ? const Color(0xffF7F7F7) : Colors.white, - border: Border.all(color: widget.isEnableBorder ? Colors.grey.shade300 : Colors.transparent, width: 1), - ), - child: InkWell( - onTap: widget.hasSelection - ? () { - widget.onClick!(); - } - : () { - if (widget.focusNode != null) { - widget.focusNode?.requestFocus(); - } - }, + return InkWell( + onTap: () { + focusNode.requestFocus(); + if(widget.hasSelection) + widget.onClick!(); + }, + child: Container( + padding: EdgeInsets.only(left: widget.horizontalPadding, right: widget.horizontalPadding, bottom: widget.verticalPadding, top: widget.verticalPadding), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: widget.isBackgroundEnable ? const Color(0xffF7F7F7) : Colors.white, + border: Border.all(color: widget.isEnableBorder ? Colors.grey.shade300 : Colors.transparent, width: 1), + ), child: Row( children: [ Expanded( @@ -98,7 +100,7 @@ class CustomTextFieldState extends State { ), ), TextField( - focusNode: widget.focusNode, + focusNode: focusNode, autofocus: false, enabled: widget.isEnable, scrollPadding: EdgeInsets.zero, @@ -108,6 +110,8 @@ class CustomTextFieldState extends State { obscuringCharacter: "*", obscureText: isObscureText, onChanged: widget.onChange, + onEditingComplete: widget.onEditComplete, + onSubmitted: widget.onSubmit, style: const TextStyle( fontSize: 14, height: 21 / 14, diff --git a/pubspec.lock b/pubspec.lock index 0d40ef3..2d0e2f0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -265,35 +265,7 @@ packages: name: local_auth url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" - local_auth_android: - dependency: transitive - description: - name: local_auth_android - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.15" - local_auth_ios: - dependency: transitive - description: - name: local_auth_ios - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.10" - local_auth_platform_interface: - dependency: transitive - description: - name: local_auth_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - local_auth_windows: - dependency: transitive - description: - name: local_auth_windows - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" + version: "1.1.11" logger: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 7a5bf24..44449e8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -49,7 +49,7 @@ dependencies: auto_size_text: ^3.0.0 shimmer: ^2.0.0 sizer: ^2.0.15 - local_auth: ^2.1.2 + local_auth: ^1.1.9 # get_it: ^7.2.0 hexcolor: ^2.0.4 @@ -87,6 +87,7 @@ flutter: - assets/langs/ - assets/images/login/ - assets/images/patient/ + - assets/images/ From 4eb6faf4156ecf8005e6371ddc3cc30a711867d8 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Mon, 28 Nov 2022 16:00:20 +0300 Subject: [PATCH 7/9] Silent Login --- assets/langs/ar-SA.json | 16 +- assets/langs/en-US.json | 7 +- lib/classes/consts.dart | 24 +- lib/classes/date-utils.dart | 415 ++++++++++++++++++ lib/classes/enums.dart | 2 +- lib/classes/utils.dart | 58 ++- lib/config/app_state.dart | 14 +- lib/config/dependencies.dart | 2 + lib/config/routes.dart | 11 +- lib/generated/codegen_loader.g.dart | 14 +- lib/main.dart | 3 + lib/model/base/generic_response_model.dart | 2 +- lib/model/base/post_params_model.dart | 78 ++-- lib/model/login/doctor_profile_model.dart | 188 ++++---- lib/model/login/member_login_model.dart | 234 +++++----- lib/provider/dashboard_provider_model.dart | 33 +- lib/provider/login_provider_model.dart | 91 +++- lib/services/api_repo/dashboard_api_repo.dart | 121 +++++ lib/services/api_repo/login_api_client.dart | 27 -- lib/services/api_repo/login_api_repo.dart | 66 +-- lib/ui/dashboard/dashbaord_page.dart | 26 ++ lib/ui/login/login_method_page.dart | 119 ++++- lib/ui/login/login_page.dart | 14 +- 23 files changed, 1182 insertions(+), 383 deletions(-) create mode 100644 lib/classes/date-utils.dart create mode 100644 lib/services/api_repo/dashboard_api_repo.dart delete mode 100644 lib/services/api_repo/login_api_client.dart create mode 100644 lib/ui/dashboard/dashbaord_page.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 54cb4c6..6a108e7 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -5,9 +5,9 @@ "login": "تسجيل الدخول", "drSulaiman": "سليمان الحبيب", "welcomeTo": "مرحبا بك في", - "userID" : "معرف المستخدم", - "password" : "كلمة المرور", - "branch" : "فرع", + "userID": "معرف المستخدم", + "password": "كلمة المرور", + "branch": "فرع", "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", "username": "اسم المستخدم", "welcomeBack": "مرحبا بعودتك", @@ -47,7 +47,11 @@ "verification": "تَحَقّق", "resend": "إعادة إرسال", "codeExpire": "انتهت صلاحية رمز التحقق", - "moreVerificationOpts" :"المزيد من خيارات التحقق", - "select": "Select" - + "moreVerificationOpts": "المزيد من خيارات التحقق", + "select": "Select", + "days": "أيام", + "hr": "س", + "min": "د", + "years": "سنة", + "months": "أشهر" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 930c02a..1a15855 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -48,5 +48,10 @@ "resend": "Resend", "codeExpire": "The verification code has been expired", "moreVerificationOpts" :"More verification options", - "select": "Select" + "select": "Select", + "days": "Days", + "hr": "Hr", + "min": "Min", + "years": "Years", + "months": "Months" } \ No newline at end of file diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 30f160e..93e419c 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,10 +1,9 @@ class ApiConsts { - static const MAX_SMALL_SCREEN = 660; - //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = 'https://hmgwebservices.com/'; + static String baseUrl = 'https://hmgwebservices.com/'; + // static String baseUrl = 'https://uat.hmgwebservices.com/'; static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server @@ -27,14 +26,15 @@ class ApiConsts { class SharedPrefsConsts { static String isRememberMe = "remember_me"; - static String username = "username"; + static String username = "doctorId"; static String password = "password"; - static String privilegeList = "privilegeList"; - static String firebaseToken = "firebaseToken"; - static String memberInformation = "memberInformation"; - static String welcomeVideoUrl = "welcomeVideoUrl"; - static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; - static String mohemmWifiSSID = "mohemmWifiSSID"; - static String mohemmWifiPassword = "mohemmWifiPassword"; - static String editItemForSale = "editItemForSale"; + static String logInTokenID = "logInTokenID"; + static String vidaAuthTokenID = "vidaAuthTokenID"; + static String vidaRefreshTokenID = "vidaRefreshTokenID"; + static String authenticationTokenID = "authenticationTokenID"; + static String projectID = "projectID"; + static String clinicId = "clinicId"; + static String lastLoginDate = "lastLoginDate"; + static String lastLoginTime = "lastLoginTime"; + static String memberModel = "memberModel"; } diff --git a/lib/classes/date-utils.dart b/lib/classes/date-utils.dart new file mode 100644 index 0000000..fe55d6c --- /dev/null +++ b/lib/classes/date-utils.dart @@ -0,0 +1,415 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:hmg_nurses/generated/locale_keys.g.dart'; +import 'package:intl/intl.dart'; + +class AppDateUtils { + static String convertDateToFormat(DateTime dateTime, String dateFormat) { + return DateFormat(dateFormat).format(dateTime); + } + + static DateTime convertISOStringToDateTime(String date) { + DateTime newDate; + + newDate = DateTime.parse(date); + + return newDate; + } + + static String convertStringToDateFormat(String date, String dateFormat) { + DateTime dateTime; + if (date.contains("/Date")) + dateTime = getDateTimeFromServerFormat(date); + else + dateTime = DateTime.parse(date); + return convertDateToFormat(dateTime, dateFormat); + } + + static String convertToServerFormat(String date, String dateFormat) { + return '/Date(${DateFormat(dateFormat).parse(date).millisecondsSinceEpoch})/'; + } + + static String convertDateToServerFormat(DateTime date) { + return '/Date(${date.millisecondsSinceEpoch})/'; + } + + static convertDateFromServerFormat(String str, dateFormat) { + var date = getDateTimeFromServerFormat(str); + + return DateFormat(dateFormat).format(date); + } + + static DateTime getDateTimeFromServerFormat(String str) { + DateTime date = DateTime.now(); + if (str != null) { + const start = "/Date("; + + const end = "+0300)"; + if (str.contains("/Date")) { + final startIndex = str.indexOf(start); + + final endIndex = str.indexOf(end, startIndex + start.length); + + date = new DateTime.fromMillisecondsSinceEpoch(int.parse(str.substring(startIndex + start.length, endIndex))); + } else { + date = DateTime.now(); + } + } else { + date = DateTime.parse(str); + } + + return date; + } + + static String differenceBetweenDateAndCurrentInYearMonthDay(DateTime firstDate, BuildContext context) { + DateTime now = DateTime.now(); + // now = now.add(Duration(days: 400, minutes: 0)); + var difference = firstDate.difference(now); + + int years = now.year - firstDate.year; + int months = now.month - firstDate.month; + int days = now.day - firstDate.day; + + if (months < 0 || (months == 0 && days < 0)) { + years--; + months += (days < 0 ? 11 : 12); + } + if (days < 0) { + final monthAgo = new DateTime(now.year, now.month - 1, firstDate.day); + days = now.difference(monthAgo).inDays + 1; + } + return "$days ${LocaleKeys.days.tr()}, $months ${LocaleKeys.months.tr()}, $years ${LocaleKeys.years.tr()}"; + } + + static String differenceBetweenDateAndCurrent(DateTime firstDate, BuildContext context, {bool isShowSecond = false, bool isShowDays = true}) { + DateTime now = DateTime.now(); + var difference = now.difference(firstDate); + + int minutesInDays = difference.inMinutes; + int secondInDays = difference.inSeconds; + int hoursInDays = minutesInDays ~/ 60; // ~/ : truncating division to make the result int + int second = secondInDays % 60; + int minutes = minutesInDays % 60; + int days = hoursInDays ~/ 24; + int hours = hoursInDays % 24; + + double hoursInOneDay = difference.inHours / difference.inDays; + + return (isShowDays ? (days > 0 ? "$days ${LocaleKeys.days.tr()}," : '') : "") + + (hours > 0 ? "$hours ${LocaleKeys.hr.tr()}," : "") + + " $minutes ${LocaleKeys.min.tr()}" + + (isShowSecond ? ", $second Sec" : ""); + } + + static String differenceBetweenServerDateAndCurrent(String str, BuildContext context) { + const start = "/Date("; + + const end = "+0300)"; + + final startIndex = str.indexOf(start); + + final endIndex = str.indexOf(end, startIndex + start.length); + + var date = new DateTime.fromMillisecondsSinceEpoch(int.parse(str.substring(startIndex + start.length, endIndex))); + return differenceBetweenDateAndCurrent(date, context); + } + + /// get month by + /// [weekDay] convert week day in int to week day name + static getWeekDay(int weekDay) { + switch (weekDay) { + case 1: + return "Monday"; + case 2: + return "Tuesday"; + case 3: + return "Wednesday"; + case 4: + return "Thursday"; + case 5: + return "Friday"; + case 6: + return "Saturday "; + case 7: + return "Sunday"; + } + } + + /// get month by + /// [weekDay] convert week day in int to week day name arabic + static getWeekDayArabic(int weekDay) { + switch (weekDay) { + case 1: + return "الاثنين"; + case 2: + return "الثلاثاء"; + case 3: + return "الاربعاء"; + case 4: + return "الخميس"; + case 5: + return "الجمعه"; + case 6: + return "السبت "; + case 7: + return "الاحد"; + } + } + + /// get month by + /// [month] convert month number in to month name + static getMonth(int month) { + switch (month) { + case 1: + return "January"; + case 2: + return "February"; + case 3: + return "March"; + case 4: + return "April"; + case 5: + return "May"; + case 6: + return "June"; + case 7: + return "July"; + case 8: + return "August"; + case 9: + return "September"; + case 10: + return "October"; + case 11: + return "November"; + case 12: + return "December"; + } + } + + /// get month by + /// [month] convert month number in to month name in Arabic + static getMonthArabic(int month) { + switch (month) { + case 1: + return "يناير"; + case 2: + return " فبراير"; + case 3: + return "مارس"; + case 4: + return "أبريل"; + case 5: + return "مايو"; + case 6: + return "يونيو"; + case 7: + return "يوليو"; + case 8: + return "أغسطس"; + case 9: + return "سبتمبر"; + case 10: + return " اكتوبر"; + case 11: + return " نوفمبر"; + case 12: + return "ديسمبر"; + } + } + + static getMonthByName(String month) { + switch (month.toLowerCase()) { + case 'january': + return 1; + case 'february': + return 2; + case 'march': + return 3; + case 'april': + return 4; + case 'may': + return 5; + case 'june': + return 6; + case 'july': + return 7; + case 'august': + return 8; + case 'september': + return 9; + case 'october': + return 10; + case 'november': + return 11; + case 'december': + return 12; + } + } + + static DateTime convertStringToDate(String date) { + // /Date(1585774800000+0300)/ + + if (date != null) { + const start = "/Date("; + const end = "+0300)"; + final startIndex = date.indexOf(start); + final endIndex = date.indexOf(end, startIndex + start.length); + DateTime newDate = DateTime.fromMillisecondsSinceEpoch( + int.parse( + date.substring(startIndex + start.length, endIndex), + ), + ); + return newDate; + } else + return DateTime.now(); + } + + /// get data formatted like Apr 26,2020 + /// [dateTime] convert DateTime to data formatted Arabic + static String getMonthDayYearDateFormattedAr(DateTime dateTime) { + if (dateTime != null) + return getMonthArabic(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString(); + else + return ""; + } + + /// get data formatted like Apr 26,2020 + /// [dateTime] convert DateTime to data formatted + static String getMonthDayYearDateFormatted(DateTime dateTime, {bool isArabic = false}) { + if (dateTime != null) + return isArabic ? getMonthArabic(dateTime.month) : getMonth(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString(); + else + return ""; + } + + /// get data formatted like 26 Apr 2020 + /// [dateTime] convert DateTime to data formatted + static String getDayMonthYearDateFormatted(DateTime dateTime, {bool isArabic = false, bool isMonthShort = true}) { + if (dateTime != null) + return dateTime.day.toString() + + " " + + "${isArabic ? getMonthArabic(dateTime.month) : isMonthShort ? getMonth(dateTime.month).toString().substring(0, 3) : getMonth(dateTime.month)}" + + " " + + dateTime.year.toString(); + else + return ""; + } + + /// get data formatted like 26/4/2020 + /// [dateTime] convert DateTime to data formatted + static String getDayMonthYearDate(DateTime dateTime, {bool isArabic = false}) { + if (dateTime != null) + return dateTime.day.toString() + "/" + "${dateTime.month}" + "/" + dateTime.year.toString(); + else + return ""; + } + + /// get data formatted like 10:45 PM + /// [dateTime] convert DateTime to data formatted + static String getHour(DateTime dateTime) { + return DateFormat('hh:mm a').format(dateTime); + } + + static String getAgeByBirthday(String birthOfDate, BuildContext context, {bool isServerFormat = true}) { + // https://leechy.dev/calculate-dates-diff-in-dart + DateTime birthDate; + if (birthOfDate.contains("/Date")) { + birthDate = AppDateUtils.getDateTimeFromServerFormat(birthOfDate); + } else { + birthDate = DateTime.parse(birthOfDate); + } + final now = DateTime.now(); + int years = now.year - birthDate.year; + int months = now.month - birthDate.month; + int days = now.day - birthDate.day; + if (months < 0 || (months == 0 && days < 0)) { + years--; + months += (days < 0 ? 11 : 12); + } + if (days < 0) { + final monthAgo = new DateTime(now.year, now.month - 1, birthDate.day); + days = now.difference(monthAgo).inDays + 1; + } + return "$years ${LocaleKeys.years.tr()} $months ${LocaleKeys.months.tr()} $days ${LocaleKeys.days.tr()}"; + } + + static bool isToday(DateTime dateTime) { + DateTime todayDate = DateTime.now().toUtc(); + if (dateTime.day == todayDate.day && dateTime.month == todayDate.month && dateTime.year == todayDate.year) { + return true; + } + return false; + } + + static String getDate(DateTime dateTime) { + print(dateTime); + if (dateTime != null) + return getMonth(dateTime.month) + " " + dateTime.day.toString() + "," + dateTime.year.toString(); + else + return ""; + } + + static String getDateFormatted(DateTime dateTime) { + print(dateTime); + if (dateTime != null) + return dateTime.day.toString() + "/" + dateTime.month.toString() + "/" + dateTime.year.toString(); + else + return ""; + } + + static String getTimeHHMMA(DateTime dateTime) { + return DateFormat('hh:mm a').format(dateTime); + } + + static String getTimeHHMMA2(DateTime dateTime) { + return DateFormat('hh:mm').format(dateTime); + } + + static String getStartTime(String dateTime) { + String time = dateTime; + + if (dateTime.length > 7) time = dateTime.substring(0, 5); + return time; + } + + static String getTimeFormated(DateTime dateTime) { + print(dateTime); + if (dateTime != null) + return dateTime.hour.toString() + ":" + dateTime.minute.toString(); + else + return ""; + } + + // handel date like "09/05/2021 17:00" + static DateTime getDateTimeFromString(String str) { + List array = str.split('/'); + int day = int.parse(array[0]); + int month = int.parse(array[1]); + + List array2 = array[2].split(' '); + int year = int.parse(array2[0]); + String hour = array2[1]; + List hourList = hour.split(":"); + + DateTime date = DateTime(year, month, day, int.parse(hourList[0]), int.parse(hourList[1])); + + return date; + } + + static convertDateFormatImproved(String str) { + String newDate = ""; + const start = "/Date("; + if (str.isNotEmpty) { + const end = "+0300)"; + + final startIndex = str.indexOf(start); + final endIndex = str.indexOf(end, startIndex + start.length); + + var date = new DateTime.fromMillisecondsSinceEpoch(int.parse(str.substring(startIndex + start.length, endIndex))); + newDate = date.year.toString() + "/" + date.month.toString().padLeft(2, '0') + "/" + date.day.toString().padLeft(2, '0'); + } + + return newDate; + } +} diff --git a/lib/classes/enums.dart b/lib/classes/enums.dart index a382310..cf55e42 100644 --- a/lib/classes/enums.dart +++ b/lib/classes/enums.dart @@ -24,7 +24,7 @@ enum ViewState { enum LoginType { FROM_LOGIN, - DIRECT_LOGIN, + SILENT_LOGIN, REGISTER_BIO, REGISTER_NEW_BIO, } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 7f6c3a9..6f0bf6d 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -70,16 +70,15 @@ class Utils { } static void hideLoading() { - try{ + try { if (_isLoadingVisible) { _isLoadingVisible = false; Navigator.of(navigatorKey.currentContext!).pop(); } _isLoadingVisible = false; - }catch(e){ - print("exp_while_hide_dialog: "+e.toString()); + } catch (e) { + print("exp_while_hide_dialog: " + e.toString()); } - } static Future getStringFromPrefs(String key) async { @@ -92,6 +91,16 @@ class Utils { return await prefs.setString(key, value); } + static Future getIntFromPrefs(String key) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + return prefs.getInt(key) ?? 0; + } + + static Future saveIntFromPrefs(String key, int value) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + return await prefs.setInt(key, value); + } + static void handleException(dynamic exception, cxt, Function(String)? onErrorMessage) { String errorMessage; if (exception is APIException) { @@ -244,6 +253,8 @@ class Utils { return DateFormat('dd-MMM-yyyy').format(date); } + + static String reverseFormatDate(String date) { String formattedDate; if (date.isNotEmpty) { @@ -292,7 +303,7 @@ class Utils { String formattedDate; if (date.isNotEmpty) { formattedDate = date.split('T')[0]; - if(!formattedDate.contains("00:00:00")) { + if (!formattedDate.contains("00:00:00")) { formattedDate = formattedDate + ' 00:00:00'; } } else { @@ -329,21 +340,24 @@ class Utils { return selectedDate; } - // static void readNFc({required Function(String) onRead}) { - // - // NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async { - // print(tag.data); - // var f; - // if (Platform.isAndroid) { - // f = MifareUltralight(tag: tag, identifier: tag.data["nfca"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22); - // } else { - // f = MifareUltralight(tag: tag, identifier: tag.data["mifare"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22); - // } - // String identifier = f.identifier.map((e) => e.toRadixString(16).padLeft(2, '0')).join(''); - // NfcManager.instance.stopSession(); - // onRead(identifier); - // }).catchError((err) { - // print(err); - // }); - // } + + + +// static void readNFc({required Function(String) onRead}) { +// +// NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async { +// print(tag.data); +// var f; +// if (Platform.isAndroid) { +// f = MifareUltralight(tag: tag, identifier: tag.data["nfca"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22); +// } else { +// f = MifareUltralight(tag: tag, identifier: tag.data["mifare"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22); +// } +// String identifier = f.identifier.map((e) => e.toRadixString(16).padLeft(2, '0')).join(''); +// NfcManager.instance.stopSession(); +// onRead(identifier); +// }).catchError((err) { +// print(err); +// }); +// } } diff --git a/lib/config/app_state.dart b/lib/config/app_state.dart index 138c5e9..7155660 100644 --- a/lib/config/app_state.dart +++ b/lib/config/app_state.dart @@ -1,7 +1,9 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; +import 'package:hmg_nurses/model/base/generic_response_model2.dart'; import 'package:hmg_nurses/model/base/post_params_model.dart'; +import 'package:hmg_nurses/model/login/imei_details_model.dart'; import 'package:hmg_nurses/model/login/list_doctors_clinic_model.dart'; import 'package:hmg_nurses/model/login/member_login_model.dart'; @@ -17,9 +19,15 @@ class AppState { int projectID = 0; int clinicId = 0; - - List? listDoctorsClinic; + int lastLoginTyp = 0; + int? doctorUserId; String? password; + String? doctorIdFromDB; + String? lastLoginDate; + GetIMEIDetailsModel? lastLoginImeiDate; + List? listDoctorsClinic; + + GenericResponseModel2? doctorProfile; bool isAuthenticated = false; @@ -44,7 +52,7 @@ class AppState { String? get getForgetPasswordTokenID => forgetPasswordTokenID; PostParamsModel _postParamsInitConfig = PostParamsModel( - tokenID: "@dm!n", + tokenID: "", languageID: 2, stamp: "", iPAdress: "9.9.9.9", diff --git a/lib/config/dependencies.dart b/lib/config/dependencies.dart index 1d0b653..a756568 100644 --- a/lib/config/dependencies.dart +++ b/lib/config/dependencies.dart @@ -2,6 +2,7 @@ // import 'package:flutter/material.dart'; import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/services/api_client.dart'; +import 'package:hmg_nurses/services/api_repo/dashboard_api_repo.dart'; import 'package:hmg_nurses/services/api_repo/login_api_repo.dart'; import 'package:hmg_nurses/services/firebase_service.dart'; @@ -19,5 +20,6 @@ class AppDependencies { //repos injector.registerSingleton(() => LoginApiRepo()); + injector.registerSingleton(() => DashboardApiRepo()); } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index b820e3a..3489aa9 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:hmg_nurses/ui/dashboard/dashbaord_page.dart'; import 'package:hmg_nurses/ui/login/login_method_page.dart'; import 'package:hmg_nurses/ui/login/login_page.dart'; import 'package:hmg_nurses/ui/login/splash_page.dart'; class AppRoutes { - - static const String initialPage =login; + static const String initialPage = login; //Login static const String splash = "/splash"; @@ -13,11 +13,16 @@ class AppRoutes { static const String loginMethodsPage = "/loginMethodsPage"; static const String login = "/login"; + //Dashboard + static const String dashboard = "/dashboard"; + static final Map routes = { //Login splash: (BuildContext context) => SplashPage(), - login: (BuildContext context) => LoginPage(), + login: (BuildContext context) => LoginPage(), loginMethodsPage: (BuildContext context) => const LoginMethodsPage(), + //Dashboard + dashboard: (BuildContext context) => DashboardPage(), }; } diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 372810d..09234fb 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -64,7 +64,12 @@ class CodegenLoader extends AssetLoader{ "resend": "إعادة إرسال", "codeExpire": "انتهت صلاحية رمز التحقق", "moreVerificationOpts": "المزيد من خيارات التحقق", - "select": "Select" + "select": "Select", + "days": "أيام", + "hr": "س", + "min": "د", + "years": "سنة", + "months": "أشهر" }; static const Map en_US = { "mohemm": "Mohemm", @@ -116,7 +121,12 @@ static const Map en_US = { "resend": "Resend", "codeExpire": "The verification code has been expired", "moreVerificationOpts": "More verification options", - "select": "Select" + "select": "Select", + "days": "Days", + "hr": "Hr", + "min": "Min", + "years": "Years", + "months": "Months" }; static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; } diff --git a/lib/main.dart b/lib/main.dart index 77bbf8a..44c8525 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -63,6 +63,9 @@ Future main() async { ), ChangeNotifierProvider( create: (_) => LoginViewModel(), + ), + ChangeNotifierProvider( + create: (_) => DashboardProviderModel(), ) ], child: MyApp(), diff --git a/lib/model/base/generic_response_model.dart b/lib/model/base/generic_response_model.dart index bda03b2..6ed950b 100644 --- a/lib/model/base/generic_response_model.dart +++ b/lib/model/base/generic_response_model.dart @@ -456,7 +456,7 @@ class GenericResponseModel { listDiabeticChartValues: json["List_DiabeticChartValues"], listDiagnosisForInPatient: json["List_DiagnosisForInPatient"], listDischargeSummary: json["List_DischargeSummary"], - listDoctorDeviceDetails: json["List_DoctorDeviceDetails"] == null ? null : List.from(json["List_DoctorDeviceDetails"].map((x) => x)), + listDoctorDeviceDetails: json["List_DoctorDeviceDetails"] == null ? null : List.from(json["List_DoctorDeviceDetails"].map((x) => GetIMEIDetailsModel.fromJson(x))), listDoctorProfile: json["List_DoctorProfile"], listDoctorProgressNote: json["List_DoctorProgressNote"], listDoctorsClinic: json["List_DoctorsClinic"] == null ? null : List.from(json["List_DoctorsClinic"].map((x) => ListDoctorsClinicModel.fromJson(x))), diff --git a/lib/model/base/post_params_model.dart b/lib/model/base/post_params_model.dart index 3e2e4a4..462f3f3 100644 --- a/lib/model/base/post_params_model.dart +++ b/lib/model/base/post_params_model.dart @@ -62,46 +62,46 @@ class PostParamsModel { data['VidaAuthTokenID'] = this.vidaAuthTokenID; data['VidaRefreshTokenID'] = this.vidaRefreshTokenID; data['DeviceTypeID'] = this.deviceTypeID; - data['generalid']=this.generalID; + data['generalid'] = this.generalID; return data; } - // Map toJsonAfterLogin() { - // Map data = new Map(); - // data['VersionID'] = this.versionID; - // data['Channel'] = this.channel; - // data['LanguageID'] = this.languageID; - // data['MobileType'] = this.mobileType; - // data['LogInTokenID'] = this.logInTokenID; - // data['TokenID'] = this.tokenID; - // data['MobileNumber'] = this.mobileNumber; - // data['UserName'] = this.userName; - // data['P_EMAIL_ADDRESS'] = this.pEmailAddress; - // data['P_SESSION_ID'] = this.pSessionId; - // data['PayrollCodeStr'] = this.payrollCodeStr; - // data['LegislationCodeStr'] = this.pLegislationCode; - // data['P_SELECTED_EMPLOYEE_NUMBER'] = this.pSelectedEmployeeNumber; - // data['P_USER_NAME'] = this.pUserName; - // return data; - // } - // - // set setLogInTokenID(String? token) => logInTokenID = token; - // - // set setTokenID(String? token) => tokenID = token; - // - // set setMobileNumer(String? v) => mobileNumber = v; - // - // set setUserName(String? v) => userName = v; - // - // set setPEmailAddress(String? v) => pEmailAddress = v; - // - // set setPSessionId(int? v) => pSessionId = v; - // - // set setPUserName(String? v) => pUserName = v; - // - // set setPSelectedEmployeeNumber(String? v) => pSelectedEmployeeNumber = v; - // - // set setPLegislationCode(String? v) => pLegislationCode = v; - // - // set setPayrollCodeStr(String? v) => payrollCodeStr = v; +// Map toJsonAfterLogin() { +// Map data = new Map(); +// data['VersionID'] = this.versionID; +// data['Channel'] = this.channel; +// data['LanguageID'] = this.languageID; +// data['MobileType'] = this.mobileType; +// data['LogInTokenID'] = this.logInTokenID; +// data['TokenID'] = this.tokenID; +// data['MobileNumber'] = this.mobileNumber; +// data['UserName'] = this.userName; +// data['P_EMAIL_ADDRESS'] = this.pEmailAddress; +// data['P_SESSION_ID'] = this.pSessionId; +// data['PayrollCodeStr'] = this.payrollCodeStr; +// data['LegislationCodeStr'] = this.pLegislationCode; +// data['P_SELECTED_EMPLOYEE_NUMBER'] = this.pSelectedEmployeeNumber; +// data['P_USER_NAME'] = this.pUserName; +// return data; +// } +// +// set setLogInTokenID(String? token) => logInTokenID = token; +// +// set setTokenID(String? token) => tokenID = token; +// +// set setMobileNumer(String? v) => mobileNumber = v; +// +// set setUserName(String? v) => userName = v; +// +// set setPEmailAddress(String? v) => pEmailAddress = v; +// +// set setPSessionId(int? v) => pSessionId = v; +// +// set setPUserName(String? v) => pUserName = v; +// +// set setPSelectedEmployeeNumber(String? v) => pSelectedEmployeeNumber = v; +// +// set setPLegislationCode(String? v) => pLegislationCode = v; +// +// set setPayrollCodeStr(String? v) => payrollCodeStr = v; } diff --git a/lib/model/login/doctor_profile_model.dart b/lib/model/login/doctor_profile_model.dart index 258af4e..390c516 100644 --- a/lib/model/login/doctor_profile_model.dart +++ b/lib/model/login/doctor_profile_model.dart @@ -96,100 +96,100 @@ class DoctorProfileListModel { final int? serviceId; factory DoctorProfileListModel.fromJson(Map json) => DoctorProfileListModel( - doctorId: json["DoctorID"] == null ? null : json["DoctorID"], - doctorName: json["DoctorName"] == null ? null : json["DoctorName"], - doctorNameN: json["DoctorNameN"], - clinicId: json["ClinicID"] == null ? null : json["ClinicID"], - clinicDescription: json["ClinicDescription"] == null ? null : json["ClinicDescription"], - clinicDescriptionN: json["ClinicDescriptionN"], - licenseExpiry: json["LicenseExpiry"], - employmentType: json["EmploymentType"] == null ? null : json["EmploymentType"], - setupId: json["SetupID"], - projectId: json["ProjectID"] == null ? null : json["ProjectID"], - projectName: json["ProjectName"] == null ? null : json["ProjectName"], - nationalityId: json["NationalityID"] == null ? null : json["NationalityID"], - nationalityName: json["NationalityName"] == null ? null : json["NationalityName"], - nationalityNameN: json["NationalityNameN"], - gender: json["Gender"] == null ? null : json["Gender"], - genderDescription: json["Gender_Description"] == null ? null : json["Gender_Description"], - genderDescriptionN: json["Gender_DescriptionN"], - doctorTitle: json["DoctorTitle"], - projectNameN: json["ProjectNameN"], - isAllowWaitList: json["IsAllowWaitList"] == null ? null : json["IsAllowWaitList"], - titleDescription: json["Title_Description"] == null ? null : json["Title_Description"], - titleDescriptionN: json["Title_DescriptionN"], - isRegistered: json["IsRegistered"], - isDoctorDummy: json["IsDoctorDummy"], - isActive: json["IsActive"] == null ? null : json["IsActive"], - isDoctorAppointmentDisplayed: json["IsDoctorAppointmentDisplayed"], - doctorClinicActive: json["DoctorClinicActive"] == null ? null : json["DoctorClinicActive"], - isbookingAllowed: json["IsbookingAllowed"], - doctorCases: json["DoctorCases"] == null ? null : json["DoctorCases"], - doctorPicture: json["DoctorPicture"], - doctorProfileInfo: json["DoctorProfileInfo"] == null ? null : json["DoctorProfileInfo"], - specialty: json["Specialty"] == null ? null : List.from(json["Specialty"].map((x) => x)), - actualDoctorRate: json["ActualDoctorRate"] == null ? null : json["ActualDoctorRate"], - consultationFee: json["ConsultationFee"] == null ? null : json["ConsultationFee"], - decimalDoctorRate: json["DecimalDoctorRate"] == null ? null : json["DecimalDoctorRate"].toDouble(), - doctorImageUrl: json["DoctorImageURL"] == null ? null : json["DoctorImageURL"], - doctorMobileNumber: json["DoctorMobileNumber"] == null ? null : json["DoctorMobileNumber"], - doctorRate: json["DoctorRate"] == null ? null : json["DoctorRate"], - doctorStarsRate: json["DoctorStarsRate"] == null ? null : json["DoctorStarsRate"], - doctorTitleForProfile: json["DoctorTitleForProfile"] == null ? null : json["DoctorTitleForProfile"], - isAppointmentAllowed: json["IsAppointmentAllowed"] == null ? null : json["IsAppointmentAllowed"], - isDoctorHasPrePostImages: json["IsDoctorHasPrePostImages"] == null ? null : json["IsDoctorHasPrePostImages"], - nationalityFlagUrl: json["NationalityFlagURL"] == null ? null : json["NationalityFlagURL"], - noOfPatientsRate: json["NoOfPatientsRate"] == null ? null : json["NoOfPatientsRate"], - qr: json["QR"] == null ? null : json["QR"], - serviceId: json["ServiceID"] == null ? null : json["ServiceID"], - ); + doctorId: json["DoctorID"] == null ? null : json["DoctorID"], + doctorName: json["DoctorName"] == null ? null : json["DoctorName"], + doctorNameN: json["DoctorNameN"], + clinicId: json["ClinicID"] == null ? null : json["ClinicID"], + clinicDescription: json["ClinicDescription"] == null ? null : json["ClinicDescription"], + clinicDescriptionN: json["ClinicDescriptionN"], + licenseExpiry: json["LicenseExpiry"], + employmentType: json["EmploymentType"] == null ? null : json["EmploymentType"], + setupId: json["SetupID"], + projectId: json["ProjectID"] == null ? null : json["ProjectID"], + projectName: json["ProjectName"] == null ? null : json["ProjectName"], + nationalityId: json["NationalityID"] == null ? null : json["NationalityID"], + nationalityName: json["NationalityName"] == null ? null : json["NationalityName"], + nationalityNameN: json["NationalityNameN"], + gender: json["Gender"] == null ? null : json["Gender"], + genderDescription: json["Gender_Description"] == null ? null : json["Gender_Description"], + genderDescriptionN: json["Gender_DescriptionN"], + doctorTitle: json["DoctorTitle"], + projectNameN: json["ProjectNameN"], + isAllowWaitList: json["IsAllowWaitList"] == null ? null : json["IsAllowWaitList"], + titleDescription: json["Title_Description"] == null ? null : json["Title_Description"], + titleDescriptionN: json["Title_DescriptionN"], + isRegistered: json["IsRegistered"], + isDoctorDummy: json["IsDoctorDummy"], + isActive: json["IsActive"] == null ? null : json["IsActive"], + isDoctorAppointmentDisplayed: json["IsDoctorAppointmentDisplayed"], + doctorClinicActive: json["DoctorClinicActive"] == null ? null : json["DoctorClinicActive"], + isbookingAllowed: json["IsbookingAllowed"], + doctorCases: json["DoctorCases"] == null ? null : json["DoctorCases"], + doctorPicture: json["DoctorPicture"], + doctorProfileInfo: json["DoctorProfileInfo"] == null ? null : json["DoctorProfileInfo"], + specialty: json["Specialty"] == null ? null : List.from(json["Specialty"].map((x) => x)), + actualDoctorRate: json["ActualDoctorRate"] == null ? null : json["ActualDoctorRate"], + consultationFee: json["ConsultationFee"] == null ? null : json["ConsultationFee"], + decimalDoctorRate: json["DecimalDoctorRate"] == null ? null : json["DecimalDoctorRate"].toDouble(), + doctorImageUrl: json["DoctorImageURL"] == null ? null : json["DoctorImageURL"], + doctorMobileNumber: json["DoctorMobileNumber"] == null ? null : json["DoctorMobileNumber"], + doctorRate: json["DoctorRate"] == null ? null : json["DoctorRate"], + doctorStarsRate: json["DoctorStarsRate"] == null ? null : json["DoctorStarsRate"], + doctorTitleForProfile: json["DoctorTitleForProfile"] == null ? null : json["DoctorTitleForProfile"], + isAppointmentAllowed: json["IsAppointmentAllowed"] == null ? null : json["IsAppointmentAllowed"], + isDoctorHasPrePostImages: json["IsDoctorHasPrePostImages"] == null ? null : json["IsDoctorHasPrePostImages"], + nationalityFlagUrl: json["NationalityFlagURL"] == null ? null : json["NationalityFlagURL"], + noOfPatientsRate: json["NoOfPatientsRate"] == null ? null : json["NoOfPatientsRate"], + qr: json["QR"] == null ? null : json["QR"], + serviceId: json["ServiceID"] == null ? null : json["ServiceID"], + ); Map toJson() => { - "DoctorID": doctorId == null ? null : doctorId, - "DoctorName": doctorName == null ? null : doctorName, - "DoctorNameN": doctorNameN, - "ClinicID": clinicId == null ? null : clinicId, - "ClinicDescription": clinicDescription == null ? null : clinicDescription, - "ClinicDescriptionN": clinicDescriptionN, - "LicenseExpiry": licenseExpiry, - "EmploymentType": employmentType == null ? null : employmentType, - "SetupID": setupId, - "ProjectID": projectId == null ? null : projectId, - "ProjectName": projectName == null ? null : projectName, - "NationalityID": nationalityId == null ? null : nationalityId, - "NationalityName": nationalityName == null ? null : nationalityName, - "NationalityNameN": nationalityNameN, - "Gender": gender == null ? null : gender, - "Gender_Description": genderDescription == null ? null : genderDescription, - "Gender_DescriptionN": genderDescriptionN, - "DoctorTitle": doctorTitle, - "ProjectNameN": projectNameN, - "IsAllowWaitList": isAllowWaitList == null ? null : isAllowWaitList, - "Title_Description": titleDescription == null ? null : titleDescription, - "Title_DescriptionN": titleDescriptionN, - "IsRegistered": isRegistered, - "IsDoctorDummy": isDoctorDummy, - "IsActive": isActive == null ? null : isActive, - "IsDoctorAppointmentDisplayed": isDoctorAppointmentDisplayed, - "DoctorClinicActive": doctorClinicActive == null ? null : doctorClinicActive, - "IsbookingAllowed": isbookingAllowed, - "DoctorCases": doctorCases == null ? null : doctorCases, - "DoctorPicture": doctorPicture, - "DoctorProfileInfo": doctorProfileInfo == null ? null : doctorProfileInfo, - "Specialty": specialty == null ? null : List.from(specialty!.map((x) => x)), - "ActualDoctorRate": actualDoctorRate == null ? null : actualDoctorRate, - "ConsultationFee": consultationFee == null ? null : consultationFee, - "DecimalDoctorRate": decimalDoctorRate == null ? null : decimalDoctorRate, - "DoctorImageURL": doctorImageUrl == null ? null : doctorImageUrl, - "DoctorMobileNumber": doctorMobileNumber == null ? null : doctorMobileNumber, - "DoctorRate": doctorRate == null ? null : doctorRate, - "DoctorStarsRate": doctorStarsRate == null ? null : doctorStarsRate, - "DoctorTitleForProfile": doctorTitleForProfile == null ? null : doctorTitleForProfile, - "IsAppointmentAllowed": isAppointmentAllowed == null ? null : isAppointmentAllowed, - "IsDoctorHasPrePostImages": isDoctorHasPrePostImages == null ? null : isDoctorHasPrePostImages, - "NationalityFlagURL": nationalityFlagUrl == null ? null : nationalityFlagUrl, - "NoOfPatientsRate": noOfPatientsRate == null ? null : noOfPatientsRate, - "QR": qr == null ? null : qr, - "ServiceID": serviceId == null ? null : serviceId, - }; + "DoctorID": doctorId == null ? null : doctorId, + "DoctorName": doctorName == null ? null : doctorName, + "DoctorNameN": doctorNameN, + "ClinicID": clinicId == null ? null : clinicId, + "ClinicDescription": clinicDescription == null ? null : clinicDescription, + "ClinicDescriptionN": clinicDescriptionN, + "LicenseExpiry": licenseExpiry, + "EmploymentType": employmentType == null ? null : employmentType, + "SetupID": setupId, + "ProjectID": projectId == null ? null : projectId, + "ProjectName": projectName == null ? null : projectName, + "NationalityID": nationalityId == null ? null : nationalityId, + "NationalityName": nationalityName == null ? null : nationalityName, + "NationalityNameN": nationalityNameN, + "Gender": gender == null ? null : gender, + "Gender_Description": genderDescription == null ? null : genderDescription, + "Gender_DescriptionN": genderDescriptionN, + "DoctorTitle": doctorTitle, + "ProjectNameN": projectNameN, + "IsAllowWaitList": isAllowWaitList == null ? null : isAllowWaitList, + "Title_Description": titleDescription == null ? null : titleDescription, + "Title_DescriptionN": titleDescriptionN, + "IsRegistered": isRegistered, + "IsDoctorDummy": isDoctorDummy, + "IsActive": isActive == null ? null : isActive, + "IsDoctorAppointmentDisplayed": isDoctorAppointmentDisplayed, + "DoctorClinicActive": doctorClinicActive == null ? null : doctorClinicActive, + "IsbookingAllowed": isbookingAllowed, + "DoctorCases": doctorCases == null ? null : doctorCases, + "DoctorPicture": doctorPicture, + "DoctorProfileInfo": doctorProfileInfo == null ? null : doctorProfileInfo, + "Specialty": specialty == null ? null : List.from(specialty!.map((x) => x)), + "ActualDoctorRate": actualDoctorRate == null ? null : actualDoctorRate, + "ConsultationFee": consultationFee == null ? null : consultationFee, + "DecimalDoctorRate": decimalDoctorRate == null ? null : decimalDoctorRate, + "DoctorImageURL": doctorImageUrl == null ? null : doctorImageUrl, + "DoctorMobileNumber": doctorMobileNumber == null ? null : doctorMobileNumber, + "DoctorRate": doctorRate == null ? null : doctorRate, + "DoctorStarsRate": doctorStarsRate == null ? null : doctorStarsRate, + "DoctorTitleForProfile": doctorTitleForProfile == null ? null : doctorTitleForProfile, + "IsAppointmentAllowed": isAppointmentAllowed == null ? null : isAppointmentAllowed, + "IsDoctorHasPrePostImages": isDoctorHasPrePostImages == null ? null : isDoctorHasPrePostImages, + "NationalityFlagURL": nationalityFlagUrl == null ? null : nationalityFlagUrl, + "NoOfPatientsRate": noOfPatientsRate == null ? null : noOfPatientsRate, + "QR": qr == null ? null : qr, + "ServiceID": serviceId == null ? null : serviceId, + }; } diff --git a/lib/model/login/member_login_model.dart b/lib/model/login/member_login_model.dart index 04eeb4d..3f896c4 100644 --- a/lib/model/login/member_login_model.dart +++ b/lib/model/login/member_login_model.dart @@ -4,6 +4,9 @@ import 'dart:convert'; +import 'package:hmg_nurses/classes/consts.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + MemberLoginModel memberLoginModelFromJson(String str) => MemberLoginModel.fromJson(json.decode(str)); String memberLoginModelToJson(MemberLoginModel data) => json.encode(data.toJson()); @@ -98,94 +101,105 @@ class MemberLoginModel { final bool? isSmsSent; factory MemberLoginModel.fromJson(Map json) => MemberLoginModel( - date: json["Date"], - languageId: json["LanguageID"] == null ? null : json["LanguageID"], - serviceName: json["ServiceName"] == null ? null : json["ServiceName"], - time: json["Time"], - androidLink: json["AndroidLink"], - authenticationTokenId: json["AuthenticationTokenID"], - data: json["Data"], - dataw: json["Dataw"] == null ? null : json["Dataw"], - dietType: json["DietType"] == null ? null : json["DietType"], - dietTypeId: json["DietTypeID"] == null ? null : json["DietTypeID"], - errorCode: json["ErrorCode"], - errorEndUserMessage: json["ErrorEndUserMessage"], - errorEndUserMessageN: json["ErrorEndUserMessageN"], - errorMessage: json["ErrorMessage"], - errorType: json["ErrorType"] == null ? null : json["ErrorType"], - foodCategory: json["FoodCategory"] == null ? null : json["FoodCategory"], - iosLink: json["IOSLink"], - isAuthenticated: json["IsAuthenticated"] == null ? null : json["IsAuthenticated"], - mealOrderStatus: json["MealOrderStatus"] == null ? null : json["MealOrderStatus"], - mealType: json["MealType"] == null ? null : json["MealType"], - messageStatus: json["MessageStatus"] == null ? null : json["MessageStatus"], - numberOfResultRecords: json["NumberOfResultRecords"] == null ? null : json["NumberOfResultRecords"], - patientBlodType: json["PatientBlodType"], - successMsg: json["SuccessMsg"], - successMsgN: json["SuccessMsgN"], - vidaUpdatedResponse: json["VidaUpdatedResponse"], - doctorHaveOneClinic: json["DoctorHaveOneClinic"] == null ? null : json["DoctorHaveOneClinic"], - doctorId: json["DoctorID"] == null ? null : json["DoctorID"], - erpSessionId: json["ERP_SessionID"], - listConsentMember: json["List_Consent_Member"], - listConsentMemberNew: json["List_Consent_MemberNew"], - listDoctorProfile: json["List_DoctorProfile"], - listDoctorsClinic: json["List_DoctorsClinic"], - listMemberInformation: json["List_MemberInformation"] == null ? null : List.from(json["List_MemberInformation"].map((x) => ListMemberInformation.fromJson(x))), - listModelDbConnect: json["List_Model_DB_Connect"], - logInTokenId: json["LogInTokenID"] == null ? null : json["LogInTokenID"], - mobileNumber: json["MobileNumber"] == null ? null : json["MobileNumber"], - selectDeviceImeIbyImeiList: json["SELECTDeviceIMEIbyIMEI_List"], - userId: json["UserID"] == null ? null : json["UserID"], - zipCode: json["ZipCode"] == null ? null : json["ZipCode"], - isActiveCode: json["isActiveCode"] == null ? null : json["isActiveCode"], - isSmsSent: json["isSMSSent"] == null ? null : json["isSMSSent"], - ); + date: json["Date"], + languageId: json["LanguageID"] == null ? null : json["LanguageID"], + serviceName: json["ServiceName"] == null ? null : json["ServiceName"], + time: json["Time"], + androidLink: json["AndroidLink"], + authenticationTokenId: json["AuthenticationTokenID"], + data: json["Data"], + dataw: json["Dataw"] == null ? null : json["Dataw"], + dietType: json["DietType"] == null ? null : json["DietType"], + dietTypeId: json["DietTypeID"] == null ? null : json["DietTypeID"], + errorCode: json["ErrorCode"], + errorEndUserMessage: json["ErrorEndUserMessage"], + errorEndUserMessageN: json["ErrorEndUserMessageN"], + errorMessage: json["ErrorMessage"], + errorType: json["ErrorType"] == null ? null : json["ErrorType"], + foodCategory: json["FoodCategory"] == null ? null : json["FoodCategory"], + iosLink: json["IOSLink"], + isAuthenticated: json["IsAuthenticated"] == null ? null : json["IsAuthenticated"], + mealOrderStatus: json["MealOrderStatus"] == null ? null : json["MealOrderStatus"], + mealType: json["MealType"] == null ? null : json["MealType"], + messageStatus: json["MessageStatus"] == null ? null : json["MessageStatus"], + numberOfResultRecords: json["NumberOfResultRecords"] == null ? null : json["NumberOfResultRecords"], + patientBlodType: json["PatientBlodType"], + successMsg: json["SuccessMsg"], + successMsgN: json["SuccessMsgN"], + vidaUpdatedResponse: json["VidaUpdatedResponse"], + doctorHaveOneClinic: json["DoctorHaveOneClinic"] == null ? null : json["DoctorHaveOneClinic"], + doctorId: json["DoctorID"] == null ? null : json["DoctorID"], + erpSessionId: json["ERP_SessionID"], + listConsentMember: json["List_Consent_Member"], + listConsentMemberNew: json["List_Consent_MemberNew"], + listDoctorProfile: json["List_DoctorProfile"], + listDoctorsClinic: json["List_DoctorsClinic"], + listMemberInformation: json["List_MemberInformation"] == null ? null : List.from(json["List_MemberInformation"].map((x) => ListMemberInformation.fromJson(x))), + listModelDbConnect: json["List_Model_DB_Connect"], + logInTokenId: json["LogInTokenID"] == null ? null : json["LogInTokenID"], + mobileNumber: json["MobileNumber"] == null ? null : json["MobileNumber"], + selectDeviceImeIbyImeiList: json["SELECTDeviceIMEIbyIMEI_List"], + userId: json["UserID"] == null ? null : json["UserID"], + zipCode: json["ZipCode"] == null ? null : json["ZipCode"], + isActiveCode: json["isActiveCode"] == null ? null : json["isActiveCode"], + isSmsSent: json["isSMSSent"] == null ? null : json["isSMSSent"], + ); Map toJson() => { - "Date": date, - "LanguageID": languageId == null ? null : languageId, - "ServiceName": serviceName == null ? null : serviceName, - "Time": time, - "AndroidLink": androidLink, - "AuthenticationTokenID": authenticationTokenId, - "Data": data, - "Dataw": dataw == null ? null : dataw, - "DietType": dietType == null ? null : dietType, - "DietTypeID": dietTypeId == null ? null : dietTypeId, - "ErrorCode": errorCode, - "ErrorEndUserMessage": errorEndUserMessage, - "ErrorEndUserMessageN": errorEndUserMessageN, - "ErrorMessage": errorMessage, - "ErrorType": errorType == null ? null : errorType, - "FoodCategory": foodCategory == null ? null : foodCategory, - "IOSLink": iosLink, - "IsAuthenticated": isAuthenticated == null ? null : isAuthenticated, - "MealOrderStatus": mealOrderStatus == null ? null : mealOrderStatus, - "MealType": mealType == null ? null : mealType, - "MessageStatus": messageStatus == null ? null : messageStatus, - "NumberOfResultRecords": numberOfResultRecords == null ? null : numberOfResultRecords, - "PatientBlodType": patientBlodType, - "SuccessMsg": successMsg, - "SuccessMsgN": successMsgN, - "VidaUpdatedResponse": vidaUpdatedResponse, - "DoctorHaveOneClinic": doctorHaveOneClinic == null ? null : doctorHaveOneClinic, - "DoctorID": doctorId == null ? null : doctorId, - "ERP_SessionID": erpSessionId, - "List_Consent_Member": listConsentMember, - "List_Consent_MemberNew": listConsentMemberNew, - "List_DoctorProfile": listDoctorProfile, - "List_DoctorsClinic": listDoctorsClinic, - "List_MemberInformation": listMemberInformation == null ? null : List.from(listMemberInformation!.map((x) => x.toJson())), - "List_Model_DB_Connect": listModelDbConnect, - "LogInTokenID": logInTokenId == null ? null : logInTokenId, - "MobileNumber": mobileNumber == null ? null : mobileNumber, - "SELECTDeviceIMEIbyIMEI_List": selectDeviceImeIbyImeiList, - "UserID": userId == null ? null : userId, - "ZipCode": zipCode == null ? null : zipCode, - "isActiveCode": isActiveCode == null ? null : isActiveCode, - "isSMSSent": isSmsSent == null ? null : isSmsSent, - }; + "Date": date, + "LanguageID": languageId == null ? null : languageId, + "ServiceName": serviceName == null ? null : serviceName, + "Time": time, + "AndroidLink": androidLink, + "AuthenticationTokenID": authenticationTokenId, + "Data": data, + "Dataw": dataw == null ? null : dataw, + "DietType": dietType == null ? null : dietType, + "DietTypeID": dietTypeId == null ? null : dietTypeId, + "ErrorCode": errorCode, + "ErrorEndUserMessage": errorEndUserMessage, + "ErrorEndUserMessageN": errorEndUserMessageN, + "ErrorMessage": errorMessage, + "ErrorType": errorType == null ? null : errorType, + "FoodCategory": foodCategory == null ? null : foodCategory, + "IOSLink": iosLink, + "IsAuthenticated": isAuthenticated == null ? null : isAuthenticated, + "MealOrderStatus": mealOrderStatus == null ? null : mealOrderStatus, + "MealType": mealType == null ? null : mealType, + "MessageStatus": messageStatus == null ? null : messageStatus, + "NumberOfResultRecords": numberOfResultRecords == null ? null : numberOfResultRecords, + "PatientBlodType": patientBlodType, + "SuccessMsg": successMsg, + "SuccessMsgN": successMsgN, + "VidaUpdatedResponse": vidaUpdatedResponse, + "DoctorHaveOneClinic": doctorHaveOneClinic == null ? null : doctorHaveOneClinic, + "DoctorID": doctorId == null ? null : doctorId, + "ERP_SessionID": erpSessionId, + "List_Consent_Member": listConsentMember, + "List_Consent_MemberNew": listConsentMemberNew, + "List_DoctorProfile": listDoctorProfile, + "List_DoctorsClinic": listDoctorsClinic, + "List_MemberInformation": listMemberInformation == null ? null : List.from(listMemberInformation!.map((x) => x.toJson())), + "List_Model_DB_Connect": listModelDbConnect, + "LogInTokenID": logInTokenId == null ? null : logInTokenId, + "MobileNumber": mobileNumber == null ? null : mobileNumber, + "SELECTDeviceIMEIbyIMEI_List": selectDeviceImeIbyImeiList, + "UserID": userId == null ? null : userId, + "ZipCode": zipCode == null ? null : zipCode, + "isActiveCode": isActiveCode == null ? null : isActiveCode, + "isSMSSent": isSmsSent == null ? null : isSmsSent, + }; + + static Future getFromPrefs() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + String decodedJson = prefs.getString(SharedPrefsConsts.memberModel) ?? ""; + return MemberLoginModel.fromJson(jsonDecode(decodedJson)); + } + + static void saveToPrefs(String json) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.setString(SharedPrefsConsts.memberModel, json); + } } class ListMemberInformation { @@ -216,30 +230,30 @@ class ListMemberInformation { final int? projectid; factory ListMemberInformation.fromJson(Map json) => ListMemberInformation( - setupId: json["SetupID"], - memberId: json["MemberID"] == null ? null : json["MemberID"], - memberName: json["MemberName"] == null ? null : json["MemberName"], - memberNameN: json["MemberNameN"], - preferredLang: json["PreferredLang"] == null ? null : json["PreferredLang"], - pin: json["PIN"], - saltHash: json["SaltHash"], - referenceId: json["ReferenceID"] == null ? null : json["ReferenceID"], - employeeId: json["EmployeeID"] == null ? null : json["EmployeeID"], - roleId: json["RoleID"] == null ? null : json["RoleID"], - projectid: json["projectid"] == null ? null : json["projectid"], - ); + setupId: json["SetupID"], + memberId: json["MemberID"] == null ? null : json["MemberID"], + memberName: json["MemberName"] == null ? null : json["MemberName"], + memberNameN: json["MemberNameN"], + preferredLang: json["PreferredLang"] == null ? null : json["PreferredLang"], + pin: json["PIN"], + saltHash: json["SaltHash"], + referenceId: json["ReferenceID"] == null ? null : json["ReferenceID"], + employeeId: json["EmployeeID"] == null ? null : json["EmployeeID"], + roleId: json["RoleID"] == null ? null : json["RoleID"], + projectid: json["projectid"] == null ? null : json["projectid"], + ); Map toJson() => { - "SetupID": setupId, - "MemberID": memberId == null ? null : memberId, - "MemberName": memberName == null ? null : memberName, - "MemberNameN": memberNameN, - "PreferredLang": preferredLang == null ? null : preferredLang, - "PIN": pin, - "SaltHash": saltHash, - "ReferenceID": referenceId == null ? null : referenceId, - "EmployeeID": employeeId == null ? null : employeeId, - "RoleID": roleId == null ? null : roleId, - "projectid": projectid == null ? null : projectid, - }; + "SetupID": setupId, + "MemberID": memberId == null ? null : memberId, + "MemberName": memberName == null ? null : memberName, + "MemberNameN": memberNameN, + "PreferredLang": preferredLang == null ? null : preferredLang, + "PIN": pin, + "SaltHash": saltHash, + "ReferenceID": referenceId == null ? null : referenceId, + "EmployeeID": employeeId == null ? null : employeeId, + "RoleID": roleId == null ? null : roleId, + "projectid": projectid == null ? null : projectid, + }; } diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart index 17fc99f..f06f46a 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -1,16 +1,35 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_nurses/model/base/generic_response_model2.dart'; +import 'package:hmg_nurses/provider/base_vm.dart'; +import 'package:hmg_nurses/services/api_repo/dashboard_api_repo.dart'; +import 'package:injector/injector.dart'; + +import '../classes/utils.dart'; +import '../main.dart'; /// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool // ignore: prefer_mixin -class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { - //Attendance Tracking - bool isAttendanceTrackingLoading = true; - int endTime = 0, isTimeRemainingInSeconds = 0; - double progress = 0.0; +class DashboardProviderModel extends BaseViewModel { + final IDashboardApiRepo _loginApiRepo = Injector.appInstance.get(); + + Future getDocProfile() async { + try { + Utils.showLoading(); - void notify() { - notifyListeners(); + // Utils.showToast(deviceInfo.length.toString()); + GenericResponseModel2 docProfileModel = await _loginApiRepo.getDoctorProfile(); + appState.doctorProfile = docProfileModel; + await _loginApiRepo.insertDoctorProfile(); + Utils.hideLoading(); + return docProfileModel; + } catch (e) { + Utils.hideLoading(); + Utils.handleException(e, navigatorKey.currentContext!, (msg) { + Utils.confirmDialog(navigatorKey.currentContext!, msg); + }); + } + return null; } } diff --git a/lib/provider/login_provider_model.dart b/lib/provider/login_provider_model.dart index 81ce17e..802ca02 100644 --- a/lib/provider/login_provider_model.dart +++ b/lib/provider/login_provider_model.dart @@ -1,17 +1,22 @@ +import 'dart:convert'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:hmg_nurses/classes/consts.dart'; import 'package:hmg_nurses/classes/enums.dart'; import 'package:hmg_nurses/classes/utils.dart'; import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/model/base/generic_response_model.dart'; +import 'package:hmg_nurses/model/base/generic_response_model2.dart'; import 'package:hmg_nurses/model/login/imei_details_model.dart'; import 'package:hmg_nurses/model/login/member_login_model.dart'; import 'package:hmg_nurses/model/login/project_info_model.dart'; import 'package:hmg_nurses/provider/base_vm.dart'; import 'package:hmg_nurses/services/api_repo/login_api_repo.dart'; import 'package:hmg_nurses/widgets/dialogs/otp_dialog.dart'; +import 'package:http/http.dart'; import 'package:injector/injector.dart'; import 'package:local_auth/auth_strings.dart'; import 'package:local_auth/local_auth.dart'; @@ -91,11 +96,27 @@ class LoginProviderModel extends BaseViewModel { } } + // LoginType getDirectLoginType(type) { + // switch (type) { + // case 1: + // return LoginType.DIRECT_LOGIN; + // case 3: + // return LocaleKeys.fingerPrint.tr(); + // case 4: + // return LocaleKeys.face.tr(); + // case 2: + // return LocaleKeys.whatsapp.tr(); + // default: + // return LocaleKeys.sms.tr(); + // } + // } + //API Calls checkLastSession() async { try { Utils.showLoading(); List deviceInfo = await _loginApiRepo.getDeviceInfoByIMEI(); + if (deviceInfo.isNotEmpty) getSession(deviceInfo.first); Utils.showToast(deviceInfo.length.toString()); Utils.hideLoading(); } catch (e) { @@ -110,7 +131,7 @@ class LoginProviderModel extends BaseViewModel { setState(ViewState.idle); } - performLogin(String userID, String password, int branchId) async { + Future performLogin(String userID, String password, int branchId) async { try { Utils.showLoading(); MemberLoginModel memberLogin = await _loginApiRepo.memberLogin(userID, password, branchId); @@ -120,23 +141,36 @@ class LoginProviderModel extends BaseViewModel { appState.logInTokenID = memberLogin.logInTokenId; Utils.hideLoading(); Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); + return true; } catch (e) { Utils.hideLoading(); Utils.handleException(e, navigatorKey.currentContext!, (msg) { Utils.confirmDialog(navigatorKey.currentContext!, msg); }); + return false; } } - Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType,bool isFromSilentLogin) async { + Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType, bool isFromSilentLogin) async { try { Utils.showLoading(); - GenericResponseModel memberLogin = await _loginApiRepo.sendActivationCode(memberLoginModel, facilityID, sendOtpType); + GenericResponseModel memberLogin; + if (isFromSilentLogin) { + memberLogin = await _loginApiRepo.sendActivationCodeForSlientLogin(memberLoginModel, facilityID, sendOtpType); + } else { + memberLogin = await _loginApiRepo.sendActivationCode(memberLoginModel, facilityID, sendOtpType); + } + appState.logInTokenID = memberLogin.logInTokenId.toString(); // Utils.showToast(deviceInfo.length.toString()); Utils.hideLoading(); // Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); - startSMSService(sendOtpType,isFromSilentLogin); + if(isFromSilentLogin){ + checkActivationCode("0000", sendOtpType, isFromSilentLogin); + }else{ + startSMSService(sendOtpType, isFromSilentLogin); + } + return memberLogin; } catch (e) { Utils.hideLoading(); @@ -150,11 +184,9 @@ class LoginProviderModel extends BaseViewModel { try { Utils.showLoading(); GenericResponseModel memberLogin = await _loginApiRepo.checkActivationCode(activationCode, sendOtpType, isFromSilentLogin); - - // Utils.showToast(deviceInfo.length.toString()); - _loginApiRepo.getDoctorProfile(); Utils.hideLoading(); - + setSession(memberLogin); + Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.dashboard); return memberLogin; } catch (e) { Utils.hideLoading(); @@ -179,4 +211,47 @@ class LoginProviderModel extends BaseViewModel { onResendCode: () {}, ).displayDialog(navigatorKey.currentContext!); } + + setSession(GenericResponseModel response) { + appState.vidaAuthTokenID = response.vidaAuthTokenId; + appState.vidaRefreshTokenID = response.vidaRefreshTokenId; + appState.authenticationTokenID = response.authenticationTokenId; + appState.listDoctorsClinic = response.listDoctorsClinic; + appState.projectID = response.listDoctorsClinic!.first.projectId!; + appState.clinicId = response.listDoctorsClinic!.first.clinicId!; + MemberLoginModel.saveToPrefs(jsonEncode(appState.memberBeforeLogin!.toJson())); + Utils.saveIntFromPrefs(SharedPrefsConsts.username, appState.doctorUserId ?? 0); + Utils.saveStringFromPrefs(SharedPrefsConsts.password, appState.password ?? ""); + Utils.saveStringFromPrefs(SharedPrefsConsts.logInTokenID, appState.logInTokenID ?? ""); + Utils.saveStringFromPrefs(SharedPrefsConsts.vidaAuthTokenID, appState.vidaAuthTokenID ?? ""); + Utils.saveStringFromPrefs(SharedPrefsConsts.vidaRefreshTokenID, appState.vidaRefreshTokenID ?? ""); + Utils.saveStringFromPrefs(SharedPrefsConsts.authenticationTokenID, appState.authenticationTokenID ?? ""); + Utils.saveIntFromPrefs(SharedPrefsConsts.projectID, appState.projectID); + Utils.saveIntFromPrefs(SharedPrefsConsts.clinicId, appState.clinicId); + Utils.saveStringFromPrefs(SharedPrefsConsts.lastLoginDate, Utils.getMonthNamedFormat(DateTime.now())); + } + + getSession(GetIMEIDetailsModel model) async { + int doctorUserId = await Utils.getIntFromPrefs(SharedPrefsConsts.username); + if (model.doctorID == doctorUserId) { + String password = await Utils.getStringFromPrefs(SharedPrefsConsts.password); + String logInTokenID = await Utils.getStringFromPrefs(SharedPrefsConsts.logInTokenID); + String authenticationTokenID = await Utils.getStringFromPrefs(SharedPrefsConsts.authenticationTokenID); + int clinicId = await Utils.getIntFromPrefs(SharedPrefsConsts.clinicId); + String lastLoginDate = await Utils.getStringFromPrefs(SharedPrefsConsts.lastLoginDate); + appState.setMemberBeforeLogin = await MemberLoginModel.getFromPrefs(); + + appState.doctorUserId = doctorUserId; + appState.password = password; + appState.logInTokenID = logInTokenID; + appState.vidaAuthTokenID = model.vidaAuthTokenID; + appState.vidaRefreshTokenID = model.vidaRefreshTokenID; + appState.authenticationTokenID = authenticationTokenID; + appState.projectID = model.projectID ?? 0; + appState.clinicId = clinicId; + appState.lastLoginImeiDate = model; + appState.lastLoginDate = lastLoginDate; + Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.SILENT_LOGIN); + } + } } diff --git a/lib/services/api_repo/dashboard_api_repo.dart b/lib/services/api_repo/dashboard_api_repo.dart new file mode 100644 index 0000000..dee154d --- /dev/null +++ b/lib/services/api_repo/dashboard_api_repo.dart @@ -0,0 +1,121 @@ +import 'dart:convert'; + +import 'package:hmg_nurses/exceptions/api_exception.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/model/base/generic_response_model2.dart'; +import 'package:hmg_nurses/model/login/member_login_model.dart'; +import 'package:hmg_nurses/model/login/project_info_model.dart'; +import 'package:hmg_nurses/services/api_client.dart'; +import 'package:hmg_nurses/classes/consts.dart'; +import 'package:hmg_nurses/model/base/generic_response_model.dart'; +import 'package:hmg_nurses/model/login/imei_details_model.dart'; +import 'package:hmg_nurses/services/firebase_service.dart'; +import 'package:injector/injector.dart'; + +abstract class IDashboardApiRepo { + Future getDoctorProfile(); + + Future insertDoctorProfile(); +} + +class DashboardApiRepo implements IDashboardApiRepo { + @override + Future getDoctorProfile() async { + String url = "${ApiConsts.baseUrlServices}Doctors.svc/REST/GetDocProfiles"; + Map postParams = {}; + postParams.addAll(appState.postParamsJson); + postParams["ProjectID"] = appState.projectID; + postParams["ClinicID"] = appState.clinicId; + postParams["doctorID"] = appState.memberBeforeLogin!.doctorId; + postParams["IsRegistered"] = true; + postParams["License"] = true; + postParams["TokenID"] = appState.authenticationTokenID; + postParams["DoctorID"] = appState.memberBeforeLogin!.doctorId; + postParams["PatientOutSA"] = false; + + GenericResponseModel2 response; + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel2.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return response; + } + + @override + Future insertDoctorProfile() async { + String url = "${ApiConsts.baseUrlServices}DoctorApplication.svc/REST/DoctorApp_InsertOrUpdateDeviceDetails"; + Map postParams = {}; + postParams.addAll(appState.postParamsJson); + postParams["IMEI"] = appState.imei; + postParams["LogInTypeID"] = appState.lastLoginTyp; + postParams["OutSA"] = null; + postParams["MobileNo"] = appState.doctorProfile!.doctorProfileList!.first.doctorMobileNumber; + postParams["IdentificationNo"] = null; + postParams["DoctorID"] = appState.doctorUserId; + postParams["DoctorName"] = appState.doctorProfile!.doctorProfileList!.first.doctorName; + postParams["DoctorNameN"] = appState.doctorProfile!.doctorProfileList!.first.doctorNameN; + postParams["ClinicID"] = appState.doctorProfile!.doctorProfileList!.first.clinicId; + postParams["ClinicDescription"] = appState.doctorProfile!.doctorProfileList!.first.clinicDescription; + postParams["ClinicDescriptionN"] = appState.doctorProfile!.doctorProfileList!.first.clinicDescriptionN; + postParams["ProjectName"] = appState.doctorProfile!.doctorProfileList!.first.projectName; + postParams["GenderDescription"] = appState.doctorProfile!.doctorProfileList!.first.genderDescription; + postParams["GenderDescriptionN"] = appState.doctorProfile!.doctorProfileList!.first.genderDescriptionN; + postParams["TitleDescription"] = appState.doctorProfile!.doctorProfileList!.first.titleDescription; + postParams["Title_DescriptionN"] = appState.doctorProfile!.doctorProfileList!.first.titleDescriptionN; + postParams["BioMetricEnabled"] = true; + postParams["PreferredLanguage"] = null; + postParams["IsActive"] = appState.doctorProfile!.doctorProfileList!.first.isActive; + postParams["EditedBy"] = appState.doctorProfile!.doctorProfileList!.first.doctorId; + postParams["ProjectID"] = appState.doctorProfile!.doctorProfileList!.first.projectId; + postParams["TokenID"] = appState.authenticationTokenID; + postParams["LoginDoctorID"] = appState.doctorProfile!.doctorProfileList!.first.doctorId; + postParams["Password"] = appState.password; + + logger.d(jsonEncode(postParams)); + GenericResponseModel response; + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return null; + } +} +// { +// "IMEI": "es6V9NcpSzCXR665uSDWGo:APA91bGF_FjdOf8ZOZmw5FU7pkDfzNOvkz-IsSBRrJE6OR0ZE2lyeTxzFtvjZEajUEC_ssD6ytKNEm74lm30KpZEvPdrNgSRR8idlGrRqJ6qK2Lp2lrLtgA1OLMjkkQS1bcpvXcdnEg_", +// "LogInTypeID": 1, +// "OutSA": null, +// "MobileNo": "0553755378", +// "IdentificationNo": null, +// "DoctorID": 13777, +// "DoctorName": "EYAD ISMAIL ABU-JAYAB", +// "DoctorNameN": null, +// "ClinicID": 1, +// "ClinicDescription": "INTERNAL MEDICINE CLINIC", +// "ClinicDescriptionN": null, +// "ProjectName": "Olaya Hospital", +// "GenderDescription": "Male", +// "GenderDescriptionN": null, +// "TitleDescription": "Dr.", +// "Title_DescriptionN": null, +// "BioMetricEnabled": true, +// "PreferredLanguage": null, +// "IsActive": false, +// "EditedBy": 2477, +// "ProjectID": 12, +// "TokenID": "W7qObFELE0+VAtKJoTeq+w==", +// "LanguageID": 2, +// "stamp": "2022-11-27T10:50:25.345098", +// "IPAdress": "9.9.9.9", +// "VersionID": 9, +// "Channel": 9, +// "SessionID": "BlUSkYymTt", +// "IsLoginForDoctorApp": true, +// "PatientOutSA": false, +// "VidaAuthTokenID": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMzc3NyIsImp0aSI6IjNiM2U5MTU4LTJhNmEtNGM4MS04OTk5LWU3ZTRhYzUzMmFiOCIsImVtYWlsIjoiUndhaWQuQWxtYWxsYWhAY2xvdWRzb2x1dGlvbnMuY29tLnNhIiwiaWQiOiIxMzc3NyIsIk5hbWUiOiJSd2FpZCBGb3VkIEhhc3NhbiBBbE1hbGxhaCIsIkVtcGxveWVlSWQiOiIyNDc3IiwiRmFjaWxpdHlHcm91cElkIjoiOTE4NzciLCJGYWNpbGl0eUlkIjoiMTIiLCJQaGFyYW1jeUZhY2lsaXR5SWQiOiI1NiIsIklTX1BIQVJNQUNZX0NPTk5FQ1RFRCI6IlRydWUiLCJEb2N0b3JJZCI6IjI0NzciLCJTRVNTSU9OSUQiOiIyMDYzNDY2OCIsIkNsaW5pY0lkIjoiMSIsIm5iZiI6MTY2OTUzNTQxMSwiZXhwIjoxNjcwMzk5NDExLCJpYXQiOjE2Njk1MzU0MTF9.LkZMiDAt9F4yjbuNyMSIcZYIgct6VuPed7uPOw0PTVw", +// "VidaRefreshTokenID": "sm30FcA2iL0lJmSCAVlNJJ8e0AbfYzHxg+wMGTBSoP9VM9do55BRxjATjBtOJyo60u8tLRk9LHrmmH8Xn+B25A==", +// "Password": "Rr123456", +// "LoginDoctorID": 2477, +// "DeviceTypeID": 1 +// } diff --git a/lib/services/api_repo/login_api_client.dart b/lib/services/api_repo/login_api_client.dart deleted file mode 100644 index e0d6ae0..0000000 --- a/lib/services/api_repo/login_api_client.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'dart:async'; - -import 'package:hmg_nurses/services/api_client.dart'; -import 'package:hmg_nurses/config/app_state.dart'; -import 'package:hmg_nurses/classes/consts.dart'; - - -class LoginApiClient { - static final LoginApiClient _instance = LoginApiClient._internal(); - - LoginApiClient._internal(); - - factory LoginApiClient() => _instance; - - // Future getMobileLoginInfoNEW(String deviceToken, String deviceType) async { - // String url = "${ApiConsts.erpRest}Mohemm_GetMobileLoginInfo_NEW"; - // Map postParams = {}; - // postParams["DeviceToken"] = deviceToken; - // postParams["DeviceType"] = deviceType; - // return await ApiClient().postJsonForObject((json) { - // GenericResponseModel? responseData = GenericResponseModel.fromJson(json); - // return (responseData.mohemmGetMobileLoginInfoList?.length ?? 0) > 0 ? (responseData.mohemmGetMobileLoginInfoList!.first) : null; - // }, url, postParams); - // } - - -} diff --git a/lib/services/api_repo/login_api_repo.dart b/lib/services/api_repo/login_api_repo.dart index cbaad24..7d49c0f 100644 --- a/lib/services/api_repo/login_api_repo.dart +++ b/lib/services/api_repo/login_api_repo.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:hmg_nurses/classes/utils.dart'; import 'package:hmg_nurses/exceptions/api_exception.dart'; import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/model/base/generic_response_model2.dart'; @@ -21,9 +22,9 @@ abstract class ILoginApiRepo { Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType); - Future checkActivationCode(String activationCode, int sendOtpType, bool isFromSilentLogin); + Future sendActivationCodeForSlientLogin(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType); - getDoctorProfile(); + Future checkActivationCode(String activationCode, int sendOtpType, bool isFromSilentLogin); } class LoginApiRepo implements ILoginApiRepo { @@ -39,7 +40,7 @@ class LoginApiRepo implements ILoginApiRepo { Map postParams = {}; postParams.addAll(appState.postParamsJson); postParams["stamp"] = DateTime.now().toIso8601String(); - postParams["IMEI"] = token; + postParams["IMEI"] = appState.imei; GenericResponseModel response; try { response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); @@ -100,7 +101,36 @@ class LoginApiRepo implements ILoginApiRepo { // return GenericResponseModel(); try { response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); - appState.logInTokenID = response.logInTokenId.toString(); + + } catch (e) { + rethrow; + } + return response; + } + + @override + Future sendActivationCodeForSlientLogin(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType) async { + String url = "${ApiConsts.baseUrlServices}DoctorApplication.svc/REST/SendVerificationCode"; + Map postParams = {}; + + postParams.addAll(appState.postParamsJson); + postParams["MobileNumber"] = memberLoginModel.mobileNumber; + postParams["ZipCode"] = memberLoginModel.zipCode; + postParams["IsMobileFingerPrint"] = sendOtpType; + postParams["IMEI"] = appState.imei; + postParams["LoginDoctorID"] = memberLoginModel.doctorId; + postParams["DoctorID"] = memberLoginModel.doctorId; + postParams["MemberID"] = memberLoginModel.listMemberInformation!.first.memberId; + postParams["facilityId"] = facilityID; + postParams["OTP_SendType"] = sendOtpType; + postParams["LoginDoctorID"] = memberLoginModel.doctorId; + postParams["DoctorID"] = memberLoginModel.doctorId; + postParams["TokenID"] = appState.logInTokenID; + GenericResponseModel response; + print(jsonEncode(postParams)); + // return GenericResponseModel(); + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); } catch (e) { rethrow; } @@ -131,37 +161,9 @@ class LoginApiRepo implements ILoginApiRepo { GenericResponseModel response; try { response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); - appState.vidaAuthTokenID = response.vidaAuthTokenId; - appState.vidaRefreshTokenID = response.vidaRefreshTokenId; - appState.authenticationTokenID = response.authenticationTokenId; - appState.listDoctorsClinic = response.listDoctorsClinic; - appState.projectID = response.listDoctorsClinic!.first.projectId!; - appState.clinicId = response.listDoctorsClinic!.first.clinicId!; } catch (e) { rethrow; } return response; } - - @override - getDoctorProfile() async { - String url = "${ApiConsts.baseUrlServices}Doctors.svc/REST/GetDocProfiles"; - Map postParams = {}; - postParams.addAll(appState.postParamsJson); - postParams["ProjectID"] = appState.projectID; - postParams["ClinicID"] = appState.clinicId; - postParams["doctorID"] = appState.memberBeforeLogin!.doctorId; - postParams["IsRegistered"] = true; - postParams["License"] = true; - postParams["TokenID"] = appState.authenticationTokenID; - postParams["DoctorID"] = appState.memberBeforeLogin!.doctorId; - postParams["PatientOutSA"] = false; - - GenericResponseModel2 response; - try { - response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel2.fromJson(json), url, postParams); - } catch (e) { - rethrow; - } - } } diff --git a/lib/ui/dashboard/dashbaord_page.dart b/lib/ui/dashboard/dashbaord_page.dart new file mode 100644 index 0000000..db1ce31 --- /dev/null +++ b/lib/ui/dashboard/dashbaord_page.dart @@ -0,0 +1,26 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; +import 'package:provider/provider.dart'; + +class DashboardPage extends StatefulWidget { + @override + State createState() => _DashboardPageState(); +} + +class _DashboardPageState extends State { + late DashboardProviderModel provider; + + @override + void initState() { + super.initState(); + provider = Provider.of(navigatorKey.currentContext!); + provider.getDocProfile(); + } + + @override + Widget build(BuildContext context) { + return Scaffold(); + } +} diff --git a/lib/ui/login/login_method_page.dart b/lib/ui/login/login_method_page.dart index a3cf133..52c631d 100644 --- a/lib/ui/login/login_method_page.dart +++ b/lib/ui/login/login_method_page.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:hmg_nurses/classes/colors.dart'; +import 'package:hmg_nurses/classes/date-utils.dart'; import 'package:hmg_nurses/classes/enums.dart'; import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/extensions/string_extensions.dart'; @@ -32,10 +33,9 @@ class LoginMethodsPage extends StatefulWidget { class LoginMethodsPageState extends State { bool isMoreOption = false; bool onlySMSBox = false; - late AuthMethodTypes fingerPrintBefore; - late AuthMethodTypes selectedOption; late LoginViewModel loginViewModel; LoginType? loginType; + AuthMethodTypes? selectedAuthType; late LoginProviderModel loginProviderModel; @override @@ -60,6 +60,70 @@ class LoginMethodsPageState extends State { padding: const EdgeInsets.all(21), child: Column( children: [ + if (loginType == LoginType.SILENT_LOGIN && appState.lastLoginImeiDate != null) + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.welcomeBack.tr().toText12(), + (appState.lastLoginImeiDate!.titleDescription! + " " + appState.lastLoginImeiDate!.doctorName!).toText20(isBold: true), + heightSpacer3per(), + LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText14(), + heightSpacer3per(), + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(10)), + border: Border.all(color: HexColor('#707070'), width: 0.1), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.lastLoginDetails.tr().toText13(), + SizedBox( + width: 55.w, + child: Row( + children: [ + "${LocaleKeys.verificationType.tr()} : ".toText11(), + loginViewModel.getType(appState.lastLoginImeiDate!.logInTypeID ?? 1).toText11(isBold: true), + ], + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + (appState.lastLoginImeiDate!.editedOn != null + ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.editedOn ?? ""), isMonthShort: true) + : appState.lastLoginImeiDate!.createdOn != null + ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.createdOn ?? ""), isMonthShort: true) + : '--') + .toText11(isBold: true), + heightSpacer06per(), + (appState.lastLoginImeiDate!.editedOn != null + ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.editedOn ?? "")) + : appState.lastLoginImeiDate!.createdOn != null + ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.createdOn ?? "")) + : '--') + .toText10() + ], + ) + ], + ), + ), + heightSpacer3per(), + LocaleKeys.pleaseVerify.tr().toText14().paddingOnly(left: 1.w), + heightSpacer2per(), + ], + ), Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, @@ -71,7 +135,7 @@ class LoginMethodsPageState extends State { 21.height, ], ), - if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.DIRECT_LOGIN) + if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.SILENT_LOGIN) Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -84,11 +148,26 @@ class LoginMethodsPageState extends State { // appState.setMemberBeforeLogin bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); if (isAuthenticated) { + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.faceID); if (loginType == LoginType.FROM_LOGIN) { - print("Authentacted"); - print(loginType); - loginType = LoginType.REGISTER_NEW_BIO; - setState(() {}); + setState(() { + loginType = LoginType.REGISTER_NEW_BIO; + selectedAuthType = AuthMethodTypes.faceID; + }); + } else if (loginType == LoginType.SILENT_LOGIN) { + if (appState.lastLoginImeiDate!.logInTypeID == loginProviderModel.getLoginMethodId(AuthMethodTypes.faceID)) { + loginProviderModel.sendActivationCode( + appState.memberBeforeLogin!, + appState.projectID, + loginProviderModel.getLoginMethodId(AuthMethodTypes.sms), + true, + ); + } else { + setState(() { + loginType = LoginType.REGISTER_NEW_BIO; + selectedAuthType = AuthMethodTypes.faceID; + }); + } } } else { print("Authentaction Failded"); @@ -105,9 +184,9 @@ class LoginMethodsPageState extends State { bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); if (isAuthenticated) { if (loginType == LoginType.FROM_LOGIN) { - print("Authentacted"); - print(loginType); + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.fingerPrint); loginType = LoginType.REGISTER_NEW_BIO; + selectedAuthType = AuthMethodTypes.fingerPrint; setState(() {}); } } else { @@ -127,6 +206,11 @@ class LoginMethodsPageState extends State { authMethodType: AuthMethodTypes.sms, authenticateUser: (AuthMethodTypes authMethodType, isActive) { // loginViewModel.startSMSService(authMethodType, context: context); + if (selectedAuthType == null) { + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.sms); + } else if (selectedAuthType == AuthMethodTypes.faceID || selectedAuthType == AuthMethodTypes.fingerPrint) { + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(selectedAuthType!); + } loginProviderModel.sendActivationCode( appState.memberBeforeLogin!, appState.projectID, @@ -140,10 +224,19 @@ class LoginMethodsPageState extends State { Expanded( child: VerificationMethodsList( authMethodType: AuthMethodTypes.whatsApp, - onShowMore: () { - setState(() { - isMoreOption = true; - }); + authenticateUser: (AuthMethodTypes authMethodType, isActive) { + // loginViewModel.startSMSService(authMethodType, context: context); + if (selectedAuthType == null) { + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.whatsApp); + } else if (selectedAuthType == AuthMethodTypes.faceID || selectedAuthType == AuthMethodTypes.fingerPrint) { + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(selectedAuthType!); + } + loginProviderModel.sendActivationCode( + appState.memberBeforeLogin!, + appState.projectID, + loginProviderModel.getLoginMethodId(AuthMethodTypes.whatsApp), + false, + ); }, ), ), diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index ebe86f2..52fabd8 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hmg_nurses/classes/colors.dart'; +import 'package:hmg_nurses/classes/consts.dart'; import 'package:hmg_nurses/classes/enums.dart'; import 'package:hmg_nurses/classes/utils.dart'; import 'package:hmg_nurses/config/routes.dart'; @@ -44,6 +45,10 @@ class _LoginPageState extends State { void initState() { super.initState(); provider = Provider.of(navigatorKey.currentContext!); + checkUserSession(); + } + + checkUserSession() async { provider.checkLastSession(); } @@ -138,8 +143,13 @@ class _LoginPageState extends State { DefaultButton( LocaleKeys.login.tr(), () async { - appState.password = passwordController.text; - provider.performLogin(userIdController.text, passwordController.text, branchID); + // provider.checkLastSession(); + bool isSuccess = await provider.performLogin(userIdController.text, passwordController.text, branchID); + if (isSuccess) { + appState.password = passwordController.text; + appState.doctorUserId = int.parse(userIdController.text); + print(appState.doctorUserId); + } }, colors: const [ MyColors.redColor, From c1245da6050e014b27941e989f44af9fb4b29a87 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Tue, 29 Nov 2022 14:12:47 +0300 Subject: [PATCH 8/9] Login Flow Completed --- assets/langs/ar-SA.json | 3 +- assets/langs/en-US.json | 3 +- lib/classes/enums.dart | 3 +- lib/classes/utils.dart | 41 +- lib/config/app_state.dart | 4 +- lib/main.dart | 57 +- lib/provider/login_provider_model.dart | 64 +- lib/services/api_repo/login_api_repo.dart | 2 +- lib/ui/dashboard/dashbaord_page.dart | 17 +- lib/ui/login/login_method_page.dart | 565 +++++++----------- lib/ui/login/login_page.dart | 43 +- lib/ui/login/login_vm.dart | 134 ----- .../widgets/verification_method_card.dart | 2 +- lib/widgets/dialogs/otp_dialog.dart | 8 +- 14 files changed, 355 insertions(+), 591 deletions(-) delete mode 100644 lib/ui/login/login_vm.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 6a108e7..8dfc92f 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -53,5 +53,6 @@ "hr": "س", "min": "د", "years": "سنة", - "months": "أشهر" + "months": "أشهر", + "userOtherAccount": "مستخدم حساب آخر" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 1a15855..a530700 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -53,5 +53,6 @@ "hr": "Hr", "min": "Min", "years": "Years", - "months": "Months" + "months": "Months", + "userOtherAccount": "User Another Account" } \ No newline at end of file diff --git a/lib/classes/enums.dart b/lib/classes/enums.dart index cf55e42..cf27602 100644 --- a/lib/classes/enums.dart +++ b/lib/classes/enums.dart @@ -25,6 +25,5 @@ enum ViewState { enum LoginType { FROM_LOGIN, SILENT_LOGIN, - REGISTER_BIO, - REGISTER_NEW_BIO, + SILENT_WITH_OTP, } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 6f0bf6d..146eb72 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -56,17 +56,33 @@ class Utils { return await Future.delayed(Duration(milliseconds: millis)); } - static void showLoading() { - WidgetsBinding.instance.addPostFrameCallback((_) { - _isLoadingVisible = true; - showDialog( - context: navigatorKey.currentContext!, - barrierColor: Colors.black.withOpacity(0.5), - builder: (BuildContext context) => LoadingDialog(), - ).then((value) { - _isLoadingVisible = false; + static void showLoading({bool isNeedBinding = true}) { + if (isNeedBinding) { + WidgetsBinding.instance.addPostFrameCallback((_) { + showLoadingDialog(); }); - }); + } else { + showLoadingDialog(); + } + } + + static void showLoadingDialog() { + _isLoadingVisible = true; + showDialog( + context: navigatorKey.currentContext!, + barrierColor: Colors.black.withOpacity(0.5), + builder: (BuildContext context) => LoadingDialog(), + ).then((value) { + _isLoadingVisible = false; + }).catchError((e) { + print("--------------catchError---------------"); + print(e); + }).onError( + (error, stackTrace) { + print("--------------onError---------------"); + print(error); + }, + ); } static void hideLoading() { @@ -253,8 +269,6 @@ class Utils { return DateFormat('dd-MMM-yyyy').format(date); } - - static String reverseFormatDate(String date) { String formattedDate; if (date.isNotEmpty) { @@ -340,9 +354,6 @@ class Utils { return selectedDate; } - - - // static void readNFc({required Function(String) onRead}) { // // NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async { diff --git a/lib/config/app_state.dart b/lib/config/app_state.dart index 7155660..2df5feb 100644 --- a/lib/config/app_state.dart +++ b/lib/config/app_state.dart @@ -19,7 +19,9 @@ class AppState { int projectID = 0; int clinicId = 0; - int lastLoginTyp = 0; + + //TODO: Must be -1 before login or logout + int lastLoginTyp = -1; int? doctorUserId; String? password; String? doctorIdFromDB; diff --git a/lib/main.dart b/lib/main.dart index 44c8525..efdce5c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,7 +10,6 @@ import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; import 'package:hmg_nurses/provider/login_provider_model.dart'; import 'package:hmg_nurses/theme/app_theme.dart'; -import 'package:hmg_nurses/ui/login/login_vm.dart'; import 'package:injector/injector.dart'; import 'package:logger/logger.dart'; import 'package:provider/provider.dart'; @@ -21,7 +20,6 @@ import 'generated/codegen_loader.g.dart'; late AppState appState; -// GlobalKey navigatorKey = GlobalKey(); final navigatorKey = GlobalKey(); Logger logger = Logger( @@ -61,9 +59,6 @@ Future main() async { ChangeNotifierProvider( create: (_) => LoginProviderModel(), ), - ChangeNotifierProvider( - create: (_) => LoginViewModel(), - ), ChangeNotifierProvider( create: (_) => DashboardProviderModel(), ) @@ -89,32 +84,30 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder( - builder: (context, constraints) { - return Sizer( - builder: ( - BuildContext context, - Orientation orientation, - DeviceType deviceType, - ) { - SizeConfig().init(constraints, orientation); - List> delegates = context.localizationDelegates; - return MaterialApp( - // key: navigatorKey, - navigatorKey: navigatorKey, - theme: AppTheme.getTheme( - EasyLocalization.of(context)?.locale.languageCode == "ar", - ), - debugShowCheckedModeBanner: false, - localizationsDelegates: delegates, - supportedLocales: context.supportedLocales, - locale: context.locale, - initialRoute: AppRoutes.initialPage, - routes: AppRoutes.routes, - ); - }, - ); - } - ); + return LayoutBuilder(builder: (context, constraints) { + return Sizer( + builder: ( + BuildContext context, + Orientation orientation, + DeviceType deviceType, + ) { + SizeConfig().init(constraints, orientation); + List> delegates = context.localizationDelegates; + return MaterialApp( + // key: navigatorKey, + navigatorKey: navigatorKey, + theme: AppTheme.getTheme( + EasyLocalization.of(context)?.locale.languageCode == "ar", + ), + debugShowCheckedModeBanner: false, + localizationsDelegates: delegates, + supportedLocales: context.supportedLocales, + locale: context.locale, + initialRoute: AppRoutes.initialPage, + routes: AppRoutes.routes, + ); + }, + ); + }); } } diff --git a/lib/provider/login_provider_model.dart b/lib/provider/login_provider_model.dart index 802ca02..1712c2d 100644 --- a/lib/provider/login_provider_model.dart +++ b/lib/provider/login_provider_model.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -7,6 +8,7 @@ import 'package:hmg_nurses/classes/consts.dart'; import 'package:hmg_nurses/classes/enums.dart'; import 'package:hmg_nurses/classes/utils.dart'; import 'package:hmg_nurses/config/routes.dart'; +import 'package:hmg_nurses/generated/locale_keys.g.dart'; import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/model/base/generic_response_model.dart'; import 'package:hmg_nurses/model/base/generic_response_model2.dart'; @@ -69,13 +71,12 @@ class LoginProviderModel extends BaseViewModel { Future loginWithFaceIDAndBiometrics() async { IOSAuthMessages iosStrings = - const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID'); + const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please re-enable your Touch ID'); bool authenticated = false; try { authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, biometricOnly: true, iOSAuthStrings: iosStrings); } on PlatformException catch (e) { print(e); - Utils.hideLoading(); Utils.showToast("Please enable your Touch or Face ID"); } return authenticated; @@ -96,6 +97,21 @@ class LoginProviderModel extends BaseViewModel { } } + String getType(type) { + switch (type) { + case 1: + return LocaleKeys.sms.tr(); + case 3: + return LocaleKeys.fingerPrint.tr(); + case 4: + return LocaleKeys.face.tr(); + case 2: + return LocaleKeys.whatsapp.tr(); + default: + return LocaleKeys.sms.tr(); + } + } + // LoginType getDirectLoginType(type) { // switch (type) { // case 1: @@ -139,8 +155,9 @@ class LoginProviderModel extends BaseViewModel { appState.setMemberBeforeLogin = memberLogin; appState.projectID = branchId; appState.logInTokenID = memberLogin.logInTokenId; + appState.lastLoginTyp=-1; Utils.hideLoading(); - Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); + Navigator.pushReplacementNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); return true; } catch (e) { Utils.hideLoading(); @@ -151,24 +168,27 @@ class LoginProviderModel extends BaseViewModel { } } - Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType, bool isFromSilentLogin) async { + Future sendActivationCode(MemberLoginModel memberLoginModel, int facilityID, int sendOtpType, LoginType loginType, {bool isNeedBinding = true}) async { try { - Utils.showLoading(); + Utils.showLoading(isNeedBinding: isNeedBinding); GenericResponseModel memberLogin; - if (isFromSilentLogin) { - memberLogin = await _loginApiRepo.sendActivationCodeForSlientLogin(memberLoginModel, facilityID, sendOtpType); - } else { - memberLogin = await _loginApiRepo.sendActivationCode(memberLoginModel, facilityID, sendOtpType); - } - appState.logInTokenID = memberLogin.logInTokenId.toString(); - // Utils.showToast(deviceInfo.length.toString()); - Utils.hideLoading(); - // Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); - if(isFromSilentLogin){ - checkActivationCode("0000", sendOtpType, isFromSilentLogin); - }else{ - startSMSService(sendOtpType, isFromSilentLogin); + if (loginType == LoginType.FROM_LOGIN) { + memberLogin = await _loginApiRepo.sendActivationCode(memberLoginModel, facilityID, sendOtpType); + appState.logInTokenID = memberLogin.logInTokenId.toString(); + Utils.hideLoading(); + startSMSService(sendOtpType, false); + } else { + if (loginType == LoginType.SILENT_LOGIN) { + memberLogin = await _loginApiRepo.sendActivationCodeForSlientLogin(memberLoginModel, facilityID, sendOtpType); + appState.logInTokenID = memberLogin.logInTokenId.toString(); + checkActivationCode("0000", sendOtpType, true); + } else { + memberLogin = await _loginApiRepo.sendActivationCodeForSlientLogin(memberLoginModel, facilityID, sendOtpType); + appState.logInTokenID = memberLogin.logInTokenId.toString(); + Utils.hideLoading(); + startSMSService(sendOtpType, true); + } } return memberLogin; @@ -178,15 +198,16 @@ class LoginProviderModel extends BaseViewModel { Utils.confirmDialog(navigatorKey.currentContext!, msg); }); } + return null; } Future checkActivationCode(String activationCode, int sendOtpType, bool isFromSilentLogin) async { try { - Utils.showLoading(); + if (!isFromSilentLogin) Utils.showLoading(); GenericResponseModel memberLogin = await _loginApiRepo.checkActivationCode(activationCode, sendOtpType, isFromSilentLogin); Utils.hideLoading(); setSession(memberLogin); - Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.dashboard); + Navigator.pushReplacementNamed(navigatorKey.currentContext!, AppRoutes.dashboard); return memberLogin; } catch (e) { Utils.hideLoading(); @@ -241,6 +262,7 @@ class LoginProviderModel extends BaseViewModel { String lastLoginDate = await Utils.getStringFromPrefs(SharedPrefsConsts.lastLoginDate); appState.setMemberBeforeLogin = await MemberLoginModel.getFromPrefs(); + appState.lastLoginTyp = -1; appState.doctorUserId = doctorUserId; appState.password = password; appState.logInTokenID = logInTokenID; @@ -251,7 +273,7 @@ class LoginProviderModel extends BaseViewModel { appState.clinicId = clinicId; appState.lastLoginImeiDate = model; appState.lastLoginDate = lastLoginDate; - Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.SILENT_LOGIN); + Navigator.pushReplacementNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.SILENT_LOGIN); } } } diff --git a/lib/services/api_repo/login_api_repo.dart b/lib/services/api_repo/login_api_repo.dart index 7d49c0f..9242722 100644 --- a/lib/services/api_repo/login_api_repo.dart +++ b/lib/services/api_repo/login_api_repo.dart @@ -116,7 +116,7 @@ class LoginApiRepo implements ILoginApiRepo { postParams.addAll(appState.postParamsJson); postParams["MobileNumber"] = memberLoginModel.mobileNumber; postParams["ZipCode"] = memberLoginModel.zipCode; - postParams["IsMobileFingerPrint"] = sendOtpType; + postParams["IsMobileFingerPrint"] = 1; postParams["IMEI"] = appState.imei; postParams["LoginDoctorID"] = memberLoginModel.doctorId; postParams["DoctorID"] = memberLoginModel.doctorId; diff --git a/lib/ui/dashboard/dashbaord_page.dart b/lib/ui/dashboard/dashbaord_page.dart index db1ce31..8804c11 100644 --- a/lib/ui/dashboard/dashbaord_page.dart +++ b/lib/ui/dashboard/dashbaord_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; import 'package:provider/provider.dart'; @@ -21,6 +22,20 @@ class _DashboardPageState extends State { @override Widget build(BuildContext context) { - return Scaffold(); + return Scaffold( + appBar: AppBar( + actions: [ + IconButton( + onPressed: () { + Navigator.pushReplacementNamed(context, AppRoutes.login, arguments: false); + }, + icon: const Icon( + Icons.logout, + color: Colors.white, + ), + ) + ], + ), + ); } } diff --git a/lib/ui/login/login_method_page.dart b/lib/ui/login/login_method_page.dart index 52c631d..fdf8714 100644 --- a/lib/ui/login/login_method_page.dart +++ b/lib/ui/login/login_method_page.dart @@ -4,6 +4,7 @@ import 'package:hexcolor/hexcolor.dart'; import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/classes/date-utils.dart'; import 'package:hmg_nurses/classes/enums.dart'; +import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/extensions/string_extensions.dart'; import 'package:hmg_nurses/extensions/util_extensions.dart'; @@ -11,7 +12,6 @@ import 'package:hmg_nurses/extensions/widget_extensions.dart'; import 'package:hmg_nurses/generated/locale_keys.g.dart'; import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/provider/login_provider_model.dart'; -import 'package:hmg_nurses/ui/login/login_vm.dart'; import 'package:hmg_nurses/ui/login/widgets/verification_method_card.dart'; import 'package:hmg_nurses/widgets/button/default_button.dart'; import 'package:local_auth/local_auth.dart'; @@ -33,7 +33,7 @@ class LoginMethodsPage extends StatefulWidget { class LoginMethodsPageState extends State { bool isMoreOption = false; bool onlySMSBox = false; - late LoginViewModel loginViewModel; + LoginType? loginType; AuthMethodTypes? selectedAuthType; late LoginProviderModel loginProviderModel; @@ -43,396 +43,241 @@ class LoginMethodsPageState extends State { if (loginType == null) { loginType = ModalRoute.of(context)!.settings.arguments as LoginType; } - loginViewModel = context.read(); + loginProviderModel = context.read(); return Scaffold( - appBar: AppBar( - backgroundColor: Colors.transparent, - leading: IconButton( - icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), - onPressed: () => Navigator.pop(context), - ), - // actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width], - ), + // appBar: AppBar( + // backgroundColor: Colors.transparent, + // leading: null, + // // actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width], + // ), body: Container( width: double.infinity, height: double.infinity, padding: const EdgeInsets.all(21), child: Column( children: [ - if (loginType == LoginType.SILENT_LOGIN && appState.lastLoginImeiDate != null) - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.welcomeBack.tr().toText12(), - (appState.lastLoginImeiDate!.titleDescription! + " " + appState.lastLoginImeiDate!.doctorName!).toText20(isBold: true), - heightSpacer3per(), - LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText14(), - heightSpacer3per(), - Container( - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(10)), - border: Border.all(color: HexColor('#707070'), width: 0.1), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ + Expanded( + child: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + 21.height, + if (loginType == LoginType.SILENT_LOGIN && appState.lastLoginImeiDate != null) Column( - mainAxisAlignment: MainAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.lastLoginDetails.tr().toText13(), - SizedBox( - width: 55.w, + children: [ + LocaleKeys.welcomeBack.tr().toText12(), + (appState.lastLoginImeiDate!.titleDescription! + " " + appState.lastLoginImeiDate!.doctorName!).toText20(isBold: true), + heightSpacer3per(), + LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText14(), + heightSpacer3per(), + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(10)), + border: Border.all(color: HexColor('#707070'), width: 0.1), + ), child: Row( - children: [ - "${LocaleKeys.verificationType.tr()} : ".toText11(), - loginViewModel.getType(appState.lastLoginImeiDate!.logInTypeID ?? 1).toText11(isBold: true), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.lastLoginDetails.tr().toText13(), + SizedBox( + width: 55.w, + child: Row( + children: [ + "${LocaleKeys.verificationType.tr()} : ".toText11(), + loginProviderModel.getType(appState.lastLoginImeiDate!.logInTypeID ?? 1).toText11(isBold: true), + ], + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + (appState.lastLoginImeiDate!.editedOn != null + ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.editedOn ?? ""), isMonthShort: true) + : appState.lastLoginImeiDate!.createdOn != null + ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.createdOn ?? ""), isMonthShort: true) + : '--') + .toText11(isBold: true), + heightSpacer06per(), + (appState.lastLoginImeiDate!.editedOn != null + ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.editedOn ?? "")) + : appState.lastLoginImeiDate!.createdOn != null + ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.createdOn ?? "")) + : '--') + .toText10() + ], + ) ], ), ), + heightSpacer3per(), + LocaleKeys.pleaseVerify.tr().toText14().paddingOnly(left: 1.w), + heightSpacer2per(), ], ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - (appState.lastLoginImeiDate!.editedOn != null - ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.editedOn ?? ""), isMonthShort: true) - : appState.lastLoginImeiDate!.createdOn != null - ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.createdOn ?? ""), isMonthShort: true) - : '--') - .toText11(isBold: true), - heightSpacer06per(), - (appState.lastLoginImeiDate!.editedOn != null - ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.editedOn ?? "")) - : appState.lastLoginImeiDate!.createdOn != null - ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(appState.lastLoginImeiDate!.createdOn ?? "")) - : '--') - .toText10() - ], - ) - ], - ), - ), - heightSpacer3per(), - LocaleKeys.pleaseVerify.tr().toText14().paddingOnly(left: 1.w), - heightSpacer2per(), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.REGISTER_NEW_BIO) - Column( - children: [ - LocaleKeys.pleaseVerifyForBio.tr().toText14(), - 21.height, - ], - ), - if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.SILENT_LOGIN) - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.faceID, - isBioAvailable: loginProviderModel.isFaceBioAvailable, - authenticateUser: (AuthMethodTypes authMethodType, isActive) async { - // loginViewModel.startSMSService(authMethodType, context: context); - // appState.setMemberBeforeLogin - bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); - if (isAuthenticated) { - appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.faceID); - if (loginType == LoginType.FROM_LOGIN) { - setState(() { - loginType = LoginType.REGISTER_NEW_BIO; - selectedAuthType = AuthMethodTypes.faceID; - }); - } else if (loginType == LoginType.SILENT_LOGIN) { - if (appState.lastLoginImeiDate!.logInTypeID == loginProviderModel.getLoginMethodId(AuthMethodTypes.faceID)) { - loginProviderModel.sendActivationCode( - appState.memberBeforeLogin!, - appState.projectID, - loginProviderModel.getLoginMethodId(AuthMethodTypes.sms), - true, - ); - } else { - setState(() { - loginType = LoginType.REGISTER_NEW_BIO; - selectedAuthType = AuthMethodTypes.faceID; - }); - } - } - } else { - print("Authentaction Failded"); - } - }, - ), - ), - 21.width, - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.fingerPrint, - isBioAvailable: loginProviderModel.isFingerBioAvailable, - onShowMore: () async { - bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); - if (isAuthenticated) { - if (loginType == LoginType.FROM_LOGIN) { - appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.fingerPrint); - loginType = LoginType.REGISTER_NEW_BIO; - selectedAuthType = AuthMethodTypes.fingerPrint; - setState(() {}); - } - } else { - print("Authentaction Failded"); - } - }, - ), - ), - ], - ), - 21.height, - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.sms, - authenticateUser: (AuthMethodTypes authMethodType, isActive) { - // loginViewModel.startSMSService(authMethodType, context: context); - if (selectedAuthType == null) { - appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.sms); - } else if (selectedAuthType == AuthMethodTypes.faceID || selectedAuthType == AuthMethodTypes.fingerPrint) { - appState.lastLoginTyp = loginProviderModel.getLoginMethodId(selectedAuthType!); - } - loginProviderModel.sendActivationCode( - appState.memberBeforeLogin!, - appState.projectID, - loginProviderModel.getLoginMethodId(AuthMethodTypes.sms), - false, - ); - }, - ), - ), - 21.width, - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.whatsApp, - authenticateUser: (AuthMethodTypes authMethodType, isActive) { - // loginViewModel.startSMSService(authMethodType, context: context); - if (selectedAuthType == null) { - appState.lastLoginTyp = loginProviderModel.getLoginMethodId(AuthMethodTypes.whatsApp); - } else if (selectedAuthType == AuthMethodTypes.faceID || selectedAuthType == AuthMethodTypes.fingerPrint) { - appState.lastLoginTyp = loginProviderModel.getLoginMethodId(selectedAuthType!); - } - loginProviderModel.sendActivationCode( - appState.memberBeforeLogin!, - appState.projectID, - loginProviderModel.getLoginMethodId(AuthMethodTypes.whatsApp), - false, - ); - }, - ), - ), - ], - ), - ], - ), - ], - ), - ), - ); - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.transparent, - leading: IconButton( - icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), - onPressed: () => Navigator.pop(context), - ), - // actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width], - ), - body: SingleChildScrollView( - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - heightSpacer1per(), - if (loginViewModel.isFromLogin) - InkWell( - onTap: () { - // loginViewModel.setUnverified(false, isFromLogin: false); - // loginViewModel.setAppStatus(APPSTATUS.unAuthenticated); - }, - child: const Icon( - Icons.arrow_back_ios, - color: MyColors.darkTextColor, - ), - ), - Column( - children: [ - heightSpacer1per(), - isMoreOption == false - ? Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.welcomeBack.tr().toText12(), - "Dr Amal Ahmed".toText20(isBold: true), - heightSpacer3per(), - LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText14(), - heightSpacer3per(), - Container( - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(10)), - border: Border.all(color: HexColor('#707070'), width: 0.1), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.lastLoginDetails.tr().toText13(), - SizedBox( - width: 55.w, - child: Row( - children: [ - "${LocaleKeys.verificationType.tr()} : ".toText11(), - "${loginViewModel.getType(1)}".toText11(isBold: true), - ], - ), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.end, - children: ["12 NOV, 2022".toText11(isBold: true), heightSpacer06per(), "09:56 AM".toText10()], - ) - ], - ), - ), - heightSpacer3per(), - LocaleKeys.pleaseVerify.tr().toText14().paddingOnly(left: 1.w), - heightSpacer2per(), - ], - ) - : Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.pleaseVerifyForBio.tr().toText14().paddingAll(10), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.SILENT_WITH_OTP) + Column( + children: [ + LocaleKeys.pleaseVerifyForBio.tr().toText14(), + 21.height, ], ), - isMoreOption == false - ? Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.SILENT_LOGIN) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ Expanded( child: VerificationMethodsList( - authMethodType: SelectedAuthMethodTypesService.getMethodsTypeService(1), - authenticateUser: (AuthMethodTypes authMethodType, isActive) { - loginViewModel.startSMSService(authMethodType, context: context); + authMethodType: AuthMethodTypes.faceID, + isBioAvailable: loginProviderModel.isFaceBioAvailable, + authenticateUser: (AuthMethodTypes authMethodType, isActive) async { + bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); + if (isAuthenticated) { + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(authMethodType); + if (loginType == LoginType.FROM_LOGIN) { + setState(() { + loginType = LoginType.FROM_LOGIN; + }); + } else if (loginType == LoginType.SILENT_LOGIN) { + if (appState.lastLoginImeiDate!.logInTypeID == loginProviderModel.getLoginMethodId(authMethodType)) { + loginProviderModel.sendActivationCode( + appState.memberBeforeLogin!, + appState.projectID, + loginProviderModel.getLoginMethodId(AuthMethodTypes.sms), + loginType ?? LoginType.FROM_LOGIN, + isNeedBinding: false, + ); + } else { + setState(() { + loginType = LoginType.SILENT_WITH_OTP; + }); + } + } + } else { + print("Authentication Failed"); + } }, ), ), + 21.width, Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.moreOptions, - onShowMore: () { - setState(() { - isMoreOption = true; - }); - }, - )) - ]), - ]) - : Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - onlySMSBox == false - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.fingerPrint, - authenticateUser: (AuthMethodTypes authMethodType, isActive) { - loginViewModel.startSMSService(authMethodType, context: context); - }, - )), - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.faceID, - authenticateUser: (AuthMethodTypes authMethodType, isActive) { - loginViewModel.startSMSService(authMethodType, context: context); - }, - )) - ], - ) - : const SizedBox(), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.sms, - authenticateUser: (AuthMethodTypes authMethodType, isActive) { - loginViewModel.startSMSService(authMethodType, context: context); - }, - )), - Expanded( - child: VerificationMethodsList( - authMethodType: AuthMethodTypes.whatsApp, - authenticateUser: (AuthMethodTypes authMethodType, isActive) { - loginViewModel.startSMSService(authMethodType, context: context); + child: VerificationMethodsList( + authMethodType: AuthMethodTypes.fingerPrint, + isBioAvailable: loginProviderModel.isFingerBioAvailable, + authenticateUser: (AuthMethodTypes authMethodType, isActive) async { + bool isAuthenticated = await loginProviderModel.loginWithFaceIDAndBiometrics(); + if (isAuthenticated) { + appState.lastLoginTyp = loginProviderModel.getLoginMethodId(authMethodType); + if (loginType == LoginType.FROM_LOGIN) { + setState(() { + loginType = LoginType.FROM_LOGIN; + }); + } else if (loginType == LoginType.SILENT_LOGIN) { + if (appState.lastLoginImeiDate!.logInTypeID == loginProviderModel.getLoginMethodId(authMethodType)) { + loginProviderModel.sendActivationCode( + appState.memberBeforeLogin!, + appState.projectID, + loginProviderModel.getLoginMethodId(AuthMethodTypes.sms), + loginType ?? LoginType.FROM_LOGIN, + isNeedBinding: false, + ); + } else { + setState(() { + loginType = LoginType.SILENT_WITH_OTP; + }); + } + } + } else { + print("Authentication Failed"); + } }, - )) - ], + ), + ), + ], + ), + 21.height, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: VerificationMethodsList( + authMethodType: AuthMethodTypes.sms, + authenticateUser: (AuthMethodTypes authMethodType, isActive) { + if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.SILENT_LOGIN) { + if (appState.lastLoginTyp == -1) appState.lastLoginTyp = loginProviderModel.getLoginMethodId(authMethodType); + if (loginType == LoginType.SILENT_LOGIN) { + loginType = LoginType.SILENT_WITH_OTP; + } + } + loginProviderModel.sendActivationCode( + appState.memberBeforeLogin!, + appState.projectID, + loginProviderModel.getLoginMethodId(AuthMethodTypes.sms), + loginType ?? LoginType.FROM_LOGIN, + ); + }, + ), ), - ]), - - // ) - ], - ), - ], - ), - ), - ), - ), - ), - bottomSheet: !isMoreOption - ? null - : Container( - height: 10.h, - color: MyColors.backgroundColor, - width: double.infinity, - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 4.w), - child: DefaultButton(LocaleKeys.useAnotherAccount.tr(), () {}, colors: const [MyColors.redColor, MyColors.redColor]), + 21.width, + Expanded( + child: VerificationMethodsList( + authMethodType: AuthMethodTypes.whatsApp, + authenticateUser: (AuthMethodTypes authMethodType, isActive) { + if (loginType == LoginType.FROM_LOGIN || loginType == LoginType.SILENT_LOGIN) { + if (appState.lastLoginTyp == -1) appState.lastLoginTyp = loginProviderModel.getLoginMethodId(authMethodType); + if (loginType == LoginType.SILENT_LOGIN) { + loginType = LoginType.SILENT_WITH_OTP; + } + } + loginProviderModel.sendActivationCode( + appState.memberBeforeLogin!, + appState.projectID, + loginProviderModel.getLoginMethodId(AuthMethodTypes.whatsApp), + loginType ?? LoginType.FROM_LOGIN, + ); + }, + ), + ), + ], + ), + ], ), - heightSpacer3per(), + 12.height, ], ), ), ), ), + 21.height, + DefaultButton( + LocaleKeys.useAnotherAccount.tr(), + () async { + Navigator.pushReplacementNamed(context, AppRoutes.login, arguments:false); + }, + colors: const [ + MyColors.redColor, + MyColors.redColor, + ], + ), + ], + ), + ), ); } } diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index 52fabd8..d11c125 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -23,11 +23,7 @@ import 'package:local_auth/local_auth.dart'; import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; -import '../../services/api_repo/login_api_repo.dart'; - class LoginPage extends StatefulWidget { - const LoginPage({Key? key}) : super(key: key); - @override State createState() => _LoginPageState(); } @@ -35,25 +31,36 @@ class LoginPage extends StatefulWidget { class _LoginPageState extends State { int branchID = 0; - late LoginProviderModel provider; + LoginProviderModel? provider; + final loginFormKey = GlobalKey(); + var projectIdController = TextEditingController(); + var userIdController = TextEditingController(); + var passwordController = TextEditingController(); - @override - void initState() { - super.initState(); - provider = Provider.of(navigatorKey.currentContext!); - checkUserSession(); + checkUserSession() async { + provider!.checkLastSession(); } - checkUserSession() async { - provider.checkLastSession(); + setUserSession() async { + await Utils.getStringFromPrefs(SharedPrefsConsts.username); + await Utils.getStringFromPrefs(SharedPrefsConsts.password); } @override Widget build(BuildContext context) { + if (provider == null) { + dynamic? isNeedCheckUserSession = (ModalRoute.of(context)!.settings.arguments); + // setUserSession(); + provider = context.read(); + if (isNeedCheckUserSession == null) { + checkUserSession(); + } + } + return Scaffold( body: SafeArea( child: Column( @@ -96,7 +103,7 @@ class _LoginPageState extends State { isTextIsPassword: true, onChange: (v) { if (v.length == 1) { - provider.getAssignedBranches(userIdController.text); + provider!.getAssignedBranches(userIdController.text); } }, ), @@ -120,11 +127,11 @@ class _LoginPageState extends State { isEnable: false, onClick: () => CustomCupertinoPicker.showCupertinoPicker( context, - provider.assignedBranches, + provider!.assignedBranches, (index) { - projectIdController.text = provider.assignedBranches[index].facilityName!; - branchID = provider.assignedBranches[index].facilityId as int; - provider.notifyListeners(); + projectIdController.text = provider!.assignedBranches[index].facilityName!; + branchID = provider!.assignedBranches[index].facilityId as int; + provider!.notifyListeners(); }, ), ); @@ -144,7 +151,7 @@ class _LoginPageState extends State { LocaleKeys.login.tr(), () async { // provider.checkLastSession(); - bool isSuccess = await provider.performLogin(userIdController.text, passwordController.text, branchID); + bool isSuccess = await provider!.performLogin(userIdController.text, passwordController.text, branchID); if (isSuccess) { appState.password = passwordController.text; appState.doctorUserId = int.parse(userIdController.text); diff --git a/lib/ui/login/login_vm.dart b/lib/ui/login/login_vm.dart deleted file mode 100644 index 4003b2d..0000000 --- a/lib/ui/login/login_vm.dart +++ /dev/null @@ -1,134 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:hmg_nurses/provider/base_vm.dart'; -import 'package:hmg_nurses/classes/enums.dart'; -import 'package:hmg_nurses/classes/utils.dart'; - -import 'package:hmg_nurses/generated/locale_keys.g.dart'; -import 'package:hmg_nurses/widgets/dialogs/otp_dialog.dart'; -import 'package:local_auth/local_auth.dart'; - -class LoginViewModel extends BaseViewModel { - bool isLogin = false; - bool unverified = false; - bool isFromLogin = false; - String localToken = ""; - - String nurseProfile = ""; - - final LocalAuthentication auth = LocalAuthentication(); - late List _availableBiometrics; - - LoginViewModel(); - - /// get type name based on id. - String getType(type) { - switch (type) { - case 1: - return LocaleKeys.sms.tr(); - case 3: - return LocaleKeys.fingerPrint.tr(); - case 4: - return LocaleKeys.face.tr(); - case 2: - return LocaleKeys.whatsapp.tr(); - default: - return LocaleKeys.sms.tr(); - } - } - - int getLoginMethodId(AuthMethodTypes authMethodTypes) { - switch (authMethodTypes) { - case AuthMethodTypes.sms: - return 1; - case AuthMethodTypes.whatsApp: - return 2; - case AuthMethodTypes.fingerPrint: - return 3; - case AuthMethodTypes.faceID: - return 4; - default: - return 1; - } - } - /// ask user to add his biometric - showIOSAuthMessages() async { - try { - await auth.authenticate( - localizedReason: 'Scan your fingerprint to authenticate', - ); - } on PlatformException catch (e) { - if (kDebugMode) { - print(e); - } - } - } - - /// check specific biometric if it available or not - Future checkIfBiometricAvailable(BiometricType biometricType) async { - bool isAvailable = false; - await _getAvailableBiometrics(); - if (_availableBiometrics != null) { - for (var i = 0; i < _availableBiometrics.length; i++) { - if (biometricType == _availableBiometrics[i]) isAvailable = true; - } - } - return isAvailable; - } - - /// get all available biometric on the device for local Auth service - Future _getAvailableBiometrics() async { - try { - _availableBiometrics = await auth.getAvailableBiometrics(); - } on PlatformException catch (e) { - if (kDebugMode) { - print(e); - } - } - } - - /// determine the status of the ap - - setUnverified(bool unverified, {bool isFromLogin = false}) { - this.unverified = unverified; - this.isFromLogin = isFromLogin; - notifyListeners(); - } - - /// logout function - logout({bool isFromLogin = false}) async { - // localToken = ""; - // String lang = await sharedPref.getString(APP_Language); - // await Utils.clearSharedPref(); - // doctorProfile = null; - // sharedPref.setString(APP_Language, lang); - // deleteUser(); - // await getDeviceInfoFromFirebase(); - // this.isFromLogin = isFromLogin; - // appStatus = APPSTATUS.unAuthenticated; - // setState(ViewState.Idle); - } - - deleteUser() { - // user = null; - // unverified = false; - // isLogin = false; - } - - startSMSService(AuthMethodTypes type, {isSilentLogin = false, required BuildContext context}) { - OtpDialog( - type: 1, - mobileNo: "0504278212", - onSuccess: (String otpCode, TextEditingController pinPut) { - Utils.showLoading(); - //TODO: API CALL - // performDirectApiCall(_title, _icon, _flag, value); - }, - onFailure: () => Navigator.pop(context), - onResendCode: () {}, - ).displayDialog(context); - } -} diff --git a/lib/ui/login/widgets/verification_method_card.dart b/lib/ui/login/widgets/verification_method_card.dart index 0199585..556a910 100644 --- a/lib/ui/login/widgets/verification_method_card.dart +++ b/lib/ui/login/widgets/verification_method_card.dart @@ -6,7 +6,7 @@ import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/classes/enums.dart'; import 'package:hmg_nurses/classes/size_config.dart'; import 'package:hmg_nurses/generated/locale_keys.g.dart'; -import 'package:hmg_nurses/ui/login/login_vm.dart'; + import 'package:local_auth/local_auth.dart'; class VerificationMethodsList extends StatelessWidget { diff --git a/lib/widgets/dialogs/otp_dialog.dart b/lib/widgets/dialogs/otp_dialog.dart index 873fad8..0c8f7e1 100644 --- a/lib/widgets/dialogs/otp_dialog.dart +++ b/lib/widgets/dialogs/otp_dialog.dart @@ -216,9 +216,11 @@ class OtpDialog { void startTimer(setState) { remainingTime--; if (stopTimer) return; - setState(() { - displayTime = getSecondsAsDigitalClock(remainingTime); - }); + try { + setState(() { + displayTime = getSecondsAsDigitalClock(remainingTime); + }); + } catch (e) {} timer = Future.delayed(const Duration(seconds: 1), () { if (remainingTime > 0) { From a76be6640a2f7f8b9e913037ffabc4e4978ccc79 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Sun, 4 Dec 2022 16:20:57 +0300 Subject: [PATCH 9/9] Patient Profile and Vital Signs --- assets/images/svgs/bottom_nav/home-active.svg | 3 + .../images/svgs/bottom_nav/reader-active.svg | 9 + .../images/svgs/bottom_nav/reply-active.svg | 6 + .../svgs/bottom_nav/schedule-active.svg | 3 + assets/images/svgs/female avatar.svg | 57 + assets/images/svgs/female.svg | 3 + assets/images/svgs/inpatient.svg | 4 + assets/images/svgs/male avatar.svg | 56 + assets/images/svgs/male.svg | 3 + assets/images/svgs/menu.svg | 19 + assets/images/svgs/no_data.svg | 69 + assets/images/svgs/profile_screen/ECG.svg | 3 + .../svgs/profile_screen/Order Procedures.svg | 3 + .../svgs/profile_screen/Progress notes.svg | 13 + .../images/svgs/profile_screen/Radiology.svg | 3 + assets/images/svgs/profile_screen/UCAF.svg | 3 + .../svgs/profile_screen/admission req.svg | 11 + assets/images/svgs/profile_screen/booked.svg | 10 + .../svgs/profile_screen/create episode.svg | 4 + .../svgs/profile_screen/diabetic chart.svg | 10 + .../images/svgs/profile_screen/diagnosis.svg | 3 + .../svgs/profile_screen/discharge summary.svg | 7 + .../svgs/profile_screen/health summary.svg | 10 + .../profile_screen/insurance approval.svg | 5 + .../svgs/profile_screen/lab results.svg | 3 + .../images/svgs/profile_screen/livecare.svg | 10 + .../svgs/profile_screen/medical report.svg | 3 + .../svgs/profile_screen/modify episode.svg | 4 + .../svgs/profile_screen/operating report.svg | 6 + .../profile_screen/order prescription.svg | 8 + .../svgs/profile_screen/order sheets.svg | 3 + .../profile_screen/patient sick leave.svg | 5 + .../svgs/profile_screen/pending orders.svg | 7 + .../svgs/profile_screen/refer patient.svg | 6 + .../images/svgs/profile_screen/sick leave.svg | 5 + .../svgs/profile_screen/vital signs.svg | 8 + assets/images/svgs/profile_screen/walkin.svg | 8 + .../images/svgs/verification/verify-face.svg | 7 + .../svgs/verification/verify-finger.svg | 9 + .../images/svgs/verification/verify-sms.svg | 11 + .../svgs/verification/verify-whtsapp.svg | 12 + lib/classes/colors.dart | 5 +- lib/classes/consts.dart | 2 +- lib/classes/utils.dart | 8 + lib/config/app_state.dart | 39 +- lib/config/dependencies.dart | 2 + lib/config/routes.dart | 12 + lib/extensions/string_extensions.dart | 36 +- lib/extensions/widget_extensions.dart | 1 + lib/main.dart | 4 + lib/model/base/generic_response_model.dart | 11 + lib/model/base/post_params_model.dart | 32 + .../list_doctor_patient_vital_sign.dart | 191 ++ .../patient_file_information_prm_list.dart | 242 ++ lib/model/patient_profile_card_model.dart | 33 + lib/provider/login_provider_model.dart | 16 +- lib/provider/patient_provider_model.dart | 80 + lib/services/api_repo/patient_api_repo.dart | 80 + lib/ui/dashboard/dashbaord_page.dart | 38 + lib/ui/dashboard/widgets/home_page_card.dart | 48 + .../dashboard/widgets/home_patient_card.dart | 118 + .../patient/profile/patient_profile_page.dart | 56 + .../profile/vital/vital_signs_page.dart | 47 + lib/ui/patient/search_patient_page.dart | 55 + .../patient/searched_patient_list_page.dart | 96 + .../widgets/grid/profile_gird_for_search.dart | 74 + lib/ui/patient/widgets/patient_card.dart | 218 ++ .../widgets/patient_profile_button.dart | 50 + .../widgets/patient_profile_header.dart | 73 + lib/widgets/app_bar_widget.dart | 64 +- lib/widgets/button/default_button.dart | 14 +- lib/widgets/circular_avatar.dart | 13 + lib/widgets/commen/cusom_row.dart | 52 + lib/widgets/errors/error_message.dart | 38 + lib/widgets/icons_app/config.json | 2668 +++++++++++++++++ lib/widgets/icons_app/doctor_app_icons.dart | 407 +++ lib/widgets/input_widget.dart | 14 +- pubspec.lock | 142 +- pubspec.yaml | 6 + 79 files changed, 5421 insertions(+), 96 deletions(-) create mode 100644 assets/images/svgs/bottom_nav/home-active.svg create mode 100644 assets/images/svgs/bottom_nav/reader-active.svg create mode 100644 assets/images/svgs/bottom_nav/reply-active.svg create mode 100644 assets/images/svgs/bottom_nav/schedule-active.svg create mode 100644 assets/images/svgs/female avatar.svg create mode 100644 assets/images/svgs/female.svg create mode 100644 assets/images/svgs/inpatient.svg create mode 100644 assets/images/svgs/male avatar.svg create mode 100644 assets/images/svgs/male.svg create mode 100644 assets/images/svgs/menu.svg create mode 100644 assets/images/svgs/no_data.svg create mode 100644 assets/images/svgs/profile_screen/ECG.svg create mode 100644 assets/images/svgs/profile_screen/Order Procedures.svg create mode 100644 assets/images/svgs/profile_screen/Progress notes.svg create mode 100644 assets/images/svgs/profile_screen/Radiology.svg create mode 100644 assets/images/svgs/profile_screen/UCAF.svg create mode 100644 assets/images/svgs/profile_screen/admission req.svg create mode 100644 assets/images/svgs/profile_screen/booked.svg create mode 100644 assets/images/svgs/profile_screen/create episode.svg create mode 100644 assets/images/svgs/profile_screen/diabetic chart.svg create mode 100644 assets/images/svgs/profile_screen/diagnosis.svg create mode 100644 assets/images/svgs/profile_screen/discharge summary.svg create mode 100644 assets/images/svgs/profile_screen/health summary.svg create mode 100644 assets/images/svgs/profile_screen/insurance approval.svg create mode 100644 assets/images/svgs/profile_screen/lab results.svg create mode 100644 assets/images/svgs/profile_screen/livecare.svg create mode 100644 assets/images/svgs/profile_screen/medical report.svg create mode 100644 assets/images/svgs/profile_screen/modify episode.svg create mode 100644 assets/images/svgs/profile_screen/operating report.svg create mode 100644 assets/images/svgs/profile_screen/order prescription.svg create mode 100644 assets/images/svgs/profile_screen/order sheets.svg create mode 100644 assets/images/svgs/profile_screen/patient sick leave.svg create mode 100644 assets/images/svgs/profile_screen/pending orders.svg create mode 100644 assets/images/svgs/profile_screen/refer patient.svg create mode 100644 assets/images/svgs/profile_screen/sick leave.svg create mode 100644 assets/images/svgs/profile_screen/vital signs.svg create mode 100644 assets/images/svgs/profile_screen/walkin.svg create mode 100644 assets/images/svgs/verification/verify-face.svg create mode 100644 assets/images/svgs/verification/verify-finger.svg create mode 100644 assets/images/svgs/verification/verify-sms.svg create mode 100644 assets/images/svgs/verification/verify-whtsapp.svg create mode 100644 lib/model/patient/list_doctor_patient_vital_sign.dart create mode 100644 lib/model/patient/patient_file_information_prm_list.dart create mode 100644 lib/model/patient_profile_card_model.dart create mode 100644 lib/provider/patient_provider_model.dart create mode 100644 lib/services/api_repo/patient_api_repo.dart create mode 100644 lib/ui/dashboard/widgets/home_page_card.dart create mode 100644 lib/ui/dashboard/widgets/home_patient_card.dart create mode 100644 lib/ui/patient/profile/patient_profile_page.dart create mode 100644 lib/ui/patient/profile/vital/vital_signs_page.dart create mode 100644 lib/ui/patient/search_patient_page.dart create mode 100644 lib/ui/patient/searched_patient_list_page.dart create mode 100644 lib/ui/patient/widgets/grid/profile_gird_for_search.dart create mode 100644 lib/ui/patient/widgets/patient_card.dart create mode 100644 lib/ui/patient/widgets/patient_profile_button.dart create mode 100644 lib/ui/patient/widgets/patient_profile_header.dart create mode 100644 lib/widgets/commen/cusom_row.dart create mode 100644 lib/widgets/errors/error_message.dart create mode 100644 lib/widgets/icons_app/config.json create mode 100644 lib/widgets/icons_app/doctor_app_icons.dart diff --git a/assets/images/svgs/bottom_nav/home-active.svg b/assets/images/svgs/bottom_nav/home-active.svg new file mode 100644 index 0000000..8357b01 --- /dev/null +++ b/assets/images/svgs/bottom_nav/home-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/bottom_nav/reader-active.svg b/assets/images/svgs/bottom_nav/reader-active.svg new file mode 100644 index 0000000..36e7657 --- /dev/null +++ b/assets/images/svgs/bottom_nav/reader-active.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svgs/bottom_nav/reply-active.svg b/assets/images/svgs/bottom_nav/reply-active.svg new file mode 100644 index 0000000..3fc5bd0 --- /dev/null +++ b/assets/images/svgs/bottom_nav/reply-active.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svgs/bottom_nav/schedule-active.svg b/assets/images/svgs/bottom_nav/schedule-active.svg new file mode 100644 index 0000000..a48e165 --- /dev/null +++ b/assets/images/svgs/bottom_nav/schedule-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/female avatar.svg b/assets/images/svgs/female avatar.svg new file mode 100644 index 0000000..1cf831e --- /dev/null +++ b/assets/images/svgs/female avatar.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svgs/female.svg b/assets/images/svgs/female.svg new file mode 100644 index 0000000..307729c --- /dev/null +++ b/assets/images/svgs/female.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/inpatient.svg b/assets/images/svgs/inpatient.svg new file mode 100644 index 0000000..0f6b79b --- /dev/null +++ b/assets/images/svgs/inpatient.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svgs/male avatar.svg b/assets/images/svgs/male avatar.svg new file mode 100644 index 0000000..ff17741 --- /dev/null +++ b/assets/images/svgs/male avatar.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svgs/male.svg b/assets/images/svgs/male.svg new file mode 100644 index 0000000..80cd0c7 --- /dev/null +++ b/assets/images/svgs/male.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/menu.svg b/assets/images/svgs/menu.svg new file mode 100644 index 0000000..6808f51 --- /dev/null +++ b/assets/images/svgs/menu.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svgs/no_data.svg b/assets/images/svgs/no_data.svg new file mode 100644 index 0000000..c54f043 --- /dev/null +++ b/assets/images/svgs/no_data.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svgs/profile_screen/ECG.svg b/assets/images/svgs/profile_screen/ECG.svg new file mode 100644 index 0000000..cc697f9 --- /dev/null +++ b/assets/images/svgs/profile_screen/ECG.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/Order Procedures.svg b/assets/images/svgs/profile_screen/Order Procedures.svg new file mode 100644 index 0000000..9eb44df --- /dev/null +++ b/assets/images/svgs/profile_screen/Order Procedures.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/Progress notes.svg b/assets/images/svgs/profile_screen/Progress notes.svg new file mode 100644 index 0000000..5fc4175 --- /dev/null +++ b/assets/images/svgs/profile_screen/Progress notes.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/images/svgs/profile_screen/Radiology.svg b/assets/images/svgs/profile_screen/Radiology.svg new file mode 100644 index 0000000..8f1d8a4 --- /dev/null +++ b/assets/images/svgs/profile_screen/Radiology.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/UCAF.svg b/assets/images/svgs/profile_screen/UCAF.svg new file mode 100644 index 0000000..79100a5 --- /dev/null +++ b/assets/images/svgs/profile_screen/UCAF.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/admission req.svg b/assets/images/svgs/profile_screen/admission req.svg new file mode 100644 index 0000000..1f45426 --- /dev/null +++ b/assets/images/svgs/profile_screen/admission req.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/svgs/profile_screen/booked.svg b/assets/images/svgs/profile_screen/booked.svg new file mode 100644 index 0000000..bda90bc --- /dev/null +++ b/assets/images/svgs/profile_screen/booked.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/svgs/profile_screen/create episode.svg b/assets/images/svgs/profile_screen/create episode.svg new file mode 100644 index 0000000..88c1cc2 --- /dev/null +++ b/assets/images/svgs/profile_screen/create episode.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svgs/profile_screen/diabetic chart.svg b/assets/images/svgs/profile_screen/diabetic chart.svg new file mode 100644 index 0000000..b558bc6 --- /dev/null +++ b/assets/images/svgs/profile_screen/diabetic chart.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/svgs/profile_screen/diagnosis.svg b/assets/images/svgs/profile_screen/diagnosis.svg new file mode 100644 index 0000000..b0c9b83 --- /dev/null +++ b/assets/images/svgs/profile_screen/diagnosis.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/discharge summary.svg b/assets/images/svgs/profile_screen/discharge summary.svg new file mode 100644 index 0000000..2edd6a1 --- /dev/null +++ b/assets/images/svgs/profile_screen/discharge summary.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svgs/profile_screen/health summary.svg b/assets/images/svgs/profile_screen/health summary.svg new file mode 100644 index 0000000..186af7a --- /dev/null +++ b/assets/images/svgs/profile_screen/health summary.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/svgs/profile_screen/insurance approval.svg b/assets/images/svgs/profile_screen/insurance approval.svg new file mode 100644 index 0000000..f6a5885 --- /dev/null +++ b/assets/images/svgs/profile_screen/insurance approval.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svgs/profile_screen/lab results.svg b/assets/images/svgs/profile_screen/lab results.svg new file mode 100644 index 0000000..5e03a2d --- /dev/null +++ b/assets/images/svgs/profile_screen/lab results.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/livecare.svg b/assets/images/svgs/profile_screen/livecare.svg new file mode 100644 index 0000000..452ffc5 --- /dev/null +++ b/assets/images/svgs/profile_screen/livecare.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/svgs/profile_screen/medical report.svg b/assets/images/svgs/profile_screen/medical report.svg new file mode 100644 index 0000000..f40a960 --- /dev/null +++ b/assets/images/svgs/profile_screen/medical report.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/modify episode.svg b/assets/images/svgs/profile_screen/modify episode.svg new file mode 100644 index 0000000..cdf5d3a --- /dev/null +++ b/assets/images/svgs/profile_screen/modify episode.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svgs/profile_screen/operating report.svg b/assets/images/svgs/profile_screen/operating report.svg new file mode 100644 index 0000000..8d9766b --- /dev/null +++ b/assets/images/svgs/profile_screen/operating report.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svgs/profile_screen/order prescription.svg b/assets/images/svgs/profile_screen/order prescription.svg new file mode 100644 index 0000000..21cadf7 --- /dev/null +++ b/assets/images/svgs/profile_screen/order prescription.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svgs/profile_screen/order sheets.svg b/assets/images/svgs/profile_screen/order sheets.svg new file mode 100644 index 0000000..c9e61e9 --- /dev/null +++ b/assets/images/svgs/profile_screen/order sheets.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svgs/profile_screen/patient sick leave.svg b/assets/images/svgs/profile_screen/patient sick leave.svg new file mode 100644 index 0000000..f585b17 --- /dev/null +++ b/assets/images/svgs/profile_screen/patient sick leave.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svgs/profile_screen/pending orders.svg b/assets/images/svgs/profile_screen/pending orders.svg new file mode 100644 index 0000000..ffe95e3 --- /dev/null +++ b/assets/images/svgs/profile_screen/pending orders.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svgs/profile_screen/refer patient.svg b/assets/images/svgs/profile_screen/refer patient.svg new file mode 100644 index 0000000..65c8f61 --- /dev/null +++ b/assets/images/svgs/profile_screen/refer patient.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svgs/profile_screen/sick leave.svg b/assets/images/svgs/profile_screen/sick leave.svg new file mode 100644 index 0000000..0774eb7 --- /dev/null +++ b/assets/images/svgs/profile_screen/sick leave.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svgs/profile_screen/vital signs.svg b/assets/images/svgs/profile_screen/vital signs.svg new file mode 100644 index 0000000..fe476c3 --- /dev/null +++ b/assets/images/svgs/profile_screen/vital signs.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svgs/profile_screen/walkin.svg b/assets/images/svgs/profile_screen/walkin.svg new file mode 100644 index 0000000..0ef3ecf --- /dev/null +++ b/assets/images/svgs/profile_screen/walkin.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svgs/verification/verify-face.svg b/assets/images/svgs/verification/verify-face.svg new file mode 100644 index 0000000..7969cad --- /dev/null +++ b/assets/images/svgs/verification/verify-face.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svgs/verification/verify-finger.svg b/assets/images/svgs/verification/verify-finger.svg new file mode 100644 index 0000000..e626baf --- /dev/null +++ b/assets/images/svgs/verification/verify-finger.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svgs/verification/verify-sms.svg b/assets/images/svgs/verification/verify-sms.svg new file mode 100644 index 0000000..ae5fa9f --- /dev/null +++ b/assets/images/svgs/verification/verify-sms.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/svgs/verification/verify-whtsapp.svg b/assets/images/svgs/verification/verify-whtsapp.svg new file mode 100644 index 0000000..09ac85c --- /dev/null +++ b/assets/images/svgs/verification/verify-whtsapp.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/lib/classes/colors.dart b/lib/classes/colors.dart index f99cc31..93ea761 100644 --- a/lib/classes/colors.dart +++ b/lib/classes/colors.dart @@ -9,7 +9,7 @@ class MyColors { static const Color gradiantStartColor = Color(0xff33c0a5); static const Color gradiantEndColor = Color(0xff259db7); static const Color textMixColor = Color(0xff2BB8A6); - static const Color backgroundColor = Color(0xffF8F8F8); + static const Color backgroundColor = Color(0xffEDEDED); static const Color grey41Color = Color(0xff414141); static const Color grey57Color = Color(0xff575757); static const Color grey67Color = Color(0xff676767); @@ -40,6 +40,7 @@ class MyColors { static const Color borderColor = Color(0xffE8E8E8); static const Color borderE3Color = Color(0xffE3E3E3); static const Color borderCEColor = Color(0xffCECECE); + //static const Color grey67Color = Color(0xff676767); static const Color whiteColor = Color(0xFFEEEEEE); static const Color greenColor = Color(0xff1FA269); @@ -54,7 +55,7 @@ class MyColors { static const Color lightGreyColor = Color(0xffC7C7C7); static const Color green69Color = Color(0xff1FA169); static const Color redA3Color = Color(0xffCA3332); - static const Color green9CColor = Color(0xff259CB8); + static const Color green9CColor = Color(0xff259CB8); static const Color green2DColor = Color(0xff32D892); static const Color greyC4Color = Color(0xffC4C4C4); static const Color grey35Color = Color(0xff535353); diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 93e419c..4397834 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -5,7 +5,7 @@ class ApiConsts { static String baseUrl = 'https://hmgwebservices.com/'; // static String baseUrl = 'https://uat.hmgwebservices.com/'; - static String baseUrlServices = baseUrl + "/Services/"; // server + static String baseUrlServices = baseUrl + "Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; static String erpRest = baseUrlServices + "ERP.svc/REST/"; diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 146eb72..4fa3b84 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -117,6 +117,14 @@ class Utils { return await prefs.setInt(key, value); } + static String capitalize(str) { + if (str != "") { + return "${str[0].toUpperCase()}${str.substring(1).toLowerCase()}"; + } else { + return str; + } + } + static void handleException(dynamic exception, cxt, Function(String)? onErrorMessage) { String errorMessage; if (exception is APIException) { diff --git a/lib/config/app_state.dart b/lib/config/app_state.dart index 2df5feb..8a3abad 100644 --- a/lib/config/app_state.dart +++ b/lib/config/app_state.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; +import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/model/base/generic_response_model2.dart'; import 'package:hmg_nurses/model/base/post_params_model.dart'; import 'package:hmg_nurses/model/login/imei_details_model.dart'; @@ -23,12 +24,14 @@ class AppState { //TODO: Must be -1 before login or logout int lastLoginTyp = -1; int? doctorUserId; + int? employeeId; String? password; - String? doctorIdFromDB; String? lastLoginDate; GetIMEIDetailsModel? lastLoginImeiDate; List? listDoctorsClinic; + int setupId=91877; + GenericResponseModel2? doctorProfile; bool isAuthenticated = false; @@ -37,22 +40,6 @@ class AppState { bool isLogged = false; - set setLogged(v) => isLogged = v; - - bool? get getIsLogged => isLogged; - - bool businessCardPrivilege = false; - - set setBusinessCardPrivilege(bool v) => businessCardPrivilege = v; - - bool? get getBusinessCardPrivilege => businessCardPrivilege; - - String? forgetPasswordTokenID; - - set setForgetPasswordTokenID(token) => forgetPasswordTokenID = token; - - String? get getForgetPasswordTokenID => forgetPasswordTokenID; - PostParamsModel _postParamsInitConfig = PostParamsModel( tokenID: "", languageID: 2, @@ -85,26 +72,18 @@ class AppState { _postParams?.vidaAuthTokenID = vidaAuthTokenID; _postParams?.vidaRefreshTokenID = vidaRefreshTokenID; _postParams?.imei = imei; - return _postParams?.toJson() ?? {}; + if(isLogged) + _postParams?.tokenID=authenticationTokenID; + return isLogged ? _postParams?.toJsonLogged() ?? {} : _postParams?.toJson() ?? {}; } void setPostParamsModel(PostParamsModel _postParams) { this._postParams = _postParams; } - bool isArabic(context) => EasyLocalization.of(context)?.locale.languageCode == "ar"; + bool isArabic() => EasyLocalization.of(navigatorKey.currentContext!)?.locale.languageCode == "ar"; int getLanguageID(context) => EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2; - String? _username; - - set setUserName(v) => _username = v; - - String? get getUserName => _username; - - MemberLoginModel? _memberBeforeLogin; - - MemberLoginModel? get memberBeforeLogin => _memberBeforeLogin; - - set setMemberBeforeLogin(MemberLoginModel? _memberBeforeLogin) => this._memberBeforeLogin = _memberBeforeLogin; + MemberLoginModel? memberBeforeLogin; } diff --git a/lib/config/dependencies.dart b/lib/config/dependencies.dart index a756568..ebda8d2 100644 --- a/lib/config/dependencies.dart +++ b/lib/config/dependencies.dart @@ -4,6 +4,7 @@ import 'package:hmg_nurses/config/app_state.dart'; import 'package:hmg_nurses/services/api_client.dart'; import 'package:hmg_nurses/services/api_repo/dashboard_api_repo.dart'; import 'package:hmg_nurses/services/api_repo/login_api_repo.dart'; +import 'package:hmg_nurses/services/api_repo/patient_api_repo.dart'; import 'package:hmg_nurses/services/firebase_service.dart'; import 'package:injector/injector.dart'; @@ -21,5 +22,6 @@ class AppDependencies { //repos injector.registerSingleton(() => LoginApiRepo()); injector.registerSingleton(() => DashboardApiRepo()); + injector.registerSingleton(() => PatientApiRepo()); } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 3489aa9..5fcfd44 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -3,6 +3,10 @@ import 'package:hmg_nurses/ui/dashboard/dashbaord_page.dart'; import 'package:hmg_nurses/ui/login/login_method_page.dart'; import 'package:hmg_nurses/ui/login/login_page.dart'; import 'package:hmg_nurses/ui/login/splash_page.dart'; +import 'package:hmg_nurses/ui/patient/profile/patient_profile_page.dart'; +import 'package:hmg_nurses/ui/patient/profile/vital/vital_signs_page.dart'; +import 'package:hmg_nurses/ui/patient/search_patient_page.dart'; +import 'package:hmg_nurses/ui/patient/searched_patient_list_page.dart'; class AppRoutes { static const String initialPage = login; @@ -15,6 +19,10 @@ class AppRoutes { //Dashboard static const String dashboard = "/dashboard"; + static const String searchPatient = "/searchPatient"; + static const String searchedFor = "/searchedFor"; + static const String patientProfile = "/patientProfile"; + static const String vitalSigns = "/vitalSigns"; static final Map routes = { //Login @@ -24,5 +32,9 @@ class AppRoutes { //Dashboard dashboard: (BuildContext context) => DashboardPage(), + searchPatient: (BuildContext context) => SearchPatientPage(), + searchedFor: (BuildContext context) => SearchedPatientListPage(), + patientProfile: (BuildContext context) => PatientProfilePage(), + vitalSigns: (BuildContext context) => VitalSignsPage(), }; } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 6d26ca1..d0af0b9 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -17,10 +17,17 @@ extension CapExtension on String { extension EmailValidator on String { Widget get toWidget => Text(this); - Widget toText10({Color? color, bool isBold = false, int? maxlines, FontStyle? fontStyle}) => Text( + Widget toText10({Color? color, bool isBold = false, int? maxlines, FontStyle? fontStyle, TextOverflow? textOverflow}) => Text( this, maxLines: maxlines, - style: TextStyle(fontSize: 10.sp, fontStyle: fontStyle ?? FontStyle.normal, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), + overflow: textOverflow, + style: TextStyle( + fontSize: 10.sp, + fontStyle: fontStyle ?? FontStyle.normal, + fontWeight: isBold ? FontWeight.bold : FontWeight.w600, + color: color ?? MyColors.darkTextColor, + letterSpacing: -0.4, + ), ); Widget toText11({Color? color, FontWeight? weight, bool isUnderLine = false, bool isBold = false}) => Text( @@ -70,15 +77,20 @@ extension EmailValidator on String { double fontSize = 12, double letterSpacing = -0.72, double height = 1, + TextOverflow? textOverflow, + FontWeight? fontWeight, }) => AutoSizeText( this, textAlign: isCenter ? TextAlign.center : null, maxLines: (maxLine > 0) ? maxLine : null, minFontSize: 5, + overflow: textOverflow, style: TextStyle( fontSize: fontSize, - fontWeight: isBold ? FontWeight.bold : FontWeight.w600, + fontWeight: fontWeight ?? (isBold + ? FontWeight.bold + : FontWeight.w600), color: color ?? MyColors.darkTextColor, letterSpacing: letterSpacing, decoration: isUnderLine ? TextDecoration.underline : null, @@ -101,9 +113,17 @@ extension EmailValidator on String { decoration: isUnderLine ? TextDecoration.underline : null), ); - Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines}) => Text( + Widget toText16({ + Color? color, + bool isUnderLine = false, + bool isBold = false, + int? maxlines, + TextAlign? textAlign, + }) => + Text( this, maxLines: maxlines, + textAlign: textAlign, style: TextStyle( color: color ?? MyColors.darkTextColor, fontSize: 16.sp, @@ -232,4 +252,12 @@ extension EmailValidator on String { return ""; } } + + String truncate(int max, {String suffix = ''}) { + try { + return length <= max ? this : '${substring(0, max - suffix.length)}$suffix'; + } catch (e) { + return this; + } + } } diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index b801be5..ed1a714 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -15,6 +15,7 @@ extension WidgetExtensions on Widget { Widget circle(double _value) => ClipRRect(borderRadius: BorderRadius.circular(_value), child: this); + Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), child: this); Widget paddingSymmetrical(double horizontal, double vertical) => Padding(padding: EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical), child: this); diff --git a/lib/main.dart b/lib/main.dart index efdce5c..5100ad0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,6 +17,7 @@ import 'package:provider/single_child_widget.dart'; import 'package:sizer/sizer.dart'; import 'generated/codegen_loader.g.dart'; +import 'provider/patient_provider_model.dart'; late AppState appState; @@ -61,6 +62,9 @@ Future main() async { ), ChangeNotifierProvider( create: (_) => DashboardProviderModel(), + ), + ChangeNotifierProvider( + create: (_) => PatientProviderModel(), ) ], child: MyApp(), diff --git a/lib/model/base/generic_response_model.dart b/lib/model/base/generic_response_model.dart index 6ed950b..51388c5 100644 --- a/lib/model/base/generic_response_model.dart +++ b/lib/model/base/generic_response_model.dart @@ -7,6 +7,8 @@ import 'dart:convert'; import 'package:hmg_nurses/model/login/imei_details_model.dart'; import 'package:hmg_nurses/model/login/list_doctors_clinic_model.dart'; import 'package:hmg_nurses/model/login/member_information_model.dart'; +import 'package:hmg_nurses/model/patient/list_doctor_patient_vital_sign.dart'; +import 'package:hmg_nurses/model/patient/patient_file_information_prm_list.dart'; import '../login/project_info_model.dart'; @@ -196,6 +198,8 @@ class GenericResponseModel { this.requisitionStatusList, this.resultValue, this.specialAuthenticate, + this.getPatientFileInformationPrmList, + this.listDoctorPatientVitalSign, }); final dynamic date; @@ -378,6 +382,8 @@ class GenericResponseModel { final dynamic requisitionStatusList; final int? resultValue; final bool? specialAuthenticate; + final List? getPatientFileInformationPrmList; + final List? listDoctorPatientVitalSign; factory GenericResponseModel.fromJson(Map json) => GenericResponseModel( date: json["Date"], @@ -560,6 +566,11 @@ class GenericResponseModel { requisitionStatusList: json["requisitionStatusList"], resultValue: json["resultValue"] == null ? null : json["resultValue"], specialAuthenticate: json["specialAuthenticate"] == null ? null : json["specialAuthenticate"], + getPatientFileInformationPrmList: json["GetPatientFileInformation_PRMList"] == null + ? null + : List.from(json["GetPatientFileInformation_PRMList"].map((x) => GetPatientFileInformationPrmList.fromJson(x))), + listDoctorPatientVitalSign: + json["List_DoctorPatientVitalSign"] == null ? null : List.from(json["List_DoctorPatientVitalSign"].map((x) => ListDoctorPatientVitalSign.fromJson(x))), ); Map toJson() => { diff --git a/lib/model/base/post_params_model.dart b/lib/model/base/post_params_model.dart index 462f3f3..e09b571 100644 --- a/lib/model/base/post_params_model.dart +++ b/lib/model/base/post_params_model.dart @@ -14,6 +14,12 @@ class PostParamsModel { int? deviceTypeID; String? generalID; + //After Login + int? doctorId; + int? editedBy; + int? projectId; + int? clinicId; + PostParamsModel({ this.imei, this.tokenID, @@ -29,6 +35,10 @@ class PostParamsModel { this.vidaRefreshTokenID, this.deviceTypeID, this.generalID, + this.doctorId, + this.editedBy, + this.projectId, + this.clinicId, }); PostParamsModel.fromJson(Map json) { @@ -66,6 +76,28 @@ class PostParamsModel { return data; } + Map toJsonLogged() { + Map data = new Map(); + data['TokenID'] = this.tokenID; + data['LanguageID'] = this.languageID; + data['stamp'] = this.stamp; + data['IPAdress'] = this.iPAdress; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['SessionID'] = this.sessionID; + data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp; + data['PatientOutSA'] = this.patientOutSA; + data['VidaAuthTokenID'] = this.vidaAuthTokenID; + data['VidaRefreshTokenID'] = this.vidaRefreshTokenID; + data['DeviceTypeID'] = this.deviceTypeID; + data['generalid'] = this.generalID; + data['DoctorID'] = this.doctorId; + data['EditedBy'] = this.editedBy; + data['ProjectID'] = this.projectId; + data['ClinicID'] = this.clinicId; + return data; + } + // Map toJsonAfterLogin() { // Map data = new Map(); // data['VersionID'] = this.versionID; diff --git a/lib/model/patient/list_doctor_patient_vital_sign.dart b/lib/model/patient/list_doctor_patient_vital_sign.dart new file mode 100644 index 0000000..5013742 --- /dev/null +++ b/lib/model/patient/list_doctor_patient_vital_sign.dart @@ -0,0 +1,191 @@ +class ListDoctorPatientVitalSign { + ListDoctorPatientVitalSign({ + this.transNo, + this.projectId, + this.weightKg, + this.heightCm, + this.temperatureCelcius, + this.pulseBeatPerMinute, + this.respirationBeatPerMinute, + this.bloodPressureLower, + this.bloodPressureHigher, + this.sao2, + this.fio2, + this.painScore, + this.bodyMassIndex, + this.headCircumCm, + this.leanBodyWeightLbs, + this.idealBodyWeightLbs, + this.temperatureCelciusMethod, + this.pulseRhythm, + this.respirationPattern, + this.bloodPressureCuffLocation, + this.bloodPressureCuffSize, + this.bloodPressurePatientPosition, + this.painLocation, + this.painDuration, + this.painCharacter, + this.painFrequency, + this.isPainManagementDone, + this.status, + this.isVitalsRequired, + this.patientId, + this.createdOn, + this.doctorId, + this.clinicId, + this.triageCategory, + this.gcScore, + this.lineItemNo, + this.vitalSignDate, + this.actualTimeTaken, + this.sugarLevel, + this.fbs, + this.rbs, + this.observationType, + this.heartRate, + this.muscleTone, + this.reflexIrritability, + this.bodyColor, + this.isFirstAssessment, + this.dateofBirth, + this.timeOfBirth, + this.bloodPressure, + this.bloodPressureCuffLocationDesc, + this.bloodPressureCuffSizeDesc, + this.bloodPressurePatientPositionDesc, + this.clinicName, + this.doctorImageUrl, + this.doctorName, + this.painScoreDesc, + this.pulseRhythmDesc, + this.respirationPatternDesc, + this.temperatureCelciusMethodDesc, + this.time, + }); + + final int? transNo; + final dynamic projectId; + final double? weightKg; + final double? heightCm; + final double? temperatureCelcius; + final int? pulseBeatPerMinute; + final int? respirationBeatPerMinute; + final int? bloodPressureLower; + final int? bloodPressureHigher; + final int? sao2; + final int? fio2; + final dynamic painScore; + final double? bodyMassIndex; + final int? headCircumCm; + final int? leanBodyWeightLbs; + final int? idealBodyWeightLbs; + final int? temperatureCelciusMethod; + final int? pulseRhythm; + final int? respirationPattern; + final dynamic bloodPressureCuffLocation; + final dynamic bloodPressureCuffSize; + final dynamic bloodPressurePatientPosition; + final String? painLocation; + final String? painDuration; + final String? painCharacter; + final String? painFrequency; + final bool? isPainManagementDone; + final int? status; + final bool? isVitalsRequired; + final int? patientId; + final String? createdOn; + final int? doctorId; + final int? clinicId; + final dynamic triageCategory; + final dynamic gcScore; + final dynamic lineItemNo; + final dynamic vitalSignDate; + final dynamic actualTimeTaken; + final dynamic sugarLevel; + final dynamic fbs; + final dynamic rbs; + final dynamic observationType; + final dynamic heartRate; + final dynamic muscleTone; + final dynamic reflexIrritability; + final dynamic bodyColor; + final dynamic isFirstAssessment; + final dynamic dateofBirth; + final dynamic timeOfBirth; + final String? bloodPressure; + final String? bloodPressureCuffLocationDesc; + final String? bloodPressureCuffSizeDesc; + final String? bloodPressurePatientPositionDesc; + final String? clinicName; + final String? doctorImageUrl; + final String? doctorName; + final String? painScoreDesc; + final String? pulseRhythmDesc; + final String? respirationPatternDesc; + final String? temperatureCelciusMethodDesc; + final dynamic time; + + factory ListDoctorPatientVitalSign.fromJson(Map json) => ListDoctorPatientVitalSign( + transNo: json["TransNo"] == null ? null : json["TransNo"], + projectId: json["ProjectID"], + weightKg: json["WeightKg"] == null ? null : json["WeightKg"].toDouble(), + heightCm: json["HeightCm"] == null ? null : json["HeightCm"].toDouble(), + temperatureCelcius: json["TemperatureCelcius"] == null ? null : json["TemperatureCelcius"].toDouble(), + pulseBeatPerMinute: json["PulseBeatPerMinute"] == null ? null : json["PulseBeatPerMinute"], + respirationBeatPerMinute: json["RespirationBeatPerMinute"] == null ? null : json["RespirationBeatPerMinute"], + bloodPressureLower: json["BloodPressureLower"] == null ? null : json["BloodPressureLower"], + bloodPressureHigher: json["BloodPressureHigher"] == null ? null : json["BloodPressureHigher"], + sao2: json["SAO2"] == null ? null : json["SAO2"], + fio2: json["FIO2"] == null ? null : json["FIO2"], + painScore: json["PainScore"], + bodyMassIndex: json["BodyMassIndex"] == null ? null : json["BodyMassIndex"].toDouble(), + headCircumCm: json["HeadCircumCm"] == null ? null : json["HeadCircumCm"], + leanBodyWeightLbs: json["LeanBodyWeightLbs"] == null ? null : json["LeanBodyWeightLbs"], + idealBodyWeightLbs: json["IdealBodyWeightLbs"] == null ? null : json["IdealBodyWeightLbs"], + temperatureCelciusMethod: json["TemperatureCelciusMethod"] == null ? null : json["TemperatureCelciusMethod"], + pulseRhythm: json["PulseRhythm"] == null ? null : json["PulseRhythm"], + respirationPattern: json["RespirationPattern"] == null ? null : json["RespirationPattern"], + bloodPressureCuffLocation: json["BloodPressureCuffLocation"], + bloodPressureCuffSize: json["BloodPressureCuffSize"], + bloodPressurePatientPosition: json["BloodPressurePatientPosition"], + painLocation: json["PainLocation"] == null ? null : json["PainLocation"], + painDuration: json["PainDuration"] == null ? null : json["PainDuration"], + painCharacter: json["PainCharacter"] == null ? null : json["PainCharacter"], + painFrequency: json["PainFrequency"] == null ? null : json["PainFrequency"], + isPainManagementDone: json["IsPainManagementDone"] == null ? null : json["IsPainManagementDone"], + status: json["Status"] == null ? null : json["Status"], + isVitalsRequired: json["IsVitalsRequired"] == null ? null : json["IsVitalsRequired"], + patientId: json["PatientID"] == null ? null : json["PatientID"], + createdOn: json["CreatedOn"] == null ? null : json["CreatedOn"], + doctorId: json["DoctorID"] == null ? null : json["DoctorID"], + clinicId: json["ClinicID"] == null ? null : json["ClinicID"], + triageCategory: json["TriageCategory"], + gcScore: json["GCScore"], + lineItemNo: json["LineItemNo"], + vitalSignDate: json["VitalSignDate"], + actualTimeTaken: json["ActualTimeTaken"], + sugarLevel: json["SugarLevel"], + fbs: json["FBS"], + rbs: json["RBS"], + observationType: json["ObservationType"], + heartRate: json["HeartRate"], + muscleTone: json["MuscleTone"], + reflexIrritability: json["ReflexIrritability"], + bodyColor: json["BodyColor"], + isFirstAssessment: json["IsFirstAssessment"], + dateofBirth: json["DateofBirth"], + timeOfBirth: json["TimeOfBirth"], + bloodPressure: json["BloodPressure"] == null ? null : json["BloodPressure"], + bloodPressureCuffLocationDesc: json["BloodPressureCuffLocationDesc"] == null ? null : json["BloodPressureCuffLocationDesc"], + bloodPressureCuffSizeDesc: json["BloodPressureCuffSizeDesc"] == null ? null : json["BloodPressureCuffSizeDesc"], + bloodPressurePatientPositionDesc: json["BloodPressurePatientPositionDesc"] == null ? null : json["BloodPressurePatientPositionDesc"], + clinicName: json["ClinicName"] == null ? null : json["ClinicName"], + doctorImageUrl: json["DoctorImageURL"] == null ? null : json["DoctorImageURL"], + doctorName: json["DoctorName"] == null ? null : json["DoctorName"], + painScoreDesc: json["PainScoreDesc"] == null ? null : json["PainScoreDesc"], + pulseRhythmDesc: json["PulseRhythmDesc"] == null ? null : json["PulseRhythmDesc"], + respirationPatternDesc: json["RespirationPatternDesc"] == null ? null : json["RespirationPatternDesc"], + temperatureCelciusMethodDesc: json["TemperatureCelciusMethodDesc"] == null ? null : json["TemperatureCelciusMethodDesc"], + time: json["Time"], + ); +} diff --git a/lib/model/patient/patient_file_information_prm_list.dart b/lib/model/patient/patient_file_information_prm_list.dart new file mode 100644 index 0000000..738cc5b --- /dev/null +++ b/lib/model/patient/patient_file_information_prm_list.dart @@ -0,0 +1,242 @@ +class GetPatientFileInformationPrmList { + GetPatientFileInformationPrmList({ + this.patientId, + this.setupId, + this.patientType, + this.firstName, + this.middleName, + this.lastName, + this.firstNameN, + this.middleNameN, + this.lastNameN, + this.gender, + this.dateofBirth, + this.dateofBirthN, + this.nationalityId, + this.phoneResi, + this.phoneOffice, + this.mobileNumber, + this.faxNumber, + this.emailAddress, + this.isEmailAlertRequired, + this.isSmsAlertRequired, + this.preferredLanguage, + this.emergencyContactName, + this.emergencyContactNo, + this.patientIdentificationType, + this.patientIdentificationNo, + this.projectId, + this.receiveHealthSummaryReport, + this.noShowCount, + this.isPatientHasMobileDeviceToken, + this.editedBy, + this.isIvrStopped, + this.crsClientIdentifierId, + this.crsVerificationStatus, + this.crsVerifiedBy, + this.crsVerificationStatusDesc, + this.crsVerificationStatusDescN, + this.numberPosition, + this.status, + this.isPrivilegedMember, + this.address, + this.age, + this.emaiLAddress, + this.genderDescription, + this.genderImage, + this.isPatientDataVerified, + this.isPatientPrivilegedMember, + this.nationalityDescription, + this.nationalityFlagUrl, + this.poBox, + this.patientDataVerified, + this.patientName, + this.patientTypeDescription, + this.patientTypeDescriptionN, + this.statusDscription, + this.tempAddress, + this.upcomingAppointmentsNumber, + this.zipCode, + this.patientStatusType, + }); + + final int? patientId; + final String? setupId; + final int? patientType; + final String? firstName; + final String? middleName; + final String? lastName; + final String? firstNameN; + final String? middleNameN; + final String? lastNameN; + final int? gender; + final String? dateofBirth; + final String? dateofBirthN; + final String? nationalityId; + final String? phoneResi; + final String? phoneOffice; + final String? mobileNumber; + final String? faxNumber; + final String? emailAddress; + final bool? isEmailAlertRequired; + final bool? isSmsAlertRequired; + final String? preferredLanguage; + final String? emergencyContactName; + final String? emergencyContactNo; + final int? patientIdentificationType; + final String? patientIdentificationNo; + final int? projectId; + final bool? receiveHealthSummaryReport; + final int? noShowCount; + final bool? isPatientHasMobileDeviceToken; + final int? editedBy; + final dynamic isIvrStopped; + final dynamic crsClientIdentifierId; + final dynamic crsVerificationStatus; + final dynamic crsVerifiedBy; + final dynamic crsVerificationStatusDesc; + final dynamic crsVerificationStatusDescN; + final int? numberPosition; + final int? status; + final dynamic isPrivilegedMember; + final dynamic address; + final int? age; + final String? emaiLAddress; + final String? genderDescription; + final String? genderImage; + final bool? isPatientDataVerified; + final bool? isPatientPrivilegedMember; + final String? nationalityDescription; + final String? nationalityFlagUrl; + final dynamic poBox; + final int? patientDataVerified; + final String? patientName; + final String? patientTypeDescription; + final dynamic patientTypeDescriptionN; + final String? statusDscription; + final dynamic tempAddress; + final int? upcomingAppointmentsNumber; + final String? zipCode; + final int? patientStatusType; + + factory GetPatientFileInformationPrmList.fromJson(Map json) => GetPatientFileInformationPrmList( + patientId: json["PatientID"] == null ? null : json["PatientID"], + setupId: json["SetupID"] == null ? null : json["SetupID"], + patientType: json["PatientType"] == null ? null : json["PatientType"], + firstName: json["FirstName"] == null ? null : json["FirstName"], + middleName: json["MiddleName"] == null ? null : json["MiddleName"], + lastName: json["LastName"] == null ? null : json["LastName"], + firstNameN: json["FirstNameN"] == null ? null : json["FirstNameN"], + middleNameN: json["MiddleNameN"] == null ? null : json["MiddleNameN"], + lastNameN: json["LastNameN"] == null ? null : json["LastNameN"], + gender: json["Gender"] == null ? null : json["Gender"], + dateofBirth: json["DateofBirth"] == null ? null : json["DateofBirth"], + dateofBirthN: json["DateofBirthN"] == null ? null : json["DateofBirthN"], + nationalityId: json["NationalityID"] == null ? null : json["NationalityID"], + phoneResi: json["PhoneResi"] == null ? null : json["PhoneResi"], + phoneOffice: json["PhoneOffice"] == null ? null : json["PhoneOffice"], + mobileNumber: json["MobileNumber"] == null ? null : json["MobileNumber"], + faxNumber: json["FaxNumber"] == null ? null : json["FaxNumber"], + emailAddress: json["EmailAddress"] == null ? null : json["EmailAddress"], + isEmailAlertRequired: json["IsEmailAlertRequired"] == null ? null : json["IsEmailAlertRequired"], + isSmsAlertRequired: json["IsSMSAlertRequired"] == null ? null : json["IsSMSAlertRequired"], + preferredLanguage: json["PreferredLanguage"] == null ? null : json["PreferredLanguage"], + emergencyContactName: json["EmergencyContactName"] == null ? null : json["EmergencyContactName"], + emergencyContactNo: json["EmergencyContactNo"] == null ? null : json["EmergencyContactNo"], + patientIdentificationType: json["PatientIdentificationType"] == null ? null : json["PatientIdentificationType"], + patientIdentificationNo: json["PatientIdentificationNo"] == null ? null : json["PatientIdentificationNo"], + projectId: json["ProjectID"] == null ? null : json["ProjectID"], + receiveHealthSummaryReport: json["ReceiveHealthSummaryReport"] == null ? null : json["ReceiveHealthSummaryReport"], + noShowCount: json["NoShowCount"] == null ? null : json["NoShowCount"], + isPatientHasMobileDeviceToken: json["IsPatientHasMobileDeviceToken"] == null ? null : json["IsPatientHasMobileDeviceToken"], + editedBy: json["EditedBy"] == null ? null : json["EditedBy"], + isIvrStopped: json["IsIVRStopped"], + crsClientIdentifierId: json["CRSClientIdentifierID"], + crsVerificationStatus: json["CRSVerificationStatus"], + crsVerifiedBy: json["CRSVerifiedBy"], + crsVerificationStatusDesc: json["CRSVerificationStatusDesc"], + crsVerificationStatusDescN: json["CRSVerificationStatusDescN"], + numberPosition: json["NumberPosition"] == null ? null : json["NumberPosition"], + status: json["Status"] == null ? null : json["Status"], + isPrivilegedMember: json["IsPrivilegedMember"], + address: json["Address"], + age: json["Age"] == null ? null : json["Age"], + emaiLAddress: json["EmaiLAddress"] == null ? null : json["EmaiLAddress"], + genderDescription: json["GenderDescription"] == null ? null : json["GenderDescription"], + genderImage: json["GenderImage"] == null ? null : json["GenderImage"], + isPatientDataVerified: json["IsPatientDataVerified"] == null ? null : json["IsPatientDataVerified"], + isPatientPrivilegedMember: json["IsPatientPrivilegedMember"] == null ? null : json["IsPatientPrivilegedMember"], + nationalityDescription: json["NationalityDescription"] == null ? null : json["NationalityDescription"], + nationalityFlagUrl: json["NationalityFlagURL"] == null ? null : json["NationalityFlagURL"], + poBox: json["POBox"], + patientDataVerified: json["PatientDataVerified"] == null ? null : json["PatientDataVerified"], + patientName: json["PatientName"] == null ? null : json["PatientName"], + patientTypeDescription: json["PatientTypeDescription"] == null ? null : json["PatientTypeDescription"], + patientTypeDescriptionN: json["PatientTypeDescriptionN"], + statusDscription: json["StatusDscription"] == null ? null : json["StatusDscription"], + tempAddress: json["TempAddress"], + upcomingAppointmentsNumber: json["UpcomingAppointmentsNumber"] == null ? null : json["UpcomingAppointmentsNumber"], + zipCode: json["ZipCode"] == null ? null : json["ZipCode"], + patientStatusType: json["patientStatusType"] ?? json["PatientStatusType"], + ); + + Map toJson() => { + "PatientID": patientId == null ? null : patientId, + "SetupID": setupId == null ? null : setupId, + "PatientType": patientType == null ? null : patientType, + "FirstName": firstName == null ? null : firstName, + "MiddleName": middleName == null ? null : middleName, + "LastName": lastName == null ? null : lastName, + "FirstNameN": firstNameN == null ? null : firstNameN, + "MiddleNameN": middleNameN == null ? null : middleNameN, + "LastNameN": lastNameN == null ? null : lastNameN, + "Gender": gender == null ? null : gender, + "DateofBirth": dateofBirth == null ? null : dateofBirth, + "DateofBirthN": dateofBirthN == null ? null : dateofBirthN, + "NationalityID": nationalityId == null ? null : nationalityId, + "PhoneResi": phoneResi == null ? null : phoneResi, + "PhoneOffice": phoneOffice == null ? null : phoneOffice, + "MobileNumber": mobileNumber == null ? null : mobileNumber, + "FaxNumber": faxNumber == null ? null : faxNumber, + "EmailAddress": emailAddress == null ? null : emailAddress, + "IsEmailAlertRequired": isEmailAlertRequired == null ? null : isEmailAlertRequired, + "IsSMSAlertRequired": isSmsAlertRequired == null ? null : isSmsAlertRequired, + "PreferredLanguage": preferredLanguage == null ? null : preferredLanguage, + "EmergencyContactName": emergencyContactName == null ? null : emergencyContactName, + "EmergencyContactNo": emergencyContactNo == null ? null : emergencyContactNo, + "PatientIdentificationType": patientIdentificationType == null ? null : patientIdentificationType, + "PatientIdentificationNo": patientIdentificationNo == null ? null : patientIdentificationNo, + "ProjectID": projectId == null ? null : projectId, + "ReceiveHealthSummaryReport": receiveHealthSummaryReport == null ? null : receiveHealthSummaryReport, + "NoShowCount": noShowCount == null ? null : noShowCount, + "IsPatientHasMobileDeviceToken": isPatientHasMobileDeviceToken == null ? null : isPatientHasMobileDeviceToken, + "EditedBy": editedBy == null ? null : editedBy, + "IsIVRStopped": isIvrStopped, + "CRSClientIdentifierID": crsClientIdentifierId, + "CRSVerificationStatus": crsVerificationStatus, + "CRSVerifiedBy": crsVerifiedBy, + "CRSVerificationStatusDesc": crsVerificationStatusDesc, + "CRSVerificationStatusDescN": crsVerificationStatusDescN, + "NumberPosition": numberPosition == null ? null : numberPosition, + "Status": status == null ? null : status, + "IsPrivilegedMember": isPrivilegedMember, + "Address": address, + "Age": age == null ? null : age, + "EmaiLAddress": emaiLAddress == null ? null : emaiLAddress, + "GenderDescription": genderDescription == null ? null : genderDescription, + "GenderImage": genderImage == null ? null : genderImage, + "IsPatientDataVerified": isPatientDataVerified == null ? null : isPatientDataVerified, + "IsPatientPrivilegedMember": isPatientPrivilegedMember == null ? null : isPatientPrivilegedMember, + "NationalityDescription": nationalityDescription == null ? null : nationalityDescription, + "NationalityFlagURL": nationalityFlagUrl == null ? null : nationalityFlagUrl, + "POBox": poBox, + "PatientDataVerified": patientDataVerified == null ? null : patientDataVerified, + "PatientName": patientName == null ? null : patientName, + "PatientTypeDescription": patientTypeDescription == null ? null : patientTypeDescription, + "PatientTypeDescriptionN": patientTypeDescriptionN, + "StatusDscription": statusDscription == null ? null : statusDscription, + "TempAddress": tempAddress, + "UpcomingAppointmentsNumber": upcomingAppointmentsNumber == null ? null : upcomingAppointmentsNumber, + "ZipCode": zipCode == null ? null : zipCode, + }; +} diff --git a/lib/model/patient_profile_card_model.dart b/lib/model/patient_profile_card_model.dart new file mode 100644 index 0000000..8e0cc6d --- /dev/null +++ b/lib/model/patient_profile_card_model.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +class PatientProfileCardModel { + final String nameLine1; + final String nameLine2; + final dynamic route; + final String icon; + final bool isInPatient; + final bool isDisable; + final bool isLoading; + final Function? onTap; + final bool isDischargedPatient; + final bool isSelectInpatient; + final bool isDartIcon; + final IconData? dartIcon; + final Color? color; + + PatientProfileCardModel( + this.nameLine1, + this.nameLine2, + this.route, + this.icon, { + this.isInPatient = false, + this.isDisable = false, + this.isLoading = false, + this.onTap, + this.isDischargedPatient = false, + this.isSelectInpatient = false, + this.isDartIcon = false, + this.dartIcon, + this.color, + }); +} diff --git a/lib/provider/login_provider_model.dart b/lib/provider/login_provider_model.dart index 1712c2d..0efefeb 100644 --- a/lib/provider/login_provider_model.dart +++ b/lib/provider/login_provider_model.dart @@ -12,6 +12,7 @@ import 'package:hmg_nurses/generated/locale_keys.g.dart'; import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/model/base/generic_response_model.dart'; import 'package:hmg_nurses/model/base/generic_response_model2.dart'; +import 'package:hmg_nurses/model/base/post_params_model.dart'; import 'package:hmg_nurses/model/login/imei_details_model.dart'; import 'package:hmg_nurses/model/login/member_login_model.dart'; import 'package:hmg_nurses/model/login/project_info_model.dart'; @@ -152,10 +153,10 @@ class LoginProviderModel extends BaseViewModel { Utils.showLoading(); MemberLoginModel memberLogin = await _loginApiRepo.memberLogin(userID, password, branchId); // Utils.showToast(deviceInfo.length.toString()); - appState.setMemberBeforeLogin = memberLogin; + appState.memberBeforeLogin = memberLogin; appState.projectID = branchId; appState.logInTokenID = memberLogin.logInTokenId; - appState.lastLoginTyp=-1; + appState.lastLoginTyp = -1; Utils.hideLoading(); Navigator.pushReplacementNamed(navigatorKey.currentContext!, AppRoutes.loginMethodsPage, arguments: LoginType.FROM_LOGIN); return true; @@ -240,6 +241,13 @@ class LoginProviderModel extends BaseViewModel { appState.listDoctorsClinic = response.listDoctorsClinic; appState.projectID = response.listDoctorsClinic!.first.projectId!; appState.clinicId = response.listDoctorsClinic!.first.clinicId!; + appState.employeeId = response.memberInformation!.employeeId; + appState.isLogged = true; + PostParamsModel? paramsModel = appState.postParamsObject; + paramsModel!.doctorId = appState.employeeId; + paramsModel.editedBy = appState.employeeId; + paramsModel.projectId = appState.projectID; + paramsModel.clinicId = appState.clinicId; MemberLoginModel.saveToPrefs(jsonEncode(appState.memberBeforeLogin!.toJson())); Utils.saveIntFromPrefs(SharedPrefsConsts.username, appState.doctorUserId ?? 0); Utils.saveStringFromPrefs(SharedPrefsConsts.password, appState.password ?? ""); @@ -260,10 +268,12 @@ class LoginProviderModel extends BaseViewModel { String authenticationTokenID = await Utils.getStringFromPrefs(SharedPrefsConsts.authenticationTokenID); int clinicId = await Utils.getIntFromPrefs(SharedPrefsConsts.clinicId); String lastLoginDate = await Utils.getStringFromPrefs(SharedPrefsConsts.lastLoginDate); - appState.setMemberBeforeLogin = await MemberLoginModel.getFromPrefs(); + appState.memberBeforeLogin = await MemberLoginModel.getFromPrefs(); + // print(appState.memberBeforeLogin!.toJson()); appState.lastLoginTyp = -1; appState.doctorUserId = doctorUserId; + appState.employeeId = appState.memberBeforeLogin!.listMemberInformation!.first.employeeId; appState.password = password; appState.logInTokenID = logInTokenID; appState.vidaAuthTokenID = model.vidaAuthTokenID; diff --git a/lib/provider/patient_provider_model.dart b/lib/provider/patient_provider_model.dart new file mode 100644 index 0000000..ca826fe --- /dev/null +++ b/lib/provider/patient_provider_model.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_nurses/classes/utils.dart'; +import 'package:hmg_nurses/config/app_state.dart'; +import 'package:hmg_nurses/config/routes.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/model/base/generic_response_model.dart'; +import 'package:hmg_nurses/model/patient/patient_file_information_prm_list.dart'; +import 'package:hmg_nurses/provider/base_vm.dart'; +import 'package:hmg_nurses/services/api_repo/patient_api_repo.dart'; +import 'package:injector/injector.dart'; + +class PatientProviderModel extends BaseViewModel { + final IPatientApiRepo _patientApiRepo = Injector.appInstance.get(); + late GenericResponseModel searchedPatient; + late GenericResponseModel vitalSignHistory; + List filteredPatientsList = []; + + searchPatient(int patientId) async { + try { + Utils.showLoading(); + searchedPatient = await _patientApiRepo.getPatientInfo(patientId); + Utils.showToast(searchedPatient.getPatientFileInformationPrmList!.length.toString()); + filteredPatientsList.addAll(searchedPatient.getPatientFileInformationPrmList!); + Utils.hideLoading(); + Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.searchedFor, arguments: patientId); + return true; + } catch (e) { + Utils.hideLoading(); + Utils.handleException(e, navigatorKey.currentContext!, (msg) { + Utils.confirmDialog(navigatorKey.currentContext!, msg); + }); + return false; + } + } + + filterPatient(String str) { + var strExist = str.length > 0 ? true : false; + if (strExist) { + filteredPatientsList = []; + for (var i = 0; i < searchedPatient.getPatientFileInformationPrmList!.length; i++) { + String firstName = searchedPatient.getPatientFileInformationPrmList![i].firstName!.toUpperCase(); + String lastName = searchedPatient.getPatientFileInformationPrmList![i].lastName!.toUpperCase(); + String mobile = searchedPatient.getPatientFileInformationPrmList![i].mobileNumber!.toUpperCase(); + String patientID = searchedPatient.getPatientFileInformationPrmList![i].patientId.toString(); + + if (firstName.contains(str.toUpperCase()) || lastName.contains(str.toUpperCase()) || mobile.contains(str) || patientID.contains(str)) { + filteredPatientsList.add(searchedPatient.getPatientFileInformationPrmList![i]); + } + } + notifyListeners(); + } else { + filteredPatientsList = searchedPatient.getPatientFileInformationPrmList!; + notifyListeners(); + } + } + + fetchVitalSignsHistory(GetPatientFileInformationPrmList patient) async { + try { + Utils.showLoading(); + vitalSignHistory = await _patientApiRepo.getVitalSigns( + patientID: patient.patientId, + patientTypeID: patient.patientType, + inOutPatientType: 0, + isDentalAllowedBackend: false, + doctorID: appState.employeeId, + setupID: appState.setupId, + patientType: patient.patientType); + Utils.showToast(vitalSignHistory.listDoctorPatientVitalSign!.length.toString()); + Utils.hideLoading(); + // Navigator.pushNamed(navigatorKey.currentContext!, AppRoutes.searchedFor, arguments: patientId); + return true; + } catch (e) { + Utils.hideLoading(); + Utils.handleException(e, navigatorKey.currentContext!, (msg) { + Utils.confirmDialog(navigatorKey.currentContext!, msg); + }); + return false; + } + } +} diff --git a/lib/services/api_repo/patient_api_repo.dart b/lib/services/api_repo/patient_api_repo.dart new file mode 100644 index 0000000..0c7e447 --- /dev/null +++ b/lib/services/api_repo/patient_api_repo.dart @@ -0,0 +1,80 @@ +import 'dart:convert'; + +import 'package:hmg_nurses/classes/consts.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/model/base/generic_response_model.dart'; +import 'package:hmg_nurses/services/api_client.dart'; +import 'package:injector/injector.dart'; + +abstract class IPatientApiRepo { + Future getPatientInfo(int patientID); + + Future getVitalSigns({int? patientID, int? patientTypeID, int? inOutPatientType, bool isDentalAllowedBackend, int? doctorID, int setupID, int? patientType}); +} + +class PatientApiRepo implements IPatientApiRepo { + @override + Future getPatientInfo(int patientID) async { + String url = "${ApiConsts.baseUrlServices}Patients.svc/REST/GetPatientInformation_PRM"; + Map postParams = {}; + + postParams.addAll(appState.postParamsJson); + postParams["FirstName"] = "0"; + postParams["MiddleName"] = "0"; + postParams["LastName"] = "0"; + postParams["PatientMobileNumber"] = "0"; + postParams["PatientIdentificationID"] = "0"; + postParams["PatientID"] = patientID; + postParams["From"] = "0"; + postParams["To"] = "0"; + postParams["SearchType"] = 1; + postParams["MobileNo"] = ""; + postParams["IdentificationNo"] = "0"; + postParams["NursingStationID"] = "0"; + GenericResponseModel response; + print(jsonEncode(postParams)); + // return GenericResponseModel(); + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return response; + } + + @override + Future getVitalSigns({int? patientID, int? patientTypeID, int? inOutPatientType, bool? isDentalAllowedBackend, int? doctorID, int? setupID, int? patientType}) async { + String url = "${ApiConsts.baseUrlServices}Doctors.svc/REST/Doctor_GetPatientVitalSign"; + Map postParams = {}; + + // { + // "PatientID": 12, + // "PatientTypeID": 1, + // "InOutPatientType": 0, + // "isDentalAllowedBackend": false, + // "DoctorID": 2477, + // "SetupID": "91877", + // "PatientType": 1, + // } + + postParams.addAll(appState.postParamsJson); + postParams["PatientID"] = patientID; + postParams["PatientTypeID"] = patientTypeID; + postParams["InOutPatientType"] = inOutPatientType; + postParams["isDentalAllowedBackend"] = isDentalAllowedBackend; + postParams["DoctorID"] = doctorID; + postParams["SetupID"] = setupID; + postParams["PatientType"] = patientType; + postParams.remove("ProjectID"); + postParams.remove("ClinicID"); + + GenericResponseModel response; + // return GenericResponseModel(); + try { + response = await Injector.appInstance.get().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + } catch (e) { + rethrow; + } + return response; + } +} diff --git a/lib/ui/dashboard/dashbaord_page.dart b/lib/ui/dashboard/dashbaord_page.dart index 8804c11..b9bac0e 100644 --- a/lib/ui/dashboard/dashbaord_page.dart +++ b/lib/ui/dashboard/dashbaord_page.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'package:hmg_nurses/config/routes.dart'; import 'package:hmg_nurses/main.dart'; import 'package:hmg_nurses/provider/dashboard_provider_model.dart'; +import 'package:hmg_nurses/ui/dashboard/widgets/home_patient_card.dart'; +import 'package:hmg_nurses/widgets/icons_app/doctor_app_icons.dart'; import 'package:provider/provider.dart'; class DashboardPage extends StatefulWidget { @@ -27,6 +29,7 @@ class _DashboardPageState extends State { actions: [ IconButton( onPressed: () { + appState.isLogged = false; Navigator.pushReplacementNamed(context, AppRoutes.login, arguments: false); }, icon: const Icon( @@ -36,6 +39,41 @@ class _DashboardPageState extends State { ) ], ), + body: Container( + width: double.infinity, + height: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + showHomeButton(), + ], + ), + ), + ); + } + + Widget showHomeButton() { + return Container( + width: 120, + height: 120, + child: HomePatientCard( + gradient: const LinearGradient( + begin: Alignment(-1.0, -2.0), + end: Alignment(1.0, 2.0), + colors: [ + Colors.red, + Color(0xFFAD3B3B), + ], + ), + backgroundIconColor: Colors.white12, + cardIcon: DoctorApp.search, + textColor: Colors.white, + text: "Search Patient", + onTap: () { + Navigator.pushNamed(context, AppRoutes.searchPatient); + }, + ), ); } } diff --git a/lib/ui/dashboard/widgets/home_page_card.dart b/lib/ui/dashboard/widgets/home_page_card.dart new file mode 100644 index 0000000..615ef89 --- /dev/null +++ b/lib/ui/dashboard/widgets/home_page_card.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; + +class HomePageCard extends StatelessWidget { + const HomePageCard( + {this.hasBorder = false, + required this.imageName, + required this.child, + required this.onTap, + required this.color, + this.opacity = 0.4, + required this.margin, + required this.width, + required this.gradient}); + + final bool hasBorder; + final String imageName; + final Widget child; + final GestureTapCallback onTap; + final Color color; + final double opacity; + final double width; + final EdgeInsets margin; + final LinearGradient gradient; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Container( + width: width, + margin: this.margin, + decoration: BoxDecoration( + gradient: gradient, + borderRadius: BorderRadius.circular(20.0), + border: hasBorder ? Border.all(width: 1.0, color: const Color(0xffcccccc)) : Border.all(width: 0.0, color: Colors.transparent), + image: imageName != null + ? DecorationImage( + image: AssetImage('assets/images/patient/ucaf.png'), + fit: BoxFit.cover, + colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.2), BlendMode.dstIn), + ) + : null, + ), + child: child, + ), + ); + } +} diff --git a/lib/ui/dashboard/widgets/home_patient_card.dart b/lib/ui/dashboard/widgets/home_patient_card.dart new file mode 100644 index 0000000..262dce2 --- /dev/null +++ b/lib/ui/dashboard/widgets/home_patient_card.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_nurses/classes/size_config.dart'; +import 'package:hmg_nurses/ui/dashboard/widgets/home_page_card.dart'; + +class HomePatientCard extends StatelessWidget { + final Color? backgroundColor; + final IconData? cardIcon; + final String? cardIconImage; + final Color? backgroundIconColor; + final String? text; + final Color? textColor; + final VoidCallback? onTap; + final double iconSize; + final LinearGradient? gradient; + + HomePatientCard({ + this.backgroundColor, + this.backgroundIconColor, + this.cardIcon, + this.cardIconImage, + this.text, + this.textColor, + this.onTap, + this.iconSize = 30, + this.gradient, + }); + + @override + Widget build(BuildContext context) { + double width = SizeConfig.heightMultiplier! * + (SizeConfig.isHeightVeryShort + ? 16 + : SizeConfig.isHeightLarge + ? 15 + : 13); + return HomePageCard( + color: backgroundColor??Colors.black, + width: width, + gradient: gradient??LinearGradient(colors: []), + margin: EdgeInsets.all(SizeConfig.widthMultiplier! * 1.121), + child: Container( + padding: EdgeInsets.all(8), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Stack( + children: [ + Container( + margin: EdgeInsets.only(top: 18, left: 10), + color: Colors.transparent, + child: cardIcon != null + ? Icon( + cardIcon, + size: iconSize * 2, + color: backgroundIconColor, + ) + : IconButton( + icon: Image.asset( + 'assets/images/patient/ucaf.png', + width: iconSize * 2, + height: iconSize * 2, + fit: BoxFit.fill, + ), + iconSize: iconSize * 2, + color: backgroundIconColor, + onPressed: () => null, + ), + ), + Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + cardIcon != null + ? Icon( + cardIcon, + size: SizeConfig.getWidthMultiplier(width: width) * 30, + color: textColor, + ) + : Image.asset( + cardIconImage!, + height: iconSize, + width: iconSize, + ), + SizedBox( + height: 4, + ), + ], + ), + ), + ], + ), + ), + Expanded( + child: Container( + child: Text( + text!, + textAlign: TextAlign.start, + style: TextStyle( + color: textColor, + letterSpacing: -0.33, + fontWeight: FontWeight.w600, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth(width: width) * (SizeConfig.isHeightVeryShort ? 11 : 10), + ), + ), + ), + ), + ], + ), + ), + hasBorder: false, + onTap: onTap!, + imageName: '', + ); + } +} diff --git a/lib/ui/patient/profile/patient_profile_page.dart b/lib/ui/patient/profile/patient_profile_page.dart new file mode 100644 index 0000000..b165712 --- /dev/null +++ b/lib/ui/patient/profile/patient_profile_page.dart @@ -0,0 +1,56 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_nurses/classes/date-utils.dart'; +import 'package:hmg_nurses/extensions/int_extensions.dart'; +import 'package:hmg_nurses/extensions/string_extensions.dart'; +import 'package:hmg_nurses/model/patient/patient_file_information_prm_list.dart'; +import 'package:hmg_nurses/ui/patient/widgets/grid/profile_gird_for_search.dart'; +import 'package:hmg_nurses/ui/patient/widgets/patient_profile_header.dart'; +import 'package:hmg_nurses/widgets/app_bar_widget.dart'; +import 'package:hmg_nurses/widgets/circular_avatar.dart'; +import 'package:hmg_nurses/widgets/commen/cusom_row.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class PatientProfilePage extends StatelessWidget { + late GetPatientFileInformationPrmList patientProfile; + + @override + Widget build(BuildContext context) { + patientProfile = ModalRoute.of(context)!.settings.arguments as GetPatientFileInformationPrmList; + return Scaffold( + appBar: AppBarWidget( + context, + title: "${patientProfile.firstName!} ${patientProfile.lastName!}", + actions: [ + SvgPicture.asset( + patientProfile.gender == 1 ? "assets/images/svgs/male.svg" : "assets/images/svgs/female.svg", + ), + IconButton( + onPressed: () async { + String url = "tel://${patientProfile.mobileNumber}"; + if (!await launchUrl(Uri.parse(url))) { + throw 'Could not launch $url'; + } + }, + icon: const Icon(Icons.call), + ), + ], + ), + body: SingleChildScrollView( + child: Column( + children: [ + PatientProfileHeader(patientProfile), + Container( + width: double.infinity, + margin: const EdgeInsets.all(21), + child: ProfileGridForSearch( + patient: patientProfile, + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/ui/patient/profile/vital/vital_signs_page.dart b/lib/ui/patient/profile/vital/vital_signs_page.dart new file mode 100644 index 0000000..3ab5672 --- /dev/null +++ b/lib/ui/patient/profile/vital/vital_signs_page.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_nurses/model/patient/patient_file_information_prm_list.dart'; +import 'package:hmg_nurses/provider/patient_provider_model.dart'; +import 'package:hmg_nurses/ui/patient/widgets/patient_profile_header.dart'; +import 'package:hmg_nurses/widgets/app_bar_widget.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class VitalSignsPage extends StatelessWidget { + late GetPatientFileInformationPrmList patientProfile; + late PatientProviderModel provider; + + @override + Widget build(BuildContext context) { + patientProfile = ModalRoute.of(context)!.settings.arguments as GetPatientFileInformationPrmList; + provider = context.read(); + provider.fetchVitalSignsHistory(patientProfile); + return Scaffold( + appBar: AppBarWidget( + context, + title: "${patientProfile.firstName!} ${patientProfile.lastName!}", + actions: [ + SvgPicture.asset( + patientProfile.gender == 1 ? "assets/images/svgs/male.svg" : "assets/images/svgs/female.svg", + ), + IconButton( + onPressed: () async { + String url = "tel://${patientProfile.mobileNumber}"; + if (!await launchUrl(Uri.parse(url))) { + throw 'Could not launch $url'; + } + }, + icon: const Icon(Icons.call), + ), + ], + ), + body: SingleChildScrollView( + child: Column( + children: [ + PatientProfileHeader(patientProfile), + ], + ), + ), + ); + } +} diff --git a/lib/ui/patient/search_patient_page.dart b/lib/ui/patient/search_patient_page.dart new file mode 100644 index 0000000..f4e7d4d --- /dev/null +++ b/lib/ui/patient/search_patient_page.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:hmg_nurses/classes/colors.dart'; +import 'package:hmg_nurses/provider/patient_provider_model.dart'; +import 'package:hmg_nurses/widgets/app_bar_widget.dart'; +import 'package:hmg_nurses/widgets/button/default_button.dart'; +import 'package:hmg_nurses/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class SearchPatientPage extends StatelessWidget { + var searchController = TextEditingController(); + + PatientProviderModel? provider; + + @override + Widget build(BuildContext context) { + provider = context.read(); + return Scaffold( + appBar: AppBarWidget(context, title: "Search Patients", isNeedLeading: false, actions: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(Icons.close), + ), + ]), + body: Container( + padding: const EdgeInsets.all(21), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomTextField( + "Search By Patient Id", + searchController, + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp("[0-9]"), + ), + ], + ), + DefaultButton( + "Search", + () async { + // provider.checkLastSession(); + if (searchController.text.length > 0) { + provider?.searchPatient(int.parse(searchController.text)); + } + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/patient/searched_patient_list_page.dart b/lib/ui/patient/searched_patient_list_page.dart new file mode 100644 index 0000000..79eb92d --- /dev/null +++ b/lib/ui/patient/searched_patient_list_page.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_nurses/config/routes.dart'; +import 'package:hmg_nurses/extensions/int_extensions.dart'; +import 'package:hmg_nurses/provider/patient_provider_model.dart'; +import 'package:hmg_nurses/ui/patient/widgets/patient_card.dart'; +import 'package:hmg_nurses/widgets/app_bar_widget.dart'; +import 'package:hmg_nurses/widgets/errors/error_message.dart'; +import 'package:hmg_nurses/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class SearchedPatientListPage extends StatelessWidget { + int? patientId; + late PatientProviderModel provider; + var searchController = TextEditingController(); + + @override + Widget build(BuildContext context) { + patientId ??= ModalRoute.of(context)!.settings.arguments as int; + provider = context.read(); + return Scaffold( + appBar: AppBarWidget( + context, + title: "Search For $patientId", + ), + body: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(21), + child: Column( + children: [ + CustomTextField( + "Search Name, Medical File, Phone Number", + searchController, + suffixIcon: Icons.filter_alt, + onChange: (v) { + provider.filterPatient(v); + }, + ), + 21.height, + Expanded( + child: Consumer( + builder: (_, model, widget) { + return model.searchedPatient.getPatientFileInformationPrmList!.isEmpty + ? ErrorMessage(errorMessage: "No Data Found") + : Column( + children: [ + model.filteredPatientsList.isEmpty + ? ErrorMessage(errorMessage: "No Data") + : Expanded( + child: SizedBox( + width: double.infinity, + height: double.infinity, + child: ListView.separated( + itemBuilder: (context, index) { + // String nationalityName = model.filteredPatientsList[index].nationalityName != null + // ? model.filteredPatientsList[index].nationalityName.trim() + // : model.filteredPatientsList[index].nationality != null + // ? model.filteredPatientsList[index].nationality.trim() + // : model.filteredPatientsList[index].nationalityId != null + // ? model.filteredPatientsList[index].nationalityId + // : ""; + return PatientCard( + name: "${model.filteredPatientsList[index].firstName!} ${model.filteredPatientsList[index].lastName!}", + gender: model.filteredPatientsList[index].gender??1 , + nationalityName: (model.filteredPatientsList[index].nationalityId != null) ? model.filteredPatientsList[index].nationalityId! : "", + nationalityFlagURL: (model.filteredPatientsList[index].nationalityId != null) ? model.filteredPatientsList[index].nationalityFlagUrl! : "", + fileNumber: model.filteredPatientsList[index].patientId.toString(), + dateofBirth: model.filteredPatientsList[index].dateofBirth!, + // arrivedOn: "", + // appointmentDate: "", + // admissionDate: "", + // clinicDescription: "", + // roomId: "", + onTap: () { + Navigator.pushNamed(context, AppRoutes.patientProfile, arguments: model.filteredPatientsList[index]); + }, + ); + }, + separatorBuilder: (context, index) { + return 12.height; + }, + itemCount: model.filteredPatientsList.length, + ), + ), + ), + ], + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/patient/widgets/grid/profile_gird_for_search.dart b/lib/ui/patient/widgets/grid/profile_gird_for_search.dart new file mode 100644 index 0000000..99baabc --- /dev/null +++ b/lib/ui/patient/widgets/grid/profile_gird_for_search.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_nurses/config/routes.dart'; +import 'package:hmg_nurses/model/patient/patient_file_information_prm_list.dart'; +import 'package:hmg_nurses/model/patient_profile_card_model.dart'; +import 'package:hmg_nurses/ui/patient/widgets/patient_profile_button.dart'; + +class ProfileGridForSearch extends StatelessWidget { + final GetPatientFileInformationPrmList patient; + final String? patientType; + final String? arrivalType; + final double? height; + final bool isInpatient; + String? from; + String? to; + + ProfileGridForSearch({required this.patient, this.patientType, this.arrivalType, this.height, this.isInpatient = false, this.from, this.to}); + + @override + Widget build(BuildContext context) { + final List cardsList = [ + PatientProfileCardModel("Vital", "Signs", AppRoutes.vitalSigns, 'assets/images/svgs/profile_screen/vital signs.svg', isInPatient: isInpatient), + PatientProfileCardModel("Lab", "Result", "LAB_RESULT", 'assets/images/svgs/profile_screen/lab results.svg', isInPatient: isInpatient), + PatientProfileCardModel("Lab", "Special", "ALL_SPECIAL_LAB_RESULT", 'assets/images/svgs/profile_screen/lab results.svg', isInPatient: isInpatient), + PatientProfileCardModel("Radiology", "Service", "RADIOLOGY_PATIENT", 'assets/images/svgs/profile_screen/health summary.svg', isInPatient: isInpatient), + PatientProfileCardModel("Orders", "Prescription" + ' (old)', "ORDER_PRESCRIPTION_OLD", 'assets/images/svgs/profile_screen/order prescription.svg', isInPatient: isInpatient), + PatientProfileCardModel("Patient", "Prescription", "ORDER_PRESCRIPTION_NEW", 'assets/images/svgs/profile_screen/order prescription.svg', isInPatient: isInpatient), + PatientProfileCardModel("Health", "Summary", "HEALTH_SUMMARY", 'assets/images/svgs/profile_screen/health summary.svg', isInPatient: isInpatient), + PatientProfileCardModel("Patient", "ECG", "PATIENT_ECG", 'assets/images/svgs/profile_screen/ECG.svg', isInPatient: isInpatient), + PatientProfileCardModel("Orders", "Procedures", "ORDER_PROCEDURE", 'assets/images/svgs/profile_screen/Order Procedures.svg', isInPatient: isInpatient), + PatientProfileCardModel("Insurance", "Service", "PATIENT_INSURANCE_APPROVALS_NEW", 'assets/images/svgs/profile_screen/vital signs.svg', isInPatient: isInpatient), + PatientProfileCardModel("PatientSick", "Leave", "ADD_SICKLEAVE", 'assets/images/svgs/profile_screen/patient sick leave.svg', isInPatient: isInpatient), + // if (patient.appointmentNo != null && patient.appointmentNo != 0) + // PatientProfileCardModel( + // TranslationBase.of(context).patient, + // TranslationBase.of(context).ucaf, + // PATIENT_UCAF_REQUEST, + // 'assets/images/svgs/profile_screen/UCAF.svg', + // isInPatient: isInpatient, + // isDisable: patient.patientStatusType != 43 ? true : false), + // if (patient.appointmentNo != null && patient.appointmentNo != 0) + // PatientProfileCardModel( + // TranslationBase.of(context).referral, + // TranslationBase.of(context).patient, + // REFER_PATIENT_TO_DOCTOR, + // 'assets/images/svgs/profile_screen/refer patient.svg', + // isInPatient: isInpatient, + // isDisable: patient.patientStatusType != 43 ? true : false), + // if (patient.appointmentNo != null && patient.appointmentNo != 0) + // PatientProfileCardModel( + // TranslationBase.of(context).admission, + // TranslationBase.of(context).request, + // PATIENT_ADMISSION_REQUEST, + // 'assets/images/svgs/profile_screen/admission req.svg', + // isInPatient: isInpatient, + // isDisable: patient.patientStatusType != 43 ? true : false), + ]; + + return GridView( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisSpacing: 10, + mainAxisSpacing: 8, + crossAxisCount: 3, + ), + children: cardsList.map((item) { + return PatientProfileButton( + patient: patient, + model: item, + ); + }).toList(), + ); + } +} diff --git a/lib/ui/patient/widgets/patient_card.dart b/lib/ui/patient/widgets/patient_card.dart new file mode 100644 index 0000000..e1a54eb --- /dev/null +++ b/lib/ui/patient/widgets/patient_card.dart @@ -0,0 +1,218 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_nurses/classes/date-utils.dart'; +import 'package:hmg_nurses/classes/utils.dart'; +import 'package:hmg_nurses/extensions/int_extensions.dart'; +import 'package:hmg_nurses/extensions/string_extensions.dart'; +import 'package:hmg_nurses/main.dart'; +import 'package:hmg_nurses/widgets/commen/cusom_row.dart'; +import 'package:sizer/sizer.dart'; + +import '../../../widgets/circular_avatar.dart'; + +class PatientCard extends StatelessWidget { + final String name; + final int gender; + final String nationalityName; + final String nationalityFlagURL; + final String fileNumber; + final String dateofBirth; + final String? arrivedOn; + final String? appointmentDate; + final String? admissionDate; + final String? clinicDescription; + final String? roomId; + final GestureTapCallback? onTap; + + const PatientCard({ + super.key, + required this.name, + required this.gender, + required this.nationalityName, + required this.nationalityFlagURL, + required this.fileNumber, + required this.dateofBirth, + this.arrivedOn, + this.appointmentDate, + this.admissionDate, + this.clinicDescription, + this.roomId, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Container( + height: 120, + decoration: BoxDecoration( + borderRadius: const BorderRadius.all( + Radius.circular(10.0), + ), + border: Border.all(width: 1, color: const Color(0xffEFEFEF)), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + //spreadRadius: 5, + blurRadius: 27, + offset: const Offset(0, -3), + ), + ], + color: Colors.white, + ), + child: InkWell( + onTap: onTap, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: double.infinity, + alignment: Alignment.center, + padding: const EdgeInsets.only(left: 2, right: 2), + decoration: BoxDecoration( + color: const Color(0xffD02127), + // isFromLiveCare + // ? Colors.white + // : (isMyPatient && !isFromSearch) + // ? AppGlobal.appGreenColor + // : patientInfo.patientStatusType == 43 + // ? AppGlobal.appGreenColor + // : isMyPatient + // ? AppGlobal.appGreenColor + // : isInpatient + // ? Colors.white + // : !isFromSearch + // ? Colors.red[800] + // : Colors.white, + borderRadius: BorderRadius.only( + topLeft: appState.isArabic() ? const Radius.circular(0) : const Radius.circular(10), + bottomLeft: appState.isArabic() ? const Radius.circular(0) : const Radius.circular(10), + topRight: appState.isArabic() ? const Radius.circular(10) : const Radius.circular(0), + bottomRight: appState.isArabic() ? const Radius.circular(10) : const Radius.circular(0), + ), + ), + ), + Expanded( + child: Container( + width: double.infinity, + height: double.infinity, + padding: const EdgeInsets.all(8), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Utils.capitalize(name).toText12(), + Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), + child: SvgPicture.asset( + gender == 1 ? "assets/images/svgs/male.svg" : "assets/images/svgs/female.svg", + ), + ) + // if (isFromLiveCare) + // ShowTimer( + // patientInfo: patientInfo, + // ), + ], + ), + if (nationalityName.isNotEmpty) + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + nationalityName.truncate(14).toTextAuto( + fontSize: 9, + color: const Color(0xFF2E303A), + textOverflow: TextOverflow.ellipsis, + ), + nationalityFlagURL.isNotEmpty + ? ClipRRect( + borderRadius: BorderRadius.circular(20.0), + child: CachedNetworkImage( + imageUrl: nationalityFlagURL ?? "", + height: 16, + width: 22, + errorWidget: (context, url, error) => "No Image".toText10(), + ), + ) + : const SizedBox() + ], + ), + ], + ), + 12.height, + Row( + children: [ + showGenderAvator(gender), + 12.width, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomRow( + label: "File Number:", + value: fileNumber.toString(), + ), + CustomRow( + label: "Age : ", + value: "${AppDateUtils.getAgeByBirthday(dateofBirth, context, isServerFormat: true)}", + ), + arrivedOn != null + ? CustomRow( + label: "Arrived On : ", + value: AppDateUtils.getDayMonthYearDateFormatted( + AppDateUtils.convertStringToDate( + arrivedOn!, + ), + isMonthShort: true, + ), + ) + : (appointmentDate != null && appointmentDate!.isNotEmpty) + ? Column( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomRow( + label: "Appointment Date : ", + value: AppDateUtils.getDayMonthYearDateFormatted( + AppDateUtils.convertStringToDate( + appointmentDate!, + ), + isMonthShort: true), + ), + ], + ) + : const SizedBox(), + if (admissionDate != null) + CustomRow( + label: "Num Of Days : ", + value: "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(admissionDate!)).inDays + 1}", + ), + if (admissionDate != null) + CustomRow( + label: "Clinic Name : ", + value: "$clinicDescription", + ), + if (admissionDate != null) + CustomRow( + label: "Room No : ", + value: "$roomId", + ), + ], + ) + ], + ) + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/patient/widgets/patient_profile_button.dart b/lib/ui/patient/widgets/patient_profile_button.dart new file mode 100644 index 0000000..0817c75 --- /dev/null +++ b/lib/ui/patient/widgets/patient_profile_button.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_nurses/extensions/int_extensions.dart'; +import 'package:hmg_nurses/extensions/string_extensions.dart'; +import 'package:hmg_nurses/model/patient/patient_file_information_prm_list.dart'; +import 'package:hmg_nurses/model/patient_profile_card_model.dart'; +import 'package:sizer/sizer.dart'; + +class PatientProfileButton extends StatelessWidget { + GetPatientFileInformationPrmList patient; + PatientProfileCardModel model; + + PatientProfileButton({super.key, required this.patient, required this.model}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + Navigator.pushNamed(context, model.route, arguments: patient); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(15)), + border: Border.fromBorderSide( + BorderSide( + color: Colors.grey.withOpacity(0.4), + width: 1, + ), + ), + ), + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + model.icon, + width: 30, + height: 30, + ), + 12.height, + model.nameLine1.toTextAuto(fontSize: 10), + model.nameLine2.toTextAuto(fontSize: 10), + ], + ), + ), + ); + } +} diff --git a/lib/ui/patient/widgets/patient_profile_header.dart b/lib/ui/patient/widgets/patient_profile_header.dart new file mode 100644 index 0000000..776a4f0 --- /dev/null +++ b/lib/ui/patient/widgets/patient_profile_header.dart @@ -0,0 +1,73 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_nurses/classes/date-utils.dart'; +import 'package:hmg_nurses/extensions/int_extensions.dart'; +import 'package:hmg_nurses/extensions/string_extensions.dart'; +import 'package:hmg_nurses/model/patient/patient_file_information_prm_list.dart'; +import 'package:hmg_nurses/widgets/circular_avatar.dart'; +import 'package:hmg_nurses/widgets/commen/cusom_row.dart'; + +class PatientProfileHeader extends StatelessWidget { + GetPatientFileInformationPrmList patientProfile; + + PatientProfileHeader(this.patientProfile); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + color: Colors.white, + padding: const EdgeInsets.only(top: 12, right: 21, left: 21, bottom: 21), + child: Row( + children: [ + Expanded( + child: Row( + children: [ + showGenderAvator(patientProfile.gender ?? 1), + 12.width, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (patientProfile.patientStatusType != null && patientProfile.patientStatusType == 43) + ? "Arrived P".toText10(isBold: true) + : "Not Arrived".toText10(isBold: true, color: Colors.red[800]), + CustomRow( + label: "File Number:", + value: patientProfile.patientId.toString(), + ), + CustomRow( + label: "Age : ", + value: AppDateUtils.getAgeByBirthday(patientProfile.dateofBirth ?? "", context, isServerFormat: true), + ), + ], + ) + ], + ), + ), + if (patientProfile.nationalityId != null) + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + (patientProfile.nationalityId ?? "").toTextAuto( + fontSize: 9, + color: const Color(0xFF2E303A), + textOverflow: TextOverflow.ellipsis, + ), + if (patientProfile.nationalityFlagUrl != null && patientProfile.nationalityFlagUrl!.isNotEmpty) + ClipRRect( + borderRadius: BorderRadius.circular(20.0), + child: CachedNetworkImage( + imageUrl: patientProfile.nationalityFlagUrl ?? "", + height: 16, + width: 22, + errorWidget: (context, url, error) => "No Image".toText10(), + ), + ) + ], + ), + ], + ), + ); + } +} diff --git a/lib/widgets/app_bar_widget.dart b/lib/widgets/app_bar_widget.dart index 0e4fb61..53d281a 100644 --- a/lib/widgets/app_bar_widget.dart +++ b/lib/widgets/app_bar_widget.dart @@ -6,12 +6,13 @@ import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/extensions/string_extensions.dart'; import 'package:hmg_nurses/extensions/widget_extensions.dart'; -AppBar AppBarWidget(BuildContext context, - {required String title, - bool showHomeButton = true, - bool showNotificationButton = false, - bool showMemberButton = false, - String? image}) { +AppBar AppBarWidget( + BuildContext context, { + required String title, + String? image, + bool isNeedLeading = true, + List? actions, +}) { return AppBar( leadingWidth: 0, // leading: GestureDetector( @@ -22,49 +23,26 @@ AppBar AppBarWidget(BuildContext context, //titleSpacing: -1.44, title: Row( children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: - Feedback.wrapForTap(() => Navigator.maybePop(context), context), - child: - const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), - ), + if (isNeedLeading) + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: Feedback.wrapForTap(() => Navigator.maybePop(context), context), + child: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), + ), 4.width, - if (image != null) SvgPicture.asset( - image, - height: 40, - width: 40, - ), + if (image != null) + SvgPicture.asset( + image, + height: 40, + width: 40, + ), if (image != null) 14.width, - title.toText24(color: MyColors.darkTextColor, isBold: true).expanded, + title.toText16(color: MyColors.darkTextColor, isBold: true).expanded, ], ), centerTitle: false, elevation: 0, backgroundColor: Colors.white, - actions: [ - if (showHomeButton) - IconButton( - onPressed: () { - // Navigator.popUntil( - // context, ModalRoute.withName(AppRoutes.dashboard)); - }, - icon: const Icon(Icons.home, color: MyColors.darkIconColor), - ), - if (showNotificationButton) - IconButton( - onPressed: () { - // Navigator.pushNamed(context, AppRoutes.worklistSettings); - }, - icon: const Icon(Icons.notifications, color: MyColors.textMixColor), - ), - if (showMemberButton) - IconButton( - onPressed: () { - // Navigator.pushNamed(context, AppRoutes.subordinateLeave); - }, - icon: const Icon(Icons.people, color: MyColors.textMixColor), - ), - ], + actions: actions, ); } diff --git a/lib/widgets/button/default_button.dart b/lib/widgets/button/default_button.dart index 8915ecb..19b8c6f 100644 --- a/lib/widgets/button/default_button.dart +++ b/lib/widgets/button/default_button.dart @@ -5,8 +5,7 @@ import 'package:hmg_nurses/classes/colors.dart'; extension WithContainer on Widget { Widget get insideContainer => Container( color: Colors.white, - padding: - const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: this, ); } @@ -57,8 +56,8 @@ class DefaultButton extends StatelessWidget { : color == MyColors.yellowColorII ? const LinearGradient( colors: [ - MyColors.yellowColorII, - MyColors.yellowColorII, + MyColors.redColor, + MyColors.redColor, ], ) : LinearGradient( @@ -67,8 +66,8 @@ class DefaultButton extends StatelessWidget { end: Alignment.bottomLeft, colors: colors ?? [ - MyColors.gradiantEndColor, - MyColors.gradiantStartColor, + MyColors.redColor, + MyColors.redColor, ], ), ), @@ -76,8 +75,7 @@ class DefaultButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ if (iconData != null) Icon(iconData, color: textColor), - if (svgIcon != null) - SvgPicture.asset(svgIcon ?? "", color: textColor), + if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor), if (!isTextExpanded) Padding( padding: EdgeInsets.only( diff --git a/lib/widgets/circular_avatar.dart b/lib/widgets/circular_avatar.dart index a18cf03..af5fb18 100644 --- a/lib/widgets/circular_avatar.dart +++ b/lib/widgets/circular_avatar.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; class CircularAvatar extends StatelessWidget { final String? url; @@ -39,3 +40,15 @@ class CircularAvatar extends StatelessWidget { ); } } + +Widget showGenderAvator( + int gender, { + double size = 60, +}) { + return SvgPicture.asset( + gender == 1 ? 'assets/images/svgs/male avatar.svg' : 'assets/images/svgs/female avatar.svg', + fit: BoxFit.cover, + height: size, + width: size, + ); +} diff --git a/lib/widgets/commen/cusom_row.dart b/lib/widgets/commen/cusom_row.dart new file mode 100644 index 0000000..542fae7 --- /dev/null +++ b/lib/widgets/commen/cusom_row.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_nurses/extensions/string_extensions.dart'; + +class CustomRow extends StatelessWidget { + const CustomRow({super.key, + required this.label, + required this.value, + this.labelSize, + this.valueSize, + this.width, + this.isCopyable = true, + this.isExpanded = false, + this.labelColor, + this.valueColor, + }); + + final String label; + final String value; + final double? labelSize; + final double? valueSize; + final double? width; + final bool isCopyable; + final bool isExpanded; + final Color? labelColor; + final Color? valueColor; + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + label.toTextAuto( + fontSize: labelSize ?? 10, + color: labelColor ?? const Color(0xFF575757), + letterSpacing: -0.4, + ), + const SizedBox( + width: 1, + ), + Expanded( + flex: isExpanded ? 1 : 0, + child: value.toTextAuto( + fontSize: valueSize ?? 10, + color: valueColor ?? const Color(0xFF2B353E), + fontWeight: FontWeight.w700, + letterSpacing: -0.48, + ), + ), + ], + ); + } +} diff --git a/lib/widgets/errors/error_message.dart b/lib/widgets/errors/error_message.dart new file mode 100644 index 0000000..8223d06 --- /dev/null +++ b/lib/widgets/errors/error_message.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_nurses/extensions/string_extensions.dart'; + +class ErrorMessage extends StatelessWidget { + String? errorMessage; + + ErrorMessage({this.errorMessage}); + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 100, + ), + SvgPicture.asset('assets/images/svgs/no_data.svg'), + Center( + child: Center( + child: Padding( + padding: const EdgeInsets.only(top: 12, bottom: 12, right: 20, left: 30), + child: Center( + child: (errorMessage ?? "").toText16( + textAlign: TextAlign.center, + ), + ), + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/icons_app/config.json b/lib/widgets/icons_app/config.json new file mode 100644 index 0000000..20885d7 --- /dev/null +++ b/lib/widgets/icons_app/config.json @@ -0,0 +1,2668 @@ +{ + "name": "DoctorApp", + "css_prefix_text": "", + "css_use_suffix": false, + "hinting": true, + "units_per_em": 1000, + "ascent": 850, + "glyphs": [ + { + "uid": "9caed7b74de0f5a625ccb960f00d9c8d", + "css": "female_icon", + "code": 59392, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M543.9 587C543.6 583.8 543.4 578.5 543.2 573 596.5 567.8 633.8 555.9 633.8 542 633.6 542 633.6 541.5 633.6 541.2 593.9 507.7 668.1 269.7 529.9 274.6 521.2 267.7 505.9 261.6 484.2 261.6 296.9 274.9 379.7 499.6 337 542 337 542 337 542 336.9 542 336.9 542 336.9 542 336.9 542.2 336.9 542.2 336.9 542.2 336.9 542.2S336.9 542.2 336.9 542.2C337 555.8 373.1 567.4 424.9 572.7 424.7 576.1 424.5 580.1 423.8 587 402.3 640.9 257.6 625.8 250.8 729.7H716.2C709.6 625.8 565.4 640.9 543.9 587Z", + "width": 986 + }, + "search": [ + "female_icon" + ] + }, + { + "uid": "d30b03087b318086eb4f93c8ee4f0cf3", + "css": "male", + "code": 59393, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M493.2 537.2C568.8 537.2 630.1 475.9 630.1 400.3S568.8 263.5 493.2 263.5 356.4 324.7 356.4 400.4C356.5 475.9 417.7 537.2 493.2 537.2ZM614.9 567.6H562.6C518.6 587.8 468 587.8 424.1 567.6H371.6C304.5 567.6 250 622 250 689.2V704.5C250 729.6 270.4 750 295.7 750.1H690.9C716.1 750.1 736.5 729.7 736.6 704.5V689.2C736.5 622 682 567.6 614.9 567.6Z", + "width": 986 + }, + "search": [ + "male" + ] + }, + { + "uid": "06d6838cdcf6af812f2eb51e0269afc0", + "css": "home_icon_active", + "code": 59395, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M973.1 435L973.1 435 565 27A92.1 92.1 0 0 0 434.9 27L27.1 434.7 26.7 435.1A92 92 0 0 0 88 592C88.9 592 89.9 592 90.8 592H107.1V892.2A107.9 107.9 0 0 0 214.8 999.9H374.4A29.3 29.3 0 0 0 403.7 970.6V735.4A49.2 49.2 0 0 1 452.9 686.2H547A49.2 49.2 0 0 1 596.2 735.4V970.7A29.3 29.3 0 0 0 625.5 1000H785.1A107.9 107.9 0 0 0 892.8 892.3V592.1H907.8A92.1 92.1 0 0 0 973 434.9ZM931.6 523.7A33.4 33.4 0 0 1 907.9 533.5H863.5A29.3 29.3 0 0 0 834.2 562.8V892.3A49.2 49.2 0 0 1 785.1 941.5H654.9V735.4A107.9 107.9 0 0 0 547 627.5H452.9A107.9 107.9 0 0 0 345.1 735.2V941.3H214.9A49.2 49.2 0 0 1 165.8 892.1V562.8A29.3 29.3 0 0 0 136.5 533.5H92.8L91.4 533.5A33.4 33.4 0 0 1 68.3 476.4H68.3L476.3 68.4A33.4 33.4 0 0 1 523.6 68.4L931.4 476.2 931.6 476.4A33.4 33.4 0 0 1 931.6 523.7ZM931.6 523.7", + "width": 1000 + }, + "search": [ + "home_icon_active" + ] + }, + { + "uid": "1ab45bf5797fa9ab96b13fccd2be2b3c", + "css": "menu_icon", + "code": 59396, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M406.7 0H83.2A83.3 83.3 0 0 0 0 83.2V406.7A83.3 83.3 0 0 0 83.2 489.9H406.7A83.3 83.3 0 0 0 489.9 406.7V83.2A83.3 83.3 0 0 0 406.7 0ZM406.7 449.1H83.2A42.4 42.4 0 0 1 40.8 406.7V83.2A42.4 42.4 0 0 1 83.2 40.8H406.7A42.4 42.4 0 0 1 449 83.2V406.7H449A42.4 42.4 0 0 1 406.7 449.1ZM916.8 0H593.3A83.3 83.3 0 0 0 510.1 83.2V406.7A83.3 83.3 0 0 0 593.3 489.9H916.8A83.3 83.3 0 0 0 1000 406.7V83.2A83.3 83.3 0 0 0 916.8 0ZM959.1 406.7A42.4 42.4 0 0 1 916.8 449.1H593.3A42.4 42.4 0 0 1 550.9 406.7V83.2A42.4 42.4 0 0 1 593.3 40.8H916.8A42.4 42.4 0 0 1 959.1 83.2ZM406.7 510.1H83.2A83.3 83.3 0 0 0 0 593.3V916.8A83.3 83.3 0 0 0 83.2 1000H406.7A83.3 83.3 0 0 0 489.9 916.8V593.3A83.3 83.3 0 0 0 406.7 510.1ZM406.7 959.2H83.2A42.4 42.4 0 0 1 40.8 916.8V593.3A42.4 42.4 0 0 1 83.2 550.9H406.7A42.4 42.4 0 0 1 449 593.3V916.8H449A42.4 42.4 0 0 1 406.7 959.1ZM916.8 510.1H593.3A83.3 83.3 0 0 0 510.1 593.3V916.8A83.3 83.3 0 0 0 593.3 1000H916.8A83.3 83.3 0 0 0 1000 916.8V593.3A83.3 83.3 0 0 0 916.8 510.1ZM959.1 916.8A42.4 42.4 0 0 1 916.8 959.2H593.3A42.4 42.4 0 0 1 550.9 916.8V593.3A42.4 42.4 0 0 1 593.3 550.9H916.8A42.4 42.4 0 0 1 959.1 593.3Z", + "width": 1000 + }, + "search": [ + "menu_icon" + ] + }, + { + "uid": "174fb3d81ce317465a3bfa96c20a84fa", + "css": "message_icon", + "code": 59398, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1182.9 44.3A100 100 0 0 0 1099.9 0.1H100A100 100 0 0 0 0 100V900A100 100 0 0 0 100 1000H1110.4A100 100 0 0 0 1200 900V100A100 100 0 0 0 1182.9 44.3ZM99.9 40H1100A60 60 0 0 1 1138.8 54.2L1061.2 128.2 734 440 612.8 555.7A20 20 0 0 1 589 555.7L466 440 60 54.3A60 60 0 0 1 100 40ZM39.9 90.4L423.2 454 40 820V100A59.7 59.7 0 0 1 40 90.4ZM1160 900A60 60 0 0 1 1107.6 960H100A60 60 0 0 1 40 900V874.6L452.2 481.6 562.4 586.4A60 60 0 0 0 571 592.2 58.4 58.4 0 0 0 600 600 63 63 0 0 0 640 586L748.8 482.4 1160 874.2ZM1160 100V819L776.8 454.7 1160 90.1A61.4 61.4 0 0 1 1160 100Z", + "width": 1200 + }, + "search": [ + "message_icon" + ] + }, + { + "uid": "f2ad4d0db965156a40b80bb175e15240", + "css": "discharge_patient", + "code": 59402, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1080.3 903.6H1059.9V694.9A80.5 80.5 0 0 0 979.6 614.6H929.9A80.5 80.5 0 0 0 899.3 566.4V384.4A59 59 0 0 0 840.5 325.5H733.4A59 59 0 0 0 674.5 384.4V502.2A16.1 16.1 0 1 0 706.6 502.2V384.4A26.8 26.8 0 0 1 733.4 357.6H840.5A26.8 26.8 0 0 1 867.3 384.4V552A80.5 80.5 0 0 0 851.2 550.4H642.4V463.6A80.5 80.5 0 0 0 562.1 383.3H417.6V315.9A59 59 0 0 0 358.7 256.9H251.6A59 59 0 0 0 195.1 299.2 176.8 176.8 0 0 1 32.1 123.1 16.1 16.1 0 0 0 0 123.1 209.1 209.1 0 0 0 192.7 331.2V529.9A112 112 0 0 0 224.7 608.5V771.3L131.1 910.7A16.1 16.1 0 0 0 128.3 919.7V983.9A16.1 16.1 0 0 0 160.5 983.9V924.5L254.2 785.2A16 16 0 0 0 257 776.2V631.5A112.2 112.2 0 0 0 353.4 631.5V962.5A16.1 16.1 0 0 0 364.5 977.7L428.7 999.1A16.1 16.1 0 1 0 438.8 968.6L385.6 950.9V608.5A112 112 0 0 0 417.7 530V415.4H562.3A48.2 48.2 0 0 1 610.4 463.6V625.9A187.3 187.3 0 1 0 810.2 775.1H899.6V841A80.3 80.3 0 1 0 994.3 935.7H1080.5A16.1 16.1 0 0 0 1080.5 903.6ZM305.2 610.3A80.5 80.5 0 0 1 226.5 546H383.8A80.5 80.5 0 0 1 305.2 610.3ZM385.5 513.9H224.7V315.9A26.8 26.8 0 0 1 251.5 289.1H289V337.4A16.1 16.1 0 0 0 321.1 337.4V289.1H358.6A26.8 26.8 0 0 1 385.4 315.9ZM706.7 582.5H851.3A48.2 48.2 0 0 1 899.5 630.7V678.8H786.9A80.5 80.5 0 0 1 706.6 598.6ZM642.5 582.5H674.6V598.5A112 112 0 0 0 680.2 633.1 186 186 0 0 0 642.6 626ZM626.4 967.9A155.4 155.4 0 1 1 781.8 812.5 155.4 155.4 0 0 1 626.4 967.9ZM800.4 743.2A187 187 0 0 0 783.7 711H899.5V743.2ZM915.5 967.9A48.2 48.2 0 1 1 963.7 919.7 48.2 48.2 0 0 1 915.4 967.9ZM1027.9 903.7H994.1A80.5 80.5 0 0 0 931.5 841V646.8H979.7A48.2 48.2 0 0 1 1027.9 695ZM786.9 68.6A112.6 112.6 0 0 0 677.8 154.3 69.6 69.6 0 1 0 726.3 275.6 112.4 112.4 0 1 0 786.9 68.6ZM786.9 100.7A80.5 80.5 0 0 1 865.5 164 174.8 174.8 0 0 1 753.6 108 79.8 79.8 0 0 1 786.9 100.7ZM679.9 261.3A37.5 37.5 0 0 1 674.7 186.7 111.9 111.9 0 0 0 701.7 254.2 37.4 37.4 0 0 1 679.9 261.3ZM786.9 261.3A80.3 80.3 0 0 1 727.4 127.2 206.6 206.6 0 0 0 865.7 196.3 80.5 80.5 0 0 1 786.9 261.3ZM626.4 689.5A123.1 123.1 0 1 0 749.5 812.7 123.3 123.3 0 0 0 626.4 689.5ZM626.4 903.7A91 91 0 1 1 717.4 812.7 91.1 91.1 0 0 1 626.4 903.6ZM337.2 113A23.3 23.3 0 0 1 318.3 103.2 16.1 16.1 0 0 0 292 103.2 23.3 23.3 0 0 1 273 113 16.1 16.1 0 1 0 273 145.2 55.5 55.5 0 0 0 305.1 134.9 55.5 55.5 0 0 0 337.3 145.2 16.1 16.1 0 1 0 337.3 113ZM305.1 0A112.4 112.4 0 1 0 417.5 112.4 112.5 112.5 0 0 0 305.1 0ZM305.1 192.7A80.3 80.3 0 1 1 385.4 112.5 80.5 80.5 0 0 1 305.1 192.7Z", + "width": 1096 + }, + "search": [ + "discharge_patient" + ] + }, + { + "uid": "f94c7f2a567a023799a9f230b749c677", + "css": "schedule_icon", + "code": 59401, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M444.6 698.3A29.5 29.5 0 0 0 486.4 698.3L591.8 592.8A29.5 29.5 0 0 0 550.1 551L465.5 635.6 427 597A29.5 29.5 0 0 0 385.2 638.8ZM444.6 698.3M488.5 859.1A234.4 234.4 0 1 0 254.1 624.7 234.7 234.7 0 0 0 488.5 859.1ZM488.5 449.3A175.4 175.4 0 1 1 313.2 624.7 175.5 175.5 0 0 1 488.5 449.3ZM488.5 449.3M881.5 62.9H827.7V29.5A29.5 29.5 0 1 0 768.6 29.5V62.9H710.6V29.5A29.5 29.5 0 0 0 651.5 29.5V62.9H325.5V29.5A29.5 29.5 0 0 0 266.4 29.5V62.9H208.4V29.5A29.5 29.5 0 0 0 149.4 29.5V62.9H95.5A95.6 95.6 0 0 0 0 158.4V904.5A95.6 95.6 0 0 0 95.5 1000H881.5A95.6 95.6 0 0 0 976.9 904.5V158.4A95.6 95.6 0 0 0 881.5 62.9ZM918 904.5A36.5 36.5 0 0 1 881.5 940.9H95.5A36.5 36.5 0 0 1 59 904.5V308.4H917.9ZM59.1 158.4A36.5 36.5 0 0 1 95.5 121.9H149.4V155.3A29.5 29.5 0 0 0 208.4 155.3V121.9H266.4V155.3A29.5 29.5 0 0 0 325.5 155.3V121.9H651.5V155.3A29.5 29.5 0 0 0 710.6 155.3V121.9H768.6V155.3A29.5 29.5 0 0 0 827.7 155.3V121.9H881.5A36.5 36.5 0 0 1 918 158.4V249.3H59.1ZM59.1 158.4", + "width": 977 + }, + "search": [ + "schedule_icon" + ] + }, + { + "uid": "dbebba4fbd61d05cd5150c5555ab572e", + "css": "scdedule_icon_active", + "code": 59400, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M445.8 693.2A28.8 28.8 0 0 0 486.5 693.2L589.2 590.5A28.8 28.8 0 1 0 548.5 549.8L466.1 632.1 428.6 594.6A28.8 28.8 0 1 0 387.9 635.2ZM445.8 693.2M488.5 849.9A228.4 228.4 0 1 0 260.1 621.5 228.7 228.7 0 0 0 488.5 849.9ZM488.5 450.6A170.8 170.8 0 1 1 317.6 621.5 171 171 0 0 1 488.5 450.6ZM488.5 450.6M881.5 62.9H827.7V29.5A29.5 29.5 0 0 0 768.6 29.5V62.9H710.6V29.5A29.5 29.5 0 0 0 651.5 29.5V62.9H325.5V29.5A29.5 29.5 0 0 0 266.4 29.5V62.9H208.4V29.5A29.5 29.5 0 0 0 149.4 29.5V62.9H95.5A95.6 95.6 0 0 0 0 158.4V904.5A95.6 95.6 0 0 0 95.5 1000H881.5A95.6 95.6 0 0 0 976.9 904.5V158.4A95.6 95.6 0 0 0 881.5 62.9ZM918 904.5A36.5 36.5 0 0 1 881.5 940.9H95.5A36.5 36.5 0 0 1 59 904.5V308.4H917.9ZM59.1 158.4A36.5 36.5 0 0 1 95.5 121.9H149.4V155.3A29.5 29.5 0 0 0 208.4 155.3V121.9H266.4V155.3A29.5 29.5 0 0 0 325.5 155.3V121.9H651.5V155.3A29.5 29.5 0 0 0 710.6 155.3V121.9H768.6V155.3A29.5 29.5 0 0 0 827.7 155.3V121.9H881.5A36.5 36.5 0 0 1 918 158.4V249.3H59.1ZM59.1 158.4", + "width": 977 + }, + "search": [ + "scdedule_icon_active" + ] + }, + { + "uid": "67294966cf1313317b699a3c127bde7e", + "css": "message_icon_active", + "code": 59399, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1182.9 44.3A100 100 0 0 0 1099.9 0.1H100A100 100 0 0 0 0 100V900A100 100 0 0 0 100 1000H1110.4A100 100 0 0 0 1200 900V100A100 100 0 0 0 1182.9 44.3ZM99.9 40H1100A60 60 0 0 1 1138.8 54.2L1061.2 128.2 734 440 612.8 555.7A20 20 0 0 1 589 555.7L466 440 60 54.3A60 60 0 0 1 100 40ZM39.9 90.4L423.2 454 40 820V100A59.7 59.7 0 0 1 40 90.4ZM1160 900A60 60 0 0 1 1107.6 960H100A60 60 0 0 1 40 900V874.6L452.2 481.6 562.4 586.4A60 60 0 0 0 571 592.2 58.4 58.4 0 0 0 600 600 63 63 0 0 0 640 586L748.8 482.4 1160 874.2ZM1160 100V819L776.8 454.7 1160 90.1A61.4 61.4 0 0 1 1160 100Z", + "width": 1200 + }, + "search": [ + "message_icon_active" + ] + }, + { + "uid": "d5276aeed9a2aead3e8b763de783f04e", + "css": "operations", + "code": 59411, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M166.4 983.8H859.2A452 452 0 0 0 166.4 983.8ZM275.2 471.7L231.5 515.4H230.7A154 154 0 0 0 76.7 669.5V780.4L330.4 526.7ZM335.1 554.4L353.5 536A50 50 0 0 0 385.5 547.8 50.8 50.8 0 0 0 421.1 533L436.4 517.8A50.3 50.3 0 0 0 518 533L575.8 475.3 735.4 547.8H884.3V596.2H1013.5V305.5H884.3V353.9H858.7L718 213.3 691.7 197.8 783.9 105.6A61.8 61.8 0 0 0 696.4 18.2L570.7 144H515.6A64.5 64.5 0 0 0 471.7 161.2L286.5 332.1A49.8 49.8 0 0 0 300.4 414.4L247.7 467ZM293.3 467L336.8 423.6A56.5 56.5 0 0 0 378.5 465.4L335.1 508.8ZM398.3 510.1A18.6 18.6 0 0 1 376.8 512.8L422.6 467H441.5ZM495.2 510.1A18.1 18.1 0 0 1 464.3 497.3 18 18 0 0 1 469.6 484.5L487.1 467H538.4ZM916.7 337.8H981.3V563.9H916.7V337.8ZM696.8 237.7L845.4 386.2H884.4V515.4H742.5L564.8 434.7H391.7A24.2 24.2 0 1 1 391.7 386.2H512.9L554 378.3A69 69 0 0 0 604.8 284.8L668.3 221.3ZM577.3 312.3A37.1 37.1 0 0 1 547.7 346.6L541.9 347.8ZM719.6 41A29.5 29.5 0 0 1 770 61.9 29.3 29.3 0 0 1 761.3 82.8L490 354.1H406.4ZM322.1 386.2H320.3A17.5 17.5 0 0 1 308.4 355.8L493.6 184.9A32.1 32.1 0 0 1 515.5 176.3H538.4L331.3 383.3A17.3 17.3 0 0 1 322.1 386.2ZM1011.2 975.6C1009.6 972.8 841.2 693.1 512.8 693.1S16 972.8 14.3 975.6L0 1000H1025.6ZM58.7 967.7C106.9 901.9 259.6 725.4 512.8 725.4S918.7 901.9 966.8 967.7Z", + "width": 1026 + }, + "search": [ + "operations" + ] + }, + { + "uid": "046c42711da6530ad1b224469263402a", + "css": "lab_results", + "code": 59406, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M258 580.6H225.8A48.5 48.5 0 0 0 274.2 629V596.9A16.1 16.1 0 0 1 258 580.6ZM258 580.6M419.4 758.1H451.5V790.2H419.4ZM419.4 758.1M290.3 822.6H322.5V854.7H290.3ZM290.3 822.6M177.4 903.2H209.6V935.4H177.4ZM177.4 903.2M403.2 887.1H435.4V919.2H403.2ZM403.2 887.1M241.9 725.8H274.1V758H241.9ZM241.9 725.8M290.3 0V225.8H129A32.1 32.1 0 0 0 96.9 258V290.1A32.1 32.1 0 0 0 129 322.3V436.5A81.6 81.6 0 0 1 125.5 460.7L5 852.1A114.3 114.3 0 0 0 114.3 1000H1000V0ZM129 258.1H419.4V290.2H129ZM419.4 322.6A32.1 32.1 0 0 0 451.5 290.4V258.3A32.1 32.1 0 0 0 419.4 226.1H387.2V96.8H645.3V354.8H419.4ZM156.3 470.5A114.3 114.3 0 0 0 161.3 436.9V322.6H387.1V436.9A114.3 114.3 0 0 0 392.1 470.5L436 612.9H382.4A112.8 112.8 0 0 0 387.1 580.8V575.3A113 113 0 0 0 371 517.2L274.2 355.8 177.4 517.1A112.9 112.9 0 0 0 161.3 575.2V580.6A112.2 112.2 0 0 0 166 612.8H112.5ZM274.1 661.3A80.8 80.8 0 0 1 193.5 580.6V575.2A80.6 80.6 0 0 1 205 533.7L274.1 418.4 343.3 533.6A80.7 80.7 0 0 1 354.8 575.1V580.6A80.8 80.8 0 0 1 274.2 661.3ZM114.3 967.9A81.3 81.3 0 0 1 33.8 871.1H145.2V838.9H42.9L52.8 806.8H193.5V774.6H62.8L72.7 742.5H145.2V710.4H82.6L102.5 645.9H181.7A112.6 112.6 0 0 0 366.7 645.9H445.9L512.5 862.3A82.1 82.1 0 0 1 434.1 967.9ZM967.9 967.9H513.5A114 114 0 0 0 543.4 852.2L423 461A81.6 81.6 0 0 1 419.4 436.9V387.1H677.5V64.5H354.8V225.8H322.7V32.1H967.9ZM967.9 967.9M758.1 580.6A177.4 177.4 0 1 0 935.5 758.1 177.6 177.6 0 0 0 758.1 580.6ZM758.1 903.2A145.2 145.2 0 1 1 903.2 758.1 145.3 145.3 0 0 1 758.1 903.2ZM758.1 903.2M806.5 661.3H709.7V709.7H661.3V806.5H709.7V854.9H806.5V806.5H854.9V709.7H806.5ZM822.6 741.9V774.1H774.2V822.5H742.1V774.1H693.4V741.9H741.8V693.4H774V741.8ZM822.6 741.9M709.7 80.6H741.8V112.8H709.7ZM709.7 80.6M774.2 80.6H935.5V112.8H774.2ZM774.2 80.6M709.7 209.7H741.8V241.8H709.7ZM709.7 209.7M774.2 209.7H935.5V241.8H774.2ZM774.2 209.7M709.7 145.2H935.5V177.3H709.7ZM709.7 145.2M709.7 274.2H935.5V306.3H709.7ZM709.7 274.2M709.7 338.7H935.5V370.9H709.7ZM709.7 338.7M483.9 451.6H935.5V483.8H483.9ZM483.9 451.6M483.9 516.1H935.5V548.3H483.9ZM483.9 516.1", + "width": 1000 + }, + "search": [ + "lab_results" + ] + }, + { + "uid": "406cfc8f4e89509892f7e12ecd31b289", + "css": "in_patient_white", + "code": 59405, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M527.4 413H462.3A18.1 18.1 0 1 0 462.3 449.1H527.4A18.1 18.1 0 0 0 527.4 413ZM1189.1 81.7H1134.6V36H1205.1A18.1 18.1 0 0 0 1205.1-0.2H276.4A18.1 18.1 0 0 0 276.4 36H1098.4V81.7H1043.9A34 34 0 0 0 1009.9 115.7V272.9A106.7 106.7 0 0 0 1065.4 366.5L1053.6 385.5A96.9 96.9 0 0 0 1049.3 479.6L1098.4 577.2A60.6 60.6 0 0 1 1085.9 648.1L996 729.3V380.9A50.5 50.5 0 0 0 945.6 330.4H893.4A176.1 176.1 0 0 0 887.3 304.3 45.1 45.1 0 0 1 886.3 281.3L899.6 219.5A35.2 35.2 0 0 0 857.7 177.6C839 180.1 793.2 196.3 774.1 189.3A177.2 177.2 0 0 0 752.2 183.6 18.1 18.1 0 0 0 745.3 219.1 140.6 140.6 0 0 1 762.7 223.6 81 81 0 0 0 805.4 225.9L864.1 213.2 851 273.7C844.2 299.6 859.8 327.5 859.3 357.4V544.3A140.8 140.8 0 0 1 852.7 587 80.6 80.6 0 0 0 849.7 600.4 229.7 229.7 0 0 0 696.9 542.5H619.5V524.7A174.6 174.6 0 0 0 669.7 432.7 98.9 98.9 0 0 0 726.2 371.9 69.3 69.3 0 0 0 687 282.5H687A43.9 43.9 0 0 0 673 280.3V194.2A95.3 95.3 0 0 0 577.8 99H417.5A95.3 95.3 0 0 0 323.3 180.4H276.9C251.4 177.8 225.6 193.3 197.7 190.7L137.6 177.7A35.2 35.2 0 0 0 95.7 219.6L109 281.4A45.1 45.1 0 0 1 108 304.4 176 176 0 0 0 101.9 330.5H56.1V75.1A39 39 0 0 1 95 36H193.3A18.1 18.1 0 0 0 193.3-0.2H95A75.1 75.1 0 0 0 20 75.1V340.8A50.4 50.4 0 0 0 0 380.9L0.5 968.4A31.6 31.6 0 0 0 32.1 1000H964.2A31.6 31.6 0 0 0 995.8 968.4L996.1 778 1110.3 674.7 1110.5 674.5A96.9 96.9 0 0 0 1130.8 561L1081.5 463.3A60.6 60.6 0 0 1 1084.2 404.5L1100.6 378.2A107 107 0 0 0 1116.5 379.4H1116.5A106.7 106.7 0 0 0 1207.7 328 111.8 111.8 0 0 0 1223.1 272.8V115.7A34 34 0 0 0 1189.1 81.7ZM960 380.8V762L940.2 779.9Q934.1 774.3 927.7 769A229.2 229.2 0 0 0 892.5 650.7 116.7 116.7 0 0 1 887.2 597.8 176.8 176.8 0 0 0 895.5 544.2V366.6H945.6A14.3 14.3 0 0 1 960 380.9ZM412 551.5A175.1 175.1 0 0 0 583.3 551.5V584.4A14.9 14.9 0 0 1 568.5 599.2H426.8A14.9 14.9 0 0 1 412 584.4ZM675.9 316.7A33.5 33.5 0 0 1 691.8 360.6C685.7 379.5 666.4 398.7 652.9 399.4A18.1 18.1 0 0 0 635.8 415.3 139.1 139.1 0 0 1 359.5 415.3 18.1 18.1 0 0 0 342.5 399.4C329 398.7 309.6 379.5 303.5 360.6A33.5 33.5 0 0 1 319.5 316.7 6.6 6.6 0 0 1 321.4 316.3C322.6 316.3 323.6 317.1 325.7 320.1A18 18 0 0 0 345.9 326.7C355.3 324 360.3 310.9 358.5 298.3A69.5 69.5 0 0 1 427.9 228.9H567.5A69.5 69.5 0 0 1 636.9 298.3C636.5 307.9 635.8 320.8 649.5 326.7A18 18 0 0 0 669.7 320.1C672.8 315.7 673.6 316 675.9 316.8ZM358.5 194.1A59.2 59.2 0 0 1 417.6 134.9H578A59.2 59.2 0 0 1 637.2 194.1V219A105.2 105.2 0 0 0 567.7 192.9H427.9A105.2 105.2 0 0 0 358.5 219ZM190.1 225.9A81.2 81.2 0 0 0 232.8 223.6 140.4 140.4 0 0 1 277.1 216.5H322.3V280.2A43.7 43.7 0 0 0 308.3 282.4 69.3 69.3 0 0 0 269.2 371.7 98.8 98.8 0 0 0 325.7 432.5 174.6 174.6 0 0 0 375.8 524.6V542.3H298.3A229.7 229.7 0 0 0 145.6 600.3 80.8 80.8 0 0 0 142.6 586.9 140.8 140.8 0 0 1 136 544.1V357.5C134.5 331.6 151.1 303.5 144.4 273.7L131.5 213.3ZM36.2 380.9A14.3 14.3 0 0 1 50.5 366.6H99.8V544.4A176.8 176.8 0 0 0 108.1 598.1 121.6 121.6 0 0 1 102.8 650.7 229.2 229.2 0 0 0 67.7 769Q56.9 778 46.6 787.8A148.1 148.1 0 0 0 36.1 799V380.9ZM959.7 963.9H36.6V896.2A114.3 114.3 0 0 1 71.6 814 359.5 359.5 0 0 1 251.1 720.6 18.1 18.1 0 1 0 244.1 685.1 394.5 394.5 0 0 0 106.5 740.6 194.8 194.8 0 0 1 298.3 578.5H375.9V584.3A51 51 0 0 0 426.8 635.3H568.7A51 51 0 0 0 619.6 584.3V578.5H696.9A194.8 194.8 0 0 1 888.6 740.4 395 395 0 0 0 674.2 677.6H332A18.1 18.1 0 1 0 332 713.8H674.3A358.9 358.9 0 0 1 898.1 791.4L898.6 791.8Q912.2 802.6 924.9 814.8A114.5 114.5 0 0 1 959.7 896.8V963.7ZM1187 117.8V167.6H1046V117.8ZM1181.5 300.3A73.5 73.5 0 0 1 1116.5 343.4 70.6 70.6 0 0 1 1046 272.9V203.6H1187V272.7A70.3 70.3 0 0 1 1181.5 300.3Z", + "width": 1223 + }, + "search": [ + "in_patient_white" + ] + }, + { + "uid": "58949bc191ed8ccb59251e337588f540", + "css": "out_patient", + "code": 59412, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M951.6 483.9H698.5A96.4 96.4 0 0 0 723.3 346.4 305.1 305.1 0 0 0 742 242.1V201.9A201.9 201.9 0 0 0 435.5 29.2 201.9 201.9 0 0 0 129 201.9V205.4L112.9 177.2 42.8 299.9A80.6 80.6 0 0 0 130.2 417.6 96.9 96.9 0 0 0 214.9 499.3 226.4 226.4 0 0 0 355 662.3V696.2L219.7 720.8A267.3 267.3 0 0 0 0 983.8V999.9H871V983.8A267.3 267.3 0 0 0 651.4 720.7L516.1 696.1V662.3A224.7 224.7 0 0 0 603.2 602.2C604 602.6 604.9 602.7 605.7 603.1A92.8 92.8 0 0 0 647.1 612.9H951.6A48.4 48.4 0 0 0 1000 564.5V532.3A48.4 48.4 0 0 0 951.6 483.9ZM660.5 465.7C660.8 461 661.3 456.3 661.3 451.6V341A64.2 64.2 0 0 1 660.5 465.7ZM161.3 242V201.9A169.6 169.6 0 0 1 424.9 60.8L435.5 67.8 446 60.8A169.6 169.6 0 0 1 709.7 201.9V242A273.3 273.3 0 0 1 697.8 322.1 96.2 96.2 0 0 0 661.4 307.9V282.3L596.8 233.9V193.5A32.3 32.3 0 0 0 564.5 161.3H306.5A32.3 32.3 0 0 0 274.3 193.5V233.9L209.7 282.3V307.8A95.4 95.4 0 0 0 189.2 313.9 78.8 78.8 0 0 0 183 299.9L162.2 263.6C161.6 256.4 161.2 249.2 161.2 242ZM564.5 290.3H306.5V193.5H564.5ZM112.1 387.1A47.7 47.7 0 0 1 70.8 316L112.9 242.2 155 316A47.7 47.7 0 0 1 112.1 387.2ZM161.3 403.3A79.4 79.4 0 0 0 192.7 348.1 63.2 63.2 0 0 1 209.7 341V451.6C209.7 456.4 210.1 461 210.4 465.7A64.5 64.5 0 0 1 161.3 403.3ZM242 451.6V298.4L274.3 274.3V290.4A32.3 32.3 0 0 0 306.5 322.7H564.6A32.3 32.3 0 0 0 596.9 290.4V274.3L629.1 298.5V451.7A195.1 195.1 0 0 1 625.7 486.5 92.8 92.8 0 0 0 605.8 493.7 60.6 60.6 0 0 1 578.9 500.1H467.7A48.4 48.4 0 1 0 467.7 596.9H563.1A193.2 193.2 0 0 1 242 451.6ZM467.8 564.5A16.1 16.1 0 1 1 467.8 532.3H483.9V564.5ZM362.7 727.6A80.7 80.7 0 0 0 416.3 771.7 64.5 64.5 0 0 1 354.8 806.5C319.2 806.5 290.2 784.8 290.2 758.1A36.4 36.4 0 0 1 295.4 739.8ZM838.2 967.8H32.8A235 235 0 0 1 225.3 752.6L259.2 746.4A64.8 64.8 0 0 0 258.1 758.1 89.9 89.9 0 0 0 354.8 838.7 102.9 102.9 0 0 0 435.4 802.6 102.9 102.9 0 0 0 516 838.7 89.9 89.9 0 0 0 612.8 758.1 65.9 65.9 0 0 0 611.7 746.4L645.6 752.6A235 235 0 0 1 838.2 967.7ZM575.4 739.8A36.4 36.4 0 0 1 580.6 758.1C580.6 784.8 551.6 806.5 516 806.5A64.5 64.5 0 0 1 454.4 771.7 80.5 80.5 0 0 0 508.1 727.6ZM483.8 677.4V693.6A48.4 48.4 0 1 1 387 693.6V672.1A222.6 222.6 0 0 0 483.8 672.1ZM620 574.3A92.9 92.9 0 0 0 578.6 564.5H516V532.3H578.6A93.1 93.1 0 0 0 620 522.5 60.6 60.6 0 0 1 646.9 516.1H870.8V580.6H647.1A60.6 60.6 0 0 1 620.1 574.3ZM967.7 564.5A16.2 16.2 0 0 1 951.5 580.7H903.3V516.1H951.7A16.2 16.2 0 0 1 967.8 532.3ZM475.1 368.4L493 341.5 589.7 406.1 571.8 432.9ZM281.5 405.8L378.2 341.3 396.1 368.1 299.4 432.7Z", + "width": 1000 + }, + "search": [ + "out_patient" + ] + }, + { + "uid": "31c2eb5f0f3a8d8d17c7b439045d641f", + "css": "menu_icon_active", + "code": 59397, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M406.7 0H83.2A83.3 83.3 0 0 0 0 83.2V406.7A83.3 83.3 0 0 0 83.2 489.9H406.7A83.3 83.3 0 0 0 489.9 406.7V83.2A83.3 83.3 0 0 0 406.7 0ZM406.7 449.1H83.2A42.4 42.4 0 0 1 40.8 406.7V83.2A42.4 42.4 0 0 1 83.2 40.8H406.7A42.4 42.4 0 0 1 449 83.2V406.7H449A42.4 42.4 0 0 1 406.7 449.1ZM916.8 0H593.3A83.3 83.3 0 0 0 510.1 83.2V406.7A83.3 83.3 0 0 0 593.3 489.9H916.8A83.3 83.3 0 0 0 1000 406.7V83.2A83.3 83.3 0 0 0 916.8 0ZM959.1 406.7A42.4 42.4 0 0 1 916.8 449.1H593.3A42.4 42.4 0 0 1 550.9 406.7V83.2A42.4 42.4 0 0 1 593.3 40.8H916.8A42.4 42.4 0 0 1 959.1 83.2ZM406.7 510.1H83.2A83.3 83.3 0 0 0 0 593.3V916.8A83.3 83.3 0 0 0 83.2 1000H406.7A83.3 83.3 0 0 0 489.9 916.8V593.3A83.3 83.3 0 0 0 406.7 510.1ZM406.7 959.2H83.2A42.4 42.4 0 0 1 40.8 916.8V593.3A42.4 42.4 0 0 1 83.2 550.9H406.7A42.4 42.4 0 0 1 449 593.3V916.8H449A42.4 42.4 0 0 1 406.7 959.1ZM916.8 510.1H593.3A83.3 83.3 0 0 0 510.1 593.3V916.8A83.3 83.3 0 0 0 593.3 1000H916.8A83.3 83.3 0 0 0 1000 916.8V593.3A83.3 83.3 0 0 0 916.8 510.1ZM959.1 916.8A42.4 42.4 0 0 1 916.8 959.2H593.3A42.4 42.4 0 0 1 550.9 916.8V593.3A42.4 42.4 0 0 1 593.3 550.9H916.8A42.4 42.4 0 0 1 959.1 593.3Z", + "width": 1000 + }, + "search": [ + "menu_icon_active" + ] + }, + { + "uid": "4a41c9ccf8e162ce37b5cfe9fa8faa79", + "css": "patient", + "code": 59413, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M527.5 413H462.5A18.1 18.1 0 1 0 462.5 449.1H527.5A18.1 18.1 0 1 0 527.5 413ZM1189.1 81.7H1134.5V36.1H1205.1A18.1 18.1 0 0 0 1205.1 0H276.4A18.1 18.1 0 1 0 276.4 36.1H1098.4V81.7H1043.8A34 34 0 0 0 1009.9 115.7V272.9A106.7 106.7 0 0 0 1065.4 366.4L1053.6 385.4A96.9 96.9 0 0 0 1049.3 479.6L1098.4 577.2A60.5 60.5 0 0 1 1085.9 648L996.1 729.3V380.9A50.5 50.5 0 0 0 945.6 330.4H893.5A176.1 176.1 0 0 0 887.4 304.3 45.2 45.2 0 0 1 886.3 281.3L899.6 219.5A35.2 35.2 0 0 0 857.8 177.7C839.2 180.1 793.2 196.3 774.1 189.4A177.3 177.3 0 0 0 752.3 183.6 18.1 18.1 0 0 0 745.4 219.1 140.6 140.6 0 0 1 762.7 223.7 81 81 0 0 0 805.3 225.9L864 213.3 850.9 273.8C844.1 299.7 859.8 327.6 859.3 357.5V544.4A140.8 140.8 0 0 1 852.7 586.9 80.7 80.7 0 0 0 849.7 600.2 229.7 229.7 0 0 0 697 542.3H619.6V524.5A174.6 174.6 0 0 0 669.7 432.4 98.9 98.9 0 0 0 726.3 371.6 69.3 69.3 0 0 0 687.2 282.2H687.2A43.9 43.9 0 0 0 673.1 280.1V194.2A95.3 95.3 0 0 0 577.9 99H417.5A95.3 95.3 0 0 0 323.3 180.4H276.9C251.4 177.8 225.6 193.3 197.7 190.6L137.6 177.7A35.2 35.2 0 0 0 95.7 219.6L109 281.4A45.2 45.2 0 0 1 108 304.4 176 176 0 0 0 101.9 330.4H56.1V75.2A39 39 0 0 1 95 36.2H193.3A18.1 18.1 0 1 0 193.3 0.1H95A75.1 75.1 0 0 0 20 75.1V340.8A50.4 50.4 0 0 0 0 380.9L0.5 968.4A31.6 31.6 0 0 0 32 1000H964.2A31.6 31.6 0 0 0 995.8 968.4L996.1 778 1110.2 674.7 1110.5 674.5A96.9 96.9 0 0 0 1130.7 561L1081.6 463.3A60.5 60.5 0 0 1 1084.3 404.5L1100.6 378.3A107 107 0 0 0 1116.5 379.5H1116.5A106.7 106.7 0 0 0 1207.7 328.2 111.7 111.7 0 0 0 1223.2 272.9V115.7A34 34 0 0 0 1189.1 81.7ZM959.9 380.9V762L940.2 779.9Q934 774.3 927.6 769A229.2 229.2 0 0 0 892.5 650.8 116.7 116.7 0 0 1 887.2 598 176.8 176.8 0 0 0 895.4 544.4V366.6H945.6A14.3 14.3 0 0 1 960 380.9ZM412 551.6A175.1 175.1 0 0 0 583.3 551.6V584.4A14.8 14.8 0 0 1 568.5 599.3H426.8A14.8 14.8 0 0 1 411.9 584.4ZM675.9 316.8A33.5 33.5 0 0 1 691.8 360.7C685.7 379.6 666.4 398.8 652.9 399.4A18.1 18.1 0 0 0 635.8 415.4 139.1 139.1 0 0 1 359.5 415.4 18.1 18.1 0 0 0 342.5 399.4C329 398.8 309.7 379.6 303.5 360.7A33.5 33.5 0 0 1 319.5 316.8 6.5 6.5 0 0 1 321.4 316.4C322.6 316.4 323.6 317.2 325.7 320.2A18.1 18.1 0 0 0 345.9 326.9C355.3 324.2 360.3 311.1 358.5 298.5A69.5 69.5 0 0 1 428 229.1H567.4A69.5 69.5 0 0 1 636.9 298.5C636.5 308.2 635.8 321 649.5 326.9A18.1 18.1 0 0 0 669.7 320.2C672.8 315.8 673.6 316.1 675.9 316.8ZM358.5 194.2A59.1 59.1 0 0 1 417.5 135.2H577.8A59.1 59.1 0 0 1 636.9 194.2V219.1A105.1 105.1 0 0 0 567.4 193H427.9A105.1 105.1 0 0 0 358.5 219.1ZM190.1 225.9A81.2 81.2 0 0 0 232.6 223.6 140.4 140.4 0 0 1 276.9 216.5H322.3V280.3A43.7 43.7 0 0 0 308.2 282.5 69.3 69.3 0 0 0 269.1 371.9 98.8 98.8 0 0 0 325.7 432.7 174.6 174.6 0 0 0 375.8 524.8V542.5H298.3A229.7 229.7 0 0 0 145.6 600.5 80.8 80.8 0 0 0 142.6 587.2 140.9 140.9 0 0 1 136 544.7V357.5C134.5 331.6 151.1 303.5 144.4 273.7L131.4 213.3ZM36.1 380.9A14.3 14.3 0 0 1 50.5 366.6H99.9V544.4A176.8 176.8 0 0 0 108.1 597.9 121.7 121.7 0 0 1 102.8 650.8 229.2 229.2 0 0 0 67.7 769.1Q56.9 778.2 46.6 787.9A148 148 0 0 0 36.1 799.1V380.9ZM959.7 963.9H36.6V896.2A114.3 114.3 0 0 1 71.6 814 359.5 359.5 0 0 1 251.1 720.5 18.1 18.1 0 1 0 244.1 685 394.5 394.5 0 0 0 106.5 740.6 194.8 194.8 0 0 1 298.3 578.4H375.8V584.2A51 51 0 0 0 426.8 635.4H568.5A51 51 0 0 0 619.6 584.4V578.6H697.1A194.8 194.8 0 0 1 888.9 740.5 395 395 0 0 0 674.4 677.7H331.9A18.1 18.1 0 1 0 331.9 713.8H674.3A359 359 0 0 1 898.1 791.5L898.6 791.9Q912.2 802.7 924.9 815A114.3 114.3 0 0 1 959.7 896.9V963.9ZM1187 117.8V167.7H1046.1V117.8ZM1181.5 300.3A73.5 73.5 0 0 1 1116.5 343.4 70.6 70.6 0 0 1 1046 272.9V203.8H1186.9V272.9A70.3 70.3 0 0 1 1181.5 300.3Z", + "width": 1223 + }, + "search": [ + "patient" + ] + }, + { + "uid": "7d90537e42db22c38e8bb2243c8be55a", + "css": "qr-code", + "code": 59414, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M968.8 281.3C951.5 281.3 937.5 267.3 937.5 250V89.8C937.5 74.8 925.2 62.5 910.2 62.5H750C732.7 62.5 718.8 48.5 718.8 31.3S732.7 0 750 0H910.2C959.7 0 1000 40.3 1000 89.8V250C1000 267.3 986 281.3 968.8 281.3ZM31.3 281.3C14 281.3 0 267.3 0 250V89.8C0 40.3 40.3 0 89.8 0H250C267.3 0 281.3 14 281.3 31.3S267.3 62.5 250 62.5H89.8C74.8 62.5 62.5 74.8 62.5 89.8V250C62.5 267.3 48.5 281.3 31.3 281.3ZM250 1000H89.8C40.3 1000 0 959.7 0 910.2V750C0 732.7 14 718.8 31.3 718.8S62.5 732.7 62.5 750V910.2C62.5 925.2 74.8 937.5 89.8 937.5H250C267.3 937.5 281.3 951.5 281.3 968.8S267.3 1000 250 1000ZM910.2 1000H750C732.7 1000 718.8 986 718.8 968.8S732.7 937.5 750 937.5H910.2C925.2 937.5 937.5 925.2 937.5 910.2V750C937.5 732.7 951.5 718.8 968.8 718.8S1000 732.7 1000 750V910.2C1000 959.7 959.7 1000 910.2 1000ZM378.9 468.8H214.8C165.3 468.8 125 428.4 125 378.9V214.8C125 165.3 165.3 125 214.8 125H378.9C428.4 125 468.8 165.3 468.8 214.8V378.9C468.8 428.4 428.4 468.8 378.9 468.8ZM214.8 187.5C199.8 187.5 187.5 199.8 187.5 214.8V378.9C187.5 394 199.8 406.3 214.8 406.3H378.9C394 406.3 406.3 394 406.3 378.9V214.8C406.3 199.8 394 187.5 378.9 187.5ZM378.9 875H214.8C165.3 875 125 834.7 125 785.2V621.1C125 571.6 165.3 531.3 214.8 531.3H378.9C428.4 531.3 468.8 571.6 468.8 621.1V785.2C468.8 834.7 428.4 875 378.9 875ZM214.8 593.8C199.8 593.8 187.5 606 187.5 621.1V785.2C187.5 800.2 199.8 812.5 214.8 812.5H378.9C394 812.5 406.3 800.2 406.3 785.2V621.1C406.3 606 394 593.8 378.9 593.8ZM785.2 468.8H621.1C571.6 468.8 531.3 428.4 531.3 378.9V214.8C531.3 165.3 571.6 125 621.1 125H785.2C834.7 125 875 165.3 875 214.8V378.9C875 428.4 834.7 468.8 785.2 468.8ZM621.1 187.5C606 187.5 593.8 199.8 593.8 214.8V378.9C593.8 394 606 406.3 621.1 406.3H785.2C800.2 406.3 812.5 394 812.5 378.9V214.8C812.5 199.8 800.2 187.5 785.2 187.5ZM824.2 687.5H750V582C750 554 727.2 531.3 699.2 531.3H582C554 531.3 531.3 554 531.3 582V699.2C531.3 727.2 554 750 582 750H687.5V824.2C687.5 852.2 710.3 875 738.3 875H824.2C852.2 875 875 852.2 875 824.2V738.3C875 710.3 852.2 687.5 824.2 687.5ZM593.8 593.8H687.5V687.5H593.8ZM812.5 812.5H750V750H812.5ZM312.5 343.8H281.3C264 343.8 250 329.8 250 312.5V281.3C250 264 264 250 281.3 250H312.5C329.8 250 343.8 264 343.8 281.3V312.5C343.8 329.8 329.8 343.8 312.5 343.8ZM718.8 343.8H687.5C670.2 343.8 656.3 329.8 656.3 312.5V281.3C656.3 264 670.2 250 687.5 250H718.8C736 250 750 264 750 281.3V312.5C750 329.8 736 343.8 718.8 343.8ZM312.5 750H281.3C264 750 250 736 250 718.8V687.5C250 670.2 264 656.3 281.3 656.3H312.5C329.8 656.3 343.8 670.2 343.8 687.5V718.8C343.8 736 329.8 750 312.5 750Z", + "width": 1000 + }, + "search": [ + "qr-code" + ] + }, + { + "uid": "47870853aec32b02cd5a40fbb389baa1", + "css": "radiology", + "code": 59415, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M9.5 420.4A9.5 9.5 0 0 1 2.1 405C147.5 223 255.4 180.6 359.8 139.6L366.3 137C407.7 120.8 430.8 77.5 435.2 8.9A9.6 9.6 0 0 1 445.2 0.1 9.5 9.5 0 0 1 454.1 10.1C449.2 86.8 422 135.5 373.3 154.7L366.8 157.2C264.6 197.2 159.1 238.8 16.9 416.9A9.5 9.5 0 0 1 9.5 420.4ZM216.3 1000L215.2 1000A9.5 9.5 0 0 1 206.9 989.5C207.1 987.8 227.5 820.4 227.4 753.3 227.4 695.6 209.9 542.1 203.5 488.5 178.7 511.9 127.1 560.1 104.3 577.7A458 458 0 0 1 62.3 604.7L49.8 612.2A9.5 9.5 0 1 1 40 596L52.6 588.4A445.8 445.8 0 0 0 92.9 562.6C122.1 540.1 203.5 462.6 204.3 461.8A9.5 9.5 0 0 1 220.2 467.5C221.3 476.2 246.5 682 246.5 753.2 246.5 821.5 226.7 984.8 225.9 991.7A9.5 9.5 0 0 1 216.5 1000.1ZM1058.7 420.4A9.5 9.5 0 0 1 1051.3 416.9C909.1 238.9 803.5 197.4 701.4 157.2L694.9 154.7C646.1 135.5 619 86.8 614.1 10.1A9.5 9.5 0 0 1 633.1 8.9C637.4 77.7 660.6 120.9 701.9 137L708.4 139.6C812.7 180.6 920.8 223 1066.2 405A9.5 9.5 0 0 1 1058.7 420.4ZM852.1 1000A9.5 9.5 0 0 1 842.8 991.7C841.9 984.7 821.8 821.4 821.8 753.2 821.8 681.9 847 476.1 848.1 467.4A9.5 9.5 0 0 1 864 461.8C864.8 462.5 946.2 540 975.4 562.5A448.1 448.1 0 0 0 1015.7 588.3L1028.2 595.9A9.5 9.5 0 0 1 1018.4 612.1L1006 604.6A458.9 458.9 0 0 1 963.9 577.6C941.1 560.1 889.6 511.8 864.8 488.4 858.4 542 840.9 695.5 840.8 753.2 840.8 820.2 861.5 987.7 861.8 989.3A9.5 9.5 0 0 1 853.6 999.8L852.4 999.8ZM399 631.1A96.4 96.4 0 0 1 307 589.4 19 19 0 0 1 341.2 573C350.9 593.3 408.2 604.5 479.4 576.7A19 19 0 1 1 493.3 612.1 263.1 263.1 0 0 1 399 631.1ZM388 705.8A167.6 167.6 0 0 1 333.5 697.1 89.7 89.7 0 0 1 280.3 655.8 19 19 0 1 1 314.5 639.4 53.5 53.5 0 0 0 346 661.3 171.1 171.1 0 0 0 477.9 645 19 19 0 0 1 494.8 679 241.9 241.9 0 0 1 388 705.8ZM348.5 817.7A76.6 76.6 0 0 1 310 808.1 86.8 86.8 0 0 1 276.4 711.3 19 19 0 0 1 313.7 717.8C308.8 746 314.3 766.8 328.8 775.2 349.3 786.9 395.9 778.4 465.4 719.2A19 19 0 0 1 489.9 748.1C425.6 802.7 379.6 817.7 348.4 817.7ZM599.7 557.3Q588.4 557.3 576.4 556.8A19 19 0 0 1 578 518.9C714.7 524.4 772.4 478.5 776.6 464.6A19 19 0 0 1 811.3 449.3 37.2 37.2 0 0 1 807.1 487.8C784.2 523.3 711.8 557.3 599.7 557.3ZM582.6 482.5H579.4A19 19 0 1 1 579.4 444.6C580.4 444.6 581.3 444.6 582.3 444.6 691.4 444.6 710.6 422.1 713.3 417.5 714.1 416.2 716 413 712.7 406.7A19 19 0 1 1 746.2 388.9 47.9 47.9 0 0 1 745.8 437.1C727.4 467.7 674 482.5 582.6 482.5ZM609.9 248.4A19 19 0 0 0 572.3 245.3 67 67 0 0 1 553.3 254.8V205.7A19 19 0 1 0 515.4 205.7V254.7A66.5 66.5 0 0 1 496.4 245.1 19 19 0 0 0 458.7 248.3C458.7 273.4 489.6 287.4 515.4 294.8V594.3A19 19 0 1 0 553.3 594.3V294.9C579.1 287.5 609.9 273.5 609.9 248.4ZM490.1 348.1H491.1A19 19 0 1 0 492 310.1C425.2 306.6 405.2 290 403.1 285A19 19 0 0 0 369.2 268 36.8 36.8 0 0 0 370.2 304C380.3 321.8 409.3 343.9 490.1 348.1ZM490.3 518.9C353.4 524.5 295.9 478.5 291.6 464.6A19 19 0 0 0 257 449.3 37.2 37.2 0 0 0 261.2 487.8C284 523.4 356.4 557.4 468.5 557.4Q479.9 557.4 491.8 556.9A19 19 0 0 0 490.3 519ZM485.8 482.5H488.8A19 19 0 0 0 488.8 444.6H488.8C376.8 444.9 357.7 422.1 354.9 417.5 354.1 416.2 352.2 413 355.6 406.7A19 19 0 0 0 322 388.9 47.9 47.9 0 0 0 322.4 437.1C340.8 467.7 394.3 482.5 485.8 482.5ZM577.1 348.1H578.1C658.8 343.9 687.8 321.8 697.9 304.1A36.8 36.8 0 0 0 698.9 268 19 19 0 0 0 665.1 285.1C662.9 290 642.9 306.8 576.1 310.2A19 19 0 0 0 577.1 348.1ZM491.3 369.3H491.3C385.8 369.7 367.8 348.3 365.2 344.1 364.6 343 363 340.3 365.9 334.8A19 19 0 1 0 332.4 317 46.5 46.5 0 0 0 332.8 363.7C350.4 393 401.4 407.3 488.6 407.3H491.4A19 19 0 0 0 491.4 369.4ZM736.3 317A19 19 0 1 0 702.8 334.8C705.8 340.4 704.2 343 703.5 344.1 700.9 348.4 683 369.4 580.1 369.4 579.2 369.4 578.3 369.4 577.3 369.4A19 19 0 0 0 577.3 407.3H580.2C667.3 407.3 718.3 393.1 736 363.7A46.5 46.5 0 0 0 736.3 317ZM669.3 631.1A263 263 0 0 1 575.1 612 19 19 0 1 1 588.9 576.7C660.1 604.7 717.4 593.3 727.2 572.9A19 19 0 1 1 761.4 589.3 96.5 96.5 0 0 1 669.3 631.1ZM680.2 705.8A241.9 241.9 0 0 1 573.5 679 19 19 0 0 1 590.4 645.1 171 171 0 0 0 722.3 661.3 53.5 53.5 0 0 0 753.8 639.5 19 19 0 1 1 788 655.9 89.7 89.7 0 0 1 734.8 697.1 167.6 167.6 0 0 1 680.3 705.8ZM719.7 817.7C688.5 817.7 642.5 802.7 578.2 748.2A19 19 0 0 1 602.7 719.3C672.3 778.4 718.9 786.9 739.2 775.3 753.8 767 759.3 746 754.4 717.9A19 19 0 1 1 791.7 711.3 86.8 86.8 0 0 1 758.1 808.2 76.7 76.7 0 0 1 719.7 817.7ZM854.3 931.9H215.3A102.8 102.8 0 0 1 112.6 829.2V190.2A102.8 102.8 0 0 1 215.3 87.5H854.3A102.8 102.8 0 0 1 957 190.2V829.2A102.8 102.8 0 0 1 854.3 931.9ZM215.3 106.5A84 84 0 0 0 131.6 190.2V829.2A84 84 0 0 0 215.3 912.9H854.3A84 84 0 0 0 938.1 829.2V190.2A84 84 0 0 0 854.3 106.5Z", + "width": 1068 + }, + "search": [ + "radiology" + ] + }, + { + "uid": "166043ccaa1f7fdaa8ec9a357a798f8c", + "css": "referral", + "code": 59416, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M888.2 752.2A107.4 107.4 0 0 0 944.6 658.3 110.5 110.5 0 0 0 723.6 658.3 107.4 107.4 0 0 0 780 752.2 166.1 166.1 0 0 0 668.1 908.8V983.3A16.7 16.7 0 0 0 684.8 1000H983.3A16.7 16.7 0 0 0 1000 983.3V908.8A166.1 166.1 0 0 0 888.2 752.2ZM756.9 658.3A77.2 77.2 0 1 1 834.1 732.7 75.9 75.9 0 0 1 756.9 658.3ZM966.7 966.7H701.4V908.8A132.6 132.6 0 0 1 966.6 908.8ZM888.2 201.5A107.3 107.3 0 0 0 944.6 107.7 110.5 110.5 0 0 0 723.6 107.7 107.3 107.3 0 0 0 779.9 201.5 166.1 166.1 0 0 0 668.1 358.2V432.7A16.7 16.7 0 0 0 684.8 449.3H983.3A16.7 16.7 0 0 0 1000 432.7V358.2A166.1 166.1 0 0 0 888.2 201.5ZM756.9 107.7A77.2 77.2 0 0 1 911.2 107.7 77.2 77.2 0 0 1 756.9 107.7ZM966.7 416H701.4V358.2A132.6 132.6 0 0 1 966.6 358.2ZM537.3 492.6L631.1 411.9A16.7 16.7 0 0 0 609.3 386.6L505.3 476.3H388A16.7 16.7 0 1 0 388 509.6H505.3L609.5 595A18.6 18.6 0 0 0 632.8 592.7 16.2 16.2 0 0 0 630.5 569.3ZM292.4 452.7A125.9 125.9 0 0 0 323.3 369.9 128.6 128.6 0 0 0 66.1 369.9 125.9 125.9 0 0 0 97.1 452.7 183.8 183.8 0 0 0 0 613.2V711.2A16.7 16.7 0 0 0 16.7 727.9H372.9A16.7 16.7 0 0 0 389.6 711.2V613.2A183.9 183.9 0 0 0 292.4 452.7ZM194.8 276A94 94 0 1 1 99.5 370 94.8 94.8 0 0 1 194.8 275.9ZM176.8 496A130.7 130.7 0 0 0 194.8 497.4 128.1 128.1 0 0 0 212.8 496V574L194.8 597 176.7 573.8ZM356.2 694.7H303.9V612.9A16.7 16.7 0 0 0 270.5 612.9V694.6H119.1V612.9A16.7 16.7 0 0 0 85.7 612.9V694.6H33.3V613.2A150.5 150.5 0 0 1 124.8 476.5 128.9 128.9 0 0 0 143.5 486.5V585.2L181.7 634.1A16.7 16.7 0 0 0 207.9 634.1L246.1 585.2V486.6A129.8 129.8 0 0 0 264.8 476.6 150.5 150.5 0 0 1 356.2 613.3V694.7Z", + "width": 1000 + }, + "search": [ + "referral" + ] + }, + { + "uid": "a1c284f339f4b6bc2d580afc2e7b2639", + "css": "search_patient", + "code": 59418, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M388.6 97.1A291.3 291.3 0 1 0 680 388.4 291.7 291.7 0 0 0 388.6 97.1ZM388.6 647.5A259.1 259.1 0 1 1 647.7 388.4 259.3 259.3 0 0 1 388.6 647.5ZM178.1 404.7H210.4A194.6 194.6 0 0 1 404.7 210.4V178.1A226.7 226.7 0 0 0 178.1 404.7ZM977.2 885.6L1000 862.8 768.3 630.9 745.5 653.7 704.9 613.2A387.8 387.8 0 1 0 613.4 705.1L654 745.7 631.1 768.5 862.5 999.9 885.4 977.1 676.7 768.2 768.2 676.7ZM388.4 744.7A356.1 356.1 0 1 1 744.5 388.6 356.6 356.6 0 0 1 388.4 744.7ZM676.8 722.4L639.2 685A388.2 388.2 0 0 0 685.1 639.1L722.7 676.7Z", + "width": 1000 + }, + "search": [ + "search_patient" + ] + }, + { + "uid": "5a324eddf382f5a1167d7d40325f82c8", + "css": "reject_icon", + "code": 59394, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M681 626.7L554.3 500 681 373.3A38.5 38.5 0 0 0 626.7 318.9L500 445.7 373.3 319A38.5 38.5 0 1 0 318.9 373.3L445.7 500 318.9 626.8A37.2 37.2 0 0 0 318.9 681.1 38.2 38.2 0 0 0 373.3 681.1L500 554.4 626.7 681.1A38.5 38.5 0 0 0 681.1 681.1 38.2 38.2 0 0 0 681 626.7ZM500 67.3A432.5 432.5 0 1 1 194 194 429.8 429.8 0 0 1 500 67.3M500 0A500 500 0 1 0 1000 500 500 500 0 0 0 500 0Z", + "width": 1000 + }, + "search": [ + "reject_icon" + ] + }, + { + "uid": "2742f64b5e69cc4f39a2dcc5a081ad03", + "css": "approved_icon", + "code": 59403, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M756.3 348.3L714 304.8A9.1 9.1 0 0 0 707.2 302H707.2A8.7 8.7 0 0 0 700.5 304.8L407.2 600.3 300.5 493.5A9.3 9.3 0 0 0 287.1 493.5L244.2 536.3A9.6 9.6 0 0 0 244.2 550L378.8 684.5A42.6 42.6 0 0 0 406.9 698.2 44.6 44.6 0 0 0 434.8 685H435L756.5 362A10.3 10.3 0 0 0 756.3 348.3ZM500 67.3A432.5 432.5 0 1 1 194 194 429.8 429.8 0 0 1 500 67.3M500 0A499.9 499.9 0 1 0 999.9 500 499.9 499.9 0 0 0 500 0Z", + "width": 1000 + }, + "search": [ + "approved_icon" + ] + }, + { + "uid": "148de09f7fd22c378cdfdbaacaa8e205", + "css": "pending_icon", + "code": 59404, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M809.8 932H797.3C781.5 932 768.2 929.8 766.5 914V913.7C731 583.9 523.3 577.6 523.3 499.9S731.1 415.9 766.5 86V85.9C768.2 70.1 781.5 68 797.3 68H809.8A34.8 34.8 0 0 0 844.7 35.7 34 34 0 0 0 810.7 0H35A34.8 34.8 0 0 0 0 32.3 34 34 0 0 0 34 68H47.2C63 68 76.3 70.2 78.1 85.9V86.2C113.7 416 321.5 422.3 321.5 500S113.7 584 78.3 913.8V914C76.6 929.8 63.3 932 47.5 932H35A34.8 34.8 0 0 0 0.1 964.3 34 34 0 0 0 34.1 1000H810.7A33.9 33.9 0 0 0 844.7 964.3 34.8 34.8 0 0 0 809.8 932ZM197.4 848.9C267 655.2 390.6 678.7 390.6 602.3V467.5C390.6 420.4 301.2 387.6 245.4 311.1A19 19 0 0 1 261.2 281H583.8A18.9 18.9 0 0 1 600 310.6C545.2 387.3 454.2 420.4 454.2 467.4V602.4C454.2 678.1 572.9 657.5 647.8 849 654.7 866.3 649.5 887.8 631.2 887.8H214.1C195.4 887.8 191.1 866.5 197.4 849Z", + "width": 845 + }, + "search": [ + "pending_icon" + ] + }, + { + "uid": "0bbb324cc39e62b3a4e05639a4f4008f", + "css": "home_icon", + "code": 59407, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M973.1 435L973.1 435 565 27A92 92 0 0 0 434.9 27L27.2 434.7 26.8 435.1A92 92 0 0 0 88 591.9C88.9 591.9 89.9 591.9 90.8 591.9H107.1V892.1A107.9 107.9 0 0 0 214.8 999.9H374.4A29.3 29.3 0 0 0 403.7 970.6V735.3A49.2 49.2 0 0 1 452.9 686.2H547A49.2 49.2 0 0 1 596.2 735.3V970.7A29.3 29.3 0 0 0 625.5 1000H785.1A107.9 107.9 0 0 0 892.8 892.3V592H907.8A92.1 92.1 0 0 0 973 434.9ZM931.6 523.7A33.4 33.4 0 0 1 907.9 533.5H863.5A29.3 29.3 0 0 0 834.2 562.8V892.3A49.2 49.2 0 0 1 785.1 941.4H654.9V735.3A107.9 107.9 0 0 0 547 627.5H452.9A107.9 107.9 0 0 0 345.1 735.2V941.3H215A49.2 49.2 0 0 1 165.8 892.1V562.8A29.3 29.3 0 0 0 136.5 533.5H92.8L91.4 533.5A33.4 33.4 0 0 1 68.4 476.4H68.4L476.3 68.4A33.4 33.4 0 0 1 523.6 68.4L931.4 476.2 931.6 476.4A33.4 33.4 0 0 1 931.6 523.7ZM931.6 523.7", + "width": 1000 + }, + "search": [ + "home_icon" + ] + }, + { + "uid": "d8fc8a6e9f001147307d87b3b620b86f", + "css": "mail", + "code": 59422, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1055.6 667.9V111.1A111.2 111.2 0 0 0 944.4 0H111.1A111.2 111.2 0 0 0 0 111.1V666.7A111.2 111.2 0 0 0 111.1 777.8H777.8A46 46 0 0 0 789.7 810C819.2 841 869.8 889 914.5 931.2 936.9 952.3 957.3 971.7 972.1 986A48.3 48.3 0 0 0 1006 1000 50.2 50.2 0 0 0 1055.5 949.3V889.4C1198.9 894.6 1277.9 940.2 1277.9 972.2A27.8 27.8 0 1 0 1333.4 972.2 306 306 0 0 0 1055.6 667.9ZM111.1 55.7H944.4C945.6 55.7 946.6 56.2 947.7 56.3L551.3 381.8A46.3 46.3 0 0 1 506.8 383.6L107.9 56.2C109 56.1 110 55.6 111.1 55.6ZM111.1 722.3A55.6 55.6 0 0 1 55.6 666.8V111.1A55 55 0 0 1 60.3 89L474 428.4A98.2 98.2 0 0 0 527.8 444.5 100.7 100.7 0 0 0 584.2 426.5L995.3 89A55 55 0 0 1 1000 111.1V556.8A48.1 48.1 0 0 0 972.1 569.7C957.4 584.1 936.9 603.4 914.6 624.5 879.9 657.3 841.9 693.2 812.7 722.3H111.1ZM1027.9 833.3A27.8 27.8 0 0 0 1000.2 861.1V935.7C986.8 922.8 970.4 907.3 952.9 890.8 911.6 851.7 865 807.8 836 777.8 865 747.8 911.6 703.8 952.9 664.7 971.6 647.1 989 630.6 1000.2 618.2V694.4A27.8 27.8 0 0 0 1027.9 722.2 250.3 250.3 0 0 1 1259.3 877.5 525.9 525.9 0 0 0 1027.9 833.3Z", + "width": 1333 + }, + "search": [ + "mail" + ] + }, + { + "uid": "afe3a55435e46aeeeeae8f60731d4706", + "css": "medicine_search", + "code": 59423, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M986 125.2A171.6 171.6 0 1 0 1157.6 296.8 171.8 171.8 0 0 0 986 125.2ZM986 449.3A152.6 152.6 0 1 1 1138.6 296.8 152.7 152.7 0 0 1 986 449.3ZM862.1 306.4H881.1A114.6 114.6 0 0 1 995.5 192V173A133.5 133.5 0 0 0 862.1 306.4ZM1332.6 589.6L1346.1 576.2 1209.6 439.6 1196.2 453 1172.3 429.1A228.3 228.3 0 1 0 1118.4 483.3L1142.3 507.2 1128.8 520.6 1265.1 657 1278.6 643.5 1155.7 520.6 1209.6 466.7ZM985.9 506.6A209.7 209.7 0 1 1 1195.6 296.9 210 210 0 0 1 985.9 506.6ZM1155.7 493.5L1133.6 471.4A228.6 228.6 0 0 0 1160.6 444.5L1182.7 466.6ZM416.7 700V733.3H100A16.7 16.7 0 0 1 83.3 716.6V566.6A16.7 16.7 0 0 1 100 550H416.7V583.2H116.6V699.9ZM33.3 866.7H416.7V900H33.3A66.7 66.7 0 0 0 99.9 966.5H466.6A67.2 67.2 0 0 0 479.9 965.2L486.6 997.9A100.5 100.5 0 0 1 466.6 999.9H99.9A100.1 100.1 0 0 1-0.1 899.9V583.3H33.2ZM79.2 316.7H83.3V266.7H70.9A37.5 37.5 0 0 1 33.3 229.2V58.3A58.4 58.4 0 0 1 91.7 0H400V33.3H91.7A25 25 0 0 0 66.7 58.3V229.2A4.2 4.2 0 0 0 70.9 233.3H495.9A4.2 4.2 0 0 0 500.1 229.2V58.3A25 25 0 0 0 475.1 33.3H433.4V0H475.1A58.4 58.4 0 0 1 533.4 58.3V229.2A37.5 37.5 0 0 1 495.9 266.7H483.4V316.7H487.6A79.4 79.4 0 0 1 566.8 395.9V400H533.5V395.9A45.9 45.9 0 0 0 487.6 350H79.2A45.9 45.9 0 0 0 33.3 395.9V466.7H450V500H33.3V550H0V395.8A79.4 79.4 0 0 1 79.2 316.7ZM450 316.7V266.7H116.7V316.7ZM466.6 66.7H433.3V200H466.6ZM400 66.7H366.7V200H400ZM333.3 66.7H300V200H333.3ZM266.6 66.7H233.3V200H266.6ZM200 66.7H166.7V200H200ZM133.3 66.7H100V200H133.3ZM416.7 783.3H316.7V816.6H416.7ZM283.3 783.3H83.3V816.6H283.3ZM450 595.8A162.7 162.7 0 0 1 612.5 433.3H620.8A163 163 0 0 1 780 563.3L747.4 570A129.5 129.5 0 0 0 620.8 466.7H612.5A129.3 129.3 0 0 0 483.3 595.8V683.3H583.3V716.6H483.3V749.9H566.7V783.2H483.3V837.3A129.3 129.3 0 0 0 612.5 966.5H620.8A129.1 129.1 0 0 0 661.4 960L671.9 991.6A162.3 162.3 0 0 1 620.8 999.8H612.5A162.7 162.7 0 0 1 450 837.3ZM600 800A200 200 0 1 1 800 1000 200 200 0 0 1 600 800ZM633.3 800A165.6 165.6 0 0 0 652.2 877L877 652.2A166.6 166.6 0 0 0 633.3 800ZM694.5 929L838.2 785.3 861.7 808.9 722.9 947.8A166.6 166.6 0 0 0 947.7 722.9L892.2 778.5 868.6 754.9 928.9 694.6A168.3 168.3 0 0 0 905.4 671L670.9 905.4A168.1 168.1 0 0 0 694.5 929Z", + "width": 1346 + }, + "search": [ + "medicine_search" + ] + }, + { + "uid": "609e74ef20b926b8e212d28a24bf0f36", + "css": "referred", + "code": 59426, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M887.8 751.4A107.7 107.7 0 0 0 944.3 657.2 110.9 110.9 0 0 0 722.6 657.2 107.7 107.7 0 0 0 779.1 751.4 166.6 166.6 0 0 0 666.9 908.6V983.2A16.7 16.7 0 0 0 683.7 999.9H983.3A16.7 16.7 0 0 0 1000 983.2V908.6A166.6 166.6 0 0 0 887.8 751.4ZM756.1 657.2A77.5 77.5 0 1 1 833.5 731.9 76.1 76.1 0 0 1 756.1 657.2ZM966.6 966.5H700.5V908.6A133 133 0 0 1 966.6 908.6ZM887.9 202.2A107.7 107.7 0 0 0 944.4 108.1 110.9 110.9 0 0 0 722.7 108.1 107.7 107.7 0 0 0 779.2 202.2 166.6 166.6 0 0 0 667.1 359.3V434.1A16.7 16.7 0 0 0 683.8 450.8H983.3A16.7 16.7 0 0 0 1000 434.1V359.3A166.6 166.6 0 0 0 887.9 202.2ZM756.2 108.1A77.5 77.5 0 0 1 911 108.1 77.5 77.5 0 0 1 756.2 108.1ZM966.6 417.4H700.5V359.3A133 133 0 0 1 966.6 359.3ZM537.5 492.7L631.5 411.6A16.7 16.7 0 0 0 609.7 386.3L505.4 476.3H387.6A16.7 16.7 0 1 0 387.6 509.7H505.5L610 595.4A18.7 18.7 0 0 0 633.5 593 16.3 16.3 0 0 0 631.1 569.5ZM293.3 452.6A126.3 126.3 0 0 0 324.5 369.6 129.1 129.1 0 0 0 66.4 369.6 126.3 126.3 0 0 0 97.5 452.6 184.4 184.4 0 0 0 0 613.7V712A16.7 16.7 0 0 0 16.7 728.7H374.1A16.7 16.7 0 0 0 390.8 712V613.7A184.4 184.4 0 0 0 293.3 452.6ZM195.5 275.3A94.3 94.3 0 1 1 99.9 369.6 95.1 95.1 0 0 1 195.4 275.3ZM177.5 496A131.1 131.1 0 0 0 195.5 497.4 128.5 128.5 0 0 0 213.6 496V574.2L195.4 597.2 177.4 574.1ZM357.5 695.3H304.8V613.3A16.7 16.7 0 0 0 271.4 613.3V695.3H119.4V613.3A16.7 16.7 0 0 0 86 613.3V695.3H33.4V613.7A151 151 0 0 1 125.2 476.7 129.3 129.3 0 0 0 144 486.7V585.8L182.3 634.8A16.7 16.7 0 0 0 208.6 634.8L246.9 585.7V486.7A130.2 130.2 0 0 0 265.7 476.7 151 151 0 0 1 357.4 613.6V695.2Z", + "width": 1000 + }, + "search": [ + "referred" + ] + }, + { + "uid": "5af6e4cb377acd0ad97c464f6813ab1a", + "css": "sync", + "code": 59428, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1000 168.7V346.9A62.5 62.5 0 0 1 937.5 409.4H759.3A62.5 62.5 0 0 1 759.3 284.4H807.1A375.4 375.4 0 0 0 150.8 363.4 62.5 62.5 0 0 1 34.3 317.9 500.4 500.4 0 0 1 875 169.1V169.1A62.5 62.5 0 0 1 1000 169.1ZM930.4 601.1A62.5 62.5 0 0 0 849.4 636.5 375.4 375.4 0 0 1 197.4 721.8H240.7A62.5 62.5 0 1 0 240.7 596.8H62.5A62.5 62.5 0 0 0 0 659.3V837.5A62.5 62.5 0 0 0 125 837.5V830.9A503 503 0 0 0 215.2 910.8 500.4 500.4 0 0 0 966 682.2 62.5 62.5 0 0 0 930.3 601.2Z", + "width": 1000 + }, + "search": [ + "sync" + ] + }, + { + "uid": "a0f7dbb184f90f285a9cba8cf09a9b6a", + "css": "drawer_icon", + "code": 59429, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1564.7 1000H68C30.6 1000 0 958.7 0 908.2H0C0 857.6 30.6 816.3 68 816.3H1564.7C1602 816.3 1632.7 857.6 1632.7 908.2H1632.7C1632.7 958.7 1602 1000 1564.7 1000ZM911.6 591.8H68C30.6 591.8 0 550.5 0 500H0C0 449.5 30.6 408.2 68 408.2H911.6C949 408.2 979.6 449.5 979.6 500H979.6C979.6 550.5 949 591.8 911.6 591.8ZM1238.1 183.7H68C30.6 183.7 0 142.4 0 91.8H0C0 41.3 30.6 0 68 0H1238.1C1275.5 0 1306.1 41.3 1306.1 91.8H1306.1C1306.1 142.4 1275.5 183.7 1238.1 183.7Z", + "width": 1633 + }, + "search": [ + "drawer_icon" + ] + }, + { + "uid": "764baf138776221a3e1e845391b188a4", + "css": "leaves", + "code": 59446, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M968.7 468.7H572.9A31.3 31.3 0 1 1 572.9 406.2H968.7A31.3 31.3 0 1 1 968.7 468.7ZM968.7 468.7M812.5 625A31.3 31.3 0 0 1 790.4 571.6L924.5 437.5 790.4 303.3A31.3 31.3 0 0 1 834.6 259.1L990.9 415.4A31.3 31.3 0 0 1 990.9 459.6L834.6 615.8A31.2 31.2 0 0 1 812.5 625ZM812.5 625M333.3 1000A83.3 83.3 0 0 0 416.7 916.7V166.7A83.9 83.9 0 0 0 360.3 87.5L109.9 4.1A84.2 84.2 0 0 0 0 83.4V833.4A83.9 83.9 0 0 0 56.4 912.4L306.8 995.8A87.2 87.2 0 0 0 333.3 1000ZM83.3 62.5A24.5 24.5 0 0 1 90.8 63.6L340.1 146.7A21.4 21.4 0 0 1 354.2 166.6V916.6A22 22 0 0 1 325.9 936.4L76.6 853.3A21.5 21.5 0 0 1 62.5 833.3V83.3A20.9 20.9 0 0 1 83.3 62.5ZM83.3 62.5M635.4 208.3A31.3 31.3 0 0 0 666.7 177.1V114.6A114.7 114.7 0 0 0 552.1 0H83.3A31.3 31.3 0 0 0 83.3 62.5H552.1A52.1 52.1 0 0 1 604.2 114.6V177.1A31.3 31.3 0 0 0 635.4 208.3ZM635.4 208.3M385.4 875H552.1A114.7 114.7 0 0 0 666.6 760.4V697.9A31.3 31.3 0 0 0 604.1 697.9V760.4A52.1 52.1 0 0 1 552.1 812.5H385.4A31.3 31.3 0 0 0 385.4 875ZM385.4 875", + "width": 1000 + }, + "search": [ + "leaves" + ] + }, + { + "uid": "4477771717c5280f9030b8e410040eda", + "css": "search_patient-1", + "code": 59465, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1142.7 436.8A165.2 165.2 0 1 0 1307.8 601.9 165.4 165.4 0 0 0 1142.7 436.8ZM1142.7 748.8A146.9 146.9 0 1 1 1289.5 601.9 147 147 0 0 1 1142.7 748.8ZM1023.4 611.1H1041.7A110.3 110.3 0 0 1 1151.8 500.9V482.7A128.5 128.5 0 0 0 1023.4 611.1ZM1476.4 883.8L1489.3 870.9 1357.9 739.4 1345 752.4 1322 729.4A219.8 219.8 0 1 0 1270.1 781.5L1293.1 804.5 1280.2 817.4 1411.4 948.7 1424.4 935.7 1306 817.3 1357.9 765.4ZM1142.6 803.9A201.9 201.9 0 1 1 1344.4 602 202.2 202.2 0 0 1 1142.6 803.9ZM1306 791.3L1284.7 770.1A220.1 220.1 0 0 0 1310.7 744.1L1332.1 765.5ZM48.4 483.9H301.4A96.4 96.4 0 0 1 276.7 346.5 305.1 305.1 0 0 1 257.9 242V201.9A201.8 201.8 0 0 1 564.5 29.2 201.8 201.8 0 0 1 871 201.8V205.4L887 177.2 957.1 299.9A80.6 80.6 0 0 1 869.7 417.5 96.9 96.9 0 0 1 785.1 499.2 226.4 226.4 0 0 1 645.1 662.2V696.2L780.4 720.8A267.4 267.4 0 0 1 999.9 983.9V999.9H129V983.9A267.4 267.4 0 0 1 348.6 720.8L483.9 696.2V662.3A224.6 224.6 0 0 1 396.8 602.3C396 602.6 395.1 602.8 394.3 603.1A92.8 92.8 0 0 1 352.9 612.9H48.4A48.4 48.4 0 0 1 0 564.5V532.3A48.4 48.4 0 0 1 48.4 483.9ZM339.5 465.8C339.3 461.1 338.7 456.4 338.7 451.7V341A64.2 64.2 0 0 0 339.5 465.7ZM838.7 242V201.9A169.6 169.6 0 0 0 575.1 60.8L564.5 67.8 554 60.8A169.6 169.6 0 0 0 290.3 201.9V242A273.2 273.2 0 0 0 302.3 322.2 96.2 96.2 0 0 1 338.7 308.1V282.4L403.2 234V193.5A32.3 32.3 0 0 1 435.5 161.3H693.5A32.3 32.3 0 0 1 725.8 193.5V233.9L790.3 282.3V307.8A95.4 95.4 0 0 1 810.8 313.9 78.8 78.8 0 0 1 817 299.9L837.7 263.6C838.3 256.4 838.7 249.2 838.7 242ZM435.5 290.4H693.6V193.5H435.5ZM887.9 387.2A47.6 47.6 0 0 0 929.3 316L887.1 242.2 844.9 315.9A47.6 47.6 0 0 0 887.6 387.1ZM838.8 403.2A79.4 79.4 0 0 1 807.4 348.1 63.2 63.2 0 0 0 790.4 340.9V451.6C790.4 456.4 790 461 789.7 465.7A64.5 64.5 0 0 0 838.7 403.2ZM758.1 451.6V298.4L725.9 274.3V290.4A32.3 32.3 0 0 1 693.6 322.6H435.5A32.3 32.3 0 0 1 403.2 290.4V274.3L370.9 298.4V451.6A195.2 195.2 0 0 0 374.4 486.4 92.8 92.8 0 0 1 394.3 493.6 60.6 60.6 0 0 0 421.2 500H532.2A48.4 48.4 0 1 1 532.2 596.7H436.9A193.2 193.2 0 0 0 758.1 451.6ZM532.3 564.5A16 16 0 1 0 532.3 532.2H516.3V564.5ZM637.4 727.6A80.7 80.7 0 0 1 583.6 771.6 64.5 64.5 0 0 0 645.1 806.4C680.7 806.4 709.6 784.7 709.6 758A36.4 36.4 0 0 0 704.4 739.7ZM161.8 967.8H967.2A235 235 0 0 0 774.7 752.6L740.8 746.5A64.8 64.8 0 0 1 742 758.2C742 802.6 698.6 838.8 645.2 838.8A102.9 102.9 0 0 1 564.6 802.6 102.9 102.9 0 0 1 483.9 838.7C430.4 838.7 387.1 802.5 387.1 758.1A65.9 65.9 0 0 1 388.2 746.4L354.4 752.6A235 235 0 0 0 161.8 967.8ZM424.5 739.9A36.4 36.4 0 0 0 419.4 758.2C419.4 784.9 448.3 806.6 483.9 806.6A64.5 64.5 0 0 0 545.4 771.8 80.6 80.6 0 0 1 491.6 727.7ZM516 677.4V693.4A48.4 48.4 0 1 0 612.8 693.4V672.1A222.6 222.6 0 0 1 516 672.1ZM379.6 574.3A92.9 92.9 0 0 1 421 564.5H483.9V532.3H421.2A93.1 93.1 0 0 1 379.9 522.5 60.6 60.6 0 0 0 352.9 516H129V580.5H352.9A60.6 60.6 0 0 0 379.9 574.3ZM32.1 564.5A16 16 0 0 0 48.1 580.5H96.8V516H48.4A16 16 0 0 0 32.4 532ZM524.9 368.4L507 341.5 410.3 406.1 428.2 432.9ZM718.5 405.8L621.8 341.3 603.9 368.1 700.6 432.7Z", + "width": 1489 + }, + "search": [ + "search_patient" + ] + }, + { + "uid": "acee3dc68dc70f4b268b59a42fd957ee", + "css": "referral-1", + "code": 59408, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M681.4 793.1L735.5 860.8 683 913.3 659.1 793.7C663.5 793.4 667.9 793.1 672.4 793.1ZM791.7 793.1L758.6 834.3 725.6 793.1ZM835.9 793.1H844.8C849.3 793.1 853.7 793.4 858.1 793.7L834.2 913.3 781.7 860.8ZM913.8 655.1H912.8A154.1 154.1 0 0 0 913.8 637.9V586.2A34.5 34.5 0 0 1 913.8 655.1ZM603.4 482.7A103.6 103.6 0 0 1 706.9 379.3H810.3A103.6 103.6 0 0 1 913.8 482.8V551.7H844.8A34.5 34.5 0 0 1 810.3 517.2V448.3H775.9V465.5A86.3 86.3 0 0 1 689.7 551.7H603.5ZM603.4 655.1A34.5 34.5 0 1 1 603.4 586.2V637.9A154.1 154.1 0 0 0 604.4 655.1ZM637.9 637.9V586.2H689.6A120.4 120.4 0 0 0 781.2 543.9 69 69 0 0 0 844.7 586.2H879.2V637.9A120.6 120.6 0 0 1 637.9 637.9ZM1000 1000H517.2V948.3A155.6 155.6 0 0 1 625.2 800.5L655.4 951.7A17.3 17.3 0 0 0 667.3 964.8 17.6 17.6 0 0 0 672.3 965.5 17.3 17.3 0 0 0 684.5 960.4L758.5 886.4 832.5 960.5A17.2 17.2 0 0 0 861.7 951.7L891.9 800.5A155.6 155.6 0 0 1 999.8 948.3ZM164.1 413.8L218.3 481.5 165.7 534 141.8 414.5C146.3 414.1 150.7 413.8 155.2 413.8ZM274.5 413.8L241.4 455 208.3 413.8ZM318.6 413.8H327.6C332.1 413.8 336.5 414.1 340.9 414.4L317 534 264.5 481.5ZM396.5 275.8H395.5A154 154 0 0 0 396.5 258.6V206.9A34.5 34.5 0 0 1 396.5 275.8ZM86.2 103.5A103.6 103.6 0 0 1 189.7 0H293.1A103.6 103.6 0 0 1 396.6 103.5V172.4H327.6A34.5 34.5 0 0 1 293.1 137.9V69H258.6V86.2A86.3 86.3 0 0 1 172.4 172.4H86.2ZM86.2 275.9A34.5 34.5 0 1 1 86.2 206.9V258.6A154 154 0 0 0 87.2 275.9ZM120.6 258.6V206.9H172.4A120.4 120.4 0 0 0 264 164.6 69 69 0 0 0 327.5 206.9H362V258.6A120.6 120.6 0 1 1 120.7 258.6ZM482.8 620.7H0V569A155.6 155.6 0 0 1 107.9 421.2L138.2 572.3A17.3 17.3 0 0 0 150.1 585.5 17.6 17.6 0 0 0 155.1 586.2 17.3 17.3 0 0 0 167.3 581.1L241.3 507.1 315.3 581.2A17.2 17.2 0 0 0 344.4 572.3L374.7 421.2A155.6 155.6 0 0 1 482.6 569ZM172.4 827.6A17.2 17.2 0 0 0 155.2 810.3H127.8L206.8 731.3 286.1 810.2H258.8A17.2 17.2 0 0 0 241.6 827.4 206.9 206.9 0 0 0 333.6 999.5 172.6 172.6 0 0 1 172.4 827.6Z", + "width": 1000 + }, + "search": [ + "referral" + ] + }, + { + "uid": "7c82c028b3a01309cc1ffd1eaeb1ccf8", + "css": "search", + "code": 59467, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M543.6 353.5A132.3 132.3 0 1 1 411.3 221.2 132.3 132.3 0 0 1 543.6 353.5ZM974.2 974.1A88.2 88.2 0 0 1 849.4 974.1S624.7 749.2 622.9 747A405.4 405.4 0 1 1 747 622.8C749.2 624.6 974.2 849.4 974.2 849.4A88.2 88.2 0 0 1 974.1 974.1ZM726 405.2A320.8 320.8 0 1 0 206.8 657.2 146.9 146.9 0 0 1 352.4 530H470.1A146.9 146.9 0 0 1 614.3 648.4 320 320 0 0 0 726 405.2Z", + "width": 1000 + }, + "search": [ + "search" + ] + }, + { + "uid": "898cfb6ea07e1c004d9173c59903b3c3", + "css": "arrival-patients", + "code": 59469, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M490.4 621.6L473.9 574.9A181.3 181.3 0 0 1 396.3 590.7 177.3 177.3 0 0 1 318 574.2L295.4 620.7A13.4 13.4 0 0 1 287.5 627.5Q281.1 629.6 274.2 631.7A117.4 117.4 0 0 0 304 686.6 127.3 127.3 0 0 0 493.2 682.1 264 264 0 0 1 513.3 634.8C508.1 633.1 503.1 631.4 498.5 629.9A13.2 13.2 0 0 1 490.4 621.6ZM481.4 761.4A266.9 266.9 0 0 1 483.6 727 150.9 150.9 0 0 1 396.3 753.5 149.3 149.3 0 0 1 284.6 705 146.4 146.4 0 0 1 248.5 639.3L233.3 643.5C129.3 672.7 0 708.9 0 820.9V960.9C0 977.4 7.5 1000.1 19.8 1000.1H630.7A265.8 265.8 0 0 1 481.4 761.4ZM401.9 191.2C406.8 191.6 411.8 192 416.4 192.4 457.3 196.1 484.3 198.5 510.1 141.6A13.2 13.2 0 0 1 534.3 141.2L535.6 143.8A198.4 198.4 0 0 1 571.3 227.5C572.5 212.4 573.2 199.6 573.2 194.6S573.2 184.2 573.4 178.7A151.6 151.6 0 0 0 536.5 56.1 193.6 193.6 0 0 0 393.6 0.1 191.6 191.6 0 0 0 255.3 63L251.6 67.2A164.1 164.1 0 0 0 205.3 202.8 286.8 286.8 0 0 0 212.2 239.2 145.9 145.9 0 0 1 243.7 164 70.6 70.6 0 0 1 297.3 140.8C317.2 140.8 324.1 160.7 330.7 179.6 340.6 208.7 352 241.1 399 243.9 374.8 216.8 379 207 381.1 202.3A19.2 19.2 0 0 1 401.9 191.2ZM541.8 420.1A12.9 12.9 0 0 1 549.2 418.1H549.6C571.7 418.1 597.4 385 607.1 343.9A25.6 25.6 0 0 0 599.3 314.8 13.2 13.2 0 0 0 584.1 319.6 13.4 13.4 0 0 1 572.7 328.1L571.6 328.1A13.2 13.2 0 0 1 558.4 315.9 438.1 438.1 0 0 0 524 173C491.9 225.9 452.4 222.6 414.1 219.1H413.5A270.3 270.3 0 0 0 438.7 245.5 13.2 13.2 0 0 1 431.6 268.7C337.9 281.9 317.5 223.2 305.3 188.1A89.3 89.3 0 0 0 296.5 167.3 44.1 44.1 0 0 0 263.2 181.9 131.4 131.4 0 0 0 236.7 255.8 309.2 309.2 0 0 0 235.2 305.5 15.4 15.4 0 0 1 210.2 321.5C204.3 315.3 198 313.3 192.9 316.1A24.5 24.5 0 0 0 185.5 344C195.3 385.1 221 418.2 243.1 418.2H243.7A13.2 13.2 0 0 1 257 431.2 150 150 0 0 0 318.4 544 143.4 143.4 0 0 0 396.2 564.1 146.3 146.3 0 0 0 474.1 544.5L474.3 544.5A145.9 145.9 0 0 0 535.4 431.5 13.2 13.2 0 0 1 541.7 420.4ZM746.8 522.7A238.6 238.6 0 1 0 985.4 761.3 238.6 238.6 0 0 0 746.8 522.7ZM881.7 796.9A17.9 17.9 0 0 1 863.8 814.7H792.4V888.4A17.9 17.9 0 0 1 774.5 906.2H712A17.9 17.9 0 0 1 694.1 888.4V814.7H620.5A17.9 17.9 0 0 1 602.6 796.9V734.4A17.9 17.9 0 0 1 620.5 716.5H694.1V645.1A17.9 17.9 0 0 1 712 627.2H774.5A17.9 17.9 0 0 1 792.4 645.1V716.5H863.8A17.9 17.9 0 0 1 881.7 734.4ZM765.6 725.4V654H721V725.4A17.9 17.9 0 0 1 703.1 743.3H629.5V787.9H703.1A17.9 17.9 0 0 1 721 805.8V879.5H765.6V805.8A17.9 17.9 0 0 1 783.5 787.9H854.9V743.3H783.5A17.9 17.9 0 0 1 765.6 725.4Z", + "width": 985 + }, + "search": [ + "arrival-patients" + ] + }, + { + "uid": "23c2239369a69f752e790de95123b9e9", + "css": "male-2", + "code": 59417, + "src": "mfglabs" + }, + { + "uid": "10b2be8b48bebc1974d6f94bac9de71d", + "css": "female-1", + "code": 59419, + "src": "mfglabs" + }, + { + "uid": "84aaf4992ded44854de2b7090335db03", + "css": "progress-notes", + "code": 59409, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M400 266.7V33.4A33.4 33.4 0 0 1 466.6 33.4V266.7ZM300 933.3A99.3 99.3 0 0 1 229.3 904.1 1011.6 1011.6 0 0 1 0 550.5V966.6A33.4 33.4 0 0 0 33.4 1000H833.3A33.4 33.4 0 0 0 866.7 966.6V933.3ZM1128 809.7A885.7 885.7 0 0 1 866.6 189.5V166.6A33.4 33.4 0 0 0 833.3 133.3H533.3V300A33.4 33.4 0 0 1 500 333.3H366.6A33.4 33.4 0 0 1 333.3 300V133.3H33.4A33.4 33.4 0 0 0 0 166.7V189.6A943.4 943.4 0 0 0 276.4 856.9 33.4 33.4 0 0 0 300 866.7H1104.5A33.4 33.4 0 0 0 1128.1 809.8ZM433.3 400H700A33.4 33.4 0 0 1 700 466.6H433.3A33.4 33.4 0 0 1 433.3 400ZM700 733.3H366.7A33.4 33.4 0 0 1 366.7 666.6H700A33.4 33.4 0 0 1 700 733.3ZM766.7 600H300A33.4 33.4 0 1 1 300 533.3H766.7A33.4 33.4 0 1 1 766.7 600Z", + "width": 1138 + }, + "search": [ + "progress-notes" + ] + }, + { + "uid": "740f78c2b53c8cc100a8b0d283bbd34f", + "css": "home_icon-1", + "code": 59410, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M973.1 435L973.1 435 565 27A92 92 0 0 0 434.9 27L27.2 434.7 26.8 435.1A92 92 0 0 0 88 591.9C88.9 591.9 89.9 591.9 90.8 591.9H107.1V892.1A107.9 107.9 0 0 0 214.8 999.9H374.4A29.3 29.3 0 0 0 403.7 970.6V735.3A49.2 49.2 0 0 1 452.9 686.2H547A49.2 49.2 0 0 1 596.2 735.3V970.7A29.3 29.3 0 0 0 625.5 1000H785.1A107.9 107.9 0 0 0 892.8 892.3V592H907.8A92.1 92.1 0 0 0 973 434.9ZM931.6 523.7A33.4 33.4 0 0 1 907.9 533.5H863.5A29.3 29.3 0 0 0 834.2 562.8V892.3A49.2 49.2 0 0 1 785.1 941.4H654.9V735.3A107.9 107.9 0 0 0 547 627.5H452.9A107.9 107.9 0 0 0 345.1 735.2V941.3H215A49.2 49.2 0 0 1 165.8 892.1V562.8A29.3 29.3 0 0 0 136.5 533.5H92.8L91.4 533.5A33.4 33.4 0 0 1 68.4 476.4H68.4L476.3 68.4A33.4 33.4 0 0 1 523.6 68.4L931.4 476.2 931.6 476.4A33.4 33.4 0 0 1 931.6 523.7ZM931.6 523.7", + "width": 1000 + }, + "search": [ + "home_icon" + ] + }, + { + "uid": "a0ef39403e015fe3fe4252f11df60fda", + "css": "home_icon_active-1", + "code": 59420, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M973.1 435L973.1 435 565 27A92.1 92.1 0 0 0 434.9 27L27.1 434.7 26.7 435.1A92 92 0 0 0 88 592C88.9 592 89.9 592 90.8 592H107.1V892.2A107.9 107.9 0 0 0 214.8 999.9H374.4A29.3 29.3 0 0 0 403.7 970.6V735.4A49.2 49.2 0 0 1 452.9 686.2H547A49.2 49.2 0 0 1 596.2 735.4V970.7A29.3 29.3 0 0 0 625.5 1000H785.1A107.9 107.9 0 0 0 892.8 892.3V592.1H907.8A92.1 92.1 0 0 0 973 434.9ZM931.6 523.7A33.4 33.4 0 0 1 907.9 533.5H863.5A29.3 29.3 0 0 0 834.2 562.8V892.3A49.2 49.2 0 0 1 785.1 941.5H654.9V735.4A107.9 107.9 0 0 0 547 627.5H452.9A107.9 107.9 0 0 0 345.1 735.2V941.3H214.9A49.2 49.2 0 0 1 165.8 892.1V562.8A29.3 29.3 0 0 0 136.5 533.5H92.8L91.4 533.5A33.4 33.4 0 0 1 68.3 476.4H68.3L476.3 68.4A33.4 33.4 0 0 1 523.6 68.4L931.4 476.2 931.6 476.4A33.4 33.4 0 0 1 931.6 523.7ZM931.6 523.7", + "width": 1000 + }, + "search": [ + "home_icon_active" + ] + }, + { + "uid": "9d734a7694af3729960d4b9060982cc0", + "css": "menu_icon-1", + "code": 59421, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M406.7 0H83.2A83.3 83.3 0 0 0 0 83.2V406.7A83.3 83.3 0 0 0 83.2 489.9H406.7A83.3 83.3 0 0 0 489.9 406.7V83.2A83.3 83.3 0 0 0 406.7 0ZM406.7 449.1H83.2A42.4 42.4 0 0 1 40.8 406.7V83.2A42.4 42.4 0 0 1 83.2 40.8H406.7A42.4 42.4 0 0 1 449 83.2V406.7H449A42.4 42.4 0 0 1 406.7 449.1ZM916.8 0H593.3A83.3 83.3 0 0 0 510.1 83.2V406.7A83.3 83.3 0 0 0 593.3 489.9H916.8A83.3 83.3 0 0 0 1000 406.7V83.2A83.3 83.3 0 0 0 916.8 0ZM959.1 406.7A42.4 42.4 0 0 1 916.8 449.1H593.3A42.4 42.4 0 0 1 550.9 406.7V83.2A42.4 42.4 0 0 1 593.3 40.8H916.8A42.4 42.4 0 0 1 959.1 83.2ZM406.7 510.1H83.2A83.3 83.3 0 0 0 0 593.3V916.8A83.3 83.3 0 0 0 83.2 1000H406.7A83.3 83.3 0 0 0 489.9 916.8V593.3A83.3 83.3 0 0 0 406.7 510.1ZM406.7 959.2H83.2A42.4 42.4 0 0 1 40.8 916.8V593.3A42.4 42.4 0 0 1 83.2 550.9H406.7A42.4 42.4 0 0 1 449 593.3V916.8H449A42.4 42.4 0 0 1 406.7 959.1ZM916.8 510.1H593.3A83.3 83.3 0 0 0 510.1 593.3V916.8A83.3 83.3 0 0 0 593.3 1000H916.8A83.3 83.3 0 0 0 1000 916.8V593.3A83.3 83.3 0 0 0 916.8 510.1ZM959.1 916.8A42.4 42.4 0 0 1 916.8 959.2H593.3A42.4 42.4 0 0 1 550.9 916.8V593.3A42.4 42.4 0 0 1 593.3 550.9H916.8A42.4 42.4 0 0 1 959.1 593.3Z", + "width": 1000 + }, + "search": [ + "menu_icon" + ] + }, + { + "uid": "692c2d7a7dd50e46b66699b0e1b27dab", + "css": "height", + "code": 59453, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M400 50V150H600V250H400V350H500V450H400V550H600V650H400V750H500V850H400V950A50 50 0 0 0 450 1000H750A50 50 0 0 0 800 950V50A50 50 0 0 0 750 0H450A50 50 0 0 0 400 50ZM0 200L150 29.3 300 200H200V1000H100V200Z", + "width": 800 + }, + "search": [ + "height" + ] + }, + { + "uid": "9e8380e2a5811e19ab4393d5a252df32", + "css": "qr-code-1", + "code": 59424, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M650 0V350H1000V0ZM900 250H750V100H900ZM350 200V0H0V350H450V200H350ZM250 250H100V100H250ZM700 550H800V700H900V450H550V550H600V650.1H700.1ZM700 800H600V900H500V1000H700V900H800V1000H950V900H900V800H700ZM350 800V650H0V1000H350V900H500V800ZM250 900H100V750H250Z", + "width": 1000 + }, + "search": [ + "qr-code" + ] + }, + { + "uid": "6ec3034cfbe5c91e478ef9b9437647ed", + "css": "arrival-patients-bg", + "code": 59470, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M490.4 621.6L473.9 574.8A181.3 181.3 0 0 1 396.3 590.7 177.3 177.3 0 0 1 318 574.1L295.4 620.6A13.4 13.4 0 0 1 287.5 627.5Q281.1 629.6 274.3 631.6A117.4 117.4 0 0 0 304.2 686.6 127.3 127.3 0 0 0 493.5 682 264 264 0 0 1 513.6 634.6C508.3 633 503.4 631.3 498.7 629.8A13.4 13.4 0 0 1 490.4 621.6ZM481.4 761.4A266.9 266.9 0 0 1 483.6 727 150.9 150.9 0 0 1 396.3 753.3 149.3 149.3 0 0 1 284.6 704.8 146.4 146.4 0 0 1 248.5 639.1L233.3 643.4C129.4 672.5 0 708.8 0 820.7V960.8C0 977.1 7.5 1000 19.9 1000H630.7A265.8 265.8 0 0 1 481.4 761.4ZM401.8 191.2C406.8 191.6 411.6 192 416.4 192.4 457.3 196.1 484.2 198.5 510.1 141.7A13.4 13.4 0 0 1 534.2 141.2L535.5 143.8C552.2 161.8 563.7 195.1 571.3 227.6 572.5 212.4 573.2 199.7 573.2 194.7S573.3 184.3 573.4 178.8C574.2 139.6 575 95.1 536.5 56.1A193.6 193.6 0 0 0 393.6 0 191.5 191.5 0 0 0 255.3 62.7L251.6 67C228.8 92.4 203.1 121.1 205.1 202.5A286.9 286.9 0 0 0 212 238.8 146 146 0 0 1 243.5 163.5 70.6 70.6 0 0 1 297.2 140.4C317.1 140.4 324 160.1 330.5 179.2 340.6 208.3 351.7 240.7 398.9 243.5 374.6 216.4 378.9 206.6 380.9 201.9A19.2 19.2 0 0 1 401.8 191.2ZM541.8 420.1A12.9 12.9 0 0 1 549.2 418.1H549.6C571.7 418.1 597.4 384.9 607.2 343.8A25.6 25.6 0 0 0 599.3 314.8 13.4 13.4 0 0 0 584.2 319.5 13.4 13.4 0 0 1 572.8 328C572.5 328 572.1 328 571.7 328A13.4 13.4 0 0 1 558.3 315.8C555.8 285.8 544.9 209 523.9 172.9 491.9 226 452.4 222.4 414.1 219L413.5 219A270.3 270.3 0 0 0 438.7 245.4 13.4 13.4 0 0 1 431.6 268.5C337.9 281.9 317.5 223.1 305.3 187.9A89.4 89.4 0 0 0 296.5 167.2 44.1 44.1 0 0 0 263.2 181.7 131.4 131.4 0 0 0 236.8 255.7 309.1 309.1 0 0 0 235.3 305.2 15.4 15.4 0 0 1 210.2 321.3C204.3 315.1 198 313.1 192.9 315.9A24.5 24.5 0 0 0 185.6 343.8C195.3 384.9 221 418.1 243.2 418.1H243.8A13.4 13.4 0 0 1 257.2 431C258.1 443.9 265.2 510.1 318.6 543.8A143.4 143.4 0 0 0 396.4 563.9 146.4 146.4 0 0 0 474.3 544.3L474.6 544.1C528.8 510.5 534.9 444.1 535.6 431.1A13.4 13.4 0 0 1 541.9 420.1ZM746.8 522.7A238.6 238.6 0 1 0 985.5 761.3 238.7 238.7 0 0 0 746.8 522.7ZM881.7 796.9A17.9 17.9 0 0 1 863.9 814.7H792.4V888.4A17.9 17.9 0 0 1 774.6 906.2H712.1A17.9 17.9 0 0 1 694.2 888.4V814.7H620.6A17.9 17.9 0 0 1 602.7 796.9V734.4A17.9 17.9 0 0 1 620.6 716.5H694.2V645.1A17.9 17.9 0 0 1 712.1 627.3H774.6A17.9 17.9 0 0 1 792.4 645.1V716.5H863.9A17.9 17.9 0 0 1 881.7 734.4ZM765.6 725.4V654H721V725.4A17.9 17.9 0 0 1 703.1 743.3H629.4V787.9H703.1A17.9 17.9 0 0 1 721 805.8V879.4H765.6V805.8A17.9 17.9 0 0 1 783.5 787.9H854.9V743.3H783.5A17.9 17.9 0 0 1 765.6 725.4Z", + "width": 985 + }, + "search": [ + "arrival-patients-bg" + ] + }, + { + "uid": "961571413453d8de8d1d6325705ef204", + "css": "search-bg", + "code": 59468, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M543.6 353.5A132.3 132.3 0 1 1 411.3 221.2 132.3 132.3 0 0 1 543.6 353.5ZM974.2 974.2A88.2 88.2 0 0 1 849.4 974.2S624.7 749.2 622.9 747A405.4 405.4 0 1 1 747 622.9C749.2 624.6 974.2 849.4 974.2 849.4A88.2 88.2 0 0 1 974.2 974.2ZM726 405.2A320.8 320.8 0 1 0 206.8 657.2 147 147 0 0 1 352.4 530H470A147.1 147.1 0 0 1 614.3 648.5 320 320 0 0 0 726 405.2Z", + "width": 1000 + }, + "search": [ + "search-bg" + ] + }, + { + "uid": "2661cb62f53ed61755aa809d5280808e", + "css": "referral-bg", + "code": 59466, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M681.4 793.1L735.5 860.8 683 913.3 659.1 793.8C663.5 793.4 667.9 793.1 672.4 793.1ZM791.7 793.1L758.6 834.5 725.5 793.1ZM835.9 793.1H844.8C849.4 793.1 853.7 793.4 858.1 793.8L834.2 913.3 781.7 860.8ZM913.8 655.2H912.8A154 154 0 0 0 913.8 637.9V586.2A34.5 34.5 0 0 1 913.8 655.2ZM603.4 482.8A103.6 103.6 0 0 1 706.9 379.3H810.3A103.6 103.6 0 0 1 913.8 482.8V551.7H844.8A34.5 34.5 0 0 1 810.3 517.3V448.3H775.9V465.5A86.3 86.3 0 0 1 689.7 551.7H603.4ZM603.4 655.2A34.5 34.5 0 0 1 603.4 586.2V637.9A154 154 0 0 0 604.5 655.2ZM637.9 637.9V586.2H689.6A120.4 120.4 0 0 0 781.2 543.9 69 69 0 0 0 844.8 586.2H879.3V637.9A120.7 120.7 0 1 1 637.9 637.9ZM1000 1000H517.2V948.3A155.4 155.4 0 0 1 625.3 800.5L655.5 951.7A17.3 17.3 0 0 0 667.4 964.8 17.6 17.6 0 0 0 672.4 965.5 17.3 17.3 0 0 0 684.6 960.5L758.6 886.5 832.6 960.5A17.2 17.2 0 0 0 861.7 951.7L891.9 800.5A155.5 155.5 0 0 1 999.9 948.3ZM164.1 413.8L218.3 481.5 165.8 534 141.9 414.5C146.3 414.1 150.7 413.8 155.2 413.8ZM274.5 413.8L241.4 455.2 208.3 413.8ZM318.6 413.8H327.6C332.1 413.8 336.5 414.1 340.9 414.5L317 534 264.5 481.5ZM396.6 275.9H395.5A154 154 0 0 0 396.5 258.6V206.9A34.5 34.5 0 0 1 396.5 275.9ZM86.2 103.5A103.6 103.6 0 0 1 189.7 0H293.1A103.6 103.6 0 0 1 396.6 103.5V172.4H327.6A34.5 34.5 0 0 1 293.1 137.9V69H258.6V86.2A86.3 86.3 0 0 1 172.4 172.4H86.2ZM86.2 275.9A34.5 34.5 0 1 1 86.2 206.9V258.6A154 154 0 0 0 87.2 275.9ZM120.7 258.6V206.9H172.4A120.4 120.4 0 0 0 264 164.6 69 69 0 0 0 327.6 206.9H362V258.6A120.7 120.7 0 1 1 120.7 258.6ZM482.8 620.7H0V569A155.4 155.4 0 0 1 108 421.2L138.2 572.4A17.3 17.3 0 0 0 150.2 585.5 17.6 17.6 0 0 0 155.1 586.2 17.3 17.3 0 0 0 167.3 581.2L241.3 507.2 315.3 581.2A17.2 17.2 0 0 0 344.4 572.3L374.6 421.2A155.5 155.5 0 0 1 482.7 569ZM172.4 827.6A17.2 17.2 0 0 0 155.2 810.3H127.8L206.9 731.3 286 810.3H258.6A17.2 17.2 0 0 0 241.4 827.6 206.9 206.9 0 0 0 333.5 999.6 172.6 172.6 0 0 1 172.4 827.6Z", + "width": 1000 + }, + "search": [ + "referral-bg" + ] + }, + { + "uid": "f7fb556e96e9f2dfe8d87fafd4952bc8", + "css": "search-1", + "code": 59425, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M402.7 804.7A401.8 401.8 0 0 0 649.6 719.9L915.7 986A50 50 0 0 0 986.5 915.3L720.3 649.2A402.6 402.6 0 1 0 402.7 804.7ZM188.8 188.6A302.4 302.4 0 1 1 188.8 616.2H188.8A301.2 301.2 0 0 1 187.1 190.2L188.6 188.6Z", + "width": 1001 + }, + "search": [ + "search" + ] + }, + { + "uid": "d158c7d34d65d4d174f62fd0e4a85721", + "css": "send", + "code": 59427, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1000.1 0L0 562.5 319.4 680.9 812.5 218.8 437.6 724.5 437.9 724.5 437.5 724.5V1000.1L616.7 790.9 843.7 875Z", + "width": 1000 + }, + "search": [ + "send" + ] + }, + { + "uid": "29b6fa307d6eeddd2d501aa1fbe72411", + "css": "view", + "code": 59430, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M776.8 250A250 250 0 1 0 1026.8 500 250.2 250.2 0 0 0 776.8 250ZM757.8 425.9A57.4 57.4 0 0 0 700.9 482.8H618.1A141.3 141.3 0 0 1 757.8 343.1ZM1535.4 448.3C1450.9 343.1 1149.2-0.1 776.8-0.1S102.6 342.9 18.1 448.3A82.9 82.9 0 0 0 18.1 551.8C102.6 657 404.3 1000.1 776.8 1000.1S1450.9 657 1535.4 551.8A82.9 82.9 0 0 0 1535.4 448.3ZM776.8 862.1A362 362 0 1 1 1138.8 500 362 362 0 0 1 776.8 862.1Z", + "width": 1553 + }, + "search": [ + "view" + ] + }, + { + "uid": "6dd961ddeafa6f1221c571e3a96c5e0d", + "css": "warning", + "code": 59431, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1165.9 890.7L649.9 34.8A72.1 72.1 0 0 0 526.5 34.8L10.4 890.7A72.1 72.1 0 0 0 72.1 1000H1104.2A72.1 72.1 0 0 0 1165.9 890.7ZM588.5 296.1A48.8 48.8 0 0 1 643.3 342.4C643.3 432.8 632.7 562.8 632.7 653.2 632.7 676.8 606.8 686.9 588.6 686.9 564.3 686.9 543.7 677 543.7 653.2 543.7 562.8 533.1 432.8 533.1 342.4 533.1 312.8 557.3 296.1 588.5 296.1ZM589.3 856.1A58.5 58.5 0 1 1 647.1 797.6 59.4 59.4 0 0 1 589.3 856.1Z", + "width": 1176 + }, + "search": [ + "warning" + ] + }, + { + "uid": "1a56c6056532ad852281ae8316f6ac0a", + "css": "add", + "code": 59432, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M769.7 0H230.3A230.9 230.9 0 0 0 0 230.3V769.7A230.9 230.9 0 0 0 230.3 1000H769.7A230.9 230.9 0 0 0 1000 769.7V230.3A230.9 230.9 0 0 0 769.7 0ZM705.2 543.1H553.6A8.8 8.8 0 0 0 544.8 551.9V704A44.7 44.7 0 0 1 455.4 704V552A8.8 8.8 0 0 0 446.6 543.2H294.7A44.7 44.7 0 0 1 294.7 453.8H446.4A8.8 8.8 0 0 0 455.2 445V293.1A44.7 44.7 0 1 1 544.6 293.1V444.9A8.8 8.8 0 0 0 553.4 453.9H705.2A44.7 44.7 0 1 1 705.2 543.3Z", + "width": 1000 + }, + "search": [ + "add" + ] + }, + { + "uid": "84f81a72b1b0ffb0132cd1bbe1c22ca7", + "css": "close", + "code": 59433, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M591.6 500L981.2 110.4A64.8 64.8 0 1 0 889.4 19L499.8 408.6 110.2 19A64.8 64.8 0 0 0 19 110.6L408.6 500.2 19 889.8A64.8 64.8 0 1 0 110.6 981.4L500.2 591.8 889.8 981.4A64.8 64.8 0 1 0 981.4 889.8ZM591.6 500", + "width": 1000 + }, + "search": [ + "close" + ] + }, + { + "uid": "77819ffd4aac6bbd19e5760b252d420a", + "css": "back", + "code": 59434, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M14.6 535.8L464.3 985.3A50.5 50.5 0 1 0 535.8 914L121.8 500.1 535.8 86.2A50.5 50.5 0 0 0 464.3 14.7L14.6 464.3A51 51 0 0 0 14.6 535.8Z", + "width": 551 + }, + "search": [ + "back" + ] + }, + { + "uid": "c6bf117fcd1f7bb313ba6e9c3c2577ee", + "css": "qr-code-2", + "code": 59437, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M650 0V350H1000V0ZM900 250H750V100H900ZM350 200V0H0V350H450V200H350ZM250 250H100V100H250ZM700 550H800V700H900V450H550V550H600V650.1H700.1ZM700 800H600V900H500V1000H700V900H800V1000H950V900H900V800H700ZM350 800V650H0V1000H350V900H500V800ZM250 900H100V750H250Z", + "width": 1000 + }, + "search": [ + "qr-code" + ] + }, + { + "uid": "db7c621524e167c8d42abc9418ae711d", + "css": "health-summary", + "code": 59435, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M714.1 956.9H146.5A97 97 0 0 1 47.4 862.1V79.8A63 63 0 0 0 0 137.9V939.7A62.5 62.5 0 0 0 64.7 1000H652A63.3 63.3 0 0 0 714.1 956.9ZM714.1 956.9M799.6 862.1V435.3H312.3L312 462C312 462.3 312 461.2 312 463.4H519.4A17.2 17.2 0 1 1 519.4 497.9H310.1A32.1 32.1 0 0 1 287.8 487.8 38 38 0 0 1 277.5 461.2L277.7 435.4H241.3A16.9 16.9 0 0 1 224.1 418.5V416H172.3A17.2 17.2 0 0 1 155.1 398.9L154.5 324A17.8 17.8 0 0 1 171.8 306.2H171.8L224 307.2V304.9A18 18 0 0 1 241.2 286.6H799.6V209.1H653.6A56.2 56.2 0 0 1 597 152.5V0H146.4A63.1 63.1 0 0 0 81.4 58.1 16.8 16.8 0 0 1 81.9 60.3C81.9 61.2 81.9 62.1 81.9 63V862.1A62.6 62.6 0 0 0 146.4 922.4H733.8A63.6 63.6 0 0 0 799.6 862.1ZM172.5 543.1H456A17.2 17.2 0 1 1 456 577.6H172.5A17.2 17.2 0 0 1 172.5 543.1ZM665.8 829.7H172.5A17.2 17.2 0 0 1 172.5 795.2H665.8A17.2 17.2 0 0 1 665.8 829.7ZM665.8 745.6H172.5A17.2 17.2 0 0 1 172.5 711.2H665.8A17.2 17.2 0 1 1 665.8 745.6ZM665.8 661.6H172.5A17.2 17.2 0 0 1 172.5 627.1H665.8A17.2 17.2 0 1 1 665.8 661.6ZM665.8 661.6M773.5 174.6L631.5 27.6V152.5A21.8 21.8 0 0 0 653.6 174.5ZM773.5 174.6M898.7 336.6V386.6L937.2 361.6ZM898.7 336.6M258.6 321.1H864.2V400.9H258.6ZM258.6 321.1M224.1 381.5V341.5L189.2 341.1 189.4 381.5ZM224.1 381.5", + "width": 937 + }, + "search": [ + "health-summary" + ] + }, + { + "uid": "50d667f8b7f88d80bebfb19c6d88f412", + "css": "powered-by-cs", + "code": 59436, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M5611.5 942.8L5603.8 947.4A13.5 13.5 0 0 0 5599.7 942.5 9.5 9.5 0 0 0 5594.5 941.2 9.7 9.7 0 0 0 5587.9 943.5 6.9 6.9 0 0 0 5585.4 949C5585.4 952 5587.6 954.5 5592.2 956.3L5598.4 958.7A26.4 26.4 0 0 1 5609.6 966.3 16.8 16.8 0 0 1 5613.1 977.1 19.1 19.1 0 0 1 5607.4 991.4 19.7 19.7 0 0 1 5593 997.1 19.2 19.2 0 0 1 5579.5 992.2 22.3 22.3 0 0 1 5572.9 978.6L5582.5 976.5A16.5 16.5 0 0 0 5584.8 984.2 10.8 10.8 0 0 0 5600.7 985.3 10.2 10.2 0 0 0 5603.6 977.7 11 11 0 0 0 5603.1 974.4 9 9 0 0 0 5601.5 971.6 12.9 12.9 0 0 0 5598.7 969.2 27.3 27.3 0 0 0 5594.7 967L5588.6 964.6A17.4 17.4 0 0 1 5575.7 948.9 15.1 15.1 0 0 1 5581.1 937.1 19.5 19.5 0 0 1 5594.6 932.3 18.8 18.8 0 0 1 5611.6 942.8M5623.8 964.5A30.6 30.6 0 0 1 5633.5 941.8 31.8 31.8 0 0 1 5656.8 932.3 32.7 32.7 0 0 1 5689.3 964.9 30.8 30.8 0 0 1 5679.6 987.9 33.1 33.1 0 0 1 5634.4 988.9 30.8 30.8 0 0 1 5623.8 964.6M5633.3 964.7A23.2 23.2 0 0 0 5673 981.7 24.3 24.3 0 0 0 5673 948.1 22.2 22.2 0 0 0 5656.5 941.3 22.4 22.4 0 0 0 5640 948.1 22.6 22.6 0 0 0 5633.2 964.8M5713.1 933.5V987.3H5731.5V996.2H5703.5V933.5ZM5750.4 933.5V971.3A20.8 20.8 0 0 0 5753.1 983.1 14.1 14.1 0 0 0 5775.3 983.1 20.5 20.5 0 0 0 5777.9 971.3V933.5H5787.4V973.8A22.6 22.6 0 0 1 5781.2 990.2 23.8 23.8 0 0 1 5747.1 990.2 22.6 22.6 0 0 1 5740.9 973.8V933.5ZM5822.1 942.4V996.2H5812.6V942.4H5798.2V933.5H5836.5V942.4ZM5871.1 964.5A30.6 30.6 0 0 1 5880.8 941.8 31.8 31.8 0 0 1 5904 932.3 32.7 32.7 0 0 1 5936.6 964.9 30.8 30.8 0 0 1 5926.9 987.9 33.1 33.1 0 0 1 5881.7 988.9 30.8 30.8 0 0 1 5871 964.6M5880.6 964.7A23.2 23.2 0 0 0 5920.2 981.7 24.3 24.3 0 0 0 5920.2 948.1 22.2 22.2 0 0 0 5903.8 941.3 22.4 22.4 0 0 0 5887.2 948.1 22.6 22.6 0 0 0 5880.5 964.8M5950.9 996.2V929.2L5996.6 977.1V933.5H6006.1V1000L5960.4 952.3V996.1ZM6058.9 942.8L6051.3 947.4A13.8 13.8 0 0 0 6047.2 942.5 9.5 9.5 0 0 0 6041.9 941.2 9.7 9.7 0 0 0 6035.4 943.5 6.9 6.9 0 0 0 6032.8 949C6032.8 952 6035.1 954.5 6039.6 956.3L6045.9 958.7A26.4 26.4 0 0 1 6057 966.3 16.8 16.8 0 0 1 6060.5 977.1 19.1 19.1 0 0 1 6054.8 991.4 19.8 19.8 0 0 1 6040.4 997.1 19.2 19.2 0 0 1 6026.9 992.2 22.2 22.2 0 0 1 6020.4 978.6L6030 976.5A16.5 16.5 0 0 0 6032.2 984.2 9.9 9.9 0 0 0 6040.7 988.2 9.7 9.7 0 0 0 6048 985.3 10.1 10.1 0 0 0 6051 977.7 11 11 0 0 0 6050.5 974.4 9 9 0 0 0 6048.9 971.6 12.9 12.9 0 0 0 6046.1 969.2 27.3 27.3 0 0 0 6042 967L6036 964.6A17.4 17.4 0 0 1 6023.2 948.9 15.1 15.1 0 0 1 6028.6 937.1 19.5 19.5 0 0 1 6042 932.3 18.8 18.8 0 0 1 6059 942.8M5307.1 772.3A43.1 43.1 0 0 0 5292 754.6 42 42 0 0 0 5267.6 747.8 55.5 55.5 0 0 0 5245.7 752.3 61 61 0 0 0 5227.1 764.7 68.4 68.4 0 0 0 5213.5 783.5 71.1 71.1 0 0 0 5206.5 807.5 65.9 65.9 0 0 0 5207.7 831.8 49 49 0 0 0 5216.9 850.5 43 43 0 0 0 5232.4 862.7 49.2 49.2 0 0 0 5253.5 867 49.2 49.2 0 0 0 5279 860.1 64.7 64.7 0 0 0 5298.9 841.7L5327.2 860.1A101.6 101.6 0 0 1 5295.8 887 89.4 89.4 0 0 1 5251.4 897.6 90 90 0 0 1 5215.8 890.7 78.4 78.4 0 0 1 5188.5 871.8 75.1 75.1 0 0 1 5172.1 843.2 85.8 85.8 0 0 1 5168.8 807.5 103.1 103.1 0 0 1 5179.8 771.3 99.5 99.5 0 0 1 5201.9 742.7 102.6 102.6 0 0 1 5270.1 717.2 77.9 77.9 0 0 1 5312.2 727.9 73.7 73.7 0 0 1 5338.2 754.7ZM5455.3 892.5H5346.6L5384.6 722.3H5422.1L5391 862.4H5462.2ZM5669.4 843.6A98.2 98.2 0 0 1 5647.5 872 99.3 99.3 0 0 1 5617.3 890.8 97.5 97.5 0 0 1 5580.9 897.6 85.2 85.2 0 0 1 5546 890.6 76.5 76.5 0 0 1 5519.2 871.3 77.4 77.4 0 0 1 5503.3 842.7 83 83 0 0 1 5500.5 807.5 105.7 105.7 0 0 1 5511.2 771.6 98.4 98.4 0 0 1 5563.1 724 97 97 0 0 1 5599.5 717.2 84.4 84.4 0 0 1 5634.4 724.3 76.4 76.4 0 0 1 5677 772.4 82.7 82.7 0 0 1 5679.8 807.5 105.8 105.8 0 0 1 5669.1 843.6M5641.6 784.3A50.6 50.6 0 0 0 5633.7 765.3 40.1 40.1 0 0 0 5618.9 752.5 46.2 46.2 0 0 0 5597.4 747.8 51.9 51.9 0 0 0 5575.2 752.5 59.4 59.4 0 0 0 5557.3 765.3 66.2 66.2 0 0 0 5544.5 784.3 80.3 80.3 0 0 0 5538 807.5 69.2 69.2 0 0 0 5538.7 830.6 50.7 50.7 0 0 0 5546.7 849.5 40.2 40.2 0 0 0 5561.5 862.2 46.2 46.2 0 0 0 5582.9 866.9 52.2 52.2 0 0 0 5605.1 862.2 60.8 60.8 0 0 0 5623.1 849.5 67.1 67.1 0 0 0 5635.8 830.6 78.5 78.5 0 0 0 5642.4 807.5 70.2 70.2 0 0 0 5641.6 784.3M5864.8 834.8A84.6 84.6 0 0 1 5854.8 859.3 76.6 76.6 0 0 1 5813.5 892.7 93.5 93.5 0 0 1 5782.5 897.6 76.3 76.3 0 0 1 5751.1 891.5 62.6 62.6 0 0 1 5728.4 874.9 58.7 58.7 0 0 1 5716 850.5 64.1 64.1 0 0 1 5715.9 821.3Q5722.3 792.1 5726.2 773.1C5728.8 760.5 5730.9 750.8 5732.3 743.9S5734.8 732 5735.4 728.8 5736.4 723.4 5736.5 722.4H5774.8L5752.6 825.4A39.5 39.5 0 0 0 5752.2 840 32.9 32.9 0 0 0 5757.3 853.4 30 30 0 0 0 5768.2 863.2 33.9 33.9 0 0 0 5785 867 41.7 41.7 0 0 0 5800.7 864.1 45.6 45.6 0 0 0 5813.6 856.3 48.7 48.7 0 0 0 5823.2 845.1 42.6 42.6 0 0 0 5828.6 831.5L5853.4 722.3H5891.7ZM6063.9 842.6A90.3 90.3 0 0 1 6042.6 869.4 93.8 93.8 0 0 1 6012.6 886.4 108.4 108.4 0 0 1 5976.1 892.4H5896.7L5934.5 722.2H5993A94.2 94.2 0 0 1 6028.4 728.6 74.2 74.2 0 0 1 6055.1 746.3 71.1 71.1 0 0 1 6071.2 773.2 78.9 78.9 0 0 1 6074.4 807.3 98.4 98.4 0 0 1 6063.8 842.4M6035.4 785.5A44.4 44.4 0 0 0 6027.3 768 39.2 39.2 0 0 0 6012.6 756.4 49.2 49.2 0 0 0 5991.5 752.2H5965.3L5940.8 862.1H5976.8A55 55 0 0 0 5998.4 857.8 63.4 63.4 0 0 0 6016.7 846.1 62.3 62.3 0 0 0 6030 828.6 59.9 59.9 0 0 0 6036.5 807.3 65.7 65.7 0 0 0 6035.5 785.4M5877.9 372.8S5868.5 321.5 5791.5 321.5A102.2 102.2 0 0 0 5714.5 228.1S5701.4 135.9 5642.7 114.9L5844.1 166.3S5881.4 166.3 5877.9 231.6ZM5591.9 98.6L5226.6 0.6S5174.1-7.6 5172.9 40.2 5172.9 312.1 5172.9 312.1 5224.3 228.1 5359.7 243.9C5359.7 243.9 5384.2 98.6 5521.9 165.1A82.7 82.7 0 0 1 5591.9 98.6M5591.3 395S5599.4 347.1 5636.8 360 5739.5 403.1 5739.5 403.1A54 54 0 0 1 5766.2 460.4L5759.6 516.3A27.3 27.3 0 0 1 5719.6 537.4L5600.5 487.1A35 35 0 0 1 5586.5 448.2ZM5441.9 434.5S5448.3 407.5 5469.2 416.2 5526.2 444.5 5526.2 444.5A30.8 30.8 0 0 1 5539.4 478.1L5533.6 509.7A15.6 15.6 0 0 1 5510 520.3L5443.9 487.3A20 20 0 0 1 5437.4 464.5ZM5832.1 408.8S5838.5 381.8 5859.3 390.4 5916.3 418.8 5916.3 418.8A30.9 30.9 0 0 1 5929.5 452.4L5923.7 484A15.6 15.6 0 0 1 5900.1 494.6L5834 461.6A20 20 0 0 1 5827.5 438.8ZM5520.3 255.2S5525.7 232.5 5543.2 239.8 5591.3 263.7 5591.3 263.7A26 26 0 0 1 5602.5 292L5597.6 318.7A13.2 13.2 0 0 1 5577.7 327.6L5522 299.9A16.9 16.9 0 0 1 5516.4 280.6ZM5687.2 300.9S5691.8 281.5 5706.7 287.7 5747.5 308 5747.5 308A22.1 22.1 0 0 1 5757 332.1L5752.8 354.8A11.2 11.2 0 0 1 5735.9 362.3L5688.6 338.7A14.3 14.3 0 0 1 5683.9 322.4ZM5600.9 555S5605.4 535.7 5620.3 541.9 5661.1 562.2 5661.1 562.2A22 22 0 0 1 5670.6 586.2L5666.4 608.9A11.1 11.1 0 0 1 5649.6 616.5L5602.3 592.9A14.3 14.3 0 0 1 5597.6 576.6ZM5403.2 300.9S5407.7 281.5 5422.6 287.7 5463.4 308 5463.4 308A22.1 22.1 0 0 1 5472.9 332.1L5468.7 354.8A11.2 11.2 0 0 1 5451.9 362.3L5404.6 338.7A14.3 14.3 0 0 1 5399.9 322.4ZM5943.5 607.8S5948.1 588.5 5963 594.7 6003.8 615 6003.8 615A22.1 22.1 0 0 1 6013.3 639L6009.1 661.7A11.1 11.1 0 0 1 5992.2 669.2L5944.9 645.7A14.4 14.4 0 0 1 5940.2 629.4ZM5785 603.8S5787.7 592.4 5796.5 596.1 5820.5 608.1 5820.5 608.1A13 13 0 0 1 5826.1 622.2L5823.7 635.6A6.6 6.6 0 0 1 5813.7 640L5785.9 626.1A8.5 8.5 0 0 1 5783.1 616.5ZM5332.2 445.1S5334.9 433.7 5343.7 437.4 5367.7 449.4 5367.7 449.4A13 13 0 0 1 5373.3 463.5L5370.8 476.9A6.6 6.6 0 0 1 5360.9 481.3L5333 467.4A8.4 8.4 0 0 1 5330.3 457.7ZM5261 326.8S5263.7 315.5 5272.5 319.1 5296.5 331.1 5296.5 331.1A13 13 0 0 1 5302.1 345.2L5299.6 358.6A6.6 6.6 0 0 1 5289.7 363L5261.8 349.1A8.4 8.4 0 0 1 5259.1 339.5ZM5218.3 680.7H5212.9C5206.5 680.7 5202.4 678.7 5200.8 674.5A11.8 11.8 0 0 1 5188.6 680.7C5178.1 680.7 5172.9 673.9 5172.9 660.3 5172.9 647 5178.1 640.4 5188.6 640.4H5205.3V664.3C5205.3 670.4 5208 673.4 5213.4 673.4H5218.2ZM5197.4 647.2H5189.1A7.1 7.1 0 0 0 5182.3 650.7 20.4 20.4 0 0 0 5180.7 660.2 21.1 21.1 0 0 0 5182.3 669.7 7 7 0 0 0 5189.1 673.3 6.9 6.9 0 0 0 5195.8 669.7 21 21 0 0 0 5197.5 660.2ZM5190.1 627.8A4.5 4.5 0 0 1 5185.7 632.4 4.5 4.5 0 0 1 5181.6 627.8 4.5 4.5 0 0 1 5185.9 623.2 4.5 4.5 0 0 1 5190.3 627.8M5201.3 627.8A4.6 4.6 0 0 1 5197 632.4 4.5 4.5 0 0 1 5192.8 627.8 4.4 4.4 0 0 1 5197 623.2 4.5 4.5 0 0 1 5201.3 627.8M5238.1 664.9A15.8 15.8 0 0 1 5233.9 676.3 14.8 14.8 0 0 1 5222.6 680.7H5216.3V673.4H5222.2Q5230.3 673.4 5230.3 664.3V643L5238.1 640.5ZM5233.2 693.3A4.3 4.3 0 1 1 5224.7 693.3 4.3 4.3 0 1 1 5233.2 693.3M5268.4 680.7H5259.7A10.4 10.4 0 0 1 5248.8 669.2V625.8L5256.6 623.1V668.9C5256.6 671.8 5257.9 673.2 5260.6 673.2H5268.4ZM5321.5 680.7H5266.3V673.4H5303.3V670.2A45.7 45.7 0 0 0 5301.6 655.5 10.6 10.6 0 0 0 5290.7 647.9 16.4 16.4 0 0 0 5278.2 654.9L5272.6 649.2A24.6 24.6 0 0 1 5290.7 640.5 17.5 17.5 0 0 1 5308 650.2 46.9 46.9 0 0 1 5311.3 670.1V673.1H5321.5ZM5394.5 680.7H5319.6V673.2H5329.4V650.6L5337.2 648.2V673.2H5353.5V646.9L5361.3 644.4V673.3H5377.8V642.9L5385.6 640.5V673.3H5394.5ZM5413.5 664.9A16.2 16.2 0 0 1 5409.3 676.3 14.9 14.9 0 0 1 5398 680.7H5392.7V673.2H5397.6C5402.9 673.2 5405.7 670.2 5405.7 664.1V625.8L5413.5 623.4ZM5432 680.7H5424.2V625.8L5432 623.1ZM5527.1 678.3C5527.1 691.4 5519.8 697.8 5505 697.8A20.9 20.9 0 0 1 5487.1 690.4 40.6 40.6 0 0 1 5481.3 670L5489.2 667.2A31.6 31.6 0 0 0 5492.7 684.8 14.4 14.4 0 0 0 5505.1 689.9 18.8 18.8 0 0 0 5515.3 687.7 10.7 10.7 0 0 0 5519.2 678.4V625.9L5527 623.3ZM5578.7 680.7H5568.9A21.9 21.9 0 0 1 5563.5 692.7 15.2 15.2 0 0 1 5551.6 697.9 17 17 0 0 1 5541.9 695.4L5538.4 687.2A27 27 0 0 0 5551.4 690.4 10.4 10.4 0 0 0 5561.1 680.6H5554.7A16.3 16.3 0 0 1 5541.9 675.3 18.9 18.9 0 0 1 5537.7 662.4 25.8 25.8 0 0 1 5541.3 648.1 14.3 14.3 0 0 1 5554.1 641.5C5564.5 641.5 5569.8 648.5 5569.8 662.4 5569.8 665.2 5569.8 668.8 5569.6 673.3H5578.6ZM5562 662.5A26.2 26.2 0 0 0 5560.9 653.5 6.7 6.7 0 0 0 5554.1 649C5548.4 649 5545.6 653.5 5545.6 662.5 5545.6 669.8 5548.6 673.4 5554.7 673.4H5562ZM5611.8 680.7H5606.4A14.6 14.6 0 0 1 5594.9 675.9 14.2 14.2 0 0 1 5583.3 680.7H5576.7V673.2H5582.8C5588.3 673.2 5591 670.2 5591 664.1V625.8L5598.8 623.1V664.5C5598.8 670.3 5601.5 673.1 5606.9 673.1H5611.7ZM5653.5 680.7H5609.7V673.4H5645.6V670.2A45.5 45.5 0 0 0 5643.8 655.5 10.6 10.6 0 0 0 5633.1 647.9 16.6 16.6 0 0 0 5620.5 654.9L5614.9 649.2A24.7 24.7 0 0 1 5633.1 640.5 17.6 17.6 0 0 1 5650.3 650.2 48.7 48.7 0 0 1 5653.5 670.1ZM6139 744.3A28.9 28.9 0 0 1 6130.3 765.5 29.7 29.7 0 0 1 6088.2 765.5 29 29 0 0 1 6079.5 744.3 27.8 27.8 0 0 1 6082.3 731.7 28.9 28.9 0 0 1 6090.3 721.5 28.5 28.5 0 0 1 6109 714.6 29.2 29.2 0 0 1 6121.4 717.2 28.6 28.6 0 0 1 6134.2 728.1 29.6 29.6 0 0 1 6139 744.4M6109.1 718.9A23.5 23.5 0 0 0 6091.6 726.4 25.8 25.8 0 0 0 6091.6 762.5 24.5 24.5 0 0 0 6126.9 762.5 25.1 25.1 0 0 0 6134.2 744.3 27.6 27.6 0 0 0 6131.4 732.6 24 24 0 0 0 6123.8 723.5 24.9 24.9 0 0 0 6109.1 718.8M6112.2 747.2L6123.4 761.6H6115.4L6105.1 748V761.6H6098.6V727.2H6105.5A17.3 17.3 0 0 1 6116 729.7 9.5 9.5 0 0 1 6119.6 737.4 10.2 10.2 0 0 1 6117.7 743.4 9.4 9.4 0 0 1 6112.7 747ZM6105.1 742.4H6106.2C6110.9 742.4 6113.3 740.7 6113.3 737.5S6111 732.9 6106.5 732.9H6105Z", + "width": 6139 + }, + "search": [ + "powered-by-cs" + ] + }, + { + "uid": "d22e70eb076c0432112b21f188078144", + "css": "ecg", + "code": 59438, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M34.6 0H965.4A34.6 34.6 0 0 1 1000 34.6V464.3L698.3 464.3A35.7 35.7 0 0 0 665 487.3L598.8 660.6 433.1 226.5A35.5 35.5 0 0 0 399.8 203.5H399.8A35.5 35.5 0 0 0 366.4 226.4L275.4 464.5 0 464.3V34.6A34.6 34.6 0 0 1 34.6 0ZM965.4 1000A34.6 34.6 0 0 0 1000 965.4V535.7L722.9 535.7 632.2 773.5A35.7 35.7 0 0 1 565.4 773.5L399.7 339.3 333.4 512.8A35.7 35.7 0 0 1 300 535.8H300L0.2 535.8V965.4A34.6 34.6 0 0 0 34.8 1000H965.4Z", + "width": 1000 + }, + "search": [ + "ecg" + ] + }, + { + "uid": "742f19f79dc108f718fea3d8f79078b1", + "css": "create-episode", + "code": 59439, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M825.8 83.3A125 125 0 0 0 708.4 0H125A125.4 125.4 0 0 0 0 125V708.4A125 125 0 0 0 83.3 825.9V291.7A208.3 208.3 0 0 1 291.7 83.3ZM875 166.7H291.6A125.4 125.4 0 0 0 166.7 291.6V875A125.4 125.4 0 0 0 291.6 1000H875A125.4 125.4 0 0 0 1000 875V291.6A125.4 125.4 0 0 0 875 166.7ZM750 625H625V750A41.7 41.7 0 0 1 541.7 750V625H416.7A41.7 41.7 0 1 1 416.7 541.7H541.7V416.7A41.7 41.7 0 1 1 625 416.7V541.7H750A41.7 41.7 0 0 1 750 625Z", + "width": 1000 + }, + "search": [ + "create-episode" + ] + }, + { + "uid": "2ba8ebad7ef116f8bea385f28153e2d1", + "css": "booked", + "code": 59440, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M907.9 1000H162.7A163.1 163.1 0 0 1 0 837.9V321.9H1070.7V837.9A163.1 163.1 0 0 1 907.9 1000.3ZM71.4 393.3V837.9A91.7 91.7 0 0 0 162.7 928.8H907.9A91.7 91.7 0 0 0 999.2 837.9V393.3ZM1070.7 393H0V235.7A163.1 163.1 0 0 1 162.7 72.1H907.9A163.1 163.1 0 0 1 1070.6 235.7ZM71.4 321.9H999.2V235.7A91.7 91.7 0 0 0 907.9 143.6H162.7A91.7 91.7 0 0 0 71.4 235.7ZM46.8 357.6V937.5H1017.1V357.6ZM356.9 717.3A35.7 35.7 0 1 1 392.6 681.6 35.7 35.7 0 0 1 356.9 717.3ZM535.3 717.3A35.7 35.7 0 1 1 571 681.6 35.7 35.7 0 0 1 535.3 717.3ZM713.8 717.3A35.7 35.7 0 1 1 749.4 681.6 35.7 35.7 0 0 1 713.8 717.3Z", + "width": 1071 + }, + "search": [ + "booked" + ] + }, + { + "uid": "2b6d9d51ce00485109e1548f1318cd5c", + "css": "admission-req", + "code": 59441, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M0 1000H1101.9V598.3H0ZM518.7 689.9H583.2V762.6H655.9V827.1H583.2V899.8H518.7V827.1H445.9V762.6H518.6ZM64.5 458.4H1037.3V533.7H64.5ZM422.6 178C422.6 176.1 422.6 174.2 422.4 172.3H219.5C219.5 174.2 219.3 176.1 219.3 178A101.7 101.7 0 0 0 309.7 278.9H332.1A101.7 101.7 0 0 0 422.6 178ZM288.7 279H258.4A129.4 129.4 0 0 0 129.9 393.8H288.7V279ZM383.6 279H353.3V393.8H512.1A129.4 129.4 0 0 0 383.6 279ZM425.1 107.8L444.1 22.7A344.4 344.4 0 0 0 198.1 22.7L217 107.8ZM639.1 241.7H972.7V393.9H639.1Z", + "width": 1102 + }, + "search": [ + "admission-req" + ] + }, + { + "uid": "68d26212e04d7c6eb8c87d3d2c656220", + "css": "walkin", + "code": 59442, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M271.2 118.6H305.1A50.4 50.4 0 0 0 334.2 164.4 101.6 101.6 0 1 0 254.2 203.4 100 100 0 0 0 307.5 188.3 85.2 85.2 0 0 1 271.2 118.6ZM168 639.4L135.6 779.7 33.9 932.2 118.6 1000 254.2 813.6 274.5 746.2 171.1 642.8C170 641.7 169.1 640.5 168 639.4ZM108.3 529.8A238 238 0 0 1 101.7 475.1V385L0 508.4 67.8 576.4ZM383.6 583.9L227.8 498.8 155.6 335.8 186.6 322 254.4 474.6 372.9 539.4 440.7 576.4 491.6 491.4 373 420.2V271.2A67.8 67.8 0 0 0 305.1 203.4H203.4A67.8 67.8 0 0 0 135.6 271.2V475.2A203.2 203.2 0 0 0 195.1 618.9L339.1 762.9 389.9 983.2H491.6L440.8 712Z", + "width": 492 + }, + "search": [ + "walkin" + ] + }, + { + "uid": "579dfe811674561f24e9f789ce658182", + "css": "health-bmi", + "code": 59450, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M215.7 571.7C214.2 589.1 226 680.9 232 716.9 234.9 734 242.9 761.8 240 776.5A216.6 216.6 0 0 0 237 839.2C238.4 848.6 242.9 892 236.5 907.9A500.9 500.9 0 0 0 227.1 958.9C211.1 999.1 220.1 997.1 220.1 997.1 225 1003.2 233.5 997.6 233.5 997.6A8.2 8.2 0 0 0 244.4 996.6 9.9 9.9 0 0 0 256.4 996.1 12.2 12.2 0 0 0 269.8 993C273.7 995 274.7 992.5 274.7 992.5 286.7 991.7 268 953.5 268 953.5A104.5 104.5 0 0 1 272.5 900C301.6 813.7 303 790.8 291.4 758.3 288.1 748.9 287.3 745.2 288.8 741.1 292.3 731.7 289.8 693.9 294 678.8 302.2 649.9 310.3 576.4 314.5 542.1 320.1 495.9 294.4 434 294.4 434 288.8 408.8 297 319 297 319 308.6 336.9 308.1 368.6 308.1 368.6 306.3 401.9 335 452.7 335 452.7A135.3 135.3 0 0 1 354 495.1C354 501.1 352.7 515.8 352.7 515.8L353.2 528.5A181.9 181.9 0 0 1 354.9 548.4C352.8 581.7 358 575.4 358 575.4 362.5 575.4 367.4 548.6 367.4 548.6A114.7 114.7 0 0 0 369.5 584C373.9 593.2 377.2 582.4 377.2 580.2 378.4 537.8 381 548.9 381 548.9 383.4 583.3 386.5 591 391.9 588.3 396.1 586.4 392.3 547.1 392.3 547.1 399.4 570.4 404.7 574.1 404.7 574.1 416.4 582.4 409.2 559.7 407.6 555.2A128.9 128.9 0 0 1 398.7 523.1C409.5 544.5 417.6 543.7 417.6 543.7 428.1 540.3 408.4 510 396.8 495.5A118.2 118.2 0 0 1 381.1 472.2 280.5 280.5 0 0 1 374.8 430.2 126.3 126.3 0 0 0 364.3 375.9C348.3 350.3 345.3 302.6 345.3 302.6L344.6 222C339 167 298.5 166.6 298.5 166.6 257.5 160.5 251.8 147.3 251.8 147.3 243.2 134.8 248.1 110.8 248.1 110.8A43.5 43.5 0 0 0 258.1 89.4C270 80.3 269.4 66.9 263.9 67 259.5 67.1 260.5 63.4 260.5 63.4 268 3.1 214.4 0 214.4 0H206.2S152.6 3.1 160.1 63.4C160.1 63.4 161.1 67.1 156.6 67 151.1 66.8 150.6 80.3 162.5 89.4A43.5 43.5 0 0 0 172.5 110.8S177.4 134.8 168.8 147.2C168.8 147.2 163.1 160.5 122.1 166.6 122.1 166.6 81.5 167 76 222L75.2 302.6S72.3 350.3 56.2 375.9A126.8 126.8 0 0 0 45.8 430.2 282.3 282.3 0 0 1 39.5 472.3 116.9 116.9 0 0 1 23.8 495.5C12.1 510-7.5 540.2 3 543.7 3 543.7 11.2 544.5 21.9 523.1A127.6 127.6 0 0 1 13.1 555.2C11.4 559.6 4.1 582.3 15.8 574.2 15.8 574.2 21.2 570.4 28.3 547.1 28.3 547.1 24.5 586.4 28.7 588.4 34.2 591 37.2 583.3 39.7 548.9 39.7 548.9 42.2 537.8 43.4 580.2 43.5 582.4 46.7 593.3 51.1 584A113.1 113.1 0 0 0 53.2 548.6S58 575.4 62.6 575.4C62.6 575.4 67.9 581.7 65.7 548.4A167.4 167.4 0 0 1 67.4 528.6L68 515.8S66.6 501.2 66.6 495.1A135.1 135.1 0 0 1 85.6 452.7S114.3 401.9 112.4 368.7C112.4 368.7 112 337 123.6 319 123.6 319 131.8 408.8 126.2 434 126.2 434 100.4 496 106.1 542.2 110.3 576.5 118.4 649.9 126.6 678.9 130.9 693.9 128.4 731.7 131.8 741.2 133.3 745.3 132.5 749.1 129.2 758.4 117.6 790.9 119.1 813.8 148.2 900.1A103.5 103.5 0 0 1 152.6 953.6S134 991.8 145.9 992.6C145.9 992.6 146.9 995.1 150.9 993.1A12.3 12.3 0 0 0 164.3 996.1 9.9 9.9 0 0 0 176.2 996.7 8.2 8.2 0 0 0 187.1 997.7S195.5 1003.4 200.5 997.2C200.5 997.2 209.4 999.2 193.6 959A498.5 498.5 0 0 0 184.1 908C177.8 892.1 182.3 848.6 183.6 839.3A220.4 220.4 0 0 0 180.7 776.5C177.8 761.8 185.7 734 188.7 716.9 194.7 680.9 206.5 589.1 205.1 571.7L209.9 573.4A9.9 9.9 0 0 0 215.7 571.7Z", + "width": 421 + }, + "search": [ + "health-bmi" + ] + }, + { + "uid": "389526f53cb47083744673fb25e56e5e", + "css": "health-bmi-r", + "code": 59451, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M215.7 571.7C214.2 589.1 226 680.9 232 716.9 234.9 734 242.9 761.8 240 776.5A216.6 216.6 0 0 0 237 839.2C238.4 848.6 242.9 892 236.5 907.9A500.9 500.9 0 0 0 227.1 958.9C211.1 999.1 220.1 997.1 220.1 997.1 225 1003.2 233.5 997.6 233.5 997.6A8.2 8.2 0 0 0 244.4 996.6 9.9 9.9 0 0 0 256.4 996.1 12.2 12.2 0 0 0 269.8 993C273.7 995 274.7 992.5 274.7 992.5 286.7 991.7 268 953.5 268 953.5A104.5 104.5 0 0 1 272.5 900C301.6 813.7 303 790.8 291.4 758.3 288.1 748.9 287.3 745.2 288.8 741.1 292.3 731.7 289.8 693.9 294 678.8 302.2 649.9 310.3 576.4 314.5 542.1 320.1 495.9 294.4 434 294.4 434 288.8 408.8 297 319 297 319 308.6 336.9 308.1 368.6 308.1 368.6 306.3 401.9 335 452.7 335 452.7A135.3 135.3 0 0 1 354 495.1C354 501.1 352.7 515.8 352.7 515.8L353.2 528.5A181.9 181.9 0 0 1 354.9 548.4C352.8 581.7 358 575.4 358 575.4 362.5 575.4 367.4 548.6 367.4 548.6A114.7 114.7 0 0 0 369.5 584C373.9 593.2 377.2 582.4 377.2 580.2 378.4 537.8 381 548.9 381 548.9 383.4 583.3 386.5 591 391.9 588.3 396.1 586.4 392.3 547.1 392.3 547.1 399.4 570.4 404.7 574.1 404.7 574.1 416.4 582.4 409.2 559.7 407.6 555.2A128.9 128.9 0 0 1 398.7 523.1C409.5 544.5 417.6 543.7 417.6 543.7 428.1 540.3 408.4 510 396.8 495.5A118.2 118.2 0 0 1 381.1 472.2 280.5 280.5 0 0 1 374.8 430.2 126.3 126.3 0 0 0 364.3 375.9C348.3 350.3 345.3 302.6 345.3 302.6L344.6 222C339 167 298.5 166.6 298.5 166.6 257.5 160.5 251.8 147.3 251.8 147.3 243.2 134.8 248.1 110.8 248.1 110.8A43.5 43.5 0 0 0 258.1 89.4C270 80.3 269.4 66.9 263.9 67 259.5 67.1 260.5 63.4 260.5 63.4 268 3.1 214.4 0 214.4 0H206.2S152.6 3.1 160.1 63.4C160.1 63.4 161.1 67.1 156.6 67 151.1 66.8 150.6 80.3 162.5 89.4A43.5 43.5 0 0 0 172.5 110.8S177.4 134.8 168.8 147.2C168.8 147.2 163.1 160.5 122.1 166.6 122.1 166.6 81.5 167 76 222L75.2 302.6S72.3 350.3 56.2 375.9A126.8 126.8 0 0 0 45.8 430.2 282.3 282.3 0 0 1 39.5 472.3 116.9 116.9 0 0 1 23.8 495.5C12.1 510-7.5 540.2 3 543.7 3 543.7 11.2 544.5 21.9 523.1A127.6 127.6 0 0 1 13.1 555.2C11.4 559.6 4.1 582.3 15.8 574.2 15.8 574.2 21.2 570.4 28.3 547.1 28.3 547.1 24.5 586.4 28.7 588.4 34.2 591 37.2 583.3 39.7 548.9 39.7 548.9 42.2 537.8 43.4 580.2 43.5 582.4 46.7 593.3 51.1 584A113.1 113.1 0 0 0 53.2 548.6S58 575.4 62.6 575.4C62.6 575.4 67.9 581.7 65.7 548.4A167.4 167.4 0 0 1 67.4 528.6L68 515.8S66.6 501.2 66.6 495.1A135.1 135.1 0 0 1 85.6 452.7S114.3 401.9 112.4 368.7C112.4 368.7 112 337 123.6 319 123.6 319 131.8 408.8 126.2 434 126.2 434 100.4 496 106.1 542.2 110.3 576.5 118.4 649.9 126.6 678.9 130.9 693.9 128.4 731.7 131.8 741.2 133.3 745.3 132.5 749.1 129.2 758.4 117.6 790.9 119.1 813.8 148.2 900.1A103.5 103.5 0 0 1 152.6 953.6S134 991.8 145.9 992.6C145.9 992.6 146.9 995.1 150.9 993.1A12.3 12.3 0 0 0 164.3 996.1 9.9 9.9 0 0 0 176.2 996.7 8.2 8.2 0 0 0 187.1 997.7S195.5 1003.4 200.5 997.2C200.5 997.2 209.4 999.2 193.6 959A498.5 498.5 0 0 0 184.1 908C177.8 892.1 182.3 848.6 183.6 839.3A220.4 220.4 0 0 0 180.7 776.5C177.8 761.8 185.7 734 188.7 716.9 194.7 680.9 206.5 589.1 205.1 571.7L209.9 573.4A9.9 9.9 0 0 0 215.7 571.7Z", + "width": 421 + }, + "search": [ + "health-bmi-r" + ] + }, + { + "uid": "b10e8135ab3032dd84d104a1d1600e59", + "css": "reschedule-", + "code": 59443, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M484.5 67.2L7.6 3.6A17.9 17.9 0 0 0 0 17.9V920.2A17.9 17.9 0 0 0 15.5 937.9L479.8 999.8A17.9 17.9 0 0 0 493.8 995.7 17.5 17.5 0 0 0 500 982.3V84.9A17.9 17.9 0 0 0 484.5 67.2ZM423.3 512.6L369.7 566.3A17.9 17.9 0 0 1 344.4 541L367.5 518H89.3A17.9 17.9 0 1 1 89.3 482.3H367.6L344.5 459.2A17.9 17.9 0 0 1 369.8 433.9L423.5 487.6A17.9 17.9 0 0 1 423.5 512.8ZM535.7 201.4A336 336 0 0 1 643 165V17.9A17.9 17.9 0 0 0 625.2 0H251.5L489.4 31.7A53.7 53.7 0 0 1 535.9 84.9V201.4ZM535.7 928.5H625A17.9 17.9 0 0 0 642.9 910.6V834.8A336 336 0 0 1 535.5 798.4ZM696.4 196.4A301.3 301.3 0 0 0 535.7 242.9V286.2A267.5 267.5 0 1 1 831.7 730.9C831.2 731.2 830.9 731.7 830.4 732A13.8 13.8 0 0 1 828.6 732.7 266.1 266.1 0 0 1 535.7 713.9V757.2A303.5 303.5 0 1 0 696.4 196.4ZM598.2 329.9A17.9 17.9 0 0 1 573.8 323.3L565.3 308.5A234.4 234.4 0 0 0 535.7 332.9V667.1A234.5 234.5 0 0 0 565.3 691.5L573.8 676.7A17.9 17.9 0 1 1 604.8 694.5L596.3 709.2A229.9 229.9 0 0 0 678.6 731.3V714.3A17.9 17.9 0 1 1 714.3 714.3V731.2A229.9 229.9 0 0 0 796.6 709.1L788.3 694.5A17.9 17.9 0 1 1 819.2 676.6L827.7 691.4A233.9 233.9 0 0 0 888 631.1L873.3 622.6A17.9 17.9 0 1 1 891.2 591.7L905.8 599.9A229.7 229.7 0 0 0 927.9 517.7H910.9A17.9 17.9 0 0 1 910.9 482H927.8A229.7 229.7 0 0 0 905.7 399.7L891.1 408A17.9 17.9 0 1 1 873.2 377.1L887.9 368.6A233.9 233.9 0 0 0 827.7 308.3L819.2 323A17.9 17.9 0 1 1 788.2 305.1L796.5 290.5A229.8 229.8 0 0 0 714.2 268.4V285.4A17.9 17.9 0 1 1 678.5 285.4V268.4A229.9 229.9 0 0 0 596.2 290.4L604.7 305.1A17.9 17.9 0 0 1 598.2 329.9ZM678.6 449.6V374.9A17.9 17.9 0 0 1 714.3 374.9V449.6A53.7 53.7 0 0 1 746.8 482H785.8A17.9 17.9 0 1 1 785.8 517.7H746.8A53.5 53.5 0 1 1 678.7 449.6Z", + "width": 1000 + }, + "search": [ + "reschedule-" + ] + }, + { + "uid": "b3149ed370567049bc19ff11fb449d92", + "css": "edit", + "code": 59444, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M571.4 635.7A88.7 88.7 0 0 1 537 657L412.7 698.4A87.7 87.7 0 0 1 384.9 702.9H384.9A87.9 87.9 0 0 1 301.5 587.2L342.9 462.9A88.3 88.3 0 0 1 364.1 428.6L632.7 160.1H107.4A107.5 107.5 0 0 0 0 267.6V892.6A107.5 107.5 0 0 0 107.4 999.8H732.4A107.5 107.5 0 0 0 839.9 892.4V367.3ZM405.7 469.9A29.3 29.3 0 0 0 398.6 481.4L357.2 605.7A29.3 29.3 0 0 0 394.2 642.7L518.5 601.3A29.3 29.3 0 0 0 530 594.2L895.9 228.2 771.7 103.9ZM930.5 14.3A48.8 48.8 0 0 0 861.4 14.3L813.1 62.6 937.4 186.9 985.7 138.6A48.8 48.8 0 0 0 985.7 69.5Z", + "width": 1000 + }, + "search": [ + "edit" + ] + }, + { + "uid": "62eceb513690fcf588af5818c18d0094", + "css": "lab-results", + "code": 59445, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M633.4 0L547 23.2 523.8 109.6 587 172.8 673.4 149.6C681.4 120.9 688.9 92.1 696.6 63.3ZM206.2 20.1V53.8H239.8C240.2 143.1 239.8 232.1 239.8 321.2 237.7 325.8 72 689.9 4.2 893.4A102.8 102.8 0 0 0 6.2 957.1 75.5 75.5 0 0 0 22.3 985.5 44.5 44.5 0 0 0 54.1 1000H628.1A44.5 44.5 0 0 0 659.9 985.5 75.5 75.5 0 0 0 676.1 957.1 102.8 102.8 0 0 0 678 893.4C610.2 689.9 444.4 325.9 442.5 321.2 442.8 232.1 442.7 143 442.7 53.8H476.5V20.1ZM815 52.1L728.6 75.2 705.6 161.6 768.8 224.9 855.2 201.7C862.7 172.9 870.6 144.1 878.4 115.3ZM408.8 53.8V222.8L273.6 223.2 273.6 54.3ZM684.3 177L597.9 200.2 574.7 286.6 638 349.8 724.4 326.6Q735.9 283.4 747.4 240.2ZM712.8 391.5V425.3H746.6V847.5A357 357 0 0 0 753 948 70.1 70.1 0 0 0 779.3 985.8 89.1 89.1 0 0 0 831 999.4 89 89 0 0 0 882.7 985.8 69.7 69.7 0 0 0 908.9 948 356.8 356.8 0 0 0 915.4 847.5V425.3H949.1V391.6ZM780.2 425.3H881.7V560.4H780.3ZM464.5 611.6A46.1 46.1 0 0 1 433.7 669.3 45.5 45.5 0 0 1 416.8 671L398.3 713.8A65.5 65.5 0 0 1 419 780.9L461.3 804.7A45.3 45.3 0 0 1 476.3 796.7 46.3 46.3 0 1 1 445.4 854.4 45.3 45.3 0 0 1 444.2 833.8L402.6 810.4A66.5 66.5 0 0 1 373.6 828.7 67.5 67.5 0 0 1 289.6 783.9 66.7 66.7 0 0 1 289.3 746.5L260.3 730.2A45.3 45.3 0 0 1 242.9 740.3 46.2 46.2 0 1 1 273.6 682.6 45.3 45.3 0 0 1 275.3 700L306.3 717.5A64.3 64.3 0 0 1 368 698.9L386.4 656.5A45.3 45.3 0 0 1 375.9 638.7 48.8 48.8 0 0 1 418.7 579.7 43.1 43.1 0 0 1 464.5 611.8Z", + "width": 949 + }, + "search": [ + "lab-results" + ] + }, + { + "uid": "b8c24ee4205dd048e10770f7e63b6315", + "css": "logout", + "code": 59447, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M500 0A500 500 0 1 0 1000 500 500.5 500.5 0 0 0 500 0ZM470.7 167.9A29.3 29.3 0 1 1 529.3 167.9V402.3A29.3 29.3 0 0 1 470.7 402.3ZM500 822.3A322.2 322.2 0 0 1 371.2 204.7 29.3 29.3 0 0 1 394.7 258.4 263.7 263.7 0 1 0 605.6 258.4 29.3 29.3 0 0 1 629.1 204.8 322.2 322.2 0 0 1 500 822.3Z", + "width": 1000 + }, + "search": [ + "logout" + ] + }, + { + "uid": "64a64005d594ba0971f9384a182f3e62", + "css": "obese-bmi", + "code": 59448, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M307.3 571.7C305.2 589.1 322 680.9 330.6 716.9 334.8 734 346.1 761.8 342 776.5A153.3 153.3 0 0 0 337.7 839.2C339.7 848.6 346 892 337 907.9A369.5 369.5 0 0 0 323.5 958.9C300.8 999.1 313.6 997.1 313.6 997.1 320.6 1003.2 332.7 997.6 332.7 997.6A15.3 15.3 0 0 0 348.1 996.6 18.9 18.9 0 0 0 365.2 996.1 22.4 22.4 0 0 0 384.2 993C389.9 995 391.3 992.5 391.3 992.5 408.3 991.7 381.8 953.5 381.8 953.5A76.3 76.3 0 0 1 388.1 900C429.5 813.7 431.7 790.8 415.1 758.3 410.4 748.9 409.2 745.2 411.4 741.1 416.3 731.7 412.7 693.9 418.8 678.8 430.5 649.9 442 576.4 448 542.1 456.1 495.9 419.4 434 419.4 434 411.4 408.8 423.1 319 423.1 319 439.6 336.9 439 368.6 439 368.6 436.4 401.9 477.2 452.7 477.2 452.7A118.4 118.4 0 0 1 504.3 495.1C504.3 501.1 502.4 515.8 502.4 515.8L503.2 528.5A129.3 129.3 0 0 1 505.7 548.3C502.6 581.6 510.2 575.3 510.2 575.3 516.5 575.3 523.5 548.5 523.5 548.5 523.5 555.4 521.1 576.1 526.4 583.9 532.7 593.2 537.4 582.3 537.5 580.1 539.2 537.8 542.8 548.9 542.8 548.9 546.3 583.2 550.7 591 558.4 588.3 564.3 586.3 558.9 547.1 558.9 547.1 569 570.4 576.7 574.1 576.7 574.1 593.3 582.3 583 559.6 580.7 555.1A99.2 99.2 0 0 1 568 523C583.4 544.5 595 543.6 595 543.6 610 540.3 581.9 509.9 565.4 495.4A126 126 0 0 1 543 472.2 203.5 203.5 0 0 1 534 430.1C532.4 392.3 519.1 375.9 519.1 375.9 496.3 350.3 492 302.5 492 302.5L491 221.9C483 166.9 425.3 166.5 425.3 166.5 366.9 160.4 358.8 147.2 358.8 147.2 346.4 134.7 353.5 110.8 353.5 110.8A38.7 38.7 0 0 0 367.7 89.4C384.7 80.2 383.9 66.8 376 66.9 369.7 67 371.2 63.4 371.2 63.4 381.9 3.1 305.5 0 305.5 0H293.9S217.5 3.1 228.1 63.4C228.1 63.4 229.6 67.1 223.2 67 215.4 66.8 214.6 80.3 231.6 89.4A38.7 38.7 0 0 0 245.8 110.8S252.9 134.8 240.5 147.2C240.5 147.2 232.4 160.5 174 166.6 174 166.6 116.2 167 108.3 222L107.2 302.6S103 350.3 80.2 375.9C80.2 375.9 66.9 392.4 65.4 430.2A204.8 204.8 0 0 1 56.4 472.3 124.6 124.6 0 0 1 33.9 495.5C17.3 510-10.7 540.2 4.3 543.7 4.3 543.7 16 544.5 31.3 523.1A98.1 98.1 0 0 1 18.7 555.2C16.3 559.6 6 582.3 22.6 574.2 22.6 574.2 30.3 570.4 40.4 547.1 40.4 547.1 35 586.4 41 588.4 48.8 591 53.1 583.3 56.6 548.9 56.6 548.9 60.2 537.8 61.9 580.2 62 582.4 66.5 593.3 72.9 584 78.3 576.2 75.9 555.5 75.9 548.6 75.9 548.6 82.8 575.4 89.2 575.4 89.2 575.4 96.8 581.7 93.7 548.4A119.1 119.1 0 0 1 96.2 528.5L96.9 515.8S95 501.1 95 495.1A118.3 118.3 0 0 1 122.1 452.7S162.9 401.8 160.3 368.6C160.3 368.6 159.7 336.9 176.2 319 176.2 319 187.9 408.8 180 434 180 434 143.2 495.9 151.3 542.1 157.3 576.5 168.8 649.9 180.5 678.8 186.6 693.8 183 731.7 187.9 741.1 190.1 745.2 188.9 749 184.2 758.3 167.7 790.8 169.8 813.7 211.3 900A75.6 75.6 0 0 1 217.6 953.5S191.1 991.7 208.1 992.5C208.1 992.5 209.4 995 215.1 993A22.4 22.4 0 0 0 234.2 996.1 18.8 18.8 0 0 0 251.2 996.6 15.2 15.2 0 0 0 266.7 997.6S278.7 1003.3 285.8 997.1C285.8 997.1 298.5 999.1 275.9 958.9A367.7 367.7 0 0 0 262.5 907.9C253.4 892.1 259.9 848.6 261.8 839.2A155.9 155.9 0 0 0 257.5 776.5C253.3 761.8 264.7 734 268.9 716.9 277.5 680.9 294.3 589.1 292.2 571.7L299.2 573.4A18.3 18.3 0 0 0 307.3 571.7Z", + "width": 599 + }, + "search": [ + "obese-bmi" + ] + }, + { + "uid": "8def4a3c24de0ce8f44b7815c2c60e8b", + "css": "livecare", + "code": 59449, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M359.7 999.9H201.4A198.3 198.3 0 0 1 123.3 984 203.2 203.2 0 0 1 16.1 877 197.1 197.1 0 0 1 0.2 799.1V200.7A197.7 197.7 0 0 1 16.1 122.7 203 203 0 0 1 123.2 15.8 197.7 197.7 0 0 1 201 0H943.2A197.7 197.7 0 0 1 1021.2 15.9 202.9 202.9 0 0 1 1128.1 123 197.7 197.7 0 0 1 1143.3 200.8V348.4A165.5 165.5 0 0 0 1143.3 658.1V798.8A198.3 198.3 0 0 1 1127.7 876.9 202.3 202.3 0 0 1 1020.9 984.1 197.7 197.7 0 0 1 943 1000H769.8A523.4 523.4 0 0 0 826.4 943.9 52.2 52.2 0 0 0 837.9 902.6 762.6 762.6 0 0 0 945.5 700.1 735.6 735.6 0 0 0 974.8 593.4 534.2 534.2 0 0 0 985 493.3 353.7 353.7 0 0 0 969.2 377.4 151.4 151.4 0 0 0 923.5 309.3 216.9 216.9 0 0 0 851 271.4C822.4 261.7 789.4 254.2 754.4 246.2H754.4L754.4 246.2A54 54 0 0 0 706.1 215.5 54.9 54.9 0 1 0 706.1 325.4 52.7 52.7 0 0 0 738.4 313.3L739.7 313.7H739.7L740.6 313.7C775.5 321.8 803.1 328.4 826 335.7A149.3 149.3 0 0 1 880.4 363.5 93 93 0 0 1 908.6 411.4 320 320 0 0 1 916.7 493.8 460.9 460.9 0 0 1 907.2 582.5 666.4 666.4 0 0 1 880.5 677.7 743.1 743.1 0 0 1 838.7 772.4 656 656 0 0 1 784.3 859 52.4 52.4 0 0 0 748.2 876.5 370.9 370.9 0 0 1 670.2 946.2 179.5 179.5 0 0 1 459.8 946.2 368 368 0 0 1 381.8 876.9 52.4 52.4 0 0 0 345.7 859.4 659.1 659.1 0 0 1 291.2 772.5 747 747 0 0 1 249.4 677.3 664.2 664.2 0 0 1 222.6 582.1 463.2 463.2 0 0 1 213.1 493.3 323.7 323.7 0 0 1 221.1 410.8 92.7 92.7 0 0 1 249.2 362.9 148.8 148.8 0 0 1 303.6 335.1C326.8 327.8 355.9 321 389.6 313.1L390.3 313.1H390.3L390.8 312.7A54.1 54.1 0 0 0 423.8 324.9 54.8 54.8 0 1 0 423.8 215 53.1 53.1 0 0 0 394.5 223.7 59.5 59.5 0 0 0 374.6 245.6H374.6L373.9 245.6C230.3 278.8 143.6 298.8 143.6 492.9A534.1 534.1 0 0 0 153.9 593.2 737.8 737.8 0 0 0 183.2 700 757.5 757.5 0 0 0 291.6 902.9 52 52 0 0 0 303.2 944.1 529.8 529.8 0 0 0 359.1 999.6H359.1ZM1787.8 895.3H1706.6A70 70 0 0 1 1669.9 884.8L1332 671.5A33.4 33.4 0 0 1 1316.4 643.4V622.6A165.3 165.3 0 0 0 1316.4 384.5V347A33.4 33.4 0 0 1 1332 318.9L1669.9 105.6A66.9 66.9 0 0 1 1706.6 95.1H1787.8A33.5 33.5 0 0 1 1821.5 128.2V862.6A32.9 32.9 0 0 1 1811.7 886 33.5 33.5 0 0 1 1787.9 895.7ZM467.9 673.5H485.2L539.5 673.5C546 673.5 551.4 666.6 551.7 656.7V611.6C551.7 601.9 556 594.4 562.7 593.9L579.3 593.9C586.1 594.4 590.7 602 590.7 611.6V656.8C590.7 666.8 595.5 673.2 602.1 673.2L675.3 673.2 675.3 617.1C675.3 607.5 670.7 600 663.9 599.6L634.6 599.6C628.1 599.6 623.1 592.7 622.8 582.7L622.8 567.6C622.8 557.6 628.2 550.8 634.7 550.8H664C670.7 550.3 675.1 542.4 675.1 532.8V463.3A29.8 29.8 0 0 1 652.4 477.4H602.8C596.3 477.4 590.9 484.7 590.6 494.4V539.7C590.6 549.6 585.3 556.6 578.8 556.6L564.1 556.6C557.6 556.6 552.4 549.8 552.1 539.9V494C552.1 484.1 546.7 477.4 540.2 477.4H468.1V533.3C468.1 543 472.6 550.6 479.4 551.2L508.7 551.2C515.3 551.6 520.1 559.6 520.1 569.2V582.1C520.1 591.8 515.6 599.5 508.8 599.9H479.5C472.8 600.4 468.3 608.1 468.3 617.6ZM716 459.1V693.1A29.7 29.7 0 0 1 686 721.3H455.4A29.3 29.3 0 0 1 425.6 693.1V459.1A29.7 29.7 0 0 1 455.4 430.5H685.9A30.2 30.2 0 0 1 716 459.1ZM468.1 673.5H485.5L539.7 673.5C546.2 673.5 551.6 666.6 551.9 656.7V611.6C551.9 601.9 556.2 594.4 562.9 593.9L579.6 593.9C586.2 594.4 590.8 602 590.8 611.6V657.2C590.8 667.2 595.7 673.6 602.2 673.6L675.4 673.6 675.4 617.5C675.4 607.8 670.8 600.4 664.1 599.9L634.8 599.9C628.3 599.9 623.2 593 622.9 583.1L622.9 567.9C622.9 558 628.3 551.2 634.9 551.2H664.2C670.9 550.7 675.2 542.8 675.2 533.2V463.3A29.8 29.8 0 0 1 652.6 477.4H602.9C596.5 477.4 591.1 484.7 590.8 494.4V539.4C590.8 549.3 585.4 556.3 578.9 556.3L563.9 556.3C557.4 556.3 552.2 549.5 551.9 539.6V494.2C551.9 484.2 546.5 477.6 539.9 477.6H468.1V533.4C468.1 543.1 472.6 550.8 479.4 551.3L508.7 551.3C515.3 551.7 520.1 559.7 520.1 569.3V582.3C520.1 591.9 515.6 599.6 508.8 600.1H479.5C472.8 600.5 468.3 608.2 468.3 617.8ZM1202.1 400.4A96.2 96.2 0 1 1 1106 496.6H1106A96.2 96.2 0 0 1 1202.1 400.4Z", + "width": 1821 + }, + "search": [ + "livecare" + ] + }, + { + "uid": "a02f08ac7cc84e1f52f4753adda54c87", + "css": "modify-episode", + "code": 59452, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M825.8 83.3A125 125 0 0 0 708.3 0H125A125.4 125.4 0 0 0 0 125V708.3A125 125 0 0 0 83.3 825.8V291.7A208.3 208.3 0 0 1 291.7 83.3ZM875 1000H291.7A125.8 125.8 0 0 1 166.7 875V291.6A125.7 125.7 0 0 1 291.7 166.6H875A125.7 125.7 0 0 1 1000 291.6V875A125.7 125.7 0 0 1 875 1000ZM650.9 428.6H650.9L370.5 709A21.9 21.9 0 0 0 365.1 717.8L333.1 813A22.3 22.3 0 0 0 338.6 836 22.6 22.6 0 0 0 354.6 842.5 21.4 21.4 0 0 0 361.7 841.4L456.9 809.7A22.5 22.5 0 0 0 465.6 804.3L746 523.8 650.8 428.6ZM746.2 349A37.4 37.4 0 0 0 719.7 359.9L682.7 397 777.9 492.1 814.9 455.1A37.1 37.1 0 0 0 825.9 428.6 36.8 36.8 0 0 0 814.9 402.2L772.6 359.8A37.4 37.4 0 0 0 746.1 349.1Z", + "width": 1000 + }, + "search": [ + "modify-episode" + ] + }, + { + "uid": "abc3d36a67f52088185b185d6ec822cd", + "css": "obese-bmi-r", + "code": 59454, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M307.3 571.7C305.2 589.1 322 680.9 330.6 716.9 334.8 734 346.1 761.8 342 776.5A153.3 153.3 0 0 0 337.7 839.2C339.7 848.6 346 892 337 907.9A369.5 369.5 0 0 0 323.5 958.9C300.8 999.1 313.6 997.1 313.6 997.1 320.6 1003.2 332.7 997.6 332.7 997.6A15.3 15.3 0 0 0 348.1 996.6 18.9 18.9 0 0 0 365.2 996.1 22.4 22.4 0 0 0 384.2 993C389.9 995 391.3 992.5 391.3 992.5 408.3 991.7 381.8 953.5 381.8 953.5A76.3 76.3 0 0 1 388.1 900C429.5 813.7 431.7 790.8 415.1 758.3 410.4 748.9 409.2 745.2 411.4 741.1 416.3 731.7 412.7 693.9 418.8 678.8 430.5 649.9 442 576.4 448 542.1 456.1 495.9 419.4 434 419.4 434 411.4 408.8 423.1 319 423.1 319 439.6 336.9 439 368.6 439 368.6 436.4 401.9 477.2 452.7 477.2 452.7A118.4 118.4 0 0 1 504.3 495.1C504.3 501.1 502.4 515.8 502.4 515.8L503.2 528.5A129.3 129.3 0 0 1 505.7 548.3C502.6 581.6 510.2 575.3 510.2 575.3 516.5 575.3 523.5 548.5 523.5 548.5 523.5 555.4 521.1 576.1 526.4 583.9 532.7 593.2 537.4 582.3 537.5 580.1 539.2 537.8 542.8 548.9 542.8 548.9 546.3 583.2 550.7 591 558.4 588.3 564.3 586.3 558.9 547.1 558.9 547.1 569 570.4 576.7 574.1 576.7 574.1 593.3 582.3 583 559.6 580.7 555.1A99.2 99.2 0 0 1 568 523C583.4 544.5 595 543.6 595 543.6 610 540.3 581.9 509.9 565.4 495.4A126 126 0 0 1 543 472.2 203.5 203.5 0 0 1 534 430.1C532.4 392.3 519.1 375.9 519.1 375.9 496.3 350.3 492 302.5 492 302.5L491 221.9C483 166.9 425.3 166.5 425.3 166.5 366.9 160.4 358.8 147.2 358.8 147.2 346.4 134.7 353.5 110.8 353.5 110.8A38.7 38.7 0 0 0 367.7 89.4C384.7 80.2 383.9 66.8 376 66.9 369.7 67 371.2 63.4 371.2 63.4 381.9 3.1 305.5 0 305.5 0H293.9S217.5 3.1 228.1 63.4C228.1 63.4 229.6 67.1 223.2 67 215.4 66.8 214.6 80.3 231.6 89.4A38.7 38.7 0 0 0 245.8 110.8S252.9 134.8 240.5 147.2C240.5 147.2 232.4 160.5 174 166.6 174 166.6 116.2 167 108.3 222L107.2 302.6S103 350.3 80.2 375.9C80.2 375.9 66.9 392.4 65.4 430.2A204.8 204.8 0 0 1 56.4 472.3 124.6 124.6 0 0 1 33.9 495.5C17.3 510-10.7 540.2 4.3 543.7 4.3 543.7 16 544.5 31.3 523.1A98.1 98.1 0 0 1 18.7 555.2C16.3 559.6 6 582.3 22.6 574.2 22.6 574.2 30.3 570.4 40.4 547.1 40.4 547.1 35 586.4 41 588.4 48.8 591 53.1 583.3 56.6 548.9 56.6 548.9 60.2 537.8 61.9 580.2 62 582.4 66.5 593.3 72.9 584 78.3 576.2 75.9 555.5 75.9 548.6 75.9 548.6 82.8 575.4 89.2 575.4 89.2 575.4 96.8 581.7 93.7 548.4A119.1 119.1 0 0 1 96.2 528.5L96.9 515.8S95 501.1 95 495.1A118.3 118.3 0 0 1 122.1 452.7S162.9 401.8 160.3 368.6C160.3 368.6 159.7 336.9 176.2 319 176.2 319 187.9 408.8 180 434 180 434 143.2 495.9 151.3 542.1 157.3 576.5 168.8 649.9 180.5 678.8 186.6 693.8 183 731.7 187.9 741.1 190.1 745.2 188.9 749 184.2 758.3 167.7 790.8 169.8 813.7 211.3 900A75.6 75.6 0 0 1 217.6 953.5S191.1 991.7 208.1 992.5C208.1 992.5 209.4 995 215.1 993A22.4 22.4 0 0 0 234.2 996.1 18.8 18.8 0 0 0 251.2 996.6 15.2 15.2 0 0 0 266.7 997.6S278.7 1003.3 285.8 997.1C285.8 997.1 298.5 999.1 275.9 958.9A367.7 367.7 0 0 0 262.5 907.9C253.4 892.1 259.9 848.6 261.8 839.2A155.9 155.9 0 0 0 257.5 776.5C253.3 761.8 264.7 734 268.9 716.9 277.5 680.9 294.3 589.1 292.2 571.7L299.2 573.4A18.3 18.3 0 0 0 307.3 571.7Z", + "width": 599 + }, + "search": [ + "obese-bmi-r" + ] + }, + { + "uid": "6155f39d20a8f84da651fa66bdcabfeb", + "css": "ovrweight-bmi", + "code": 59455, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M240.4 571.7C238.7 589.1 251.9 680.9 258.6 716.9 261.9 734 270.7 761.8 267.5 776.5A194.7 194.7 0 0 0 264.2 839.2C265.7 848.6 270.7 892 263.6 907.9A454.8 454.8 0 0 0 253.1 958.9C235.3 999.1 245.3 997.1 245.3 997.1 250.8 1003.2 260.3 997.6 260.3 997.6A9.9 9.9 0 0 0 272.4 996.6 12 12 0 0 0 285.7 996.1 14.6 14.6 0 0 0 300.6 993C305.1 995 306.1 992.5 306.1 992.5 319.5 991.7 298.7 953.5 298.7 953.5A94.6 94.6 0 0 1 303.6 900C336.1 813.7 337.7 790.8 324.7 758.3 321.1 748.9 320.2 745.2 321.8 741.1 325.7 731.7 322.9 693.9 327.6 678.8 336.8 649.9 345.8 576.4 350.5 542.1 356.8 495.9 328.1 434 328.1 434 321.9 408.8 331.1 319 331.1 319 343.9 336.9 343.4 368.6 343.4 368.6 341.4 401.9 373.3 452.7 373.3 452.7A128.3 128.3 0 0 1 394.5 495.1C394.5 501.1 393 515.8 393 515.8L393.6 528.5A163.7 163.7 0 0 1 395.6 548.4C393.2 581.6 399.1 575.4 399.1 575.4 404.1 575.4 409.5 548.6 409.5 548.6 409.5 555.5 407.6 576.1 411.8 583.9 416.8 593.2 420.4 582.3 420.5 580.1 421.8 537.8 424.6 548.9 424.6 548.9 427.4 583.2 430.8 591 436.8 588.3 441.4 586.3 437.2 547.1 437.2 547.1 445.1 570.4 451.1 574.1 451.1 574.1 464.1 582.3 456.1 559.7 454.3 555.2A118.2 118.2 0 0 1 444.3 523C456.4 544.5 465.4 543.7 465.4 543.7 477.2 540.3 455.1 510 442.3 495.4A118.3 118.3 0 0 1 424.7 472.2 253.7 253.7 0 0 1 417.7 430.2C416.5 392.3 406.1 375.9 406.1 375.9 388.2 350.3 384.9 302.5 384.9 302.5L384.1 221.9C377.8 166.9 332.7 166.5 332.7 166.5 287.1 160.5 280.7 147.3 280.7 147.3 271 134.8 276.6 110.8 276.6 110.8A41.5 41.5 0 0 0 287.7 89.4C301 80.3 300.4 66.9 294.2 67 289.3 67.1 290.4 63.4 290.4 63.4 298.7 3.1 239 0 239 0H229.9S170.1 3.1 178.4 63.4C178.4 63.4 179.6 67.1 174.6 67 168.4 66.8 167.9 80.3 181.1 89.4A41.4 41.4 0 0 0 192.3 110.8S197.8 134.8 188.1 147.2C188.1 147.2 181.8 160.5 136.1 166.6 136.1 166.6 90.9 167 84.7 222L83.8 302.6S80.5 350.3 62.6 375.9C62.6 375.9 52.3 392.4 51.1 430.2A255.3 255.3 0 0 1 44 472.3 117.1 117.1 0 0 1 26.5 495.5C13.5 510-8.4 540.2 3.3 543.7 3.3 543.7 12.5 544.5 24.4 523.1A117 117 0 0 1 14.6 555.2C12.7 559.6 4.6 582.3 17.7 574.2 17.7 574.2 23.7 570.4 31.5 547.1 31.5 547.1 27.3 586.4 32 588.4 38.1 591 41.5 583.3 44.2 548.9 44.2 548.9 47.1 537.8 48.4 580.2 48.4 582.4 52 593.3 57 584 61.2 576.2 59.3 555.5 59.3 548.6 59.3 548.6 64.7 575.4 69.7 575.4 69.7 575.4 75.7 581.7 73.2 548.4A150.7 150.7 0 0 1 75.2 528.6L75.8 515.8S74.3 501.2 74.3 495.1A128.1 128.1 0 0 1 95.5 452.7S127.5 401.9 125.4 368.7C125.4 368.7 125 337 137.8 319 137.8 319 146.9 408.8 140.7 434 140.7 434 112 496 118.3 542.2 123 576.5 132 649.9 141.2 678.9 145.9 693.9 143.1 731.7 146.9 741.2 148.7 745.3 147.8 749.1 144 758.4 131.2 790.8 132.9 813.7 165.3 900A93.8 93.8 0 0 1 170.2 953.5S149.5 991.7 162.7 992.5C162.7 992.5 163.8 995 168.3 993A14.6 14.6 0 0 0 183.2 996.1 12 12 0 0 0 196.5 996.6 9.9 9.9 0 0 0 208.6 997.6S218 1003.3 223.6 997.1C223.6 997.1 233.5 999.1 215.8 958.9A452.6 452.6 0 0 0 205.3 907.9C198.2 892 203.2 848.5 204.7 839.2A198.1 198.1 0 0 0 201.4 776.5C198.1 761.8 207 734 210.2 716.9 217 680.9 230.2 589.1 228.5 571.7L233.9 573.4A11.9 11.9 0 0 0 240.4 571.7Z", + "width": 469 + }, + "search": [ + "ovrweight-bmi" + ] + }, + { + "uid": "2d2f5e7a3046c40afa3ccb117d321149", + "css": "order-prescription", + "code": 59456, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M596.3 192.4A28.8 28.8 0 0 0 588.5 172.7L434.6 9.1A28.9 28.9 0 0 0 413.6 0H404V202H596.3ZM596.3 192.4M567.2 567.5A164.8 164.8 0 0 1 596.3 570.1V259.7H375.1A28.9 28.9 0 0 1 346.3 230.8V0H28.9A28.9 28.9 0 0 0 0 28.9V769.5A28.9 28.9 0 0 0 28.9 798.3H271.5A163.6 163.6 0 0 1 288.4 778.6L451.6 615.5A162.4 162.4 0 0 1 567.2 567.5ZM240.4 336.6H269.3V307.8A28.9 28.9 0 1 1 327 307.8V336.6H355.9A28.9 28.9 0 1 1 355.9 394.3H327V423.2A28.9 28.9 0 0 1 269.3 423.2V394.3H240.4A28.9 28.9 0 0 1 240.4 336.6ZM144.3 509.8H452A28.9 28.9 0 1 1 452 567.5H144.3A28.9 28.9 0 0 1 144.3 509.8ZM336.6 682.9H144.3A28.9 28.9 0 1 1 144.3 625.2H336.6A28.9 28.9 0 1 1 336.6 682.9ZM336.6 682.9M329.1 819.4A105.8 105.8 0 1 0 478.8 969L540 907.8 390.4 758.1ZM329.1 819.4M642 656.2A105.8 105.8 0 0 0 492.4 656.2L431.2 717.4 580.8 867 642 805.8A105.9 105.9 0 0 0 642 656.2ZM642 656.2", + "width": 673 + }, + "search": [ + "order-prescription" + ] + }, + { + "uid": "6e8d360bfcc0238a6164f21160b4203f", + "css": "order-procedures", + "code": 59457, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1040.4 721.4L997.6 778.4 1054.8 821.3H926A142.7 142.7 0 0 0 788.2 714.3H430.9A142.7 142.7 0 0 0 293.1 821.3H214.3A142.8 142.8 0 0 1 214.3 535.6H293.1A142.7 142.7 0 0 0 430.9 642.6H788.1A142.7 142.7 0 0 0 925.9 535.6H1004.8A214.3 214.3 0 1 0 1004.8 107H926A142.7 142.7 0 0 0 788.1 0H430.9A142.7 142.7 0 0 0 293.1 107H261.9L128.6 7.2 85.7 64.3 142.8 107H0V178.6H142.8L85.7 221.4 128.6 278.6 261.9 178.6H293.2A142.7 142.7 0 0 0 431 285.5H788.1A142.7 142.7 0 0 0 926 178.6H1004.9A142.8 142.8 0 1 1 1004.9 464.3H926A142.7 142.7 0 0 0 788.2 357.3H430.9A142.7 142.7 0 0 0 293.1 464.3H214.3A214.3 214.3 0 1 0 214.3 892.8H293.1A142.7 142.7 0 0 0 430.9 999.8H788.1A142.7 142.7 0 0 0 926 892.8H1054.9L997.7 935.7 1040.4 992.8 1218.9 857.2ZM1040.4 721.4", + "width": 1219 + }, + "search": [ + "order-procedures" + ] + }, + { + "uid": "d6fe7b7abad6762bf429e2025e6db5d5", + "css": "ovrweight-bmi-r", + "code": 59458, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M240.4 571.7C238.7 589.1 251.9 680.9 258.6 716.9 261.9 734 270.7 761.8 267.5 776.5A194.7 194.7 0 0 0 264.2 839.2C265.7 848.6 270.7 892 263.6 907.9A454.8 454.8 0 0 0 253.1 958.9C235.3 999.1 245.3 997.1 245.3 997.1 250.8 1003.2 260.3 997.6 260.3 997.6A9.9 9.9 0 0 0 272.4 996.6 12 12 0 0 0 285.7 996.1 14.6 14.6 0 0 0 300.6 993C305.1 995 306.1 992.5 306.1 992.5 319.5 991.7 298.7 953.5 298.7 953.5A94.6 94.6 0 0 1 303.6 900C336.1 813.7 337.7 790.8 324.7 758.3 321.1 748.9 320.2 745.2 321.8 741.1 325.7 731.7 322.9 693.9 327.6 678.8 336.8 649.9 345.8 576.4 350.5 542.1 356.8 495.9 328.1 434 328.1 434 321.9 408.8 331.1 319 331.1 319 343.9 336.9 343.4 368.6 343.4 368.6 341.4 401.9 373.3 452.7 373.3 452.7A128.3 128.3 0 0 1 394.5 495.1C394.5 501.1 393 515.8 393 515.8L393.6 528.5A163.7 163.7 0 0 1 395.6 548.4C393.2 581.6 399.1 575.4 399.1 575.4 404.1 575.4 409.5 548.6 409.5 548.6 409.5 555.5 407.6 576.1 411.8 583.9 416.8 593.2 420.4 582.3 420.5 580.1 421.8 537.8 424.6 548.9 424.6 548.9 427.4 583.2 430.8 591 436.8 588.3 441.4 586.3 437.2 547.1 437.2 547.1 445.1 570.4 451.1 574.1 451.1 574.1 464.1 582.3 456.1 559.7 454.3 555.2A118.2 118.2 0 0 1 444.3 523C456.4 544.5 465.4 543.7 465.4 543.7 477.2 540.3 455.1 510 442.3 495.4A118.3 118.3 0 0 1 424.7 472.2 253.7 253.7 0 0 1 417.7 430.2C416.5 392.3 406.1 375.9 406.1 375.9 388.2 350.3 384.9 302.5 384.9 302.5L384.1 221.9C377.8 166.9 332.7 166.5 332.7 166.5 287.1 160.5 280.7 147.3 280.7 147.3 271 134.8 276.6 110.8 276.6 110.8A41.5 41.5 0 0 0 287.7 89.4C301 80.3 300.4 66.9 294.2 67 289.3 67.1 290.4 63.4 290.4 63.4 298.7 3.1 239 0 239 0H229.9S170.1 3.1 178.4 63.4C178.4 63.4 179.6 67.1 174.6 67 168.4 66.8 167.9 80.3 181.1 89.4A41.4 41.4 0 0 0 192.3 110.8S197.8 134.8 188.1 147.2C188.1 147.2 181.8 160.5 136.1 166.6 136.1 166.6 90.9 167 84.7 222L83.8 302.6S80.5 350.3 62.6 375.9C62.6 375.9 52.3 392.4 51.1 430.2A255.3 255.3 0 0 1 44 472.3 117.1 117.1 0 0 1 26.5 495.5C13.5 510-8.4 540.2 3.3 543.7 3.3 543.7 12.5 544.5 24.4 523.1A117 117 0 0 1 14.6 555.2C12.7 559.6 4.6 582.3 17.7 574.2 17.7 574.2 23.7 570.4 31.5 547.1 31.5 547.1 27.3 586.4 32 588.4 38.1 591 41.5 583.3 44.2 548.9 44.2 548.9 47.1 537.8 48.4 580.2 48.4 582.4 52 593.3 57 584 61.2 576.2 59.3 555.5 59.3 548.6 59.3 548.6 64.7 575.4 69.7 575.4 69.7 575.4 75.7 581.7 73.2 548.4A150.7 150.7 0 0 1 75.2 528.6L75.8 515.8S74.3 501.2 74.3 495.1A128.1 128.1 0 0 1 95.5 452.7S127.5 401.9 125.4 368.7C125.4 368.7 125 337 137.8 319 137.8 319 146.9 408.8 140.7 434 140.7 434 112 496 118.3 542.2 123 576.5 132 649.9 141.2 678.9 145.9 693.9 143.1 731.7 146.9 741.2 148.7 745.3 147.8 749.1 144 758.4 131.2 790.8 132.9 813.7 165.3 900A93.8 93.8 0 0 1 170.2 953.5S149.5 991.7 162.7 992.5C162.7 992.5 163.8 995 168.3 993A14.6 14.6 0 0 0 183.2 996.1 12 12 0 0 0 196.5 996.6 9.9 9.9 0 0 0 208.6 997.6S218 1003.3 223.6 997.1C223.6 997.1 233.5 999.1 215.8 958.9A452.6 452.6 0 0 0 205.3 907.9C198.2 892 203.2 848.5 204.7 839.2A198.1 198.1 0 0 0 201.4 776.5C198.1 761.8 207 734 210.2 716.9 217 680.9 230.2 589.1 228.5 571.7L233.9 573.4A11.9 11.9 0 0 0 240.4 571.7Z", + "width": 469 + }, + "search": [ + "ovrweight-bmi-r" + ] + }, + { + "uid": "d3a35963df4d21d3ec3cf69077ac511e", + "css": "respiration-rate", + "code": 59459, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M989.3 410.2C907.2 230.7 805.1 123.6 716.1 123.6A91.6 91.6 0 0 0 667.3 137C595.3 181.3 592 319.6 591.9 334.9 591.9 339.7 590.8 377.9 590 431.1L560.9 420.4V20.1A20.3 20.3 0 0 0 540.6-0.2H499.9A20.3 20.3 0 0 0 479.6 20.1V420.4L450.5 431.1C449.7 378 448.7 339.9 448.6 335.3 448.6 319.6 445.2 181.3 373.2 137A91.6 91.6 0 0 0 324.4 123.6C235.5 123.6 133.3 230.8 51.2 410.3-57.1 647.8 39 972 43.2 985.6A20.1 20.1 0 0 0 67.1 999.3 1776.9 1776.9 0 0 0 243.4 946.2C369.2 900.2 434.5 855.1 442.6 808.2A2836.5 2836.5 0 0 0 451.6 473.7L506.5 453.4H534.7L589.6 473.7A2835.8 2835.8 0 0 0 598.6 808.2C606.7 855.1 671.8 900.2 797.8 946.2A1778.4 1778.4 0 0 0 974.1 999.5 20.1 20.1 0 0 0 998 985.7C1001.8 972 1097.9 647.8 989.3 410.2ZM393.1 500.5L249.7 574.6V634.8L260.7 668.2 288.1 694.8A20.3 20.3 0 0 1 260.1 723.7L230.5 695.2 197 732.2A20.3 20.3 0 0 1 167.2 705.1L209.4 658.4V595.3L130.2 636.3A20.3 20.3 0 1 1 111.7 600.5L129.3 591.4 97.8 566.3A20.3 20.3 0 0 1 122.9 534.8L168.5 571.2 278.8 514.3 184.4 442.5A20.3 20.3 0 0 1 208.8 410.4L239.3 433.5 241.9 410.2A20.3 20.3 0 0 1 281.9 414.6L276.5 461.8 318.5 493.7 374.5 464.8A20.3 20.3 0 1 1 393 500.5ZM942.9 566.3L911.4 591.4 929 600.5A20.3 20.3 0 1 1 910.5 636.3L831.4 595.3V658.2L873.7 705A20.3 20.3 0 0 1 843.8 732.1L810.3 695.1 780.8 723.6A20.3 20.3 0 0 1 752.7 694.7L780.1 668.1 791.1 634.7V574.5L647.7 500.4A20.3 20.3 0 1 1 666.2 464.6L722.2 493.6 764.2 461.7 759 414.5A20.3 20.3 0 1 1 799 410L801.6 433.4 832.1 410.2A20.3 20.3 0 0 1 856.5 442.3L761.9 514 872.2 570.9 917.9 534.5A20.3 20.3 0 0 1 943 566Z", + "width": 1041 + }, + "search": [ + "respiration-rate" + ] + }, + { + "uid": "230620f957b8bbd4c6ea89c460c5c676", + "css": "patient-sick-leave", + "code": 59460, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M664.4 0H92.6A92.7 92.7 0 0 0 0 92.6V907.4A92.7 92.7 0 0 0 92.6 1000H664.3A92.7 92.7 0 0 0 756.9 907.4V92.6A92.7 92.7 0 0 0 664.4 0ZM118.7 167.8L176.4 68.5A20.8 20.8 0 1 1 212.4 89.3L173 157.2H587.9L556.4 87.4A20.8 20.8 0 1 1 594.4 70.1L639.1 169.5A20.8 20.8 0 0 1 620.1 198.9H136.8A20.8 20.8 0 0 1 118.7 167.8ZM644.6 608.6H492.4A20.8 20.8 0 0 1 472.7 594.7L458.3 554.1 423.7 813.6A20.8 20.8 0 0 1 403.7 831.6H403.1A20.8 20.8 0 0 1 382.7 814.7L312.5 452.1 266.5 606.1A20.8 20.8 0 0 1 246.6 621H112.3A20.8 20.8 0 1 1 112.3 579.5H231.1L296.8 358.9A20.8 20.8 0 0 1 337.2 360.9L399.1 681.8 428.4 463.2A20.8 20.8 0 0 1 446.8 445.3 21.3 21.3 0 0 1 468.7 459.1L507 567.1H644.5A20.8 20.8 0 1 1 644.5 608.6Z", + "width": 757 + }, + "search": [ + "patient-sick-leave" + ] + }, + { + "uid": "9990a08bacced53295a9059a091f3dca", + "css": "progress-notes-1", + "code": 59461, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M400 266.7V33.4A33.4 33.4 0 0 1 466.6 33.4V266.7ZM300 933.3A99.3 99.3 0 0 1 229.3 904.1 1011.6 1011.6 0 0 1 0 550.5V966.6A33.4 33.4 0 0 0 33.4 1000H833.3A33.4 33.4 0 0 0 866.7 966.6V933.3ZM1128 809.7A885.7 885.7 0 0 1 866.6 189.5V166.6A33.4 33.4 0 0 0 833.3 133.3H533.3V300A33.4 33.4 0 0 1 500 333.3H366.6A33.4 33.4 0 0 1 333.3 300V133.3H33.4A33.4 33.4 0 0 0 0 166.7V189.6A943.4 943.4 0 0 0 276.4 856.9 33.4 33.4 0 0 0 300 866.7H1104.5A33.4 33.4 0 0 0 1128.1 809.8ZM433.3 400H700A33.4 33.4 0 0 1 700 466.6H433.3A33.4 33.4 0 0 1 433.3 400ZM700 733.3H366.7A33.4 33.4 0 0 1 366.7 666.6H700A33.4 33.4 0 0 1 700 733.3ZM766.7 600H300A33.4 33.4 0 1 1 300 533.3H766.7A33.4 33.4 0 1 1 766.7 600Z", + "width": 1138 + }, + "search": [ + "progress-notes" + ] + }, + { + "uid": "626836408cae9059f8c1866b3a23b23f", + "css": "temperature", + "code": 59462, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M394.7 0A131.7 131.7 0 0 1 526.3 131.8V686.9A187 187 0 0 1 579 815.8 184.2 184.2 0 1 1 263.2 686.9V131.6A131.4 131.4 0 0 1 394.7 0ZM394.7 315.8A26.5 26.5 0 0 0 368.4 342.1V741.3A79 79 0 1 0 473.7 815.8 79.9 79.9 0 0 0 421.1 741.3V342.1A26.7 26.7 0 0 0 394.7 315.8ZM184.2 631.6A26.3 26.3 0 1 1 184.2 684.3H52.6A26.3 26.3 0 1 1 52.6 631.6ZM710.6 289.6A105.3 105.3 0 0 1 815.7 394.7 25.8 25.8 0 0 1 789.5 422.3 26.5 26.5 0 0 1 763.1 394.9 52.6 52.6 0 0 0 657.9 394.9V553A52.6 52.6 0 1 0 763.2 553 26.3 26.3 0 0 1 815.8 553 105.3 105.3 0 0 1 605.3 553V394.7A105.3 105.3 0 0 1 710.6 289.6ZM184.2 552.6A26.3 26.3 0 1 1 184.2 605.3H157.9A26.3 26.3 0 0 1 157.9 552.6ZM184.2 447.4A26.3 26.3 0 0 1 210.6 473.7 26.7 26.7 0 0 1 184.2 500H105.3A26.3 26.3 0 0 1 78.9 473.7 26 26 0 0 1 105.3 447.4ZM921.1 289.5A52.6 52.6 0 1 1 868.5 342.1 52.6 52.6 0 0 1 921.1 289.6ZM184.2 342.1A26.3 26.3 0 1 1 184.2 394.8H78.9A26.3 26.3 0 0 1 78.9 342.1ZM184.2 236.9A26.3 26.3 0 0 1 184.2 289.5H131.6A26.3 26.3 0 0 1 131.6 236.9ZM184.2 131.6A26.3 26.3 0 1 1 184.2 184.3H26.3A26.3 26.3 0 1 1 26.3 131.6Z", + "width": 974 + }, + "search": [ + "temperature" + ] + }, + { + "uid": "66b89e853c3e2b07f694e387fd756780", + "css": "underweight-bmi", + "code": 59463, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M182.4 571.7C181.1 589.1 191.1 680.9 196.2 716.9 198.7 734 205.4 761.8 203 776.5A255.5 255.5 0 0 0 200.4 839.2C201.6 848.6 205.4 892 200 907.9 197.2 916.3 192 958.9 192 958.9 178.6 999.1 186.1 997.1 186.1 997.1 190.3 1003.2 197.5 997.6 197.5 997.6A6.3 6.3 0 0 0 206.7 996.6C211.4 1001.2 216.8 996.1 216.8 996.1 222.7 999.7 228.1 993 228.1 993 231.5 995 232.3 992.5 232.3 992.5 242.4 991.7 226.7 953.5 226.7 953.5A122.1 122.1 0 0 1 230.4 900C255 813.7 256.3 790.8 246.5 758.3 243.7 748.9 243 745.2 244.3 741.1 247.2 731.7 245.1 693.9 248.7 678.8 255.6 649.9 262.4 576.4 266 542.1 270.7 495.9 249 434 249 434 244.2 408.8 251.2 319 251.2 319A126.2 126.2 0 0 1 260.6 368.6C259 401.9 283.2 452.7 283.2 452.7A149.5 149.5 0 0 1 299.3 495.1C299.3 501.1 298.2 515.8 298.2 515.8L298.6 528.5C298.8 531.8 300.4 543 300.1 548.4 298.3 581.6 302.8 575.4 302.8 575.4 306.5 575.4 310.7 548.6 310.7 548.6A135.2 135.2 0 0 0 312.4 583.9C316.2 593.2 318.9 582.3 319 580.1 320 537.8 322.1 548.9 322.1 548.9 324.2 583.2 326.8 591 331.4 588.3 334.9 586.3 331.7 547.1 331.7 547.1 337.7 570.4 342.2 574.1 342.2 574.1 352.1 582.3 346 559.7 344.6 555.2A148.3 148.3 0 0 1 337.1 523C346.2 544.5 353.1 543.7 353.1 543.7 362 540.3 345.3 510 335.6 495.4A121.6 121.6 0 0 1 322.3 472.2 328.7 328.7 0 0 1 317 430.2 145.7 145.7 0 0 0 308.1 375.9C294.6 350.3 292.1 302.5 292.1 302.5L291.5 221.9C286.7 166.9 252.5 166.5 252.5 166.5 217.8 160.4 213 147.2 213 147.2 205.7 134.7 209.9 110.8 209.9 110.8A47.8 47.8 0 0 0 218.3 89.4C228.4 80.2 227.9 66.8 223.3 66.9 219.5 67.1 220.4 63.4 220.4 63.4 226.6 3.1 181.3 0 181.3 0H174.4S129 3.1 135.4 63.4C135.4 63.4 136.2 67.1 132.5 67 127.8 66.8 127.4 80.3 137.4 89.4A47.7 47.7 0 0 0 145.9 110.8S150.1 134.8 142.8 147.2C142.8 147.2 138 160.5 103.3 166.6 103.3 166.6 69 167 64.3 222L63.7 302.6S61.1 350.3 47.5 375.9A146.2 146.2 0 0 0 38.8 430.2 330.8 330.8 0 0 1 33.4 472.3 120.2 120.2 0 0 1 20.1 495.5C10.2 510-6.3 540.2 2.5 543.7 2.5 543.7 9.4 544.5 18.5 523.1A146.9 146.9 0 0 1 11.1 555.2C9.6 559.6 3.5 582.3 13.4 574.2 13.4 574.2 18 570.4 23.9 547.1 23.9 547.1 20.7 586.4 24.3 588.4 28.9 591 31.5 583.3 33.6 548.9 33.6 548.9 35.7 537.8 36.7 580.2 36.7 582.4 39.4 593.3 43.2 584A133.3 133.3 0 0 0 45 548.6S49.1 575.4 52.9 575.4C52.9 575.4 57.4 581.7 55.6 548.4A197.2 197.2 0 0 1 57.1 528.6L57.5 515.8S56.4 501.2 56.4 495.1A149.3 149.3 0 0 1 72.5 452.7S96.7 401.8 95.2 368.6A126.5 126.5 0 0 1 104.6 319S111.5 408.8 106.8 434C106.8 434 85 495.9 89.8 542.1 93.4 576.5 100.2 649.9 107.2 678.8 110.8 693.8 108.6 731.7 111.5 741.1 112.9 745.2 112.2 749 109.4 758.3 99.6 790.8 100.8 813.7 125.4 900A121 121 0 0 1 129.2 953.5S113.5 991.8 123.5 992.5C123.5 992.5 124.3 995.1 127.7 993.1 127.7 993.1 133.2 999.7 139.1 996.1 139.1 996.1 144.5 1001.3 149.2 996.7A6.2 6.2 0 0 0 158.3 997.6S165.5 1003.3 169.7 997.2C169.7 997.2 177.2 999.2 163.8 959 163.8 959 158.6 916.3 155.8 908 150.4 892.1 154.2 848.6 155.4 839.3A260 260 0 0 0 152.8 776.6C150.4 761.8 157.1 734 159.6 717 164.7 681 174.7 589.1 173.4 571.8L177.5 573.5A7.6 7.6 0 0 0 182.4 571.7Z", + "width": 356 + }, + "search": [ + "underweight-bmi" + ] + }, + { + "uid": "cbeed016e1b47a377550d4184cfaf42b", + "css": "radiology-1", + "code": 59464, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1218.7 937.5H906.2V812.6C1109.3 812.6 1107.4 817.2 1119.6 798.6L1174 718.9A93.7 93.7 0 0 0 1185.6 537.8 187.5 187.5 0 0 0 1000 375H870.2A437.5 437.5 0 0 0 437.4 0C10.4 0-162.9 552.5 187.4 795.9V937.5H93.7A31.4 31.4 0 1 0 93.7 1000H1218.7A31.4 31.4 0 1 0 1218.7 937.5ZM159 476.2A281.3 281.3 0 0 1 679.3 294.1 273.1 273.1 0 0 1 710.7 375C637.5 375 655.7 403.1 648.2 376.9 653.8 393.8 651.3 384.7 635.4 398.7A125 125 0 0 0 423.9 531.3 93.8 93.8 0 0 0 428.5 718.8 281.3 281.3 0 0 1 159.2 476.3ZM1156.2 593.7A31.4 31.4 0 0 1 1177.7 647.1C1164.9 660.6 1218.7 656.2 437.4 656.2A31.4 31.4 0 0 1 415.9 602.8C428.4 589.4 377.4 593.8 1156.2 593.8ZM579.3 750L558.4 718.6H724A99.1 99.1 0 0 0 718.7 750ZM468.7 468.7A62.5 62.5 0 1 1 531.2 531.2 62.5 62.5 0 0 1 468.7 468.7ZM687.4 812.6H718.8V937.5H687.4ZM1076.8 750.1H906.2A93.7 93.7 0 0 0 900.9 718.7H1097.8ZM1120.8 531.3C667.7 531.3 693.7 534.4 677.7 523.8A46.6 46.6 0 0 1 669.9 451.3C687.4 431.6 689 437.6 999.9 437.6A125 125 0 0 1 1120.9 531.3ZM406.2 843.7H468.7V937.5H406.2Z", + "width": 1250 + }, + "search": [ + "radiology" + ] + }, + { + "uid": "0ad7e861726e4de71ae412435ca73f8a", + "css": "refer-patient", + "code": 59471, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M264.4 666.7L351.6 775.7 267.1 860.3 228.5 667.7C235.7 667.1 242.9 666.7 250.1 666.7ZM442.2 666.7L388.9 733.3 335.6 666.6ZM513.4 666.7H527.7C534.9 666.7 542.1 667.1 549.3 667.7L510.8 860.3 426.2 775.7ZM638.9 444.4H637.2A248 248 0 0 0 638.9 416.7V333.3A55.6 55.6 0 0 1 638.9 444.4ZM138.9 166.7A166.8 166.8 0 0 1 305.5 0H472.2A166.8 166.8 0 0 1 638.9 166.7V277.8H527.8A55.6 55.6 0 0 1 472.2 222.2V111.1H416.7V138.9A139 139 0 0 1 277.8 277.8H138.9ZM138.9 444.4A55.6 55.6 0 1 1 138.9 333.3V416.7A248 248 0 0 0 140.5 444.4ZM194.5 416.7V333.3H277.8A194.1 194.1 0 0 0 425.3 265.1 111.4 111.4 0 0 0 527.8 333.3H583.3V416.7A194.5 194.5 0 0 1 194.5 416.7ZM777.8 1000H0V916.6A250.4 250.4 0 0 1 174 678.5L222.9 922.1A27.8 27.8 0 0 0 242 943.2 28.4 28.4 0 0 0 250.1 944.4 27.8 27.8 0 0 0 269.7 936.3L389 817 508.2 936.3A27.8 27.8 0 0 0 554.9 922.1L603.9 678.5A250.5 250.5 0 0 1 777.8 916.6ZM943.7 123A22 22 0 0 1 965.7 101H1000.6L899.6 0 798.6 101H833.5A22 22 0 0 1 855.6 123 264.2 264.2 0 0 1 738 342.7 220.4 220.4 0 0 0 943.7 123Z", + "width": 1001 + }, + "search": [ + "refer-patient" + ] + }, + { + "uid": "ca99a2d770f0d7e6ba7a90eb792ebd4d", + "css": "underweight-bmi-r", + "code": 59472, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M182.4 571.7C181.1 589.1 191.1 680.9 196.2 716.9 198.7 734 205.4 761.8 203 776.5A255.5 255.5 0 0 0 200.4 839.2C201.6 848.6 205.4 892 200 907.9 197.2 916.3 192 958.9 192 958.9 178.6 999.1 186.1 997.1 186.1 997.1 190.3 1003.2 197.5 997.6 197.5 997.6A6.3 6.3 0 0 0 206.7 996.6C211.4 1001.2 216.8 996.1 216.8 996.1 222.7 999.7 228.1 993 228.1 993 231.5 995 232.3 992.5 232.3 992.5 242.4 991.7 226.7 953.5 226.7 953.5A122.1 122.1 0 0 1 230.4 900C255 813.7 256.3 790.8 246.5 758.3 243.7 748.9 243 745.2 244.3 741.1 247.2 731.7 245.1 693.9 248.7 678.8 255.6 649.9 262.4 576.4 266 542.1 270.7 495.9 249 434 249 434 244.2 408.8 251.2 319 251.2 319A126.2 126.2 0 0 1 260.6 368.6C259 401.9 283.2 452.7 283.2 452.7A149.5 149.5 0 0 1 299.3 495.1C299.3 501.1 298.2 515.8 298.2 515.8L298.6 528.5C298.8 531.8 300.4 543 300.1 548.4 298.3 581.6 302.8 575.4 302.8 575.4 306.5 575.4 310.7 548.6 310.7 548.6A135.2 135.2 0 0 0 312.4 583.9C316.2 593.2 318.9 582.3 319 580.1 320 537.8 322.1 548.9 322.1 548.9 324.2 583.2 326.8 591 331.4 588.3 334.9 586.3 331.7 547.1 331.7 547.1 337.7 570.4 342.2 574.1 342.2 574.1 352.1 582.3 346 559.7 344.6 555.2A148.3 148.3 0 0 1 337.1 523C346.2 544.5 353.1 543.7 353.1 543.7 362 540.3 345.3 510 335.6 495.4A121.6 121.6 0 0 1 322.3 472.2 328.7 328.7 0 0 1 317 430.2 145.7 145.7 0 0 0 308.1 375.9C294.6 350.3 292.1 302.5 292.1 302.5L291.5 221.9C286.7 166.9 252.5 166.5 252.5 166.5 217.8 160.4 213 147.2 213 147.2 205.7 134.7 209.9 110.8 209.9 110.8A47.8 47.8 0 0 0 218.3 89.4C228.4 80.2 227.9 66.8 223.3 66.9 219.5 67.1 220.4 63.4 220.4 63.4 226.6 3.1 181.3 0 181.3 0H174.4S129 3.1 135.4 63.4C135.4 63.4 136.2 67.1 132.5 67 127.8 66.8 127.4 80.3 137.4 89.4A47.7 47.7 0 0 0 145.9 110.8S150.1 134.8 142.8 147.2C142.8 147.2 138 160.5 103.3 166.6 103.3 166.6 69 167 64.3 222L63.7 302.6S61.1 350.3 47.5 375.9A146.2 146.2 0 0 0 38.8 430.2 330.8 330.8 0 0 1 33.4 472.3 120.2 120.2 0 0 1 20.1 495.5C10.2 510-6.3 540.2 2.5 543.7 2.5 543.7 9.4 544.5 18.5 523.1A146.9 146.9 0 0 1 11.1 555.2C9.6 559.6 3.5 582.3 13.4 574.2 13.4 574.2 18 570.4 23.9 547.1 23.9 547.1 20.7 586.4 24.3 588.4 28.9 591 31.5 583.3 33.6 548.9 33.6 548.9 35.7 537.8 36.7 580.2 36.7 582.4 39.4 593.3 43.2 584A133.3 133.3 0 0 0 45 548.6S49.1 575.4 52.9 575.4C52.9 575.4 57.4 581.7 55.6 548.4A197.2 197.2 0 0 1 57.1 528.6L57.5 515.8S56.4 501.2 56.4 495.1A149.3 149.3 0 0 1 72.5 452.7S96.7 401.8 95.2 368.6A126.5 126.5 0 0 1 104.6 319S111.5 408.8 106.8 434C106.8 434 85 495.9 89.8 542.1 93.4 576.5 100.2 649.9 107.2 678.8 110.8 693.8 108.6 731.7 111.5 741.1 112.9 745.2 112.2 749 109.4 758.3 99.6 790.8 100.8 813.7 125.4 900A121 121 0 0 1 129.2 953.5S113.5 991.8 123.5 992.5C123.5 992.5 124.3 995.1 127.7 993.1 127.7 993.1 133.2 999.7 139.1 996.1 139.1 996.1 144.5 1001.3 149.2 996.7A6.2 6.2 0 0 0 158.3 997.6S165.5 1003.3 169.7 997.2C169.7 997.2 177.2 999.2 163.8 959 163.8 959 158.6 916.3 155.8 908 150.4 892.1 154.2 848.6 155.4 839.3A260 260 0 0 0 152.8 776.6C150.4 761.8 157.1 734 159.6 717 164.7 681 174.7 589.1 173.4 571.8L177.5 573.5A7.6 7.6 0 0 0 182.4 571.7Z", + "width": 356 + }, + "search": [ + "underweight-bmi-r" + ] + }, + { + "uid": "0fd731d3861d150403acb49569e7c904", + "css": "weight", + "code": 59473, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M909.1 0H90.9A91 91 0 0 0 0 90.9V909.1A91 91 0 0 0 90.9 1000H909.1A91 91 0 0 0 1000 909.1V90.9A91 91 0 0 0 909.1 0ZM789.3 288.3L660.8 416.9A22.7 22.7 0 0 1 628.6 416.9 184.8 184.8 0 0 0 455.8 371.1L407 263.5A22.7 22.7 0 1 0 365.7 282.3L413.4 387.2A169.3 169.3 0 0 0 371.6 416.9 22.7 22.7 0 0 1 339.5 416.9L210.7 288.3A22.7 22.7 0 0 1 210.7 256.2 409 409 0 0 1 789.3 256.2 22.7 22.7 0 0 1 789.3 288.3Z", + "width": 1000 + }, + "search": [ + "weight" + ] + }, + { + "uid": "ac386cc9c3278233c6dacad80c722da5", + "css": "blood-pressure", + "code": 59474, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M672.7 709.1A145.5 145.5 0 1 0 818.2 854.6 145.5 145.5 0 0 0 672.7 709.1ZM724.2 828.9L685.6 867.5A18.2 18.2 0 1 1 659.8 841.7L698.4 803.1A18.2 18.2 0 0 1 724.2 828.9ZM872.7 236.4C770.7 236.4 690.9 292.4 690.9 363.7S770.7 491 872.7 491 1054.5 435 1054.5 363.7 974.7 236.4 872.7 236.4ZM972.7 381.8A18.2 18.2 0 0 1 954.6 363.7C954.6 350 914.9 327.3 872.7 327.3A18.2 18.2 0 1 1 872.7 291C921.1 291 990.9 316.8 990.9 363.7A18.2 18.2 0 0 1 972.7 381.8ZM655.8 345.5H563.7V18.2A18.2 18.2 0 0 0 545.4 0H218.2A18.2 18.2 0 0 0 200 18.2V109.1H18.2A18.2 18.2 0 0 0 0 127.3V781.8A18.2 18.2 0 0 0 18.2 800H200V854.5A18.2 18.2 0 0 0 218.2 872.7H491.8C491.8 866.7 490.9 860.7 490.9 854.5A120.6 120.6 0 0 1 491.8 836.4H236.4V800H418.2A18.2 18.2 0 0 0 436.4 781.8V127.3A18.2 18.2 0 0 0 418.2 109.1H236.4V36.4H527.3V363.6A18.2 18.2 0 0 0 545.5 381.8H655.9A130.5 130.5 0 0 1 655.8 345.5ZM272.7 272.7H345.5A18.2 18.2 0 1 1 345.5 309.1H272.7A18.2 18.2 0 1 1 272.7 272.7ZM272.7 600H345.5A18.2 18.2 0 1 1 345.5 636.4H272.7A18.2 18.2 0 1 1 272.7 600Z", + "width": 1055 + }, + "search": [ + "blood-pressure" + ] + }, + { + "uid": "3c9cc9a4258d3d419d7ad9e579cd42c3", + "css": "vital-signs", + "code": 59475, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M0 532.1V608.1H205.7A689.9 689.9 0 0 1 145.8 532.1ZM1151 532.1A690.1 690.1 0 0 1 1091 608.1H1296.7V532.1ZM420.4 222L545.9 598.4 590 532.1H699L802.2 284.8 913.5 532.3H1151A366.1 366.1 0 0 0 1218.2 324.2 318.2 318.2 0 0 0 971.8 5C843.9-20.1 726.9 46.1 648.4 183.9 570 46.6 453.5-19.1 325.8 5.6A322.2 322.2 0 0 0 78.5 324.2 366.1 366.1 0 0 0 145.8 532H317.1ZM804.8 475.7L749.7 608.1H630.7L522.9 769.6 420.5 462.3 371.9 608.1H205.7A2720.4 2720.4 0 0 0 486.1 863C529.5 899.1 648.4 1000 648.4 1000S767.4 899.1 810.6 863A2720.7 2720.7 0 0 0 1091 608.1H864.5Z", + "width": 1297 + }, + "search": [ + "vital-signs" + ] + }, + { + "uid": "a0eacf70f79e61160a5bdf698b3358bc", + "css": "ucaf", + "code": 59476, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M529.3 60V0H470.7V60C201.6 73.3 0 271.4 0 529.3V576.7L42.3 555.7A289.7 289.7 0 0 1 148.4 529.5 171.9 171.9 0 0 1 245.1 579.5L265.8 600 286.4 579.5A171.9 171.9 0 0 1 383.1 529.5 159.1 159.1 0 0 1 471 571.7V912.1A87.9 87.9 0 0 0 646.8 912.1V853.5H587.9V912.1A29.3 29.3 0 0 1 529.3 912.1V571.5A159.1 159.1 0 0 1 617.2 529.3 171.9 171.9 0 0 1 713.9 579.3L734.6 599.8 755.2 579.3A178.1 178.1 0 0 1 853.7 529.3 274.1 274.1 0 0 1 957.8 555.5L1000 576.7V529.3C1000 271.4 798.4 73.3 529.3 60Z", + "width": 1000 + }, + "search": [ + "ucaf" + ] + }, + { + "uid": "daaef425e99170daae1e6c67b843e599", + "css": "filter", + "code": 59477, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M376.3 472.5A61.7 61.7 0 0 1 392.5 514.3V969.1A30.9 30.9 0 0 0 445.1 991.1L572 845.7C589 825.4 598.4 815.2 598.4 795.1V514.4A62.2 62.2 0 0 1 614.6 472.6L978.6 77.6A46.4 46.4 0 0 0 944.5 0H46.5A46.3 46.3 0 0 0 12.4 77.6Z", + "width": 991 + }, + "search": [ + "filter" + ] + }, + { + "uid": "3c0db424e9aa58cd0ee5c3424b718630", + "css": "male-1", + "code": 59478, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M975.4 0H569.5A24.6 24.6 0 0 0 544.9 24.6V133.4A24.6 24.6 0 0 0 569.5 158H725.6L545 338.6A357.4 357.4 0 1 0 661.6 455.3L842.1 274.7V430.5A24.6 24.6 0 0 0 866.7 455.1H975.3A24.6 24.6 0 0 0 999.8 430.5V24.6A24.6 24.6 0 0 0 975.3 0ZM357.6 878.2A235.5 235.5 0 1 1 593.1 642.7 235.5 235.5 0 0 1 357.6 878.2Z", + "width": 1000 + }, + "search": [ + "male" + ] + }, + { + "uid": "d23d330639c6d971f3c52dafedcfc6c8", + "css": "female", + "code": 59479, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M864.9 747.5C966.6 645.7 999.8 626 975.5 601.7L892.8 518.9A24.6 24.6 0 0 0 857.8 518.9L746.8 629.8 666.7 549.7A359.2 359.2 0 1 0 549.9 667.8L629.7 747.5C528 849.3 494.8 869 519.1 893.3L601.4 975.9A24.6 24.6 0 0 0 636.4 975.9L746.8 865.3C866.3 984.8 884.6 1016.8 909 992.5 988.6 912.9 999.3 908.8 999.3 892.2S994.5 877.2 864.9 747.5ZM360.5 598.5A237.9 237.9 0 1 1 598.5 360.5 237.9 237.9 0 0 1 360.5 598.5Z", + "width": 999 + }, + "search": [ + "female" + ] + }, + { + "uid": "9909d0074e2de36b9ceca4513d5a81a2", + "css": "external-link", + "code": 59480, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M945 55A180.6 180.6 0 0 0 812.5 0H187.5A180.6 180.6 0 0 0 55 55 180.6 180.6 0 0 0-0.2 187.5V812.5A180.7 180.7 0 0 0 54.9 945 180.6 180.6 0 0 0 187.4 1000.1H812.5A187.9 187.9 0 0 0 1000 812.5V187.5A180.7 180.7 0 0 0 945 55ZM833.4 520.8A39 39 0 0 1 808 559.2 45.3 45.3 0 0 1 791.7 562.5 38.7 38.7 0 0 1 762.6 550.3L668.6 456.4 321 804A40.9 40.9 0 0 1 262.4 804L196 737.6A40.9 40.9 0 0 1 196 679.1L543.6 331.4 449.9 237.6A37.6 37.6 0 0 1 440.8 192.1 39 39 0 0 1 479.3 166.7H791.8A42.2 42.2 0 0 1 833.5 208.3V520.8Z", + "width": 1000 + }, + "search": [ + "external-link" + ] + }, + { + "uid": "f0593bb8f5b8b0b186421ee68844bdf4", + "css": "verify-face-2", + "code": 59481, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M724.2 694.2L587.6 666.9A31.2 31.2 0 0 1 562.5 636.3V604.9A369.6 369.6 0 0 0 588.7 558.3 267.2 267.2 0 0 1 609.9 520.3 201.7 201.7 0 0 0 673.3 420.4 93.1 93.1 0 0 0 664.2 347 551.6 551.6 0 0 0 653.6 220.2 137.4 137.4 0 0 0 621.1 119.6 96.5 96.5 0 0 0 563.1 95.2 96.8 96.8 0 0 1 541.9 90.3 218.8 218.8 0 0 0 436.3 62.5 245.8 245.8 0 0 0 218.7 212 367.2 367.2 0 0 0 210.1 325.2L209.3 347.1A99.4 99.4 0 0 0 201.4 420.4 201.2 201.2 0 0 0 264.7 520.4 275.4 275.4 0 0 1 286.2 558.3 379.2 379.2 0 0 0 312.6 604.9V636.2A31.4 31.4 0 0 1 287.5 666.9L150.8 694.2A188.1 188.1 0 0 0 0 878.1V937.5A62.6 62.6 0 0 0 62.5 1000.2H812.5A62.5 62.5 0 0 0 875 937.7V878.1A188.2 188.2 0 0 0 724.2 694.2ZM156.3 0H31.3A31.3 31.3 0 0 0 0 31.3V218.8A31.3 31.3 0 0 0 62.5 218.8V62.5H156.3A31.3 31.3 0 0 0 156.3 0ZM156.3 562.5H62.5V406.2A31.3 31.3 0 0 0 0 406.2V593.7A31.3 31.3 0 0 0 31.3 625H156.3A31.3 31.3 0 1 0 156.3 562.5ZM843.8 0H718.8A31.3 31.3 0 0 0 718.8 62.5H812.5V218.8A31.3 31.3 0 0 0 875 218.8V31.3A31.3 31.3 0 0 0 843.8 0ZM843.8 375A31.3 31.3 0 0 0 812.5 406.2V562.5H718.7A31.3 31.3 0 0 0 718.7 625H843.7A31.3 31.3 0 0 0 875 593.7V406.2A31.3 31.3 0 0 0 843.8 375Z", + "width": 875 + }, + "search": [ + "verify-face" + ] + }, + { + "uid": "e69ad471bed67e4f9115dc1e2980e44f", + "css": "verify-sms-2", + "code": 59482, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M900 0H100A100.3 100.3 0 0 0 0 100V1000L200 800H900A100.3 100.3 0 0 0 1000 700V100A100.3 100.3 0 0 0 900 0ZM350 450H250V350H350ZM550 450H450V350H550ZM750 450H650V350H750Z", + "width": 1000 + }, + "search": [ + "verify-sms" + ] + }, + { + "uid": "0736a51e3060fb655273b1c12012240d", + "css": "home", + "code": 59483, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1066.3 519.6A79.1 79.1 0 0 1 991.7 571.5H964.4V964.3A35.7 35.7 0 0 1 928.7 1000H714.4V750A178.6 178.6 0 0 0 357.2 750V1000H142.9A35.7 35.7 0 0 1 107.2 964.3V571.5H79.9A80 80 0 0 1 27.4 431.5L444.5 36.3A132.8 132.8 0 0 1 627.1 36.3L1045.2 432.3A78.7 78.7 0 0 1 1066.3 519.6Z", + "width": 1072 + }, + "search": [ + "home" + ] + }, + { + "uid": "3f56029b468ab7c3e63c354d71d9928a", + "css": "verify-finger-2", + "code": 59484, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M891.9 0H108.1A108.2 108.2 0 0 0 0 108.1V891.9A108.2 108.2 0 0 0 108.1 1000H891.9A108.2 108.2 0 0 0 1000 891.9V108.1A108.2 108.2 0 0 0 891.9 0ZM185.9 192.6C393.8 41.7 612.9 43.3 817.7 195.2A29.3 29.3 0 0 1 800.1 248.1C766.9 248.1 540.5 7.4 220.2 240A29.3 29.3 0 0 1 185.7 192.6ZM459 946A29.3 29.3 0 0 1 418.2 938.6C377.1 878.9 283.2 812.1 283.2 687.5A225.3 225.3 0 0 1 500 454.9 225.3 225.3 0 0 1 716.8 687.5V718.9A29.3 29.3 0 0 1 658.2 718.9V687.6A166.8 166.8 0 0 0 500 513.8 166.8 166.8 0 0 0 341.8 687.5C341.8 828.8 521.5 902.7 459 946ZM823.1 794.4A153.5 153.5 0 0 1 533.2 718.9C533.2 592.6 446.8 635.1 465.9 711.8A29.3 29.3 0 0 1 409.1 725.9C369.2 566.3 591.8 501.6 591.8 718.9A94.5 94.5 0 0 0 665.2 816.5C800.8 848.5 841 624.8 705.8 480.7 518.8 281.3 216.8 435 216.8 671.9A237 237 0 0 0 258.2 826.8 29.3 29.3 0 0 1 210.6 860.8 298.5 298.5 0 0 1 158.2 671.9 347.5 347.5 0 0 1 500.1 330.1C752.9 330.1 913.6 613.5 823.1 794.3ZM842.7 431.8A29.3 29.3 0 0 1 802.7 420.9C744.4 318.7 603.2 263.8 500 263.8A419.4 419.4 0 0 0 196.2 422.6 29.3 29.3 0 0 1 147.5 390.1 474.9 474.9 0 0 1 499.9 205.2C716.9 205.2 910.7 392.8 842.5 431.8Z", + "width": 1000 + }, + "search": [ + "verify-finger" + ] + }, + { + "uid": "0227a760fc30f34a1e45269b42063066", + "css": "dr-reply-active", + "code": 59485, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1023.2 547.7H1029.4A86.7 86.7 0 0 1 1162.4 438.2L1200.4 476.2V101.1A101.2 101.2 0 0 0 1099.2 0H101.2A101.2 101.2 0 0 0 0 101.1V799A101.2 101.2 0 0 0 101.2 900.2H798.6A247.7 247.7 0 0 1 1023.1 547.8ZM251.2 136.3H949.2L600.1 392.2ZM1266.6 603.7L1131.7 468.8A43.4 43.4 0 1 0 1070.5 529.9L1131.5 590.9H1023.1A204.5 204.5 0 0 0 1023.1 999.9 43.4 43.4 0 1 0 1023.1 913.2 117.9 117.9 0 0 1 1023.1 677.1H1131.5L1070.5 738A43.4 43.4 0 0 0 1131.7 799.2L1266.6 664.3A43.4 43.4 0 0 0 1266.6 603.1Z", + "width": 1279 + }, + "search": [ + "dr-reply-active" + ] + }, + { + "uid": "127b8293712c90eb2fb4157aa01060d7", + "css": "dr-reply", + "code": 59486, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1023.2 547.7H1029.4A86.7 86.7 0 0 1 1162.4 438.2L1200.4 476.2V101.1A101.2 101.2 0 0 0 1099.2 0H101.2A101.2 101.2 0 0 0 0 101.1V799A101.2 101.2 0 0 0 101.2 900.2H798.6A247.7 247.7 0 0 1 1023.1 547.8ZM251.2 136.3H949.2L600.1 392.2ZM1266.6 603.7L1131.7 468.8A43.4 43.4 0 1 0 1070.5 529.9L1131.5 590.9H1023.1A204.5 204.5 0 0 0 1023.1 999.9 43.4 43.4 0 1 0 1023.1 913.2 117.9 117.9 0 0 1 1023.1 677.1H1131.5L1070.5 738A43.4 43.4 0 0 0 1131.7 799.2L1266.6 664.3A43.4 43.4 0 0 0 1266.6 603.1Z", + "width": 1279 + }, + "search": [ + "dr-reply" + ] + }, + { + "uid": "5a9d08cf650294b80c159706c83a5dd9", + "css": "schedule-active", + "code": 59487, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M900 0H99.9A100.3 100.3 0 0 0 0 99.9V900A100.3 100.3 0 0 0 99.9 999.8H900A100.3 100.3 0 0 0 999.8 900V99.9A100.3 100.3 0 0 0 900 0ZM269.9 880H116.7V743.8H269.9V880ZM269.9 698.1H116.7V561.9H269.9V698.1ZM258.3 151.6A42.5 42.5 0 1 1 300.8 109.1 42.4 42.4 0 0 1 258.3 151.6ZM474.3 880H321.1V743.8H474.3ZM474.3 698.1H321.1V561.9H474.3ZM474.3 516.3H321.1V380H474.3ZM457.6 109.1A42.4 42.4 0 1 1 500 151.5 42.4 42.4 0 0 1 457.6 109.1ZM678.9 698.1H525.6V561.9H679.1V698.1ZM678.9 516.3H525.6V380H679.1V516.3ZM699 109.1A42.4 42.4 0 1 1 741.5 151.5 42.4 42.4 0 0 1 699 109.1ZM883.2 698.1H730.1V561.9H883.3ZM883.2 516.3H730.1V380H883.3Z", + "width": 1000 + }, + "search": [ + "schedule-active" + ] + }, + { + "uid": "819759b0d0d7626d8231f54569a21da4", + "css": "schedule", + "code": 59488, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M900 0H99.9A100.3 100.3 0 0 0 0 99.9V900A100.3 100.3 0 0 0 99.9 999.8H900A100.3 100.3 0 0 0 999.8 900V99.9A100.3 100.3 0 0 0 900 0ZM269.9 880H116.7V743.8H269.9V880ZM269.9 698.1H116.7V561.9H269.9V698.1ZM258.3 151.6A42.5 42.5 0 1 1 300.8 109.1 42.4 42.4 0 0 1 258.3 151.6ZM474.3 880H321.1V743.8H474.3ZM474.3 698.1H321.1V561.9H474.3ZM474.3 516.3H321.1V380H474.3ZM457.6 109.1A42.4 42.4 0 1 1 500 151.5 42.4 42.4 0 0 1 457.6 109.1ZM678.9 698.1H525.6V561.9H679.1V698.1ZM678.9 516.3H525.6V380H679.1V516.3ZM699 109.1A42.4 42.4 0 1 1 741.5 151.5 42.4 42.4 0 0 1 699 109.1ZM883.2 698.1H730.1V561.9H883.3ZM883.2 516.3H730.1V380H883.3Z", + "width": 1000 + }, + "search": [ + "schedule" + ] + }, + { + "uid": "0de3ebd2d27563050dd71e75e23835d6", + "css": "qr-reader-active", + "code": 59489, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M50 400A50 50 0 0 0 100 350V150A50 50 0 0 1 150 100H350A50 50 0 1 0 350 0H150A150 150 0 0 0 0 150V350A50 50 0 0 0 50 400ZM850 0H650A50 50 0 0 0 650 100H850A50 50 0 0 1 900 150V350A50 50 0 1 0 1000 350V150A150 150 0 0 0 850 0ZM950 600A50 50 0 0 0 900 650V850A50 50 0 0 1 850 900H650A50 50 0 0 0 650 1000H850A150 150 0 0 0 1000 850V650A50 50 0 0 0 950 600ZM350 900H150A50 50 0 0 1 100 850V650A50 50 0 0 0 0 650V850A150 150 0 0 0 150 1000H350A50 50 0 1 0 350 900Z", + "width": 1000 + }, + "search": [ + "qr-reader-active" + ] + }, + { + "uid": "0ea0e7f32832e2d0fbafc766c3c26d93", + "css": "qr-reader", + "code": 59490, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M50 400A50 50 0 0 0 100 350V150A50 50 0 0 1 150 100H350A50 50 0 1 0 350 0H150A150 150 0 0 0 0 150V350A50 50 0 0 0 50 400ZM850 0H650A50 50 0 0 0 650 100H850A50 50 0 0 1 900 150V350A50 50 0 1 0 1000 350V150A150 150 0 0 0 850 0ZM950 600A50 50 0 0 0 900 650V850A50 50 0 0 1 850 900H650A50 50 0 0 0 650 1000H850A150 150 0 0 0 1000 850V650A50 50 0 0 0 950 600ZM350 900H150A50 50 0 0 1 100 850V650A50 50 0 0 0 0 650V850A150 150 0 0 0 150 1000H350A50 50 0 1 0 350 900Z", + "width": 1000 + }, + "search": [ + "qr-reader" + ] + }, + { + "uid": "8f9c01cc9212f68e9b591223b5e08f55", + "css": "home-active", + "code": 59491, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1066.3 519.6A79.1 79.1 0 0 1 991.7 571.5H964.4V964.3A35.7 35.7 0 0 1 928.7 1000H714.4V750A178.6 178.6 0 0 0 357.2 750V1000H142.9A35.7 35.7 0 0 1 107.2 964.3V571.5H79.9A80 80 0 0 1 27.4 431.5L444.5 36.3A132.8 132.8 0 0 1 627.1 36.3L1045.2 432.3A78.7 78.7 0 0 1 1066.3 519.6Z", + "width": 1072 + }, + "search": [ + "home-active" + ] + }, + { + "uid": "70489544a83221e1141db519826351b5", + "css": "arrow-forward", + "code": 59492, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1357 455.8L919.2 18.3A62.5 62.5 0 1 0 830.8 106.7L1161.6 437.6H62.5A62.5 62.5 0 1 0 62.5 562.6H1161.7L830.9 893.4A62.5 62.5 0 1 0 919.3 981.8L1357 544.2A62.5 62.5 0 0 0 1357 455.8Z", + "width": 1375 + }, + "search": [ + "arrow-forward" + ] + }, + { + "uid": "d8e875c19306114380e834be3d91f71e", + "css": "heart-rate", + "code": 59493, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M0 532.1V608.1H205.7A689.9 689.9 0 0 1 145.8 532.1ZM1151 532.1A690.1 690.1 0 0 1 1091 608.1H1296.7V532.1ZM420.4 222L545.9 598.4 590 532.1H699L802.2 284.8 913.5 532.3H1151A366.1 366.1 0 0 0 1218.2 324.2 318.2 318.2 0 0 0 971.8 5C843.9-20.1 726.9 46.1 648.4 183.9 570 46.6 453.5-19.1 325.8 5.6A322.2 322.2 0 0 0 78.5 324.2 366.1 366.1 0 0 0 145.8 532H317.1ZM804.8 475.7L749.7 608.1H630.7L522.9 769.6 420.5 462.3 371.9 608.1H205.7A2720.4 2720.4 0 0 0 486.1 863C529.5 899.1 648.4 1000 648.4 1000S767.4 899.1 810.6 863A2720.7 2720.7 0 0 0 1091 608.1H864.5Z", + "width": 1297 + }, + "search": [ + "heart-rate" + ] + }, + { + "uid": "e2f6f0a56d4570c777c8bd5c50e38ea7", + "css": "menu_icon_active-1", + "code": 59494, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M406.7 0H83.2A83.3 83.3 0 0 0 0 83.2V406.7A83.3 83.3 0 0 0 83.2 489.9H406.7A83.3 83.3 0 0 0 489.9 406.7V83.2A83.3 83.3 0 0 0 406.7 0ZM406.7 449.1H83.2A42.4 42.4 0 0 1 40.8 406.7V83.2A42.4 42.4 0 0 1 83.2 40.8H406.7A42.4 42.4 0 0 1 449 83.2V406.7H449A42.4 42.4 0 0 1 406.7 449.1ZM916.8 0H593.3A83.3 83.3 0 0 0 510.1 83.2V406.7A83.3 83.3 0 0 0 593.3 489.9H916.8A83.3 83.3 0 0 0 1000 406.7V83.2A83.3 83.3 0 0 0 916.8 0ZM959.1 406.7A42.4 42.4 0 0 1 916.8 449.1H593.3A42.4 42.4 0 0 1 550.9 406.7V83.2A42.4 42.4 0 0 1 593.3 40.8H916.8A42.4 42.4 0 0 1 959.1 83.2ZM406.7 510.1H83.2A83.3 83.3 0 0 0 0 593.3V916.8A83.3 83.3 0 0 0 83.2 1000H406.7A83.3 83.3 0 0 0 489.9 916.8V593.3A83.3 83.3 0 0 0 406.7 510.1ZM406.7 959.2H83.2A42.4 42.4 0 0 1 40.8 916.8V593.3A42.4 42.4 0 0 1 83.2 550.9H406.7A42.4 42.4 0 0 1 449 593.3V916.8H449A42.4 42.4 0 0 1 406.7 959.1ZM916.8 510.1H593.3A83.3 83.3 0 0 0 510.1 593.3V916.8A83.3 83.3 0 0 0 593.3 1000H916.8A83.3 83.3 0 0 0 1000 916.8V593.3A83.3 83.3 0 0 0 916.8 510.1ZM959.1 916.8A42.4 42.4 0 0 1 916.8 959.2H593.3A42.4 42.4 0 0 1 550.9 916.8V593.3A42.4 42.4 0 0 1 593.3 550.9H916.8A42.4 42.4 0 0 1 959.1 593.3Z", + "width": 1000 + }, + "search": [ + "menu_icon_active" + ] + }, + { + "uid": "f7eb1344b3a40f36bb4d32cdd0d76496", + "css": "message_icon-1", + "code": 59495, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1182.9 44.3A100 100 0 0 0 1099.9 0.1H100A100 100 0 0 0 0 100V900A100 100 0 0 0 100 1000H1110.4A100 100 0 0 0 1200 900V100A100 100 0 0 0 1182.9 44.3ZM99.9 40H1100A60 60 0 0 1 1138.8 54.2L1061.2 128.2 734 440 612.8 555.7A20 20 0 0 1 589 555.7L466 440 60 54.3A60 60 0 0 1 100 40ZM39.9 90.4L423.2 454 40 820V100A59.7 59.7 0 0 1 40 90.4ZM1160 900A60 60 0 0 1 1107.6 960H100A60 60 0 0 1 40 900V874.6L452.2 481.6 562.4 586.4A60 60 0 0 0 571 592.2 58.4 58.4 0 0 0 600 600 63 63 0 0 0 640 586L748.8 482.4 1160 874.2ZM1160 100V819L776.8 454.7 1160 90.1A61.4 61.4 0 0 1 1160 100Z", + "width": 1200 + }, + "search": [ + "message_icon" + ] + }, + { + "uid": "ed4536ee2a51bde352570554ae089661", + "css": "message_icon_active-1", + "code": 59496, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1182.9 44.3A100 100 0 0 0 1099.9 0.1H100A100 100 0 0 0 0 100V900A100 100 0 0 0 100 1000H1110.4A100 100 0 0 0 1200 900V100A100 100 0 0 0 1182.9 44.3ZM99.9 40H1100A60 60 0 0 1 1138.8 54.2L1061.2 128.2 734 440 612.8 555.7A20 20 0 0 1 589 555.7L466 440 60 54.3A60 60 0 0 1 100 40ZM39.9 90.4L423.2 454 40 820V100A59.7 59.7 0 0 1 40 90.4ZM1160 900A60 60 0 0 1 1107.6 960H100A60 60 0 0 1 40 900V874.6L452.2 481.6 562.4 586.4A60 60 0 0 0 571 592.2 58.4 58.4 0 0 0 600 600 63 63 0 0 0 640 586L748.8 482.4 1160 874.2ZM1160 100V819L776.8 454.7 1160 90.1A61.4 61.4 0 0 1 1160 100Z", + "width": 1200 + }, + "search": [ + "message_icon_active" + ] + }, + { + "uid": "f585c0032b4aa288a0dfb78f502d4d1c", + "css": "scdedule_icon_active-1", + "code": 59497, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M445.8 693.2A28.8 28.8 0 0 0 486.5 693.2L589.2 590.5A28.8 28.8 0 1 0 548.5 549.8L466.1 632.1 428.6 594.6A28.8 28.8 0 1 0 387.9 635.2ZM445.8 693.2M488.5 849.9A228.4 228.4 0 1 0 260.1 621.5 228.7 228.7 0 0 0 488.5 849.9ZM488.5 450.6A170.8 170.8 0 1 1 317.6 621.5 171 171 0 0 1 488.5 450.6ZM488.5 450.6M881.5 62.9H827.7V29.5A29.5 29.5 0 0 0 768.6 29.5V62.9H710.6V29.5A29.5 29.5 0 0 0 651.5 29.5V62.9H325.5V29.5A29.5 29.5 0 0 0 266.4 29.5V62.9H208.4V29.5A29.5 29.5 0 0 0 149.4 29.5V62.9H95.5A95.6 95.6 0 0 0 0 158.4V904.5A95.6 95.6 0 0 0 95.5 1000H881.5A95.6 95.6 0 0 0 976.9 904.5V158.4A95.6 95.6 0 0 0 881.5 62.9ZM918 904.5A36.5 36.5 0 0 1 881.5 940.9H95.5A36.5 36.5 0 0 1 59 904.5V308.4H917.9ZM59.1 158.4A36.5 36.5 0 0 1 95.5 121.9H149.4V155.3A29.5 29.5 0 0 0 208.4 155.3V121.9H266.4V155.3A29.5 29.5 0 0 0 325.5 155.3V121.9H651.5V155.3A29.5 29.5 0 0 0 710.6 155.3V121.9H768.6V155.3A29.5 29.5 0 0 0 827.7 155.3V121.9H881.5A36.5 36.5 0 0 1 918 158.4V249.3H59.1ZM59.1 158.4", + "width": 977 + }, + "search": [ + "scdedule_icon_active" + ] + }, + { + "uid": "cc3ade5c55f86a777648c695856d7bb6", + "css": "ovrweight-bmi-r-1", + "code": 59498, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M240.4 571.7C238.7 589.1 251.9 680.9 258.6 716.9 261.9 734 270.7 761.8 267.5 776.5A194.7 194.7 0 0 0 264.2 839.2C265.7 848.6 270.7 892 263.6 907.9A454.8 454.8 0 0 0 253.1 958.9C235.3 999.1 245.3 997.1 245.3 997.1 250.8 1003.2 260.3 997.6 260.3 997.6A9.9 9.9 0 0 0 272.4 996.6 12 12 0 0 0 285.7 996.1 14.6 14.6 0 0 0 300.6 993C305.1 995 306.1 992.5 306.1 992.5 319.5 991.7 298.7 953.5 298.7 953.5A94.6 94.6 0 0 1 303.6 900C336.1 813.7 337.7 790.8 324.7 758.3 321.1 748.9 320.2 745.2 321.8 741.1 325.7 731.7 322.9 693.9 327.6 678.8 336.8 649.9 345.8 576.4 350.5 542.1 356.8 495.9 328.1 434 328.1 434 321.9 408.8 331.1 319 331.1 319 343.9 336.9 343.4 368.6 343.4 368.6 341.4 401.9 373.3 452.7 373.3 452.7A128.3 128.3 0 0 1 394.5 495.1C394.5 501.1 393 515.8 393 515.8L393.6 528.5A163.7 163.7 0 0 1 395.6 548.4C393.2 581.6 399.1 575.4 399.1 575.4 404.1 575.4 409.5 548.6 409.5 548.6 409.5 555.5 407.6 576.1 411.8 583.9 416.8 593.2 420.4 582.3 420.5 580.1 421.8 537.8 424.6 548.9 424.6 548.9 427.4 583.2 430.8 591 436.8 588.3 441.4 586.3 437.2 547.1 437.2 547.1 445.1 570.4 451.1 574.1 451.1 574.1 464.1 582.3 456.1 559.7 454.3 555.2A118.2 118.2 0 0 1 444.3 523C456.4 544.5 465.4 543.7 465.4 543.7 477.2 540.3 455.1 510 442.3 495.4A118.3 118.3 0 0 1 424.7 472.2 253.7 253.7 0 0 1 417.7 430.2C416.5 392.3 406.1 375.9 406.1 375.9 388.2 350.3 384.9 302.5 384.9 302.5L384.1 221.9C377.8 166.9 332.7 166.5 332.7 166.5 287.1 160.5 280.7 147.3 280.7 147.3 271 134.8 276.6 110.8 276.6 110.8A41.5 41.5 0 0 0 287.7 89.4C301 80.3 300.4 66.9 294.2 67 289.3 67.1 290.4 63.4 290.4 63.4 298.7 3.1 239 0 239 0H229.9S170.1 3.1 178.4 63.4C178.4 63.4 179.6 67.1 174.6 67 168.4 66.8 167.9 80.3 181.1 89.4A41.4 41.4 0 0 0 192.3 110.8S197.8 134.8 188.1 147.2C188.1 147.2 181.8 160.5 136.1 166.6 136.1 166.6 90.9 167 84.7 222L83.8 302.6S80.5 350.3 62.6 375.9C62.6 375.9 52.3 392.4 51.1 430.2A255.3 255.3 0 0 1 44 472.3 117.1 117.1 0 0 1 26.5 495.5C13.5 510-8.4 540.2 3.3 543.7 3.3 543.7 12.5 544.5 24.4 523.1A117 117 0 0 1 14.6 555.2C12.7 559.6 4.6 582.3 17.7 574.2 17.7 574.2 23.7 570.4 31.5 547.1 31.5 547.1 27.3 586.4 32 588.4 38.1 591 41.5 583.3 44.2 548.9 44.2 548.9 47.1 537.8 48.4 580.2 48.4 582.4 52 593.3 57 584 61.2 576.2 59.3 555.5 59.3 548.6 59.3 548.6 64.7 575.4 69.7 575.4 69.7 575.4 75.7 581.7 73.2 548.4A150.7 150.7 0 0 1 75.2 528.6L75.8 515.8S74.3 501.2 74.3 495.1A128.1 128.1 0 0 1 95.5 452.7S127.5 401.9 125.4 368.7C125.4 368.7 125 337 137.8 319 137.8 319 146.9 408.8 140.7 434 140.7 434 112 496 118.3 542.2 123 576.5 132 649.9 141.2 678.9 145.9 693.9 143.1 731.7 146.9 741.2 148.7 745.3 147.8 749.1 144 758.4 131.2 790.8 132.9 813.7 165.3 900A93.8 93.8 0 0 1 170.2 953.5S149.5 991.7 162.7 992.5C162.7 992.5 163.8 995 168.3 993A14.6 14.6 0 0 0 183.2 996.1 12 12 0 0 0 196.5 996.6 9.9 9.9 0 0 0 208.6 997.6S218 1003.3 223.6 997.1C223.6 997.1 233.5 999.1 215.8 958.9A452.6 452.6 0 0 0 205.3 907.9C198.2 892 203.2 848.5 204.7 839.2A198.1 198.1 0 0 0 201.4 776.5C198.1 761.8 207 734 210.2 716.9 217 680.9 230.2 589.1 228.5 571.7L233.9 573.4A11.9 11.9 0 0 0 240.4 571.7Z", + "width": 469 + }, + "search": [ + "ovrweight-bmi-r" + ] + }, + { + "uid": "0032e9701d42cc0d1967b6a1256c2bbe", + "css": "temperature-1", + "code": 59500, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M394.7 0A131.7 131.7 0 0 1 526.3 131.8V686.9A187 187 0 0 1 579 815.8 184.2 184.2 0 1 1 263.2 686.9V131.6A131.4 131.4 0 0 1 394.7 0ZM394.7 315.8A26.5 26.5 0 0 0 368.4 342.1V741.3A79 79 0 1 0 473.7 815.8 79.9 79.9 0 0 0 421.1 741.3V342.1A26.7 26.7 0 0 0 394.7 315.8ZM184.2 631.6A26.3 26.3 0 1 1 184.2 684.3H52.6A26.3 26.3 0 1 1 52.6 631.6ZM710.6 289.6A105.3 105.3 0 0 1 815.7 394.7 25.8 25.8 0 0 1 789.5 422.3 26.5 26.5 0 0 1 763.1 394.9 52.6 52.6 0 0 0 657.9 394.9V553A52.6 52.6 0 1 0 763.2 553 26.3 26.3 0 0 1 815.8 553 105.3 105.3 0 0 1 605.3 553V394.7A105.3 105.3 0 0 1 710.6 289.6ZM184.2 552.6A26.3 26.3 0 1 1 184.2 605.3H157.9A26.3 26.3 0 0 1 157.9 552.6ZM184.2 447.4A26.3 26.3 0 0 1 210.6 473.7 26.7 26.7 0 0 1 184.2 500H105.3A26.3 26.3 0 0 1 78.9 473.7 26 26 0 0 1 105.3 447.4ZM921.1 289.5A52.6 52.6 0 1 1 868.5 342.1 52.6 52.6 0 0 1 921.1 289.6ZM184.2 342.1A26.3 26.3 0 1 1 184.2 394.8H78.9A26.3 26.3 0 0 1 78.9 342.1ZM184.2 236.9A26.3 26.3 0 0 1 184.2 289.5H131.6A26.3 26.3 0 0 1 131.6 236.9ZM184.2 131.6A26.3 26.3 0 1 1 184.2 184.3H26.3A26.3 26.3 0 1 1 26.3 131.6Z", + "width": 974 + }, + "search": [ + "temperature" + ] + }, + { + "uid": "208bf58358a06153619709f72e19051d", + "css": "underweight-bmi-1", + "code": 59499, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M182.4 571.7C181.1 589.1 191.1 680.9 196.2 716.9 198.7 734 205.4 761.8 203 776.5A255.5 255.5 0 0 0 200.4 839.2C201.6 848.6 205.4 892 200 907.9 197.2 916.3 192 958.9 192 958.9 178.6 999.1 186.1 997.1 186.1 997.1 190.3 1003.2 197.5 997.6 197.5 997.6A6.3 6.3 0 0 0 206.7 996.6C211.4 1001.2 216.8 996.1 216.8 996.1 222.7 999.7 228.1 993 228.1 993 231.5 995 232.3 992.5 232.3 992.5 242.4 991.7 226.7 953.5 226.7 953.5A122.1 122.1 0 0 1 230.4 900C255 813.7 256.3 790.8 246.5 758.3 243.7 748.9 243 745.2 244.3 741.1 247.2 731.7 245.1 693.9 248.7 678.8 255.6 649.9 262.4 576.4 266 542.1 270.7 495.9 249 434 249 434 244.2 408.8 251.2 319 251.2 319A126.2 126.2 0 0 1 260.6 368.6C259 401.9 283.2 452.7 283.2 452.7A149.5 149.5 0 0 1 299.3 495.1C299.3 501.1 298.2 515.8 298.2 515.8L298.6 528.5C298.8 531.8 300.4 543 300.1 548.4 298.3 581.6 302.8 575.4 302.8 575.4 306.5 575.4 310.7 548.6 310.7 548.6A135.2 135.2 0 0 0 312.4 583.9C316.2 593.2 318.9 582.3 319 580.1 320 537.8 322.1 548.9 322.1 548.9 324.2 583.2 326.8 591 331.4 588.3 334.9 586.3 331.7 547.1 331.7 547.1 337.7 570.4 342.2 574.1 342.2 574.1 352.1 582.3 346 559.7 344.6 555.2A148.3 148.3 0 0 1 337.1 523C346.2 544.5 353.1 543.7 353.1 543.7 362 540.3 345.3 510 335.6 495.4A121.6 121.6 0 0 1 322.3 472.2 328.7 328.7 0 0 1 317 430.2 145.7 145.7 0 0 0 308.1 375.9C294.6 350.3 292.1 302.5 292.1 302.5L291.5 221.9C286.7 166.9 252.5 166.5 252.5 166.5 217.8 160.4 213 147.2 213 147.2 205.7 134.7 209.9 110.8 209.9 110.8A47.8 47.8 0 0 0 218.3 89.4C228.4 80.2 227.9 66.8 223.3 66.9 219.5 67.1 220.4 63.4 220.4 63.4 226.6 3.1 181.3 0 181.3 0H174.4S129 3.1 135.4 63.4C135.4 63.4 136.2 67.1 132.5 67 127.8 66.8 127.4 80.3 137.4 89.4A47.7 47.7 0 0 0 145.9 110.8S150.1 134.8 142.8 147.2C142.8 147.2 138 160.5 103.3 166.6 103.3 166.6 69 167 64.3 222L63.7 302.6S61.1 350.3 47.5 375.9A146.2 146.2 0 0 0 38.8 430.2 330.8 330.8 0 0 1 33.4 472.3 120.2 120.2 0 0 1 20.1 495.5C10.2 510-6.3 540.2 2.5 543.7 2.5 543.7 9.4 544.5 18.5 523.1A146.9 146.9 0 0 1 11.1 555.2C9.6 559.6 3.5 582.3 13.4 574.2 13.4 574.2 18 570.4 23.9 547.1 23.9 547.1 20.7 586.4 24.3 588.4 28.9 591 31.5 583.3 33.6 548.9 33.6 548.9 35.7 537.8 36.7 580.2 36.7 582.4 39.4 593.3 43.2 584A133.3 133.3 0 0 0 45 548.6S49.1 575.4 52.9 575.4C52.9 575.4 57.4 581.7 55.6 548.4A197.2 197.2 0 0 1 57.1 528.6L57.5 515.8S56.4 501.2 56.4 495.1A149.3 149.3 0 0 1 72.5 452.7S96.7 401.8 95.2 368.6A126.5 126.5 0 0 1 104.6 319S111.5 408.8 106.8 434C106.8 434 85 495.9 89.8 542.1 93.4 576.5 100.2 649.9 107.2 678.8 110.8 693.8 108.6 731.7 111.5 741.1 112.9 745.2 112.2 749 109.4 758.3 99.6 790.8 100.8 813.7 125.4 900A121 121 0 0 1 129.2 953.5S113.5 991.8 123.5 992.5C123.5 992.5 124.3 995.1 127.7 993.1 127.7 993.1 133.2 999.7 139.1 996.1 139.1 996.1 144.5 1001.3 149.2 996.7A6.2 6.2 0 0 0 158.3 997.6S165.5 1003.3 169.7 997.2C169.7 997.2 177.2 999.2 163.8 959 163.8 959 158.6 916.3 155.8 908 150.4 892.1 154.2 848.6 155.4 839.3A260 260 0 0 0 152.8 776.6C150.4 761.8 157.1 734 159.6 717 164.7 681 174.7 589.1 173.4 571.8L177.5 573.5A7.6 7.6 0 0 0 182.4 571.7Z", + "width": 356 + }, + "search": [ + "underweight-bmi" + ] + }, + { + "uid": "0790b855889a2e90bc58c10bf62b18b7", + "css": "underweight-bmi-r-1", + "code": 59501, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M182.4 571.7C181.1 589.1 191.1 680.9 196.2 716.9 198.7 734 205.4 761.8 203 776.5A255.5 255.5 0 0 0 200.4 839.2C201.6 848.6 205.4 892 200 907.9 197.2 916.3 192 958.9 192 958.9 178.6 999.1 186.1 997.1 186.1 997.1 190.3 1003.2 197.5 997.6 197.5 997.6A6.3 6.3 0 0 0 206.7 996.6C211.4 1001.2 216.8 996.1 216.8 996.1 222.7 999.7 228.1 993 228.1 993 231.5 995 232.3 992.5 232.3 992.5 242.4 991.7 226.7 953.5 226.7 953.5A122.1 122.1 0 0 1 230.4 900C255 813.7 256.3 790.8 246.5 758.3 243.7 748.9 243 745.2 244.3 741.1 247.2 731.7 245.1 693.9 248.7 678.8 255.6 649.9 262.4 576.4 266 542.1 270.7 495.9 249 434 249 434 244.2 408.8 251.2 319 251.2 319A126.2 126.2 0 0 1 260.6 368.6C259 401.9 283.2 452.7 283.2 452.7A149.5 149.5 0 0 1 299.3 495.1C299.3 501.1 298.2 515.8 298.2 515.8L298.6 528.5C298.8 531.8 300.4 543 300.1 548.4 298.3 581.6 302.8 575.4 302.8 575.4 306.5 575.4 310.7 548.6 310.7 548.6A135.2 135.2 0 0 0 312.4 583.9C316.2 593.2 318.9 582.3 319 580.1 320 537.8 322.1 548.9 322.1 548.9 324.2 583.2 326.8 591 331.4 588.3 334.9 586.3 331.7 547.1 331.7 547.1 337.7 570.4 342.2 574.1 342.2 574.1 352.1 582.3 346 559.7 344.6 555.2A148.3 148.3 0 0 1 337.1 523C346.2 544.5 353.1 543.7 353.1 543.7 362 540.3 345.3 510 335.6 495.4A121.6 121.6 0 0 1 322.3 472.2 328.7 328.7 0 0 1 317 430.2 145.7 145.7 0 0 0 308.1 375.9C294.6 350.3 292.1 302.5 292.1 302.5L291.5 221.9C286.7 166.9 252.5 166.5 252.5 166.5 217.8 160.4 213 147.2 213 147.2 205.7 134.7 209.9 110.8 209.9 110.8A47.8 47.8 0 0 0 218.3 89.4C228.4 80.2 227.9 66.8 223.3 66.9 219.5 67.1 220.4 63.4 220.4 63.4 226.6 3.1 181.3 0 181.3 0H174.4S129 3.1 135.4 63.4C135.4 63.4 136.2 67.1 132.5 67 127.8 66.8 127.4 80.3 137.4 89.4A47.7 47.7 0 0 0 145.9 110.8S150.1 134.8 142.8 147.2C142.8 147.2 138 160.5 103.3 166.6 103.3 166.6 69 167 64.3 222L63.7 302.6S61.1 350.3 47.5 375.9A146.2 146.2 0 0 0 38.8 430.2 330.8 330.8 0 0 1 33.4 472.3 120.2 120.2 0 0 1 20.1 495.5C10.2 510-6.3 540.2 2.5 543.7 2.5 543.7 9.4 544.5 18.5 523.1A146.9 146.9 0 0 1 11.1 555.2C9.6 559.6 3.5 582.3 13.4 574.2 13.4 574.2 18 570.4 23.9 547.1 23.9 547.1 20.7 586.4 24.3 588.4 28.9 591 31.5 583.3 33.6 548.9 33.6 548.9 35.7 537.8 36.7 580.2 36.7 582.4 39.4 593.3 43.2 584A133.3 133.3 0 0 0 45 548.6S49.1 575.4 52.9 575.4C52.9 575.4 57.4 581.7 55.6 548.4A197.2 197.2 0 0 1 57.1 528.6L57.5 515.8S56.4 501.2 56.4 495.1A149.3 149.3 0 0 1 72.5 452.7S96.7 401.8 95.2 368.6A126.5 126.5 0 0 1 104.6 319S111.5 408.8 106.8 434C106.8 434 85 495.9 89.8 542.1 93.4 576.5 100.2 649.9 107.2 678.8 110.8 693.8 108.6 731.7 111.5 741.1 112.9 745.2 112.2 749 109.4 758.3 99.6 790.8 100.8 813.7 125.4 900A121 121 0 0 1 129.2 953.5S113.5 991.8 123.5 992.5C123.5 992.5 124.3 995.1 127.7 993.1 127.7 993.1 133.2 999.7 139.1 996.1 139.1 996.1 144.5 1001.3 149.2 996.7A6.2 6.2 0 0 0 158.3 997.6S165.5 1003.3 169.7 997.2C169.7 997.2 177.2 999.2 163.8 959 163.8 959 158.6 916.3 155.8 908 150.4 892.1 154.2 848.6 155.4 839.3A260 260 0 0 0 152.8 776.6C150.4 761.8 157.1 734 159.6 717 164.7 681 174.7 589.1 173.4 571.8L177.5 573.5A7.6 7.6 0 0 0 182.4 571.7Z", + "width": 356 + }, + "search": [ + "underweight-bmi-r" + ] + }, + { + "uid": "28c921a73f854e0b9d7882278180cb1c", + "css": "weight-1", + "code": 59502, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M909.1 0H90.9A91 91 0 0 0 0 90.9V909.1A91 91 0 0 0 90.9 1000H909.1A91 91 0 0 0 1000 909.1V90.9A91 91 0 0 0 909.1 0ZM789.3 288.3L660.8 416.9A22.7 22.7 0 0 1 628.6 416.9 184.8 184.8 0 0 0 455.8 371.1L407 263.5A22.7 22.7 0 1 0 365.7 282.3L413.4 387.2A169.3 169.3 0 0 0 371.6 416.9 22.7 22.7 0 0 1 339.5 416.9L210.7 288.3A22.7 22.7 0 0 1 210.7 256.2 409 409 0 0 1 789.3 256.2 22.7 22.7 0 0 1 789.3 288.3Z", + "width": 1000 + }, + "search": [ + "weight" + ] + }, + { + "uid": "b2fce7f0f65f22d51853206d59bbe9f5", + "css": "blood-pressure-1", + "code": 59503, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M672.7 709.1A145.5 145.5 0 1 0 818.2 854.6 145.5 145.5 0 0 0 672.7 709.1ZM724.2 828.9L685.6 867.5A18.2 18.2 0 1 1 659.8 841.7L698.4 803.1A18.2 18.2 0 0 1 724.2 828.9ZM872.7 236.4C770.7 236.4 690.9 292.4 690.9 363.7S770.7 491 872.7 491 1054.5 435 1054.5 363.7 974.7 236.4 872.7 236.4ZM972.7 381.8A18.2 18.2 0 0 1 954.6 363.7C954.6 350 914.9 327.3 872.7 327.3A18.2 18.2 0 1 1 872.7 291C921.1 291 990.9 316.8 990.9 363.7A18.2 18.2 0 0 1 972.7 381.8ZM655.8 345.5H563.7V18.2A18.2 18.2 0 0 0 545.4 0H218.2A18.2 18.2 0 0 0 200 18.2V109.1H18.2A18.2 18.2 0 0 0 0 127.3V781.8A18.2 18.2 0 0 0 18.2 800H200V854.5A18.2 18.2 0 0 0 218.2 872.7H491.8C491.8 866.7 490.9 860.7 490.9 854.5A120.6 120.6 0 0 1 491.8 836.4H236.4V800H418.2A18.2 18.2 0 0 0 436.4 781.8V127.3A18.2 18.2 0 0 0 418.2 109.1H236.4V36.4H527.3V363.6A18.2 18.2 0 0 0 545.5 381.8H655.9A130.5 130.5 0 0 1 655.8 345.5ZM272.7 272.7H345.5A18.2 18.2 0 1 1 345.5 309.1H272.7A18.2 18.2 0 1 1 272.7 272.7ZM272.7 600H345.5A18.2 18.2 0 1 1 345.5 636.4H272.7A18.2 18.2 0 1 1 272.7 600Z", + "width": 1055 + }, + "search": [ + "blood-pressure" + ] + }, + { + "uid": "2c5321439f574f1b3d74a71ae040512c", + "css": "filter-1", + "code": 59532, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M376.3 472.5A61.7 61.7 0 0 1 392.5 514.3V969.1A30.9 30.9 0 0 0 445.1 991.1L572 845.7C589 825.4 598.4 815.2 598.4 795.1V514.4A62.2 62.2 0 0 1 614.6 472.6L978.6 77.6A46.4 46.4 0 0 0 944.5 0H46.5A46.3 46.3 0 0 0 12.4 77.6Z", + "width": 991 + }, + "search": [ + "filter" + ] + }, + { + "uid": "d4c35e5489591eb085e2936014910df8", + "css": "male-3", + "code": 59533, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M975.4 0H569.5A24.6 24.6 0 0 0 544.9 24.6V133.4A24.6 24.6 0 0 0 569.5 158H725.6L545 338.6A357.4 357.4 0 1 0 661.6 455.3L842.1 274.7V430.5A24.6 24.6 0 0 0 866.7 455.1H975.3A24.6 24.6 0 0 0 999.8 430.5V24.6A24.6 24.6 0 0 0 975.3 0ZM357.6 878.2A235.5 235.5 0 1 1 593.1 642.7 235.5 235.5 0 0 1 357.6 878.2Z", + "width": 1000 + }, + "search": [ + "male" + ] + }, + { + "uid": "cb1acb9603d7bf118642dcc8374a07c8", + "css": "search-2", + "code": 59534, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M402.7 804.7A401.8 401.8 0 0 0 649.6 719.9L915.7 986A50 50 0 0 0 986.5 915.3L720.3 649.2A402.6 402.6 0 1 0 402.7 804.7ZM188.8 188.6A302.4 302.4 0 1 1 188.8 616.2H188.8A301.2 301.2 0 0 1 187.1 190.2L188.6 188.6Z", + "width": 1001 + }, + "search": [ + "search" + ] + }, + { + "uid": "cfca37b29e6fa5d9ef1531bfae25b687", + "css": "send-1", + "code": 59535, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1000.1 0L0 562.5 319.4 680.9 812.5 218.8 437.6 724.5 437.9 724.5 437.5 724.5V1000.1L616.7 790.9 843.7 875Z", + "width": 1000 + }, + "search": [ + "send" + ] + }, + { + "uid": "20326e34220e9e1dac3393ba9b386734", + "css": "female-2", + "code": 59531, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M864.9 747.5C966.6 645.7 999.8 626 975.5 601.7L892.8 518.9A24.6 24.6 0 0 0 857.8 518.9L746.8 629.8 666.7 549.7A359.2 359.2 0 1 0 549.9 667.8L629.7 747.5C528 849.3 494.8 869 519.1 893.3L601.4 975.9A24.6 24.6 0 0 0 636.4 975.9L746.8 865.3C866.3 984.8 884.6 1016.8 909 992.5 988.6 912.9 999.3 908.8 999.3 892.2S994.5 877.2 864.9 747.5ZM360.5 598.5A237.9 237.9 0 1 1 598.5 360.5 237.9 237.9 0 0 1 360.5 598.5Z", + "width": 999 + }, + "search": [ + "female" + ] + }, + { + "uid": "342382cdcec431ecf1c796b8fe0426c2", + "css": "create-episode-1", + "code": 59527, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M825.8 83.3A125 125 0 0 0 708.4 0H125A125.4 125.4 0 0 0 0 125V708.4A125 125 0 0 0 83.3 825.9V291.7A208.3 208.3 0 0 1 291.7 83.3ZM875 166.7H291.6A125.4 125.4 0 0 0 166.7 291.6V875A125.4 125.4 0 0 0 291.6 1000H875A125.4 125.4 0 0 0 1000 875V291.6A125.4 125.4 0 0 0 875 166.7ZM750 625H625V750A41.7 41.7 0 0 1 541.7 750V625H416.7A41.7 41.7 0 1 1 416.7 541.7H541.7V416.7A41.7 41.7 0 1 1 625 416.7V541.7H750A41.7 41.7 0 0 1 750 625Z", + "width": 1000 + }, + "search": [ + "create-episode" + ] + }, + { + "uid": "59afe1ac64e42bf7f65ca1f02f61239b", + "css": "health-bmi-r-1", + "code": 59504, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M215.7 571.7C214.2 589.1 226 680.9 232 716.9 234.9 734 242.9 761.8 240 776.5A216.6 216.6 0 0 0 237 839.2C238.4 848.6 242.9 892 236.5 907.9A500.9 500.9 0 0 0 227.1 958.9C211.1 999.1 220.1 997.1 220.1 997.1 225 1003.2 233.5 997.6 233.5 997.6A8.2 8.2 0 0 0 244.4 996.6 9.9 9.9 0 0 0 256.4 996.1 12.2 12.2 0 0 0 269.8 993C273.7 995 274.7 992.5 274.7 992.5 286.7 991.7 268 953.5 268 953.5A104.5 104.5 0 0 1 272.5 900C301.6 813.7 303 790.8 291.4 758.3 288.1 748.9 287.3 745.2 288.8 741.1 292.3 731.7 289.8 693.9 294 678.8 302.2 649.9 310.3 576.4 314.5 542.1 320.1 495.9 294.4 434 294.4 434 288.8 408.8 297 319 297 319 308.6 336.9 308.1 368.6 308.1 368.6 306.3 401.9 335 452.7 335 452.7A135.3 135.3 0 0 1 354 495.1C354 501.1 352.7 515.8 352.7 515.8L353.2 528.5A181.9 181.9 0 0 1 354.9 548.4C352.8 581.7 358 575.4 358 575.4 362.5 575.4 367.4 548.6 367.4 548.6A114.7 114.7 0 0 0 369.5 584C373.9 593.2 377.2 582.4 377.2 580.2 378.4 537.8 381 548.9 381 548.9 383.4 583.3 386.5 591 391.9 588.3 396.1 586.4 392.3 547.1 392.3 547.1 399.4 570.4 404.7 574.1 404.7 574.1 416.4 582.4 409.2 559.7 407.6 555.2A128.9 128.9 0 0 1 398.7 523.1C409.5 544.5 417.6 543.7 417.6 543.7 428.1 540.3 408.4 510 396.8 495.5A118.2 118.2 0 0 1 381.1 472.2 280.5 280.5 0 0 1 374.8 430.2 126.3 126.3 0 0 0 364.3 375.9C348.3 350.3 345.3 302.6 345.3 302.6L344.6 222C339 167 298.5 166.6 298.5 166.6 257.5 160.5 251.8 147.3 251.8 147.3 243.2 134.8 248.1 110.8 248.1 110.8A43.5 43.5 0 0 0 258.1 89.4C270 80.3 269.4 66.9 263.9 67 259.5 67.1 260.5 63.4 260.5 63.4 268 3.1 214.4 0 214.4 0H206.2S152.6 3.1 160.1 63.4C160.1 63.4 161.1 67.1 156.6 67 151.1 66.8 150.6 80.3 162.5 89.4A43.5 43.5 0 0 0 172.5 110.8S177.4 134.8 168.8 147.2C168.8 147.2 163.1 160.5 122.1 166.6 122.1 166.6 81.5 167 76 222L75.2 302.6S72.3 350.3 56.2 375.9A126.8 126.8 0 0 0 45.8 430.2 282.3 282.3 0 0 1 39.5 472.3 116.9 116.9 0 0 1 23.8 495.5C12.1 510-7.5 540.2 3 543.7 3 543.7 11.2 544.5 21.9 523.1A127.6 127.6 0 0 1 13.1 555.2C11.4 559.6 4.1 582.3 15.8 574.2 15.8 574.2 21.2 570.4 28.3 547.1 28.3 547.1 24.5 586.4 28.7 588.4 34.2 591 37.2 583.3 39.7 548.9 39.7 548.9 42.2 537.8 43.4 580.2 43.5 582.4 46.7 593.3 51.1 584A113.1 113.1 0 0 0 53.2 548.6S58 575.4 62.6 575.4C62.6 575.4 67.9 581.7 65.7 548.4A167.4 167.4 0 0 1 67.4 528.6L68 515.8S66.6 501.2 66.6 495.1A135.1 135.1 0 0 1 85.6 452.7S114.3 401.9 112.4 368.7C112.4 368.7 112 337 123.6 319 123.6 319 131.8 408.8 126.2 434 126.2 434 100.4 496 106.1 542.2 110.3 576.5 118.4 649.9 126.6 678.9 130.9 693.9 128.4 731.7 131.8 741.2 133.3 745.3 132.5 749.1 129.2 758.4 117.6 790.9 119.1 813.8 148.2 900.1A103.5 103.5 0 0 1 152.6 953.6S134 991.8 145.9 992.6C145.9 992.6 146.9 995.1 150.9 993.1A12.3 12.3 0 0 0 164.3 996.1 9.9 9.9 0 0 0 176.2 996.7 8.2 8.2 0 0 0 187.1 997.7S195.5 1003.4 200.5 997.2C200.5 997.2 209.4 999.2 193.6 959A498.5 498.5 0 0 0 184.1 908C177.8 892.1 182.3 848.6 183.6 839.3A220.4 220.4 0 0 0 180.7 776.5C177.8 761.8 185.7 734 188.7 716.9 194.7 680.9 206.5 589.1 205.1 571.7L209.9 573.4A9.9 9.9 0 0 0 215.7 571.7Z", + "width": 421 + }, + "search": [ + "health-bmi-r" + ] + }, + { + "uid": "e5c5250bddfcb33a1d4f8c2948b754e4", + "css": "health-bmi-1", + "code": 59505, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M215.7 571.7C214.2 589.1 226 680.9 232 716.9 234.9 734 242.9 761.8 240 776.5A216.6 216.6 0 0 0 237 839.2C238.4 848.6 242.9 892 236.5 907.9A500.9 500.9 0 0 0 227.1 958.9C211.1 999.1 220.1 997.1 220.1 997.1 225 1003.2 233.5 997.6 233.5 997.6A8.2 8.2 0 0 0 244.4 996.6 9.9 9.9 0 0 0 256.4 996.1 12.2 12.2 0 0 0 269.8 993C273.7 995 274.7 992.5 274.7 992.5 286.7 991.7 268 953.5 268 953.5A104.5 104.5 0 0 1 272.5 900C301.6 813.7 303 790.8 291.4 758.3 288.1 748.9 287.3 745.2 288.8 741.1 292.3 731.7 289.8 693.9 294 678.8 302.2 649.9 310.3 576.4 314.5 542.1 320.1 495.9 294.4 434 294.4 434 288.8 408.8 297 319 297 319 308.6 336.9 308.1 368.6 308.1 368.6 306.3 401.9 335 452.7 335 452.7A135.3 135.3 0 0 1 354 495.1C354 501.1 352.7 515.8 352.7 515.8L353.2 528.5A181.9 181.9 0 0 1 354.9 548.4C352.8 581.7 358 575.4 358 575.4 362.5 575.4 367.4 548.6 367.4 548.6A114.7 114.7 0 0 0 369.5 584C373.9 593.2 377.2 582.4 377.2 580.2 378.4 537.8 381 548.9 381 548.9 383.4 583.3 386.5 591 391.9 588.3 396.1 586.4 392.3 547.1 392.3 547.1 399.4 570.4 404.7 574.1 404.7 574.1 416.4 582.4 409.2 559.7 407.6 555.2A128.9 128.9 0 0 1 398.7 523.1C409.5 544.5 417.6 543.7 417.6 543.7 428.1 540.3 408.4 510 396.8 495.5A118.2 118.2 0 0 1 381.1 472.2 280.5 280.5 0 0 1 374.8 430.2 126.3 126.3 0 0 0 364.3 375.9C348.3 350.3 345.3 302.6 345.3 302.6L344.6 222C339 167 298.5 166.6 298.5 166.6 257.5 160.5 251.8 147.3 251.8 147.3 243.2 134.8 248.1 110.8 248.1 110.8A43.5 43.5 0 0 0 258.1 89.4C270 80.3 269.4 66.9 263.9 67 259.5 67.1 260.5 63.4 260.5 63.4 268 3.1 214.4 0 214.4 0H206.2S152.6 3.1 160.1 63.4C160.1 63.4 161.1 67.1 156.6 67 151.1 66.8 150.6 80.3 162.5 89.4A43.5 43.5 0 0 0 172.5 110.8S177.4 134.8 168.8 147.2C168.8 147.2 163.1 160.5 122.1 166.6 122.1 166.6 81.5 167 76 222L75.2 302.6S72.3 350.3 56.2 375.9A126.8 126.8 0 0 0 45.8 430.2 282.3 282.3 0 0 1 39.5 472.3 116.9 116.9 0 0 1 23.8 495.5C12.1 510-7.5 540.2 3 543.7 3 543.7 11.2 544.5 21.9 523.1A127.6 127.6 0 0 1 13.1 555.2C11.4 559.6 4.1 582.3 15.8 574.2 15.8 574.2 21.2 570.4 28.3 547.1 28.3 547.1 24.5 586.4 28.7 588.4 34.2 591 37.2 583.3 39.7 548.9 39.7 548.9 42.2 537.8 43.4 580.2 43.5 582.4 46.7 593.3 51.1 584A113.1 113.1 0 0 0 53.2 548.6S58 575.4 62.6 575.4C62.6 575.4 67.9 581.7 65.7 548.4A167.4 167.4 0 0 1 67.4 528.6L68 515.8S66.6 501.2 66.6 495.1A135.1 135.1 0 0 1 85.6 452.7S114.3 401.9 112.4 368.7C112.4 368.7 112 337 123.6 319 123.6 319 131.8 408.8 126.2 434 126.2 434 100.4 496 106.1 542.2 110.3 576.5 118.4 649.9 126.6 678.9 130.9 693.9 128.4 731.7 131.8 741.2 133.3 745.3 132.5 749.1 129.2 758.4 117.6 790.9 119.1 813.8 148.2 900.1A103.5 103.5 0 0 1 152.6 953.6S134 991.8 145.9 992.6C145.9 992.6 146.9 995.1 150.9 993.1A12.3 12.3 0 0 0 164.3 996.1 9.9 9.9 0 0 0 176.2 996.7 8.2 8.2 0 0 0 187.1 997.7S195.5 1003.4 200.5 997.2C200.5 997.2 209.4 999.2 193.6 959A498.5 498.5 0 0 0 184.1 908C177.8 892.1 182.3 848.6 183.6 839.3A220.4 220.4 0 0 0 180.7 776.5C177.8 761.8 185.7 734 188.7 716.9 194.7 680.9 206.5 589.1 205.1 571.7L209.9 573.4A9.9 9.9 0 0 0 215.7 571.7Z", + "width": 421 + }, + "search": [ + "health-bmi" + ] + }, + { + "uid": "e72be05611e51608304a7c6f3b837607", + "css": "heart-rate-1", + "code": 59506, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M0 532.1V608.1H205.7A689.9 689.9 0 0 1 145.8 532.1ZM1151 532.1A690.1 690.1 0 0 1 1091 608.1H1296.7V532.1ZM420.4 222L545.9 598.4 590 532.1H699L802.2 284.8 913.5 532.3H1151A366.1 366.1 0 0 0 1218.2 324.2 318.2 318.2 0 0 0 971.8 5C843.9-20.1 726.9 46.1 648.4 183.9 570 46.6 453.5-19.1 325.8 5.6A322.2 322.2 0 0 0 78.5 324.2 366.1 366.1 0 0 0 145.8 532H317.1ZM804.8 475.7L749.7 608.1H630.7L522.9 769.6 420.5 462.3 371.9 608.1H205.7A2720.4 2720.4 0 0 0 486.1 863C529.5 899.1 648.4 1000 648.4 1000S767.4 899.1 810.6 863A2720.7 2720.7 0 0 0 1091 608.1H864.5Z", + "width": 1297 + }, + "search": [ + "heart-rate" + ] + }, + { + "uid": "344d3323e746d922961f90699be37942", + "css": "height-1", + "code": 59507, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M400 50V150H600V250H400V350H500V450H400V550H600V650H400V750H500V850H400V950A50 50 0 0 0 450 1000H750A50 50 0 0 0 800 950V50A50 50 0 0 0 750 0H450A50 50 0 0 0 400 50ZM0 200L150 29.3 300 200H200V1000H100V200Z", + "width": 800 + }, + "search": [ + "height" + ] + }, + { + "uid": "ec7c3d4c3a1a3a5c781fafdfc80d80b2", + "css": "obese-bmi-1", + "code": 59508, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M307.3 571.7C305.2 589.1 322 680.9 330.6 716.9 334.8 734 346.1 761.8 342 776.5A153.3 153.3 0 0 0 337.7 839.2C339.7 848.6 346 892 337 907.9A369.5 369.5 0 0 0 323.5 958.9C300.8 999.1 313.6 997.1 313.6 997.1 320.6 1003.2 332.7 997.6 332.7 997.6A15.3 15.3 0 0 0 348.1 996.6 18.9 18.9 0 0 0 365.2 996.1 22.4 22.4 0 0 0 384.2 993C389.9 995 391.3 992.5 391.3 992.5 408.3 991.7 381.8 953.5 381.8 953.5A76.3 76.3 0 0 1 388.1 900C429.5 813.7 431.7 790.8 415.1 758.3 410.4 748.9 409.2 745.2 411.4 741.1 416.3 731.7 412.7 693.9 418.8 678.8 430.5 649.9 442 576.4 448 542.1 456.1 495.9 419.4 434 419.4 434 411.4 408.8 423.1 319 423.1 319 439.6 336.9 439 368.6 439 368.6 436.4 401.9 477.2 452.7 477.2 452.7A118.4 118.4 0 0 1 504.3 495.1C504.3 501.1 502.4 515.8 502.4 515.8L503.2 528.5A129.3 129.3 0 0 1 505.7 548.3C502.6 581.6 510.2 575.3 510.2 575.3 516.5 575.3 523.5 548.5 523.5 548.5 523.5 555.4 521.1 576.1 526.4 583.9 532.7 593.2 537.4 582.3 537.5 580.1 539.2 537.8 542.8 548.9 542.8 548.9 546.3 583.2 550.7 591 558.4 588.3 564.3 586.3 558.9 547.1 558.9 547.1 569 570.4 576.7 574.1 576.7 574.1 593.3 582.3 583 559.6 580.7 555.1A99.2 99.2 0 0 1 568 523C583.4 544.5 595 543.6 595 543.6 610 540.3 581.9 509.9 565.4 495.4A126 126 0 0 1 543 472.2 203.5 203.5 0 0 1 534 430.1C532.4 392.3 519.1 375.9 519.1 375.9 496.3 350.3 492 302.5 492 302.5L491 221.9C483 166.9 425.3 166.5 425.3 166.5 366.9 160.4 358.8 147.2 358.8 147.2 346.4 134.7 353.5 110.8 353.5 110.8A38.7 38.7 0 0 0 367.7 89.4C384.7 80.2 383.9 66.8 376 66.9 369.7 67 371.2 63.4 371.2 63.4 381.9 3.1 305.5 0 305.5 0H293.9S217.5 3.1 228.1 63.4C228.1 63.4 229.6 67.1 223.2 67 215.4 66.8 214.6 80.3 231.6 89.4A38.7 38.7 0 0 0 245.8 110.8S252.9 134.8 240.5 147.2C240.5 147.2 232.4 160.5 174 166.6 174 166.6 116.2 167 108.3 222L107.2 302.6S103 350.3 80.2 375.9C80.2 375.9 66.9 392.4 65.4 430.2A204.8 204.8 0 0 1 56.4 472.3 124.6 124.6 0 0 1 33.9 495.5C17.3 510-10.7 540.2 4.3 543.7 4.3 543.7 16 544.5 31.3 523.1A98.1 98.1 0 0 1 18.7 555.2C16.3 559.6 6 582.3 22.6 574.2 22.6 574.2 30.3 570.4 40.4 547.1 40.4 547.1 35 586.4 41 588.4 48.8 591 53.1 583.3 56.6 548.9 56.6 548.9 60.2 537.8 61.9 580.2 62 582.4 66.5 593.3 72.9 584 78.3 576.2 75.9 555.5 75.9 548.6 75.9 548.6 82.8 575.4 89.2 575.4 89.2 575.4 96.8 581.7 93.7 548.4A119.1 119.1 0 0 1 96.2 528.5L96.9 515.8S95 501.1 95 495.1A118.3 118.3 0 0 1 122.1 452.7S162.9 401.8 160.3 368.6C160.3 368.6 159.7 336.9 176.2 319 176.2 319 187.9 408.8 180 434 180 434 143.2 495.9 151.3 542.1 157.3 576.5 168.8 649.9 180.5 678.8 186.6 693.8 183 731.7 187.9 741.1 190.1 745.2 188.9 749 184.2 758.3 167.7 790.8 169.8 813.7 211.3 900A75.6 75.6 0 0 1 217.6 953.5S191.1 991.7 208.1 992.5C208.1 992.5 209.4 995 215.1 993A22.4 22.4 0 0 0 234.2 996.1 18.8 18.8 0 0 0 251.2 996.6 15.2 15.2 0 0 0 266.7 997.6S278.7 1003.3 285.8 997.1C285.8 997.1 298.5 999.1 275.9 958.9A367.7 367.7 0 0 0 262.5 907.9C253.4 892.1 259.9 848.6 261.8 839.2A155.9 155.9 0 0 0 257.5 776.5C253.3 761.8 264.7 734 268.9 716.9 277.5 680.9 294.3 589.1 292.2 571.7L299.2 573.4A18.3 18.3 0 0 0 307.3 571.7Z", + "width": 599 + }, + "search": [ + "obese-bmi" + ] + }, + { + "uid": "4f949a0351be7f1870efaf1172e1e0a8", + "css": "ovrweight-bmi-1", + "code": 59509, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M240.4 571.7C238.7 589.1 251.9 680.9 258.6 716.9 261.9 734 270.7 761.8 267.5 776.5A194.7 194.7 0 0 0 264.2 839.2C265.7 848.6 270.7 892 263.6 907.9A454.8 454.8 0 0 0 253.1 958.9C235.3 999.1 245.3 997.1 245.3 997.1 250.8 1003.2 260.3 997.6 260.3 997.6A9.9 9.9 0 0 0 272.4 996.6 12 12 0 0 0 285.7 996.1 14.6 14.6 0 0 0 300.6 993C305.1 995 306.1 992.5 306.1 992.5 319.5 991.7 298.7 953.5 298.7 953.5A94.6 94.6 0 0 1 303.6 900C336.1 813.7 337.7 790.8 324.7 758.3 321.1 748.9 320.2 745.2 321.8 741.1 325.7 731.7 322.9 693.9 327.6 678.8 336.8 649.9 345.8 576.4 350.5 542.1 356.8 495.9 328.1 434 328.1 434 321.9 408.8 331.1 319 331.1 319 343.9 336.9 343.4 368.6 343.4 368.6 341.4 401.9 373.3 452.7 373.3 452.7A128.3 128.3 0 0 1 394.5 495.1C394.5 501.1 393 515.8 393 515.8L393.6 528.5A163.7 163.7 0 0 1 395.6 548.4C393.2 581.6 399.1 575.4 399.1 575.4 404.1 575.4 409.5 548.6 409.5 548.6 409.5 555.5 407.6 576.1 411.8 583.9 416.8 593.2 420.4 582.3 420.5 580.1 421.8 537.8 424.6 548.9 424.6 548.9 427.4 583.2 430.8 591 436.8 588.3 441.4 586.3 437.2 547.1 437.2 547.1 445.1 570.4 451.1 574.1 451.1 574.1 464.1 582.3 456.1 559.7 454.3 555.2A118.2 118.2 0 0 1 444.3 523C456.4 544.5 465.4 543.7 465.4 543.7 477.2 540.3 455.1 510 442.3 495.4A118.3 118.3 0 0 1 424.7 472.2 253.7 253.7 0 0 1 417.7 430.2C416.5 392.3 406.1 375.9 406.1 375.9 388.2 350.3 384.9 302.5 384.9 302.5L384.1 221.9C377.8 166.9 332.7 166.5 332.7 166.5 287.1 160.5 280.7 147.3 280.7 147.3 271 134.8 276.6 110.8 276.6 110.8A41.5 41.5 0 0 0 287.7 89.4C301 80.3 300.4 66.9 294.2 67 289.3 67.1 290.4 63.4 290.4 63.4 298.7 3.1 239 0 239 0H229.9S170.1 3.1 178.4 63.4C178.4 63.4 179.6 67.1 174.6 67 168.4 66.8 167.9 80.3 181.1 89.4A41.4 41.4 0 0 0 192.3 110.8S197.8 134.8 188.1 147.2C188.1 147.2 181.8 160.5 136.1 166.6 136.1 166.6 90.9 167 84.7 222L83.8 302.6S80.5 350.3 62.6 375.9C62.6 375.9 52.3 392.4 51.1 430.2A255.3 255.3 0 0 1 44 472.3 117.1 117.1 0 0 1 26.5 495.5C13.5 510-8.4 540.2 3.3 543.7 3.3 543.7 12.5 544.5 24.4 523.1A117 117 0 0 1 14.6 555.2C12.7 559.6 4.6 582.3 17.7 574.2 17.7 574.2 23.7 570.4 31.5 547.1 31.5 547.1 27.3 586.4 32 588.4 38.1 591 41.5 583.3 44.2 548.9 44.2 548.9 47.1 537.8 48.4 580.2 48.4 582.4 52 593.3 57 584 61.2 576.2 59.3 555.5 59.3 548.6 59.3 548.6 64.7 575.4 69.7 575.4 69.7 575.4 75.7 581.7 73.2 548.4A150.7 150.7 0 0 1 75.2 528.6L75.8 515.8S74.3 501.2 74.3 495.1A128.1 128.1 0 0 1 95.5 452.7S127.5 401.9 125.4 368.7C125.4 368.7 125 337 137.8 319 137.8 319 146.9 408.8 140.7 434 140.7 434 112 496 118.3 542.2 123 576.5 132 649.9 141.2 678.9 145.9 693.9 143.1 731.7 146.9 741.2 148.7 745.3 147.8 749.1 144 758.4 131.2 790.8 132.9 813.7 165.3 900A93.8 93.8 0 0 1 170.2 953.5S149.5 991.7 162.7 992.5C162.7 992.5 163.8 995 168.3 993A14.6 14.6 0 0 0 183.2 996.1 12 12 0 0 0 196.5 996.6 9.9 9.9 0 0 0 208.6 997.6S218 1003.3 223.6 997.1C223.6 997.1 233.5 999.1 215.8 958.9A452.6 452.6 0 0 0 205.3 907.9C198.2 892 203.2 848.5 204.7 839.2A198.1 198.1 0 0 0 201.4 776.5C198.1 761.8 207 734 210.2 716.9 217 680.9 230.2 589.1 228.5 571.7L233.9 573.4A11.9 11.9 0 0 0 240.4 571.7Z", + "width": 469 + }, + "search": [ + "ovrweight-bmi" + ] + }, + { + "uid": "05061dddffce90689cd95cb5ae8590b3", + "css": "qr-code-3", + "code": 59511, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M650 0V350H1000V0ZM900 250H750V100H900ZM350 200V0H0V350H450V200H350ZM250 250H100V100H250ZM700 550H800V700H900V450H550V550H600V650.1H700.1ZM700 800H600V900H500V1000H700V900H800V1000H950V900H900V800H700ZM350 800V650H0V1000H350V900H500V800ZM250 900H100V750H250Z", + "width": 1000 + }, + "search": [ + "qr-code" + ] + }, + { + "uid": "638a9ad84d757d58f60e640ad7a8a992", + "css": "lab-results-1", + "code": 59530, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M633.4 0L547 23.2 523.8 109.6 587 172.8 673.4 149.6C681.4 120.9 688.9 92.1 696.6 63.3ZM206.2 20.1V53.8H239.8C240.2 143.1 239.8 232.1 239.8 321.2 237.7 325.8 72 689.9 4.2 893.4A102.8 102.8 0 0 0 6.2 957.1 75.5 75.5 0 0 0 22.3 985.5 44.5 44.5 0 0 0 54.1 1000H628.1A44.5 44.5 0 0 0 659.9 985.5 75.5 75.5 0 0 0 676.1 957.1 102.8 102.8 0 0 0 678 893.4C610.2 689.9 444.4 325.9 442.5 321.2 442.8 232.1 442.7 143 442.7 53.8H476.5V20.1ZM815 52.1L728.6 75.2 705.6 161.6 768.8 224.9 855.2 201.7C862.7 172.9 870.6 144.1 878.4 115.3ZM408.8 53.8V222.8L273.6 223.2 273.6 54.3ZM684.3 177L597.9 200.2 574.7 286.6 638 349.8 724.4 326.6Q735.9 283.4 747.4 240.2ZM712.8 391.5V425.3H746.6V847.5A357 357 0 0 0 753 948 70.1 70.1 0 0 0 779.3 985.8 89.1 89.1 0 0 0 831 999.4 89 89 0 0 0 882.7 985.8 69.7 69.7 0 0 0 908.9 948 356.8 356.8 0 0 0 915.4 847.5V425.3H949.1V391.6ZM780.2 425.3H881.7V560.4H780.3ZM464.5 611.6A46.1 46.1 0 0 1 433.7 669.3 45.5 45.5 0 0 1 416.8 671L398.3 713.8A65.5 65.5 0 0 1 419 780.9L461.3 804.7A45.3 45.3 0 0 1 476.3 796.7 46.3 46.3 0 1 1 445.4 854.4 45.3 45.3 0 0 1 444.2 833.8L402.6 810.4A66.5 66.5 0 0 1 373.6 828.7 67.5 67.5 0 0 1 289.6 783.9 66.7 66.7 0 0 1 289.3 746.5L260.3 730.2A45.3 45.3 0 0 1 242.9 740.3 46.2 46.2 0 1 1 273.6 682.6 45.3 45.3 0 0 1 275.3 700L306.3 717.5A64.3 64.3 0 0 1 368 698.9L386.4 656.5A45.3 45.3 0 0 1 375.9 638.7 48.8 48.8 0 0 1 418.7 579.7 43.1 43.1 0 0 1 464.5 611.8Z", + "width": 949 + }, + "search": [ + "lab-results" + ] + }, + { + "uid": "42b7a4fc84d097a747fb78e47ffc89b8", + "css": "health-summary-1", + "code": 59529, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M714.1 956.9H146.5A97 97 0 0 1 47.4 862.1V79.8A63 63 0 0 0 0 137.9V939.7A62.5 62.5 0 0 0 64.7 1000H652A63.3 63.3 0 0 0 714.1 956.9ZM714.1 956.9M799.6 862.1V435.3H312.3L312 462C312 462.3 312 461.2 312 463.4H519.4A17.2 17.2 0 1 1 519.4 497.9H310.1A32.1 32.1 0 0 1 287.8 487.8 38 38 0 0 1 277.5 461.2L277.7 435.4H241.3A16.9 16.9 0 0 1 224.1 418.5V416H172.3A17.2 17.2 0 0 1 155.1 398.9L154.5 324A17.8 17.8 0 0 1 171.8 306.2H171.8L224 307.2V304.9A18 18 0 0 1 241.2 286.6H799.6V209.1H653.6A56.2 56.2 0 0 1 597 152.5V0H146.4A63.1 63.1 0 0 0 81.4 58.1 16.8 16.8 0 0 1 81.9 60.3C81.9 61.2 81.9 62.1 81.9 63V862.1A62.6 62.6 0 0 0 146.4 922.4H733.8A63.6 63.6 0 0 0 799.6 862.1ZM172.5 543.1H456A17.2 17.2 0 1 1 456 577.6H172.5A17.2 17.2 0 0 1 172.5 543.1ZM665.8 829.7H172.5A17.2 17.2 0 0 1 172.5 795.2H665.8A17.2 17.2 0 0 1 665.8 829.7ZM665.8 745.6H172.5A17.2 17.2 0 0 1 172.5 711.2H665.8A17.2 17.2 0 1 1 665.8 745.6ZM665.8 661.6H172.5A17.2 17.2 0 0 1 172.5 627.1H665.8A17.2 17.2 0 1 1 665.8 661.6ZM665.8 661.6M773.5 174.6L631.5 27.6V152.5A21.8 21.8 0 0 0 653.6 174.5ZM773.5 174.6M898.7 336.6V386.6L937.2 361.6ZM898.7 336.6M258.6 321.1H864.2V400.9H258.6ZM258.6 321.1M224.1 381.5V341.5L189.2 341.1 189.4 381.5ZM224.1 381.5", + "width": 937 + }, + "search": [ + "health-summary" + ] + }, + { + "uid": "cbf3ee4dea491660e9f9dd8d3db58b7d", + "css": "ecg-1", + "code": 59528, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M34.6 0H965.4A34.6 34.6 0 0 1 1000 34.6V464.3L698.3 464.3A35.7 35.7 0 0 0 665 487.3L598.8 660.6 433.1 226.5A35.5 35.5 0 0 0 399.8 203.5H399.8A35.5 35.5 0 0 0 366.4 226.4L275.4 464.5 0 464.3V34.6A34.6 34.6 0 0 1 34.6 0ZM965.4 1000A34.6 34.6 0 0 0 1000 965.4V535.7L722.9 535.7 632.2 773.5A35.7 35.7 0 0 1 565.4 773.5L399.7 339.3 333.4 512.8A35.7 35.7 0 0 1 300 535.8H300L0.2 535.8V965.4A34.6 34.6 0 0 0 34.8 1000H965.4Z", + "width": 1000 + }, + "search": [ + "ecg" + ] + }, + { + "uid": "72c30fde2a53eed52ca204cb3f2f3da5", + "css": "admission-req-1", + "code": 59525, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M0 1000H1101.9V598.3H0ZM518.7 689.9H583.2V762.6H655.9V827.1H583.2V899.8H518.7V827.1H445.9V762.6H518.6ZM64.5 458.4H1037.3V533.7H64.5ZM422.6 178C422.6 176.1 422.6 174.2 422.4 172.3H219.5C219.5 174.2 219.3 176.1 219.3 178A101.7 101.7 0 0 0 309.7 278.9H332.1A101.7 101.7 0 0 0 422.6 178ZM288.7 279H258.4A129.4 129.4 0 0 0 129.9 393.8H288.7V279ZM383.6 279H353.3V393.8H512.1A129.4 129.4 0 0 0 383.6 279ZM425.1 107.8L444.1 22.7A344.4 344.4 0 0 0 198.1 22.7L217 107.8ZM639.1 241.7H972.7V393.9H639.1Z", + "width": 1102 + }, + "search": [ + "admission-req" + ] + }, + { + "uid": "e323582b66d81cd517a4e1eb7bf1f399", + "css": "booked-1", + "code": 59526, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M907.9 1000H162.7A163.1 163.1 0 0 1 0 837.9V321.9H1070.7V837.9A163.1 163.1 0 0 1 907.9 1000.3ZM71.4 393.3V837.9A91.7 91.7 0 0 0 162.7 928.8H907.9A91.7 91.7 0 0 0 999.2 837.9V393.3ZM1070.7 393H0V235.7A163.1 163.1 0 0 1 162.7 72.1H907.9A163.1 163.1 0 0 1 1070.6 235.7ZM71.4 321.9H999.2V235.7A91.7 91.7 0 0 0 907.9 143.6H162.7A91.7 91.7 0 0 0 71.4 235.7ZM46.8 357.6V937.5H1017.1V357.6ZM356.9 717.3A35.7 35.7 0 1 1 392.6 681.6 35.7 35.7 0 0 1 356.9 717.3ZM535.3 717.3A35.7 35.7 0 1 1 571 681.6 35.7 35.7 0 0 1 535.3 717.3ZM713.8 717.3A35.7 35.7 0 1 1 749.4 681.6 35.7 35.7 0 0 1 713.8 717.3Z", + "width": 1071 + }, + "search": [ + "booked" + ] + }, + { + "uid": "17d952ce25a93720aba9a7695bd1d3eb", + "css": "walkin-1", + "code": 59524, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M271.2 118.6H305.1A50.4 50.4 0 0 0 334.2 164.4 101.6 101.6 0 1 0 254.2 203.4 100 100 0 0 0 307.5 188.3 85.2 85.2 0 0 1 271.2 118.6ZM168 639.4L135.6 779.7 33.9 932.2 118.6 1000 254.2 813.6 274.5 746.2 171.1 642.8C170 641.7 169.1 640.5 168 639.4ZM108.3 529.8A238 238 0 0 1 101.7 475.1V385L0 508.4 67.8 576.4ZM383.6 583.9L227.8 498.8 155.6 335.8 186.6 322 254.4 474.6 372.9 539.4 440.7 576.4 491.6 491.4 373 420.2V271.2A67.8 67.8 0 0 0 305.1 203.4H203.4A67.8 67.8 0 0 0 135.6 271.2V475.2A203.2 203.2 0 0 0 195.1 618.9L339.1 762.9 389.9 983.2H491.6L440.8 712Z", + "width": 492 + }, + "search": [ + "walkin" + ] + }, + { + "uid": "7a3477a769ec5811e772756dc57b7622", + "css": "vital-signs-1", + "code": 59523, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M0 532.1V608.1H205.7A689.9 689.9 0 0 1 145.8 532.1ZM1151 532.1A690.1 690.1 0 0 1 1091 608.1H1296.7V532.1ZM420.4 222L545.9 598.4 590 532.1H699L802.2 284.8 913.5 532.3H1151A366.1 366.1 0 0 0 1218.2 324.2 318.2 318.2 0 0 0 971.8 5C843.9-20.1 726.9 46.1 648.4 183.9 570 46.6 453.5-19.1 325.8 5.6A322.2 322.2 0 0 0 78.5 324.2 366.1 366.1 0 0 0 145.8 532H317.1ZM804.8 475.7L749.7 608.1H630.7L522.9 769.6 420.5 462.3 371.9 608.1H205.7A2720.4 2720.4 0 0 0 486.1 863C529.5 899.1 648.4 1000 648.4 1000S767.4 899.1 810.6 863A2720.7 2720.7 0 0 0 1091 608.1H864.5Z", + "width": 1297 + }, + "search": [ + "vital-signs" + ] + }, + { + "uid": "d3660bff417230e14b3ddaa868eee919", + "css": "ucaf-1", + "code": 59522, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M529.3 60V0H470.7V60C201.6 73.3 0 271.4 0 529.3V576.7L42.3 555.7A289.7 289.7 0 0 1 148.4 529.5 171.9 171.9 0 0 1 245.1 579.5L265.8 600 286.4 579.5A171.9 171.9 0 0 1 383.1 529.5 159.1 159.1 0 0 1 471 571.7V912.1A87.9 87.9 0 0 0 646.8 912.1V853.5H587.9V912.1A29.3 29.3 0 0 1 529.3 912.1V571.5A159.1 159.1 0 0 1 617.2 529.3 171.9 171.9 0 0 1 713.9 579.3L734.6 599.8 755.2 579.3A178.1 178.1 0 0 1 853.7 529.3 274.1 274.1 0 0 1 957.8 555.5L1000 576.7V529.3C1000 271.4 798.4 73.3 529.3 60Z", + "width": 1000 + }, + "search": [ + "ucaf" + ] + }, + { + "uid": "6a176d9d936657bf21eb9de1201f5a1c", + "css": "radiology-2", + "code": 59520, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1218.7 937.5H906.2V812.6C1109.3 812.6 1107.4 817.2 1119.6 798.6L1174 718.9A93.7 93.7 0 0 0 1185.6 537.8 187.5 187.5 0 0 0 1000 375H870.2A437.5 437.5 0 0 0 437.4 0C10.4 0-162.9 552.5 187.4 795.9V937.5H93.7A31.4 31.4 0 1 0 93.7 1000H1218.7A31.4 31.4 0 1 0 1218.7 937.5ZM159 476.2A281.3 281.3 0 0 1 679.3 294.1 273.1 273.1 0 0 1 710.7 375C637.5 375 655.7 403.1 648.2 376.9 653.8 393.8 651.3 384.7 635.4 398.7A125 125 0 0 0 423.9 531.3 93.8 93.8 0 0 0 428.5 718.8 281.3 281.3 0 0 1 159.2 476.3ZM1156.2 593.7A31.4 31.4 0 0 1 1177.7 647.1C1164.9 660.6 1218.7 656.2 437.4 656.2A31.4 31.4 0 0 1 415.9 602.8C428.4 589.4 377.4 593.8 1156.2 593.8ZM579.3 750L558.4 718.6H724A99.1 99.1 0 0 0 718.7 750ZM468.7 468.7A62.5 62.5 0 1 1 531.2 531.2 62.5 62.5 0 0 1 468.7 468.7ZM687.4 812.6H718.8V937.5H687.4ZM1076.8 750.1H906.2A93.7 93.7 0 0 0 900.9 718.7H1097.8ZM1120.8 531.3C667.7 531.3 693.7 534.4 677.7 523.8A46.6 46.6 0 0 1 669.9 451.3C687.4 431.6 689 437.6 999.9 437.6A125 125 0 0 1 1120.9 531.3ZM406.2 843.7H468.7V937.5H406.2Z", + "width": 1250 + }, + "search": [ + "radiology" + ] + }, + { + "uid": "0347a4fbc965dd15778a1025d6ec56a0", + "css": "progress-notes-2", + "code": 59519, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M400 266.7V33.4A33.4 33.4 0 0 1 466.6 33.4V266.7ZM300 933.3A99.3 99.3 0 0 1 229.3 904.1 1011.6 1011.6 0 0 1 0 550.5V966.6A33.4 33.4 0 0 0 33.4 1000H833.3A33.4 33.4 0 0 0 866.7 966.6V933.3ZM1128 809.7A885.7 885.7 0 0 1 866.6 189.5V166.6A33.4 33.4 0 0 0 833.3 133.3H533.3V300A33.4 33.4 0 0 1 500 333.3H366.6A33.4 33.4 0 0 1 333.3 300V133.3H33.4A33.4 33.4 0 0 0 0 166.7V189.6A943.4 943.4 0 0 0 276.4 856.9 33.4 33.4 0 0 0 300 866.7H1104.5A33.4 33.4 0 0 0 1128.1 809.8ZM433.3 400H700A33.4 33.4 0 0 1 700 466.6H433.3A33.4 33.4 0 0 1 433.3 400ZM700 733.3H366.7A33.4 33.4 0 0 1 366.7 666.6H700A33.4 33.4 0 0 1 700 733.3ZM766.7 600H300A33.4 33.4 0 1 1 300 533.3H766.7A33.4 33.4 0 1 1 766.7 600Z", + "width": 1138 + }, + "search": [ + "progress-notes" + ] + }, + { + "uid": "9ef83ec11b2967f90944d218ac5b94af", + "css": "patient-sick-leave-1", + "code": 59518, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M664.4 0H92.6A92.7 92.7 0 0 0 0 92.6V907.4A92.7 92.7 0 0 0 92.6 1000H664.3A92.7 92.7 0 0 0 756.9 907.4V92.6A92.7 92.7 0 0 0 664.4 0ZM118.7 167.8L176.4 68.5A20.8 20.8 0 1 1 212.4 89.3L173 157.2H587.9L556.4 87.4A20.8 20.8 0 1 1 594.4 70.1L639.1 169.5A20.8 20.8 0 0 1 620.1 198.9H136.8A20.8 20.8 0 0 1 118.7 167.8ZM644.6 608.6H492.4A20.8 20.8 0 0 1 472.7 594.7L458.3 554.1 423.7 813.6A20.8 20.8 0 0 1 403.7 831.6H403.1A20.8 20.8 0 0 1 382.7 814.7L312.5 452.1 266.5 606.1A20.8 20.8 0 0 1 246.6 621H112.3A20.8 20.8 0 1 1 112.3 579.5H231.1L296.8 358.9A20.8 20.8 0 0 1 337.2 360.9L399.1 681.8 428.4 463.2A20.8 20.8 0 0 1 446.8 445.3 21.3 21.3 0 0 1 468.7 459.1L507 567.1H644.5A20.8 20.8 0 1 1 644.5 608.6Z", + "width": 757 + }, + "search": [ + "patient-sick-leave" + ] + }, + { + "uid": "f7865ba708db3b174c76175ee117fc7c", + "css": "refer-patient-1", + "code": 59521, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M264.4 666.7L351.6 775.7 267.1 860.3 228.5 667.7C235.7 667.1 242.9 666.7 250.1 666.7ZM442.2 666.7L388.9 733.3 335.6 666.6ZM513.4 666.7H527.7C534.9 666.7 542.1 667.1 549.3 667.7L510.8 860.3 426.2 775.7ZM638.9 444.4H637.2A248 248 0 0 0 638.9 416.7V333.3A55.6 55.6 0 0 1 638.9 444.4ZM138.9 166.7A166.8 166.8 0 0 1 305.5 0H472.2A166.8 166.8 0 0 1 638.9 166.7V277.8H527.8A55.6 55.6 0 0 1 472.2 222.2V111.1H416.7V138.9A139 139 0 0 1 277.8 277.8H138.9ZM138.9 444.4A55.6 55.6 0 1 1 138.9 333.3V416.7A248 248 0 0 0 140.5 444.4ZM194.5 416.7V333.3H277.8A194.1 194.1 0 0 0 425.3 265.1 111.4 111.4 0 0 0 527.8 333.3H583.3V416.7A194.5 194.5 0 0 1 194.5 416.7ZM777.8 1000H0V916.6A250.4 250.4 0 0 1 174 678.5L222.9 922.1A27.8 27.8 0 0 0 242 943.2 28.4 28.4 0 0 0 250.1 944.4 27.8 27.8 0 0 0 269.7 936.3L389 817 508.2 936.3A27.8 27.8 0 0 0 554.9 922.1L603.9 678.5A250.5 250.5 0 0 1 777.8 916.6ZM943.7 123A22 22 0 0 1 965.7 101H1000.6L899.6 0 798.6 101H833.5A22 22 0 0 1 855.6 123 264.2 264.2 0 0 1 738 342.7 220.4 220.4 0 0 0 943.7 123Z", + "width": 1001 + }, + "search": [ + "refer-patient" + ] + }, + { + "uid": "7c6d81832f8802ae84362cefea6d9585", + "css": "order-procedures-1", + "code": 59517, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1040.4 721.4L997.6 778.4 1054.8 821.3H926A142.7 142.7 0 0 0 788.2 714.3H430.9A142.7 142.7 0 0 0 293.1 821.3H214.3A142.8 142.8 0 0 1 214.3 535.6H293.1A142.7 142.7 0 0 0 430.9 642.6H788.1A142.7 142.7 0 0 0 925.9 535.6H1004.8A214.3 214.3 0 1 0 1004.8 107H926A142.7 142.7 0 0 0 788.1 0H430.9A142.7 142.7 0 0 0 293.1 107H261.9L128.6 7.2 85.7 64.3 142.8 107H0V178.6H142.8L85.7 221.4 128.6 278.6 261.9 178.6H293.2A142.7 142.7 0 0 0 431 285.5H788.1A142.7 142.7 0 0 0 926 178.6H1004.9A142.8 142.8 0 1 1 1004.9 464.3H926A142.7 142.7 0 0 0 788.2 357.3H430.9A142.7 142.7 0 0 0 293.1 464.3H214.3A214.3 214.3 0 1 0 214.3 892.8H293.1A142.7 142.7 0 0 0 430.9 999.8H788.1A142.7 142.7 0 0 0 926 892.8H1054.9L997.7 935.7 1040.4 992.8 1218.9 857.2ZM1040.4 721.4", + "width": 1219 + }, + "search": [ + "order-procedures" + ] + }, + { + "uid": "fc33e99d336b9a8766b950e84d6bd2d0", + "css": "order-prescription-1", + "code": 59516, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M596.3 192.4A28.8 28.8 0 0 0 588.5 172.7L434.6 9.1A28.9 28.9 0 0 0 413.6 0H404V202H596.3ZM596.3 192.4M567.2 567.5A164.8 164.8 0 0 1 596.3 570.1V259.7H375.1A28.9 28.9 0 0 1 346.3 230.8V0H28.9A28.9 28.9 0 0 0 0 28.9V769.5A28.9 28.9 0 0 0 28.9 798.3H271.5A163.6 163.6 0 0 1 288.4 778.6L451.6 615.5A162.4 162.4 0 0 1 567.2 567.5ZM240.4 336.6H269.3V307.8A28.9 28.9 0 1 1 327 307.8V336.6H355.9A28.9 28.9 0 1 1 355.9 394.3H327V423.2A28.9 28.9 0 0 1 269.3 423.2V394.3H240.4A28.9 28.9 0 0 1 240.4 336.6ZM144.3 509.8H452A28.9 28.9 0 1 1 452 567.5H144.3A28.9 28.9 0 0 1 144.3 509.8ZM336.6 682.9H144.3A28.9 28.9 0 1 1 144.3 625.2H336.6A28.9 28.9 0 1 1 336.6 682.9ZM336.6 682.9M329.1 819.4A105.8 105.8 0 1 0 478.8 969L540 907.8 390.4 758.1ZM329.1 819.4M642 656.2A105.8 105.8 0 0 0 492.4 656.2L431.2 717.4 580.8 867 642 805.8A105.9 105.9 0 0 0 642 656.2ZM642 656.2", + "width": 673 + }, + "search": [ + "order-prescription" + ] + }, + { + "uid": "3c62b35ba91d956be23daa4542e78fd1", + "css": "modify-episode-1", + "code": 59515, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M825.8 83.3A125 125 0 0 0 708.3 0H125A125.4 125.4 0 0 0 0 125V708.3A125 125 0 0 0 83.3 825.8V291.7A208.3 208.3 0 0 1 291.7 83.3ZM875 1000H291.7A125.8 125.8 0 0 1 166.7 875V291.6A125.7 125.7 0 0 1 291.7 166.6H875A125.7 125.7 0 0 1 1000 291.6V875A125.7 125.7 0 0 1 875 1000ZM650.9 428.6H650.9L370.5 709A21.9 21.9 0 0 0 365.1 717.8L333.1 813A22.3 22.3 0 0 0 338.6 836 22.6 22.6 0 0 0 354.6 842.5 21.4 21.4 0 0 0 361.7 841.4L456.9 809.7A22.5 22.5 0 0 0 465.6 804.3L746 523.8 650.8 428.6ZM746.2 349A37.4 37.4 0 0 0 719.7 359.9L682.7 397 777.9 492.1 814.9 455.1A37.1 37.1 0 0 0 825.9 428.6 36.8 36.8 0 0 0 814.9 402.2L772.6 359.8A37.4 37.4 0 0 0 746.1 349.1Z", + "width": 1000 + }, + "search": [ + "modify-episode" + ] + }, + { + "uid": "d905b0ec32bad6997ccde356f970af67", + "css": "livecare-1", + "code": 59514, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M359.7 999.9H201.4A198.3 198.3 0 0 1 123.3 984 203.2 203.2 0 0 1 16.1 877 197.1 197.1 0 0 1 0.2 799.1V200.7A197.7 197.7 0 0 1 16.1 122.7 203 203 0 0 1 123.2 15.8 197.7 197.7 0 0 1 201 0H943.2A197.7 197.7 0 0 1 1021.2 15.9 202.9 202.9 0 0 1 1128.1 123 197.7 197.7 0 0 1 1143.3 200.8V348.4A165.5 165.5 0 0 0 1143.3 658.1V798.8A198.3 198.3 0 0 1 1127.7 876.9 202.3 202.3 0 0 1 1020.9 984.1 197.7 197.7 0 0 1 943 1000H769.8A523.4 523.4 0 0 0 826.4 943.9 52.2 52.2 0 0 0 837.9 902.6 762.6 762.6 0 0 0 945.5 700.1 735.6 735.6 0 0 0 974.8 593.4 534.2 534.2 0 0 0 985 493.3 353.7 353.7 0 0 0 969.2 377.4 151.4 151.4 0 0 0 923.5 309.3 216.9 216.9 0 0 0 851 271.4C822.4 261.7 789.4 254.2 754.4 246.2H754.4L754.4 246.2A54 54 0 0 0 706.1 215.5 54.9 54.9 0 1 0 706.1 325.4 52.7 52.7 0 0 0 738.4 313.3L739.7 313.7H739.7L740.6 313.7C775.5 321.8 803.1 328.4 826 335.7A149.3 149.3 0 0 1 880.4 363.5 93 93 0 0 1 908.6 411.4 320 320 0 0 1 916.7 493.8 460.9 460.9 0 0 1 907.2 582.5 666.4 666.4 0 0 1 880.5 677.7 743.1 743.1 0 0 1 838.7 772.4 656 656 0 0 1 784.3 859 52.4 52.4 0 0 0 748.2 876.5 370.9 370.9 0 0 1 670.2 946.2 179.5 179.5 0 0 1 459.8 946.2 368 368 0 0 1 381.8 876.9 52.4 52.4 0 0 0 345.7 859.4 659.1 659.1 0 0 1 291.2 772.5 747 747 0 0 1 249.4 677.3 664.2 664.2 0 0 1 222.6 582.1 463.2 463.2 0 0 1 213.1 493.3 323.7 323.7 0 0 1 221.1 410.8 92.7 92.7 0 0 1 249.2 362.9 148.8 148.8 0 0 1 303.6 335.1C326.8 327.8 355.9 321 389.6 313.1L390.3 313.1H390.3L390.8 312.7A54.1 54.1 0 0 0 423.8 324.9 54.8 54.8 0 1 0 423.8 215 53.1 53.1 0 0 0 394.5 223.7 59.5 59.5 0 0 0 374.6 245.6H374.6L373.9 245.6C230.3 278.8 143.6 298.8 143.6 492.9A534.1 534.1 0 0 0 153.9 593.2 737.8 737.8 0 0 0 183.2 700 757.5 757.5 0 0 0 291.6 902.9 52 52 0 0 0 303.2 944.1 529.8 529.8 0 0 0 359.1 999.6H359.1ZM1787.8 895.3H1706.6A70 70 0 0 1 1669.9 884.8L1332 671.5A33.4 33.4 0 0 1 1316.4 643.4V622.6A165.3 165.3 0 0 0 1316.4 384.5V347A33.4 33.4 0 0 1 1332 318.9L1669.9 105.6A66.9 66.9 0 0 1 1706.6 95.1H1787.8A33.5 33.5 0 0 1 1821.5 128.2V862.6A32.9 32.9 0 0 1 1811.7 886 33.5 33.5 0 0 1 1787.9 895.7ZM467.9 673.5H485.2L539.5 673.5C546 673.5 551.4 666.6 551.7 656.7V611.6C551.7 601.9 556 594.4 562.7 593.9L579.3 593.9C586.1 594.4 590.7 602 590.7 611.6V656.8C590.7 666.8 595.5 673.2 602.1 673.2L675.3 673.2 675.3 617.1C675.3 607.5 670.7 600 663.9 599.6L634.6 599.6C628.1 599.6 623.1 592.7 622.8 582.7L622.8 567.6C622.8 557.6 628.2 550.8 634.7 550.8H664C670.7 550.3 675.1 542.4 675.1 532.8V463.3A29.8 29.8 0 0 1 652.4 477.4H602.8C596.3 477.4 590.9 484.7 590.6 494.4V539.7C590.6 549.6 585.3 556.6 578.8 556.6L564.1 556.6C557.6 556.6 552.4 549.8 552.1 539.9V494C552.1 484.1 546.7 477.4 540.2 477.4H468.1V533.3C468.1 543 472.6 550.6 479.4 551.2L508.7 551.2C515.3 551.6 520.1 559.6 520.1 569.2V582.1C520.1 591.8 515.6 599.5 508.8 599.9H479.5C472.8 600.4 468.3 608.1 468.3 617.6ZM716 459.1V693.1A29.7 29.7 0 0 1 686 721.3H455.4A29.3 29.3 0 0 1 425.6 693.1V459.1A29.7 29.7 0 0 1 455.4 430.5H685.9A30.2 30.2 0 0 1 716 459.1ZM468.1 673.5H485.5L539.7 673.5C546.2 673.5 551.6 666.6 551.9 656.7V611.6C551.9 601.9 556.2 594.4 562.9 593.9L579.6 593.9C586.2 594.4 590.8 602 590.8 611.6V657.2C590.8 667.2 595.7 673.6 602.2 673.6L675.4 673.6 675.4 617.5C675.4 607.8 670.8 600.4 664.1 599.9L634.8 599.9C628.3 599.9 623.2 593 622.9 583.1L622.9 567.9C622.9 558 628.3 551.2 634.9 551.2H664.2C670.9 550.7 675.2 542.8 675.2 533.2V463.3A29.8 29.8 0 0 1 652.6 477.4H602.9C596.5 477.4 591.1 484.7 590.8 494.4V539.4C590.8 549.3 585.4 556.3 578.9 556.3L563.9 556.3C557.4 556.3 552.2 549.5 551.9 539.6V494.2C551.9 484.2 546.5 477.6 539.9 477.6H468.1V533.4C468.1 543.1 472.6 550.8 479.4 551.3L508.7 551.3C515.3 551.7 520.1 559.7 520.1 569.3V582.3C520.1 591.9 515.6 599.6 508.8 600.1H479.5C472.8 600.5 468.3 608.2 468.3 617.8ZM1202.1 400.4A96.2 96.2 0 1 1 1106 496.6H1106A96.2 96.2 0 0 1 1202.1 400.4Z", + "width": 1821 + }, + "search": [ + "livecare" + ] + }, + { + "uid": "18574a405555b8e83d46a43a1e755ea7", + "css": "logout-1", + "code": 59513, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M500 0A500 500 0 1 0 1000 500 500.5 500.5 0 0 0 500 0ZM470.7 167.9A29.3 29.3 0 1 1 529.3 167.9V402.3A29.3 29.3 0 0 1 470.7 402.3ZM500 822.3A322.2 322.2 0 0 1 371.2 204.7 29.3 29.3 0 0 1 394.7 258.4 263.7 263.7 0 1 0 605.6 258.4 29.3 29.3 0 0 1 629.1 204.8 322.2 322.2 0 0 1 500 822.3Z", + "width": 1000 + }, + "search": [ + "logout" + ] + }, + { + "uid": "540c904ee995ff64cca5493caae9c2db", + "css": "reschedule--1", + "code": 59512, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M484.5 67.2L7.6 3.6A17.9 17.9 0 0 0 0 17.9V920.2A17.9 17.9 0 0 0 15.5 937.9L479.8 999.8A17.9 17.9 0 0 0 493.8 995.7 17.5 17.5 0 0 0 500 982.3V84.9A17.9 17.9 0 0 0 484.5 67.2ZM423.3 512.6L369.7 566.3A17.9 17.9 0 0 1 344.4 541L367.5 518H89.3A17.9 17.9 0 1 1 89.3 482.3H367.6L344.5 459.2A17.9 17.9 0 0 1 369.8 433.9L423.5 487.6A17.9 17.9 0 0 1 423.5 512.8ZM535.7 201.4A336 336 0 0 1 643 165V17.9A17.9 17.9 0 0 0 625.2 0H251.5L489.4 31.7A53.7 53.7 0 0 1 535.9 84.9V201.4ZM535.7 928.5H625A17.9 17.9 0 0 0 642.9 910.6V834.8A336 336 0 0 1 535.5 798.4ZM696.4 196.4A301.3 301.3 0 0 0 535.7 242.9V286.2A267.5 267.5 0 1 1 831.7 730.9C831.2 731.2 830.9 731.7 830.4 732A13.8 13.8 0 0 1 828.6 732.7 266.1 266.1 0 0 1 535.7 713.9V757.2A303.5 303.5 0 1 0 696.4 196.4ZM598.2 329.9A17.9 17.9 0 0 1 573.8 323.3L565.3 308.5A234.4 234.4 0 0 0 535.7 332.9V667.1A234.5 234.5 0 0 0 565.3 691.5L573.8 676.7A17.9 17.9 0 1 1 604.8 694.5L596.3 709.2A229.9 229.9 0 0 0 678.6 731.3V714.3A17.9 17.9 0 1 1 714.3 714.3V731.2A229.9 229.9 0 0 0 796.6 709.1L788.3 694.5A17.9 17.9 0 1 1 819.2 676.6L827.7 691.4A233.9 233.9 0 0 0 888 631.1L873.3 622.6A17.9 17.9 0 1 1 891.2 591.7L905.8 599.9A229.7 229.7 0 0 0 927.9 517.7H910.9A17.9 17.9 0 0 1 910.9 482H927.8A229.7 229.7 0 0 0 905.7 399.7L891.1 408A17.9 17.9 0 1 1 873.2 377.1L887.9 368.6A233.9 233.9 0 0 0 827.7 308.3L819.2 323A17.9 17.9 0 1 1 788.2 305.1L796.5 290.5A229.8 229.8 0 0 0 714.2 268.4V285.4A17.9 17.9 0 1 1 678.5 285.4V268.4A229.9 229.9 0 0 0 596.2 290.4L604.7 305.1A17.9 17.9 0 0 1 598.2 329.9ZM678.6 449.6V374.9A17.9 17.9 0 0 1 714.3 374.9V449.6A53.7 53.7 0 0 1 746.8 482H785.8A17.9 17.9 0 1 1 785.8 517.7H746.8A53.5 53.5 0 1 1 678.7 449.6Z", + "width": 1000 + }, + "search": [ + "reschedule-" + ] + }, + { + "uid": "973fdf63aeccbd095872d42af142b109", + "css": "dr-reply-active-1", + "code": 59552, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1023.2 547.7H1029.4A86.7 86.7 0 0 1 1162.4 438.2L1200.4 476.2V101.1A101.2 101.2 0 0 0 1099.2 0H101.2A101.2 101.2 0 0 0 0 101.1V799A101.2 101.2 0 0 0 101.2 900.2H798.6A247.7 247.7 0 0 1 1023.1 547.8ZM251.2 136.3H949.2L600.1 392.2ZM1266.6 603.7L1131.7 468.8A43.4 43.4 0 1 0 1070.5 529.9L1131.5 590.9H1023.1A204.5 204.5 0 0 0 1023.1 999.9 43.4 43.4 0 1 0 1023.1 913.2 117.9 117.9 0 0 1 1023.1 677.1H1131.5L1070.5 738A43.4 43.4 0 0 0 1131.7 799.2L1266.6 664.3A43.4 43.4 0 0 0 1266.6 603.1Z", + "width": 1279 + }, + "search": [ + "dr-reply-active" + ] + }, + { + "uid": "796f61b873eb713c3cb184c49e70853f", + "css": "home-1", + "code": 59553, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1066.3 519.6A79.1 79.1 0 0 1 991.7 571.5H964.4V964.3A35.7 35.7 0 0 1 928.7 1000H714.4V750A178.6 178.6 0 0 0 357.2 750V1000H142.9A35.7 35.7 0 0 1 107.2 964.3V571.5H79.9A80 80 0 0 1 27.4 431.5L444.5 36.3A132.8 132.8 0 0 1 627.1 36.3L1045.2 432.3A78.7 78.7 0 0 1 1066.3 519.6Z", + "width": 1072 + }, + "search": [ + "home" + ] + }, + { + "uid": "897422687ecd85c646013dbd38e16548", + "css": "home-active-1", + "code": 59554, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1066.3 519.6A79.1 79.1 0 0 1 991.7 571.5H964.4V964.3A35.7 35.7 0 0 1 928.7 1000H714.4V750A178.6 178.6 0 0 0 357.2 750V1000H142.9A35.7 35.7 0 0 1 107.2 964.3V571.5H79.9A80 80 0 0 1 27.4 431.5L444.5 36.3A132.8 132.8 0 0 1 627.1 36.3L1045.2 432.3A78.7 78.7 0 0 1 1066.3 519.6Z", + "width": 1072 + }, + "search": [ + "home-active" + ] + }, + { + "uid": "5ca2a97037189bebb49149bf4e66c560", + "css": "view-1", + "code": 59536, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M776.8 250A250 250 0 1 0 1026.8 500 250.2 250.2 0 0 0 776.8 250ZM757.8 425.9A57.4 57.4 0 0 0 700.9 482.8H618.1A141.3 141.3 0 0 1 757.8 343.1ZM1535.4 448.3C1450.9 343.1 1149.2-0.1 776.8-0.1S102.6 342.9 18.1 448.3A82.9 82.9 0 0 0 18.1 551.8C102.6 657 404.3 1000.1 776.8 1000.1S1450.9 657 1535.4 551.8A82.9 82.9 0 0 0 1535.4 448.3ZM776.8 862.1A362 362 0 1 1 1138.8 500 362 362 0 0 1 776.8 862.1Z", + "width": 1553 + }, + "search": [ + "view" + ] + }, + { + "uid": "e7141300a3db6362879b519165a6692a", + "css": "warning-1", + "code": 59537, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1165.9 890.7L649.9 34.8A72.1 72.1 0 0 0 526.5 34.8L10.4 890.7A72.1 72.1 0 0 0 72.1 1000H1104.2A72.1 72.1 0 0 0 1165.9 890.7ZM588.5 296.1A48.8 48.8 0 0 1 643.3 342.4C643.3 432.8 632.7 562.8 632.7 653.2 632.7 676.8 606.8 686.9 588.6 686.9 564.3 686.9 543.7 677 543.7 653.2 543.7 562.8 533.1 432.8 533.1 342.4 533.1 312.8 557.3 296.1 588.5 296.1ZM589.3 856.1A58.5 58.5 0 1 1 647.1 797.6 59.4 59.4 0 0 1 589.3 856.1Z", + "width": 1176 + }, + "search": [ + "warning" + ] + }, + { + "uid": "57ebf92cfa756dbc36d62f99da7427c8", + "css": "add-1", + "code": 59538, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M769.7 0H230.3A230.9 230.9 0 0 0 0 230.3V769.7A230.9 230.9 0 0 0 230.3 1000H769.7A230.9 230.9 0 0 0 1000 769.7V230.3A230.9 230.9 0 0 0 769.7 0ZM705.2 543.1H553.6A8.8 8.8 0 0 0 544.8 551.9V704A44.7 44.7 0 0 1 455.4 704V552A8.8 8.8 0 0 0 446.6 543.2H294.7A44.7 44.7 0 0 1 294.7 453.8H446.4A8.8 8.8 0 0 0 455.2 445V293.1A44.7 44.7 0 1 1 544.6 293.1V444.9A8.8 8.8 0 0 0 553.4 453.9H705.2A44.7 44.7 0 1 1 705.2 543.3Z", + "width": 1000 + }, + "search": [ + "add" + ] + }, + { + "uid": "701ccc7879b5b7e2395223f67ee3fed6", + "css": "arrow-forward-1", + "code": 59539, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1357 455.8L919.2 18.3A62.5 62.5 0 1 0 830.8 106.7L1161.6 437.6H62.5A62.5 62.5 0 1 0 62.5 562.6H1161.7L830.9 893.4A62.5 62.5 0 1 0 919.3 981.8L1357 544.2A62.5 62.5 0 0 0 1357 455.8Z", + "width": 1375 + }, + "search": [ + "arrow-forward" + ] + }, + { + "uid": "fd40af0f29902301b193447a13ab5659", + "css": "back-1", + "code": 59540, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M14.6 535.8L464.3 985.3A50.5 50.5 0 1 0 535.8 914L121.8 500.1 535.8 86.2A50.5 50.5 0 0 0 464.3 14.7L14.6 464.3A51 51 0 0 0 14.6 535.8Z", + "width": 551 + }, + "search": [ + "back" + ] + }, + { + "uid": "baed05d36f0b6e141e441451248ebbe4", + "css": "close-1", + "code": 59541, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M591.6 500L981.2 110.4A64.8 64.8 0 1 0 889.4 19L499.8 408.6 110.2 19A64.8 64.8 0 0 0 19 110.6L408.6 500.2 19 889.8A64.8 64.8 0 1 0 110.6 981.4L500.2 591.8 889.8 981.4A64.8 64.8 0 1 0 981.4 889.8ZM591.6 500", + "width": 1000 + }, + "search": [ + "close" + ] + }, + { + "uid": "b5a7f641f7cea4777506552ec8be6ad6", + "css": "edit-1", + "code": 59542, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M571.4 635.7A88.7 88.7 0 0 1 537 657L412.7 698.4A87.7 87.7 0 0 1 384.9 702.9H384.9A87.9 87.9 0 0 1 301.5 587.2L342.9 462.9A88.3 88.3 0 0 1 364.1 428.6L632.7 160.1H107.4A107.5 107.5 0 0 0 0 267.6V892.6A107.5 107.5 0 0 0 107.4 999.8H732.4A107.5 107.5 0 0 0 839.9 892.4V367.3ZM405.7 469.9A29.3 29.3 0 0 0 398.6 481.4L357.2 605.7A29.3 29.3 0 0 0 394.2 642.7L518.5 601.3A29.3 29.3 0 0 0 530 594.2L895.9 228.2 771.7 103.9ZM930.5 14.3A48.8 48.8 0 0 0 861.4 14.3L813.1 62.6 937.4 186.9 985.7 138.6A48.8 48.8 0 0 0 985.7 69.5Z", + "width": 1000 + }, + "search": [ + "edit" + ] + }, + { + "uid": "c70dff422511b1412c9cb64f63d8c659", + "css": "external-link-1", + "code": 59543, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M945 55A180.6 180.6 0 0 0 812.5 0H187.5A180.6 180.6 0 0 0 55 55 180.6 180.6 0 0 0-0.2 187.5V812.5A180.7 180.7 0 0 0 54.9 945 180.6 180.6 0 0 0 187.4 1000.1H812.5A187.9 187.9 0 0 0 1000 812.5V187.5A180.7 180.7 0 0 0 945 55ZM833.4 520.8A39 39 0 0 1 808 559.2 45.3 45.3 0 0 1 791.7 562.5 38.7 38.7 0 0 1 762.6 550.3L668.6 456.4 321 804A40.9 40.9 0 0 1 262.4 804L196 737.6A40.9 40.9 0 0 1 196 679.1L543.6 331.4 449.9 237.6A37.6 37.6 0 0 1 440.8 192.1 39 39 0 0 1 479.3 166.7H791.8A42.2 42.2 0 0 1 833.5 208.3V520.8Z", + "width": 1000 + }, + "search": [ + "external-link" + ] + }, + { + "uid": "4d39d4d5f8ce4a22a6541b02dd4c63df", + "css": "verify-finger-1", + "code": 59544, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M891.9 0H108.1A108.2 108.2 0 0 0 0 108.1V891.9A108.2 108.2 0 0 0 108.1 1000H891.9A108.2 108.2 0 0 0 1000 891.9V108.1A108.2 108.2 0 0 0 891.9 0ZM185.9 192.6C393.8 41.7 612.9 43.3 817.7 195.2A29.3 29.3 0 0 1 800.1 248.1C766.9 248.1 540.5 7.4 220.2 240A29.3 29.3 0 0 1 185.7 192.6ZM459 946A29.3 29.3 0 0 1 418.2 938.6C377.1 878.9 283.2 812.1 283.2 687.5A225.3 225.3 0 0 1 500 454.9 225.3 225.3 0 0 1 716.8 687.5V718.9A29.3 29.3 0 0 1 658.2 718.9V687.6A166.8 166.8 0 0 0 500 513.8 166.8 166.8 0 0 0 341.8 687.5C341.8 828.8 521.5 902.7 459 946ZM823.1 794.4A153.5 153.5 0 0 1 533.2 718.9C533.2 592.6 446.8 635.1 465.9 711.8A29.3 29.3 0 0 1 409.1 725.9C369.2 566.3 591.8 501.6 591.8 718.9A94.5 94.5 0 0 0 665.2 816.5C800.8 848.5 841 624.8 705.8 480.7 518.8 281.3 216.8 435 216.8 671.9A237 237 0 0 0 258.2 826.8 29.3 29.3 0 0 1 210.6 860.8 298.5 298.5 0 0 1 158.2 671.9 347.5 347.5 0 0 1 500.1 330.1C752.9 330.1 913.6 613.5 823.1 794.3ZM842.7 431.8A29.3 29.3 0 0 1 802.7 420.9C744.4 318.7 603.2 263.8 500 263.8A419.4 419.4 0 0 0 196.2 422.6 29.3 29.3 0 0 1 147.5 390.1 474.9 474.9 0 0 1 499.9 205.2C716.9 205.2 910.7 392.8 842.5 431.8Z", + "width": 1000 + }, + "search": [ + "verify-finger" + ] + }, + { + "uid": "74c58b33ed0f729dac0b04e0f633144b", + "css": "verify-sms-1", + "code": 59545, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M900 0H100A100.3 100.3 0 0 0 0 100V1000L200 800H900A100.3 100.3 0 0 0 1000 700V100A100.3 100.3 0 0 0 900 0ZM350 450H250V350H350ZM550 450H450V350H550ZM750 450H650V350H750Z", + "width": 1000 + }, + "search": [ + "verify-sms" + ] + }, + { + "uid": "0e20d240c0f8396c7076464e122f8e1b", + "css": "verify-face-1", + "code": 59546, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M724.2 694.2L587.6 666.9A31.2 31.2 0 0 1 562.5 636.3V604.9A369.6 369.6 0 0 0 588.7 558.3 267.2 267.2 0 0 1 609.9 520.3 201.7 201.7 0 0 0 673.3 420.4 93.1 93.1 0 0 0 664.2 347 551.6 551.6 0 0 0 653.6 220.2 137.4 137.4 0 0 0 621.1 119.6 96.5 96.5 0 0 0 563.1 95.2 96.8 96.8 0 0 1 541.9 90.3 218.8 218.8 0 0 0 436.3 62.5 245.8 245.8 0 0 0 218.7 212 367.2 367.2 0 0 0 210.1 325.2L209.3 347.1A99.4 99.4 0 0 0 201.4 420.4 201.2 201.2 0 0 0 264.7 520.4 275.4 275.4 0 0 1 286.2 558.3 379.2 379.2 0 0 0 312.6 604.9V636.2A31.4 31.4 0 0 1 287.5 666.9L150.8 694.2A188.1 188.1 0 0 0 0 878.1V937.5A62.6 62.6 0 0 0 62.5 1000.2H812.5A62.5 62.5 0 0 0 875 937.7V878.1A188.2 188.2 0 0 0 724.2 694.2ZM156.3 0H31.3A31.3 31.3 0 0 0 0 31.3V218.8A31.3 31.3 0 0 0 62.5 218.8V62.5H156.3A31.3 31.3 0 0 0 156.3 0ZM156.3 562.5H62.5V406.2A31.3 31.3 0 0 0 0 406.2V593.7A31.3 31.3 0 0 0 31.3 625H156.3A31.3 31.3 0 1 0 156.3 562.5ZM843.8 0H718.8A31.3 31.3 0 0 0 718.8 62.5H812.5V218.8A31.3 31.3 0 0 0 875 218.8V31.3A31.3 31.3 0 0 0 843.8 0ZM843.8 375A31.3 31.3 0 0 0 812.5 406.2V562.5H718.7A31.3 31.3 0 0 0 718.7 625H843.7A31.3 31.3 0 0 0 875 593.7V406.2A31.3 31.3 0 0 0 843.8 375Z", + "width": 875 + }, + "search": [ + "verify-face" + ] + }, + { + "uid": "6087d36029eda9021846e21ed70401ad", + "css": "qr-reader-active-1", + "code": 59548, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M50 400A50 50 0 0 0 100 350V150A50 50 0 0 1 150 100H350A50 50 0 1 0 350 0H150A150 150 0 0 0 0 150V350A50 50 0 0 0 50 400ZM850 0H650A50 50 0 0 0 650 100H850A50 50 0 0 1 900 150V350A50 50 0 1 0 1000 350V150A150 150 0 0 0 850 0ZM950 600A50 50 0 0 0 900 650V850A50 50 0 0 1 850 900H650A50 50 0 0 0 650 1000H850A150 150 0 0 0 1000 850V650A50 50 0 0 0 950 600ZM350 900H150A50 50 0 0 1 100 850V650A50 50 0 0 0 0 650V850A150 150 0 0 0 150 1000H350A50 50 0 1 0 350 900Z", + "width": 1000 + }, + "search": [ + "qr-reader-active" + ] + }, + { + "uid": "5131f993095debb39e88eddafbe54f5a", + "css": "qr-reader-1", + "code": 59547, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M50 400A50 50 0 0 0 100 350V150A50 50 0 0 1 150 100H350A50 50 0 1 0 350 0H150A150 150 0 0 0 0 150V350A50 50 0 0 0 50 400ZM850 0H650A50 50 0 0 0 650 100H850A50 50 0 0 1 900 150V350A50 50 0 1 0 1000 350V150A150 150 0 0 0 850 0ZM950 600A50 50 0 0 0 900 650V850A50 50 0 0 1 850 900H650A50 50 0 0 0 650 1000H850A150 150 0 0 0 1000 850V650A50 50 0 0 0 950 600ZM350 900H150A50 50 0 0 1 100 850V650A50 50 0 0 0 0 650V850A150 150 0 0 0 150 1000H350A50 50 0 1 0 350 900Z", + "width": 1000 + }, + "search": [ + "qr-reader" + ] + }, + { + "uid": "90a143d3da24d4bddb6eefb8cb5036dc", + "css": "schedule-1", + "code": 59549, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M900 0H99.9A100.3 100.3 0 0 0 0 99.9V900A100.3 100.3 0 0 0 99.9 999.8H900A100.3 100.3 0 0 0 999.8 900V99.9A100.3 100.3 0 0 0 900 0ZM269.9 880H116.7V743.8H269.9V880ZM269.9 698.1H116.7V561.9H269.9V698.1ZM258.3 151.6A42.5 42.5 0 1 1 300.8 109.1 42.4 42.4 0 0 1 258.3 151.6ZM474.3 880H321.1V743.8H474.3ZM474.3 698.1H321.1V561.9H474.3ZM474.3 516.3H321.1V380H474.3ZM457.6 109.1A42.4 42.4 0 1 1 500 151.5 42.4 42.4 0 0 1 457.6 109.1ZM678.9 698.1H525.6V561.9H679.1V698.1ZM678.9 516.3H525.6V380H679.1V516.3ZM699 109.1A42.4 42.4 0 1 1 741.5 151.5 42.4 42.4 0 0 1 699 109.1ZM883.2 698.1H730.1V561.9H883.3ZM883.2 516.3H730.1V380H883.3Z", + "width": 1000 + }, + "search": [ + "schedule" + ] + }, + { + "uid": "9cd17bfbecffdbb2c87645848f62a267", + "css": "dr-reply-1", + "code": 59551, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1023.2 547.7H1029.4A86.7 86.7 0 0 1 1162.4 438.2L1200.4 476.2V101.1A101.2 101.2 0 0 0 1099.2 0H101.2A101.2 101.2 0 0 0 0 101.1V799A101.2 101.2 0 0 0 101.2 900.2H798.6A247.7 247.7 0 0 1 1023.1 547.8ZM251.2 136.3H949.2L600.1 392.2ZM1266.6 603.7L1131.7 468.8A43.4 43.4 0 1 0 1070.5 529.9L1131.5 590.9H1023.1A204.5 204.5 0 0 0 1023.1 999.9 43.4 43.4 0 1 0 1023.1 913.2 117.9 117.9 0 0 1 1023.1 677.1H1131.5L1070.5 738A43.4 43.4 0 0 0 1131.7 799.2L1266.6 664.3A43.4 43.4 0 0 0 1266.6 603.1Z", + "width": 1279 + }, + "search": [ + "dr-reply" + ] + }, + { + "uid": "3841d430a51b3781fd60835bb120fd57", + "css": "schedule-active-1", + "code": 59550, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M900 0H99.9A100.3 100.3 0 0 0 0 99.9V900A100.3 100.3 0 0 0 99.9 999.8H900A100.3 100.3 0 0 0 999.8 900V99.9A100.3 100.3 0 0 0 900 0ZM269.9 880H116.7V743.8H269.9V880ZM269.9 698.1H116.7V561.9H269.9V698.1ZM258.3 151.6A42.5 42.5 0 1 1 300.8 109.1 42.4 42.4 0 0 1 258.3 151.6ZM474.3 880H321.1V743.8H474.3ZM474.3 698.1H321.1V561.9H474.3ZM474.3 516.3H321.1V380H474.3ZM457.6 109.1A42.4 42.4 0 1 1 500 151.5 42.4 42.4 0 0 1 457.6 109.1ZM678.9 698.1H525.6V561.9H679.1V698.1ZM678.9 516.3H525.6V380H679.1V516.3ZM699 109.1A42.4 42.4 0 1 1 741.5 151.5 42.4 42.4 0 0 1 699 109.1ZM883.2 698.1H730.1V561.9H883.3ZM883.2 516.3H730.1V380H883.3Z", + "width": 1000 + }, + "search": [ + "schedule-active" + ] + }, + { + "uid": "3375043683ed20c80d3307cef405e3ff", + "css": "verify-face", + "code": 59555, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M181.3 0H36.2A36.3 36.3 0 0 0 0 36.2V253.7A36.2 36.2 0 0 0 72.5 253.7V72.5H181.3A36.2 36.2 0 1 0 181.3 0ZM181.3 927.5H72.5V746.2A36.2 36.2 0 1 0 0 746.2V963.7A36.3 36.3 0 0 0 36.2 1000H181.3A36.2 36.2 0 1 0 181.3 927.5ZM978.8 0H833.7A36.2 36.2 0 0 0 833.7 72.5H942.5V253.8A36.2 36.2 0 0 0 1015 253.8V36.2A36.3 36.3 0 0 0 978.8 0ZM978.8 710A36.3 36.3 0 0 0 942.5 746.2V927.5H833.8A36.2 36.2 0 0 0 833.8 1000H978.8A36.3 36.3 0 0 0 1015 963.8V746.3A36.3 36.3 0 0 0 978.8 710ZM507.5 144.9A350.9 350.9 0 1 0 858.4 495.8 350.9 350.9 0 0 0 507.5 144.9ZM637 378.9A50.3 50.3 0 1 1 586.7 429.2 50.3 50.3 0 0 1 637 378.9ZM378 378.9A50.3 50.3 0 1 1 327.7 429.2 50.3 50.3 0 0 1 378 378.9ZM696.8 617.8A229.7 229.7 0 0 1 318.1 617.8 30.7 30.7 0 1 1 368.8 582.9 168.3 168.3 0 0 0 646.3 582.9 30.7 30.7 0 1 1 696.8 617.8Z", + "width": 1015 + }, + "search": [ + "verify-face" + ] + }, + { + "uid": "49b31d628bdc0d2127dc489c84c7101b", + "css": "verify-finger", + "code": 59556, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M792.5 147.2H237.8A76.6 76.6 0 0 0 161.3 223.7V778.4A76.6 76.6 0 0 0 237.8 854.9H792.5A76.6 76.6 0 0 0 869.1 778.4V223.7A76.6 76.6 0 0 0 792.5 147.2ZM292.8 283.5C439.9 176.7 595 177.8 739.9 285.4A20.8 20.8 0 0 1 727.6 322.8C704.1 322.8 543.8 152.4 317.1 317.1A20.7 20.7 0 0 1 292.8 283.5ZM486.1 816.8A20.7 20.7 0 0 1 457.2 811.5C428 769.3 361.6 722.1 361.6 633.8A159.5 159.5 0 0 1 515.1 469.3 159.5 159.5 0 0 1 668.7 633.8V655.9A20.7 20.7 0 0 1 627.2 655.9V633.8A118 118 0 0 0 515.2 510.7 118 118 0 0 0 403.3 633.8C403.3 733.7 530.5 786.1 486.2 816.8ZM743.8 709.5A108.7 108.7 0 0 1 538.7 656C538.7 566.5 477.5 596.6 491.1 650.9A20.7 20.7 0 0 1 450.8 661C422.6 548 580.2 502.2 580.2 656A66.9 66.9 0 0 0 632.1 725C728.1 747.7 756.6 589.3 660.8 487.4 528.5 346.3 314.7 455.1 314.7 622.8A167.7 167.7 0 0 0 344.1 732.4 20.7 20.7 0 0 1 310.4 756.5 211.3 211.3 0 0 1 273.3 622.8 245.9 245.9 0 0 1 515.3 380.8C694.1 380.8 807.9 581.4 744.1 709.6ZM757.7 452.8A20.7 20.7 0 0 1 729.4 445.1C688.2 372.8 588.3 333.9 515.3 333.9A296.7 296.7 0 0 0 300.3 446.4 20.7 20.7 0 0 1 265.8 423.4 336.1 336.1 0 0 1 515.3 292.5C668.9 292.5 806 425.3 757.8 452.9ZM181.3 0H36.2A36.3 36.3 0 0 0 0 36.2V253.7A36.2 36.2 0 0 0 72.5 253.7V72.5H181.3A36.2 36.2 0 1 0 181.3 0ZM181.3 927.5H72.5V746.2A36.2 36.2 0 1 0 0 746.2V963.7A36.3 36.3 0 0 0 36.2 1000H181.3A36.2 36.2 0 1 0 181.3 927.5ZM978.8 0H833.7A36.2 36.2 0 0 0 833.7 72.5H942.5V253.8A36.2 36.2 0 0 0 1015 253.8V36.2A36.3 36.3 0 0 0 978.8 0ZM978.8 710A36.3 36.3 0 0 0 942.5 746.2V927.5H833.8A36.2 36.2 0 0 0 833.8 1000H978.8A36.3 36.3 0 0 0 1015 963.8V746.3A36.3 36.3 0 0 0 978.8 710Z", + "width": 1015 + }, + "search": [ + "verify-finger" + ] + }, + { + "uid": "f57a7cc9bc5e75095215adfc141a8b17", + "css": "verify-whtsapp", + "code": 59557, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M132.6 857.5L196.3 666.3A364.2 364.2 0 1 1 340.1 802.9ZM742 601.7C725.1 569.9 663.1 533.6 663.1 533.6 649 525.7 632.1 524.7 624.1 538.8A321.2 321.2 0 0 1 598.8 566.5 47.1 47.1 0 0 1 531.8 559.8L481 508.9 430.1 458A47.1 47.1 0 0 1 423.5 391.3 321.3 321.3 0 0 1 451.1 366C465.4 358.1 464.5 341.1 456.4 327.1 456.4 327.1 420 265 388.2 248.2A34.8 34.8 0 0 0 347.3 254.3L324.8 276.8C253.6 348 288.6 428.5 359.9 499.8L425.3 564.9 490.5 630C561.7 701.3 642.2 736.4 713.5 665.1L735.9 642.6A34.9 34.9 0 0 0 742 601.7ZM181.3 0H36.2A36.3 36.3 0 0 0 0 36.2V253.7A36.2 36.2 0 0 0 72.5 253.7V72.5H181.3A36.2 36.2 0 1 0 181.3 0ZM181.3 927.5H72.5V746.3A36.2 36.2 0 1 0 0 746.3V963.8A36.3 36.3 0 0 0 36.2 1000H181.3A36.2 36.2 0 1 0 181.3 927.5ZM978.8 0H833.7A36.2 36.2 0 0 0 833.7 72.5H942.5V253.8A36.2 36.2 0 0 0 1015 253.8V36.2A36.3 36.3 0 0 0 978.8 0ZM978.8 710A36.3 36.3 0 0 0 942.5 746.3V927.5H833.8A36.2 36.2 0 0 0 833.8 1000H978.8A36.3 36.3 0 0 0 1015 963.8V746.3A36.3 36.3 0 0 0 978.8 710Z", + "width": 1015 + }, + "search": [ + "verify-whtsapp" + ] + }, + { + "uid": "89f9e9928bf0aa0ec55c15055f8ce27a", + "css": "verify-sms", + "code": 59558, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M766.3 175.1H252.2A64.5 64.5 0 0 0 187.9 239.4V817.7L316.4 689.2H766.1A64.5 64.5 0 0 0 830.5 624.8V239.4A64.5 64.5 0 0 0 766.3 175.1ZM412.8 464.4H348.5V400H412.8ZM541.3 464.4H477.2V400H541.3ZM669.8 464.4H605.6V400H669.9ZM181.3 0H36.2A36.3 36.3 0 0 0 0 36.2V253.7A36.2 36.2 0 0 0 72.5 253.7V72.5H181.3A36.2 36.2 0 1 0 181.3 0ZM181.3 927.5H72.5V746.2A36.2 36.2 0 1 0 0 746.2V963.7A36.3 36.3 0 0 0 36.2 1000H181.3A36.2 36.2 0 1 0 181.3 927.5ZM978.8 0H833.7A36.2 36.2 0 0 0 833.7 72.5H942.5V253.8A36.2 36.2 0 0 0 1015 253.8V36.2A36.3 36.3 0 0 0 978.8 0ZM978.8 710A36.3 36.3 0 0 0 942.5 746.2V927.5H833.8A36.2 36.2 0 0 0 833.8 1000H978.8A36.3 36.3 0 0 0 1015 963.8V746.3A36.3 36.3 0 0 0 978.8 710Z", + "width": 1015 + }, + "search": [ + "verify-sms" + ] + }, + { + "uid": "efc8c6ed2dab146bc55ca80fdd9bc511", + "css": "124", + "code": 59559, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M315.2 3.2L315.2 3.2A45.2 45.2 0 0 1 322.4 3.2S326 3.2 328.4 3.2H328.4A42.4 42.4 0 0 1 336 3.2H336A26.4 26.4 0 0 1 342 3.2H342A37.6 37.6 0 0 1 346.8 6.8 40 40 0 0 1 353.6 11.6L353.6 11.6 600.8 278.8A40 40 0 0 1 604.4 335.2 40 40 0 0 1 547.6 335.2L370 142.8V920H1250A40 40 0 0 1 1250 1000H330A40 40 0 0 1 290 960V129.2L66.4 329.2A40 40 0 0 1 10 325.6 40 40 0 0 1 0 299.2 40 40 0 0 1 13.2 269.2L304.8 10.4A36.4 36.4 0 0 1 310 7.2 40 40 0 0 1 315.2 3.2Z", + "width": 1290 + }, + "search": [ + "124" + ] + }, + { + "uid": "2251120e332d8914aca7fb2d3fbe00f2", + "css": "123", + "code": 59560, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M773 755.3S773 755.3 773 755.3A38.8 38.8 0 0 0 773 749.5 21.7 21.7 0 0 0 773 745.1V745.1A55.8 55.8 0 0 0 773 739.2H773A25.7 25.7 0 0 0 773 734.6V734.6S770.9 732.1 769.9 730.5A31 31 0 0 0 766.2 725.3H766.2L558.1 529.6A31 31 0 0 0 514.1 531.5 31 31 0 0 0 516 575.2L665.1 713.2H62V31A31 31 0 0 0 0 31V744.2A31 31 0 0 0 31 775.2H675.3L520.3 948.5A31 31 0 1 0 566.8 989.5L766.2 764.7S766.2 762.2 768.4 760.9A33.5 33.5 0 0 0 773 755.3Z", + "width": 775 + }, + "search": [ + "123" + ] + }, + { + "uid": "bffd96d1421ef42e3a097855b3820d42", + "css": "obese-bmi-r-1", + "code": 59561, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M307.3 571.7C305.2 589.1 322 680.9 330.6 716.9 334.8 734 346.1 761.8 342 776.5A153.3 153.3 0 0 0 337.7 839.2C339.7 848.6 346 892 337 907.9A369.5 369.5 0 0 0 323.5 958.9C300.8 999.1 313.6 997.1 313.6 997.1 320.6 1003.2 332.7 997.6 332.7 997.6A15.3 15.3 0 0 0 348.1 996.6 18.9 18.9 0 0 0 365.2 996.1 22.4 22.4 0 0 0 384.2 993C389.9 995 391.3 992.5 391.3 992.5 408.3 991.7 381.8 953.5 381.8 953.5A76.3 76.3 0 0 1 388.1 900C429.5 813.7 431.7 790.8 415.1 758.3 410.4 748.9 409.2 745.2 411.4 741.1 416.3 731.7 412.7 693.9 418.8 678.8 430.5 649.9 442 576.4 448 542.1 456.1 495.9 419.4 434 419.4 434 411.4 408.8 423.1 319 423.1 319 439.6 336.9 439 368.6 439 368.6 436.4 401.9 477.2 452.7 477.2 452.7A118.4 118.4 0 0 1 504.3 495.1C504.3 501.1 502.4 515.8 502.4 515.8L503.2 528.5A129.3 129.3 0 0 1 505.7 548.3C502.6 581.6 510.2 575.3 510.2 575.3 516.5 575.3 523.5 548.5 523.5 548.5 523.5 555.4 521.1 576.1 526.4 583.9 532.7 593.2 537.4 582.3 537.5 580.1 539.2 537.8 542.8 548.9 542.8 548.9 546.3 583.2 550.7 591 558.4 588.3 564.3 586.3 558.9 547.1 558.9 547.1 569 570.4 576.7 574.1 576.7 574.1 593.3 582.3 583 559.6 580.7 555.1A99.2 99.2 0 0 1 568 523C583.4 544.5 595 543.6 595 543.6 610 540.3 581.9 509.9 565.4 495.4A126 126 0 0 1 543 472.2 203.5 203.5 0 0 1 534 430.1C532.4 392.3 519.1 375.9 519.1 375.9 496.3 350.3 492 302.5 492 302.5L491 221.9C483 166.9 425.3 166.5 425.3 166.5 366.9 160.4 358.8 147.2 358.8 147.2 346.4 134.7 353.5 110.8 353.5 110.8A38.7 38.7 0 0 0 367.7 89.4C384.7 80.2 383.9 66.8 376 66.9 369.7 67 371.2 63.4 371.2 63.4 381.9 3.1 305.5 0 305.5 0H293.9S217.5 3.1 228.1 63.4C228.1 63.4 229.6 67.1 223.2 67 215.4 66.8 214.6 80.3 231.6 89.4A38.7 38.7 0 0 0 245.8 110.8S252.9 134.8 240.5 147.2C240.5 147.2 232.4 160.5 174 166.6 174 166.6 116.2 167 108.3 222L107.2 302.6S103 350.3 80.2 375.9C80.2 375.9 66.9 392.4 65.4 430.2A204.8 204.8 0 0 1 56.4 472.3 124.6 124.6 0 0 1 33.9 495.5C17.3 510-10.7 540.2 4.3 543.7 4.3 543.7 16 544.5 31.3 523.1A98.1 98.1 0 0 1 18.7 555.2C16.3 559.6 6 582.3 22.6 574.2 22.6 574.2 30.3 570.4 40.4 547.1 40.4 547.1 35 586.4 41 588.4 48.8 591 53.1 583.3 56.6 548.9 56.6 548.9 60.2 537.8 61.9 580.2 62 582.4 66.5 593.3 72.9 584 78.3 576.2 75.9 555.5 75.9 548.6 75.9 548.6 82.8 575.4 89.2 575.4 89.2 575.4 96.8 581.7 93.7 548.4A119.1 119.1 0 0 1 96.2 528.5L96.9 515.8S95 501.1 95 495.1A118.3 118.3 0 0 1 122.1 452.7S162.9 401.8 160.3 368.6C160.3 368.6 159.7 336.9 176.2 319 176.2 319 187.9 408.8 180 434 180 434 143.2 495.9 151.3 542.1 157.3 576.5 168.8 649.9 180.5 678.8 186.6 693.8 183 731.7 187.9 741.1 190.1 745.2 188.9 749 184.2 758.3 167.7 790.8 169.8 813.7 211.3 900A75.6 75.6 0 0 1 217.6 953.5S191.1 991.7 208.1 992.5C208.1 992.5 209.4 995 215.1 993A22.4 22.4 0 0 0 234.2 996.1 18.8 18.8 0 0 0 251.2 996.6 15.2 15.2 0 0 0 266.7 997.6S278.7 1003.3 285.8 997.1C285.8 997.1 298.5 999.1 275.9 958.9A367.7 367.7 0 0 0 262.5 907.9C253.4 892.1 259.9 848.6 261.8 839.2A155.9 155.9 0 0 0 257.5 776.5C253.3 761.8 264.7 734 268.9 716.9 277.5 680.9 294.3 589.1 292.2 571.7L299.2 573.4A18.3 18.3 0 0 0 307.3 571.7Z", + "width": 599 + }, + "search": [ + "obese-bmi-r" + ] + }, + { + "uid": "e3578bfad1396ea9b38bd70c249fa1e5", + "css": "inpatient", + "code": 59737, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M970.7 470.7A29.3 29.3 0 0 0 941.5 500V646.3H878A145.5 145.5 0 0 0 735.6 529.2H421.9V557.4L361.6 556.4A149.2 149.2 0 0 0 235.9 525.1 87.8 87.8 0 1 0 64.6 493.3L58.6 489.5V380.8A29.3 29.3 0 0 0 0 380.8V970.7A29.3 29.3 0 0 0 58.6 970.7V824.3H941.5V970.7A29.3 29.3 0 0 0 1000 970.7V500A29.3 29.3 0 0 0 970.7 470.7ZM58.5 646.3V558.5L197.7 646.3ZM294.9 89.9H353.4V148.4H324.1A29.3 29.3 0 0 0 294.9 177.7V236.2A87.8 87.8 0 0 0 470.5 236.2V177.7A29.3 29.3 0 0 0 441.2 148.4H412V89.9H529V470.7H587.6V29.3A29.3 29.3 0 1 0 529 31.2H294.9A29.3 29.3 0 0 0 294.9 89.8Z", + "width": 1000 + }, + "search": [ + "inpatient" + ] + }, + { + "uid": "1ca5ef3569be282fb05f15395a81d2a0", + "css": "discharge", + "code": 59738, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M985.1 464.6H985.1L535.1 14.6A49.8 49.8 0 0 0 464.8 14.6L14.6 464.6A50.1 50.1 0 0 0 14.6 535.4L464.6 985.1V985.4A50.1 50.1 0 0 0 535.4 985.4L985.3 535.4A49.9 49.9 0 0 0 985.1 464.6ZM599.7 624.9V500H399.7V650H299.7V450A49.8 49.8 0 0 1 349.7 400H599.7V274.9L774.7 449.9Z", + "width": 1000 + }, + "search": [ + "discharge" + ] + }, + { + "uid": "1738fd6466298efa6012247ca0941077", + "css": "order-sheets", + "code": 59739, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M736 84.4A87.2 87.2 0 0 0 673.9 58.6H635V97.6A78.2 78.2 0 0 1 556.9 175.8H205.8A78.2 78.2 0 0 1 127.7 97.6V58.6H88.6A87.9 87.9 0 0 0 0.9 146.4L0 912A87.9 87.9 0 0 0 87.8 1000.1H673A87.9 87.9 0 0 0 760.7 912.3L761.6 146.7A87.4 87.4 0 0 0 736 84.4ZM390.7 351.6H598.7A29.3 29.3 0 0 1 598.7 410.1H390.8A29.3 29.3 0 0 1 390.8 351.6ZM390.7 546.9H598.7A29.3 29.3 0 0 1 598.7 605.5H390.8A29.3 29.3 0 0 1 390.8 546.9ZM390.7 742.2H599.6A29.3 29.3 0 0 1 599.6 800.8H390.7A29.3 29.3 0 0 1 390.7 742.2ZM141.5 352.7A29.2 29.2 0 0 1 182.8 352.7L198.7 368.6 266.2 301.1A29.3 29.3 0 1 1 307.6 342.5L219.4 430.8A29.2 29.2 0 0 1 178.1 430.8L141.6 394.2A29.3 29.3 0 0 1 141.5 352.7ZM141.5 562.9A29.2 29.2 0 0 1 182.8 562.9L198.7 578.8 266.2 511.3A29.3 29.3 0 0 1 307.6 552.7L219.4 641A29.2 29.2 0 0 1 178.1 641L141.6 604.4A29.3 29.3 0 0 1 141.5 562.9ZM141.5 758.2A29.2 29.2 0 0 1 182.8 758.2L198.7 774.2 266.2 706.6A29.3 29.3 0 0 1 307.6 748.1L219.5 836.3A29.2 29.2 0 0 1 178.1 836.3L141.6 799.7A29.3 29.3 0 0 1 141.5 758.2ZM186.2 97.7A19.5 19.5 0 0 0 205.8 117.2H556.9A19.5 19.5 0 0 0 576.4 97.7V19.5A19.5 19.5 0 0 0 556.9 0H205.7A19.5 19.5 0 0 0 186.2 19.5Z", + "width": 762 + }, + "search": [ + "order-sheets" + ] + }, + { + "uid": "37fe23c97ab802ea172b84fc8a0ee196", + "css": "call", + "code": 59740, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M763.9 671.3L986.8 745.6A19.2 19.2 0 0 1 1000 763.8V846.1A153.8 153.8 0 0 1 846.2 1000 846.1 846.1 0 0 1 0 153.6 153.6 153.6 0 0 1 153.6 0H236A19.2 19.2 0 0 1 254.2 13.2L328.7 236A19.2 19.2 0 0 1 321.1 258.1L221.2 324.5A19.7 19.7 0 0 0 213.7 347.6 800 800 0 0 0 652.2 786 19.7 19.7 0 0 0 675.3 778.5L741.8 678.6A19.2 19.2 0 0 1 763.9 671Z", + "width": 1000 + }, + "search": [ + "call" + ] + }, + { + "uid": "ebce1ce36215365ca8c3dd958beaac65", + "css": "medical-report", + "code": 59741, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M764.6 1000H58.8A58.9 58.9 0 0 1 0 941.1V59A58.9 58.9 0 0 1 58.8 0.1H764.6A58.9 58.9 0 0 1 823.5 59V941.3A58.9 58.9 0 0 1 764.6 1000ZM617.4 690.9A112.6 112.6 0 0 0 504.9 803.4 112.6 112.6 0 0 0 617.4 915.9 112.6 112.6 0 0 0 729.9 803.4V795.9H624.8V690.9ZM640.9 659.9V779.9H760.9V772.4A112.6 112.6 0 0 0 648.4 659.9ZM176.6 417.3A29.5 29.5 0 0 0 147.1 446.7 29.5 29.5 0 0 0 176.6 476.2H647.2A29.4 29.4 0 0 0 676.6 446.7 29.4 29.4 0 0 0 647.2 417.3ZM176.6 276.2A29.4 29.4 0 0 0 147.1 305.6 29.5 29.5 0 0 0 176.6 335.1H647.2A29.4 29.4 0 0 0 676.6 305.6 29.4 29.4 0 0 0 647.2 276.2ZM176.6 147.1A29.4 29.4 0 0 0 147.1 176.5 29.5 29.5 0 0 0 176.6 205.9H382.3A29.5 29.5 0 0 0 411.7 176.5 29.4 29.4 0 0 0 382.3 147.1Z", + "width": 823 + }, + "search": [ + "medical-report" + ] + }, + { + "uid": "c8478a11a2d4271b16c1e1f0464ea1ff", + "css": "painscale", + "code": 59742, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M77 120.3L120.2 77 271.7 228.5 228.4 271.8ZM243.6 24.1L299.8 0 364.8 151.4 308.5 175.6ZM0 299.9L24.1 243.6 175.6 308.6 151.4 364.8ZM726 769.4L769.3 726.2 920.7 877.6 877.4 920.9ZM633.1 846.2L689.3 822.1 754.2 973.6 698 997.7ZM822.2 689.5L846.4 633.3 997.8 698.2 973.7 754.5ZM242.5 415.6A122.4 122.4 0 0 1 415.6 588.7 122.4 122.4 0 1 1 415.6 761.8L177.4 1000 4.3 827.1 242.5 588.9A122.4 122.4 0 0 1 242.5 415.8ZM588.7 415.6A122.4 122.4 0 1 1 588.7 242.5L827 4.3 1000.1 177.4 761.7 415.6A122.4 122.4 0 1 1 588.6 415.6Z", + "width": 1000 + }, + "search": [ + "painscale" + ] + }, + { + "uid": "5a0bdc9deb49171daf7251717ac6d715", + "css": "oxygenation", + "code": 59743, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M498.2 186.2A406.9 406.9 0 1 0 905.1 593.1 407.3 407.3 0 0 0 498.2 186.2ZM498.2 926.9A333.9 333.9 0 1 1 832.1 593 334.3 334.3 0 0 1 498.2 927.1ZM380.8 421A161 161 0 0 0 261.9 463.9 161.5 161.5 0 0 0 219.1 583.5 177.3 177.3 0 0 0 240.7 675 131.7 131.7 0 0 0 297 728.4 201.4 201.4 0 0 0 384.8 745.2 176.5 176.5 0 0 0 472 725.7 133 133 0 0 0 525.5 671 193.7 193.7 0 0 0 544 580.8 158.4 158.4 0 0 0 501.6 463 164 164 0 0 0 380.8 421ZM429.8 652.4A59.8 59.8 0 0 1 381.5 672.7 59.6 59.6 0 0 1 333.5 652 105 105 0 0 1 315.8 583.7 105.3 105.3 0 0 1 333.8 514.9 58.9 58.9 0 0 1 380.8 494.1 61.3 61.3 0 0 1 429.3 514.6 97 97 0 0 1 447.2 579.3 116.6 116.6 0 0 1 430 652.4ZM650.7 682.9C654.7 679.8 662.4 672.9 674.1 664.7A154.2 154.2 0 0 0 714.3 626.2 67.5 67.5 0 0 0 725.3 589.8 57.1 57.1 0 0 0 689 536.1 128.1 128.1 0 0 0 641.6 529 115.3 115.3 0 0 0 595.9 536.3 56.8 56.8 0 0 0 570.4 557.2 91.8 91.8 0 0 0 558 595.2L615.8 600A42.6 42.6 0 0 1 625.2 575.4 26.8 26.8 0 0 1 660.9 575.2 21.6 21.6 0 0 1 667.9 591.4 32.1 32.1 0 0 1 660.8 609.9 169.6 169.6 0 0 1 628.3 638.5 247.6 247.6 0 0 0 571.8 689.1 384.4 384.4 0 0 0 553.6 734.7H711.6V698.3H637.1C642.2 698.3 646.8 686.1 650.7 682.9Z", + "width": 1041 + }, + "search": [ + "oxygenation" + ] + }, + { + "uid": "169c700bad100df58cf4c5f69c96a27e", + "css": "speechtotext", + "code": 59744, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M499.8 132A97.3 97.3 0 0 1 597 229.1V248.1A102.7 102.7 0 0 1 708.8 292.8 98.7 98.7 0 0 1 714 388.3L775.6 461.6A281 281 0 0 0 859.7 261.2V261.2A261 261 0 0 0 598.7 0H317.4V60.6A142.4 142.4 0 0 0 336.6 132ZM816.3 680.9L506.4 787.5 439 1000H1001.6A365.8 365.8 0 0 0 816.3 680.9ZM514.7 722.7L769.6 635 749 552.7A92.8 92.8 0 0 1 747.1 518.5L639.5 390.9 655.3 372A41.8 41.8 0 0 0 614 304.4L538.4 321.9V229.1A38.6 38.6 0 0 0 499.9 190.6H359.1V272.6L275.7 411.6 317.4 453.3V488.2L400.4 522.6 325.7 579.1 332 613.1A41.6 41.6 0 0 0 380 646.6L505.6 625ZM231.1 479.7A81.3 81.3 0 0 0 231.1 594.4L272.5 553A22.6 22.6 0 0 1 272.5 521.1ZM157.7 406.3A185 185 0 0 0 157.7 667.7L199.1 626.2A126.4 126.4 0 0 1 199.1 447.7ZM125.8 374.5L84.4 333.1A288.8 288.8 0 0 0 84.4 741.1L125.8 699.7A230.2 230.2 0 0 1 125.8 374.5Z", + "width": 1002 + }, + "search": [ + "speechtotext" + ] + }, + { + "uid": "4c794fd235deed1e405c7a0d77262155", + "css": "search-medicines", + "code": 59748, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M299 341.8L384.4 427.2 341.6 470A60.5 60.5 0 1 1 256.1 384.6ZM384.6 256.1A60.5 60.5 0 1 1 470 341.6L427.3 384.7 341.8 299.2ZM363.2 0A362.9 362.9 0 0 1 640.3 597.5L747.7 704.9 704.9 747.7 597.5 640.3A363.1 363.1 0 1 1 363.2 0ZM213.3 512.9A121.2 121.2 0 0 0 384.6 512.9L513 384.5A121.1 121.1 0 1 0 341.8 213.3L213.4 341.9A121.2 121.2 0 0 0 213.4 513.1ZM998.2 914.4L811 727.3 725.4 812.9 912.6 1000Z", + "width": 998 + }, + "search": [ + "search-medicines" + ] + }, + { + "uid": "deaae97b03da57c5c739ce04877b4d6e", + "css": "discharge-patients", + "code": 59749, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M44.4 4.2A29.3 29.3 0 0 0 0 29.3V794.9A29.3 29.3 0 0 0 14.2 820.1L248.6 995.9A29.3 29.3 0 0 0 293 970.8V205.1A29.3 29.3 0 0 0 278.8 180ZM205 587.9A29.3 29.3 0 1 1 234.3 558.6 29.3 29.3 0 0 1 205 587.9ZM205 587.9M807.3 329.1A29.3 29.3 0 0 0 761.7 353.5V382.8H498A29.3 29.3 0 0 0 468.8 412.1V470.7A29.3 29.3 0 0 0 498 500H761.7V529.3A29.3 29.3 0 0 0 807.3 553.7L924.4 465.8A29.3 29.3 0 0 0 924.4 417.1ZM807.3 329.1M410.2 470.7V412.1A88 88 0 0 1 498 324.2H644.5V29.3A29.3 29.3 0 0 0 615.3 0H136.4L312.2 131.8A88.4 88.4 0 0 1 351.6 205.1V824.2H615.3A29.3 29.3 0 0 0 644.5 794.9V558.6H498A88 88 0 0 1 410.2 470.7ZM410.2 470.7", + "width": 938 + }, + "search": [ + "discharge-patients" + ] + }, + { + "uid": "1c6f710dc04109a0329ee1f833784815", + "css": "referral-discharge", + "code": 59750, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M681.4 793.1L735.5 860.8 683 913.3 659.1 793.7C663.5 793.4 667.9 793.1 672.4 793.1ZM791.7 793.1L758.6 834.3 725.6 793.1ZM835.9 793.1H844.8C849.3 793.1 853.7 793.4 858.1 793.7L834.2 913.3 781.7 860.8ZM913.8 655.1H912.8A154.1 154.1 0 0 0 913.8 637.9V586.2A34.5 34.5 0 0 1 913.8 655.1ZM603.4 482.7A103.6 103.6 0 0 1 706.9 379.3H810.3A103.6 103.6 0 0 1 913.8 482.8V551.7H844.8A34.5 34.5 0 0 1 810.3 517.2V448.3H775.9V465.5A86.3 86.3 0 0 1 689.7 551.7H603.5ZM603.4 655.1A34.5 34.5 0 1 1 603.4 586.2V637.9A154.1 154.1 0 0 0 604.4 655.1ZM637.9 637.9V586.2H689.6A120.4 120.4 0 0 0 781.2 543.9 69 69 0 0 0 844.7 586.2H879.2V637.9A120.6 120.6 0 0 1 637.9 637.9ZM1000 1000H517.2V948.3A155.6 155.6 0 0 1 625.2 800.5L655.4 951.7A17.3 17.3 0 0 0 667.3 964.8 17.6 17.6 0 0 0 672.3 965.5 17.3 17.3 0 0 0 684.5 960.4L758.5 886.4 832.5 960.5A17.2 17.2 0 0 0 861.7 951.7L891.9 800.5A155.6 155.6 0 0 1 999.8 948.3ZM164.1 413.8L218.3 481.5 165.7 534 141.8 414.5C146.3 414.1 150.7 413.8 155.2 413.8ZM274.5 413.8L241.4 455 208.3 413.8ZM318.6 413.8H327.6C332.1 413.8 336.5 414.1 340.9 414.4L317 534 264.5 481.5ZM396.5 275.8H395.5A154 154 0 0 0 396.5 258.6V206.9A34.5 34.5 0 0 1 396.5 275.8ZM86.2 103.5A103.6 103.6 0 0 1 189.7 0H293.1A103.6 103.6 0 0 1 396.6 103.5V172.4H327.6A34.5 34.5 0 0 1 293.1 137.9V69H258.6V86.2A86.3 86.3 0 0 1 172.4 172.4H86.2ZM86.2 275.9A34.5 34.5 0 1 1 86.2 206.9V258.6A154 154 0 0 0 87.2 275.9ZM120.6 258.6V206.9H172.4A120.4 120.4 0 0 0 264 164.6 69 69 0 0 0 327.5 206.9H362V258.6A120.6 120.6 0 1 1 120.7 258.6ZM482.8 620.7H0V569A155.6 155.6 0 0 1 107.9 421.2L138.2 572.3A17.3 17.3 0 0 0 150.1 585.5 17.6 17.6 0 0 0 155.1 586.2 17.3 17.3 0 0 0 167.3 581.1L241.3 507.1 315.3 581.2A17.2 17.2 0 0 0 344.4 572.3L374.7 421.2A155.6 155.6 0 0 1 482.6 569ZM172.4 827.6A17.2 17.2 0 0 0 155.2 810.3H127.8L206.8 731.3 286.1 810.2H258.8A17.2 17.2 0 0 0 241.6 827.4 206.9 206.9 0 0 0 333.6 999.5 172.6 172.6 0 0 1 172.4 827.6ZM816 71.1A20.5 20.5 0 0 0 784.2 88.1V108.6H599.9A20.5 20.5 0 0 0 579.5 129.1V170A20.5 20.5 0 0 0 599.9 190.5H784.2V211A20.5 20.5 0 0 0 816 228L897.9 166.6A20.5 20.5 0 0 0 897.9 132.5ZM816 71.1", + "width": 1000 + }, + "search": [ + "referral-discharge" + ] + }, + { + "uid": "fbbe1c278b442a4840b03064fe4a2ea4", + "css": "respiration-rate-1", + "code": 59510, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M989.3 410.2C907.2 230.7 805.1 123.6 716.1 123.6A91.6 91.6 0 0 0 667.3 137C595.3 181.3 592 319.6 591.9 334.9 591.9 339.7 590.8 377.9 590 431.1L560.9 420.4V20.1A20.3 20.3 0 0 0 540.6-0.2H499.9A20.3 20.3 0 0 0 479.6 20.1V420.4L450.5 431.1C449.7 378 448.7 339.9 448.6 335.3 448.6 319.6 445.2 181.3 373.2 137A91.6 91.6 0 0 0 324.4 123.6C235.5 123.6 133.3 230.8 51.2 410.3-57.1 647.8 39 972 43.2 985.6A20.1 20.1 0 0 0 67.1 999.3 1776.9 1776.9 0 0 0 243.4 946.2C369.2 900.2 434.5 855.1 442.6 808.2A2836.5 2836.5 0 0 0 451.6 473.7L506.5 453.4H534.7L589.6 473.7A2835.8 2835.8 0 0 0 598.6 808.2C606.7 855.1 671.8 900.2 797.8 946.2A1778.4 1778.4 0 0 0 974.1 999.5 20.1 20.1 0 0 0 998 985.7C1001.8 972 1097.9 647.8 989.3 410.2ZM393.1 500.5L249.7 574.6V634.8L260.7 668.2 288.1 694.8A20.3 20.3 0 0 1 260.1 723.7L230.5 695.2 197 732.2A20.3 20.3 0 0 1 167.2 705.1L209.4 658.4V595.3L130.2 636.3A20.3 20.3 0 1 1 111.7 600.5L129.3 591.4 97.8 566.3A20.3 20.3 0 0 1 122.9 534.8L168.5 571.2 278.8 514.3 184.4 442.5A20.3 20.3 0 0 1 208.8 410.4L239.3 433.5 241.9 410.2A20.3 20.3 0 0 1 281.9 414.6L276.5 461.8 318.5 493.7 374.5 464.8A20.3 20.3 0 1 1 393 500.5ZM942.9 566.3L911.4 591.4 929 600.5A20.3 20.3 0 1 1 910.5 636.3L831.4 595.3V658.2L873.7 705A20.3 20.3 0 0 1 843.8 732.1L810.3 695.1 780.8 723.6A20.3 20.3 0 0 1 752.7 694.7L780.1 668.1 791.1 634.7V574.5L647.7 500.4A20.3 20.3 0 1 1 666.2 464.6L722.2 493.6 764.2 461.7 759 414.5A20.3 20.3 0 1 1 799 410L801.6 433.4 832.1 410.2A20.3 20.3 0 0 1 856.5 442.3L761.9 514 872.2 570.9 917.9 534.5A20.3 20.3 0 0 1 943 566Z", + "width": 1041 + }, + "search": [ + "respiration-rate" + ] + }, + { + "uid": "002f9ea7269e8e2ca9a28d0e87f09a2c", + "css": "end-call", + "code": 59604, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M282.4 546.3L133.8 620.6A13.6 13.6 0 0 1 118.2 618L77 576.8A108.8 108.8 0 0 1 77 423 598.3 598.3 0 0 1 923.2 423.2 108.6 108.6 0 0 1 923.2 576.8L882 618A13.6 13.6 0 0 1 866.4 620.6L717.6 546.3A13.6 13.6 0 0 1 710.4 531.5L727.1 448.2A13.8 13.8 0 0 0 719.3 432.9 565.7 565.7 0 0 0 280.8 432.9 13.8 13.8 0 0 0 273 448.3L289.6 531.4A13.6 13.6 0 0 1 282.3 546.2Z", + "width": 1000 + }, + "search": [ + "end-call" + ] + }, + { + "uid": "ace119a586c0a290d5da68f59038e160", + "css": "end-consultaion", + "code": 59605, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M664.4 0H92.6A92.7 92.7 0 0 0 0 92.6V907.4A92.7 92.7 0 0 0 92.6 1000H664.3A92.7 92.7 0 0 0 756.9 907.4V92.6A92.7 92.7 0 0 0 664.4 0ZM118.7 167.8L176.4 68.5A20.8 20.8 0 1 1 212.4 89.3L173 157.2H587.9L556.4 87.4A20.8 20.8 0 1 1 594.4 70.1L639.1 169.5A20.8 20.8 0 0 1 620.1 198.9H136.8A20.8 20.8 0 0 1 118.7 167.8ZM644.6 608.6H492.4A20.8 20.8 0 0 1 472.7 594.7L458.3 554.1 423.7 813.6A20.8 20.8 0 0 1 403.7 831.6H403.1A20.8 20.8 0 0 1 382.7 814.7L312.5 452.1 266.5 606.1A20.8 20.8 0 0 1 246.6 621H112.3A20.8 20.8 0 1 1 112.3 579.5H231.1L296.8 358.9A20.8 20.8 0 0 1 337.2 360.9L399.1 681.8 428.4 463.2A20.8 20.8 0 0 1 446.8 445.3 21.3 21.3 0 0 1 468.7 459.1L507 567.1H644.5A20.8 20.8 0 1 1 644.5 608.6Z", + "width": 757 + }, + "search": [ + "end-consultaion" + ] + }, + { + "uid": "62a5ade64a871b2006d088b4e107506f", + "css": "folder-open", + "code": 59606, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1130.2 347.1A103.3 103.3 0 0 0 1027.1 244.8H565.1L102.7 246.1A103.3 103.3 0 0 0 0 349.8 17.1 17.1 0 0 0 0 352.4L89.8 898.2A103.3 103.3 0 0 0 192.8 999.9H1117.6A103.3 103.3 0 0 0 1220.7 896.8 17.1 17.1 0 0 0 1220.7 894.2ZM1269.1 113.6H814.5L724.6 6.1A16.8 16.8 0 0 0 711.3 0H344.3A103.3 103.3 0 0 0 241.2 101.7L225.3 197.9H259.5L1027.4 197.9A151.5 151.5 0 0 1 1178.1 342.7L1239.5 715.6 1254.8 807.5A102.5 102.5 0 0 0 1263.6 767.2L1371.6 220.2A16.8 16.8 0 0 0 1371.6 216.9 103.3 103.3 0 0 0 1269.1 113.6Z", + "width": 1372 + }, + "search": [ + "folder-open" + ] + }, + { + "uid": "f696b8dc00777a69a4e1e52df2955ec4", + "css": "folder", + "code": 59607, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1029 245.6H572.9L482 137.6A15.5 15.5 0 0 0 469.6 132H101.5A102.3 102.3 0 0 0 0 234.4V897.8A102.3 102.3 0 0 0 102.2 1000H1029A102.3 102.3 0 0 0 1131.2 897.8V347.7A102.3 102.3 0 0 0 1029 245.6ZM1163 113.4H706.6L615.9 5.6A15.5 15.5 0 0 0 603.5 0H235.5A102.2 102.2 0 0 0 134.5 88H470.1A59.4 59.4 0 0 1 515.7 109.2L593.2 201.2H1029A146.5 146.5 0 0 1 1175.1 347.8V867A102.2 102.2 0 0 0 1264.6 765.7V215.4A102.3 102.3 0 0 0 1163 113.4Z", + "width": 1265 + }, + "search": [ + "folder" + ] + }, + { + "uid": "e794f7865351585b57f62ec43bba8aff", + "css": "link-in", + "code": 59608, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M333.3 750L916.6 750A83.6 83.6 0 0 0 999.9 666.6V83.3A83.6 83.6 0 0 0 916.6 0L333.3 0A83.6 83.6 0 0 0 250 83.3V666.6A83.6 83.6 0 0 0 333.3 750ZM479.1 375V476.6L789.1 166.6 833.2 210.9 523.8 520.7 625.3 520.7V583.3H458.1A41.6 41.6 0 0 1 416.5 541.6V374.9ZM416.7 833.4V916.7H83.3V583.4H166.6V500H41.7A41.8 41.8 0 0 0 0 541.7V958.4A41.9 41.9 0 0 0 41.7 1000.1H458.3A41.9 41.9 0 0 0 500 958.4V833.4Z", + "width": 1000 + }, + "search": [ + "link-in" + ] + }, + { + "uid": "8cbd9cb0e30a60dbfcd1425cb5dbc06d", + "css": "link-out", + "code": 59609, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M916.7 0H333.5A83.4 83.4 0 0 0 250 83.4V666.8A83.4 83.4 0 0 0 333.5 750.2H916.8A83.4 83.4 0 0 0 1000.2 666.8V83.4A83.4 83.4 0 0 0 916.7 0ZM770.8 375V273.3L460.8 583.3 416.7 539 726.7 229.1 625.1 229.1V166.7H791.7A41.6 41.6 0 0 1 833.4 208.3L833.4 375.2ZM416.7 833.3V916.8H83.4V583.4H166.9V500H41.6A41.8 41.8 0 0 0 0 541.6V958.3A41.8 41.8 0 0 0 41.6 1000H458.4A41.8 41.8 0 0 0 500 958.3V833.3Z", + "width": 1000 + }, + "search": [ + "link-out" + ] + }, + { + "uid": "ed96dd3085af227cc96170408b84c816", + "css": "mute-microphone", + "code": 59610, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M584.7 579.6V448.4L305.8 727.3A178.5 178.5 0 0 0 584.7 579.6ZM693 472.9H657.5A20.7 20.7 0 0 0 636.8 493.6V566.3A230.7 230.7 0 0 1 276.1 756.9L221.8 811.2A302.3 302.3 0 0 0 367.6 871.6V923.1H208.8A20.7 20.7 0 0 0 188.1 943.8V979.4A20.7 20.7 0 0 0 208.8 1000H603.3A20.7 20.7 0 0 0 624 979.4V943.8A20.7 20.7 0 0 0 603.3 923.1H444.5V871.6A312.1 312.1 0 0 0 713.8 566.4V493.7A20.7 20.7 0 0 0 693 472.9ZM795.4 79.6A56.9 56.9 0 0 0 715 79.6L584.7 209.9V178.6A178.6 178.6 0 0 0 227.4 178.6V567.1L180.4 614.2A230 230 0 0 1 175.2 566.3V493.6A20.7 20.7 0 0 0 154.5 472.9H119A20.7 20.7 0 0 0 98.3 493.6V566.3A298.4 298.4 0 0 0 119.3 675.3L16.7 777.9A56.9 56.9 0 0 0 97.1 858.4L795.4 160.1A56.9 56.9 0 0 0 795.4 79.6Z", + "width": 812 + }, + "search": [ + "mute-microphone" + ] + }, + { + "uid": "7c8fce018306529b3c40386a8e946374", + "css": "no-video", + "code": 59611, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M69.3 676.7L620.8 125.2H204A135.1 135.1 0 0 0 69.3 260.4ZM1179.1 184.9A135.9 135.9 0 0 0 1052.4 172.5L926.1 225.1A129.2 129.2 0 0 0 904.5 180.5L982.5 102.6A59.9 59.9 0 1 0 897.7 17.9L17.4 898.1A59.5 59.5 0 0 0 17.6 982.4 59.8 59.8 0 0 0 102.3 982.4L210 874.9H796.2A134.6 134.6 0 0 0 926.1 775L1052.4 827.4A134.4 134.4 0 0 0 1179.1 815 134.9 134.9 0 0 0 1239.1 702.7V297.4A134.9 134.9 0 0 0 1179.1 184.9ZM1119.1 702.7A13.7 13.7 0 0 1 1112.3 715 14.6 14.6 0 0 1 1098.4 716.6L930.9 647.5V352.6L1098.2 283.5A14.6 14.6 0 0 1 1112.1 285 13.7 13.7 0 0 1 1119 297.4Z", + "width": 1239 + }, + "search": [ + "no-video" + ] + }, + { + "uid": "7be786f4ac20cbacd06a26d712accfff", + "css": "send-instruction", + "code": 59612, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M436.7 0A436.7 436.7 0 0 0 226.4 819.5L221.3 1000 427.3 873C430.4 873 433.5 873.5 436.7 873.5A436.7 436.7 0 0 0 436.7 0ZM492.4 691.3H380.4V331H492.4ZM435.7 286.9A54.7 54.7 0 0 1 377.5 231 54.7 54.7 0 0 1 436.4 174.2 56.5 56.5 0 1 1 435.6 287Z", + "width": 873 + }, + "search": [ + "send-instruction" + ] + }, + { + "uid": "926041acc7150e19895e12f7bba3d07a", + "css": "transfer-to-admin", + "code": 59613, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M202.7 517.8L148.9 463.9A52.2 52.2 0 0 1 148.9 390.3L414.1 125 342.5 53.3A31.2 31.2 0 0 1 364.6 0H635.4A31.3 31.3 0 0 1 666.7 31.2V302.1A31.2 31.2 0 0 1 613.3 324.2L541.7 252.5 276.4 517.7A52.2 52.2 0 0 1 202.8 517.7ZM302.1 1000H31.2A31.3 31.3 0 0 1 0 968.8V697.9A31.2 31.2 0 0 1 53.3 675.8L125 747.5 390.3 482.2A52.2 52.2 0 0 1 463.9 482.2L517.8 536.1A52.2 52.2 0 0 1 517.8 609.7L252.5 875 324.1 946.7A31.2 31.2 0 0 1 302 1000Z", + "width": 667 + }, + "search": [ + "transfer-to-admin" + ] + } + ] +} \ No newline at end of file diff --git a/lib/widgets/icons_app/doctor_app_icons.dart b/lib/widgets/icons_app/doctor_app_icons.dart new file mode 100644 index 0000000..113fcba --- /dev/null +++ b/lib/widgets/icons_app/doctor_app_icons.dart @@ -0,0 +1,407 @@ +/// Flutter icons DoctorApp +/// Copyright (C) 2021 by original authors @ fluttericon.com, fontello.com +/// This font was generated by FlutterIcon.com, which is derived from Fontello. +/// +/// To use this font, place it in your fonts/ directory and include the +/// following in your pubspec.yaml +/// +/// flutter: +/// fonts: +/// - family: DoctorApp +/// fonts: +/// - asset: fonts/DoctorApp.ttf +/// +/// +/// * MFG Labs, Copyright (C) 2012 by Daniel Bruce +/// Author: MFG Labs +/// License: SIL (http://scripts.sil.org/OFL) +/// Homepage: http://www.mfglabs.com/ +/// +import 'package:flutter/widgets.dart'; + +class DoctorApp { + DoctorApp._(); + + static const _kFontFam = 'DoctorApp'; + static const String _kFontPkg = ""; + + static const IconData female_icon = + IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData male = + IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData reject_icon = + IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_icon_active = + IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData menu_icon = + IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData menu_icon_active = + IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData message_icon = + IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData message_icon_active = + IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData scdedule_icon_active = + IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData schedule_icon = + IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData discharge_patient = + IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData approved_icon = + IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData pending_icon = + IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData in_patient_white = + IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData lab_results = + IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_icon = + IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData referral_1 = + IconData(0xe810, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData progress_notes = + IconData(0xe811, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_icon_1 = + IconData(0xe812, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData operations = + IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData out_patient = + IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData patient = + IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_code = + IconData(0xe816, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData radiology = + IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData referral = + IconData(0xe818, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData male_2 = + IconData(0xe819, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_patient = + IconData(0xe81a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData female_1 = + IconData(0xe81b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_icon_active_1 = + IconData(0xe81c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData menu_icon_1 = + IconData(0xe81d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData mail = + IconData(0xe81e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData medicine_search = + IconData(0xe81f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_code_1 = + IconData(0xe820, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_1 = + IconData(0xe821, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData referred = + IconData(0xe822, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData send = + IconData(0xe823, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData sync_icon = + IconData(0xe824, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData drawer_icon = + IconData(0xe825, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData view = + IconData(0xe826, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData warning = + IconData(0xe827, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData add = + IconData(0xe828, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData close = + IconData(0xe829, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData back = + IconData(0xe82a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData health_summary = + IconData(0xe82b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData powered_by_cs = + IconData(0xe82c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_code_2 = + IconData(0xe82d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ecg = + IconData(0xe82e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData create_episode = + IconData(0xe82f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData booked = + IconData(0xe830, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData admission_req = + IconData(0xe831, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData walkin = + IconData(0xe832, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData reschedule_ = + IconData(0xe833, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData edit = + IconData(0xe834, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData leaves = + IconData(0xe836, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData logout = + IconData(0xe837, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData obese_bmi = + IconData(0xe838, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData livecare = + IconData(0xe839, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData health_bmi = + IconData(0xe83a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData health_bmi_r = + IconData(0xe83b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData modify_episode = + IconData(0xe83c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData height = + IconData(0xe83d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData obese_bmi_r = + IconData(0xe83e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ovrweight_bmi = + IconData(0xe83f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData order_prescription = + IconData(0xe840, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData order_procedures = + IconData(0xe841, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ovrweight_bmi_r = + IconData(0xe842, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData respiration_rate = + IconData(0xe843, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData patient_sick_leave = + IconData(0xe844, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData progress_notes_1 = + IconData(0xe845, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData temperature = + IconData(0xe846, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData underweight_bmi = + IconData(0xe847, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData radiology_1 = + IconData(0xe848, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_patient_1 = + IconData(0xe849, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData referral_bg = + IconData(0xe84a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search = + IconData(0xe84b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_bg = + IconData(0xe84c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData arrival_patients = + IconData(0xe84d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData arrival_patients_bg = + IconData(0xe84e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData refer_patient = + IconData(0xe84f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData underweight_bmi_r = + IconData(0xe850, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData weight = + IconData(0xe851, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData blood_pressure = + IconData(0xe852, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData vital_signs = + IconData(0xe853, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ucaf = + IconData(0xe854, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData filter = + IconData(0xe855, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData male_1 = + IconData(0xe856, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData female = + IconData(0xe857, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData external_link = + IconData(0xe858, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_face_2 = + IconData(0xe859, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_sms_2 = + IconData(0xe85a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home = + IconData(0xe85b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_finger_2 = + IconData(0xe85c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData dr_reply_active = + IconData(0xe85d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData dr_reply = + IconData(0xe85e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData schedule_active = + IconData(0xe85f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData schedule = + IconData(0xe860, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_reader_active = + IconData(0xe861, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_reader = + IconData(0xe862, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_active = + IconData(0xe863, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData arrow_forward = + IconData(0xe864, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData heart_rate = + IconData(0xe865, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData menu_icon_active_1 = + IconData(0xe866, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData message_icon_1 = + IconData(0xe867, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData message_icon_active_1 = + IconData(0xe868, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData scdedule_icon_active_1 = + IconData(0xe869, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ovrweight_bmi_r_1 = + IconData(0xe86a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData underweight_bmi_1 = + IconData(0xe86b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData temperature_1 = + IconData(0xe86c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData underweight_bmi_r_1 = + IconData(0xe86d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData weight_1 = + IconData(0xe86e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData blood_pressure_1 = + IconData(0xe86f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData health_bmi_r_1 = + IconData(0xe870, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData health_bmi_1 = + IconData(0xe871, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData heart_rate_1 = + IconData(0xe872, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData height_1 = + IconData(0xe873, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData obese_bmi_1 = + IconData(0xe874, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ovrweight_bmi_1 = + IconData(0xe875, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData respiration_rate_1 = + IconData(0xe876, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_code_3 = + IconData(0xe877, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData reschedule__1 = + IconData(0xe878, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData logout_1 = + IconData(0xe879, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData livecare_1 = + IconData(0xe87a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData modify_episode_1 = + IconData(0xe87b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData order_prescription_1 = + IconData(0xe87c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData order_procedures_1 = + IconData(0xe87d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData patient_sick_leave_1 = + IconData(0xe87e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData progress_notes_2 = + IconData(0xe87f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData radiology_2 = + IconData(0xe880, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData refer_patient_1 = + IconData(0xe881, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ucaf_1 = + IconData(0xe882, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData vital_signs_1 = + IconData(0xe883, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData walkin_1 = + IconData(0xe884, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData admission_req_1 = + IconData(0xe885, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData booked_1 = + IconData(0xe886, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData create_episode_1 = + IconData(0xe887, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData ecg_1 = + IconData(0xe888, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData health_summary_1 = + IconData(0xe889, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData lab_results_1 = + IconData(0xe88a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData female_2 = + IconData(0xe88b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData filter_1 = + IconData(0xe88c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData male_3 = + IconData(0xe88d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_2 = + IconData(0xe88e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData send_1 = + IconData(0xe88f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData view_1 = + IconData(0xe890, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData warning_1 = + IconData(0xe891, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData add_1 = + IconData(0xe892, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData arrow_forward_1 = + IconData(0xe893, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData back_1 = + IconData(0xe894, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData close_1 = + IconData(0xe895, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData edit_1 = + IconData(0xe896, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData external_link_1 = + IconData(0xe897, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_finger_1 = + IconData(0xe898, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_sms_1 = + IconData(0xe899, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_face_1 = + IconData(0xe89a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_reader_1 = + IconData(0xe89b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_reader_active_1 = + IconData(0xe89c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData schedule_1 = + IconData(0xe89d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData schedule_active_1 = + IconData(0xe89e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData dr_reply_1 = + IconData(0xe89f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData dr_reply_active_1 = + IconData(0xe8a0, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_1 = + IconData(0xe8a1, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_active_1 = + IconData(0xe8a2, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_face = + IconData(0xe8a3, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_finger = + IconData(0xe8a4, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_whtsapp = + IconData(0xe8a5, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData verify_sms = + IconData(0xe8a6, fontFamily: _kFontFam, fontPackage: _kFontPkg); + + /// static const IconData 124 = IconData(0xe8a7, fontFamily: _kFontFam, fontPackage: _kFontPkg); + ///static const IconData 123 = IconData(0xe8a8, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData obese_bmi_r_1 = + IconData(0xe8a9, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData end_call = + IconData(0xe8d4, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData end_consultaion = + IconData(0xe8d5, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData folder_open = + IconData(0xe8d6, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData folder = + IconData(0xe8d7, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData link_in = + IconData(0xe8d8, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData link_out = + IconData(0xe8d9, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData mute_microphone = + IconData(0xe8da, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData no_video = + IconData(0xe8db, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData send_instruction = + IconData(0xe8dc, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData transfer_to_admin = + IconData(0xe8dd, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData inpatient = + IconData(0xe959, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData discharge = + IconData(0xe95a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData order_sheets = + IconData(0xe95b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData call = + IconData(0xe95c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData medical_report = + IconData(0xe95d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData painscale = + IconData(0xe95e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData oxygenation = + IconData(0xe95f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData speechtotext = + IconData(0xe960, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_medicines = + IconData(0xe964, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData discharge_patients = + IconData(0xe965, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData referral_discharge = + IconData(0xe966, fontFamily: _kFontFam, fontPackage: _kFontPkg); +} diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index 9674e28..d3fb4d4 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/extensions/widget_extensions.dart'; @@ -9,6 +10,7 @@ class CustomTextField extends StatefulWidget { final String? hintText; final TextEditingController controller; final VoidCallback? suffixTap; + final IconData? suffixIcon; final bool isEnable; final bool hasSelection; final int? lines; @@ -23,13 +25,15 @@ class CustomTextField extends StatefulWidget { final Function(String)? onSubmit; final Function? onClick; final FocusNode? focusNode; + List? inputFormatters; - const CustomTextField( + CustomTextField( this.labelText, this.controller, { Key? key, this.isTextIsPassword = false, this.suffixTap, + this.suffixIcon, this.hintText, this.isEnable = true, this.hasSelection = false, @@ -44,6 +48,7 @@ class CustomTextField extends StatefulWidget { this.focusNode, this.verticalPadding = 15, this.horizontalPadding = 16, + this.inputFormatters, }) : super(key: key); @override @@ -71,8 +76,7 @@ class CustomTextFieldState extends State { return InkWell( onTap: () { focusNode.requestFocus(); - if(widget.hasSelection) - widget.onClick!(); + if (widget.hasSelection) widget.onClick!(); }, child: Container( padding: EdgeInsets.only(left: widget.horizontalPadding, right: widget.horizontalPadding, bottom: widget.verticalPadding, top: widget.verticalPadding), @@ -112,6 +116,7 @@ class CustomTextFieldState extends State { onChanged: widget.onChange, onEditingComplete: widget.onEditComplete, onSubmitted: widget.onSubmit, + inputFormatters: widget.inputFormatters, style: const TextStyle( fontSize: 14, height: 21 / 14, @@ -130,7 +135,7 @@ class CustomTextFieldState extends State { letterSpacing: -0.56, ), suffixIconConstraints: const BoxConstraints(minWidth: 50), - suffixIcon: widget.suffixTap == null ? null : IconButton(icon: const Icon(Icons.mic, color: MyColors.darkTextColor), onPressed: widget.suffixTap), + suffixIcon: widget.suffixTap == null ? null : IconButton(icon: Icon(Icons.mic, color: MyColors.darkTextColor), onPressed: widget.suffixTap), contentPadding: EdgeInsets.zero, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -149,6 +154,7 @@ class CustomTextFieldState extends State { }) ], if (widget.hasSelection) const Icon(Icons.keyboard_arrow_down_outlined), + if (widget.suffixIcon != null && widget.suffixTap == null) Icon(widget.suffixIcon!), ], ), ), diff --git a/pubspec.lock b/pubspec.lock index 2d0e2f0..833e78a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -36,6 +36,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.3" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" characters: dependency: transitive description: @@ -167,6 +188,20 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_blurhash: + dependency: transitive + description: + name: flutter_blurhash + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" flutter_lints: dependency: "direct dev" description: @@ -301,6 +336,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + octo_image: + dependency: transitive + description: + name: octo_image + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" path: dependency: transitive description: @@ -371,6 +413,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.3" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.1" permission_handler: dependency: "direct main" description: @@ -441,6 +490,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.0.4" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.7" shared_preferences: dependency: "direct main" description: @@ -523,6 +579,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.9.0" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0+2" stack_trace: dependency: transitive description: @@ -544,6 +614,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0+3" term_glyph: dependency: transitive description: @@ -572,6 +649,69 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.7" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.22" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.13" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.7" vector_math: dependency: transitive description: @@ -602,4 +742,4 @@ packages: version: "6.1.0" sdks: dart: ">=2.18.2 <3.0.0" - flutter: ">=3.0.0" + flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index 44449e8..9516e2c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,6 +52,8 @@ dependencies: local_auth: ^1.1.9 # get_it: ^7.2.0 hexcolor: ^2.0.4 + cached_network_image: ^3.2.3 + url_launcher: ^6.1.7 @@ -85,6 +87,10 @@ flutter: assets: - assets/ - assets/langs/ + - assets/images/svgs/ + - assets/images/svgs/profile_screen/ + - assets/images/svgs/bottom_nav/ + - assets/images/svgs/verification/ - assets/images/login/ - assets/images/patient/ - assets/images/