diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index b965319510c72c7b472f4d4414cef8b12deca0c9..0adc1abcb6bd3347ad7ba425e7de588e1a1fd908 100644 --- a/include/ajax.tickets.php +++ b/include/ajax.tickets.php @@ -335,123 +335,8 @@ class TicketsAjaxAPI extends AjaxController { if(!$thisstaff || !($ticket=Ticket::lookup($tid)) || !$ticket->checkStaffAccess($thisstaff)) Http::response(404, 'No such ticket'); - $staff=$ticket->getStaff(); - $lock=$ticket->getLock(); - $error=$msg=$warn=null; - - if($lock && $lock->getStaffId()==$thisstaff->getId()) - $warn.=' <span class="Icon lockedTicket">Ticket is locked by '.$lock->getStaffName().'</span>'; - elseif($ticket->isOverdue()) - $warn.=' <span class="Icon overdueTicket">Marked overdue!</span>'; - ob_start(); - echo sprintf( - '<div style="width:500px; padding: 2px 2px 0 5px;"> - <h2>%s</h2><br>',Format::htmlchars($ticket->getSubject())); - - if($error) - echo sprintf('<div id="msg_error">%s</div>',$error); - elseif($msg) - echo sprintf('<div id="msg_notice">%s</div>',$msg); - elseif($warn) - echo sprintf('<div id="msg_warning">%s</div>',$warn); - - echo '<table border="0" cellspacing="" cellpadding="1" width="100%" class="ticket_info">'; - - $ticket_state=sprintf('<span>%s</span>',ucfirst($ticket->getStatus())); - if($ticket->isOpen()) { - if($ticket->isOverdue()) - $ticket_state.=' — <span>Overdue</span>'; - else - $ticket_state.=sprintf(' — <span>%s</span>',$ticket->getPriority()); - } - - echo sprintf(' - <tr> - <th width="100">Ticket State:</th> - <td>%s</td> - </tr> - <tr> - <th>Create Date:</th> - <td>%s</td> - </tr>',$ticket_state, - Format::db_datetime($ticket->getCreateDate())); - if($ticket->isClosed()) { - echo sprintf(' - <tr> - <th>Close Date:</th> - <td>%s <span class="faded">by %s</span></td> - </tr>', - Format::db_datetime($ticket->getCloseDate()), - ($staff?$staff->getName():'staff') - ); - } elseif($ticket->getEstDueDate()) { - echo sprintf(' - <tr> - <th>Due Date:</th> - <td>%s</td> - </tr>', - Format::db_datetime($ticket->getEstDueDate())); - } - echo '</table>'; - - - echo '<hr> - <table border="0" cellspacing="" cellpadding="1" width="100%" class="ticket_info">'; - if($ticket->isOpen()) { - echo sprintf(' - <tr> - <th width="100">Assigned To:</th> - <td>%s</td> - </tr>',$ticket->isAssigned()?implode('/', $ticket->getAssignees()):' <span class="faded">— Unassigned —</span>'); - } - echo sprintf( - ' <tr> - <th width="100">Department:</th> - <td>%s</td> - </tr> - <tr> - <th>Help Topic:</th> - <td>%s</td> - </tr> - <tr> - <th>From:</th> - <td>%s <span class="faded">%s</span></td> - </tr>', - Format::htmlchars($ticket->getDeptName()), - Format::htmlchars($ticket->getHelpTopic()), - Format::htmlchars($ticket->getName()), - $ticket->getEmail()); - echo ' - </table>'; - - $options = array(); - $options[]=array('action'=>'Thread ('.$ticket->getThreadCount().')','url'=>"tickets.php?id=$tid"); - if($ticket->getNumNotes()) - $options[]=array('action'=>'Notes ('.$ticket->getNumNotes().')','url'=>"tickets.php?id=$tid#notes"); - - if($ticket->isOpen()) - $options[]=array('action'=>'Reply','url'=>"tickets.php?id=$tid#reply"); - - if($thisstaff->canAssignTickets()) - $options[]=array('action'=>($ticket->isAssigned()?'Reassign':'Assign'),'url'=>"tickets.php?id=$tid#assign"); - - if($thisstaff->canTransferTickets()) - $options[]=array('action'=>'Transfer','url'=>"tickets.php?id=$tid#transfer"); - - $options[]=array('action'=>'Post Note','url'=>"tickets.php?id=$tid#note"); - - if($thisstaff->canEditTickets()) - $options[]=array('action'=>'Edit Ticket','url'=>"tickets.php?id=$tid&a=edit"); - - if($options) { - echo '<ul class="tip_menu">'; - foreach($options as $option) - echo sprintf('<li><a href="%s">%s</a></li>',$option['url'],$option['action']); - echo '</ul>'; - } - - echo '</div>'; + include STAFFINC_DIR . 'templates/ticket-preview.tmpl.php'; $resp = ob_get_contents(); ob_end_clean(); @@ -578,9 +463,6 @@ class TicketsAjaxAPI extends AjaxController { || !$ticket->checkStaffAccess($thisstaff)) Http::response(404, 'No such ticket'); - if (!$ticket->getCollaborators()) - Http::response(404, 'No such ticket'); - ob_start(); include STAFFINC_DIR . 'templates/collaborators-preview.tmpl.php'; $resp = ob_get_contents(); diff --git a/include/staff/templates/collaborators-preview.tmpl.php b/include/staff/templates/collaborators-preview.tmpl.php index f41150b7b6f29e8786802b497bbaa71f603deb8a..bd9a3b6d0d25199c94664b86566da1ca8eec6a1d 100644 --- a/include/staff/templates/collaborators-preview.tmpl.php +++ b/include/staff/templates/collaborators-preview.tmpl.php @@ -12,17 +12,33 @@ if (($users=$ticket->getCollaborators())) {?> $user->getEmail()); } } else { - echo "Bro, not sure how you got here!"; + echo "<strong>Ticket doesn't have collaborators.</strong>"; }?> </table> <?php $options = array(); -//TODO: Add options to manage collaborators + +$options[] = sprintf( + '<a class="collaborators" id="managecollab" href="#tickets/%d/collaborators">%s</a>', + $ticket->getId(), + $ticket->getNumCollaborators() + ? 'Manage Collaborators' : 'Add Collaborator' + ); + if ($options) { echo '<ul class="tip_menu">'; foreach($options as $option) - echo sprintf('<li><a href="%s">%s</a></li>', $option['url'], $option['action']); + echo sprintf('<li>%s</li>', $option); echo '</ul>'; } ?> </div> +<script type="text/javascript"> +$(function() { + $(document).on('click', 'a#managecollab', function (e) { + e.preventDefault(); + $('.tip_box').remove(); + return false; + }); +}); +</script> diff --git a/include/staff/templates/collaborators.tmpl.php b/include/staff/templates/collaborators.tmpl.php index 20e5192ca74e2b3a372f4b9eb6981def33cbd792..2c0de2a2ed82404b4ea3f0dbf39d9f7a79321df3 100644 --- a/include/staff/templates/collaborators.tmpl.php +++ b/include/staff/templates/collaborators.tmpl.php @@ -69,3 +69,57 @@ if ($_POST && $ticket && $ticket->getNumCollaborators()) { <?php } ?> + +<script type="text/javascript"> +$(function() { + + $(document).on('click', 'form.collaborators a#addcollaborator', function (e) { + e.preventDefault(); + $('div#manage_collaborators').hide(); + $('div#add_collaborator').fadeIn(); + return false; + }); + + $(document).on('click', 'form.collaborators a.remove', function (e) { + e.preventDefault(); + var fObj = $(this).closest('form'); + $('input'+$(this).attr('href')) + .val($(this).attr('href').substr(2)) + .trigger('change'); + $(this).closest('tr').addClass('strike'); + + return false; + }); + + $(document).on('change', 'form.collaborators input:checkbox, input[name="del[]"]', function (e) { + var fObj = $(this).closest('form'); + $('div#savewarning', fObj).fadeIn(); + $('input:submit', fObj).css('color', 'red'); + }); + + $(document).on('click', 'form.collaborators input:reset', function(e) { + var fObj = $(this).closest('form'); + fObj.find('input[name="del[]"]').val(''); + fObj.find('tr').removeClass('strike'); + $('div#savewarning', fObj).hide(); + $('input:submit', fObj).removeAttr('style'); + }); + + $(document).on('click', 'form.collaborators input.cancel', function (e) { + e.preventDefault(); + var $elem = $(this); + + if($elem.attr('data-href')) { + var href = $elem.data('href').substr(1); + $('.dialog.collaborators .body').load('ajax.php/'+href, function () { + }); + } else { + + $('div#manage_collaborators').show(); + $('div#add_collaborator').hide(); + } + return false; + }); + +}); +</script> diff --git a/include/staff/templates/ticket-preview.tmpl.php b/include/staff/templates/ticket-preview.tmpl.php new file mode 100644 index 0000000000000000000000000000000000000000..82c3e392f80c91441330a5c9befee4e50e870752 --- /dev/null +++ b/include/staff/templates/ticket-preview.tmpl.php @@ -0,0 +1,172 @@ +<?php +/* + * Ticket Preview popup template + * + */ + +$staff=$ticket->getStaff(); +$lock=$ticket->getLock(); +$error=$msg=$warn=null; + +if($lock && $lock->getStaffId()==$thisstaff->getId()) + $warn.=' <span class="Icon lockedTicket">Ticket is locked by '.$lock->getStaffName().'</span>'; +elseif($ticket->isOverdue()) + $warn.=' <span class="Icon overdueTicket">Marked overdue!</span>'; + +echo sprintf( + '<div style="width:600px; padding: 2px 2px 0 5px;" id="t%s"> + <h2>Ticket #%s: %s</h2><br>', + $ticket->getNumber(), + $ticket->getNumber(), + Format::htmlchars($ticket->getSubject())); + +if($error) + echo sprintf('<div id="msg_error">%s</div>',$error); +elseif($msg) + echo sprintf('<div id="msg_notice">%s</div>',$msg); +elseif($warn) + echo sprintf('<div id="msg_warning">%s</div>',$warn); + +echo '<ul class="tabs">'; + +echo ' + <li><a id="preview_tab" href="#preview" class="active" + ><i class="icon-list-alt"></i> Ticket Summary</a></li>'; +if ($ticket->getNumCollaborators()) { +echo sprintf(' + <li><a id="collab_tab" href="#collab" + ><i class="icon-fixed-width icon-group + faded"></i> Collaborators (%d)</a></li>', + $ticket->getNumCollaborators()); +} +echo '</ul>'; + +echo '<div class="tab_content" id="preview">'; +echo '<table border="0" cellspacing="" cellpadding="1" width="100%" class="ticket_info">'; + +$ticket_state=sprintf('<span>%s</span>',ucfirst($ticket->getStatus())); +if($ticket->isOpen()) { + if($ticket->isOverdue()) + $ticket_state.=' — <span>Overdue</span>'; + else + $ticket_state.=sprintf(' — <span>%s</span>',$ticket->getPriority()); +} + +echo sprintf(' + <tr> + <th width="100">Ticket State:</th> + <td>%s</td> + </tr> + <tr> + <th>Create Date:</th> + <td>%s</td> + </tr>',$ticket_state, + Format::db_datetime($ticket->getCreateDate())); +if($ticket->isClosed()) { + echo sprintf(' + <tr> + <th>Close Date:</th> + <td>%s <span class="faded">by %s</span></td> + </tr>', + Format::db_datetime($ticket->getCloseDate()), + ($staff?$staff->getName():'staff') + ); +} elseif($ticket->getEstDueDate()) { + echo sprintf(' + <tr> + <th>Due Date:</th> + <td>%s</td> + </tr>', + Format::db_datetime($ticket->getEstDueDate())); +} +echo '</table>'; + + +echo '<hr> + <table border="0" cellspacing="" cellpadding="1" width="100%" class="ticket_info">'; +if($ticket->isOpen()) { + echo sprintf(' + <tr> + <th width="100">Assigned To:</th> + <td>%s</td> + </tr>',$ticket->isAssigned()?implode('/', $ticket->getAssignees()):' <span class="faded">— Unassigned —</span>'); +} +echo sprintf( + ' + <tr> + <th>From:</th> + <td>%s <span class="faded">%s</span></td> + </tr> + <tr> + <th width="100">Department:</th> + <td>%s</td> + </tr> + <tr> + <th>Help Topic:</th> + <td>%s</td> + </tr>', + Format::htmlchars($ticket->getName()), + $ticket->getEmail(), + Format::htmlchars($ticket->getDeptName()), + Format::htmlchars($ticket->getHelpTopic())); + +echo ' + </table>'; +echo '</div>'; // ticket preview content. +?> +<div class="tab_content" id="collab" style="display:none;"> + <table border="0" cellspacing="" cellpadding="1"> + <colgroup><col style="min-width: 250px;"></col></colgroup> + <?php + if (($users=$ticket->getCollaborators())) {?> + <?php + foreach($users as $user) { + echo sprintf('<tr><td %s><i class="icon-%s"></i> %s <em><%s></em></td></tr>', + ($user->isActive()? '' : 'class="faded"'), + ($user->isActive()? 'comments' : 'comment-alt'), + $user->getName(), + $user->getEmail()); + } + } else { + echo "Ticket doesn't have collaborators."; + }?> + </table> + <br> + <?php + echo sprintf('<span><a class="collaborators" + href="#tickets/%d/collaborators">%s</a></span>', + $ticket->getId(), + $ticket->getNumCollaborators() + ? 'Manage Collaborators' : 'Add Collaborator' + ); + ?> +</div> +<?php +$options = array(); +$options[]=array('action'=>'Thread ('.$ticket->getThreadCount().')','url'=>"tickets.php?id=$tid"); +if($ticket->getNumNotes()) + $options[]=array('action'=>'Notes ('.$ticket->getNumNotes().')','url'=>"tickets.php?id=$tid#notes"); + +if($ticket->isOpen()) + $options[]=array('action'=>'Reply','url'=>"tickets.php?id=$tid#reply"); + +if($thisstaff->canAssignTickets()) + $options[]=array('action'=>($ticket->isAssigned()?'Reassign':'Assign'),'url'=>"tickets.php?id=$tid#assign"); + +if($thisstaff->canTransferTickets()) + $options[]=array('action'=>'Transfer','url'=>"tickets.php?id=$tid#transfer"); + +$options[]=array('action'=>'Post Note','url'=>"tickets.php?id=$tid#note"); + +if($thisstaff->canEditTickets()) + $options[]=array('action'=>'Edit Ticket','url'=>"tickets.php?id=$tid&a=edit"); + +if($options) { + echo '<ul class="tip_menu">'; + foreach($options as $option) + echo sprintf('<li><a href="%s">%s</a></li>',$option['url'],$option['action']); + echo '</ul>'; +} + +echo '</div>'; +?> diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php index 4829fd6676b8c711a121fb1fb053e99e0ee7c2fa..7449197a12b02c09961373d12703935d3d53d16b 100644 --- a/include/staff/ticket-view.inc.php +++ b/include/staff/ticket-view.inc.php @@ -459,7 +459,7 @@ $tcount+= $ticket->getNumNotes(); $ticket->getNumActiveCollaborators(), $ticket->getNumCollaborators()); - echo sprintf('<span><a class="collaborators" id="manageCollab" + echo sprintf('<span><a class="collaborators preview" href="#tickets/%d/collaborators"><span id="recipients">%s</span></a></span>', $ticket->getId(), $recipients); diff --git a/scp/css/scp.css b/scp/css/scp.css index d3eaceb6637dec2e8e7071a371c6c74635cee883..81c0e176375bed89111cf0c39dc9db5752c71be0 100644 --- a/scp/css/scp.css +++ b/scp/css/scp.css @@ -842,23 +842,29 @@ h2 .reload { padding:0 10px; } -#response_options ul.tabs { - padding:4px 0 0 190px; +ul.tabs { + padding:4px 0 0 20px; margin:0; + margin-bottom: 5px; text-align:center; height:29px; border-bottom:1px solid #aaa; background:#eef3f8; } -#response_options ul.tabs li { +#response_options ul.tabs { + padding-left:190px; +} + + +ul.tabs li { margin:0; padding:0; display:inline; list-style:none; } -#response_options ul.tabs li a { +ul.tabs li a { width:130px; font-weight:bold; padding:5px; @@ -882,7 +888,7 @@ h2 .reload { background-repeat:no-repeat; } -#response_options ul.tabs li a.active { +ul.tabs li a.active { height:18px; color:#184E81; background-color:#f9f9f9; @@ -946,7 +952,7 @@ h2 .reload { display:block; height:30px; position:absolute; - z-index:1000; + z-index:3; } .tip_arrow { @@ -955,7 +961,7 @@ h2 .reload { top:5px; left:-12px; width:12px; - z-index:700; + z-index:4; } .tip_box.right .tip_arrow { @@ -986,7 +992,7 @@ h2 .reload { -moz-box-shadow: 3px 3px 3px #666; -webkit-box-shadow: 3px 3px 3px #666; box-shadow: 3px 3px 3px #666; - z-index:500; + z-index:3; position:absolute; top:0; left:-1px; @@ -1256,7 +1262,7 @@ time { background:#f8f8f8; border:2px solid #2a67ac; display:none; - z-index:5; + z-index:6; box-shadow: 0 5px 60px #001; border-radius: 5px; max-height: 72%; @@ -1264,7 +1270,7 @@ time { } .redactor_air { - z-index: 6 !important; + z-index: 7 !important; } .dialog#advanced-search { @@ -1479,7 +1485,7 @@ ul.progress li.no small {color:red;} width: 100%; height: 100%; background: #000; - z-index: 1; + z-index: 5; -webkit-transform: translate3d(0,0,0); } diff --git a/scp/js/scp.js b/scp/js/scp.js index 30458bcaa9a76c51b02ae1fdc35ae014519a41ef..6e2ae6ea829afbe03f15d9722a5264a5213b7074 100644 --- a/scp/js/scp.js +++ b/scp/js/scp.js @@ -548,6 +548,31 @@ $(document).ready(function(){ }); } }); + + //Tabs + $(document).on('click.tab', 'ul.tabs li a', function(e) { + e.preventDefault(); + if ($('.tab_content'+$(this).attr('href')).length) { + $('ul.tabs li a').removeClass('active'); + $(this).addClass('active'); + $('.tab_content').hide(); + $('.tab_content'+$(this).attr('href')).show(); + } + }); + + //Collaborators + $(document).on('click', 'a.collaborator, a.collaborators', function(e) { + e.preventDefault(); + var url = 'ajax.php/'+$(this).attr('href').substr(1); + $.dialog(url, 201, function (resp) { + $('input#emailcollab').show(); + $('#recipients').text(resp); + $('.tip_box').remove(); + }, { + onshow: function() { $('#user-search').focus(); } + }); + return false; + }); }); // NOTE: getConfig should be global diff --git a/scp/js/ticket.js b/scp/js/ticket.js index 66d5881dc7f4893043f76f37e28b57457b11ece1..aa808746c9b84e305eefbfb8db04d04cc78496b3 100644 --- a/scp/js/ticket.js +++ b/scp/js/ticket.js @@ -363,69 +363,6 @@ jQuery(function($) { return false; }); - //Collaborators - $(document).on('click', 'a.collaborator, a.collaborators', function(e) { - e.preventDefault(); - var url = 'ajax.php/'+$(this).attr('href').substr(1); - $.dialog(url, 201, function (resp) { - $('input#emailcollab').show(); - $('#recipients').text(resp); - }, { - onshow: function() { $('#user-search').focus(); } - }); -; - return false; - }); - - $(document).on('click', 'form.collaborators a#addcollaborator', function (e) { - e.preventDefault(); - $('div#manage_collaborators').hide(); - $('div#add_collaborator').fadeIn(); - return false; - }); - - $(document).on('click', 'form.collaborators a.remove', function (e) { - e.preventDefault(); - var fObj = $(this).closest('form'); - $('input'+$(this).attr('href')) - .val($(this).attr('href').substr(2)) - .trigger('change'); - $(this).closest('tr').addClass('strike'); - - return false; - }); - - $(document).on('change', 'form.collaborators input:checkbox, input[name="del[]"]', function (e) { - var fObj = $(this).closest('form'); - $('div#savewarning', fObj).fadeIn(); - $('input:submit', fObj).css('color', 'red'); - }); - - $(document).on('click', 'form.collaborators input:reset', function(e) { - var fObj = $(this).closest('form'); - fObj.find('input[name="del[]"]').val(''); - fObj.find('tr').removeClass('strike'); - $('div#savewarning', fObj).hide(); - $('input:submit', fObj).removeAttr('style'); - }); - - - $(document).on('click', 'form.collaborators input.cancel', function (e) { - e.preventDefault(); - var $elem = $(this); - - if($elem.attr('data-href')) { - var href = $elem.data('href').substr(1); - $('.dialog.collaborators .body').load('ajax.php/'+href, function () { - }); - } else { - - $('div#manage_collaborators').show(); - $('div#add_collaborator').hide(); - } - return false; - }); - $(document).on('change', 'form#reply select#emailreply', function(e) { var $cc = $('form#reply tbody#cc_sec'); if($(this).val() == 0) diff --git a/scp/js/tips.js b/scp/js/tips.js index db94a1acb362cb5b64e4b56178a5d6d780e3b00a..fb7ccbf93e693b2f5b2df6a55716e49a9406a3fa 100644 --- a/scp/js/tips.js +++ b/scp/js/tips.js @@ -161,7 +161,7 @@ jQuery(function() { }); - $('a#manageCollab').live('mouseover', function(e) { + $('a.collaborators.preview').live('mouseover', function(e) { e.preventDefault(); var elem = $(this); @@ -183,7 +183,7 @@ jQuery(function() { //Ticket preview - $('.ticketPreview').live('mouseover', function(e) { + $('.ticketPreview').live('mouseover click', function(e) { e.preventDefault(); var elem = $(this); @@ -192,18 +192,19 @@ jQuery(function() { var id='t'+vars[1]; var xoffset = 80; - - elem.data('id',id); - elem.data('timer',0); - if($('.' + id).length == 0) { + elem.data('timer', 0); + if(!elem.data('id')) { + elem.data('id', id); if(e.type=='mouseover') { /* wait about 1 sec - before showing the tip - mouseout kills the timeout*/ elem.data('timer',setTimeout(function() { showtip(url,elem,xoffset);},750)) }else{ + clearTimeout(elem.data('timer')); showtip(url,elem,xoffset); } } }).live('mouseout', function(e) { + $(this).data('id', 0); clearTimeout($(this).data('timer')); });