From a8ba9c9f31ebedc8a76860ab135a034ca58c5c0e Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos Date: Mon, 11 Mar 2024 21:50:28 +0200 Subject: [PATCH] add CoSettings PeoplePicker Configuration --- app/config/schema/schema.json | 5 +- app/resources/locales/en_US/field.po | 12 + app/src/Controller/ApiV2Controller.php | 2 +- app/src/Controller/GroupMembersController.php | 10 +- app/src/Controller/StandardController.php | 6 +- app/src/Model/Table/CoSettingsTable.php | 40 ++- app/src/Model/Table/GroupMembersTable.php | 16 +- app/src/View/Helper/FieldHelper.php | 228 ++++++++++++------ app/templates/CoSettings/fields.inc | 21 ++ app/templates/element/autocompletePeople.php | 6 +- app/webroot/css/co-base.css | 10 + .../autocomplete/cm-autocomplete-people.js | 94 +++++++- 12 files changed, 356 insertions(+), 94 deletions(-) diff --git a/app/config/schema/schema.json b/app/config/schema/schema.json index 2a4f45b43..d70478c0a 100644 --- a/app/config/schema/schema.json +++ b/app/config/schema/schema.json @@ -111,7 +111,10 @@ "required_fields_address": { "type": "string", "size": 160 }, "required_fields_name": { "type": "string", "size": 160 }, "search_global_limit": { "type": "integer" }, - "search_global_limited_models": { "type": "boolean" } + "search_global_limited_models": { "type": "boolean" }, + "person_picker_email_type": { "type": "integer" }, + "person_picker_identifier_type": { "type": "integer" }, + "person_picker_display_types": { "type": "boolean" } }, "indexes": { "co_settings_i1": { "columns": [ "co_id" ]}, diff --git a/app/resources/locales/en_US/field.po b/app/resources/locales/en_US/field.po index ac02352bc..f0af86dbe 100644 --- a/app/resources/locales/en_US/field.po +++ b/app/resources/locales/en_US/field.po @@ -125,6 +125,9 @@ msgstr "Given Name" msgid "group_membership" msgstr "{0} Membership in {1}" +msgid "hidden" +msgstr "Hidden" + msgid "honorific" msgstr "Honorific" @@ -342,6 +345,15 @@ msgstr "Name Permitted Fields" msgid "CoSettings.permitted_fields_telephone_number" msgstr "Telephone Number Permitted Fields" +msgid "CoSettings.person_picker_display_fields" +msgstr "Person Picker Display Fields" + +msgid "CoSettings.person_picker_display_fields.desc" +msgstr "This determines what fields to display alongside the person name when using the autocomplete Person Picker (e.g. for selecting Group members)." + +msgid "CoSettings.person_picker_display_types" +msgstr "Display field types in the picker" + msgid "CoSettings.required_fields_address" msgstr "Address Required Fields" diff --git a/app/src/Controller/ApiV2Controller.php b/app/src/Controller/ApiV2Controller.php index 613d86876..a0cf9460a 100644 --- a/app/src/Controller/ApiV2Controller.php +++ b/app/src/Controller/ApiV2Controller.php @@ -318,7 +318,7 @@ public function index() { $this->set($this->tableName, $this->paginate($query)); // Let the view render - $this->render($this->request->is('ajax') ? '/Standard/api/ajax/v2/json/index' : '/Standard/api/v2/json/index'); + $this->render('/Standard/api/v2/json/index'); } /** diff --git a/app/src/Controller/GroupMembersController.php b/app/src/Controller/GroupMembersController.php index 3d54f1087..98223b880 100644 --- a/app/src/Controller/GroupMembersController.php +++ b/app/src/Controller/GroupMembersController.php @@ -30,6 +30,8 @@ namespace App\Controller; // XXX not doing anything with Log yet +use Cake\Event\EventInterface; +use Cake\Http\Response; use Cake\Log\Log; class GroupMembersController extends StandardController { @@ -38,15 +40,17 @@ class GroupMembersController extends StandardController { 'People.primary_name.name' => 'asc' ] ]; - + /** * Callback run prior to the request render. * + * @param EventInterface $event Cake Event + * + * @return Response|void * @since COmanage Registry v5.0.0 - * @param EventInterface $event Cake Event */ - public function beforeRender(\Cake\Event\EventInterface $event) { + public function beforeRender(EventInterface $event) { // Pull the Group name for breadcrumb rendering $link = $this->getPrimaryLink(true); diff --git a/app/src/Controller/StandardController.php b/app/src/Controller/StandardController.php index ba4d7d7f2..acd27de48 100644 --- a/app/src/Controller/StandardController.php +++ b/app/src/Controller/StandardController.php @@ -30,6 +30,7 @@ namespace App\Controller; use Cake\Database\Expression\QueryExpression; +use Cake\ORM\TableRegistry; use InvalidArgumentException; use \Cake\Http\Exception\BadRequestException; use \App\Lib\Enum\ProvisioningContextEnum; @@ -648,10 +649,9 @@ protected function populateAutoViewVars(object $obj=null) { case 'auxiliary': // XXX add list as in match? case 'select': - // We assume $modelName has a direct relationship to $avv['model'] $avvmodel = $avv['model']; - $this->$avvmodel = $this->fetchTable($avvmodel); - + $this->$avvmodel = TableRegistry::getTableLocator()->get($avvmodel); + if($avv['type'] == 'auxiliary') { $query = $this->$avvmodel->find(); } else { diff --git a/app/src/Model/Table/CoSettingsTable.php b/app/src/Model/Table/CoSettingsTable.php index d66fea2f5..0f2bccf02 100644 --- a/app/src/Model/Table/CoSettingsTable.php +++ b/app/src/Model/Table/CoSettingsTable.php @@ -55,6 +55,7 @@ class CoSettingsTable extends Table { use \App\Lib\Traits\PermissionsTrait; use \App\Lib\Traits\PrimaryLinkTrait; use \App\Lib\Traits\TableMetaTrait; + use \App\Lib\Traits\ValidationTrait; /** * Perform Cake Model initialization. @@ -82,10 +83,18 @@ public function initialize(array $config): void { ->setClassName('Types') ->setForeignKey('default_email_address_type_id') ->setProperty('default_email_address_type'); + $this->belongsTo('PersonPickerEmailAddressType') + ->setClassName('Types') + ->setForeignKey('person_picker_email_address_type_id') + ->setProperty('person_picker_email_address_type'); $this->belongsTo('DefaultIdentifierTypes') ->setClassName('Types') ->setForeignKey('default_identifier_type_id') ->setProperty('default_identifier_type'); + $this->belongsTo('PersonPickerIdentifierTypes') + ->setClassName('Types') + ->setForeignKey('person_picker_identifier_type_id') + ->setProperty('person_picker_identifier_type'); $this->belongsTo('DefaultNameTypes') ->setClassName('Types') ->setForeignKey('default_name_type_id') @@ -102,7 +111,7 @@ public function initialize(array $config): void { ->setClassName('Types') ->setForeignKey('default_url_type_id') ->setProperty('default_url_type'); - + $this->setDisplayField('co_id'); $this->setPrimaryLink('co_id'); @@ -123,6 +132,14 @@ public function initialize(array $config): void { 'type' => 'type', 'attribute' => 'Identifiers.type' ], + 'personPickerEmailAddressTypes' => [ + 'type' => 'type', + 'attribute' => 'EmailAddresses.type' + ], + 'personPickerIdentifierTypes' => [ + 'type' => 'type', + 'attribute' => 'Identifiers.type' + ], 'defaultNameTypes' => [ 'type' => 'type', 'attribute' => 'Names.type' @@ -197,6 +214,9 @@ public function addDefaults(int $coId): int { 'default_url_type_id' => null, 'permitted_fields_name' => PermittedNameFieldsEnum::HGMFS, 'permitted_fields_telephone_number' => PermittedTelephoneNumberFieldsEnum::CANE, + 'person_picker_email_type' => null, + 'person_picker_identifier_type' => null, + 'person_picker_display_types' => true, 'required_fields_address' => RequiredAddressFieldsEnum::Street, 'required_fields_name' => RequiredNameFieldsEnum::Given, 'search_global_limit' => DEF_GLOBAL_SEARCH_LIMIT, @@ -347,6 +367,22 @@ public function validationDefault(Validator $validator): Validator { ]); $validator->notEmptyString('search_global_limit'); - return $validator; + $validator->add('person_picker_email_type', [ + 'content' => ['rule' => 'isInteger'] + ]); + $validator->allowEmptyString('person_picker_email_type'); + + $validator->add('person_picker_identifier_type', [ + 'content' => ['rule' => 'isInteger'] + ]); + $validator->allowEmptyString('person_picker_identifier_type'); + + + $validator->add('person_picker_display_types', [ + 'content' => ['rule' => 'boolean'] + ]); + $validator->allowEmptyString('person_picker_display_types'); + + return $validator; } } \ No newline at end of file diff --git a/app/src/Model/Table/GroupMembersTable.php b/app/src/Model/Table/GroupMembersTable.php index c5a697a72..3a1e5c8ff 100644 --- a/app/src/Model/Table/GroupMembersTable.php +++ b/app/src/Model/Table/GroupMembersTable.php @@ -77,13 +77,25 @@ public function initialize(array $config): void { $this->setRequiresCO(true); $this->setEditContains(['Groups', 'People.PrimaryName']); - + $this->setViewContains(['Groups', 'People.PrimaryName']); + $this->setIndexContains([ 'GroupNestings' => 'Groups', 'Groups', 'People.PrimaryName' ]); - + + $this->setAutoViewVars([ + 'cosettings' => [ + 'type' => 'auxiliary', + 'model' => 'CoSettings' + ], + 'types' => [ + 'type' => 'auxiliary', + 'model' => 'Types' + ] + ]); + $this->setPermissions([ // XXX update for couAdmins, group owners, etc // Actions that operate over an entity (ie: require an $id) diff --git a/app/src/View/Helper/FieldHelper.php b/app/src/View/Helper/FieldHelper.php index 68bbeaf7b..ae2f17d01 100644 --- a/app/src/View/Helper/FieldHelper.php +++ b/app/src/View/Helper/FieldHelper.php @@ -70,21 +70,23 @@ public function banner(string $info): string { $this->Alert->alert($info, 'warning') . ''; } - + /** * Emit a form control. * - * @since COmanage Registry v5.0.0 - * @param string $fieldName Form field - * @param array $options FormHelper control options - * @param string $labelText Label text (fieldName language key used by default) - * @param string $ctrlCode Control code passed in from wrapper functions - * @param string $cssClass Start li css class passed in from wrapper functions - * @param string $beforeField Markup to be placed before/above the field - * @param string $afterField Markup to be placed after/below the field - * @param string $prefix Field prefix - used for API Usernames - * @param bool $labelIsTextOnly For fields that should not include