Commit 07d2782b authored by alissonalbuquerque's avatar alissonalbuquerque
Browse files

add correções de CRUDs de ADMIN

parent dafe5d5e
......@@ -9,7 +9,7 @@ use App\Queries\CampusQuery;
use Illuminate\Http\Request;
use App\Models\Util\MenuItemsAdmin;
use Illuminate\Log\Logger;
use Illuminate\Support\Facades\Response;
class CampusController extends Controller
{
......@@ -126,4 +126,40 @@ class CampusController extends Controller
{
return Campus::initQuery()->whereUnidadeId($unidade_id)->orderBy('name')->get();
}
/**
*
* @params Illuminate\Http\Request\Request
*/
public function actionSearch(Request $request)
{
// QueryParams
$q = $request->query('q');
$id = $request->query('id');
$campus = Campus::where([]);
if($id) {
$campus = $campus->whereId($id);
}
if($q) {
$campus = $campus->where('name', 'like', '%'.$q.'%');
}
$campus = $campus->get();
$array =
$campus->map(function($campus, $key)
{
return [
'id' => $campus->id,
'text' => $campus->name,
];
});
$array = ['results' => $array];
return Response::json($array);
}
}
......@@ -4,10 +4,9 @@ namespace App\Http\Controllers;
use App\Models\Campus;
use App\Models\Curso;
use App\Models\Unidade;
use App\Models\Util\Menu;
use App\Models\Util\MenuItemsAdmin;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Response;
class CursoController extends Controller
{
......@@ -117,7 +116,8 @@ class CursoController extends Controller
/**
* Remove the specified resource from storage.
*
* @param int $id
* @param string $q
* @param string $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
......@@ -126,4 +126,45 @@ class CursoController extends Controller
$model->delete();
return redirect()->route('curso_index')->with('success', 'Excluído com sucesso!');
}
/**
*
* @params Illuminate\Http\Request\Request
*/
public function actionSearch(Request $request)
{
// QueryParams
$q = $request->query('q');
$id = $request->query('id');
$campus_id = $request->query('campus_id');
$cursos = Curso::where([]);
if($campus_id) {
$cursos = $cursos->whereId($campus_id);
}
if($id) {
$cursos = $cursos->whereId($id);
}
if($q) {
$cursos = $cursos->where('name', 'like', '%'.$q.'%');
}
$cursos = $cursos->get();
$array =
$cursos->map(function($curso, $key)
{
return [
'id' => $curso->id,
'text' => $curso->name,
];
});
$array = ['results' => $array];
return Response::json($array);
}
}
......@@ -5,7 +5,6 @@ namespace App\Http\Controllers;
use App\Models\Unidade;
use App\Models\Util\Menu;
use App\Models\Util\MenuItemsAdmin;
use App\Queries\UnidadeQuery;
use Illuminate\Http\Request;
class UnidadeController extends Controller
......@@ -121,6 +120,6 @@ class UnidadeController extends Controller
*/
public function getAll()
{
return UnidadeQuery::all();
return Unidade::all();
}
}
......@@ -18,9 +18,12 @@ use NunoMaduro\Collision\Adapters\Phpunit\State;
class UserController extends Controller
{
public function editPerfil()
public function editPerfil($tab = null)
{
return view('user.update_perfil', ['menu' => Menu::USER]);
return view('user.update_perfil', [
'tab' => $tab,
'menu' => Menu::USER,
]);
}
public function updatePerfil(Request $request)
......@@ -42,15 +45,15 @@ class UserController extends Controller
{
$validator = User::validatorPassword($request->all());
// if($validator->fails()) {
// return redirect()->back()->withErrors($validator->errors());
// }
if($validator->fails()) {
return redirect()->route('edit_perfil', ['tab' => 'password'])->withErrors($validator->errors());
}
// $user = User::find(Auth::user()->id);
// $user->fill($request->all());
// $user->save();
$model = User::find(Auth::user()->id);
$model->password = Hash::make($request->password);
$model->save();
// return redirect()->route('edit_perfil')->with('success', 'Salvo com sucesso!');
return redirect()->route('edit_perfil', ['tab' => 'user'])->with('success', 'Senha salva com sucesso!');
}
......@@ -67,7 +70,7 @@ class UserController extends Controller
}
// Admin
public function actionCreate(Request $request)
public function actionCreate()
{
$model = new User();
......@@ -82,7 +85,7 @@ class UserController extends Controller
$validator = User::validator($request->all());
if($validator->fails()) {
return redirect()->route('user_create')->withErrors($validator);
return redirect()->route('user_create')->withErrors($validator)->withInput();
}
$model = new User();
......@@ -102,6 +105,7 @@ class UserController extends Controller
public function actionEdit(Request $request, $id)
{
$model = User::find($id);
$profiles = $model->profiles;
$status = [
......@@ -113,21 +117,39 @@ class UserController extends Controller
Session::flash('warning', 'Não existem papeis cadastrados para esse usuário!');
}
$tab_active = $request->query('tab_active') ?? 'user';
return view('users.update', [
'menu' => Menu::USERS,
'model' => $model,
'status' => $status,
'profiles' => $profiles,
'tab_active' => $tab_active
]);
}
public function actionUpdate($id, Request $request)
public function actionUpdate(Request $request, $id)
{
dd($id);
$model = User::find($id);
$validator = User::validator($request->all(), $model->id);
if($validator->fails()) {
return redirect()->route('user_edit', ['id' => $model->id])->withErrors($validator)->withInput();
}
public function actionDelete($id) {
$model->fill($request->all());
if($model->save()) {
return redirect()->route('user_index')->with('success', 'Usuário atualizado com sucesso!');
}
return redirect()->with('fail', 'Falha ao cadastrar Usuário!');
}
public function actionDelete($id)
{
dd($id);
}
public function actionImport(Request $request)
......
......@@ -13,9 +13,7 @@ class UserTypeController extends Controller
{
public function actionStore(Request $request)
{
$validator = Validator::make(
$request->all(), UserType::rules(), UserType::messages()
);
$validator = Validator::make($request->all(), UserType::rules(), UserType::messages());
if($validator->fails())
{
......@@ -28,7 +26,7 @@ class UserTypeController extends Controller
$model->save();
return redirect()
->route('user_edit', ['id' => $request->user_id])
->route('user_edit', ['id' => $request->user_id, 'tab_active' => 'paper'])
->with('success', 'Papel cadastrado com Sucesso!');
}
......@@ -39,7 +37,12 @@ class UserTypeController extends Controller
public function actionDelete($id)
{
$model = UserType::find($id);
$model->delete();
return redirect()
->route('user_edit', ['id' => $model->user_id, 'tab_active' => 'paper'])
->with('success', 'Papel removido com Sucesso!');
}
public function actionCreate($user_id)
......@@ -74,8 +77,12 @@ class UserTypeController extends Controller
public function ajaxValidation(Request $request)
{
$id = $request->id;
$user_id = $request->user_id;
$type = $request->type;
$validator = Validator::make(
$request->all(), UserType::rules(), UserType::messages()
$request->all(), UserType::rules($id, $user_id, $type), UserType::messages()
);
if($validator->passes()) {
......
......@@ -2,18 +2,21 @@
namespace App\Models;
use App\Models\Util\Status;
use App\Queries\UserQuery;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
use HasApiTokens, HasFactory, Notifiable, SoftDeletes;
protected $table = "users";
......@@ -32,16 +35,30 @@ class User extends Authenticatable
/**
* The attributes that should be cast.
* @var array<string, string>
* @var boolean $isUpdate
*/
protected $casts = [
'email_verified_at' => 'datetime'
];
public static function validator(array $attributes)
protected $dates = ['deleted_at'];
public static function validator(array $attributes, $id = null)
{
$rules = [
'name' => ['required', 'min:4'],
'email' => ['required', 'email']
'email' => ['required', 'email', Rule::unique('users')->ignore($id)],
'curso_id' => ['integer'],
'campus_id' => ['integer'],
'status' => [
Rule::requiredIf ( function() use($id)
{
return (bool) $id;
}),
Rule::in([Status::ATIVO, Status::INATIVO]),
'required_with:id',
'integer',
],
];
$messages = [
......@@ -51,7 +68,19 @@ class User extends Authenticatable
//email
'email.required' => 'O campo "E-Mail" é obrigatório.',
'email.email' => 'O campo "E-Mail" deve conter um e-mail valido.'
'email.email' => 'O campo "E-Mail" deve conter um e-mail valido.',
'email.unique' => 'O "E-Mail" informado já foi cadastrado no sistema.',
//status
'status.required' => 'O campo "Status" é obrigatório.',
'status.in' => 'Selecione uma opção da lista de "Status"!',
'status.integer' => 'O campo "Status" deve cónter um inteiro!',
//curso_id
'curso_id.integer' => 'O campo "Curso" deve cónter um inteiro!',
//campus_id
'campus_id.integer' => 'O campo "Campus" deve cónter um inteiro!',
];
try {
......@@ -64,12 +93,14 @@ class User extends Authenticatable
public static function validatorPassword(array $attributes)
{
$rules = [
'password' => ['required', 'min:8'],
'password_confirmation' => [],
'password' => ['required', 'min:8', 'max:255', 'confirmed'],
];
$messages = [
'password.required' => 'A "Senha" é obrigatória!',
'password.min' => 'A "Senha" deve contér no minímo 8 caracteres!',
'password.max' => 'A campo "Senha" deve contér no máximo 255 caracteres!',
'password.confirmed' => 'As senhas devem ser iguais!',
];
try{
......
......@@ -6,9 +6,15 @@ use App\Models\Pad;
use App\Models\Util\Status;
use App\Queries\UserTypeQuery;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
class UserType extends Model
{
use SoftDeletes;
const ADMIN = 1; // Administrador
const TEACHER = 2; // Professor
const DIRECTOR= 3; // Diretor
......@@ -19,6 +25,8 @@ class UserType extends Model
protected $fillable = ['user_id', 'pad_id', 'type', 'status', 'selected'];
protected $dates = ['deleted_at'];
public function user()
{
return $this->belongsTo(User::class);
......@@ -50,15 +58,42 @@ class UserType extends Model
return new UserTypeQuery(get_called_class());
}
public static function rules() {
public static function rules($id = null, $user_id = null, $type = null) {
return [
//add migration with deleted_at column
'user_id' => ['required', 'integer'],
'status' => ['required', 'integer', Rule::in([Status::ATIVO, Status::INATIVO])],
// 'selected' => []
'type' => [
'required',
'integer',
Rule::in(array_keys(self::listType())),
Rule::unique('user_type')->where(function($query) use($id, $user_id, $type)
{
return $query->where('user_id', '=', $user_id)->where('type', '=', $type);
})->ignore($id)
],
];
}
public static function messages() {
return [
//user_id
//type
'type.required' => 'O campo "Papel" é obrigatório!',
'type.in' => 'Selecione uma opção da lista de "Papeis"!',
'type.integer' => 'O campo "Papel" deve cónter um inteiro!',
'type.unique' => 'A opção do campo "Papel" já foi cadastrada!',
//status
'status.required' => 'O campo "Status" é obrigatório!',
'status.in' => 'Selecione uma opção da lista de "Status"!',
'status.integer' => 'O campo "Status" deve cónter um inteiro!',
//selected
];
}
......
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AlterUserTypeAddDeletedTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('user_type', function (Blueprint $table) {
$table->softDeletes()->after('updated_at');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('user_type', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
}
......@@ -17,3 +17,7 @@
<!-- Toastfy -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css">
<!-- Select2 -->
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
@php
function field_validate($field)
{
$type_form = 'create_and_update';
return sprintf("%s_%s", $type_form, $field);
}
@endphp
<div class="row">
<input type="hidden" name="user_id" id="user_id" value="{{ $user->id }}">
<input type="hidden" name="id" id="id" value="{{ $model !== null? $model->id : null }}">
<div class="mb-3 col-sm-12">
<label class="form-label" for="user_name"> Usuário </label>
......@@ -30,7 +22,7 @@
</select>
@include('components.divs.errors', [
'field' => field_validate('type')
'field' => 'type_create_and_update'
])
</div>
......@@ -48,7 +40,7 @@
</select>
@include('components.divs.errors', [
'field' => field_validate('nivel')
'field' => 'status_create_and_update'
])
</div>
......
......@@ -2,7 +2,7 @@
<h3 class="h3"> Cadastrar Papel </h3>
</div>
<form id="form-user_type" action="{{ route('user-type_store') }}" method="post">
<form id="form-user_type-create" action="{{ route('user-type_store') }}" method="post">
@csrf
@method('POST')
......@@ -27,7 +27,7 @@
@include('pad.components.scripts.ajaxValidation', [
'btn_submit_id' => 'btn_submit',
'form_id' => 'form-user_type',
'form_type' => 'create_and_update',
'form_id' => 'form-user_type-create',
'route' => route('user-type_ajax_validation'),
'form_type' => 'create_and_update',
])
\ No newline at end of file
......@@ -3,7 +3,7 @@
<h3 class="h3"> Atualizar Papel </h3>
</div>
<form id="form-user_type" action="{{ route('user-type_update', ['id' => $model->id]) }}" method="post">
<form id="form-user_type-update" action="{{ route('user-type_update', ['id' => $model->id]) }}" method="post">
@csrf
@method('POST')
......@@ -28,7 +28,7 @@
@include('pad.components.scripts.ajaxValidation', [
'btn_submit_id' => 'btn_submit',
'form_id' => 'form-user_type',
'form_type' => 'create_and_update',
'form_id' => 'form-user_type-update',
'route' => route('user-type_ajax_validation'),
'form_type' => 'create_and_update',
])
\ No newline at end of file
......@@ -16,6 +16,23 @@
@php
$user = Auth::user();
$tabUser = '';
$containerUser = '';
$tabPassword = '';
$containerPassword = '';
if($tab == null || $tab == 'user')
{
$tabUser = 'active';
$containerUser = 'show active';
} else {
$tabPassword = 'active';
$containerPassword = 'show active';
}
@endphp
@section('body')
......@@ -32,18 +49,18 @@
<div>
<ul class="nav nav-tabs">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="user-tab" data-bs-toggle="tab" data-bs-target="#user-container" type="button" role="tab" aria-controls="user-container" arial-selected="true"> Usuário </button>
<button class="nav-link {{$tabUser}}" id="user-tab" data-bs-toggle="tab" data-bs-target="#user-container" type="button" role="tab" aria-controls="user-container" arial-selected="true"> Usuário </button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link {{$tabPassword}}" id="password-tab" data-bs-toggle="tab" data-bs-target="#password-container" type="button" role="tab" aria-controls="password-container" arial-selected="false"> Senha </button>
</li>
<!-- <li class="nav-item" role="presentation">
<button class="nav-link" id="paper-tab" data-bs-toggle="tab" data-bs-target="#paper-container" type="button" role="tab" aria-controls="paper-container" arial-selected="false"> Papeis </button>
</li> -->
</ul>
</div>
<!-- Panels -->
<div id="tab-containers" class="tab-content">
<div id="user-container" class="tab-pane fade show active" role="tabpanel" aria-labelledby="user-tab">
<div id="user-container" class="tab-pane fade {{$containerUser}}" role="tabpanel" aria-labelledby="user-tab">
<form class="" method="post" action="{{ route('update_perfil') }}" >
@csrf
......@@ -82,7 +99,7 @@
</div>
<div id="paper-container" class="tab-pane fade" role="tabpanel" aria-labelledby="paper-tab">
<div id="password-container" class="tab-pane fade {{$containerPassword}}" role="tabpanel" aria-labelledby="password-tab">
<form method="post" action="{{ route('update_password') }}">
@csrf
@method('POST')
......@@ -94,17 +111,18 @@
<div class="form-group">
<label for="password"> Senha </label>
<input type="password" class="form-control" name="password" id="password" placeholder="Senha">
<small id="password_information" class="form-text text-muted"> {{-- --}} </small>
@error('password')
<span class="text-danger"> {{ $message }} </span>
@enderror
@include('components.divs.errors', [
'field' => 'password',
])
</div>
</div>
<div class="col-6">
<div class="form-group">
<label for="password_confirmation"> Confirmar Senha </label>
<input type="password_confirmation" class="form-control" name="password_confirmation" id="password_confirmation" placeholder="Senha">
<small id="password_confirmation_information" class="form-text text-muted"> {{-- --}} </small>
<input type="password" class="form-control" name="password_confirmation" id="password_confirmation" placeholder="Confirmar Senha">
@include('components.divs.errors', [
'field' => 'password_confirmation',
])
@error('password_confirmation')
<span class="text-danger"> {{ $message }} </span>
@enderror
......
@php
if($tab_active == 'user')
{
$userTabActive = 'active';
$userContainerActive = 'show active';
$paperTabActive = '';
$paperContainerActive = '';
}
if($tab_active == 'paper')
{
$userTabActive = '';
$userContainerActive = '';
$paperTabActive = 'active';
$paperContainerActive = 'show active';
}
@endphp
<!-- Tabs -->
<div>
<ul class="nav nav-tabs">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="user-tab" data-bs-toggle="tab" data-bs-target="#user-container" type="button" role="tab" aria-controls="user-container" arial-selected="true"> Usuário </button>
<button class="nav-link {{ $userTabActive }}" id="user-tab" data-bs-toggle="tab" data-bs-target="#user-container" type="button" role="tab" aria-controls="user-container" arial-selected="true"> Usuário </button>
</li>
@if( $model->exists )
<li class="nav-item" role="presentation">
<button class="nav-link" id="paper-tab" data-bs-toggle="tab" data-bs-target="#paper-container" type="button" role="tab" aria-controls="paper-container" arial-selected="false"> Papeis </button>
<button class="nav-link {{ $paperTabActive }}"" id="paper-tab" data-bs-toggle="tab" data-bs-target="#paper-container" type="button" role="tab" aria-controls="paper-container" arial-selected="false"> Papeis </button>
</li>
@endif
</ul>
......@@ -15,7 +37,7 @@
<!-- Panels -->
<div id="tab-containers" class="tab-content">
<div id="user-container" class="tab-pane fade show active" role="tabpanel" aria-labelledby="user-tab">
<div id="user-container" class="tab-pane fade {{ $userContainerActive }}" role="tabpanel" aria-labelledby="user-tab">
<div class="mt-2 px-2">
<form action="{{ $action }}" method="POST">
......@@ -43,7 +65,7 @@
<div class="mb-4 col-12">
<div class="form-group">
<label class="form-label" for="status"> Status </label>
<select class="form-select" name="status" id="status">
<select class="form-control" name="status" id="status">
@foreach($status as $value => $text)
@if($model->status == $value)
<option value="{{ $value }}" selected> {{ $text }} </option>
......@@ -52,6 +74,8 @@
@endif
@endforeach
</select>
@include('components.divs.errors', ['field' => 'status'])
</div>
</div>
@endif
......@@ -59,12 +83,8 @@
@if( $model->exists )
<div class="mb-4 col-6">
<div class="form-group">
<label class="form-label" for="curso_id"> Curso </label>
<select class="form-select" name="curso_id" id="curso_id">
<option value="" disabled selected hidden> Selecione... </option>
@foreach([] as $option)
@endforeach
<label class="form-label" for="campus_id"> Campus </label>
<select class="form-control" name="campus_id" id="campus_id">
</select>
</div>
</div>
......@@ -73,13 +93,8 @@
@if( $model->exists )
<div class="mb-4 col-6">
<div class="form-group">
<label class="form-label" for="campus_id"> Campus </label>
<select class="form-select" name="campus_id" id="campus_id">
<option value="" disabled selected hidden> Selecione... </option>
@foreach([] as $option)
@endforeach
</select>
<label class="form-label" for="curso_id"> Curso </label>
<select class="form-control" name="curso_id" id="curso_id"> </select>
</div>
</div>
@endif
......@@ -101,7 +116,7 @@
</div>
@if( $model->exists )
<div id="paper-container" class="tab-pane fade" role="tabpanel" aria-labelledby="paper-tab">
<div id="paper-container" class="tab-pane fade {{ $paperContainerActive }}" role="tabpanel" aria-labelledby="paper-tab">
<div class="text-end my-2">
<button type="button" class="btn btn-success user-type-create"> Cadastrar Papel </button>
......
......@@ -30,6 +30,7 @@
'model' => $model,
'status' => $status,
'profiles' => $profiles,
'tab_active' => $tab_active,
])
@include('components.modal', [
......@@ -53,4 +54,42 @@
'btn_class' => 'btn-edit_user_type',
])
<script text="type/javascript">
$('#campus_id').select2(
{
placeholder: "Selecione um Campus",
allowClear: true,
ajax: {
url: '{{ route("campus_search") }}',
dataType: 'json'
}
});
$('#curso_id').select2(
{
placeholder: "Selecione um Curso",
allowClear: true,
ajax: {
url: '{{ route("curso_search") }}',
dataType: 'json',
data: function(params) {
return {
q: params.terms,
campus_id: $('#campus_id').val(),
}
},
},
});
$('#status').select2(
{
placeholder: "Selecione um Status",
allowClear: true,
hideSearch: true,
minimumResultsForSearch: -1
});
</script>
@endsection
\ No newline at end of file
......@@ -49,6 +49,7 @@ Route::prefix('/campus')->group(function () {
Route::get('/edit/{id}', [CampusController::class, 'edit'])->name('campus_edit');
Route::post('/update/{id}', [CampusController::class, 'update'])->name('campus_update');
Route::delete('/delete/{id}', [CampusController::class, 'destroy'])->name('campus_delete');
Route::get('/search', [CampusController::class, 'actionSearch'])->name('campus_search');
});
Route::prefix('/curso')->group(function () {
......@@ -58,6 +59,7 @@ Route::prefix('/curso')->group(function () {
Route::get('/edit/{id}', [CursoController::class, 'edit'])->name('curso_edit');
Route::post('/update/{id}', [CursoController::class, 'update'])->name('curso_update');
Route::delete('/delete/{id}', [CursoController::class, 'destroy'])->name('curso_delete');
Route::get('/search', [CursoController::class, 'actionSearch'])->name('curso_search');
});
Route::prefix('/unidade')->group(function () {
......@@ -125,7 +127,7 @@ Route::prefix('/avaliador')->group(function () {
});
Route::prefix('/user')->group(function () {
Route::get('/edit/perfil', [UserController::class, 'editPerfil'])->name('edit_perfil');
Route::get('/edit/perfil/{tab?}', [UserController::class, 'editPerfil'])->name('edit_perfil');
Route::post('/update/perfil', [UserController::class, 'updatePerfil'])->name('update_perfil');
Route::post('/update/password', [UserController::class, 'updatePassword'])->name('update_password');
});
......@@ -135,7 +137,7 @@ Route::prefix('/users')->group(function() {
Route::get('/create', [UserController::class, 'actionCreate'])->name('user_create');
Route::post('/store', [UserController::class, 'actionStore'])->name('user_store');
Route::get('/edit/{id}', [UserController::class, 'actionEdit'])->name('user_edit');
Route::get('/update/{id}', [UserController::class, 'actionUpdate'])->name('user_update');
Route::post('/update/{id}', [UserController::class, 'actionUpdate'])->name('user_update');
Route::delete('/delete/{id}', [UserController::class, 'actionDelete'])->name('user_delete');
Route::post('/import', [UserController::class, 'actionImport'])->name('user_import');
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment