e-referral work in progress
parent
8e132e964f
commit
c43f96c619
@ -0,0 +1,150 @@
|
|||||||
|
class CreateEReferralRequestModel {
|
||||||
|
bool? isInsuredPatient;
|
||||||
|
String? cityCode;
|
||||||
|
String? cityName;
|
||||||
|
String? requesterName;
|
||||||
|
String? requesterContactNo;
|
||||||
|
int? requesterRelationship;
|
||||||
|
String? otherRelationship;
|
||||||
|
String? fullName;
|
||||||
|
int? identificationNo;
|
||||||
|
String? patientMobileNumber;
|
||||||
|
int? preferredBranchCode;
|
||||||
|
String? preferredBranchName;
|
||||||
|
List<EReferralAttachment>? medicalReportAttachment;
|
||||||
|
dynamic insuranceCardAttachment;
|
||||||
|
double? versionID;
|
||||||
|
int? channel;
|
||||||
|
int? languageID;
|
||||||
|
String? iPAdress;
|
||||||
|
String? generalid;
|
||||||
|
int? patientOutSA;
|
||||||
|
String? sessionID;
|
||||||
|
bool? isDentalAllowedBackend;
|
||||||
|
int? deviceTypeID;
|
||||||
|
int? patientID;
|
||||||
|
String? tokenID;
|
||||||
|
int? patientTypeID;
|
||||||
|
int? patientType;
|
||||||
|
|
||||||
|
CreateEReferralRequestModel(
|
||||||
|
{this.isInsuredPatient,
|
||||||
|
this.cityCode,
|
||||||
|
this.cityName,
|
||||||
|
this.requesterName,
|
||||||
|
this.requesterContactNo,
|
||||||
|
this.requesterRelationship,
|
||||||
|
this.otherRelationship,
|
||||||
|
this.fullName,
|
||||||
|
this.identificationNo,
|
||||||
|
this.patientMobileNumber,
|
||||||
|
this.preferredBranchCode,
|
||||||
|
this.preferredBranchName,
|
||||||
|
this.medicalReportAttachment,
|
||||||
|
this.insuranceCardAttachment,
|
||||||
|
this.versionID,
|
||||||
|
this.channel,
|
||||||
|
this.languageID,
|
||||||
|
this.iPAdress,
|
||||||
|
this.generalid,
|
||||||
|
this.patientOutSA,
|
||||||
|
this.sessionID,
|
||||||
|
this.isDentalAllowedBackend,
|
||||||
|
this.deviceTypeID,
|
||||||
|
this.patientID,
|
||||||
|
this.tokenID,
|
||||||
|
this.patientTypeID,
|
||||||
|
this.patientType});
|
||||||
|
|
||||||
|
CreateEReferralRequestModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
isInsuredPatient = json['IsInsuredPatient'];
|
||||||
|
cityCode = json['CityCode'];
|
||||||
|
cityName = json['CityName'];
|
||||||
|
requesterName = json['RequesterName'];
|
||||||
|
requesterContactNo = json['RequesterContactNo'];
|
||||||
|
requesterRelationship = json['RequesterRelationship'];
|
||||||
|
otherRelationship = json['OtherRelationship'];
|
||||||
|
fullName = json['FullName'];
|
||||||
|
identificationNo = json['IdentificationNo'];
|
||||||
|
patientMobileNumber = json['PatientMobileNumber'];
|
||||||
|
preferredBranchCode = json['PreferredBranchCode'];
|
||||||
|
preferredBranchName = json['PreferredBranchName'];
|
||||||
|
if (json['MedicalReportAttachment'] != null) {
|
||||||
|
medicalReportAttachment = <EReferralAttachment>[];
|
||||||
|
json['MedicalReportAttachment'].forEach((v) {
|
||||||
|
medicalReportAttachment!.add(EReferralAttachment.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
insuranceCardAttachment = json['InsuranceCardAttachment'] != null ? EReferralAttachment.fromJson(json['InsuranceCardAttachment']) : null;
|
||||||
|
versionID = json['VersionID'];
|
||||||
|
channel = json['Channel'];
|
||||||
|
languageID = json['LanguageID'];
|
||||||
|
iPAdress = json['IPAdress'];
|
||||||
|
generalid = json['generalid'];
|
||||||
|
patientOutSA = json['PatientOutSA'];
|
||||||
|
sessionID = json['SessionID'];
|
||||||
|
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||||
|
deviceTypeID = json['DeviceTypeID'];
|
||||||
|
patientID = json['PatientID'];
|
||||||
|
tokenID = json['TokenID'];
|
||||||
|
patientTypeID = json['PatientTypeID'];
|
||||||
|
patientType = json['PatientType'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['IsInsuredPatient'] = this.isInsuredPatient;
|
||||||
|
data['CityCode'] = this.cityCode;
|
||||||
|
data['CityName'] = this.cityName;
|
||||||
|
data['RequesterName'] = this.requesterName;
|
||||||
|
data['RequesterContactNo'] = this.requesterContactNo;
|
||||||
|
data['RequesterRelationship'] = this.requesterRelationship;
|
||||||
|
data['OtherRelationship'] = this.otherRelationship;
|
||||||
|
data['FullName'] = this.fullName;
|
||||||
|
data['IdentificationNo'] = this.identificationNo;
|
||||||
|
data['PatientMobileNumber'] = this.patientMobileNumber;
|
||||||
|
data['PreferredBranchCode'] = this.preferredBranchCode;
|
||||||
|
data['PreferredBranchName'] = this.preferredBranchName;
|
||||||
|
if (this.medicalReportAttachment != null) {
|
||||||
|
data['MedicalReportAttachment'] = this.medicalReportAttachment!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
if (this.insuranceCardAttachment == null) {
|
||||||
|
data['InsuranceCardAttachment'] = {};
|
||||||
|
} else
|
||||||
|
data['InsuranceCardAttachment'] = this.insuranceCardAttachment.toJson();
|
||||||
|
|
||||||
|
data['VersionID'] = this.versionID;
|
||||||
|
data['Channel'] = this.channel;
|
||||||
|
data['LanguageID'] = this.languageID;
|
||||||
|
data['IPAdress'] = this.iPAdress;
|
||||||
|
data['generalid'] = this.generalid;
|
||||||
|
data['PatientOutSA'] = this.patientOutSA;
|
||||||
|
data['SessionID'] = this.sessionID;
|
||||||
|
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||||
|
data['DeviceTypeID'] = this.deviceTypeID;
|
||||||
|
data['PatientID'] = this.patientID;
|
||||||
|
data['TokenID'] = this.tokenID;
|
||||||
|
data['PatientTypeID'] = this.patientTypeID;
|
||||||
|
data['PatientType'] = this.patientType;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class EReferralAttachment {
|
||||||
|
String? fileName;
|
||||||
|
String? base64String;
|
||||||
|
|
||||||
|
EReferralAttachment({this.fileName, this.base64String});
|
||||||
|
|
||||||
|
EReferralAttachment.fromJson(Map<String, dynamic> json) {
|
||||||
|
fileName = json['FileName'];
|
||||||
|
base64String = json['Base64String'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['FileName'] = this.fileName;
|
||||||
|
data['Base64String'] = this.base64String;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,172 +1,432 @@
|
|||||||
|
// dart
|
||||||
|
// File: lib/presentation/e_referral/new_referral_page.dart
|
||||||
|
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/app_export.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/app_state.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/dependencies.dart';
|
||||||
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
||||||
|
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
|
||||||
|
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
|
||||||
|
import 'package:hmg_patient_app_new/features/hmg_services/models/create_e_referral_model.dart';
|
||||||
|
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
|
||||||
import 'package:hmg_patient_app_new/theme/colors.dart';
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
||||||
|
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
|
||||||
|
import 'package:hmg_patient_app_new/widgets/dropdown/dropdown_widget.dart';
|
||||||
|
import 'package:hmg_patient_app_new/widgets/image_picker.dart';
|
||||||
|
import 'package:hmg_patient_app_new/widgets/input_widget.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class NewEReferral extends StatefulWidget {
|
class NewReferralPage extends StatefulWidget {
|
||||||
NewEReferral();
|
final Function(VoidCallback) onNextStep;
|
||||||
|
const NewReferralPage({super.key, required this.onNextStep});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_NewEReferralState createState() => _NewEReferralState();
|
State<NewReferralPage> createState() => NewReferralPageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _NewEReferralState extends State<NewEReferral> with TickerProviderStateMixin {
|
class NewReferralPageState extends State<NewReferralPage> {
|
||||||
late PageController _controller;
|
final PageController _pageController = PageController();
|
||||||
int _currentIndex = 0;
|
int pageIndex = 0;
|
||||||
int pageSelected = 2;
|
int _tabIndex = 0;
|
||||||
|
bool isPatientInsured =false;
|
||||||
// CreateEReferralRequestModel createEReferralRequestModel = new CreateEReferralRequestModel();
|
final TextEditingController _nameController = TextEditingController();
|
||||||
|
final TextEditingController _phoneController = TextEditingController();
|
||||||
@override
|
String _country = 'Saudi Arabia';
|
||||||
void initState() {
|
String? _relationship;
|
||||||
super.initState();
|
List<EReferralAttachment> medicalReportImages = [];
|
||||||
_controller = new PageController();
|
List<EReferralAttachment> insuredPatientImages = [];
|
||||||
|
void nextPressed() {
|
||||||
|
if (pageIndex < 2) {
|
||||||
|
_pageController.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeInOut);
|
||||||
|
} else {
|
||||||
|
// submit logic
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
initState() {
|
||||||
super.dispose();
|
super.initState();
|
||||||
}
|
widget.onNextStep((){
|
||||||
|
nextPressed();
|
||||||
|
});
|
||||||
|
|
||||||
changePageViewIndex(pageIndex) {
|
|
||||||
_controller.jumpToPage(pageIndex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
Widget _progressStep({required String title, required bool active, bool showDivider = true}) {
|
||||||
Widget build(BuildContext context) {
|
final Color activeColor = active ? AppColors.primaryRedColor : Colors.grey.shade400;
|
||||||
return Scaffold(
|
return Expanded(
|
||||||
body: Container(
|
|
||||||
height: double.infinity,
|
|
||||||
child: Column(
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Row(
|
||||||
width: double.infinity,
|
|
||||||
padding: EdgeInsets.only(left: 12,right: 12,top: 12),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
children: [
|
||||||
Expanded(
|
CircleAvatar(
|
||||||
child: showProgress(
|
radius: 13,
|
||||||
title: "Requester Info".needTranslation,
|
backgroundColor: active ? activeColor : Colors.grey.shade300,
|
||||||
status: _currentIndex == 0
|
child: Icon(Icons.check, size: 14, color: Colors.white),
|
||||||
? "InProgress".needTranslation
|
|
||||||
: _currentIndex > 0
|
|
||||||
? "Completed".needTranslation
|
|
||||||
: "Locked".needTranslation,
|
|
||||||
color: _currentIndex == 0 ? AppColors.infoColor : AppColors.successColor,
|
|
||||||
),
|
),
|
||||||
|
if (showDivider)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 8.0),
|
||||||
|
child: Divider(thickness: 1),
|
||||||
),
|
),
|
||||||
Expanded(
|
|
||||||
child: showProgress(
|
|
||||||
title:"Patient Info".needTranslation,
|
|
||||||
status: _currentIndex == 1
|
|
||||||
? "InProgress".needTranslation
|
|
||||||
: _currentIndex > 1
|
|
||||||
? "Completed".needTranslation
|
|
||||||
: "Locked".needTranslation,
|
|
||||||
color: _currentIndex == 1
|
|
||||||
? AppColors.infoColor
|
|
||||||
: _currentIndex > 1
|
|
||||||
? AppColors.successColor
|
|
||||||
: AppColors.greyColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
showProgress(
|
|
||||||
title: "Other Info".needTranslation,
|
|
||||||
status: _currentIndex == 2 ? "InProgress".needTranslation :"Locked".needTranslation,
|
|
||||||
color: _currentIndex == 2
|
|
||||||
? AppColors.infoColor
|
|
||||||
: _currentIndex > 3
|
|
||||||
? AppColors.successColor
|
|
||||||
: AppColors.greyColor,
|
|
||||||
isNeedBorder: false,
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
const SizedBox(height: 6),
|
||||||
|
Text(title, style: const TextStyle(fontSize: 11, fontWeight: FontWeight.w600)),
|
||||||
|
const SizedBox(height: 6),
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: active ? activeColor.withOpacity(0.15) : Colors.grey.shade100,
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
),
|
),
|
||||||
Expanded(
|
child: Text(active ? 'Active' : 'Inactive',
|
||||||
child: PageView(
|
style: TextStyle(fontSize: 9, color: active ? activeColor : Colors.grey)),
|
||||||
physics: NeverScrollableScrollPhysics(),
|
|
||||||
controller: _controller,
|
|
||||||
onPageChanged: (index) {
|
|
||||||
setState(() {
|
|
||||||
_currentIndex = index;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
scrollDirection: Axis.horizontal,
|
|
||||||
children: <Widget>[
|
|
||||||
// NewEReferralStepOnePage(
|
|
||||||
// changePageViewIndex: changePageViewIndex,
|
|
||||||
// createEReferralRequestModel: createEReferralRequestModel,
|
|
||||||
// ),
|
|
||||||
// NewEReferralStepTowPage(
|
|
||||||
// changePageViewIndex: changePageViewIndex,
|
|
||||||
// createEReferralRequestModel: createEReferralRequestModel,
|
|
||||||
// ),
|
|
||||||
// NewEReferralStepThreePage(
|
|
||||||
// changePageViewIndex: changePageViewIndex,
|
|
||||||
// createEReferralRequestModel: createEReferralRequestModel,
|
|
||||||
// ),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _requesterForm() {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 24.0),
|
||||||
|
child: ListView(
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
const Text('Referral requester information',
|
||||||
|
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 16)).paddingSymmetrical(4.h, 0.h),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
TextInputWidget(
|
||||||
|
controller: _nameController,
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
hintText: 'Enter Referral Requester Name*', labelText: 'Requester Name',
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
Selector<AuthenticationViewModel, ({List<NationalityCountries>? countriesList, NationalityCountries? selectedCountry, bool isArabic})>(
|
||||||
|
selector: (context, authViewModel) {
|
||||||
|
final appState = getIt.get<AppState>();
|
||||||
|
return (
|
||||||
|
countriesList: authViewModel.countriesList,
|
||||||
|
selectedCountry: authViewModel.pickedCountryByUAEUser,
|
||||||
|
isArabic: appState.isArabic(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic,
|
||||||
|
builder: (context, data, child) {
|
||||||
|
final authVM = context.read<AuthenticationViewModel>();
|
||||||
|
return DropdownWidget(
|
||||||
|
labelText: LocaleKeys.country.tr(),
|
||||||
|
hintText:_country,
|
||||||
|
isEnable: true,
|
||||||
|
dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(),
|
||||||
|
selectedValue: data.selectedCountry != null
|
||||||
|
? data.isArabic
|
||||||
|
? data.selectedCountry!.nameN ?? ""
|
||||||
|
: data.selectedCountry!.name ?? ""
|
||||||
|
: "",
|
||||||
|
onChange: authVM.onUAEUserCountrySelection,
|
||||||
|
hasSelectionCustomIcon: true,
|
||||||
|
labelColor: AppColors.textColor,
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
|
||||||
|
selectionCustomIcon: AppAssets.arrow_down,
|
||||||
|
leadingIcon: AppAssets.globe,
|
||||||
|
).withVerticalPadding(8);
|
||||||
|
},
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
TextInputWidget(
|
||||||
|
labelText: LocaleKeys.mobileNumber.tr(),
|
||||||
|
hintText: LocaleKeys.mobileNumber.tr(),
|
||||||
|
controller: null,
|
||||||
|
isEnable: true,
|
||||||
|
prefix: null,
|
||||||
|
isAllowLeadingIcon: true,
|
||||||
|
labelColor: AppColors.textColor, padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
isReadOnly: true,
|
||||||
|
leadingIcon: AppAssets.call).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
Selector<AuthenticationViewModel, ({List<NationalityCountries>? countriesList, NationalityCountries? selectedCountry, bool isArabic})>(
|
||||||
|
selector: (context, authViewModel) {
|
||||||
|
final appState = getIt.get<AppState>();
|
||||||
|
return (
|
||||||
|
countriesList: authViewModel.countriesList,
|
||||||
|
selectedCountry: authViewModel.pickedCountryByUAEUser,
|
||||||
|
isArabic: appState.isArabic(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic,
|
||||||
|
builder: (context, data, child) {
|
||||||
|
final authVM = context.read<AuthenticationViewModel>();
|
||||||
|
return DropdownWidget(
|
||||||
|
labelText: "Relationship",
|
||||||
|
hintText: "Relationship*".needTranslation,
|
||||||
|
isEnable: true,
|
||||||
|
dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(),
|
||||||
|
selectedValue: data.selectedCountry != null
|
||||||
|
? data.isArabic
|
||||||
|
? data.selectedCountry!.nameN ?? ""
|
||||||
|
: data.selectedCountry!.name ?? ""
|
||||||
|
: "",
|
||||||
|
onChange: authVM.onUAEUserCountrySelection,
|
||||||
|
hasSelectionCustomIcon: true,
|
||||||
|
labelColor: AppColors.textColor,
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
|
||||||
|
selectionCustomIcon: AppAssets.arrow_down,
|
||||||
|
leadingIcon: AppAssets.globe,
|
||||||
|
).withVerticalPadding(8);
|
||||||
|
},
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
const SizedBox(height: 120),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget showProgress({required String title, required String status, required Color color, bool isNeedBorder = true}) {
|
Widget _patientInformation(){
|
||||||
return Column(
|
return Padding(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
child: ListView(
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
children: [
|
children: [
|
||||||
Column(
|
const SizedBox(height: 12),
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
'Patient information'.toText16(weight: FontWeight.bold).paddingSymmetrical(4.h, 0.h),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
TextInputWidget(
|
||||||
|
controller: _nameController,
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
hintText: 'Enter Identification Number*', labelText: 'Identification Number ',
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
TextInputWidget(
|
||||||
|
controller: _nameController,
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
hintText: 'Patient Name*', labelText: 'Name',
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
Selector<AuthenticationViewModel, ({List<NationalityCountries>? countriesList, NationalityCountries? selectedCountry, bool isArabic})>(
|
||||||
|
selector: (context, authViewModel) {
|
||||||
|
final appState = getIt.get<AppState>();
|
||||||
|
return (
|
||||||
|
countriesList: authViewModel.countriesList,
|
||||||
|
selectedCountry: authViewModel.pickedCountryByUAEUser,
|
||||||
|
isArabic: appState.isArabic(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic,
|
||||||
|
builder: (context, data, child) {
|
||||||
|
final authVM = context.read<AuthenticationViewModel>();
|
||||||
|
return DropdownWidget(
|
||||||
|
labelText: LocaleKeys.country.tr(),
|
||||||
|
hintText:_country,
|
||||||
|
isEnable: true,
|
||||||
|
dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(),
|
||||||
|
selectedValue: data.selectedCountry != null
|
||||||
|
? data.isArabic
|
||||||
|
? data.selectedCountry!.nameN ?? ""
|
||||||
|
: data.selectedCountry!.name ?? ""
|
||||||
|
: "",
|
||||||
|
onChange: authVM.onUAEUserCountrySelection,
|
||||||
|
hasSelectionCustomIcon: true,
|
||||||
|
labelColor: AppColors.textColor,
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
|
||||||
|
selectionCustomIcon: AppAssets.arrow_down,
|
||||||
|
leadingIcon: AppAssets.globe,
|
||||||
|
).withVerticalPadding(8);
|
||||||
|
},
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
|
||||||
|
'Where the patient located'.needTranslation.toText16(weight: FontWeight.bold).paddingSymmetrical(4.h, 0.h),
|
||||||
|
|
||||||
|
Selector<AuthenticationViewModel, ({List<NationalityCountries>? countriesList, NationalityCountries? selectedCountry, bool isArabic})>(
|
||||||
|
selector: (context, authViewModel) {
|
||||||
|
final appState = getIt.get<AppState>();
|
||||||
|
return (
|
||||||
|
countriesList: authViewModel.countriesList,
|
||||||
|
selectedCountry: authViewModel.pickedCountryByUAEUser,
|
||||||
|
isArabic: appState.isArabic(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic,
|
||||||
|
builder: (context, data, child) {
|
||||||
|
final authVM = context.read<AuthenticationViewModel>();
|
||||||
|
return DropdownWidget(
|
||||||
|
labelText: LocaleKeys.country.tr(),
|
||||||
|
hintText:_country,
|
||||||
|
isEnable: true,
|
||||||
|
dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(),
|
||||||
|
selectedValue: data.selectedCountry != null
|
||||||
|
? data.isArabic
|
||||||
|
? data.selectedCountry!.nameN ?? ""
|
||||||
|
: data.selectedCountry!.name ?? ""
|
||||||
|
: "",
|
||||||
|
onChange: authVM.onUAEUserCountrySelection,
|
||||||
|
hasSelectionCustomIcon: true,
|
||||||
|
labelColor: AppColors.textColor,
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
|
||||||
|
selectionCustomIcon: AppAssets.arrow_down,
|
||||||
|
leadingIcon: AppAssets.globe,
|
||||||
|
).withVerticalPadding(8);
|
||||||
|
},
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _otherDetails() {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
child: ListView(
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
'Other Details'.toText16(weight: FontWeight.bold).paddingSymmetrical(4.h, 0.h),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
|
||||||
|
InkWell(child: TextInputWidget(
|
||||||
|
controller: _nameController,
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
hintText: 'Medical Report', labelText: 'Select Attachment',
|
||||||
|
suffix: Icon(Icons.attachment),
|
||||||
|
isReadOnly: true,
|
||||||
|
|
||||||
|
),
|
||||||
|
onTap: (){
|
||||||
|
ImageOptions.showImageOptionsNew(
|
||||||
|
context,
|
||||||
|
true,
|
||||||
|
(String image, File file) {
|
||||||
|
setState(() {
|
||||||
|
EReferralAttachment eReferralAttachment = new EReferralAttachment(fileName: 'image ${medicalReportImages.length + 1}.png', base64String: image);
|
||||||
|
medicalReportImages.add(eReferralAttachment);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
|
||||||
|
Selector<AuthenticationViewModel, ({List<NationalityCountries>? countriesList, NationalityCountries? selectedCountry, bool isArabic})>(
|
||||||
|
selector: (context, authViewModel) {
|
||||||
|
final appState = getIt.get<AppState>();
|
||||||
|
return (
|
||||||
|
countriesList: authViewModel.countriesList,
|
||||||
|
selectedCountry: authViewModel.pickedCountryByUAEUser,
|
||||||
|
isArabic: appState.isArabic(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic,
|
||||||
|
builder: (context, data, child) {
|
||||||
|
final authVM = context.read<AuthenticationViewModel>();
|
||||||
|
return DropdownWidget(
|
||||||
|
labelText: LocaleKeys.branch.tr(),
|
||||||
|
hintText:_country,
|
||||||
|
isEnable: true,
|
||||||
|
dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(),
|
||||||
|
selectedValue: data.selectedCountry != null
|
||||||
|
? data.isArabic
|
||||||
|
? data.selectedCountry!.nameN ?? ""
|
||||||
|
: data.selectedCountry!.name ?? ""
|
||||||
|
: "",
|
||||||
|
onChange: authVM.onUAEUserCountrySelection,
|
||||||
|
hasSelectionCustomIcon: true,
|
||||||
|
labelColor: AppColors.textColor,
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
|
||||||
|
selectionCustomIcon: AppAssets.arrow_down,
|
||||||
|
leadingIcon: AppAssets.hospital,
|
||||||
|
).withVerticalPadding(8);
|
||||||
|
},
|
||||||
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Checkbox(
|
||||||
width: 26,
|
value: isPatientInsured,
|
||||||
height: 26,
|
activeColor: AppColors.primaryRedColor,
|
||||||
// decoration: containerRadius(color, 200),
|
onChanged: (bool? newValue) {
|
||||||
child: Icon(
|
setState(() {
|
||||||
Icons.done,
|
isPatientInsured = newValue!;
|
||||||
color: Colors.white,
|
});
|
||||||
size: 16,
|
}),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(5.0),
|
||||||
|
child: Text(
|
||||||
|
"Patient is Insured".needTranslation,
|
||||||
|
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (isNeedBorder)
|
|
||||||
Expanded(
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child:Divider(),
|
|
||||||
)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
// mHeight(8),
|
],
|
||||||
Text(
|
).paddingSymmetrical(0.h, 4.h),
|
||||||
title,
|
|
||||||
style: TextStyle(
|
isPatientInsured? InkWell(child: TextInputWidget(
|
||||||
fontSize: 11,
|
controller: _nameController,
|
||||||
fontWeight: FontWeight.w600,
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
letterSpacing: -0.44,
|
hintText: 'Insurance Document', labelText: 'Select Attachment',
|
||||||
),
|
suffix: Icon(Icons.attachment),
|
||||||
|
isReadOnly: true,
|
||||||
|
|
||||||
|
)) : SizedBox(),
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final bool step0Active = pageIndex == 0;
|
||||||
|
final bool step1Active = pageIndex == 1;
|
||||||
|
final bool step2Active = pageIndex == 2;
|
||||||
|
|
||||||
|
return SizedBox(
|
||||||
|
height: MediaQuery
|
||||||
|
.of(context)
|
||||||
|
.size
|
||||||
|
.height, // constrain height
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 24.0),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
_progressStep(title: 'Requester Info', active: step0Active),
|
||||||
|
_progressStep(title: 'Patient Information', active: step1Active),
|
||||||
|
_progressStep(
|
||||||
|
title: 'Other details', active: step2Active, showDivider: false),
|
||||||
|
|
||||||
|
],
|
||||||
),
|
),
|
||||||
// mHeight(2),
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.all(5),
|
|
||||||
// decoration: containerRadius(color.withOpacity(0.2), 4),
|
|
||||||
child: Text(
|
|
||||||
status,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 8,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
letterSpacing: -0.32,
|
|
||||||
color: color,
|
|
||||||
),
|
),
|
||||||
|
Expanded(
|
||||||
|
child: PageView(
|
||||||
|
controller: _pageController,
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
onPageChanged: (i) => setState(() => pageIndex = i),
|
||||||
|
children: [
|
||||||
|
_requesterForm(),
|
||||||
|
_patientInformation(),
|
||||||
|
// const Center(child: Text('Patient Info - step 2 (placeholder)')),
|
||||||
|
_otherDetails(),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
||||||
],
|
],
|
||||||
)
|
),
|
||||||
],
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue