Merge branch 'issue-36' into 'develop'

Page liste de mes sites avec urls

See merge request ldc-web/projets/support-web!58
This commit is contained in:
Vincent BRIDIER 2023-08-16 10:23:50 +00:00
commit 8f37b29cee
14 changed files with 213 additions and 12 deletions

View file

@ -22,8 +22,18 @@ class SiteController extends Controller
*/
public function index(Request $request): \Illuminate\Contracts\View\View
{
/** @var \Illuminate\Database\Eloquent\Builder $siteModels */
$siteModels = Site::query();
/** @var \App\Models\User $user */
$user = \auth()->user();
if ($user->isAdmin()) {
/** @var \Illuminate\Database\Eloquent\Builder $siteModels */
$siteModels = Site::query();
} else {
/** @var \Illuminate\Database\Eloquent\Builder $siteModels */
$siteModels = Site::whereHas('users', function (\Illuminate\Database\Eloquent\Builder $query) use ($user) {
$query->where('id', $user->id);
});
}
/** @var string $search Search field */
$search = $request->search;
@ -84,8 +94,8 @@ class SiteController extends Controller
return DB::transaction(function () use ($request) {
$site = new Site();
$site->fill($request->validated());
$site->users()->attach(collect($request->validated('users'))->pluck('id'));
if ($site->saveOrFail()) {
$site->users()->attach(collect($request->validated('users'))->pluck('id'));
return redirect()
->route('bo.sites.edit', $site)
->with('success', trans(

View file

@ -28,7 +28,9 @@ class StoreSiteRequest extends FormRequest
'name' => 'required|string|min:3|max:255',
'users' => 'nullable|array',
'users.*.id' => 'required|exists:users,id',
'gitlab_project_id' => 'nullable|unique:sites,gitlab_project_id'
'gitlab_project_id' => 'nullable|unique:sites,gitlab_project_id',
'url_re7' => 'nullable|url',
'url_prod' => 'nullable|url'
];
}
@ -43,7 +45,9 @@ class StoreSiteRequest extends FormRequest
'name' => trans('Nom du site'),
'users' => trans('Utilisateurs associés au site'),
'users.*.id' => trans('Élément parmis les Utilisateurs associés au site'),
'gitlab_project_id' => trans('ID du dépôt Gitlab')
'gitlab_project_id' => trans('ID du dépôt Gitlab'),
'url_re7' => trans('Url de RECETTE'),
'url_prod' => trans('Url de prod')
];
}
}

View file

@ -2,12 +2,15 @@
namespace App\Models;
use App\Lib\Helpers\ToolboxHelper;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;
/**
* @property string $name
* @property string $url_re7
* @property string $url_prod
* @property integer $gitlab_project_id
* @property Brand $brand_id
*/
@ -22,6 +25,8 @@ class Site extends Model
*/
protected $fillable = [
'name',
'url_re7',
'url_prod',
'gitlab_project_id'
];
@ -33,6 +38,41 @@ class Site extends Model
protected $appends = [
'value'
];
// * EVENTS
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
static::creating(function (self $model) {
self::manageFields($model);
});
static::updating(function (self $model) {
self::manageFields($model);
});
}
// * METHODS
/**
* Common methods function.
*
* @param Model $model
* @return void
*/
private static function manageFields(Model $model)
{
if ($model->url_re7) {
ToolboxHelper::assertNoInternalUrls('url_re7', $model->url_re7);
}
if ($model->url_prod) {
ToolboxHelper::assertNoInternalUrls('url_prod', $model->url_prod);
}
}
// * RELATIONSHIPS

View file

@ -0,0 +1,20 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\HandlesAuthorization;
class SitePolicy
{
use HandlesAuthorization;
/**
* Determine if the user can view any sites.
*
* @return boolean
*/
public function viewAny()
{
return auth()->check();
}
}

2
composer.lock generated
View file

@ -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": "4f5fe189b89c5ccc99fc4c7a913a64a6",
"content-hash": "e8c9db31822e28a9de96572bc85532bf",
"packages": [
{
"name": "brick/math",

View file

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::table('sites', function (Blueprint $table) {
$table->string('url_re7')->nullable()->after('name');
$table->string('url_prod')->nullable()->after('url_re7');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::table('sites', function (Blueprint $table) {
$table->dropColumn(['url_re7', 'url_prod']);
});
}
};

View file

@ -69,6 +69,7 @@ return [
'picture_alt_helper' => 'Doit décrire votre image pour les moteurs de recherche et les aveugles (5 à 6 mots)',
'picture_alt_label' => 'Attribut Alt de l\'image',
'text_warning' => 'Relisez votre contenu avant de le publier (minimum :number caractères)',
'url' => 'Doit être une url valide.',
],
'pagination' => [

View file

@ -194,6 +194,8 @@ return [
'total' => 'Montant total',
'type' => 'Type',
'updated_at' => 'Mis à jour',
'url_re7' => 'Url de RECETTE',
'url_prod' => 'Url de PROD',
'username' => 'nom d\'utilisateur',
'year' => 'année',
],

View file

@ -87,6 +87,53 @@
</div>
</fieldset>
</div>
{{-- SITE URLS --}}
<div class="col-12 mb-3">
<fieldset class="row border w-100 h-100 bg-white mx-auto p-3">
<legend class="p-0">{{ __('URLs du site') }}</legend>
<div class="row w-100 mx-auto p-0">
{{-- URL_RE7 --}}
<div class="col-12 col-md-6 p-0 pe-md-3">
@include('bo.partials.inputs.varchar', [
'id' => 'siteUrlRe7',
'label' => __(':field du :model', [
'field' => Str::ucfirst(__('validation.attributes.url_re7')),
'model' => Str::singular(__('models.classes.sites')),
]),
'hasWordCounter' => true,
'name' => 'url_re7',
'required' => false,
'model' => $siteModel ?? null,
'helper' => __('crud.minicrud.url'),
'placeholder' => __(':field du :model', [
'field' => Str::ucfirst(__('validation.attributes.url_re7')),
'model' => Str::singular(__('models.classes.sites')),
]),
])
</div>
{{-- URL_PROD --}}
<div class="col-12 col-md-6 p-0 pe-md-3">
@include('bo.partials.inputs.varchar', [
'id' => 'siteUrlProd',
'label' => __(':field du :model', [
'field' => Str::ucfirst(__('validation.attributes.url_prod')),
'model' => Str::singular(__('models.classes.sites')),
]),
'hasWordCounter' => true,
'name' => 'url_prod',
'required' => false,
'model' => $siteModel ?? null,
'helper' => __('crud.minicrud.url'),
'placeholder' => __(':field du :model', [
'field' => Str::ucfirst(__('validation.attributes.url_prod')),
'model' => Str::singular(__('models.classes.sites')),
]),
])
</div>
{{-- URL_PROD --}}
</div>
</fieldset>
</div>
</div>
@push('scripts')

View file

@ -6,6 +6,7 @@
@section('content')
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center">
@include('breadcrumbs.breadcrumb-body')
@can('isAdmin')
<a href="{{ route('bo.sites.create') }}"
class="btn btn-primary float-right"
data-bs-toggle="tooltip"
@ -13,6 +14,7 @@
title="{{ __('crud.helpers.create_model', ['model' => Str::singular(__('models.classes.sites'))]) }}">
<i class="fa-solid fa-plus"></i>
</a>
@endcan
</div>
@include('bo.modules.search-bar')
<table class="table table-hover">
@ -21,9 +23,9 @@
@include('bo.modules.table-col-sorter', [
'cols' => [
'name' => Str::ucfirst(__('validation.attributes.name')),
'user_id' => Str::ucfirst(__('models.classes.users')),
'url_re7' => Str::ucfirst(__('validation.attributes.url_re7')),
'url_prod' => Str::ucfirst(__('validation.attributes.url_prod')),
],
'ignore' => ['user_id'],
])
</thead>
<tbody>
@ -31,10 +33,20 @@
<tr class="list-item border-bottom">
<td class="text-center align-middle">{{ $siteModel->name }}</td>
<td class="text-center align-middle">
@foreach ($siteModel->users as $user)
{{ $user->name }}@if (!$loop->last), @endif
@endforeach
@if ($siteModel->url_re7)
<a href="{{ $siteModel->url_re7 }}" target="_blank">{{ $siteModel->url_re7 }}</a>
@else
-
@endif
</td>
<td class="text-center align-middle">
@if ($siteModel->url_prod)
<a href="{{ $siteModel->url_prod }}" target="_blank">{{ $siteModel->url_prod }}</a>
@else
-
@endif
</td>
@can('isAdmin')
<td class="text-end align-middle">
<form action="{{ route('bo.sites.destroy', $siteModel->id) }}"
method="POST"
@ -65,6 +77,7 @@
</button>
</form>
</td>
@endcan
</tr>
@endforeach
</tbody>

View file

@ -61,6 +61,26 @@
@endforeach
</td>
</tr>
<tr class="list-item border-bottom">
<td class="text-center align-middle">{{ Str::ucfirst(__('validation.attributes.url_re7')) }}</td>
<td class="text-center align-middle">
@if ($siteModel->url_re7)
<a href="{{ $siteModel->url_re7 }}" target="_blank">{{ $siteModel->url_re7 }}</a>
@else
-
@endif
</td>
</tr>
<tr class="list-item border-bottom">
<td class="text-center align-middle">{{ Str::ucfirst(__('validation.attributes.url_prod')) }}</td>
<td class="text-center align-middle">
@if ($siteModel->url_prod)
<a href="{{ $siteModel->url_prod }}" target="_blank">{{ $siteModel->url_prod }}</a>
@else
-
@endif
</td>
</tr>
<tr class="list-item border-bottom">
<td class="text-center align-middle">{{ Str::ucfirst(__('validation.attributes.created_at')) }}</td>
<td class="text-center align-middle"><span class="badge bg-info">{{ $siteModel->created_at }}</span></td>

View file

@ -10,6 +10,9 @@
<a href="{{ route('bo.ticket.create') }}" class="btn btn-primary">
{{ __('Créer un ticket') }}
</a>
<a href="{{ route('bo.sites.index') }}" class="btn btn-primary ms-3">
{{ __('Voir mes sites') }}
</a>
</div>
</div>
<div class="row">

View file

@ -62,6 +62,11 @@
<a class="nav-link @if(Route::is('bo.credit_accounts.*'))active @endif" href="{{ route('bo.credit_accounts.index') }}">{{ __('models.classes.accounts') }}</a>
</li>
@endcan
@can('viewAny', App\Models\Site::class)
<li class="nav-item">
<a class="nav-link @if(Route::is('bo.sites.index'))active @endif" href="{{ route('bo.sites.index') }}">{{ __('models.classes.sites') }}</a>
</li>
@endcan
@endif
@can('isAdmin')
<li class="nav-item">

View file

@ -84,7 +84,7 @@ Route::middleware('admin-secure')
->name('projects.json-paginate');
// * SITES
Route::resource('sites', SiteController::class);
Route::resource('sites', SiteController::class)->except('index');
Route::get('/sites/json/paginate', [SiteController::class, 'jsonPaginate'])
->name('sites.json-paginate');
@ -129,6 +129,9 @@ Route::middleware('admin-secure')
Route::post('/users/change-password', [UserController::class, 'passwordResetSubmit'])
->name('users.passwordResetSubmit');
// * SITES
Route::resource('sites', SiteController::class)->only('index');
// * TICKETS
Route::resource('ticket', TicketController::class)->except(['destroy']);
Route::prefix('/ticket')