Commit 363decac authored by unknown's avatar unknown
Browse files

Commands Build ModalForm - Api Service Repository - Datatable Release

parent 98373e43
No related merge requests found
Showing with 257 additions and 145 deletions
+257 -145
......@@ -3,7 +3,7 @@
namespace App\Http\Livewire\Datatable{{ relative_name_space }};
use App\Http\Livewire\Datatable;
use App\Entities\{{ name }}\Services\{{ name }}Service;
use App\Entities\{{ relative_name_space }}{{ name }}\Services\{{ name }}Service;
class {{ name }} extends Datatable
{
......
......@@ -4,7 +4,7 @@ namespace App\Http\Livewire\Modal{{ relative_name_space }};
use App\Http\Livewire\Modal;
use App\Http\Livewire\Operations\EntityManagementOperation;
use App\Entities\{{ name }}\Services\{{ name }}Service;
use App\Entities\{{ relative_name_space }}{{ name }}\Services\{{ name }}Service;
class {{ name }} extends Modal
{
......
......@@ -4,8 +4,6 @@
use App\Entities\Api\Repositories\ApiRepository;
use App\Entities\Company\Repositories\CompanyRepositoryInterface;
use App\Models\CompanyToken;
use App\Utils\DateManager;
class CompanyRepository extends ApiRepository implements CompanyRepositoryInterface
{
......@@ -14,7 +12,7 @@ class CompanyRepository extends ApiRepository implements CompanyRepositoryInterf
/**
* @throws \App\Entities\Api\Exceptions\ApiException
*/
public function getAll(): array
public function get(): array
{
$this->response = $this->httpClient->get(self::ENDPOINT);
$this->validateResponse();
......@@ -34,7 +32,7 @@ public function create(array $data): array
/**
* @throws \App\Entities\Api\Exceptions\ApiException
*/
public function update(int $id, array $data): array
public function update(int|string $id, array $data): array
{
$this->response = $this->httpClient->put(self::ENDPOINT . "/$id", $data);
$this->validateResponse();
......@@ -44,81 +42,10 @@ public function update(int $id, array $data): array
/**
* @throws \App\Entities\Api\Exceptions\ApiException
*/
public function delete(int $id): array
public function delete(int|string $id): array
{
$this->response = $this->httpClient->delete(self::ENDPOINT . "/$id");
$this->validateResponse();
return $this->response['company'];
}
/**
* @throws \App\Entities\Api\Exceptions\ApiException
*/
public function getToken(int $id): array
{
$companyToken = CompanyToken::where(['company_id' => $id])->first();
if (!$companyToken) {
$this->createCompanyToken($id);
$this->storeToken($id, $this->response);
} else {
if ($this->validateTokenExpiration($companyToken->data)) {
$this->response = $companyToken->data;
} else {
$this->createCompanyToken($id);
$this->updateCompanyToken($id, $this->response);
}
}
$dateManager = new DateManager();
return [
'token' => $this->response['access_token'],
'expiration' => $dateManager->convertToSystemTimezone($this->response['expires_at'], $this->response['time_zone'])
];
}
/**
* @throws \App\Entities\Api\Exceptions\ApiException
*/
public function updateToken(int $id): array
{
$this->createCompanyToken($id);
$this->updateCompanyToken($id, $this->response);
$dateManager = new DateManager();
return [
'token' => $this->response['access_token'],
'expiration' => $dateManager->convertToSystemTimezone($this->response['expires_at'], $this->response['time_zone'])
];
}
private function validateTokenExpiration(array $tokenData): bool
{
$expiresAt = $tokenData['expires_at'];
$timeZone = $tokenData['time_zone'];
$dateManager = new DateManager();
return (!$dateManager->dateExpired($expiresAt, $timeZone));
}
private function createCompanyToken(int $id)
{
$this->response = $this->httpClient->post(self::ENDPOINT . "/$id/token");
$this->validateResponse();
}
private function storeToken($companyId, $data)
{
CompanyToken::create([
'company_id' => $companyId,
'data' => $data,
]);
}
private function updateCompanyToken($companyId, $data)
{
CompanyToken::where(['company_id' => $companyId])
->update([
'data' => $data,
]);
}
}
......@@ -2,18 +2,15 @@
namespace App\Entities\Company\Repositories;
use App\Specifications\Specification;
interface CompanyRepositoryInterface
{
public function getAll(): array;
public function get(): array;
public function create(array $data): array;
public function update(int $id, array $data): array;
public function delete(int $id): array;
public function getToken(int $id): array;
public function updateToken(int $id): array;
public function update(int|string $id, array $data): array;
public function delete(int|string $id): array;
}
......@@ -4,44 +4,42 @@
use App\Contracts\EntityManagement;
use App\Entities\Company\Repositories\CompanyRepositoryInterface;
use App\Entities\Company\Validations\CompanyValidator;
class CompanyService implements EntityManagement
{
protected CompanyRepositoryInterface $repository;
protected CompanyRepositoryInterface $CompanyRepository;
protected CompanyValidator $CompanyValidator;
public function __construct(CompanyRepositoryInterface $repository)
public function __construct(
CompanyRepositoryInterface $CompanyRepository,
CompanyValidator $CompanyValidator
)
{
$this->repository = $repository;
$this->CompanyRepository = $CompanyRepository;
$this->CompanyValidator = $CompanyValidator;
}
public function getAll(): array
public function get(): array
{
return $this->repository->getAll();
return $this->CompanyRepository->get();
}
public function create(array $data): array
{
return $this->repository->create($data);
$validatedData = $this->CompanyValidator->onCreate($data);
return $this->CompanyRepository->create($validatedData);
}
public function update(int $id, array $data): array
public function update(int|string $id, array $data): array
{
return $this->repository->update($id, $data);
$validatedData = $this->CompanyValidator->onUpdate($data);
return $this->CompanyRepository->update($id, $validatedData);
}
public function delete(int $id): array
public function delete(int|string $id): array
{
return $this->repository->delete($id);
return $this->CompanyRepository->delete($id);
}
public function getToken(int $id): array
{
return $this->repository->getToken($id);
}
public function updateToken(int $id): array
{
return $this->repository->updateToken($id);
}
}
<?php
namespace App\Entities\Company\Validations;
use Illuminate\Support\Facades\Validator;
class CompanyValidator
{
/**
* @throws \Illuminate\Validation\ValidationException
*/
public function onCreate(array $data): array
{
$validator = Validator::make($data, [
'code' => 'required',
'name' => 'required',
'email' => 'required',
'phone_number' => 'required',
]);
return $validator->validate();
}
/**
* @throws \Illuminate\Validation\ValidationException
*/
public function onUpdate(array $data): array
{
$validator = Validator::make($data, [
'code' => 'required',
'name' => 'required',
'email' => 'required',
'phone_number' => 'required',
]);
return $validator->validate();
}
}
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
class CompaniesController extends Controller
{
public function index()
{
return view('company.index');
}
}
......@@ -7,11 +7,12 @@
class Company extends Datatable
{
public string $datatableView = 'system.company.datatable';
public string $datatableOptionsView = 'system.company.buttons';
public string $idName = 'id';
public string $datatableView = 'company.datatable';
public string $datatableOptionsView = 'company.buttons';
public function mount(CompanyService $companyService)
{
$this->data = $companyService->getAll();
$this->data = $companyService->get();
}
}
......@@ -3,23 +3,23 @@
namespace App\Http\Livewire\Modal;
use App\Http\Livewire\Modal;
use App\Entities\Company\Services\CompanyService;
use App\Http\Livewire\Operations\EntityManagementOperation;
use App\Entities\Company\Services\CompanyService;
class Company extends Modal
{
use EntityManagementOperation;
public string $view = 'system.company.form';
public string $view = 'company.form';
public int $dataId = 0;
public string $dataId = '0';
public string $code = '';
public string $name = '';
public string $email = '';
public string $password = '';
public array $token = [];
public string $phone_number = '';
protected $listeners = ['create', 'update', 'delete', 'edit', 'token', 'updateToken'];
protected $listeners = ['create', 'update', 'delete', 'edit'];
public function rules()
{
......@@ -27,8 +27,9 @@ public function rules()
'dataId' => 'required',
'code' => 'required',
'name' => 'required',
'email' => 'required|email',
'password' => 'sometimes',
'email' => 'required',
'phone_number' => 'required',
];
}
......@@ -40,50 +41,46 @@ public function edit($data)
$this->code = $data['code'];
$this->name = $data['name'];
$this->email = $data['email'];
$this->phone_number = $data['phone_number'];
}
public function create(CompanyService $service)
public function create(CompanyService $companyService)
{
$data = $this->validate();
$entity = $this->createEntity($service, $data);
$entity = $this->createEntity($companyService, $data);
if (!empty($entity)) {
$this->emitTo('datatable.company', 'add', $entity);
}
}
public function update(CompanyService $service)
public function update(CompanyService $companyService)
{
$data = $this->validate();
$entity = $this->updateEntity($service, $data['dataId'], $data);
$entity = $this->updateEntity($companyService, $data['dataId'], $data);
if (!empty($entity)) {
$this->emitTo('datatable.company', 'update', $entity);
}
}
public function delete(CompanyService $service)
public function delete(CompanyService $companyService)
{
$data = $this->validate();
$entity = $this->deleteEntity($service, $data['dataId']);
$entity = $this->deleteEntity($companyService, $data['dataId']);
if (!empty($entity)) {
$this->emitTo('datatable.company', 'delete', $entity);
}
}
public function token($data, CompanyService $service)
{
$this->status = 'view';
$this->token = $service->getToken($data['id']);
$this->dataId = $data['id'];
}
public function updateToken( CompanyService $service)
{
$this->status = 'view';
$this->token = $service->updateToken($this->dataId);
}
private function resetData()
{
$this->reset(['dataId', 'code', 'name', 'email', 'password', 'token']);
$this->reset([
'dataId',
'code',
'name',
'email',
'phone_number',
]);
}
}
<button
x-data x-on:click.prevent="$dispatch('set-modal', {title: 'Agregar empresa', action: 'create', status: 'view'})"
data-bs-toggle="modal"
data-bs-target="#company-modal"
class="btn btn-primary">
<span class="fas fa-plus me-2"></span> Agregar
</button>
<table class="table table-sm fs--1 mb-0">
<thead>
<tr>
<th x-on:click="sort('code')" class="align-middle" style="width:0%; min-width:100px;">Code</th>
<th x-on:click="sort('name')" class="align-middle" style="width:0%; min-width:100px;">Name</th>
<th x-on:click="sort('email')" class="align-middle" style="width:0%; min-width:100px;">Email</th>
<th x-on:click="sort('phone_number')" class="align-middle" style="width:0%; min-width:100px;">Phone Number</th>
<th class="align-middle text-end" style="width:0%; min-width:100px;">Actions</th>
</tr>
</thead>
<tbody>
<template x-for="item in getData">
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
<td class="align-middle white-space-nowrap fw-semi-bold text-1100 code" x-text="item.code"></td>
<td class="align-middle white-space-nowrap fw-semi-bold text-1100 name" x-text="item.name"></td>
<td class="align-middle white-space-nowrap fw-semi-bold text-1100 email" x-text="item.email"></td>
<td class="align-middle white-space-nowrap fw-semi-bold text-1100 phone_number" x-text="item.phone_number"></td>
<td x-data class="align-middle text-end white-space-nowrap">
<a href="#" data-bs-toggle="modal" data-bs-target="#company-modal"
x-data x-on:click.prevent="
$dispatch('set-modal', {status: 'loading', action: 'update', title: 'Editar empresa'}),
Livewire.emitTo('modal.company', 'edit', item)">
Editar
</a>
<!--|
<a href="#" data-bs-toggle="modal" data-bs-target="#company-modal"
x-on:click.prevent="
$dispatch('set-modal', {status: 'loading', action: 'delete', title: 'Eliminar empresa'}),
Livewire.emitTo('modal.company', 'edit', item)">
Eliminar
</a>-->
</td>
</tr>
</template>
</tbody>
</table>
<div>
<form x-data="xForm()" class="form-content">
<input wire:model.defer="dataId" type="text" hidden>
<div class="modal-body">
<div x-show="(action!='delete')" class="row g-3">
<div class="col-md-6">
<label class="form-label">Code</label>
<input wire:model.defer="code" name="code" class="form-control" type="text" autocomplete="off"/>
</div>
<div class="col-md-6">
<label class="form-label">Name</label>
<input wire:model.defer="name" name="name" class="form-control" type="text" autocomplete="off"/>
</div>
<div class="col-md-6">
<label class="form-label">Email</label>
<input wire:model.defer="email" name="email" class="form-control" type="text" autocomplete="off"/>
</div>
<div class="col-md-6">
<label class="form-label">Phone Number</label>
<input wire:model.defer="phone_number" name="phone_number" class="form-control" type="text" autocomplete="off"/>
</div>
</div>
<div x-show="(action=='delete')" class="row g-3">
<x-modal-form.delete-message>
<x-slot name="confirmationWord">{{ $name }}</x-slot>
</x-modal-form.delete-message>
</div>
</div>
<div class="modal-footer">
<button x-on:click.prevent="submit($root)" class="btn btn-primary">Confirmar</button>
<button x-on:click="clear($root)" class="btn btn-outline-primary" type="button" data-bs-dismiss="modal">Cerrar</button>
</div>
</form>
<script>
const xForm = () => {
return {
validation: {
code: [
{type: 'required', message: 'Campo Requerido'},
],
name: [
{type: 'required', message: 'Campo Requerido'},
],
email: [
{type: 'required', message: 'Campo Requerido'},
],
phone_number: [
{type: 'required', message: 'Campo Requerido'},
],
},
submit(form) {
let validation = this.validation
if (this.action != 'delete' && !$form(form).validate(validation)) {
return;
}
this.status = 'loading'
Livewire.emitTo('modal.company', this.action);
},
clear(form) {
form.reset()
$form(form).validate({})
}
}
}
</script>
</div>
@extends('layouts.admin.admin')
@section('content')
<!-- Nav Section -->
<nav class="mb-2" aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a href="#!">System</a></li>
<li class="breadcrumb-item active">Empresas</li>
</ol>
</nav>
<!-- Header -->
<h2 class="text-bold text-1100 mb-5">Empresas</h2>
<livewire:datatable.company/>
@php($modalId = 'company-modal')
<livewire:modal.company :modalId="$modalId"/>
@endsection
......@@ -18,9 +18,9 @@
</a>
<ul class="nav collapse parent" id="dashboard">
<li class="nav-item">
<a class="nav-link" href="/system/company" data-bs-toggle="" aria-expanded="false">
<a class="nav-link" href="/admin/companies" data-bs-toggle="" aria-expanded="false">
<div class="d-flex align-items-center">
<span class="nav-link-text">Compañias</span>
<span class="nav-link-text">Empresas</span>
</div>
</a>
</li>
......
......@@ -40,6 +40,7 @@
Route::delete('/admin/user', [App\Http\Controllers\Admin\UsersController::class, 'delete']);
});
// Only Admin
......@@ -66,13 +67,8 @@
/*== System Company ==*/
Route::get('/system/client', [App\Http\Controllers\System\CompanyController::class, 'index']);
Route::post('/system/client', [App\Http\Controllers\System\CompanyController::class, 'create']);
Route::put('/system/client', [App\Http\Controllers\System\CompanyController::class, 'update']);
Route::get('/admin/companies', [App\Http\Controllers\Admin\CompaniesController::class, 'index']);
Route::delete('/system/client', [App\Http\Controllers\System\CompanyController::class, 'delete']);
/*== TEST ==*/
......@@ -84,6 +80,8 @@
Route::delete('/example/datatable', [App\Http\Controllers\Example\DatatableController::class, 'apiResponse']);
});
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment