diff --git a/include/class.orm.php b/include/class.orm.php index 63510fade1d3bfc26953d8f5633dceb3a65fe62c..3e8f9830c55f53d446278a6b7a6709f96e43189f 100644 --- a/include/class.orm.php +++ b/include/class.orm.php @@ -727,6 +727,21 @@ class VerySimpleModel { function getDbFields() { return $this->ht; } + + /** + * Create a new clone of this model. The primary key will be unset and the + * object will be set as __new__. The __clone() magic method is reserved + * by the buildModel() system, because it clone's a single instance when + * hydrating objects from the database. + */ + function copy() { + // Drop the PK and set as unsaved + $dup = clone $this; + foreach ($dup::getMeta('pk') as $f) + $dup->__unset($f); + $dup->__new__ = true; + return $dup; + } } /** @@ -814,7 +829,7 @@ trait WriteableAnnotatedModelTrait { } function __isset($what) { - if ($this->__overlay__->__isset($what)) + if (isset($this->__overlay__) && $this->__overlay__->__isset($what)) return true; return parent::__isset($what); } diff --git a/include/class.queue.php b/include/class.queue.php index 92ad23ae55f88659acdb2865a3ee57db2dbe3b79..f0994e7b7ff97b68e73e2fb911716425af879b33 100644 --- a/include/class.queue.php +++ b/include/class.queue.php @@ -60,6 +60,8 @@ class CustomQueue extends VerySimpleModel { const FLAG_INHERIT_SORTING = 0x0020; // Inherit advanced sorting from parent const FLAG_INHERIT_DEF_SORT = 0x0040; // Inherit default selected sort + const FLAG_INHERIT_EVERYTHING = 0x78; // Maskf or all INHERIT flags + var $criteria; static function queues() { diff --git a/include/staff/queue.inc.php b/include/staff/queue.inc.php index 53afb43d5efbbcbdbd8754c2a9ddfde70e497b0e..25ef7faa9876883997381b57d18c0a5a54da44a5 100644 --- a/include/staff/queue.inc.php +++ b/include/staff/queue.inc.php @@ -9,6 +9,8 @@ if (!$queue) { $queue = CustomQueue::create(array( 'flags' => CustomQueue::FLAG_QUEUE, )); +} +if ($queue->__new__) { $title=__('Add New Queue'); $action='create'; $submit_text=__('Create'); diff --git a/include/staff/templates/queue-tickets.tmpl.php b/include/staff/templates/queue-tickets.tmpl.php index 69189caf3b0c9c89626277c322cf61daca3f5bd2..f87afe61e18d926b2865a348adee13cc067a0f57 100644 --- a/include/staff/templates/queue-tickets.tmpl.php +++ b/include/staff/templates/queue-tickets.tmpl.php @@ -175,6 +175,20 @@ else { </li> <?php } +if ($thisstaff->isAdmin()) { ?> + <li> + <a class="no-pjax" + href="queues.php?a=sub&id=<?php echo $queue->id; ?>"><i + class="icon-fixed-width icon-level-down"></i> + <?php echo __('Add Sub Queue'); ?></a> + </li> + <li> + <a class="no-pjax" + href="queues.php?a=clone&id=<?php echo $queue->id; ?>"><i + class="icon-fixed-width icon-copy"></i> + <?php echo __('Clone'); ?></a> + </li> +<?php } if ( ($thisstaff->isAdmin() && $queue->parent_id) || $queue->isPrivate() diff --git a/scp/queues.php b/scp/queues.php index 5c41f79d43b166f700c05bbcbf134284e6551f88..c2a641614e47116bcd2cd9efb0ebc38b331d20eb 100644 --- a/scp/queues.php +++ b/scp/queues.php @@ -90,6 +90,25 @@ if ($_POST) { Http::redirect('settings.php?t=tickets#queues'); } } +elseif (isset($_GET['a']) + && isset($queue) && $queue instanceof CustomQueue +) { + switch (strtolower($_GET['a'])) { + case 'clone': + $queue = $queue->copy(); + // Require a new name for the queue + unset($queue->title); + break; + case 'sub': + $q = new CustomQueue([ + 'parent' => $queue, + 'flags' => CustomQueue::FLAG_QUEUE + | CustomQueue::FLAG_INHERIT_EVERYTHING, + ]); + $queue = $q; + break; + } +} require_once(STAFFINC_DIR.'header.inc.php'); include_once(STAFFINC_DIR."queue.inc.php");