Source: diagram-doc.js


/**
 * Fetchar antagningsstatistik från länk med JSON-data och skickar till diagramfunktioner
 */

async function importCourses() {

    const link = "https://mallarmiun.github.io/Frontend-baserad-webbutveckling/Moment%205%20-%20Dynamiska%20webbplatser/statistik_sokande_ht25.json";

    try {
        const linkData = await fetch(link);
        const jsonData = await linkData.json(); 

        diagramInfo(jsonData);
        diagramInfoTwo(jsonData);
    }

    catch (error) {
        console.error(error);

        const errorPlace = document.getElementById("chart"); //Error-meddelande
        errorPlace.innerHTML = `<p>PROBLEM ATT LADDA DIAGRAM-DATA, vänligen testa igen..</p>`;

        const errorPlaceTwo = document.getElementById("chartTwo"); //Error-meddelande
        errorPlaceTwo.innerHTML = `
        <p>PROBLEM ATT LADDA DIAGRAM-DATA, vänligen testa igen..</p>
        `;
    }
}

/**
 * Fixar fram, sorterar och filtrerar data 
 * och skickar till stapeldiagram (courseDiagram)
 * @param {Array<Object>} jsonData - antagningsstatistik från API 
 */

function diagramInfo(jsonData) { 

    const allCourses = jsonData.filter(eachData => eachData.type === 'Kurs' || eachData.type === 'kurs'); //filtrera ut kurser
    const sortedCourses = allCourses.sort((a, b) => b.applicantsTotal - a.applicantsTotal); //flest sökanden först
    const topCourses = sortedCourses.slice(0, 6); //sex mest sökta

    const courses = [];
    const applicants = [];

    topCourses.forEach(course => { //pusha till respektive array
        courses.push(course.name);
        applicants.push(Number(course.applicantsTotal)); //nummer ej sträng
    });


    courseDiagram(applicants, courses);

};

/**
 * Fixar fram, sorterar och filtrerar data 
 * och skickar till cirkeldiagram (programDiagram)
 * @param {Array<Object>} jsonData - antagningsstatistik från API 
 */

function diagramInfoTwo(jsonData) { //Funktion för att fixa fram data till nästa diagram

    const allPrograms = jsonData.filter(eachData => eachData.type === 'Program' || eachData.type === 'program'); //filtrera ut program
    const sortedPrograms = allPrograms.sort((a, b) => b.applicantsTotal - a.applicantsTotal); //flest sökanden först
    const topPrograms = sortedPrograms.slice(0, 5); //fem mest sökta

    const programs = [];
    const programApplicants = [];

    topPrograms.forEach(program => { //pusha till respektive array
        programs.push(program.name);
        programApplicants.push(Number(program.applicantsTotal)); //nummer ej sträng
    });

    programDiagram(programApplicants, programs);

};


/**
 * Skapar stapeldiagram med sex mest sökta kurser
 * @param {number[]} mostApplicants - ansökningsantal för kurserna
 * @param {string[]} courses - sex mest sökta kurserna
 */

function courseDiagram(mostApplicants, courses) {

    const options = {
        series: [{
            name: 'Total applicants',
            data: mostApplicants
        }],
        chart: {
            height: 900,
            width: 700,
            type: 'bar'
        },
        responsive: [
            {
                breakpoint: 1024,
                options: {
                    chart: {
                        width: 500,
                        height: 850
                    }
                }
            },
            {
                breakpoint: 850,
                options: {
                    chart: {
                        width: 400,
                        height: 750
                    },
                    xaxis: {
                        labels: {
                            style: {
                                fontSize: '10px'
                            },
                        }
                    }
                }
            },
            {
                breakpoint: 700,
                options: {
                    chart: {
                        width: 350,
                        height: 700
                    }
                }
            },
            {
                breakpoint: 500,
                options: {
                    chart: {
                        width: 320,
                        height: 700
                    }
                }
            }
        ],
        plotOptions: {
            bar: {
                borderRadius: 10,
                columnWidth: '50%',
            }
        },
        colors: ['#df6dbd'],
        dataLabels: {
            enabled: false
        },
        stroke: {
            width: 0
        },
        grid: {
            show: true,
            padding: {
                left: 0,
                right: 0,
                bottom: 300
            }
        },
        xaxis: {
            labels: {
                rotate: -80,
                style: {
                    fontSize: '12px'
                },
            },
            categories: courses,
            tickPlacement: 'between',
            axisTicks: { show: true },
        },
        yaxis: {
            title: {
                text: 'Antal sökande',
            },
        },
        fill: {
            type: 'gradient',
            gradient: {
                shade: 'light',
                type: "horizontal",
                shadeIntensity: 0.25,
                gradientToColors: ['#f8f3f6'],
                inverseColors: false,
                opacityFrom: 0.75,
                opacityTo: 0.85,
                stops: [0, 100]
            },
        }
    };

    const chart = new ApexCharts(document.querySelector("#chart"), options);
    chart.render();
}

/**
 * Skapar cirkeldiagram med fem mest sökta program
 * @param {number[]} programApplicants - ansökningsantal för programmen
 * @param {string[]} programs - fem mest sökta programmen
 */

function programDiagram(programApplicants, programs) {


    const options = {
        series: programApplicants,
        chart: {
            width: 700,
            type: 'pie',
        },
        labels: programs,
        colors: ["#55031e", "#800830", "#cc104e", "#fa6194", "#ffb8d0"],
        dataLabels: {
            enabled: true,
            style: {
                fontSize: '12px',
                color: ['white']
            }
        },
        legend: {
            labels: {
                style: {
                    fontSize: '12px'
                }
            }
        },
        responsive: [
            {
                breakpoint: 800,
                options: {
                    chart: {
                        width: 400
                    },
                    legend: {
                        position: 'bottom',
                        fontSize: '11px'
                    },
                    dataLabels: {
                        enabled: true,
                        style: {
                            fontSize: '10px',
                        }
                    }
                }
            },
            {
                breakpoint: 900,
                options: {
                    chart: {
                        width: 600
                    }
                }
            }
        ]
    };

    const chartTwo = new ApexCharts(document.querySelector("#chartTwo"), options);
    chartTwo.render();
}