atualizacao

This commit is contained in:
2026-02-22 18:16:47 +00:00
parent 7136d3e061
commit 05b7d0a82b
45 changed files with 3881 additions and 246 deletions

View File

@@ -0,0 +1,131 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="viho admin is super flexible, powerful, clean &amp; modern responsive bootstrap 4 admin template with unlimited possibilities.">
<meta name="keywords" content="admin template, viho admin template, dashboard template, flat admin template, responsive admin template, web app">
<meta name="author" content="pixelstrap">
<link rel="icon" href="{{ asset('assets/images/favicon.png" type="image/x-icon')}}">
<link rel="shortcut icon" href="{{ asset('assets/images/favicon.png')}}" type="image/x-icon">
<title>{{env('APP_NAME')}}</title>
<!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet">
<!-- Font Awesome-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/fontawesome.css')}}">
<!-- ico-font-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/icofont.css')}}">
<!-- Themify icon-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/themify.css')}}">
<!-- Flag icon-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/flag-icon.css')}}">
<!-- Feather icon-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/feather-icon.css')}}">
<!-- Plugins css start-->
<!-- Plugins css Ends-->
<!-- Bootstrap css-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/bootstrap.css')}}">
<!-- App css-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/style.css')}}">
<link id="color" rel="stylesheet" href="{{ asset('assets/css/color-1.css" media="screen')}}">
<!-- Responsive css-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/responsive.css')}}">
</head>
<body>
<!-- Loader starts-->
<div class="loader-wrapper">
<div class="theme-loader">
<div class="loader-p"></div>
</div>
</div>
<!-- Loader ends-->
<!-- error page start //-->
<div class="page-wrapper" id="pageWrapper">
<div class="error-wrapper">
<div class="container">
<div class="error-page1">
<div class="svg-wrraper mb-0">
<svg class="svg-60" viewbox="0 0 1920 1080" xmlns="http://www.w3.org/2000/svg">
<g>
<path class="warning-color" d="M600.87,872H156a4,4,0,0,0-3.78,4.19h0a4,4,0,0,0,3.78,4.19H600.87a4,4,0,0,0,3.78-4.19h0A4,4,0,0,0,600.87,872Z"></path>
<rect class="warning-color" height="8.39" rx="4.19" ry="4.19" width="513.38" x="680.91" y="871.98"></rect>
<path class="warning-color" d="M1480,876.17h0c0,2.32,2.37,4.19,5.3,4.19h350.61c2.93,0,5.3-1.88,5.3-4.19h0c0-2.32-2.37-4.19-5.3-4.19H1485.26C1482.33,872,1480,873.86,1480,876.17Z"></path>
<rect class="warning-color" height="8.39" rx="4.19" ry="4.19" width="249.8" x="492.21" y="920.64"></rect>
<path class="warning-color" d="M1549.14,924.84h0a4.19,4.19,0,0,0-4.19-4.19H1067.46a14.66,14.66,0,0,1,.35,3.21v1A4.19,4.19,0,0,0,1072,929h472.94A4.19,4.19,0,0,0,1549.14,924.84Z"></path>
<path class="warning-color" d="M865.5,924.84h0a4.19,4.19,0,0,0,4.19,4.19h82.37a12.28,12.28,0,0,1-.19-2v-2.17a4.19,4.19,0,0,0-4.19-4.19h-78A4.19,4.19,0,0,0,865.5,924.84Z"></path>
<rect class="warning-color" height="8.39" rx="4.19" ry="4.19" width="54.72" x="915.6" y="981.47"></rect>
<path class="warning-color" d="M730.33,985.67h0c0,2.32,4.23,4.19,9.44,4.19h104.3c5.22,0,9.44-1.88,9.44-4.19h0c0-2.32-4.23-4.19-9.44-4.19H739.78C734.56,981.47,730.33,983.35,730.33,985.67Z"></path>
<rect class="warning-color" height="8.39" rx="4.19" ry="4.19" width="78.11" x="997.06" y="981.47"></rect>
<g id="round-conf">
<path class="warning-color circle c1" d="M536.41,155.14a17.77,17.77,0,1,0,17.77,17.77A17.77,17.77,0,0,0,536.41,155.14Zm0,28.68a10.9,10.9,0,1,1,10.9-10.9A10.9,10.9,0,0,1,536.41,183.81Z"></path>
<path class="warning-color circle c1" d="M1345.09,82.44a17.77,17.77,0,1,0,17.77,17.77A17.77,17.77,0,0,0,1345.09,82.44Zm0,28.68a10.9,10.9,0,1,1,10.9-10.9A10.9,10.9,0,0,1,1345.09,111.12Z"></path>
<path class="warning-color circle c1" d="M70.12,363A17.77,17.77,0,1,0,87.89,380.8,17.77,17.77,0,0,0,70.12,363Zm0,28.68A10.9,10.9,0,1,1,81,380.8,10.9,10.9,0,0,1,70.12,391.7Z"></path>
<path class="warning-color circle c1" d="M170.47,751.82a17.77,17.77,0,1,0,17.77,17.77A17.77,17.77,0,0,0,170.47,751.82Zm0,28.68a10.9,10.9,0,1,1,10.9-10.9A10.9,10.9,0,0,1,170.47,780.5Z"></path>
<path class="warning-color circle c1" d="M1457.34,762.73a17.77,17.77,0,1,0,17.77,17.77A17.77,17.77,0,0,0,1457.34,762.73Zm0,28.68a10.9,10.9,0,1,1,10.9-10.9A10.9,10.9,0,0,1,1457.34,791.4Z"></path>
<path class="warning-color circle c1" d="M1829.15,407.49a17.77,17.77,0,1,0,17.77,17.77A17.77,17.77,0,0,0,1829.15,407.49Zm0,28.68a10.9,10.9,0,1,1,10.9-10.9A10.9,10.9,0,0,1,1829.15,436.17Z"></path>
</g>
</g>
<g id="fortyfour" data-name="Layer 2">
<g class="four a">
<rect class="primary-color" height="466.29" rx="57.1" ry="57.1" transform="translate(918.39 330.19) rotate(90)" width="120.71" x="233.74" y="391.14"></rect>
<rect class="primary-color" height="396.88" rx="60.36" ry="60.36" width="120.71" x="333.83" y="475.1"></rect>
<rect class="primary-color" height="604.75" rx="60.36" ry="60.36" transform="translate(290.49 -70.78) rotate(35)" width="120.71" x="197.13" y="122.89"></rect>
</g>
<g class="four b">
<rect class="primary-color" height="466.29" rx="57.1" ry="57.1" transform="translate(2244.26 -994.14) rotate(90)" width="120.71" x="1558.84" y="391.91"></rect>
<rect class="primary-color" height="396.88" rx="60.36" ry="60.36" width="120.71" x="1658.92" y="475.87"></rect>
<rect class="primary-color" height="604.75" rx="60.36" ry="60.36" transform="translate(530.57 -830.68) rotate(35)" width="120.71" x="1522.22" y="123.66"></rect>
</g>
<path class="primary-color" id="ou" d="M956.54,168.2c-194.34,0-351.89,157.55-351.89,351.89S762.19,872,956.54,872s351.89-157.55,351.89-351.89S1150.88,168.2,956.54,168.2Zm0,584.49c-128.46,0-232.6-104.14-232.6-232.6s104.14-232.6,232.6-232.6,232.6,104.14,232.6,232.6S1085,752.69,956.54,752.69Z"></path>
</g>
<g class="bicycle" data-name="Layer 5">
<path class="warning-color wheel" d="M1139.82,780.44a76.59,76.59,0,1,0-57.9,91.53A76.59,76.59,0,0,0,1139.82,780.44Zm-28.12,6.33a47.59,47.59,0,0,1,.83,15.8c-30.14-6.28-47.68-21.65-54.39-52.52A47.73,47.73,0,0,1,1111.69,786.77Zm-70.46-30.9c10.35,26.88,10.14,50.4-13.73,70.77a47.67,47.67,0,0,1,13.73-70.77Zm34.35,88a47.55,47.55,0,0,1-34.94-5.62c16.8-20.36,41.71-25.94,67.09-19.46A47.66,47.66,0,0,1,1075.58,843.85Z"></path>
<path class="warning-color wheel" d="M864.89,789.69a76.59,76.59,0,1,0-66.13,85.78A76.59,76.59,0,0,0,864.89,789.69Zm-28.59,3.7a47.59,47.59,0,0,1-.64,15.81c-29.43-9-45.47-26-49.3-57.33A47.73,47.73,0,0,1,836.3,793.39ZM769,756.1c7.82,27.72,5.43,51.12-20.22,69.2A47.67,47.67,0,0,1,769,756.1Zm26.06,90.78a47.55,47.55,0,0,1-34.27-8.83c18.61-18.72,43.93-22,68.6-13.16A47.66,47.66,0,0,1,795.06,846.88Z"></path>
<g>
<rect class="warning-color" height="53.21" transform="translate(-165.97 273.38) rotate(-16.19)" width="12.87" x="871.39" y="693.37"></rect>
<path class="secondary-color lighten-5" d="M813.93,679.35c-3.72-5.2,2.24-18.5,9.16-16.13,33.43,11.46,73.85,10.45,73.85,10.45,8.84.15,14.44,10.34,7.27,15.48-14.36,8.79-33.13,17-56.35,9.76C830.17,693.41,819.83,687.6,813.93,679.35Z"></path>
<path class="secondary-color opacity-o4" d="M813.93,679.35c-3.72-5.2,2.24-18.5,9.16-16.13,33.43,11.46,73.85,10.45,73.85,10.45,8.84.15,14.44,10.34,7.27,15.48-14.36,8.79-33.13,17-56.35,9.76C830.17,693.41,819.83,687.6,813.93,679.35Z"></path>
<path class="secondary-color lighten-5" d="M817.15,680.06c-3.59-5,1.69-16.51,8.37-14.22,32.3,11.09,71.41,7.83,71.41,7.83,8.54.14,17.45,9.94,7.43,15.88-13.87,8.51-32,16.44-54.44,9.44C832.84,693.67,822.85,688,817.15,680.06Z"></path>
</g>
<g>
<circle class="warning-color" cx="1022.66" cy="599.55" r="11.57" transform="translate(-4.86 8.38) rotate(-0.47)"></circle>
<path class="warning-color" d="M1069.76,792.37l-34.89-96.74,1.93-.8-1.71-4.15-1.74.72-13.26-36.76,1.27-.42-2.25-6.76,5.94-2-2.57-7.72-9.7,3.22c-11.55-22.55,2-36.33,15-41.86l-5.57-8.81c-23,10.29-29.61,28.75-19.53,54l-9.38,3.12,2.56,7.72,5.47-1.82,2.25,6.76,2.36-.78,13.62,37.76-2.35,1,1.71,4.15,2.16-.89,34.65,96.09a7.47,7.47,0,0,0,9.56,4.49h0A7.47,7.47,0,0,0,1069.76,792.37Z"></path>
<circle class="secondary-color lighten-5" cx="1027.9" cy="587.94" r="12.99" transform="translate(-4.77 8.42) rotate(-0.47)"></circle>
</g>
<path class="secondary-color lighten-5" d="M1021.29,654l-17.73,6.15,1.72,5.59-31.41,82.36c-19.35,32.53-66.3,36.72-75.56,16.68l-7.09-21.5L879,747.1l3.28,10.09-94.65,33.95c-11.49,2.29-11.85,15.79-2.61,17.84,0,0,39.11,3.66,103,9.5a92.75,92.75,0,0,0,40.89-5.29c44.32-16.56,57.73-50.67,57.73-50.67l26.82-67.26a1.37,1.37,0,0,1,2.53,0l1.42,3.33,17.75-7.62Z"></path>
<path class="secondary-color opacity-o4" d="M1021.29,654l-17.73,6.15,1.72,5.59-31.41,82.36c-19.35,32.53-66.3,36.72-75.56,16.68l-7.09-21.5L879,747.1l3.28,10.09-94.65,33.95c-11.49,2.29-11.85,15.79-2.61,17.84,0,0,39.11,3.66,103,9.5a92.75,92.75,0,0,0,40.89-5.29c44.32-16.56,57.73-50.67,57.73-50.67l26.82-67.26a1.37,1.37,0,0,1,2.53,0l1.42,3.33,17.75-7.62Z"></path>
</g>
</svg>
</div>
<div class="col-md-8 offset-md-2">
<h3>Oops! Parece que você não tem permissão de acesso.</h3>
<p class="sub-content">Você está tentando acessar uma página que você não tem acesso, foi movida ou não existe mais. Entre em contato com suporte.</p><a class="btn btn-primary btn-lg" href="{{ route('dashboard') }}">Voltar para o sistema</a>
</div>
</div>
</div>
</div>
</div>
<!-- error page end //-->
<!-- latest jquery-->
<script src="{{ asset('assets/js/jquery-3.5.1.min.js')}}"></script>
<!-- feather icon js-->
<script src="{{ asset('assets/js/icons/feather-icon/feather.min.js')}}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather-icon.js')}}"></script>
<!-- Sidebar jquery-->
<script src="{{ asset('assets/js/sidebar-menu.js')}}"></script>
<script src="{{ asset('assets/js/config.js')}}"></script>
<!-- Bootstrap js-->
<script src="{{ asset('assets/js/bootstrap/popper.min.js')}}"></script>
<script src="{{ asset('assets/js/bootstrap/bootstrap.min.js')}}"></script>
<!-- Plugins JS start-->
<!-- Plugins JS Ends-->
<!-- Theme js-->
<script src="{{ asset('assets/js/script.js')}}"></script>
<!-- login js-->
<!-- Plugin used-->
</body>
</html>

View File

@@ -0,0 +1,6 @@
@extends('theme.default')
@section('title', 'Alunos')
@section('title.page', 'Alunos')
@section('title.page1', 'CAE')
@section('title.page2', 'Alunos')
@section('title.page3', 'Lista de alunos')

View File

@@ -30,19 +30,27 @@
<td>{{$escola->nome}}</td>
<td>{{$escola->cnpj}}</td>
<td>
<span>Endereço:</span>
<p>{{ $escola->endereco['street'] }} {{ $escola->endereco['number'] }}
</p>
@if (isset($escola->endereco))
<span>Endereço:</span>
<p>{{ $escola->endereco['street'] }} {{ $escola->endereco['number'] }}</p>
@endif
</td>
<td>
<span>Complemento:</span>
<p>{{ $escola->endereco['details'] }} </p>
@if (isset($escola->endereco))
<span>Complemento:</span>
<p>{{ $escola->endereco['details'] }} </p>
@endif
</td>
<td>
<span>Cep:</span>
<p>{{ $escola->endereco['zip'] }}</p>
@if (isset($escola->endereco))
<span>Cep:</span>
<p>{{ $escola->endereco['zip'] }}</p>
@endif
</td>
<td>

View File

@@ -5,9 +5,9 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="{{asset('assets/images/logo3.png')}}" type="image/x-icon">
<link rel="shortcut icon" href="{{asset('assets/images/favicon.jpg')}}" type="image/x-icon">
<title>{{ env('APP_NAME') }} - @yield('title')</title>
<link rel="icon" href="{{ asset('assets/images/logo3.png') }}" type="image/x-icon">
<link rel="shortcut icon" href="{{ asset('assets/images/favicon.jpg') }}" type="image/x-icon">
<title>@yield('title') - {{env('APP_NAME_SHORT')}}</title>
<!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link
@@ -20,43 +20,35 @@
href="https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap"
rel="stylesheet">
<!-- Font Awesome-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/fontawesome.css')}}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/fontawesome.css') }}">
<!-- ico-font-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/icofont.css')}}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/icofont.css') }}">
<!-- Themify icon-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/themify.css')}}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/themify.css') }}">
<!-- Flag icon-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/flag-icon.css')}}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/flag-icon.css') }}">
<!-- Feather icon-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/feather-icon.css')}}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/feather-icon.css') }}">
<!-- Plugins css start-->
<!-- Plugins css Ends-->
<!-- Bootstrap css-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/bootstrap.css')}}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/bootstrap.css') }}">
<!-- App css-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/style.css')}}">
<link id="color" rel="stylesheet" href="{{ asset('assets/css/color-1.css')}}" media="screen">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/style.css') }}">
<link id="color" rel="stylesheet" href="{{ asset('assets/css/color-1.css') }}" media="screen">
<!-- Responsive css-->
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/responsive.css')}}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/responsive.css') }}">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/dropzone.css') }}">
</head>
<body>
@php
use App\Models\escolas;
use App\Models\turmas;
if (Auth::user()->id_escola == 0) {
$escolas = escolas::all();
} else {
$escolas = escolas::where('id', Auth::user()->id_escola)->get();
}
use App\Models\Escola;
use App\Models\Turma;
if (Auth::user()->id_escola == 0) {
$turmas = turmas::all();
} else {
$turmas = turmas::where('id_escola', Auth::user()->id_escola)->get();
}
$escolas = Escola::all();
$turmas = Turma::all();
@endphp
<!-- Loader starts-->
<div class="loader-wrapper">
@@ -89,26 +81,36 @@
<ul class="nav-menus">
<li><a class="text-dark" href="#!" onclick="javascript:toggleFullScreen()"><i
data-feather="maximize"></i></a></li>
<li>
<div class="dropdown-basic">
<div class="dropdown">
<div class="btn-group mb-0">
<button class="dropbtn btn-primary btn-round" type="button">
Novo <span><i class="icofont icofont-arrow-down"></i></span>
</button>
<div class="dropdown-content">
<a href="#" data-bs-toggle="modal" data-bs-target="#modalEscola">Escola</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalTurma">Turma</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalAluno">Aluno</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalEnvio">Envio de
Mensagem</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalEvento">Evento</a>
@role('super_admin')
<li>
<div class="dropdown-basic">
<div class="dropdown">
<div class="btn-group mb-0">
<button class="dropbtn btn-primary btn-round" type="button">
Novo <span><i class="icofont icofont-arrow-down"></i></span>
</button>
<div class="dropdown-content">
<a href="#" data-bs-toggle="modal"
data-bs-target="#modalEscola">Escola</a>
<a href="#" data-bs-toggle="modal"
data-bs-target="#modalTurma">Turma</a>
<a href="#" data-bs-toggle="modal"
data-bs-target="#modalAluno">Aluno</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalEnvio">Envio
de
Mensagem</a>
<a href="#" data-bs-toggle="modal"
data-bs-target="#modalEvento">Evento</a>
<a href="#" data-bs-toggle="modal"
data-bs-target="#modalUsuario">Usuário</a>
</div>
</div>
</div>
</div>
</div>
</li>
</li>
@endrole
<li class="onhover-dropdown p-0">
<form method="POST" action="{{ route('logout') }}">
@csrf
@@ -130,8 +132,8 @@
<header class="main-nav">
<div class="sidebar-user text-center"><a class="setting-primary" href="javascript:void(0)"><i
data-feather="settings"></i></a><img class="img-90 rounded-circle"
src="{{ asset('assets/images/logo3.png')}}" alt="">
<div class="badge-bottom"><span class="badge badge-primary">Responsável</span></div><a
src="{{ asset('assets/images/logo3.png') }}" alt="">
<div class="badge-bottom"><span class="badge badge-primary">{{ Auth::user()->funcao() }}</span></div><a
href="user-profile.html">
<h6 class="mt-3 f-14 f-w-600">{{ Auth::user()->name }}</h6>
</a>
@@ -142,30 +144,41 @@
<div id="mainnav">
<ul class="nav-menu custom-scrollbar">
<li class="back-btn">
<div class="mobile-back text-end"><span>Back</span><i class="fa fa-angle-right ps-2"
aria-hidden="true"></i></div>
<div class="mobile-back text-end"><span>Back</span><i
class="fa fa-angle-right ps-2" aria-hidden="true"></i></div>
</li>
<li class="sidebar-main-title">
<div>
<h6>Geral </h6>
</div>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav" href=""><i
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('dashboard') }}"><i
data-feather="git-pull-request"></i><span>Dashboard</span></a></li>
<li class="sidebar-main-title">
<div>
<h6>Administração </h6>
</div>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('escolas') }}"><i
data-feather="award"></i><span>Escolas</span></a></li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('turmas') }}"><i data-feather="award"></i><span>Turmas</span></a>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('alunos') }}"><i data-feather="award"></i><span>Alunos</span></a>
</li>
@role(['admin', 'super_admin'])
<li class="sidebar-main-title">
<div>
<h6>Administração </h6>
</div>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('escolas') }}"><i
data-feather="award"></i><span>Escolas</span></a></li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('turmas') }}"><i
data-feather="award"></i><span>Turmas</span></a>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('alunos') }}"><i
data-feather="award"></i><span>Alunos</span></a>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('usuarios') }}"><i
data-feather="award"></i><span>Usuários</span></a>
</li>
@endrole
</ul>
</div>
<div class="right-arrow" id="right-arrow"><i data-feather="arrow-right"></i></div>
@@ -213,6 +226,8 @@
</footer>
</div>
</div>
<!-- Modal Escola -->
<div class="modal fade" id="modalEscola" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
@@ -234,7 +249,8 @@
<div class="col-8">
<div class="mb-3">
<label class="form-label" for="razao_social">Razão Social</label>
<input class="form-control" id="razao_social" name="razaosocial" type="text">
<input class="form-control" id="razao_social" name="razaosocial"
type="text">
</div>
</div>
</div>
@@ -295,6 +311,7 @@
</div>
</div>
<!-- Modal Turma -->
<div class="modal fade" id="modalTurma" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
@@ -322,7 +339,8 @@
<div class="col">
<div class="mb-3">
<label class="form-label" for="turma_nome">Nome</label>
<input class="form-control" id="turma_nome" name="turma_nome" type="text">
<input class="form-control" id="turma_nome" name="turma_nome"
type="text">
</div>
</div>
<div class="col">
@@ -335,7 +353,8 @@
<div class="col">
<div class="mb-3">
<label class="form-label" for="id_whatsapp">Whatsap Id</label>
<input class="form-control" id="id_whatsapp" name="id_whatsapp" type="text">
<input class="form-control" id="id_whatsapp" name="id_whatsapp"
type="text">
</div>
</div>
</div>
@@ -349,21 +368,241 @@
</div>
</div>
</div>
{{-- MODAL NOVO ALUNO --}}
<div class="modal fade" id="modalAluno" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Novo Aluno</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<!-- formulário -->
</div>
<form class="form theme-form" action="{{ route('alunos.add') }}" method="POST">
@csrf
<div class="modal-header">
<h4 class="modal-title">Novo Aluno</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div class="row">
{{-- Escola --}}
<div class="col-12">
<div class="mb-3">
<label class="form-label">Escola</label>
<select class="form-select" name="id_escola" id="id_escola" required>
<option value="">Selecione...</option>
@foreach ($escolas as $escola)
<option value="{{ $escola->id }}" @selected(auth()->user()?->current_escola_id == $escola->id)>
{{ $escola->nome }}
</option>
@endforeach
</select>
</div>
</div>
{{-- Turma --}}
<div class="col-12">
<div class="mb-3">
<label class="form-label">Turma</label>
<select class="form-select digits" name="id_turma" id="id_turma" required
disabled>
<option value="">Selecione uma escola primeiro...</option>
</select>
</div>
</div>
{{-- Nome --}}
<div class="col-12 col-md-8">
<div class="mb-3">
<label class="form-label">Nome do aluno</label>
<input type="text" name="nome" class="form-control" required>
</div>
</div>
{{-- CPF --}}
<div class="col-12 col-md-4">
<div class="mb-3">
<label class="form-label">CPF</label>
<input type="text" name="cpf" class="form-control">
</div>
</div>
{{-- Data de nascimento --}}
<div class="col-12 col-md-6">
<div class="mb-3">
<label class="form-label">Data de nascimento *</label>
<input type="date" name="data_nascimento" class="form-control" required>
</div>
</div>
{{-- Data de inscrição --}}
<div class="col-12 col-md-6">
<div class="mb-3">
<label class="form-label">Data de inscrição *</label>
<input type="date" name="data_inscricao" class="form-control"
value="{{ now()->format('Y-m-d') }}" required>
</div>
</div>
{{-- Usuário do aluno --}}
<div class="col-12 col-md-6">
<div class="mb-3">
<label class="form-label">Usuário do aluno (opcional)</label>
<select class="form-select" name="user_id">
<option value="">Não vincular</option>
@foreach ($users ?? [] as $u)
<option value="{{ $u->id }}">
{{ $u->name }} ({{ $u->email }})
</option>
@endforeach
</select>
</div>
</div>
{{-- Usuário responsável --}}
<div class="col-12 col-md-6">
<div class="mb-3">
<label class="form-label">Usuário responsável (opcional)</label>
<select class="form-select" name="responsavel_user_id">
<option value="">Não vincular</option>
@foreach ($users ?? [] as $u)
<option value="{{ $u->id }}">
{{ $u->name }} ({{ $u->email }})
</option>
@endforeach
</select>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" data-bs-dismiss="modal">
Cancelar
</button>
<button class="btn btn-primary" type="submit">
Salvar Aluno
</button>
</div>
</form>
</div>
</div>
</div>
{{-- JS carregar turmas --}}
<script>
document.addEventListener('DOMContentLoaded', () => {
const modalEl = document.getElementById('modalAluno');
const escolaSelect = document.getElementById('id_escola');
const turmaSelect = document.getElementById('id_turma');
if (!modalEl || !escolaSelect || !turmaSelect) return;
let controller = null; // abort fetch anterior
function setTurmaOptions({
message = null,
turmas = []
} = {}) {
turmaSelect.innerHTML = '';
if (message) {
const opt = document.createElement('option');
opt.value = '';
opt.textContent = message;
turmaSelect.appendChild(opt);
turmaSelect.disabled = true;
return;
}
const opt0 = document.createElement('option');
opt0.value = '';
opt0.textContent = 'Selecione...';
turmaSelect.appendChild(opt0);
turmas.forEach(t => {
const opt = document.createElement('option');
opt.value = t.id;
opt.textContent = t.nome;
turmaSelect.appendChild(opt);
});
turmaSelect.disabled = turmas.length === 0;
if (turmas.length === 0) {
setTurmaOptions({
message: 'Nenhuma turma encontrada para esta escola.'
});
}
}
async function loadTurmas(escolaId) {
if (!escolaId) {
setTurmaOptions({
message: 'Selecione uma escola primeiro...'
});
return;
}
// cancela requisição anterior
if (controller) controller.abort();
controller = new AbortController();
setTurmaOptions({
message: 'Carregando turmas...'
});
try {
const resp = await fetch(`/api/escolas/${escolaId}/turmas`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
},
signal: controller.signal,
});
// se deu redirect/403/500 etc, não tenta parsear json
if (!resp.ok) {
throw new Error(`HTTP ${resp.status}`);
}
const turmas = await resp.json();
setTurmaOptions({
turmas
});
} catch (err) {
if (err.name === 'AbortError') return; // troca rápida de escola
console.error('Erro ao carregar turmas:', err);
setTurmaOptions({
message: 'Erro ao carregar turmas.'
});
}
}
// 1) carrega sempre ao abrir o modal (garante estabilidade)
modalEl.addEventListener('shown.bs.modal', () => {
loadTurmas(escolaSelect.value);
});
// 2) recarrega ao trocar escola
escolaSelect.addEventListener('change', () => {
loadTurmas(escolaSelect.value);
});
// 3) opcional: ao fechar modal, reseta turmas (evita “ficar antigo”)
modalEl.addEventListener('hidden.bs.modal', () => {
setTurmaOptions({
message: 'Selecione uma escola primeiro...'
});
});
});
</script>
<div class="modal fade" id="modalEnvio" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
@@ -454,21 +693,267 @@
</div>
</div>
<div class="modal fade" id="modalUsuario" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Novo Usuário</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form action="{{ route('usuarios.add') }}" method="POST">
@csrf
<div class="mb-3">
<label class="form-label">Nome</label>
<input class="form-control" name="name" required>
</div>
<div class="mb-3">
<label class="form-label">Email</label>
<input class="form-control" type="email" name="email" required>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Senha</label>
<input class="form-control" type="password" name="password" required>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Confirmar senha</label>
<input class="form-control" type="password" name="password_confirmation" required>
</div>
</div>
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" value="1" id="is_super_admin" name="is_super_admin">
<label class="form-check-label" for="is_super_admin">Super Admin</label>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Escola</label>
<select class="form-select" name="escola_id" id="escola_id_user">
<option value="">Selecione...</option>
@foreach($escolas as $escola)
<option value="{{ $escola->id }}">{{ $escola->nome }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Cargo</label>
<select class="form-select" name="role_name" id="role_name" disabled>
<option value="">Selecione uma escola primeiro...</option>
</select>
</div>
</div>
{{-- ALUNO: vínculo 1 aluno --}}
<div class="mb-3 d-none" id="box_aluno_unico">
<label class="form-label" id="label_aluno_unico">Qual aluno este usuário é?</label>
<select class="form-select" name="aluno_id" id="aluno_id" disabled>
<option value="">Selecione uma escola primeiro...</option>
</select>
</div>
{{-- RESPONSÁVEL: vínculo múltiplos alunos --}}
<div class="mb-3 d-none" id="box_alunos_responsavel">
<label class="form-label">Quais alunos este responsável representa?</label>
<select class="form-select" name="aluno_ids[]" id="aluno_ids" multiple disabled>
<option value="">Selecione uma escola primeiro...</option>
</select>
<small class="text-muted">
Segure <b>Ctrl</b> (Windows) ou <b>Cmd</b> (Mac) para selecionar mais de um.
</small>
</div>
<button class="btn btn-primary" type="submit">Criar usuário</button>
</form>
<script>
document.addEventListener('DOMContentLoaded', () => {
const escolaSelect = document.getElementById('escola_id_user');
const roleSelect = document.getElementById('role_name');
const superCheck = document.getElementById('is_super_admin');
const boxAlunoUnico = document.getElementById('box_aluno_unico');
const alunoSelect = document.getElementById('aluno_id');
const labelAlunoUnico = document.getElementById('label_aluno_unico');
const boxResp = document.getElementById('box_alunos_responsavel');
const alunosMulti = document.getElementById('aluno_ids');
const roleLabel = {
'coordenacao': 'Coordenação',
'secretaria': 'Secretaria',
'responsavel': 'Responsável',
'aluno': 'Aluno',
'representante_de_turma': 'Representante de Turma',
};
function resetSelect(select, msg) {
select.innerHTML = `<option value="">${msg}</option>`;
select.disabled = true;
}
function hideAllBindings() {
boxAlunoUnico.classList.add('d-none');
boxResp.classList.add('d-none');
alunoSelect.value = '';
alunosMulti.value = '';
resetSelect(alunoSelect, 'Selecione uma escola primeiro...');
resetSelect(alunosMulti, 'Selecione uma escola primeiro...');
}
async function loadRoles(escolaId) {
if (!escolaId) {
resetSelect(roleSelect, 'Selecione uma escola primeiro...');
return;
}
resetSelect(roleSelect, 'Carregando cargos...');
const resp = await fetch(`/api/escolas/${escolaId}/roles`, {
headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }
});
if (!resp.ok) {
resetSelect(roleSelect, 'Erro ao carregar cargos');
return;
}
const roles = await resp.json();
roleSelect.innerHTML = `<option value="">Selecione...</option>`;
roles.forEach(r => {
const opt = document.createElement('option');
opt.value = r.name;
opt.textContent = roleLabel[r.name] ?? r.name;
roleSelect.appendChild(opt);
});
roleSelect.disabled = false;
}
async function loadAlunos(escolaId, targetSelect, multiple = false) {
if (!escolaId) {
resetSelect(targetSelect, 'Selecione uma escola primeiro...');
return;
}
resetSelect(targetSelect, 'Carregando alunos...');
const resp = await fetch(`/api/escolas/${escolaId}/alunos`, {
headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }
});
if (!resp.ok) {
resetSelect(targetSelect, 'Erro ao carregar alunos');
return;
}
const alunos = await resp.json();
targetSelect.innerHTML = multiple
? '' // multi select não precisa placeholder fixo
: `<option value="">Selecione...</option>`;
alunos.forEach(a => {
const opt = document.createElement('option');
opt.value = a.id;
opt.textContent = a.nome;
targetSelect.appendChild(opt);
});
targetSelect.disabled = alunos.length === 0;
}
function toggleSuperAdmin(isSuper) {
if (isSuper) {
escolaSelect.value = '';
roleSelect.value = '';
resetSelect(roleSelect, 'Super Admin não usa cargo');
escolaSelect.disabled = true;
roleSelect.disabled = true;
hideAllBindings();
alunoSelect.disabled = true;
alunosMulti.disabled = true;
} else {
escolaSelect.disabled = false;
resetSelect(roleSelect, 'Selecione uma escola primeiro...');
roleSelect.disabled = true;
hideAllBindings();
}
}
superCheck.addEventListener('change', () => toggleSuperAdmin(superCheck.checked));
escolaSelect.addEventListener('change', async () => {
await loadRoles(escolaSelect.value);
hideAllBindings();
});
roleSelect.addEventListener('change', async () => {
const role = roleSelect.value;
// sempre reseta
hideAllBindings();
if (role === 'responsavel') {
boxResp.classList.remove('d-none');
await loadAlunos(escolaSelect.value, alunosMulti, true);
return;
}
if (role === 'aluno') {
labelAlunoUnico.textContent = 'Qual aluno este usuário é?';
boxAlunoUnico.classList.remove('d-none');
await loadAlunos(escolaSelect.value, alunoSelect, false);
return;
}
// (opcional) se representante também tiver vínculo com 1 aluno, habilite:
// if (role === 'representante_de_turma') { ... }
});
// estado inicial
toggleSuperAdmin(superCheck.checked);
});
</script>
</div>
</div>
</div>
</div>
<!-- latest jquery-->
<script src="{{ asset('assets/js/jquery-3.5.1.min.js')}}"></script>
<script src="{{ asset('assets/js/jquery-3.5.1.min.js') }}"></script>
<!-- feather icon js-->
<script src="{{ asset('assets/js/icons/feather-icon/feather.min.js')}}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather-icon.js')}}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather.min.js') }}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather-icon.js') }}"></script>
<!-- Sidebar jquery-->
<script src="{{ asset('assets/js/sidebar-menu.js')}}"></script>
<script src="{{ asset('assets/js/config.js')}}"></script>
<script src="{{ asset('assets/js/sidebar-menu.js') }}"></script>
<script src="{{ asset('assets/js/config.js') }}"></script>
<!-- Bootstrap js-->
<script src="{{ asset('assets/js/bootstrap/popper.min.js')}}"></script>
<script src="{{ asset('assets/js/bootstrap/bootstrap.min.js')}}"></script>
<script src="{{ asset('assets/js/bootstrap/popper.min.js') }}"></script>
<script src="{{ asset('assets/js/bootstrap/bootstrap.min.js') }}"></script>
<!-- Plugins JS start-->
<!-- Plugins JS Ends-->
<!-- Theme js-->
<script src="{{ asset('assets/js/script.js')}}"></script>
<script src="{{ asset('assets/js/script.js') }}"></script>
<!-- login js-->
<!-- Plugin used-->
<script src="{{ asset('assets/js/icons/icons-notify.js') }}"></script>
@@ -486,7 +971,7 @@
let ultimoCNPJ = '';
let timeout = null;
document.getElementById('cnpj').addEventListener('input', function () {
document.getElementById('cnpj').addEventListener('input', function() {
let cnpj = this.value.replace(/\D/g, '');
clearTimeout(timeout);
@@ -550,7 +1035,7 @@
});
</script>
<script>
document.getElementById('tipo_envio').addEventListener('change', function () {
document.getElementById('tipo_envio').addEventListener('change', function() {
const campoImagem = document.getElementById('campoImagem');
if (this.value === 'imagem') {
@@ -561,7 +1046,6 @@
});
</script>
</body>
</html>
</html>

View File

@@ -0,0 +1,40 @@
@extends('theme.default')
@section('title', 'Dashboard')
@section('title.page', 'Dashboard')
@section('title.page1', 'Escola da árvore')
@section('title.page2', 'Home')
@section('title.page3', 'Dashboard')
@section('content')
<div class="container-fluid user-card">
<div class="row">
@foreach ($usuarios as $usuario)
<div class="col-md-6 col-lg-6 col-xl-4 box-col-6">
<div class="card custom-card">
<div class="card-header"><img class="img-fluid" src="https://bucket.cciti.com.br/cae/images/banner_user.png" alt=""></div>
<div class="card-profile"><img class="rounded-circle" src="https://bucket.cciti.com.br/cae/images/logo3.png" alt=""></div>
<div class="text-center profile-details"><a href="user-profile.html">
<h4>{{ $usuario->name }}</h4>
</a>
<h6>{{$usuario->funcao()}}</h6>
</div>
<div class="card-footer row">
<div class="col-4 col-sm-4">
<h6>Follower</h6>
<h3 class="counter">9564</h3>
</div>
<div class="col-4 col-sm-4">
<h6>Following</h6>
<h3><span class="counter">49</span>K</h3>
</div>
<div class="col-4 col-sm-4">
<h6>Total Post</h6>
<h3><span class="counter">96</span>M</h3>
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
@endsection