Initial commit
This commit is contained in:
57
assets/css/admin.css
Normal file
57
assets/css/admin.css
Normal file
@@ -0,0 +1,57 @@
|
||||
/* No changes needed, but ensure this file exists as referenced in class-eventos-admin.php */
|
||||
.evento-metabox {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px;
|
||||
padding: 15px 0;
|
||||
}
|
||||
.meta-field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
}
|
||||
.meta-field label {
|
||||
font-weight: 600;
|
||||
}
|
||||
.meta-field input[type="date"],
|
||||
.meta-field input[type="time"],
|
||||
.meta-field input[type="text"] {
|
||||
padding: 8px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 4px;
|
||||
max-width: 300px;
|
||||
}
|
||||
#eventos-calendario-widget {
|
||||
min-width: 280px;
|
||||
min-height: 340px;
|
||||
font-size: 15px;
|
||||
max-height: 370px;
|
||||
overflow: hidden;
|
||||
border-radius: 18px; /* Mais arredondado */
|
||||
box-shadow: 0 2px 16px rgba(44,62,80,0.10);
|
||||
border: none;
|
||||
background: #fff;
|
||||
}
|
||||
#eventos-calendario-widget .fc {
|
||||
border-radius: 18px;
|
||||
box-shadow: 0 2px 16px rgba(44,62,80,0.10);
|
||||
background: #fff;
|
||||
padding: 16px 8px 8px 8px;
|
||||
}
|
||||
#eventos-calendario-widget .fc-day-number {
|
||||
border-radius: 50%;
|
||||
}
|
||||
#eventos-calendario-widget .fc-center h2 {
|
||||
color: #3498db;
|
||||
}
|
||||
#eventos-calendario-widget .fc-today .fc-day-number {
|
||||
background: #3498db;
|
||||
color: #fff;
|
||||
box-shadow: 0 2px 8px rgba(52,152,219,0.15);
|
||||
}
|
||||
#eventos-calendario-widget .fc-has-event .fc-day-number {
|
||||
background: #217dbb;
|
||||
color: #fff;
|
||||
border: 2px solid #3498db;
|
||||
box-shadow: 0 2px 8px rgba(52,152,219,0.15);
|
||||
}
|
288
assets/css/eventos-manager.css
Normal file
288
assets/css/eventos-manager.css
Normal file
@@ -0,0 +1,288 @@
|
||||
/* CSS Mínimo para Estrutura do Gerenciador de Eventos */
|
||||
|
||||
.noticias-eventos-wrapper {
|
||||
display: flex;
|
||||
gap: 40px;
|
||||
}
|
||||
|
||||
.noticias-col {
|
||||
flex: 2;
|
||||
}
|
||||
|
||||
.eventos-col {
|
||||
flex: 1;
|
||||
min-width: 280px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 30px;
|
||||
}
|
||||
.proximos-eventos-lista {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.proximos-eventos-lista li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.evento-titulo a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.evento-tipo {
|
||||
margin-left: auto;
|
||||
}
|
||||
@media (max-width: 900px) {
|
||||
.noticias-eventos-wrapper {
|
||||
flex-direction: column;
|
||||
}
|
||||
.eventos-col {
|
||||
min-width: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Estilos do Novo Calendário Offline --- */
|
||||
.em-calendario-wrapper {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||
background: #fff;
|
||||
border: 1px solid #e5e5e5;
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
box-shadow: 0 2px 5px rgba(0,0,0,0.05);
|
||||
}
|
||||
.em-calendario-wrapper[data-view="full"] .em-dia-celula {
|
||||
height: 100px; /* Aumenta a altura para caber eventos */
|
||||
}
|
||||
.em-toolbar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 15px;
|
||||
user-select: none;
|
||||
}
|
||||
.em-toolbar-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
}
|
||||
.em-toolbar-center {
|
||||
justify-content: center;
|
||||
flex-grow: 1;
|
||||
}
|
||||
.em-toolbar-right {
|
||||
justify-content: flex-end;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.em-mes-ano {
|
||||
font-size: 1.2em;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
.em-nav-btn {
|
||||
background: #f7f7f7;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
padding: 5px 10px;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
color: #555;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.em-view-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
font-size: 22px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.em-nav-btn:hover {
|
||||
background: #e9e9e9;
|
||||
}
|
||||
|
||||
.em-today-btn {
|
||||
font-weight: normal;
|
||||
padding: 5px 12px;
|
||||
}
|
||||
|
||||
.em-dias-semana, .em-dias-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(7, 1fr);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.em-dias-semana span {
|
||||
font-weight: 600;
|
||||
color: #777;
|
||||
font-size: 0.85em;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.em-dia-celula {
|
||||
position: relative;
|
||||
padding: 4px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
font-size: 0.9em;
|
||||
border-right: 1px solid #eee;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.em-dia-celula.em-other-month {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
.em-dia-celula.today span {
|
||||
background-color: #e74c3c;
|
||||
color: #fff;
|
||||
border-radius: 50%;
|
||||
width: 28px;
|
||||
line-height: 26px;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.em-event-list {
|
||||
width: 100%;
|
||||
margin-top: 5px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 3px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.em-event {
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-size: 12px;
|
||||
padding: 2px 6px;
|
||||
border-radius: 3px;
|
||||
color: #fff;
|
||||
background-color: #3498db;
|
||||
text-decoration: none;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.em-event:hover {
|
||||
background-color: #217dbb;
|
||||
}
|
||||
|
||||
/* --- Estilos para Tela Cheia --- */
|
||||
body.em-fullscreen-active {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.em-calendario-wrapper.em-fullscreen-mode {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
z-index: 10000;
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
padding: 20px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.em-calendario-wrapper.em-fullscreen-mode .em-dias-grid {
|
||||
flex-grow: 1; /* Faz a grade de dias ocupar o espaço disponível */
|
||||
}
|
||||
|
||||
.em-calendario-wrapper.em-fullscreen-mode .em-dia-celula {
|
||||
height: auto; /* Altura automática para preencher o espaço */
|
||||
}
|
||||
|
||||
.em-close-fullscreen-btn {
|
||||
position: absolute;
|
||||
top: 15px;
|
||||
right: 20px;
|
||||
background: none;
|
||||
border: none;
|
||||
font-size: 36px;
|
||||
line-height: 1;
|
||||
color: #333;
|
||||
cursor: pointer;
|
||||
z-index: 10001;
|
||||
}
|
||||
|
||||
.em-close-fullscreen-btn:hover {
|
||||
color: #e74c3c;
|
||||
}
|
||||
|
||||
/* Estilos para single-evento.php */
|
||||
.single-evento-container {
|
||||
max-width: 800px; /* Largura máxima para centralizar */
|
||||
margin: 0 auto; /* Centraliza horizontalmente */
|
||||
padding: 30px 20px;
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 20px rgba(44, 62, 80, 0.1);
|
||||
}
|
||||
|
||||
.evento-header {
|
||||
text-align: center;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.evento-header h1 {
|
||||
font-size: 2rem;
|
||||
color: #2c3e50;
|
||||
font-weight: 700;
|
||||
margin: 0;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.evento-details {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.evento-info-list {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.evento-info-list li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.evento-info-list li strong {
|
||||
min-width: 80px; /* Ajuda a alinhar os rótulos */
|
||||
}
|
||||
|
||||
/* Responsividade */
|
||||
@media (max-width: 600px) {
|
||||
.single-evento-container {
|
||||
padding: 20px 15px;
|
||||
}
|
||||
|
||||
.evento-info-list li {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.evento-info-list li strong {
|
||||
min-width: auto;
|
||||
}
|
||||
}
|
18
assets/js/admin.js
Normal file
18
assets/js/admin.js
Normal file
@@ -0,0 +1,18 @@
|
||||
jQuery(document).ready(function($) {
|
||||
$('#data_evento').on('change', function() {
|
||||
var date = $(this).val();
|
||||
if (!date) {
|
||||
alert('Por favor, selecione uma data válida.');
|
||||
$(this).focus();
|
||||
}
|
||||
});
|
||||
|
||||
$('#hora_evento').on('change', function() {
|
||||
var time = $(this).val();
|
||||
if (time && !/^\d{2}:\d{2}$/.test(time)) {
|
||||
alert('Por favor, insira uma hora válida no formato HH:MM.');
|
||||
$(this).val('');
|
||||
$(this).focus();
|
||||
}
|
||||
});
|
||||
});
|
150
assets/js/eventos-manager.js
Normal file
150
assets/js/eventos-manager.js
Normal file
@@ -0,0 +1,150 @@
|
||||
jQuery(document).ready(function($) {
|
||||
// Itera sobre cada instância de calendário na página
|
||||
$('.em-calendario-wrapper').each(function() {
|
||||
const calendarWrapper = $(this);
|
||||
let currentDate = new Date();
|
||||
|
||||
const header = calendarWrapper.find('.em-mes-ano');
|
||||
const weekDaysContainer = calendarWrapper.find('.em-dias-semana');
|
||||
const daysGrid = calendarWrapper.find('.em-dias-grid');
|
||||
|
||||
// Nomes para internacionalização
|
||||
const monthNames = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"];
|
||||
const weekDayNames = ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"];
|
||||
|
||||
function renderCalendar() {
|
||||
daysGrid.html(''); // Usar .html('') é um pouco mais rápido que .empty()
|
||||
weekDaysContainer.empty();
|
||||
|
||||
const month = currentDate.getMonth();
|
||||
const year = currentDate.getFullYear();
|
||||
|
||||
// Define o cabeçalho (Mês Ano)
|
||||
header.text(monthNames[month] + ' ' + year);
|
||||
|
||||
// Renderiza os dias da semana
|
||||
weekDayNames.forEach(day => {
|
||||
weekDaysContainer.append(`<span>${day}</span>`);
|
||||
});
|
||||
|
||||
const firstDayOfMonth = new Date(year, month, 1).getDay();
|
||||
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
||||
|
||||
// Preenche os dias vazios no início do mês
|
||||
for (let i = 0; i < firstDayOfMonth; i++) {
|
||||
daysGrid.append('<div class="em-dia-celula em-other-month"></div>');
|
||||
}
|
||||
|
||||
// Renderiza os dias do mês
|
||||
for (let i = 1; i <= daysInMonth; i++) {
|
||||
const dayCell = $(`<div class="em-dia-celula" data-date="${year}-${String(month + 1).padStart(2, '0')}-${String(i).padStart(2, '0')}"><span>${i}</span></div>`);
|
||||
|
||||
// Marca o dia de hoje
|
||||
const today = new Date();
|
||||
if (i === today.getDate() && month === today.getMonth() && year === today.getFullYear()) {
|
||||
dayCell.addClass('today');
|
||||
}
|
||||
daysGrid.append(dayCell);
|
||||
}
|
||||
|
||||
loadEventsForMonth(year, month);
|
||||
}
|
||||
|
||||
function loadEventsForMonth(year, month) {
|
||||
const startDate = `${year}-${String(month + 1).padStart(2, '0')}-01`;
|
||||
const endDate = new Date(year, month + 1, 0).toISOString().split('T')[0];
|
||||
|
||||
$.ajax({
|
||||
url: eventosManager.ajaxurl,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'get_eventos_calendario',
|
||||
security: eventosManager.nonce,
|
||||
start: startDate,
|
||||
end: endDate
|
||||
},
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
markEventsOnCalendar(response.data);
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
console.error('Erro ao carregar eventos.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function markEventsOnCalendar(events) {
|
||||
// 1. Agrupar eventos por data
|
||||
const eventsByDate = events.reduce((acc, event) => {
|
||||
const eventDate = event.start.split('T')[0];
|
||||
if (!acc[eventDate]) {
|
||||
acc[eventDate] = [];
|
||||
}
|
||||
acc[eventDate].push(event);
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
// 2. Limpar eventos antigos e renderizar os novos
|
||||
daysGrid.find('.em-dia-celula').each(function() {
|
||||
const cell = $(this);
|
||||
const date = cell.data('date');
|
||||
|
||||
// Limpa conteúdo de eventos anteriores
|
||||
cell.find('.em-event-list').remove();
|
||||
cell.removeClass('has-event');
|
||||
|
||||
if (eventsByDate[date]) {
|
||||
cell.addClass('has-event');
|
||||
const eventList = $('<div class="em-event-list"></div>');
|
||||
eventsByDate[date].forEach(event => {
|
||||
const eventEl = $(`<a href="${event.url}" class="em-event"></a>`);
|
||||
eventEl.text(event.title);
|
||||
eventList.append(eventEl);
|
||||
});
|
||||
cell.append(eventList);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Navegação
|
||||
calendarWrapper.find('.em-nav-btn').on('click', function() {
|
||||
const direction = $(this).data('nav');
|
||||
const currentMonth = currentDate.getMonth();
|
||||
|
||||
if (direction === 'prev') {
|
||||
currentDate.setMonth(currentMonth - 1);
|
||||
} else if (direction === 'next') {
|
||||
currentDate.setMonth(currentMonth + 1);
|
||||
} else if (direction === 'today') {
|
||||
currentDate = new Date();
|
||||
}
|
||||
renderCalendar();
|
||||
});
|
||||
|
||||
// Botão de Tela Cheia
|
||||
calendarWrapper.find('.em-view-btn[data-view="fullscreen"]').on('click', function() {
|
||||
calendarWrapper.toggleClass('em-fullscreen-mode');
|
||||
$('body').toggleClass('em-fullscreen-active');
|
||||
|
||||
if (calendarWrapper.hasClass('em-fullscreen-mode')) {
|
||||
// Adiciona botão de fechar
|
||||
calendarWrapper.append('<button class="em-close-fullscreen-btn">×</button>');
|
||||
} else {
|
||||
// Remove botão de fechar
|
||||
calendarWrapper.find('.em-close-fullscreen-btn').remove();
|
||||
}
|
||||
});
|
||||
|
||||
// Fechar tela cheia com o botão 'X' (evento delegado)
|
||||
calendarWrapper.on('click', '.em-close-fullscreen-btn', function() {
|
||||
calendarWrapper.removeClass('em-fullscreen-mode');
|
||||
$('body').removeClass('em-fullscreen-active');
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
// Renderização inicial
|
||||
renderCalendar();
|
||||
});
|
||||
});
|
41
assets/js/eventos-manager.js.txt
Normal file
41
assets/js/eventos-manager.js.txt
Normal file
@@ -0,0 +1,41 @@
|
||||
jQuery(document).ready(function($) {
|
||||
// Inicializa o calendário se o elemento existir
|
||||
if ($('#eventos-calendario').length) {
|
||||
loadEventosCalendario();
|
||||
}
|
||||
|
||||
function loadEventosCalendario() {
|
||||
$.ajax({
|
||||
url: eventosManager.ajaxurl,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'get_eventos_calendario',
|
||||
security: eventosManager.nonce
|
||||
},
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
initFullCalendar(response.data);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initFullCalendar(eventos) {
|
||||
$('#eventos-calendario').fullCalendar({
|
||||
header: {
|
||||
left: 'prev,next today',
|
||||
center: 'title',
|
||||
right: 'month,agendaWeek,agendaDay'
|
||||
},
|
||||
defaultView: 'month',
|
||||
editable: false,
|
||||
events: eventos,
|
||||
eventColor: '#3498db',
|
||||
eventTextColor: '#ffffff',
|
||||
timeFormat: 'H:mm',
|
||||
eventRender: function(event, element) {
|
||||
element.find('.fc-title').prepend('<span class="evento-tipo-badge">' + event.tipo + '</span> ');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
Reference in New Issue
Block a user