Skip to content
Snippets Groups Projects
Commit ec56b3f6 authored by Peter Rotich's avatar Peter Rotich
Browse files

task: Add print support

parent 47f94560
Branches
Tags
No related merge requests found
......@@ -89,4 +89,35 @@ class Ticket2PDF extends mPDFWithLocalImages
$this->WriteHtml($html, 0, true, true);
}
}
// Task print
class Task2PDF extends mPDFWithLocalImages {
var $options = array();
var $task = null;
function __construct($task, $options=array()) {
$this->task = $task;
$this->options = $options;
parent::__construct('', $this->options['psize']);
$this->_print();
}
function _print() {
global $thisstaff, $cfg;
if (!($task=$this->task) || !$thisstaff)
return;
ob_start();
include STAFFINC_DIR.'templates/task-print.tmpl.php';
$html = ob_get_clean();
$this->WriteHtml($html, 0, true, true);
}
}
?>
......@@ -155,6 +155,11 @@ class TaskModel extends VerySimpleModel {
return $this->duedate;
}
function getCloseDate() {
// TODO: have true close date
return $this->isClosed() ? $this->updated : '';
}
function isOpen() {
return $this->hasFlag(self::ISOPEN);
}
......@@ -276,6 +281,14 @@ class Task extends TaskModel implements Threadable {
return $assignees ? implode($glue, $assignees):'';
}
function getParticipants() {
$participants = array();
foreach ($this->getThread()->collaborators as $c)
$participants[] = $c->getName();
return $participants ? implode(', ', $participants) : ' ';
}
function getThreadId() {
return $this->thread->getId();
}
......@@ -562,6 +575,27 @@ class Task extends TaskModel implements Threadable {
return $note;
}
function pdfExport($options=array()) {
global $thisstaff;
require_once(INCLUDE_DIR.'class.pdf.php');
if (!isset($options['psize'])) {
if ($_SESSION['PAPER_SIZE'])
$psize = $_SESSION['PAPER_SIZE'];
elseif (!$thisstaff || !($psize = $thisstaff->getDefaultPaperSize()))
$psize = 'Letter';
$options['psize'] = $psize;
}
$pdf = new Task2PDF($this, $options);
$name = 'Task-'.$this->getNumber().'.pdf';
Http::download($name, 'application/pdf', $pdf->Output($name, 'S'));
//Remember what the user selected - for autoselect on the next print.
$_SESSION['PAPER_SIZE'] = $options['psize'];
exit;
}
static function lookupIdByNumber($number) {
$sql = 'SELECT id FROM '.TASK_TABLE
.' WHERE `number`='.db_input($number);
......
<html>
<head>
<style type="text/css">
@page {
header: html_def;
footer: html_def;
margin: 15mm;
margin-top: 30mm;
margin-bottom: 22mm;
}
.logo {
max-width: 220px;
max-height: 71px;
width: auto;
height: auto;
margin: 0;
}
#task_thread .message,
#task_thread .response,
#task_thread .note {
margin-top:10px;
border:1px solid #aaa;
border-bottom:2px solid #aaa;
}
#task_thread .header {
text-align:left;
border-bottom:1px solid #aaa;
padding:3px;
width: 100%;
table-layout: fixed;
}
#task_thread .message .header {
background:#C3D9FF;
}
#task_thread .response .header {
background:#FFE0B3;
}
#task_thread .note .header {
background:#FFE;
}
#task_thread .info {
padding:5px;
background: snow;
border-top: 0.3mm solid #ccc;
}
table.meta-data {
width: 100%;
}
table.custom-data {
margin-top: 10px;
}
table.custom-data th {
width: 25%;
}
table.custom-data th,
table.meta-data th {
text-align: right;
background-color: #ddd;
padding: 3px 8px;
}
table.meta-data td {
padding: 3px 8px;
}
.faded {
color:#666;
}
.pull-left {
float: left;
}
.pull-right {
float: right;
}
.flush-right {
text-align: right;
}
.flush-left {
text-align: left;
}
.ltr {
direction: ltr;
unicode-bidi: embed;
}
.headline {
border-bottom: 2px solid black;
font-weight: bold;
}
div.hr {
border-top: 0.2mm solid #bbb;
margin: 0.5mm 0;
font-size: 0.0001em;
}
.thread-entry, .thread-body {
page-break-inside: avoid;
}
<?php include ROOT_DIR . 'css/thread.css'; ?>
</style>
</head>
<body>
<htmlpageheader name="def" style="display:none">
<?php if ($logo = $cfg->getClientLogo()) { ?>
<img src="cid:<?php echo $logo->getKey(); ?>" class="logo"/>
<?php } else { ?>
<img src="<?php echo INCLUDE_DIR . 'fpdf/print-logo.png'; ?>" class="logo"/>
<?php } ?>
<div class="hr">&nbsp;</div>
<table><tr>
<td class="flush-left"><?php echo (string) $ost->company; ?></td>
<td class="flush-right"><?php echo Format::daydatetime(Misc::gmtime()); ?></td>
</tr></table>
</htmlpageheader>
<htmlpagefooter name="def" style="display:none">
<div class="hr">&nbsp;</div>
<table width="100%"><tr><td class="flush-left">
Task #<?php echo $task->getNumber(); ?> printed by
<?php echo $thisstaff->getUserName(); ?> on
<?php echo Format::daydatetime(Misc::gmtime()); ?>
</td>
<td class="flush-right">
Page {PAGENO}
</td>
</tr></table>
</htmlpagefooter>
<!-- Task metadata -->
<h1>Task #<?php echo $task->getNumber(); ?></h1>
<table class="meta-data" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<th><?php echo __('Status'); ?></th>
<td><?php echo $task->getStatus(); ?></td>
<th><?php echo __('Department'); ?></th>
<td><?php echo $task->getDept(); ?></td>
</tr>
<tr>
<th><?php echo __('Create Date'); ?></th>
<td><?php echo Format::datetime($task->getCreateDate()); ?></td>
<?php
if ($task->isOpen()) { ?>
<th><?php echo __('Assigned To'); ?></th>
<td><?php echo $task->getAssigned(); ?></td>
<?php
} else { ?>
<th><?php echo __('Closed By');?>:</th>
<td>
<?php
if (($staff = $task->getStaff()))
echo Format::htmlchars($staff->getName());
else
echo '<span class="faded">&mdash; '.__('Unknown').' &mdash;</span>';
?>
</td>
<?php
} ?>
</tr>
<tr>
<?php
if ($task->isOpen()) {?>
<th><?php echo __('Due Date'); ?></th>
<td><?php echo Format::datetime($task->getDueDate()); ?></td>
<?php
} else { ?>
<th><?php echo __('Close Date'); ?></th>
<td><?php echo Format::datetime($task->getCloseDate()); ?></td>
<?php
} ?>
<th><?php echo __('Collaborators'); ?></th>
<td><?php echo $task->getParticipants(); ?></td>
</tr>
</tbody>
</table>
<!-- Custom Data -->
<?php
foreach (DynamicFormEntry::forObject($task->getId(),
ObjectModel::OBJECT_TYPE_TASK) as $form) {
// Skip core fields shown earlier on the view
$answers = $form->getAnswers()->exclude(Q::any(array(
'field__flags__hasbit' => DynamicFormField::FLAG_EXT_STORED,
'field__name__in' => array('title')
)));
if (count($answers) == 0)
continue;
?>
<table class="custom-data" cellspacing="0" cellpadding="4" width="100%" border="0">
<tr><td colspan="2" class="headline flush-left"><?php echo $form->getTitle(); ?></th></tr>
<?php foreach($answers as $a) {
if (!($v = $a->display())) continue; ?>
<tr>
<th><?php
echo $a->getField()->get('label');
?>:</th>
<td><?php
echo $v;
?></td>
</tr>
<?php } ?>
</table>
<?php
$idx++;
} ?>
<!-- Task Thread -->
<h2><?php echo $task->getTitle(); ?></h2>
<div id="task_thread">
<?php
$types = array('M', 'R', 'N');
if ($entries = $task->getThreadEntries($types)) {
$entryTypes=array('M'=>'message','R'=>'response', 'N'=>'note');
foreach ($entries as $entry) { ?>
<div class="thread-entry <?php echo $entryTypes[$entry->type]; ?>">
<table class="header" style="width:100%"><tr><td>
<span><?php
echo Format::datetime($entry->created);?></span>
<span style="padding:0 1em" class="faded title"><?php
echo Format::truncate($entry->title, 100); ?></span>
</td>
<td class="flush-right faded title" style="white-space:no-wrap">
<?php
echo Format::htmlchars($entry->getName()); ?></span>
</td>
</tr></table>
<div class="thread-body">
<div><?php echo $entry->getBody()->display('pdf'); ?></div>
<?php
if ($entry->has_attachments
&& ($files = $entry->attachments)) { ?>
<div class="info">
<?php foreach ($files as $A) { ?>
<div>
<span><?php echo Format::htmlchars($A->file->name); ?></span>
<span class="faded">(<?php echo Format::file_size($A->file->size); ?>)</span>
</div>
<?php } ?>
</div>
<?php } ?>
</div>
</div>
<?php }
} ?>
</div>
</body>
</html>
......@@ -174,8 +174,7 @@ if (!$ticket) { ?>
}else { ?>
<tr>
<th><?php echo __('Close Date');?>:</th>
<td><?php echo 0 ?
Format::datetime($task->getCloseDate()) : ''; ?></td>
<td><?php echo Format::datetime($task->getCloseDate()); ?></td>
</tr>
<?php
}
......@@ -208,7 +207,7 @@ if (!$ticket) { ?>
<th width="100"><?php echo __('Closed By');?>:</th>
<td>
<?php
if (0 && ($staff = $task->getStaff()))
if (($staff = $task->getStaff()))
echo Format::htmlchars($staff->getName());
else
echo '<span class="faded">&mdash; '.__('Unknown').' &mdash;</span>';
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment