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:
commit
8f37b29cee
14 changed files with 213 additions and 12 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
20
app/Policies/SitePolicy.php
Normal file
20
app/Policies/SitePolicy.php
Normal 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
2
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": "4f5fe189b89c5ccc99fc4c7a913a64a6",
|
||||
"content-hash": "e8c9db31822e28a9de96572bc85532bf",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -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' => [
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
],
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue