Update of login system based on front-end checks, token system and change in database structure, so that the company is not a User but an entity to associate several users +
This commit is contained in:
parent
0ac269c5d7
commit
cd02d1c258
|
|
@ -3,6 +3,7 @@
|
|||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\AmbitsEquipment;
|
||||
use App\Models\AssociationCompanyUser;
|
||||
use App\Models\Equipment;
|
||||
use App\Models\EquipmentAssociationAmbit;
|
||||
use App\Models\EquipmentWorkHistory;
|
||||
|
|
@ -396,8 +397,12 @@ public function getDataProjects(Request $request)
|
|||
public function receiveProjectsClient()
|
||||
{
|
||||
$client = Auth::user()->user_id;
|
||||
// DD($client);
|
||||
$recebeCompanyID = AssociationCompanyUser::where('user_id',$client)->first();
|
||||
|
||||
$recevePlantClient = Plant::where('user_id', $client)->get();
|
||||
|
||||
|
||||
$recevePlantClient = Plant::where('company_id', $recebeCompanyID->company_id)->get();
|
||||
|
||||
// Extrai os plant_id da coleção $recevePlantClient
|
||||
$plantsIds = $recevePlantClient->pluck('plant_id');
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\AssociationCompanyUser;
|
||||
use App\Models\Company;
|
||||
use App\Models\EquipmentWorkHistory;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
|
@ -150,7 +152,7 @@ public function deletePendingEquipments(Request $request)
|
|||
$pendingEquipmentIds = $request->input('pendingEquipmentIds', []);
|
||||
|
||||
// Verifica se o array não está vazio
|
||||
if (!empty ($pendingEquipmentIds)) {
|
||||
if (!empty($pendingEquipmentIds)) {
|
||||
// Deleta todos os registros de PendingEquipment que correspondam aos IDs
|
||||
PendingEquipment::whereIn('pending_equipment_id', $pendingEquipmentIds)->delete();
|
||||
}
|
||||
|
|
@ -187,7 +189,7 @@ public function deleteFurtherTasks(Request $request)
|
|||
//Se o utilizador click mas nao associar as tarefas.
|
||||
$selectedTasks = $request->input('selectedTasks', []);
|
||||
|
||||
if (empty ($selectedTasks)) {
|
||||
if (empty($selectedTasks)) {
|
||||
return back()->with('danger', 'Não existem tarefas complementares selecionadas para exclusão.');
|
||||
}
|
||||
|
||||
|
|
@ -471,9 +473,9 @@ public function finishCreatingProject($numberProject)
|
|||
$taskId = $furtherTask->elemental_tasks_id;
|
||||
|
||||
// Verificar se a tarefa está associada a algum id_workstations
|
||||
$checkExistFurtherTaskInWs = WorkstationsAssociationTasks::whereIn('id_workstations',$workstationIds)
|
||||
->where('elemental_tasks_id',$taskId)
|
||||
->exists();
|
||||
$checkExistFurtherTaskInWs = WorkstationsAssociationTasks::whereIn('id_workstations', $workstationIds)
|
||||
->where('elemental_tasks_id', $taskId)
|
||||
->exists();
|
||||
|
||||
// Se não existe, adicionar à lista de tarefas faltantes
|
||||
if (!$checkExistFurtherTaskInWs) {
|
||||
|
|
@ -493,7 +495,7 @@ public function finishCreatingProject($numberProject)
|
|||
'workstation' => $missingWorkstations
|
||||
];
|
||||
// Verificar se todos os arrays internos estão vazios
|
||||
$isEmpty = empty ($allMissingTasks['elemental']) && empty ($allMissingTasks['further']) && empty ($allMissingTasks['workstation']);
|
||||
$isEmpty = empty($allMissingTasks['elemental']) && empty($allMissingTasks['further']) && empty($allMissingTasks['workstation']);
|
||||
|
||||
if (!$isEmpty) {
|
||||
return redirect()->back()->with('errors', $allMissingTasks);
|
||||
|
|
@ -699,11 +701,11 @@ public function createWorkStations(Request $request)
|
|||
->with('listWorkstations', $listWorkstations);
|
||||
}
|
||||
|
||||
|
||||
// Funcao apenas para retornar os dados necessarios para a view criar uma Obra.
|
||||
public function createProjectForStep1()
|
||||
{
|
||||
$companies = User::where('type_users', 3)->get();
|
||||
// $companies = User::where('type_users', 3)->get();
|
||||
$companies = Company::all();
|
||||
// Apos terminar não vai ficar step 1
|
||||
return view('projectsClients/createProject', ['step' => 1], ['companies' => $companies]);
|
||||
}
|
||||
|
|
@ -857,7 +859,7 @@ public function processStep1(Request $request)
|
|||
|
||||
$newInstallation->plant_name = $request->input('new_company_name');
|
||||
$newInstallation->plant_address = $request->input('new_company_address');
|
||||
$newInstallation->user_id = $request->input('user_id');
|
||||
$newInstallation->company_id = $request->input('company_select');
|
||||
|
||||
$newInstallation->save();
|
||||
|
||||
|
|
@ -891,7 +893,7 @@ public function processStep1(Request $request)
|
|||
|
||||
$project->save();
|
||||
|
||||
return redirect()->route('articulated_2', ['id' => $project->company_projects_id])
|
||||
return redirect()->route('articulated_2', ['projectID' => $project->company_projects_id])
|
||||
->with('success', 'Project criado com sucesso!');
|
||||
}
|
||||
|
||||
|
|
@ -990,7 +992,7 @@ public function createEquipmentManual(Request $request)
|
|||
]);
|
||||
|
||||
if ($existingEquipment) {
|
||||
return redirect()->route('articulated_2', ['id' => $request->numberProject])
|
||||
return redirect()->route('articulated_2', ['projectID' => $request->numberProject])
|
||||
->with('danger', 'Equipamento ja Existe !!')
|
||||
->with('listEquipmentsProjects', $listEquipmentsProjects);
|
||||
}
|
||||
|
|
@ -1103,7 +1105,7 @@ public function createEquipmentManual(Request $request)
|
|||
}
|
||||
|
||||
// O $request->numberProject e sempre necessario retornar para indicar a obra que se esta modificando...
|
||||
return redirect()->route('articulated_2', ['id' => $request->numberProject])
|
||||
return redirect()->route('articulated_2', ['projectID' => $request->numberProject])
|
||||
->with('success', 'Equipamento criado com sucesso')
|
||||
->with('listEquipmentsProjects', $listEquipmentsProjects);
|
||||
}
|
||||
|
|
@ -1153,7 +1155,7 @@ public function processStep2(Request $request)
|
|||
$dataLines = $data[$i];
|
||||
|
||||
// Verifica se a coluna 'fábrica' (primeiro campo) está vazia
|
||||
if (empty ($dataLines[0])) {
|
||||
if (empty($dataLines[0])) {
|
||||
// Se a coluna 'fábrica' estiver vazia, pule para a próxima linha
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1161,7 +1163,7 @@ public function processStep2(Request $request)
|
|||
|
||||
// Verifica se os 5 primeiros campos essenciais estão preenchidos
|
||||
for ($j = 0; $j < 5; $j++) {
|
||||
if (empty ($dataLines[$j])) {
|
||||
if (empty($dataLines[$j])) {
|
||||
// Adiciona o índice do campo vazio ao array $camposVazios
|
||||
$emptyFields[] = $columnRealNames[$j]; // ou simplesmente $j se não tiver o nome da coluna
|
||||
}
|
||||
|
|
@ -1292,7 +1294,7 @@ public function processStep2(Request $request)
|
|||
|
||||
} elseif ($chooseAction == 'createEquipments') {
|
||||
|
||||
if (!empty ($emptyFields)) {
|
||||
if (!empty($emptyFields)) {
|
||||
// Se houver campos vazios, adicione a linha e os campos vazios às linhas ignoradas
|
||||
$ignoredLines[] = [
|
||||
'line' => $i + 1,
|
||||
|
|
@ -1433,7 +1435,7 @@ public function processStep2(Request $request)
|
|||
}
|
||||
}
|
||||
|
||||
if ($countPendingEquipments != 0 && !empty ($equipmentPendingLogs)) {
|
||||
if ($countPendingEquipments != 0 && !empty($equipmentPendingLogs)) {
|
||||
// Se houver equipamentos pendentes, redirecione com essa informação e inclua os $linhasIgnoradas se não estiverem vazios
|
||||
return redirect()->route('articulated_2', ['id' => $request->numberProject])
|
||||
->with('danger', 'Equipamentos Pendentes criados: ' . $countPendingEquipments)
|
||||
|
|
@ -1538,7 +1540,7 @@ public function workstationsAssociationTasks(Request $request)
|
|||
|
||||
|
||||
foreach ($taskTypes as $groupTasks) {
|
||||
if (isset ($request[$groupTasks])) { // Checar se esse grupo de tarefas existe no request
|
||||
if (isset($request[$groupTasks])) { // Checar se esse grupo de tarefas existe no request
|
||||
foreach ($request[$groupTasks] as $taskID => $check) {
|
||||
|
||||
//Este code pode parecer repetitivo, pois antes tinha uma tabela para os 2 tipos de tarefa. TE e TC apos atualizacao ambas ficam em uma so tabela, porem por falta de tempo ainda nao foi melhorado sua logina , MAS FUNCIONA !!!!
|
||||
|
|
@ -1607,7 +1609,7 @@ public function index()
|
|||
$groupedEquipments = [];
|
||||
|
||||
foreach ($results as $result) {
|
||||
if (!isset ($groupedEquipments[$result->tag])) {
|
||||
if (!isset($groupedEquipments[$result->tag])) {
|
||||
$groupedEquipments[$result->tag] = [];
|
||||
}
|
||||
|
||||
|
|
@ -1620,7 +1622,7 @@ public function index()
|
|||
$equipments = DB::table('equipments')->get();
|
||||
|
||||
foreach ($equipments as $equipment) {
|
||||
if (isset ($groupedEquipments[$equipment->tag])) {
|
||||
if (isset($groupedEquipments[$equipment->tag])) {
|
||||
$equipment->specific_attributes = $groupedEquipments[$equipment->tag];
|
||||
}
|
||||
}
|
||||
|
|
@ -1691,15 +1693,32 @@ public function storeProject(Request $request)
|
|||
// Agora, você pode usar $company_id ao criar o projeto
|
||||
}
|
||||
|
||||
// public function getByUserNif(Request $request)
|
||||
// {
|
||||
|
||||
// $user_id = $request->input('user_id'); //Check
|
||||
// $installations = Plant::where('user_id', $user_id)->get();
|
||||
|
||||
// $associationUserCompany = AssociationCompanyUser::where('association_company_user_id',$user_id)->get();
|
||||
|
||||
// return response()->json($installations);
|
||||
// }
|
||||
|
||||
public function getByUserNif(Request $request)
|
||||
{
|
||||
$companyId = $request->input('company_id'); // Considerando que este ID é na verdade o ID da empresa
|
||||
|
||||
// dd(Plant::where('user_id', $request->input('user_id'))->get());
|
||||
// Busca as instalações associadas à empresa
|
||||
// $installations = Plant::where('company_id', $companyId)->get();
|
||||
|
||||
$user_id = $request->input('user_id'); //Check
|
||||
$installations = Plant::where('user_id', $user_id)->get();
|
||||
// Busca os usuários associados à empresa
|
||||
$userIds = AssociationCompanyUser::where('company_id', $companyId)->pluck('user_id');
|
||||
$users = User::whereIn('user_id', $userIds)->get();
|
||||
|
||||
return response()->json($installations);
|
||||
return response()->json([
|
||||
// 'installations' => $installations,
|
||||
'users' => $users
|
||||
]);
|
||||
}
|
||||
|
||||
public function getAmbits($equipmentType)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\AssociationCompanyUser;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Actions\Fortify\CreateNewUser;
|
||||
|
|
@ -25,8 +26,10 @@ class CustomRegistrationController extends Controller
|
|||
{
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
// dd($request);
|
||||
$user = app(CreateNewUser::class)->create($request->all());
|
||||
|
||||
|
||||
$pendingUser = PendingUser::where('pending_user_email', $user->email)->first();
|
||||
if ($pendingUser) {
|
||||
$pendingUser->delete();
|
||||
|
|
@ -36,9 +39,16 @@ public function store(Request $request): RedirectResponse
|
|||
$user->sendEmailVerificationNotification();
|
||||
}
|
||||
|
||||
if($request->type_users == 3 && $request->company){
|
||||
$associationUserCompany = new AssociationCompanyUser;
|
||||
$associationUserCompany->company_id = $request->company;
|
||||
$associationUserCompany->user_id = $user->user_id;
|
||||
$associationUserCompany->save();
|
||||
}
|
||||
|
||||
return $request->wantsJson()
|
||||
? new JsonResponse([], 201)
|
||||
: Redirect::to('/CreateUsers')->with('success', 'Utilizador criado com sucesso, aguarda confirmacao por Email!!');
|
||||
: Redirect::to('/CreateUsers')->with('status', 'Utilizador criado com sucesso !');
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,21 +2,62 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\FormAccessToken;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Str;
|
||||
use Carbon\Carbon;
|
||||
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class FormController extends Controller
|
||||
{
|
||||
public function createUserForm(Request $request)
|
||||
{
|
||||
$token = $request->query('token');
|
||||
$tokenRecord = FormAccessToken::where('token', $token)->first();
|
||||
|
||||
if (!$tokenRecord || $tokenRecord->expires_at <= now()) {
|
||||
if ($tokenRecord) {
|
||||
$email = $tokenRecord->email;
|
||||
$tokenRecord->delete(); // Apaga o registro do token expirado
|
||||
// Reenviar o email
|
||||
$this->gerarEnviarEmail($email);
|
||||
|
||||
return redirect('/login')->with('success', 'O token anterior expirou, consequentemente,um novo link foi remetido para o seu email.');
|
||||
} else {
|
||||
return redirect('/login')->with('danger', 'O token é inválido.');
|
||||
}
|
||||
} else {
|
||||
// Token é válido e ainda não expirou
|
||||
return view('email/FormAdmin', compact('tokenRecord'));
|
||||
}
|
||||
}
|
||||
|
||||
public function enviarEmail(Request $request)
|
||||
{
|
||||
$email = $request->input('email');
|
||||
|
||||
Mail::send('email.email', [], function ($message) use ($email) {
|
||||
$message->to($email);
|
||||
$message->subject('Formulário "Ispt4.0"');
|
||||
});
|
||||
$this->gerarEnviarEmail($email);
|
||||
|
||||
return back()->with('status', 'Email enviado com sucesso!');
|
||||
}
|
||||
|
||||
protected function gerarEnviarEmail($email)
|
||||
{
|
||||
// Gerar um token único
|
||||
$token = Str::random(60);
|
||||
// Definir o tempo de expiração do token (ex: 1 hora a partir de agora)
|
||||
$expiresAt = Carbon::now()->addHour();
|
||||
// Criar registro na tabela form_access_tokens
|
||||
FormAccessToken::create([
|
||||
'token' => $token,
|
||||
'email' => $email,
|
||||
'expires_at' => $expiresAt,
|
||||
]);
|
||||
|
||||
// Enviar email
|
||||
Mail::send('email.email', ['token' => $token], function ($message) use ($email) {
|
||||
$message->to($email);
|
||||
$message->subject('Formulário "Ispt4.0"');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Company;
|
||||
use App\Models\CompanyProject;
|
||||
use App\Models\FormAccessToken;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
|
@ -17,6 +20,74 @@
|
|||
|
||||
class Pending_UserController extends Controller
|
||||
{
|
||||
|
||||
public function validateForm(Request $request)
|
||||
{
|
||||
$value = $request->get('value');
|
||||
$type = $request->get('type');
|
||||
|
||||
|
||||
// Inicializa os resultados como null para indicar que não foram verificados
|
||||
$resultEmail = null;
|
||||
$resultNif = null;
|
||||
$resultPhone = null;
|
||||
|
||||
|
||||
if ($type === 'email') {
|
||||
$columnEmail = ['pending_user_email', 'email'];
|
||||
|
||||
$existsInPendingUser = PendingUser::where($columnEmail[0], $value)->exists();
|
||||
$existsInUser = User::where($columnEmail[1], $value)->exists();
|
||||
|
||||
if ($existsInPendingUser && $existsInUser) {
|
||||
$resultEmail = 3;
|
||||
} elseif ($existsInPendingUser) {
|
||||
$resultEmail = 2;
|
||||
} elseif ($existsInUser) {
|
||||
$resultEmail = 1;
|
||||
} else {
|
||||
$resultEmail = 0;
|
||||
}
|
||||
} elseif ($type === 'nif') {
|
||||
$columnNif = ['pending_user_nif', 'user_nif'];
|
||||
|
||||
$existsInPendingUser = PendingUser::where($columnNif[0], $value)->exists();
|
||||
$existsInUser = User::where($columnNif[1], $value)->exists();
|
||||
|
||||
if ($existsInPendingUser && $existsInUser) {
|
||||
$resultNif = 3;
|
||||
} elseif ($existsInPendingUser) {
|
||||
$resultNif = 2;
|
||||
} elseif ($existsInUser) {
|
||||
$resultNif = 1;
|
||||
} else {
|
||||
$resultNif = 0;
|
||||
}
|
||||
} elseif ($type === 'phone') {
|
||||
$resultPhone = ['pending_user_phone', 'user_phone'];
|
||||
|
||||
$existsInPendingUser = PendingUser::where($resultPhone[0], $value)->exists();
|
||||
$existsInUser = User::where($resultPhone[1], $value)->exists();
|
||||
|
||||
if ($existsInPendingUser && $existsInUser) {
|
||||
$resultPhone = 3;
|
||||
} elseif ($existsInPendingUser) {
|
||||
$resultPhone = 2;
|
||||
} elseif ($existsInUser) {
|
||||
$resultPhone = 1;
|
||||
} else {
|
||||
$resultPhone = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'result_email' => $resultEmail,
|
||||
'result_nif' => $resultNif,
|
||||
'result_phone' => $resultPhone
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
public function ListPendingUsers()
|
||||
{
|
||||
$pend_users = PendingUser::all();
|
||||
|
|
@ -27,13 +98,15 @@ public function ShowFormUser($id)
|
|||
{
|
||||
$pend_user = PendingUser::findOrFail($id);
|
||||
$types = TypeUser::all();
|
||||
return view('Admin.CrudUsers.createUser', compact('pend_user', 'types'));
|
||||
$allCompanies = Company::all();
|
||||
|
||||
return view('Admin.CrudUsers.createUser', compact('pend_user', 'types','allCompanies'));
|
||||
}
|
||||
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
|
||||
// dd($request);
|
||||
$request->validate([
|
||||
'name' => 'required',
|
||||
'lastName' => 'required',
|
||||
|
|
@ -43,21 +116,6 @@ public function store(Request $request)
|
|||
'pending_password' => 'required|min:8|confirmed',
|
||||
]);
|
||||
|
||||
// $validator = Validator::make($request->all(), [
|
||||
// 'name' => 'required',
|
||||
// 'lastName' => 'required',
|
||||
// 'pending_email' => 'required',
|
||||
// 'pending_phone' => 'required',
|
||||
// 'pending_nif' => 'required',
|
||||
// 'pending_password' => 'required',
|
||||
// 'pending_password_confirmation' => 'required'
|
||||
// ]);
|
||||
|
||||
// dd($validator);
|
||||
// if ($validator->fails()) {
|
||||
// return redirect()->back()->withErrors($validator)->withInput();
|
||||
// }
|
||||
|
||||
$joinName = $request->get('name') . ' ' . $request->get('lastName');
|
||||
|
||||
$pendingUser = new PendingUser();
|
||||
|
|
@ -69,6 +127,13 @@ public function store(Request $request)
|
|||
|
||||
$pendingUser->save();
|
||||
|
||||
//Recebe o token criado para preencher o formulario e apaga o mesmo apos criar o User.
|
||||
$receiveToken = FormAccessToken::where('token',$request->get('receiveToken'))->first();
|
||||
|
||||
if($receiveToken){
|
||||
$receiveToken->delete();
|
||||
}
|
||||
|
||||
// Enviar email de notificação para todos os Super_Administrador
|
||||
$superAdmins = User::where('type_users', 'Super_Administrador')->get();
|
||||
$newUserNotification = new NewUserNotification();
|
||||
|
|
@ -77,7 +142,7 @@ public function store(Request $request)
|
|||
Mail::to($superAdmin->email)->send($newUserNotification);
|
||||
}
|
||||
|
||||
return redirect('/formulario')->with('success', 'O seu registo foi submetido e encontra-se pendente de aprovação. Pode encerrar a página. ');
|
||||
return redirect('login')->with('success', '"O seu registo foi submetido e está atualmente pendente de aprovação. Por favor, aguarde antes de iniciar sessão no sistema." ');
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\AssociationCompanyUser;
|
||||
use App\Models\Company;
|
||||
use App\Models\TypeUser;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
|
@ -20,9 +22,11 @@
|
|||
use Illuminate\Auth\Events\Verified;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\FormAccessToken;
|
||||
|
||||
class userController extends Controller
|
||||
{
|
||||
|
||||
public function EditProfile(Request $request)
|
||||
{
|
||||
// Verifica se um arquivo foi enviado e se o tamanho é maior que 70 KB
|
||||
|
|
@ -77,7 +81,6 @@ public function EditProfile(Request $request)
|
|||
return back()->with('success', "Perfil actualizado com sucesso!");
|
||||
}
|
||||
|
||||
|
||||
public function UserProfile($id)
|
||||
{
|
||||
$user = User::find($id);
|
||||
|
|
@ -131,12 +134,6 @@ public static function authenticateAndRedirect(Request $request)
|
|||
}
|
||||
|
||||
|
||||
public function listCompanies()
|
||||
{
|
||||
$users = User::with('userType')->where('type_users', '=', 3)->get();
|
||||
|
||||
return view('Admin.CrudUsers.listCompany', compact('users'));
|
||||
}
|
||||
|
||||
//Busca Todos os Utilizador Exeto as 'Empresas'
|
||||
public function listUsers()
|
||||
|
|
@ -168,7 +165,7 @@ public function edit($id)
|
|||
|
||||
public function update(Request $request, User $user)
|
||||
{
|
||||
//Por enquanto foi retirado o 'user_type' pois ainda não é necessario alterar o tipo de utilizador na edição.
|
||||
//Por enquanto foi retirado o 'user_type' pois ainda não é necessario alterar o tipo de utilizador na edição.
|
||||
|
||||
$request->validate([
|
||||
'name' => 'required',
|
||||
|
|
@ -190,10 +187,10 @@ public function update(Request $request, User $user)
|
|||
|
||||
$user->save();
|
||||
|
||||
if($user->type_users == 3){
|
||||
if ($user->type_users == 3) {
|
||||
return redirect('/users/listCompanies')->with('success', 'Utilizador atualizado com Sucesso!!');
|
||||
|
||||
}else
|
||||
} else
|
||||
return redirect('/users/listUsers')->with('success', 'Utilizador atualizado com Sucesso!!');
|
||||
}
|
||||
|
||||
|
|
@ -230,11 +227,51 @@ public function destroy(User $user)
|
|||
{
|
||||
$user->delete();
|
||||
|
||||
if($user->type_users == 3){
|
||||
if ($user->type_users == 3) {
|
||||
return redirect('/users/listCompanies')->with('success', 'Empresa deletado com sucesso!');
|
||||
}else {
|
||||
} else {
|
||||
return redirect('/users/listUsers')->with('success', 'Utilizador deletado com sucesso!');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public function listCompanies()
|
||||
{
|
||||
// $users = User::with('userType')->where('type_users', '=', 3)->get();
|
||||
$companiesList = Company::all();
|
||||
|
||||
// $companierList = AssociationCompanyUser
|
||||
|
||||
return view('Admin.CrudUsers.listCompany', compact('companiesList'));
|
||||
}
|
||||
|
||||
public function showCompany($id)
|
||||
{
|
||||
|
||||
$company = Company::where('company_id', $id)->first();
|
||||
|
||||
// Busca todos os registros na tabela association_company_user que correspondem à company_id
|
||||
$associationRecords = AssociationCompanyUser::where('company_id', $id)->get();
|
||||
|
||||
// Extrai todos os user_id da coleção de registros
|
||||
$userIds = $associationRecords->pluck('user_id');
|
||||
|
||||
// Busca os detalhes dos usuários na tabela users usando os IDs coletados
|
||||
$companyUsers = User::whereIn('user_id', $userIds)->get();
|
||||
|
||||
return view('Admin.CrudCompanies.showCompanyDetails', compact('company','companyUsers'));
|
||||
}
|
||||
|
||||
|
||||
public function createCompany(Request $request)
|
||||
{
|
||||
|
||||
$createCompany = new Company;
|
||||
$createCompany->company_name = $request->company_name;
|
||||
$createCompany->save();
|
||||
|
||||
return redirect('CreateUsers')->with('status', 'A Empresa ' . $createCompany->company_name . ' foi criada com êxito. Consulte na página "Empresas".');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,8 +71,11 @@ protected function getAllowedRoutesForUserType($userType)
|
|||
'users.company','users.Show','users.edit','users.destroy','users.update','users.list',
|
||||
'CreateUsers',
|
||||
'enviar.formulario',
|
||||
'projectDetails_1','workStation_3','addFurtherTasks','deleteFurtherTasks','editEquipmentTasks'
|
||||
|
||||
'projectDetails_1','workStation_3','addFurtherTasks','deleteFurtherTasks','editEquipmentTasks',
|
||||
'usersProfiles','showCompany',
|
||||
'articulated_2CreateEquipment','processStep2','deleteEquipmentInProject','changeAmbitEquipment',
|
||||
'deletePendingEquipments','CreateNewEquipmentFromPendingEquipment','removeEquipment','receiveEquipmentToAssociateTasks',
|
||||
''
|
||||
];
|
||||
|
||||
|
||||
|
|
|
|||
16
app/Models/AssociationCompanyUser.php
Normal file
16
app/Models/AssociationCompanyUser.php
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class AssociationCompanyUser extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $table = 'association_company_user';
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
}
|
||||
22
app/Models/Company.php
Normal file
22
app/Models/Company.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Company extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
public $timestamps = false;
|
||||
|
||||
protected $primaryKey = 'company_id';
|
||||
|
||||
|
||||
public function users()
|
||||
{
|
||||
return $this->belongsToMany(User::class, 'association_company_user', 'company_id', 'user_id');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
36
app/Models/FormAccessToken.php
Normal file
36
app/Models/FormAccessToken.php
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class FormAccessToken extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'form_access_tokens';
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fillable = [
|
||||
'token',
|
||||
'email',
|
||||
'expires_at',
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that should be cast.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $casts = [
|
||||
'expires_at' => 'datetime',
|
||||
];
|
||||
}
|
||||
|
|
@ -15,9 +15,9 @@ class Plant extends Model
|
|||
|
||||
public $timestamps = false;
|
||||
|
||||
public function user(){
|
||||
return $this->belongsTo(User::class, 'user_id', 'user_id');
|
||||
}
|
||||
// public function user(){
|
||||
// return $this->belongsTo(User::class, 'user_id', 'user_id');
|
||||
// }
|
||||
|
||||
public function companyProjects(){
|
||||
return $this->hasMany(CompanyProject::class, 'plant_id', 'plant_id');
|
||||
|
|
|
|||
|
|
@ -61,4 +61,8 @@ public function plants(){
|
|||
return $this->hasMany(Plant::class,'user_id', 'user_id');
|
||||
}
|
||||
|
||||
public function companies()
|
||||
{
|
||||
return $this->belongsToMany(Company::class, 'association_company_user', 'user_id', 'company_id');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
42
public/assets/dist/css/countryFlag.css
vendored
42
public/assets/dist/css/countryFlag.css
vendored
|
|
@ -1,4 +1,4 @@
|
|||
/* International Telephone Input Css */
|
||||
/* International Telephone Input Css
|
||||
.flag-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
|
|
@ -20,8 +20,42 @@ .selected-flag {
|
|||
align-items: center;
|
||||
height: 100%;
|
||||
padding: 0 6px 0 8px;
|
||||
} */
|
||||
|
||||
/* Estilização para o input de telefone */
|
||||
input#pending_phone {
|
||||
padding-left: 50px;
|
||||
/* Ajuste este valor baseando-se na largura do seu seletor de bandeiras */
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* International Telephone Input Css */
|
||||
.flag-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
padding: 1px;
|
||||
z-index: 2;
|
||||
/* Garante que o seletor de bandeiras fique acima do input */
|
||||
}
|
||||
|
||||
.flag-container:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.selected-flag {
|
||||
z-index: 3;
|
||||
/* Mais especificidade para garantir que fique acima do input */
|
||||
position: absolute;
|
||||
/* Posicionamento absoluto dentro do input */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
padding: 0 6px 0 8px;
|
||||
}
|
||||
|
||||
|
||||
.flag.bd {
|
||||
height: 12px;
|
||||
background-position: -418px 0;
|
||||
|
|
@ -138,7 +172,8 @@ .flag.va {
|
|||
width: 15px;
|
||||
}
|
||||
|
||||
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
|
||||
@media (-webkit-min-device-pixel-ratio: 2),
|
||||
(min-resolution: 192dpi) {
|
||||
.flag {
|
||||
background-size: 5652px 15px;
|
||||
}
|
||||
|
|
@ -1444,7 +1479,8 @@ .flag {
|
|||
background-position: 20px 0;
|
||||
}
|
||||
|
||||
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
|
||||
@media (-webkit-min-device-pixel-ratio: 2),
|
||||
(min-resolution: 192dpi) {
|
||||
.flag {
|
||||
background-image: url("../../../img/flagsImg/flags.png");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@
|
|||
'users_listUsers' => [
|
||||
//Navbar
|
||||
'users' => 'Utilizadores',
|
||||
'companies' => 'Clientes',
|
||||
'companies' => 'Empresas',
|
||||
'create_users' => 'Criar Utilizadores',
|
||||
|
||||
'top_view_part' => [
|
||||
|
|
|
|||
130
resources/views/Admin/CrudCompanies/showCompanyDetails.blade.php
Normal file
130
resources/views/Admin/CrudCompanies/showCompanyDetails.blade.php
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
@extends('Templates/templateAdmin')
|
||||
|
||||
@section('Main-content')
|
||||
<section class="content-header">
|
||||
<div class="container-fluid">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1>{{ $company->company_name }}</h1>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="breadcrumb float-sm-right">
|
||||
<li class="breadcrumb-item active">{{ __('messages.users_listUsers.top_view_part.administration') }}
|
||||
</li>
|
||||
{{-- Criar uma rota para Lista de Empresas --}}
|
||||
<li class="breadcrumb-item active">Lista de Empresas</li>
|
||||
<li class="breadcrumb-item active">{{ $company->company_name }}</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
|
||||
<div class="card card-primary mb">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title mb-0">Detalhes da Empresa </h3>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
|
||||
<div class="card card-success mb">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title mb-0">Utilizadores associados a Empresa </h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
<table class="table table-hover text-nowrap mt-2" id="tableReceiveCompanies">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nome</th>
|
||||
<th>Email</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@foreach ($companyUsers as $user)
|
||||
<tr>
|
||||
<td>{{ $user->user_name }}</td>
|
||||
<td>{{ $user->email }}</td>
|
||||
<td class="table-btn-group-al">
|
||||
<div class="d-flex justify-content-center dropdown">
|
||||
<button data-toggle="dropdown" aria-expanded="false"
|
||||
class="actions-btn btn btn-light circle ">
|
||||
<i class="fa fa-ellipsis-v"></i>
|
||||
</button>
|
||||
<div id="group-actions-btn-14"
|
||||
class="dropdown-menu dropdown-menu-light">
|
||||
<a href="{{ route('users.Show', ['id' => $user->user_id]) }}"
|
||||
class="dropdown-item text-primary">
|
||||
<i class="fa-solid fa-eye text-primary"></i>
|
||||
Detalhes
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
{{-- @foreach ($companiesList as $company)
|
||||
<tr>
|
||||
<td>{{ $company->company_name }}</td>
|
||||
<td class="table-btn-group-al">
|
||||
<div class="d-flex justify-content-center dropdown">
|
||||
<button data-toggle="dropdown" aria-expanded="false"
|
||||
class="actions-btn btn btn-light circle ">
|
||||
<i class="fa fa-ellipsis-v"></i>
|
||||
</button>
|
||||
<div id="group-actions-btn-14" class="dropdown-menu dropdown-menu-light">
|
||||
<a href="{{ route('showCompany', ['id' => $company->id_company]) }}"
|
||||
class="dropdown-item text-primary">
|
||||
<i class="fa-solid fa-eye text-primary"></i>
|
||||
Detalhes
|
||||
</a>
|
||||
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
|
||||
class="dropdown-item text-primary">
|
||||
<i class="fa-solid fa-edit text-primary"></i>
|
||||
Editar
|
||||
</a>
|
||||
<form action="{{ route('users.destroy', $user) }}" method="POST"
|
||||
onsubmit="return confirm('Are you sure you want to delete this user?');"
|
||||
style="display:inline;">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="dropdown-item text-danger">
|
||||
<i class="fa-solid fa-trash-alt text-danger"></i>
|
||||
Excluir
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach --}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{-- /.card-body --}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
|
||||
@section('scriptsTemplateAdmin')
|
||||
<script>
|
||||
$(function() {
|
||||
$("#tableReceiveCompanies").DataTable({
|
||||
"responsive": true,
|
||||
"lengthChange": false,
|
||||
"autoWidth": false,
|
||||
"buttons": ["copy", "csv", "excel", "pdf", "print", "colvis"]
|
||||
}).buttons().container().appendTo('#tableReceiveCompanies_wrapper .col-md-6:eq(0)');
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
|
@ -51,7 +51,7 @@
|
|||
|
||||
<div class="form-group">
|
||||
<label for="user_phone">Telemovel:</label>
|
||||
<input type="number" class="form-control" id="user_phone" name="user_phone"
|
||||
<input type="text" class="form-control" id="user_phone" name="user_phone"
|
||||
value="{{ $pend_user->pending_user_phone }}" readonly>
|
||||
|
||||
</div>
|
||||
|
|
@ -66,7 +66,7 @@
|
|||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="col-sm">
|
||||
<div class="form-group">
|
||||
<label for="user_type">Tipo de utilizador:</label>
|
||||
<select class="form-control" name="type_users" id="type_users">
|
||||
|
|
@ -76,7 +76,23 @@
|
|||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
|
||||
<div id="showCompanyList" class="col-sm" style="display:none;">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="user_type">Lista de Empresas:</label>
|
||||
<select class="form-control" name="company" id="company">
|
||||
@foreach ($allCompanies as $company)
|
||||
<option value="{{ $company->company_id }}">{{ $company->company_name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm">
|
||||
<div class="form-group">
|
||||
<label for="password">Palavra-passe:</label>
|
||||
<input type="password" class="form-control" id="password" name="password"
|
||||
|
|
@ -84,6 +100,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-light float-right">Registrar</button>
|
||||
</form>
|
||||
</div>
|
||||
|
|
@ -91,7 +108,8 @@
|
|||
{{-- ./card-light --}}
|
||||
</div>
|
||||
</section>
|
||||
{{--
|
||||
|
||||
{{--
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
|
|
@ -143,4 +161,20 @@
|
|||
</form>
|
||||
</div>
|
||||
</div> --}}
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Esconde a div quando a página é carregada
|
||||
$('#showCompanyList').hide();
|
||||
|
||||
// Função para mostrar/esconder a div baseado na seleção
|
||||
$('#type_users').change(function() {
|
||||
if ($(this).val() == '3') {
|
||||
$('#showCompanyList').show();
|
||||
} else {
|
||||
$('#showCompanyList').hide();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
|
|
|||
108
resources/views/Admin/CrudUsers/listCompany.blade copy.php
Executable file
108
resources/views/Admin/CrudUsers/listCompany.blade copy.php
Executable file
|
|
@ -0,0 +1,108 @@
|
|||
@extends('Templates/templateAdmin')
|
||||
|
||||
@section('Main-content')
|
||||
@if (session('success'))
|
||||
<div class="alert alert-success">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<section class="content-header">
|
||||
<div class="container-fluid">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1>{{__('messages.users_listUsers.top_view_part.companies')}}</h1>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="breadcrumb float-sm-right">
|
||||
<li class="breadcrumb-item active">{{__('messages.users_listUsers.top_view_part.administration')}}</li>
|
||||
<li class="breadcrumb-item active">{{__('messages.users_listUsers.top_view_part.companies')}}</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
<div class="card card-primary">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">{{__('messages.users_listUsers.top_view_part.companies_table')}}</h3>
|
||||
</div>
|
||||
{{-- ./card-header --}}
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover text-nowrap" id="tableReceiveCompanies">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Nome</th>
|
||||
<th>Email</th>
|
||||
<th>Tipo de Utilizador</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($users as $user)
|
||||
<tr>
|
||||
<td>{{ $user->user_id }}</td>
|
||||
<td>{{ $user->user_name }}</td>
|
||||
<td>{{ $user->email }}</td>
|
||||
<td>{{ $user->userType->type_user }}</td>
|
||||
<td class="table-btn-group-al">
|
||||
<div class="d-flex justify-content-center dropdown">
|
||||
<button data-toggle="dropdown" aria-expanded="false"
|
||||
class="actions-btn btn btn-light circle ">
|
||||
<i class="fa fa-ellipsis-v"></i>
|
||||
</button>
|
||||
<div id="group-actions-btn-14" class="dropdown-menu dropdown-menu-light">
|
||||
<a href="{{ route('users.Show', ['id' => $user->user_id]) }}"
|
||||
class="dropdown-item text-primary">
|
||||
<i class="fa-solid fa-eye text-primary"></i>
|
||||
Detalhes
|
||||
</a>
|
||||
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
|
||||
class="dropdown-item text-primary">
|
||||
<i class="fa-solid fa-edit text-primary"></i>
|
||||
Editar
|
||||
</a>
|
||||
<form action="{{ route('users.destroy', $user) }}" method="POST"
|
||||
onsubmit="return confirm('Are you sure you want to delete this user?');"
|
||||
style="display:inline;">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="dropdown-item text-danger">
|
||||
<i class="fa-solid fa-trash-alt text-danger"></i>
|
||||
Excluir
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- ./table-responsive-->
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</div>
|
||||
{{-- ./card-light --}}
|
||||
</div>
|
||||
{{-- /.container-fluid" --}}
|
||||
</section>
|
||||
@endsection
|
||||
|
||||
@section('scriptsTemplateAdmin')
|
||||
<script>
|
||||
$(function() {
|
||||
$("#tableReceiveCompanies").DataTable({
|
||||
"responsive": true,
|
||||
"lengthChange": false,
|
||||
"autoWidth": false,
|
||||
"buttons": ["copy", "csv", "excel", "pdf", "print", "colvis"]
|
||||
}).buttons().container().appendTo('#tableReceiveCompanies_wrapper .col-md-6:eq(0)');
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
|
@ -35,20 +35,14 @@
|
|||
<table class="table table-hover text-nowrap" id="tableReceiveCompanies">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Nome</th>
|
||||
<th>Email</th>
|
||||
<th>Tipo de Utilizador</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($users as $user)
|
||||
@foreach ($companiesList as $company)
|
||||
<tr>
|
||||
<td>{{ $user->user_id }}</td>
|
||||
<td>{{ $user->user_name }}</td>
|
||||
<td>{{ $user->email }}</td>
|
||||
<td>{{ $user->userType->type_user }}</td>
|
||||
<td>{{ $company->company_name }}</td>
|
||||
<td class="table-btn-group-al">
|
||||
<div class="d-flex justify-content-center dropdown">
|
||||
<button data-toggle="dropdown" aria-expanded="false"
|
||||
|
|
@ -56,12 +50,12 @@ class="actions-btn btn btn-light circle ">
|
|||
<i class="fa fa-ellipsis-v"></i>
|
||||
</button>
|
||||
<div id="group-actions-btn-14" class="dropdown-menu dropdown-menu-light">
|
||||
<a href="{{ route('users.Show', ['id' => $user->user_id]) }}"
|
||||
<a href="{{ route('showCompany', ['id' => $company->company_id]) }}"
|
||||
class="dropdown-item text-primary">
|
||||
<i class="fa-solid fa-eye text-primary"></i>
|
||||
Detalhes
|
||||
</a>
|
||||
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
|
||||
{{-- <a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
|
||||
class="dropdown-item text-primary">
|
||||
<i class="fa-solid fa-edit text-primary"></i>
|
||||
Editar
|
||||
|
|
@ -75,7 +69,7 @@ class="dropdown-item text-primary">
|
|||
<i class="fa-solid fa-trash-alt text-danger"></i>
|
||||
Excluir
|
||||
</button>
|
||||
</form>
|
||||
</form> --}}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -5,23 +5,27 @@
|
|||
<div class="container-fluid">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
@if($user->type_users == 3)
|
||||
{{-- @if($user->type_users == 3)
|
||||
<h1 class="text-primary">Detalhes da Empresa</h1>
|
||||
@else
|
||||
<h1 class="text-primary">Detalhes do Utilizador</h1>
|
||||
@endif
|
||||
@endif --}}
|
||||
<h1 class="text-primary">Detalhes do Utilizador</h1>
|
||||
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
|
||||
<ol class="breadcrumb float-sm-right">
|
||||
<li class="breadcrumb-item active">Administração</li>
|
||||
@if($user->type_users == 3)
|
||||
{{-- @if($user->type_users == 3)
|
||||
<li class="breadcrumb-item"><a href="{{ route('users.company') }}"> Empresas</a></li>
|
||||
<li class="breadcrumb-item active">Detalhes da Empresa</li>
|
||||
@else
|
||||
<li class="breadcrumb-item"><a href="{{ route('users.list') }}"> Utilizadores</a></li>
|
||||
<li class="breadcrumb-item active">Detalhes do Empresa</li>
|
||||
@endif
|
||||
@endif --}}
|
||||
<li class="breadcrumb-item"><a href="{{ route('users.list') }}"> Utilizadores</a></li>
|
||||
<li class="breadcrumb-item active">Detalhes do Empresa</li>
|
||||
</ol>
|
||||
|
||||
</div>
|
||||
|
|
@ -33,11 +37,13 @@
|
|||
<div class="container-fluid">
|
||||
<div class="card card-primary">
|
||||
<div class="card-header">
|
||||
@if ($user->type_users == 3)
|
||||
{{-- @if ($user->type_users == 3)
|
||||
Empresa : {{ $user->user_name }}
|
||||
@else
|
||||
Utilizador : {{ $user->user_name }}
|
||||
@endif
|
||||
@endif --}}
|
||||
Utilizador : {{ $user->user_name }}
|
||||
|
||||
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
|
@ -80,14 +86,13 @@
|
|||
<!-- Se for um Admin não deve editar -->
|
||||
@if ($user->type_users != 1)
|
||||
|
||||
@if ($user->type_users == 3)
|
||||
{{-- @if ($user->type_users == 3)
|
||||
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
|
||||
class="btn btn-light float-right">Editar Empresa</a>
|
||||
@else
|
||||
@else --}}
|
||||
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
|
||||
class="btn btn-light float-right">Editar Utilizador</a>
|
||||
@endif
|
||||
@endif
|
||||
@endif
|
||||
</div>
|
||||
<br>
|
||||
|
|
|
|||
|
|
@ -83,6 +83,39 @@
|
|||
</head>
|
||||
|
||||
<body class="hold-transition login-page">
|
||||
|
||||
@if (session('success'))
|
||||
<div class="content">
|
||||
|
||||
<div class="alert alert-success" role="alert" id="alert-message-success" style="transition: opacity 1s;">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
setTimeout(function() {
|
||||
$('#alert-message-success').fadeOut('slow', function() {
|
||||
$(this).remove();
|
||||
});
|
||||
}, 30000); // A mensagem desaparecerá após 5 segundos
|
||||
</script>
|
||||
@endif
|
||||
|
||||
@if (session('danger'))
|
||||
<div class="content">
|
||||
|
||||
<div class="alert alert-danger" role="alert" id="alert-message-success" style="transition: opacity 1s;">
|
||||
{{ session('danger') }}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
setTimeout(function() {
|
||||
$('#alert-message-success').fadeOut('slow', function() {
|
||||
$(this).remove();
|
||||
});
|
||||
}, 10000); // A mensagem desaparecerá após 5 segundos
|
||||
</script>
|
||||
@endif
|
||||
|
||||
@if (count($errors) > 0)
|
||||
<div class="alert alert-danger">
|
||||
{{ implode('', $errors->all('Utilizador ou palavra-passe não Coincidem')) }}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>ISPT 4.0</title>
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="{{ URL::asset('assets/dist/img/favicon.ico') }}">
|
||||
|
||||
<!-- Google Font: Source Sans Pro -->
|
||||
<link rel="stylesheet"
|
||||
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
|
||||
|
|
@ -19,7 +21,63 @@
|
|||
|
||||
<link rel="stylesheet" href="{{ asset('assets/dist/css/countryFlag.css') }}">
|
||||
|
||||
<!-- Inclusão do jQuery -->
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
|
||||
|
||||
<style>
|
||||
body {
|
||||
animation: theme 21s linear infinite;
|
||||
}
|
||||
|
||||
body:after,
|
||||
body:before {
|
||||
content: '';
|
||||
display: block;
|
||||
position: fixed;
|
||||
z-index: -1;
|
||||
top: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
animation: background 90s linear infinite;
|
||||
}
|
||||
|
||||
body:after {
|
||||
left: 15vw;
|
||||
}
|
||||
|
||||
body:before {
|
||||
right: 15vw;
|
||||
animation-delay: -30s;
|
||||
animation-direction: reverse;
|
||||
}
|
||||
|
||||
@keyframes theme {
|
||||
|
||||
0%,
|
||||
100% {
|
||||
background: #09255C;
|
||||
}
|
||||
|
||||
33% {
|
||||
background: #EAF3F6;
|
||||
}
|
||||
|
||||
66% {
|
||||
background: #00B0EA;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes background {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
|
|
@ -55,11 +113,13 @@
|
|||
</div>
|
||||
@endif
|
||||
|
||||
<form action="{{ route('criarUser') }}" method="POST">
|
||||
<form action="{{ route('criarUser') }}" name="formCreateUser" method="POST">
|
||||
@csrf
|
||||
|
||||
<input type="hidden" name="receiveToken" value="{{$tokenRecord->token}}">
|
||||
|
||||
<div class="row">
|
||||
<div class="col sm">
|
||||
<div class="col-sm">
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" name="name" class="form-control"
|
||||
placeholder="Primeiro Nome ..." id="name" required>
|
||||
|
|
@ -70,7 +130,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col sm">
|
||||
<div class="col-sm">
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" name="lastName" class="form-control" placeholder="Apelido..."
|
||||
id="lastName" required>
|
||||
|
|
@ -82,83 +142,96 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col sm">
|
||||
<div class="input-group mb-3">
|
||||
<input type="email" name="pending_email" class="form-control" placeholder="Email"
|
||||
id="pending_email" required>
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
<span class="fas fa-user"></span>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm">
|
||||
<div id="project-number-exists-email"></div>
|
||||
|
||||
<div class="input-group mb-3">
|
||||
<input type="email" name="pending_email" class="form-control" placeholder="Email"
|
||||
id="pending_email" data-type="email" required>
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
<span class="fa fa-envelope"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col sm">
|
||||
<div class="col-sm">
|
||||
<div id="project-number-exists-nif"></div>
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" name="pending_nif" class="form-control" placeholder="Nif"
|
||||
id="pending_nif">
|
||||
id="pending_nif" data-type="nif">
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
<span class="fas fa-user"></span>
|
||||
<span class="fa fa-address-card"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col sm">
|
||||
<div class="col-sm">
|
||||
<div id="project-number-exists-phone"></div>
|
||||
<div class="input-group mb-3">
|
||||
<input type="tel" name="pending_phone" class="form-control" placeholder="Telemovel"
|
||||
id="pending_phone" required>
|
||||
id="pending_phone" data-type="phone" required>
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
<span class="fas fa-user"></span>
|
||||
<span class="fa fa-mobile"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{-- <div class="iti">
|
||||
<input type="tel" name="phone">
|
||||
</div> --}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col sm">
|
||||
<div class="col-sm">
|
||||
{{-- <div id="project-password-valid"></div> --}}
|
||||
<div class="input-group mb-3">
|
||||
<input type="password" name="pending_password" class="form-control"
|
||||
placeholder="Password" id="pending_password" required>
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
<span class="fas fa-user"></span>
|
||||
<span class="fa fa-key"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="password-requirements">
|
||||
<ul id="password-criteria" style=" display: none;">
|
||||
<li id="min-length">Pelo menos 8 caracteres</li>
|
||||
<li id="upper-case">Uma letra maiúscula</li>
|
||||
<li id="lower-case">Uma letra minúscula</li>
|
||||
<li id="one-number">Um número</li>
|
||||
<li id="special-char">Um caractere especial (@$!%*?&)</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col sm">
|
||||
|
||||
<div class="col-sm">
|
||||
<div id="project-password-confirm-valid"></div>
|
||||
<div class="input-group mb-3">
|
||||
<input type="password" for="pending_password_confirmation"
|
||||
name="pending_password_confirmation" class="form-control"
|
||||
placeholder="Check Password">
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
<span class="fas fa-user"></span>
|
||||
<span class="fa fa-unlock-alt"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- @if ($errors->any())
|
||||
<div class="alert alert-danger">
|
||||
{{ implode('', $errors->all('<p>:message</p>')) }}
|
||||
</div>
|
||||
@endif --}}
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
<button type="submit" class="btn btn-primary btn-block">Submeter</button>
|
||||
{{-- <button type="submit" class="btn btn-primary btn-block">Submeter</button> --}}
|
||||
<button type="submit" class="btn btn-primary btn-block" id="submitBtn"
|
||||
disabled>Submeter</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
|
@ -175,4 +248,278 @@
|
|||
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
|
||||
// Esta funcao foi necessaria, pois devido ao css e script para funcionar a exibicao das bandeiras, sem esta funcao, sempre que click no input, a selecao de bandeiras some, ate click fora do input
|
||||
//Nao mexer se voce quiser, ter um select de paises bonito dentro do input XD
|
||||
function ensureFlagContainerVisibility() {
|
||||
const flagContainer = document.querySelector('.flag-container');
|
||||
const countryList = document.querySelector('.country-list');
|
||||
|
||||
// Verifica se o .country-list está ativo
|
||||
const isCountryListActive = countryList && countryList.classList.contains('active');
|
||||
|
||||
if (!flagContainer) {
|
||||
console.log('Flag container não encontrado, inserindo novamente...');
|
||||
// Insira o código para reinserir o .flag-container no DOM aqui
|
||||
} else {
|
||||
if (isCountryListActive) {
|
||||
// Se .country-list estiver ativo, esconde .flag-container
|
||||
flagContainer.style.display = 'none';
|
||||
} else {
|
||||
// Se .country-list não estiver ativo, mostra .flag-container
|
||||
flagContainer.style.display = 'block'; // Garantindo que não esteja escondido
|
||||
flagContainer.style.position = 'absolute'; // Mantendo a posição
|
||||
flagContainer.style.left = '0px'; // Ajustando a posição horizontal conforme necessário
|
||||
flagContainer.style.top = '0px'; // Ajustando a posição vertical conforme necessário
|
||||
flagContainer.style.zIndex = '9999'; // Garantindo que esteja acima de outros elementos
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Chamando a função imediatamente para aplicar os estilos e configurações iniciais
|
||||
ensureFlagContainerVisibility();
|
||||
// Configurando um intervalo para verificar e aplicar os estilos periodicamente
|
||||
setInterval(ensureFlagContainerVisibility, 50); // Verifica a cada 0.05 segundo
|
||||
|
||||
// Todas as Validacoes comecam a 'false' e se alteram em tempo real de acordo com o text em cada input
|
||||
var validationState = {
|
||||
pending_email: false,
|
||||
pending_nif: false,
|
||||
pending_phone: false,
|
||||
pending_password: false,
|
||||
pending_password_confirmation: false
|
||||
};
|
||||
|
||||
// Validação AJAX
|
||||
function validateField(type, value) {
|
||||
$.ajax({
|
||||
url: '{{ route('validateForm') }}',
|
||||
type: 'GET',
|
||||
data: {
|
||||
_token: $('input[name="_token"]').val(), // CSRF token
|
||||
type: type,
|
||||
value: value
|
||||
},
|
||||
success: function(response) {
|
||||
|
||||
if (response['result_' + type] === 0) {
|
||||
validationState['pending_' + type] = true;
|
||||
updateSubmitButtonState();
|
||||
|
||||
} else {
|
||||
validationState['pending_' + type] = false;
|
||||
updateSubmitButtonState();
|
||||
}
|
||||
// console.log(response);
|
||||
|
||||
updateUI(type, response['result_' + type]);
|
||||
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error("Erro na validação: ", error);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
// Função para atualizar a interface com base no resultado (Logs de resposta para cada Input)
|
||||
function updateUI(type, result) {
|
||||
console.log(result);
|
||||
var message;
|
||||
var borderColor;
|
||||
|
||||
//Validacoes da resposta API
|
||||
switch (result) {
|
||||
case 1:
|
||||
message = 'O ' + type + ' já está registrado.';
|
||||
borderColor = 'red';
|
||||
break;
|
||||
case 2:
|
||||
message = 'O ' + type + ' está pendente de aprovação.';
|
||||
borderColor = 'red';
|
||||
break;
|
||||
case 3:
|
||||
message = 'O ' + type + ' já está registrado e também pendente de aprovação.';
|
||||
borderColor = 'red';
|
||||
break;
|
||||
default:
|
||||
message = 'O ' + type + ' está disponível.';
|
||||
borderColor = 'green';
|
||||
}
|
||||
|
||||
|
||||
// Atualiza a mensagem e a cor da borda do input
|
||||
$('#project-number-exists-' + type).text(message).css('color', borderColor);
|
||||
$('input[name="pending_' + type + '"]').css('border', '2px solid ' + borderColor).removeClass(
|
||||
'valid-input invalid-input').addClass(borderColor === 'red' ? 'invalid-input' :
|
||||
'valid-input');
|
||||
}
|
||||
|
||||
// Função para atualizar o estado do botão de submissão
|
||||
function updateSubmitButtonState() {
|
||||
var allValid = Object.values(validationState).every(isValid => isValid);
|
||||
$('#submitBtn').prop('disabled', !allValid);
|
||||
console.log(validationState); // Log do estado atual de validação
|
||||
}
|
||||
|
||||
// Campo de email
|
||||
$('input[name="pending_email"]').on('input', function() {
|
||||
var email = $(this).val();
|
||||
var type = $(this).data('type');
|
||||
|
||||
var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; // Expressão regular para verificar email
|
||||
|
||||
if (emailRegex.test(
|
||||
email)) { // Verifica se parece com um email, se sim, faz a chamada a Api
|
||||
validateField(type, email);
|
||||
|
||||
} else {
|
||||
$(this).css('border', '1px solid #ced4da').removeClass('valid-input invalid-input');
|
||||
$('#project-number-exists-email').text('');
|
||||
}
|
||||
});
|
||||
|
||||
// Campo de Nif
|
||||
$('input[name="pending_nif"]').on('input', function() {
|
||||
var nif = $(this).val();
|
||||
var type = $(this).data('type');
|
||||
|
||||
// Verifica se o NIF tem o comprimento correto
|
||||
if (nif.length < 9) {
|
||||
// Se for menor que 9 dígitos, mostra uma mensagem de erro
|
||||
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
|
||||
'invalid-input');
|
||||
$('#project-number-exists-nif').text('O tamanho do NIF é incorreto.').css('color',
|
||||
'red');
|
||||
} else {
|
||||
// Se tiver exatamente 9 dígitos, prossegue com a validação no sistema
|
||||
validateField(type, nif);
|
||||
}
|
||||
|
||||
// Se for necessario adicioanr um regulador para o tamanho do Nif.
|
||||
// else {
|
||||
// // Se tiver mais de 9 dígitos, também considera como inválido
|
||||
// $(this).css('border', '2px solid red').removeClass('valid-input').addClass(
|
||||
// 'invalid-input');
|
||||
// $('#project-number-exists-nif').text('O NIF não deve exceder 9 dígitos.').css('color',
|
||||
// 'red');
|
||||
// }
|
||||
|
||||
});
|
||||
|
||||
// Campo phine
|
||||
$('input[name="pending_phone"]').on('input', function() {
|
||||
var phone = $(this).val();
|
||||
var type = $(this).data('type');
|
||||
|
||||
if (phone.length < 9) {
|
||||
// Se for menor que 9 dígitos, mostra uma mensagem de erro
|
||||
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
|
||||
'invalid-input');
|
||||
$('#project-number-exists-phone').text('Numero de telemovel inexistente.').css(
|
||||
'color',
|
||||
'red');
|
||||
} else {
|
||||
validateField(type, phone);
|
||||
$(this).css('border', '1px solid #ced4da').removeClass('valid-input invalid-input');
|
||||
$('#project-number-exists-phone').text('');
|
||||
}
|
||||
});
|
||||
|
||||
// +
|
||||
$('input[name="pending_password"]').on('focus', function() {
|
||||
$('#password-criteria').show();
|
||||
});
|
||||
$('input[name="pending_password"]').on('blur', function() {
|
||||
// Você pode adicionar condições aqui para decidir quando esconder
|
||||
// Por exemplo, só esconder se a senha passar em todos os critérios
|
||||
$('#password-criteria').hide();
|
||||
});
|
||||
|
||||
// Campo de Password
|
||||
$('input[name="pending_password"]').on('input', function() {
|
||||
|
||||
var password = $(this).val();
|
||||
|
||||
// Verifica o comprimento da senha
|
||||
var minLength = password.length >= 8;
|
||||
$('#min-length').css('color', minLength ? 'green' : 'red');
|
||||
|
||||
// Verifica a presença de uma letra maiúscula
|
||||
var upperCase = /[A-Z]/.test(password);
|
||||
$('#upper-case').css('color', upperCase ? 'green' : 'red');
|
||||
|
||||
// Verifica a presença de uma letra minúscula
|
||||
var lowerCase = /[a-z]/.test(password);
|
||||
$('#lower-case').css('color', lowerCase ? 'green' : 'red');
|
||||
|
||||
// Verifica a presença de um número
|
||||
var oneNumber = /\d/.test(password);
|
||||
$('#one-number').css('color', oneNumber ? 'green' : 'red');
|
||||
|
||||
// Verifica a presença de um caractere especial
|
||||
var specialChar = /[@$!%*?&]/.test(password);
|
||||
$('#special-char').css('color', specialChar ? 'green' : 'red');
|
||||
|
||||
// Verifica se todos os requisitos foram atendidos
|
||||
validationState.pending_password = minLength && upperCase && lowerCase && oneNumber &&
|
||||
specialChar;
|
||||
if (validationState.pending_password) {
|
||||
$(this).css('border', '2px solid green').removeClass('invalid-input').addClass(
|
||||
'valid-input');
|
||||
$('#project-password-valid').text('Senha forte.').css('color', 'green');
|
||||
} else {
|
||||
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
|
||||
'invalid-input');
|
||||
}
|
||||
|
||||
// Chama a função para atualizar o estado do botão de submissão, se necessário
|
||||
updateSubmitButtonState();
|
||||
});
|
||||
|
||||
|
||||
$('input[name="pending_password_confirmation"]').on('input', function() {
|
||||
var password = $('input[name="pending_password"]').val();
|
||||
var confirmPassword = $(this).val();
|
||||
|
||||
// Verifica se as senhas são iguais e se a confirmação da senha tem comprimento igual à senha
|
||||
if (password === confirmPassword && confirmPassword.length === password.length) {
|
||||
$(this).css('border', '2px solid green').removeClass('invalid-input').addClass(
|
||||
'valid-input');
|
||||
$('#project-password-confirm-valid').text('As senhas coincidem.').css('color', 'green');
|
||||
validationState.pending_password_confirmation = true;
|
||||
} else if (confirmPassword.length < password.length) {
|
||||
// Se a confirmação da senha é menor do que a senha, não faz nada (não mostra erro ainda)
|
||||
$(this).css('border', '1px solid #ced4da').removeClass('invalid-input valid-input');
|
||||
$('#project-password-confirm-valid').text(''); // Limpa qualquer mensagem anterior
|
||||
validationState.pending_password_confirmation =
|
||||
false; // Considera inválido até que os comprimentos batam
|
||||
} else {
|
||||
// Mostra mensagem de erro somente se os comprimentos são iguais mas as senhas não coincidem
|
||||
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
|
||||
'invalid-input');
|
||||
$('#project-password-confirm-valid').text('As senhas não coincidem.').css('color',
|
||||
'red');
|
||||
validationState.pending_password_confirmation = false;
|
||||
}
|
||||
|
||||
// Atualiza o estado do botão de submissão a cada alteração
|
||||
updateSubmitButtonState();
|
||||
});
|
||||
|
||||
|
||||
// caso o usuário comece a corrigir a senha principal depois de um erro de confirmação
|
||||
$('input[name="pending_password"]').on('input', function() {
|
||||
// Limpa a mensagem de erro se o usuário começar a corrigir a senha principal
|
||||
if ($('input[name="pending_password_confirmation"]').val() !== '') {
|
||||
$('input[name="pending_password_confirmation"]').trigger('input');
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
<body>
|
||||
<h1>Olá!</h1>
|
||||
<p>Temos o prazer de apresentar-lhe o acesso exclusivo ao formulário do projeto 'Ispt4.0'</p>
|
||||
<a href="{{ route('formulario') }}" target="_blank"
|
||||
<a href="{{ route('createUserForm', ['token' => $token]) }}" target="_blank"
|
||||
style="background-color: #00B0EA; border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer;">Acessar
|
||||
Formulário</a>
|
||||
<p>Se não estava à espera deste e-mail ou não reconhece o projeto 'Ispt4.0', por favor, ignore esta mensagem.</p>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('Main-content')
|
||||
@if (session('status'))
|
||||
<div class="alert alert-success" role="alert">
|
||||
<div class="alert alert-success m-2" role="alert">
|
||||
{{ session('status') }}
|
||||
</div>
|
||||
@endif
|
||||
|
|
@ -11,12 +11,13 @@
|
|||
<div class="container-fluid">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1>{{__('messages.pendingUsers.create_users')}}</h1>
|
||||
<h1>{{ __('messages.pendingUsers.create_users') }}</h1>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="breadcrumb float-sm-right">
|
||||
<li class="breadcrumb-item active">{{__('messages.pendingUsers.administration')}}</li>
|
||||
<li class="breadcrumb-item active"><a href="{{ route('CreateUsers') }}">{{__('messages.pendingUsers.create_users')}}</a></li>
|
||||
<li class="breadcrumb-item active">{{ __('messages.pendingUsers.administration') }}</li>
|
||||
<li class="breadcrumb-item active"><a
|
||||
href="{{ route('CreateUsers') }}">{{ __('messages.pendingUsers.create_users') }}</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -29,7 +30,9 @@
|
|||
|
||||
<div class="card card-primary">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title mb-0">{{__('messages.pendingUsers.submit_form')}}</h3>
|
||||
<h3 class="card-title mb-0">Enviar Formulario para criar Utilizador</h3>
|
||||
{{-- <h3 class="card-title mb-0">{{ __('messages.pendingUsers.submit_form') }}</h3> --}}
|
||||
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
|
|
@ -39,18 +42,19 @@
|
|||
<div class="col-sm-8">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" id="form-tagEquipment">
|
||||
<i class="fa-sharp fa-solid fa-tag" style="color: #00B0EA;"></i>
|
||||
<i class="fa fa-envelope" style="color: #00B0EA;"></i>
|
||||
</span>
|
||||
<div class="has-float-label">
|
||||
<input type="text" name="email" class="form-control card_inputs"
|
||||
id="email" placeholder="Digite o email..." aria-label="Tag Equipment"
|
||||
<input type="text" name="email" class="form-control card_inputs" id="email"
|
||||
placeholder="Digite o email..." aria-label="Tag Equipment"
|
||||
aria-describedby="form-tagEquipment">
|
||||
{{-- <label>Email </label> --}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-4 text-center">
|
||||
<button type="submit" class="btn btn-light">{{__('messages.pendingUsers.submit')}}</button>
|
||||
<button type="submit"
|
||||
class="btn btn-light">{{ __('messages.pendingUsers.submit') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
|
@ -59,9 +63,40 @@
|
|||
</div>
|
||||
{{-- ./card-light --}}
|
||||
|
||||
<div class="card card-success">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title mb-0">Criar Empresas</h3>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<form action="{{ route('createCompany') }}" method="post">
|
||||
@csrf
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" id="form-tagEquipment">
|
||||
<i class="fa fa-building" style="color: #00B0EA;"></i>
|
||||
</span>
|
||||
<div class="has-float-label">
|
||||
<input type="text" name="company_name" class="form-control card_inputs" id="company_name"
|
||||
placeholder="Nome da empresa..." aria-label="Tag Equipment"
|
||||
aria-describedby="form-tagEquipment">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-4 text-center">
|
||||
<button type="submit"
|
||||
class="btn btn-light">Criar Empresa</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{{-- /.card-body --}}
|
||||
</div>
|
||||
|
||||
<div class="card card-primary">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title">{{__('messages.pendingUsers.pending_users')}}:</h2>
|
||||
<h2 class="card-title">{{ __('messages.pendingUsers.pending_users') }}:</h2>
|
||||
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
|
@ -70,9 +105,9 @@
|
|||
id="tableReceiveAllPendingUsers">
|
||||
<thead class="text-center">
|
||||
<tr>
|
||||
<th>{{__('messages.pendingUsers.table_pending_user.name')}}</th>
|
||||
<th>{{__('messages.pendingUsers.table_pending_user.email')}}</th>
|
||||
<th>{{__('messages.pendingUsers.table_pending_user.verify')}}</th>
|
||||
<th>{{ __('messages.pendingUsers.table_pending_user.name') }}</th>
|
||||
<th>{{ __('messages.pendingUsers.table_pending_user.email') }}</th>
|
||||
<th>{{ __('messages.pendingUsers.table_pending_user.verify') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
|
|
@ -80,7 +115,8 @@
|
|||
<tr>
|
||||
<td>{{ $pend_user->pending_user_name }}</td>
|
||||
<td>{{ $pend_user->pending_user_email }}</td>
|
||||
<td><a href="{{ route('ShowPendingUser', ['id' => $pend_user->pending_user_id]) }}"><i
|
||||
<td><a
|
||||
href="{{ route('ShowPendingUser', ['id' => $pend_user->pending_user_id]) }}"><i
|
||||
class="fa-solid fa-eye text-primary"></i></a></td>
|
||||
</tr>
|
||||
@endforeach
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@
|
|||
|
||||
<div class="row">
|
||||
<!-- Identificação do projecto -->
|
||||
<div class="form-group col-sm-6">
|
||||
<div class="form-group col-sm">
|
||||
<label>{{ __('messages.createProject.project_identification') }}<b
|
||||
style="color:red">*</b></label>
|
||||
<input type="text" name="description_project" class="form-control"
|
||||
|
|
@ -49,6 +49,20 @@
|
|||
required>
|
||||
</div>
|
||||
|
||||
|
||||
</div> <!-- /Row -->
|
||||
|
||||
<div class="row">
|
||||
|
||||
<!-- Gestor de Projeto ISPT -->
|
||||
<div class="form-group col-sm-6">
|
||||
<label>{{ __('messages.createProject.ispt_project_manager') }} <b
|
||||
style="color:red">*</b></label>
|
||||
<input type="text" name="responsible_project_ispt" class="form-control"
|
||||
placeholder="{{ __('messages.createProject.ispt_project_manager') }}…"
|
||||
required>
|
||||
</div>
|
||||
|
||||
<!-- Número do Projeto ISPT -->
|
||||
<div class="form-group col-sm-6">
|
||||
<label>{{ __('messages.createProject.ispt_project_number') }}<b
|
||||
|
|
@ -61,27 +75,8 @@
|
|||
required>
|
||||
<div id="project-number-exists-ispt"></div>
|
||||
</div>
|
||||
</div> <!-- /Row -->
|
||||
|
||||
<div class="row">
|
||||
|
||||
<!-- Gestor de Projeto ISPT -->
|
||||
<div class="form-group col-sm-6">
|
||||
<label>{{ __('messages.createProject.ispt_project_manager') }} <b
|
||||
style="color:red">*</b></label>
|
||||
<input type="text" name="responsible_project_ispt" class="form-control"
|
||||
placeholder="{{ __('messages.createProject.ispt_project_manager') }}…"
|
||||
required>
|
||||
</div>
|
||||
|
||||
<!-- Gestor de Projeto da Empresa -->
|
||||
<div class="form-group col-sm-6">
|
||||
<label>{{ __('messages.createProject.compan_project_manager') }} <b
|
||||
style="color:red">*</b></label>
|
||||
<input type="text" name="responsible_project_company" class="form-control"
|
||||
placeholder="{{ __('messages.createProject.compan_project_manager') }}…"
|
||||
required>
|
||||
</div>
|
||||
</div> <!-- /Row -->
|
||||
|
||||
<div class="row">
|
||||
|
|
@ -90,18 +85,39 @@
|
|||
<div class="form-group col-sm" id="companyField">
|
||||
<label>{{ __('messages.createProject.select_company.contracting_company') }} <b
|
||||
style="color:red">*</b></label>
|
||||
<select class="form-control" name="user_id" id="company_select">
|
||||
<select class="form-control" name="company_select" id="company_select">
|
||||
{{-- <option>{{ __('messages.createProject.select_plant.plant') }} ...</option> --}}
|
||||
<option value="#">Selecione Uma Empresa …</option>
|
||||
{{-- <option value="new_company">Criar Empresa …</option> --}}
|
||||
@foreach ($companies as $company)
|
||||
<option value="{{ $company->user_id }}">{{ $company->user_name }}</option>
|
||||
<option value="{{ $company->company_id }}">{{ $company->company_name }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<!-- Gestor de Projeto da Empresa -->
|
||||
{{-- <div class="form-group col-sm" id="companyProjectManager" >
|
||||
<label>{{ __('messages.createProject.compan_project_manager') }} <b
|
||||
style="color:red">*</b></label>
|
||||
<input type="text" name="responsible_project_company" class="form-control"
|
||||
placeholder="{{ __('messages.createProject.compan_project_manager') }}…"
|
||||
required>
|
||||
</div> --}}
|
||||
|
||||
<div class="form-group col-sm" id="companyProjectManager">
|
||||
<label>{{ __('messages.createProject.compan_project_manager') }}
|
||||
<b style="color:red">*</b></label>
|
||||
<select class="form-control" name="user_id" id="user_id" required>
|
||||
<!-- As opções de instalação serão preenchidas dinamicamente -->
|
||||
</select>
|
||||
</div>
|
||||
<!-- Instalação -->
|
||||
<div class="form-group col-sm" id="installationField" hidden>
|
||||
<div class="form-group col-sm" id="installationField">
|
||||
<label>{{ __('messages.createProject.select_plant.plant') }} <b
|
||||
style="color:red">*</b></label>
|
||||
<select class="form-control" name="installation_id" id="installationSelect"
|
||||
|
|
@ -151,8 +167,6 @@
|
|||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row">
|
||||
|
||||
<!-- Número do Projeto da Empresa -->
|
||||
|
|
@ -225,7 +239,7 @@ class="btn btn-primary">{{ __('messages.buttons.save') }}</button>
|
|||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
|
||||
{{-- <script>
|
||||
|
|
@ -399,56 +413,202 @@ function updateSubmitButtonState() {
|
|||
});
|
||||
</script>
|
||||
|
||||
|
||||
{{-- <script>
|
||||
$(document).ready(function() {
|
||||
|
||||
// Esconde os elementos no carregamento da página
|
||||
$('#companyProjectManager').hide();
|
||||
$('#installationField').hide();
|
||||
|
||||
$('#localization_installation_client').hide();
|
||||
$('#new_company_div').hide();
|
||||
|
||||
$('#company_select').change(function() {
|
||||
var companyId = $(this).val();
|
||||
var userManagerSelect = $('#user_id'); // Define a variável corretamente
|
||||
|
||||
// Se a seleção é '#', esconde os elementos e retorna
|
||||
if (companyId === '#' || companyId === '') {
|
||||
$('#companyProjectManager').hide();
|
||||
$('#installationField').hide();
|
||||
return;
|
||||
}
|
||||
|
||||
// Se a seleção é válida (diferente de '#'), mostra os elementos
|
||||
$('#companyProjectManager').show();
|
||||
$('#installationField').show();
|
||||
|
||||
// Limpa o select antes de adicionar novas opções
|
||||
userManagerSelect.empty();
|
||||
userManagerSelect.append('<option value="#">Selecione um usuário...</option>');
|
||||
|
||||
// Busca dados combinados de gestores e instalações
|
||||
$.get('/api/installations?company_id=' + companyId, function(response) {
|
||||
console.log(response);
|
||||
response.users.forEach(function(user) {
|
||||
userManagerSelect.append('<option value="' + user.user_id + '">' +
|
||||
user.user_name + '</option>');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script> --}}
|
||||
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Esconde os elementos no carregamento da página
|
||||
$('#companyProjectManager').hide();
|
||||
$('#installationField').hide();
|
||||
$('#localization_installation_client').hide();
|
||||
$('#new_company_div').hide();
|
||||
$('#installationField').attr('hidden', 'hidden');
|
||||
|
||||
$('#company_select').change(function() {
|
||||
var user_id = $(this).val();
|
||||
var companyId = $(this).val();
|
||||
var userManagerSelect = $('#user_id'); // Define a variável corretamente
|
||||
var installationSelect = $(
|
||||
'#installationSelect'); // Define a variável para o select de instalações
|
||||
|
||||
// Se a seleção é 'Criar Empresa ...'
|
||||
if (user_id === 'new_company') {
|
||||
$('#new_company_div').show();
|
||||
$('#installationField').attr('hidden', 'hidden');
|
||||
$('#localization_installation_client').hide();
|
||||
return;
|
||||
} else {
|
||||
$('#new_company_div').hide();
|
||||
}
|
||||
|
||||
// Se a seleção é o placeholder ou '#'
|
||||
if (user_id == '#' || user_id === '') {
|
||||
$('#installationField').attr('hidden', 'hidden');
|
||||
// Se a seleção é '#', esconde os elementos e retorna
|
||||
if (companyId === '#' || companyId === '') {
|
||||
$('#companyProjectManager').hide();
|
||||
$('#installationField').hide();
|
||||
$('#localization_installation_client').hide();
|
||||
$('#new_company_div').hide();
|
||||
return;
|
||||
}
|
||||
|
||||
$.get('/api/installations?user_id=' + user_id, function(data) {
|
||||
var select = $('#installationSelect');
|
||||
select.empty();
|
||||
// Se a seleção é válida (diferente de '#'), mostra os elementos
|
||||
$('#companyProjectManager').show();
|
||||
$('#installationField').show();
|
||||
|
||||
// Adicione as opções fixas aqui
|
||||
select.append('<option value="#">Selecione uma instalação...</option>');
|
||||
select.append(
|
||||
'<option value="new_install">Criar uma nova Instalação ?</option>');
|
||||
// Limpa o select antes de adicionar novas opções
|
||||
userManagerSelect.empty();
|
||||
userManagerSelect.append('<option value="#">Selecione um usuário...</option>');
|
||||
|
||||
// Agora você pode adicionar suas opções dinâmicas.
|
||||
$.each(data, function(index, installation) {
|
||||
select.append('<option value="' + installation.plant_id + '">' +
|
||||
installation.plant_name + '</option>');
|
||||
// Adiciona a opção de 'Criar instalação'
|
||||
installationSelect.empty(); // Garante que o select de instalações esteja vazio
|
||||
installationSelect.append(
|
||||
'<option value="#">Selecione uma instalação...</option>'); // Opção placeholder
|
||||
installationSelect.append(
|
||||
'<option value="new_install">Criar instalação</option>'); // Opção para criar nova instalação
|
||||
|
||||
// Busca dados combinados de gestores e instalações
|
||||
$.get('/api/installations?company_id=' + companyId, function(response) {
|
||||
console.log(response);
|
||||
response.users.forEach(function(user) {
|
||||
userManagerSelect.append('<option value="' + user.user_id + '">' +
|
||||
user.user_name + '</option>');
|
||||
});
|
||||
|
||||
// Armazene os dados em installationsData
|
||||
installationsData = data;
|
||||
|
||||
$('#installationField').removeAttr('hidden');
|
||||
});
|
||||
});
|
||||
|
||||
// Trata a mudança de seleção no select de instalações
|
||||
$('#installationSelect').change(function() {
|
||||
var selectedValue = $(this).val();
|
||||
|
||||
// Se a opção selecionada é 'Criar instalação'
|
||||
if (selectedValue === 'new_install') {
|
||||
$('#localization_installation_client').hide();
|
||||
$('#new_company_div').show(); // Mostra o div para criar nova instalação
|
||||
} else {
|
||||
$('#localization_installation_client')
|
||||
.show(); // Caso contrário, mostra os demais elementos relevantes
|
||||
$('#new_company_div').hide();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{{-- <script>
|
||||
$(document).ready(function() {
|
||||
|
||||
// $('#installationField').attr('hidden', 'hidden');
|
||||
|
||||
// Esconde os elementos no carregamento da página
|
||||
$('#companyProjectManager').hide();
|
||||
$('#installationField').hide();
|
||||
|
||||
$('#localization_installation_client').hide();
|
||||
$('#new_company_div').hide();
|
||||
|
||||
$('#company_select').change(function() {
|
||||
var companyId = $(this).val();
|
||||
|
||||
// Se a seleção é '#', esconde os elementos e retorna
|
||||
if (companyId === '#' || companyId === '') {
|
||||
$('#companyProjectManager').hide();
|
||||
$('#installationField').hide();
|
||||
return;
|
||||
}
|
||||
|
||||
// Se a seleção é válida (diferente de '#'), mostra os elementos
|
||||
$('#companyProjectManager').show();
|
||||
$('#installationField').show();
|
||||
|
||||
// Limpa o select antes de adicionar novas opções
|
||||
userManagerSelect.empty();
|
||||
userManagerSelect.append('<option value="#">Selecione um usuário...</option>');
|
||||
|
||||
|
||||
// Busca dados combinados de gestores e instalações
|
||||
$.get('/api/installations?company_id=' + companyId, function(response) {
|
||||
console.log(response);
|
||||
response.users.forEach(function(user) {
|
||||
userManagerSelect.append('<option value="' + user.user_id + '">' +
|
||||
user.user_name + '</option>');
|
||||
});
|
||||
});
|
||||
// $.get('/api/installations?company_id=' + companyId, function(response) {
|
||||
|
||||
// var select = $('#installationSelect');
|
||||
// select.empty();
|
||||
// // Adicione as opções fixas aqui
|
||||
// select.append('<option value="#">Selecione uma instalação...</option>');
|
||||
// select.append(
|
||||
// '<option value="new_install">Criar uma nova Instalação ?</option>');
|
||||
// // Agora você pode adicionar suas opções dinâmicas.
|
||||
// $.each(data, function(index, installation) {
|
||||
// select.append('<option value="' + installation.plant_id + '">' +
|
||||
// installation.plant_name + '</option>');
|
||||
// });
|
||||
// // Armazene os dados em installationsData
|
||||
// installationsData = data;
|
||||
// $('#installationField').removeAttr('hidden');
|
||||
// });
|
||||
});
|
||||
|
||||
// $('#company_select').change(function() {
|
||||
// var user_id = $(this).val();
|
||||
|
||||
// // Se a seleção é 'Criar Empresa ...'
|
||||
// if (user_id === 'new_company') {
|
||||
// $('#new_company_div').show();
|
||||
// $('#installationField').attr('hidden', 'hidden');
|
||||
// $('#localization_installation_client').hide();
|
||||
// return;
|
||||
// } else {
|
||||
// $('#new_company_div').hide();
|
||||
// }
|
||||
|
||||
// // Se a seleção é o placeholder ou '#'
|
||||
// if (user_id == '#' || user_id === '') {
|
||||
// $('#installationField').attr('hidden', 'hidden');
|
||||
// $('#localization_installation_client').hide();
|
||||
// $('#new_company_div').hide();
|
||||
// return;
|
||||
// }
|
||||
|
||||
|
||||
// });
|
||||
|
||||
$('#installationSelect').change(function() {
|
||||
var selectedValue = $(this).val();
|
||||
|
||||
|
|
@ -484,7 +644,7 @@ function updateSubmitButtonState() {
|
|||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script> --}}
|
||||
|
||||
<script type="text/javascript">
|
||||
let formSubmitted = false;
|
||||
|
|
@ -514,5 +674,4 @@ function addBeforeUnload() {
|
|||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@
|
|||
|
||||
Route::get('/checkProjectIsptNumber/{projectId?}',[ProjectoDatacontroller::class,'checkProjectIsptNumber'])->name('checkProjectIsptNumber');
|
||||
|
||||
Route::post('deletePendingEquipments', [CreateProjectController::class, 'deletePendingEquipments'])->name('deletePendingEquipments');
|
||||
Route::post('deletePendingEquipments', [CreateProjectController::class, 'deletePendingEq
|
||||
uipments'])->name('deletePendingEquipments');
|
||||
|
||||
|
||||
|
||||
|
|
@ -103,9 +104,15 @@
|
|||
Route::post('language/switch', [LanguageController::class, 'switchLanguage'])->name('language.switch');
|
||||
|
||||
// Esta rota so pode aceder quem tiver o link atravez do email
|
||||
Route::get('formulario', function () {
|
||||
return view('email/FormAdmin');
|
||||
})->name('formulario');
|
||||
// Route::get('formulario', function () {
|
||||
// return view('email/FormAdmin');
|
||||
// })->name('formulario');
|
||||
|
||||
Route::get('createUserForm', [FormController::class, 'createUserForm'])->name('createUserForm');
|
||||
|
||||
|
||||
|
||||
Route::get('/validate-form', [Pending_UserController::class, 'validateForm'])->name('validateForm');
|
||||
|
||||
Route::post('formulario/receive', [Pending_UserController::class, 'store'])->name('criarUser');
|
||||
|
||||
|
|
@ -200,6 +207,9 @@
|
|||
Route::delete('users/{user}', 'destroy')->name('users.destroy');
|
||||
|
||||
Route::post('editProfile/{id}', 'EditProfile')->name('editProfile');
|
||||
|
||||
Route::get('company/{id}','showCompany')->name('showCompany');
|
||||
Route::post('createCompany','createCompany')->name('createCompany');
|
||||
});
|
||||
|
||||
Route::post('editEquipmentTasks/{equipmentID}/{projectId}',[ProjectoDatacontroller::class,'editEquipmentTasks'])->name('editEquipmentTasks');
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user