You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
6.8 KiB
207 lines
6.8 KiB
import 'package:flutter/material.dart';
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:supplier_new/common/settings.dart';
|
|
|
|
class DeliveryCalendarScreen extends StatefulWidget {
|
|
const DeliveryCalendarScreen({super.key});
|
|
|
|
@override
|
|
State<DeliveryCalendarScreen> createState() => _DeliveryCalendarScreenState();
|
|
}
|
|
|
|
class _DeliveryCalendarScreenState extends State<DeliveryCalendarScreen> {
|
|
DateTime _focusedMonth = DateTime(2025, 10);
|
|
late List<Map<String, dynamic>> _calendarData;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_calendarData = _generateCalendarData();
|
|
}
|
|
|
|
List<Map<String, dynamic>> _generateCalendarData() {
|
|
return [
|
|
{"day": 1, "status": "Delivered"},
|
|
{"day": 2, "status": "Delivered"},
|
|
{"day": 3, "status": "Rescheduled"},
|
|
{"day": 4, "status": "Delivered"},
|
|
{"day": 5, "status": "Delivered"},
|
|
{"day": 6, "status": "Delivered"},
|
|
{"day": 7, "status": "Cancelled"},
|
|
{"day": 8, "status": "Delivered"},
|
|
{"day": 9, "status": "Delivered"},
|
|
{"day": 10, "status": "Delivered"},
|
|
{"day": 11, "status": "Cancelled"},
|
|
{"day": 12, "status": "Delivery"},
|
|
{"day": 13, "status": "Delivery"},
|
|
{"day": 14, "status": "Delivery"},
|
|
{"day": 15, "status": "Delivery"},
|
|
{"day": 16, "status": "Delivery"},
|
|
{"day": 17, "status": "Delivery"},
|
|
{"day": 18, "status": "Delivery"},
|
|
{"day": 19, "status": "Delivery"},
|
|
{"day": 20, "status": "Delivery"},
|
|
{"day": 21, "status": "Delivery"},
|
|
{"day": 22, "status": "Delivery"},
|
|
{"day": 23, "status": "Delivery"},
|
|
{"day": 24, "status": "Delivery"},
|
|
{"day": 25, "status": "Delivery"},
|
|
{"day": 26, "status": "Delivery"},
|
|
];
|
|
}
|
|
|
|
Color _getBackgroundColor(String status) {
|
|
switch (status) {
|
|
case "Delivered":
|
|
return const Color(0xFFE6F4EA);
|
|
case "Cancelled":
|
|
return const Color(0xFFFDE8E8);
|
|
case "Rescheduled":
|
|
return const Color(0xFFF2F2F2);
|
|
case "Delivery":
|
|
return const Color(0xFFEFF4FF);
|
|
default:
|
|
return Colors.white;
|
|
}
|
|
}
|
|
|
|
Color _getTextColor(String status) {
|
|
switch (status) {
|
|
case "Delivered":
|
|
return Colors.green;
|
|
case "Cancelled":
|
|
return Colors.red;
|
|
case "Rescheduled":
|
|
return Colors.black54;
|
|
case "Delivery":
|
|
return const Color(0xFF3B6FE0);
|
|
default:
|
|
return Colors.black87;
|
|
}
|
|
}
|
|
|
|
Widget _getStatusIcon(String status) {
|
|
switch (status) {
|
|
case "Delivered":
|
|
return const Icon(Icons.check, size: 16, color: Colors.green);
|
|
case "Cancelled":
|
|
return const Icon(Icons.close, size: 16, color: Colors.red);
|
|
case "Rescheduled":
|
|
return const Icon(Icons.access_time, size: 16, color: Colors.black54);
|
|
case "Delivery":
|
|
return const Icon(Icons.local_shipping, size: 16, color: Color(0xFF3B6FE0));
|
|
default:
|
|
return const SizedBox.shrink();
|
|
}
|
|
}
|
|
|
|
String _getMonthYear() {
|
|
return DateFormat('MMM yyyy').format(_focusedMonth).toUpperCase();
|
|
}
|
|
|
|
int _daysInMonth(DateTime date) {
|
|
final firstDayThisMonth = DateTime(date.year, date.month, 1);
|
|
final firstDayNextMonth = DateTime(date.year, date.month + 1, 1);
|
|
return firstDayNextMonth.difference(firstDayThisMonth).inDays;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final int totalDays = _daysInMonth(_focusedMonth);
|
|
final int firstWeekday = DateTime(_focusedMonth.year, _focusedMonth.month, 1).weekday;
|
|
final int totalSlots = totalDays + (firstWeekday - 1);
|
|
|
|
return Scaffold(
|
|
backgroundColor: Colors.white,
|
|
appBar: AppBar(
|
|
backgroundColor: Colors.white,
|
|
elevation: 0,
|
|
leading: IconButton(
|
|
icon: const Icon(Icons.arrow_back_ios_new, color: Colors.black),
|
|
onPressed: () => Navigator.pop(context),
|
|
),
|
|
title: Text("Calendar", style: fontTextStyle(16, Colors.black, FontWeight.w600)),
|
|
actions: const [
|
|
Padding(
|
|
padding: EdgeInsets.symmetric(horizontal: 8),
|
|
child: Icon(Icons.calendar_month_outlined, color: Color(0xFF8270DB)),
|
|
),
|
|
Padding(
|
|
padding: EdgeInsets.symmetric(horizontal: 8),
|
|
child: Icon(Icons.notifications_none_rounded, color: Colors.black87),
|
|
),
|
|
],
|
|
),
|
|
body: Column(
|
|
children: [
|
|
const SizedBox(height: 8),
|
|
Text(_getMonthYear(), style: fontTextStyle(16, Colors.black, FontWeight.w600)),
|
|
const SizedBox(height: 8),
|
|
|
|
// Weekdays Row
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 4),
|
|
child: Row(
|
|
children: const [
|
|
Expanded(child: Center(child: Text("MON"))),
|
|
Expanded(child: Center(child: Text("TUE"))),
|
|
Expanded(child: Center(child: Text("WED"))),
|
|
Expanded(child: Center(child: Text("THU"))),
|
|
Expanded(child: Center(child: Text("FRI"))),
|
|
Expanded(child: Center(child: Text("SAT"))),
|
|
Expanded(child: Center(child: Text("SUN"))),
|
|
],
|
|
),
|
|
),
|
|
const SizedBox(height: 8),
|
|
|
|
// Calendar Grid
|
|
Expanded(
|
|
child: GridView.builder(
|
|
padding: const EdgeInsets.symmetric(horizontal: 4),
|
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
|
crossAxisCount: 7,
|
|
crossAxisSpacing: 4,
|
|
mainAxisSpacing: 4,
|
|
),
|
|
itemCount: totalSlots,
|
|
itemBuilder: (context, index) {
|
|
if (index < firstWeekday - 1) {
|
|
return const SizedBox.shrink();
|
|
}
|
|
final day = index - (firstWeekday - 2);
|
|
final status = _calendarData
|
|
.firstWhere(
|
|
(item) => item['day'] == day,
|
|
orElse: () => {"status": ""},
|
|
)['status']
|
|
.toString();
|
|
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: _getBackgroundColor(status),
|
|
borderRadius: BorderRadius.circular(8),
|
|
border: Border.all(color: Colors.grey.shade300),
|
|
),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
"$day",
|
|
style: fontTextStyle(13, _getTextColor(status), FontWeight.w600),
|
|
),
|
|
const SizedBox(height: 4),
|
|
_getStatusIcon(status),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|