diff --git a/lib/api.dart b/lib/api.dart index 4d18cc77..59c06943 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -1,12 +1,12 @@ //Server and local links String klocalLink = "127.0.0.1:8000"; -String kserverLink = "172.27.39.179:8000"; +String kserverLink = "172.27.113.117:8000"; // String kserverLink = "172.27.16.214:8000"; //Login Service -// String kAuthUrl = "172.27.16.214:8000"; -String kAuthUrl = "172.27.39.179:8000"; +String kAuthUrl = "172.27.113.117:8000"; String kAuthLogin = "/api/auth/login/"; +// String kAuthUrl = "172.27.16.214:8000"; // String kAuthLogin = "/accounts/login"; //Profile Service @@ -16,9 +16,9 @@ String kProfile = "/api/profile/"; String kAcademicProcedures = "/academic-procedures/api/stu/"; //Department details +String kFacView = "/dep/api/fac-view/"; String kDepartmentAnnouncements = "/dep/api/announcements/"; // String kDepMainAnnouncements = "/dep/api/dep-main/"; -// String kFacView = "/dep/api/fac-view/"; //Complaint String kComplaintService = "/complaint/api/studentcomplain"; diff --git a/lib/screens/Department/Announcements/browse_announcement.dart b/lib/screens/Department/Announcements/browse_announcement.dart index 9ddd3840..6eab9a49 100644 --- a/lib/screens/Department/Announcements/browse_announcement.dart +++ b/lib/screens/Department/Announcements/browse_announcement.dart @@ -34,20 +34,64 @@ class _BrowseAnnouncementScreenState extends State { } void _loadAnnouncements() async { + String? userRole = data?.profile?['user_type']; + print(userRole); try { - http.Response jsonResponse = await _departmentService.getAnnouncements(); - - print('API Response Status Code: ${jsonResponse.statusCode}'); - print('API Response Body: ${jsonResponse.body}'); + if (userRole == 'student') { + try { + http.Response jsonResponse = + await _departmentService.getAnnouncements(); + List jsonData = json.decode(jsonResponse.body); + List announcements = jsonData.map((item) { + return Announcement.fromJson(item); + }).toList(); - List jsonData = json.decode(jsonResponse.body); + _announcementsController.add(announcements.toList()); + } catch (error) { + print('Error loading announcements: $error'); + } + } else if (userRole == 'faculty') { + try { + http.Response jsonResponse = + await _departmentService.getFacViewAnnouncements(); + Map jsonData = json.decode(jsonResponse.body); + List announcementsData = jsonData['announcements'] ?? []; + List announcements = []; + for (var list in announcementsData) { + if (list is List) { + for (var item in list) { + if (item is Map) { + announcements.add(Announcement.fromJson(item)); + } + } + } + } + print('Announcements: $announcements'); - List announcements = jsonData.map((item) { - return Announcement.fromJson(item); - }).toList(); - print('Announcements: $announcements'); + _announcementsController.add(announcements.toList()); + } catch (error) { + print('Error loading announcements: $error'); + } + } else if (userRole == 'admin') { + try { + http.Response jsonResponse = + await _departmentService.getAnnouncements(); + print('API Response Status Code: ${jsonResponse.statusCode}'); + print('API Response Body: ${jsonResponse.body}'); + List jsonData = json.decode(jsonResponse.body); + List announcements = jsonData.map((item) { + return Announcement.fromJson(item); + }).toList(); + print('Announcements: $announcements'); - _announcementsController.add(announcements.toList()); + _announcementsController.add(announcements.toList()); + } catch (error) { + print('Error loading announcements: $error'); + } + } else { + // Handle other cases or unknown roles + return; + } } catch (error) { print('Error loading announcements: $error'); } @@ -76,7 +120,7 @@ class _BrowseAnnouncementScreenState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - if (userRole != null && userRole != 'student') + if (userRole == 'faculty' || userRole != 'student') ElevatedButton( onPressed: () { Navigator.push( @@ -164,15 +208,13 @@ class _BrowseAnnouncementScreenState extends State { .map( (announcement) => DataRow( cells: [ - DataCell( - Text(announcement.ann_date)), - DataCell( - Text(announcement.maker_id)), - DataCell( - Text(announcement.programme)), + DataCell(Text(announcement.ann_date)), + DataCell(Text(announcement.maker_id)), + DataCell(Text(announcement.programme)), DataCell(Text(announcement.batch)), DataCell(Text(announcement.message)), - DataCell(Text(announcement.upload_announncement ?? '')), + DataCell(Text( + announcement.upload_announcement ?? '')), ], ), ) diff --git a/lib/screens/Department/Announcements/make_announcement.dart b/lib/screens/Department/Announcements/make_announcement.dart index ee4ef68c..88877e2d 100644 --- a/lib/screens/Department/Announcements/make_announcement.dart +++ b/lib/screens/Department/Announcements/make_announcement.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:fusion/Components/appBar.dart'; import 'package:fusion/Components/side_drawer.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:fusion/services/department_service.dart'; class MakeAnnouncementScreen extends StatefulWidget { @override @@ -10,31 +11,37 @@ class MakeAnnouncementScreen extends StatefulWidget { class _MakeAnnouncementScreenState extends State { List> announcements = []; - - // Add a GlobalKey to manage the form state final _formKey = GlobalKey(); - - // Define data for dropdowns with placeholder items - List programmeTypes = [null, 'B.Tech', 'M.Tech', 'Ph.D']; + List programmeTypes = [null, 'All', 'B.Tech', 'M.Tech', 'Ph.D']; + List departmentTypes = [null, 'All', 'CSE', 'ECE', 'ME', 'SM']; List batches = [ null, + 'All', 'First Year', 'Second Year', 'Third Year', 'Fourth Year' ]; - List departmentTypes = [null, 'CSE', 'ECE', 'ME', 'SM']; - // Selected values for dropdowns String? selectedProgrammeType; String? selectedBatch; String? selectedDepartmentType; - - // Warning messages for required fields String? programmeWarning; String? departmentWarning; - String selectedFilePath = 'No file chosen'; + TextEditingController announcementDetailsController = TextEditingController(); + + @override + void initState() { + super.initState(); + announcementDetailsController = TextEditingController(); + } + + @override + void dispose() { + announcementDetailsController.dispose(); + super.dispose(); + } @override Widget build(BuildContext context) { @@ -71,12 +78,6 @@ class _MakeAnnouncementScreenState extends State { programmeWarning = null; departmentWarning = null; }); - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => MakeAnnouncementScreen(), - // ), - // ); }, child: Text( 'Make Announcement', @@ -87,8 +88,6 @@ class _MakeAnnouncementScreenState extends State { ), ), ), - - // Form Container( margin: EdgeInsets.all(20.0), padding: EdgeInsets.all(20.0), @@ -159,8 +158,7 @@ class _MakeAnnouncementScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - margin: EdgeInsets.only( - left: 8), // Adjust the left margin as needed + margin: EdgeInsets.only(left: 8), child: Text( 'Attach Files(pdf, jpeg, jpg, png):', style: TextStyle(fontSize: 16), @@ -172,7 +170,6 @@ class _MakeAnnouncementScreenState extends State { children: [ ElevatedButton( onPressed: () { - // Open custom file picker dialog _showFilePickerDialog(context); }, child: Text('Choose File'), @@ -187,26 +184,8 @@ class _MakeAnnouncementScreenState extends State { SizedBox(height: 16), ElevatedButton( onPressed: () { - // Validate the form before submission if (_formKey.currentState!.validate()) { - // Form is valid, handle submission - if (selectedProgrammeType == null) { - setState(() { - programmeWarning = 'This field is required'; - }); - } - if (selectedDepartmentType == null) { - setState(() { - departmentWarning = 'This field is required'; - }); - } - if (selectedProgrammeType != null && - selectedDepartmentType != null) { - print('Programme Type: $selectedProgrammeType'); - print('Batch: $selectedBatch'); - print('Department Type: $selectedDepartmentType'); - print('Selected File: $selectedFilePath'); - } + submitForm(); } }, child: Text('Publish'), @@ -222,7 +201,6 @@ class _MakeAnnouncementScreenState extends State { ); } - // Custom file picker dialog Future _showFilePickerDialog(BuildContext context) async { try { FilePickerResult? result = @@ -240,6 +218,33 @@ class _MakeAnnouncementScreenState extends State { } } + Future submitForm() async { + if (selectedProgrammeType == null) { + setState(() { + programmeWarning = 'This field is required'; + }); + return; + } + if (selectedDepartmentType == null) { + setState(() { + departmentWarning = 'This field is required'; + }); + return; + } + + Map announcementData = { + 'maker_id': 'your_maker_id_value_here', + 'programme': selectedProgrammeType!, + 'batch': selectedBatch ?? '', + 'department': selectedDepartmentType!, + 'message': announcementDetailsController.text, + 'upload_announncement': selectedFilePath, + }; + await DepartmentService().createAnnouncement(announcementData).then((_) => + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Announcement created successfully !")))); + } + Widget buildDropdown(String label, List items, String? selectedValue, String placeholder, Function(String?) onChanged) { return Column( @@ -262,8 +267,7 @@ class _MakeAnnouncementScreenState extends State { decoration: InputDecoration( border: OutlineInputBorder(), contentPadding: EdgeInsets.symmetric(horizontal: 10, vertical: 3), - fillColor: Color.fromARGB( - 255, 245, 242, 242), // Background color for dropdown + fillColor: Color.fromARGB(255, 245, 242, 242), filled: true, ), child: DropdownButtonHideUnderline( diff --git a/lib/services/department_service.dart b/lib/services/department_service.dart index 2d83791b..98331e0d 100644 --- a/lib/services/department_service.dart +++ b/lib/services/department_service.dart @@ -1,4 +1,6 @@ // import 'dart:convert'; +import 'dart:convert'; + import 'package:fusion/api.dart'; import 'package:fusion/constants.dart'; import 'package:http/http.dart' as http; @@ -12,7 +14,7 @@ class Announcement { final String batch; final String department; final String message; - final String? upload_announncement; + final String? upload_announcement; Announcement({ required this.ann_date, @@ -21,7 +23,7 @@ class Announcement { required this.batch, required this.department, required this.message, - this.upload_announncement, + this.upload_announcement, }); factory Announcement.fromJson(Map json) { @@ -32,7 +34,7 @@ class Announcement { batch: json['batch'], department: json['department'], message: json['message'], - upload_announncement: json['upload_announncement'], + upload_announcement: json['upload_announcement'], ); } } @@ -47,14 +49,11 @@ class DepartmentService { Map headers = { 'Authorization': 'Token ' + (storage_service.userInDB?.token ?? "") }; - - var client = http.Client(); - http.Response response = await client.get( + print(headers); + http.Response response = await http.get( Uri.http(getLink(), kDepartmentAnnouncements), headers: headers, ); - // print('Response Status Code: ${response.statusCode}'); - // print('Response Body: ${response.body}'); if (response.statusCode == 200) { return response; @@ -66,4 +65,56 @@ class DepartmentService { rethrow; } } + + Future getFacViewAnnouncements() async { + try { + var storage_service = locator(); + if (storage_service.userInDB?.token == null) + throw Exception('Token Error'); + + Map headers = { + 'Authorization': 'Token ' + (storage_service.userInDB?.token ?? "") + }; + + http.Response response = await http.get( + Uri.http(getLink(), kFacView), + headers: headers, + ); + + if (response.statusCode == 200) { + return response; + } else { + throw Exception('Failed to load announcements'); + } + } catch (e) { + print('Error in getAnnouncements: $e'); + rethrow; + } + } + + Future createAnnouncement(Map announcementData) async { + try { + var storageService = locator(); + if (storageService.userInDB?.token == null) + throw Exception('Token Error'); + + Map headers = { + 'Authorization': 'Token ' + (storageService.userInDB?.token ?? ""), + 'Content-Type': 'application/json', + }; + + http.Response response = await http.post( + Uri.http(getLink(), kDepartmentAnnouncements), + headers: headers, + body: jsonEncode(announcementData)); + + if (response.statusCode == 200) { + print('Announcement created successfully'); + } else { + print('Failed to create announcement. Error: ${response.statusCode}'); + } + } catch (e) { + print('Exception occurred while creating announcement: $e'); + } + } }