guilherme guia
1 year ago
56 changed files with 2942 additions and 2569 deletions
@ -1,58 +0,0 @@
|
||||
APP_NAME=Laravel |
||||
APP_ENV=local |
||||
APP_KEY= |
||||
APP_DEBUG=true |
||||
APP_URL=http://localhost |
||||
|
||||
LOG_CHANNEL=stack |
||||
LOG_DEPRECATIONS_CHANNEL=null |
||||
LOG_LEVEL=debug |
||||
|
||||
DB_CONNECTION=mysql |
||||
DB_HOST=127.0.0.1 |
||||
DB_PORT=3306 |
||||
DB_DATABASE=laravel |
||||
DB_USERNAME=root |
||||
DB_PASSWORD= |
||||
|
||||
BROADCAST_DRIVER=log |
||||
CACHE_DRIVER=file |
||||
FILESYSTEM_DISK=local |
||||
QUEUE_CONNECTION=sync |
||||
SESSION_DRIVER=file |
||||
SESSION_LIFETIME=120 |
||||
|
||||
MEMCACHED_HOST=127.0.0.1 |
||||
|
||||
REDIS_HOST=127.0.0.1 |
||||
REDIS_PASSWORD=null |
||||
REDIS_PORT=6379 |
||||
|
||||
MAIL_MAILER=smtp |
||||
MAIL_HOST=mailpit |
||||
MAIL_PORT=1025 |
||||
MAIL_USERNAME=null |
||||
MAIL_PASSWORD=null |
||||
MAIL_ENCRYPTION=null |
||||
MAIL_FROM_ADDRESS="hello@example.com" |
||||
MAIL_FROM_NAME="${APP_NAME}" |
||||
|
||||
AWS_ACCESS_KEY_ID= |
||||
AWS_SECRET_ACCESS_KEY= |
||||
AWS_DEFAULT_REGION=us-east-1 |
||||
AWS_BUCKET= |
||||
AWS_USE_PATH_STYLE_ENDPOINT=false |
||||
|
||||
PUSHER_APP_ID= |
||||
PUSHER_APP_KEY= |
||||
PUSHER_APP_SECRET= |
||||
PUSHER_HOST= |
||||
PUSHER_PORT=443 |
||||
PUSHER_SCHEME=https |
||||
PUSHER_APP_CLUSTER=mt1 |
||||
|
||||
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" |
||||
VITE_PUSHER_HOST="${PUSHER_HOST}" |
||||
VITE_PUSHER_PORT="${PUSHER_PORT}" |
||||
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" |
||||
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" |
@ -0,0 +1,34 @@
|
||||
# Usar imagem do php 8 |
||||
FROM php:8.0-fpm |
||||
|
||||
# Atualizar pacotes e instalar dependencias |
||||
RUN apt-get update && apt-get install -y \ |
||||
git \ |
||||
unzap \ |
||||
libpng-dev \ |
||||
libjpeg-dev \ |
||||
libfreetype6-dev \ |
||||
libzip-dev |
||||
|
||||
# Instalar dependencias PHP |
||||
RUN docker-ext-configure gd --with-freetype --with-jpeg \ |
||||
&& docker-php-ext-install -j$(nproc) gd pdo pdo_pgsql |
||||
|
||||
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" |
||||
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" |
||||
RUN php composer-setup.php |
||||
RUN php composer-setup.php --filename=composer --install-dir=/bin |
||||
|
||||
#Diretorio de trabalho |
||||
WORKDIR /var/www/html |
||||
|
||||
RUN git clone http://192.168.115.233:3000/guilherme.guia/simples-painel.git |
||||
|
||||
RUN php /bin/composer install |
||||
|
||||
EXPOSE 9000 |
||||
|
||||
CMD ["php-fpm"] |
||||
|
||||
# docker image build -t client_whatsapp . |
||||
# docker run -d --name client_whatsapp -p 8001:80 client_whatsapp |
@ -1,71 +1,67 @@
|
||||
<?php |
||||
namespace app\Helpers; |
||||
|
||||
/** |
||||
* Description of Cripto |
||||
* |
||||
* @author Lucas Awade |
||||
*/ |
||||
class Crypt { |
||||
private $message; |
||||
private $key; |
||||
private $option; |
||||
private $tag; |
||||
private $cipher; |
||||
private $ivlen; |
||||
private $iv; |
||||
private $textcrypt; |
||||
const CONF_CIPHER_CRYPT = 'aes-256-cbc'; |
||||
|
||||
namespace app\Helpers; |
||||
|
||||
class Crypt |
||||
{ |
||||
private $message; |
||||
private $key; |
||||
private $option; |
||||
private $tag; |
||||
private $cipher; |
||||
private $ivlen; |
||||
private $iv; |
||||
private $textcrypt; |
||||
const CONF_CIPHER_CRYPT = 'aes-256-cbc'; |
||||
function __construct($cipher = null, $key = null, $option = OPENSSL_RAW_DATA, $tag = null) |
||||
{ |
||||
if (!$cipher) { |
||||
$this->cipher = self::CONF_CIPHER_CRYPT; |
||||
} else { |
||||
$this->cipher = $cipher; |
||||
function __construct($cipher = null, $key = null, $option = OPENSSL_RAW_DATA, $tag = null) { |
||||
if (!$cipher) { |
||||
$this->cipher = self::CONF_CIPHER_CRYPT; |
||||
} else { |
||||
$this->cipher = $cipher; |
||||
} |
||||
$this->key = $key; |
||||
$this->option = $option; |
||||
$this->tag = $tag; |
||||
$this->openssl_crypt(); |
||||
} |
||||
public function encrypt($message = null) { |
||||
$this->setMessage($message); |
||||
$encrypt = openssl_encrypt($this->message, $this->cipher, $this->key, $this->option, $this->iv); |
||||
$hashcode = hash_hmac('sha256', $encrypt, $this->key, true); |
||||
$this->textcrypt = base64_encode($this->iv . $hashcode . $encrypt); |
||||
return $this->textcrypt; |
||||
} |
||||
public function decrypt($textcrypt = null) { |
||||
$c = base64_decode($textcrypt); |
||||
$this->iv = substr($c, 0, $this->ivlen); |
||||
$hmac = substr($c, $this->ivlen, 32); |
||||
$ciphertext_raw = substr($c, $this->ivlen + 32); |
||||
$original_plaintext = openssl_decrypt($ciphertext_raw, $this->cipher, $this->key, $options = OPENSSL_RAW_DATA, $this->iv); |
||||
$calcmac = hash_hmac('sha256', $ciphertext_raw, $this->key, true); |
||||
if (hash_equals($hmac, $calcmac)) { |
||||
return $original_plaintext; |
||||
} |
||||
} |
||||
private function openssl_crypt() { |
||||
if (in_array(strtolower($this->cipher), openssl_get_cipher_methods())) { |
||||
$this->ivlen = openssl_cipher_iv_length($this->cipher); |
||||
$this->iv = openssl_random_pseudo_bytes($this->ivlen); |
||||
} |
||||
} |
||||
public function setKey($key) { |
||||
$this->key = $key; |
||||
} |
||||
public function setOption($option) { |
||||
$this->option = $option; |
||||
} |
||||
$this->key = $key; |
||||
$this->option = $option; |
||||
$this->tag = $tag; |
||||
$this->openssl_crypt(); |
||||
} |
||||
public function encrypt($message = null) |
||||
{ |
||||
$this->setMessage($message); |
||||
$encrypt = openssl_encrypt($this->message, $this->cipher, $this->key, $this->option, $this->iv); |
||||
$hashcode = hash_hmac('sha256', $encrypt, $this->key, true); |
||||
$this->textcrypt = base64_encode($this->iv . $hashcode . $encrypt); |
||||
return $this->textcrypt; |
||||
} |
||||
public function decrypt($textcrypt = null) |
||||
{ |
||||
$c = base64_decode($textcrypt); |
||||
$this->iv = substr($c, 0, $this->ivlen); |
||||
$hmac = substr($c, $this->ivlen, 32); |
||||
$ciphertext_raw = substr($c, $this->ivlen + 32); |
||||
$original_plaintext = openssl_decrypt($ciphertext_raw, $this->cipher, $this->key, $options = OPENSSL_RAW_DATA, $this->iv); |
||||
$calcmac = hash_hmac('sha256', $ciphertext_raw, $this->key, true); |
||||
if (hash_equals($hmac, $calcmac)) { |
||||
return $original_plaintext; |
||||
public function setTag($tag) { |
||||
$this->tag = $tag; |
||||
} |
||||
} |
||||
private function openssl_crypt() |
||||
{ |
||||
if (in_array(strtolower($this->cipher), openssl_get_cipher_methods())) { |
||||
$this->ivlen = openssl_cipher_iv_length($this->cipher); |
||||
$this->iv = openssl_random_pseudo_bytes($this->ivlen); |
||||
public function setMessage($message) { |
||||
$this->message = $message; |
||||
} |
||||
} |
||||
public function setKey($key) |
||||
{ |
||||
$this->key = $key; |
||||
} |
||||
public function setOption($option) |
||||
{ |
||||
$this->option = $option; |
||||
} |
||||
public function setTag($tag) |
||||
{ |
||||
$this->tag = $tag; |
||||
} |
||||
public function setMessage($message) |
||||
{ |
||||
$this->message = $message; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,131 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers; |
||||
|
||||
use App\Models\numberChanel; |
||||
use App\Models\Redirect; |
||||
use Illuminate\Http\Request; |
||||
use Illuminate\Support\Facades\DB; |
||||
use Illuminate\Support\Facades\Gate; |
||||
|
||||
class RedirectController extends Controller |
||||
{ |
||||
public function index() |
||||
{ |
||||
$user = auth()->user(); |
||||
$id_empresa = $user->empresa->first()->id; |
||||
|
||||
$redirects = DB::table('redirect as r') |
||||
->join('number_channel as nc', 'nc.id', '=', 'r.id_number') |
||||
->select('r.*') |
||||
->where('nc.id_empresa', $id_empresa) |
||||
->get(); |
||||
|
||||
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get(); |
||||
|
||||
return view('admin.redirects', compact('redirects', 'numberChannels')); |
||||
} |
||||
|
||||
public function store(Request $request) |
||||
{ |
||||
if (Gate::denies('is_permission')) { |
||||
return redirect()->back(); |
||||
} |
||||
|
||||
$request->validate([ |
||||
'nome' => ['required', 'string'], |
||||
'descricao' => ['required'], |
||||
'status' => ['required'], |
||||
'initial' => ['required'], |
||||
'channel' => ['required'], |
||||
]); |
||||
|
||||
$status = $request->status === "on" ? true : false; |
||||
$initial = $request->initial === "on" ? true : false; |
||||
|
||||
Redirect::create([ |
||||
'name' => strtoupper($request->nome), |
||||
'description' => $request->descricao, |
||||
'status' => $status, |
||||
'initial' => $initial, |
||||
'id_number' => $request->channel, |
||||
'data_reg' => date('Y-m-d') |
||||
]); |
||||
|
||||
return redirect()->back()->with('status', 'Cadastrado com sucesso'); |
||||
} |
||||
|
||||
|
||||
public function edit($id) |
||||
{ |
||||
if (Gate::denies('is_permission')) { |
||||
return redirect()->back(); |
||||
} |
||||
|
||||
if (empty($id)) { |
||||
return response()->json(['data' => 'Parametro ID_REDIRECT é obrigatório']); |
||||
} |
||||
|
||||
$redirectData = Redirect::find($id); |
||||
$user = auth()->user(); |
||||
$id_empresa = $user->empresa->first()->id; |
||||
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get(); |
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'numbers' => $numberChannels, |
||||
'redirect_data' => $redirectData |
||||
], |
||||
|
||||
]; |
||||
|
||||
return response()->json($response); |
||||
} |
||||
|
||||
public function update(Request $request, $id) |
||||
{ |
||||
if (Gate::denies('is_permission')) { |
||||
return redirect()->back(); |
||||
} |
||||
|
||||
$request->validate([ |
||||
'nome' => ['required', 'string'], |
||||
'descricao' => ['required'], |
||||
'status' => ['required'], |
||||
'initial' => ['required'], |
||||
'channel' => ['required'], |
||||
]); |
||||
|
||||
|
||||
$status = $request->status === "on" ? true : false; |
||||
$initial = $request->initial === "on" ? true : false; |
||||
|
||||
Redirect::where("id", $id) |
||||
->update([ |
||||
'name' => strtoupper($request->nome), |
||||
'description' => $request->descricao, |
||||
'status' => $status, |
||||
'initial' => $initial, |
||||
'id_number' => $request->channel |
||||
]); |
||||
|
||||
return redirect('redirects')->with('status', 'atualizado com sucesso'); |
||||
} |
||||
|
||||
|
||||
public function destroy($id) |
||||
{ |
||||
if (Gate::denies('is_permission')) { |
||||
return redirect()->back(); |
||||
} |
||||
|
||||
$pesquisa = Redirect::where('id', '=', $id); |
||||
$Redirect = $pesquisa->get(); |
||||
$rowCount = $Redirect->count(); |
||||
if ($rowCount > 0) { |
||||
|
||||
$pesquisa->delete(); |
||||
} |
||||
return redirect('redirects')->with('status', 'deletado com sucesso'); |
||||
} |
||||
} |
@ -0,0 +1,235 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers; |
||||
|
||||
use App\Models\Agentes; |
||||
use App\Models\RedirectOption; |
||||
use App\Models\Types; |
||||
use Illuminate\Http\Request; |
||||
use Illuminate\Support\Facades\DB; |
||||
|
||||
class RedirectOptionController extends Controller |
||||
{ |
||||
public function index($id) |
||||
{ |
||||
if (empty($id)) { |
||||
return redirect('redirects'); |
||||
} |
||||
|
||||
$options = RedirectOption::where('id_redirect', '=', $id)->OrderBy('sequence', 'asc')->get(); |
||||
$types = Types::all(); |
||||
$id_redirect = $id; |
||||
|
||||
return view('admin.redirectOption', compact('options', 'id_redirect', '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; |
||||
|
||||
$data = null; |
||||
switch ($typeName) { |
||||
case 'queue': |
||||
$data = $this->queue(); |
||||
break; |
||||
case 'redirect': |
||||
$data = $this->redirect(); |
||||
break; |
||||
case 'agent': |
||||
$data = $this->agent(); |
||||
break; |
||||
default: |
||||
$data = null; |
||||
break; |
||||
} |
||||
|
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'data' => $data, |
||||
], |
||||
]; |
||||
|
||||
return response()->json($response); |
||||
} |
||||
|
||||
private function queue() |
||||
{ |
||||
|
||||
$user = auth()->user(); |
||||
$id_empresa = $user->empresa->first()->id; |
||||
|
||||
$filas = DB::table('queues as q')->select("q.id", "q.nome as name")->where([['id_empresa', $id_empresa], ['is_ativa', true]])->get(); |
||||
|
||||
return $filas; |
||||
} |
||||
|
||||
private function redirect() |
||||
{ |
||||
|
||||
$user = auth()->user(); |
||||
$id_empresa = $user->empresa->first()->id; |
||||
|
||||
$redirects = DB::table('redirect as r') |
||||
->join('number_channel as nc', 'nc.id', '=', 'r.id_number') |
||||
->select('r.id', 'r.name') |
||||
->where('nc.id_empresa', $id_empresa) |
||||
->get(); |
||||
|
||||
return $redirects; |
||||
} |
||||
|
||||
private function agent() |
||||
{ |
||||
|
||||
$user = auth()->user(); |
||||
$id_empresa = $user->empresa->first()->id; |
||||
|
||||
$agentes = DB::table('grupo_usuario as gu') |
||||
->join('usuarios as u', 'u.id', '=', 'gu.id_usuario') |
||||
->join('grupo as g', 'g.id', '=', 'gu.id_grupo') |
||||
->join('usuario_empresa as ue', 'u.id', '=', 'ue.id_usuario') |
||||
->join('empresa as e', 'e.id', '=', 'ue.id_empresa') |
||||
->select('u.id', "u.nome as name", 'u.matricula') |
||||
->where('e.id', $id_empresa) |
||||
->where('u.status', true) |
||||
->get(); |
||||
|
||||
return $agentes; |
||||
} |
||||
|
||||
public function store(Request $request) |
||||
{ |
||||
$request->validate([ |
||||
'sequencia' => ['required'], |
||||
'type' => ['required'], |
||||
'destino' => ['required'], |
||||
'status' => ['required'], |
||||
]); |
||||
|
||||
$id = $request->destino; |
||||
|
||||
if ($request->type == 3) { |
||||
$id = Agentes::where('id', $request->destino)->first()->matricula; |
||||
} |
||||
|
||||
$hidden = $request->status === "on" ? false : true; |
||||
|
||||
RedirectOption::create([ |
||||
'sequence' => $request->sequencia, |
||||
'description' => $request->descricao, |
||||
'id_redirect' => $request->id_redirect, |
||||
'id_type' => $request->type, |
||||
'code_id' => $id, |
||||
'hide' => $hidden, |
||||
'data_reg' => date("Y-m-d"), |
||||
]); |
||||
|
||||
return redirect()->back()->with('status', 'Cadastrado com sucesso'); |
||||
} |
||||
|
||||
public function sequence($id) |
||||
{ |
||||
|
||||
if (empty($id)) { |
||||
return response()->json(['data' => 'Parametro ID_REDIRECT é obrigatório']); |
||||
} |
||||
|
||||
$data = DB::table('redirect_option')->where([['id_redirect', $id]])->orderBy('sequence')->get(); |
||||
|
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'data' => $data, |
||||
], |
||||
]; |
||||
|
||||
return response()->json($response); |
||||
} |
||||
|
||||
public function destroy(Request $request) |
||||
{ |
||||
$id = $request->segment(4); |
||||
|
||||
if (empty($id)) { |
||||
return redirect()->back(); |
||||
} |
||||
|
||||
$pesquisa = RedirectOption::where('id', '=', $id); |
||||
|
||||
$RedirectOption = $pesquisa->get(); |
||||
$rowCount = $RedirectOption->count(); |
||||
|
||||
if ($rowCount > 0) { |
||||
$pesquisa->delete(); |
||||
} |
||||
|
||||
|
||||
return redirect()->back()->with('status', 'Deletado com sucesso'); |
||||
} |
||||
|
||||
public function edit(Request $request) |
||||
{ |
||||
$id = $request->segment(4); |
||||
|
||||
if (empty($id)) { |
||||
return response()->json(['data' => 'Parametro ID é obrigatório']); |
||||
} |
||||
|
||||
$optionData = RedirectOption::find($id); |
||||
$types = Types::all(); |
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'option_data' => $optionData, |
||||
'types' => $types |
||||
], |
||||
]; |
||||
|
||||
return response()->json($response); |
||||
} |
||||
|
||||
|
||||
public function update(Request $request) |
||||
{ |
||||
$id = $request->segment(4); |
||||
|
||||
if (!$id) { |
||||
return redirect()->back(); |
||||
} |
||||
|
||||
$request->validate([ |
||||
'sequencia' => ['required'], |
||||
'type' => ['required'], |
||||
'destino' => ['required'], |
||||
'status' => ['required'], |
||||
]); |
||||
|
||||
$code_id = $request->destino; |
||||
|
||||
if ($request->type == 3) { |
||||
$code_id = Agentes::where('id', $request->destino)->first()->matricula; |
||||
} |
||||
|
||||
$hidden = $request->status === "on" ? false : true; |
||||
|
||||
RedirectOption::where("id", $id) |
||||
->update([ |
||||
'sequence' => $request->sequencia, |
||||
'description' => $request->descricao, |
||||
'id_redirect' => $request->id_redirect, |
||||
'id_type' => $request->type, |
||||
'code_id' => $code_id, |
||||
'hide' => $hidden, |
||||
]); |
||||
|
||||
return redirect()->back()->with('status', 'Atualizado com sucesso'); |
||||
} |
||||
} |
@ -1,124 +0,0 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers; |
||||
|
||||
use App\Models\ResponseStep; |
||||
use Illuminate\Http\Request; |
||||
use Illuminate\Support\Facades\DB; |
||||
|
||||
class ResponseStepController extends Controller |
||||
{ |
||||
// |
||||
|
||||
public function index($id) |
||||
{ |
||||
|
||||
|
||||
if (empty($id)) { |
||||
return redirect('steps'); |
||||
} |
||||
|
||||
$responseStep = ResponseStep::where('id_step', '=', $id)->OrderBy('option', 'asc')->get(); |
||||
|
||||
$rowCount = $responseStep->count(); |
||||
|
||||
if ($rowCount < 0) { |
||||
return redirect('steps'); |
||||
} |
||||
|
||||
$id_step = $id; |
||||
return view('admin.responseStep', compact('responseStep', 'id_step')); |
||||
} |
||||
|
||||
|
||||
|
||||
public function create(Request $request) |
||||
{ |
||||
$request->validate([ |
||||
'resposta' => ['string', 'required'], |
||||
'opcao' => ['required'], |
||||
'id_step' => ['required'], |
||||
]); |
||||
|
||||
|
||||
if (empty($request->resposta) || empty($request->opcao) || empty($request->id_step)) { |
||||
return redirect('steps/response/' . $request->id_step)->with('status', 'erro ao cadastrar resposta'); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
$isSequenceExists = DB::table('response_step') |
||||
->where([ |
||||
['id_step', $request->id_step], |
||||
['option', $request->opcao] |
||||
])->exists(); |
||||
|
||||
|
||||
|
||||
if ($isSequenceExists) { |
||||
return redirect('steps/response/' . $request->id_step)->with('status', 'Response Step com opções iguais'); |
||||
} |
||||
|
||||
|
||||
ResponseStep::create([ |
||||
'response' => $request->resposta, |
||||
'id_step' => $request->id_step, |
||||
'option' => $request->opcao |
||||
]); |
||||
|
||||
|
||||
return redirect('steps/response/' . $request->id_step)->with('status', 'Cadastrado com Sucesso'); |
||||
} |
||||
|
||||
public function updateResponseStep(Request $request) |
||||
{ |
||||
|
||||
if (!$request) { |
||||
return redirect('login'); |
||||
} |
||||
|
||||
|
||||
if (empty($request->respostas) || empty($request->opcoes) || empty($request->response_step_ids)) { |
||||
$response['status'] = false; |
||||
$response['message'] = 'informações inválidas'; |
||||
return response()->json($response); |
||||
} |
||||
|
||||
for ($i = 0; $i < count($request->opcoes); $i++) { |
||||
|
||||
|
||||
DB::table('response_step') |
||||
->where('id', (int) $request->response_step_ids[$i]) |
||||
->update([ |
||||
'option' => (int) $request->opcoes[$i], |
||||
'response' => $request->respostas[$i] |
||||
]); |
||||
} |
||||
|
||||
$response['status'] = true; |
||||
$response['message'] = 'Resposta atualizada com sucesso'; |
||||
return response()->json($response); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function destroy($id) |
||||
{ |
||||
|
||||
$pesquisa = ResponseStep::where('id', '=', $id); |
||||
|
||||
|
||||
$steps = $pesquisa->get(); |
||||
$rowCount = $steps->count(); |
||||
if ($rowCount > 0) { |
||||
$pesquisa->delete(); |
||||
} |
||||
|
||||
$stepId = $steps[0]->id_step; |
||||
|
||||
return redirect('steps/response/' . $stepId)->with('status', 'Deletado com sucesso'); |
||||
} |
||||
} |
@ -1,179 +0,0 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers; |
||||
|
||||
use App\Models\numberChanel; |
||||
use App\Models\Steps; |
||||
use GuzzleHttp\Psr7\Response; |
||||
use Illuminate\Http\Request; |
||||
use Illuminate\Support\Facades\DB; |
||||
use Illuminate\Support\Facades\Gate; |
||||
|
||||
class StepsController extends Controller |
||||
{ |
||||
// |
||||
|
||||
public function index() |
||||
{ |
||||
|
||||
|
||||
$user = auth()->user(); |
||||
|
||||
$id_empresa = $user->empresa->first()->id; |
||||
|
||||
|
||||
$steps = DB::table('step as s') |
||||
->join('number_channel as nc', 'nc.id', '=', 's.id_number') |
||||
->select('s.*') |
||||
->where('nc.id_empresa', $id_empresa) |
||||
->orderBy('s.sequence', 'asc') |
||||
->get(); |
||||
|
||||
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get(); |
||||
|
||||
|
||||
return view('admin.steps', compact('steps', 'numberChannels')); |
||||
} |
||||
|
||||
|
||||
public function create(Request $request) |
||||
{ |
||||
|
||||
|
||||
if (Gate::denies('is_permission')) { |
||||
return redirect('users'); |
||||
} |
||||
|
||||
|
||||
$request->validate([ |
||||
'titulo' => ['required', 'string'], |
||||
'sequencia' => ['required'], |
||||
'tipo' => ['required'] |
||||
]); |
||||
|
||||
|
||||
if (empty($request->titulo) || empty($request->sequencia) || empty($request->tipo)) { |
||||
return redirect('steps')->with('status', 'erro ao cadastrar step'); |
||||
} |
||||
|
||||
|
||||
$id_number = '1'; |
||||
|
||||
|
||||
Steps::create([ |
||||
'title' => $request->titulo, |
||||
'sequence' => $request->sequencia, |
||||
'type' => $request->tipo, |
||||
'id_number' => $id_number |
||||
]); |
||||
|
||||
|
||||
return redirect('steps'); |
||||
} |
||||
|
||||
|
||||
|
||||
public function edit($id) |
||||
{ |
||||
if (empty($id)) { |
||||
return redirect('steps'); |
||||
} |
||||
|
||||
$stepData = Steps::find($id); |
||||
|
||||
|
||||
$user = auth()->user(); |
||||
|
||||
$id_empresa = $user->empresa->first()->id; |
||||
|
||||
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get(); |
||||
|
||||
$response = [ |
||||
'data' => [ |
||||
'status' => true, |
||||
'numbers' => $numberChannels, |
||||
'step_data' => $stepData |
||||
], |
||||
|
||||
]; |
||||
|
||||
// dd($response); |
||||
|
||||
// echo json_encode($response); |
||||
return response()->json($response); |
||||
} |
||||
|
||||
|
||||
public function update(Request $request, $id) |
||||
{ |
||||
$request->validate([ |
||||
"titulo" => ['required'], |
||||
"sequencia" => ['required'], |
||||
"tipo" => ['required'], |
||||
"channel" => ['required'] |
||||
]); |
||||
|
||||
|
||||
if (empty($id) || empty($request->titulo) || empty($request->sequencia) || empty($request->tipo)) { |
||||
return redirect('steps'); |
||||
} |
||||
|
||||
|
||||
$sequencia = Steps::select('sequence') |
||||
->where('id', $id) |
||||
->get() |
||||
->first(); |
||||
|
||||
|
||||
if ($sequencia->sequence != $request->sequencia) { |
||||
|
||||
$isSequenciaRegister = Steps::where('sequence', $request->sequencia)->get()->count(); |
||||
|
||||
|
||||
if ($isSequenciaRegister > 0) { |
||||
|
||||
return redirect('steps')->with('status', ' sequencia vinculada com outro step'); |
||||
} |
||||
|
||||
Steps::where("id", $id) |
||||
->update([ |
||||
'title' => $request->titulo, |
||||
'sequence' => $request->sequencia, |
||||
'type' => $request->tipo, |
||||
'id_number' => $request->channel |
||||
]); |
||||
} else { |
||||
|
||||
Steps::where("id", $id) |
||||
->update([ |
||||
'title' => $request->titulo, |
||||
'type' => $request->tipo, |
||||
'id_number' => $request->channel |
||||
]); |
||||
} |
||||
|
||||
|
||||
|
||||
return redirect('steps')->with('status', 'atualizado com sucesso'); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
public function destroy($id) |
||||
{ |
||||
|
||||
$pesquisa = Steps::where('id', '=', $id); |
||||
|
||||
|
||||
$steps = $pesquisa->get(); |
||||
$rowCount = $steps->count(); |
||||
|
||||
|
||||
if ($rowCount > 0) { |
||||
$pesquisa->delete(); |
||||
} |
||||
|
||||
return redirect('steps'); |
||||
} |
||||
} |
@ -0,0 +1,23 @@
|
||||
<?php |
||||
|
||||
namespace App\Models; |
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||
use Illuminate\Database\Eloquent\Model; |
||||
|
||||
class Redirect extends Model |
||||
{ |
||||
use HasFactory; |
||||
|
||||
protected $table = "redirect"; |
||||
public $timestamps = false; |
||||
|
||||
protected $fillable = [ |
||||
'name', |
||||
'description', |
||||
'id_number', |
||||
'initial', |
||||
'status', |
||||
'data_reg', |
||||
]; |
||||
} |
@ -0,0 +1,36 @@
|
||||
<?php |
||||
|
||||
namespace App\Models; |
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||
use Illuminate\Database\Eloquent\Model; |
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo; |
||||
|
||||
class RedirectOption extends Model |
||||
{ |
||||
use HasFactory; |
||||
|
||||
protected $table = "redirect_option"; |
||||
public $timestamps = false; |
||||
|
||||
protected $fillable = [ |
||||
'sequence', |
||||
'description', |
||||
'id_redirect', |
||||
'id_type', |
||||
'code_id', |
||||
'hide', |
||||
'data_reg', |
||||
]; |
||||
|
||||
public function redirect(): Redirect |
||||
{ |
||||
return $this->belongsTo(Redirect::class, 'id_redirect')->first(); |
||||
} |
||||
|
||||
public function type(): Types |
||||
{ |
||||
return $this->belongsTo(Types::class, 'id_type')->first(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,20 @@
|
||||
<?php |
||||
|
||||
namespace App\Models; |
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||
use Illuminate\Database\Eloquent\Model; |
||||
|
||||
class Types extends Model |
||||
{ |
||||
use HasFactory; |
||||
|
||||
protected $table = "types"; |
||||
public $timestamps = false; |
||||
|
||||
protected $fillable = [ |
||||
'name', |
||||
'status', |
||||
'data_reg', |
||||
]; |
||||
} |
@ -0,0 +1,101 @@
|
||||
const autoCompleteMessages = [{ |
||||
id: 1, |
||||
value: '@user_name', |
||||
}, |
||||
{ |
||||
id: 2, |
||||
value: '@agente_name', |
||||
}, |
||||
{ |
||||
id: 3, |
||||
value: '@empresa_name', |
||||
}, |
||||
{ |
||||
id: 4, |
||||
value: '@provedor_name', |
||||
}, |
||||
]; |
||||
|
||||
const valueEspacamento = 50; |
||||
|
||||
const inputs = document.querySelectorAll('.autoCompleteInput'); |
||||
|
||||
|
||||
inputs.forEach(input => { |
||||
input.addEventListener('input', (e) =>{ |
||||
let cont = 0; |
||||
fechaBox(); |
||||
let selectedTexts = ''; |
||||
let inputValue = e.target.value; |
||||
let isAtSign = inputValue.indexOf("@") >= 0; |
||||
// valor padrão para formatação de caixa de itens
|
||||
const listItemFormatValue = 3; |
||||
if (isAtSign) { |
||||
|
||||
let inputText = '@' + inputValue.split("@").pop(); // Obtem o texto depois do arroba
|
||||
autoCompleteMessages.forEach(message => { |
||||
let messageValue = message.value; |
||||
const textContainsMessage = messageValue.includes(inputText.toLowerCase()) |
||||
if (textContainsMessage) { |
||||
|
||||
selectedTexts += `<li class="p-2 dark:text-gray-100 hover:bg-gray-600 cursor-pointer rounded-md mb-3" onclick="selecionaMessage(event)" data-id="${message.id}">
|
||||
${message.value} |
||||
</li>` |
||||
if (cont < listItemFormatValue) { |
||||
cont++; |
||||
}; |
||||
} |
||||
}) |
||||
|
||||
if (selectedTexts) { |
||||
|
||||
const alturaBox = calcularAlturaBox(valueEspacamento, cont); |
||||
$('.autoCompleteBox').css('bottom', `-${alturaBox}px`); |
||||
$(".autoCompleteBox").html(selectedTexts); |
||||
abreBox(); |
||||
} |
||||
} |
||||
}) |
||||
}) |
||||
|
||||
function selecionaMessage({ target }) { |
||||
const id = parseInt(target.getAttribute("data-id")); |
||||
|
||||
const item = autoCompleteMessages.find(message => message.id === id); |
||||
const parent = target.parentNode.parentNode; |
||||
const input = parent.querySelector(".autoCompleteInput"); |
||||
const inputValue = input.value; |
||||
const indexLastAtSign = inputValue.lastIndexOf("@"); |
||||
const formatedInputValue = inputValue.substring(0, indexLastAtSign); |
||||
const formatedValue = formatedInputValue + item.value; |
||||
|
||||
input.value = formatedValue; |
||||
input.focus(); |
||||
fechaBox(); |
||||
} |
||||
|
||||
function fechaBox() { |
||||
$('.autoCompleteBox').addClass('hidden'); |
||||
} |
||||
|
||||
function abreBox() { |
||||
$('.autoCompleteBox').removeClass('hidden'); |
||||
} |
||||
|
||||
function calcularAlturaBox(valueEspacamento, qtdeItens) { |
||||
if (qtdeItens === 1) return 60; |
||||
|
||||
return qtdeItens * valueEspacamento; |
||||
} |
||||
|
||||
function limpaInput() { |
||||
$('.autoCompleteInput').val(""); |
||||
} |
||||
|
||||
function fecharModal() { |
||||
fechaBox(); |
||||
limpaInput(); |
||||
$('.modal-edit').hide(); |
||||
} |
||||
|
||||
|
@ -1,42 +0,0 @@
|
||||
<x-app-layout> |
||||
<div class="py-12"> |
||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> |
||||
<a href="{{route('pausas')}}" 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"> |
||||
{{session('status')}} |
||||
</div> |
||||
@endif |
||||
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg"> |
||||
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100"> |
||||
@csrf |
||||
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1> |
||||
<div class="responseSteps mt-8 flex flex-col gap-4"> |
||||
|
||||
<div class="responseStep flex flex-col gap-3 flex-wrap"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label for="">Motivo: </label> |
||||
<input type="text" class="w-full rounded-md p-2" placeholder="Digite o motivo: " name="motivo" value="{{$pausa->motivo}}"> |
||||
</div> |
||||
<div class="flex-1"> |
||||
<label for="" class="block ">Ativo: </label> |
||||
|
||||
@if($pausa->is_ativo) |
||||
<input type="radio" name="status" value="on" checked> <span class="mr-3">Sim</span> |
||||
<input type="radio" name="status" value="off"> <span>Não</span> |
||||
@else |
||||
<input type="radio" name="status" value="on"> <span class="mr-3">Sim</span> |
||||
<input type="radio" name="status" value="off" checked> <span>Não</span> |
||||
@endif |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</x-app-layout> |
@ -1,45 +0,0 @@
|
||||
<x-app-layout> |
||||
<div class="py-12"> |
||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> |
||||
<a href="{{route('setores')}}" 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"> |
||||
{{session('status')}} |
||||
</div> |
||||
@endif |
||||
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg"> |
||||
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100"> |
||||
@csrf |
||||
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1> |
||||
<div class="responseSteps mt-8 flex flex-col gap-4"> |
||||
|
||||
<div class="responseStep flex flex-col gap-3 flex-wrap"> |
||||
<div class="flex-1 flex flex-col gap-1"> |
||||
<label>Nome: </label> |
||||
<input type="text" class="w-full rounded-md p-2" placeholder="Digite aqui o Nome : " name="nome" value="{{$setor->nome}}"> |
||||
</div> |
||||
|
||||
|
||||
<div class="flex-1"> |
||||
<label for="" class="block ">Ativo: </label> |
||||
|
||||
@if($setor->is_ativa) |
||||
<input type="radio" name="status" value="on" checked> <span class="mr-3">Sim</span> |
||||
<input type="radio" name="status" value="off"> <span>Não</span> |
||||
@else |
||||
<input type="radio" name="status" value="on"> <span class="mr-3">Sim</span> |
||||
<input type="radio" name="status" value="off" checked> <span>Não</span> |
||||
@endif |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</x-app-layout> |
@ -1,67 +0,0 @@
|
||||
<x-app-layout> |
||||
<div class="py-12"> |
||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> |
||||
<a href="{{route('supervisor')}}" 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"> |
||||
{{session('status')}} |
||||
</div> |
||||
@endif |
||||
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg"> |
||||
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100"> |
||||
@csrf |
||||
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1> |
||||
<div class="responseSteps mt-8 flex flex-col gap-4"> |
||||
|
||||
<div class="responseStep flex flex-col gap-3 flex-wrap"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label for="">Selecione o Agente: </label> |
||||
<select class="w-full" name="agente_id"> |
||||
@foreach($agentes as $agente) |
||||
|
||||
@if($agente->id == $userData->id_usuario) |
||||
<option value="{{$agente->id}}" selected>{{$agente->nome}}</option> |
||||
@else |
||||
|
||||
<option value="{{$agente->id}}">{{$agente->nome}}</option> |
||||
@endif |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label for="">Selecione a Fila: </label> |
||||
<select class="w-full" name="fila"> |
||||
@foreach($filas as $fila) |
||||
|
||||
@if($fila->nome == $userData->fila) |
||||
<option value="{{$fila->nome}}" selected>{{$fila->nome}}</option> |
||||
@else |
||||
<option value="{{$fila->nome}}">{{$fila->nome}}</option> |
||||
@endif |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label for="">Selecione o canal: </label> |
||||
<select class="w-full" name="channel"> |
||||
@foreach($numberChannels as $numberChannel) |
||||
@if($numberChannel->id == $userData->id_number_channel) |
||||
<option value="{{$numberChannel->id}}" selected>{{$numberChannel->title}}</option> |
||||
@else |
||||
<option value="{{$numberChannel->id}}">{{$numberChannel->title}}</option> |
||||
@endif |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</x-app-layout> |
@ -1,52 +0,0 @@
|
||||
<x-app-layout> |
||||
<div class="py-12"> |
||||
|
||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> |
||||
<a href="{{route('users')}}" 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"> |
||||
{{session('status')}} |
||||
</div> |
||||
@endif |
||||
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg"> |
||||
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100"> |
||||
@csrf |
||||
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1> |
||||
<div class="responseSteps mt-8 flex flex-col gap-4"> |
||||
|
||||
<div class="responseStep flex flex-col gap-3 flex-wrap"> |
||||
<div class="flex-1 flex flex-col gap-1"> |
||||
<label>Nome: </label> |
||||
<input type="text" class="w-full rounded-md p-2" placeholder="Digite aqui o Nome : " name="nome" value="{{$userData->nome}}"> |
||||
</div> |
||||
<div class="flex-1 flex flex-col gap-1"> |
||||
<label>Email: </label> |
||||
<input type="email" class="w-full rounded-md p-2" placeholder="Digite aqui o email : " name="email" value="{{$userData->email}}"> |
||||
</div> |
||||
<div class="flex-1 flex flex-col gap-1"> |
||||
<label>Matricula: </label> |
||||
<input type="text" class="w-full rounded-md p-2" placeholder="Digite aqui a matricula : " name="matricula" value="{{$userData->matricula}}" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> |
||||
</div> |
||||
<div class="flex-1"> |
||||
<label for="" class="block ">Ativo: </label> |
||||
|
||||
@if($userData->status) |
||||
<input type="radio" name="status" value="on" checked> <span class="mr-3">Sim</span> |
||||
<input type="radio" name="status" value="off"> <span>Não</span> |
||||
@else |
||||
<input type="radio" name="status" value="on"> <span class="mr-3">Sim</span> |
||||
<input type="radio" name="status" value="off" checked> <span>Não</span> |
||||
@endif |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</x-app-layout> |
@ -0,0 +1,212 @@
|
||||
<x-app-layout> |
||||
<div class="py-8 px-8"> |
||||
<a href="{{ route('redirects.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">Configuração Options</h1> |
||||
<h2 class="text-lg mt-2">Adicione, edite ou remova suas opções de redirect</h2> |
||||
</div> |
||||
<button class="ml-auto mt-2 bg-blue-600 text-white py-2 px-6 rounded-md text-lg" |
||||
@click="modal = !modal">Adicionar</button> |
||||
</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">Sequência</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Descrição</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Redirect</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Tipo</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Destino</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 ($options as $option) |
||||
<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">{{ $option->id }} |
||||
</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
{{ $option->sequence }} |
||||
{{-- <input type="text" value="{{ $option->sequence }}" |
||||
class=" w-full rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 respostas" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> --}} |
||||
</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
{{ $option->description }} |
||||
</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
{{ $option->redirect()->name }} |
||||
</td> |
||||
|
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 uppercase"> |
||||
{{ $option->type()->name }} |
||||
</td> |
||||
|
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"> |
||||
{{ $option->code_id }} |
||||
</td> |
||||
|
||||
@if ($option->hide) |
||||
<td class="p-3 text-sm text-red-500 font-bold">DESATIVADO</td> |
||||
@else |
||||
<td class="p-3 text-sm text-green-500 font-bold">ATIVO</td> |
||||
@endif |
||||
|
||||
<td class="p-3 text-sm font-bold flex-wrap w-32"> |
||||
<button class="bg-blue-600 text-white p-2 rounded text-lg w-full mb-2" |
||||
onclick="atualizaRedirectOption( {{ $option->id }})"><i |
||||
class="fas fa-edit"></i></button> |
||||
<form method="POST" action="options/{{ $option->id }}" class="flex-1 flex" |
||||
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> |
||||
</td> |
||||
</tr> |
||||
@endforeach |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<x-modalRedirectOption :id_redirect="$id_redirect" :types="$types"></x-modalRedirectOption> |
||||
<x-modalEditRedirectOption :id_redirect="$id_redirect"></x-modalEditRedirectOption> |
||||
|
||||
<script> |
||||
function requestType(id_type) { |
||||
return new Promise(function(resolve, reject) { |
||||
$.ajax({ |
||||
type: "get", |
||||
dataType: 'json', |
||||
url: `options/${id_type}`, |
||||
success: function(response) { |
||||
const data = response.data.data; |
||||
resolve(data); |
||||
} |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
const modal = document.querySelector(".modal"); |
||||
let id_type = 1; |
||||
montaSelectDestino(id_type, modal); |
||||
|
||||
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}</option>` |
||||
} else { |
||||
selectElements += |
||||
` <option value="${element.id}">${element.name}</option>` |
||||
} |
||||
}) |
||||
} else { |
||||
data.forEach(element => { |
||||
selectElements += `<option value="${element.id}">${element.name}</option>` |
||||
}); |
||||
} |
||||
|
||||
selectDestino.innerHTML = selectElements; |
||||
} |
||||
|
||||
function atualizaRedirectOption(option_id) { |
||||
$.ajax({ |
||||
type: "get", |
||||
url: `options/${option_id}/edit`, |
||||
success: async function({ |
||||
data |
||||
}) { |
||||
|
||||
const option_data = data.option_data; |
||||
const types = data.types |
||||
const redirectsData = await requestType(option_data.id_type); |
||||
const modal = document.querySelector('.modal-edit'); |
||||
|
||||
modal.style.display = 'block'; |
||||
modal.setAttribute('data-sequenceDB', option_data.sequence); |
||||
modal.querySelector("input[name='sequencia']").value = option_data.sequence; |
||||
modal.querySelector("textarea[name='descricao']").value = option_data.description; |
||||
|
||||
modal.querySelector('form').action = `options/${option_id}`; |
||||
|
||||
if (option_data.hide) { |
||||
modal.querySelector(".container-radio").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>`; |
||||
} else { |
||||
modal.querySelector(".container-radio").innerHTML = |
||||
`<input type="radio" name="status" value="on" checked> <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>`; |
||||
} |
||||
|
||||
let containerTypes = ''; |
||||
|
||||
types.forEach(type => { |
||||
if (option_data.id_type === 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; |
||||
montaSelectDestino(option_data.id_type, modal, option_data.code_id); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
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); |
||||
}) |
||||
}) |
||||
</script> |
||||
</x-app-layout> |
@ -0,0 +1,149 @@
|
||||
<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"> |
||||
Redirects |
||||
</h1> |
||||
@can('is_permission') |
||||
<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 Redirect</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">Descriçã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">Inicial</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 ($redirects as $redirect) |
||||
<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">{{ $redirect->id }}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $redirect->name }}</td> |
||||
<td |
||||
class="p-3 text-sm text-gray-700 dark:text-gray-100 sequence sequence-{{ $redirect->id }}"> |
||||
{{ $redirect->description }}</td> |
||||
|
||||
@if ($redirect->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 |
||||
|
||||
@if ($redirect->initial) |
||||
<td class="p-3 text-sm text-green-500 font-bold">INICIAL</td> |
||||
@else |
||||
<td class="p-3 text-sm text-red-500 font-bold">NÃO INICIAL</td> |
||||
@endif |
||||
|
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"><a |
||||
href="{{ route('redirects.options.index', ['redirect' => $redirect->id]) }}" |
||||
class="text-blue-500 hover:underline">Editar Opções</a></td> |
||||
<td class="p-3 text-sm font-bold flex-wrap w-32"> |
||||
<button class="bg-blue-600 text-white p-2 rounded text-lg w-full mb-2" |
||||
onclick="atualizaRedirect( {{ $redirect->id }})"><i |
||||
class="fas fa-edit"></i></button> |
||||
<form method="POST" |
||||
action="{{ route('redirects.destroy', ['redirect' => $redirect->id]) }}" |
||||
class="flex-1 flex" |
||||
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> |
||||
</td> |
||||
</tr> |
||||
@endforeach |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</div> |
||||
|
||||
<x-modalRedirect :numberChannels="$numberChannels"></x-modalRedirect> |
||||
<x-modalEditRedirect :numberChannels="$numberChannels"></x-modalEditRedirect> |
||||
|
||||
@push('updateStep') |
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" |
||||
crossorigin="anonymous"></script> |
||||
<script> |
||||
function atualizaRedirect(id_redirect) { |
||||
$.ajax({ |
||||
type: "get", |
||||
url: `redirects/${id_redirect}/edit`, |
||||
success: function({ |
||||
data |
||||
}) { |
||||
const redirect_data = data.redirect_data; |
||||
const numbers_channels = data.numbers; |
||||
const modal = document.querySelector('.modal-edit'); |
||||
modal.style.display = 'block'; |
||||
modal.querySelector('form').action = `redirects/${id_redirect}`; |
||||
|
||||
modal.querySelector("input[name='nome']").value = redirect_data.name; |
||||
modal.querySelector("textarea[name='descricao']").value = redirect_data.description; |
||||
|
||||
const containerRadioStatus = document.querySelector(".container-radio-status"); |
||||
const containerRadioInitial = document.querySelector(".container-radio-initial"); |
||||
|
||||
if (redirect_data.status) { |
||||
containerRadioStatus.innerHTML = |
||||
`<input type="radio" name="status" value="on" checked> <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>` |
||||
} else { |
||||
containerRadioStatus.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>` |
||||
} |
||||
|
||||
if (redirect_data.initial) { |
||||
containerRadioInitial.innerHTML = |
||||
`<input type="radio" name="initial" value="on" checked> <span class="mr-3 dark:text-gray-100">Sim</span> |
||||
<input type="radio" name="initial" value="off" > <span class="dark:text-gray-100">Não</span>` |
||||
} else { |
||||
containerRadioInitial.innerHTML = |
||||
`<input type="radio" name="initial" value="on" > <span class="mr-3 dark:text-gray-100">Sim</span> |
||||
<input type="radio" name="initial" value="off" checked> <span class="dark:text-gray-100">Não</span>` |
||||
} |
||||
|
||||
const containerChannels = modal.querySelector("select[name='channel']"); |
||||
numbers_channels.forEach(channel => { |
||||
if (redirect_data.id_number === channel.id) { |
||||
containerChannels.innerHTML = |
||||
` <option value="${channel.id}" selected>${channel.title}</option>` |
||||
|
||||
} else { |
||||
containerChannels.innerHTML = |
||||
` <option value="${channel.id}">${channel.title}</option>` |
||||
|
||||
} |
||||
}) |
||||
|
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
function fecharModal() { |
||||
document.querySelector('.modal-edit').style.display = 'none'; |
||||
} |
||||
</script> |
||||
@endpush |
||||
</x-app-layout> |
@ -1,167 +0,0 @@
|
||||
<x-app-layout> |
||||
<div class="py-12"> |
||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> |
||||
<a href="{{route('steps')}}" 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">Configuração Respostas</h1> |
||||
<h2 class="text-lg mt-2">Adicione, edite ou remova respostas de suas Steps</h2> |
||||
</div> |
||||
<button class="ml-auto mt-2 bg-blue-800 text-white py-2 px-6 rounded-md text-lg" @click="modal = !modal">Adicionar</button> |
||||
</div> |
||||
<div class="responseSteps mt-8 flex flex-col gap-4"> |
||||
@forelse($responseStep as $response) |
||||
<div class="responseStep flex gap-3"> |
||||
|
||||
<input type="hidden" name="id_response_step" value="{{$response->id}}"> |
||||
<div class="flex-1 flex flex-col gap-1"> |
||||
<label for="" class="dark:text-gray-100">Resposta: </label> |
||||
<input type="text" class=" w-full rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 respostas" placeholder="Digite aqui a resposta: " value="{{$response->response}}"> |
||||
|
||||
</div> |
||||
<div class="flex-1 flex flex-col gap-1"> |
||||
<label for="" class="dark:text-gray-100">Opção: </label> |
||||
<input type="text" class="w-full rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 opcoes" placeholder="Digite aqui a opção: " onkeypress="return event.charCode >= 48 && event.charCode <= 57" value="{{$response->option}}"> |
||||
<p class="text-red-500 text-problem hidden">Opção não podem ser iguais</p> |
||||
</div> |
||||
<form method="POST" class="flex items-end" action="/steps/response/deletar/{{$response->id}}" onclick="javascript: if(!confirm('Deseja deletar esses dados?')) return false;"> |
||||
@csrf |
||||
@method('delete') |
||||
<button class="bg-red-600 dark:bg-red-700 px-8 py-2 flex items-center rounded "><i class="fas fa-trash text-lg"></i></button> |
||||
</form> |
||||
</div> |
||||
@empty |
||||
|
||||
|
||||
<h1 class="font-bold">Não existe registros</h1> |
||||
|
||||
@endforelse |
||||
|
||||
</div> |
||||
<?php echo csrf_field() ?> |
||||
|
||||
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md salvar">Salvar Alterações</button> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
|
||||
@push('updateResponseStep') |
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script> |
||||
<script> |
||||
$('.salvar').click(function() { |
||||
const opcoes = document.querySelectorAll('.opcoes'); |
||||
const respostas = document.querySelectorAll('.respostas'); |
||||
const alert = document.querySelector('.alert'); |
||||
|
||||
const id_response_steps = document.querySelectorAll('input[name="id_response_step"]'); |
||||
|
||||
|
||||
document.querySelector('.alert').style.display = 'none'; |
||||
|
||||
opcoes.forEach(el => { |
||||
el.classList.remove('border-red-500') |
||||
el.classList.remove('border-2') |
||||
const parent = el.parentNode; |
||||
parent.querySelector('p').classList.add('hidden'); |
||||
parent.parentNode.querySelector('form').classList.add('items-end'); |
||||
parent.parentNode.querySelector('form').classList.remove('items-center'); |
||||
}) |
||||
|
||||
if (hasDuplicates(opcoes)) { |
||||
const elDuplicates = findDuplicateIndexes(opcoes); |
||||
elDuplicates.forEach(el => { |
||||
const parent = opcoes[el].parentNode; |
||||
|
||||
parent.querySelector('p').classList.remove('hidden'); |
||||
|
||||
parent.parentNode.querySelector('form').classList.remove('items-end'); |
||||
parent.parentNode.querySelector('form').classList.add('items-center'); |
||||
|
||||
opcoes[el].classList.add('border-red-500') |
||||
opcoes[el].classList.add('border-2') |
||||
}) |
||||
return; |
||||
} |
||||
|
||||
const opcoesValues = Array.from(opcoes).map(opcao => opcao.value); |
||||
|
||||
const respostaValues = Array.from(respostas).map(resposta => resposta.value); |
||||
|
||||
const idValues = Array.from(id_response_steps).map(response_step => response_step.value); |
||||
|
||||
$.ajax({ |
||||
type: "post", |
||||
url: "{{route('editarResponseStep')}}", |
||||
data: { |
||||
"opcoes": opcoesValues, |
||||
"respostas": respostaValues, |
||||
"response_step_ids": idValues, |
||||
"_token": $('meta[name="csrf-token"]').attr('content'), |
||||
}, |
||||
dataType: "json", |
||||
success: function(response) { |
||||
let data = response; |
||||
|
||||
document.querySelector('.alert').style.display = 'block'; |
||||
document.querySelector('.alert').innerText = response.message; |
||||
|
||||
} |
||||
}); |
||||
}) |
||||
|
||||
|
||||
|
||||
function hasDuplicates(arr) { |
||||
for (let i = 0; i < arr.length; i++) { |
||||
for (let j = i + 1; j < arr.length; j++) { |
||||
if (arr[i].value === arr[j].value) { |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
|
||||
function findDuplicateIndexes(array) { |
||||
let values = []; |
||||
let duplicates = []; |
||||
for (let i = 0; i < array.length; i++) { |
||||
let currentValue = array[i].value; |
||||
let index = values.indexOf(currentValue); |
||||
|
||||
if (index !== -1) { |
||||
duplicates.push(index); |
||||
duplicates.push(i); |
||||
} |
||||
values.push(currentValue); |
||||
} |
||||
|
||||
return duplicates; |
||||
} |
||||
</script> |
||||
@endpush |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<x-modalResponseStep :id_step="$id_step"></x-modalResponseStep> |
||||
|
||||
</x-app-layout> |
@ -1,119 +0,0 @@
|
||||
<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"> |
||||
Steps |
||||
</h1> |
||||
@can('is_permission') |
||||
<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 Steps</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">Titulo</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Sequência</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Tipo</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Respostas</th> |
||||
<th class="p-3 text-sm font-semibold tracking-wide text-left">Ações</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
@foreach($steps as $step) |
||||
<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">{{$step->id}}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$step->title}}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 sequence sequence-{{$step->id}}">{{$step->sequence}}</td> |
||||
|
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$step->type}}</td> |
||||
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"><a href="steps/response/{{$step->id}}" class="text-blue-500 hover:underline">Editar Respostas</a></td> |
||||
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap"> |
||||
<button class="bg-blue-600 text-white p-2 rounded flex-1 text-lg" onclick="atualizaStep(<?= $step->id ?>)"><i class="fas fa-edit"></i></button>
|
||||
<form method="POST" action="steps/deletar/{{$step->id}}" class="flex-1 flex" onclick="javascript: if(!confirm('Deseja deletar esses dados?')) return false;"> |
||||
@csrf |
||||
@method('delete') |
||||
<button class="bg-red-600 text-white p-2 rounded flex-1 text-lg"> |
||||
<i class="fas fa-trash"></i> |
||||
</button> |
||||
</form> |
||||
</td> |
||||
</tr> |
||||
@endforeach |
||||
|
||||
</tbody> |
||||
|
||||
</table> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<x-modalStep :numberChannels="$numberChannels"></x-modalStep> |
||||
<x-modalEditStep></x-modalEditStep> |
||||
|
||||
@push('updateStep') |
||||
|
||||
|
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script> |
||||
<script> |
||||
function atualizaStep(id_step) { |
||||
$.ajax({ |
||||
type: "get", |
||||
url: `steps/editar/${id_step}`, |
||||
success: function({ |
||||
data |
||||
}) { |
||||
|
||||
|
||||
const step_data = data.step_data; |
||||
const numbers_channels = data.numbers; |
||||
|
||||
const modal = document.querySelector('.modal-edit'); |
||||
|
||||
const sequence_atual = document.querySelector(`.sequence-${id_step}`).innerHTML; |
||||
|
||||
|
||||
modal.style.display = 'block'; |
||||
|
||||
modal.querySelector('form').action = `/steps/editar/${step_data.id}`; |
||||
|
||||
modal.querySelector("textarea[name='titulo']").value = step_data.title; |
||||
modal.querySelector("input[name='sequencia']").value = step_data.sequence; |
||||
modal.querySelector("input[name='sequence_atual']").value = sequence_atual; |
||||
|
||||
|
||||
const containerChannels = modal.querySelector("select[name='channel']"); |
||||
|
||||
numbers_channels.forEach(el => { |
||||
containerChannels.innerHTML = ` <option value="${el.id}">${el.title}</option>` |
||||
}) |
||||
|
||||
const containerSelect = modal.querySelector(".container-select"); |
||||
|
||||
|
||||
if (step_data.type !== 'listarOption') { |
||||
containerSelect.innerHTML = ` <option value="listarOption">Lista de Opções</option> |
||||
<option value="listarFilas" selected>Lista de Filas</option>` |
||||
} |
||||
|
||||
} |
||||
}); |
||||
|
||||
} |
||||
|
||||
function fecharModal() { |
||||
document.querySelector('.modal-edit').style.display = 'none'; |
||||
} |
||||
</script> |
||||
@endpush |
||||
|
||||
</x-app-layout> |
@ -0,0 +1,73 @@
|
||||
<div class="fixed z-50 p-4 bg-gray-900 bg-opacity-60 h-full w-full hidden 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" > |
||||
@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 Empresa |
||||
</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" 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-3"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Nome Fantasia: </label> |
||||
<input type="text" placeholder="Digite o nome fantasia: " required name="nome" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"> |
||||
</div> |
||||
{{-- <div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Qual é o Token: </label> |
||||
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o token: " name="token" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> |
||||
</div> --}} |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o Email: </label> |
||||
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email" > |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Digite o CPNJ: </label> |
||||
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57" id="cnpj" maxlength="8"> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
<!-- Modal footer --> |
||||
<div class="flex items-center justify-end 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">Atualizar</button> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
|
||||
@push('cadastroEmpresa') |
||||
<script> |
||||
$(document).ready(function(){ |
||||
$('.modal-edit').find('#cnpj').mask('00.000.000/0000-00', {reverse: true}); |
||||
}) |
||||
|
||||
|
||||
$('.modal-edit').find('form').submit(function(e){ |
||||
e.preventDefault(); |
||||
|
||||
const inputValue = $(this).find("input[name='cnpj']").val(); |
||||
if(inputValue.length < 18){ |
||||
$(this).find("input[name='cnpj']").addClass("border border-red-500"); |
||||
return; |
||||
} |
||||
|
||||
this.submit(); |
||||
}) |
||||
|
||||
|
||||
function fecharModal() { |
||||
$('.modal-edit').hide(); |
||||
} |
||||
|
||||
</script> |
||||
@endpush |
@ -0,0 +1,66 @@
|
||||
@props(['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="formStepEdit"> |
||||
@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"> |
||||
Atualizar Step |
||||
</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" |
||||
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-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">Descrição: </label> |
||||
<textarea placeholder="Digite a descrição: " name="descricao" rows="5" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea> |
||||
</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="channel"> |
||||
@foreach ($numberChannels as $numberChannel) |
||||
<option value="{{ $numberChannel->id }}">{{ $numberChannel->title }}</option> |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div> |
||||
<label for="" class="dark:text-gray-100 block">Ativo: </label> |
||||
<div class="container-radio-status"> |
||||
|
||||
</div> |
||||
</div> |
||||
<div> |
||||
<label for="" class="dark:text-gray-100 block">Inicial: </label> |
||||
<div class="container-radio-initial"> |
||||
|
||||
</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">Atualizar</button> |
||||
|
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
@ -0,0 +1,117 @@
|
||||
@props(['id_redirect']) |
||||
|
||||
<!-- 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 Resposta |
||||
</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">Qual é a sequência: </label> |
||||
<input type="text" value="1" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 sequence" |
||||
placeholder="Digite a sequência: " name="sequencia" required |
||||
onkeypress="return event.charCode >= 48 && event.charCode <= 57"> |
||||
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o tipo: </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="type"> |
||||
|
||||
</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="destino"> |
||||
</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="destino"> |
||||
</div> |
||||
<div> |
||||
<label for="" class="dark:text-gray-100 block">Ativo: </label> |
||||
<div class="container-radio"> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Descrição: </label> |
||||
<textarea class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" |
||||
placeholder="Digite a descrição: " name="descricao" rows="3" ></textarea> |
||||
</div> |
||||
<input type="hidden" name="id_redirect" value="{{ $id_redirect }}"> |
||||
</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> |
||||
|
||||
|
||||
@push('updateResponseStep') |
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" |
||||
crossorigin="anonymous"></script> |
||||
<script> |
||||
$('#formRedirectOptionEdit').submit(async function(e) { |
||||
// Impede o envio do formulário |
||||
e.preventDefault(); |
||||
const form = e.target; |
||||
const sequences = await requestSequenceOptions(); |
||||
|
||||
const sequenceDBValue = document.querySelector('.modal-edit').getAttribute("data-sequenceDB"); |
||||
const el = form.querySelector('input.sequence') |
||||
const parent = el.parentNode; |
||||
|
||||
el.classList.remove('border-red-500') |
||||
el.classList.remove('border-2') |
||||
parent.querySelector('p').classList.add('hidden'); |
||||
|
||||
const hasItemInArray = sequences.includes(el.value); |
||||
|
||||
if(el.value === sequenceDBValue){ |
||||
return this.submit(); |
||||
} |
||||
|
||||
if (hasItemInArray) { |
||||
parent.querySelector('p').classList.remove('hidden'); |
||||
el.classList.add('border-red-500') |
||||
el.classList.add('border-2') |
||||
|
||||
return; |
||||
} |
||||
|
||||
this.submit(); |
||||
}); |
||||
|
||||
function fecharModal() { |
||||
$('.modal-edit').hide(); |
||||
$('.modal-edit').find('input.sequence').removeClass('border-red-500 border-2'); |
||||
$('.modal-edit').find('.text-problem').addClass('hidden'); |
||||
} |
||||
</script> |
||||
@endpush |
@ -1,124 +0,0 @@
|
||||
<!-- 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="formStepEdit"> |
||||
|
||||
@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"> |
||||
Atualizar Step |
||||
</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" 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-3"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Titulo: </label> |
||||
<textarea name="titulo" rows="5" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o titulo: "></textarea> |
||||
<!-- <input type="text" name=""> --> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Qual é Sequência: </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 a sequência: " name="sequencia" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> |
||||
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p> |
||||
</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="channel"> |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Escolha o tipo:</label> |
||||
<select name="tipo" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 container-select"> |
||||
<option value="listarOption" selected>Lista de Opções</option> |
||||
<option value="listarFilas">Lista de Filas</option> |
||||
</select> |
||||
</div> |
||||
<input type="hidden" name="sequence_atual"> |
||||
</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">Atualizar</button> |
||||
|
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
|
||||
@push('cadastroSequenceRule') |
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"> |
||||
</script> |
||||
<script> |
||||
|
||||
$('#formStepEdit').submit(function(e) { |
||||
|
||||
e.preventDefault(); |
||||
|
||||
const form = document.querySelector('#formStepEdit') |
||||
|
||||
const opcoes = document.querySelectorAll('.sequence'); |
||||
|
||||
const el = form.querySelector("input[name='sequencia']") |
||||
const parent = el.parentNode; |
||||
|
||||
const sequence_atual = form.querySelector("input[name='sequence_atual']").value; |
||||
|
||||
|
||||
|
||||
el.classList.remove('border-red-500') |
||||
el.classList.remove('border-2') |
||||
parent.querySelector('p').classList.add('hidden'); |
||||
|
||||
if(sequence_atual === el.value){ |
||||
this.submit(); |
||||
return; |
||||
} |
||||
|
||||
|
||||
if (hasItemInArray(opcoes, el.value)) { |
||||
parent.querySelector('p').classList.remove('hidden'); |
||||
el.classList.add('border-red-500') |
||||
el.classList.add('border-2') |
||||
return; |
||||
} |
||||
|
||||
this.submit(); |
||||
|
||||
}); |
||||
|
||||
|
||||
function hasItemInArray(arr, value) { |
||||
for (let i = 0; i < arr.length; i++) { |
||||
console.log(value); |
||||
if (arr[i].innerHTML === value) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
function hasDuplicates(arr) { |
||||
for (let i = 0; i < arr.length; i++) { |
||||
for (let j = i + 1; j < arr.length; j++) { |
||||
if (arr[i].value === arr[j].value) { |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
</script> |
||||
|
||||
@endpush |
@ -0,0 +1,73 @@
|
||||
@props(['numberChannels']) |
||||
<!-- Main modal --> |
||||
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :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('redirects.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 Redirect |
||||
</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="channel"> |
||||
@foreach ($numberChannels as $numberChannel) |
||||
<option value="{{ $numberChannel->id }}">{{ $numberChannel->title }}</option> |
||||
@endforeach |
||||
</select> |
||||
</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 > |
||||
<label for="" class="dark:text-gray-100 block">Inicial: </label> |
||||
<div class="container-radio"> |
||||
<input type="radio" name="initial" checked value="on"> <span |
||||
class="mr-3 dark:text-gray-100">Sim</span> |
||||
<input type="radio" name="initial" value="off"> <span |
||||
class="dark:text-gray-100">Não</span> |
||||
</div> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Descrição: </label> |
||||
<textarea placeholder="Digite a descrição: " name="descricao" rows="5" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea> |
||||
</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,128 @@
|
||||
@props(['id_redirect', '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('redirects.options.store', ['redirect' => $id_redirect]) }}" |
||||
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 Resposta |
||||
</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-5"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Qual é a sequência: </label> |
||||
<input type="text" |
||||
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 sequence" |
||||
placeholder="Digite a sequência: " name="sequencia" required |
||||
onkeypress="return event.charCode >= 48 && event.charCode <= 57"> |
||||
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Selecione o tipo: </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="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-full 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-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="destino"> |
||||
</div> |
||||
<div> |
||||
<label for="" class="dark:text-gray-100 block">Ativo: </label> |
||||
<div class="container-radio"> |
||||
<input type="radio" name="status" value="on" checked> <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 class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Descrição: </label> |
||||
<textarea class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" |
||||
placeholder="Digite a descrição: " name="descricao" rows="3" ></textarea> |
||||
</div> |
||||
<input type="hidden" name="id_redirect" value="{{ $id_redirect }}"> |
||||
</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">Cadastrar</button> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
|
||||
@push('cadastroOptionRule') |
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" |
||||
crossorigin="anonymous"></script> |
||||
<script> |
||||
$('#formRedirectOption').submit(async function(e) { |
||||
// Impede o envio do formulário |
||||
e.preventDefault(); |
||||
const form = e.target; |
||||
const sequences = await requestSequenceOptions(); |
||||
|
||||
const el = document.querySelector('input.sequence') |
||||
const parent = el.parentNode; |
||||
|
||||
el.classList.remove('border-red-500') |
||||
el.classList.remove('border-2') |
||||
parent.querySelector('p').classList.add('hidden'); |
||||
|
||||
const hasItemInArray = sequences.includes(el.value); |
||||
|
||||
if (hasItemInArray) { |
||||
parent.querySelector('p').classList.remove('hidden'); |
||||
el.classList.add('border-red-500') |
||||
el.classList.add('border-2') |
||||
|
||||
return; |
||||
} |
||||
|
||||
this.submit(); |
||||
}); |
||||
|
||||
function requestSequenceOptions() { |
||||
return new Promise(function(resolve, reject) { |
||||
$.ajax({ |
||||
type: "get", |
||||
dataType: 'json', |
||||
url: "{{ route('options.sequence', ['redirect' => $id_redirect]) }}", |
||||
success: function(response) { |
||||
const data = response.data.data; |
||||
const sequences = data.map(item => item.sequence); |
||||
return resolve(sequences); |
||||
} |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
</script> |
||||
@endpush |
@ -1,88 +0,0 @@
|
||||
@props(['idStep']) |
||||
|
||||
<!-- Main modal --> |
||||
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :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('AdicionarRespostas')}}" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formResponseStep"> |
||||
|
||||
@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 Resposta |
||||
</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-5"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Resposta: </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 titulo: " name="resposta"> |
||||
</div> |
||||
<input type="hidden" name="id_step" value="{{$idStep}}"> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Qual é a opção: </label> |
||||
|
||||
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 opcao" placeholder="Digite a sequência: " name="opcao" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> |
||||
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p> |
||||
</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">Cadastrar</button> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
|
||||
@push('cadastroOptionRule') |
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"> |
||||
</script> |
||||
<script> |
||||
|
||||
|
||||
$('#formResponseStep').submit(function(e) { |
||||
// Impede o envio do formulário |
||||
e.preventDefault(); |
||||
|
||||
const opcoes = document.querySelectorAll('.opcoes'); |
||||
|
||||
const el = document.querySelector('input.opcao') |
||||
const parent = el.parentNode; |
||||
|
||||
el.classList.remove('border-red-500') |
||||
el.classList.remove('border-2') |
||||
parent.querySelector('p').classList.add('hidden'); |
||||
|
||||
if (hasItemInArray(opcoes, el.value)) { |
||||
parent.querySelector('p').classList.remove('hidden'); |
||||
el.classList.add('border-red-500') |
||||
el.classList.add('border-2') |
||||
|
||||
return; |
||||
} |
||||
|
||||
this.submit(); |
||||
}); |
||||
|
||||
// this.submit(); |
||||
function hasItemInArray(arr, value) { |
||||
for (let i = 0; i < arr.length; i++) { |
||||
if (arr[i].value === value) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
|
||||
} |
||||
</script> |
||||
|
||||
@endpush |
@ -1,103 +0,0 @@
|
||||
|
||||
@props(['numberChannels']) |
||||
<!-- Main modal --> |
||||
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :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('steps') }}" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formStep"> |
||||
|
||||
@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 Step |
||||
</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">Titulo: </label> |
||||
<textarea placeholder="Digite o titulo: " name="titulo" rows="5" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label class="dark:text-gray-100">Qual é Sequência: </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 a sequência: " name="sequencia" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> |
||||
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p> |
||||
</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="channel"> |
||||
@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">Escolha o tipo:</label> |
||||
<select name="tipo" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"> |
||||
<option value="listarOption" selected>Lista de Opções</option> |
||||
<option value="listarFilas">Lista de Filas</option> |
||||
</select> |
||||
</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> |
||||
|
||||
|
||||
@push('cadastroSequenceRule') |
||||
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"> |
||||
</script> |
||||
<script> |
||||
|
||||
|
||||
$('#formStep').submit(function(e) { |
||||
// Impede o envio do formulário |
||||
e.preventDefault(); |
||||
|
||||
const opcoes = document.querySelectorAll('.sequence'); |
||||
|
||||
const el = document.querySelector("input[name='sequencia']") |
||||
const parent = el.parentNode; |
||||
|
||||
el.classList.remove('border-red-500') |
||||
el.classList.remove('border-2') |
||||
parent.querySelector('p').classList.add('hidden'); |
||||
|
||||
if (hasItemInArray(opcoes, el.value)) { |
||||
parent.querySelector('p').classList.remove('hidden'); |
||||
el.classList.add('border-red-500') |
||||
el.classList.add('border-2') |
||||
|
||||
return; |
||||
} |
||||
|
||||
this.submit(); |
||||
|
||||
}); |
||||
|
||||
// this.submit(); |
||||
function hasItemInArray(arr, value) { |
||||
for (let i = 0; i < arr.length; i++) { |
||||
console.log(value); |
||||
if (arr[i].innerHTML === value) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
|
||||
} |
||||
</script> |
||||
|
||||
@endpush |
@ -1,55 +0,0 @@
|
||||
|
||||
@props(['filas', 'agentes', 'numberChannels']) |
||||
|
||||
<!-- Main modal --> |
||||
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :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('supervisor') }}" 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"> |
||||
Cadastrar Agente |
||||
</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="">Selecione o Agente: </label> |
||||
<select class="w-full" name="agente_id"> |
||||
@foreach($agentes as $agente) |
||||
<option value="{{$agente->id}}">{{$agente->nome}}</option> |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label for="">Selecione a Fila: </label> |
||||
<select class="w-full" name="fila"> |
||||
@foreach($filas as $fila) |
||||
<option value="{{$fila->nome}}" selec>{{$fila->nome}}</option> |
||||
@endforeach |
||||
</select> |
||||
</div> |
||||
<div class="flex flex-col gap-2"> |
||||
<label for="">Selecione o canal: </label> |
||||
<select class="w-full" name="channel"> |
||||
@foreach($numberChannels as $numberChannel) |
||||
<option value="{{$numberChannel->id}}">{{$numberChannel->title}}</option> |
||||
@endforeach |
||||
</select> |
||||
</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> |
Loading…
Reference in new issue