From d49bb5eaa724ef34238b07d6f36c92761bac57a7 Mon Sep 17 00:00:00 2001 From: "noah.lancien" Date: Tue, 18 Apr 2023 10:46:40 +0000 Subject: [PATCH 01/12] Added CRUD for Duty Hours --- app/Http/Controllers/DutyhourController.php | 22 ++++ app/Models/Dutyhour.php | 99 ++++++++++++++++ app/Policies/DutyhourPolicy.php | 38 ++++++ app/Providers/RouteServiceProvider.php | 2 + ...23_04_18_123853_create_dutyhours_table.php | 34 ++++++ resources/lang/en/models.php | 1 + resources/lang/fr/models.php | 1 + resources/views/dutyhours/index.blade.php | 112 ++++++++++++++++++ resources/views/layout/nav.blade.php | 3 + routes/web.php | 2 + 10 files changed, 314 insertions(+) create mode 100644 app/Http/Controllers/DutyhourController.php create mode 100644 app/Models/Dutyhour.php create mode 100644 app/Policies/DutyhourPolicy.php create mode 100644 database/migrations/2023_04_18_123853_create_dutyhours_table.php create mode 100644 resources/views/dutyhours/index.blade.php diff --git a/app/Http/Controllers/DutyhourController.php b/app/Http/Controllers/DutyhourController.php new file mode 100644 index 0000000..921fb3b --- /dev/null +++ b/app/Http/Controllers/DutyhourController.php @@ -0,0 +1,22 @@ + 'date' + ]; + + /** + * Package + * + * @param array $attributes + */ + public function __construct(array $attributes = []) + { + self::$editableProperties = [ + 'date' => [ + 'label' => trans('Date'), + 'type' => CrudType::date(), + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + 'person' => [ + 'label' => trans('Personne présente'), + 'type' => CrudType::string(), + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + 'place' => [ + 'label' => trans('Lieu'), + 'type' => CrudType::string(), + 'nullable' => false, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::update(), + CrudAction::create() + ] + ], + ]; + parent::__construct($attributes); + } +} diff --git a/app/Policies/DutyhourPolicy.php b/app/Policies/DutyhourPolicy.php new file mode 100644 index 0000000..c77cadd --- /dev/null +++ b/app/Policies/DutyhourPolicy.php @@ -0,0 +1,38 @@ +policies = [ + 'dutyhour' => [ + '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/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 8c5438b..48e81b8 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -6,6 +6,7 @@ use App\Models\Brand; use App\Models\Company; use App\Models\Credit\Account; use App\Models\Credit\CreditLog; +use App\Models\Dutyhour; use App\Models\File; use App\Models\Invoice; use App\Models\Label; @@ -91,6 +92,7 @@ class RouteServiceProvider extends ServiceProvider Route::model('label', Label::class); Route::model('marker', Marker::class); Route::model('package', Package::class); + Route::model('dutyhour', Dutyhour::class); Route::model('company', Company::class); Route::model('invoice', Invoice::class); Route::model('file', File::class); diff --git a/database/migrations/2023_04_18_123853_create_dutyhours_table.php b/database/migrations/2023_04_18_123853_create_dutyhours_table.php new file mode 100644 index 0000000..d11d2fc --- /dev/null +++ b/database/migrations/2023_04_18_123853_create_dutyhours_table.php @@ -0,0 +1,34 @@ +id(); + $table->date('date'); + $table->string('person'); + $table->string('place'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dutyhours'); + } +} diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index e4446c6..5f9af5f 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -16,5 +16,6 @@ return [ 'packages' => 'Packages', 'invoices' => 'Invoices', 'companies' => 'Companies', + 'dutyhours' => 'Duty Hours', ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index de9519d..7af9451 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -16,5 +16,6 @@ return [ 'packages' => 'Forfaits', 'invoices' => 'Devis', 'companies' => 'Sociétés', + 'dutyhours' => 'Permanences', ] ]; diff --git a/resources/views/dutyhours/index.blade.php b/resources/views/dutyhours/index.blade.php new file mode 100644 index 0000000..4dc6f09 --- /dev/null +++ b/resources/views/dutyhours/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/nav.blade.php b/resources/views/layout/nav.blade.php index c08b854..1c26a94 100644 --- a/resources/views/layout/nav.blade.php +++ b/resources/views/layout/nav.blade.php @@ -46,6 +46,9 @@ @can('viewAny', App\Models\Package::class) {{ __('models.classes.packages') }} @endcan + @can('viewAny', App\Models\Dutyhour::class) + {{ __('models.classes.dutyhours') }} + @endcan @endif diff --git a/routes/web.php b/routes/web.php index 28e1ef5..bbe7386 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,6 +5,7 @@ use App\Http\Controllers\CompanyController; use App\Http\Controllers\Credit\AccountController; use App\Http\Controllers\Credit\CreditLogController; 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\InvoiceController; @@ -74,6 +75,7 @@ Route::middleware('auth:web')->group(function () { Route::resource('ticket', TicketController::class)->except(['destroy']); Route::resource('users', UserController::class); Route::resource('packages', PackageController::class)->except('show'); + Route::resource('dutyhours', DutyhourController::class)->except('show'); Route::resource('companies', CompanyController::class)->except('show'); Route::resource('invoices', InvoiceController::class); Route::resource('labels', LabelController::class)->except('show'); From 8678ce520bcc7b4b1d6795ed4b5fe299de8ee5ae Mon Sep 17 00:00:00 2001 From: "noah.lancien" Date: Tue, 18 Apr 2023 12:32:46 +0000 Subject: [PATCH 02/12] Added validation rules for duty hours --- app/Models/Dutyhour.php | 24 +++++++++++++++++++ ...23_04_18_123853_create_dutyhours_table.php | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/Models/Dutyhour.php b/app/Models/Dutyhour.php index 05ba786..66f6864 100644 --- a/app/Models/Dutyhour.php +++ b/app/Models/Dutyhour.php @@ -63,6 +63,22 @@ class Dutyhour extends Model 'date' => [ 'label' => trans('Date'), 'type' => CrudType::date(), + 'validate' => [ + 'date', + 'after_or_equal:today', + // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed + function ($attribute, $value, $fail) { + $q = static::query(); + if (request()->dutyhour) { + $q = $q->where('id', '!=', $this->id); + } + if ($q->where('date', $value)->exists()) { + $fail(__('La :attribute est déjà utilisée', [ + 'attribute' => $attribute + ])); + } + } + ], 'nullable' => false, 'actions' => [ CrudAction::viewAny(), @@ -74,6 +90,10 @@ class Dutyhour extends Model 'person' => [ 'label' => trans('Personne présente'), 'type' => CrudType::string(), + 'validate' => [ + 'string', + 'max:255' + ], 'nullable' => false, 'actions' => [ CrudAction::viewAny(), @@ -85,6 +105,10 @@ class Dutyhour extends Model 'place' => [ 'label' => trans('Lieu'), 'type' => CrudType::string(), + 'validate' => [ + 'string', + 'max:255' + ], 'nullable' => false, 'actions' => [ CrudAction::viewAny(), diff --git a/database/migrations/2023_04_18_123853_create_dutyhours_table.php b/database/migrations/2023_04_18_123853_create_dutyhours_table.php index d11d2fc..1d8ccb9 100644 --- a/database/migrations/2023_04_18_123853_create_dutyhours_table.php +++ b/database/migrations/2023_04_18_123853_create_dutyhours_table.php @@ -15,7 +15,7 @@ class CreateDutyhoursTable extends Migration { Schema::create('dutyhours', function (Blueprint $table) { $table->id(); - $table->date('date'); + $table->date('date')->unique(); $table->string('person'); $table->string('place'); $table->timestamps(); From fa810ad17fa8dbcb8b8387de05f551ac6ac3cd3d Mon Sep 17 00:00:00 2001 From: "noah.lancien" Date: Tue, 18 Apr 2023 12:39:40 +0000 Subject: [PATCH 03/12] Added duty hours display on homepage --- app/Http/Controllers/Controller.php | 41 ++++++++++++ app/Http/Controllers/HomeController.php | 28 +++++++- resources/views/home.blade.php | 61 +++++++++++++++++- resources/views/modules/searchBar.blade.php | 46 +++++++++++++ .../views/modules/tableColSorter.blade.php | 64 +++++++++++++++++++ 5 files changed, 237 insertions(+), 3 deletions(-) create mode 100644 resources/views/modules/searchBar.blade.php create mode 100644 resources/views/modules/tableColSorter.blade.php diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index efa4c3d..9a02c7e 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -10,6 +10,8 @@ use App\Enums\TicketStatus; use App\Models\Ticket; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\View; class Controller extends BaseController @@ -130,4 +132,43 @@ class Controller extends BaseController } return $query; } + + /** + * Sort columns with a query + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $ignore + * @return \Illuminate\Database\Eloquent\Builder + */ + protected function sortQuery(Builder $query, array $ignore = []): Builder + { + $rName = request()->route()->getName(); + $table = $query->getModel()->getTable(); + if (request()->sort_col) { + Session::put("$rName.sort_col", request()->sort_col); + Session::put("$rName.sorted", true); + } + if (request()->sort_way) { + Session::put("$rName.sort_way", request()->sort_way); + Session::put("$rName.sorted", true); + } + if (request()->rst) { + Session::remove("$rName.sorted"); + Session::remove("$rName.sort_col"); + Session::remove("$rName.sort_way"); + } + if (request()->sort_col and request()->sort_way and Schema::hasColumn($table, request()->sort_col)) { + if ( + !isset($ignore) or + (isset($ignore) and !in_array(request()->sort_col, $ignore)) + ) { + $query = $query->orderBy(\sprintf("$table.%s", request()->sort_col), request()->sort_way); + } + } elseif (Schema::hasColumn($table, 'order')) { + $query = $query->orderBy('order', 'ASC'); + Session::put("$rName.sort_col", 'order'); + Session::put("$rName.sort_way", 'asc'); + } + return $query; + } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 61e1c76..320fb0e 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -2,15 +2,39 @@ 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() + public function home(Request $request) { - return view('home'); + /** + * Get only duty hours for today or later. + * @var \Illuminate\Database\Eloquent\Builder $dutyhour + */ + $dutyhour = Dutyhour::where('date', '>', now()->modify('-1 day'))->orderBy('date', 'asc'); + + if ($request->search) { + $this->searchQuery( + $dutyhour, + $request->search, + null, + 'date', + ); + } + + $this->sortQuery($dutyhour); + $searchFields = trans('Date'); + + $dutyhourModels = $dutyhour->paginate(10); + + return view('home', compact('dutyhourModels', 'searchFields')); } } diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 2dbc80f..4e7a2a1 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -8,11 +8,70 @@
-
+ +
+
+
+
+

+ {{ __('models.classes.dutyhours') }} +

+
+
+
+
+ @include('modules.searchBar') +
+
+ {{ $dutyhourModels->withQueryString()->onEachSide(1)->links() }} +
+
+
+
+
+ + + @php + $rst = !is_null(request()->rst); + $routeName = request()->route()->getName(); + $noOrder = Session::get("$routeName.sort_col") !== 'order' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); + $noOrder = Session::get("$routeName.sort_col") !== '' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); + $cols = ['date' => __('Date'), 'person' => __('Personne présente'), 'place' => __('Lieu de la permanence')]; + @endphp + @include('modules.tableColSorter', ['cols' => $cols, 'mobileHide' => ['status']]) + + + @if($dutyhourModels->count()) + @foreach ($dutyhourModels as $dutyhourModel) + + + + + + @endforeach + @else + + + + @endif + +
{{ $dutyhourModel->date->formatLocalized('%d/%m/%Y') }}{{ $dutyhourModel->person }}{{ $dutyhourModel->place }}
+ {{ __('No results for :models', ['models' => __('models.classes.dutyhours') ])}} +
+
+
+
+
+
+ {{ $dutyhourModels->withQueryString()->onEachSide(1)->links() }} +
+
+
+
@endsection diff --git a/resources/views/modules/searchBar.blade.php b/resources/views/modules/searchBar.blade.php new file mode 100644 index 0000000..91ec119 --- /dev/null +++ b/resources/views/modules/searchBar.blade.php @@ -0,0 +1,46 @@ +@php + $iArgs = []; + if(request()->sort_col) { + $iArgs['sort_col'] = request()->sort_col; + } + + if(request()->search) { + $iArgs['search'] = request()->sort_way; + } +@endphp +
+
+
+
+ + @if(request()->sort_col) + + @endif + @if(request()->sort_way) + + @endif + @if(request()->rangefilter) + + @endif + @if(request()->group) + + @endif + + + + @push('scripts') + + @endpush +
+
+
+
diff --git a/resources/views/modules/tableColSorter.blade.php b/resources/views/modules/tableColSorter.blade.php new file mode 100644 index 0000000..b6e56ed --- /dev/null +++ b/resources/views/modules/tableColSorter.blade.php @@ -0,0 +1,64 @@ +@php +$route = request()->route(); +$routeName = $route->getName(); +$rst = !is_null(request()->rst) || !Session::has("$routeName.sorted"); +$noOrder = Session::get("$routeName.sort_col") !== 'order' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); +$noOrder = Session::get("$routeName.sort_col") !== '' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); + +View::share('noOrder', $noOrder); +$ignore = (isset($ignore) and is_array($ignore)) ? $ignore : []; +@endphp + + @foreach($cols as $col => $colname) + @php + $iArgs = ['sort_col' => $col]; + if(request()->search) { + $iArgs['search'] = request()->search; + } + @endphp + {{-- NO Sort for order column --}} + @if($col === 'order' or in_array($col, $ignore)) + @if($noOrder and !$rst and !in_array($col, $ignore)) @continue @endif + + {{ $colname }} + + @continue + @endif + + + {{ $colname }} + @if(!session("$routeName.sort_way") or session("$routeName.sort_col") !== $col or (session("$routeName.sort_way") === 'desc' and session("$routeName.sort_col") === $col)) + +  ↓  + + @endif + @if(!session("$routeName.sort_way") or session("$routeName.sort_col") !== $col or (session("$routeName.sort_way") === 'asc' and session("$routeName.sort_col") === $col)) + +  ↑  + + @endif + + + @endforeach + {{-- Buttons Col --}} + + @if($noOrder and !$rst) + + + + @else + + + + @endif + + From 3ba7a19cc4653cbf359b03cc28d978d2121aa994 Mon Sep 17 00:00:00 2001 From: "noah.lancien" Date: Tue, 18 Apr 2023 12:48:55 +0000 Subject: [PATCH 04/12] Made duty hours display more simple --- resources/views/home.blade.php | 94 ++++++++----------- resources/views/modules/searchBar.blade.php | 46 --------- .../views/modules/tableColSorter.blade.php | 64 ------------- 3 files changed, 37 insertions(+), 167 deletions(-) delete mode 100644 resources/views/modules/searchBar.blade.php delete mode 100644 resources/views/modules/tableColSorter.blade.php diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 4e7a2a1..3b84cb2 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -13,63 +13,43 @@ {{ __('Créer un ticket') }} -
-
-
-
-

- {{ __('models.classes.dutyhours') }} -

-
-
-
-
- @include('modules.searchBar') -
-
- {{ $dutyhourModels->withQueryString()->onEachSide(1)->links() }} -
-
-
-
-
- - - @php - $rst = !is_null(request()->rst); - $routeName = request()->route()->getName(); - $noOrder = Session::get("$routeName.sort_col") !== 'order' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); - $noOrder = Session::get("$routeName.sort_col") !== '' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); - $cols = ['date' => __('Date'), 'person' => __('Personne présente'), 'place' => __('Lieu de la permanence')]; - @endphp - @include('modules.tableColSorter', ['cols' => $cols, 'mobileHide' => ['status']]) - - - @if($dutyhourModels->count()) - @foreach ($dutyhourModels as $dutyhourModel) - - - - - - @endforeach - @else - - - - @endif - -
{{ $dutyhourModel->date->formatLocalized('%d/%m/%Y') }}{{ $dutyhourModel->person }}{{ $dutyhourModel->place }}
- {{ __('No results for :models', ['models' => __('models.classes.dutyhours') ])}} -
-
-
-
-
-
- {{ $dutyhourModels->withQueryString()->onEachSide(1)->links() }} -
-
+
+
+
+

+ {{ __('models.classes.dutyhours') . __(' à venir') }} +

+
+
+
+
+
+ + + + + + + + + + @if($dutyhourModels->count()) + @foreach ($dutyhourModels as $dutyhourModel) + + + + + + @endforeach + @else + + + + @endif + +
{{ __('Date') }}{{ __('Personne présente') }}{{ __('Lieu de la permanence') }}
{{ $dutyhourModel->date->formatLocalized('%d/%m/%Y') }}{{ $dutyhourModel->person }}{{ $dutyhourModel->place }}
+ {{ __('Aucune :model prévue prochainement', ['model' => Str::singular(__('models.classes.dutyhours')) ])}} +
diff --git a/resources/views/modules/searchBar.blade.php b/resources/views/modules/searchBar.blade.php deleted file mode 100644 index 91ec119..0000000 --- a/resources/views/modules/searchBar.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@php - $iArgs = []; - if(request()->sort_col) { - $iArgs['sort_col'] = request()->sort_col; - } - - if(request()->search) { - $iArgs['search'] = request()->sort_way; - } -@endphp -
-
-
-
- - @if(request()->sort_col) - - @endif - @if(request()->sort_way) - - @endif - @if(request()->rangefilter) - - @endif - @if(request()->group) - - @endif - - - - @push('scripts') - - @endpush -
-
-
-
diff --git a/resources/views/modules/tableColSorter.blade.php b/resources/views/modules/tableColSorter.blade.php deleted file mode 100644 index b6e56ed..0000000 --- a/resources/views/modules/tableColSorter.blade.php +++ /dev/null @@ -1,64 +0,0 @@ -@php -$route = request()->route(); -$routeName = $route->getName(); -$rst = !is_null(request()->rst) || !Session::has("$routeName.sorted"); -$noOrder = Session::get("$routeName.sort_col") !== 'order' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); -$noOrder = Session::get("$routeName.sort_col") !== '' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way")); - -View::share('noOrder', $noOrder); -$ignore = (isset($ignore) and is_array($ignore)) ? $ignore : []; -@endphp - - @foreach($cols as $col => $colname) - @php - $iArgs = ['sort_col' => $col]; - if(request()->search) { - $iArgs['search'] = request()->search; - } - @endphp - {{-- NO Sort for order column --}} - @if($col === 'order' or in_array($col, $ignore)) - @if($noOrder and !$rst and !in_array($col, $ignore)) @continue @endif - - {{ $colname }} - - @continue - @endif - - - {{ $colname }} - @if(!session("$routeName.sort_way") or session("$routeName.sort_col") !== $col or (session("$routeName.sort_way") === 'desc' and session("$routeName.sort_col") === $col)) - -  ↓  - - @endif - @if(!session("$routeName.sort_way") or session("$routeName.sort_col") !== $col or (session("$routeName.sort_way") === 'asc' and session("$routeName.sort_col") === $col)) - -  ↑  - - @endif - - - @endforeach - {{-- Buttons Col --}} - - @if($noOrder and !$rst) - - - - @else - - - - @endif - - From e8836e47891bcd4ca1d7d3dee83dc527f940c466 Mon Sep 17 00:00:00 2001 From: "noah.lancien" Date: Tue, 18 Apr 2023 13:57:34 +0000 Subject: [PATCH 05/12] Added information model to display info on pages --- app/Enums/InfoColors.php | 90 +++++++++++++ app/Http/Controllers/HomeController.php | 18 +-- .../Controllers/InformationController.php | 22 ++++ app/Models/Information.php | 120 ++++++++++++++++++ app/Policies/InformationPolicy.php | 38 ++++++ app/Providers/AppServiceProvider.php | 2 + app/Providers/RouteServiceProvider.php | 2 + ...04_18_150623_create_informations_table.php | 34 +++++ resources/lang/en/models.php | 1 + resources/lang/fr/models.php | 1 + resources/views/informations/index.blade.php | 112 ++++++++++++++++ resources/views/layout/app.blade.php | 9 ++ resources/views/layout/nav.blade.php | 3 + routes/web.php | 2 + 14 files changed, 438 insertions(+), 16 deletions(-) create mode 100644 app/Enums/InfoColors.php create mode 100644 app/Http/Controllers/InformationController.php create mode 100644 app/Models/Information.php create mode 100644 app/Policies/InformationPolicy.php create mode 100644 database/migrations/2023_04_18_150623_create_informations_table.php create mode 100644 resources/views/informations/index.blade.php 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 320fb0e..1a656da 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -3,17 +3,15 @@ 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) + public function home() { /** * Get only duty hours for today or later. @@ -21,20 +19,8 @@ class HomeController extends Controller */ $dutyhour = Dutyhour::where('date', '>', now()->modify('-1 day'))->orderBy('date', 'asc'); - if ($request->search) { - $this->searchQuery( - $dutyhour, - $request->search, - null, - 'date', - ); - } - - $this->sortQuery($dutyhour); - $searchFields = trans('Date'); - $dutyhourModels = $dutyhour->paginate(10); - return view('home', compact('dutyhourModels', 'searchFields')); + 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..e455f6b --- /dev/null +++ b/app/Http/Controllers/InformationController.php @@ -0,0 +1,22 @@ + 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..591d691 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; @@ -57,6 +58,7 @@ class AppServiceProvider extends ServiceProvider View::share('name', $appInfos->name); View::share('version', $appInfos->version); View::share('license', $appInfos->license); + View::share('informations', Information::all()); // * Groups View::share('markerLabels', Cache::rememberForever('markerLabels', function () { 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'); From e3a202b0c65c1ff651aaff69454e2b8631e44b13 Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Tue, 18 Apr 2023 16:27:19 +0200 Subject: [PATCH 06/12] Clean duty hours request --- app/Http/Controllers/HomeController.php | 19 ++----------------- resources/views/home.blade.php | 21 ++++++++------------- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 320fb0e..563d734 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -19,22 +19,7 @@ class HomeController extends Controller * Get only duty hours for today or later. * @var \Illuminate\Database\Eloquent\Builder $dutyhour */ - $dutyhour = Dutyhour::where('date', '>', now()->modify('-1 day'))->orderBy('date', 'asc'); - - if ($request->search) { - $this->searchQuery( - $dutyhour, - $request->search, - null, - 'date', - ); - } - - $this->sortQuery($dutyhour); - $searchFields = trans('Date'); - - $dutyhourModels = $dutyhour->paginate(10); - - return view('home', compact('dutyhourModels', 'searchFields')); + $dutyhourModels = Dutyhour::where('date', '>', now()->modify('-1 day'))->orderBy('date', 'asc')->limit(10)->get(); + return view('home', compact('dutyhourModels')); } } diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 3b84cb2..beb7ff7 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -2,11 +2,6 @@ @section('content') -@endsection +@endsection \ No newline at end of file From 1e916d970108ed77805255a20c73d6726caab453 Mon Sep 17 00:00:00 2001 From: "noah.lancien" Date: Tue, 18 Apr 2023 14:45:07 +0000 Subject: [PATCH 07/12] Move compiled files from public to public/build --- resources/views/errors/layout.blade.php | 2 +- resources/views/layout/app.blade.php | 4 +-- resources/views/layout/footer.blade.php | 2 +- .../views/vendor/mail/html/header.blade.php | 2 +- webpack.mix.js | 29 +++++++++++-------- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/resources/views/errors/layout.blade.php b/resources/views/errors/layout.blade.php index c43a0f4..01e28d4 100644 --- a/resources/views/errors/layout.blade.php +++ b/resources/views/errors/layout.blade.php @@ -150,7 +150,7 @@
- {{ config('app.name') }} + {{ config('app.name') }}
@yield('message') diff --git a/resources/views/layout/app.blade.php b/resources/views/layout/app.blade.php index 33f2d6f..8d22908 100644 --- a/resources/views/layout/app.blade.php +++ b/resources/views/layout/app.blade.php @@ -18,7 +18,7 @@ - + @crudPoliciesCSS @stack('styles') @@ -49,7 +49,7 @@ @include('layout.footer') @stack('scriptsConstants') @include('modules.scriptConstants') - + @stack('scripts') @crudPoliciesJS() @auth diff --git a/resources/views/layout/footer.blade.php b/resources/views/layout/footer.blade.php index 655fdc7..0e34c1e 100644 --- a/resources/views/layout/footer.blade.php +++ b/resources/views/layout/footer.blade.php @@ -1,6 +1,6 @@