Progress
This commit is contained in:
parent
571df9a0a4
commit
5d8b29f828
@ -8,4 +8,9 @@ public function index()
|
||||
{
|
||||
return view('maintenance.index');
|
||||
}
|
||||
|
||||
public function planned()
|
||||
{
|
||||
return view('maintenance.planned');
|
||||
}
|
||||
}
|
||||
|
@ -27,8 +27,25 @@ public function handle(Request $request, Closure $next): Response
|
||||
Menu::make('main-menu', function ($menu) {
|
||||
$systemRoutes = [
|
||||
'boilerplate::ui.home' => [' fas fa-home', 'home'],
|
||||
'boilerplate::ui.host' => [' fas fa-server', 'host'],
|
||||
'boilerplate::ui.maintenance' => [' fas fa-calendar', 'maintenance'],
|
||||
'boilerplate::ui.planned' => [' fas fa-home', 'maintenance.planned'],
|
||||
];
|
||||
|
||||
foreach ($systemRoutes as $title => $route_data) {
|
||||
$icon = $route_data[0];
|
||||
$route = $route_data[1];
|
||||
|
||||
$menu = $menu->add($title, [
|
||||
'id' => strtolower($title),
|
||||
'icon' => $icon,
|
||||
'route' => $route,
|
||||
]);
|
||||
}
|
||||
});
|
||||
|
||||
Menu::make('settings-menu', function ($menu) {
|
||||
$systemRoutes = [
|
||||
'Host' => [' fas fa-server', 'host'],
|
||||
'Maintenance' => [' fas fa-calendar', 'maintenance'],
|
||||
];
|
||||
|
||||
foreach ($systemRoutes as $title => $route_data) {
|
||||
|
43
app/Jobs/ScheduleNextMaintenance.php
Normal file
43
app/Jobs/ScheduleNextMaintenance.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Models\Maintenance;
|
||||
use App\Models\MaintenanceHistory;
|
||||
use Cron\CronExpression;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Foundation\Queue\Queueable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class ScheduleNextMaintenance implements ShouldQueue
|
||||
{
|
||||
use Queueable;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
$maintenances = Maintenance::all();
|
||||
foreach ($maintenances as $maintenance) {
|
||||
$cron = new CronExpression($maintenance->schedule);
|
||||
dump($cron->getNextRunDate(null, 2)->format('Y-m-d H:i:s'));
|
||||
|
||||
|
||||
$maintenance->history()->create([
|
||||
'start_at' => $cron->getNextRunDate(null, 2)
|
||||
]);
|
||||
die();
|
||||
}
|
||||
}
|
||||
}
|
32
app/Livewire/MaintenanceHistory/DataTable.php
Normal file
32
app/Livewire/MaintenanceHistory/DataTable.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
namespace App\Livewire\MaintenanceHistory;
|
||||
|
||||
use App\Models\MaintenanceHistory;
|
||||
use SteelAnts\DataTable\Livewire\DataTableComponent;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class DataTable extends DataTableComponent
|
||||
{
|
||||
public $listeners = [
|
||||
'maintenanceHistoryAdded' => '$refresh',
|
||||
'closeModal' => '$refresh',
|
||||
];
|
||||
|
||||
public function query(): Builder
|
||||
{
|
||||
return MaintenanceHistory::query();
|
||||
}
|
||||
|
||||
public function headers(): array
|
||||
{
|
||||
return [
|
||||
'maintenance.name' => 'maintenance.name',
|
||||
'start_at' => 'start_at',
|
||||
'finished_at' => 'finished_at',
|
||||
];
|
||||
}
|
||||
|
||||
public function remove($maintenancehistory_id){
|
||||
MaintenanceHistory::find($maintenancehistory_id)->delete();
|
||||
}
|
||||
}
|
60
app/Livewire/MaintenanceHistory/Form.php
Normal file
60
app/Livewire/MaintenanceHistory/Form.php
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
namespace App\Livewire\MaintenanceHistory;
|
||||
|
||||
use Livewire\Component;
|
||||
use App\Models\MaintenanceHistory;
|
||||
|
||||
class Form extends Component
|
||||
{
|
||||
public $model;
|
||||
public string $maintenance_id;
|
||||
public string $start_at;
|
||||
public string $finished_at;
|
||||
|
||||
public $action = 'store';
|
||||
|
||||
protected function rules()
|
||||
{
|
||||
return [
|
||||
'maintenance_id' => 'required',
|
||||
'start_at' => 'required',
|
||||
'finished_at' => 'required',
|
||||
];
|
||||
}
|
||||
|
||||
public function mount ($model = null){
|
||||
if (!empty($model)) {
|
||||
$maintenance-history = MaintenanceHistory::find($model);
|
||||
|
||||
$this->model = $model;
|
||||
|
||||
$this->maintenance_id = $maintenance-history->maintenance_id;
|
||||
$this->start_at = $maintenance-history->start_at;
|
||||
$this->finished_at = $maintenance-history->finished_at;
|
||||
|
||||
$this->action = 'update';
|
||||
}
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
$validatedData = $this->validate();
|
||||
MaintenanceHistory::create($validatedData);
|
||||
$this->dispatch('closeModal');
|
||||
}
|
||||
|
||||
public function update()
|
||||
{
|
||||
$validatedData = $this->validate();
|
||||
$maintenance-history = MaintenanceHistory::find($this->model);
|
||||
if (!empty($maintenance-history)) {
|
||||
$maintenance-history->update($validatedData);
|
||||
}
|
||||
$this->dispatch('closeModal');
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.components.maintenance-history.form');
|
||||
}
|
||||
}
|
@ -14,4 +14,9 @@ class Maintenance extends Model
|
||||
'description',
|
||||
'schedule',
|
||||
];
|
||||
|
||||
public function history()
|
||||
{
|
||||
return $this->hasMany(MaintenanceHistory::class);
|
||||
}
|
||||
}
|
||||
|
@ -8,4 +8,15 @@
|
||||
class MaintenanceHistory extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'maintenance_id',
|
||||
'start_at',
|
||||
'finished_at',
|
||||
];
|
||||
|
||||
public function maintenance()
|
||||
{
|
||||
return $this->BelongsTo(Maintenance::class);
|
||||
}
|
||||
}
|
||||
|
@ -24,6 +24,7 @@ public function render(): View|Closure|string
|
||||
{
|
||||
return view('components.navigation', [
|
||||
'mainMenuItems' => Menu::get('main-menu')->items() ?? [],
|
||||
'settingsMenuItems' => Menu::get('settings-menu')->items() ?? [],
|
||||
'systemMenuItems' => Menu::get('system-menu')->items() ?? [],
|
||||
]);
|
||||
}
|
||||
|
@ -6,12 +6,14 @@
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"dragonmantank/cron-expression": "^3.3",
|
||||
"laravel/framework": "^11.9",
|
||||
"laravel/sanctum": "^4.0",
|
||||
"laravel/tinker": "^2.9",
|
||||
"steelants/laravel-boilerplate": "^1.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-debugbar": "^3.13",
|
||||
"fakerphp/faker": "^1.23",
|
||||
"laravel/pint": "^1.13",
|
||||
"laravel/sail": "^1.26",
|
||||
|
176
composer.lock
generated
176
composer.lock
generated
@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "d901703e92531876ccae1dd19ef6f1cb",
|
||||
"content-hash": "07da4413e8866ce0abc6ed9d0e274725",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
@ -1052,16 +1052,16 @@
|
||||
},
|
||||
{
|
||||
"name": "laravel/framework",
|
||||
"version": "v11.18.1",
|
||||
"version": "v11.19.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/framework.git",
|
||||
"reference": "b19ba518c56852567e99fbae9321bc436c2cc5a8"
|
||||
"reference": "5e103d499e9ee5bcfc184412d034c4e516b87085"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/b19ba518c56852567e99fbae9321bc436c2cc5a8",
|
||||
"reference": "b19ba518c56852567e99fbae9321bc436c2cc5a8",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/5e103d499e9ee5bcfc184412d034c4e516b87085",
|
||||
"reference": "5e103d499e9ee5bcfc184412d034c4e516b87085",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1254,7 +1254,7 @@
|
||||
"issues": "https://github.com/laravel/framework/issues",
|
||||
"source": "https://github.com/laravel/framework"
|
||||
},
|
||||
"time": "2024-07-26T10:39:29+00:00"
|
||||
"time": "2024-07-30T15:22:41+00:00"
|
||||
},
|
||||
{
|
||||
"name": "laravel/prompts",
|
||||
@ -6067,6 +6067,90 @@
|
||||
}
|
||||
],
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "barryvdh/laravel-debugbar",
|
||||
"version": "v3.13.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/barryvdh/laravel-debugbar.git",
|
||||
"reference": "92d86be45ee54edff735e46856f64f14b6a8bb07"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/92d86be45ee54edff735e46856f64f14b6a8bb07",
|
||||
"reference": "92d86be45ee54edff735e46856f64f14b6a8bb07",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"illuminate/routing": "^9|^10|^11",
|
||||
"illuminate/session": "^9|^10|^11",
|
||||
"illuminate/support": "^9|^10|^11",
|
||||
"maximebf/debugbar": "~1.22.0",
|
||||
"php": "^8.0",
|
||||
"symfony/finder": "^6|^7"
|
||||
},
|
||||
"require-dev": {
|
||||
"mockery/mockery": "^1.3.3",
|
||||
"orchestra/testbench-dusk": "^5|^6|^7|^8|^9",
|
||||
"phpunit/phpunit": "^9.6|^10.5",
|
||||
"squizlabs/php_codesniffer": "^3.5"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.13-dev"
|
||||
},
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Barryvdh\\Debugbar\\ServiceProvider"
|
||||
],
|
||||
"aliases": {
|
||||
"Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/helpers.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Barryvdh\\Debugbar\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Barry vd. Heuvel",
|
||||
"email": "barryvdh@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "PHP Debugbar integration for Laravel",
|
||||
"keywords": [
|
||||
"debug",
|
||||
"debugbar",
|
||||
"laravel",
|
||||
"profiler",
|
||||
"webprofiler"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/barryvdh/laravel-debugbar/issues",
|
||||
"source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.5"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://fruitcake.nl",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/barryvdh",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-12T11:20:37+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"version": "v1.23.1",
|
||||
@ -6381,6 +6465,74 @@
|
||||
},
|
||||
"time": "2024-07-22T14:36:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "maximebf/debugbar",
|
||||
"version": "v1.22.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/maximebf/php-debugbar.git",
|
||||
"reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96",
|
||||
"reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2|^8",
|
||||
"psr/log": "^1|^2|^3",
|
||||
"symfony/var-dumper": "^4|^5|^6|^7"
|
||||
},
|
||||
"require-dev": {
|
||||
"dbrekelmans/bdi": "^1",
|
||||
"phpunit/phpunit": "^8|^9",
|
||||
"symfony/panther": "^1|^2.1",
|
||||
"twig/twig": "^1.38|^2.7|^3.0"
|
||||
},
|
||||
"suggest": {
|
||||
"kriswallsmith/assetic": "The best way to manage assets",
|
||||
"monolog/monolog": "Log using Monolog",
|
||||
"predis/predis": "Redis storage"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.22-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"DebugBar\\": "src/DebugBar/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Maxime Bouroumeau-Fuseau",
|
||||
"email": "maxime.bouroumeau@gmail.com",
|
||||
"homepage": "http://maximebf.com"
|
||||
},
|
||||
{
|
||||
"name": "Barry vd. Heuvel",
|
||||
"email": "barryvdh@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "Debug bar in the browser for php application",
|
||||
"homepage": "https://github.com/maximebf/php-debugbar",
|
||||
"keywords": [
|
||||
"debug",
|
||||
"debugbar"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/maximebf/php-debugbar/issues",
|
||||
"source": "https://github.com/maximebf/php-debugbar/tree/v1.22.3"
|
||||
},
|
||||
"time": "2024-04-03T19:39:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mockery/mockery",
|
||||
"version": "1.6.12",
|
||||
@ -7064,16 +7216,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "11.2.8",
|
||||
"version": "11.2.9",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "a7a29e8d3113806f18f99d670f580a30e8ffff39"
|
||||
"reference": "c197bbaaca360efda351369bf1fd9cc1ca6bcbf7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a7a29e8d3113806f18f99d670f580a30e8ffff39",
|
||||
"reference": "a7a29e8d3113806f18f99d670f580a30e8ffff39",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c197bbaaca360efda351369bf1fd9cc1ca6bcbf7",
|
||||
"reference": "c197bbaaca360efda351369bf1fd9cc1ca6bcbf7",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -7144,7 +7296,7 @@
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.2.8"
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.2.9"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@ -7160,7 +7312,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-07-18T14:56:37+00:00"
|
||||
"time": "2024-07-30T11:09:23+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/cli-parser",
|
||||
|
@ -16,9 +16,9 @@ public function up(): void
|
||||
Schema::create('maintenance_histories', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignIdFor(Maintenance::class);
|
||||
$table->foreignIdFor(User::class);
|
||||
$table->foreignIdFor(User::class)->nullable();
|
||||
$table->datetime('start_at');
|
||||
$table->datetime('finished_at');
|
||||
$table->datetime('finished_at')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
@ -49,18 +49,29 @@
|
||||
|
||||
<ul class="app-nav nav flex-column">
|
||||
@foreach ($mainMenuItems as $item)
|
||||
<li class="nav-item {{ ($item->isActive() || $item->isUse()) ? 'is-active' : '' }}">
|
||||
<li class="nav-item {{ $item->isActive() || $item->isUse() ? 'is-active' : '' }}">
|
||||
<a class="nav-link" href="{{ route($item->route, $item->parameters) }}">
|
||||
<i class="nav-link-ico {{ $item->icon }}"></i>
|
||||
{{ __($item->title) }}
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
<li class="mt-4 text-body-secondary"><small>{{ __('boilerplate::ui.settings') }}</small></li>
|
||||
@foreach ($settingsMenuItems as $item)
|
||||
<li class="nav-item {{ $item->isActive() || $item->isUse() ? 'is-active' : '' }}">
|
||||
<a class="nav-link" href="{{ route($item->route, $item->parameters) }}">
|
||||
<i class="nav-link-ico {{ $item->icon }}"></i>
|
||||
{{ __($item->title) }}
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
{{-- MAIN NAVIGATION ALL --}}
|
||||
@auth
|
||||
<li class="mt-4 text-body-secondary"><small>{{ __('boilerplate::ui.system') }}</small></li>
|
||||
@foreach ($systemMenuItems as $item)
|
||||
<li class="nav-item {{ ($item->isActive() || $item->isUse()) ? 'is-active' : '' }}">
|
||||
<li class="nav-item {{ $item->isActive() || $item->isUse() ? 'is-active' : '' }}">
|
||||
<a class="nav-link" href="{{ route($item->route, $item->parameters) }}">
|
||||
<i class="nav-link-ico {{ $item->icon }}"></i>
|
||||
{{ __($item->title) }}
|
||||
|
@ -0,0 +1,8 @@
|
||||
<div>
|
||||
<x-form::form wire:submit.prevent="{{$action}}">
|
||||
<x-form::input group-class="mb-3" type="text" wire:model="maintenance_id" id="maintenance_id" label="maintenance_id"/>
|
||||
<x-form::input group-class="mb-3" type="text" wire:model="start_at" id="start_at" label="start_at"/>
|
||||
<x-form::input group-class="mb-3" type="text" wire:model="finished_at" id="finished_at" label="finished_at"/>
|
||||
<x-form::button class="btn-primary" type="submit">Create</x-form::button>
|
||||
</x-form::form>
|
||||
</div>
|
9
resources/views/maintenance/planned.blade.php
Normal file
9
resources/views/maintenance/planned.blade.php
Normal file
@ -0,0 +1,9 @@
|
||||
<x-layout-app>
|
||||
<div class="container-xl">
|
||||
<div class="page-header">
|
||||
<h1>{{ __('Planned Maintenance') }}</h1>
|
||||
</div>
|
||||
|
||||
@livewire('maintenance-history.data-table', [], key('data-table'))
|
||||
</div>
|
||||
</x-layout-app>
|
@ -8,11 +8,13 @@
|
||||
});
|
||||
|
||||
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
|
||||
Route::get('/maintenance/planned', [App\Http\Controllers\MaintenanceController::class, 'planned'])->name('maintenance.planned');
|
||||
|
||||
|
||||
Route::get('/host', [App\Http\Controllers\HostController::class, 'index'])->name('host');
|
||||
Route::get('/maintenance', [App\Http\Controllers\MaintenanceController::class, 'index'])->name('maintenance');
|
||||
|
||||
|
||||
|
||||
Route::prefix('profile')->name('profile.')->middleware(['auth'])->group(function () {
|
||||
Route::get('/', [App\Http\Controllers\Auth\ProfileController::class, 'index'])->middleware('auth')->name('index');
|
||||
Route::put('/update', [App\Http\Controllers\Auth\ProfileController::class, 'update'])->middleware('auth')->name('update');
|
||||
|
2
storage/debugbar/.gitignore
vendored
Normal file
2
storage/debugbar/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
Loading…
Reference in New Issue
Block a user