[TikiWiki-commits] [Git][tikiwiki/tiki][27.x] [ENH][FIX] multi-exact match for numeric, text and math fields

"Victor Emanouilov \(@kroky\) via TikiWiki-cvs" <[email protected]> Mon, 29 Jun 2026 08:09:07 +0000
Newsgroups gmane.comp.cms.tiki.cvs
Message-ID <6a42282360ab2_381996f0697cb@gitlab-sidekiq-low-urgency-cpu-bound-v2-656d6f88d7-qjqfc.mail>

Victor Emanouilov pushed to branch 27.x at Tiki Wiki CMS Groupware / Tiki


Commits:
7f7704dd by Victor Emanouilov at 2026-06-29T11:09:01+03:00
[ENH][FIX] multi-exact match for numeric, text and math fields
---
* [ENH][FIX] multi-exact match for numeric, text and math fields

See merge request tikiwiki/tiki!10614

- - - - -


4 changed files:

- lib/core/Search/Query.php
- lib/core/Tracker/Field/Math.php
- lib/core/Tracker/Field/Numeric.php
- lib/core/Tracker/Field/Text.php


Changes:

=====================================
lib/core/Search/Query.php
=====================================
@@ -108,6 +108,24 @@ class Search_Query implements Search_Query_Interface
         $this->addPart(new Search_Expr_Token($query), 'identifier', $field);
     }
 
+    /**
+     * Match one or more exact values on an identifier field.
+     * Multiple values are separated by " OR " in $query.
+     */
+    public function filterMultiIdentifier($query, $field)
+    {
+        $values = array_filter(array_map('trim', preg_split('/\s+OR\s+/', $query)), 'strlen');
+
+        if (count($values) <= 1) {
+            $this->filterIdentifier(reset($values) ?: $query, $field);
+        } else {
+            $tokens = array_map(function ($v) {
+                return new Search_Expr_Token($v);
+            }, $values);
+            $this->addPart(new Search_Expr_Or($tokens), 'identifier', $field);
+        }
+    }
+
     public function filterType($types)
     {
         if (is_array($types)) {


=====================================
lib/core/Tracker/Field/Math.php
=====================================
@@ -313,6 +313,17 @@ class Tracker_Field_Math extends \Tracker\Field\AbstractItemField implements \Tr
                     $query->filterIdentifier($value, $baseKey);
                 }
             });
+
+            $collection->addNew($permName, 'multiexact')
+            ->setLabel($name)
+            ->setHelp(tr('Search for one or more precise values separated by OR.'))
+            ->setControl(new Tracker\Filter\Control\TextField("tf_{$permName}_mem"))
+            ->setApplyCondition(function ($control, Search_Query $query) use ($baseKey) {
+                $value = $control->getValue();
+                if ($value) {
+                    $query->filterMultiIdentifier($value, $baseKey);
+                }
+            });
         }
 
         return $collection;


=====================================
lib/core/Tracker/Field/Numeric.php
=====================================
@@ -255,6 +255,17 @@ class Tracker_Field_Numeric extends \Tracker\Field\AbstractItemField implements
                 }
             });
 
+        $filters->addNew($permName, 'multiexact')
+            ->setLabel($name)
+            ->setHelp(tr('Search for one or more precise values separated by OR.'))
+            ->setControl(new Tracker\Filter\Control\TextField("tf_{$permName}_mem"))
+            ->setApplyCondition(function ($control, Search_Query $query) use ($baseKey) {
+                $value = $control->getValue();
+                if ($value) {
+                    $query->filterMultiIdentifier($value, $baseKey);
+                }
+            });
+
         $filters->addNew($permName, 'range')
             ->setLabel($name)
             ->setControl(new Tracker\Filter\Control\NumericRange("tf_{$permName}_range", $this->getOption('decimals')))


=====================================
lib/core/Tracker/Field/Text.php
=====================================
@@ -562,6 +562,18 @@ class Tracker_Field_Text extends \Tracker\Field\AbstractItemField implements \Tr
                         }
                     })
                     ;
+
+                $filters->addNew($permName, 'multiexact')
+                    ->setLabel($name)
+                    ->setHelp(tr('Search for one or more precise values separated by OR.'))
+                    ->setControl(new Tracker\Filter\Control\TextField("tf_{$permName}_mem"))
+                    ->setApplyCondition(function ($control, Search_Query $query) use ($baseKey) {
+                        $value = $control->getValue();
+                        if ($value) {
+                            $query->filterMultiIdentifier($value, $baseKey . '_exact');
+                        }
+                    })
+                    ;
             }
         } else {
             $language = Language::getCurrentLanguage();



View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/7f7704ddf4b181b3c272131312adb251fbf7c9ac

-- 
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/7f7704ddf4b181b3c272131312adb251fbf7c9ac
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help

_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs