Merge branch 'master' into Fatima
# Conflicts: # lib/config/routes.dart # lib/models/generic_response_model.dart # lib/models/profile_menu.model.dartmerge-requests/1/merge
commit
dc880df35a
@ -0,0 +1,18 @@
|
|||||||
|
class CreateVacationRuleList {
|
||||||
|
String? pRETURNMSG;
|
||||||
|
String? pRETURNSTATUS;
|
||||||
|
|
||||||
|
CreateVacationRuleList({this.pRETURNMSG, this.pRETURNSTATUS});
|
||||||
|
|
||||||
|
CreateVacationRuleList.fromJson(Map<String, dynamic> json) {
|
||||||
|
pRETURNMSG = json['P_RETURN_MSG'];
|
||||||
|
pRETURNSTATUS = json['P_RETURN_STATUS'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['P_RETURN_MSG'] = this.pRETURNMSG;
|
||||||
|
data['P_RETURN_STATUS'] = this.pRETURNSTATUS;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,57 +0,0 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
|
||||||
import 'package:mohem_flutter_app/classes/colors.dart';
|
|
||||||
import 'package:mohem_flutter_app/classes/utils.dart';
|
|
||||||
import 'package:mohem_flutter_app/config/routes.dart';
|
|
||||||
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
|
||||||
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
|
||||||
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
|
||||||
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
|
||||||
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
|
|
||||||
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
|
|
||||||
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
|
|
||||||
|
|
||||||
class MyAttendanceScreen extends StatelessWidget {
|
|
||||||
List<GetMenuEntriesList> list;
|
|
||||||
|
|
||||||
MyAttendanceScreen({Key? key, this.list = const <GetMenuEntriesList>[]}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
list = ModalRoute.of(context)!.settings.arguments as List<GetMenuEntriesList>;
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
appBar: AppBarWidget(
|
|
||||||
context,
|
|
||||||
title: LocaleKeys.myAttendance.tr(),
|
|
||||||
),
|
|
||||||
body: SizedBox(
|
|
||||||
width: double.infinity,
|
|
||||||
height: double.infinity,
|
|
||||||
child: list.isEmpty
|
|
||||||
? Utils.getNoDataWidget(context)
|
|
||||||
: ListView.separated(
|
|
||||||
padding: const EdgeInsets.all(21),
|
|
||||||
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", list[index].prompt!).onPress(() {
|
|
||||||
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(list[index].prompt!, list[index].functionName!));
|
|
||||||
}),
|
|
||||||
separatorBuilder: (cxt, index) => 12.height,
|
|
||||||
itemCount: list.length),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget itemView(String icon, String title) {
|
|
||||||
return Row(
|
|
||||||
children: [
|
|
||||||
(title).toText16().expanded,
|
|
||||||
12.width,
|
|
||||||
SvgPicture.asset(
|
|
||||||
"assets/images/arrow_next.svg",
|
|
||||||
color: MyColors.darkIconColor,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
).objectContainerView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
|
||||||
|
|
||||||
|
class ServicesMenuListScreenParams {
|
||||||
|
final String title;
|
||||||
|
final List<GetMenuEntriesList> list;
|
||||||
|
|
||||||
|
ServicesMenuListScreenParams(this.title, this.list);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServicesMenuListScreen extends StatelessWidget {
|
||||||
|
late ServicesMenuListScreenParams servicesMenuData;
|
||||||
|
|
||||||
|
ServicesMenuListScreen({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
servicesMenuData = ModalRoute.of(context)!.settings.arguments as ServicesMenuListScreenParams;
|
||||||
|
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
appBar: AppBarWidget(
|
||||||
|
context,
|
||||||
|
title: servicesMenuData.title,
|
||||||
|
),
|
||||||
|
body: SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: servicesMenuData.list.isEmpty
|
||||||
|
? Utils.getNoDataWidget(context)
|
||||||
|
: ListView.separated(
|
||||||
|
padding: const EdgeInsets.all(21),
|
||||||
|
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", servicesMenuData.list[index].prompt!).onPress(() {
|
||||||
|
if (servicesMenuData.list[index].parentMenuName == "MBL_PERINFO_SS") {
|
||||||
|
if (servicesMenuData.list[index].requestType == "BASIC_DETAILS") {
|
||||||
|
Navigator.pushNamed(context, AppRoutes.basicDetails);
|
||||||
|
} else if (servicesMenuData.list[index].requestType == "PHONE_NUMBERS") {
|
||||||
|
Navigator.pushNamed(context, AppRoutes.personalInfo);
|
||||||
|
} else if (servicesMenuData.list[index].requestType == "ADDRESS") {
|
||||||
|
Navigator.pushNamed(context, AppRoutes.contactDetails);
|
||||||
|
} else if (servicesMenuData.list[index].requestType == "CONTACT") {
|
||||||
|
Navigator.pushNamed(context, AppRoutes.familyMembers);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!));
|
||||||
|
}),
|
||||||
|
separatorBuilder: (cxt, index) => 12.height,
|
||||||
|
itemCount: servicesMenuData.list.length),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget itemView(String icon, String title) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
(title).toText16().expanded,
|
||||||
|
12.width,
|
||||||
|
SvgPicture.asset(
|
||||||
|
"assets/images/arrow_next.svg",
|
||||||
|
color: MyColors.darkIconColor,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
).objectContainerView();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,108 @@
|
|||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/profile_menu.model.dart';
|
||||||
|
|
||||||
|
class ProfileInFo extends StatelessWidget {
|
||||||
|
MemberInformationListModel memberInfo;
|
||||||
|
|
||||||
|
ProfileInFo(this.memberInfo, {Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
List<ProfileMenu> menu = [
|
||||||
|
ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: 'personal-info.svg', route: AppRoutes.personalInfo),
|
||||||
|
ProfileMenu(name: LocaleKeys.profile_basicDetails.tr(), icon: 'basic-details.svg', route: AppRoutes.basicDetails),
|
||||||
|
ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails),
|
||||||
|
ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers),
|
||||||
|
];
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
16.height,
|
||||||
|
memberInfo.eMPLOYEENAME!.toText22(),
|
||||||
|
("${memberInfo.eMPLOYEENUMBER!} | ${memberInfo.jOBNAME!}").toText13(color: MyColors.grey80Color),
|
||||||
|
memberInfo.eMPLOYEEEMAILADDRESS!.toText13(),
|
||||||
|
12.height,
|
||||||
|
const Divider(height: 8, thickness: 8, color: MyColors.lightGreyEFColor),
|
||||||
|
12.height,
|
||||||
|
LocaleKeys.completingYear.tr().toText11(),
|
||||||
|
Row(children: [
|
||||||
|
appreciationTime(LocaleKeys.year.tr(), memberInfo.sERVICEYEARS.toString()),
|
||||||
|
appreciationTime(LocaleKeys.month.tr(), memberInfo.sERVICEMONTHS.toString()),
|
||||||
|
appreciationTime(LocaleKeys.day.tr(), memberInfo.sERVICEDAYS.toString()),
|
||||||
|
]).paddingOnly(bottom: 12, top: 12),
|
||||||
|
const Divider(height: 8, thickness: 8, color: MyColors.lightGreyEFColor),
|
||||||
|
Column(
|
||||||
|
// mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%').toText16(),
|
||||||
|
8.height,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
for (var i = 0; i < 4; i++)
|
||||||
|
if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef)))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
14.height,
|
||||||
|
LocaleKeys.profile_completeProfile.tr().toText16(color: MyColors.textMixColor, isUnderLine: true),
|
||||||
|
],
|
||||||
|
).paddingOnly(left: 21, right: 21, bottom: 18, top: 12),
|
||||||
|
const Divider(height: 8, thickness: 8, color: MyColors.lightGreyEFColor),
|
||||||
|
ListView.separated(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
itemBuilder: (cxt, index) => Row(
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset('assets/images/' + menu[index].icon, width: 20, height: 20),
|
||||||
|
16.width,
|
||||||
|
menu[index].name.toText16().expanded,
|
||||||
|
16.width,
|
||||||
|
const Icon(Icons.arrow_forward, color: MyColors.darkIconColor)
|
||||||
|
],
|
||||||
|
).onPress(() {
|
||||||
|
Navigator.pushNamed(context, menu[index].route);
|
||||||
|
}).paddingOnly(left: 21, right: 21, top: 21),
|
||||||
|
separatorBuilder: (cxt, index) => 12.height,
|
||||||
|
itemCount: menu.length),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget drawSlider(color) {
|
||||||
|
return Row(children: [
|
||||||
|
Expanded(
|
||||||
|
flex: 1,
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
child: Container(
|
||||||
|
height: 6,
|
||||||
|
width: 20,
|
||||||
|
color: color,
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
Container(height: 6, width: 3, color: Colors.white),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget appreciationTime(String title, String value) {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
title.toText13(color: MyColors.grey80Color),
|
||||||
|
value.padLeft(2, '0').toText20(color: MyColors.textMixColor),
|
||||||
|
],
|
||||||
|
).expanded;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/profile/widgets/profile_info.dart';
|
||||||
|
|
||||||
|
class ProfilePanel extends StatelessWidget {
|
||||||
|
ProfilePanel(this.memberInformationList);
|
||||||
|
|
||||||
|
late MemberInformationListModel memberInformationList;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SizedBox(
|
||||||
|
height: MediaQuery.of(context).size.height,
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
margin: const EdgeInsets.only(top: 32),
|
||||||
|
padding: const EdgeInsets.only(top: 37),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
// border: Border.all(color: MyColors.lightGreyEFColor, width: 1),
|
||||||
|
borderRadius: const BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(25),
|
||||||
|
topRight: Radius.circular(25),
|
||||||
|
),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.1),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: ProfileInFo(memberInformationList),
|
||||||
|
),
|
||||||
|
Container(height: 68, alignment: Alignment.center, child: profileImage())
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget profileImage() => CircleAvatar(
|
||||||
|
radius: 68,
|
||||||
|
backgroundImage: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)),
|
||||||
|
backgroundColor: Colors.black,
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -1,160 +0,0 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
|
||||||
import 'package:mohem_flutter_app/config/routes.dart';
|
|
||||||
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
|
||||||
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
|
|
||||||
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
|
||||||
import 'package:mohem_flutter_app/models/profile_menu.model.dart';
|
|
||||||
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
|
|
||||||
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart';
|
|
||||||
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
|
|
||||||
// todo '@sultan' kindly follow structure of code written. use extension methods for widgets, also format code
|
|
||||||
|
|
||||||
class ProfileInFo extends StatefulWidget {
|
|
||||||
ProfileInFo(this.memberInfo);
|
|
||||||
|
|
||||||
MemberInformationListModel memberInfo;
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<ProfileInFo> createState() => _ProfileInFoState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ProfileInFoState extends State<ProfileInFo> {
|
|
||||||
static List<GetMenuEntriesList> menuData = [];
|
|
||||||
String data = '.';
|
|
||||||
double sliderValue = 75;
|
|
||||||
List<ProfileMenu> menu = [
|
|
||||||
ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: 'personal-info.svg', route: AppRoutes.personalInfo, dynamicUrl: '', menuEntries: getMenuEntries('')),
|
|
||||||
ProfileMenu(name: LocaleKeys.profile_basicDetails.tr(), icon: 'basic-details.svg', route: AppRoutes.basicDetails, menuEntries: getMenuEntries('BASIC_DETAILS')),
|
|
||||||
ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails, dynamicUrl: '', menuEntries: getMenuEntries('ADDRESS')),
|
|
||||||
ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers, dynamicUrl: '', menuEntries: getMenuEntries('CONTACT')),
|
|
||||||
];
|
|
||||||
|
|
||||||
@override
|
|
||||||
void setState(VoidCallback fn) {
|
|
||||||
super.setState(fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
/// card header
|
|
||||||
customLabel(widget.memberInfo.eMPLOYEENAME.toString(), 22, Colors.black, true),
|
|
||||||
|
|
||||||
customLabel(widget.memberInfo.eMPLOYEENUMBER.toString() + ' | ' + widget.memberInfo.jOBNAME.toString(), 14, Colors.grey, false),
|
|
||||||
|
|
||||||
customLabel(widget.memberInfo.eMPLOYEEEMAILADDRESS.toString(), 13, Colors.black, true),
|
|
||||||
|
|
||||||
Divider(height: 40, thickness: 8, color: const Color(0xffefefef)),
|
|
||||||
|
|
||||||
customLabel(LocaleKeys.completingYear.tr(), 10, Colors.black, true),
|
|
||||||
|
|
||||||
SizedBox(height: 10),
|
|
||||||
Container(
|
|
||||||
child: Row(mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [
|
|
||||||
Column(
|
|
||||||
children: [customLabel(LocaleKeys.year.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEYEARS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)],
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
children: [customLabel(LocaleKeys.month.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEMONTHS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)],
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
children: [customLabel(LocaleKeys.day.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEDAYS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)],
|
|
||||||
)
|
|
||||||
])),
|
|
||||||
|
|
||||||
Divider(height: 40, thickness: 8, color: const Color(0xffefefef)),
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
left: 20,
|
|
||||||
right: 20,
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
customLabel(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%', 18, Colors.black, true),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
for (var i = 0; i < 4; i++)
|
|
||||||
if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef)))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
Text(
|
|
||||||
LocaleKeys.profile_completeProfile.tr(),
|
|
||||||
style: TextStyle(color: Color(0xff2BB8A6), fontWeight: FontWeight.bold, decoration: TextDecoration.underline),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
/// description
|
|
||||||
Divider(height: 50, thickness: 8, color: const Color(0xffefefef)),
|
|
||||||
|
|
||||||
Column(
|
|
||||||
children: menu.map((i) => rowItem(i, context)).toList(),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget drawSlider(color) {
|
|
||||||
return Row(children: [
|
|
||||||
Expanded(
|
|
||||||
flex: 1,
|
|
||||||
child: ClipRRect(
|
|
||||||
borderRadius: BorderRadius.circular(10),
|
|
||||||
child: Container(
|
|
||||||
height: 6,
|
|
||||||
width: 20,
|
|
||||||
color: color,
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
Container(height: 6, width: 3, color: Colors.white),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget rowItem(obj, context) {
|
|
||||||
return InkWell(
|
|
||||||
onTap: () {
|
|
||||||
//if (obj.dynamicUrl == '') {
|
|
||||||
Navigator.pushNamed(context, obj.route);
|
|
||||||
// } else {
|
|
||||||
// Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, arguments: DynamicListViewParams(obj.name, obj.functionName, uRL: obj.dynamicUrl, requestID: obj.requestID));
|
|
||||||
//}
|
|
||||||
},
|
|
||||||
child: ListTile(
|
|
||||||
leading: SvgPicture.asset('assets/images/' + obj.icon),
|
|
||||||
title: Text(obj.name),
|
|
||||||
trailing: Icon(Icons.arrow_forward),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget customLabel(String label, double size, Color color, bool isBold, {double padding = 0.0}) => Container(
|
|
||||||
padding: EdgeInsets.all(padding),
|
|
||||||
// height: 50,
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
children: [Text(label, style: TextStyle(color: color, fontSize: size, fontWeight: isBold ? FontWeight.bold : FontWeight.normal))]));
|
|
||||||
}
|
|
||||||
|
|
||||||
GetMenuEntriesList getMenuEntries(String type) {
|
|
||||||
List<GetMenuEntriesList> data = _ProfileInFoState.menuData.where((GetMenuEntriesList test) => test.functionName == type).toList();
|
|
||||||
if (data.isNotEmpty) {
|
|
||||||
return data[0];
|
|
||||||
} else {
|
|
||||||
return GetMenuEntriesList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:mohem_flutter_app/classes/utils.dart';
|
|
||||||
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
|
|
||||||
import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_info.dart';
|
|
||||||
|
|
||||||
class ProfilePanle extends StatelessWidget {
|
|
||||||
ProfilePanle(this.memberInformationList);
|
|
||||||
|
|
||||||
late MemberInformationListModel memberInformationList;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
double _width = MediaQuery.of(context).size.width;
|
|
||||||
return Container(
|
|
||||||
margin: EdgeInsets.fromLTRB(5, 0, 5, 10),
|
|
||||||
height: MediaQuery.of(context).size.height,
|
|
||||||
child: Stack(children: [
|
|
||||||
Container(
|
|
||||||
width: _width,
|
|
||||||
margin: EdgeInsets.only(top: 50),
|
|
||||||
padding: EdgeInsets.only(top: 50),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: const BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)),
|
|
||||||
boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)],
|
|
||||||
),
|
|
||||||
child: ProfileInFo(memberInformationList),
|
|
||||||
),
|
|
||||||
Container(height: 100, alignment: Alignment.center, child: ProfileImage())
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget ProfileImage() => CircleAvatar(
|
|
||||||
radius: 70,
|
|
||||||
backgroundImage: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)),
|
|
||||||
backgroundColor: Colors.black,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -0,0 +1,224 @@
|
|||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/get_action_history_list_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
|
||||||
|
|
||||||
|
class SearchEmployeeBottomSheet extends StatefulWidget {
|
||||||
|
int? notificationID;
|
||||||
|
String title, apiMode;
|
||||||
|
List<GetActionHistoryList>? actionHistoryList;
|
||||||
|
Function(ReplacementList) onSelectEmployee;
|
||||||
|
|
||||||
|
SearchEmployeeBottomSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList, required this.onSelectEmployee});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SearchEmployeeBottomSheet> createState() => _SearchEmployeeBottomSheetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
|
||||||
|
TextEditingController username = TextEditingController();
|
||||||
|
String searchText = "";
|
||||||
|
|
||||||
|
List<String>? optionsList = [
|
||||||
|
LocaleKeys.fullName.tr(),
|
||||||
|
LocaleKeys.username.tr(),
|
||||||
|
LocaleKeys.endDate.tr(),
|
||||||
|
];
|
||||||
|
List<GetFavoriteReplacements>? favUsersList;
|
||||||
|
|
||||||
|
List<ReplacementList>? replacementList;
|
||||||
|
List<ReplacementList>? favouriteUserList;
|
||||||
|
List<ReplacementList>? nonFavouriteUserList;
|
||||||
|
|
||||||
|
int _selectedSearchIndex = 0;
|
||||||
|
|
||||||
|
void fetchUserByInput({bool isNeedLoading = true}) async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
replacementList = await WorkListApiClient().searchUserByInput(
|
||||||
|
userName: _selectedSearchIndex == 0 ? searchText : "",
|
||||||
|
userId: _selectedSearchIndex == 1 ? searchText : "",
|
||||||
|
email: _selectedSearchIndex == 2 ? searchText : "",
|
||||||
|
);
|
||||||
|
favouriteUserList = replacementList?.where((element) => element.isFavorite ?? false).toList();
|
||||||
|
nonFavouriteUserList = replacementList?.where((element) => !(element.isFavorite ?? false)).toList();
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
} catch (e) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(e, context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNeedLoading) Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
height: MediaQuery.of(context).size.height - 100,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
widget.title.toText24(isBold: true),
|
||||||
|
21.height,
|
||||||
|
"Search".toText16(),
|
||||||
|
11.height,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
radioOption("Name", 0, _selectedSearchIndex),
|
||||||
|
radioOption("User Name", 1, _selectedSearchIndex),
|
||||||
|
radioOption("Email", 2, _selectedSearchIndex),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
14.height,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
DynamicTextFieldWidget(
|
||||||
|
"Search",
|
||||||
|
"Search By Username",
|
||||||
|
inputAction: TextInputAction.done,
|
||||||
|
suffixIconData: Icons.search,
|
||||||
|
onChange: (text) {
|
||||||
|
searchText = text;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
).expanded,
|
||||||
|
IconButton(
|
||||||
|
constraints: const BoxConstraints(),
|
||||||
|
onPressed: () async {
|
||||||
|
await SystemChannels.textInput.invokeMethod('TextInput.hide');
|
||||||
|
fetchUserByInput();
|
||||||
|
},
|
||||||
|
icon: Icon(Icons.search))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (replacementList != null)
|
||||||
|
replacementList!.isEmpty
|
||||||
|
? Utils.getNoDataWidget(context).expanded
|
||||||
|
: ListView(
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
padding: EdgeInsets.only(top: 21, bottom: 8),
|
||||||
|
children: [
|
||||||
|
if (favouriteUserList?.isNotEmpty ?? false) ...[
|
||||||
|
"Favorites".toText16(),
|
||||||
|
12.height,
|
||||||
|
ListView.separated(
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemBuilder: (cxt, index) => employeeItemView(favouriteUserList![index]),
|
||||||
|
separatorBuilder: (cxt, index) => Container(
|
||||||
|
height: 1,
|
||||||
|
color: MyColors.borderE3Color,
|
||||||
|
),
|
||||||
|
itemCount: favouriteUserList?.length ?? 0),
|
||||||
|
12.height,
|
||||||
|
],
|
||||||
|
if (nonFavouriteUserList?.isNotEmpty ?? false) ...[
|
||||||
|
"Related".toText16(),
|
||||||
|
12.height,
|
||||||
|
ListView.separated(
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemBuilder: (cxt, index) => employeeItemView(nonFavouriteUserList![index]),
|
||||||
|
separatorBuilder: (cxt, index) => Container(
|
||||||
|
height: 1,
|
||||||
|
color: MyColors.borderE3Color,
|
||||||
|
),
|
||||||
|
itemCount: nonFavouriteUserList?.length ?? 0),
|
||||||
|
]
|
||||||
|
],
|
||||||
|
).expanded
|
||||||
|
],
|
||||||
|
).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded,
|
||||||
|
Container(width: double.infinity, height: 1, color: MyColors.lightGreyEFColor),
|
||||||
|
DefaultButton(
|
||||||
|
LocaleKeys.cancel.tr(),
|
||||||
|
() {
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
textColor: MyColors.grey3AColor,
|
||||||
|
colors: const [
|
||||||
|
Color(0xffE6E6E6),
|
||||||
|
Color(0xffE6E6E6),
|
||||||
|
],
|
||||||
|
).insideContainer
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget employeeItemView(ReplacementList replacement) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.pop(context);
|
||||||
|
widget.onSelectEmployee(replacement);
|
||||||
|
},
|
||||||
|
child: SizedBox(
|
||||||
|
height: 50,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
CircularAvatar(
|
||||||
|
url: replacement.employeeImage ?? "",
|
||||||
|
height: 30,
|
||||||
|
width: 30,
|
||||||
|
isImageBase64: true,
|
||||||
|
),
|
||||||
|
16.width,
|
||||||
|
Expanded(
|
||||||
|
child: (replacement.employeeDisplayName ?? "").toText12(),
|
||||||
|
),
|
||||||
|
Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget radioOption(String title, int value, int groupValue) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.transparent,
|
||||||
|
border: Border.all(color: MyColors.borderColor, width: 1),
|
||||||
|
borderRadius: const BorderRadius.all(Radius.circular(100)),
|
||||||
|
),
|
||||||
|
padding: const EdgeInsets.all(4),
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: value == groupValue ? MyColors.grey3AColor : Colors.transparent,
|
||||||
|
borderRadius: BorderRadius.all(const Radius.circular(100)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
9.width,
|
||||||
|
title.toText12(color: MyColors.grey57Color)
|
||||||
|
],
|
||||||
|
).onPress(() {
|
||||||
|
_selectedSearchIndex = value;
|
||||||
|
setState(() {});
|
||||||
|
}).expanded;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue