Browse Source

Crud para number channel, e correção do bug ao passar o number channel para conectar no client

Felipe
Felipe Fontana 10 months ago
parent
commit
25a4411a76
  1. 15
      app/Http/Controllers/Admin/ConectarAgenteController.php
  2. 132
      app/Http/Controllers/Admin/NumberChannelController.php
  3. 3
      app/Http/Controllers/Admin/TemplatesController.php
  4. 67
      app/Models/NumberChannel.php
  5. 2
      app/Traits/AuthToken.php
  6. 29
      public/js/views/channels/atualizaChannel.js
  7. 3
      public/js/views/templates/cadastroTemplates.js
  8. 95
      resources/views/admin/cadastros/channels.blade.php
  9. 2
      resources/views/admin/cadastros/templates.blade.php
  10. 21
      resources/views/admin/conectarAgente/conectarAgente.blade.php
  11. 66
      resources/views/components/modal/edit/modalEditChannels.blade.php
  12. 64
      resources/views/components/modal/insert/modalChannels.blade.php
  13. 9
      resources/views/layouts/menu.blade.php
  14. 7
      routes/web.php

15
app/Http/Controllers/Admin/ConectarAgenteController.php

@ -25,12 +25,15 @@ class ConectarAgenteController extends Controller
public function index(){
$idEmpresa = Helper::getIdEmpresa();
$filas = $this->queueRepository->list(["id_empresa" => $idEmpresa, "status" => true]);
$channels = $this->numberChannelRepository->list(["id_empresa" => $idEmpresa, "status" => true]);
$channels = count($channels) > 1 ? $channels : null;
return view("admin.conectarAgente.conectarAgente", compact('filas'));
return view("admin.conectarAgente.conectarAgente", compact('filas', 'channels'));
}
public function conectar(Request $request){
$queueId = $request->queue_id;
if(empty($queueId)){
return response()->json("Parametro id é obrigatório", 404);
}
@ -42,11 +45,16 @@ class ConectarAgenteController extends Controller
$user = Auth::user();
if(empty($user)){
return response()->json("Usuário não foi encontrada", 404);
return response()->json("Usuário não foi encontrado", 404);
}
$idEmpresa = Helper::getIdEmpresa();
$numberChannelId = $this->numberChannelRepository->where('id_empresa', $idEmpresa)->first();
if ($request->channel_id) {
$numberChannelId = $request->channel_id;
} else {
$numberChannelId = $this->numberChannelRepository->where('id_empresa', $idEmpresa)->where('status', true)->value('id');
}
if(empty($numberChannelId)){
return response()->json("Numberchannel não foi encontrado", 404);
}
@ -54,6 +62,7 @@ class ConectarAgenteController extends Controller
$tokenDB = $this->getToken($user->id);
$info = [
"id_empresa" => $idEmpresa,
"id_number" => $numberChannelId,
"fila" => $queueId,
"servidor" => env('APP_URL'),
"websocket" => env('APP_URL_WEBSOCKET'),

132
app/Http/Controllers/Admin/NumberChannelController.php

@ -0,0 +1,132 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\NumberChannel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
class NumberChannelController extends Controller
{
public function __construct(
protected NumberChannel $numberChannelRepository,
) {
}
public function index(Request $request)
{
$user = auth()->user();
if(Gate::forUser($user)->denies('show_channels')){
abort(404);
}
$id_empresa = Helper::getIdEmpresa();
$search = strtolower($request->pesquisa);
$status = $request->status === "desativado" ? false : true;
$channels = $this->numberChannelRepository->list(["id_empresa" => $id_empresa, "status" => $status, "search" => $search]);
return view('admin.cadastros.channels', compact('channels', 'status', 'search'));
}
public function store(Request $request)
{
$user = auth()->user();
if(Gate::forUser($user)->denies('store_channels')){
abort(404);
}
$request->validate([
'name' => ['required'],
'id_empresa' => ['required'],
'number' => ['required'],
'token' => ['required'],
'channel' => ['required'],
'work_space' => ['required'],
'title' => ['required'],
]);
$status = $request->status === 'on' ? true : false;
$created = $this->numberChannelRepository->create($request->name, $request->id_empresa, $request->number, $request->token, $request->channel, $request->work_space, $request->title, $status);
if(!$created){
return redirect()->back()->with('status', 'Erro ao tentar criar channel');
}
return redirect()->back()->with('status', ' Cadastrado com sucesso');
}
public function edit($id)
{
$user = auth()->user();
if(Gate::forUser($user)->denies('edit_channels')){
abort(404);
}
if (empty($id)) {
return redirect('channels');
}
$channelData = NumberChannel::find($id);
$response = [
'status' => true,
'data' => $channelData
];
return response()->json($response);
}
public function destroy($id)
{
$user = auth()->user();
if(Gate::forUser($user)->denies('destroy_channels')){
abort(404);
}
if (empty($id)) {
return redirect('channels');
}
NumberChannel::where('id', $id)->update([
"status" => false
]);
return redirect('channels')->with('status', 'desativado com sucesso');
}
public function update(Request $request, $id)
{
$user = auth()->user();
if(Gate::forUser($user)->denies('update_channels')){
abort(404);
}
$request->validate([
'name' => ['required'],
'id_empresa' => ['required'],
'number' => ['required'],
'token' => ['required'],
'channel' => ['required'],
'work_space' => ['required'],
'title' => ['required'],
]);
$status = $request->status === "on" ? true : false;
NumberChannel::where("id", $id)->update([
'name' => $request->name,
'id_empresa' => $request->id_empresa,
'number' => $request->number,
'token' => $request->token,
'channel' => $request->channel,
'work_space' => $request->work_space,
'title' => $request->title,
'status' => $status,
]);
return redirect('channels')->with('status', 'atualizado com sucesso');
}
}

3
app/Http/Controllers/Admin/TemplatesController.php

@ -22,8 +22,9 @@ class TemplatesController extends Controller
$channel_token = session('channel_token');
$channel_number = session('channel_number');
$workspace = session('workspace');
return view("admin.cadastros.templates", ["channel_token" => $channel_token, "channel_number" => $channel_number]);
return view("admin.cadastros.templates", ["channel_token" => $channel_token, "channel_number" => $channel_number, "workspace" => $workspace]);
}
public function show()

67
app/Models/NumberChannel.php

@ -5,7 +5,7 @@ namespace App\Models;
use App\Helpers\Helper;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class NumberChannel extends Model
{
use HasFactory;
@ -22,6 +22,64 @@ class NumberChannel extends Model
'title'
];
public function get(array $params)
{
$channels = DB::table('number_channel as nc')
->join('empresa as e', 'e.id', '=', 'nc.id_empresa')
->select('nc.*');
if (isset($params['id_empresa'])) {
$channels->where('nc.id_empresa', $params['id_empresa']);
}
return $channels->orderBy('nc.name', 'asc')->first();
}
public function list(array $params)
{
$channels = DB::table('number_channel as nc')
->join('empresa as e', 'e.id', '=', 'nc.id_empresa')
->select('nc.*');
if (isset($params['id_empresa'])) {
$channels->where('nc.id_empresa', $params['id_empresa']);
}
if (isset($params['search'])) {
$channels->where(DB::raw('LOWER(nc.name)'), 'LIKE', "%{$params['search']}%");
}
if (isset($params['status'])) {
$channels->where('nc.status', $params['status']);
}
return $channels->orderBy('nc.name', 'asc')->get();
}
public function create(string $name, int $id_empresa, string $number, string $token, string $chanel, string $work_space, string $title, bool $status)
{
DB::beginTransaction();
try {
DB::table('number_channel')->insert([
'name' => $name,
'id_empresa' => $id_empresa,
'number' => $number,
'token' => $token,
'channel' => $chanel,
'work_space' => $work_space,
'title' => $title,
'status' => $status,
]);
DB::commit();
return true;
} catch (\Throwable $th) {
DB::rollBack();
return false;
}
}
public static function getToken(){
$id_empresa = Helper::getIdEmpresa();
$token = NumberChannel::where("id_empresa", $id_empresa)->first()->token;
@ -35,4 +93,11 @@ class NumberChannel extends Model
return $number;
}
public static function getWorkspace(){
$id_empresa = Helper::getIdEmpresa();
$workspace = NumberChannel::where("id_empresa", $id_empresa)->first()->work_space;
return $workspace;
}
}

2
app/Traits/AuthToken.php

@ -25,8 +25,10 @@ trait AuthToken
$token = NumberChannel::getToken();
$number = NumberChannel::getNumber();
$workspace = NumberChannel::getWorkspace();
session()->put('channel_token', $token);
session()->put('channel_number', $number);
session()->put('workspace', $workspace);
return $responseDecode;
}

29
public/js/views/channels/atualizaChannel.js

@ -0,0 +1,29 @@
function atualizaChannel(id_channel) {
$.ajax({
type: "get",
url: `channels/editar/${id_channel}`,
success: function ({
data
}) {
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector('form').action = `/channels/editar/${data.id}`;
modal.querySelector("input[name='name']").value = data.name;
modal.querySelector("input[name='id_empresa']").value = data.id_empresa;
modal.querySelector("input[name='number']").value = data.number;
modal.querySelector("input[name='token']").value = data.token;
modal.querySelector("select[name='channel']").value = data.channel;
modal.querySelector("input[name='work_space']").value = data.work_space;
modal.querySelector("input[name='title']").value = data.title;
const containerCheckbox = modal.querySelector(".container-checkbox");
if (!data.status) {
containerCheckbox.innerHTML = `<input type="radio" name="status" value="on"> <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off" checked> <span class="dark:text-gray-100">Não</span>`
}
}
});
}
function fecharModal() {
document.querySelector('.modal-edit').style.display = 'none';
}

3
public/js/views/templates/cadastroTemplates.js

@ -3,6 +3,7 @@ const form = document.querySelector("#cadastro-template");
const steps = modal.querySelectorAll('.step');
const channel_token = document.currentScript.getAttribute('channel_token');
const channel_number = document.currentScript.getAttribute('channel_number');
const workspace = document.currentScript.getAttribute('workspace');
/* Events */
function nextStep() {
@ -195,7 +196,7 @@ function fetchCadastroPositus(data, token) {
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + token)
},
url: `https://api.positus.global/v2/workspaces/${channel_number}/message-templates`,
url: `https://api.positus.global/v2/workspaces/${workspace}/message-templates`,
success: function (data) {
handleBtnCadastro();
fetchCadastroDB(data.data);

95
resources/views/admin/cadastros/channels.blade.php

@ -0,0 +1,95 @@
<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 ">
<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">
Channels
</h1>
@can('store_channels')
<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 Channel</button>
@endcan
</div>
<form action="{{route('channels')}}" method="GET" class="flex w-full gap-3 flex-col lg:flex-row ">
<div class="search bg-white dark:bg-gray-800 rounded px-3 py-1 overflow-hidden">
<i class="fas fa-search dark:text-gray-100"></i>
<input type="text" name="pesquisa" class="border-none bg-transparent focus:ring-transparent placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Pesquise channels" value="{{$search}}">
</div>
<select class="border-none rounded overflow-hidden dark:bg-gray-800 dark:text-gray-100" name="status">
@if($status)
<option value="ativo" selected>Ativos</option>
<option value="desativado">Desativados</option>
@else
<option value="ativo">Ativos</option>
<option value="desativado" selected>Desativados</option>
@endif
</select>
<button class="lg:ml-auto ml-0 bg-blue-900 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Pesquisar</button>
</form>
</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 pl-5">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 pl-5">ID Empresa</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Número</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Token</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Channel</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Workspace</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Título</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">Ações</th>
</tr>
</thead>
<tbody>
@foreach($channels as $channel)
<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 pl-5">{{$channel->id}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$channel->name}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 pl-5">{{$channel->id_empresa}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$channel->number}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$channel->token}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$channel->channel}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$channel->work_space}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$channel->title}}</td>
@if($channel->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 font-bold w-32">
@can('edit_channels')
<button class="bg-blue-600 text-white p-2 rounded text-lg text-center w-full mb-2" onclick="atualizaChannel(<?= $channel->id ?>)" title="editar channel"><i class="fas fa-edit"></i></button>
@endcan
@if($channel->status)
@can('destroy_channels')
<form method="POST" id="formulario" action="channels/deletar/{{$channel->id}}" title="desativar channel" onclick="javascript: if(!confirm('Deseja desativar esse channel?')) return false;">
@csrf
@method('delete')
<button class="bg-red-600 text-white p-2 rounded text-lg w-full">
<i class="fas fa-ban"></i>
</button>
</form>
@endcan
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<x-modal.insert.modalChannels></x-modal>
<x-modal.edit.modalEditChannels></x-modalEditChannels>
<script src="{{ asset('js/views/channels/atualizaChannel.js') }}"></script>
</x-app-layout>

2
resources/views/admin/cadastros/templates.blade.php

@ -33,7 +33,7 @@
</div>
</div>
<x-modal.insert.modalTemplates ></x-modalTemplates>
<script src="{{ asset('js/views/templates/cadastroTemplates.js') }}" channel_token="{{ $channel_token }}"; channel_number="{{ $channel_number }}"></script>
<script src="{{ asset('js/views/templates/cadastroTemplates.js') }}" workspace="{{$workspace}}"; channel_token="{{ $channel_token }}"; channel_number="{{ $channel_number }}"></script>
<script src="{{ asset('js/views/templates/index.js') }}"></script>
<script>

21
resources/views/admin/conectarAgente/conectarAgente.blade.php

@ -16,6 +16,16 @@
@endforeach
</select>
</div>
@if($channels)
<div class="flex-1 flex flex-col gap-1">
<label>Escolha o canal: </label>
<select name="channel_id" class="rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
@foreach($channels as $channel)
<option value="{{$channel->id}}">{{$channel->name}}</option>
@endforeach
</select>
</div>
@endif
</div>
</div>
<div class="mt-8">
@ -43,13 +53,15 @@
const divParent = button.parentNode;
const queue_id = document.querySelector("select[name='queue_id']").value;
const data = await fetchLogin(queue_id);
const channel_id = document.querySelector("select[name='channel_id']").value;
const url = "<?php print env('APP_URL_CLIENT'); ?>";
const data = await fetchLogin(queue_id, channel_id);
button.classList.add('hidden');
divParent.innerHTML += `<a href='http://127.0.0.1:8001/?t=${data}' class='bg-blue-500 text-white p-3 rounded-md' target='__blank'>Acessar</a>`;
divParent.innerHTML += `<a href='${url}/?t=${data}'' class='bg-blue-500 text-white p-3 rounded-md' target='__blank'>Acessar</a>`;
}
function fetchLogin(queue_id) {
function fetchLogin(queue_id, channel_id) {
return new Promise(function(resolve, reject) {
$.ajax({
headers: {
@ -58,7 +70,8 @@
type: "post",
dataType: 'json',
data: {
queue_id
queue_id,
channel_id
},
url: `/conectarAgente`,
success: function(response) {

66
resources/views/components/modal/edit/modalEditChannels.blade.php

@ -0,0 +1,66 @@
<!-- 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">
@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-gray-100 pl-3">
Atualizar channel
</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-4">
<div class="flex flex-col gap-2">
<label for="" 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="Informe o nome: " name="name">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">ID Empresa: </label>
<input type="text" pattern="[0-9]*" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Informe o id da empresa: " name="id_empresa">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Número: </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="Informe o numero do canal: " name="number">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Token: </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="Informe o token do canal: " name="token">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Channel: </label>
<select class="w-full dark:bg-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" name="channel">
<option value="positus">Positus</option>
</select>
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Workspace: </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="Informe o numero do workspace: " name="work_space">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Título: </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="Informe o titulo: " name="title">
</div>
<div class="flex flex-col gap-2">
<div>
<label for="" class="dark:text-gray-100 block">Ativo: </label>
<div class="container-checkbox">
<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 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">Atualizar</button>
</div>
</form>
</div>
</div>

64
resources/views/components/modal/insert/modalChannels.blade.php

@ -0,0 +1,64 @@
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal-agentes" :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('channels') }}" 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-gray-100 pl-3">
Cadastrar Channel
</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-4">
<div class="flex flex-col gap-2">
<label for="" 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="Informe o nome: " name="name" >
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">ID Empresa: </label>
<input type="text" pattern="[0-9]*" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Informe o id da empresa: " name="id_empresa">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Número: </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="Informe o numero do canal: " name="number">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Token: </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="Informe o token do canal: " name="token">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Channel: </label>
<select class="w-full dark:bg-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" name="channel">
<option value="positus">Positus</option>
</select>
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Workspace: </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="Informe o numero do workspace: " name="work_space">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Título: </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="Informe o titulo do canal: " name="title">
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativo: </label>
<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>
<!-- 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>

9
resources/views/layouts/menu.blade.php

@ -106,6 +106,15 @@
</x-nav-link>
</li>
@endcan
@can('show_channels')
<li>
<x-nav-link class="p-2 mt-3 ml-4 flex items-center flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('channels')" :active="request()->routeIs('channels')">
<i class="fas fa-headphones text-sm"></i>
<span class="text-[14px] ml-3 text-gray-300">Channels</span>
</x-nav-link>
</li>
@endcan
</ul>
</div>
@endcan

7
routes/web.php

@ -16,6 +16,7 @@ use App\Http\Controllers\Admin\Relatorios\RelatorioHistoricoAtendimentoControlle
use App\Http\Controllers\Admin\SupervisorController;
use App\Http\Controllers\Admin\SystemMessageController;
use App\Http\Controllers\Admin\TemplatesController;
use App\Http\Controllers\Admin\NumberChannelController;
use Illuminate\Support\Facades\Route;
Route::middleware(['auth', 'verified'])->group(function () {
@ -66,6 +67,12 @@ Route::middleware(['auth', 'verified'])->group(function () {
Route::delete('/users/deletar/{id}', [AgentesController::class, 'destroy'])->name('usersDeletar');
Route::get('/users/editar/{id}', [AgentesController::class, 'edit'])->name('usersEditar');
Route::post('/users/editar/{id}', [AgentesController::class, 'update'])->name('usersEditar');
Route::get('/channels', [NumberChannelController::class, 'index'])->name('channels');
Route::post('/channels', [NumberChannelController::class, 'store'])->name('channels');
Route::delete('/channels/deletar/{id}', [NumberChannelController::class, 'destroy'])->name('channelsDeletar');
Route::get('/channels/editar/{id}', [NumberChannelController::class, 'edit'])->name('channelsEditar');
Route::post('/channels/editar/{id}', [NumberChannelController::class, 'update'])->name('channelsEditar');
Route::get('/systemMessage', [SystemMessageController::class, 'index'])->name('systemMessage');
Route::get('/systemMessage/editar/{id}', [SystemMessageController::class, 'edit'])->name('systemMessageEditar');

Loading…
Cancel
Save