diff --git a/CHANGELOG.md b/CHANGELOG.md index 65a67347..0c18dd1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Fix incompatibility of `multiple` dropdowns with `massiveaction` +### Added +- Add `replace` and `add` options in massive action for the multiple dropdowns fields + ## [1.21.22] - 2025-05-28 ### Fixed diff --git a/hook.php b/hook.php index f6fadaa9..9f762dcb 100644 --- a/hook.php +++ b/hook.php @@ -206,6 +206,16 @@ function plugin_fields_MassiveActionsFieldsDisplay($options = []) $itemtypes = PluginFieldsContainer::getEntries('all'); if (in_array($options['itemtype'], $itemtypes)) { + if ($options['options']['is_multiple']) { + Dropdown::showFromArray( + 'multiple_dropdown_action', + [ + 'assign' => __('Assign'), + 'append' => __('Add'), + ], + ); + } + PluginFieldsField::showSingle($options['itemtype'], $options['options'], true); return true; diff --git a/inc/container.class.php b/inc/container.class.php index 8d5c3fe4..132f5a2d 100644 --- a/inc/container.class.php +++ b/inc/container.class.php @@ -1211,6 +1211,17 @@ public function updateFieldsValues($data, $itemtype, $massiveaction = false) return false; } + //Get object classname + $container_obj = new PluginFieldsContainer(); + $container_obj->getFromDB($data['plugin_fields_containers_id']); + + $items_id = $data['items_id']; + $classname = self::getClassname($itemtype, $container_obj->fields['name']); + + $obj = new $classname(); + + $exist = $obj->getFromDBByCrit(['items_id' => $items_id]); + // Convert "multiple" values into a JSON string $multiple_fields_iterator = $DB->request([ 'FROM' => PluginFieldsField::getTable(), @@ -1226,20 +1237,20 @@ public function updateFieldsValues($data, $itemtype, $massiveaction = false) $field_name = 'plugin_fields_' . $field_data['name'] . 'dropdowns_id'; } if (array_key_exists($field_name, $data)) { - $data[$field_name] = json_encode($data[$field_name]); + if ($data['multiple_dropdown_action'] === 'append' && $exist) { + // Add new values to existing ones + $existing_values = json_decode($obj->fields[$field_name] ?? '[]', true); + $new_values = is_array($data[$field_name]) ? $data[$field_name] : [$data[$field_name]]; + $data[$field_name] = json_encode(array_unique(array_merge($existing_values, $new_values))); + } else { + $data[$field_name] = json_encode($data[$field_name]); + } } elseif (array_key_exists('_' . $field_name . '_defined', $data)) { $data[$field_name] = json_encode([]); } } - $container_obj = new PluginFieldsContainer(); - $container_obj->getFromDB($data['plugin_fields_containers_id']); - - $items_id = $data['items_id']; - $classname = self::getClassname($itemtype, $container_obj->fields['name']); - - $obj = new $classname(); - if ($obj->getFromDBByCrit(['items_id' => $items_id]) === false) { + if ($exist === false) { // add fields data $obj->add($data); } else { @@ -1729,6 +1740,7 @@ public static function preItem(CommonDBTM $item) return false; } + $item->input['_plugin_fields_data'] = $data; return true; @@ -1819,6 +1831,7 @@ private static function populateData($c_id, CommonDBTM $item) // ex my_dom[] //in these conditions, the input is never sent by the browser if ($field['multiple']) { + $data['multiple_dropdown_action'] = $_POST['multiple_dropdown_action']; //handle multi dropdown field if ($field['type'] == 'dropdown') { $multiple_key = sprintf('plugin_fields_%sdropdowns_id', $field['name']); @@ -1960,6 +1973,10 @@ public static function getAddSearchOptions($itemtype, $containers_id = false) $opt[$i]['pfields_type'] = $data['type']; $opt[$i]['pfields_fields_id'] = $data['field_id']; + if ($data['type'] === 'dropdown') { + $opt[$i]['is_multiple'] = $data['multiple']; + } + if ($data['is_readonly']) { $opt[$i]['massiveaction'] = false; }