From c945c64257621f90ec4f703f673f9790436fe94b Mon Sep 17 00:00:00 2001 From: Vaibhav Date: Tue, 27 Aug 2024 15:47:53 +0530 Subject: [PATCH] update inventory new screen and api intergrate --- lib/models/Daily_Task_Response.dart | 103 +++++++++ lib/models/products_response.dart | 39 ++-- lib/provider/daily_task_provider.dart | 52 +++++ lib/provider/products_provider.dart | 2 - lib/provider/select_task_provider.dart | 2 +- lib/screens/Update_inventorytask_screen.dart | 127 +++++++++++ lib/screens/daily_tasks_screen.dart | 211 ++++++++++++------- lib/screens/home_screen.dart | 3 +- lib/screens/select_taskkyc_screen.dart | 148 +++++++------ lib/services/api_urls.dart | 2 + 10 files changed, 526 insertions(+), 163 deletions(-) create mode 100644 lib/models/Daily_Task_Response.dart create mode 100644 lib/provider/daily_task_provider.dart create mode 100644 lib/screens/Update_inventorytask_screen.dart diff --git a/lib/models/Daily_Task_Response.dart b/lib/models/Daily_Task_Response.dart new file mode 100644 index 0000000..6e5fd3c --- /dev/null +++ b/lib/models/Daily_Task_Response.dart @@ -0,0 +1,103 @@ +import 'package:cheminova/models/rejected_applicaton_response.dart'; +import 'package:cheminova/provider/pd_rd_provider.dart'; + +class DailyTasksResponse { + bool? success; + List? tasks; + + DailyTasksResponse({this.success, this.tasks}); + + DailyTasksResponse.fromJson(Map json) { + success = json['success']; + if (json['tasks'] != null) { + tasks = []; + json['tasks'].forEach((v) { + tasks!.add(new Tasks.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['success'] = this.success; + if (this.tasks != null) { + data['tasks'] = this.tasks!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Tasks { + String? tradeName; + String? sId; + String? taskId; + String? task; + String? taskStatus; + String? taskPriority; + String? taskDueDate; + String? taskAssignedTo; + String? taskAssignedBy; + String? addedFor; + String? addedForId; + String? createdAt; + String? updatedAt; + int? iV; + String? note; + + Tasks( + {this.sId, + this.taskId, + this.tradeName, + this.task, + this.taskStatus, + this.taskPriority, + this.taskDueDate, + this.taskAssignedTo, + this.taskAssignedBy, + this.addedFor, + this.addedForId, + this.createdAt, + this.updatedAt, + this.iV, + this.note}); + + Tasks.fromJson(Map json) { + sId = json['_id']; + tradeName = json['tradename']; + taskId = json['taskId']; + task = json['task']; + taskStatus = json['taskStatus']; + taskPriority = json['taskPriority']; + taskDueDate = json['taskDueDate']; + taskAssignedTo = json['taskAssignedTo']; + taskAssignedBy = json['taskAssignedBy']; + addedFor = json['addedFor']; + addedForId = json['addedForId']; + createdAt = json['createdAt']; + updatedAt = json['updatedAt']; + iV = json['__v']; + note = json['note']; + } + + + Map toJson() { + final Map data = new Map(); + data['_id'] = this.sId; + data['tradename'] = this.tradeName; + data['taskId'] = this.taskId; + data['task'] = this.task; + data['taskStatus'] = this.taskStatus; + data['taskPriority'] = this.taskPriority; + data['taskDueDate'] = this.taskDueDate; + data['taskAssignedTo'] = this.taskAssignedTo; + data['taskAssignedBy'] = this.taskAssignedBy; + data['addedFor'] = this.addedFor; + data['addedForId'] = this.addedForId; + data['createdAt'] = this.createdAt; + data['updatedAt'] = this.updatedAt; + data['__v'] = this.iV; + data['note'] = this.note; + data['Distributor'] = this.taskAssignedTo; + return data; + } +} diff --git a/lib/models/products_response.dart b/lib/models/products_response.dart index 3f0a2e6..c1b365b 100644 --- a/lib/models/products_response.dart +++ b/lib/models/products_response.dart @@ -36,13 +36,13 @@ class Products { String? sKU; String? name; Category? category; + Brand? brand; int? price; - GST? gST; + int? gST; + int? hSNCode; String? description; - String? specialInstructions; String? productStatus; AddedBy? addedBy; - List? image; String? createdAt; String? updatedAt; int? iV; @@ -52,13 +52,13 @@ class Products { this.sKU, this.name, this.category, + this.brand, this.price, this.gST, + this.hSNCode, this.description, - this.specialInstructions, this.productStatus, this.addedBy, - this.image, this.createdAt, this.updatedAt, this.iV}); @@ -70,10 +70,11 @@ class Products { category = json['category'] != null ? new Category.fromJson(json['category']) : null; + brand = json['brand'] != null ? new Brand.fromJson(json['brand']) : null; price = json['price']; - gST = json['GST'] != null ? new GST.fromJson(json['GST']) : null; + gST = json['GST']; + hSNCode = json['HSN_Code']; description = json['description']; - specialInstructions = json['special_instructions']; productStatus = json['product_Status']; addedBy = json['addedBy'] != null ? new AddedBy.fromJson(json['addedBy']) : null; @@ -90,12 +91,13 @@ class Products { if (this.category != null) { data['category'] = this.category!.toJson(); } - data['price'] = this.price; - if (this.gST != null) { - data['GST'] = this.gST!.toJson(); + if (this.brand != null) { + data['brand'] = this.brand!.toJson(); } + data['price'] = this.price; + data['GST'] = this.gST; + data['HSN_Code'] = this.hSNCode; data['description'] = this.description; - data['special_instructions'] = this.specialInstructions; data['product_Status'] = this.productStatus; if (this.addedBy != null) { data['addedBy'] = this.addedBy!.toJson(); @@ -126,24 +128,21 @@ class Category { } } -class GST { +class Brand { String? sId; - String? name; - int? tax; + String? brandName; - GST({this.sId, this.name, this.tax}); + Brand({this.sId, this.brandName}); - GST.fromJson(Map json) { + Brand.fromJson(Map json) { sId = json['_id']; - name = json['name']; - tax = json['tax']; + brandName = json['brandName']; } Map toJson() { final Map data = new Map(); data['_id'] = this.sId; - data['name'] = this.name; - data['tax'] = this.tax; + data['brandName'] = this.brandName; return data; } } diff --git a/lib/provider/daily_task_provider.dart b/lib/provider/daily_task_provider.dart new file mode 100644 index 0000000..b0a0752 --- /dev/null +++ b/lib/provider/daily_task_provider.dart @@ -0,0 +1,52 @@ +import 'package:cheminova/models/Daily_Task_Response.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import '../services/api_client.dart'; +import '../services/api_urls.dart'; + +class DailyTaskProvider extends ChangeNotifier { + DailyTaskProvider() { + getTask(type: 'New'); + } + + final _apiClient = ApiClient(); + List newTasksList = []; + List pendingTasksList = []; + List completedTasksList = []; + + bool _isLoading = false; + + bool get isLoading => _isLoading; + + void setLoading(bool loading) { + _isLoading = loading; + notifyListeners(); + } + + Future getTask({required String type}) async { + setLoading(true); + try { + Response response = await _apiClient.get(ApiUrls.dailyTaskUrl+type); + setLoading(false); + if (response.statusCode == 200) { + final data = DailyTasksResponse.fromJson(response.data); + + if (type == 'New') { + newTasksList = data.tasks ?? []; + } else if (type == 'Pending') { + pendingTasksList = data.tasks ?? []; + } else { + completedTasksList = data.tasks ?? []; + } + notifyListeners(); + } + } catch (e) { + setLoading(false); + if (kDebugMode) { + print("Error occurred while fetching notifications: $e"); + } + } + } +} diff --git a/lib/provider/products_provider.dart b/lib/provider/products_provider.dart index 83b3233..0e152be 100644 --- a/lib/provider/products_provider.dart +++ b/lib/provider/products_provider.dart @@ -1,12 +1,10 @@ import 'dart:convert'; - import 'package:cheminova/constants/constant.dart'; import 'package:cheminova/screens/data_submit_successfull.dart'; import 'package:cheminova/services/api_client.dart'; import 'package:cheminova/services/api_urls.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; - import '../models/products_response.dart'; class ProductProvider extends ChangeNotifier { diff --git a/lib/provider/select_task_provider.dart b/lib/provider/select_task_provider.dart index 2c65e30..c0f9dac 100644 --- a/lib/provider/select_task_provider.dart +++ b/lib/provider/select_task_provider.dart @@ -26,7 +26,7 @@ class SelectTaskProvider extends ChangeNotifier { Future getTask() async { setLoading(true); try { - Response response = await _apiClient.get(ApiUrls.selectTaskUrl); + Response response = await _apiClient.get(ApiUrls.kycSelectTaskUrl); setLoading(false); if (response.statusCode == 200) { final data = SelectTaskKycResponse.fromJson(response.data); diff --git a/lib/screens/Update_inventorytask_screen.dart b/lib/screens/Update_inventorytask_screen.dart new file mode 100644 index 0000000..0423b79 --- /dev/null +++ b/lib/screens/Update_inventorytask_screen.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:cheminova/models/Daily_Task_Response.dart'; +import 'package:cheminova/screens/update_inventory_screen.dart'; +import 'package:cheminova/widgets/common_app_bar.dart'; +import 'package:cheminova/widgets/common_background.dart'; +import 'package:cheminova/widgets/common_drawer.dart'; +import '../constants/constant.dart'; +import '../provider/daily_task_provider.dart'; +import 'Add_products_screen.dart'; + +class UpdateInventoryTaskScreen extends StatefulWidget { + const UpdateInventoryTaskScreen({super.key}); + + @override + _UpdateInventoryTaskScreenState createState() => _UpdateInventoryTaskScreenState(); +} + +class _UpdateInventoryTaskScreenState extends State { + late DailyTaskProvider _dailyTaskProvider; + + @override + void initState() { + super.initState(); + _dailyTaskProvider = DailyTaskProvider(); + _dailyTaskProvider.getTask(type: 'New'); + } + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (context) => _dailyTaskProvider, + child: Scaffold( + extendBodyBehindAppBar: true, + appBar: _buildAppBar(), + drawer: const CommonDrawer(), + body: CommonBackground( + child: SafeArea( + child: _buildTaskList(), + ), + ), + ), + ); + } + + CommonAppBar _buildAppBar() { + return CommonAppBar( + backgroundColor: Colors.transparent, + elevation: 0, + actions: [ + IconButton( + onPressed: () => Navigator.pop(context), + icon: Image.asset('assets/Back_attendance.png'), + padding: const EdgeInsets.only(right: 20), + ), + ], + title: const Text( + 'Inventory Update Tasks', + style: TextStyle(color: Colors.black87, fontSize: 20), + ), + ); + } + + Widget _buildTaskList() { + return Consumer( + builder: (context, value, child) => + value.isLoading + ? const Center(child: CircularProgressIndicator()) + : ListView.separated( + padding: const EdgeInsets.all(16), + itemCount: value.newTasksList.length, + separatorBuilder: (context, index) => const SizedBox(height: 8), + itemBuilder: (context, index) { + final task = value.newTasksList[index]; + if (task.task?.toLowerCase() == 'update inventory data') { + return _buildTaskCard(task); + } else { + return const SizedBox.shrink(); + } + }, + ), + ); + } + + Widget _buildTaskCard(Tasks tasksList) { + return InkWell( + onTap: () { + if (tasksList.sId != null && tasksList.addedFor != null) { + Navigator.push( + navigatorKey.currentContext!, + MaterialPageRoute( + builder: (context) => AddProductsScreen( + distributorType: tasksList.addedFor!, + tradeName: tasksList.tradeName??'', + pdRdId: tasksList.sId!))); + } + }, + child: Card( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + child: ListTile( + leading: const Icon(Icons.inventory, color: Colors.blueAccent), + title: Text( + tasksList.task ?? '', + style: const TextStyle( + color: Colors.black87, + fontWeight: FontWeight.w700, + fontSize: 16, + fontFamily: 'Anek', + ), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Distributor: ${tasksList.addedFor ?? ""}'), + Text('Trader Name: ${tasksList.tradeName??''}'), + Text('Due Date: ${tasksList.taskDueDate}'), + Text('Priority: ${tasksList.taskPriority}'), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, color: Colors.black87), + + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/daily_tasks_screen.dart b/lib/screens/daily_tasks_screen.dart index 2e1d2b9..53f3a2c 100644 --- a/lib/screens/daily_tasks_screen.dart +++ b/lib/screens/daily_tasks_screen.dart @@ -1,3 +1,5 @@ +import 'package:cheminova/models/Daily_Task_Response.dart'; +import 'package:cheminova/screens/Add_products_screen.dart'; import 'package:flutter/material.dart'; import 'package:cheminova/screens/visit_dealers_screen.dart'; import 'package:cheminova/screens/display_sales_screen.dart'; @@ -7,6 +9,9 @@ import 'package:cheminova/widgets/common_app_bar.dart'; import 'package:cheminova/widgets/common_drawer.dart'; import 'package:cheminova/widgets/common_background.dart'; import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +import '../provider/daily_task_provider.dart'; class DailyTasksScreen extends StatefulWidget { const DailyTasksScreen({super.key}); @@ -18,27 +23,36 @@ class DailyTasksScreen extends StatefulWidget { class _DailyTasksScreenState extends State { final List _tabTitles = ['NEW', 'PENDING', 'COMPLETED']; int _selectedTabIndex = 0; + late DailyTaskProvider _dailyTaskProvider; + + @override + void initState() { + _dailyTaskProvider = DailyTaskProvider(); + super.initState(); + } @override Widget build(BuildContext context) { - return Scaffold( - extendBodyBehindAppBar: true, - appBar: _buildAppBar(), - drawer: const CommonDrawer(), - body: CommonBackground( - child: SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildCustomTabBar(), - Expanded( - child: _buildTaskList(_selectedTabIndex), + return ChangeNotifierProvider( + create: (context) => _dailyTaskProvider, + child: Scaffold( + extendBodyBehindAppBar: true, + appBar: _buildAppBar(), + drawer: const CommonDrawer(), + body: CommonBackground( + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildCustomTabBar(), + Expanded( + child: _buildTaskList(_selectedTabIndex), + ), + ], ), - ], + ), ), - ), - ), - ); + )); } CommonAppBar _buildAppBar() { @@ -67,7 +81,16 @@ class _DailyTasksScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: List.generate(_tabTitles.length, (index) { return GestureDetector( - onTap: () => setState(() => _selectedTabIndex = index), + onTap: () { + setState(() => _selectedTabIndex = index); + if (index == 0) { + _dailyTaskProvider.getTask(type: 'New'); + } else if (index == 1) { + _dailyTaskProvider.getTask(type: 'Pending'); + } else { + _dailyTaskProvider.getTask(type: 'Completed'); + } + }, child: Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), decoration: BoxDecoration( @@ -150,81 +173,127 @@ class _DailyTasksScreenState extends State { tasks = []; } - return ListView.separated( - padding: const EdgeInsets.all(16), - itemCount: tasks.length, - separatorBuilder: (context, index) => const SizedBox(height: 8), - itemBuilder: (context, index) => _buildTaskCard(tasks[index]), + return Consumer( + builder: (context, value, child) => value.isLoading + ? const Center(child: CircularProgressIndicator()) + : ListView.separated( + padding: const EdgeInsets.all(16), + itemCount: _selectedTabIndex == 0 + ? value.newTasksList.length + : _selectedTabIndex == 1 + ? value.pendingTasksList.length + : value.completedTasksList.length, + separatorBuilder: (context, index) => const SizedBox(height: 8), + itemBuilder: (context, index) { + final tasksList = tabIndex == 0 + ? value.newTasksList + : tabIndex == 1 + ? value.pendingTasksList + : value.completedTasksList; + return _buildTaskCard(tasksList[index]); + }, + ), ); } - Widget _buildTaskCard(TaskItem task) { - if (task is KycTaskItem) { - return Card( + Widget _buildTaskCard(Tasks tasksList) { + return InkWell( + onTap: () { + if (tasksList.task == 'Collect KYC') { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + CollectKycScreen(id: tasksList.taskId ?? ''))); + } else if (tasksList.task == 'REUPLOAD') { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + CollectKycScreen(id: tasksList.taskId ?? ''))); + } else if (tasksList.task == 'Update Inventory Data') { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AddProductsScreen( + distributorType: tasksList.addedFor!, + tradeName: tasksList.tradeName ?? '', + pdRdId: tasksList.sId!))); + } else if (tasksList.task == 'Update Sales Data') { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const DisplaySalesScreen())); + } else if (tasksList.task == 'Visit Dealers/Retailers') { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const VisitDealersScreen())); + } + }, + child: Card( color: Colors.white, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ ListTile( - leading: const Icon(Icons.task, color: Colors.blueAccent), - title: Text( - task.title, - style: const TextStyle( - color: Colors.black87, - fontWeight: FontWeight.w700, - fontSize: 16, - fontFamily: 'Anek', - ), - ), - trailing: - const Icon(Icons.arrow_forward_ios, color: Colors.black87), - onTap: () => Navigator.push(context, - MaterialPageRoute(builder: (context) => task.screen)), - ), + leading: const Icon(Icons.task, color: Colors.blueAccent), + title: Text(tasksList.task ?? '', + style: const TextStyle( + color: Colors.black87, + fontWeight: FontWeight.w700, + fontSize: 16, + fontFamily: 'Anek')), + trailing: + const Icon(Icons.arrow_forward_ios, color: Colors.black87)), Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Note: ${task.note}'), - Text('Date: ${task.date.toString().split(' ')[0]}'), - Text('Priority: ${task.Low}'), + if (tasksList.task?.toLowerCase() == 'collect kyc') + Text('Note: ${tasksList.note}') + else if (tasksList.task?.toLowerCase() == + 'update inventory data') + Text('Distributor: ${tasksList.addedFor ?? ""}'), + if(tasksList.tradeName != null) Text('Trade Name: ${tasksList.tradeName ?? ""}'), + if(tasksList.taskDueDate != null) Text('Due Date: ${DateFormat('dd/MM/yyyy').format(DateTime.parse(tasksList.taskDueDate!))}'), + Text('Priority: ${tasksList.taskPriority}'), ], ), ), ], ), - ); - } else { - return Card( - color: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), - child: ListTile( - leading: const Icon(Icons.task, color: Colors.blueAccent), - title: Text( - task.title, - style: const TextStyle( - color: Colors.black87, - fontWeight: FontWeight.w700, - fontSize: 16, - fontFamily: 'Anek', - ), - ), - trailing: const Icon(Icons.arrow_forward_ios, color: Colors.black87), - onTap: () => Navigator.push( - context, MaterialPageRoute(builder: (context) => task.screen)), - ), - ); - } + ), + ); } final List _newTasks = [ - KycTaskItem('Collect KYC Documents', const CollectKycScreen(id: '',), - 'Collect KYC documents from ABC Trader', DateFormat('dd/MM/yyyy').format(DateTime.now()).toString(), 'Priority'), - KycTaskItem('REUPLOAD', const CollectKycScreen(id: '',), - 'Reupload Pan Car From Shiv Traders', DateFormat('dd/MM/yyyy').format(DateTime.now()).toString(), 'Priority'), - KycTaskItem('REUPLOAD', const CollectKycScreen(id: '',), - 'Reupload Pan Car From Shiv Traders', DateFormat('dd/MM/yyyy').format(DateTime.now()).toString(), 'Priority'), + KycTaskItem( + 'Collect KYC Documents', + const CollectKycScreen( + id: '', + ), + 'Collect KYC documents from ABC Trader', + DateFormat('dd/MM/yyyy').format(DateTime.now()).toString(), + 'Priority'), + KycTaskItem( + 'REUPLOAD', + const CollectKycScreen( + id: '', + ), + 'Reupload Pan Car From Shiv Traders', + DateFormat('dd/MM/yyyy').format(DateTime.now()).toString(), + 'Priority'), + KycTaskItem( + 'REUPLOAD', + const CollectKycScreen( + id: '', + ), + 'Reupload Pan Car From Shiv Traders', + DateFormat('dd/MM/yyyy').format(DateTime.now()).toString(), + 'Priority'), // TaskItem('Update Inventory Data', const UpdateInventoryScreen()), ]; diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index a151375..122a7c7 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -1,5 +1,6 @@ import 'package:cheminova/notification_services.dart'; import 'package:cheminova/provider/home_provider.dart'; +import 'package:cheminova/screens/Update_inventorytask_screen.dart'; import 'package:cheminova/screens/rejected_application_screen.dart'; import 'package:cheminova/screens/calendar_screen.dart'; import 'package:cheminova/screens/collect_kyc_screen.dart'; @@ -134,7 +135,7 @@ class _HomePageState extends State { context, MaterialPageRoute( builder: (context) => - const UpdateInventoryScreen(), + const UpdateInventoryTaskScreen(), )); }), ), diff --git a/lib/screens/select_taskkyc_screen.dart b/lib/screens/select_taskkyc_screen.dart index f2eff74..01793bd 100644 --- a/lib/screens/select_taskkyc_screen.dart +++ b/lib/screens/select_taskkyc_screen.dart @@ -5,6 +5,7 @@ import 'package:cheminova/screens/collect_kyc_screen.dart'; import 'package:cheminova/widgets/common_app_bar.dart'; import 'package:cheminova/widgets/common_drawer.dart'; import 'package:cheminova/widgets/common_background.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class SelectTaskkycScreen extends StatefulWidget { @@ -15,8 +16,9 @@ class SelectTaskkycScreen extends StatefulWidget { } class SelectTaskkycScreenState extends State { -late SelectTaskProvider _selectTaskProvider; -@override + late SelectTaskProvider _selectTaskProvider; + + @override void initState() { _selectTaskProvider = SelectTaskProvider(); super.initState(); @@ -24,85 +26,95 @@ late SelectTaskProvider _selectTaskProvider; @override Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => _selectTaskProvider, - child: CommonBackground( - child: Scaffold( - backgroundColor: Colors.transparent, - appBar: CommonAppBar(title:const Text('Select Task'), + create: (context) => _selectTaskProvider, + child: CommonBackground( + child: Scaffold( backgroundColor: Colors.transparent, - elevation: 0, - actions: [IconButton( - onPressed: () => Navigator.pop(context), - icon: Image.asset('assets/Back_attendance.png'), - padding: const EdgeInsets.only(right: 20), + appBar: CommonAppBar( + title: const Text('Select Task'), + backgroundColor: Colors.transparent, + elevation: 0, + actions: [ + IconButton( + onPressed: () => Navigator.pop(context), + icon: Image.asset('assets/Back_attendance.png'), + padding: const EdgeInsets.only(right: 20), + ), + ]), + drawer: const CommonDrawer(), + body: Consumer( + builder: (context, value, child) => + value.isLoading + ? const Center(child: CircularProgressIndicator()) + : _buildTaskList(), + ), ), - ]), - drawer: const CommonDrawer(), - body: Consumer( - builder: (context, value, child) => value.isLoading - ? const Center(child: CircularProgressIndicator()) - : _buildTaskList(), - ), - ), - )); + )); } Widget _buildTaskList() { - return Consumer( - builder: (context, value, child) { - if (value.tasksList.isEmpty) { - return const Center(child: Text('No tasks available')); - } - return ListView.builder( - itemCount: value.tasksList.length, - itemBuilder: (context, index) => - _buildTaskCard(value.tasksList[index]), - ); - }); + return Consumer(builder: (context, value, child) { + if (value.tasksList.isEmpty) { + return const Center(child: Text('No tasks available')); + } + return ListView.builder( + itemCount: value.tasksList.length, + itemBuilder: (context, index) => _buildTaskCard(value.tasksList[index]), + ); + }); } + Widget _buildTaskCard(Tasks task) { + return InkWell( + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + CollectKycScreen(id: task.taskId ?? ''))), + child: Card( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + leading: const Icon(Icons.task, color: Colors.blueAccent), + title: Text( + task.task ?? '', + style: const TextStyle( + color: Colors.black87, + fontWeight: FontWeight.w700, + fontSize: 16, + fontFamily: 'Anek', + ), + ), + trailing: + const Icon(Icons.arrow_forward_ios, color: Colors.black87), -Widget _buildTaskCard(Tasks task) { - return Card( - margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - color: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ListTile( - leading: const Icon(Icons.task, color: Colors.blueAccent), - title: Text( - task.task??'', - style: const TextStyle( - color: Colors.black87, - fontWeight: FontWeight.w700, - fontSize: 16, - fontFamily: 'Anek', + + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Note: ${task.note}'), + if (task.taskDueDate != null) + Text( + 'Date: ${task.taskDueDate == null ? '' : DateFormat( + 'dd/MM/yyyy').format( + DateTime.parse(task.taskDueDate ?? ''))}'), + Text('Priority: ${task.taskPriority}') + ], ), ), - trailing: - const Icon(Icons.arrow_forward_ios, color: Colors.black87), - onTap: () => Navigator.push(context, - MaterialPageRoute(builder: (context) => CollectKycScreen(id:task.taskId??''))), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Note: ${task.note}'), - Text('Date: ${task.taskDueDate}'), - Text('Priority: ${task.taskPriority}'), - ], - ), - ), - ], + ], + ), ), ); -} + } } class TaskItem { diff --git a/lib/services/api_urls.dart b/lib/services/api_urls.dart index aa28d97..1da2740 100644 --- a/lib/services/api_urls.dart +++ b/lib/services/api_urls.dart @@ -17,4 +17,6 @@ class ApiUrls { static const String getPdRdUrl = '${baseUrl}inventory/distributors-SC/'; static const String submitProductUrl = '${baseUrl}inventory/add-SC'; static const String selectTaskUrl = '${baseUrl}task/tasks'; + static const String dailyTaskUrl = '${baseUrl}task/tasks/'; + static const String kycSelectTaskUrl = '${baseUrl}task/task/type/Collect KYC'; }