diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 494a18af..0d6b0c95 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -14,6 +14,7 @@
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true"
android:enableOnBackInvokedCallback="true">
+
selectedDepartmentData;
return MediaQuery(
data: windowData,
child: MaterialApp(
@@ -73,10 +79,10 @@ class MyApp extends StatelessWidget {
title: 'Fusion',
debugShowCheckedModeBanner: false,
theme: ThemeData(
- // primarySwatch: Colors.blueGrey,
+ // primarySwatch: Colors.blueGrey,
// colorSchemeSeed: Color(0xFF2085D0),
colorSchemeSeed: Color(0xFFF36C35),
- fontFamily: 'Nunito',
+ fontFamily: 'Nunito',
useMaterial3: true,
),
initialRoute: '/landing',
@@ -108,6 +114,10 @@ class MyApp extends StatelessWidget {
'/programme_curriculum_home/courses_info': (context) => CoursesInfo(),
'/department_home_page': (context) => DepartmentScreen(
ModalRoute.of(context)!.settings.arguments.toString()),
+ '/student_details': (context) => StudentDetails(),
+ '/alumni_details': (context) => AlumniDetails(),
+ '/browse_announcement': (context) => BrowseAnnouncement(),
+ '/make_announcement': (context) => MakeAnnouncement(),
'/establishment': (context) => Establishment(),
'/gymkhana_homepage': (context) => GymkhanaHomepage(),
'/gymkhana_homepage/apply': (context) => Apply(),
diff --git a/lib/screens/Department/Alumni_details/alumni_details.dart b/lib/screens/Department/Alumni_details/alumni_details.dart
index 95b9e8af..949e2816 100644
--- a/lib/screens/Department/Alumni_details/alumni_details.dart
+++ b/lib/screens/Department/Alumni_details/alumni_details.dart
@@ -1,13 +1,14 @@
import 'package:flutter/material.dart';
import 'package:fusion/Components/appBar.dart';
import 'package:fusion/Components/side_drawer.dart';
+import 'package:fusion/constants.dart';
-class AlumniDetailsScreen extends StatefulWidget {
+class AlumniDetails extends StatefulWidget {
@override
_AlumniDetailsState createState() => _AlumniDetailsState();
}
-class _AlumniDetailsState extends State
+class _AlumniDetailsState extends State
with SingleTickerProviderStateMixin {
late TabController _tabController;
List departmentOptions = [
@@ -54,14 +55,12 @@ class _AlumniDetailsState extends State
_tabController =
TabController(length: departmentOptions.length, vsync: this);
_tabController.addListener(_handleTabSelection);
- _tabController.index = 0; // Initialize the index
- // fetchAlumnniDetails();
+ _tabController.index = 0;
}
void _handleTabSelection() {
setState(() {
selectedDepartment = departmentOptions[_tabController.index];
- // fetchAlumniDetails();
});
}
@@ -81,14 +80,14 @@ class _AlumniDetailsState extends State
children: [
// SizedBox(height: 16),
Container(
- color: Colors.deepOrangeAccent, // Set background color here
+ color: kPrimaryColor,
child: TabBar(
controller: _tabController,
isScrollable: true,
indicatorColor: Colors.black,
labelColor: Colors.black,
unselectedLabelColor:
- Colors.white, // Set unselected font color here
+ Colors.white,
tabs: departmentOptions
.map((department) => Tab(
text: department,
@@ -109,32 +108,48 @@ class _AlumniDetailsState extends State
borderRadius: BorderRadius.circular(10.0),
),
child: DataTable(
- headingRowColor: MaterialStateColor.resolveWith(
- (states) => Colors.black),
columns: [
DataColumn(
label: Text('ID',
- style: TextStyle(color: Colors.white)),
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black)),
),
DataColumn(
label: Text('Alumni Name',
- style: TextStyle(color: Colors.white)),
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black)),
),
DataColumn(
label: Text('Sex',
- style: TextStyle(color: Colors.white)),
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black)),
),
DataColumn(
label: Text('Date of Birth',
- style: TextStyle(color: Colors.white)),
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black)),
),
DataColumn(
label: Text('Address',
- style: TextStyle(color: Colors.white)),
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black)),
),
DataColumn(
label: Text('Phone Number',
- style: TextStyle(color: Colors.white)),
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black)),
),
],
rows: alumniDetails
diff --git a/lib/screens/Department/Announcements/browse_announcement.dart b/lib/screens/Department/Announcements/browse_announcement.dart
index 6eab9a49..6c4e15b9 100644
--- a/lib/screens/Department/Announcements/browse_announcement.dart
+++ b/lib/screens/Department/Announcements/browse_announcement.dart
@@ -1,105 +1,124 @@
import 'dart:async';
-import 'dart:convert';
-import 'package:http/http.dart' as http;
+import 'package:fusion/constants.dart';
+import 'package:intl/intl.dart';
import 'package:flutter/material.dart';
import 'package:fusion/Components/appBar.dart';
import 'package:fusion/Components/side_drawer.dart';
import 'package:fusion/models/profile.dart';
import 'package:fusion/services/service_locator.dart';
import 'package:fusion/services/storage_service.dart';
-import 'package:fusion/screens/Department/Announcements/make_announcement.dart';
import 'package:fusion/services/department_service.dart';
+import 'package:fusion/screens/Department/Announcements/make_announcement.dart';
+import 'package:webview_flutter/webview_flutter.dart';
-class BrowseAnnouncementScreen extends StatefulWidget {
+class BrowseAnnouncement extends StatefulWidget {
@override
- _BrowseAnnouncementScreenState createState() =>
- _BrowseAnnouncementScreenState();
+ _BrowseAnnouncementState createState() => _BrowseAnnouncementState();
+}
+
+enum AnnouncementSortingCriteria { date, announcementBy }
+
+class WebViewer extends StatefulWidget {
+ final String url;
+ const WebViewer({Key? key, required this.url}) : super(key: key);
+ @override
+ _WebViewerState createState() => _WebViewerState();
+}
+
+class _WebViewerState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text('Web Viewer'),
+ ),
+ body: WebView(
+ initialUrl: widget.url,
+ javascriptMode: JavascriptMode.unrestricted,
+ ),
+ );
+ }
}
+// String _getUsername(String makerId) {
+// var profile = data!.profile;
+// if (profile != null && profile['id'] == makerId) {
+// var user = data!.user;
+// if (user != null) {
+// return user['username'] ?? '';
+// }
+// }
+// return '';
+// }
-class _BrowseAnnouncementScreenState extends State {
+class _BrowseAnnouncementState extends State
+ with SingleTickerProviderStateMixin {
ProfileData? data;
- final DepartmentService _departmentService = DepartmentService();
+ late TabController _tabController;
+ List departmentOptions = ['All', 'CSE', 'ECE', 'ME', 'SM'];
final StreamController> _announcementsController =
StreamController>();
-
- Stream> get announcementsStream =>
- _announcementsController.stream;
+ AnnouncementSortingCriteria? _sortingCriteria;
+ bool _isAscending = true;
@override
void initState() {
super.initState();
+ _tabController = TabController(
+ length: departmentOptions.length,
+ vsync: this,
+ );
+ _tabController.addListener(_handleTabSelection);
+ _tabController.index = 0; // Initialize the index
var service = locator();
data = service.profileData;
_loadAnnouncements();
}
+ void _handleTabSelection() {
+ setState(() {
+ _loadAnnouncements();
+ });
+ }
+
void _loadAnnouncements() async {
- String? userRole = data?.profile?['user_type'];
- print(userRole);
- try {
- 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();
+ int selectedIndex = _tabController.index;
+ String department = departmentOptions[selectedIndex];
+ List announcements =
+ await DepartmentService().getDepartmentsAnnouncements(department);
+ _sortAnnouncements(announcements);
+ }
- _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');
+ void _sortAnnouncements(List announcements) {
+ if (_sortingCriteria == AnnouncementSortingCriteria.date) {
+ announcements.sort((a, b) =>
+ DateTime.parse(a.ann_date).compareTo(DateTime.parse(b.ann_date)));
+ } else if (_sortingCriteria == AnnouncementSortingCriteria.announcementBy) {
+ announcements.sort((a, b) => a.maker_id.compareTo(b.maker_id));
+ }
+ if (!_isAscending) {
+ announcements = announcements.reversed.toList();
+ }
+ _announcementsController.add(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');
+ void _toggleSortOrder() {
+ setState(() {
+ _isAscending = !_isAscending;
+ });
+ _loadAnnouncements();
+ }
- _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');
- }
+ void _setSortingCriteria(AnnouncementSortingCriteria? criteria) {
+ setState(() {
+ _sortingCriteria = criteria;
+ });
+ _loadAnnouncements();
}
@override
void dispose() {
_announcementsController.close();
+ _tabController.dispose();
super.dispose();
}
@@ -112,122 +131,223 @@ class _BrowseAnnouncementScreenState extends State {
body: Column(
children: [
Container(
- margin: EdgeInsets.all(5.0),
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(1.0),
+ color: kPrimaryColor,
+ child: TabBar(
+ controller: _tabController,
+ isScrollable: true,
+ indicatorColor: Colors.black,
+ labelColor: Colors.black,
+ unselectedLabelColor: Colors.white,
+ tabs: departmentOptions
+ .map((department) => Tab(
+ text: department,
+ ))
+ .toList(),
),
- child: Center(
- child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- if (userRole == 'faculty' || userRole != 'student')
- ElevatedButton(
- onPressed: () {
- Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) => MakeAnnouncementScreen(),
- ),
- );
- },
- child: Icon(Icons.add, size: 20), // Set font size here
- ),
- SizedBox(width: 8),
- ElevatedButton(
- onPressed: () {
- // Navigator.push(
- // context,
- // MaterialPageRoute(
- // builder: (context) => BrowseAnnouncementScreen(),
- // ),
- // );
- },
- child: Text(
- 'Announcements',
- style: TextStyle(fontSize: 18), // Set font size here
- ),
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ if (userRole == 'faculty')
+ ElevatedButton(
+ onPressed: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => MakeAnnouncement(),
+ ),
+ );
+ },
+ child: Icon(Icons.add, size: 20),
+ ),
+ SizedBox(width: 8),
+ ElevatedButton(
+ onPressed: () {
+ _loadAnnouncements();
+ },
+ child: Text(
+ 'Announcements',
+ style: TextStyle(fontSize: 18), // Set font size here
+ ),
+ ),
+ ],
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 30.0),
+ child: DropdownButton(
+ hint: Text('Sort by'),
+ value: _sortingCriteria,
+ onChanged: _setSortingCriteria,
+ items: [
+ DropdownMenuItem(
+ child: Text('Sort by Date'),
+ value: AnnouncementSortingCriteria.date,
+ ),
+ DropdownMenuItem(
+ child: Text('Sort by Announcement By'),
+ value: AnnouncementSortingCriteria.announcementBy,
+ ),
+ ],
),
- ],
+ ),
),
- ),
+ IconButton(
+ icon: Icon(
+ _isAscending ? Icons.arrow_upward : Icons.arrow_downward),
+ onPressed: _toggleSortOrder,
+ ),
+ ],
),
Expanded(
- child: StreamBuilder>(
- stream: announcementsStream,
- builder: (context, snapshot) {
- if (snapshot.hasData) {
- return SingleChildScrollView(
+ child: Container(
+ child: SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.all(0),
+ child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
- child: Container(
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(10.0),
- ),
- child: DataTable(
- headingRowColor: MaterialStateColor.resolveWith(
- (states) => Color.fromARGB(255, 84, 83, 83),
- ), // Black background for column names
- columns: [
- DataColumn(
- label: Text(
- 'Announcement Date',
- style: TextStyle(color: Colors.white),
- ),
- ),
- DataColumn(
- label: Text(
- 'Announcement By',
- style: TextStyle(color: Colors.white),
- ),
- ),
- DataColumn(
- label: Text(
- 'Programme',
- style: TextStyle(color: Colors.white),
- ),
- ),
- DataColumn(
- label: Text(
- 'Batch',
- style: TextStyle(color: Colors.white),
- ),
- ),
- DataColumn(
- label: Text(
- 'Message',
- style: TextStyle(color: Colors.white),
- ),
- ),
- DataColumn(
- label: Text(
- 'File',
- style: TextStyle(color: Colors.white),
- ),
- ),
- ],
- rows: snapshot.data!
- .map(
- (announcement) => DataRow(
- cells: [
- 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_announcement ?? '')),
+ child: StreamBuilder>(
+ stream: _announcementsController.stream,
+ builder: (context, snapshot) {
+ if (snapshot.hasData) {
+ return SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ child: Container(
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ child: DataTable(
+ columns: [
+ DataColumn(
+ label: Text(
+ 'Announcement Date',
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black),
+ ),
+ ),
+ DataColumn(
+ label: Text(
+ 'Announcement By',
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black),
+ ),
+ ),
+ DataColumn(
+ label: Text(
+ 'Programme',
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black),
+ ),
+ ),
+ DataColumn(
+ label: Text(
+ 'Batch',
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black),
+ ),
+ ),
+ DataColumn(
+ label: Text(
+ 'Message',
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black),
+ ),
+ ),
+ DataColumn(
+ label: Text(
+ 'File',
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.bold,
+ color: Colors.black),
+ ),
+ ),
],
+ rows: snapshot.data!
+ .map(
+ (announcement) => DataRow(
+ cells: [
+ DataCell(Text(
+ DateFormat('MMM. dd, yyyy')
+ .format(DateTime.parse(
+ announcement.ann_date)))),
+ DataCell(Text(announcement.maker_id)),
+ // DataCell(Text(_getUsername(announcement
+ // .maker_id))), // Updated line
+ DataCell(
+ Text(announcement.programme)),
+ DataCell(Text(announcement.batch)),
+ DataCell(Container(
+ width: 250,
+ child: Text(
+ announcement.message,
+ softWrap: true,
+ ),
+ )),
+ DataCell(
+ announcement.upload_announcement !=
+ null
+ ? TextButton(
+ onPressed: () {
+ String? fileUrl =
+ announcement
+ .upload_announcement;
+ if (fileUrl != null &&
+ fileUrl.isNotEmpty) {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder:
+ (context) =>
+ WebViewer(
+ url: fileUrl,
+ ),
+ ),
+ );
+ }
+ },
+ child: Text(
+ 'Open File',
+ style: TextStyle(
+ color: Colors.blue,
+ decoration:
+ TextDecoration
+ .underline,
+ ),
+ ),
+ )
+ : SizedBox(),
+ ),
+ ],
+ ),
+ )
+ .toList(),
),
- )
- .toList(),
- ),
+ ),
+ );
+ } else if (snapshot.hasError) {
+ return Text('Error: ${snapshot.error}');
+ } else {
+ return Center(child: CircularProgressIndicator());
+ }
+ },
),
- );
- } else if (snapshot.hasError) {
- return Text('Error: ${snapshot.error}');
- } else {
- return Center(child: CircularProgressIndicator());
- }
- },
+ ),
+ ),
+ ),
),
),
],
diff --git a/lib/screens/Department/Announcements/make_announcement.dart b/lib/screens/Department/Announcements/make_announcement.dart
index 88877e2d..abcd242d 100644
--- a/lib/screens/Department/Announcements/make_announcement.dart
+++ b/lib/screens/Department/Announcements/make_announcement.dart
@@ -1,40 +1,58 @@
+import 'dart:async';
+import 'dart:convert';
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';
+import 'package:fusion/models/profile.dart';
+import 'package:fusion/services/profile_service.dart';
+import 'package:fusion/services/service_locator.dart';
+import 'package:fusion/services/storage_service.dart';
+import 'package:http/http.dart';
-class MakeAnnouncementScreen extends StatefulWidget {
+class MakeAnnouncement extends StatefulWidget {
@override
- _MakeAnnouncementScreenState createState() => _MakeAnnouncementScreenState();
+ _MakeAnnouncementState createState() => _MakeAnnouncementState();
}
-class _MakeAnnouncementScreenState extends State {
+class _MakeAnnouncementState extends State {
+ late ProfileData? data;
+ late ProfileService profileService;
List