import wixData from 'wix-data';
let timerBusca = null;
let avaliacaoPartidaIniciada = false;
//==========================================================
// BLOCO 01 - CONFIGURAÇÕES
//==========================================================
const CAMPOS_AVALIACAO_PARTIDA = [
{ id: "#ratingsQualidadeTecnica", campo: "qualidadeTecnica", peso: 2 },
{ id: "#ratingsIntensidade", campo: "agressividade", peso: 1 },
{ id: "#ratingsEscaneamento", campo: "escaneamento", peso: 1 },
{ id: "#ratingsTomadaDecisao", campo: "tomadaDeDecisao", peso: 2 },
{ id: "#ratingsPerfilamentoCorporal", campo: "perfilCorporal", peso: 1 },
{ id: "#ratingsComunicacao", campo: "comunicacaoVervbal", peso: 1 },
{ id: "#ratingsCoragemJogar", campo: "coragemPraJogar", peso: 1 },
{ id: "#ratingsTranquilidadeJogar", campo: "tranquilidadeParaJogar", peso: 1 },
{ id: "#ratingsCompetitividade", campo: "competitividade", peso: 2 },
{ id: "#ratingsPosicionamento", campo: "posicionamento", peso: 1 },
{ id: "#ratingsDisciplinaTatica", campo: "disciplinaTatica", peso: 1 },
{ id: "#ratingsEquilibrioEmocional", campo: "concentracao", peso: 1 }
];
//==========================================================
// BLOCO 02 - INÍCIO DA PÁGINA
//==========================================================
$w.onReady(function () {
iniciarConsulta();
configurarMenuMultiState();
$w("#dataset2").onReady(async () => {
await carregarCompeticoes();
const jogoAtual = $w("#dataset2").getCurrentItem();
if (jogoAtual && jogoAtual.competio) {
await garantirOpcaoCompeticao(jogoAtual.competio);
$w("#dropdownCompeticao").value = jogoAtual.competio;
}
iniciarAvaliacaoPartida();
carregarNotaOficialDaColecao();
});
$w("#dataset2").onAfterSave(async () => {
await new Promise(resolve => setTimeout(resolve, 800));
await $w("#dataset2").refresh();
const jogoAtualizado = $w("#dataset2").getCurrentItem();
if (jogoAtualizado && jogoAtualizado._id) {
await carregarNotaOficialPorId(jogoAtualizado._id);
} else {
carregarNotaOficialDaColecao();
}
});
$w("#dropdownCompeticao").onChange(() => {
$w("#dataset2").setFieldValue(
"competio",
$w("#dropdownCompeticao").value
);
});
$w("#button1").onClick(async () => {
await salvarJogo();
});
$w("#button3").onClick(async () => {
await novoJogo();
});
try {
$w("#buttonLimparAvaliacao").onClick(async () => {
await limparAvaliacao();
});
} catch (e) {
console.log("Botão Limpar Avaliação não encontrado:", e);
}
});
//==========================================================
// BLOCO 02.06 - NAVEGAÇÃO MULTI-STATE BOX
//==========================================================
function configurarMenuMultiState() {
try {
$w("#botaoDadosPartida").onClick(() => {
$w("#multiBoxJogos").changeState("EstadoDadosPartida");
});
} catch (e) {
console.log("Botão Dados Partida não encontrado:", e);
}
try {
$w("#botaoParticipacao").onClick(() => {
$w("#multiBoxJogos").changeState("EstadoParticipacao");
});
} catch (e) {
console.log("Botão Participação não encontrado:", e);
}
try {
$w("#botaoCompetencia").onClick(() => {
$w("#multiBoxJogos").changeState("EstadoCompetencia");
atualizarCardVisual();
});
} catch (e) {
console.log("Botão Competência não encontrado:", e);
}
try {
$w("#botaoAvaliacaoFinal").onClick(() => {
$w("#multiBoxJogos").changeState("EstadoAvaliacaoFinal");
atualizarCardVisual();
});
} catch (e) {
console.log("Botão Avaliação Final não encontrado:", e);
}
}
//==========================================================
// BLOCO 03 - CONSULTA
//==========================================================
function iniciarConsulta() {
$w("#repeaterBusca").data = [];
$w("#repeaterBusca").collapse();
$w("#repeaterBusca").onItemReady(($item, itemData) => {
const data = itemData.dataDoJogo
? new Date(itemData.dataDoJogo).toLocaleDateString("pt-BR")
: "";
$item("#textJogo").text =
`${data} | ${itemData.competio || ""} | ${itemData.adiversrio || ""}`;
$item("#buttonEditar").onClick(async () => {
await editarJogoSelecionado(itemData._id);
});
});
$w("#inputBuscarJogo").onInput(() => {
clearTimeout(timerBusca);
timerBusca = setTimeout(buscarJogos, 300);
});
}
async function buscarJogos() {
const termo = ($w("#inputBuscarJogo").value || "").trim();
if (termo.length < 2) {
$w("#repeaterBusca").data = [];
$w("#repeaterBusca").collapse();
return;
}
try {
const resultado = await wixData.query("Jogos")
.descending("dataDoJogo")
.limit(1000)
.find();
const palavras = termo.toLowerCase().split(" ").filter(Boolean);
const jogosFiltrados = resultado.items.filter(jogo => {
const dataJogo = jogo.dataDoJogo ? new Date(jogo.dataDoJogo) : null;
const ano = dataJogo ? String(dataJogo.getFullYear()) : "";
const dataBR = dataJogo ? dataJogo.toLocaleDateString("pt-BR") : "";
const dataTraco = dataBR.replace(/\//g, "-");
const texto = `
${jogo.competio || ""}
${jogo.adiversrio || ""}
${ano}
${dataBR}
${dataTraco}
`.toLowerCase();
return palavras.every(p => texto.includes(p));
});
$w("#repeaterBusca").data = jogosFiltrados.slice(0, 10);
if (jogosFiltrados.length > 0) {
$w("#repeaterBusca").expand();
} else {
$w("#repeaterBusca").collapse();
}
} catch (erro) {
console.log("Erro na busca:", erro);
$w("#repeaterBusca").data = [];
$w("#repeaterBusca").collapse();
}
}
//==========================================================
// BLOCO 04 - COMPETIÇÕES
//==========================================================
async function carregarCompeticoes() {
try {
const resultado = await wixData.query("Competicoes")
.ascending("title")
.limit(1000)
.find();
const opcoes = resultado.items
.filter(item => item.title)
.map(item => ({
label: item.title,
value: item.title
}));
$w("#dropdownCompeticao").options = opcoes;
} catch (erro) {
console.log("Erro ao carregar competições:", erro);
}
}
async function garantirOpcaoCompeticao(nome) {
if (!nome) return;
let opcoes = $w("#dropdownCompeticao").options || [];
const existe = opcoes.some(opcao => opcao.value === nome);
if (!existe) {
opcoes.push({
label: nome,
value: nome
});
$w("#dropdownCompeticao").options = opcoes;
}
}
//==========================================================
// BLOCO 05 - EDITAR / SALVAR / NOVO
//==========================================================
async function editarJogoSelecionado(id) {
try {
await $w("#dataset2").setFilter(
wixData.filter().eq("_id", id)
);
await $w("#dataset2").refresh();
const jogoAtual = $w("#dataset2").getCurrentItem();
await carregarCompeticoes();
if (jogoAtual && jogoAtual.competio) {
await garantirOpcaoCompeticao(jogoAtual.competio);
$w("#dropdownCompeticao").value = jogoAtual.competio;
$w("#dataset2").setFieldValue("competio", jogoAtual.competio);
}
await new Promise(resolve => setTimeout(resolve, 500));
atualizarCardVisual();
$w("#inputBuscarJogo").value = "";
$w("#repeaterBusca").data = [];
$w("#repeaterBusca").collapse();
} catch (erro) {
console.log("Erro ao editar jogo:", erro);
}
}
async function salvarJogo() {
try {
atualizarCardVisual();
$w("#dataset2").setFieldValue(
"competio",
$w("#dropdownCompeticao").value
);
const itemSalvo = await $w("#dataset2").save();
const id = itemSalvo && itemSalvo._id
? itemSalvo._id
: $w("#dataset2").getCurrentItem()._id;
await new Promise(resolve => setTimeout(resolve, 600));
await carregarNotaOficialPorId(id);
await new Promise(resolve => setTimeout(resolve, 300));
atualizarCardVisual();
$w("#inputBuscarJogo").value = "";
$w("#repeaterBusca").data = [];
$w("#repeaterBusca").collapse();
console.log("Jogo salvo e nota oficial carregada");
} catch (erro) {
console.log("Erro ao salvar jogo:", erro);
}
}
async function novoJogo() {
try {
await $w("#dataset2").setFilter(wixData.filter());
await $w("#dataset2").new();
await carregarCompeticoes();
$w("#dropdownCompeticao").value = "";
$w("#inputBuscarJogo").value = "";
$w("#repeaterBusca").data = [];
$w("#repeaterBusca").collapse();
atualizarCardNaoAvaliado();
atualizarCardHtmlNotaPartida(0, "NÃO AVALIADO", 0);
} catch (erro) {
console.log("Erro ao adicionar novo jogo:", erro);
}
}
async function carregarNotaOficialPorId(id) {
if (!id) {
atualizarCardNaoAvaliado();
atualizarCardHtmlNotaPartida(0, "NÃO AVALIADO", 0);
return;
}
await new Promise(resolve => setTimeout(resolve, 300));
atualizarCardVisual();
}
//==========================================================
// BLOCO 06 - CARD DA NOTA DA PARTIDA
//==========================================================
function iniciarAvaliacaoPartida() {
if (avaliacaoPartidaIniciada) return;
avaliacaoPartidaIniciada = true;
CAMPOS_AVALIACAO_PARTIDA.forEach(campo => {
$w(campo.id).onChange(() => {
atualizarCardVisual();
});
});
atualizarCardVisual();
}
function atualizarCardVisual() {
let soma = 0;
let pesos = 0;
let avaliados = 0;
CAMPOS_AVALIACAO_PARTIDA.forEach(campo => {
const valor = Number($w(campo.id).value || 0);
const peso = Number(campo.peso || 1);
if (!isNaN(valor) && valor > 0) {
soma += valor * peso;
pesos += peso;
avaliados++;
}
});
if (pesos === 0) {
atualizarCardNaoAvaliado();
try {
$w("#dataset2").setFieldValue("notaPartida", null);
} catch (e) {}
atualizarCardHtmlNotaPartida(0, "NÃO AVALIADO", 0);
return;
}
const nota = Number((soma / pesos).toFixed(1));
const status = obterStatusPartida(nota);
try {
$w("#dataset2").setFieldValue("notaPartida", nota);
} catch (e) {}
atualizarCardNotaPartida(nota, status);
atualizarCardHtmlNotaPartida(nota, status, avaliados);
}
function carregarNotaOficialDaColecao() {
atualizarCardVisual();
}
function atualizarCardNaoAvaliado() {
esconderCirculosPartida();
try {
$w("#textNotaPartida").text = "--";
$w("#textStatusPartida").text = "NÃO AVALIADO";
$w("#circuloCinzaPartida").show();
} catch (e) {}
}
function atualizarCardNotaPartida(nota, status) {
esconderCirculosPartida();
try {
$w("#textNotaPartida").text = Number(nota).toFixed(1).replace(".", ",");
$w("#textStatusPartida").text = status;
if (nota >= 4) {
$w("#circuloVerdePartida").show();
} else if (nota >= 3) {
$w("#circuloAmareloPartida").show();
} else {
$w("#circuloVermelhoPartida").show();
}
} catch (e) {}
}
function esconderCirculosPartida() {
try { $w("#circuloCinzaPartida").hide(); } catch (e) {}
try { $w("#circuloVerdePartida").hide(); } catch (e) {}
try { $w("#circuloAmareloPartida").hide(); } catch (e) {}
try { $w("#circuloVermelhoPartida").hide(); } catch (e) {}
}
function obterStatusPartida(nota) {
if (nota >= 4) return "EXCELENTE";
if (nota >= 3) return "REGULAR";
return "ATENÇÃO";
}
function atualizarCardHtmlNotaPartida(nota, status, avaliados) {
const notaNumero = Number(nota) || 0;
const percentualNota = Math.round((notaNumero / 5) * 100);
const percentualIndicadores = Math.round((avaliados / 12) * 100);
const notaTexto = notaNumero > 0
? notaNumero.toFixed(1).replace(".", ",")
: "--";
const percentualNotaTexto = notaNumero > 0
? `${percentualNota}%`
: "--";
let corNota = "#666666";
let legendaNota = "Não avaliado";
if (notaNumero >= 4) {
corNota = "#1A9500";
legendaNota = "Desempenho excelente";
} else if (notaNumero >= 3) {
corNota = "#F2C300";
legendaNota = "Desempenho regular";
} else if (notaNumero > 0) {
corNota = "#D92D20";
legendaNota = "Requer atenção";
}
let corIndicadores = "#D92D20";
if (avaliados === 12) {
corIndicadores = "#1A9500";
} else if (avaliados > 0) {
corIndicadores = "#F2C300";
}
const html = `
<style>
.ac-wrap {
width: 100%;
min-height: 100%;
box-sizing: border-box;
padding: 12px;
font-family: Arial, sans-serif;
background: #ffffff;
display: flex;
flex-direction: column;
gap: 14px;
}
.ac-card {
width: 100%;
box-sizing: border-box;
border: 1px solid #E5E7EB;
border-radius: 16px;
padding: 16px;
box-shadow: 0 4px 14px rgba(0,0,0,0.05);
text-align: center;
background: #ffffff;
}
.ac-title {
font-size: 14px;
font-weight: 900;
color: #111827;
margin-bottom: 14px;
}
.ac-circle {
margin: 0 auto;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.ac-circle-inner {
border-radius: 50%;
background: #ffffff;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.ac-main-value {
margin-top: 14px;
font-size: 30px;
font-weight: 900;
color: #111827;
line-height: 1;
}
.ac-status {
margin-top: 8px;
font-size: 17px;
font-weight: 900;
}
.ac-pill {
margin: 14px auto 0 auto;
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 10px;
background: #F9FAFB;
color: #374151;
font-size: 12px;
font-weight: 700;
}
.ac-dot {
width: 10px;
height: 10px;
border-radius: 50%;
display: inline-block;
}
.ac-bar-title {
margin-top: 16px;
font-size: 11px;
font-weight: 900;
color: #4B5563;
text-align: left;
}
.ac-bar-bg {
width: 100%;
height: 11px;
background: #E5E7EB;
border-radius: 999px;
overflow: hidden;
margin-top: 7px;
}
.ac-bar-fill {
height: 100%;
border-radius: 999px;
}
.ac-bar-text {
margin-top: 7px;
font-size: 12px;
font-weight: 700;
color: #4B5563;
text-align: left;
}
@media (min-width: 700px) {
.ac-wrap {
flex-direction: row;
gap: 14px;
padding: 14px;
}
.ac-card {
flex: 1;
text-align: left;
}
.ac-card-content {
display: flex;
align-items: center;
gap: 18px;
}
.ac-main-value {
margin-top: 0;
font-size: 36px;
}
.ac-pill {
margin-left: 0;
}
}
</style>
<div class="ac-wrap">
<div class="ac-card">
<div class="ac-title">⭐ NOTA DA PARTIDA</div>
<div class="ac-card-content">
<div class="ac-circle" style="
width:130px;
height:130px;
background:conic-gradient(${corNota} ${percentualNota}%, #E5E7EB 0);
">
<div class="ac-circle-inner" style="width:94px;height:94px;">
<div style="font-size:32px;font-weight:900;color:#111827;line-height:1;">
${notaTexto}
</div>
<div style="margin-top:5px;font-size:14px;font-weight:900;color:${corNota};">
${percentualNotaTexto}
</div>
</div>
</div>
<div>
<div class="ac-main-value">${notaTexto}</div>
<div class="ac-status" style="color:${corNota};">
${status}
</div>
<div class="ac-pill">
<span class="ac-dot" style="background:${corNota};"></span>
${legendaNota}
</div>
</div>
</div>
</div>
<div class="ac-card">
<div class="ac-title">✅ COMPETÊNCIAS AVALIADAS</div>
<div class="ac-card-content">
<div class="ac-circle" style="
width:115px;
height:115px;
background:conic-gradient(${corIndicadores} ${percentualIndicadores}%, #E5E7EB 0);
">
<div class="ac-circle-inner" style="width:82px;height:82px;">
<div style="font-size:24px;font-weight:900;color:#111827;">
${percentualIndicadores}%
</div>
<div style="font-size:10px;font-weight:700;color:#6B7280;">
marcadas
</div>
</div>
</div>
<div>
<div class="ac-main-value">
${avaliados} <span style="color:#6B7280;">/ 12</span>
</div>
<div style="margin-top:6px;font-size:13px;font-weight:800;color:#4B5563;">
competências avaliadas
</div>
<div class="ac-bar-title">PROGRESSO DE AVALIAÇÃO</div>
<div class="ac-bar-bg">
<div class="ac-bar-fill" style="
width:${percentualIndicadores}%;
background:${corIndicadores};
"></div>
</div>
<div class="ac-bar-text">
${avaliados} de 12 competências marcadas
</div>
</div>
</div>
</div>
</div>
`;
try {
$w("#htmlCardNotaPartida").postMessage(html);
} catch (e) {
console.log("Erro ao atualizar card HTML:", e);
}
}
//==========================================================
// BLOCO 07 - LIMPAR AVALIAÇÃO DA PARTIDA ATUAL
//==========================================================
async function limparAvaliacao() {
try {
$w("#buttonLimparAvaliacao").disable();
} catch (e) {}
const jogoAtual = $w("#dataset2").getCurrentItem();
if (!jogoAtual || !jogoAtual._id) {
atualizarCardNaoAvaliado();
atualizarCardHtmlNotaPartida(0, "NÃO AVALIADO", 0);
try {
$w("#buttonLimparAvaliacao").enable();
} catch (e) {}
return;
}
const idJogoAtual = jogoAtual._id;
CAMPOS_AVALIACAO_PARTIDA.forEach(item => {
try {
$w("#dataset2").setFieldValue(item.campo, null);
} catch (e) {}
});
try {
$w("#dataset2").setFieldValue("notaPartida", null);
} catch (e) {}
try {
await $w("#dataset2").save();
await $w("#dataset2").refresh();
await $w("#dataset2").setFilter(
wixData.filter().eq("_id", idJogoAtual)
);
await $w("#dataset2").refresh();
} catch (e) {
console.log("Erro ao limpar avaliação:", e);
}
CAMPOS_AVALIACAO_PARTIDA.forEach(item => {
try {
$w(item.id).value = null;
} catch (e) {}
try {
$w(item.id).value = undefined;
} catch (e) {}
});
atualizarCardNaoAvaliado();
atualizarCardHtmlNotaPartida(0, "NÃO AVALIADO", 0);
try {
$w("#buttonLimparAvaliacao").enable();
} catch (e) {}
}
CODIGO 2 JOGO COPIA//////////////////////////////////////////////
import wixData from 'wix-data';
let jogoAtualId = null;
let listaCompeticoes = [];
const CAMPOS_COMPETENCIAS = [
"qualidadeTecnica",
"agressividade",
"escaneamento",
"tomadaDeDecisao",
"perfilCorporal",
"comunicacaoVervbal",
"coragemPraJogar",
"tranquilidadeParaJogar",
"competitividade",
"posicionamento",
"disciplinaTatica",
"concentracao"
];
$w.onReady(async function () {
await carregarCompeticoes();
configurarMenu();
configurarBuscaJogos();
configurarAtualizacaoGraficos();
configurarDatasetSalvar();
const ds = elemento("#dataset2");
if (ds) {
ds.onReady(() => {
atualizarJogoAtualPeloDataset();
});
}
mostrarAba("dados");
});
//==========================================================
// ELEMENTO SEGURO
//==========================================================
function elemento(id) {
try {
return $w(id);
} catch (e) {
return null;
}
}
//==========================================================
// COMPETIÇÕES
//==========================================================
async function carregarCompeticoes() {
try {
const resultado = await wixData.query("Competicoes")
.ascending("title")
.limit(1000)
.find();
listaCompeticoes = resultado.items || [];
let opcoes = [];
listaCompeticoes.forEach(item => {
const nome =
item.title ||
item.nome ||
item.competio ||
item.competicao ||
item.nomeDaCompeticao ||
item.name ||
"";
if (nome) {
opcoes.push({
label: String(nome).trim(),
value: String(nome).trim()
});
}
});
opcoes = opcoes.sort((a, b) =>
a.label.localeCompare(b.label, "pt-BR")
);
const dropdown = elemento("#dropdownCompeticao");
if (dropdown) {
dropdown.options = opcoes;
}
} catch (erro) {
console.error("Erro ao carregar competições:", erro);
}
}
function selecionarCompeticaoDoJogo(jogo) {
const dropdown = elemento("#dropdownCompeticao");
if (!dropdown) return;
let competicaoSalva =
jogo.competio ||
jogo.competicao ||
jogo.nomeCompeticao ||
"";
const competicaoId = jogo.competicaoId || "";
if (competicaoId && !competicaoSalva) {
const encontradaPorId = listaCompeticoes.find(item => item._id === competicaoId);
if (encontradaPorId) {
competicaoSalva =
encontradaPorId.title ||
encontradaPorId.nome ||
encontradaPorId.competio ||
encontradaPorId.competicao ||
encontradaPorId.nomeDaCompeticao ||
encontradaPorId.name ||
"";
}
}
const encontradaPorCampoId = listaCompeticoes.find(item => item._id === competicaoSalva);
if (encontradaPorCampoId) {
competicaoSalva =
encontradaPorCampoId.title ||
encontradaPorCampoId.nome ||
encontradaPorCampoId.competio ||
encontradaPorCampoId.competicao ||
encontradaPorCampoId.nomeDaCompeticao ||
encontradaPorCampoId.name ||
"";
}
competicaoSalva = String(competicaoSalva || "").trim();
if (!competicaoSalva) {
dropdown.value = "";
return;
}
let opcoes = dropdown.options || [];
const existe = opcoes.some(opcao =>
String(opcao.value).trim().toLowerCase() === competicaoSalva.toLowerCase()
);
if (!existe) {
opcoes.push({
label: competicaoSalva,
value: competicaoSalva
});
opcoes = opcoes.sort((a, b) =>
a.label.localeCompare(b.label, "pt-BR")
);
dropdown.options = opcoes;
}
dropdown.value = competicaoSalva;
setTimeout(() => {
dropdown.value = competicaoSalva;
atualizarCardResumoJogo();
}, 500);
}
function pegarCompeticaoSelecionada() {
const dropdown = elemento("#dropdownCompeticao");
if (!dropdown) return "";
return dropdown.value || "";
}
function pegarIdCompeticaoSelecionada() {
const nomeSelecionado = pegarCompeticaoSelecionada();
const encontrada = listaCompeticoes.find(item => {
const nome =
item.title ||
item.nome ||
item.competio ||
item.competicao ||
item.nomeDaCompeticao ||
item.name ||
"";
return String(nome).trim() === String(nomeSelecionado).trim();
});
return encontrada ? encontrada._id : "";
}
//==========================================================
// DATASET / SALVAR CMS
//==========================================================
function configurarDatasetSalvar() {
const ds = elemento("#dataset2");
if (!ds) return;
try {
ds.onBeforeSave(() => {
const competicaoNome = pegarCompeticaoSelecionada();
const competicaoId = pegarIdCompeticaoSelecionada();
try { ds.setFieldValue("competio", competicaoNome); } catch (e) {}
try { ds.setFieldValue("competicaoId", competicaoId); } catch (e) {}
try { ds.setFieldValue("notaPartida", calcularNotaPartida(montarDadosDoJogo())); } catch (e) {}
return true;
});
} catch (e) {}
try {
ds.onAfterSave(() => {
mensagem("Jogo salvo com sucesso.");
atualizarJogoAtualPeloDataset();
});
} catch (e) {}
}
//==========================================================
// MENU
//==========================================================
function configurarMenu() {
const dados = elemento("#botaoDadosPartida");
const participacao = elemento("#botaoParticipacao");
const competencia = elemento("#botaoCompetencia");
const avaliacao = elemento("#botaoAvaliacaoFinal");
if (dados && typeof dados.onClick === "function") {
dados.onClick(() => mostrarAba("dados"));
}
if (participacao && typeof participacao.onClick === "function") {
participacao.onClick(() => mostrarAba("participacao"));
}
if (competencia && typeof competencia.onClick === "function") {
competencia.onClick(() => mostrarAba("competencia"));
}
if (avaliacao && typeof avaliacao.onClick === "function") {
avaliacao.onClick(() => mostrarAba("avaliacao"));
}
}
function mostrarAba(aba) {
const multi = elemento("#multiBoxJogos");
if (!multi) return;
const estados = multi.states.map(estado => estado.id);
let palavras = [];
if (aba === "dados") palavras = ["dados", "dadospartida"];
if (aba === "participacao") palavras = ["participacao", "participação"];
if (aba === "competencia") palavras = ["competencia", "competencias", "competência", "competências"];
if (aba === "avaliacao") palavras = ["avaliacao", "avaliacaofinal", "avaliação", "avaliaçãofinal"];
const estadoEncontrado = estados.find(id => {
const normalizado = id.toLowerCase();
return palavras.some(p => normalizado.includes(p));
});
if (estadoEncontrado) {
multi.changeState(estadoEncontrado);
setTimeout(() => {
atualizarCardResumoJogo();
atualizarCardVisual();
}, 700);
}
}
//==========================================================
// DATASET ATUAL
//==========================================================
function atualizarJogoAtualPeloDataset() {
const ds = elemento("#dataset2");
if (!ds) return;
let jogo = null;
try {
jogo = ds.getCurrentItem();
} catch (e) {}
if (jogo && jogo._id) {
jogoAtualId = jogo._id;
setTimeout(() => {
preencherCamposJogo(jogo);
atualizarCardResumoJogo();
atualizarCardVisual();
}, 300);
}
}
//==========================================================
// BUSCA
//==========================================================
function configurarBuscaJogos() {
const repeater = elemento("#repeaterBusca");
const input = elemento("#inputBuscarJogo");
if (repeater) {
repeater.collapse();
repeater.onItemReady(($item, itemData) => {
const data = itemData.dataDoJogo
? new Date(itemData.dataDoJogo).toLocaleDateString("pt-BR")
: "";
$item("#textJogo").text =
`${data} | ${itemData.competio || ""} | ${itemData.adiversrio || ""}`;
$item("#buttonEditar").onClick(async () => {
await carregarJogoParaEditar(itemData._id);
});
});
}
if (input) {
input.onInput(async () => {
await buscarJogos();
});
}
}
async function buscarJogos() {
const input = elemento("#inputBuscarJogo");
const repeater = elemento("#repeaterBusca");
if (!input || !repeater) return;
const termo = input.value;
if (!termo || termo.length < 2) {
repeater.data = [];
repeater.collapse();
return;
}
try {
const resultado = await wixData.query("Jogos")
.contains("competio", termo)
.or(wixData.query("Jogos").contains("adiversrio", termo))
.or(wixData.query("Jogos").contains("localDoJogo", termo))
.descending("dataDoJogo")
.limit(30)
.find();
repeater.data = resultado.items || [];
if (resultado.items.length > 0) {
repeater.expand();
} else {
repeater.collapse();
}
} catch (erro) {
console.error("Erro ao buscar jogos:", erro);
}
}
async function carregarJogoParaEditar(id) {
try {
const jogo = await wixData.get("Jogos", id);
jogoAtualId = jogo._id;
const ds = elemento("#dataset2");
if (ds) {
await ds.setFilter(wixData.filter().eq("_id", jogoAtualId));
}
preencherCamposJogo(jogo);
const input = elemento("#inputBuscarJogo");
if (input) input.value = "";
const repeater = elemento("#repeaterBusca");
if (repeater) repeater.collapse();
atualizarCardResumoJogo();
atualizarCardVisual();
mostrarAba("dados");
} catch (erro) {
console.error("Erro ao carregar jogo:", erro);
}
}
//==========================================================
// PREENCHER CAMPOS
//==========================================================
function preencherCamposJogo(jogo) {
definirValor("#inputAdversario", jogo.adiversrio || "");
definirValor("#inputLocalJogo", jogo.localDoJogo || "");
definirValor("#datePickerDataJogo", jogo.dataDoJogo ? new Date(jogo.dataDoJogo) : null);
definirValor("#timePickerHoraJogo", jogo.horaDoJogo || "");
selecionarCompeticaoDoJogo(jogo);
definirValor("#addressInput1", jogo.enderecoCompleto || "");
definirValor("#inputCidade", jogo.cidade || "");
definirValor("#inputEstado", jogo.estado || "");
definirValor("#inputPais", jogo.pas || "");
CAMPOS_COMPETENCIAS.forEach(campo => {
definirValor(`#${campo}`, jogo[campo] || null);
});
}
//==========================================================
// DADOS DO JOGO
//==========================================================
function montarDadosDoJogo() {
const dados = {
competicaoId: pegarIdCompeticaoSelecionada(),
competio: pegarCompeticaoSelecionada(),
adiversrio: valor("#inputAdversario"),
localDoJogo: valor("#inputLocalJogo"),
dataDoJogo: valor("#datePickerDataJogo"),
horaDoJogo: valor("#timePickerHoraJogo"),
enderecoCompleto: valorEnderecoSimples(),
cidade: valor("#inputCidade"),
estado: valor("#inputEstado"),
pas: valor("#inputPais")
};
CAMPOS_COMPETENCIAS.forEach(campo => {
const nota = Number(valor(`#${campo}`));
if (!isNaN(nota) && nota > 0) {
dados[campo] = nota;
}
});
dados.notaPartida = calcularNotaPartida(dados);
return dados;
}
function valorEnderecoSimples() {
const address = elemento("#addressInput1");
if (!address) return "";
const endereco = address.value;
if (!endereco) return "";
if (typeof endereco === "string") return endereco;
return endereco.formatted ||
endereco.addressLine ||
endereco.streetAddress ||
"";
}
//==========================================================
// ATUALIZAÇÃO DOS GRÁFICOS
//==========================================================
function configurarAtualizacaoGraficos() {
CAMPOS_COMPETENCIAS.forEach(campo => {
const el = elemento(`#${campo}`);
if (el && typeof el.onChange === "function") {
el.onChange(() => {
atualizarCardVisual();
});
}
});
const competencia = elemento("#botaoCompetencia");
if (competencia && typeof competencia.onClick === "function") {
competencia.onClick(() => {
mostrarAba("competencia");
setTimeout(() => {
atualizarCardVisual();
}, 300);
});
}
const avaliacao = elemento("#botaoAvaliacaoFinal");
if (avaliacao && typeof avaliacao.onClick === "function") {
avaliacao.onClick(() => {
mostrarAba("avaliacao");
setTimeout(() => {
atualizarCardVisual();
}, 300);
});
}
}
//==========================================================
// CARD RESUMO
//==========================================================
function atualizarCardResumoJogo() {
const competicao = pegarCompeticaoSelecionada() || "Competição não informada";
const adversario = valor("#inputAdversario") || "Adversário não informado";
const dataValor = valor("#datePickerDataJogo");
const data = dataValor
? new Date(dataValor).toLocaleDateString("pt-BR")
: "Data não informada";
definirTexto("#textResumoJogo", `${data} | ${competicao} | ${adversario}`);
atualizarHtmlResumoJogo(data, competicao, adversario);
}
function atualizarHtmlResumoJogo(data, competicao, adversario) {
const html = `
<div style="width:100%;box-sizing:border-box;padding:10px;font-family:Arial,sans-serif;">
<div style="width:100%;box-sizing:border-box;border-radius:18px;background:#ffffff;border:1px solid #E5E7EB;box-shadow:0 4px 14px rgba(0,0,0,0.08);padding:14px;">
<div style="font-size:12px;font-weight:900;color:#6B7280;margin-bottom:8px;">
JOGO EM AVALIAÇÃO
</div>
<div style="font-size:18px;font-weight:900;color:#111827;">
${competicao}
</div>
<div style="margin-top:6px;font-size:15px;font-weight:700;color:#374151;">
${adversario}
</div>
<div style="margin-top:10px;font-size:12px;font-weight:800;color:#374151;background:#F3F4F6;border-radius:999px;padding:7px 10px;display:inline-block;">
${data}
</div>
</div>
</div>
`;
const htmlBox = elemento("#htmlResumoJogo");
if (htmlBox) {
try {
htmlBox.postMessage(html);
} catch (e) {}
}
}
//==========================================================
// NOTA
//==========================================================
function calcularNotaPartida(jogo) {
const valores = CAMPOS_COMPETENCIAS
.map(campo => Number(jogo[campo]))
.filter(n => !isNaN(n) && n > 0);
if (valores.length === 0) return 0;
const soma = valores.reduce((total, n) => total + n, 0);
return soma / valores.length;
}
function montarHtmlNotaPartida(nota) {
const notaLimitada = Math.max(0, Math.min(5, Number(nota) || 0));
const percentual = Math.round((notaLimitada / 5) * 100);
const cor = obterCorNota(notaLimitada);
return `
<div style="width:100%;box-sizing:border-box;padding:10px;font-family:Arial,sans-serif;">
<div style="width:100%;box-sizing:border-box;border-radius:18px;background:#ffffff;border:1px solid #E5E7EB;box-shadow:0 4px 14px rgba(0,0,0,0.08);padding:16px;">
<div style="font-size:12px;font-weight:900;color:#6B7280;">
NOTA DA PARTIDA
</div>
<div style="margin-top:4px;font-size:34px;line-height:1;font-weight:900;color:${cor};">
${formatarNota(notaLimitada)}
</div>
<div style="margin-top:14px;width:100%;height:14px;border-radius:999px;background:#E5E7EB;overflow:hidden;">
<div style="width:${percentual}%;height:100%;background:${cor};border-radius:999px;"></div>
</div>
</div>
</div>
`;
}
function obterCorNota(nota) {
if (nota >= 4) return "#0B8F08";
if (nota >= 3) return "#F2C300";
if (nota > 0) return "#E53935";
return "#6B7280";
}
function formatarNota(nota) {
return (Number(nota) || 0).toFixed(1).replace(".", ",");
}
//==========================================================
// AUXILIARES
//==========================================================
function valor(id) {
const el = elemento(id);
if (!el) return "";
try {
return el.value || "";
} catch (e) {
return "";
}
}
function definirValor(id, valorNovo) {
const el = elemento(id);
if (!el) return;
try {
el.value = valorNovo;
} catch (e) {}
}
function definirTexto(id, texto) {
const el = elemento(id);
if (!el) return;
try {
el.text = String(texto || "");
} catch (e) {}
}
function mensagem(texto) {
definirTexto("#textMensagem", texto);
const el = elemento("#textMensagem");
if (el) {
try { el.expand(); } catch (e) {}
try { el.show(); } catch (e) {}
}
}
/////////////////////////////////////////////////////////////////////////////////////////// jogo copia 3
//////////////////////////////////////////////
import wixData from 'wix-data';
let jogoAtualId = null;
let listaCompeticoes = [];
const CAMPOS_COMPETENCIAS = [
"qualidadeTecnica",
"agressividade",
"escaneamento",
"tomadaDeDecisao",
"perfilCorporal",
"comunicacaoVervbal",
"coragemPraJogar",
"tranquilidadeParaJogar",
"competitividade",
"posicionamento",
"disciplinaTatica",
"concentracao"
];
const NOMES_COMPETENCIAS = {
qualidadeTecnica: "Qualidade Técnica",
agressividade: "Agressividade",
escaneamento: "Escaneamento",
tomadaDeDecisao: "Tomada de Decisão",
perfilCorporal: "Perfil Corporal",
comunicacaoVervbal: "Comunicação Verbal",
coragemPraJogar: "Coragem para Jogar",
tranquilidadeParaJogar: "Tranquilidade para Jogar",
competitividade: "Competitividade",
posicionamento: "Posicionamento",
disciplinaTatica: "Disciplina Tática",
concentracao: "Concentração"
};
$w.onReady(async function () {
await carregarCompeticoes();
configurarMenu();
configurarBuscaJogos();
configurarAtualizacaoGraficos();
configurarDatasetSalvar();
configurarStatusJogo();
configurarEnderecoAutomatico();
const ds = elemento("#dataset2");
if (ds) {
ds.onReady(() => {
atualizarJogoAtualPeloDataset();
});
}
mostrarAba("dados");
setTimeout(() => {
atualizarCardResumoJogo();
atualizarCardVisual();
}, 1200);
});
//==========================================================
// ELEMENTO SEGURO
//==========================================================
function elemento(id) {
try {
return $w(id);
} catch (e) {
return null;
}
}
//==========================================================
// COMPETIÇÕES
//==========================================================
async function carregarCompeticoes() {
try {
const resultado = await wixData.query("Competicoes")
.ascending("title")
.limit(1000)
.find();
listaCompeticoes = resultado.items || [];
let opcoes = [];
listaCompeticoes.forEach(item => {
const nome =
item.title ||
item.nome ||
item.competio ||
item.competicao ||
item.nomeDaCompeticao ||
item.name ||
"";
if (nome) {
opcoes.push({
label: String(nome).trim(),
value: String(nome).trim()
});
}
});
opcoes = opcoes.sort((a, b) =>
a.label.localeCompare(b.label, "pt-BR")
);
const dropdown = elemento("#dropdownCompeticao");
if (dropdown) dropdown.options = opcoes;
} catch (erro) {
console.error("Erro ao carregar competições:", erro);
}
}
function selecionarCompeticaoDoJogo(jogo) {
const dropdown = elemento("#dropdownCompeticao");
if (!dropdown) return;
let competicaoSalva =
jogo.competio ||
jogo.competicao ||
jogo.nomeCompeticao ||
"";
const competicaoId = jogo.competicaoId || "";
if (competicaoId && !competicaoSalva) {
const encontradaPorId = listaCompeticoes.find(item => item._id === competicaoId);
if (encontradaPorId) {
competicaoSalva =
encontradaPorId.title ||
encontradaPorId.nome ||
encontradaPorId.competio ||
encontradaPorId.competicao ||
encontradaPorId.nomeDaCompeticao ||
encontradaPorId.name ||
"";
}
}
const encontradaPorCampoId = listaCompeticoes.find(item => item._id === competicaoSalva);
if (encontradaPorCampoId) {
competicaoSalva =
encontradaPorCampoId.title ||
encontradaPorCampoId.nome ||
encontradaPorCampoId.competio ||
encontradaPorCampoId.competicao ||
encontradaPorCampoId.nomeDaCompeticao ||
encontradaPorCampoId.name ||
"";
}
competicaoSalva = String(competicaoSalva || "").trim();
if (!competicaoSalva) {
dropdown.value = "";
return;
}
let opcoes = dropdown.options || [];
const existe = opcoes.some(opcao =>
String(opcao.value).trim().toLowerCase() === competicaoSalva.toLowerCase()
);
if (!existe) {
opcoes.push({
label: competicaoSalva,
value: competicaoSalva
});
opcoes = opcoes.sort((a, b) =>
a.label.localeCompare(b.label, "pt-BR")
);
dropdown.options = opcoes;
}
dropdown.value = competicaoSalva;
setTimeout(() => {
dropdown.value = competicaoSalva;
atualizarCardResumoJogo();
atualizarCardVisual();
}, 500);
}
function pegarCompeticaoSelecionada() {
const dropdown = elemento("#dropdownCompeticao");
if (!dropdown) return "";
return dropdown.value || "";
}
function pegarIdCompeticaoSelecionada() {
const nomeSelecionado = pegarCompeticaoSelecionada();
const encontrada = listaCompeticoes.find(item => {
const nome =
item.title ||
item.nome ||
item.competio ||
item.competicao ||
item.nomeDaCompeticao ||
item.name ||
"";
return String(nome).trim() === String(nomeSelecionado).trim();
});
return encontrada ? encontrada._id : "";
}
//==========================================================
// STATUS DO JOGO
//==========================================================
function configurarStatusJogo() {
const radio = elemento("#radioGroupStatusJogo");
if (!radio) return;
try {
radio.options = [
{ label: "Agendado", value: "Agendado" },
{ label: "Finalizado", value: "Finalizado" }
];
} catch (e) {}
if (!radio.value) {
radio.value = "Agendado";
}
if (typeof radio.onChange === "function") {
radio.onChange(() => {
atualizarCardResumoJogo();
atualizarCardVisual();
});
}
}
function pegarStatusJogo() {
const radio = elemento("#radioGroupStatusJogo");
if (radio && radio.value) {
return radio.value;
}
return "Agendado";
}
function definirStatusJogo(jogo) {
const radio = elemento("#radioGroupStatusJogo");
if (!radio) return;
const status =
jogo.statusDoJogo ||
jogo.statusJogo ||
jogo.status ||
"Agendado";
radio.value = status;
}
//==========================================================
// DATASET / SALVAR CMS
//==========================================================
function configurarDatasetSalvar() {
const ds = elemento("#dataset2");
if (!ds) return;
try {
ds.onBeforeSave(() => {
const jogo = montarDadosDoJogo();
try { ds.setFieldValue("competio", jogo.competio); } catch (e) {}
try { ds.setFieldValue("competicaoId", jogo.competicaoId); } catch (e) {}
try { ds.setFieldValue("adiversrio", jogo.adiversrio); } catch (e) {}
try { ds.setFieldValue("localDoJogo", jogo.localDoJogo); } catch (e) {}
try { ds.setFieldValue("dataDoJogo", jogo.dataDoJogo); } catch (e) {}
try { ds.setFieldValue("horaDoJogo", jogo.horaDoJogo); } catch (e) {}
try { ds.setFieldValue("enderecoCompleto", jogo.enderecoCompleto); } catch (e) {}
try { ds.setFieldValue("cidade", jogo.cidade); } catch (e) {}
try { ds.setFieldValue("estado", jogo.estado); } catch (e) {}
try { ds.setFieldValue("pas", jogo.pas); } catch (e) {}
try { ds.setFieldValue("statusDoJogo", jogo.statusDoJogo); } catch (e) {}
try { ds.setFieldValue("statusJogo", jogo.statusDoJogo); } catch (e) {}
try { ds.setFieldValue("status", jogo.statusDoJogo); } catch (e) {}
CAMPOS_COMPETENCIAS.forEach(campo => {
try { ds.setFieldValue(campo, jogo[campo] || null); } catch (e) {}
});
try { ds.setFieldValue("notaPartida", jogo.notaPartida); } catch (e) {}
return true;
});
} catch (e) {}
try {
ds.onAfterSave(() => {
mensagem("Jogo salvo com sucesso.");
atualizarJogoAtualPeloDataset();
});
} catch (e) {}
}
//==========================================================
// MENU
//==========================================================
function configurarMenu() {
const dados = elemento("#botaoDadosPartida");
const participacao = elemento("#botaoParticipacao");
const competencia = elemento("#botaoCompetencia");
const avaliacao = elemento("#botaoAvaliacaoFinal");
if (dados && typeof dados.onClick === "function") {
dados.onClick(() => mostrarAba("dados"));
}
if (participacao && typeof participacao.onClick === "function") {
participacao.onClick(() => mostrarAba("participacao"));
}
if (competencia && typeof competencia.onClick === "function") {
competencia.onClick(() => mostrarAba("competencia"));
}
if (avaliacao && typeof avaliacao.onClick === "function") {
avaliacao.onClick(() => mostrarAba("avaliacao"));
}
}
function mostrarAba(aba) {
const multi = elemento("#multiBoxJogos");
if (!multi) return;
const estados = multi.states.map(estado => estado.id);
let palavras = [];
if (aba === "dados") palavras = ["dados", "dadospartida"];
if (aba === "participacao") palavras = ["participacao", "participação"];
if (aba === "competencia") palavras = ["competencia", "competencias", "competência", "competências"];
if (aba === "avaliacao") palavras = ["avaliacao", "avaliacaofinal", "avaliação", "avaliaçãofinal"];
const estadoEncontrado = estados.find(id => {
const normalizado = id.toLowerCase();
return palavras.some(p => normalizado.includes(p));
});
if (estadoEncontrado) {
multi.changeState(estadoEncontrado);
setTimeout(() => {
atualizarCardResumoJogo();
atualizarCardVisual();
}, 900);
}
}
//==========================================================
// DATASET ATUAL
//==========================================================
function atualizarJogoAtualPeloDataset() {
const ds = elemento("#dataset2");
if (!ds) return;
let jogo = null;
try {
jogo = ds.getCurrentItem();
} catch (e) {}
if (jogo && jogo._id) {
jogoAtualId = jogo._id;
setTimeout(() => {
preencherCamposJogo(jogo);
atualizarCardResumoJogo();
atualizarCardVisual();
}, 400);
}
}
//==========================================================
// BUSCA
//==========================================================
function configurarBuscaJogos() {
const repeater = elemento("#repeaterBusca");
const input = elemento("#inputBuscarJogo");
if (repeater) {
repeater.collapse();
repeater.onItemReady(($item, itemData) => {
const data = itemData.dataDoJogo
? new Date(itemData.dataDoJogo).toLocaleDateString("pt-BR")
: "";
const status =
itemData.statusDoJogo ||
itemData.statusJogo ||
itemData.status ||
"";
$item("#textJogo").text =
`${data} | ${itemData.competio || ""} | ${itemData.adiversrio || ""} | ${status}`;
$item("#buttonEditar").onClick(async () => {
await carregarJogoParaEditar(itemData._id);
});
});
}
if (input) {
input.onInput(async () => {
await buscarJogos();
});
}
}
async function buscarJogos() {
const input = elemento("#inputBuscarJogo");
const repeater = elemento("#repeaterBusca");
if (!input || !repeater) return;
const termo = String(input.value || "").trim();
if (!termo || termo.length < 2) {
repeater.data = [];
repeater.collapse();
return;
}
try {
const q1 = wixData.query("Jogos").contains("competio", termo);
const q2 = wixData.query("Jogos").contains("adiversrio", termo);
const q3 = wixData.query("Jogos").contains("localDoJogo", termo);
const q4 = wixData.query("Jogos").contains("statusDoJogo", termo);
const resultado = await q1
.or(q2)
.or(q3)
.or(q4)
.descending("dataDoJogo")
.limit(30)
.find();
repeater.data = resultado.items || [];
if (resultado.items.length > 0) {
repeater.expand();
} else {
repeater.collapse();
}
} catch (erro) {
console.error("Erro ao buscar jogos:", erro);
}
}
async function carregarJogoParaEditar(id) {
try {
const jogo = await wixData.get("Jogos", id);
jogoAtualId = jogo._id;
const ds = elemento("#dataset2");
if (ds) {
await ds.setFilter(wixData.filter().eq("_id", jogoAtualId));
}
preencherCamposJogo(jogo);
const input = elemento("#inputBuscarJogo");
if (input) input.value = "";
const repeater = elemento("#repeaterBusca");
if (repeater) repeater.collapse();
atualizarCardResumoJogo();
atualizarCardVisual();
mostrarAba("dados");
} catch (erro) {
console.error("Erro ao carregar jogo:", erro);
}
}
//==========================================================
// PREENCHER CAMPOS
//==========================================================
function preencherCamposJogo(jogo) {
definirValor("#inputAdversario", jogo.adiversrio || "");
definirValor("#inputLocalJogo", jogo.localDoJogo || "");
definirValor("#datePickerDataJogo", jogo.dataDoJogo ? new Date(jogo.dataDoJogo) : null);
definirValor("#timePickerHoraJogo", jogo.horaDoJogo || "");
selecionarCompeticaoDoJogo(jogo);
definirStatusJogo(jogo);
definirValor("#addressInput1", jogo.enderecoCompleto || "");
definirValor("#inputCidade", jogo.cidade || "");
definirValor("#inputEstado", jogo.estado || "");
definirValor("#inputPais", jogo.pas || "");
CAMPOS_COMPETENCIAS.forEach(campo => {
definirValor(`#${campo}`, jogo[campo] || null);
});
}
//==========================================================
// ENDEREÇO
//==========================================================
function configurarEnderecoAutomatico() {
const address = elemento("#addressInput1");
if (address && typeof address.onChange === "function") {
address.onChange(() => {
preencherEnderecoAutomatico();
});
}
}
function preencherEnderecoAutomatico() {
const address = elemento("#addressInput1");
if (!address) return;
const endereco = address.value;
if (!endereco) return;
let cidade = "";
let estado = "";
let pais = "";
let enderecoCompleto = "";
if (typeof endereco === "string") {
enderecoCompleto = endereco;
} else {
enderecoCompleto =
endereco.formatted ||
endereco.addressLine ||
endereco.streetAddress ||
"";
cidade =
endereco.city ||
endereco.subdivision ||
"";
estado =
endereco.state ||
endereco.subdivision ||
endereco.administrativeArea ||
"";
pais =
endereco.country ||
endereco.countryFullname ||
endereco.countryCode ||
"";
}
if (enderecoCompleto) definirValor("#addressInput1", enderecoCompleto);
if (cidade) definirValor("#inputCidade", cidade);
if (estado) definirValor("#inputEstado", estado);
if (pais) definirValor("#inputPais", pais);
atualizarCardResumoJogo();
}
function valorEnderecoSimples() {
const address = elemento("#addressInput1");
if (!address) return "";
const endereco = address.value;
if (!endereco) return "";
if (typeof endereco === "string") return endereco;
return endereco.formatted ||
endereco.addressLine ||
endereco.streetAddress ||
"";
}
//==========================================================
// DADOS DO JOGO
//==========================================================
function montarDadosDoJogo() {
const dados = {
competicaoId: pegarIdCompeticaoSelecionada(),
competio: pegarCompeticaoSelecionada(),
adiversrio: valor("#inputAdversario"),
localDoJogo: valor("#inputLocalJogo"),
dataDoJogo: valor("#datePickerDataJogo"),
horaDoJogo: valor("#timePickerHoraJogo"),
enderecoCompleto: valorEnderecoSimples(),
cidade: valor("#inputCidade"),
estado: valor("#inputEstado"),
pas: valor("#inputPais"),
statusDoJogo: pegarStatusJogo()
};
CAMPOS_COMPETENCIAS.forEach(campo => {
const nota = Number(valor(`#${campo}`));
if (!isNaN(nota) && nota > 0) {
dados[campo] = nota;
}
});
dados.notaPartida = calcularNotaPartida(dados);
return dados;
}
//==========================================================
// ATUALIZAÇÃO DOS GRÁFICOS
//==========================================================
function configurarAtualizacaoGraficos() {
CAMPOS_COMPETENCIAS.forEach(campo => {
const el = elemento(`#${campo}`);
if (el && typeof el.onChange === "function") {
el.onChange(() => {
atualizarCardVisual();
});
}
});
const camposResumo = [
"#inputAdversario",
"#inputLocalJogo",
"#datePickerDataJogo",
"#timePickerHoraJogo",
"#dropdownCompeticao"
];
camposResumo.forEach(id => {
const el = elemento(id);
if (el && typeof el.onChange === "function") {
el.onChange(() => {
atualizarCardResumoJogo();
atualizarCardVisual();
});
}
});
}
function atualizarCardVisual() {
const jogo = montarDadosDoJogo();
const nota = calcularNotaPartida(jogo);
const htmlNota = montarHtmlNotaPartida(nota);
const htmlGrafico = montarHtmlGraficoCompetencias(jogo);
const htmlCardNota = elemento("#htmlCardNotaPartida");
if (htmlCardNota) {
try { htmlCardNota.show(); } catch (e) {}
try { htmlCardNota.expand(); } catch (e) {}
setTimeout(() => {
try { htmlCardNota.postMessage(htmlNota); } catch (e) {}
}, 500);
}
const htmlCardCompetencias = elemento("#htmlCardCompetencias");
if (htmlCardCompetencias) {
try { htmlCardCompetencias.show(); } catch (e) {}
try { htmlCardCompetencias.expand(); } catch (e) {}
setTimeout(() => {
try { htmlCardCompetencias.postMessage(htmlGrafico); } catch (e) {}
}, 800);
}
}
//==========================================================
// CARD RESUMO
//==========================================================
function atualizarCardResumoJogo() {
const competicao = pegarCompeticaoSelecionada() || "Competição não informada";
const adversario = valor("#inputAdversario") || "Adversário não informado";
const dataValor = valor("#datePickerDataJogo");
const status = pegarStatusJogo();
const data = dataValor
? new Date(dataValor).toLocaleDateString("pt-BR")
: "Data não informada";
definirTexto("#textResumoJogo", `${data} | ${competicao} | ${adversario} | ${status}`);
atualizarHtmlResumoJogo(data, competicao, adversario, status);
}
function atualizarHtmlResumoJogo(data, competicao, adversario, status) {
const corStatus = status === "Finalizado" ? "#0B8F08" : "#F2C300";
const textoStatus = status || "Agendado";
const html = `
<div style="width:100%;box-sizing:border-box;padding:10px;font-family:Arial,sans-serif;">
<div style="width:100%;box-sizing:border-box;border-radius:18px;background:#ffffff;border:1px solid #E5E7EB;box-shadow:0 4px 14px rgba(0,0,0,0.08);padding:14px;">
<div style="display:flex;justify-content:space-between;gap:10px;align-items:center;flex-wrap:wrap;">
<div style="font-size:12px;font-weight:900;color:#6B7280;">
JOGO EM AVALIAÇÃO
</div>
<div style="font-size:12px;font-weight:900;color:#111827;background:${corStatus};border-radius:999px;padding:6px 10px;">
${textoStatus}
</div>
</div>
<div style="margin-top:8px;font-size:18px;font-weight:900;color:#111827;">
${competicao}
</div>
<div style="margin-top:6px;font-size:15px;font-weight:700;color:#374151;">
${adversario}
</div>
<div style="margin-top:10px;font-size:12px;font-weight:800;color:#374151;background:#F3F4F6;border-radius:999px;padding:7px 10px;display:inline-block;">
${data}
</div>
</div>
</div>
`;
const htmlBox = elemento("#htmlResumoJogo");
if (htmlBox) {
try {
htmlBox.postMessage(html);
} catch (e) {}
}
}
//==========================================================
// NOTA DA PARTIDA
//==========================================================
function calcularNotaPartida(jogo) {
const valores = CAMPOS_COMPETENCIAS
.map(campo => Number(jogo[campo]))
.filter(n => !isNaN(n) && n > 0);
if (valores.length === 0) return 0;
const soma = valores.reduce((total, n) => total + n, 0);
return soma / valores.length;
}
function montarHtmlNotaPartida(nota) {
const notaLimitada = Math.max(0, Math.min(5, Number(nota) || 0));
const percentual = Math.round((notaLimitada / 5) * 100);
const cor = obterCorNota(notaLimitada);
return `
<div style="width:100%;box-sizing:border-box;padding:10px;font-family:Arial,sans-serif;">
<div style="width:100%;box-sizing:border-box;border-radius:18px;background:#ffffff;border:1px solid #E5E7EB;box-shadow:0 4px 14px rgba(0,0,0,0.08);padding:16px;">
<div style="font-size:12px;font-weight:900;color:#6B7280;">
NOTA DA PARTIDA
</div>
<div style="margin-top:4px;font-size:34px;line-height:1;font-weight:900;color:${cor};">
${formatarNota(notaLimitada)}
</div>
<div style="margin-top:14px;width:100%;height:14px;border-radius:999px;background:#E5E7EB;overflow:hidden;">
<div style="width:${percentual}%;height:100%;background:${cor};border-radius:999px;"></div>
</div>
<div style="margin-top:8px;font-size:11px;font-weight:700;color:#6B7280;">
Média calculada pelas competências avaliadas.
</div>
</div>
</div>
`;
}
//==========================================================
// GRÁFICO DAS COMPETÊNCIAS
//==========================================================
function montarHtmlGraficoCompetencias(jogo) {
let linhas = "";
CAMPOS_COMPETENCIAS.forEach(campo => {
const nota = Number(jogo[campo]) || 0;
const percentual = Math.max(0, Math.min(100, (nota / 5) * 100));
const cor = obterCorNota(nota);
linhas += `
<div style="margin-bottom:14px;">
<div style="display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:13px;font-weight:800;color:#374151;margin-bottom:5px;">
<span style="max-width:75%;white-space:normal;">${NOMES_COMPETENCIAS[campo] || campo}</span>
<span style="min-width:34px;text-align:right;">${formatarNota(nota)}</span>
</div>
<div style="width:100%;height:12px;background:#E5E7EB;border-radius:999px;overflow:hidden;">
<div style="width:${percentual}%;height:100%;background:${cor};border-radius:999px;"></div>
</div>
</div>
`;
});
return `
<div style="width:100%;box-sizing:border-box;padding:12px;font-family:Arial,sans-serif;">
<div style="width:100%;box-sizing:border-box;background:#FFFFFF;border:1px solid #E5E7EB;border-radius:18px;padding:16px;box-shadow:0 4px 14px rgba(0,0,0,0.08);">
<div style="font-size:15px;font-weight:900;color:#111827;margin-bottom:16px;text-align:center;">
GRÁFICO DAS COMPETÊNCIAS
</div>
${linhas}
</div>
</div>
`;
}
//==========================================================
// FORMATAÇÃO
//==========================================================
function obterCorNota(nota) {
if (nota >= 4) return "#0B8F08";
if (nota >= 3) return "#F2C300";
if (nota > 0) return "#E53935";
return "#6B7280";
}
function formatarNota(nota) {
return (Number(nota) || 0).toFixed(1).replace(".", ",");
}
//==========================================================
// AUXILIARES
//==========================================================
function valor(id) {
const el = elemento(id);
if (!el) return "";
try {
return el.value || "";
} catch (e) {
return "";
}
}
function definirValor(id, valorNovo) {
const el = elemento(id);
if (!el) return;
try {
el.value = valorNovo;
} catch (e) {}
}
function definirTexto(id, texto) {
const el = elemento(id);
if (!el) return;
try {
el.text = String(texto || "");
} catch (e) {}
}
function mensagem(texto) {
definirTexto("#textMensagem", texto);
const el = elemento("#textMensagem");
if (el) {
try { el.expand(); } catch (e) {}
try { el.show(); } catch (e) {}
}
}
