First Commit
This commit is contained in:
+127
@@ -0,0 +1,127 @@
|
||||
{% extends "layouts/dashboard.twig" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container-fluid px-4">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<h1 class="mt-4">{{ title }}</h1>
|
||||
<ol class="breadcrumb mb-4">
|
||||
<li class="breadcrumb-item"><a href="{{ url('/admin') }}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ url('/admin/globallists') }}">Listas Globais</a></li>
|
||||
<li class="breadcrumb-item active">Atividades</li>
|
||||
</ol>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#activityModal" onclick="clearForm()">
|
||||
<i class="bi bi-plus-lg me-1"></i> Nova Atividade
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<table class="table table-striped table-hover" id="activitiesTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Nome</th>
|
||||
<th>Tipo</th>
|
||||
<th>Slug</th>
|
||||
<th width="150">Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for activity in activities %}
|
||||
<tr>
|
||||
<td>{{ activity.activities_id }}</td>
|
||||
<td>{{ activity.name }}</td>
|
||||
<td>
|
||||
{% if activity.activities_type == 'commercial' %}
|
||||
<span class="badge bg-primary">Comercial</span>
|
||||
{% elseif activity.activities_type == 'service' %}
|
||||
<span class="badge bg-success">Serviço</span>
|
||||
{% elseif activity.activities_type == 'industrial' %}
|
||||
<span class="badge bg-warning text-dark">Industrial</span>
|
||||
{% else %}
|
||||
<span class="badge bg-secondary">{{ activity.activities_type }}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td><code>{{ activity.activities_slug }}</code></td>
|
||||
<td>
|
||||
<button type="button" class="btn btn-sm btn-outline-primary"
|
||||
onclick="editActivity({{ activity|json_encode }})">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</button>
|
||||
<a href="{{ url('/admin/globallists/activities/delete/' ~ activity.activities_id) }}"
|
||||
class="btn btn-sm btn-outline-danger"
|
||||
onclick="return confirm('Tem certeza que deseja excluir esta atividade?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="activityModal" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<form action="{{ url('/admin/globallists/activities/save') }}" method="POST" class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modalTitle">Nova Atividade</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input type="hidden" name="activities_id" id="activities_id">
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Nome da Atividade</label>
|
||||
<input type="text" name="activities_name" id="activities_name" class="form-control" required>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Tipo</label>
|
||||
<select name="activities_type" id="activities_type" class="form-select" required>
|
||||
<option value="commercial">Comercial</option>
|
||||
<option value="service">Serviço</option>
|
||||
<option value="industrial">Industrial</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
|
||||
<button type="submit" class="btn btn-primary">Salvar</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function clearForm() {
|
||||
document.getElementById('activities_id').value = '';
|
||||
document.getElementById('activities_name').value = '';
|
||||
document.getElementById('activities_type').value = 'commercial';
|
||||
document.getElementById('modalTitle').innerText = 'Nova Atividade';
|
||||
}
|
||||
|
||||
function editActivity(activity) {
|
||||
document.getElementById('activities_id').value = activity.activities_id;
|
||||
|
||||
// Se for um objeto (JSON), tenta pegar o locale atual ou pt_BR
|
||||
var name = activity.activities_name;
|
||||
if (typeof name === 'object' && name !== null) {
|
||||
// Tenta pegar o locale atual (passado do PHP via Twig) ou fallback
|
||||
var currentLocale = '{{ current_locale }}';
|
||||
name = name[currentLocale] || name['pt_BR'] || Object.values(name)[0];
|
||||
}
|
||||
|
||||
document.getElementById('activities_name').value = name;
|
||||
document.getElementById('activities_type').value = activity.activities_type;
|
||||
document.getElementById('modalTitle').innerText = 'Editar Atividade';
|
||||
|
||||
var modal = new bootstrap.Modal(document.getElementById('activityModal'));
|
||||
modal.show();
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
Executable
+208
@@ -0,0 +1,208 @@
|
||||
{% extends "layouts/dashboard.twig" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container-fluid px-4">
|
||||
<h1 class="mt-4">{{ title }}</h1>
|
||||
<ol class="breadcrumb mb-4">
|
||||
<li class="breadcrumb-item"><a href="{{ url('/admin') }}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item active">Listas Globais</li>
|
||||
</ol>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xl-3 col-md-6">
|
||||
<div class="card bg-dark text-white mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<div class="small text-white-50">Países Cadastrados</div>
|
||||
<div class="display-6">{{ countriesCount }}</div>
|
||||
</div>
|
||||
<i class="bi bi-globe fs-1 opacity-50"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer d-flex align-items-center justify-content-between">
|
||||
<span class="small text-white">Visualização Apenas</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-3 col-md-6">
|
||||
<div class="card bg-primary text-white mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<div class="small text-white-50">Estados Cadastrados</div>
|
||||
<div class="display-6">{{ statesCount }}</div>
|
||||
</div>
|
||||
<i class="bi bi-map fs-1 opacity-50"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer d-flex align-items-center justify-content-between">
|
||||
<span class="small text-white">Visualização Apenas</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-3 col-md-6">
|
||||
<div class="card bg-success text-white mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<div class="small text-white-50">Cidades Cadastradas</div>
|
||||
<div class="display-6">{{ citiesCount }}</div>
|
||||
</div>
|
||||
<i class="bi bi-geo-alt fs-1 opacity-50"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer d-flex align-items-center justify-content-between">
|
||||
<span class="small text-white">Visualização Apenas</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-3 col-md-6">
|
||||
<div class="card bg-info text-white mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<div class="small text-white-50">Atividades Cadastradas</div>
|
||||
<div class="display-6">{{ activitiesCount }}</div>
|
||||
</div>
|
||||
<i class="bi bi-briefcase fs-1 opacity-50"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer d-flex align-items-center justify-content-between">
|
||||
<a class="small text-white stretched-link" href="{{ url('/admin/globallists/activities') }}">Gerenciar Atividades</a>
|
||||
<div class="small text-white"><i class="bi bi-chevron-right"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<i class="bi bi-search me-1"></i>
|
||||
Visualizar Listas
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<div class="mb-3">
|
||||
<label for="select-country" class="form-label">Países</label>
|
||||
<select id="select-country" class="form-select">
|
||||
<option value="">Selecione um País</option>
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.countries_id }}">{{ country.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="mb-3">
|
||||
<label for="select-state" class="form-label">Estados</label>
|
||||
<select id="select-state" class="form-select" disabled>
|
||||
<option value="">Selecione um País primeiro</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="mb-3">
|
||||
<label for="select-city" class="form-label">Cidades</label>
|
||||
<select id="select-city" class="form-select" disabled>
|
||||
<option value="">Selecione um Estado primeiro</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="mb-3">
|
||||
<label for="select-activity" class="form-label">Atividades</label>
|
||||
<select id="select-activity" class="form-select">
|
||||
<option value="">Selecione uma Atividade</option>
|
||||
{% for activity in activities %}
|
||||
<option value="{{ activity.activities_id }}">{{ activity.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<i class="bi bi-info-circle me-1"></i>
|
||||
Informações sobre o Módulo de Listas
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>Este módulo centraliza dados que são utilizados por múltiplos módulos do sistema, como o <strong>Guia Comercial</strong>.</p>
|
||||
<ul>
|
||||
<li><strong>Estados e Cidades:</strong> Importados automaticamente do IBGE/Correios.</li>
|
||||
<li><strong>Atividades:</strong> Lista global de ramos de atuação comercial, industrial e de serviços.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const countrySelect = document.getElementById('select-country');
|
||||
const stateSelect = document.getElementById('select-state');
|
||||
const citySelect = document.getElementById('select-city');
|
||||
|
||||
countrySelect.addEventListener('change', function() {
|
||||
const countryId = this.value;
|
||||
stateSelect.innerHTML = '<option value="">Carregando...</option>';
|
||||
stateSelect.disabled = true;
|
||||
citySelect.innerHTML = '<option value="">Selecione um Estado primeiro</option>';
|
||||
citySelect.disabled = true;
|
||||
|
||||
if (!countryId) {
|
||||
stateSelect.innerHTML = '<option value="">Selecione um País primeiro</option>';
|
||||
return;
|
||||
}
|
||||
|
||||
fetch(`{{ url('/api/globallists/states/') }}${countryId}`)
|
||||
.then(response => response.json())
|
||||
.then(states => {
|
||||
stateSelect.innerHTML = '<option value="">Selecione um Estado</option>';
|
||||
states.forEach(state => {
|
||||
const option = document.createElement('option');
|
||||
option.value = state.id;
|
||||
option.textContent = state.name;
|
||||
stateSelect.appendChild(option);
|
||||
});
|
||||
stateSelect.disabled = false;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Erro ao carregar estados:', error);
|
||||
stateSelect.innerHTML = '<option value="">Erro ao carregar estados</option>';
|
||||
});
|
||||
});
|
||||
|
||||
stateSelect.addEventListener('change', function() {
|
||||
const stateId = this.value;
|
||||
citySelect.innerHTML = '<option value="">Carregando...</option>';
|
||||
citySelect.disabled = true;
|
||||
|
||||
if (!stateId) {
|
||||
citySelect.innerHTML = '<option value="">Selecione um Estado primeiro</option>';
|
||||
return;
|
||||
}
|
||||
|
||||
fetch(`{{ url('/api/globallists/cities/') }}${stateId}`)
|
||||
.then(response => response.json())
|
||||
.then(cities => {
|
||||
citySelect.innerHTML = '<option value="">Selecione uma Cidade</option>';
|
||||
cities.forEach(city => {
|
||||
const option = document.createElement('option');
|
||||
option.value = city.id;
|
||||
option.textContent = city.name;
|
||||
citySelect.appendChild(option);
|
||||
});
|
||||
citySelect.disabled = false;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Erro ao carregar cidades:', error);
|
||||
citySelect.innerHTML = '<option value="">Erro ao carregar cidades</option>';
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user