From de9fdf9fe85fb39f51cd25327d9533e154bea431 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Wed, 3 Feb 2021 17:58:38 -0500 Subject: [PATCH] Afform GUI - Fix errors when creating & saving blocks --- .../Civi/Api4/Action/Afform/LoadAdminData.php | 30 ++++++++++++++----- ext/afform/admin/ang/afGuiEditor.js | 4 +-- .../ang/afGuiEditor/afGuiEntity.component.js | 2 +- .../elements/afGuiContainer.component.js | 3 +- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/ext/afform/admin/Civi/Api4/Action/Afform/LoadAdminData.php b/ext/afform/admin/Civi/Api4/Action/Afform/LoadAdminData.php index 67ee5e0269..3341f3da58 100644 --- a/ext/afform/admin/Civi/Api4/Action/Afform/LoadAdminData.php +++ b/ext/afform/admin/Civi/Api4/Action/Afform/LoadAdminData.php @@ -53,6 +53,7 @@ class LoadAdminData extends \Civi\Api4\Generic\AbstractAction { case 'block': $info['definition'] = $this->definition + [ 'title' => '', + 'block' => $this->entity, 'layout' => [], ]; break; @@ -134,17 +135,13 @@ class LoadAdminData extends \Civi\Api4\Generic\AbstractAction { } // The full contents of blocks used on the form have been loaded. Get basic info about others relevant to these entities. - $blockInfo = Afform::get($this->checkPermissions) - ->addSelect('name', 'title', 'block', 'join', 'directive_name', 'repeat') - ->addWhere('type', '=', 'block') - ->addWhere('block', 'IN', $entities) - ->addWhere('directive_name', 'NOT IN', array_keys($info['blocks'])) - ->execute(); - $info['blocks'] = array_merge(array_values($info['blocks']), (array) $blockInfo); + $this->loadAvailableBlocks($entities, $info); } if ($info['definition']['type'] === 'block') { $entities[] = $info['definition']['join'] ?? $info['definition']['block']; + $scanBlocks($info['definition']['layout']); + $this->loadAvailableBlocks($entities, $info); } if ($info['definition']['type'] === 'search') { @@ -199,6 +196,25 @@ class LoadAdminData extends \Civi\Api4\Generic\AbstractAction { ->execute()->first(); } + /** + * Get basic info about blocks relevant to these entities. + * + * @param $entities + * @param $info + * @throws \API_Exception + * @throws \Civi\API\Exception\UnauthorizedException + */ + private function loadAvailableBlocks($entities, &$info) { + // The full contents of blocks used on the form have been loaded. Get basic info about others relevant to these entities. + $blockInfo = Afform::get($this->checkPermissions) + ->addSelect('name', 'title', 'block', 'join', 'directive_name', 'repeat') + ->addWhere('type', '=', 'block') + ->addWhere('block', 'IN', $entities) + ->addWhere('directive_name', 'NOT IN', array_keys($info['blocks'])) + ->execute(); + $info['blocks'] = array_merge(array_values($info['blocks']), (array) $blockInfo); + } + public function fields() { return [ [ diff --git a/ext/afform/admin/ang/afGuiEditor.js b/ext/afform/admin/ang/afGuiEditor.js index 17fb4d5aee..bdd9e9775f 100644 --- a/ext/afform/admin/ang/afGuiEditor.js +++ b/ext/afform/admin/ang/afGuiEditor.js @@ -77,10 +77,10 @@ // Takes the results from api.Afform.loadAdminData and processes the metadata // Note this runs once when loading a new afform for editing (just after this.resetMeta is called) - // and it also runs when adding new entities or joins to the form. + // and it also runs when adding new entities or blocks to the form. addMeta: function(data) { evaluate(data.definition.layout); - if (data.definition.type === 'block') { + if (data.definition.type === 'block' && data.definition.name) { CRM.afGuiEditor.blocks[data.definition.directive_name] = data.definition; } // Add new or updated blocks diff --git a/ext/afform/admin/ang/afGuiEditor/afGuiEntity.component.js b/ext/afform/admin/ang/afGuiEditor/afGuiEntity.component.js index 3de79cf717..830eb98f6d 100644 --- a/ext/afform/admin/ang/afGuiEditor/afGuiEntity.component.js +++ b/ext/afform/admin/ang/afGuiEditor/afGuiEntity.component.js @@ -19,7 +19,7 @@ $scope.elementTitles = []; function getEntityType() { - return ctrl.entity.type === 'Contact' ? ctrl.entity.data.contact_type : ctrl.entity.type; + return (ctrl.entity.type === 'Contact' && ctrl.entity.data) ? ctrl.entity.data.contact_type || 'Contact' : ctrl.entity.type; } $scope.getMeta = function() { diff --git a/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js b/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js index 236a99aaed..aa85e2e5c5 100644 --- a/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js +++ b/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js @@ -210,6 +210,7 @@ var model = { title: '', name: null, + type: 'block', layout: ctrl.node['#children'] }; if (ctrl.join) { @@ -221,7 +222,7 @@ model.block = afGui.meta.blocks[$scope.block.original].block; } else { - model.block = ctrl.container.getFieldEntityType() || '*'; + model.block = ctrl.getFieldEntityType('id') || '*'; } dialogService.open('saveBlockDialog', '~/afGuiEditor/saveBlock.html', model, options) .then(function(block) { -- 2.25.1