Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [2.10.4] - 2026-02-03
Comment thread
tsmr marked this conversation as resolved.
Outdated

### Added

- Add Links for uninstall templates From Item Form

## [2.10.2] - 2025-11-05

Comment thread
tsmr marked this conversation as resolved.
Outdated
## [2.10.3] - 2025-11-25

## Fixed
Expand Down
6 changes: 3 additions & 3 deletions ajax/dropdownReplaceFindDevice.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@

if (
isset($_REQUEST['searchText'])
&& strlen($_REQUEST['searchText']) > 0
&& (string) $_REQUEST['searchText'] !== ''
&& $_REQUEST['searchText'] != $CFG_GLPI["ajax_wildcard"]
) {
// isset already makes sure the search value isn't null
Expand Down Expand Up @@ -143,7 +143,7 @@
);
}

if ((strlen((string) $withoutput) > 0) && ($withoutput != ' ')) {
if (((string) $withoutput !== '') && ($withoutput != ' ')) {
$outputval = sprintf(__s('%1$s - %2$s'), $outputval, $withoutput);
}
}
Expand All @@ -160,7 +160,7 @@

if (
$_SESSION["glpiis_ids_visible"]
|| (strlen((string) $outputval) == 0)
|| ((string) $outputval === '')
) {
$outputval = sprintf(__s('%1$s (%2$s)'), $outputval, $ID);
}
Expand Down
2 changes: 1 addition & 1 deletion inc/replace.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ public static function replace($type, $model_id, $tab_ids, $location)
}

// Location
if ((int) $location != 0 && $olditem->isField('locations_id')) {
if ((int) $location !== 0 && $olditem->isField('locations_id')) {
$olditem->getFromDB($olditem_id);
switch ($location) {
case -1:
Expand Down
172 changes: 142 additions & 30 deletions inc/uninstall.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
use Glpi\Asset\Asset_PeripheralAsset;

use function Safe\preg_grep;

/**
* -------------------------------------------------------------------------
* Uninstall plugin for GLPI
Expand Down Expand Up @@ -60,6 +59,10 @@
* -------------------------------------------------------------------------
*/

use function Safe\json_encode;
use function Safe\ob_end_clean;
use function Safe\ob_start;

class PluginUninstallUninstall extends CommonDBTM
{
public const PLUGIN_UNINSTALL_TRANSFER_NAME = "plugin_uninstall";
Expand Down Expand Up @@ -924,13 +927,13 @@ public static function getInfocomPresentForDevice($type, $ID)
* @param $ID
* @param $item
* @param $user_id
**/
public static function showFormUninstallation($ID, $item, $user_id)
**/
public static function showFormUninstallation($ID, $item, $user_id, $templates_id = 0)
{
/**
* @var array $CFG_GLPI
*/
global $CFG_GLPI;
global $CFG_GLPI, $DB;

$type = $item->getType();
echo "<form action='" . $CFG_GLPI['root_doc'] . "/plugins/uninstall/front/action.php'
Expand All @@ -941,41 +944,150 @@ public static function showFormUninstallation($ID, $item, $user_id)

echo "<tr class='tab_bg_1'><td>" . __s("Model") . "</td><td>";
if (class_exists($type) && is_a($type, CommonDBTM::class, true)) {

$item = new $type();
$item->getFromDB($ID);
$rand = self::dropdownUninstallModels(
"model_id",
$_SESSION["glpiID"],
$item->fields["entities_id"],
);

if ($templates_id == 0) {
$rand = self::dropdownUninstallModels(
"model_id",
$_SESSION["glpiID"],
$item->fields["entities_id"],
);
} else {
$used = [];
if (!PluginUninstallModel::canReplace()) {
foreach (
$DB->request([
"FROM" => 'glpi_plugin_uninstall_models',
"WHERE" => [
'types_id' => [2, 3],
],
]) as $data
) {
$used[] = $data['id'];
}
Comment thread
tsmr marked this conversation as resolved.
Outdated
}

$rand = PluginUninstallModel::dropdown([
'name' => "model_id",
'value' => $templates_id,
'entity' => $item->fields["entities_id"],
'used' => $used,
]);
}


echo "</td></tr>";
if ($templates_id == 0) {
$params = [
'templates_id' => '__VALUE__',
'entity' => $item->fields["entities_id"],
'users_id' => $_SESSION["glpiID"],
];

Ajax::updateItemOnSelectEvent(
'dropdown_model_id' . $rand,
"show_objects",
$CFG_GLPI['root_doc'] . "/plugins/uninstall/ajax/locations.php",
$params,
);
}

$params = ['templates_id' => '__VALUE__',
'entity' => $item->fields["entities_id"],
'users_id' => $_SESSION["glpiID"],
];
echo "<tr class='tab_bg_1'><td>" . __s("Item's location after applying model", "uninstall") . "</td>";
if ($templates_id == 0) {
echo "<td><span id='show_objects'>\n" . Dropdown::EMPTY_VALUE . "</span></td>\n";
} else {
echo "<td>";
$location = PluginUninstallPreference::getLocationByUserByEntity(
$user_id,
$templates_id,
$item->fields["entities_id"],
);
Location::dropdown([
'value' => ($location == '' ? 0 : $location),
'comments' => 1,
'entity' => $item->fields["entities_id"],
'toadd' => [
-1 => __s('Keep previous location', 'uninstall'),
Comment thread
tsmr marked this conversation as resolved.
Outdated
0 => __s('Empty location', 'uninstall'),
],
]);
echo "</td>";
}

Ajax::updateItemOnSelectEvent(
'dropdown_model_id' . $rand,
"show_objects",
$CFG_GLPI['root_doc'] . "/plugins/uninstall/ajax/locations.php",
$params,
);
echo "</tr>";

echo "<tr class='tab_bg_1 center'><td colspan='3'>";
echo "<input type='submit' name='uninstall' value=\"" . _sx('button', 'Post') . "\"
class='submit'>";
echo "<input type='hidden' name='id' value='" . $ID . "'>";
echo "</td></tr>";
echo "</table>";
Html::closeForm();
}
}

echo "<tr class='tab_bg_1'><td>" . __s("Item's location after applying model", "uninstall") . "</td>";
echo "<td><span id='show_objects'>\n" . Dropdown::EMPTY_VALUE . "</span></td>\n";
echo "</tr>";
public static function showLinksUninstallation(
$params,
) {
/**
* @var array $UNINSTALL_TYPES
*/
global $DB, $UNINSTALL_TYPES;

echo "<tr class='tab_bg_1 center'><td colspan='3'>";
echo "<input type='submit' name='uninstall' value=\"" . _sx('button', 'Post') . "\"
class='submit'>";
echo "<input type='hidden' name='id' value='" . $ID . "'>";
echo "</td></tr>";
echo "</table>";
Html::closeForm();
$right = Session::haveRight(self::$rightname, READ);

$users_id = Session::getLoginUserID();
$item = $params['item'];
if ($right
&& in_array($item->getType(), $UNINSTALL_TYPES) && $item->getID() > 0) {
echo "<div class='form-button-separator card-body mx-n2 border-top d-flex flex-row-reverse align-items-start flex-wrap'>";

$criteria = [
"FROM" => 'glpi_plugin_uninstall_models',
];

if (!PluginUninstallModel::canReplace()) {
$criteria['WHERE'] = ['NOT' => ['types_id' => [2, 3]]];
}


$iterator = $DB->request($criteria);
foreach ($iterator as $data) {

$templates_id = $data['id'];
echo "<a href='#' id='" . $templates_id . "' class='btn btn-primary me-2'>"
. $data['name']
. "</a>";

// get form for uninstall actions
ob_start();
self::showFormUninstallation($item->getID(), $item, $users_id, $templates_id);
$html_modal = ob_get_contents();
ob_end_clean();

// we json encore to pass it to js (auto-escaping)

$modal_body = json_encode($html_modal);

$JS = <<<JAVASCRIPT
$(function() {
$("#{$templates_id}").on("click", function(event) {
event.preventDefault();

glpi_html_dialog({
body: {$modal_body}
})
});
});
JAVASCRIPT;
echo Html::scriptBlock($JS);
}

echo "</div>";
}

return null;
}


Expand Down
4 changes: 4 additions & 0 deletions setup.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ function plugin_init_uninstall()
$PLUGIN_HOOKS[Hooks::PRE_ITEM_ADD]['uninstall'] = [Config::class => PluginUninstallConfig::preConfigSet(...)];
$PLUGIN_HOOKS[Hooks::PRE_ITEM_UPDATE]['uninstall'] = [Config::class => PluginUninstallConfig::preConfigSet(...)];

if (!$uninstallconfig['replace_status_dropdown']) {
$PLUGIN_HOOKS[Hooks::POST_ITEM_FORM]['uninstall'] = PluginUninstallUninstall::showLinksUninstallation(...);
}

$PLUGIN_HOOKS[Hooks::STALE_AGENT_CONFIG]['uninstall'] = [
[
'label' => __s('Apply uninstall profile'),
Expand Down