diff --git a/include/class.config.php b/include/class.config.php index 09d58c8ec867e03b3d58f7fdd80bbe5cfbe77e49..d0a735e7db0f94cfcb231b053218af27f9a4f5e3 100644 --- a/include/class.config.php +++ b/include/class.config.php @@ -914,13 +914,6 @@ class OsticketConfig extends Config { return $this->get('auto_claim_tickets'); } - // XXX: Drop these!! - function showAssignedTickets() { - return ($this->get('show_assigned_tickets')); - } - function showAnsweredTickets() { - return ($this->get('show_answered_tickets')); - } function getDefaultTicketQueueId() { return $this->get('default_ticket_queue'); } diff --git a/include/class.organization.php b/include/class.organization.php index b0b811f4f5795b9fed06b9a52eeae80b809e5d6b..f164e663c9981f117e804e0e0b4fe9e6588f2aca 100644 --- a/include/class.organization.php +++ b/include/class.organization.php @@ -350,6 +350,7 @@ implements TemplateVariable, Searchable { } static function getSearchableFields() { + $base = array(); $uform = OrganizationForm::objects()->one(); $base = array(); foreach ($uform->getFields() as $F) { diff --git a/include/class.queue.php b/include/class.queue.php index e63dbf9e779afa2582c42346659e43a826b432de..64ac81cfb2bc7404536bde80bc22f3ff83bdba0d 100644 --- a/include/class.queue.php +++ b/include/class.queue.php @@ -880,7 +880,7 @@ class CustomQueue extends VerySimpleModel { // Add new columns foreach ($new as $info) { $glue = new QueueColumnGlue(array( - 'column_id' => $info['column_id'], + 'column_id' => $info['column_id'], 'sort' => array_search($info['column_id'], $order), 'heading' => $info['heading'], 'width' => $info['width'] ?: 100, diff --git a/include/class.search.php b/include/class.search.php index f95c5cb1bf297217a8f3f99c2de1c9f18676b693..ffdf9a46ef2409d31b883cfa5006f7f194cd176c 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -680,7 +680,7 @@ class SavedSearch extends CustomQueue { class AdhocSearch extends SavedSearch { function getName() { - return $this->describeCriteria(); + return $this->title ?: $this->describeCriteria(); } } diff --git a/include/class.staff.php b/include/class.staff.php index 9d160e64797e14b15972d178bed17b5b5dc23887..c2c1b67670ca05575a370763fa134ea43ad14522 100644 --- a/include/class.staff.php +++ b/include/class.staff.php @@ -88,6 +88,7 @@ implements AuthenticatedUser, EmailContact, TemplateVariable, Searchable { 'default_from_name' => '', 'datetime_format' => '', 'thread_view_order' => '', + 'default_ticket_queue_id' => 0, )); $this->_config = $_config->getInfo(); } @@ -323,6 +324,10 @@ implements AuthenticatedUser, EmailContact, TemplateVariable, Searchable { return $this->signature; } + function getDefaultTicketQueueId() { + return $this->default_ticket_queue_id; + } + function getDefaultSignatureType() { return $this->default_signature_type; } @@ -525,10 +530,6 @@ implements AuthenticatedUser, EmailContact, TemplateVariable, Searchable { return ($deptId && in_array($deptId, $this->getDepts()) && !$this->isAccessLimited()); } - function showAssignedTickets() { - return $this->show_assigned_tickets; - } - function getTeams() { if (!isset($this->_teams)) { @@ -673,9 +674,6 @@ implements AuthenticatedUser, EmailContact, TemplateVariable, Searchable { $this->signature = Format::sanitize($vars['signature']); $this->timezone = $vars['timezone']; $this->locale = $vars['locale']; - if (!$cfg->showAssignedTickets()) - // Allow local unsetting if unset globally - $this->show_assigned_tickets = isset($vars['show_assigned_tickets']) ? 1 : 0; $this->max_page_size = $vars['max_page_size']; $this->auto_refresh_rate = $vars['auto_refresh_rate']; $this->default_signature_type = $vars['default_signature_type']; @@ -698,6 +696,7 @@ implements AuthenticatedUser, EmailContact, TemplateVariable, Searchable { 'datetime_format' => $vars['datetime_format'], 'default_from_name' => $vars['default_from_name'], 'thread_view_order' => $vars['thread_view_order'], + 'default_ticket_queue_id' => $vars['default_ticket_queue_id'], ) ); $this->_config = $_config->getInfo(); diff --git a/include/class.ticket.php b/include/class.ticket.php index 570b1eeafc263f76436363edb959b3b7369894aa..4d9251c66b001cf8e9d2edc314158b026092c83b 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -2920,8 +2920,6 @@ implements RestrictedAccess, Threadable, Searchable { ->values('status__state', 'isanswered', 'isoverdue','staff_id', 'team_id'); $stats = array(); - $hideassigned = ($cfg && !$cfg->showAssignedTickets()) && !$staff->showAssignedTickets(); - $showanswered = $cfg->showAnsweredTickets(); $id = $staff->getId(); foreach ($blocks as $S) { if ($showanswered || !$S['isanswered']) { diff --git a/include/class.user.php b/include/class.user.php index a24efed69de28ec41cb2b289edf3be086c086264..e5f898d7d0050d573f0f41148377187ddbf6bb78 100644 --- a/include/class.user.php +++ b/include/class.user.php @@ -367,6 +367,7 @@ implements TemplateVariable, Searchable { } static function getSearchableFields() { + $base = array(); $uform = UserForm::getUserForm(); $base = array(); foreach ($uform->getFields() as $F) { diff --git a/include/i18n/en_US/queue.yaml b/include/i18n/en_US/queue.yaml index 901de736209dcf18725836fd72a4ba67eae11b01..0d572c5c7d3ea24779aceaa3b6fc3ae07312ff2b 100644 --- a/include/i18n/en_US/queue.yaml +++ b/include/i18n/en_US/queue.yaml @@ -1,14 +1,14 @@ # # Basic queues for the initial ticket system. Queues installed for # - Open / All -# - Open / Answered -# - Open / Unanswered # - Open / Unassigned -# - Open / Mine +# - Open / Overdue +# - Answered / All +# - My Tickets / All # - Closed / All # # Fields: -# id: +# id: # parent_id: # flags: # 0x01: FLAG_PUBLIC @@ -31,30 +31,36 @@ title: Open flags: 0x03 sort: 1 - root: T + root: T config: '[["status__state","includes",{"open":"Open"}]]' columns: - column_id: 1 + bits: 1 sort: 1 width: 100 heading: Ticket - column_id: 10 + bits: 1 sort: 2 width: 150 heading: Last Updated - column_id: 3 + bits: 1 sort: 3 width: 300 heading: Subject - column_id: 4 + bits: 1 sort: 4 width: 185 heading: From - column_id: 5 + bits: 1 sort: 5 width: 85 heading: Priority - column_id: 8 + bits: 1 sort: 6 width: 160 heading: Assigned To @@ -65,129 +71,277 @@ - sort_id: 4 - id: 2 + title: Answered + parent_id: 1 + flags: 0x03 + root: T + sort: 4 + config: '[["isanswered","set",null]]' + columns: + - column_id: 1 + bits: 1 + sort: 1 + width: 100 + heading: Ticket + - column_id: 10 + bits: 1 + sort: 2 + width: 150 + heading: Last Update + - column_id: 3 + bits: 1 + sort: 3 + width: 300 + heading: Subject + - column_id: 4 + bits: 1 + sort: 4 + width: 185 + heading: From + - column_id: 5 + bits: 1 + sort: 5 + width: 85 + heading: Priority + - column_id: 8 + bits: 1 + sort: 6 + width: 160 + heading: Assigned To + sorts: + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + + + +- id: 3 + title: My Tickets + parent_id: 0 + flags: 0x03 + root: T + sort: 3 + config: '{"criteria":[["assignee","includes",{"M":"Me","T":"One of my teams"}],["status__state","includes",{"open":"Open"}]],"conditions":[]}' + columns: + - column_id: 1 + bits: 1 + sort: 1 + width: 100 + heading: Ticket + - column_id: 10 + bits: 1 + sort: 2 + width: 150 + heading: Last Update + - column_id: 3 + bits: 1 + sort: 3 + width: 300 + heading: Subject + - column_id: 4 + bits: 1 + sort: 4 + width: 185 + heading: From + - column_id: 5 + bits: 1 + sort: 5 + width: 85 + heading: Priority + - column_id: 11 + bits: 1 + sort: 6 + width: 160 + heading: Department + sorts: + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + +- id: 4 title: Closed flags: 0x03 - sort: 2 + sort: 4 root: T + sort_id: 5 config: '[["status__state","includes",{"closed":"Closed"}]]' columns: - column_id: 1 + bits: 1 sort: 1 width: 100 heading: Ticket - column_id: 7 + bits: 1 sort: 2 width: 150 heading: Date Closed - column_id: 3 + bits: 1 sort: 3 width: 300 heading: Subject - column_id: 4 + bits: 1 sort: 4 width: 185 heading: From - column_id: 5 + bits: 1 + sort: 1 sort: 5 width: 85 heading: Priority - column_id: 8 + bits: 1 + sort: 1 sort: 6 width: 160 heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 -- title: Unanswered +- title: Unassigned parent_id: 1 flags: 0x2b root: T sort: 1 - config: '[["isanswered","nset",null]]' + config: '[["assignee","!assigned",null]]' columns: - column_id: 1 + bits: 1 + sort: 1 sort: 1 width: 100 heading: Ticket - column_id: 10 + bits: 1 + sort: 1 sort: 2 width: 150 heading: Last Update - column_id: 3 + bits: 1 + sort: 1 sort: 3 width: 300 heading: Subject - column_id: 4 + bits: 1 + sort: 1 sort: 4 width: 185 heading: From - column_id: 5 + bits: 1 + sort: 1 sort: 5 width: 85 heading: Priority - - column_id: 8 + - column_id: 11 + bits: 1 + sort: 1 sort: 6 width: 160 - heading: Assigned To + heading: Department -- title: Unassigned +- title: Assigned parent_id: 1 - flags: 0x2b + flags: 0x03 root: T sort: 2 - config: '[["assignee","!assigned",null]]' + config: '[["assignee","assigned",null]]' columns: - column_id: 1 + bits: 1 sort: 1 width: 100 heading: Ticket - column_id: 10 + bits: 1 sort: 2 width: 150 heading: Last Update - column_id: 3 + bits: 1 sort: 3 width: 300 heading: Subject - column_id: 4 + bits: 1 sort: 4 width: 185 heading: From - column_id: 5 + bits: 1 sort: 5 width: 85 heading: Priority - - column_id: 11 + - column_id: 8 + bits: 1 sort: 6 width: 160 - heading: Department + heading: Assigned To -- title: My Tickets +- title: Overdue parent_id: 1 flags: 0x2b root: T - sort: 4 - config: '[["assignee","includes",{"M":"Me", "T":"One of my teams"}]]' + sort: 3 + sort_id: 4 + config: '[["isoverdue","set",null]]' columns: - column_id: 1 + bits: 1 sort: 1 width: 100 heading: Ticket - column_id: 10 - sort: 2 + bits: 1 + sort: 1 + sort: 9 width: 150 - heading: Last Update + heading: Due Date - column_id: 3 + bits: 1 + sort: 1 sort: 3 width: 300 heading: Subject - column_id: 4 + bits: 1 + sort: 1 sort: 4 width: 185 heading: From - column_id: 5 + bits: 1 + sort: 1 sort: 5 width: 85 heading: Priority - - column_id: 11 + - column_id: 8 + bits: 1 + sort: 1 sort: 6 width: 160 - heading: Department + heading: Assigned To + +- title: Personal Tickets + parent_id: 3 + flags: 0x2b + root: T + sort: 1 + config: '{"criteria":[["assignee","includes",{"M":"Me"}]]}' + +- title: Teams Tickets + parent_id: 3 + flags: 0x2b + root: T + sort: 2 + config: '{"criteria":[["team_id","set",null]],"conditions":[]}' + filter: team_id diff --git a/include/i18n/en_US/queue_sort.yaml b/include/i18n/en_US/queue_sort.yaml index 34133fc7a532804b42073cb066119abca969e0f4..09b0fb87f6530db783274f2716be91ff4f1cc8d3 100644 --- a/include/i18n/en_US/queue_sort.yaml +++ b/include/i18n/en_US/queue_sort.yaml @@ -1,7 +1,7 @@ # Columns are not necessary and a default list is used if no columns are # specified. # -# Fields: +# Fields: # id: --- - id: 1 @@ -19,3 +19,11 @@ - id: 4 name: Due Date columns: '["-est_duedate"]' + +- id: 5 + name: Closed Date + columns: '["-closed"]' + +- id: 6 + name: Create Date + columns: '["-created"]' diff --git a/include/staff/profile.inc.php b/include/staff/profile.inc.php index 627842f6942e7d11339107507d45203bc84f4535..78bab30bf2c38abdd2638522e96cc6526fa6cae1 100644 --- a/include/staff/profile.inc.php +++ b/include/staff/profile.inc.php @@ -131,13 +131,6 @@ if ($avatar->isChangeable()) { ?> </tr> <tr> <td colspan="2"> - <label class="checkbox"> - <input type="checkbox" name="show_assigned_tickets" - <?php echo $cfg->showAssignedTickets() ? 'disabled="disabled" ' : ''; ?> - <?php echo $staff->show_assigned_tickets ? 'checked="checked"' : ''; ?> /> - <?php echo __('Show assigned tickets on open queue.'); ?> - <i class="help-tip icon-question-sign" href="#show_assigned_tickets"></i> - </label> <label class="checkbox"> <input type="checkbox" name="onvacation" <?php echo ($staff->onvacation) ? 'checked="checked"' : ''; ?> /> @@ -223,6 +216,30 @@ if ($avatar->isChangeable()) { ?> <div class="error"><?php echo $errors['default_from_name']; ?></div> </td> </tr> + <tr> + <td> + <?php echo __('Default Ticket Queue'); ?>: + </td> + <td> + <select name="default_ticket_queue_id"> + <option value="0">— <?php echo __('system default');?> —</option> + <?php + $queues = CustomQueue::queues() + ->filter(Q::any(array( + 'flags__hasbit' => CustomQueue::FLAG_PUBLIC, + 'staff_id' => $thisstaff->getId(), + ))) + ->all(); + foreach ($queues as $q) { ?> + <option value="<?php echo $q->id; ?>" <?php + if ($q->getId() == $staff->default_ticket_queue_id) echo 'selected="selected"'; ?> > + <?php echo $q->getFullName(); ?></option> + <?php + } ?> + </select> + </td> + </tr> + <tr> <td><?php echo __('Thread View Order');?>: <div class="faded"><?php echo __('The order of thread entries');?></div> diff --git a/include/staff/queues-ticket.inc.php b/include/staff/queues-ticket.inc.php index f23f2e9fe4440c40d8ae2d2c789a9a8263bb0814..cc878e894b32a1ae182644bfe0a417790f8e6d13 100644 --- a/include/staff/queues-ticket.inc.php +++ b/include/staff/queues-ticket.inc.php @@ -46,7 +46,7 @@ <tbody class="sortable-rows" data-sort="qsort"> <?php $all_queues = CustomQueue::queues()->getIterator(); -$emitLevel = function($queues, $level=0) use ($all_queues, &$emitLevel) { +$emitLevel = function($queues, $level=0) use ($all_queues, &$emitLevel) { $queues->sort(function($a) { return $a->sort; }); foreach ($queues as $q) { ?> <tr> @@ -54,7 +54,7 @@ $emitLevel = function($queues, $level=0) use ($all_queues, &$emitLevel) { <td colspan="<?php echo max(1, $level); ?>"></td> <?php } ?> <td> - <input type="checkbox" class="mass checkbox" value="<?php echo $q->id; ?>" /> + <input type="checkbox" class="mass checkbox" name="qids[]" value="<?php echo $q->id; ?>" /> <input type="hidden" name="qsort[<?php echo $q->id; ?>]" value="<?php echo $q->sort; ?>"/> </td> diff --git a/include/staff/templates/advanced-search.tmpl.php b/include/staff/templates/advanced-search.tmpl.php index 33949c8291382174b12203537da588ae1121d86f..577f66962305b047b6165a66b3a41ebb8ad91106 100644 --- a/include/staff/templates/advanced-search.tmpl.php +++ b/include/staff/templates/advanced-search.tmpl.php @@ -3,8 +3,14 @@ $parent_id = $_REQUEST['parent_id'] ?: $search->parent_id; if ($parent_id && (!($parent = CustomQueue::lookup($parent_id))) ) { - $parent_id = null; + $parent_id = 0; } + +$queues = array(); +foreach (CustomQueue::queues() as $q) + $queues[$q->id] = $q->getFullName(); +asort($queues); +$queues = array(0 => ('—'.__("My Searches").'—')) + $queues; ?> <div id="advanced-search" class="advanced-search"> <h3 class="drag-handle"><?php echo __('Advanced Ticket Search');?></h3> @@ -14,27 +20,27 @@ if ($parent_id <form action="#tickets/search" method="post" name="search"> <div class="flex row"> - <div class="span6"> + <div class="span12"> <select name="parent_id"> - <option value="0" <?php - if (!$parent_id) echo 'selected="selected"'; - ?>><?php echo '—'.__("My Searches").'—'; ?></option> <?php -foreach (CustomQueue::queues()->order_by('sort', 'title') as $q) { ?> - <option value="<?php echo $q->id; ?>" - <?php if ($parent_id == $q->id) echo 'selected="selected"'; ?> - ><?php echo $q->getFullName(); ?></option> +foreach ($queues as $id => $name) { + ?> + <option value="<?php echo $id; ?>" + <?php if ($parent_id == $id) echo 'selected="selected"'; ?> + ><?php echo $name; ?></option> <?php } ?> </select> - </div><div class="span6"> - <input name="name" type="text" size="30" + </div> + </div> + <div class="flex row"> + <div class="span12"> + <input name="name" type="text" size="30" value="<?php echo Format::htmlchars($search->getName()); ?>" placeholder="<?php echo __('Enter a title for the search queue'); ?>"/> <div class="error"><?php echo Format::htmlchars($errors['name']); ?></div> </div> </div> - <ul class="tabs"> <li class="active"><a href="#criteria"><?php echo __('Criteria'); ?></a></li> <li><a href="#columns"><?php echo __('Columns'); ?></a></li> @@ -61,7 +67,7 @@ foreach (CustomQueue::queues()->order_by('sort', 'title') as $q) { ?> </div> <div class="tab_content hidden" id="columns"> - <?php + <?php $queue = $search; include STAFFINC_DIR . "templates/queue-columns.tmpl.php"; ?> </div> diff --git a/include/staff/templates/queue-navigation.tmpl.php b/include/staff/templates/queue-navigation.tmpl.php index 478d1d89671d20ef707045788b223f6e363d6e8c..b903f29fd12e025df3e519af361d0eb693e89a52 100644 --- a/include/staff/templates/queue-navigation.tmpl.php +++ b/include/staff/templates/queue-navigation.tmpl.php @@ -5,14 +5,15 @@ // $selected - <bool> true if this queue is currently active // $child_selected - <bool> true if the selected queue is a descendent $this_queue = $q; -$selected = $_REQUEST['queue'] == $this_queue->getId(); +$selected = (!isset($_REQUEST['a']) && $_REQUEST['queue'] == $this_queue->getId()); ?> <li class="top-queue item <?php if ($child_selected) echo 'child active'; elseif ($selected) echo 'active'; ?>"> - <a href="<?php echo $this_queue->getHref(); ?>"><i class="icon-sort-down pull-right"></i><?php echo $this_queue->getName(); ?></a> + <a href="<?php echo $this_queue->getHref(); ?>" + class="Ticket"><i class="small icon-sort-down pull-right"></i><?php echo $this_queue->getName(); ?></a> <div class="customQ-dropdown"> <ul class="scroll-height"> - <!-- Add top-level queue (with count) --> + <!-- Add top-level queue (with count) --> <li class="top-level"> <span class="pull-right newItemQ queue-count" data-queue-id="<?php echo $q->id; ?>"><span class="faded-more">-</span> @@ -29,22 +30,23 @@ $selected = $_REQUEST['queue'] == $this_queue->getId(); <!-- Start Dropdown and child queues --> <?php foreach ($this_queue->getPublicChildren() as $q) { include 'queue-subnavigation.tmpl.php'; - } - $first_child = true; - foreach ($this_queue->getMyChildren() as $q) { - if ($first_child) { - $first_child = false; - echo '<li class="personalQ"></li>'; - } - include 'queue-subnavigation.tmpl.php'; } ?> + <!-- Personal Queues --> + <?php + $queues = $this_queue->getMyChildren(); + if (count($queues)) { ?> + <li class="personalQ"></li> + <?php foreach ($queues as $q) { + include 'queue-subnavigation.tmpl.php'; + } + }?> </ul> <!-- Add Queue button sticky at the bottom --> <div class="add-queue"> <a class="full-width" onclick="javascript: var pid = <?php echo $this_queue->getId() ?: 0; ?>; $.dialog('ajax.php/tickets/search?parent_id='+pid, 201);"> - <span><i class="green icon-plus-sign"></i> + <span><i class="green icon-plus-sign"></i> <?php echo __('Add personal queue'); ?></span> </a> </div> diff --git a/include/staff/templates/queue-savedsearches-nav.tmpl.php b/include/staff/templates/queue-savedsearches-nav.tmpl.php index 7bc616a5fa1fb96ab42dca36dd849a89f5a47534..d6c57fdaa6d4569199f6dfeb2ebe41f809568e17 100644 --- a/include/staff/templates/queue-savedsearches-nav.tmpl.php +++ b/include/staff/templates/queue-savedsearches-nav.tmpl.php @@ -11,7 +11,7 @@ if (!isset($_SESSION['advsearch'])) $href = 'href="#" data-dialog="ajax.php/tickets/search"'; ?> - <a <?php echo $href; ?>><i class="icon-sort-down pull-right"></i><?php echo __('Search'); + <a class="Ticket" <?php echo $href; ?>><i class="icon-sort-down pull-right"></i><?php echo __('Search'); ?></a> <div class="customQ-dropdown"> <ul class="scroll-height"> @@ -25,25 +25,24 @@ )) as $q) { include 'queue-subnavigation.tmpl.php'; } ?> - <?php if (isset($_SESSION['advsearch']) - && count($_SESSION['advsearch'])) { ?> + <?php + if (isset($_SESSION['advsearch'])) { ?> <li> <h4><?php echo __('Recent Searches'); ?></h4> - </li> - <?php + <?php foreach ($_SESSION['advsearch'] as $token=>$criteria) { $q = new SavedSearch(array('root' => 'T')); $q->id = 'adhoc,'.$token; $q->title = $q->describeCriteria($criteria); include 'queue-subnavigation.tmpl.php'; - } - } ?> - <!-- Dropdown Titles --> - + } ?> + </li> + <?php + } ?> </ul> <!-- Add Queue button sticky at the bottom --> - + <div class="add-queue"> <a class="full-width" onclick="javascript: $.dialog('ajax.php/tickets/search', 201);"> diff --git a/include/staff/templates/queue-sort.tmpl.php b/include/staff/templates/queue-sort.tmpl.php index d83e8f02f964c487a4a84373c3e0d7e04d2acf6a..c84e3d763681041c0218e1a17c8047f0e4650394 100644 --- a/include/staff/templates/queue-sort.tmpl.php +++ b/include/staff/templates/queue-sort.tmpl.php @@ -11,7 +11,10 @@ elseif (strpos($_GET['sort'], 'qs-') === 0) { $sort_id = substr($_GET['sort'], 3); $queuesort = QueueSort::lookup($sort_id); $sort_dir = $_GET['dir']; +} elseif ($queuesort = $queue->getDefaultSort()) { + $sort_id = $queuesort->id; } + ?> <span class="action-button muted" data-dropdown="#sort-dropdown" diff --git a/include/staff/templates/queue-tickets.tmpl.php b/include/staff/templates/queue-tickets.tmpl.php index 045d668e14fc96497f7955e7ff849c1b52049e41..0c8fe8c9c617be7969f386f52ceb65adb3a2876b 100644 --- a/include/staff/templates/queue-tickets.tmpl.php +++ b/include/staff/templates/queue-tickets.tmpl.php @@ -104,7 +104,7 @@ $pageNav->setURL('tickets.php', $args); <span class="valign-helper"></span> <?php require 'queue-quickfilter.tmpl.php'; - if (count($queue->sorts)) + if ($queue->getSortOptions()) require 'queue-sort.tmpl.php'; ?> </div> @@ -233,6 +233,7 @@ if ($canManageTickets) { ?> <th style="width:12px"></th> <?php } + foreach ($columns as $C) { $heading = Format::htmlchars($C->getLocalHeading()); if ($C->isSortable()) { diff --git a/include/staff/templates/sub-navigation.tmpl.php b/include/staff/templates/sub-navigation.tmpl.php index ecf520faf55f2712be717500b08dd5700422a737..bb69b58545668bdc9c06a8dbdd39f946da1ffb2b 100644 --- a/include/staff/templates/sub-navigation.tmpl.php +++ b/include/staff/templates/sub-navigation.tmpl.php @@ -1,16 +1,20 @@ <?php -if(($subnav=$nav->getSubMenu()) && is_array($subnav)){ - $activeMenu=$nav->getActiveMenu(); - if($activeMenu>0 && !isset($subnav[$activeMenu-1])) - $activeMenu=0; - $info = $nav->getSubNavInfo(); +if (!$nav || !($subnav=$nav->getSubMenu()) || !is_array($subnav)) + return; + +$activeMenu=$nav->getActiveMenu(); +if ($activeMenu>0 && !isset($subnav[$activeMenu-1])) + $activeMenu=0; + +$info = $nav->getSubNavInfo(); ?> <nav class="<?php echo @$info['class']; ?>" id="<?php echo $info['id']; ?>"> <ul id="sub_nav"> <?php foreach($subnav as $k=> $item) { if (is_callable($item)) { - $item($tab, $nav); + if ($item($nav) && !$activeMenu) + $activeMenu = 'x'; continue; } if($item['droponly']) continue; @@ -35,7 +39,6 @@ if(($subnav=$nav->getSubMenu()) && is_array($subnav)){ echo sprintf('<li><a class="%s" href="%s" title="%s" id="%s" %s>%s</a></li>', $class, $item['href'], $item['title'], $id, $attr, $item['desc']); } -} ?> </ul> </nav> diff --git a/scp/css/scp.css b/scp/css/scp.css index 22b78ce32e9dc69f371ccf65e5d9d745e8324ba8..13d4c964347635b446a4e3db4c44315449c02da7 100644 --- a/scp/css/scp.css +++ b/scp/css/scp.css @@ -372,8 +372,8 @@ a time { text-decoration: none; } -#sub_nav a.active, #sub_nav li.active > a, -#customQ_nav .jb-overflowmenu-menu li.active.item > a { +#sub_nav a.active, #sub_nav li.active > a, #sub_nav li.child.active > a +#customQ_nav .jb-overflowmenu-menu-primary li.item > a.active { font-weight:bold; } @@ -904,8 +904,8 @@ a time { /**********************End Custom Queues Dropdown******************/ /*************Qeueue Title Config dropdown options****************/ -.configureQ { - display:block; +.configureQ { + display:block; float:left; color:rgba(0,0,0,.2); margin:4px 0 0 4px; @@ -922,7 +922,7 @@ a time { } .configureQ:hover > .noclick-dropdown { display:block; - + } .configureQ > .noclick-dropdown:before { top: 19px; diff --git a/scp/tickets.php b/scp/tickets.php index 0c8f0b98fcb5c94d97e8e027d6cdd19576dbe42b..e2fe93c79bff25b3e46aa4112e13dcd1ac362e8e 100644 --- a/scp/tickets.php +++ b/scp/tickets.php @@ -103,6 +103,7 @@ if (!$ticket) { $queue = new AdhocSearch(array( 'id' => "adhoc,$key", 'root' => 'T', + 'title' => __('Advanced Search'), )); $queue->config = $_SESSION['advsearch'][$key]; } @@ -447,8 +448,11 @@ as $q) { // A queue is selected if it is the one being displayed. It is // "child" selected if its ID is in the path of the one selected $child_selected = $queue - && false !== strpos($queue->getPath(), "/{$q->getId()}/"); + && ($queue->parent_id == $q->getId() + || false !== strpos($queue->getPath(), "/{$q->getId()}/")); include STAFFINC_DIR . 'templates/queue-navigation.tmpl.php'; + + return ($child_selected || $selected); }); } @@ -461,6 +465,8 @@ $nav->addSubMenu(function() use ($queue) { $searches = SavedSearch::forStaff($thisstaff)->getIterator(); include STAFFINC_DIR . 'templates/queue-savedsearches-nav.tmpl.php'; + + return ($child_selected || $selected); });