From 21d75e8f232db365536f757cbaa28b0e5371ea38 Mon Sep 17 00:00:00 2001 From: ADmad Date: Sun, 8 Sep 2024 16:17:52 +0530 Subject: [PATCH] Use autocomplete by default only for select fields in search form. --- src/Listener/ViewSearchListener.php | 18 ++++--- .../Listener/ViewSearchListenerTest.php | 52 +++++++++++++++---- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/Listener/ViewSearchListener.php b/src/Listener/ViewSearchListener.php index 5f53be8..7cd619b 100644 --- a/src/Listener/ViewSearchListener.php +++ b/src/Listener/ViewSearchListener.php @@ -84,7 +84,7 @@ public function afterPaginate(EventInterface $event): void */ public function fields(): array { - $fields = Hash::normalize($this->getConfig('fields'), default: []) ?: []; + $fields = $this->getConfig('fields'); $config = $this->getConfig(); $schema = $this->_model()->getSchema(); @@ -119,13 +119,14 @@ public function fields(): array $input['value'] = $request->getQuery($field); - if (empty($input['options']) && $schema->getColumnType($field) === 'boolean') { - $input['options'] = [__d('crud', 'No'), __d('crud', 'Yes')]; + if (!isset($input['options']) && $schema->getColumnType($field) === 'boolean') { + $input['options'] = [1 => __d('crud', 'Yes'), 0 => __d('crud', 'No')]; $input['type'] = 'select'; } - if (!empty($input['options'])) { + if (isset($input['options'])) { $input['empty'] ??= $this->getPlaceholder($field); + if (empty($input['class']) && !$config['select2']) { $input['class'] = 'no-select2'; } @@ -135,7 +136,7 @@ public function fields(): array continue; } - if (empty($input['class']) && $config['autocomplete']) { + if ($input['type'] === 'select' && empty($input['class']) && $config['autocomplete']) { $input['class'] = 'autocomplete'; } @@ -167,8 +168,11 @@ public function fields(): array $input['empty'] ??= $this->getPlaceholder($field); } - $urlArgs = []; - if (!isset($input['data-url'])) { + if ( + !empty($input['class']) + && strpos($input['class'], 'autocomplete') !== false + && !isset($input['data-url']) + ) { $urlArgs = []; $fieldKeys = $input['fields'] ?? ['id' => $field, 'value' => $field]; diff --git a/tests/TestCase/Listener/ViewSearchListenerTest.php b/tests/TestCase/Listener/ViewSearchListenerTest.php index e17d2ac..d9eed48 100644 --- a/tests/TestCase/Listener/ViewSearchListenerTest.php +++ b/tests/TestCase/Listener/ViewSearchListenerTest.php @@ -51,6 +51,7 @@ public function testFields() { $this->listener->setConfig(['fields' => [ 'name', + 'auto' => ['class' => 'autocomplete'], 'is_active', 'user_id', 'custom_select' => ['empty' => false, 'type' => 'select'], @@ -60,41 +61,47 @@ public function testFields() $expected = [ 'name' => [ 'required' => false, - 'type' => 'select', + 'type' => 'text', 'value' => null, + 'placeholder' => 'Name', + ], + 'auto' => [ 'class' => 'autocomplete', - 'data-url' => '/blogs/lookup.json?id=name&value=name', + 'required' => false, + 'type' => 'select', + 'value' => null, 'data-input-type' => 'text', 'data-tags' => 'true', 'data-allow-clear' => 'true', 'data-placeholder' => '', - 'empty' => 'Name', + 'empty' => 'Auto', + 'data-url' => '/blogs/lookup.json?id=auto&value=auto', ], 'is_active' => [ 'required' => false, 'type' => 'select', 'value' => null, - 'empty' => true, - 'options' => ['No', 'Yes'], + 'options' => [1 => 'Yes', 0 => 'No'], + 'empty' => 'Is Active', ], 'user_id' => [ 'required' => false, 'type' => 'select', - 'empty' => true, 'value' => null, 'class' => 'autocomplete', + 'empty' => 'User', 'data-url' => '/blogs/lookup.json?id=user_id&value=user_id', ], 'custom_select' => [ - 'required' => false, - 'type' => 'select', 'empty' => false, + 'type' => 'select', + 'required' => false, 'value' => null, 'class' => 'autocomplete', 'data-url' => '/blogs/lookup.json?id=custom_select&value=custom_select', ], ]; - $this->assertEquals($expected, $fields); + $this->assertSame($expected, $fields); $this->listener->setConfig([ 'fields' => ['name' => ['data-url' => '/custom']], @@ -103,5 +110,32 @@ public function testFields() $fields = $this->listener->fields(); $expected['name']['data-url'] = '/custom'; $this->assertEquals($expected, $fields); + + $this->listener->setConfig([ + 'autocomplete' => false, + 'fields' => [ + 'user_id', + 'custom_select' => ['empty' => false, 'type' => 'select', 'class' => 'autocomplete'], + ], + ], merge: false); + + $fields = $this->listener->fields(); + $expected = [ + 'user_id' => [ + 'required' => false, + 'type' => 'select', + 'value' => null, + 'empty' => 'User', + ], + 'custom_select' => [ + 'empty' => false, + 'type' => 'select', + 'class' => 'autocomplete', + 'required' => false, + 'value' => null, + 'data-url' => '/blogs/lookup.json?id=custom_select&value=custom_select', + ], + ]; + $this->assertSame($expected, $fields); } }