Added ticket comments
This commit is contained in:
parent
4371fd0b2f
commit
5683c0bc8b
@ -74,7 +74,8 @@ input[type="submit"].button-primary
|
|||||||
#main-wrapper
|
#main-wrapper
|
||||||
margin-top: 25px
|
margin-top: 25px
|
||||||
|
|
||||||
#ticket-form
|
#ticket-form,
|
||||||
|
#comment-form
|
||||||
textarea
|
textarea
|
||||||
max-width: 100%
|
max-width: 100%
|
||||||
height: 250px
|
height: 250px
|
||||||
@ -139,3 +140,17 @@ input[type="submit"].button-primary
|
|||||||
i
|
i
|
||||||
margin-right: 5px
|
margin-right: 5px
|
||||||
font-size: 2rem
|
font-size: 2rem
|
||||||
|
|
||||||
|
#comment-form
|
||||||
|
textarea
|
||||||
|
height: 150px
|
||||||
|
|
||||||
|
.comments-list
|
||||||
|
list-style: none
|
||||||
|
margin: 0
|
||||||
|
|
||||||
|
.comment
|
||||||
|
&:not(:last-child)
|
||||||
|
border-bottom: 1px solid #666
|
||||||
|
p:last-child
|
||||||
|
margin-bottom: 5px
|
||||||
|
29
db/migrations/20221122032232_add_comments_table.php
Normal file
29
db/migrations/20221122032232_add_comments_table.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
final class AddCommentsTable extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* Write your reversible migrations using this method.
|
||||||
|
*
|
||||||
|
* More information on writing migrations is available here:
|
||||||
|
* https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
|
||||||
|
*
|
||||||
|
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||||
|
* with the Table class.
|
||||||
|
*/
|
||||||
|
public function change()
|
||||||
|
{
|
||||||
|
$table = $this->table('comments');
|
||||||
|
$table->addColumn('body', 'text', ['null' => false])
|
||||||
|
->addColumn('ticket_id', 'integer', ['null' => false])
|
||||||
|
->addTimestamps()
|
||||||
|
->addForeignKey('ticket_id', 'tickets', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
|
||||||
|
->addIndex(['body'])
|
||||||
|
->create();
|
||||||
|
}
|
||||||
|
}
|
29
src/Controllers/CommentController.php
Normal file
29
src/Controllers/CommentController.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BitGoblin\Goliath\Controllers;
|
||||||
|
|
||||||
|
use Psr\Http\Message\ResponseInterface as Response;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||||
|
use Slim\Routing\RouteContext;
|
||||||
|
use BitGoblin\Goliath\Models\Comment;
|
||||||
|
|
||||||
|
class CommentController extends Controller {
|
||||||
|
|
||||||
|
public function postAdd(Request $request, Response $response): Response {
|
||||||
|
$params = (array)$request->getParsedBody();
|
||||||
|
|
||||||
|
$comment = new Comment;
|
||||||
|
$comment->body = $params['comment_body'];
|
||||||
|
$comment->ticket_id = $params['ticket_id'];
|
||||||
|
|
||||||
|
$comment->save();
|
||||||
|
|
||||||
|
// redirect the user back to the home page
|
||||||
|
$routeContext = RouteContext::fromRequest($request);
|
||||||
|
$routeParser = $routeContext->getRouteParser();
|
||||||
|
return $response
|
||||||
|
->withHeader('Location', $routeParser->urlFor('ticket.view', ['ticket_id' => $comment->ticket->id]))
|
||||||
|
->withStatus(302);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -11,11 +11,11 @@ use BitGoblin\Goliath\Models\Ticket;
|
|||||||
class TicketController extends Controller {
|
class TicketController extends Controller {
|
||||||
|
|
||||||
public function getView(Request $request, Response $response, array $args): Response {
|
public function getView(Request $request, Response $response, array $args): Response {
|
||||||
$ticket = Ticket::where('id', $args['ticket_id'])->get();
|
$ticket = Ticket::where('id', $args['ticket_id'])->get()[0];
|
||||||
|
|
||||||
$view = Twig::fromRequest($request);
|
$view = Twig::fromRequest($request);
|
||||||
return $view->render($response, 'ticket/view.twig', [
|
return $view->render($response, 'ticket/view.twig', [
|
||||||
'ticket' => $ticket[0],
|
'ticket' => $ticket,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
28
src/Models/Comment.php
Normal file
28
src/Models/Comment.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BitGoblin\Goliath\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use League\CommonMark\CommonMarkConverter;
|
||||||
|
|
||||||
|
class Comment extends Model {
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'body',
|
||||||
|
'ticket_id',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function render(): string {
|
||||||
|
$converter = new CommonMarkConverter([
|
||||||
|
'html_input' => 'strip',
|
||||||
|
'allow_unsafe_links' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $converter->convert($this->body);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function ticket() {
|
||||||
|
return $this->belongsTo(Ticket::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -23,4 +23,8 @@ class Ticket extends Model {
|
|||||||
return $converter->convert($this->body);
|
return $converter->convert($this->body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function comments() {
|
||||||
|
return $this->hasMany(Comment::class);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,3 +17,6 @@ $app->post('/ticket/{ticket_id}/edit', '\\BitGoblin\\Goliath\\Controllers\\Ticke
|
|||||||
|
|
||||||
// /ticket/id route - displays ticket info to user
|
// /ticket/id route - displays ticket info to user
|
||||||
$app->get('/ticket/{ticket_id}', '\\BitGoblin\\Goliath\\Controllers\\TicketController:getView')->setName('ticket.view');
|
$app->get('/ticket/{ticket_id}', '\\BitGoblin\\Goliath\\Controllers\\TicketController:getView')->setName('ticket.view');
|
||||||
|
|
||||||
|
// add a comment to a ticket
|
||||||
|
$app->post('/comment/add', '\\BitGoblin\\Goliath\\Controllers\\CommentController:postAdd')->setName('comment.add');
|
||||||
|
@ -48,7 +48,31 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="twelve columns">
|
<div class="twelve columns">
|
||||||
<h3>Ticket comments/Updates</h3>
|
<h3>Ticket comments/Updates</h3>
|
||||||
<p>There are no comments to display at this time.</p>
|
{% if ticket.comments | length > 0 %}
|
||||||
|
<ul class="comments-list">
|
||||||
|
{% for comment in ticket.comments %}
|
||||||
|
<li class="comment">{{ comment.render() | raw }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>There are no comments to display at this time.</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<!-- add a comment form -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="twelve columns">
|
||||||
|
<form id="comment-form" action="{{ url_for('comment.add') }}" method="POST" class="u-full-width">
|
||||||
|
<label for="comment_body">Add a comment:</label>
|
||||||
|
<textarea id="comment_body" class="u-full-width" placeholder="Add a comment..." name="comment_body"></textarea>
|
||||||
|
|
||||||
|
<input type="hidden" name="ticket_id" value="{{ ticket.id }}">
|
||||||
|
|
||||||
|
<input class="button-primary u-full-width" type="submit" value="Submit">
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
Reference in New Issue
Block a user