forked from felipe.fontana/simples-painel
Felipe Fontana
10 months ago
18 changed files with 1082 additions and 7 deletions
@ -0,0 +1,171 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers\Admin; |
||||
|
||||
use App\Helpers\Helper; |
||||
use App\Http\Controllers\Controller; |
||||
use Illuminate\Http\Request; |
||||
use Illuminate\Support\Facades\Gate; |
||||
use App\Models\Types; |
||||
use App\Models\NumberChannel; |
||||
use App\Models\Horario; |
||||
use App\Models\Agentes; |
||||
use App\Models\Filas; |
||||
use App\Models\Redirect; |
||||
use Illuminate\Support\Facades\DB; |
||||
|
||||
class HorariosController extends Controller |
||||
{ |
||||
public function __construct( |
||||
protected Horario $horarioRepository, |
||||
protected Agentes $agenteRepository, |
||||
protected Filas $queueRepository, |
||||
protected Redirect $redirectRepository |
||||
) { |
||||
} |
||||
|
||||
public function index(Request $request) |
||||
{ |
||||
$user = auth()->user(); |
||||
if(Gate::forUser($user)->denies('show_redirect')){ |
||||
abort(404); |
||||
} |
||||
|
||||
$id_empresa = Helper::getEmpresas(); |
||||
|
||||
if (!is_int($id_empresa)){ |
||||
$empresasIds = $id_empresa->pluck('id')->toArray(); |
||||
} else { |
||||
$empresasIds = $id_empresa; |
||||
} |
||||
|
||||
$types = Types::all(); |
||||
$horarios = $this->horarioRepository->list(["id_empresa" => $empresasIds]); |
||||
$numberChannels = NumberChannel::whereIn('id_empresa', $empresasIds)->get(); |
||||
|
||||
return view('admin.cadastros.horarios', compact('horarios', 'numberChannels', 'types')); |
||||
} |
||||
|
||||
public function show(Request $request) |
||||
{ |
||||
$data = $request->all(); |
||||
$id_type = $request->segment(2); |
||||
|
||||
if (empty($id_type)) { |
||||
return response()->json(['data' => 'Parametro ID_TYPE é obrigatório']); |
||||
} |
||||
|
||||
$type = DB::table('types')->where([['id', $id_type], ['status', true]])->first(); |
||||
$typeName = $type->name; |
||||
$id_empresa = Helper::getIdEmpresa(); |
||||
$data = null; |
||||
switch ($typeName) { |
||||
case 'queue': |
||||
$data = $this->queueRepository->list(["id_empresa" => $id_empresa, "status" => true]); |
||||
break; |
||||
case 'redirect': |
||||
$data = $this->redirectRepository->list(["id_empresa" => $id_empresa]); |
||||
break; |
||||
case 'agent': |
||||
$data = $this->agenteRepository->list(["id_empresa" => $id_empresa, "status" => true]); |
||||
break; |
||||
default: |
||||
$data = null; |
||||
break; |
||||
} |
||||
|
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'data' => $data, |
||||
], |
||||
]; |
||||
|
||||
return response()->json($response); |
||||
} |
||||
|
||||
public function store(Request $request) |
||||
{ |
||||
$user = auth()->user(); |
||||
if(Gate::forUser($user)->denies('store_redirect')){ |
||||
abort(404); |
||||
} |
||||
|
||||
$request->validate([ |
||||
'id_number' => ['required'], |
||||
'nome' => ['required', 'string'], |
||||
'opcao_nao' => ['required'], |
||||
'acao_nao' => ['required'], |
||||
'status' => ['required'] |
||||
]); |
||||
|
||||
$status = $request->status === "on" ? true : false; |
||||
|
||||
$this->horarioRepository->create($request->id_number, strtoupper($request->nome), $request->opcao_nao, $request->acao_nao, $status); |
||||
|
||||
return redirect()->back()->with('status', 'Cadastrado com sucesso'); |
||||
} |
||||
|
||||
public function edit(Request $request) |
||||
{ |
||||
$id = $request->segment(2); |
||||
if (empty($id)) { |
||||
return response()->json(['data' => 'Parametro ID é obrigatório']); |
||||
} |
||||
|
||||
$optionData = Horario::find($id); |
||||
|
||||
$types = Types::all(); |
||||
|
||||
$id_empresa = Helper::getEmpresas(); |
||||
|
||||
if (!is_int($id_empresa)){ |
||||
$empresasIds = $id_empresa->pluck('id')->toArray(); |
||||
} else { |
||||
$empresasIds = $id_empresa; |
||||
} |
||||
|
||||
$numberChannels = NumberChannel::whereIn('id_empresa', $empresasIds)->get(); |
||||
|
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'option_data' => $optionData, |
||||
'types' => $types, |
||||
'numberChannels' => $numberChannels |
||||
], |
||||
]; |
||||
|
||||
return response()->json($response); |
||||
} |
||||
|
||||
|
||||
public function update(Request $request) |
||||
{ |
||||
$id = $request->segment(2); |
||||
if (!$id) { |
||||
return redirect()->back(); |
||||
} |
||||
|
||||
$request->validate([ |
||||
'id_number' => ['required'], |
||||
'nome' => ['required', 'string'], |
||||
'opcao_nao' => ['required'], |
||||
'acao_nao' => ['required'], |
||||
'status' => ['required'] |
||||
]); |
||||
|
||||
$status = $request->status === "on" ? true : false; |
||||
|
||||
Horario::where("id", $id) |
||||
->update([ |
||||
'id_number' => $request->id_number, |
||||
'nome' => $request->nome, |
||||
'opcao_nao' => $request->opcao_nao, |
||||
'acao_nao' => $request->acao_nao, |
||||
'status' => $status |
||||
]); |
||||
|
||||
return redirect()->back()->with('status', 'Atualizado com sucesso'); |
||||
} |
||||
} |
@ -0,0 +1,99 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers\Admin; |
||||
|
||||
use App\Helpers\Helper; |
||||
use App\Http\Controllers\Controller; |
||||
use App\Models\Agentes; |
||||
use App\Models\Filas; |
||||
use App\Models\Horario; |
||||
use App\Models\HorarioOption; |
||||
use App\Models\Types; |
||||
use App\Models\Redirect; |
||||
use Illuminate\Http\Request; |
||||
use Illuminate\Support\Facades\DB; |
||||
|
||||
class HorariosOptionController extends Controller |
||||
{ |
||||
public function __construct( |
||||
protected Agentes $agenteRepository, |
||||
protected Filas $queueRepository, |
||||
protected Horario $horarioRepository, |
||||
protected HorarioOption $horariosOptionsRepository, |
||||
protected Redirect $redirectRepository, |
||||
) { |
||||
} |
||||
|
||||
public function index($id) |
||||
{ |
||||
if (empty($id)) { |
||||
return redirect('horarios'); |
||||
} |
||||
$options = $this->horariosOptionsRepository->list(["id_redirect" => $id]); |
||||
$types = Types::all(); |
||||
$id_horario = $id; |
||||
|
||||
return view('admin.cadastros.horariosOption', compact('options', 'id_horario', 'types')); |
||||
} |
||||
|
||||
public function show(Request $request) |
||||
{ |
||||
$id_type = $request->segment(4); |
||||
|
||||
if (empty($id_type)) { |
||||
return response()->json(['data' => 'Parametro ID_TYPE é obrigatório']); |
||||
} |
||||
|
||||
$type = DB::table('types')->where([['id', $id_type], ['status', true]])->first(); |
||||
$typeName = $type->name; |
||||
$id_empresa = Helper::getIdEmpresa(); |
||||
$data = null; |
||||
switch ($typeName) { |
||||
case 'queue': |
||||
$data = $this->queueRepository->list(["id_empresa" => $id_empresa, "status" => true]); |
||||
break; |
||||
case 'redirect': |
||||
$data = $this->redirectRepository->list(["id_empresa" => $id_empresa]); |
||||
break; |
||||
case 'agent': |
||||
$data = $this->agenteRepository->list(["id_empresa" => $id_empresa, "status" => true]); |
||||
break; |
||||
default: |
||||
$data = null; |
||||
break; |
||||
} |
||||
|
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'data' => $data, |
||||
], |
||||
]; |
||||
|
||||
return response()->json($response); |
||||
} |
||||
|
||||
public function store(Request $request) |
||||
{ |
||||
$request->validate([ |
||||
'sequencia' => ['required'], |
||||
'type' => ['required'], |
||||
'destino' => ['required'], |
||||
'status' => ['required'], |
||||
]); |
||||
|
||||
$id = $request->destino; |
||||
if ($request->type == 3) { |
||||
$id = $this->agenteRepository->get(["id" => $request->destino])->matricula; |
||||
} |
||||
$hidden = $request->status === "on" ? false : true; |
||||
|
||||
$created = $this->horariosOptionsRepository->create($request->sequencia, $request->descricao, $request->id_redirect, $request->type, $id, $hidden, date("Y-m-d")); |
||||
if(!$created){ |
||||
redirect()->back()->with('status', 'Erro ao tentar cadastrar opção'); |
||||
} |
||||
|
||||
return redirect()->back()->with('status', 'Cadastrado com sucesso'); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,61 @@
|
||||
<?php |
||||
|
||||
namespace App\Models; |
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||
use Illuminate\Database\Eloquent\Model; |
||||
use Illuminate\Support\Facades\DB; |
||||
|
||||
class Horario extends Model |
||||
{ |
||||
use HasFactory; |
||||
|
||||
protected $table = "horarios"; |
||||
public $timestamps = false; |
||||
|
||||
protected $fillable = [ |
||||
'id_number', |
||||
'nome', |
||||
'opcao_nao', |
||||
'acao_nao', |
||||
'status', |
||||
]; |
||||
|
||||
public function list(array $params) |
||||
{ |
||||
$horarios = DB::table('horarios as h') |
||||
->join('number_channel as nc', 'nc.id', '=', 'h.id_number') |
||||
->select('h.*'); |
||||
|
||||
if (is_array($params['id_empresa'])) { |
||||
$horarios->whereIn('nc.id_empresa', $params['id_empresa']); |
||||
} else { |
||||
$horarios->where('nc.id_empresa', $params['id_empresa']); |
||||
} |
||||
|
||||
if(isset($params['id_number'])){ |
||||
$horarios->where('h.id_number', $params['id_number']); |
||||
} |
||||
|
||||
if(isset($params['nome'])){ |
||||
$horarios->where('h.nome', $params['nome']); |
||||
} |
||||
|
||||
if(isset($params['status'])){ |
||||
$horarios->where('h.status', $params['status']); |
||||
} |
||||
|
||||
return $horarios->get(); |
||||
} |
||||
|
||||
public function create(int $id_number, string $nome, string $opcao_nao, string $acao_nao, bool $status) |
||||
{ |
||||
DB::table('horarios')->insert([ |
||||
'id_number' => $id_number, |
||||
'nome' => strtoupper($nome), |
||||
'opcao_nao' => $opcao_nao, |
||||
'acao_nao' => $acao_nao, |
||||
'status' => $status |
||||
]); |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
<?php |
||||
|
||||
namespace App\Models; |
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||
use Illuminate\Database\Eloquent\Model; |
||||
use Illuminate\Support\Facades\DB; |
||||
|
||||
class HorarioOption extends Model |
||||
{ |
||||
use HasFactory; |
||||
|
||||
protected $table = "horarios_itens"; |
||||
public $timestamps = false; |
||||
|
||||
protected $fillable = [ |
||||
'horario_inicio', |
||||
'horario_fim', |
||||
'todos_dias_semana', |
||||
'semana', |
||||
'semana_fim', |
||||
'todos_dias_mes', |
||||
'dias_mes', |
||||
'dias_mes_fim', |
||||
'todos_mes', |
||||
'mes', |
||||
'mes_fim', |
||||
'opcao', |
||||
'acao', |
||||
'feriado' |
||||
]; |
||||
|
||||
public function list(array $params) |
||||
{ |
||||
$options = DB::table('horarios_itens as hi') |
||||
->join("horarios as h", "h.id", "=", "hi.id_horario") |
||||
->select("hi.*", "h.nome as horario_nome"); |
||||
|
||||
if (isset($params['id_horario'])) { |
||||
$options->where('hi.id_horario', $params['id_horario']); |
||||
} |
||||
|
||||
return $options->orderBy('id', 'asc')->get(); |
||||
} |
||||
|
||||
public function create(string|int $sequence, string $description, string|int $id_redirect, string|int $id_type, string|int $code_id, bool $hide, string $data_reg) |
||||
{ |
||||
DB::beginTransaction(); |
||||
try { |
||||
DB::table("redirect_option")->insert([ |
||||
'sequence' => $sequence, |
||||
'description' => $description, |
||||
'id_redirect' => $id_redirect, |
||||
'id_type' => $id_type, |
||||
'code_id' => $code_id, |
||||
'hide' => $hide, |
||||
'data_reg' => $data_reg |
||||
]); |
||||
|
||||
DB::commit(); |
||||
return true; |
||||
} catch (\Throwable $th) { |
||||
DB::rollBack(); |
||||
return false; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@
|
||||
function atualizaHorarios(horario_id) { |
||||
$.ajax({ |
||||
type: "get", |
||||
url: `horarios/${horario_id}/edit`, |
||||
success: async function({ |
||||
data |
||||
}) { |
||||
const option_data = data.option_data; |
||||
const types = data.types; |
||||
const channels = data.numberChannels; |
||||
const modal = document.querySelector('.modal-edit'); |
||||
modal.style.display = 'block'; |
||||
modal.querySelector("input[name='nome']").value = option_data.nome; |
||||
modal.querySelector('form').action = `horarios/${horario_id}`; |
||||
if (option_data.status) { |
||||
modal.querySelector(".container-radio").innerHTML = |
||||
`<input type='radio' name='status' checked value='on'> <span class='mr-3 dark:text-gray-100'>Sim</span>
|
||||
<input type='radio' name='status' value='off'> <span class='mr-3 dark:text-gray-100'>Não</span>` |
||||
} else { |
||||
modal.querySelector(".container-radio").innerHTML = |
||||
`<input type='radio' name='status' value='off'> <span class='mr-3 dark:text-gray-100'>Sim</span>
|
||||
<input type='radio' name='status' checked value='off'> <span class='mr-3 dark:text-gray-100'>Não</span>`; |
||||
} |
||||
let containerTypes = ''; |
||||
types.forEach(type => { |
||||
if (option_data.opcao_nao == type.id) { |
||||
containerTypes += |
||||
` <option value="${type.id}" selected>${type.name}</option>` |
||||
} else { |
||||
containerTypes += |
||||
` <option value="${type.id}">${type.name}</option>` |
||||
} |
||||
}); |
||||
modal.querySelector(".select-types").innerHTML = containerTypes; |
||||
|
||||
let containerChannels = ''; |
||||
channels.forEach(channel => { |
||||
if (option_data.id_number === channel.id) { |
||||
containerChannels += |
||||
` <option value="${channel.id}" selected>${channel.name}</option>` |
||||
} else { |
||||
containerChannels += |
||||
` <option value="${channel.id}">${channel.name}</option>` |
||||
} |
||||
}); |
||||
modal.querySelector(".select-channels").innerHTML = containerChannels; |
||||
montaSelectDestino(option_data.opcao_nao, modal, option_data.acao_nao); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
document.querySelectorAll('.select-types').forEach(el => { |
||||
el.addEventListener('change', (e) => { |
||||
const select = e.target; |
||||
const modal = select.closest('.modal') ?? select.closest('.modal-edit'); |
||||
const id_redirect = select.value; |
||||
montaSelectDestino(id_redirect, modal); |
||||
}) |
||||
}) |
@ -0,0 +1,35 @@
|
||||
async function montaSelectDestino(id_type, modal, code_id = null) { |
||||
const data = await requestType(id_type); |
||||
const selectDestino = modal.querySelector(".select-destino"); |
||||
const inputDestino = modal.querySelector(".input-destino"); |
||||
if (!data) { |
||||
selectDestino.style.display = 'none'; |
||||
selectDestino.disabled = true; |
||||
inputDestino.disabled = false; |
||||
inputDestino.style.display = 'block'; |
||||
|
||||
return; |
||||
} |
||||
selectDestino.style.display = 'block'; |
||||
selectDestino.disabled = false; |
||||
inputDestino.disabled = true; |
||||
inputDestino.style.display = 'none'; |
||||
let selectElements = ""; |
||||
if (code_id) { |
||||
data.forEach(element => { |
||||
let matriculaOrId = element.matricula ?? element.id; |
||||
if (matriculaOrId.toString() === code_id.toString()) { |
||||
selectElements += |
||||
` <option value="${element.id}" selected>${element.name ?? element.nome}</option>` |
||||
} else { |
||||
selectElements += |
||||
` <option value="${element.id}">${element.name ?? element.nome}</option>` |
||||
} |
||||
}) |
||||
} else { |
||||
data.forEach(element => { |
||||
selectElements += `<option value="${element.id}">${element.name ?? element.nome}</option>` |
||||
}); |
||||
} |
||||
selectDestino.innerHTML = selectElements; |
||||
} |
@ -0,0 +1,13 @@
|
||||
function requestType(id_type) { |
||||
return new Promise(function(resolve, reject) { |
||||
$.ajax({ |
||||
type: "get", |
||||
dataType: 'json', |
||||
url: `horarios/${id_type}`, |
||||
success: function(response) { |
||||
const data = response.data.data; |
||||
resolve(data); |
||||
} |
||||
}); |
||||
}); |
||||
} |
@ -0,0 +1,101 @@
|
||||
<?php |
||||
$tipos = [ |
||||
1 => 'QUEUE', |
||||
2 => 'REDIRECT', |
||||
3 => 'AGENT', |
||||
4 => 'TEXT' |
||||
]; |
||||
?> |
||||
<x-app-layout> |
||||
<div class="py-8 px-8"> |
||||
@if (session('status')) |
||||
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg"> |
||||
{{ session('status') }} |
||||
</div> |
||||
@endif |
||||
<div class="header flex flex-col items-center gap-4 mt-2 mb-8"> |
||||
<div class="flex justify-between items-center w-full mb-5"> |
||||
<h1 class=" text-gray-900 dark:text-gray-100 text-3xl font-bold text-center"> |
||||
Horários |
||||
</h1> |
||||
@can('store_redirect') |
||||
<button |
||||
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-base overflow-hidden" |
||||
@click="modal = !modal" type="button">Cadastrar Horários</button> |
||||
@endcan |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="body mt-4 overflow-auto rounded-lg shadow"> |
||||
<table class="w-full"> |
||||
<thead class="bg-gray-50 dark:bg-gray-700 dark:text-gray-100"> |
||||
<tr> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left ">ID</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Nome</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">ID Canal</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Opção Fora de Horário</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Ação</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Status</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Opções</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Ações</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
@foreach ($horarios as $horario) |
||||
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2"> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $horario->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $horario->nome }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $horario->id_number }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $tipos[$horario->opcao_nao] }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $horario->acao_nao }}</td> |
||||
@if ($horario->status) |
||||
<td class="p-3 text-sm text-green-500 font-bold">ATIVO</td> |
||||
@else |
||||
<td class="p-3 text-sm text-red-500 font-bold">DESATIVADO</td> |
||||
@endif |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
@can('show_redirect_option') |
||||
<a |
||||
href="{{ route('horarios.options.index', ['horario' => $horario->id]) }}" |
||||
class="text-blue-500 hover:underline">Editar Opções</a> |
||||
@endcan |
||||
</td> |
||||
<td class="p-3 text-sm font-bold flex-wrap w-32"> |
||||
@can('edit_redirect') |
||||
<button class="bg-blue-600 text-white p-2 rounded text-lg w-full mb-2" title="editar horário" |
||||
onclick="atualizaHorarios( {{ $horario->id }})"><i |
||||
class="fas fa-edit"></i></button> |
||||
@endcan |
||||
@can('destroy_redirect') |
||||
<form method="POST" |
||||
action="{{ route('redirects.destroy', ['redirect' => $horario->id]) }}" |
||||
class="flex-1 flex" title="deletar horário" |
||||
onclick="javascript: if(!confirm('Deseja deletar esses dados?')) return false;"> |
||||
@csrf |
||||
@method('delete') |
||||
<button class="bg-red-600 text-white p-2 rounded text-lg w-full"> |
||||
<i class="fas fa-trash"></i> |
||||
</button> |
||||
</form> |
||||
@endcan |
||||
</td> |
||||
</tr> |
||||
@endforeach |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</div> |
||||
<x-modal.insert.modalHorarios :types="$types" :numberChannels="$numberChannels"></x-modalHorarios> |
||||
<x-modal.edit.modalEditHorarios :types="$types" :numberChannels="$numberChannels"></x-modalEditHorarios> |
||||
|
||||
<script src="{{ asset('js/views/horarios/montaSelect.js') }}"></script> |
||||
<script src="{{ asset('js/views/horarios/requestType.js') }}"></script> |
||||
<script src="{{ asset('js/views/horarios/atualizaHorarios.js') }}"></script> |
||||
|
||||
<script> |
||||
const modal = document.querySelector(".modal"); |
||||
const id_type = 1; |
||||
|
||||
montaSelectDestino(id_type, modal); |
||||
</script> |
||||
</x-app-layout> |
@ -0,0 +1,99 @@
|
||||
<x-app-layout> |
||||
<div class="py-8 px-8"> |
||||
<a href="{{ route('horarios.index') }}" style="margin-right: auto;" |
||||
class="text-blue-500 hover:underline mb-5 block">Voltar</a> |
||||
|
||||
@if (session('status')) |
||||
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg alert"> |
||||
{{ session('status') }} |
||||
</div> |
||||
@endif |
||||
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg alert hidden act"> |
||||
|
||||
</div> |
||||
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg "> |
||||
<div class="p-6 text-gray-900 dark:text-gray-100"> |
||||
|
||||
<div class="flex items-center"> |
||||
<div> |
||||
<h1 class="text-2xl font-bold">Horários Disponíveis</h1> |
||||
</div> |
||||
@can('store_redirect_option') |
||||
<button class="ml-auto mt-2 bg-blue-600 text-white py-2 px-6 rounded-md text-lg" |
||||
@click="modal = !modal">Adicionar</button> |
||||
@endcan |
||||
</div> |
||||
|
||||
<div class="body mt-4 overflow-auto rounded-lg shadow"> |
||||
<table class="w-full"> |
||||
<thead class="bg-gray-50 dark:bg-gray-700 dark:text-gray-100"> |
||||
<tr> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center">Feriado</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="2">Horário</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="3">Dia da Semana</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="3">Dia do Mês</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="3">Meses</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="2">Caso Combine</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center">Ações</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2"> |
||||
<td></td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Início</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Todos</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Inicio</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Todos</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Inicio</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Todos</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Inicio</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Opção</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Ação</td> |
||||
<td></td> |
||||
</tr> |
||||
</tbody> |
||||
|
||||
@foreach ($options as $option) |
||||
<tbody> |
||||
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2"> |
||||
<td>{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td> |
||||
<td>{{ $option->id }}</td> |
||||
</tr> |
||||
</tbody> |
||||
@endforeach |
||||
</table> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<x-modal.insert.modalHorariosOption :id_horario="$id_horario" :types="$types"></x-modalHorarioOption> |
||||
|
||||
<script src="{{ asset('js/views/redirectOption/atualizaRedirectOption.js') }}"></script> |
||||
<script src="{{ asset('js/views/redirectOption/montaSelect.js') }}"></script> |
||||
<script src="{{ asset('js/views/redirectOption/requestType.js') }}"></script> |
||||
|
||||
<script> |
||||
const modal = document.querySelector(".modal"); |
||||
const id_type = 1; |
||||
|
||||
montaSelectDestino(id_type, modal); |
||||
</script> |
||||
</x-app-layout> |
@ -0,0 +1,77 @@
|
||||
@props(['types', 'numberChannels']) |
||||
|
||||
<!-- Main modal --> |
||||
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal-edit"> |
||||
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]"> |
||||
<!-- Modal content --> |
||||
<form method="POST" action="" class="relative bg-white rounded-lg shadow dark:bg-gray-700" |
||||
id="formRedirectOptionEdit"> |
||||
@method("PUT") |
||||
@csrf |
||||
<!-- Modal header --> |
||||
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4"> |
||||
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3"> |
||||
Editar Horário |
||||
</h3> |
||||
<button type="button" |
||||
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" |
||||
@click="modal = false" onclick="fecharModal()"> |
||||
<i class="fas fa-times"></i> |
||||
</button> |
||||
</div> |
||||
<!-- Modal body --> |
||||
<div class="p-6 space-y-6"> |
||||
<div class="flex flex-col gap-5"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Nome: </label> |
||||
<input type="text" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" |
||||
placeholder="Digite o nome: " name="nome"> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Canal: </label> |
||||
<select |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-channels" |
||||
name="id_number"> |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Opção fora de Horário: </label> |
||||
<select |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-types" |
||||
name="opcao_nao"> |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o destino: </label> |
||||
<select |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-destino" |
||||
name="acao_nao"> |
||||
</select> |
||||
<input type="text" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-destino hidden" |
||||
placeholder="Digite o texto destino: " name="acao_nao"> |
||||
</div> |
||||
<div> |
||||
<label for="" class="dark:text-gray-100 block">Ativo: </label> |
||||
<div class="container-radio"> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- Modal footer --> |
||||
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600"> |
||||
<button type="submit" |
||||
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg btn-sub">Editar</button> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
<script> |
||||
function fecharModal() { |
||||
$('.modal-edit').hide(); |
||||
$('.modal-edit').find('input.sequence').removeClass('border-red-500 border-2'); |
||||
$('.modal-edit').find('.text-problem').addClass('hidden'); |
||||
} |
||||
</script> |
@ -0,0 +1,78 @@
|
||||
@props(['numberChannels', 'types']) |
||||
<!-- Main modal --> |
||||
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal" :class="{ 'block': modal, 'hidden': !modal }"> |
||||
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]"> |
||||
<!-- Modal content --> |
||||
<form method="POST" action="{{ route('horarios.store') }}" |
||||
class="relative bg-white rounded-lg shadow dark:bg-gray-700" > |
||||
|
||||
@csrf |
||||
<!-- Modal header --> |
||||
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4"> |
||||
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3"> |
||||
Cadastrar Horarios |
||||
</h3> |
||||
<button type="button" |
||||
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" |
||||
@click="modal = false"> |
||||
<i class="fas fa-times"></i> |
||||
</button> |
||||
</div> |
||||
<!-- Modal body --> |
||||
<div class="p-6 space-y-6"> |
||||
<div class="flex flex-col gap-3"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Nome: </label> |
||||
<input type="text" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" |
||||
placeholder="Digite o nome: " name="nome"> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o canal: </label> |
||||
<select |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" |
||||
name="id_number"> |
||||
@foreach ($numberChannels as $numberChannel) |
||||
<option value="{{ $numberChannel->id }}">{{ $numberChannel->title }}</option> |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Opção fora de Horário: </label> |
||||
<select |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-types" |
||||
name="opcao_nao"> |
||||
@foreach ($types as $type) |
||||
<option value="{{ $type->id }}"class="uppercase">{{ $type->name }}</option> |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o destino: </label> |
||||
<select |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-destino" |
||||
name="acao_nao"> |
||||
</select> |
||||
<input type="text" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-destino" |
||||
placeholder="Digite o texto destino: " name="acao_nao"> |
||||
</div> |
||||
<div > |
||||
<label for="" class="dark:text-gray-100 block">Ativo: </label> |
||||
<div class="container-radio"> |
||||
<input type="radio" name="status" checked value="on"> <span |
||||
class="mr-3 dark:text-gray-100">Sim</span> |
||||
<input type="radio" name="status" value="off"> <span |
||||
class="dark:text-gray-100">Não</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- Modal footer --> |
||||
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600"> |
||||
<button type="submit" |
||||
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Cadastrar</button> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
@ -0,0 +1,177 @@
|
||||
@props(['id_horario', 'types']) |
||||
<?php |
||||
$semana = [ |
||||
1 => 'Domingo', |
||||
2 => 'Segunda', |
||||
3 => 'Terça', |
||||
4 => 'Quarta', |
||||
5 => 'Quinta', |
||||
6 => 'Sexta', |
||||
7 => 'Sábado' |
||||
]; |
||||
|
||||
$meses = [1 => 'Janeiro', 2 => 'Fevereiro', 3 => 'Março', 4 => 'Abril', 5 => 'Maio', 6 => 'Junho', 7 => 'Julho', 8 => 'Agosto', 9 => 'Setembro', 10 => 'Outubro', 11 => 'Novembro', 12 => 'Dezembro']; |
||||
?> |
||||
<!-- Main modal --> |
||||
<div class="flex z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal" :class="{ 'block': modal, 'hidden': !modal }"> |
||||
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]"> |
||||
<!-- Modal content --> |
||||
<form method="POST" action="{{ route('horarios.options.store', ['horario' => $id_horario]) }}" |
||||
class="relative bg-white rounded-lg shadow dark:bg-gray-700 id="formRedirectOption"> |
||||
@csrf |
||||
<!-- Modal header --> |
||||
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4"> |
||||
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3"> |
||||
Cadastrar |
||||
</h3> |
||||
<button type="button" |
||||
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" |
||||
@click="modal = false"> |
||||
<i class="fas fa-times"></i> |
||||
</button> |
||||
</div> |
||||
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0"> |
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0"> |
||||
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900 border"> |
||||
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="50%" valign="top"> |
||||
<fieldset> |
||||
<legend class="dark:text-gray-100">Horário: </legend> |
||||
Início |
||||
<input class="dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-inicio" name="horario_inicio" type="text" id="horario_inicio" size="5" maxlength="5" value="08:00"/> |
||||
Fim |
||||
<input class="dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-fim" name="horario_fim" type="text" id="horario_fim" value="17:59" size="5" maxlength="5"/> |
||||
</fieldset> |
||||
</td> |
||||
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="50%" valign="top"> |
||||
<fieldset> |
||||
<legend class="dark:text-gray-100">Feriado: </legend> |
||||
<span> |
||||
Sim<input name="feriado" type="radio" id="feriado_sim" value="Sim" /> |
||||
Não<input name="feriado" type="radio" id="feriado_nao" value="Nao" checked="checked" /> |
||||
</span> |
||||
</fieldset> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<tr class="bg-white dark:bg-gray-700"> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0"> |
||||
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900 border"> |
||||
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="33%" valign="top"> |
||||
<fieldset> |
||||
<label class="dark:text-gray-100">Dia da Semana: </label> |
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0"> |
||||
<tr class="bg-white dark:bg-gray-700"> |
||||
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" colspan="2"> |
||||
<input name="todos_dias_semana" type="radio" id="todos_dias_semana" value="Sim" checked/> |
||||
Todos |
||||
<label><input name="todos_dias_semana" type="radio" value="Não"/>Intervalo </label> |
||||
</td> |
||||
</tr> |
||||
<tr class="bg-white dark:bg-gray-700"> |
||||
<td class="p-3 text-sm text-gray-780 dark:text-gray-100"> |
||||
<fieldset> |
||||
<label class="dark:text-gray-100">Inicio: </label> |
||||
<select class="w-45 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_semana" size="1" id="dias_semana" disabled="disabled"> |
||||
@for ($i = 1; $i <= 7; $i++) |
||||
<option value="{{ $i }}">{{ $semana[$i] }}</option> |
||||
@endfor |
||||
</select> |
||||
</fieldset> |
||||
</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100" width="50%"> |
||||
<fieldset> |
||||
<label class="dark:text-gray-100">Fim: </label> |
||||
<select class="w-45 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_semana_fim" size="1" id="dias_semana_fim" disabled="disabled"> |
||||
@for ($i = 1; $i <= 7; $i++) |
||||
<option value="{{ $i }}">{{ $semana[$i] }}</option> |
||||
@endfor |
||||
</select> |
||||
</fieldset> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</fieldset> |
||||
</td> |
||||
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="33%" valign="top"> |
||||
<fieldset> |
||||
<label class="dark:text-gray-100">Dia do Mês: </label> |
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0"> |
||||
<tr class="bg-white dark:bg-gray-700"> |
||||
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" colspan="2"> |
||||
<input name="todos_dias_mes" type="radio" id="todos_dias_mes" value="Sim" checked/> |
||||
Todos |
||||
<label><input name="todos_dias_mes" type="radio" value="Não"/>Intervalo </label> |
||||
</td> |
||||
</tr> |
||||
<tr class="bg-white dark:bg-gray-700"> |
||||
<td class="p-3 text-sm text-gray-780 dark:text-gray-100"> |
||||
<fieldset> |
||||
<label class="dark:text-gray-100">Inicio: </label> |
||||
<select class="w-10 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_mes" size="1" id="dias_mes" disabled="disabled"> |
||||
@for ($i = 1; $i <= 31; $i++) |
||||
<option value="{{ $i }}">{{ $i }}</option> |
||||
@endfor |
||||
</select> |
||||
</fieldset> |
||||
</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100" width="50%"> |
||||
<fieldset> |
||||
<label class="dark:text-gray-100">Fim: </label> |
||||
<select class="w-10 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_mes_fim" size="1" id="dias_mes_fim" disabled="disabled"> |
||||
@for ($i = 1; $i <= 31; $i++) |
||||
<option value="{{ $i }}">{{ $i }}</option> |
||||
@endfor |
||||
</select> |
||||
</fieldset> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</fieldset> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</td> |
||||
</tr> |
||||
<tr> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0"> |
||||
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900 border"> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
<table cellpadding="0" cellspacing="0" border="0"> |
||||
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900"> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
<fieldset> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o tipo: </label> |
||||
<select class="w-48 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-types" name="type"> |
||||
@foreach ($types as $type) |
||||
<option value="{{ $type->id }}" class="uppercase">{{ $type->name }}</option> |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o destino: </label> |
||||
<select class="w-48 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-destino" name="destino"></select> |
||||
<input type="text" class="w-48 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-destino" placeholder="Digite o texto destino: " name="destino"> |
||||
</div> |
||||
</fieldset> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
<!-- Modal footer --> |
||||
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600"> |
||||
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg btn-sub"> |
||||
Cadastrar |
||||
</button> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
Loading…
Reference in new issue