Я создаю аналитическую панель и использую API CHARTJS ...
Я строю Графики из информации, поступающей динамически от API, который я использую в бэкэнде, то есть я не знаю, сколько графиков у меня будет на странице ...
С этими первыми графическими изображениями и компонентами, которые я генерирую при первом доступе, с данными, поступающими из серверной части.
В чем моя проблема?
Когда я нажимаю на каждую полосу графика, мне нужно сгенерировать новые карточки (которые являются компонентом в ejs), но единственный способ, которым я знаю, это использовать javascript, скопировать и вставить весь мой HTML из этого элемента обратно в мой innerHTML ...
Хотелось бы узнать, есть ли у вас лучший способ повторно использовать мою карточку там, на моем фронте, с новыми данными, по нажатию на столбцы диаграммы.
Помня, что для графики у меня есть объектно-ориентированный класс javascript ...
<!DOCTYPE html>
<html lang="en">
<head>
<title><%= data.general.titlePage %></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="/css/fonts/_font-icons.css">
<link rel="stylesheet" href="/css/fonts/_font-trebuchet.css">
<link rel="stylesheet" href="/css/fonts/_font-verdana.css">
<link rel="stylesheet" href="/css/utilities/_colors.css">
<link rel="stylesheet" href="/css/utilities/buttons/shapes/_circle.css">
<link rel="stylesheet" href="/css/utilities/buttons/types/_switch-indicator.css">
<link rel="stylesheet" href="/css/utilities/_sizing.css">
<link rel="stylesheet" href="/css/components/partials/cards/charts/main/_main.css">
<link rel="stylesheet" href="/css/components/partials/cards/charts/secondary/_sales.css">
<link rel="stylesheet" href="/css/effects/_no-select.css">
<!-- TEMPORÁRIO -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.13.2/css/bootstrap-select.min.css">
</head>
<body class="no-select">
<header>
<%- include('../../partials/navbars/header'); -%>
</header>
<aside>
<%- include('../../partials/utilities/filter'); -%>
</aside>
<!-- GRÁFICO PRINCIPAL -->
<main>
<div class="container-fluid bg-lilas-2 shadow mt-4">
<div class="row">
<div class="col-12 mt-5">
<h5 id="CCMDT" class="card-compoment-main-date-title font-weight-light text-center text-white text-shadow"><%= data.general.titleData %></h5>
</div>
<div class="col-12 mt-4">
<canvas id="MCJS" class="mx-auto d-block" style="height:40vh; width:80vw;"></canvas>
</div>
</div>
<div class="row py-4 pt-5">
<div class="col-12">
<div class="d-flex justify-content-between">
<% for(let i = 0; i < data.api.response.summary.quantity.kpis - 1; i++){ %>
<% if(data.api.response.records[data.api.response.summary.quantity.records - 1].INDICADORES[i].tipo === data.api.querys.IndicatorType) { %>
<% data.api.response.records[data.api.response.summary.quantity.records - 1].INDICADORES[i][data.api.querys.IndicatorType].KPIS.forEach(kpi => { %>
<% if(kpi.tipo === "Venda"){ %>
<div class="ml-4 ml-xl-5 pl-sm-1 pl-md-2 pl-lg-3">
<h3 class="card-compoment-main-indicator-title text-white"><%= kpi.tipo %></h3>
<h5 id="CCMIS" class="card-compoment-main-indicator-subtitle text-white">
<% if(data.api.querys.IndicatorType === 'm²') { %>
<%= `${kpi[kpi.tipo][`${kpi.tipo} ${data.api.querys.IndicatorType}`]} ${data.api.querys.IndicatorType}` %>
<% } else { %>
<%= `${kpi[kpi.tipo][kpi.tipo]} ${data.api.querys.IndicatorType}` %>
<% } %>
</h5>
</div>
<div class="mr-3 mr-xl-4 pr-sm-1 pr-md-2 pr-lg-3">
<button type="button" id="CCMIPT" class="btn btn-sm btn-global-circle text-white <%= kpi[kpi.tipo][`Δ% ${kpi.tipo} ${data.api.querys.IndicatorType}`] < 0 ? 'bg-danger' : 'bg-success' %>">
<% if(data.api.querys.IndicatorType === 'm²') { %>
<%= `${kpi[kpi.tipo][`Δ% ${kpi.tipo} ${data.api.querys.IndicatorType}`]} %` %>
<% } else { %>
<%= `${kpi[kpi.tipo][`Δ% ${kpi.tipo}`]} %` %>
<% } %>
</button>
</div>
<% } %>
<% }); %>
<% } %>
<% } %>
</div>
</div>
</div>
</div>
</main>
<!-- GRÁFICOS SECUNDÁRIOS -->
<section>
<div class="container-fluid py-3 mb-5">
<div id="SCC" class="row">
<% for(let i = 0; i < data.api.response.summary.quantity.kpis - 1; i++){ %>
<% if(data.api.response.records[data.api.response.summary.quantity.records - 1].INDICADORES[i].tipo === data.api.querys.IndicatorType) { %>
<% data.api.response.records[data.api.response.summary.quantity.records - 1].INDICADORES[i][data.api.querys.IndicatorType].KPIS.forEach(kpi => { %>
<% if(kpi.tipo !== "Venda"){ %>
<div class="col-12 col-lg-6">
<div class="card rounded shadow mb-4">
<!-- título do tipo de indicador -->
<div id="" class="card-header card-component-sales-indicator-title border-bottom-0 bg-transparent"><%= kpi.tipo %></div>
<div class="card-body p-1">
<div class="container-fluid d-flex flex-wrap flex-sm-nowrap justify-content-between">
<!-- valor do indicador -->
<div>
<span class="card-component-sales-indicator-subtitle font-weight-bold">
<% if(data.api.querys.IndicatorType === 'm²') { %>
<%= `${kpi[kpi.tipo][`${kpi.tipo} ${data.api.querys.IndicatorType}`]} ${data.api.querys.IndicatorType}` %>
<% } else { %>
<%= `${kpi[kpi.tipo][kpi.tipo]} ${data.api.querys.IndicatorType}` %>
<% } %>
</span>
</div>
<!-- gráfico do indicador -->
<div class="w-sm-50 mx-auto d-block py-5 py-sm-0"><canvas id="<%= `${kpi.tipo}Chartjs` %>"></canvas></div>
<!-- valor de percentagem do indicador (para resolução small. medium, large e extra large) -->
<div class="d-none d-sm-block">
<button type="button" class="btn btn-sm btn-esm-circle btn-sm-circle btn-lg-circle btn-xl-circle card-component-login-btn-indicator text-white mx-auto d-block <%= (kpi[kpi.tipo][`Δ% ${kpi.tipo} ${data.api.querys.IndicatorType}`] || kpi[kpi.tipo][`Δ% ${kpi.tipo}`]) <= 0 ? 'bg-danger' : 'bg-success' %>">
<% if(data.api.querys.IndicatorType === 'm²') { %>
<%= `${kpi[kpi.tipo][`Δ% ${kpi.tipo} ${data.api.querys.IndicatorType}`]} %` %>
<% } else { %>
<%= `${kpi[kpi.tipo][`Δ% ${kpi.tipo}`]} %` %>
<% } %>
</button>
</div>
</div>
</div>
<!-- valor de percentagem do indicador (somente para resolução extra small ) -->
<div class="card-footer text-center d-sm-none <%= (kpi[kpi.tipo][`Δ% ${kpi.tipo} ${data.api.querys.IndicatorType}`] || kpi[kpi.tipo][`Δ% ${kpi.tipo}`]) <= 0 ? 'bg-danger' : 'bg-success' %>">
<span class="text-white">
<% if(data.api.querys.IndicatorType === 'm²') { %>
<%= `${kpi[kpi.tipo][`Δ% ${kpi.tipo} ${data.api.querys.IndicatorType}`]} %` %>
<% } else { %>
<%= `${kpi[kpi.tipo][`Δ% ${kpi.tipo}`]} %` %>
<% } %>
</span>
</div>
</div>
</div>
<% } %>
<% }); %>
<% } %>
<% } %>
</div>
</section>
<!-- TEMPORÁRIO -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="/js/library/axios/axios.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.13.2/js/bootstrap-select.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js" crossorigin="anonymous"></script>
<!-- FIXOS -->
<script src="/js/scripts/API/controller.js"></script>
<script src="/js/scripts/graphs/controller.js"></script>
<script src="/js/scripts/graphs/bar/controller.js"></script>
<!-- SCRIPT PARA GERAR OS GRÁFICOS -->
<script>
// REQUEST API DATA
API.data = <%- JSON.stringify(data.api.response) %>;
API.queryIndicatorType = '<%= data.api.querys.IndicatorType %>';
API.organizeData();
console.log(API.data)
// MAIN CHART - HOME PAGE
const mainGraphBar = new GraphBar('MCJS', 'Venda', API.queryIndicatorType);
mainGraphBar.data = API.organizedData;
mainGraphBar.generateHomePageData();
mainGraphBar.render();
// SECONDARY CHARTS (KPI) - HOME PAGE
let kpiGraphBar;
<% for(let i = 0; i < data.api.response.summary.quantity.kpis - 1; i++){ %>
<% if(data.api.response.records[data.api.response.summary.quantity.records - 1].INDICADORES[i].tipo === data.api.querys.IndicatorType) { %>
<% data.api.response.records[data.api.response.summary.quantity.records - 1].INDICADORES[i][data.api.querys.IndicatorType].KPIS.forEach(kpi => { %>
<% if(kpi.tipo !== "Venda"){ %>
kpiGraphBar = new GraphBar('<%= `${kpi.tipo}Chartjs` %>', '<%= kpi.tipo %>', API.queryIndicatorType);
kpiGraphBar.data = API.organizedData[(API.organizedData.length - 1)];
kpiGraphBar.generateHomePageData();
kpiGraphBar.render();
<% } %>
<% }); %>
<% } %>
<% } %>
</script>
</body>
</html>