From f08aa692cbf235c657fb6d5beb37c4383d11306e Mon Sep 17 00:00:00 2001 From: colemanw Date: Tue, 12 Sep 2023 16:49:17 -0400 Subject: [PATCH] Afform - Allow weight to be set for contact summary blocks/tabs Adds test cover for weight and also tab names from a68ee65 Sets CiviGrant tab to its original weight (from when it was a component) --- ext/afform/admin/ang/afGuiEditor.css | 4 ++ .../admin/ang/afGuiEditor/config-form.html | 6 ++- ext/afform/core/Civi/Api4/Afform.php | 5 ++ ext/afform/core/afform.php | 5 +- .../Civi/Afform/AfformContactSummaryTest.php | 50 ++++++++++++------- ext/civigrant/ang/afsearchTabGrant.aff.json | 1 + 6 files changed, 48 insertions(+), 23 deletions(-) diff --git a/ext/afform/admin/ang/afGuiEditor.css b/ext/afform/admin/ang/afGuiEditor.css index b15d5892c7..3081736bd4 100644 --- a/ext/afform/admin/ang/afGuiEditor.css +++ b/ext/afform/admin/ang/afGuiEditor.css @@ -353,6 +353,10 @@ body.af-gui-dragging { width: 45px; } +#afGuiEditor #afGuiEditor-palette input[type=number] { + width: 6em; +} + #afGuiEditor .af-gui-layout-icon { width: 12px; height: 11px; diff --git a/ext/afform/admin/ang/afGuiEditor/config-form.html b/ext/afform/admin/ang/afGuiEditor/config-form.html index 43f9225e85..d18e23cfdc 100644 --- a/ext/afform/admin/ang/afGuiEditor/config-form.html +++ b/ext/afform/admin/ang/afGuiEditor/config-form.html @@ -103,8 +103,10 @@
- - + + + +

{{:: ts('Placement can be configured using the Contact Layout Editor.') }} diff --git a/ext/afform/core/Civi/Api4/Afform.php b/ext/afform/core/Civi/Api4/Afform.php index dc5bacd606..83c481a5bf 100644 --- a/ext/afform/core/Civi/Api4/Afform.php +++ b/ext/afform/core/Civi/Api4/Afform.php @@ -195,6 +195,11 @@ class Afform extends Generic\AbstractEntity { 'data_type' => 'Array', 'options' => \CRM_Contact_BAO_ContactType::contactTypePairs(), ], + [ + 'name' => 'summary_weight', + 'title' => E::ts('Order'), + 'data_type' => 'Integer', + ], [ 'name' => 'icon', 'title' => E::ts('Icon'), diff --git a/ext/afform/core/afform.php b/ext/afform/core/afform.php index 007e52088a..c53576ecda 100644 --- a/ext/afform/core/afform.php +++ b/ext/afform/core/afform.php @@ -173,7 +173,7 @@ function afform_civicrm_tabset($tabsetName, &$tabs, $context) { } $contactTypes = array_merge((array) ($context['contact_type'] ?? []), $context['contact_sub_type'] ?? []); $afforms = Civi\Api4\Afform::get(FALSE) - ->addSelect('name', 'title', 'icon', 'module_name', 'directive_name', 'summary_contact_type') + ->addSelect('name', 'title', 'icon', 'module_name', 'directive_name', 'summary_contact_type', 'summary_weight') ->addWhere('contact_summary', '=', 'tab') ->addOrderBy('title') ->execute(); @@ -186,7 +186,7 @@ function afform_civicrm_tabset($tabsetName, &$tabs, $context) { $tabs[] = [ 'id' => $tabId, 'title' => $afform['title'], - 'weight' => $weight++, + 'weight' => $afform['summary_weight'] ?? $weight++, 'icon' => 'crm-i ' . ($afform['icon'] ?: 'fa-list-alt'), 'is_active' => TRUE, 'contact_type' => _afform_get_contact_types($summaryContactType) ?: NULL, @@ -214,6 +214,7 @@ function afform_civicrm_pageRun(&$page) { $afforms = Civi\Api4\Afform::get(FALSE) ->addSelect('name', 'title', 'icon', 'module_name', 'directive_name', 'summary_contact_type') ->addWhere('contact_summary', '=', 'block') + ->addOrderBy('summary_weight') ->addOrderBy('title') ->execute(); $cid = $page->get('cid'); diff --git a/ext/afform/core/tests/phpunit/Civi/Afform/AfformContactSummaryTest.php b/ext/afform/core/tests/phpunit/Civi/Afform/AfformContactSummaryTest.php index aa8817b792..0397eba8ac 100644 --- a/ext/afform/core/tests/phpunit/Civi/Afform/AfformContactSummaryTest.php +++ b/ext/afform/core/tests/phpunit/Civi/Afform/AfformContactSummaryTest.php @@ -16,11 +16,11 @@ class AfformContactSummaryTest extends TestCase implements HeadlessInterface { use Api4TestTrait; private $formNames = [ - 'contact_summary_test1', - 'contact_summary_test2', - 'contact_summary_test3', - 'contact_summary_test4', - 'contact_summary_test5', + 'afFormTest0', + 'afFormTabTest1', + 'afSearchTabTest2', + 'afSearchtest3', + 'afFormTabTest4', ]; public function setUpHeadless(): CiviEnvBuilder { @@ -63,6 +63,7 @@ class AfformContactSummaryTest extends TestCase implements HeadlessInterface { ->addValue('title', 'Test D') ->addValue('contact_summary', 'tab') ->addValue('summary_contact_type', ['Individual']) + ->addValue('summary_weight', 99) ->execute(); Afform::create() ->addValue('name', $this->formNames[4]) @@ -80,20 +81,22 @@ class AfformContactSummaryTest extends TestCase implements HeadlessInterface { $tabs = array_column($tabs, NULL, 'id'); - $this->assertArrayHasKey($this->formNames[1], $tabs); - $this->assertArrayHasKey($this->formNames[2], $tabs); - $this->assertArrayNotHasKey($this->formNames[0], $tabs); - $this->assertArrayHasKey($this->formNames[3], $tabs); - $this->assertArrayNotHasKey($this->formNames[4], $tabs); - $this->assertEquals('Test C', $tabs[$this->formNames[1]]['title']); - $this->assertEquals(['Individual'], $tabs[$this->formNames[1]]['contact_type']); - $this->assertEquals(['Individual'], $tabs[$this->formNames[3]]['contact_type']); - $this->assertEquals('Test A', $tabs[$this->formNames[2]]['title']); - $this->assertEquals('crm-i smiley-face', $tabs[$this->formNames[1]]['icon']); + $this->assertArrayHasKey('test1', $tabs); + $this->assertArrayHasKey('test2', $tabs); + $this->assertArrayNotHasKey('test0', $tabs); + $this->assertArrayHasKey('test3', $tabs); + $this->assertArrayNotHasKey('test4', $tabs); + $this->assertEquals('Test C', $tabs['test1']['title']); + $this->assertEquals(['Individual'], $tabs['test1']['contact_type']); + $this->assertEquals(['Individual'], $tabs['test3']['contact_type']); + $this->assertEquals('Test A', $tabs['test2']['title']); + $this->assertEquals('crm-i smiley-face', $tabs['test1']['icon']); // Fallback icon - $this->assertEquals('crm-i fa-list-alt', $tabs[$this->formNames[2]]['icon']); + $this->assertEquals('crm-i fa-list-alt', $tabs['test2']['icon']); // Forms should be sorted by title alphabetically - $this->assertGreaterThan($tabs[$this->formNames[2]]['weight'], $tabs[$this->formNames[1]]['weight']); + $this->assertGreaterThan($tabs['test2']['weight'], $tabs['test1']['weight']); + // Should respect explicit weight + $this->assertEquals(99, $tabs['test3']['weight']); } public function testAfformContactSummaryBlock(): void { @@ -130,6 +133,13 @@ class AfformContactSummaryTest extends TestCase implements HeadlessInterface { ->addValue('title', 'Test A') ->addValue('contact_summary', 'block') ->execute(); + Afform::create() + ->addValue('name', $this->formNames[3]) + ->addValue('type', 'form') + ->addValue('title', 'A Weight Test') + ->addValue('contact_summary', 'block') + ->addValue('summary_weight', 99) + ->execute(); // Call pageRun hook and then assert afforms have been added to the appropriate region $dummy = new \CRM_Contact_Page_View_Summary(); @@ -139,10 +149,10 @@ class AfformContactSummaryTest extends TestCase implements HeadlessInterface { // TODO: Be more flexible // The presence of any other afform blocks in the system might alter the left-right assumptions here $blockA = \CRM_Core_Region::instance('contact-basic-info-left')->get('afform:' . $this->formNames[2]); - $this->assertStringContainsString("", $blockA['markup']); + $this->assertStringContainsString("", $blockA['markup']); $blockB = \CRM_Core_Region::instance('contact-basic-info-right')->get('afform:' . $this->formNames[1]); - $this->assertStringContainsString("", $blockB['markup']); + $this->assertStringContainsString("", $blockB['markup']); // Block for wrong contact type should not appear $this->assertNull(\CRM_Core_Region::instance('contact-basic-info-left')->get('afform:' . $this->formNames[0])); @@ -159,6 +169,8 @@ class AfformContactSummaryTest extends TestCase implements HeadlessInterface { // Forms should be sorted by title $order = array_flip(array_keys($blocks['afform_form']['blocks'])); $this->assertGreaterThan($order[$this->formNames[2]], $order[$this->formNames[1]]); + // Unless explicit weight is given + $this->assertGreaterThan($order[$this->formNames[3]], $order[$this->formNames[2]]); } } diff --git a/ext/civigrant/ang/afsearchTabGrant.aff.json b/ext/civigrant/ang/afsearchTabGrant.aff.json index 44b9ee3dcd..283f23b07a 100644 --- a/ext/civigrant/ang/afsearchTabGrant.aff.json +++ b/ext/civigrant/ang/afsearchTabGrant.aff.json @@ -2,6 +2,7 @@ "type": "search", "title": "Grants", "contact_summary": "tab", + "summary_weight": 60, "icon": "fa-money", "server_route": "", "permission": "access CiviGrant" -- 2.25.1