From 9224e63c699eed89e498344dd595bc2e2217c5bf Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 17 Mar 2026 11:05:38 +0100 Subject: [PATCH 1/7] Add tasks visibility option --- hook.php | 15 +++++++++++- inc/ticket.class.php | 9 ++++++- tests/Units/TaskMessageTest.php | 43 +++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/hook.php b/hook.php index a6f4cb33..c363af51 100644 --- a/hook.php +++ b/hook.php @@ -85,12 +85,13 @@ function plugin_escalade_install() `use_filter_assign_group` INT NOT NULL, `ticket_last_status` INT NOT NULL, `remove_requester` INT NOT NULL, + `task_private` INT NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET={$default_charset} COLLATE={$default_collation} ROW_FORMAT=DYNAMIC;"; $DB->doQuery($query); $query = "INSERT INTO glpi_plugin_escalade_configs - VALUES (NULL, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, '" . Ticket::WAITING . "',0)"; + VALUES (NULL, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, '" . Ticket::WAITING . "',0, 1)"; $DB->doQuery($query); } @@ -391,6 +392,18 @@ function plugin_escalade_install() } return true; + + //Update to 2.10.2 + // add new fields + if (!$DB->fieldExists('glpi_plugin_escalade_configs', 'task_private')) { + $migration->addField( + 'glpi_plugin_escalade_configs', + 'task_private', + 'integer', + ['after' => 'remove_requester'], + ); + $migration->migrationOneTable('glpi_plugin_escalade_configs'); + } } /** diff --git a/inc/ticket.class.php b/inc/ticket.class.php index 898271ef..5c68ad3f 100644 --- a/inc/ticket.class.php +++ b/inc/ticket.class.php @@ -520,11 +520,18 @@ public static function processAfterAddGroup(Group_Ticket $item) $ticket = new Ticket(); $ticket->getFromDB($tickets_id); + $config = new PluginEscaladeConfig(); + $config->getFromDB($_SESSION['glpiactive_entity']); + + if (!$config->fields['task_private']) { + $is_private = false; + } + //default task content $task_content = '

' . sprintf(__s('Escalation to the group %s.', 'escalade'), $group->getName()) . '


' . $comment; PluginEscaladeTaskmanager::setTicketTask([ 'tickets_id' => $tickets_id, - 'is_private' => true, + 'is_private' => $is_private ?? true, 'state' => Planning::INFO, 'content' => $task_content, ]); diff --git a/tests/Units/TaskMessageTest.php b/tests/Units/TaskMessageTest.php index 65b5f103..9c45fad6 100644 --- a/tests/Units/TaskMessageTest.php +++ b/tests/Units/TaskMessageTest.php @@ -276,4 +276,47 @@ public function testTaskGroupEscalation(array $conf) } } } + + public static function taskPrivateProvider(): iterable + { + yield [ + 'task_private' => 0, + 'expected_is_private' => 0, + ]; + + yield [ + 'task_private' => 1, + 'expected_is_private' => 1, + ]; + } + + #[DataProvider('taskPrivateProvider')] + public function testTaskPrivateFlagOnEscalationTask(int $task_private, int $expected_is_private): void + { + $this->initConfig([ + 'task_history' => 1, + 'task_private' => $task_private, + ]); + + $ticket = $this->createItem('Ticket', [ + 'name' => 'Task private escalation test', + 'content' => '', + 'entities_id' => 0, + ]); + + $group = $this->createItem('Group', [ + 'name' => 'Task private group', + 'entities_id' => 0, + ]); + + $this->escalateWithHistoryButton($ticket, $group); + + $ticket_task = new TicketTask(); + $ticket_tasks = $ticket_task->find(['tickets_id' => $ticket->getID()]); + + $this->assertCount(1, $ticket_tasks); + + $last_task = end($ticket_tasks); + $this->assertSame($expected_is_private, (int) $last_task['is_private']); + } } From 861a9f332242aa42f641004298987b5c51c94e04 Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 17 Mar 2026 11:08:33 +0100 Subject: [PATCH 2/7] Add in config template --- templates/config.html.twig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/templates/config.html.twig b/templates/config.html.twig index 715ce3a1..52f8b921 100644 --- a/templates/config.html.twig +++ b/templates/config.html.twig @@ -194,6 +194,13 @@ field_options ) }} + {{ fields.sliderField( + 'task_private', + config["task_private"], + __("Escalation task is private ?", "escalade"), + field_options + ) }} + {{ fields.dropdownArrayField( 'ticket_last_status', config["ticket_last_status"], From b09af77197ad1f734944372b2e9df2bbd674566e Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 17 Mar 2026 11:15:05 +0100 Subject: [PATCH 3/7] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08b1293c..6fb84174 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Prevent business rules from triggering twice on tickets - Fixed routing issue caused by incorrect trailing slash +### Added + +- Add task visibility option (`task_private`) + ## [2.9.19] - 2026-27-01 ### Fixed From 46cdae0d01aca2591046b8f93d19b693dba199ca Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 17 Mar 2026 11:23:34 +0100 Subject: [PATCH 4/7] Fix lint --- hook.php | 4 ++-- inc/ticket.class.php | 9 +-------- tests/EscaladeTestCase.php | 1 + 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/hook.php b/hook.php index c363af51..16ba359b 100644 --- a/hook.php +++ b/hook.php @@ -391,8 +391,6 @@ function plugin_escalade_install() $migration->migrationOneTable('glpi_plugin_escalade_users'); } - return true; - //Update to 2.10.2 // add new fields if (!$DB->fieldExists('glpi_plugin_escalade_configs', 'task_private')) { @@ -404,6 +402,8 @@ function plugin_escalade_install() ); $migration->migrationOneTable('glpi_plugin_escalade_configs'); } + + return true; } /** diff --git a/inc/ticket.class.php b/inc/ticket.class.php index 5c68ad3f..a1223402 100644 --- a/inc/ticket.class.php +++ b/inc/ticket.class.php @@ -520,18 +520,11 @@ public static function processAfterAddGroup(Group_Ticket $item) $ticket = new Ticket(); $ticket->getFromDB($tickets_id); - $config = new PluginEscaladeConfig(); - $config->getFromDB($_SESSION['glpiactive_entity']); - - if (!$config->fields['task_private']) { - $is_private = false; - } - //default task content $task_content = '

' . sprintf(__s('Escalation to the group %s.', 'escalade'), $group->getName()) . '


' . $comment; PluginEscaladeTaskmanager::setTicketTask([ 'tickets_id' => $tickets_id, - 'is_private' => $is_private ?? true, + 'is_private' => $_SESSION['glpi_plugins']['escalade']['config']['task_private'], 'state' => Planning::INFO, 'content' => $task_content, ]); diff --git a/tests/EscaladeTestCase.php b/tests/EscaladeTestCase.php index ff6b7950..d831ddac 100644 --- a/tests/EscaladeTestCase.php +++ b/tests/EscaladeTestCase.php @@ -113,6 +113,7 @@ public function initConfig(array $conf = []) 'cloneandlink_ticket' => 0, 'close_linkedtickets' => 0, 'reassign_group_from_cat' => 0, + 'task_private' => 1, ]; // Update escalade config in database if provided From aabb52cd1ad21f6b624daf380e54887def9abf34 Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 17 Mar 2026 12:14:49 +0100 Subject: [PATCH 5/7] FIx tests --- tests/Units/TaskMessageTest.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/Units/TaskMessageTest.php b/tests/Units/TaskMessageTest.php index 9c45fad6..52aef6fd 100644 --- a/tests/Units/TaskMessageTest.php +++ b/tests/Units/TaskMessageTest.php @@ -309,6 +309,26 @@ public function testTaskPrivateFlagOnEscalationTask(int $task_private, int $expe 'entities_id' => 0, ]); + $group2 = $this->createItem('Group', [ + 'name' => 'Task private group 2', + 'entities_id' => 0, + ]); + + $this->updateItem( + Ticket::class, + $ticket->getID(), + [ + '_actors' => [ + 'assign' => [ + [ + 'items_id' => $group2->getID(), + 'itemtype' => 'Group', + ], + ], + ], + ], + ); + $this->escalateWithHistoryButton($ticket, $group); $ticket_task = new TicketTask(); From ed66b611d331bceeaefc5acf27627d1355fc421b Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 17 Mar 2026 12:20:57 +0100 Subject: [PATCH 6/7] FIx tests --- tests/Units/TaskMessageTest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Units/TaskMessageTest.php b/tests/Units/TaskMessageTest.php index 52aef6fd..97fd3de9 100644 --- a/tests/Units/TaskMessageTest.php +++ b/tests/Units/TaskMessageTest.php @@ -329,8 +329,6 @@ public function testTaskPrivateFlagOnEscalationTask(int $task_private, int $expe ], ); - $this->escalateWithHistoryButton($ticket, $group); - $ticket_task = new TicketTask(); $ticket_tasks = $ticket_task->find(['tickets_id' => $ticket->getID()]); From 325344278abb3204796f0440db199353ea8487f0 Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 17 Mar 2026 12:26:15 +0100 Subject: [PATCH 7/7] FIx lints --- tests/Units/TaskMessageTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Units/TaskMessageTest.php b/tests/Units/TaskMessageTest.php index 97fd3de9..6ec75a8e 100644 --- a/tests/Units/TaskMessageTest.php +++ b/tests/Units/TaskMessageTest.php @@ -304,7 +304,7 @@ public function testTaskPrivateFlagOnEscalationTask(int $task_private, int $expe 'entities_id' => 0, ]); - $group = $this->createItem('Group', [ + $this->createItem('Group', [ 'name' => 'Task private group', 'entities_id' => 0, ]);