Appearance
Overview
- File:
lib/views/event_form_page.dart
The EventFormPage is a Flutter widget that provides a comprehensive interface for creating and modifying events in the HVC Mobile application. It allows users to set event details, manage participants, and configure event timing options. The page supports both creation of new events and modification of existing ones.
Class Structure
Class Definition
dart
class EventFormPage extends StatefulWidget {
final HvcEvent? event;
const EventFormPage({Key? key, this.event}) : super(key: key);
@override
State<EventFormPage> createState() => _EventFormPageState();
}
class _EventFormPageState extends State<EventFormPage> {
final EventsController eventsController = Get.find();
final ContactsController contactsController = Get.find();
final _formKey = GlobalKey<FormState>();
RxString dropdownValue = ''.obs;
RxBool isNow = false.obs, isAllDay = false.obs;
DateTime? eventDate;
TimeOfDay? startTime, endTime;
final TextEditingController eventNoteCtrl = TextEditingController();
final TextEditingController eventTitleCtrl = TextEditingController();
final TextEditingController mRnNumberTitleCtrl = TextEditingController();
final TextEditingController eventDateCtrl = TextEditingController();
final TextEditingController startTimeCtrl = TextEditingController();
final TextEditingController endTimeCtrl = TextEditingController();
RxList<Contact> _contacts = <Contact>[].obs;
RxList<Participant> _participants = <Participant>[].obs;
final RealTimeController realTimeController = Get.find();
late UserData user;
var isEditing = false;
@override
void initState() {
// Implementation...
}
@override
Widget build(BuildContext context) {
// Implementation...
}
}Dependencies
Required Packages
flutter/material.dart- Core Flutter UI componentsget/get.dart- State management and routingdropdown_search/dropdown_search.dart- Dropdown search functionality
Internal Dependencies
controllers/contacts_controller.dart- Contact managementcontrollers/events_controller.dart- Event managementcontrollers/real_time_controller.dart- Real-time communicationhlk_helpers/hlk_extension_methods.dart- Extension methodshlk_helpers/hlk_utils.dart- Utility functionsmodels/core_models.dart- Core data modelsmodels/dto_models.dart- Data transfer objectsshared/common.dart- Common utilitiesshared/config.dart- Configurationshared/constants.dart- Constantswidgets/no_item_loader.dart- Loading widgetwidgets/participant_item.dart- Participant item widget
State Management
Controller Initialization
dart
final EventsController eventsController = Get.find();
final ContactsController contactsController = Get.find();
final RealTimeController realTimeController = Get.find();Reactive State Variables
dart
RxString dropdownValue = ''.obs;
RxBool isNow = false.obs, isAllDay = false.obs;
RxList<Contact> _contacts = <Contact>[].obs;
RxList<Participant> _participants = <Participant>[].obs;Text Controllers
dart
final TextEditingController eventNoteCtrl = TextEditingController();
final TextEditingController eventTitleCtrl = TextEditingController();
final TextEditingController mRnNumberTitleCtrl = TextEditingController();
final TextEditingController eventDateCtrl = TextEditingController();
final TextEditingController startTimeCtrl = TextEditingController();
final TextEditingController endTimeCtrl = TextEditingController();UI Components
Main Layout
dart
Scaffold(
appBar: AppBar(
title: Text(
widget.event == null ? 'Create Event' : 'Modify Event',
),
),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Form and other components
],
),
),
)Event Details Form
dart
Form(
key: _formKey,
child: Obx(
() => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Padding(
padding: EdgeInsets.all(12),
child: Text('Event Details', style: blueBoldTextStyle),
),
// Form fields
],
),
),
)Date and Time Selection
dart
Row(
children: [
Expanded(
child: Obx(
() => CheckboxListTile(
title: const Text('Start now'),
controlAffinity: ListTileControlAffinity.leading,
value: isNow.value,
onChanged: (bool? value) {
isNow.value = value!;
},
),
),
),
Expanded(
child: Obx(
() => CheckboxListTile(
title: const Text('All Day'),
controlAffinity: ListTileControlAffinity.leading,
value: isAllDay.value,
onChanged: (bool? value) {
isAllDay.value = value!;
},
),
),
),
],
)Participant Management
dart
DropdownSearch<Contact>.multiSelection(
popupProps: PopupPropsMultiSelection.menu(
showSelectedItems: false,
showSearchBox: true,
onItemAdded: (list, data) {
_contacts.value = list;
_participants.addIf(
!_participants.any((p) => p.id == data.id),
Participant(
id: getNumber(data.id) as int,
photoUrl: data.photoUrl,
name: getString(data.name),
specialty: data.speciality,
username: getString(data.name),
status: null,
statusNotes: null,
),
);
_contacts.clear();
},
onItemRemoved: (list, c) {
_contacts.value = list;
_participants.removeWhere((p) => p.id == c.id);
_contacts.clear();
},
),
items: (String filter, s) =>
contactsController.searchContacts(filter),
itemAsString: (contact) => contact.name,
compareFn: (i, s) => i.id == s.id,
filterFn: (cont, str) => cont.name.containsIgnoreCase(str),
)Event Management
Event Creation
dart
final eventDto = EventCreateModifyDto(
title: eventTitleCtrl.text.trim(),
patient: mRnNumberTitleCtrl.text.trim(),
startNow: isNow.value,
participants: _participants.map((c) => c.id).toList(),
unknownContacts: [],
notes: eventNoteCtrl.text.trim(),
allDay: isAllDay.value,
repeatConfig: dropdownValue.value,
repeat: dropdownValue.value,
startDate: DateUtils.dateOnly(startDate.toUtc()),
endDate: DateUtils.dateOnly(
DateTime(
startDate.year,
startDate.month,
startDate.day,
eTime.hour,
eTime.minute)
.toUtc(),
),
startTime: sTime,
endTime: eTime,
timeZoneOffset: timeZoneOffset,
id: widget.event != null ? widget.event!.eventId : null,
);Event Modification
dart
var isGood = await eventsController.modifyEvent(eventDto);
if (isGood) {
await eventsController.reload().whenComplete(() => Get.back());
}Meeting Join
dart
Future<void> joinTheMeeting(HvcEvent event) async {
logInfo('joinTheMeeting inside');
await eventsController.getParticipants(event);
final callDto = InitCallDto(
from: user.userId,
fromName: user.name,
targets: event.participants.map((e) => e.id).toList(),
title: event.title,
eventId: event.eventId,
source: 'Mobile',
notifyOthers: true,
isNewEvent: true,
platform: Platform.isIOS ? 'iOS' : 'Android',
);
logInfo("callDto ${callDto.toMap()}");
await realTimeController.makeCall(
callDto, null, true, event.participants.length > 1,
closePage: true);
}Participant Management
Participant List
dart
Obx(
() => _participants.isNotEmpty
? ListView.builder(
itemCount: _participants.length,
shrinkWrap: true,
padding: const EdgeInsets.all(4),
itemBuilder: (BuildContext ctx, int index) {
final ct = _participants[index];
return ParticipantItem(
participant: Participant(
name: getString(ct.name),
specialty: ct.specialty,
photoUrl: ct.photoUrl,
id: getNumber(ct.id) as int,
username: getString(ct.username),
status: getString(ct.status),
statusNotes: ct.statusNotes,
),
isRemovable: true,
onRemove: () => _participants.remove(ct),
);
},
)
: const Center(
child: NoItemLoader(message: 'No participants yet'),
),
)Participant Search
dart
items: (String filter, s) =>
contactsController.searchContacts(filter),
itemAsString: (contact) => contact.name,
compareFn: (i, s) => i.id == s.id,
filterFn: (cont, str) => cont.name.containsIgnoreCase(str),