Ticket 682 :

- Add Vue debug mode
- Show club.messages in reverse order + fix nice date formatter to using server timezone when json cast + fix get last message date for left column
This commit is contained in:
Jérémy Munsch 2022-03-28 15:52:42 +02:00
parent 9181731f10
commit 42eddd0040
No known key found for this signature in database
GPG key ID: 55196BEE445F6049
8 changed files with 130 additions and 22 deletions

View file

@ -5,10 +5,19 @@ namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Support\Carbon;
//phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceAfterLastUsed
//phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceBeforeLastUsed
class NiceDate implements CastsAttributes
{
/**
* Accessor
*
* @param mixed $model
* @param mixed $key
* @param mixed $value
* @param mixed $attributes
* @return mixed
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceBeforeLastUsed
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceAfterLastUsed
*/
public function get($model, $key, $value, $attributes)
{
$value = Carbon::parse($value);
@ -16,6 +25,15 @@ class NiceDate implements CastsAttributes
trans('Aujourd\'hui à :time', ['time' => $value->format('H:i')]) : $value->format('Y/m/d H:i');
}
/**
* Mutator
*
* @param mixed $model
* @param mixed $key
* @param mixed $value
* @param mixed $attributes
* @return mixed
*/
public function set($model, $key, $value, $attributes)
{
return Carbon::parse($value)->format('Y-m-d H:i:s');

View file

@ -19,6 +19,7 @@ use App\Models\Message;
use App\Models\Reduction;
use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Response;
@ -358,6 +359,11 @@ class ClubController extends Controller
return back();
}
/**
* Show messagerie
*
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function messages()
{
self::getNotifications();
@ -367,9 +373,27 @@ class ClubController extends Controller
$ids = collect($conversations)->pluck('to_id');
$blockList = BlockList::where('customer_id', $customer->id)
->whereIn('blocked_id', $ids)->get();
// * Sort In reverse order messages
$conversations = collect($conversations)->map(function (array $conversation) {
$conversation['messages'] = collect($conversation['messages'])
->sort(function ($a, $b) {
return Carbon::parse(
$a->getRawOriginal('created_at')
)->timestamp < Carbon::parse($b->getRawOriginal('created_at'))->timestamp;
})->values()->all();
return $conversation;
})->all();
return view('front.club.messages', compact('conversations', 'blockList'));
}
/**
* Send a message to a user
*
* @param SendMessageRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function sendMessage(SendMessageRequest $request)
{
$customer = Customers::where('username', $request->to)->firstOrFail();
@ -413,6 +437,12 @@ class ClubController extends Controller
}]));
}
/**
* Destroy a message
*
* @param DeleteMessagesRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function deleteMessage(DeleteMessagesRequest $request)
{
/** @var \App\Models\Customers */
@ -442,6 +472,13 @@ class ClubController extends Controller
return response()->json();
}
/**
* Block a customer to prevent him sending messages
*
* @param BlockCustomerRequest $request
* @param boolean $status
* @return \Illuminate\Http\JsonResponse
*/
public function blockCustomer(BlockCustomerRequest $request, bool $status)
{
/** @var \App\Models\Customers */

View file

@ -83,7 +83,7 @@ class Customers extends Authenticatable
$output = $receivedM->mapWithKeys(function ($messagesArray, $fromUsername) use (&$sentM, $dateSort) {
$responses = collect(\array_merge($sentM->pull($fromUsername) ?? [], $messagesArray))->sort($dateSort);
$last = $responses->first();
$last = $responses->last();
return [$fromUsername => collect([
'to' => $fromUsername,
'to_id' => collect($messagesArray)->first()->fromCustomer->id,
@ -94,10 +94,10 @@ class Customers extends Authenticatable
'messages' => $responses->values()->all()
])];
})->toBase();
// map sur les message envoyés (qui n'ont pas encore eu de réponses)
// * Map sur les message envoyés (qui n'ont pas encore eu de réponses)
$outputSentM = $sentM->mapWithKeys(function ($messagesArray) {
$sent = collect($messagesArray);
$last = $sent->first();
$last = $sent->last();
$toCustomer = $last->toCustomer;
$toUserName = $toCustomer->username;
return [$toUserName => collect([
@ -110,21 +110,11 @@ class Customers extends Authenticatable
'messages' => $sent->values()->all()
])];
})->toBase();
// TODO revert this debug test
try {
return $output->merge($outputSentM)->sort(function ($a, $b) {
return Carbon::parse(
$a['dateRaw']
)->timestamp < Carbon::parse($b['dateRaw'])->timestamp;
})->toArray();
} catch (\Exception $e) {
Utils::sendEmailErrorManually($e);
Utils::sendEmailErrorManually(new \Exception(sprintf(
'debug club.messages form user %s',
auth()->user()->email
)));
throw $e;
}
}
public function notifications()

View file

@ -8,32 +8,80 @@ use Illuminate\Support\Carbon;
class Message extends Model
{
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'created_at' => NiceDate::class,
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'message',
'to'
];
// * RELATIONSHIPS
/**
* BelongsTo customer relation
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function toCustomer()
{
return $this->belongsTo(Customers::class, 'to');
}
/**
* BelongsTo customer relation
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function fromCustomer()
{
return $this->belongsTo(Customers::class, 'from');
}
/**
* MorphOne notification relation
*
* @return \Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function notifiable()
{
return $this->morphOne(Notifications::class, 'notifiable');
}
// * METHODS
/**
* Get MessagesOlderThan attribute
*
* @param integer $days
* @return \Illuminate\Database\Query\Builder
*/
public static function getMessagesOlderThan(int $days)
{
return Message::where('updated_at', '<', Carbon::now()->subDays($days));
}
public function notifiable()
/**
* Convert the model instance to an array.
* ! Make sure we use correct nicedate formater
*
* @return array
*/
public function toArray()
{
return $this->morphOne(Notifications::class, 'notifiable');
return array_merge(parent::toArray(), [
'created_at' => $this->created_at
]);
}
}

4
resources/js/app.js vendored
View file

@ -20,6 +20,10 @@ tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl)
})
if (window.vueDebug) {
Vue.config.devtools = true;
Vue.config.debug = true;
}
window.Vue = require('vue/dist/vue.min.js');
import VueSelectImage from 'vue-select-image';

View file

@ -16,6 +16,11 @@ window.axios.defaults.headers.common = {
'X-CSRF-TOKEN' : document.querySelector('meta[name="csrf-token"]').getAttribute('content')
};
if (window.vueDebug) {
Vue.config.devtools = true;
Vue.config.debug = true;
}
// cookie notice
import { LdcwebCn } from "./front/ldcweb-cn.js";
window.LdcwebCn = LdcwebCn;

View file

@ -4,6 +4,9 @@
@include('layouts.app-head')
@include('front.breadcrumb.breadcrumb-head')
@yield('microdata')
@if(config('app.env') === 'local')
<script>window.vueDebug = true;</script>
@endif
</head>
<body>
<div id="app" class="@yield('bg-color')">

View file

@ -26,6 +26,9 @@
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" />
@yield('styles')
@if(config('app.env') === 'local')
<script>window.vueDebug = true;</script>
@endif
</head>
<body>
<div id="app">