Skip to content

Commit a574bd2

Browse files
committed
Merge branch 'unread' into dev
2 parents 1d5386f + 1921100 commit a574bd2

10 files changed

Lines changed: 173 additions & 44 deletions

File tree

src/Controllers/TicketsController.php

Lines changed: 62 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function __construct(Ticket $tickets)
4848
{
4949
$this->middleware('PanicHD\PanicHD\Middleware\EnvironmentReadyMiddleware', ['only' => ['create']]);
5050
$this->middleware('PanicHD\PanicHD\Middleware\UserAccessMiddleware', ['only' => ['show', 'downloadAttachment', 'viewAttachment']]);
51-
$this->middleware('PanicHD\PanicHD\Middleware\AgentAccessMiddleware', ['only' => ['edit', 'update', 'changeAgent', 'changePriority', 'changeStatus', 'hide']]);
51+
$this->middleware('PanicHD\PanicHD\Middleware\AgentAccessMiddleware', ['only' => ['edit', 'update', 'changeRead', 'changeAgent', 'changePriority', 'changeStatus', 'hide']]);
5252
$this->middleware('PanicHD\PanicHD\Middleware\IsAdminMiddleware', ['only' => ['destroy']]);
5353
$this->middleware('PanicHD\PanicHD\Middleware\IsAgentMiddleware', ['only' => ['search_form', 'register_search_fields']]);
5454

@@ -258,7 +258,7 @@ public function get_last_update($ticketList)
258258
*
259259
* @return String
260260
*/
261-
public function last_update_string($ticketList)
261+
public function last_update_string($ticketList = null)
262262
{
263263
$last_update = Ticket::orderBy('updated_at', 'desc')->first();
264264

@@ -405,13 +405,22 @@ public function renderTicketTable($collection, $ticketList)
405405

406406
// Column edits
407407
$collection->editColumn('id', function ($ticket) {
408-
return '<div class="tooltip-wrap-15' . (($this->member->id == $ticket->agent_id and $ticket->read_by_agent == "0") ? ' unread_ticket_text"' : '' ) . '">'
408+
$column = '<div class="tooltip-wrap-15' . (($this->member->id == $ticket->agent_id and $ticket->read_by_agent != "1") ? ' unread_ticket_text"' : '' ) . '">'
409409
.'<div class="tooltip-info" data-toggle="tooltip" title="'
410410
.trans('panichd::lang.creation-date', ['date' => Carbon::parse($ticket->created_at)->format(trans('panichd::lang.datetime-format'))])
411411
.'">'.$ticket->id
412-
.'</div>'
413-
. (($this->member->id == $ticket->agent_id and $ticket->read_by_agent == "0") ? '<div class="tooltip-info" data-toggle="tooltip" title="' . trans('panichd::lang.updated-by-other') . '"><i class="fas fa-user-edit"></i></div>' : '')
414412
.'</div>';
413+
414+
if ($this->member->id == $ticket->agent_id){
415+
// For assigned agent: Mark ticket as read / unread
416+
$column.= '<button class="btn btn-light btn-xs unread_toggle tooltip-info" data-ticket_id="' . $ticket->id . '" data-toggle="tooltip" '
417+
. ' title="' . ($ticket->read_by_agent == "2" ? trans('panichd::lang.mark-as-read') : trans('panichd::lang.mark-as-unread')) . '">'
418+
. '<i class="fas ' . ($ticket->read_by_agent == "2" ? 'fa-user-lock' : ($ticket->read_by_agent == "1" ? 'fa-user' : 'fa-user-edit')) . '"></i></button>';
419+
}
420+
421+
$column.= '</div>';
422+
423+
return $column;
415424
});
416425

417426
$collection->editColumn('subject', function ($ticket) {
@@ -421,7 +430,7 @@ public function renderTicketTable($collection, $ticketList)
421430
$ticket->id
422431
);
423432

424-
if ($this->member->id == $ticket->agent_id and $ticket->read_by_agent == "0"){
433+
if ($this->member->id == $ticket->agent_id and $ticket->read_by_agent != "1"){
425434
$field = '<span class="unread_ticket_text">' . $field . '</span>';
426435
}
427436

@@ -1863,18 +1872,16 @@ public function show($id)
18631872

18641873
$a_resend_notifications = $this->get_resend_notifications($ticket, $all_comments);
18651874

1866-
if ($this->member->currentLevel() > 1 and $this->member->id == $ticket->agent_id){
1867-
if ($ticket->read_by_agent == '0'){
1868-
// Mark ticket as read
1869-
$ticket->read_by_agent = 1;
1870-
$ticket->save();
1871-
1872-
// Mark comments as read
1873-
foreach ($all_comments->get() as $comment){
1874-
if ($comment->read_by_agent == '0'){
1875-
$comment->read_by_agent = 1;
1876-
$comment->save();
1877-
}
1875+
if ($this->member->currentLevel() > 1 and $this->member->id == $ticket->agent_id and $ticket->read_by_agent == '0'){
1876+
// Mark ticket as read
1877+
$ticket->read_by_agent = 1;
1878+
$ticket->save();
1879+
1880+
// Mark comments as read
1881+
foreach ($all_comments->get() as $comment){
1882+
if ($comment->read_by_agent != '1'){
1883+
$comment->read_by_agent = 1;
1884+
$comment->save();
18781885
}
18791886
}
18801887
}
@@ -2005,7 +2012,7 @@ public function update(Request $request, $id)
20052012
$ticket->agent_id = $request->input('agent_id');
20062013
}
20072014

2008-
if ($ticket->agent_id != $this->member->id){
2015+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
20092016
// Ticket will be unread for assigned agent
20102017
$ticket->read_by_agent = 0;
20112018
}
@@ -2237,7 +2244,7 @@ public function complete(Request $request, $id)
22372244

22382245
$ticket->completed_at = Carbon::now();
22392246

2240-
if ($ticket->agent_id != $this->member->id){
2247+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
22412248
// Ticket will be unread for assigned agent
22422249
$ticket->read_by_agent = 0;
22432250
}
@@ -2300,7 +2307,7 @@ public function complete_change_actions($ticket, $member, $member_reason = false
23002307
$comment->user_id = $this->member->id;
23012308
$comment->ticket_id = $ticket->id;
23022309

2303-
if ($ticket->agent_id != $this->member->id){
2310+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
23042311
// Ticket will be unread for assigned agent
23052312
$comment->read_by_agent = 0;
23062313
}
@@ -2329,7 +2336,7 @@ public function reopen($id)
23292336
$ticket->intervention = $ticket->intervention . ' ' . $date . ' ' . trans('panichd::lang.reopened-by-user', ['user' => $this->member->name]);
23302337
$ticket->intervention_html = $ticket->intervention_html . '<br />' . $date . ' ' . trans('panichd::lang.reopened-by-user', ['user' => $this->member->name]);
23312338

2332-
if ($ticket->agent_id != $this->member->id){
2339+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
23332340
// Ticket will be unread for assigned agent
23342341
$ticket->read_by_agent = 0;
23352342
}
@@ -2383,6 +2390,35 @@ public function agentList ($category_id)
23832390
}
23842391
}
23852392

2393+
/*
2394+
* AJAX Mark ticket as read / unread
2395+
*
2396+
* @return Response
2397+
*/
2398+
public function changeRead(Request $request)
2399+
{
2400+
$result = "error";
2401+
$message = trans('panichd::lang.read-validation-error');
2402+
2403+
$original_ticket = Ticket::findOrFail($request->input('ticket_id'));
2404+
$ticket = clone $original_ticket;
2405+
2406+
if ($ticket->agent->id == auth()->user()->id){
2407+
$ticket->read_by_agent = $ticket->read_by_agent == "2" ? "1" : "2";
2408+
$ticket->save();
2409+
2410+
$result = "ok";
2411+
$message = trans('panichd::lang.read-validation-ok-' . ($ticket->read_by_agent == "1" ? 'read' : 'unread'));
2412+
}
2413+
2414+
return response()->json([
2415+
'result' => $result,
2416+
'message' => $message,
2417+
'read_by_agent' => $ticket->read_by_agent,
2418+
'last_update' => $this->last_update_string()
2419+
]);
2420+
}
2421+
23862422
/*
23872423
* AJAX agent change in ticket list
23882424
*
@@ -2455,7 +2491,7 @@ public function changePriority(Request $request){
24552491
}else{
24562492
$ticket->priority_id = $request->input('priority_id');
24572493

2458-
if ($ticket->agent_id != $this->member->id){
2494+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
24592495
// Ticket will be unread for assigned agent
24602496
$ticket->read_by_agent = 0;
24612497
}
@@ -2501,7 +2537,7 @@ public function changeStatus(Request $request){
25012537
}else{
25022538
$ticket->status_id = $request->input('status_id');
25032539

2504-
if ($ticket->agent_id != $this->member->id){
2540+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
25052541
// Ticket will be unread for assigned agent
25062542
$ticket->read_by_agent = 0;
25072543
}
@@ -2539,7 +2575,7 @@ public function hide($value, $id)
25392575

25402576
$ticket->hidden = $value=='true' ? 1 : 0;
25412577

2542-
if ($ticket->agent_id != $this->member->id){
2578+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
25432579
// Ticket will be unread for assigned agent
25442580
$ticket->read_by_agent = 0;
25452581
}
@@ -2572,7 +2608,7 @@ public function hide_actions($ticket)
25722608
$comment->user_id = $this->member->id;
25732609
$comment->ticket_id = $ticket->id;
25742610

2575-
if ($ticket->agent_id != $this->member->id){
2611+
if ($ticket->agent_id != $this->member->id and $ticket->read_by_agent != "2"){
25762612
// Ticket will be unread for assigned agent
25772613
$comment->read_by_agent = 0;
25782614
}

src/Public/css/panichd.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,15 @@ h1, h2, h3, h4, h5, h6 {
145145
background-color: #f8f9fa;
146146
}
147147

148+
/* Mark as read / unread button */
149+
.unread_toggle {
150+
background-color: transparent;
151+
border-color: transparent;
152+
}
153+
.unread_toggle .fa-user {
154+
color: #ccc;
155+
}
156+
148157
/* Unread ticket highlighted text style */
149158
.unread_ticket_text {
150159
font-weight: bold;
@@ -261,6 +270,7 @@ h1, h2, h3, h4, h5, h6 {
261270
/*
262271
* Tickets table
263272
*/
273+
264274
#tickets-table .fa.attachment, #tickets-table .fa.comment, #tickets-table .fa.tickethidden {
265275
color: #999;
266276
}

src/Translations/ca/lang.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
'no-tickets-yet' => 'Encara no hi ha tiquets',
4040
'list-no-tickets' => 'En aquesta llista no hi ha tiquets',
4141
'updated-by-other' => 'Actualitzat per un altre membre',
42+
'mark-as-read' => 'Marcar aquest tiquet com a llegit',
43+
'mark-as-unread' => 'Marcar i bloquejar aquest tiquet com a no llegit',
44+
'read-validation-error' => 'No s\'ha pogut marcar aquest tiquet com a llegit / no llegit',
45+
'read-validation-ok-read' => 'Tiquet marcat com a llegit',
46+
'read-validation-ok-unread' => 'Tiquet marcat com a no llegit',
47+
4248
'table-info-attachments-total' => ':num fitxers adjunts',
4349
'table-info-comments-total' => ':num comentaris totals.',
4450
'table-info-comments-recent' => ':num recents.',

src/Translations/en/lang.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
'no-tickets-yet' => 'No tickets yet', # Pending to move old admin.index-empty-records in other languages
4040
'list-no-tickets' => 'There are no tickets in this list',
4141
'updated-by-other' => 'Updated by other member',
42+
'mark-as-read' => 'Mark this ticket as read',
43+
'mark-as-unread' => 'Mark and lock this ticket as unread',
44+
'read-validation-error' => 'Could not mark ticket as read / unread',
45+
'read-validation-ok-read' => 'Ticket marked as read',
46+
'read-validation-ok-unread' => 'Ticket marked as unread',
47+
4248
'table-info-attachments-total' => ':num attached files',
4349
'table-info-comments-total' => ':num Total comments.',
4450
'table-info-comments-recent' => ':num recent ones.',

src/Translations/es/lang.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
'table-category' => 'Categoría',
2121

2222
'updated-by-other' => 'Actualizado por otro miembro',
23+
'mark-as-read' => 'Marcar este tique como leído',
24+
'mark-as-unread' => 'Marcar y bloquear este tique como no leído',
25+
'read-validation-ok-read' => 'Tique marcado como leído',
26+
'read-validation-ok-unread' => 'Tique marcado como no leído',
2327

2428
// Datatables
2529
'table-decimal' => '',

src/Views/tickets/datatable/events.blade.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
<script>
22
$(function(){
3+
// Mark ticket as read / unread
4+
$(document).off('click', '.unread_toggle');
5+
$(document).on('click', '.unread_toggle', function(e){
6+
e.preventDefault();
7+
8+
$.ajax({
9+
type: "POST",
10+
url: '{{ route($setting->grab('main_route').'.ajax.read') }}',
11+
data: {
12+
_token: "{{ csrf_token() }}",
13+
ticket_id: $(this).attr('data-ticket_id')
14+
},
15+
16+
success: function( response ) {
17+
success_popover(response);
18+
}
19+
});
20+
});
21+
322
// Plus / less buttons for text fields
423
$(document).on('click', '.jquery_ticket_text_toggle', function(e){
524
var remove = $(this).find('span.fa').hasClass("fa-plus") ? 'plus' : 'minus';

src/Views/tickets/partials/comments/list.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@
6060
{!! $comment->updated_at->diffForHumans() !!}
6161
</div></div></div>
6262
@else
63-
<div class="card mb-3 bg-light @if($u->id == $ticket->agent_id && $comment->read_by_agent == '0') unread_comment @endif">
63+
<div class="card mb-3 bg-light @if($u->id == $ticket->agent_id && $comment->read_by_agent != '1') unread_comment @endif">
6464
<div class="card-header pt-2 pr-3 pb-1 pl-2">
65-
<h6 class="card-title mb-0 @if($u->id == $ticket->agent_id && $comment->read_by_agent == '0') text-white @endif">
65+
<h6 class="card-title mb-0 @if($u->id == $ticket->agent_id && $comment->read_by_agent != '1') text-white @endif">
6666
<span class="float-right">
6767
<span class="tooltip-info" data-toggle="tooltip" data-placement="top" title="{{ trans('panichd::lang.creation-date', [
6868
'date' => \Carbon\Carbon::parse($comment->created_at)->format(trans('panichd::lang.datetime-format'))

src/Views/tickets/show/body.blade.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
<div class="card">
22
<div id="ticket-body" class="card-body">
33
<div class="d-lg-flex mb-2">
4-
<h2 class="mr-auto">
5-
@if ($ticket->completed_at)
6-
<span class="text-success"><span class="fa fa-check-circle" title="tiquet completat" style="cursor: help"></span> {{ $ticket->subject }}</span>
7-
@else
8-
<span class="text-warning"><span class="fa fa-file" title="tiquet obert" style="cursor: help"></span> {{ $ticket->subject }}</span>
9-
@endif
4+
<h2 class="mr-auto @if($ticket->agent->id == $u->id && $ticket->read_by_agent != "1") unread_ticket_text @endif">
5+
@if ($ticket->completed_at)
6+
<span class="text-success"><span class="fa fa-check-circle" title="tiquet completat" style="cursor: help"></span> {{ $ticket->subject }}</span>
7+
@else
8+
<span class="text-warning"><span class="fa fa-file" title="tiquet obert" style="cursor: help"></span> {{ $ticket->subject }}</span>
9+
@endif
1010
</h2>
1111

1212
<div class="text-right">
13+
@if ($u->id == $ticket->agent_id)
14+
{{-- For assigned agent: Mark ticket as read / unread --}}
15+
<button class="btn btn-light unread_toggle tooltip-info" style="color: #aaa" data-ticket_id="{{ $ticket->id }}" data-toggle="tooltip" title="{{ $ticket->read_by_agent == "2" ? trans('panichd::lang.mark-as-read') : trans('panichd::lang.mark-as-unread') }}">
16+
<i class="fas {{ ($ticket->read_by_agent == "2" ? 'fa-user-lock' : ($ticket->read_by_agent == "1" ? 'fa-user' : 'fa-user-edit')) }}"></i>
17+
</button>
18+
@endif
1319
@if ($u->currentLevel() > 1)
1420
<a href="{{ route($setting->grab('main_route').'.hide', ['value' => $ticket->hidden ? 'false' : 'true', 'ticket'=>$ticket->id]) }}" class="btn btn-light tooltip-info" style="border: none; color: #aaa;" data-toggle="tooltip" data-placement="top" title="{{ trans('panichd::lang.ticket-hidden-button-title') }}">{!! $ticket->hidden ? '<span class="fa fa-eye-slash"></span> '.trans('panichd::lang.ticket-hidden') : '<span class="fa fa-eye"></span> '.trans('panichd::lang.ticket-visible') !!}</a>
1521
@endif

src/Views/tickets/show/scripts.blade.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,41 @@
1919
2020
var category_id=<?=$ticket->category_id;?>;
2121
$(document).ready(function() {
22+
// Mark ticket as read / unread
23+
$(document).on('click', '.unread_toggle', function(e){
24+
e.preventDefault();
25+
26+
$.ajax({
27+
type: "POST",
28+
url: '{{ route($setting->grab('main_route').'.ajax.read') }}',
29+
data: {
30+
_token: "{{ csrf_token() }}",
31+
ticket_id: $(this).attr('data-ticket_id')
32+
},
33+
34+
success: function( response ) {
35+
if (response.result == "ok"){
36+
if (response.read_by_agent == "1"){
37+
// Mark ticket subject
38+
$('#ticket-body h2').removeClass('unread_ticket_text');
39+
40+
// Change icon
41+
$('.unread_toggle i.fas').removeClass().addClass('fas').addClass('fa-user');
42+
}else{
43+
$('#ticket-body h2').addClass('unread_ticket_text');
44+
$('.unread_toggle i.fas').removeClass().addClass('fas').addClass('fa-user-lock');
45+
}
46+
47+
// Update button title
48+
$('.unread_toggle').blur().tooltip('dispose');
49+
$('.unread_toggle').prop('title', response.read_by_agent == "2" ? '{{ trans('panichd::lang.mark-as-read') }}' : '{{ trans('panichd::lang.mark-as-unread') }}');
50+
$('.unread_toggle').tooltip();
51+
}
52+
}
53+
});
54+
});
55+
56+
// Delete ticket
2257
$( ".deleteit" ).click(function( event ) {
2358
event.preventDefault();
2459
if (confirm("{!! trans('panichd::lang.show-ticket-js-delete') !!}" + $(this).attr("node") + " ?"))

src/routes.php

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,24 @@
100100
'uses' => 'PanicHD\PanicHD\Controllers\TicketsController@permissionLevel',
101101
]);
102102

103-
// Ticket list: Change a ticket agent
104-
Route::POST("$main_route_path/ajax/agent", 'PanicHD\PanicHD\Controllers\TicketsController@changeAgent')
105-
->name("$main_route.ajax.agent");
106-
107-
// Ticket list: Change a ticket priority
108-
Route::POST("$main_route_path/ajax/priority", 'PanicHD\PanicHD\Controllers\TicketsController@changePriority')
109-
->name("$main_route.ajax.priority");
103+
Route::group(['prefix' => $main_route_path . '/ajax'], function() use ($main_route){
110104

111-
// Ticket list: Change a ticket status
112-
Route::POST("$main_route_path/ajax/status", 'PanicHD\PanicHD\Controllers\TicketsController@changeStatus')
113-
->name("$main_route.ajax.status");
105+
// Ticket list: Mark as read / unread
106+
Route::POST("read", 'PanicHD\PanicHD\Controllers\TicketsController@changeRead')
107+
->name("$main_route.ajax.read");
108+
109+
// Ticket list: Change a ticket agent
110+
Route::POST("agent", 'PanicHD\PanicHD\Controllers\TicketsController@changeAgent')
111+
->name("$main_route.ajax.agent");
112+
113+
// Ticket list: Change a ticket priority
114+
Route::POST("priority", 'PanicHD\PanicHD\Controllers\TicketsController@changePriority')
115+
->name("$main_route.ajax.priority");
116+
117+
// Ticket list: Change a ticket status
118+
Route::POST("status", 'PanicHD\PanicHD\Controllers\TicketsController@changeStatus')
119+
->name("$main_route.ajax.status");
120+
});
114121

115122
Route::group(['middleware' => 'PanicHD\PanicHD\Middleware\IsAgentMiddleware'], function () use ($main_route, $main_route_path) {
116123

0 commit comments

Comments
 (0)