This commit is contained in:
noah.lancien 2023-04-12 09:40:01 +00:00 • committed by Vincent BRIDIER
parent b57c9e9510
commit 9742e805d0
9 changed files with 179 additions and 49 deletions

38
app/Enums/MessageType.php Normal file
View file

@ -0,0 +1,38 @@
<?php
namespace App\Enums;
use Kwaadpepper\Enum\BaseEnumRoutable;
/**
* @method static self private()
* @method static self public()
*/
class MessageType extends BaseEnumRoutable
{
/**
* Enum values
*
* @return array
*/
protected static function values(): array
{
return [
'private' => 1,
'public' => 2
];
}
/**
* Enum labels
*
* @return array
*/
protected static function labels(): array
{
return [
'private' => trans('Privé'),
'public' => trans('Public'),
];
}
}

View file

@ -433,7 +433,7 @@ class TicketController extends Controller
/** @var \App\Models\User|null */
if ($assignedUser = User::whereId($request->assign)->first()) {
$message = trans(':admin à assigné le ticket n°:ticketNumber à :assignedAdmin', [
$message = trans(':admin a assigné le ticket n°:ticketNumber à :assignedAdmin', [
'admin' => $user->name,
'ticketNumber' => $ticket->id,
'assignedAdmin' => $assignedUser->name,
@ -441,7 +441,7 @@ class TicketController extends Controller
$ticket->assignedUser()->associate($assignedUser);
} else {
$message = trans(
':admin modifié l\'assignation du ticket n°:ticketNumber, il n\'est plus assigné à quelqu\'un.',
':admin a modifié l\'assignation du ticket n°:ticketNumber, il n\'est plus assigné à quelqu\'un.',
[
'admin' => $user->name,
'ticketNumber' => $ticket->id,

View file

@ -2,7 +2,9 @@
namespace App\Http\Requests;
use App\Enums\MessageType;
use Illuminate\Foundation\Http\FormRequest;
use Kwaadpepper\Enum\Rules\EnumIsValidRule;
class CreateMessage extends FormRequest
{
@ -17,6 +19,12 @@ class CreateMessage extends FormRequest
if (!($user = auth()->user())) {
return false;
}
if (
!auth()->user()->can('createPrivateMessage', request()->route()->ticket)
&& $this->is_private == MessageType::private()
) {
return false;
}
return auth()->check() and auth()->user()->sites and (
$user->isAdmin() or
auth()->user()->sites->contains(request()->route()->ticket->site_id)
@ -33,7 +41,8 @@ class CreateMessage extends FormRequest
protected function prepareForValidation()
{
$this->merge([
'subscribe' => $this->subscribe ? true : false
'subscribe' => $this->subscribe ? true : false,
'type' => $this->is_private ? MessageType::private()->value : MessageType::public()->value
]);
}
@ -49,7 +58,11 @@ class CreateMessage extends FormRequest
return [
'subscribe' => 'required|boolean',
'message' => 'required|min:' . ($user->isAdmin() ? '5' : '20'),
'file_message' => 'sometimes|mimes:jpeg,jpg,png,pdf|max:2048'
'file_message' => 'sometimes|mimes:jpeg,jpg,png,pdf|max:2048',
'type' => [
'required',
new EnumIsValidRule(MessageType::class)
]
];
}
}

View file

@ -2,6 +2,7 @@
namespace App\Listeners;
use App\Enums\MessageType;
use App\Enums\TicketStatus;
use App\Events\TicketStatusChanged;
use App\Models\Message;
@ -21,7 +22,6 @@ class AddStatusMessages
if ($event->message) {
$message->message = $event->message;
} elseif ($event->user) {
// phpcs:ignore Generic.Files.LineLength.TooLong
$message->message = sprintf(
"<b>%s</b> %s <b>%s</b>",
$event->user->name,
@ -91,7 +91,8 @@ class AddStatusMessages
__("Ce ticket est clos.")
);
break;
}
} //end switch
$message->type = MessageType::public();
$message->save();
}
}

View file

@ -2,14 +2,17 @@
namespace App\Models;
use App\Enums\MessageType;
use App\Events\NotifySubscriptions;
use App\Events\NotifyTicketCreator;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Kwaadpepper\Enum\Traits\CastsEnums;
class Message extends Model
{
use HasFactory;
use CastsEnums;
/**
* The attributes that are mass assignable.
@ -17,7 +20,17 @@ class Message extends Model
* @var array
*/
protected $fillable = [
'message'
'message',
'type'
];
/**
* The attributes that should be cast to Enums.
*
* @var array
*/
protected $enumCasts = [
'type' => MessageType::class
];
/**

View file

@ -46,6 +46,10 @@ class TicketPolicy extends RootPolicy
]),
'suscribeToTicket' => TicketStaticRules::make('ticketIsNotArchived', $model),
'createMessage' => TicketStaticRules::make('ticketIsNotArchived', $model),
'createPrivateMessage' => StaticRules::and([
URR::make('userIsAdmin', $user),
TicketStaticRules::make('ticketIsNotArchived', $model),
]),
'updateMessage' => StaticRules::or([
URR::make('userIsAdmin', $user),
TicketStaticRules::make('ticketIsNotArchived', $model),

View file

@ -245,6 +245,7 @@ return [
'TableRow' => App\Enums\Planning\TableRow::class,
'ActivityEnum' => App\Enums\MacroSchedule\Activity::class,
'ProjectStatus' => App\Enums\ProjectStatus::class,
'MessageTypeEnum' => App\Enums\MessageType::class,
],
];

View file

@ -0,0 +1,42 @@
<?php
use App\Enums\MessageType;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class AddMessageType extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('messages', function (Blueprint $table) {
$table->unsignedTinyInteger('type')
->comment('Message Type defined by an enum.')
->after('message');
});
// Set all existing messages as public.
$messages = DB::table('messages')->get();
collect($messages)->map(function (object $message) {
DB::table('messages')->where('id', $message->id)
->update(['type' => MessageType::public()]);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('messages', function (Blueprint $table) {
$table->dropColumn('type');
});
}
}

View file

@ -126,6 +126,16 @@
</div>
</div>
</div>
@can('createPrivateMessage', $ticket)
<div class="row mt-4">
<div class="col">
<div class="form-check">
<input name="is_private" type="checkbox" class="form-check-input" id="setPrivate" autocomplete="off" value="{{MessageTypeEnum::private()}}">
<label class="form-check-label" for="setPrivate">{{ __('Rendre le message privé') }}</label>
</div>
</div>
</div>
@endif
</div>
<div class="modal-footer">
<button type="reset" class="btn btn-sm btn-danger" data-bs-dismiss="modal">{{ __('Fermer') }}</button>
@ -147,53 +157,61 @@
<small class="fw-bold">({{ __('Message système') }})</small>
</div>
@else
<div class="@if($message->user_id === Auth::user()->id)offset-md-4 alert-dark @else alert-light @endif col-md-8 alert">
{!! ToolboxHelper::plainToHtml($message->message) !!}
@if ($message->file !== null)
<br><a @if(ToolboxHelper::isImageFile($message->file))data-fslightbox="gallery" @endif href="{{ asset($message->file) }}" target="_blank">Ouvrir la pièce jointe</a><br>
@endif<br><br>
<small class="text-muted fw-bold">
{!! __('Créé le :date par <b>:userName</b>', [
'date' => \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i'),
'userName' => $message->user ? $message->user->name : __('Utilisateur supprimé')
]) !!}
</small>
@if($message->user_id === Auth::user()->id)
@can('updateMessage', $ticket, $message)
<button type="button" class="btn btn-sm btn-primary float-end" data-bs-toggle="modal" data-bs-target="#updateMessageModal{{$message->id}}">
{{ __('Modifier le message') }}
</button>
<div class="modal fade" id="updateMessageModal{{$message->id}}" tabindex="-1" aria-labelledby="updateMessageModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form action="{{ route('ticket.message.update', ['ticket'=>$ticket, 'message'=>$message]) }}" method="POST" enctype="multipart/form-data">
@method('PUT')
@csrf
<input type="hidden" name="ticket_id" value="{{ $ticket->id }}">
<div class="modal-header">
<h5 class="modal-title" id="messageModalLabel">
{{ __('Modification du message n°:messageid', ['messageid' => $message->id]) }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{__('Fermer') }}"></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col">
<textarea name="message" class="form-control" rows="10">{{ $message->message }}</textarea>
@if (
$message->type->equals(MessageTypeEnum::public()) ||
(Auth::user()->can('createPrivateMessage', $ticket))
)
<div class="@if($message->user_id === Auth::user()->id)offset-md-4 alert-dark @else alert-light @endif @if($message->type->equals(MessageTypeEnum::private())) border border-danger border-2 @endif col-md-8 alert">
@if ($message->type->equals(MessageTypeEnum::private()))
<i class="fa-solid fa-lock"></i>&nbsp;&nbsp;
@endif
{!! ToolboxHelper::plainToHtml($message->message) !!}
@if ($message->file !== null)
<br><a @if(ToolboxHelper::isImageFile($message->file))data-fslightbox="gallery" @endif href="{{ asset($message->file) }}" target="_blank">Ouvrir la pièce jointe</a><br>
@endif<br><br>
<small class="text-muted fw-bold">
{!! __('Créé le :date par <b>:userName</b>', [
'date' => \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i'),
'userName' => $message->user ? $message->user->name : __('Utilisateur supprimé')
]) !!}
</small>
@if($message->user_id === Auth::user()->id)
@can('updateMessage', $ticket, $message)
<button type="button" class="btn btn-sm btn-primary float-end" data-bs-toggle="modal" data-bs-target="#updateMessageModal{{$message->id}}">
{{ __('Modifier le message') }}
</button>
<div class="modal fade" id="updateMessageModal{{$message->id}}" tabindex="-1" aria-labelledby="updateMessageModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form action="{{ route('ticket.message.update', ['ticket'=>$ticket, 'message'=>$message]) }}" method="POST" enctype="multipart/form-data">
@method('PUT')
@csrf
<input type="hidden" name="ticket_id" value="{{ $ticket->id }}">
<div class="modal-header">
<h5 class="modal-title" id="messageModalLabel">
{{ __('Modification du message n°:messageid', ['messageid' => $message->id]) }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{__('Fermer') }}"></button>
</div>
</div>
<div class="modal-body">
<div class="row">
<div class="col">
<textarea name="message" class="form-control" rows="10">{{ $message->message }}</textarea>
</div>
</div>
</div>
<div class="modal-footer">
<button type="reset" class="btn btn-sm btn-danger" data-bs-dismiss="modal">{{ __('Fermer') }}</button>
<button type="submit" class="btn btn-sm btn-success">{{ __('Envoyer') }}</button>
</div>
</form>
</div>
<div class="modal-footer">
<button type="reset" class="btn btn-sm btn-danger" data-bs-dismiss="modal">{{ __('Fermer') }}</button>
<button type="submit" class="btn btn-sm btn-success">{{ __('Envoyer') }}</button>
</div>
</form>
</div>
</div>
@endcan
@endif
</div>
</div>
@endcan
@endif
</div>
@endif
@endforeach
</div>