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/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 9523a7d9..187e9b99 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -306,5 +306,6 @@ "requesterName" : "اسم الطالب", "updateWorkOrder" : "تعديل طلب العمل", "createPreventiveMaintenanceRequest" : "إنشاء طلب صيانة وقائية", - "createNewRequest" : "إنشاء طلب جديد" + "createNewRequest" : "إنشاء طلب جديد", + "calendar" : "التقويم" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d76461ad..7b7ebad3 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -310,5 +310,6 @@ "requesterName" : "Requester Name", "updateWorkOrder" : "Update Work Order", "createPreventiveMaintenanceRequest" : "Create Preventive Maintenance Request", - "createNewRequest" : "Create New Request" + "createNewRequest" : "Create New Request", + "calendar" : "Calendar" } \ No newline at end of file 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..23978393 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) { + final user = Provider.of(context, listen: false).user; 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), + navBarItem(context, index: 3, iconName: "calendar2", label: context.translation.calendar), + if (user.type == UsersTypes.engineer) navBarItem(context, index: 4, 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..ce98fd56 --- /dev/null +++ b/lib/new_views/pages/land_page/calendar_page.dart @@ -0,0 +1,140 @@ +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 '../../common_widgets/default_app_bar.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( + appBar: const DefaultAppBar(title: ""), + body: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + "My Shift".heading5(context), + 8.height, + "Sunday to Thursday".bodyText(context), + "09:00 to 18:00".bodyText(context).custom(color: AppColor.neutral50), + ], + ).paddingAll(16), + ), + 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: [ + CalendarCard( + calendarFormat: CalendarFormat.month, + child: Column( + 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), + ], + ), + ], + ), + ), + CalendarCard( + calendarFormat: CalendarFormat.week, + child: Column( + children: [ + const Divider().defaultStyle(context), + ], + ), + ), + Container(), + ], + ).expanded, + ], + ).paddingAll(16), + ); + } +} + +class CalendarCard extends StatelessWidget { + final CalendarFormat calendarFormat; + final Widget child; + const CalendarCard({this.calendarFormat, this.child, Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + child: Column( + children: [ + TableCalendar( + firstDay: DateTime.utc(2010, 10, 16), + lastDay: DateTime.utc(2030, 3, 14), + focusedDay: DateTime.now(), + calendarFormat: calendarFormat, + weekendDays: const [], + headerStyle: HeaderStyle( + leftChevronIcon: null, + leftChevronMargin: EdgeInsets.zero, + leftChevronPadding: EdgeInsets.zero, + rightChevronMargin: EdgeInsets.zero, + rightChevronPadding: EdgeInsets.only(bottom: 16.toScreenHeight), + formatButtonVisible: false, + rightChevronIcon: const Icon(Icons.calendar_today, color: AppColor.neutral60, size: 18), + ), + ), + child, + ], + ).paddingOnly(start: 16, end: 16, top: 8, bottom: 8), + ); + } +} 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..3c687f09 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -2,17 +2,15 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:test_sa/extensions/int_extensions.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'; -import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/views/pages/user/land_page.dart' as old_page; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../models/enums/user_types.dart'; import '../../common_widgets/app_bottom_nav_bar.dart'; import '../../common_widgets/app_drawer.dart'; -import '../../common_widgets/app_floating_action_button.dart'; +import 'calendar_page.dart'; import 'contact_us_bottom_sheet.dart'; import 'dashboard_page.dart'; @@ -32,16 +30,18 @@ class _LandPageState extends State { List _pages; @override - void initState() { + void didChangeDependencies() { + final user = Provider.of(context, listen: false).user; _pages = [ DashboardPage(onDrawerPress: (() { _scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer(); })), - old_page.LandPage(), - SingleDevicePicker(), - MyRequestsPage(), + const old_page.LandPage(), + // const MyRequestsPage(), + const SingleDevicePicker(), + if (user.type == UsersTypes.engineer) const CalendarPage(), ]; - super.initState(); + super.didChangeDependencies(); } @override @@ -67,12 +67,12 @@ 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) { + if (index == _pages.length) { showModalBottomSheet( context: context, useSafeArea: true, 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 2f19d78f..591827a5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1053,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 @@ -1138,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 9379bdc4..3c61f20d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -73,6 +73,7 @@ dependencies: shimmer: ^2.0.0 flutter_advanced_switch: ^3.0.1 pie_chart: ^5.3.2 + table_calendar: ^3.0.0 dev_dependencies: flutter_test: