marco.pms.mobile/lib/view/apps/calendar_screen.dart
2025-04-02 19:11:36 +05:30

222 lines
7.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:maxdash/controller/apps/calendar_controller.dart';
import 'package:maxdash/helpers/theme/app_theme.dart';
import 'package:maxdash/helpers/utils/mixins/ui_mixin.dart';
import 'package:maxdash/helpers/utils/my_shadow.dart';
import 'package:maxdash/helpers/widgets/my_breadcrumb.dart';
import 'package:maxdash/helpers/widgets/my_breadcrumb_item.dart';
import 'package:maxdash/helpers/widgets/my_card.dart';
import 'package:maxdash/helpers/widgets/my_container.dart';
import 'package:maxdash/helpers/widgets/my_spacing.dart';
import 'package:maxdash/helpers/widgets/my_text.dart';
import 'package:maxdash/helpers/widgets/my_text_style.dart';
import 'package:maxdash/view/layouts/layout.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart' as sf_calendar;
class CalendarScreen extends StatefulWidget {
const CalendarScreen({super.key});
@override
State<CalendarScreen> createState() => _CalendarScreenState();
}
class _CalendarScreenState extends State<CalendarScreen> with UIMixin {
final CalendarController _controller = Get.put(CalendarController());
@override
Widget build(BuildContext context) {
return Layout(
child: GetBuilder(
init: _controller,
tag: 'calendar_controller',
builder: (controller) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: MySpacing.x(flexSpacing),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
MyText.titleMedium(
"Calendar",
fontSize: 18,
fontWeight: 600,
),
MyBreadcrumb(
children: [
MyBreadcrumbItem(name: 'App'),
MyBreadcrumbItem(name: 'Calendar'),
],
),
],
),
),
MySpacing.height(flexSpacing),
Padding(
padding: MySpacing.x(flexSpacing),
child: MyCard.bordered(
borderRadiusAll: 4,
border: Border.all(color: Colors.grey.withValues(alpha:.2)),
shadow: MyShadow(elevation: 1, position: MyShadowPosition.bottom),
paddingAll: 24,
height: 700,
child: sf_calendar.SfCalendar(
view: sf_calendar.CalendarView.week,
allowedViews: _controller.allowedViews,
dataSource: _controller.events,
allowDragAndDrop: true,
allowAppointmentResize: true,
onDragEnd: _controller.dragEnd,
monthViewSettings:
sf_calendar.MonthViewSettings(showAgenda: true, appointmentDisplayMode: sf_calendar.MonthAppointmentDisplayMode.appointment),
controller: sf_calendar.CalendarController(),
allowViewNavigation: true,
showTodayButton: true,
showCurrentTimeIndicator: true,
showNavigationArrow: true,
onSelectionChanged: (calendarSelectionDetails) {
_controller.onSelectDate(calendarSelectionDetails);
addDataModal(context);
},
),
),
)
],
);
},
),
);
}
Future<void> addDataModal(BuildContext context) {
return showDialog<void>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
clipBehavior: Clip.antiAliasWithSaveLayer,
title: Text('Add Event'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
title(),
MySpacing.height(24),
location(),
MySpacing.height(24),
description(),
MySpacing.height(24),
colorSelect(),
],
),
actions: <Widget>[
TextButton(
style: TextButton.styleFrom(textStyle: Theme.of(context).textTheme.labelLarge),
child: Text('Cancel'),
onPressed: () => Navigator.of(context).pop(),
),
TextButton(
style: TextButton.styleFrom(textStyle: Theme.of(context).textTheme.labelLarge),
child: Text('Add'),
onPressed: () {
Navigator.of(context).pop();
_controller.addEvent();
},
),
],
);
},
);
}
Widget colorSelect() {
List<DropdownMenuItem<Color>> itemColor = [];
for (Color color in _controller.colorCollection) {
itemColor.add(DropdownMenuItem(
value: color,
child: Row(
children: [
MyContainer(color: color, height: 20, width: 50, clipBehavior: Clip.antiAliasWithSaveLayer),
MySpacing.width(12),
MyText.bodyMedium(colorToString(color), fontWeight: 600),
],
)));
}
return DropdownButtonFormField<Color>(
dropdownColor: contentTheme.background,
value: _controller.selectedColor,
items: itemColor,
onChanged: (Color? value) => _controller.onSelectedColor(value),
decoration: InputDecoration(
border: outlineInputBorder,
enabledBorder: outlineInputBorder,
disabledBorder: outlineInputBorder,
focusedBorder: outlineInputBorder,
filled: true,
contentPadding: MySpacing.all(12),
hintText: "Select Color",
hintStyle: MyTextStyle.bodyMedium(fontWeight: 600),
));
}
String colorToString(Color color) {
if (color == Colors.red) return 'Red';
if (color == Colors.blue) return 'Blue';
if (color == Colors.green) return 'Green';
if (color == Colors.yellow) return 'Yellow';
if (color == Colors.pink) return 'Pink';
if (color == Colors.purple) return 'Purple';
if (color == Colors.brown) return 'Brown';
if (color == Colors.orange) return 'Orange';
if (color == Colors.teal) return 'Teal';
if (color == Colors.indigo) return 'Indigo';
return '';
}
Widget description() {
return TextFormField(
controller: _controller.descriptionTE,
decoration: InputDecoration(
border: outlineInputBorder,
enabledBorder: outlineInputBorder,
disabledBorder: outlineInputBorder,
focusedBorder: outlineInputBorder,
filled: true,
hintText: "Add Description",
hintStyle: MyTextStyle.bodyMedium(fontWeight: 600),
),
);
}
Widget location() {
return TextFormField(
controller: _controller.locationTE,
decoration: InputDecoration(
border: outlineInputBorder,
enabledBorder: outlineInputBorder,
disabledBorder: outlineInputBorder,
focusedBorder: outlineInputBorder,
filled: true,
hintText: "Add Location",
hintStyle: MyTextStyle.bodyMedium(fontWeight: 600),
),
);
}
Widget title() {
return TextFormField(
controller: _controller.titleTE,
decoration: InputDecoration(
border: outlineInputBorder,
enabledBorder: outlineInputBorder,
disabledBorder: outlineInputBorder,
focusedBorder: outlineInputBorder,
filled: true,
hintText: "Add Title",
hintStyle: MyTextStyle.bodyMedium(fontWeight: 600),
),
);
}
}