export default {
template: `
<div>
<select v-model="filtroNome" @change="buscarEventos">
<option value="">Todos Usuários</option>
<option v-for="usuario in usuarios" :key="usuario" :value="usuario">{{ usuario }}</option>
</select>
<div id="calendar"></div>
<div v-if="eventoSelecionado" class="modal">
<div class="modal-content">
<h3>Detalhes do Evento</h3>
<p><strong>ID:</strong> {{ eventoSelecionado.evento_base_id }}</p>
<p><strong>Título:</strong> {{ eventoSelecionado.titulo }}</p>
<p><strong>Descrição:</strong> {{ eventoSelecionado.descricao }}</p>
<p><strong>Data Inicial:</strong> {{ eventoSelecionado.datainicial }}</p>
<p><strong>Data Final:</strong> {{ eventoSelecionado.datafinal }}</p>
<button @click="fecharModal">Fechar</button>
</div>
</div>
</div>
`,
props: ['urlbase'],
data() {
return {
eventos: '',
filtroNome: '',
usuarios: [],
eventoSelecionado: null
};
},
methods: {
async buscaEvento() {
const response = await fetch(`${this.urlbase}/eventos`);
this.eventos = await response.json();
},
buscarEventos() {
const eventosFiltrados = this.filtroNome
? this.eventos.filter(evento => evento.nome === this.filtroNome)
: this.eventos;
this.renderCalendar(eventosFiltrados);
},
renderCalendar(eventos) {
const calendarEl = document.getElementById('calendar');
calendarEl.innerHTML = '';
const calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'timeGridWeek',
nowIndicator: true,
headerToolbar: {
left: 'prev,next',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay'
},
locale: 'pt-br',
buttonText: {
prev: "<<",
today: "Hoje",
next: ">>",
month: "Mês",
week: "Semana",
day: "Dia"
},
// dayNames: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sabado'],
// dayNamesShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
initialDate: Date.now(),
navLinks: true,
selectable: true,
nowIndicator: true,
dayMaxEvents: true,
editable: false,
businessHours: true,
dayMaxEvents: true,
events: eventos.map(evento => ({
title: evento.titulo,
start: `${evento.datainicial}T${evento.horarioinicial}`,
end: `${evento.datafinal}T${evento.horariofinal}`,
backgroundColor: evento.cor,
extendedProps: {
id: evento.evento_base_id,
descricao: evento.descricao,
}
})),
eventClick: this.mostrarDetalhesEvento
});
calendar.render();
},
mostrarDetalhesEvento(info) {
const evento = this.eventos.find(evento => evento.titulo === info.event.title);
this.eventoSelecionado = evento;
},
fecharModal() {
this.eventoSelecionado = null;
},
carregarUsuarios() {
const nomes = this.eventos.map(evento => evento.nome);
this.usuarios = [...new Set(nomes)];
}
},
async mounted() {
await this.buscaEvento()
this.carregarUsuarios();
this.renderCalendar(this.eventos);
}
};
|