/**
* @since version 0.90
*
* @param $rand
**/
function showTimeline($rand)
{
global $CFG_GLPI, $DB, $autolink_options;
//get ticket actors
$ticket_users_keys = $this->getTicketActors();
$user = new User();
$group = new Group();
$followup_obj = new TicketFollowup();
$pics_url = $CFG_GLPI['root_doc'] . "/pics/timeline";
$timeline = $this->getTimelineItems();
$autolink_options['strip_protocols'] = false;
//display timeline
echo "<div class='timeline_history'>";
$tmp = array_values($timeline);
$first_item = array_shift($tmp);
// show approbation form on top when ticket is solved
if ($this->fields["status"] == CommonITILObject::SOLVED) {
echo "<div class='approbation_form' id='approbation_form{$rand}'>";
$followup_obj->showApprobationForm($this);
echo "</div>";
}
// show title for timeline
self::showTimelineHeader();
$timeline_index = 0;
foreach ($timeline as $item) {
$options = array('parent' => $this, 'rand' => $rand);
if ($obj = getItemForItemtype($item['type'])) {
$obj->fields = $item['item'];
} else {
$obj = $item;
}
Plugin::doHook('pre_show_item', array('item' => &$obj, 'options' => &$options));
if (is_array($obj)) {
$item_i = $obj['item'];
} else {
$item_i = $obj->fields;
}
$date = "";
if (isset($item_i['date'])) {
$date = $item_i['date'];
}
if (isset($item_i['date_mod'])) {
$date = $item_i['date_mod'];
}
// check if curent item user is assignee or requester
$user_position = 'left';
if (isset($ticket_users_keys[$item_i['users_id']]) && $ticket_users_keys[$item_i['users_id']] == CommonItilActor::ASSIGN || $item['type'] == 'Assign') {
$user_position = 'right';
}
//display solution in middle
if ($timeline_index == 0 && $item['type'] == "Solution" && $this->fields["status"] == CommonITILObject::SOLVED) {
$user_position .= ' middle';
}
echo "<div class='h_item {$user_position}'>";
echo "<div class='h_info'>";
echo "<div class='h_date'>" . Html::convDateTime($date) . "</div>";
if ($item_i['users_id'] !== false) {
echo "<div class='h_user'>";
if (isset($item_i['users_id']) && $item_i['users_id'] != 0) {
$user->getFromDB($item_i['users_id']);
echo "<div class='tooltip_picture_border'>";
echo "<img class='user_picture' alt=\"" . __s('Picture') . "\" src='" . User::getThumbnailURLForPicture($user->fields['picture']) . "'>";
echo "</div>";
echo "<span class='h_user_name'>";
$userdata = getUserName($item_i['users_id'], 2);
echo $user->getLink() . " ";
echo Html::showToolTip($userdata["comment"], array('link' => $userdata['link']));
echo "</span>";
} else {
_e("Requester");
}
echo "</div>";
// h_user
}
echo "</div>";
//h_date
echo "<div class='h_content " . $item['type'] . (isset($item_i['status']) ? " " . $item_i['status'] : "") . "'" . "id='viewitem" . $item['type'] . $item_i['id'] . $rand . "'>";
if (isset($item_i['can_edit']) && $item_i['can_edit']) {
echo "<div class='edit_item_content'></div>";
echo "<span class='cancel_edit_item_content'></span>";
}
echo "<div class='displayed_content'>";
if (!in_array($item['type'], array('Document_Item', 'Assign')) && $item_i['can_edit']) {
echo "<span class='edit_item' ";
echo "onclick='javascript:viewEditSubitem" . $this->fields['id'] . "{$rand}(event, \"" . $item['type'] . "\", " . $item_i['id'] . ", this, \"viewitem" . $item['type'] . $item_i['id'] . $rand . "\")'";
echo "></span>";
}
if (isset($item_i['requesttypes_id']) && file_exists("{$pics_url}/" . $item_i['requesttypes_id'] . ".png")) {
echo "<img src='{$pics_url}/" . $item_i['requesttypes_id'] . ".png' title='' class='h_requesttype' />";
}
if (isset($item_i['content'])) {
$content = $item_i['content'];
$content = autolink($content, 40);
//$content = nl2br($content);
$long_text = "";
if (substr_count($content, "<br") > 30 || strlen($content) > 2000) {
$long_text = "long_text";
}
echo "<div class='item_content {$long_text}'>";
echo "<p>";
if (isset($item_i['state'])) {
$onClick = "onclick='change_task_state(" . $item_i['id'] . ", this)'";
if (!$item_i['can_edit']) {
$onClick = "style='cursor: not-allowed;'";
}
echo "<span class='state state_" . $item_i['state'] . "'\n {$onClick}\n title='" . Planning::getState($item_i['state']) . "'>";
echo "</span>";
}
echo $content;
echo "</p>";
if (!empty($long_text)) {
echo "<p class='read_more'>";
echo "<a class='read_more_button'>.....</a>";
echo "</p>";
}
echo "</div>";
}
echo "<div class='b_right'>";
if (isset($item_i['solutiontypes_id']) && !empty($item_i['solutiontypes_id'])) {
echo Dropdown::getDropdownName("glpi_solutiontypes", $item_i['solutiontypes_id']) . "<br>";
}
if (isset($item_i['taskcategories_id']) && !empty($item_i['taskcategories_id'])) {
echo Dropdown::getDropdownName("glpi_taskcategories", $item_i['taskcategories_id']) . "<br>";
}
if (isset($item_i['requesttypes_id']) && !empty($item_i['requesttypes_id'])) {
echo Dropdown::getDropdownName("glpi_requesttypes", $item_i['requesttypes_id']) . "<br>";
}
if (isset($item_i['actiontime']) && !empty($item_i['actiontime'])) {
echo "<span class='actiontime'>";
echo Html::timestampToString($item_i['actiontime'], false);
echo "</span>";
}
if (isset($item_i['begin'])) {
echo "<span class='planification'>";
echo Html::convDateTime($item_i["begin"]);
echo " ⇒ ";
echo Html::convDateTime($item_i["end"]);
echo "</span>";
}
if (isset($item_i['users_id_tech']) && $item_i['users_id_tech'] > 0) {
echo "<div class='users_id_tech' id='users_id_tech_" . $item_i['users_id_tech'] . "'>";
$user->getFromDB($item_i['users_id_tech']);
echo Html::image($CFG_GLPI['root_doc'] . "/pics/user.png") . " ";
$userdata = getUserName($item_i['users_id_tech'], 2);
echo $user->getLink() . " ";
echo Html::showToolTip($userdata["comment"], array('link' => $userdata['link']));
echo "</div>";
}
if (isset($item_i['groups_id_tech']) && $item_i['groups_id_tech'] > 0) {
echo "<div class='groups_id_tech'>";
$group->getFromDB($item_i['groups_id_tech']);
echo Html::image($CFG_GLPI['root_doc'] . "/pics/group.png") . " ";
echo $group->getLink() . " ";
echo Html::showToolTip($group->getComments(), array('link' => $group->getLinkURL()));
echo "</div>";
}
// show "is_private" icon
if (isset($item_i['is_private']) && $item_i['is_private']) {
echo "<div class='private'>" . __('Private') . "</div>";
}
echo "</div>";
// b_right
if ($item['type'] == 'Document_Item') {
$filename = $item_i['filename'];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
echo "<img src='";
if (empty($filename)) {
$filename = $item_i['name'];
}
if (file_exists(GLPI_ROOT . "/pics/icones/{$ext}-dist.png")) {
echo $CFG_GLPI['root_doc'] . "/pics/icones/{$ext}-dist.png";
} else {
echo "{$pics_url}/file.png";
}
echo "' title='file' /> ";
echo "<a href='" . $CFG_GLPI['root_doc'] . "/front/document.send.php?docid=" . $item_i['id'] . "&tickets_id=" . $this->getID() . "' target='_blank'>{$filename}";
if (in_array($ext, array('jpg', 'jpeg', 'png', 'bmp'))) {
echo "<div class='timeline_img_preview'>";
echo "<img src='" . $CFG_GLPI['root_doc'] . "/front/document.send.php?docid=" . $item_i['id'] . "&tickets_id=" . $this->getID() . "'/>";
echo "</div>";
}
echo "</a>";
if (!empty($item_i['mime'])) {
echo " (" . $item_i['mime'] . ")";
}
echo "<a href='" . $CFG_GLPI['root_doc'] . "/front/document.form.php?id=" . $item_i['id'] . "' class='edit_document' title='" . _sx("button", "Update") . "'>";
echo "<img src='{$pics_url}/edit.png' /></a>";
echo "<a href='" . $CFG_GLPI['root_doc'] . "/front/ticket.form.php?delete_document&documents_id=" . $item_i['id'] . "&tickets_id=" . $this->getID() . "' class='delete_document' title='" . _sx("button", "Delete permanently") . "'>";
echo "<img src='{$pics_url}/delete.png' /></a>";
}
echo "</div>";
// displayed_content
echo "</div>";
//end h_content
echo "</div>";
//end h_info
$timeline_index++;
Plugin::doHook('post_show_item', array('item' => $obj, 'options' => $options));
}
// end foreach timeline
echo "<div class='break'></div>";
// recall ticket content (not needed in classic and splitted layout)
if (!CommonGLPI::isLayoutWithMain()) {
echo "<div class='h_item middle'>";
echo "<div class='h_info'>";
echo "<div class='h_date'>" . Html::convDateTime($this->fields['date']) . "</div>";
echo "<div class='h_user'>";
$dem = '0';
foreach ($DB->request("glpi_tickets_users", "`tickets_id` = " . $this->fields['id'] . " AND `type` = 1") as $req) {
$dem = $req['users_id'];
}
if ((!isset($item_i['users_id_recipient']) || $item_i['users_id_recipient'] == 0) && $dem == 0) {
_e("Requester");
} else {
if (isset($item_i['users_id_recipient']) && $item_i['users_id_recipient'] != 0) {
$user->getFromDB($this->fields['users_id_recipient']);
} else {
if ($dem > 0) {
$requester = new User();
if ($requester->getFromDB($dem)) {
$user = $requester;
}
}
}
echo "<div class='tooltip_picture_border'>";
$picture = "";
if (isset($user->fields['picture'])) {
$picture = $user->fields['picture'];
}
echo "<img class='user_picture' alt=\"" . __s('Picture') . "\" src='" . User::getThumbnailURLForPicture($picture) . "'>";
echo "</div>";
echo $user->getLink();
}
echo "</div>";
// h_user
echo "</div>";
//h_info
echo "<div class='h_content TicketContent'>";
echo "<div class='b_right'>" . __("Ticket recall") . "</div>";
echo "<div class='ticket_title'>";
echo html_entity_decode($this->fields['name']);
echo "</div>";
echo "<div class='ticket_description'>";
echo $this->setSimpleTextContent($this->fields['content']);
echo "</div>";
echo "</div>";
// h_content TicketContent
echo "</div>";
// h_item middle
echo "<div class='break'></div>";
}
// end timeline
echo "</div>";
// h_item $user_position
echo "<script type='text/javascript'>read_more();</script>";
}