ScheduledReminders - Rewrite form to use metadata
authorcolemanw <coleman@civicrm.org>
Thu, 3 Aug 2023 02:41:25 +0000 (22:41 -0400)
committercolemanw <coleman@civicrm.org>
Thu, 10 Aug 2023 00:03:25 +0000 (20:03 -0400)
commitdc742067004cb2e47bed3d55387e2ed3fbfd72b6
treef57145da1e07cf2bb116f7df31afa7234e804ad0
parentc57a0ce7cd6670529d59103776277cef56109987
ScheduledReminders - Rewrite form to use metadata

The complexity of the form lies in the fact that various fields have different meanings depending on the selected mapping type.
For example the entity_value field might mean "Activity Type" or "Financial Account" or "Event Type" or "Event ID". The
entity_status field also refers to different option lists, sometimes dependent on the selection of entity_value and it may or
may not allow multiple values and it may or may not be required.
The form also allows those fields to be pre-selected when embedded on an Event page, and the old Quickform HierSelect widget coped
very poorly with all those scenarios. As a result the form employed a lot of javascript to handle specific hard-coded issues, and
a few bespoke ajax callbacks. None of which worked perfectly.
The postProcess & validate functions employed a sub-function called parseActionSchedule which was doing way too much work:
1. to detangle all the overcomplicated form values
2. preprocessing that really belonged in the BAO
3. to save a field-mapping (alarmingly this was happening during form validation AND postProcess!).

This rewrite moves all of that logic into the BAO and getFields, allowing each mapping-type to set metadata appropriately
(e.g. is a particular field required for this mapping type? does it support multiple values? does it have a different
option list depending on another field selection?). This allowed me to delete the bespoke ajax callbacks and just call
api4.getFields from the form. The new metadata also describes the relationship between fields (so when you update one
field it knows which others to reload).
21 files changed:
CRM/Admin/Form.php
CRM/Admin/Form/ScheduleReminders.php
CRM/Admin/Page/AJAX.php
CRM/Admin/Page/ScheduleReminders.php
CRM/Contact/ActionMapping.php
CRM/Core/BAO/ActionSchedule.php
CRM/Core/DAO.php
CRM/Core/Form.php
CRM/Core/Form/Renderer.php
CRM/Core/Page/Basic.php
CRM/Core/xml/Menu/Admin.xml
CRM/Event/ActionMapping/ByEvent.php
CRM/Event/Form/ManageEvent/ScheduleReminders.php
CRM/SMS/BAO/Provider.php
CRM/Utils/Date.php
Civi/ActionSchedule/MappingBase.php
Civi/ActionSchedule/MappingInterface.php
Civi/Api4/Generic/AbstractAction.php
Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php
templates/CRM/Admin/Form/ScheduleReminders.tpl
templates/CRM/Admin/Page/ScheduleReminders.tpl