Skip to content

Commit a563d11

Browse files
committed
feat(targetticket): link to a ticket from a question
Signed-off-by: Thierry Bugier <tbugier@teclib.com>
1 parent 8a901f4 commit a563d11

File tree

5 files changed

+138
-46
lines changed

5 files changed

+138
-46
lines changed

inc/composite.class.php

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,38 @@
3535

3636
class PluginFormcreatorComposite
3737
{
38+
/**
39+
* Undocumented variable
40+
*
41+
* @var PluginFormcreatorItem_TargetTicket
42+
*/
3843
private $item_targetTicket;
3944

45+
/**
46+
* Undocumented variable
47+
*
48+
* @var PluginFormcreatorFormAnswer
49+
*/
4050
private $targets = [];
4151

52+
/**
53+
* Undocumented variable
54+
*
55+
* @var Ticket_Ticket
56+
*/
4257
private $ticket_ticket;
4358

44-
public function __construct(PluginFormcreatorItem_TargetTicket $item_targetTicket, Ticket_Ticket $ticket_ticket) {
59+
/**
60+
* Undocumented variable
61+
*
62+
* @var PluginFormcreatorFormAnswer
63+
*/
64+
private $formAnswer;
65+
66+
public function __construct(PluginFormcreatorItem_TargetTicket $item_targetTicket, Ticket_Ticket $ticket_ticket, PluginFormcreatorFormAnswer $formAnswer) {
4567
$this->item_targetTicket = $item_targetTicket;
4668
$this->ticket_ticket = $ticket_ticket;
69+
$this->formAnswer = $formAnswer;
4770
}
4871

4972
/**
@@ -101,6 +124,31 @@ public function buildCompositeRelations() {
101124
]);
102125
}
103126
break;
127+
128+
case PluginFormcreatorQuestion::class:
129+
// Check the answer matches a question of type GLPI Object / Ticket
130+
$question = PluginFormcreatorQuestion::getById($row['items_id']);
131+
if (!($question instanceof PluginFormcreatorQuestion)) {
132+
break;
133+
}
134+
/** @var PluginFormcreatorQuestion $question */
135+
if (strpos($question->fields['values'], '"itemtype":"Ticket"') === false) {
136+
break;
137+
}
138+
$answer = new PluginFormcreatorAnswer();
139+
$answer->getFromDBByCrit([
140+
PluginFormcreatorQuestion::getForeignKeyField() => $row['items_id'],
141+
PluginFormcreatorFormAnswer::getForeignKeyField() => $this->formAnswer->getID(),
142+
]);
143+
if ($answer->isNewItem()) {
144+
break;
145+
}
146+
$this->ticket_ticket->add([
147+
'link' => $row['link'],
148+
'tickets_id_1' => $generatedObject->getID(),
149+
'tickets_id_2' => $answer->fields['answer'],
150+
]);
151+
break;
104152
}
105153
}
106154
}

inc/field/dropdownfield.class.php

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -285,42 +285,50 @@ public function buildParams($rand = null) {
285285

286286
case Ticket::class:
287287
// Shall match logic in \Search::getDefaultWhere()
288-
if (!Session::haveRight("ticket", Ticket::READALL)) {
289-
$currentUser = Session::getLoginUserID();
290-
if (Session::haveRight(Ticket::$rightname, Ticket::READMY)) {
291-
$requestersObserversQuery = new QuerySubQuery([
292-
'SELECT' => 'tickets_id',
293-
'FROM' => Ticket_User::getTable(),
294-
'WHERE' => [
295-
'users_id' => $currentUser,
296-
'type' => [CommonITILActor::REQUESTER, CommonITILActor::OBSERVER]
297-
],
298-
]);
299-
$dparams_cond_crit['OR'] = [
288+
if (Session::haveRight("ticket", Ticket::READALL)) {
289+
break;
290+
}
291+
$currentUser = Session::getLoginUserID();
292+
if (!Session::haveRight(Ticket::$rightname, Ticket::READMY) && !Session::haveRight(Ticket::$rightname, Ticket::READGROUP)) {
293+
// No right to view any ticket, then force the dropdown to be empty
294+
$dparams_cond_crit['OR'] = new \QueryExpression('0=1');
295+
break;
296+
}
297+
if (Session::haveRight(Ticket::$rightname, Ticket::READMY)) {
298+
$requestersObserversQuery = new QuerySubQuery([
299+
'SELECT' => 'tickets_id',
300+
'FROM' => Ticket_User::getTable(),
301+
'WHERE' => [
302+
'users_id' => $currentUser,
303+
'type' => [CommonITILActor::REQUESTER, CommonITILActor::OBSERVER]
304+
],
305+
]);
306+
$dparams_cond_crit['OR'] = [
307+
[
300308
'id' => $requestersObserversQuery,
301309
'users_id_recipient' => $currentUser,
310+
],
311+
];
312+
}
313+
if (Session::haveRight(Ticket::$rightname, Ticket::READGROUP)) {
314+
$requestersObserversGroupsQuery = new QuerySubQuery([
315+
'SELECT' => 'tickets_id',
316+
'FROM' => Group_Ticket::getTable(),
317+
'WHERE' => [
318+
'groups_id' => $_SESSION['glpigroups'],
319+
'type' => [CommonITILActor::REQUESTER, CommonITILActor::OBSERVER]
320+
],
321+
]);
322+
if (!isset($dparams_cond_crit['OR'])) {
323+
$dparams_cond_crit['OR'] = [
324+
'id' => $requestersObserversGroupsQuery,
325+
];
326+
} else {
327+
$dparams_cond_crit['OR'][] = [
328+
'id' => $requestersObserversGroupsQuery,
329+
'users_id_recipient' => $currentUser,
302330
];
303331
}
304-
if (Session::haveRight(Ticket::$rightname, Ticket::READGROUP)) {
305-
$requestersObserversGroupsQuery = new QuerySubQuery([
306-
'SELECT' => 'tickets_id',
307-
'FROM' => Group_Ticket::getTable(),
308-
'WHERE' => [
309-
'groups_id' => $_SESSION['glpigroups'],
310-
'type' => [CommonITILActor::REQUESTER, CommonITILActor::OBSERVER]
311-
],
312-
]);
313-
if (!isset($dparams_cond_crit['OR']['id'])) {
314-
$dparams_cond_crit['OR'] = [
315-
'id' => $requestersObserversGroupsQuery,
316-
];
317-
} else {
318-
$dparams_cond_crit['OR']['id'] = new QueryUnion([
319-
$dparams_cond_crit['OR']['id'],
320-
$requestersObserversGroupsQuery,
321-
]);
322-
}
323-
}
324332
}
325333
break;
326334

inc/formanswer.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ public function generateTarget(): bool {
804804
$this->deserializeAnswers();
805805

806806
// Generate targets
807-
$generatedTargets = new PluginFormcreatorComposite(new PluginFormcreatorItem_TargetTicket(), new Ticket_Ticket());
807+
$generatedTargets = new PluginFormcreatorComposite(new PluginFormcreatorItem_TargetTicket(), new Ticket_Ticket(), $this);
808808
foreach ($all_targets as $targets) {
809809
foreach ($targets as $targetObject) {
810810
// Check the condition of the target

inc/targetticket.class.php

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,14 +315,14 @@ protected function showCompositeTicketSettings($rand) {
315315
echo '<div style="display: none" id="plugin_formcreator_linked_items' . $rand . '">';
316316
Ticket_Ticket::dropdownLinks('_linktype');
317317
$elements = [
318-
'PluginFormcreatorTargetTicket' => __('An other destination of this form', 'formcreator'),
319-
'Ticket' => __('An existing ticket', 'formcreator'),
318+
PluginFormcreatorTargetTicket::class => __('An other destination of this form', 'formcreator'),
319+
Ticket::class => __('An existing ticket', 'formcreator'),
320+
PluginFormcreatorQuestion::class => __('A ticket from an answer to a question'),
320321
];
321322
Dropdown::showFromArray('_link_itemtype', $elements, [
322-
'on_change' => "plugin_formcreator_updateCompositePeerType($rand)",
323+
'on_change' => "plugin_formcreator_updateCompositePeerType(this)",
323324
'rand' => $rand,
324325
]);
325-
echo Html::scriptBlock("plugin_formcreator_updateCompositePeerType($rand);");
326326
// get already linked items
327327
$targetTicketId = $this->getID();
328328
$rows = $DB->request([
@@ -345,7 +345,7 @@ protected function showCompositeTicketSettings($rand) {
345345
}
346346
}
347347

348-
echo '<span id="plugin_formcreator_link_ticket">';
348+
echo '<span id="plugin_formcreator_link_ticket" style="display: none">';
349349
$linkparam = [
350350
'name' => '_link_tickets_id',
351351
'rand' => $rand,
@@ -370,6 +370,20 @@ protected function showCompositeTicketSettings($rand) {
370370
'condition' => $condition,
371371
]);
372372
echo '</span>';
373+
374+
// dropdown of questions of type GLPI Object / Ticket
375+
echo '<span id="plugin_formcreator_link_question" style="display: none">';
376+
PluginFormcreatorQuestion::dropdownForForm(
377+
$this->getForm()->getID(),
378+
[
379+
'fieldtype' => ['glpiselect'],
380+
'values' => ['LIKE', '%"itemtype":"' . Ticket::class . '"%'],
381+
],
382+
'_link_plugin_formcreator_questions_id',
383+
$this->fields['destination_entity_value']
384+
);
385+
echo '</span>';
386+
373387
echo '</div>';
374388

375389
// show already linked items
@@ -404,6 +418,16 @@ protected function showCompositeTicketSettings($rand) {
404418
echo ' ';
405419
echo $icons;
406420
break;
421+
422+
case PluginFormcreatorQuestion::getType():
423+
echo Ticket_Ticket::getLinkName($row['link']);
424+
echo ' ';
425+
echo $itemtype::getTypeName();
426+
echo ' ';
427+
echo '<span style="font-weight:bold">' . $item->getField('name') . '</span>';
428+
echo ' ';
429+
echo $icons;
430+
break;
407431
}
408432
echo '<br>';
409433
}
@@ -616,6 +640,10 @@ private function saveLinkedItem($input) {
616640
$itemId = (int) $input['_link_targettickets_id'];
617641
break;
618642

643+
case PluginFormcreatorQuestion::getType():
644+
$itemId = (int) $input['_link_plugin_formcreator_questions_id'];
645+
break;
646+
619647
default:
620648
Session::addMessageAfterRedirect(__('Invalid linked item type', 'formcreator'), false, ERROR);
621649
return [];

js/scripts.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,13 +1788,21 @@ function plugin_formceator_showPictogram(id, preview) {
17881788
/**
17891789
* update composite ticket (links between tickets) in target ticket (design mode)
17901790
*/
1791-
function plugin_formcreator_updateCompositePeerType(rand) {
1792-
if ($('#dropdown__link_itemtype' + rand).val() == 'Ticket') {
1793-
$('#plugin_formcreator_link_ticket').show();
1794-
$('#plugin_formcreator_link_target').hide();
1795-
} else {
1796-
$('#plugin_formcreator_link_ticket').hide();
1797-
$('#plugin_formcreator_link_target').show();
1791+
function plugin_formcreator_updateCompositePeerType(type) {
1792+
$('#plugin_formcreator_link_ticket').hide();
1793+
$('#plugin_formcreator_link_target').hide();
1794+
$('#plugin_formcreator_link_question').hide();
1795+
1796+
switch ($(type).val()) {
1797+
case 'Ticket':
1798+
$('#plugin_formcreator_link_ticket').show();
1799+
break;
1800+
case 'PluginFormcreatorTargetTicket':
1801+
$('#plugin_formcreator_link_target').show();
1802+
break;
1803+
case 'PluginFormcreatorQuestion':
1804+
$('#plugin_formcreator_link_question').show();
1805+
break;
17981806
}
17991807
}
18001808

0 commit comments

Comments
 (0)