diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index be055ac..f8ff2fe 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,6 +2,7 @@ namespace App\Console; +use App\Jobs\SlidersStatusUpdate; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -15,6 +16,7 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule) { + $schedule->job(SlidersStatusUpdate::class)->everyMinute(); } /** diff --git a/app/Http/Requests/Bo/Sliders/StoreSliderRequest.php b/app/Http/Requests/Bo/Sliders/StoreSliderRequest.php index a262101..ab706f0 100644 --- a/app/Http/Requests/Bo/Sliders/StoreSliderRequest.php +++ b/app/Http/Requests/Bo/Sliders/StoreSliderRequest.php @@ -27,7 +27,9 @@ class StoreSliderRequest extends FormRequest { $this->merge([ 'link_new_tab' => $this->link_new_tab ? true : false, - 'status' => $this->status ? true : false + 'status' => $this->status ? true : false, + 'publish_at' => $this->publish_at ? \str_replace('T', ' ', $this->publish_at) : null, + 'unpublish_at' => $this->unpublish_at ? \str_replace('T', ' ', $this->unpublish_at) : null, ]); } @@ -49,7 +51,9 @@ class StoreSliderRequest extends FormRequest 'link_color' => 'required|color_hex', 'link_color_bg' => 'required|color_hex', 'link_new_tab' => 'required|boolean', - 'status' => 'required|boolean' + 'status' => 'required|boolean', + 'publish_at' => 'nullable|date_format:Y-m-d H:i', + 'unpublish_at' => 'nullable|date_format:Y-m-d H:i', ]; } diff --git a/app/Jobs/SlidersStatusUpdate.php b/app/Jobs/SlidersStatusUpdate.php new file mode 100644 index 0000000..8a3667f --- /dev/null +++ b/app/Jobs/SlidersStatusUpdate.php @@ -0,0 +1,41 @@ +toDateTime()) + ->whereNotNull('publish_at') + ->whereStatus(false)->get(); + Log::debug(__CLASS__ . " sliders to publish " . $slidersToPublish->count()); + foreach ($slidersToPublish as $slider) { + $slider->publish_at = null; + $slider->status = true; + $slider->saveOrFail(); + } + $slidersToUnPublish = Slider::where('unpublish_at', '<=', Carbon::now()->toDateTime()) + ->whereNotNull('unpublish_at') + ->whereStatus(true)->get(); + Log::debug(__CLASS__ . " sliders to unpublish " . $slidersToPublish->count()); + foreach ($slidersToUnPublish as $slider) { + $slider->unpublish_at = null; + $slider->status = false; + $slider->saveOrFail(); + } + } +} diff --git a/app/Models/Slider.php b/app/Models/Slider.php index 91b213e..255020d 100644 --- a/app/Models/Slider.php +++ b/app/Models/Slider.php @@ -9,6 +9,7 @@ use App\Enums\Sliders\SliderType; use App\Lib\ToolboxHelper; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Session; use Kwaadpepper\Enum\Traits\CastsEnums; class Slider extends Model @@ -37,7 +38,9 @@ class Slider extends Model 'link_color_bg', 'link_new_tab', 'status', - 'order' + 'order', + 'publish_at', + 'unpublish_at' ]; /** @@ -63,7 +66,9 @@ class Slider extends Model 'link_color' => HtmlColor::class, 'link_color_bg' => HtmlColor::class, 'link_new_tab' => 'bool', - 'status' => 'bool' + 'status' => 'bool', + 'publish_at' => 'datetime', + 'unpublish_at' => 'datetime' ]; /** @@ -77,12 +82,27 @@ class Slider extends Model ToolboxHelper::assertNoInternalBoUrls('link', $model->link); $model->picture = ToolboxHelper::storeImage($model, $model->picture); $model->order = self::whereType($model->type)->max('order') ?? 0; + if (!$model->status) { + $model->publish_at = null; + } else { + $model->unpublish_at = null; + } }); static::updating(function (self $model) { ToolboxHelper::assertNoInternalBoUrls('link', $model->link); if ($model->picture != $model->getOriginal('picture')) { $model->picture = ToolboxHelper::storeImage($model, $model->picture); } + // * If status changed + if (\boolval($model->getOriginal('status')) !== $model->status) { + if ($model->status) { + $model->publish_at = null; + Session::flash('info', trans('Le slider est à présent publié')); + } else { + $model->unpublish_at = null; + Session::flash('warning', trans('Le slider est à présent dépublié')); + } + } }); static::updated(function (self $model) { if ($model->picture != $model->getOriginal('picture')) { diff --git a/database/migrations/2022_06_09_091544_add_publish_timestamps_to_sliders.php b/database/migrations/2022_06_09_091544_add_publish_timestamps_to_sliders.php new file mode 100644 index 0000000..bb29b96 --- /dev/null +++ b/database/migrations/2022_06_09_091544_add_publish_timestamps_to_sliders.php @@ -0,0 +1,35 @@ +timestamp('publish_at')->after('order')->nullable() + ->comment('The date where the post published state should be changed to published.'); + $table->timestamp('unpublish_at')->after('order')->nullable() + ->comment('The date where the post published state should be changed to archived.'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('sliders', function (Blueprint $table) { + $table->dropColumn(['publish_at', 'unpublish_at']); + }); + } +} diff --git a/resources/views/back/sliders/form.blade.php b/resources/views/back/sliders/form.blade.php index faf5228..8ff9081 100644 --- a/resources/views/back/sliders/form.blade.php +++ b/resources/views/back/sliders/form.blade.php @@ -66,6 +66,39 @@ +
+
+
+ {{ __('Publication') }} +
+
+ {{ __('La zone suivante à modifier la visibilité.') }} +
+
+
+
+
+ + + @include('back.modules.input-error', [ + 'inputName' => 'publish_at', 'helperId' => 'sliderPublishAtHelp' , 'helper' => __('Uniquement pour planifier la publication, le slider deviendra visible.') + ]) +
+
+
+
+ + + @include('back.modules.input-error', [ + 'inputName' => 'unpublish_at', 'helperId' => 'sliderUnPublishAtHelp' , 'helper' => __('Uniquement pour planifier la fin de la publication, le slider deviendra invisible.') + ]) +
+
+
+
+
+
+
@@ -177,3 +210,65 @@
+ + +@push('scripts') + +@endpush