Skip to content

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 components
  • get/get.dart - State management and routing
  • dropdown_search/dropdown_search.dart - Dropdown search functionality

Internal Dependencies ​

  • controllers/contacts_controller.dart - Contact management
  • controllers/events_controller.dart - Event management
  • controllers/real_time_controller.dart - Real-time communication
  • hlk_helpers/hlk_extension_methods.dart - Extension methods
  • hlk_helpers/hlk_utils.dart - Utility functions
  • models/core_models.dart - Core data models
  • models/dto_models.dart - Data transfer objects
  • shared/common.dart - Common utilities
  • shared/config.dart - Configuration
  • shared/constants.dart - Constants
  • widgets/no_item_loader.dart - Loading widget
  • widgets/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'),
        ),
)
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),

Released under the MIT License.