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.