Compare commits
6 Commits
user_profi
...
master
Author | SHA1 | Date | |
---|---|---|---|
6aaf157c60 | |||
bd12cf6dfb | |||
3ab7e495e9 | |||
9ec28afa4a | |||
9a6d257de0 | |||
2ad19f4793 |
66
app/Console/Commands/SendDailyNotification.php
Normal file
66
app/Console/Commands/SendDailyNotification.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Exceptions\WrongHourException;
|
||||||
|
use App\Mail\DailyNotification;
|
||||||
|
use App\Services\HourService;
|
||||||
|
use App\User;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\Mail;
|
||||||
|
|
||||||
|
class SendDailyNotification extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'send:daily';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Send daily notification to write a post';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new command instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @param HourService $hour_service
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function handle(HourService $hour_service)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$notification_id = $hour_service->getCurrentNotificationId();
|
||||||
|
$this->info(sprintf('Notification id = %s', $notification_id));
|
||||||
|
} catch (WrongHourException $e) {
|
||||||
|
$this->error($e->getMessage());
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$users = User::where('notification_hour', '=', $notification_id)
|
||||||
|
->where('email_verified_at', '!=', null)
|
||||||
|
->whereNotExists(function($query) {
|
||||||
|
$query->select()
|
||||||
|
->from('posts')
|
||||||
|
->whereRaw('posts.user_id = users.id')
|
||||||
|
->whereDate('date_post', date('Y-m-d'));
|
||||||
|
})
|
||||||
|
->get();
|
||||||
|
foreach ($users as $user) {
|
||||||
|
Mail::to($user)->queue(new DailyNotification($user));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,12 +2,11 @@
|
|||||||
|
|
||||||
namespace App\Console;
|
namespace App\Console;
|
||||||
|
|
||||||
|
use App\Console\Commands\SendDailyNotification;
|
||||||
use App\Jobs\SendReminderEmail;
|
use App\Jobs\SendReminderEmail;
|
||||||
use App\Jobs\SendWelcomeEmail;
|
|
||||||
use App\User;
|
use App\User;
|
||||||
use Illuminate\Console\Scheduling\Schedule;
|
use Illuminate\Console\Scheduling\Schedule;
|
||||||
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
||||||
use Illuminate\Support\Carbon;
|
|
||||||
|
|
||||||
class Kernel extends ConsoleKernel
|
class Kernel extends ConsoleKernel
|
||||||
{
|
{
|
||||||
@ -17,7 +16,7 @@ class Kernel extends ConsoleKernel
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $commands = [
|
protected $commands = [
|
||||||
//
|
SendDailyNotification::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,17 +27,17 @@ class Kernel extends ConsoleKernel
|
|||||||
*/
|
*/
|
||||||
protected function schedule(Schedule $schedule)
|
protected function schedule(Schedule $schedule)
|
||||||
{
|
{
|
||||||
|
$schedule
|
||||||
|
->command('send:daily')
|
||||||
|
->cron('0 */6 * * *');
|
||||||
|
|
||||||
$schedule->call(function() {
|
$schedule->call(function() {
|
||||||
$users = User::where('email_verified_at', '!=', null)
|
$users = User::where('email_verified_at', '=', null)
|
||||||
->where('notification_hour', '!=', null)
|
|
||||||
->get();
|
->get();
|
||||||
var_dump(count($users));
|
|
||||||
foreach ($users as $user) {
|
foreach ($users as $user) {
|
||||||
dispatch((new SendReminderEmail($user)));
|
dispatch((new SendReminderEmail($user)));
|
||||||
}
|
}
|
||||||
})->everyMinute();
|
})->daily();
|
||||||
// $schedule->command('inspire')
|
|
||||||
// ->hourly();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
10
app/Exceptions/WrongHourException.php
Normal file
10
app/Exceptions/WrongHourException.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
namespace App\Exceptions;
|
||||||
|
|
||||||
|
|
||||||
|
class WrongHourException extends \Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Requests\AddPost;
|
||||||
use App\Post;
|
use App\Post;
|
||||||
use App\PostsTag;
|
use App\PostsTag;
|
||||||
use App\Services\ImageService;
|
use App\Services\ImageService;
|
||||||
@ -11,6 +12,9 @@ use DateTime;
|
|||||||
use Illuminate\Http\UploadedFile;
|
use Illuminate\Http\UploadedFile;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Support\Facades\Redirect;
|
use Illuminate\Support\Facades\Redirect;
|
||||||
|
use Spatie\MediaLibrary\Exceptions\FileCannotBeAdded\DiskDoesNotExist;
|
||||||
|
use Spatie\MediaLibrary\Exceptions\FileCannotBeAdded\FileDoesNotExist;
|
||||||
|
use Spatie\MediaLibrary\Exceptions\FileCannotBeAdded\FileIsTooBig;
|
||||||
|
|
||||||
class DashboardController extends Controller
|
class DashboardController extends Controller
|
||||||
{
|
{
|
||||||
@ -72,39 +76,35 @@ class DashboardController extends Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Edit today's entry
|
* Edit today's entry
|
||||||
|
* @param AddPost $request
|
||||||
|
* @param TagDetectorService $tag_detector
|
||||||
|
* @return
|
||||||
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public function edit(TagDetectorService $tag_detector)
|
public function edit(AddPost $request, TagDetectorService $tag_detector)
|
||||||
{
|
{
|
||||||
/** @var Post $today_post */
|
/** @var Post $today_post */
|
||||||
$today_post = Post::whereDate('date_post', '=', (new DateTime())->format('Y-m-d'))
|
$today_post = Post::whereDate('date_post', '=', (new DateTime())->format('Y-m-d'))
|
||||||
->where('user_id', Auth::user()->getAuthIdentifier())
|
->where('user_id', Auth::user()->getAuthIdentifier())
|
||||||
->firstOrFail();
|
->firstOrFail();
|
||||||
|
|
||||||
$data = request()->validate([
|
$data = $request->validated();
|
||||||
'message' => 'required'
|
|
||||||
]);
|
|
||||||
|
|
||||||
$today_post->deleteTags();
|
if (!empty($validated_data['file'])) {
|
||||||
|
try {
|
||||||
$tags = $tag_detector->detectFrom($data['message']);
|
$today_post->addMediaFromRequest('file')->toMediaCollection('post_image');
|
||||||
|
} catch (DiskDoesNotExist $e) {
|
||||||
$today_post->content = $data['message'];
|
} catch (FileDoesNotExist $e) {
|
||||||
$today_post->save();
|
} catch (FileIsTooBig $e) {
|
||||||
$all_tags = Tag::all();
|
|
||||||
$all_tags_names = [];
|
|
||||||
foreach ($all_tags as $tag) {
|
|
||||||
$all_tags_names[$tag->id] = $tag->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($tags as $tag) {
|
|
||||||
if (in_array($tag, $all_tags_names)) {
|
|
||||||
PostsTag::create([
|
|
||||||
'post_id' => $today_post->id,
|
|
||||||
'tag_id' => array_search($tag, $all_tags_names),
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$today_post->deleteTags();
|
||||||
|
$today_post->content = $data['message'];
|
||||||
|
$today_post->save();
|
||||||
|
|
||||||
|
$this->setPostsTagsForPost($today_post, $tag_detector->detectFrom($data['message']));
|
||||||
|
|
||||||
return Redirect::to('home')->withSuccess('Great! Form successfully submit with validation.');
|
return Redirect::to('home')->withSuccess('Great! Form successfully submit with validation.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,37 +127,42 @@ class DashboardController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param AddPost $request
|
||||||
* @param TagDetectorService $tag_detector
|
* @param TagDetectorService $tag_detector
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public function store(TagDetectorService $tag_detector, ImageService $image_service)
|
public function store(AddPost $request, TagDetectorService $tag_detector)
|
||||||
{
|
{
|
||||||
$user_id = Auth::user()->getAuthIdentifier();
|
$validated_data = $request->validated();
|
||||||
|
|
||||||
$validated_data = request()->validate([
|
/** @var Post $post */
|
||||||
'message' => 'required',
|
$post = Post::create([
|
||||||
'file' => 'file|mimes:jpeg,png,jpg,gif,svg',
|
'user_id' => Auth::user()->getAuthIdentifier(),
|
||||||
]);
|
|
||||||
|
|
||||||
$data = [
|
|
||||||
'user_id' => $user_id,
|
|
||||||
'date_post' => new DateTime(),
|
'date_post' => new DateTime(),
|
||||||
'content' => $validated_data['message'],
|
'content' => $validated_data['message'],
|
||||||
];
|
]);
|
||||||
|
|
||||||
if (!empty($validated_data['file'])) {
|
if (!empty($validated_data['file'])) {
|
||||||
/** @var UploadedFile $uploaded_document */
|
try {
|
||||||
$uploaded_document = $validated_data['file'];
|
$post->addMediaFromRequest('file')->toMediaCollection('post_image');
|
||||||
$file_name = $uploaded_document->getClientOriginalName();
|
} catch (DiskDoesNotExist $e) {
|
||||||
$uploaded_document->storeAs(Auth::user()->getFolder(), $file_name);
|
} catch (FileDoesNotExist $e) {
|
||||||
$image_service->makeThumbnail($uploaded_document->getRealPath(), ['width' => 300]);
|
} catch (FileIsTooBig $e) {
|
||||||
$data['image'] = $file_name;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tags = $tag_detector->detectFrom($data['content']);
|
$this->setPostsTagsForPost($post, $tag_detector->detectFrom($validated_data['message']));
|
||||||
|
|
||||||
$check = Post::create($data);
|
return Redirect::to('home')->withSuccess('Great! Form successfully submit with validation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Post $post
|
||||||
|
* @param $tags
|
||||||
|
*/
|
||||||
|
private function setPostsTagsForPost(Post $post, $tags)
|
||||||
|
{
|
||||||
$all_tags = Tag::all();
|
$all_tags = Tag::all();
|
||||||
$all_tags_names = [];
|
$all_tags_names = [];
|
||||||
foreach ($all_tags as $tag) {
|
foreach ($all_tags as $tag) {
|
||||||
@ -165,14 +170,12 @@ class DashboardController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($tags as $tag) {
|
foreach ($tags as $tag) {
|
||||||
if (in_array($tag, $all_tags_names)) {
|
if (in_array($tag, $all_tags_names, true)) {
|
||||||
PostsTag::create([
|
PostsTag::create([
|
||||||
'post_id' => $check->id,
|
'post_id' => $post->id,
|
||||||
'tag_id' => array_search($tag, $all_tags_names),
|
'tag_id' => array_search($tag, $all_tags_names),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Redirect::to('home')->withSuccess('Great! Form successfully submit with validation.');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,11 @@ namespace App\Http\Controllers;
|
|||||||
|
|
||||||
use App\Post;
|
use App\Post;
|
||||||
use App\Services\ImageService;
|
use App\Services\ImageService;
|
||||||
|
use App\User;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Support\Facades\File;
|
|
||||||
use Intervention\Image\Constraint;
|
|
||||||
use Intervention\Image\Facades\Image;
|
use Intervention\Image\Facades\Image;
|
||||||
|
use Illuminate\Support\Facades\File;
|
||||||
|
use Spatie\MediaLibrary\Models\Media;
|
||||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
|
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
|
||||||
|
|
||||||
@ -15,28 +16,40 @@ class ImageController extends Controller
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param int $post_id
|
* @param int $post_id
|
||||||
* @param string|array $options
|
* @param string $alias
|
||||||
* @param string $image
|
* @param string $image
|
||||||
* @param ImageService $image_service
|
* @param ImageService $image_service
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function display($post_id, $options = 'o:full', $image, ImageService $image_service)
|
public function display($post_id, $alias = '')
|
||||||
{
|
{
|
||||||
|
/** @var Post $post */
|
||||||
$post = Post::find($post_id);
|
$post = Post::find($post_id);
|
||||||
|
|
||||||
if (Auth::user()->getAuthIdentifier() !== (int)$post->user_id) {
|
if (Auth::user()->getAuthIdentifier() !== (int)$post->user_id) {
|
||||||
throw new UnauthorizedHttpException('Cette image ne vous appartient pas.');
|
throw new UnauthorizedHttpException('Cette image ne vous appartient pas.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$original = sprintf('%s/%s/%s', storage_path('app'), Auth::user()->getFolder(), $image);
|
$first_media = $post->getFirstMedia('post_image');
|
||||||
if ('o:full' === $options) {
|
if (!$first_media instanceof Media) {
|
||||||
$img = $image_service->makeThumbnail($original);
|
throw new NotFoundHttpException('Média non trouvé en base.');
|
||||||
} else {
|
|
||||||
$img = $image_service->makeThumbnail($original, ['width' => 300]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $img->response(File::extension($original));
|
return Image::make($first_media->getPath($alias))->response($first_media->mime_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $alias
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function avatar($alias = '')
|
||||||
|
{
|
||||||
|
/** @var User $user */
|
||||||
|
$user = User::find(Auth::user()->getAuthIdentifier());
|
||||||
|
|
||||||
|
readfile($user->getFirstMediaPath('avatars', $alias));
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use App\Models\Calendar\Month;
|
||||||
|
use App\Post;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
class StatsController extends Controller
|
class StatsController extends Controller
|
||||||
{
|
{
|
||||||
@ -11,4 +13,22 @@ class StatsController extends Controller
|
|||||||
// TODO
|
// TODO
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function calendar($type, $year = null, $month = null)
|
||||||
|
{
|
||||||
|
if (null === $month) {
|
||||||
|
$month = date('m');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $year) {
|
||||||
|
$year = date('Y');
|
||||||
|
}
|
||||||
|
|
||||||
|
$posts = Post::getUserPostForMonth(Auth::user()->getAuthIdentifier(), $year, $month);
|
||||||
|
|
||||||
|
if ('month' === $type) {
|
||||||
|
$month_calendar = new Month($year, $month, $posts);
|
||||||
|
return view('stats.calendar', ['month' => $month_calendar, 'type' => $type]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,15 @@ class GenerateMenus
|
|||||||
$accueil->prepend('<i class="fe fe-home"></i> ');
|
$accueil->prepend('<i class="fe fe-home"></i> ');
|
||||||
$accueil->checkActivationStatus();
|
$accueil->checkActivationStatus();
|
||||||
|
|
||||||
$stats = $menu->add('Mes statistiques', ['route' => 'stats', 'class' => 'nav-item'])->nickname('stats');
|
// $stats = $menu->add('Mes statistiques', ['route' => 'stats', 'class' => 'nav-item'])->nickname('stats');
|
||||||
$stats->link->attr(['class' => 'nav-link']);
|
// $stats->link->attr(['class' => 'nav-link']);
|
||||||
$stats->prepend('<i class="fe fe-trending-up"></i> ');
|
// $stats->prepend('<i class="fe fe-trending-up"></i> ');
|
||||||
$stats->checkActivationStatus();
|
// $stats->checkActivationStatus();
|
||||||
|
|
||||||
|
$calendar = $menu->add('Mon calendrier', ['route' => ['calendar', 'month'], 'class' => 'nav-item'])->nickname('calendar');
|
||||||
|
$calendar->link->attr(['class' => 'nav-link']);
|
||||||
|
$calendar->prepend('<i class="fe fe-calendar"></i> ');
|
||||||
|
$calendar->checkActivationStatus();
|
||||||
|
|
||||||
$gallery = $menu->add('Ma gallerie', ['route' => 'gallery', 'class' => 'nav-item'])->nickname('gallery');
|
$gallery = $menu->add('Ma gallerie', ['route' => 'gallery', 'class' => 'nav-item'])->nickname('gallery');
|
||||||
$gallery->link->attr(['class' => 'nav-link']);
|
$gallery->link->attr(['class' => 'nav-link']);
|
||||||
|
32
app/Http/Requests/AddPost.php
Normal file
32
app/Http/Requests/AddPost.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
|
class AddPost extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return !Auth::guest();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'message' => 'required',
|
||||||
|
'file' => 'file|mimes:jpeg,png,jpg,gif,svg',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ namespace App\Jobs;
|
|||||||
|
|
||||||
use App\Mail\ReminderMail;
|
use App\Mail\ReminderMail;
|
||||||
use App\Mail\WelcomeMail;
|
use App\Mail\WelcomeMail;
|
||||||
|
use App\User;
|
||||||
use Illuminate\Bus\Queueable;
|
use Illuminate\Bus\Queueable;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
@ -15,6 +16,7 @@ class SendReminderEmail implements ShouldQueue
|
|||||||
{
|
{
|
||||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
/** @var User */
|
||||||
private $user;
|
private $user;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
38
app/Mail/DailyNotification.php
Normal file
38
app/Mail/DailyNotification.php
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Mail;
|
||||||
|
|
||||||
|
use App\User;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Mail\Mailable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
class DailyNotification extends Mailable implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Queueable, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var User
|
||||||
|
*/
|
||||||
|
public $user;
|
||||||
|
/**
|
||||||
|
* Create a new message instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(User $user)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the message.
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function build()
|
||||||
|
{
|
||||||
|
return $this->view('emails.daily');
|
||||||
|
}
|
||||||
|
}
|
41
app/Models/Calendar/Day.php
Normal file
41
app/Models/Calendar/Day.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models\Calendar;
|
||||||
|
|
||||||
|
use App\Post;
|
||||||
|
use DateTime;
|
||||||
|
|
||||||
|
class Day
|
||||||
|
{
|
||||||
|
/** @var DateTime */
|
||||||
|
protected $date;
|
||||||
|
/** @var Post|null */
|
||||||
|
protected $post;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Day constructor.
|
||||||
|
* @param DateTime $date
|
||||||
|
* @param Post $post
|
||||||
|
*/
|
||||||
|
public function __construct(DateTime $date, Post $post = null)
|
||||||
|
{
|
||||||
|
$this->date = $date;
|
||||||
|
$this->post = $post;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return DateTime
|
||||||
|
*/
|
||||||
|
public function getDate(): DateTime
|
||||||
|
{
|
||||||
|
return $this->date;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Post
|
||||||
|
*/
|
||||||
|
public function getPost(): ?Post
|
||||||
|
{
|
||||||
|
return $this->post;
|
||||||
|
}
|
||||||
|
}
|
138
app/Models/Calendar/Month.php
Normal file
138
app/Models/Calendar/Month.php
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models\Calendar;
|
||||||
|
|
||||||
|
use App\Post;
|
||||||
|
use DateInterval;
|
||||||
|
use DatePeriod;
|
||||||
|
use DateTime;
|
||||||
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
|
|
||||||
|
class Month
|
||||||
|
{
|
||||||
|
/** @var int|string */
|
||||||
|
protected $year;
|
||||||
|
|
||||||
|
/** @var int|string */
|
||||||
|
protected $month;
|
||||||
|
|
||||||
|
/** @var Day[] */
|
||||||
|
protected $days = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Month constructor.
|
||||||
|
* @param int|string $year
|
||||||
|
* @param int|string $month
|
||||||
|
* @param array $posts
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function __construct($year, $month, $posts = [])
|
||||||
|
{
|
||||||
|
$this->year = $year;
|
||||||
|
$this->month = $month;
|
||||||
|
$this->fillDays($posts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $posts
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
protected function fillDays($posts)
|
||||||
|
{
|
||||||
|
$start = DateTime::createFromFormat('Y-m-d', sprintf('%s-%s-01', $this->year, str_pad($this->month, '0', 2)));
|
||||||
|
$interval = new DateInterval('P1D');
|
||||||
|
$end = clone $start;
|
||||||
|
$end->add(new DateInterval('P1M'));
|
||||||
|
$period = new DatePeriod($start, $interval, $end);
|
||||||
|
|
||||||
|
foreach ($period as $dt) {
|
||||||
|
$post = null;
|
||||||
|
if (count($posts) > 0 && $posts->first()->date_post->format('Ymd') === $dt->format('Ymd')) {
|
||||||
|
$post = $posts->shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->days[] = new Day($dt, $post);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDate()
|
||||||
|
{
|
||||||
|
return DateTime::createFromFormat('Y-m-d', sprintf('%s-%s-01', $this->year, str_pad($this->month, '0', 2)))
|
||||||
|
->format('F Y');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Day[]
|
||||||
|
*/
|
||||||
|
public function getDays(): array
|
||||||
|
{
|
||||||
|
return $this->days;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return DateTime|false
|
||||||
|
*/
|
||||||
|
public function getPrevious()
|
||||||
|
{
|
||||||
|
return DateTime::createFromFormat('Y-m-d', sprintf('%s-%s-01', $this->year, str_pad($this->month, '0', 2)))
|
||||||
|
->modify('-1 month');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return DateTime|false
|
||||||
|
*/
|
||||||
|
public function getNext()
|
||||||
|
{
|
||||||
|
return DateTime::createFromFormat('Y-m-d', sprintf('%s-%s-01', $this->year, str_pad($this->month, '0', 2)))
|
||||||
|
->modify('+1 month');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function render(): string
|
||||||
|
{
|
||||||
|
$content = '<ul class="dates">';
|
||||||
|
|
||||||
|
$first_day_of_month = DateTime::createFromFormat('Y-m-d', sprintf('%s-%s-01', $this->year, $this->month))->format('N');
|
||||||
|
for ($i = 1; $i < $first_day_of_month; $i++) {
|
||||||
|
$content .= '<li></li>';
|
||||||
|
}
|
||||||
|
foreach ($this->days as $day) {
|
||||||
|
$content .= $this->_showDay($day);
|
||||||
|
}
|
||||||
|
$content .= '</ul>';
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Day $day
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function _showDay(Day $day): string
|
||||||
|
{
|
||||||
|
$currentDate = $day->getDate()->format('Ymd');
|
||||||
|
$day_of_week = $day->getDate()->format('N');
|
||||||
|
$day_number = $day->getDate()->format('d');
|
||||||
|
$post = $day->getPost();
|
||||||
|
$classes = ['day'];
|
||||||
|
if ($currentDate === date('Ymd')) {
|
||||||
|
$classes[] = 'today';
|
||||||
|
}
|
||||||
|
if ($day_of_week % 7 === 1) {
|
||||||
|
$classes[] = 'start';
|
||||||
|
}
|
||||||
|
if ($day_of_week % 7 === 0) {
|
||||||
|
$classes[] = 'end';
|
||||||
|
}
|
||||||
|
if ($post instanceof Post) {
|
||||||
|
$classes[] = 'has-post';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<li id="li-' . $currentDate . '" class="' . implode(' ', $classes) .'">' . $day_number . '</li>';
|
||||||
|
}
|
||||||
|
}
|
31
app/Post.php
31
app/Post.php
@ -3,9 +3,15 @@
|
|||||||
namespace App;
|
namespace App;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Spatie\Image\Exceptions\InvalidManipulation;
|
||||||
|
use Spatie\MediaLibrary\HasMedia\HasMedia;
|
||||||
|
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
|
||||||
|
use Spatie\MediaLibrary\Models\Media;
|
||||||
|
|
||||||
class Post extends Model
|
class Post extends Model implements HasMedia
|
||||||
{
|
{
|
||||||
|
use HasMediaTrait;
|
||||||
/**
|
/**
|
||||||
* The attributes that are mass assignable.
|
* The attributes that are mass assignable.
|
||||||
*
|
*
|
||||||
@ -43,4 +49,27 @@ class Post extends Model
|
|||||||
$tag_to_delete->delete();
|
$tag_to_delete->delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getUserPostForMonth($user_id, $year, $month)
|
||||||
|
{
|
||||||
|
return self::whereMonth('date_post', $month)
|
||||||
|
->whereYear('date_post', $year)
|
||||||
|
->where('user_id', $user_id)
|
||||||
|
->orderBy('date_post')
|
||||||
|
->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Media|null $media
|
||||||
|
*/
|
||||||
|
public function registerMediaConversions(Media $media = null)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->addMediaConversion('list')
|
||||||
|
->width(300)
|
||||||
|
->optimize();
|
||||||
|
} catch (InvalidManipulation $e) {
|
||||||
|
Log::alert(sprintf('Error while manipulating Post Image for %s (%s)', $this->id, $e->getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
82
app/Services/HourService.php
Normal file
82
app/Services/HourService.php
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use App\Exceptions\WrongHourException;
|
||||||
|
use App\User;
|
||||||
|
|
||||||
|
class HourService
|
||||||
|
{
|
||||||
|
const NO_NOTIFICATION = 0;
|
||||||
|
const MIDNIGHT_NOTIFICATION = 1;
|
||||||
|
const MORNING_NOTIFICATION = 2;
|
||||||
|
const NOON_NOTIFICATION = 3;
|
||||||
|
const EVENING_NOTIFICATION = 4;
|
||||||
|
|
||||||
|
public static $notifications_classes = [
|
||||||
|
self::NO_NOTIFICATION => 'slash',
|
||||||
|
self::MIDNIGHT_NOTIFICATION => 'moon',
|
||||||
|
self::MORNING_NOTIFICATION => 'sunrise',
|
||||||
|
self::NOON_NOTIFICATION => 'sun',
|
||||||
|
self::EVENING_NOTIFICATION => 'sunset',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getHoursBracket(User $user)
|
||||||
|
{
|
||||||
|
switch ((int)$user->notification_hour) {
|
||||||
|
case self::MIDNIGHT_NOTIFICATION:
|
||||||
|
return ['2100-2359', '0000-0600'];
|
||||||
|
break;
|
||||||
|
case self::MORNING_NOTIFICATION:
|
||||||
|
return ['0601-1100'];
|
||||||
|
break;
|
||||||
|
case self::NOON_NOTIFICATION:
|
||||||
|
return ['1101-1530'];
|
||||||
|
break;
|
||||||
|
case self::EVENING_NOTIFICATION:
|
||||||
|
return ['1531-2059'];
|
||||||
|
break;
|
||||||
|
case self::NO_NOTIFICATION:
|
||||||
|
default:
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param null|int|string $current_hour the hour and minute we want to find the id to. Formatted like `date('Hi')`
|
||||||
|
* @return int
|
||||||
|
* @throws WrongHourException
|
||||||
|
*/
|
||||||
|
public function getCurrentNotificationId($current_hour = null)
|
||||||
|
{
|
||||||
|
if (null === $current_hour) {
|
||||||
|
$current_hour = date('Hi');
|
||||||
|
}
|
||||||
|
|
||||||
|
$current_hour = (int) $current_hour;
|
||||||
|
if (
|
||||||
|
($current_hour >= 2100 && $current_hour < 2359) ||
|
||||||
|
($current_hour >= 0 && $current_hour < 600)
|
||||||
|
) {
|
||||||
|
return self::MIDNIGHT_NOTIFICATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($current_hour >= 600 && $current_hour < 1100) {
|
||||||
|
return self::MORNING_NOTIFICATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($current_hour >= 1100 && $current_hour < 1530) {
|
||||||
|
return self::NOON_NOTIFICATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($current_hour >= 1530 && $current_hour < 2100) {
|
||||||
|
return self::EVENING_NOTIFICATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new WrongHourException(sprintf('Given Time « %s » is not compatible', $current_hour));
|
||||||
|
}
|
||||||
|
}
|
@ -72,13 +72,4 @@ class User extends Authenticatable implements HasMedia
|
|||||||
Log::alert(sprintf('Error while manipulating Avatar for %s (%s)', $this->email, $e->getMessage()));
|
Log::alert(sprintf('Error while manipulating Avatar for %s (%s)', $this->email, $e->getMessage()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $alias
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getAvatar($alias = 'thumb'): string
|
|
||||||
{
|
|
||||||
return $this->getFirstMediaUrl('avatars', $alias);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ return [
|
|||||||
* The disk on which to store added files and derived images by default. Choose
|
* The disk on which to store added files and derived images by default. Choose
|
||||||
* one or more of the disks you've configured in config/filesystems.php.
|
* one or more of the disks you've configured in config/filesystems.php.
|
||||||
*/
|
*/
|
||||||
'disk_name' => env('MEDIA_DISK', 'public'),
|
'disk_name' => env('MEDIA_DISK', 'local'),
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The maximum file size of an item in bytes.
|
* The maximum file size of an item in bytes.
|
||||||
|
3
resources/sass/app.scss
vendored
3
resources/sass/app.scss
vendored
@ -19,3 +19,6 @@
|
|||||||
|
|
||||||
// Surcharge
|
// Surcharge
|
||||||
@import 'general';
|
@import 'general';
|
||||||
|
|
||||||
|
// Calendar
|
||||||
|
@import "calendar";
|
||||||
|
118
resources/sass/calendar.scss
vendored
Normal file
118
resources/sass/calendar.scss
vendored
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*******************************Calendar Top Navigation*********************************/
|
||||||
|
div#calendar {
|
||||||
|
margin:0 auto;
|
||||||
|
padding:0;
|
||||||
|
width: 602px;
|
||||||
|
font-family:special_eliteregular, "Times New Roman", Times, serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar div.box {
|
||||||
|
position:relative;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
width:100%;
|
||||||
|
height:40px;
|
||||||
|
background-color: #787878 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar div.calendar-header {
|
||||||
|
line-height:40px;
|
||||||
|
vertical-align:middle;
|
||||||
|
position:absolute;
|
||||||
|
left:11px;
|
||||||
|
top:0;
|
||||||
|
width:582px;
|
||||||
|
height:40px;
|
||||||
|
text-align:center;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar div.calendar-header a.prev,div#calendar div.calendar-header a.next {
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
height: 17px;
|
||||||
|
display:block;
|
||||||
|
cursor:pointer;
|
||||||
|
text-decoration:none;
|
||||||
|
color:#FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar div.calendar-header span.title{
|
||||||
|
color:#FFF;
|
||||||
|
font-size:18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar div.calendar-header a.prev{
|
||||||
|
left:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar div.calendar-header a.next{
|
||||||
|
right:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************Calendar Content Cells*********************************/
|
||||||
|
div#calendar div.box-content{
|
||||||
|
border:1px solid #787878 ;
|
||||||
|
border-top:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar ul.label{
|
||||||
|
float:left;
|
||||||
|
padding: 0;
|
||||||
|
margin: 5px 0 0 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar ul.label li{
|
||||||
|
padding:0;
|
||||||
|
margin: 0 5px 0 0;
|
||||||
|
float:left;
|
||||||
|
list-style-type:none;
|
||||||
|
width:80px;
|
||||||
|
height:40px;
|
||||||
|
line-height:40px;
|
||||||
|
vertical-align:middle;
|
||||||
|
text-align:center;
|
||||||
|
color:#000;
|
||||||
|
font-size: 15px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#calendar ul.dates{
|
||||||
|
float:left;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0 0 5px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** overall width = width+padding-right**/
|
||||||
|
div#calendar ul.dates li {
|
||||||
|
padding:0;
|
||||||
|
margin: 5px 5px 0 0;
|
||||||
|
line-height:80px;
|
||||||
|
vertical-align:middle;
|
||||||
|
float:left;
|
||||||
|
list-style-type:none;
|
||||||
|
width:80px;
|
||||||
|
height:80px;
|
||||||
|
font-size:25px;
|
||||||
|
color:#000;
|
||||||
|
text-align:center;
|
||||||
|
|
||||||
|
&.day {
|
||||||
|
background-color: #DDD;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.today {
|
||||||
|
background-color: #0d8ddc;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.has-post {
|
||||||
|
background-color: #63ad27;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:focus{
|
||||||
|
outline:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.clear{
|
||||||
|
clear:both;
|
||||||
|
}
|
1
resources/views/emails/daily.blade.php
Normal file
1
resources/views/emails/daily.blade.php
Normal file
@ -0,0 +1 @@
|
|||||||
|
Merci d'écrire !
|
@ -21,7 +21,7 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<p>
|
<p>
|
||||||
<a href="{{ route('display_image', ['post_id' => $post->id, 'options' => 'o:full', 'image_name' => $post->image]) }}">
|
<a href="{{ route('display_image', ['post_id' => $post->id, 'options' => 'o:full', 'image_name' => $post->image]) }}">
|
||||||
<img src="{{ route('display_image', ['post_id' => $post->id, 'options' => 'w:300', 'image_name' => $post->image]) }}"/>
|
<img src="{{ route('display_image', ['post_id' => $post->id, 'alias' => 'list']) }}"/>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -126,8 +126,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body @if($today->format('Y-m-d') === \Carbon\Carbon::instance($post->date_post)->format('Y-m-d')) already @endif ">
|
<div class="card-body @if($today->format('Y-m-d') === \Carbon\Carbon::instance($post->date_post)->format('Y-m-d')) already @endif ">
|
||||||
@if($post->image != '')<p><img src="{{ route('display_image', ['post_id' => $post->id, 'options' => 'w:300', 'image_name' => $post->image]) }}"/></p>@endif
|
@if($post->hasMedia('post_image'))<p><img src="{{ route('display_image', ['post_id' => $post->id]) }}"/></p>@endif <p data-encrypt>{!! $tag_detector->linkTagFrom($post->content) !!}</p>
|
||||||
<p data-encrypt>{!! $tag_detector->linkTagFrom($post->content) !!}</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="card-footer">
|
<div class="card-footer">
|
||||||
{{ \Carbon\Carbon::instance($post->date_post)->format('d F Y') }}
|
{{ \Carbon\Carbon::instance($post->date_post)->format('d F Y') }}
|
||||||
|
@ -55,10 +55,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a href="#" class="nav-link pr-0 leading-none" data-toggle="dropdown">
|
<a href="#" class="nav-link pr-0 leading-none" data-toggle="dropdown">
|
||||||
@php($avatar = Auth::user()->getAvatar('icon'))
|
@php($avatar = Auth::user()->hasMedia('avatars'))
|
||||||
@if($avatar !== '')
|
@if($avatar !== '')
|
||||||
<span>
|
<span>
|
||||||
<img src="{{ $avatar }}"/>
|
<img src="{{ route('display_avatar', ['alias' => 'icon']) }}"/>
|
||||||
</span>
|
</span>
|
||||||
@else
|
@else
|
||||||
<span class="avatar">
|
<span class="avatar">
|
||||||
@ -74,9 +74,9 @@
|
|||||||
<a class="dropdown-item" href="{{ route('user.index') }}">
|
<a class="dropdown-item" href="{{ route('user.index') }}">
|
||||||
<i class="dropdown-icon fe fe-user"></i> {{ __('Profile') }}
|
<i class="dropdown-icon fe fe-user"></i> {{ __('Profile') }}
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item" href="#">
|
{{--<a class="dropdown-item" href="#">
|
||||||
<i class="dropdown-icon fe fe-settings"></i> Settings
|
<i class="dropdown-icon fe fe-settings"></i> Settings
|
||||||
</a>
|
</a>--}}
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item" href="{{ route('logout') }}"
|
<a class="dropdown-item" href="{{ route('logout') }}"
|
||||||
onclick="event.preventDefault();
|
onclick="event.preventDefault();
|
||||||
@ -129,17 +129,16 @@
|
|||||||
<div class="row align-items-center">
|
<div class="row align-items-center">
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<ul class="list-inline list-inline-dots mb-0">
|
<ul class="list-inline list-inline-dots mb-0">
|
||||||
<li class="list-inline-item"><a href="./docs/index.html">Documentation</a></li>
|
<li class="list-inline-item"><a href="{{ route('gallery') }}">{{ __('Gallery') }}</a></li>
|
||||||
<li class="list-inline-item"><a href="./faq.html">FAQ</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<a href="https://github.com/tabler/tabler" class="btn btn-outline-primary btn-sm">Source code</a>
|
<a href="https://git.shikiryu.com/Shikiryu/journal-intime" class="btn btn-outline-primary btn-sm">Source code</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-lg-auto mt-3 mt-lg-0 text-center">
|
<div class="col-12 col-lg-auto mt-3 mt-lg-0 text-center">
|
||||||
Copyright © 2019 <a href="{{ config('app.url') }}">{{ config('app.name') }}</a>. Thème par <a href="https://codecalm.net" target="_blank">codecalm.net</a>
|
Copyright © 2019-{{ date('Y') }} <a href="{{ config('app.url') }}">{{ config('app.name') }}</a>.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
57
resources/views/stats/calendar.blade.php
Normal file
57
resources/views/stats/calendar.blade.php
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
@extends('layouts.connected')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="page-header">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-auto">
|
||||||
|
<h1 class="page-title">
|
||||||
|
{{ $month->getDate() }}
|
||||||
|
</h1>
|
||||||
|
@if (session('status'))
|
||||||
|
<div class="alert alert-success" role="alert">
|
||||||
|
{{ session('status') }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@if (session('success'))
|
||||||
|
<div class="alert alert-success" role="alert">
|
||||||
|
{{ session('success') }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@if (session('errors'))
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
{{ session('errors') }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row flex-fill">
|
||||||
|
<div class="col-12">
|
||||||
|
<div id="calendar">
|
||||||
|
<div class="box">
|
||||||
|
<div class="calendar-header">
|
||||||
|
@php($previous = $month->getPrevious())
|
||||||
|
@php($next = $month->getNext())
|
||||||
|
<a class="prev" href="{{ route('calendar', ['type' => $type, 'month' => $previous->format('m'), 'year' => $previous->format('Y')]) }}">Prev</a>
|
||||||
|
<span class="title">{{ $month->getDate() }}</span>
|
||||||
|
<a class="next" href="{{ route('calendar', ['type' => $type, 'month' => $next->format('m'), 'year' => $next->format('Y')]) }}">Next</a>
|
||||||
|
</div></div><div class="box-content">
|
||||||
|
<ul class="label">
|
||||||
|
<li class="start title title">Mon</li>
|
||||||
|
<li class="start title title">Tue</li>
|
||||||
|
<li class="start title title">Wed</li>
|
||||||
|
<li class="start title title">Thu</li>
|
||||||
|
<li class="start title title">Fri</li>
|
||||||
|
<li class="start title title">Sat</li>
|
||||||
|
<li class="start title title">Sun</li>
|
||||||
|
</ul>
|
||||||
|
<div class="clear"></div>
|
||||||
|
{!! $month->render() !!}
|
||||||
|
<div class="clear"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
@ -81,9 +81,8 @@
|
|||||||
<div class="col-md-6 col-lg-4">
|
<div class="col-md-6 col-lg-4">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="form-label">{{ __('Avatar') }}</div>
|
<div class="form-label">{{ __('Avatar') }}</div>
|
||||||
@php($avatar = Auth::user()->getAvatar())
|
@if(Auth::user()->hasMedia('avatars'))
|
||||||
@if($avatar !== '')
|
<img src="{{ route('display_avatar', ['alias' => 'thumb'])}}">
|
||||||
<img src="{{ $avatar}}">
|
|
||||||
@endif
|
@endif
|
||||||
<div class="custom-file">
|
<div class="custom-file">
|
||||||
<input type="file" class="custom-file-input" name="avatar">
|
<input type="file" class="custom-file-input" name="avatar">
|
||||||
|
@ -29,9 +29,11 @@ Route::group(['middleware' => ['auth']], function() {
|
|||||||
|
|
||||||
// stats
|
// stats
|
||||||
Route::post('stats', 'StatsController@tag')->name('stats'); // TODO make a group for stats
|
Route::post('stats', 'StatsController@tag')->name('stats'); // TODO make a group for stats
|
||||||
|
Route::get('/calendar/{type}/{year?}/{month?}', 'StatsController@calendar')->name('calendar');
|
||||||
|
|
||||||
// gallery
|
// gallery
|
||||||
Route::get('/display/{post_id}/{options}/{image_name}', 'ImageController@display')->name('display_image');
|
Route::get('/avatar/{alias}', 'ImageController@avatar')->name('display_avatar');
|
||||||
|
Route::get('/display/{post_id}/{alias?}', 'ImageController@display')->name('display_image');
|
||||||
Route::get('/gallery', 'ImageController@gallery')->name('gallery');
|
Route::get('/gallery', 'ImageController@gallery')->name('gallery');
|
||||||
|
|
||||||
// user
|
// user
|
||||||
|
Loading…
Reference in New Issue
Block a user