import Vue, { computed, defineComponent, onMounted, ref } from 'vue' import { tools } from '../../store/Modules/tools' import { useUserStore } from '@store/UserStore' import { useRouter } from 'vue-router' import { useGlobalStore } from '@store/globalStore' import { useI18n } from 'vue-i18n' import { useQuasar } from 'quasar' import type { ChartItem, ChartConfiguration } from 'chart.js'; import { Chart, BarController, BarElement, LineController, LinearScale, CategoryScale, PointElement, LineElement, Title } from 'chart.js'; export default defineComponent({ name: 'CLineChart', components: {}, props: { mydata: { required: false, default: [] }, title: { required: false, default: false }, sum: { required: false, default: false }, color: { required: false, default: 'red' }, bordercolor: { required: false, default: 'red' }, mycolors: { required: false, default: null }, offset: { required: false, default: 0 }, showMedia: { required: false, default: false } }, setup(props, { emit }) { const userStore = useUserStore() const globalStore = useGlobalStore() const { t } = useI18n() const q = useQuasar() const myarrlabel = ref([]) const myarrdata = ref([]) const myarrdataLine = ref([]) const myarrbg = ref([]) const myarrsum = ref([]) const chartDataLine = ref({ labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], datasets: [ { label: 'Data One', backgroundColor: '#f87979', data: [40, 39, 10, 40, 39, 80, 40] } ] }) const chartOptionsLine = ref({ responsive: true, maintainAspectRatio: false }) function calcolaMedia(myarray: any, periodi: number) { if (myarray.length === 0 || myarray.length < periodi) { return 0; // Se l'array è vuoto o più corto del numero di periodi, la media è 0. } const somma = myarray.slice(-periodi).reduce((accumulator: number, currentValue: number) => accumulator + currentValue, 0); return somma / periodi; } function getRecordByDate(mydata: any, currentDate: Date) { const targetDate = currentDate.toISOString().split('T')[0]; return mydata.find((record: any) => record._id === targetDate); } function mounted() { Chart.register(BarController, BarElement, LineController, LinearScale, CategoryScale, PointElement, LineElement, Title); myarrdata.value = [] myarrdataLine.value = [] myarrbg.value = [] myarrlabel.value = [] myarrsum.value = [] let somma = 0 if (props.sum) somma = props.offset let rec: any let ind = '' let num = 1 const mostraggtutti = true if (mostraggtutti) { let num = 1; const strstartDate: any = props.mydata[0] const startDate = new Date(strstartDate._id); // Data di inizio da props const endDate = new Date(); // Data di fine da props const currentDate = new Date(startDate); // console.log('startDate', startDate, 'endDate', endDate) while (currentDate <= endDate) { const dataPresente = getRecordByDate(props.mydata, currentDate) const count = dataPresente ? dataPresente.count : 0; const day = currentDate.toISOString().split('T')[0].split('-'); const mydate = day[2] + '/' + day[1]; myarrlabel.value.push(mydate); myarrdata.value.push(count); const media = calcolaMedia(myarrdata.value, 30); myarrdataLine.value.push(media ? media : undefined); if (currentDate === endDate) { myarrbg.value.push(tools.colourNameToHex('green')); } else { myarrbg.value.push(tools.colourNameToHex(props.color)); } myarrsum.value.push(somma); num++; currentDate.setDate(currentDate.getDate() + 1); // Passa al giorno successivo } } else { for (rec of props.mydata) { if (props.sum) { somma += rec.count } else { somma = rec.count } const day = rec._id.split('-') ind = day[2] + '/' + day[1] //myarrlabel.value.push(rec._id) myarrlabel.value.push(ind) myarrdata.value.push(rec.count) const media = calcolaMedia(myarrdata.value, 14) myarrdataLine.value.push(media ? media : undefined) if (num === props.mydata.length) { myarrbg.value.push(tools.colourNameToHex('green')) } else { myarrbg.value.push(tools.colourNameToHex(props.color)) } myarrsum.value.push(somma) num++ // ind++ } } const chartData: any = { labels: myarrlabel.value, datasets: [ { type: 'bar', label: props.title, data: myarrdata.value, borderColor: tools.colourNameToHex('red'), backgroundColor: myarrbg.value, fill: true, }, ], } const media = { type: 'line', label: 'Media', data: myarrdataLine.value, borderColor: 'rgb(255, 99, 132)', backgroundColor: 'rgb(255, 99, 132)', fill: true, } if (props.showMedia && myarrdataLine.value) chartData.datasets.push(media) const configBar: ChartConfiguration = { type: 'bar', data: chartData, options: { scales: { y: { beginAtZero: true } }, interaction: { intersect: false }, }, }; const canvasTag = document.getElementById('myChart') const myChart = new Chart( canvasTag, configBar) } function getoffset() { return props.offset } onMounted(mounted) return { tools, getoffset, } }, })