diff --git a/app/controllers/TicketController.php b/app/controllers/TicketController.php index 1282c38..80f2973 100644 --- a/app/controllers/TicketController.php +++ b/app/controllers/TicketController.php @@ -36,7 +36,20 @@ class TicketController extends BaseController implements CRUD { $ticket_id = $f3->get('PARAMS.id'); $ticket_mapper = new Ticket($this->getDB()); $ticket = $ticket_mapper->findById($ticket_id); + + if(!$ticket){ + $this->f3->set('SESSION.error', 'Ticket not found'); + $this->f3->reroute('/tickets'); + return; + } + $assigned_user = $ticket->getAssignedUser(); + $ticket_history = $ticket->getHistory(); + + $map_statuses = array_column((new TicketStatus($this->getDB()))->findAll(), 'name', 'id'); + $map_priorities = array_column((new TicketStatus($this->getDB()))->findAll(), 'name', 'id'); + $map_users = array_column($this->getDB()->exec('SELECT id, display_name FROM users'), 'display_name', 'id'); + // render $this->renderView('views/ticket/view.html', [ @@ -46,7 +59,13 @@ class TicketController extends BaseController implements CRUD { 'comments' => $ticket->comments(), 'parent_tickets' => $ticket->getParentTickets(), 'child_tickets' => $ticket->getChildTickets(), - 'ticket_meta' => $ticket->getMetaAssoc() + 'ticket_meta' => $ticket->getMetaAssoc(), + 'ticket_history' => $ticket_history, + 'map' => [ + 'statuses' => $map_statuses, + 'priorities' => $map_priorities, + 'users' => $map_users + ] ]); } @@ -58,6 +77,9 @@ class TicketController extends BaseController implements CRUD { $priorities = (new TicketPriority($db))->findAll(); $statuses = (new TicketStatus($db))->findAll(); + $all_tags_model = new \Tag($this->getDB()); + $all_tags = $all_tags_model->find([], ['order' => 'name ASC']); // get all tags + // TODO: this needs moving into a model? $users = $this->getDB()->exec('SELECT id, username, display_name FROM users ORDER BY display_name ASC'); $users = array_merge([['id'=>'-1', 'display_name'=>'--']], $users); @@ -66,7 +88,8 @@ class TicketController extends BaseController implements CRUD { $this->renderView('views/ticket/create.html',[ 'priorities' => $priorities, 'statuses' => $statuses, - 'users' => $users + 'users' => $users, + 'all_tags' => $all_tags ]); } @@ -83,18 +106,29 @@ class TicketController extends BaseController implements CRUD { 'description' => $this->f3->get('POST.description'), 'priority_id' => $this->f3->get('POST.priority_id'), 'status_id' => $this->f3->get('POST.status_id'), - 'created_by' => $this->f3->get('SESSION.user.id') + 'created_by' => $this->f3->get('SESSION.user.id'), + 'assigned_to' => $this->f3->get('POST.assigned_to') == '-1' ? null : $this->f3->get('POST.assigned_to') ]; $ticket_mapper = new Ticket($this->getDB()); $new_ticket_id = $ticket_mapper->createTicket($data); // custom field - $meta_keys = $this->f3->get('POST.meta_key'); - $meta_values = $this->f3->get('POST.meta_value'); - $meta_assoc = $ticket_mapper->assocMetaFromKeyValue($meta_keys, $meta_values); - $ticket_mapper->setCustomFields($meta_assoc); + // $meta_keys = $this->f3->get('POST.meta_key'); + // $meta_values = $this->f3->get('POST.meta_value'); + // $meta_assoc = $ticket_mapper->assocMetaFromKeyValue($meta_keys, $meta_values); + // $ticket_mapper->setCustomFields($meta_assoc); + $new_ticket = $ticket_mapper->findById($new_ticket_id); + if($new_ticket){ + // TAG handling for create + $posted_tags = $this->f3->get('POST.tags'); + if(!empty($posted_tags) && is_array($posted_tags)){ + $new_ticket->setTags($posted_tags); + } + } + + $this->f3->set('SESSION.message', 'Ticket #' . $new_ticket_id . ' created successfully.'); $this->f3->reroute('/ticket/' . $new_ticket_id); } @@ -120,16 +154,29 @@ class TicketController extends BaseController implements CRUD { // dropdowns $priorities = (new TicketPriority($this->getDB()))->findAll(); $statuses = (new TicketStatus($this->getDB()))->findAll(); + $all_tags_model = new \Tag($this->getDB()); + $all_tags = $all_tags_model->find([], ['order' => 'name ASC']); + // TODO: this needs moving into a model? $users = $this->getDB()->exec('SELECT id, username, display_name FROM users ORDER BY display_name ASC'); $users = array_merge([['id'=>'-1', 'display_name'=>'--']], $users); + // paradox - empty($ticket->tags) was returning true, when there were items present + $current_ticket_tag_ids = []; + if(count($ticket->tags) > 0){ + foreach($ticket->tags as $current_tag_data){ + $current_ticket_tag_ids[] = $current_tag_data['id']; + } + } + $this->renderView('views/ticket/edit.html',[ 'ticket' => $ticket, 'ticket_meta' => $ticket->getMeta(), 'priorities' => $priorities, 'statuses' => $statuses, - 'users' => $users + 'users' => $users, + 'all_tags' => $all_tags, + 'current_ticket_tag_ids' => $current_ticket_tag_ids ] ); return; @@ -142,32 +189,40 @@ class TicketController extends BaseController implements CRUD { $this->requireLogin(); $this->checkCSRF($f3, '/ticket/create'); - $ticket_id = $this->f3->get('PARAMS.id'); + $ticket_id = $f3->get('PARAMS.id'); $ticket_mapper = new Ticket($this->getDB()); $ticket = $ticket_mapper->findById($ticket_id); if(!$ticket){ - $this->f3->set('SESSION.error', 'Ticket not found.'); - $this->f3->reroute('/tickets'); + $f3->set('SESSION.error', 'Ticket not found.'); + $f3->reroute('/tickets'); } $data = [ - 'title' => $this->f3->get('POST.title'), - 'created_at' => $this->f3->get('POST.created_at'), - 'description' => $this->f3->get('POST.description'), - 'priority_id' => $this->f3->get('POST.priority_id'), - 'status_id' => $this->f3->get('POST.status_id'), - 'updated_by' => $this->f3->get('SESSION.user.id') , - 'assigned_to' => $this->f3->get('POST.assigned_to') ?: null + 'title' => $f3->get('POST.title'), + 'created_at' => $f3->get('POST.created_at'), + 'description' => $f3->get('POST.description'), + 'priority_id' => $f3->get('POST.priority_id'), + 'status_id' => $f3->get('POST.status_id'), + 'updated_by' => $f3->get('SESSION.user.id') , + 'assigned_to' => $f3->get('POST.assigned_to') == -1 ? null : $f3->get('POST.assigned_to') ]; $ticket->updateTicket($data); // deal with meta data / custom fields - $meta_keys = $this->f3->get('POST.meta_key'); - $meta_values = $this->f3->get('POST.meta_value'); - $meta_assoc = $ticket->assocMetaFromKeyValue($meta_keys, $meta_values); - $ticket->setCustomFields($meta_assoc); + // $meta_keys = $this->f3->get('POST.meta_key'); + // $meta_values = $this->f3->get('POST.meta_value'); + // $meta_assoc = $ticket->assocMetaFromKeyValue($meta_keys, $meta_values); + // $ticket->setCustomFields($meta_assoc); + $posted_tags = $f3->get('POST.tags'); + if(is_array($posted_tags)){ + $ticket->setTags($posted_tags); + } elseif (empty($posted_tags)){ + $ticket->setTags([]); + } + + $f3->set('SESSION.message', 'Ticket #' . $ticket_id . ' updated successfully.') ; $f3->reroute('/ticket/' . $ticket_id); } diff --git a/app/extensions/BulmaFormHelper.php b/app/extensions/BulmaFormHelper.php index 4b8fab8..167cf65 100644 --- a/app/extensions/BulmaFormHelper.php +++ b/app/extensions/BulmaFormHelper.php @@ -14,7 +14,11 @@ class BulmaFormHelper extends \Prefab { static public function render($node) { $attr = $node['@attrib'] ?? []; - $type = strtoupper($attr['type']) ?? null; + if(isset($attr['type'])){ + $type = strtoupper($attr['type']); + } else { + $type = null; + } // all * $label = $attr['label'] ?? ''; diff --git a/app/extensions/IconsHelper.php b/app/extensions/IconsHelper.php index 00b6b72..569592f 100644 --- a/app/extensions/IconsHelper.php +++ b/app/extensions/IconsHelper.php @@ -46,8 +46,9 @@ class IconsHelper extends \Prefab { switch($attr['type']){ case 'status-selector': - $selected = Base::instance()->get('GET.status') ?: null; - return 'renderStatusSelector("'.$selected.'", "'.$path.'"); ?>'; + // $selected = Base::instance()->get('GET.status') ?: null; + return 'renderStatusSelector( + Base::instance()->get("GET.status") ?: null, "'.$path.'"); ?>'; return self::renderStatusSelector($selected, $path); default: @@ -87,7 +88,7 @@ class IconsHelper extends \Prefab { foreach (self::$status_icons as $k => $icon) { $active = ($current_status == $k); $url = $path . ($active ? '' : '/?status=' . $k); - $class = 'button' . ($active ? ' is-primary' : ''); + $class = 'button' . ($active ? ' is-inverted' : ''); $output .= '