[TikiWiki-commits] [Git][tikiwiki/tiki][30.x] [FIX] ItemLink: Enhance multi-value selection handling in item link selector

"Victor Emanouilov \(@kroky\) via TikiWiki-cvs" <[email protected]> Thu, 02 Jul 2026 12:38:06 +0000
Newsgroups gmane.comp.cms.tiki.cvs
Message-ID <6a465bae4bef_3819a078279ae@gitlab-sidekiq-low-urgency-cpu-bound-v2-65d6798dbd-4c6pb.mail>

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


Commits:
812a2822 by Steven ngesera at 2026-07-02T12:30:21+00:00
[FIX] ItemLink: Enhance multi-value selection handling in item link selector
---
* [FIX] ItemLink: Add option to force object selector for multi-value selection

(cherry picked from commit 48e67b24ae9683b6a5d979485b9bc164ce1e524e)

* [FIX] ItemLink: Enhance multi-value selection handling in item link selector

(cherry picked from commit 7d2d5055799cc57e68235d556bbcebda081be6aa)

See merge request tikiwiki/tiki!10638

- - - - -


2 changed files:

- lib/core/Tracker/Field/ItemLink.php
- templates/trackerinput/itemlink_selector.tpl


Changes:

=====================================
lib/core/Tracker/Field/ItemLink.php
=====================================
@@ -284,6 +284,16 @@ class Tracker_Field_ItemLink extends \Tracker\Field\AbstractItemField implements
                         ],
                         'legacy_index' => 12,
                     ],
+                    'forceObjectSelector' => [
+                        'name' => tr('Force object selector'),
+                        'description' => tr('Override the automatic widget selection. 1 forces the object selector (search panel with checkboxes for multi-select). 2 forces the dropdown. 0 lets the system decide (default behavior).'),
+                        'filter' => 'int',
+                        'options' => [
+                            0 => tr('System default'),
+                            1 => tr('Yes'),
+                            2 => tr('No'),
+                        ],
+                    ],
                     'indexRemote' => [
                         'name' => tr('Index remote fields'),
                         'description' => tr('Index one or multiple fields from the master tracker along with the child, separated by |'),
@@ -344,8 +354,16 @@ class Tracker_Field_ItemLink extends \Tracker\Field\AbstractItemField implements
             'value' => $value,
         ];
 
-        if ($this->canHaveMultipleValues() && ! is_array($data['value'])) {
-            $data['value'] = explode(',', $data['value']);
+        if ($this->canHaveMultipleValues()) {
+            if (isset($requestData[$string_id])) {
+                $parts = is_array($data['value']) ? array_values($data['value']) : preg_split('/[\s,]+/', $data['value'], -1, PREG_SPLIT_NO_EMPTY);
+                if (array_filter($parts, fn($v) => str_starts_with($v, 'trackeritem:'))) {
+                    $parts = array_values(array_filter(array_map(fn($v) => preg_replace('/^trackeritem:/', '', trim($v)), $parts)));
+                }
+                $data['value'] = $parts;
+            } elseif (! is_array($data['value'])) {
+                $data['value'] = explode(',', $data['value']);
+            }
         }
 
         return $data;
@@ -383,6 +401,15 @@ class Tracker_Field_ItemLink extends \Tracker\Field\AbstractItemField implements
             return false;
         }
 
+        $force = (int) $this->trackerField->getOption('forceObjectSelector');
+        if ($force === 1) {
+            return true;
+        }
+        if ($force === 2) {
+            return false;
+        }
+
+        // Default: preserve existing behaviour — multiselect stays on dropdown
         if ($this->canHaveMultipleValues()) {
             return false;
         }
@@ -427,13 +454,14 @@ class Tracker_Field_ItemLink extends \Tracker\Field\AbstractItemField implements
             $sort = TikiLib::lib('trk')->get_default_sort_order($trackerId, true, true);
 
             $template = $this->renderTemplate('trackerinput/itemlink_selector.tpl', $context, [
-                'placeholder' => $placeholder,
-                'status' => $status,
-                'selector_value' => $value,
-                'selector_id' => 'item' . $this->getItemId() . $this->getInsertId(),
-                'format' => $format,
-                'createTrackerItems' => $trackerPerms->create_tracker_items,
-                'sort' => $sort,
+                'placeholder'          => $placeholder,
+                'status'               => $status,
+                'selector_value'       => $value,
+                'selector_id'          => 'item' . $this->getItemId() . $this->getInsertId(),
+                'format'               => $format,
+                'createTrackerItems'   => $trackerPerms->create_tracker_items,
+                'sort'                 => $sort,
+                'selectMultipleValues' => (bool) $this->trackerField->getOption('selectMultipleValues'),
             ]);
 
             return $template;


=====================================
templates/trackerinput/itemlink_selector.tpl
=====================================
@@ -1,5 +1,9 @@
 <div class="item-link">
-    {object_selector _id=$data.selector_id _simplevalue=$field.value _simplename=$field.ins_id _placeholder=$data.placeholder type="trackeritem" tracker_id=$field.options_map.trackerId tracker_status=$data.status _format=$data.format _sort=$data.sort}
+    {if !empty($data.selectMultipleValues)}
+        {object_selector_multi _id=$data.selector_id _name=$field.ins_id _placeholder=$data.placeholder _format=$data.format _sort=$data.sort type="trackeritem" tracker_id=$field.options_map.trackerId tracker_status=$data.status}
+    {else}
+        {object_selector _id=$data.selector_id _simplevalue=$field.value _simplename=$field.ins_id _placeholder=$data.placeholder type="trackeritem" tracker_id=$field.options_map.trackerId tracker_status=$data.status _format=$data.format _sort=$data.sort}
+    {/if}
     {if $field.options_map.addItems and $data.createTrackerItems}
         <a class="btn btn-primary insert-tracker-item" href="{service controller=tracker action=insert_item trackerId=$field.options_map.trackerId}" role="button">{tr}{$field.options_map.addItems|escape}{/tr}</a>
         {jq}



View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/812a28222b14bfab2f76c7cab8c0c93828021b3c

-- 
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/812a28222b14bfab2f76c7cab8c0c93828021b3c
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