top of page

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) {}

}

}

bottom of page