diff --git a/include/class.queue.php b/include/class.queue.php index 48f82c81f44e47f7ee8dac4a8bac2eb75c84679b..5e9f3dcbf58b778bed1fb2c856f307c8d7390ec3 100644 --- a/include/class.queue.php +++ b/include/class.queue.php @@ -998,7 +998,8 @@ class CustomQueue extends VerySimpleModel { } function inheritCriteria() { - return $this->flags & self::FLAG_INHERIT_CRITERIA; + return $this->flags & self::FLAG_INHERIT_CRITERIA && + $this->parent_id; } function inheritColumns() { @@ -1176,8 +1177,7 @@ class CustomQueue extends VerySimpleModel { // Set basic queue information $this->path = $this->buildPath(); - $this->setFlag(self::FLAG_INHERIT_CRITERIA, - $this->parent_id > 0 && isset($vars['inherit'])); + $this->setFlag(self::FLAG_INHERIT_CRITERIA, $this->parent_id); $this->setFlag(self::FLAG_INHERIT_COLUMNS, isset($vars['inherit-columns'])); $this->setFlag(self::FLAG_INHERIT_EXPORT, @@ -1392,8 +1392,10 @@ class CustomQueue extends VerySimpleModel { $queue = new static($vars); $queue->created = SqlFunction::NOW(); - if (!isset($vars['flags'])) + if (!isset($vars['flags'])) { + $queue->setFlag(self::FLAG_PUBLIC); $queue->setFlag(self::FLAG_QUEUE); + } return $queue; } diff --git a/include/class.search.php b/include/class.search.php index c32916504b3d4200ccdde403e00ebe4656c4a9cb..469c3f5e09d164074d0601f20fe85ebfdce70574 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -855,7 +855,7 @@ class SavedQueue extends CustomQueue { $queues = SavedQueue::objects() ->filter(Q::any(array( - 'flags__hasbit' => CustomQueue::FLAG_PUBLIC, + 'flags__hasbit' => CustomQueue::FLAG_QUEUE, 'staff_id' => $agent->getId(), ))); diff --git a/include/i18n/en_US/queue.yaml b/include/i18n/en_US/queue.yaml index ab2b1a4bbb3453e14c7843b81a75d65751b94d9e..b7325620c2df64ffb66322a400d05ca81879258e 100644 --- a/include/i18n/en_US/queue.yaml +++ b/include/i18n/en_US/queue.yaml @@ -29,6 +29,7 @@ --- - id: 1 title: Open + parent_id: 0 flags: 0x03 sort: 1 root: T @@ -69,14 +70,17 @@ - sort_id: 2 - sort_id: 3 - sort_id: 4 + - sort_id: 6 + - sort_id: 7 - id: 2 - title: Answered + title: Open parent_id: 1 - flags: 0x03 + flags: 0x2b root: T - sort: 2 - config: '[["isanswered","set",null]]' + sort: 1 + sort_id: 4 + config: '{"criteria":[["isanswered","nset",null]],"conditions":[]}' columns: - column_id: 1 bits: 1 @@ -87,7 +91,7 @@ bits: 1 sort: 2 width: 150 - heading: Last Update + heading: Last Updated - column_id: 3 bits: 1 sort: 3 @@ -108,13 +112,93 @@ sort: 6 width: 160 heading: Assigned To - sorts: - - sort_id: 1 - - sort_id: 2 - - sort_id: 3 - - sort_id: 4 - id: 3 + title: Answered + parent_id: 1 + flags: 0x2b + root: T + sort: 1 + sort_id: 4 + config: '{"criteria":[["isanswered","set",null]],"conditions":[]}' + 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 + +- id: 4 + title: Overdue + parent_id: 1 + flags: 0x2b + root: T + sort: 2 + sort_id: 4 + config: '{"criteria":[["isoverdue","set",null]],"conditions":[]}' + columns: + - column_id: 1 + bits: 1 + sort: 1 + width: 100 + heading: Ticket + - column_id: 9 + bits: 1 + sort: 1 + sort: 9 + width: 150 + 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: 8 + bits: 1 + sort: 1 + sort: 6 + width: 160 + heading: Assigned To + +- id: 5 title: My Tickets parent_id: 0 flags: 0x03 @@ -157,25 +241,27 @@ - sort_id: 2 - sort_id: 3 - sort_id: 4 + - sort_id: 6 + - sort_id: 7 -- id: 4 - title: Closed - flags: 0x03 - sort: 4 +- id: 6 + title: Assigned to Me + parent_id: 5 + flags: 0x2b root: T - sort_id: 5 - config: '[["status__state","includes",{"closed":"Closed"}]]' + sort: 1 + config: '{"criteria":[["assignee","includes",{"M":"Me"}]],"conditions":[]}' columns: - column_id: 1 bits: 1 sort: 1 width: 100 heading: Ticket - - column_id: 7 + - column_id: 10 bits: 1 sort: 2 width: 150 - heading: Date Closed + heading: Last Update - column_id: 3 bits: 1 sort: 3 @@ -188,28 +274,29 @@ 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: Closed By + heading: Department sorts: - - sort_id: 5 - sort_id: 1 - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 -- id: 5 - title: Assigned - parent_id: 1 - flags: 0x03 +- id: 7 + title: Assigned to Teams + parent_id: 5 + flags: 0x2b root: T - sort: 3 - config: '[["assignee","assigned",null]]' + sort: 2 + config: '{"criteria":[["assignee","!includes",{"M":"Me"}]],"conditions":[]}' columns: - column_id: 1 bits: 1 @@ -236,53 +323,323 @@ sort: 5 width: 85 heading: Priority + - column_id: 14 + bits: 1 + sort: 6 + width: 160 + heading: Team + sorts: + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 + +- id: 8 + parent_id: 0 + title: Closed + flags: 0x03 + sort: 4 + root: T + sort_id: 5 + config: '{"criteria":[["status__state","includes",{"closed":"Closed"}]],"conditions":[]}' + 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: 8 bits: 1 + sort: 1 sort: 6 width: 160 - heading: Assigned To + heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 -- id: 6 - title: Overdue - parent_id: 1 +- id: 9 + parent_id: 8 + title: Today flags: 0x2b + sort: 1 root: T - sort: 4 - sort_id: 4 - config: '[["isoverdue","set",null]]' + sort_id: 5 + config: '{"criteria":[["closed","period","td"]],"conditions":[]}' columns: - column_id: 1 bits: 1 sort: 1 width: 100 heading: Ticket - - column_id: 9 + - 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: 8 bits: 1 sort: 1 - sort: 9 + sort: 6 + width: 160 + heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 + +- id: 10 + parent_id: 8 + title: Yesterday + flags: 0x2b + sort: 2 + root: T + sort_id: 5 + config: '{"criteria":[["closed","period","yd"]],"conditions":[]}' + columns: + - column_id: 1 + bits: 1 + sort: 1 + width: 100 + heading: Ticket + - column_id: 7 + bits: 1 + sort: 2 width: 150 - heading: Due Date + 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: 8 + bits: 1 + sort: 1 + sort: 6 + width: 160 + heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 + +- id: 11 + parent_id: 8 + title: This Week + flags: 0x2b + sort: 3 + root: T + sort_id: 5 + config: '{"criteria":[["closed","period","tw"]],"conditions":[]}' + 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: 8 + bits: 1 + sort: 1 + sort: 6 + width: 160 + heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 + +- id: 12 + parent_id: 8 + title: This Month + flags: 0x2b + sort: 4 + root: T + sort_id: 5 + config: '{"criteria":[["closed","period","tm"]],"conditions":[]}' + 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: 8 bits: 1 sort: 1 + sort: 6 + width: 160 + heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 + +- id: 13 + parent_id: 8 + title: This Quarter + flags: 0x2b + sort: 5 + root: T + sort_id: 6 + config: '{"criteria":[["closed","period","tq"]],"conditions":[]}' + 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 + - column_id: 8 bits: 1 sort: 1 - sort: 5 - width: 85 - heading: Priority + sort: 6 + width: 160 + heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 + +- id: 14 + parent_id: 8 + title: This Year + flags: 0x2b + sort: 6 + root: T + sort_id: 7 + config: '{"criteria":[["closed","period","ty"]],"conditions":[]}' + 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: 8 bits: 1 sort: 1 sort: 6 width: 160 - heading: Assigned To + heading: Closed By + sorts: + - sort_id: 5 + - sort_id: 1 + - sort_id: 2 + - sort_id: 3 + - sort_id: 4 + - sort_id: 6 + - sort_id: 7 diff --git a/include/i18n/en_US/queue_column.yaml b/include/i18n/en_US/queue_column.yaml index 6f7419a4af0e0074293b957b07f813668d1889e4..03250da19a83b3118bbd04eb4792218c232928dd 100644 --- a/include/i18n/en_US/queue_column.yaml +++ b/include/i18n/en_US/queue_column.yaml @@ -129,3 +129,10 @@ truncate: "wrap" annotations: "[]" conditions: "[]" + +- id: 14 + name: "Team" + primary: "team_id" + truncate: "wrap" + annotations: "[]" + conditions: "[]" diff --git a/include/i18n/en_US/queue_sort.yaml b/include/i18n/en_US/queue_sort.yaml index 09b0fb87f6530db783274f2716be91ff4f1cc8d3..35cd47d4a2dd1b12b3ff6af4931a733ba9172eea 100644 --- a/include/i18n/en_US/queue_sort.yaml +++ b/include/i18n/en_US/queue_sort.yaml @@ -27,3 +27,7 @@ - id: 6 name: Create Date columns: '["-created"]' + +- id: 7 + name: Update Date + columns: '["-lastupdate"]' diff --git a/include/staff/queue.inc.php b/include/staff/queue.inc.php index b936699df859013ba8706f9c27daba2c310a840e..fa9862bb830d4997296aad36fb3fbbbe2bc154b2 100644 --- a/include/staff/queue.inc.php +++ b/include/staff/queue.inc.php @@ -4,10 +4,11 @@ if(!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin()) die('Access Denied'); $info = $qs = array(); - +$parent = null; if (!$queue) { $queue = CustomQueue::create(array( 'flags' => CustomQueue::FLAG_QUEUE, + 'parent_id' => 0, )); } if ($queue->__new__) { @@ -16,6 +17,7 @@ if ($queue->__new__) { $submit_text=__('Create'); } else { + $parent = $queue->parent; $title=__('Manage Custom Queue'); $action='update'; $submit_text=__('Save Changes'); @@ -29,8 +31,6 @@ else { <input type="hidden" name="do" value="<?php echo $action; ?>"> <input type="hidden" name="a" value="<?php echo Format::htmlchars($_REQUEST['a']); ?>"> <input type="hidden" name="id" value="<?php echo $info['id']; ?>"> - <input type="hidden" name="root" value="<?php echo Format::htmlchars($_REQUEST['t']); ?>"> - <h2><a href="settings.php?t=tickets#queues"><?php echo __('Ticket Queues'); ?></a> <i class="icon-caret-right" style="color:rgba(0,0,0,.3);"></i> <?php echo $title; ?> <?php if (isset($queue->id)) { ?><small> @@ -63,20 +63,33 @@ else { <br/> <div class="error"><?php echo $errors['queue-name']; ?></div> <br/> + <div> + <div><strong><?php echo __("Parent Queue"); ?>:</strong></div> + <select name="parent_id" id="parent-id"> + <option value="0">— <?php echo __('Top-Level Queue'); ?> —</option> + <?php foreach (CustomQueue::queues() as $cq) { + // Queue cannot be a descendent of itself + if ($cq->id == $queue->id) + continue; + if (strpos($cq->path, "/{$queue->id}/") !== false) + continue; + ?> + <option value="<?php echo $cq->id; ?>" + <?php if ($cq->getId() == $queue->parent_id) echo 'selected="selected"'; ?> + ><?php echo $cq->getFullName(); ?></option> + <?php } ?> + </select> + <span class="error"><?php echo Format::htmlchars($errors['parent_id']); ?></span> + </div> + <div class="faded <?php echo $parent ? ' ': 'hidden'; ?>" + id="inherited-parent" style="margin-top: 1em;"> + <div><strong><i class="icon-caret-down"></i> <?php echo __('Inherited Criteria'); ?></strong></div> + <div id="parent-criteria"> + <?php echo $parent ? nl2br(Format::htmlchars($parent->describeCriteria())) : ''; ?> + </div> + </div> + <hr/> <div><strong><?php echo __("Queue Search Criteria"); ?></strong></div> - <label class="checkbox" style="line-height:1.3em"> - <input type="checkbox" class="checkbox" name="inherit" <?php - if ($queue->inheritCriteria()) echo 'checked="checked"'; - ?>/> - <?php echo __('Include parent search criteria'); - if ($queue->parent) { ?> - <span id="parent_q_crit" class="faded"> - <i class="icon-caret-right"></i> - <br/><?php - echo nl2br(Format::htmlchars($queue->parent->describeCriteria())); - ?></span> -<?php } ?> - </label> <hr/> <div class="error"><?php echo $errors['criteria']; ?></div> <div class="advanced-search"> @@ -89,27 +102,6 @@ else { </div> </td> <td style="width:35%; padding-left:40px; vertical-align:top"> - <div><strong><?php echo __("Parent Queue"); ?>:</strong></div> - <select name="parent_id" onchange="javascript: - $('#parent_q_crit').toggle($(this).find(':selected').val() - == <?php echo $queue->parent_id ?: 0; ?>);"> - <option value="0">— <?php echo __('Top-Level Queue'); ?> —</option> -<?php foreach (CustomQueue::queues() as $cq) { - // Queue cannot be a descendent of itself - if ($cq->id == $queue->id) - continue; - if (strpos($cq->path, "/{$queue->id}/") !== false) - continue; -?> - <option value="<?php echo $cq->id; ?>" - <?php if ($cq->getId() == $queue->parent_id) echo 'selected="selected"'; ?> - ><?php echo $cq->getFullName(); ?></option> -<?php } ?> - </select> - <div class="error"><?php echo Format::htmlchars($errors['parent_id']); ?></div> - - <br/> - <br/> <div><strong><?php echo __("Quick Filter"); ?></strong></div> <hr/> <select name="filter"> @@ -309,6 +301,27 @@ var Q = setInterval(function() { ); } ?> }, 25); +$('select#parent-id').change(function() { + var form = $(this).closest('form'); + var qid = parseInt($(this).val(), 10) || 0; + + if (qid > 0) { + $.ajax({ + type: "GET", + url: 'ajax.php/queue/'+qid, + dataType: 'json', + success: function(queue) { + $('#parent-name', form).html(queue.name); + $('#parent-criteria', form).html(queue.criteria); + $('#inherited-parent', form).fadeIn(); + } + }) + .done(function() { }) + .fail(function() { }); + } else { + $('#inherited-parent', form).fadeOut(); + } +}); }(); </script> </table> diff --git a/include/staff/templates/advanced-search-criteria.tmpl.php b/include/staff/templates/advanced-search-criteria.tmpl.php index 9348cf79be9a81e3cb762f1bcaf96604acedf437..309ce63cd117687c0a530cfe6935609c38e05729 100644 --- a/include/staff/templates/advanced-search-criteria.tmpl.php +++ b/include/staff/templates/advanced-search-criteria.tmpl.php @@ -11,7 +11,7 @@ if (($search instanceof SavedQueue) && !$search->checkOwnership($thisstaff)) { echo '<div class="faded">'. nl2br(Format::htmlchars($search->describeCriteria())). '</div><br>'; // Show any supplemental filters - if ($matches && count($info)) { + if ($matches) { ?> <div id="ticket-flags" style="padding:5px; border-top: 1px dotted #777;"> diff --git a/include/staff/templates/queue-navigation.tmpl.php b/include/staff/templates/queue-navigation.tmpl.php index d1061c8d43da152d5686b428fe6ee0b50943f8f1..380e03af961d5f8f6901d9bf63eadb55bb7679a4 100644 --- a/include/staff/templates/queue-navigation.tmpl.php +++ b/include/staff/templates/queue-navigation.tmpl.php @@ -15,6 +15,9 @@ $selected = (!isset($_REQUEST['a']) && $_REQUEST['queue'] == $this_queue->getId <div class="customQ-dropdown"> <ul class="scroll-height"> <!-- Add top-level queue (with count) --> + + <?php + if (!$children) { ?> <li class="top-level"> <span class="pull-right newItemQ queue-count" data-queue-id="<?php echo $q->id; ?>"><span class="faded-more">-</span> @@ -25,9 +28,9 @@ $selected = (!isset($_REQUEST['a']) && $_REQUEST['queue'] == $this_queue->getId <?php echo Format::htmlchars($q->getName()); ?> </a> - </h4> </li> - + <?php + } ?> <!-- Start Dropdown and child queues --> <?php foreach ($childs as $_) { list($q, $children) = $_; diff --git a/scp/queues.php b/scp/queues.php index f02f4efc8a5c3faa6d047d57d9962fa5fd0e86db..997fefa2678cae361a9654c6efecfaccf0199fe9 100644 --- a/scp/queues.php +++ b/scp/queues.php @@ -44,7 +44,7 @@ if ($_POST) { $queue = CustomQueue::create(array( 'staff_id' => 0, 'title' => $_POST['queue-name'], - 'root' => $_POST['root'] ?: 'T' + 'root' => 'T' )); if ($queue->update($_POST, $errors) && $queue->save(true)) {