diff --git a/assets/images/calendar2.svg b/assets/images/calendar2.svg
new file mode 100644
index 00000000..c12d08b4
--- /dev/null
+++ b/assets/images/calendar2.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/images/calender_bottom.svg b/assets/images/calender_bottom.svg
new file mode 100644
index 00000000..7c5af60f
--- /dev/null
+++ b/assets/images/calender_bottom.svg
@@ -0,0 +1,11 @@
+
diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart
index 9ba4acd3..a2f2a14b 100644
--- a/lib/extensions/widget_extensions.dart
+++ b/lib/extensions/widget_extensions.dart
@@ -19,6 +19,24 @@ extension WidgetExtensions on Widget {
Padding(padding: EdgeInsetsDirectional.only(start: start.toScreenWidth, end: end.toScreenWidth, top: top.toScreenHeight, bottom: bottom.toScreenHeight), child: this);
Widget toExpanded({int flex = 1}) => Expanded(flex: flex, child: this);
+
+ Widget get toShadowContainer => Container(
+ padding: const EdgeInsets.all(16),
+ decoration: ShapeDecoration(
+ color: Colors.white,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(20),
+ ),
+ shadows: const [
+ BoxShadow(
+ color: Color(0x07000000),
+ blurRadius: 14,
+ offset: Offset(0, 0),
+ spreadRadius: 0,
+ )
+ ],
+ ),
+ child: this);
}
extension DividerExtension on Divider {
diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb
index 0f47f595..20ee38d3 100644
--- a/lib/l10n/app_ar.arb
+++ b/lib/l10n/app_ar.arb
@@ -307,6 +307,7 @@
"updateWorkOrder" : "تعديل طلب العمل",
"createPreventiveMaintenanceRequest" : "إنشاء طلب صيانة وقائية",
"createNewRequest" : "إنشاء طلب جديد",
+ "calendar" : "التقويم",
"helpCenter" : "مركز المساعدة",
"rateUs": "قيمنا",
"settings" : " الاعدادات",
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index 757ba9a7..cef4f104 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -311,6 +311,7 @@
"updateWorkOrder" : "Update Work Order",
"createPreventiveMaintenanceRequest" : "Create Preventive Maintenance Request",
"createNewRequest" : "Create New Request",
+ "calender" : "Calender",
"helpCenter" : "Help Center",
"rateUs": "Rate Us",
"settings" : "Settings",
diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart
index ea36ea54..ab00a2fa 100644
--- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart
+++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart
@@ -1,12 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
+import 'package:provider/provider.dart';
+import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
+import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
-import '../../models/enums/translation_keys.dart';
-
class AppBottomNavigationBar extends StatelessWidget {
final Function(int index) onPressed;
final int selectedIndex;
@@ -19,6 +20,7 @@ class AppBottomNavigationBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
+ bool isEngineer = (Provider.of(context, listen: false).user.type) == UsersTypes.engineer;
return ClipRRect(
borderRadius: const BorderRadius.only(topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0)),
child: Container(
@@ -39,7 +41,8 @@ class AppBottomNavigationBar extends StatelessWidget {
navBarItem(context, index: 0, iconName: "overview", label: context.translation.overview),
navBarItem(context, index: 1, iconName: "requests", label: context.translation.myRequests),
navBarItem(context, index: 2, iconName: "assets", label: context.translation.myAssets),
- navBarItem(context, index: 3, iconName: "message", label: context.translation.contactUs),
+ if (isEngineer) navBarItem(context, index: 3, iconName: "calender_bottom", label: context.translation.calender),
+ navBarItem(context, index: isEngineer ? 4 : 3, iconName: "message", label: context.translation.contactUs),
],
currentIndex: selectedIndex,
onTap: onPressed,
diff --git a/lib/new_views/pages/land_page/calendar_page.dart b/lib/new_views/pages/land_page/calendar_page.dart
new file mode 100644
index 00000000..22fd80e9
--- /dev/null
+++ b/lib/new_views/pages/land_page/calendar_page.dart
@@ -0,0 +1,83 @@
+import 'package:flutter/material.dart';
+import 'package:test_sa/extensions/int_extensions.dart';
+import 'package:test_sa/extensions/text_extensions.dart';
+import 'package:test_sa/extensions/widget_extensions.dart';
+import 'package:test_sa/new_views/app_style/app_color.dart';
+import 'package:test_sa/new_views/pages/land_page/calender_fragments/daily_fragment.dart';
+import 'package:test_sa/new_views/pages/land_page/calender_fragments/weekly_fragment.dart';
+
+import 'calender_fragments/monthly_fragment.dart';
+
+class CalendarPage extends StatefulWidget {
+ const CalendarPage({Key key}) : super(key: key);
+
+ @override
+ State createState() => _CalendarPageState();
+}
+
+class _CalendarPageState extends State with SingleTickerProviderStateMixin {
+ TabController _tabController;
+
+ @override
+ void initState() {
+ super.initState();
+ _tabController = TabController(length: 3, vsync: this);
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: SafeArea(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ // todo @sikander, hiding My shift view, later when they add data, then will us it.
+ SizedBox(
+ width: double.infinity,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "My Shift".heading5(context),
+ 8.height,
+ "Sunday to Thursday".bodyText(context),
+ "09:00 to 18:00".bodyText(context).custom(color: AppColor.neutral50),
+ ],
+ ).toShadowContainer,
+ ),
+ 16.height,
+ Container(
+ decoration: BoxDecoration(color: AppColor.neutral30, borderRadius: BorderRadius.circular(16)),
+ child: TabBar(
+ controller: _tabController,
+ padding: EdgeInsets.zero,
+ labelColor: AppColor.neutral60,
+ unselectedLabelColor: AppColor.neutral20,
+ indicatorPadding: const EdgeInsets.all(4),
+ indicator: BoxDecoration(color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)),
+ onTap: (index) {
+ setState(() {});
+ },
+ tabs: [
+ Tab(text: "Monthly", height: 57.toScreenHeight),
+ Tab(text: "Weekly", height: 57.toScreenHeight),
+ Tab(text: "Daily", height: 57.toScreenHeight),
+ ],
+ ),
+ ),
+ 8.height,
+ TabBarView(
+ physics: const NeverScrollableScrollPhysics(),
+ controller: _tabController,
+ children: const [
+ MonthlyFragment(),
+ WeeklyFragment(),
+ DailyFragment(),
+ ],
+ ).expanded,
+ ],
+ ).paddingAll(16),
+ ),
+ );
+ }
+}
diff --git a/lib/new_views/pages/land_page/calender_fragments/calendar_header.dart b/lib/new_views/pages/land_page/calender_fragments/calendar_header.dart
new file mode 100644
index 00000000..63a46837
--- /dev/null
+++ b/lib/new_views/pages/land_page/calender_fragments/calendar_header.dart
@@ -0,0 +1,32 @@
+import 'package:flutter/material.dart';
+import 'package:intl/intl.dart';
+import 'package:test_sa/extensions/int_extensions.dart';
+import 'package:test_sa/extensions/text_extensions.dart';
+import 'package:test_sa/extensions/widget_extensions.dart';
+
+import '../../../app_style/app_color.dart';
+
+class CalendarHeader extends StatelessWidget {
+ final DateTime dateTime;
+ final DateFormat dateFormat;
+ const CalendarHeader({@required this.dateTime, @required this.dateFormat, Key key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ children: [
+ Row(
+ children: [
+ dateFormat.format(dateTime).heading5(context),
+ 6.width,
+ const Align(alignment: AlignmentDirectional.centerEnd, child: Icon(Icons.keyboard_arrow_down_sharp, color: AppColor.neutral60, size: 24)),
+ const Spacer(),
+ const Align(alignment: AlignmentDirectional.centerEnd, child: Icon(Icons.calendar_today, color: AppColor.neutral60, size: 18)),
+ ],
+ ),
+ 8.height,
+ const Divider().defaultStyle(context),
+ ],
+ );
+ }
+}
diff --git a/lib/new_views/pages/land_page/calender_fragments/calender_days_card.dart b/lib/new_views/pages/land_page/calender_fragments/calender_days_card.dart
new file mode 100644
index 00000000..925929b6
--- /dev/null
+++ b/lib/new_views/pages/land_page/calender_fragments/calender_days_card.dart
@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+import 'package:test_sa/extensions/int_extensions.dart';
+import 'package:test_sa/extensions/text_extensions.dart';
+
+import '../../../app_style/app_color.dart';
+
+class CalendarDaysCard extends StatelessWidget {
+ final String day;
+ const CalendarDaysCard({Key key, @required this.day}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ final bgColor = day == "1" ? AppColor.neutral30 : (day == "2" ? AppColor.primary40 : AppColor.green50).withOpacity(0.3);
+ final dotColor = (day == "1"
+ ? Colors.transparent
+ : day == "2"
+ ? AppColor.primary40
+ : AppColor.green50);
+ return SizedBox(
+ height: 45.toScreenWidth,
+ width: 45.toScreenWidth,
+ child: Stack(
+ children: [
+ Container(
+ height: 37.toScreenWidth,
+ width: 37.toScreenWidth,
+ alignment: Alignment.center,
+ decoration: BoxDecoration(shape: BoxShape.circle, color: bgColor),
+ child: day.bodyText(context).custom(color: AppColor.neutral50),
+ ),
+ PositionedDirectional(
+ bottom: 16.toScreenHeight,
+ end: 16.toScreenWidth,
+ child: CircleAvatar(backgroundColor: dotColor, radius: 2.5),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/new_views/pages/land_page/calender_fragments/daily_fragment.dart b/lib/new_views/pages/land_page/calender_fragments/daily_fragment.dart
new file mode 100644
index 00000000..c0182e20
--- /dev/null
+++ b/lib/new_views/pages/land_page/calender_fragments/daily_fragment.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+import 'package:test_sa/extensions/text_extensions.dart';
+
+class DailyFragment extends StatefulWidget {
+ const DailyFragment({Key key}) : super(key: key);
+
+ @override
+ _DailyFragmentState createState() {
+ return _DailyFragmentState();
+ }
+}
+
+class _DailyFragmentState extends State {
+ DateTime currentDateTime = DateTime.now();
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return SingleChildScrollView(
+ child: Column(
+ children: ["Daily".heading5(context)],
+ ),
+ );
+ }
+}
diff --git a/lib/new_views/pages/land_page/calender_fragments/monthly_fragment.dart b/lib/new_views/pages/land_page/calender_fragments/monthly_fragment.dart
new file mode 100644
index 00000000..10152d24
--- /dev/null
+++ b/lib/new_views/pages/land_page/calender_fragments/monthly_fragment.dart
@@ -0,0 +1,81 @@
+import 'package:flutter/material.dart';
+import 'package:intl/intl.dart';
+import 'package:table_calendar/table_calendar.dart';
+import 'package:test_sa/extensions/int_extensions.dart';
+import 'package:test_sa/extensions/widget_extensions.dart';
+
+import '../../../../extensions/text_extensions.dart';
+import '../../../app_style/app_color.dart';
+import 'calendar_header.dart';
+import 'calender_days_card.dart';
+
+class MonthlyFragment extends StatefulWidget {
+ const MonthlyFragment({Key key}) : super(key: key);
+
+ @override
+ State createState() => _MonthlyFragmentState();
+}
+
+class _MonthlyFragmentState extends State {
+ PageController _controller;
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ child: SingleChildScrollView(
+ child: Column(
+ children: [
+ TableCalendar(
+ firstDay: DateTime.utc(2010, 10, 16),
+ lastDay: DateTime.utc(2030, 3, 14),
+ focusedDay: DateTime.now(),
+ calendarFormat: CalendarFormat.month,
+ weekendDays: const [],
+ onCalendarCreated: (controller) {
+ _controller = controller;
+ },
+ calendarBuilders: CalendarBuilders(
+ headerTitleBuilder: (context, dateTime) => CalendarHeader(dateFormat: DateFormat("MMMM, yyyy"), dateTime: dateTime),
+ dowBuilder: (context, dateTime) {
+ final day = DateFormat("EE").format(dateTime).toUpperCase();
+ return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: AppColor.neutral50));
+ },
+ defaultBuilder: (context, dateTime, _) {
+ final day = DateFormat("d").format(dateTime);
+ return CalendarDaysCard(day: day);
+ },
+ ),
+ daysOfWeekHeight: 35.toScreenHeight,
+ headerStyle: const HeaderStyle(leftChevronVisible: false, rightChevronVisible: false, formatButtonVisible: false),
+ calendarStyle: CalendarStyle(
+ isTodayHighlighted: false,
+ defaultTextStyle: AppTextStyles.bodyText,
+ defaultDecoration: const BoxDecoration(shape: BoxShape.circle, color: AppColor.neutral30),
+ ),
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ 16.height,
+ Row(
+ children: [
+ const CircleAvatar(backgroundColor: AppColor.primary40, radius: 8),
+ 8.width,
+ "My Requests".heading6(context),
+ ],
+ ),
+ 16.height,
+ Row(
+ children: [
+ const CircleAvatar(backgroundColor: AppColor.green50, radius: 8),
+ 8.width,
+ "My Team Requests".heading6(context),
+ ],
+ ),
+ ],
+ ),
+ ],
+ ).paddingOnly(start: 16, end: 16, top: 8, bottom: 8),
+ ),
+ );
+ }
+}
diff --git a/lib/new_views/pages/land_page/calender_fragments/weekly_fragment.dart b/lib/new_views/pages/land_page/calender_fragments/weekly_fragment.dart
new file mode 100644
index 00000000..12d55447
--- /dev/null
+++ b/lib/new_views/pages/land_page/calender_fragments/weekly_fragment.dart
@@ -0,0 +1,102 @@
+import 'package:flutter/material.dart';
+import 'package:intl/intl.dart';
+import 'package:table_calendar/table_calendar.dart';
+import 'package:test_sa/extensions/int_extensions.dart';
+import 'package:test_sa/extensions/text_extensions.dart';
+import 'package:test_sa/extensions/widget_extensions.dart';
+import 'package:test_sa/new_views/app_style/app_color.dart';
+
+import 'calender_days_card.dart';
+
+class WeeklyFragment extends StatefulWidget {
+ const WeeklyFragment({Key key}) : super(key: key);
+
+ @override
+ _WeeklyFragmentState createState() {
+ return _WeeklyFragmentState();
+ }
+}
+
+class _WeeklyFragmentState extends State {
+ DateTime currentDateTime = DateTime.now();
+ PageController _controller;
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ TableCalendar(
+ firstDay: DateTime.utc(2010, 10, 16),
+ lastDay: DateTime.utc(2030, 3, 14),
+ focusedDay: DateTime.now(),
+ calendarFormat: CalendarFormat.week,
+ weekendDays: const [],
+ onCalendarCreated: (controller) {
+ _controller = controller;
+ },
+ calendarBuilders: CalendarBuilders(
+ headerTitleBuilder: (context, dateTime) => Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ DateFormat("EEEE, d MMMM, yyyy").format(dateTime).heading5(context),
+ 8.height,
+ const Divider().defaultStyle(context),
+ ],
+ ),
+ dowBuilder: (context, dateTime) {
+ final day = DateFormat("EE").format(dateTime).toUpperCase();
+ return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: AppColor.neutral50));
+ },
+ defaultBuilder: (context, dateTime, _) {
+ final day = DateFormat("d").format(dateTime);
+ return CalendarDaysCard(day: day);
+ },
+ ),
+ daysOfWeekHeight: 35.toScreenHeight,
+ headerStyle: const HeaderStyle(leftChevronVisible: false, rightChevronVisible: false, formatButtonVisible: false),
+ calendarStyle: CalendarStyle(
+ isTodayHighlighted: false,
+ defaultTextStyle: AppTextStyles.bodyText,
+ defaultDecoration: const BoxDecoration(shape: BoxShape.circle, color: AppColor.neutral30),
+ ),
+ ),
+ // TableCalendar(
+ // headerVisible: false,
+ // calendarFormat: CalendarFormat.week,
+ // firstDay: DateTime.utc(2010, 10, 16),
+ // lastDay: DateTime.utc(2030, 3, 14),
+ // focusedDay: currentDateTime,
+ // currentDay: currentDateTime,
+ // rowHeight: 37,
+ // calendarStyle: CalendarStyle(
+ // todayDecoration: cellDecoration(),
+ // todayTextStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF2B353E)),
+ // selectedTextStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF2B353E)),
+ // rangeStartTextStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF2B353E)),
+ // rangeEndTextStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF2B353E)),
+ // ),
+ // daysOfWeekStyle: DaysOfWeekStyle(
+ // weekdayStyle: AppTextStyles.bodyText.copyWith(color: AppColor.neutral50),
+ // weekendStyle: AppTextStyles.bodyText.copyWith(color: AppColor.neutral50),
+ // ),
+ // availableGestures: AvailableGestures.none,
+ // ),
+ ],
+ ).toShadowContainer,
+ );
+ }
+
+ BoxDecoration cellDecoration({Color color}) => BoxDecoration(color: color ?? Colors.transparent, shape: BoxShape.circle);
+}
diff --git a/lib/new_views/pages/land_page/calender_page12.dart b/lib/new_views/pages/land_page/calender_page12.dart
new file mode 100644
index 00000000..812f7e5a
--- /dev/null
+++ b/lib/new_views/pages/land_page/calender_page12.dart
@@ -0,0 +1,145 @@
+// import 'package:flutter/material.dart';
+// import 'package:table_calendar/table_calendar.dart';
+// import 'package:test_sa/extensions/int_extensions.dart';
+// import 'package:test_sa/extensions/text_extensions.dart';
+// import 'package:test_sa/extensions/widget_extensions.dart';
+// import 'package:test_sa/new_views/app_style/app_color.dart';
+// import 'package:test_sa/new_views/pages/land_page/calender_fragments/monthly_fragment.dart';
+// import 'package:test_sa/new_views/pages/land_page/calender_fragments/weekly_fragment.dart';
+//
+// class CalenderPage extends StatefulWidget {
+// CalenderPage({Key key}) : super(key: key);
+//
+// @override
+// _CalenderPageState createState() {
+// return _CalenderPageState();
+// }
+// }
+//
+// class _CalenderPageState extends State {
+// int selectedIndex = 0;
+// DateTime currentDateTime = DateTime.now();
+//
+// PageController _pageController;
+//
+// @override
+// void initState() {
+// _pageController = PageController();
+// super.initState();
+// }
+//
+// @override
+// void dispose() {
+// _pageController.dispose();
+// super.dispose();
+// }
+//
+// @override
+// Widget build(BuildContext context) {
+// return Scaffold(
+// body: Column(
+// children: [
+// // todo @sikander, hiding My shift view, later when they add data, then will us it.
+// Container(
+// width: double.infinity,
+// padding: const EdgeInsets.all(16),
+// decoration: ShapeDecoration(
+// color: Colors.white,
+// shape: RoundedRectangleBorder(
+// borderRadius: BorderRadius.circular(20),
+// ),
+// shadows: const [
+// BoxShadow(
+// color: Color(0x07000000),
+// blurRadius: 14,
+// offset: Offset(0, 0),
+// spreadRadius: 0,
+// )
+// ],
+// ),
+// child: Column(
+// crossAxisAlignment: CrossAxisAlignment.start,
+// mainAxisSize: MainAxisSize.min,
+// children: [
+// Text(
+// 'My Shift',
+// style: AppTextStyles.heading5.copyWith(color: AppColor.neutral50),
+// ),
+// 8.height,
+// Text(
+// 'Sunday to Thursday',
+// style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)),
+// ),
+// Text(
+// '09:00 to 18:00',
+// style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral50),
+// ),
+// ],
+// ),
+// ),
+//
+// Container(
+// width: double.infinity,
+// padding: const EdgeInsets.all(4),
+// decoration: ShapeDecoration(
+// color: const Color(0xFFEAF1F4),
+// shape: RoundedRectangleBorder(
+// borderRadius: BorderRadius.circular(16),
+// ),
+// shadows: const [
+// BoxShadow(
+// color: Color(0x07000000),
+// blurRadius: 14,
+// offset: Offset(0, 0),
+// spreadRadius: 0,
+// )
+// ],
+// ),
+// child: Row(
+// children: [
+// tabItem("Monthly", 0, selectedIndex, () => onTabPress(0)),
+// tabItem("Weekly", 1, selectedIndex, () => onTabPress(1)),
+// tabItem("Daily", 2, selectedIndex, () => onTabPress(2)),
+// ],
+// ),
+// ),
+// 8.height,
+// PageView(
+// controller: _pageController,
+// onPageChanged: (index) => onTabPress(index),
+// children: [
+// MonthlyFragment(),
+// WeeklyFragment(),
+// Container(),
+// ],
+// ).expanded,
+// ],
+// ),
+// );
+// }
+//
+// void onTabPress(index) {
+// if (selectedIndex != index) {
+// setState(() {
+// selectedIndex = index;
+// });
+// _pageController.jumpToPage(index);
+// }
+// }
+//
+// Widget tabItem(String title, int index, int selectedIndex, VoidCallback onPress) {
+// return Container(
+// alignment: Alignment.center,
+// padding: const EdgeInsets.only(top: 14, bottom: 14),
+// decoration: ShapeDecoration(
+// color: index == selectedIndex ? Colors.white : Colors.transparent,
+// shape: RoundedRectangleBorder(
+// borderRadius: BorderRadius.circular(13),
+// ),
+// ),
+// child: Text(
+// title,
+// style: AppTextStyles.bodyText.copyWith(color: index == selectedIndex ? AppColor.neutral60 : const Color(0xFF757575)),
+// )).onPress(onPress).expanded;
+// }
+// }
diff --git a/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart b/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart
index 89de3701..3b037be6 100644
--- a/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart
+++ b/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart
@@ -1,11 +1,54 @@
import 'package:flutter/material.dart';
+import 'package:pie_chart/pie_chart.dart';
+import 'package:test_sa/extensions/int_extensions.dart';
+import 'package:test_sa/extensions/text_extensions.dart';
+import 'package:test_sa/extensions/widget_extensions.dart';
+import 'package:test_sa/new_views/app_style/app_color.dart';
+import 'package:test_sa/views/app_style/colors.dart';
class ProgressFragment extends StatelessWidget {
- ProgressFragment({Key key}) : super(key: key);
+ const ProgressFragment({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
- // TODO: implement build
- return Container();
+ const Map statuses = {
+ "Completed": 12,
+ "In Progress": 12,
+ "Open": 12,
+ };
+ return Column(
+ children: [
+ Card(
+ child: Stack(
+ alignment: Alignment.center,
+ children: [
+ PieChart(
+ dataMap: statuses,
+ animationDuration: const Duration(milliseconds: 800),
+ chartRadius: 190.toScreenWidth,
+ colorList: [AColors.statusGreen, AColors.statusBlue, AColors.statusYellowLight],
+ initialAngleInDegree: 270,
+ chartType: ChartType.ring,
+ ringStrokeWidth: 40.toScreenWidth,
+ legendOptions: const LegendOptions(showLegends: false),
+ chartValuesOptions: ChartValuesOptions(
+ chartValueBackgroundColor: Colors.transparent,
+ chartValueStyle: AppTextStyles.heading6.copyWith(color: AppColor.neutral20),
+ showChartValuesOutside: true,
+ ),
+ ),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ "Total".heading5(context),
+ "20".heading6(context).custom(color: AppColor.neutral20),
+ ],
+ )
+ ],
+ ).paddingAll(23),
+ ),
+ ],
+ ).paddingOnly(start: 16, end: 16);
}
}
diff --git a/lib/new_views/pages/land_page/dashboard_page.dart b/lib/new_views/pages/land_page/dashboard_page.dart
index d359cd1c..c952968a 100644
--- a/lib/new_views/pages/land_page/dashboard_page.dart
+++ b/lib/new_views/pages/land_page/dashboard_page.dart
@@ -3,10 +3,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
-import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
-import 'package:test_sa/new_views/common_widgets/app_drawer.dart';
-import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart';
import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart';
import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/recent_activites_fragment.dart';
import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/requests_fragment.dart';
@@ -122,7 +119,7 @@ class _DashboardPageState extends State {
onPageChanged: (index) => setState(() => _currentPage = index),
children: [
RequestsFragment(),
- ProgressFragment(),
+ const ProgressFragment(),
RecentActivitiesFragment(),
],
).expanded,
diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart
index 242cc74f..d15b2992 100644
--- a/lib/new_views/pages/land_page/land_page.dart
+++ b/lib/new_views/pages/land_page/land_page.dart
@@ -2,7 +2,11 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
+import 'package:provider/provider.dart';
+import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart';
+import 'package:test_sa/models/enums/user_types.dart';
+import 'package:test_sa/new_views/pages/land_page/calendar_page.dart';
import 'package:test_sa/new_views/pages/land_page/home_app_bar.dart';
import 'package:test_sa/new_views/pages/land_page/my_assets_page.dart';
import 'package:test_sa/new_views/pages/land_page/my_request/my_requests_page.dart';
@@ -30,22 +34,29 @@ class _LandPageState extends State {
int currentPageIndex = 0;
bool showAppbar = true;
List _pages;
+ UserProvider _userProvider;
@override
void initState() {
- _pages = [
- DashboardPage(onDrawerPress: (() {
- _scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer();
- })),
- old_page.LandPage(),
- SingleDevicePicker(),
- MyRequestsPage(),
- ];
+ _pages = [];
super.initState();
}
@override
Widget build(BuildContext context) {
+ if (_userProvider == null) {
+ _userProvider = Provider.of(context, listen: false);
+ _pages = [
+ DashboardPage(onDrawerPress: (() {
+ _scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer();
+ })),
+ old_page.LandPage(),
+ SingleDevicePicker(),
+ if (_userProvider.user.type == UsersTypes.engineer) CalendarPage(),
+ MyRequestsPage(),
+ ];
+ }
+
return WillPopScope(
onWillPop: () async {
/// TODO [zaid] : show dialog before exit
@@ -67,12 +78,14 @@ class _LandPageState extends State {
},
child: Scaffold(
key: _scaffoldKey,
- drawer: AppDrawer(),
+ drawer: const AppDrawer(),
body: _pages[currentPageIndex],
bottomNavigationBar: AppBottomNavigationBar(
selectedIndex: currentPageIndex,
onPressed: (index) {
- if (index == 3) {
+ bool isEngineer = _userProvider.user.type == UsersTypes.engineer;
+
+ if (index == (isEngineer ? 4 : 3)) {
showModalBottomSheet(
context: context,
useSafeArea: true,
@@ -83,7 +96,6 @@ class _LandPageState extends State {
setState(() {
currentPageIndex = index;
});
-
if (index == 1) {
setState(() {
showAppbar = false;
diff --git a/lib/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart
index c40406d5..7c9b8179 100644
--- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart
+++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart
@@ -1,41 +1,36 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
-import 'package:test_sa/models/enums/translation_keys.dart';
import '../../../app_style/app_color.dart';
import '../../../common_widgets/app_search_field.dart';
class MyRequestsPage extends StatelessWidget {
- const MyRequestsPage({Key key}) : super(key: key);
-
+ const MyRequestsPage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
- return Scaffold(
+ return Scaffold(
appBar: AppBar(
-
leadingWidth: 0,
title: Padding(
padding: const EdgeInsets.only(bottom: 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
- Expanded(child: SizedBox(
- height: 50,
- child: AppSearchField())),
- SizedBox(width: 20,),
- Text(context.translation.filter, style: TextStyle(
- color: AppColor.primary50,
- fontSize: Theme.of(context).textTheme.bodySmall.fontSize,
- fontWeight: FontWeight.w500
- ),)
+ const Expanded(child: SizedBox(height: 50, child: AppSearchField())),
+ const SizedBox(
+ width: 20,
+ ),
+ Text(
+ context.translation.filter,
+ style: TextStyle(color: AppColor.primary50, fontSize: Theme.of(context).textTheme.bodySmall.fontSize, fontWeight: FontWeight.w500),
+ )
],
),
),
),
-
- body: TabBarView(
- children: const [
+ body: const TabBarView(
+ children: [
Center(
child: Text(""),
),
diff --git a/pubspec.lock b/pubspec.lock
index 05694b26..591827a5 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -877,6 +877,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.1.0"
+ pie_chart:
+ dependency: "direct main"
+ description:
+ name: pie_chart
+ sha256: "5dba6d0eb4718e8ed00a9079361cd8947c3f84ac5a5d76f05a27f4ec5e27589e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.3.2"
platform:
dependency: transitive
description:
@@ -1045,6 +1053,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.3.0"
+ simple_gesture_detector:
+ dependency: transitive
+ description:
+ name: simple_gesture_detector
+ sha256: "86d08f85f1f58583b7b4b941d989f48ea6ce08c1724a1d10954a277c2ec36592"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.0"
sky_engine:
dependency: transitive
description: flutter
@@ -1130,6 +1146,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.0"
+ table_calendar:
+ dependency: "direct main"
+ description:
+ name: table_calendar
+ sha256: "7f1270313c0cdb245b583ed8518982c01d4a7e95869b3c30abcbae3b642c45d0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.8"
term_glyph:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 9997be3c..aa94560a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -72,6 +72,8 @@ dependencies:
lottie: ^2.3.0
shimmer: ^2.0.0
flutter_advanced_switch: ^3.0.1
+ pie_chart: ^5.3.2
+ table_calendar: ^3.0.8
dev_dependencies:
flutter_test: