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:
parent
9181731f10
commit
42eddd0040
8 changed files with 130 additions and 22 deletions
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
4
resources/js/app.js
vendored
|
|
@ -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';
|
||||
|
|
|
|||
5
resources/js/main.js
vendored
5
resources/js/main.js
vendored
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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')">
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue