diff --git a/app/Enums/InfoColors.php b/app/Enums/InfoColors.php new file mode 100644 index 0000000..8fba3d7 --- /dev/null +++ b/app/Enums/InfoColors.php @@ -0,0 +1,90 @@ + 0, + 'secondary' => 1, + 'success' => 2, + 'danger' => 3, + 'warning' => 4, + 'info' => 5, + 'light' => 6, + 'dark' => 7, + 'white' => 8 + ]; + } + + /** + * Enum labels + * + * @return array + */ + protected static function labels(): array + { + return [ + 'primary' => trans('Primary'), + 'secondary' => trans('Secondary'), + 'success' => trans('Success'), + 'danger' => trans('Danger'), + 'warning' => trans('Warning'), + 'info' => trans('Info'), + 'light' => trans('Light'), + 'dark' => trans('Dark'), + 'white' => trans('white') + ]; + } + + /** + * Enum classes + * + * @return array + */ + protected static function classes(): array + { + return [ + 'primary' => 'primary', + 'secondary' => 'secondary', + 'success' => 'success', + 'danger' => 'danger', + 'warning' => 'warning', + 'info' => 'info', + 'light' => 'light', + 'dark' => 'dark', + ]; + } + + /** + * @param string $attribute + * @return integer|string + */ + public function __get(string $attribute) + { + if ($attribute === 'class') { + return $this->classes()[$this->getDefinition()]; + } + return parent::__get($attribute); + } +} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 563d734..fa8f755 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -3,23 +3,21 @@ namespace App\Http\Controllers; use App\Models\Dutyhour; -use Illuminate\Http\Request; class HomeController extends Controller { - /** - * Show Home page - * - * @param Illuminate\Http\Request $request - * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory - */ - public function home(Request $request) - { /** - * Get only duty hours for today or later. - * @var \Illuminate\Database\Eloquent\Builder $dutyhour - */ - $dutyhourModels = Dutyhour::where('date', '>', now()->modify('-1 day'))->orderBy('date', 'asc')->limit(10)->get(); - return view('home', compact('dutyhourModels')); - } + * Show Home page + * + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ + public function home() + { + /** + * Get only duty hours for today or later. + * @var \Illuminate\Database\Eloquent\Builder $dutyhour + */ + $dutyhourModels = Dutyhour::where('date', '>', now()->modify('-1 day'))->orderBy('date', 'asc')->limit(10)->get(); + return view('home', compact('dutyhourModels')); + } } diff --git a/app/Http/Controllers/InformationController.php b/app/Http/Controllers/InformationController.php new file mode 100644 index 0000000..5b05001 --- /dev/null +++ b/app/Http/Controllers/InformationController.php @@ -0,0 +1,52 @@ +put('infos', Information::all(), 3600); + } + + /** + * After update model middleware + * + * @return void + */ + public function updatedModel() + { + cache()->put('infos', Information::all(), 3600); + } + + /** + * After delete model middleware + * + * @return void + */ + public function deletedModel() + { + cache()->put('infos', Information::all(), 3600); + } +} diff --git a/app/Models/Information.php b/app/Models/Information.php new file mode 100644 index 0000000..b3393b6 --- /dev/null +++ b/app/Models/Information.php @@ -0,0 +1,120 @@ + InfoColors::class, + ]; + + /** + * Package + * + * @param array $attributes + */ + public function __construct(array $attributes = []) + { + self::$editableProperties = [ + 'title' => [ + 'label' => trans('Titre'), + 'type' => CrudType::string(), + 'validate' => [ + 'string', + 'max:255' + ], + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + 'message' => [ + 'label' => trans('Message'), + 'type' => CrudType::string(), + 'validate' => [ + 'string', + 'max:255' + ], + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + 'type' => [ + 'label' => trans('Type d\'annonce'), + 'type' => CrudType::enum(), + 'enum' => InfoColors::class, + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + ]; + parent::__construct($attributes); + } +} diff --git a/app/Policies/InformationPolicy.php b/app/Policies/InformationPolicy.php new file mode 100644 index 0000000..25d254d --- /dev/null +++ b/app/Policies/InformationPolicy.php @@ -0,0 +1,38 @@ +policies = [ + 'information' => [ + 'viewAny' => URR::make('userIsAdmin', $user), + 'create' => URR::make('userIsAdmin', $user), + 'update' => URR::make('userIsAdmin', $user), + 'delete' => URR::make('userIsAdmin', $user) + ] + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 780fcc7..3837591 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Models\Information; use App\Models\MacroSchedule\Marker; use Illuminate\Pagination\Paginator; use Illuminate\Support\Carbon; @@ -51,17 +52,21 @@ class AppServiceProvider extends ServiceProvider }); if (!app()->runningInConsole()) { - $appInfos = Cache::remember('composer', 360, function () { + $appInfos = Cache::remember('composer', 3600, function () { return json_decode(File::get(\app_path('../composer.json'))); }); View::share('name', $appInfos->name); View::share('version', $appInfos->version); View::share('license', $appInfos->license); - // * Groups View::share('markerLabels', Cache::rememberForever('markerLabels', function () { return Marker::getCachedLabels() ?? []; })); + // * Informations + $infos = Cache::remember('infos', 3600, function () { + return Information::all(); + }); + View::share('informations', $infos); }//end if } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 48e81b8..93c881b 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -8,6 +8,7 @@ use App\Models\Credit\Account; use App\Models\Credit\CreditLog; use App\Models\Dutyhour; use App\Models\File; +use App\Models\Information; use App\Models\Invoice; use App\Models\Label; use App\Models\Log; @@ -93,6 +94,7 @@ class RouteServiceProvider extends ServiceProvider Route::model('marker', Marker::class); Route::model('package', Package::class); Route::model('dutyhour', Dutyhour::class); + Route::model('information', Information::class); Route::model('company', Company::class); Route::model('invoice', Invoice::class); Route::model('file', File::class); diff --git a/database/migrations/2023_04_18_150623_create_informations_table.php b/database/migrations/2023_04_18_150623_create_informations_table.php new file mode 100644 index 0000000..f31e292 --- /dev/null +++ b/database/migrations/2023_04_18_150623_create_informations_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('title'); + $table->string('message'); + $table->unsignedTinyInteger('type')->comment('Defined by the InfoColors enum.'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('informations'); + } +} diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index 5f9af5f..b0edf88 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -17,5 +17,6 @@ return [ 'invoices' => 'Invoices', 'companies' => 'Companies', 'dutyhours' => 'Duty Hours', + 'informations' => 'Informations', ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index 7af9451..bb6d649 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -17,5 +17,6 @@ return [ 'invoices' => 'Devis', 'companies' => 'Sociétés', 'dutyhours' => 'Permanences', + 'informations' => 'Informations', ] ]; diff --git a/resources/views/informations/index.blade.php b/resources/views/informations/index.blade.php new file mode 100644 index 0000000..dc28d2e --- /dev/null +++ b/resources/views/informations/index.blade.php @@ -0,0 +1,112 @@ +@extends($viewLayout) + +@section('title', sprintf('%s - %s', transFb(sprintf('models.classes.%s', strtolower(Str::plural(class_basename($modelClass)))), Str::plural(class_basename($modelClass))), __('crud-policies::crud.viewAny'))) +@section('description', sprintf('%s %s', __('crud-policies::crud.viewAny'), trans(Str::plural(class_basename($modelClass))))) +@section('metaIndex', 'noindex,nofollow') + +@section('content') +
+ @include('crud-policies::crud.modules.flashMessage') +
+ @include('crud-policies::crud.modules.breadcrumb', ['action' => CrudAction::viewAny()]) + @include('crud-policies::crud.modules.actionbar.bar', ['action' => CrudAction::viewAny()]) +
+
+
+
+ {{ $models->links() }} +
+
+
+
+ + + + {{ __('crud-policies::crud.reset') }} + +
+
+
+
+ + + @include('crud-policies::crud.modules.sorter') + + + @if(count($models)) + + {{-- INIT QUERIES for OPTIMIZING --}} + @foreach ($modelClass::getEditableProperties() as $fieldName => $prop) + @if($prop['type']->equals(CrudType::order())) + @php ${"$modelTable$fieldName"} = $modelClass::max($fieldName); @endphp + @endif + @if($prop['type']->equals(CrudType::belongsTo())) + @php try { $models->load(Str::singular((new $prop['belongsTo']())->getTable())); } catch(\Exception $e) {} @endphp + @endif + @if($prop['type']->equals(CrudType::belongsToMany())) + @php $models->load("$fieldName"); @endphp + @endif + @endforeach + + {{-- DISPLAY MODELS --}} + @foreach($models as $model) + + @foreach ($modelClass::getEditableProperties() as $fieldName => $prop) + @if(in_array(CrudAction::viewAny(), $prop['actions'])) + @switch($prop['type']) + @case(CrudType::password()) + {{-- Ignore --}} + @break + @default + + @endswitch + @endif + @endforeach + + {{-- MODEL ACTIONS --}} + + + @endforeach + @else + + + + @endif + +
@include('crud-policies::crud.printfield', [ + 'action' => CrudAction::viewAny(), + 'field' => $model->{$fieldName}, + 'props' => $prop, + "$modelTable$fieldName" => ${"$modelTable$fieldName"} ?? null + ]) +
+ @can('view', $model) + {{ __('crud-policies::crud.view') }} + @endcan + @can('update', $model) + {{ __('crud-policies::crud.edit') }} + @endcan + @can('delete', $model) +
+ @csrf + @method('DELETE') + +
+ @endcan + @can('viewAny', \App\Models\Log::class) + {{ __('models.classes.logs') }} + @endcan + @can('viewAny', \App\Models\File::class) + {{ __('models.classes.files') }} + @endcan +
+
+ {{ __('crud-policies::crud.nothingtoshow') }} +
+ {{ $models->links() }} +
+
+@include('crud-policies::crud.modules.scriptConstants') +@endsection diff --git a/resources/views/layout/app.blade.php b/resources/views/layout/app.blade.php index 6694e30..33f2d6f 100644 --- a/resources/views/layout/app.blade.php +++ b/resources/views/layout/app.blade.php @@ -28,6 +28,15 @@
+ @auth + @foreach ($informations as $information) + + @endforeach + @endauth + @if(!isset($modelClass)) {{-- Dont use for crud-policies --}} @include('modules.flashMessage') diff --git a/resources/views/layout/nav.blade.php b/resources/views/layout/nav.blade.php index 1c26a94..d49eff7 100644 --- a/resources/views/layout/nav.blade.php +++ b/resources/views/layout/nav.blade.php @@ -49,6 +49,9 @@ @can('viewAny', App\Models\Dutyhour::class) {{ __('models.classes.dutyhours') }} @endcan + @can('viewAny', App\Models\Information::class) + {{ __('models.classes.informations') }} + @endcan
@endif diff --git a/routes/web.php b/routes/web.php index bbe7386..212d933 100644 --- a/routes/web.php +++ b/routes/web.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Credit\EstimationController; use App\Http\Controllers\DutyhourController; use App\Http\Controllers\FileController; use App\Http\Controllers\HomeController; +use App\Http\Controllers\InformationController; use App\Http\Controllers\InvoiceController; use App\Http\Controllers\LabelController; use App\Http\Controllers\LogController; @@ -76,6 +77,7 @@ Route::middleware('auth:web')->group(function () { Route::resource('users', UserController::class); Route::resource('packages', PackageController::class)->except('show'); Route::resource('dutyhours', DutyhourController::class)->except('show'); + Route::resource('informations', InformationController::class)->except('show'); Route::resource('companies', CompanyController::class)->except('show'); Route::resource('invoices', InvoiceController::class); Route::resource('labels', LabelController::class)->except('show');