From d9942ddda019c7773447f400f64003ad12a6d371 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos Date: Sat, 2 Nov 2024 20:34:35 +0200 Subject: [PATCH] Attribute Collection view FieldGroups --- .../Model/Table/EnrollmentAttributesTable.php | 4 + .../AttributeCollectors/fieldset-field.inc | 54 +++++++++++++ .../AttributeCollectors/fieldset-group.inc | 54 +++++++++++++ .../multifield_attribute.inc | 80 ++++++++++++------- app/resources/locales/en_US/enumeration.po | 17 +++- app/src/Lib/Enum/GroupedAddressFieldsEnum.php | 38 +++++++++ 6 files changed, 212 insertions(+), 35 deletions(-) create mode 100644 app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-field.inc create mode 100644 app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-group.inc create mode 100644 app/src/Lib/Enum/GroupedAddressFieldsEnum.php diff --git a/app/plugins/CoreEnroller/src/Model/Table/EnrollmentAttributesTable.php b/app/plugins/CoreEnroller/src/Model/Table/EnrollmentAttributesTable.php index 707a34062..42a30fbfd 100644 --- a/app/plugins/CoreEnroller/src/Model/Table/EnrollmentAttributesTable.php +++ b/app/plugins/CoreEnroller/src/Model/Table/EnrollmentAttributesTable.php @@ -85,6 +85,10 @@ public function initialize(array $config): void { 'type' => 'enum', 'class' => 'RequiredAddressFieldsEnum' ], + 'addressGroupedFields' => [ + 'type' => 'enum', + 'class' => 'GroupedAddressFieldsEnum' + ], 'addressTypes' => [ 'type' => 'type', 'attribute' => 'Addresses.type' diff --git a/app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-field.inc b/app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-field.inc new file mode 100644 index 000000000..4e112d6e4 --- /dev/null +++ b/app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-field.inc @@ -0,0 +1,54 @@ + "field-$field-$attr->id", + 'fieldLabel' => $attr->label, // fieldLabel is only applicable to checkboxes + 'fieldType' => $supportedAttributes['fieldType'], + 'fieldNameAlias' => $attr->attribute // the field name to its enrollment attribute field name +]; +?> + +
+ + element('form/requiredSpan') : ''?> +
+ Field->formField(...$formArguments) ?> +
+
\ No newline at end of file diff --git a/app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-group.inc b/app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-group.inc new file mode 100644 index 000000000..3bc6ff24d --- /dev/null +++ b/app/plugins/CoreEnroller/templates/AttributeCollectors/fieldset-group.inc @@ -0,0 +1,54 @@ + + + $fields): ?> +
+ filter(fn($value) => str_replace(' ', '_', Inflector::underscore($value)) !== $field); + include($vv_template_path . DS . 'fieldset-field.inc'); + } + ?> +
+ + + + + diff --git a/app/plugins/CoreEnroller/templates/AttributeCollectors/multifield_attribute.inc b/app/plugins/CoreEnroller/templates/AttributeCollectors/multifield_attribute.inc index e9bd8019e..f416f1e66 100644 --- a/app/plugins/CoreEnroller/templates/AttributeCollectors/multifield_attribute.inc +++ b/app/plugins/CoreEnroller/templates/AttributeCollectors/multifield_attribute.inc @@ -27,7 +27,6 @@ declare(strict_types = 1); -use App\Lib\Enum\StatusEnum; use \Cake\Utility\Inflector; // This field is called attribute_type and not attribute_type_id because we want this @@ -38,20 +37,53 @@ $mveaAutoPopulatedVariable = $attr->attribute . 'Types'; // dropdown list $fieldLabel = 'Not found'; if ($this->get($mveaAutoPopulatedVariable) !== null) { - $fieldLabel = $this->get($mveaAutoPopulatedVariable)[$attr->attribute_type] . ' ' . ucfirst($attr->attribute); + $fieldLabel = $this->get($mveaAutoPopulatedVariable)[$attr->attribute_type] + . ' ' + . Inflector::humanize(Inflector::underscore($attr->attribute)); } -$required_fields_variable_name = "required_fields_$attr->attribute"; -$permitted_fields_variable_name = "permitted_fields_$attr->attribute"; +$required_fields_variable_name = 'required_fields_' . Inflector::underscore($attr->attribute); +$permitted_fields_variable_name = 'permitted_fields_' . Inflector::underscore($attr->attribute); $permitted_fields_list = []; $required_fields_list = []; -if (!empty($cosettings[0][$required_fields_variable_name])) { - $required_fields_list = explode(',', $cosettings[0][$required_fields_variable_name]); -} if (!empty($cosettings[0][$permitted_fields_variable_name])) { $permitted_fields_list = explode(',', $cosettings[0][$permitted_fields_variable_name]); } + +// Required fields +// - first look at the enrollment flow level +// - if not set look at the co level +$required_fields = match(true) { + // Enrollment Flow + !empty($attr?->attribute_required_fields) => $attr?->attribute_required_fields, + // Co Level + !empty($cosettings[0][$required_fields_variable_name]) => $cosettings[0][$required_fields_variable_name], + // XXX Do i need CMP level here? + default => '' +}; +// List of the required fields +$required_fields_list = explode(',', $required_fields); + +// Address has not permitted fields configuration at CO level. And according to our design, +// the permitted fields are found in CoSettings. As a result, if we do not have any we need to get +// For all the attributes that have no +// permitted configuration at the CO level we will get all the fields that we support +$requiredDropDownListVar = $attr->attribute . 'RequiredFields'; +if(empty($permitted_fields_list) && !empty($$requiredDropDownListVar)) { + usort($$requiredDropDownListVar, static fn($a, $b) => count(explode(',', $a)) <=> count(explode(',', $b))); + $permitted_fields = end($$requiredDropDownListVar); + $permitted_fields_list = collection(explode(',', $permitted_fields))->map(fn($value) => trim($value)); +} + +// Grouped fields +$groupedFieldsVar = $attr->attribute . 'GroupedFields'; +$groupedFieldsArray = []; +if(!empty($$groupedFieldsVar)) { + $groupedFieldsArray = collection(array_keys($$groupedFieldsVar))->map(static fn($fields) => explode(',', $fields))->toArray(); +} +// Now that we have the permitted fields array and the grouped fields array, we need to put the permitted fields to groups + ?>
  • @@ -60,30 +92,16 @@ if (!empty($cosettings[0][$permitted_fields_variable_name])) {
    - -attribute_required_fields) as $field) : ?> - - "field-$field-$attr->id", - 'fieldLabel' => $attr->label, // fieldLabel is only applicable to checkboxes - 'fieldType' => $supportedAttributes['fieldType'], - 'fieldNameAlias' => $attr->attribute // the field name to its enrollment attribute field name - ]; -?> - -
    - - element('form/requiredSpan') : ''?> -
    - Field->formField(...$formArguments) ?> -
    -
    - - +
  • diff --git a/app/resources/locales/en_US/enumeration.po b/app/resources/locales/en_US/enumeration.po index 9cd7394fe..363e85a87 100644 --- a/app/resources/locales/en_US/enumeration.po +++ b/app/resources/locales/en_US/enumeration.po @@ -529,11 +529,20 @@ msgstr "Postal Code" msgid "RequiredAddressFieldsEnum.street" msgstr "Street" -msgid "RequiredAddressFieldsEnum.street,locality,state,postal_code" -msgstr "Street, City, State, Postal Code" +msgid "RequiredAddressFieldsEnum.street,room,locality,state,postal_code" +msgstr "Street, Room, Locality, City, State, Postal Code" -msgid "RequiredAddressFieldsEnum.street,locality,state,postal_code,country" -msgstr "Street, City, State, Postal Code, Country" +msgid "RequiredAddressFieldsEnum.street,room,locality,state,postal_code,country" +msgstr "Street, Room, Locality, City, State, Postal Code, Country" + +msgid "GroupedAddressFieldsEnum.street,room" +msgstr "Street, Room" + +msgid "GroupedAddressFieldsEnum.city,locality" +msgstr "City, Locality" + +msgid "GroupedAddressFieldsEnum.state,postal_code,country" +msgstr "State, Postal Code, Country" msgid "RequiredNameFieldsEnum.given" msgstr "Given" diff --git a/app/src/Lib/Enum/GroupedAddressFieldsEnum.php b/app/src/Lib/Enum/GroupedAddressFieldsEnum.php new file mode 100644 index 000000000..7a2bd3ff1 --- /dev/null +++ b/app/src/Lib/Enum/GroupedAddressFieldsEnum.php @@ -0,0 +1,38 @@ +