diff --git a/app/Enums/ApiError.php b/app/Enums/ApiError.php index 4b822d7..f381e49 100644 --- a/app/Enums/ApiError.php +++ b/app/Enums/ApiError.php @@ -95,9 +95,10 @@ class ApiError extends BaseEnumRoutable 'customerExists' => 'L\'utilisateur est déjà enregistré sur ce site', 'customerNotActivated' => 'Le compte n\'est pas activé', 'customerAlreadyActive' => 'Le compte est déjà activé', - 'singleOptinCustomerExists' => 'Le signle optin ne peut être ajouté car un compte existe.', - 'authFailed' => 'Echec de l\'authentification', + 'singleOptinCustomerExists' => 'Le single optin ne peut être ajouté car un compte existe.', + 'authFailed' => 'Echec de l\'authentification du compte', 'needAuth' => 'Vous devez être authentifié', + 'apiAuthFailed' => 'Echec de l\'authentification client à l\'Api LDC-CRM pour ce service', 'methodNotAllowed' => 'This method is not allowed for this request', 'wrongTimeStamp' => 'Your request is malformed, please check timestamp header and parameter', 'missingParameter' => 'The request is missing some parameters', diff --git a/app/Http/Controllers/AnswerController.php b/app/Http/Controllers/AnswerController.php new file mode 100644 index 0000000..976befe --- /dev/null +++ b/app/Http/Controllers/AnswerController.php @@ -0,0 +1,42 @@ +question; + if ($parent) { + $query->whereHas('question', function ($q) use ($parent) { + return $q->whereId($parent->id); + }); + } + return $query; + } + + public function index(CrudIndexRequest $request) + { + /** @var \Illuminate\View\View */ + $view = $this->crudIndex($request); + if ($request->ajax()) { + return $view; + } + return view('answer.index', $view->getData()); + } +} diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 7bbf48e..a005c0f 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -9,6 +9,7 @@ use App\Models\Customer; use App\Models\CustomerInfo; use App\Models\CustomerLogin; use App\Models\SingleOptin; +use Illuminate\Database\Query\JoinClause; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Schema; @@ -21,15 +22,25 @@ class CustomerController extends Controller { public function index(Request $request) { - $modelTable = (new Customer())->getTable(); - $modelClass = Customer::class; + $modelTable = (new CustomerInfo())->getTable(); + $modelClass = CustomerInfo::class; $brands = Brand::select('id', 'name')->get(); $columns = ['lastname', 'firstname', 'opt_in']; + // Jointure pour pouvoir trier les colonnes /** @var \Illuminate\Database\Eloquent\Builder */ - $query = CustomerInfo::with(['customer']); + $query = CustomerInfo::join('customer_logins', function (JoinClause $join) { + $join->on('customer_logins.brand_id', '=', 'customer_infos.brand_id') + ->on('customer_logins.customer_id', '=', 'customer_infos.customer_id'); + }) + ->join('customers', function (JoinClause $join) { + $join->on('customers.id', '=', 'customer_infos.customer_id'); + }) + ->join('brands', function (JoinClause $join) { + $join->on('brands.id', '=', 'customer_infos.brand_id'); + }); if (request()->brand) { - $query = $query->where('brand_id', $request->brand); + $query = $query->where('customer_infos.brand_id', $request->brand); } // Search on crud Label column @@ -37,9 +48,8 @@ class CustomerController extends Controller foreach ($columns as $column) { $query = $query->orWhere($column, 'LIKE', "%$request->search%"); } - $query = $query->orWhereHas('customer', function ($q) use ($request) { - $q->where('email', 'LIKE', "%$request->search%"); - }); + $query = $query->orWhere('customers.email', 'LIKE', "%$request->search%"); + $query = $query->orWhere('customer_logins.last_connection', 'LIKE', "%$request->search%"); } // Sort columns @@ -57,7 +67,16 @@ class CustomerController extends Controller if ( Session::has("crud.$modelTable.sort_col") and Session::has("crud.$modelTable.sort_way") and - Schema::hasColumn($modelTable, Session::get("crud.$modelTable.sort_col")) + (Schema::hasColumn($modelTable, Session::get("crud.$modelTable.sort_col")) or + in_array(Session::get("crud.$modelTable.sort_col"), [ + 'brands.name', + 'customers.email', + 'customer_infos.firstname', + 'customer_infos.lastname', + 'customer_infos.opt_in', + 'customer_logins.last_connection', + 'customer_logins.status' + ])) ) { $query = $query->orderBy( Session::get("crud.$modelTable.sort_col"), diff --git a/app/Http/Controllers/QuestionController.php b/app/Http/Controllers/QuestionController.php new file mode 100644 index 0000000..2fab894 --- /dev/null +++ b/app/Http/Controllers/QuestionController.php @@ -0,0 +1,39 @@ +crudIndex($request); + if ($request->ajax()) { + return $view; + } + return view('question.index', $view->getData()); + } + + public function indexQuery(Builder $query): Builder + { + if (request()->brand) { + $query = $query->where('brand_id', '=', request()->brand); + } + return $query; + } +} diff --git a/app/Models/Answer.php b/app/Models/Answer.php index f85e234..6ce9028 100644 --- a/app/Models/Answer.php +++ b/app/Models/Answer.php @@ -4,15 +4,45 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Str; +use Kwaadpepper\CrudPolicies\Enums\CrudAction; +use Kwaadpepper\CrudPolicies\Enums\CrudType; +use Kwaadpepper\CrudPolicies\Traits\IsCrudModel; class Answer extends Model { use HasFactory; + use IsCrudModel; + + protected $crudLabelColumn = 'answer'; + + protected $crudValueColumn = 'id'; protected $fillable = [ 'answer' ]; + public function __construct(array $attributes = []) + { + self::$editableProperties = [ + 'answer' => [ + 'label' => Str::ucfirst(trans('models.common.answer')), + 'type' => CrudType::string(), + 'validate' => [ + 'min:1', + 'max:255' + ], + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::create(), + CrudAction::update() + ] + ] + ]; + parent::__construct($attributes); + } + /** * Question BelongsTo relation * diff --git a/app/Models/CustomerInfo.php b/app/Models/CustomerInfo.php index b5ebb77..e657fc6 100644 --- a/app/Models/CustomerInfo.php +++ b/app/Models/CustomerInfo.php @@ -101,9 +101,9 @@ class CustomerInfo extends Model } /** - * CustomerLogin HasOneThrough relation + * get Login * - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + * @return \App\Models\CustomerLogin */ public function login() { diff --git a/app/Models/Question.php b/app/Models/Question.php index e69f3e0..1b6dacd 100644 --- a/app/Models/Question.php +++ b/app/Models/Question.php @@ -5,12 +5,21 @@ namespace App\Models; use App\Enums\QuestionType; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Str; +use Kwaadpepper\CrudPolicies\Enums\CrudAction; +use Kwaadpepper\CrudPolicies\Enums\CrudType; +use Kwaadpepper\CrudPolicies\Traits\IsCrudModel; use Kwaadpepper\Enum\Traits\CastsEnums; class Question extends Model { use CastsEnums; use HasFactory; + use IsCrudModel; + + protected $crudLabelColumn = 'question'; + + protected $crudValueColumn = 'id'; protected $enumCasts = [ 'type' => QuestionType::class @@ -21,6 +30,57 @@ class Question extends Model 'type' ]; + public function __construct(array $attributes = []) + { + self::$editableProperties = [ + 'question' => [ + 'label' => Str::ucfirst(trans('models.common.question')), + 'type' => CrudType::string(), + 'validate' => [ + 'min:10', + 'max:255' + ], + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::create(), + CrudAction::update() + ] + ], + 'type' => [ + 'label' => Str::ucfirst(trans('models.common.type')), + 'type' => CrudType::enum(), + 'enum' => QuestionType::class, + 'actions' => [ + CrudAction::view(), + CrudAction::create(), + CrudAction::update(), + ] + ], + 'brand_id' => [ + 'label' => Str::ucfirst(trans('models.classes.brand')), + 'type' => CrudType::belongsTo(), + 'belongsTo' => Brand::class, + 'actions' => [ + CrudAction::viewAny(), + CrudAction::view(), + CrudAction::create(), + CrudAction::update(), + ] + ], + 'answers' => [ + 'label' => Str::ucfirst(Str::plural(trans('models.classes.answers'))), + 'type' => CrudType::belongsToMany(), + 'belongsToMany' => Answer::class, + 'belongsToManyLabel' => 'answer', + 'actions' => [ + CrudAction::view() + ] + ] + ]; + parent::__construct($attributes); + } + /** * Brand BelongsTo relation * diff --git a/app/Policies/AnswerPolicy.php b/app/Policies/AnswerPolicy.php new file mode 100644 index 0000000..c38607e --- /dev/null +++ b/app/Policies/AnswerPolicy.php @@ -0,0 +1,29 @@ +policies = [ + 'answer' => [ + 'viewAny' => USR::make('everyOne'), + 'update' => USR::make('everyOne'), + 'create' => USR::make('everyOne'), + 'delete' => USR::make('everyOne') + ] + ]; + } +} diff --git a/app/Policies/QuestionPolicy.php b/app/Policies/QuestionPolicy.php new file mode 100644 index 0000000..ee18d37 --- /dev/null +++ b/app/Policies/QuestionPolicy.php @@ -0,0 +1,30 @@ +policies = [ + 'question' => [ + 'viewAny' => USR::make('everyOne'), + 'view' => USR::make('everyOne'), + 'update' => USR::make('everyOne'), + 'create' => USR::make('everyOne'), + 'delete' => USR::make('everyOne') + ] + ]; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index f57fef8..fe05944 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -2,9 +2,11 @@ namespace App\Providers; +use App\Models\Answer; use App\Models\Brand; use App\Models\Customer; use App\Models\CustomerInfo; +use App\Models\Question; use App\Models\Service; use App\Models\SingleOptin; use Illuminate\Cache\RateLimiting\Limit; @@ -42,6 +44,8 @@ class RouteServiceProvider extends ServiceProvider Route::model('brand', Brand::class); Route::model('service', Service::class); Route::model('single_optin', SingleOptin::class); + Route::model('question', Question::class); + Route::model('answer', Answer::class); Route::bind('customer', function ($value) { if (\ctype_digit($value)) { diff --git a/config/app.php b/config/app.php index 6fd73b5..ea1878b 100644 --- a/config/app.php +++ b/config/app.php @@ -231,6 +231,7 @@ return [ 'CustomerExportType' => App\Enums\CustomerExportType::class, 'Brand' => App\Models\Brand::class, 'Customer' => App\Models\Customer::class, + 'Answer' => App\Models\Answer::class, ], ]; diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index d469201..ff61fae 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -6,6 +6,8 @@ return [ 'brands' => 'Brands', 'brand' => 'Brand', 'customers' => 'Customers', + 'questions' => 'Questions', + 'answers' => 'Answers', 'singleoptins' => 'Single Opt-ins' ], 'common' => [ @@ -17,6 +19,9 @@ return [ 'published' => 'Published', 'group' => 'Group', 'default' => 'Default', - 'optinDate' => 'Date opt-in' + 'optinDate' => 'Date opt-in', + 'question' => 'Question', + 'answer' => 'Answer', + 'type' => 'Type' ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index f6c6b42..1c38697 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -5,6 +5,8 @@ return [ 'services' => 'Services', 'brands' => 'Marques', 'brand' => 'Marque', + 'questions' => 'Questions', + 'answers' => 'Réponses', 'customers' => 'Clients', 'singleoptins' => 'Opt-ins uniques' ], @@ -17,6 +19,9 @@ return [ 'published' => 'Publié', 'group' => 'Groupe', 'default' => 'Par défaut', - 'optinDate' => 'Date opt-in' + 'optinDate' => 'Date opt-in', + 'question' => 'Question', + 'type' => 'Type', + 'answer' => 'Réponse' ] ]; diff --git a/resources/views/answer/index.blade.php b/resources/views/answer/index.blade.php new file mode 100644 index 0000000..e7d898f --- /dev/null +++ b/resources/views/answer/index.blade.php @@ -0,0 +1,119 @@ +@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') }} + +
+
+
+
+
+

{{ request()->question->question }}

+
+ + + @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::belongsToMany() and $prop['belongsToMany'] === \App\Models\Project::class) + + @break + @case(CrudType::password()) + {{-- Ignore --}} + @break + @default + + @endswitch + @endif + @endforeach + + {{-- MODEL ACTIONS --}} + + + @endforeach + @else + + + + @endif + +
+ @foreach($model->{$fieldName} as $pSite) + {{ $pSite->{$prop['belongsToManyLabel']} }} + @endforeach + @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 +
+
+ {{ __('crud-policies::crud.nothingtoshow') }} +
+ {{ $models->links() }} +
+
+
{{ $models->links() }}
+
+
+@include('crud-policies::crud.modules.scriptConstants') +@endsection diff --git a/resources/views/customer/index-tableHeaders.blade.php b/resources/views/customer/index-tableHeaders.blade.php index 2286d8b..cfee811 100644 --- a/resources/views/customer/index-tableHeaders.blade.php +++ b/resources/views/customer/index-tableHeaders.blade.php @@ -1,8 +1,15 @@ + @php $colname = 'customers.email' @endphp {{ __('Email')}} + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'desc' and session("crud.$modelTable.sort_col") === $colname)) +  ↓  + @endif + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'asc' and session("crud.$modelTable.sort_col") === $colname)) +  ↑  + @endif - @php $colname = 'lastname' @endphp + @php $colname = 'customer_infos.lastname' @endphp {{ __('Nom')}} @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'desc' and session("crud.$modelTable.sort_col") === $colname))  ↓  @@ -12,7 +19,7 @@ @endif - @php $colname = 'firstname' @endphp + @php $colname = 'customer_infos.firstname' @endphp {{ __('Prénom')}} @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'desc' and session("crud.$modelTable.sort_col") === $colname))  ↓  @@ -22,7 +29,7 @@ @endif - @php $colname = 'opt_in' @endphp + @php $colname = 'customer_infos.opt_in' @endphp {{ __('Opt-In')}} @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'desc' and session("crud.$modelTable.sort_col") === $colname))  ↓  @@ -32,10 +39,34 @@ @endif + @php $colname = 'brands.name' @endphp {{ __('Marque')}} + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'desc' and session("crud.$modelTable.sort_col") === $colname)) +  ↓  + @endif + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'asc' and session("crud.$modelTable.sort_col") === $colname)) +  ↑  + @endif + @php $colname = 'customer_logins.status' @endphp {{ __('Activé ?')}} + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'desc' and session("crud.$modelTable.sort_col") === $colname)) +  ↓  + @endif + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'asc' and session("crud.$modelTable.sort_col") === $colname)) +  ↑  + @endif + + + @php $colname = 'customer_logins.last_connection' @endphp + {{ __('Dernière connexion')}} + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'desc' and session("crud.$modelTable.sort_col") === $colname)) +  ↓  + @endif + @if(!session("crud.$modelTable.sort_way") or session("crud.$modelTable.sort_col") !== $colname or (session("crud.$modelTable.sort_way") === 'asc' and session("crud.$modelTable.sort_col") === $colname)) +  ↑  + @endif {{ __('Voir')}} diff --git a/resources/views/customer/index.blade.php b/resources/views/customer/index.blade.php index 14926dc..0b73358 100644 --- a/resources/views/customer/index.blade.php +++ b/resources/views/customer/index.blade.php @@ -1,7 +1,7 @@ @extends('layouts.app') -@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('title', sprintf('%s - %s', Str::ucfirst(Str::plural(trans('models.classes.customers'))), __('crud-policies::crud.viewAny'))) +@section('description', sprintf('%s %s', __('crud-policies::crud.viewAny'), Str::ucfirst(Str::plural(trans('models.classes.customers'))))) @section('metaIndex', 'noindex,nofollow') @section('content') @@ -73,7 +73,10 @@ {{ $customerInfo->brand->name }} - {{ $customerInfo->login()->status ? 'Oui' :'Non' }} + {{ $customerInfo->status ? 'Oui' :'Non' }} + + + {{ $customerInfo->last_connection }} {{-- MODEL ACTIONS --}} diff --git a/resources/views/layouts/backend/sidenav.blade.php b/resources/views/layouts/backend/sidenav.blade.php index 2d9c516..306b120 100644 --- a/resources/views/layouts/backend/sidenav.blade.php +++ b/resources/views/layouts/backend/sidenav.blade.php @@ -18,7 +18,8 @@
@foreach($modelsClasses as $crudModel) - @php if($crudModel === Customer::class) continue; @endphp + @php if($crudModel === \App\Models\Answer::class) continue; @endphp + @php if($crudModel === \App\Models\Customer::class) continue; @endphp @if( auth()->user()->can('viewAny', $crudModel) or auth()->user()->can('create', $crudModel) diff --git a/resources/views/modules/crudAction.blade.php b/resources/views/modules/crudAction.blade.php new file mode 100644 index 0000000..7536740 --- /dev/null +++ b/resources/views/modules/crudAction.blade.php @@ -0,0 +1,4 @@ +@if(request()->question) +{{ Str::ucfirst(__('models.common.question')) }} +{{ Str::ucfirst(__('models.classes.answers')) }} +@endif diff --git a/resources/views/modules/flashMessage.blade.php b/resources/views/modules/flashMessage.blade.php new file mode 100644 index 0000000..919668a --- /dev/null +++ b/resources/views/modules/flashMessage.blade.php @@ -0,0 +1,44 @@ +@if ($message = Session::get('success')) +
+ + {!! nl2br(e($message)) !!} +
+@endif + + +@if ($message = Session::get('error')) +
+ + {!! nl2br(e($message)) !!} +
+@endif + + +@if ($message = Session::get('warning')) +
+ + {!! nl2br(e($message)) !!} +
+@endif + + +@if ($message = Session::get('info')) +
+ + {!! nl2br(e($message)) !!} +
+@endif + + +@if ($errors->any()) +
+ + @if ($errors->any()) + + @endif +
+@endif diff --git a/resources/views/question/index.blade.php b/resources/views/question/index.blade.php new file mode 100644 index 0000000..b37c792 --- /dev/null +++ b/resources/views/question/index.blade.php @@ -0,0 +1,126 @@ +@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()]) +
+
+
+
+
+
+
+ + + + + + + @if(request()->brand) + + @endif + {{ __('crud-policies::crud.reset') }} + +
+
+
+
+ {{ $models->appends(Request::except('rst'))->links() }} + + + @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::belongsToMany() and $prop['belongsToMany'] === \App\Models\Project::class) + + @break + @case(CrudType::password()) + {{-- Ignore --}} + @break + @default + + @endswitch + @endif + @endforeach + + {{-- MODEL ACTIONS --}} + + + @endforeach + @else + + + + @endif + +
+ @foreach($model->{$fieldName} as $pSite) + {{ $pSite->{$prop['belongsToManyLabel']} }} + @endforeach + @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\Answer::class) + {{ Str::ucfirst(__('models.classes.answers')) }} + @endcan +
+
+ {{ __('crud-policies::crud.nothingtoshow') }} +
+ {{ $models->links() }} +
+
+@include('crud-policies::crud.modules.scriptConstants') +@endsection diff --git a/resources/views/vendor/crud-policies/crud/modules/actionbar/bar.blade.php b/resources/views/vendor/crud-policies/crud/modules/actionbar/bar.blade.php new file mode 100644 index 0000000..131ec85 --- /dev/null +++ b/resources/views/vendor/crud-policies/crud/modules/actionbar/bar.blade.php @@ -0,0 +1,21 @@ +
+ @switch($action) + @case(CrudAction::viewAny()) + @include('modules.crudAction') + @include('crud-policies::crud.modules.actionbar.create') + @break + @case(CrudAction::view()) + @include('modules.crudAction') + @include('crud-policies::crud.modules.actionbar.update') + @include('crud-policies::crud.modules.actionbar.delete') + @break + @case(CrudAction::create()) + @include('modules.crudAction') + @break + @case(CrudAction::update()) + @include('modules.crudAction') + @include('crud-policies::crud.modules.actionbar.view') + @include('crud-policies::crud.modules.actionbar.delete') + @break + @endswitch +
diff --git a/resources/views/vendor/crud-policies/crud/modules/actionbar/create.blade.php b/resources/views/vendor/crud-policies/crud/modules/actionbar/create.blade.php new file mode 100644 index 0000000..3cc5251 --- /dev/null +++ b/resources/views/vendor/crud-policies/crud/modules/actionbar/create.blade.php @@ -0,0 +1,3 @@ +@can('create', $modelClass) +{{ __('crud-policies::crud.create') }} +@endcan diff --git a/resources/views/vendor/crud-policies/crud/modules/actionbar/delete.blade.php b/resources/views/vendor/crud-policies/crud/modules/actionbar/delete.blade.php new file mode 100644 index 0000000..dc1fdcc --- /dev/null +++ b/resources/views/vendor/crud-policies/crud/modules/actionbar/delete.blade.php @@ -0,0 +1,7 @@ +@can('delete', $model) +
+ @csrf + @method('DELETE') + +
+@endcan diff --git a/resources/views/vendor/crud-policies/crud/modules/actionbar/update.blade.php b/resources/views/vendor/crud-policies/crud/modules/actionbar/update.blade.php new file mode 100644 index 0000000..9e2008f --- /dev/null +++ b/resources/views/vendor/crud-policies/crud/modules/actionbar/update.blade.php @@ -0,0 +1,3 @@ +@can('update', $model) +{{ __('crud-policies::crud.update') }} +@endcan diff --git a/resources/views/vendor/crud-policies/crud/modules/actionbar/view.blade.php b/resources/views/vendor/crud-policies/crud/modules/actionbar/view.blade.php new file mode 100644 index 0000000..2419cd7 --- /dev/null +++ b/resources/views/vendor/crud-policies/crud/modules/actionbar/view.blade.php @@ -0,0 +1,3 @@ +@can('view', $model) +{{ __('crud-policies::crud.view') }} +@endcan diff --git a/routes/web.php b/routes/web.php index 8fb6add..53b3760 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,8 +1,10 @@ group(function () { // Single optins Route::resource('single_optins', SingleOptinController::class); Route::post('/single_optins/{id}/delete', [SingleOptinController::class, 'delete'])->name('single-optins-delete'); + + // Questions + Route::resource('questions', QuestionController::class); + Route::resource('questions.answers', AnswerController::class); + + // Answers + // Route::resource('answers', AnswerController::class); });