Anons79 Mini Shell

Directory : /home/aplikasiposinfo/public_html/dashboard.isranhadikaltim.id/resources/views/
Upload File :
Current File : /home/aplikasiposinfo/public_html/dashboard.isranhadikaltim.id/resources/views/welcome.blade.php

<x-layout>
    <x-slot:title>
        Home
    </x-slot:title>
    <div class="px-4 py-6">

        <div class="mb-8 rounded-2xl bg-gradient-to-r from-blue-600 via-purple-600 to-red-600 p-8 text-white">
            <div class="grid grid-cols-1 gap-8 lg:grid-cols-4">
                <div class="relative flex items-center gap-4">
                    <div class="relative h-16 w-16">
                        <div class="absolute inset-0 rounded-full bg-pink-400 opacity-20"></div>
                        <svg class="h-16 w-16 -rotate-90" viewBox="0 0 40 40">
                            <circle cx="20" cy="20" r="16" fill="none" stroke="currentColor"
                                strokeWidth="3" class="opacity-10" />
                            <circle cx="20" cy="20" r="16" fill="none" stroke="currentColor"
                                strokeWidth="3" strokeDasharray="90 100"
                                class="text-pink-400 transition-all duration-700" />
                        </svg>
                    </div>
                    <div>
                        <div class="text-2xl font-bold" id="total-saksi">0</div>
                        <div class="text-sm text-gray-300">Total Saksi</div>
                    </div>
                </div>
                <div class="relative flex items-center gap-4">
                    <div class="relative h-16 w-16">
                        <div class="absolute inset-0 rounded-full bg-green-400 opacity-20"></div>
                        <svg class="h-16 w-16 -rotate-90" viewBox="0 0 40 40">
                            <circle cx="20" cy="20" r="16" fill="none" stroke="currentColor"
                                strokeWidth="3" class="opacity-10" />
                            <circle cx="20" cy="20" r="16" fill="none" stroke="currentColor"
                                strokeWidth="3" strokeDasharray="70 100"
                                class="text-green-400 transition-all duration-700" />
                        </svg>
                    </div>
                    <div>
                        <div class="text-2xl font-bold" id="total-dpt">0</div>
                        <div class="text-sm text-gray-300">DPT</div>
                    </div>
                </div>

                <div class="relative flex items-center gap-4">
                    <div class="relative h-16 w-16">
                        <div class="absolute inset-0 rounded-full bg-blue-400 opacity-20"></div>
                        <svg class="h-16 w-16 -rotate-90" viewBox="0 0 40 40">
                            <circle cx="20" cy="20" r="16" fill="none" stroke="currentColor"
                                strokeWidth="3" class="opacity-10" />
                            <circle cx="20" cy="20" r="16" fill="none" stroke="currentColor"
                                strokeWidth="3" strokeDasharray="50 100"
                                class="text-blue-400 transition-all duration-700" />
                        </svg>
                    </div>
                    <div>
                        <div class="text-2xl font-bold" id="total-tps">0</div>
                        <div class="text-sm text-gray-300">TPS</div>
                    </div>
                </div>

                <div class="rounded-xl bg-white p-4 text-black">
                    <div class="flex items-center gap-4">
                        <div>
                            <div class="text-2xl font-bold" id="total-suara-konfirmasi">0</div>
                            <div class="text-sm text-gray-500">Total Suara</div>
                        </div>
                        <div class="ml-auto">
                            <svg class="h-8 w-8 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
                                    d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6" />
                            </svg>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-4 mb-8" id="list-calon">

            <div class="border shadow rounded-md p-4 max-w-sm w-full mx-auto loading">
                <div class="animate-pulse flex flex-col items-center space-x-4 w-full gap-6">
                    <div class="rounded-full bg-gray-400 h-40 w-40"></div>
                    <div class="flex-1 space-y-6 py-1 w-full">
                        <div class="h-2 bg-gray-400 rounded"></div>
                        <div class="h-2 bg-gray-400 rounded"></div>
                    </div>
                </div>
            </div>
            <div class="border shadow rounded-md p-4 max-w-sm w-full mx-auto loading">
                <div class="animate-pulse flex flex-col items-center space-x-4 w-full gap-6">
                    <div class="rounded-full bg-gray-400 h-40 w-40"></div>
                    <div class="flex-1 space-y-6 py-1 w-full">
                        <div class="h-2 bg-gray-400 rounded"></div>
                        <div class="h-2 bg-gray-400 rounded"></div>
                    </div>
                </div>
            </div>
            <div class="border shadow rounded-md p-4 max-w-sm w-full mx-auto loading">
                <div class="animate-pulse flex flex-col items-center space-x-4 w-full gap-6">
                    <div class="rounded-full bg-gray-400 h-40 w-40"></div>
                    <div class="flex-1 space-y-6 py-1 w-full">
                        <div class="h-2 bg-gray-400 rounded"></div>
                        <div class="h-2 bg-gray-400 rounded"></div>
                    </div>
                </div>
            </div>
            <div class="rounded-xl bg-white p-6 shadow-sm">
                <div class="space-y-4">
                    <div class="relative">
                        <select id="kabupaten_kota_id"
                            name="kabupaten_kota_id"
                            onchange="selectKabupatenKota(this)"
                            class="w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-gray-900 focus:border-blue-500 focus:ring-blue-500">

                            <option value="" selected>Semua Kabupaten Kota</option>
                            @foreach (Helper::kabupatenKotas() as $key => $kota)
                                <option value="{{ $key }}">{{ $kota }}</option>
                            @endforeach
                        </select>
                    </div>

                    <div class="relative">
                        <select id="kecamatan_id"
                            onchange="selectKecamatan(this)"
                            class="w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-gray-900 focus:border-blue-500 focus:ring-blue-500">
                            <option value="" selected>Pilih Kecamatan</option>
                        </select>
                    </div>

                    <div class="relative">
                        <select id="kelurahan_desa_id"
                            
                            class="w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-gray-900 focus:border-blue-500 focus:ring-blue-500">
                            <option value="" selected>Pilih Kelurahan/Desa</option>
                        </select>
                    </div>

                    <button type="button" id="submit-filter"
                        class="w-full rounded-md bg-gray-600 px-4 py-2 text-white transition-colors hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2">
                        Lihat Data
                    </button>
                </div>
            </div>
        </div>




        <div class="grid gap-4 grid-cols-1 md:grid-cols-3 mt-4">
            <div
                class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm  dark:border-gray-700 sm:p-6 dark:bg-gray-800">
                <div class="flex items-center justify-between my-4">
                    <div class="flex-shrink-0">
                        <span class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                            id="suara-masuk">0</span>
                        /
                        <span class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                            id="dpt">0</span>
                        <h3 class="text-base font-light text-gray-500 dark:text-gray-400">Suara Masuk / DPT (Sistem)
                        </h3>
                    </div>

                </div>
                <div id="chart2"></div>
            </div>
            <div
                class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm  dark:border-gray-700 sm:p-6 dark:bg-gray-800">
                <div class="flex items-center justify-between my-4">
                    <div class="flex-shrink-0">
                        <span class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                            id="dpt-tps">0</span>
                        /
                        <span class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                            id="dpt-sistem">0</span>
                        <h3 class="text-base font-light text-gray-500 dark:text-gray-400">DPT (Tps) / DPT (Sistem)</h3>
                    </div>

                </div>
                <div id="chart3"></div>
            </div>

            <div
                class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm  dark:border-gray-700 sm:p-6 dark:bg-gray-800">
                <div class="flex items-center justify-between my-4">
                    <div class="flex-shrink-0">
                        <span class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                            id="suara-sah">0</span>
                        /
                        <span class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                            id="suara-tidak-sah">0</span>
                        <h3 class="text-base font-light text-gray-500 dark:text-gray-400">Suara Sah / Suara Tidak Sah
                        </h3>
                    </div>

                </div>
                <div id="chart4"></div>
            </div>
        </div>

        <div
            class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm  dark:border-gray-700 sm:p-6 dark:bg-gray-800 mt-4">
            <div class="flex items-center justify-between mb-4">
                <div class="flex-shrink-0">
                    <h3 class="text-base font-light text-gray-500 dark:text-gray-400">Suara Per Kabupaten/Kota</h3>
                </div>

            </div>
            <div id="chart-kabupaten-kota"></div>
        </div>

        <div
            class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm  dark:border-gray-700 sm:p-6 dark:bg-gray-800 mt-4">
            <div class="flex items-center justify-between mb-4">
                <div class="flex-shrink-0">
                    <h3 class="text-base font-light text-gray-500 dark:text-gray-400">TPS Per Kabupaten/Kota</h3> <span
                        class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                        id="jumlah-tps-per-kabupaten-kota">0</span>
                </div>

            </div>
            <div id="chart-tps-kabupaten-kota"></div>
        </div>

        <div
            class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm  dark:border-gray-700 sm:p-6 dark:bg-gray-800 mt-4">
            <div class="flex items-center justify-between mb-4">
                <div class="flex-shrink-0">
                    <h3 class="text-base font-light text-gray-500 dark:text-gray-400">DPT Per Kabupaten/Kota</h3> <span
                        class="text-xl font-bold leading-none text-gray-900 sm:text-2xl dark:text-white"
                        id="jumlah-dpt-per-kabupaten-kota">0</span>
                </div>

            </div>
            <div id="chart-dpt-kabupaten-kota"></div>
        </div>

        <div class="grid w-full grid-cols-1 gap-4 mt-4 xl:grid-cols-2 2xl:grid-cols-3">
            @foreach (Helper::servers() as $key => $item)
                @php
                    $parsedUrl = parse_url($key);
                    $sub = explode('.', $parsedUrl['host']);
                @endphp
                <div id="server-{{ $sub[0] }}" data-url="{{ $key }}"
                    class="servers p-4 bg-white border border-gray-200 rounded-lg shadow-sm dark:border-gray-700 sm:p-6 dark:bg-gray-800">
                    <div class="w-full">
                        <h2>Server {{ $sub[0] }}</h2>
                        <h3 class="mb-2 text-base font-normal text-gray-500 dark:text-gray-400">
                            <a href="{{ $key }}">{{ $key }}</a>
                            <span class="p-2 bg-yellow-500 rounded-full h-4 w-4 inline-block status"></span>
                        </h3>

                        <div class="grid grid-cols-3 items-center justify-center mb-2 text-center">
                            <div>
                                <div class="chart-storage"></div>
                                <small>
                                    Storage (GB)
                                </small>
                            </div>
                            <div>
                                <div class="chart-memory"></div>
                                <small>
                                    Memory (GB)
                                </small>
                            </div>
                            <div>
                                <div class="chart-cpu"></div>
                                <small>CPU (%)</small>
                            </div>
                        </div>

                    </div>
                </div>
            @endforeach

        </div>
    </div>



    <x-slot:scripts>
        
        <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
        <script >
            const formatter = new Intl.NumberFormat('id-ID', {

                currency: 'IDR',
                trailingZeroDisplay: 'stripIfInteger'
            });
            const servers = @json(Helper::servers());
            const totalSaksiElm = document.getElementById('total-saksi');
            const totalDptElm = document.getElementById('total-dpt');
            const totalTpsElm = document.getElementById('total-tps');
            const totalSuaraElm = document.getElementById('total-suara');
            const totalSuaraKonfirmasiElm = document.getElementById('total-suara-konfirmasi');

            
            function selectKabupatenKota(e) {
                const id = e.value;
                if (id != "") {
                    for (const [key, value] of Object.entries(servers)) {
                        if (value.includes(parseInt(id))) {
                            getKecamatan(key + "/ajax/kecamatan?kabupaten_kota_id=" + id);
                            document.getElementById("kelurahan_desa_id").innerHTML = "";
                        }
                    }
                }
            }

            function selectKecamatan(e) {
                const id = e.value;
                if (id != "") {
                    for (const [key, value] of Object.entries(servers)) {
                        if (value.includes(parseInt(document.getElementById("kabupaten_kota_id").value))) {
                            getKelurahanDesa(key + "/ajax/kelurahan-desa?kecamatan_id=" + id);
                        }
                    }
                }
            }

            function getKecamatan(url) {
                fetch(url).then(response => {
                    if (!response.ok) {
                        throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
                    }

                    return response.json();
                }).then(results => {
                    let options = "<option value='' selected>Pilih Kecamatan</option>";
                    for (let i = 0; i < results.length; i++) {
                        const result = results[i];
                        options += `<option value="${result.id}">${result.nama}</option>`
                    }

                    document.getElementById("kecamatan_id").innerHTML = options;
                });
            }

            function getKelurahanDesa(url) {
                fetch(url).then(response => {
                    if (!response.ok) {
                        throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
                    }

                    return response.json();
                }).then(results => {
                    let options = "<option value='' selected>Pilih Kelurahan/Desa</option>";
                    for (let i = 0; i < results.length; i++) {
                        const result = results[i];
                        options += `<option value="${result.id}">${result.nama}</option>`
                    }

                    document.getElementById("kelurahan_desa_id").innerHTML = options;
                });
            }
            document.getElementById("submit-filter").addEventListener('click', function() {
                getInfoZona();
            });

            var options = {
                colors: ['#ffd56d', '#ca0705'],
                chart: {
                    type: 'donut'
                },
                series: [0],
                labels: ['Suara'],
                legend: {
                    show: true,
                    position: 'bottom',
                },
                tooltip: {
                    custom: function({
                        series,
                        seriesIndex,
                        dataPointIndex,
                        w
                    }) {
                        var data = w.globals.initialSeries[seriesIndex];
                        var formatValue = formatter.format(series[seriesIndex]);
                        return `<div class="p-2" style="background-color:${w.globals.colors[seriesIndex]}">
                            ${formatValue}
                            </div>`;
                    }
                }
            }



            var chart2 = new ApexCharts(document.querySelector("#chart2"), options);
            chart2.render();

            var chart3 = new ApexCharts(document.querySelector("#chart3"), {
                colors: ['#ffd56d', '#ca0705'],
                series: [{
                    name: "DPT TPS",
                    data: [0]
                }, {
                    name: "DPT Sistem",
                    data: [0]
                }],
                labels: [
                    "DPT Tps",
                    "DPT Sistem"
                ],
                chart: {
                    type: 'bar',
                    height: 430
                },
                plotOptions: {
                    bar: {
                        horizontal: true,
                        dataLabels: {
                            position: 'top',
                        },
                    }
                },
                dataLabels: {
                    enabled: true,
                    offsetX: -6,
                    style: {
                        fontSize: '12px',
                        colors: ['#fff']
                    }
                },
                stroke: {
                    show: true,
                    width: 1,
                    colors: ['#fff']
                },
                tooltip: {
                    shared: true,
                    intersect: false,
                    y: {
                        formatter: function(value, {
                            series,
                            seriesIndex,
                            dataPointIndex,
                            w
                        }) {
                            return formatter.format(value);
                        }
                    }
                },
                xaxis: {
                    categories: ["DPT"],
                },
            });
            chart3.render();

            var chart4 = new ApexCharts(document.querySelector("#chart4"), options);
            chart4.render();



            function filterParam() {
                return '?kabupaten_kota_id=' + document.getElementById("kabupaten_kota_id").value + "&kecamatan_id=" + document
                    .getElementById("kecamatan_id").value + "&kelurahan_desa_id=" + document.getElementById("kelurahan_desa_id")
                    .value;
            }


            function tranformDataCalon(results) {
                var datas = {
                    series: [],
                    labels: []
                };

                let calons = [];
                let total_suara_tidak_sah = 0;

                for (let x = 0; x < results.length; x++) {
                    const result = results[x];
                    for (let i = 0; i < result.length; i++) {
                        const item = result[i];
                        if (item.id != undefined) {
                            if (calons[item.id] == undefined) {
                                calons[item.id] = {
                                    "nomor": item.nomor,
                                    "nama_calon": item.nama_calon,
                                    "nama_wakil_calon": item.nama_wakil_calon,
                                    "foto_pasangan": item.foto_pasangan,
                                    "total_suara": item.jumlah_suara
                                }
                            } else {
                                calons[item.id]["total_suara"] += item.jumlah_suara;
                            }
                            const indexOf = datas.labels.indexOf(`${item.nama_calon}/${item.nama_wakil_calon}`);
                            if (indexOf >= 0) {
                                datas.series[indexOf] += item.jumlah_suara;
                            } else {
                                datas.series.push(item.jumlah_suara)
                                datas.labels.push(`${item.nama_calon}/${item.nama_wakil_calon}`)
                            }
                        } else {
                            const indexOf = datas.labels.indexOf(`Suara Tidak Sah`);
                            total_suara_tidak_sah += item.jumlah_suara_tidak_sah;
                            if (indexOf >= 0) {
                                datas.series[indexOf] += item.jumlah_suara_tidak_sah;
                            } else {
                                datas.series.push(item.jumlah_suara_tidak_sah)
                                datas.labels.push(`Suara Tidak Sah`)
                            }

                        }

                    }

                }

                document.getElementById("list-calon").innerHTML = `
                        <div class="rounded-xl bg-white p-6 shadow-sm transition-all hover:shadow-md">
                        <div class="flex flex-col items-center gap-4">
                            <div style="height:150px;width:150px;" class="flex items-center justify-center rounded-lg bg-gray-200">
                                <svg class="h-12 w-12 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                                    <path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
                                        d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
                                </svg>
                            </div>
                            <div class="text-center">
                                <h3 class="font-medium text-gray-900">Suara Tidak Sah</h3>
                                <p class="mt-1 text-2xl font-bold text-blue-600">${formatter.format(total_suara_tidak_sah)}</p>
                            </div>
                        </div>
                    </div>
                    ` + document.getElementById("list-calon").innerHTML;
                calons.reverse();
                calons.forEach(calon => {
                    document.getElementById("list-calon").innerHTML = `
                            <div class="rounded-xl bg-white p-6 shadow-sm transition-all hover:shadow-md">
                        <div class="flex flex-col items-center gap-4">
                            <img src="${calon['foto_pasangan']}"
                                alt="${calon['nama_calon']} / ${calon['nama_wakil_calon']}" style="height:150px;" class="rounded-lg object-cover" />
                            <div class="text-center">
                                <h3 class="font-medium text-gray-900">${calon['nama_calon']} / ${calon['nama_wakil_calon']}</h3>
                                <p class="mt-1 text-2xl font-bold text-blue-600">${formatter.format(calon['total_suara'])}</p>
                            </div>
                        </div>
                    </div>
                        ` + document.getElementById("list-calon").innerHTML;
                });




            }



            function transformDataSuara(results) {
                let totalSuara = 0;
                let jumlahDpt = 0;
                let jumlahDptTps = 0;
                let suaraSah = 0;
                let suaraTidakSah = 0;

                for (let x = 0; x < results.length; x++) {
                    const result = results[x];
                    totalSuara += result.jumlah_suara;
                    jumlahDpt += result.jumlah_dpt;
                    jumlahDptTps += result.jumlah_dpt_tps;
                    suaraSah += result.suara_sah;
                    suaraTidakSah += result.suara_tidak_sah;

                }
                chart2.updateOptions({
                    series: [
                        totalSuara,
                        jumlahDpt
                    ],
                    labels: [
                        "Suara Masuk",
                        "DPT"
                    ]
                });

                chart3.updateOptions({
                    series: [{
                        name: "DPT TPS",
                        data: [jumlahDptTps]
                    }, {
                        name: "DPT Sistem",
                        data: [jumlahDpt]
                    }]
                });

                chart4.updateOptions({
                    series: [
                        suaraSah,
                        suaraTidakSah
                    ],
                    labels: [
                        "Suara Sah",
                        "Suara Tidak Sah"
                    ]
                });
                document.getElementById("suara-masuk").innerHTML = formatter.format(totalSuara)
                document.getElementById("dpt").innerHTML = formatter.format(jumlahDpt)

                document.getElementById("dpt-tps").innerHTML = formatter.format(jumlahDptTps)
                document.getElementById("dpt-sistem").innerHTML = formatter.format(jumlahDpt)

                document.getElementById("suara-sah").innerHTML = formatter.format(suaraSah)
                document.getElementById("suara-tidak-sah").innerHTML = formatter.format(suaraTidakSah)
            }




            const chartPerKabupatenKota = new ApexCharts(document.getElementById('chart-kabupaten-kota'), {
                // colors: ['#1A56DB', '#FDBA8C'],
                series: [],
                chart: {
                    type: 'bar',
                    height: '420px',
                    fontFamily: 'Inter, sans-serif',
                    foreColor: '#4B5563',
                    toolbar: {
                        show: false
                    }
                },
                plotOptions: {
                    bar: {
                        columnWidth: '90%',
                        borderRadius: 3
                    }
                },
                tooltip: {
                    shared: true,
                    intersect: false,
                    style: {
                        fontSize: '14px',
                        fontFamily: 'Inter, sans-serif'
                    },
                    y: {
                        formatter: function(value, {
                            series,
                            seriesIndex,
                            dataPointIndex,
                            w
                        }) {
                            return formatter.format(value);
                        }
                    }
                },
                states: {
                    hover: {
                        filter: {
                            type: 'darken',
                            value: 1
                        }
                    }
                },
                stroke: {
                    show: true,
                    width: 5,
                    colors: ['transparent']
                },
                grid: {
                    show: false
                },
                dataLabels: {
                    enabled: false
                },
                // legend: {
                //     show: false
                // },
                xaxis: {
                    floating: false,
                    labels: {
                        show: true
                    },
                    axisBorder: {
                        show: false
                    },
                    axisTicks: {
                        show: false
                    },
                },
                yaxis: {
                    show: false
                },
                fill: {
                    opacity: 1
                }
            });
            chartPerKabupatenKota.render();


            function transformDataPerKabupatenKota(results) {

                let suaras = [];
                for (let x = 0; x < results.length; x++) {
                    const result = results[x];
                    for (let i = 0; i < result.length; i++) {
                        const item = result[i];

                        if (suaras[item.id] == undefined) {
                            suaras[item.id] = item;
                        } else {
                            suaras[item.id].total_suara += item.total_suara;
                            suaras[item.id].total_suara_tidak_sah += item.total_suara_tidak_sah;

                            for (let x = 0; x < suaras[item.id].calon.length; x++) {
                                const calon = suaras[item.id].calon[x];
                                for (let i = 0; i < item.calon.length; i++) {
                                    const cc = item.calon[i];
                                    if (calon.id == cc.id) {
                                        suaras[item.id].calon[x].total_suara += cc.total_suara;
                                    }

                                }
                            }
                        }

                    }

                }

                var datas = {
                    series: [],
                    labels: []
                };

                for (const [key, value] of Object.entries(suaras)) {
                    for (let i = 0; i < value.calon.length; i++) {
                        const calon = value.calon[i];
                        const seriesIndex = datas.series.findIndex(function(a) {
                            return a.name == calon.nama_calon + " & " + calon.nama_wakil_calon;
                        });
                        if (seriesIndex >= 0) {
                            datas.series[seriesIndex].data.push({
                                x: value.nama,
                                y: calon.total_suara
                            })
                        } else {
                            datas.series.push({
                                "name": calon.nama_calon + " & " + calon.nama_wakil_calon,
                                "data": [{
                                    x: value.nama,
                                    y: calon.total_suara
                                }]
                            })
                        }

                    }

                    const seriesIndex = datas.series.findIndex(function(a) {
                        return a.name == "Suara Tidak Sah";
                    });
                    if (seriesIndex >= 0) {
                        datas.series[seriesIndex].data.push({
                            x: value.nama,
                            y: value.total_suara_tidak_sah
                        })
                    } else {
                        datas.series.push({
                            "name": "Suara Tidak Sah",
                            "data": [{
                                x: value.nama,
                                y: value.total_suara_tidak_sah
                            }]
                        })
                    }
                }

                chartPerKabupatenKota.updateOptions({
                    series: datas.series
                });


            }




            const chartTpsPerKabupatenKota = new ApexCharts(document.getElementById('chart-tps-kabupaten-kota'), {
                // colors: ['#1A56DB', '#FDBA8C'],
                series: [],
                chart: {
                    type: 'bar',
                    height: '420px',
                    fontFamily: 'Inter, sans-serif',
                    foreColor: '#29cc7d',
                    toolbar: {
                        show: false
                    }
                },
                plotOptions: {
                    bar: {
                        columnWidth: '90%',
                        borderRadius: 3
                    }
                },
                tooltip: {
                    shared: true,
                    intersect: false,
                    style: {
                        fontSize: '14px',
                        fontFamily: 'Inter, sans-serif'
                    },
                    y: {
                        formatter: function(value, {
                            series,
                            seriesIndex,
                            dataPointIndex,
                            w
                        }) {
                            return formatter.format(value);
                        }
                    }
                },
                states: {
                    hover: {
                        filter: {
                            type: 'darken',
                            value: 1
                        }
                    }
                },
                stroke: {
                    show: true,
                    width: 5,
                    colors: ['transparent']
                },
                grid: {
                    show: false
                },
                dataLabels: {
                    enabled: false
                },
                // legend: {
                //     show: false
                // },
                xaxis: {
                    floating: false,
                    labels: {
                        show: true
                    },
                    axisBorder: {
                        show: false
                    },
                    axisTicks: {
                        show: false
                    },
                },
                yaxis: {
                    show: false
                },
                fill: {
                    opacity: 1
                }
            });
            chartTpsPerKabupatenKota.render();


            function transformDataTpsPerKabupatenKota(results) {
                var datas = {
                    series: [{
                        "name": "TPS",
                        "data": []
                    }],
                    labels: []
                };
                let total = 0;
                for (let index = 0; index < results.length; index++) {
                    const element = results[index];
                    for (let x = 0; x < element.length; x++) {
                        const result = element[x];
                        datas.series[0].data.push({
                            x: result.nama,
                            y: result.jumlah_tps
                        });
                        total += result.jumlah_tps;

                    }

                }
                chartTpsPerKabupatenKota.updateOptions({
                    series: datas.series
                });


                if (total > 0) {
                    document.getElementById("jumlah-tps-per-kabupaten-kota").innerHTML = formatter.format(total);
                }

            }



            const chartDptPerKabupatenKota = new ApexCharts(document.getElementById('chart-dpt-kabupaten-kota'), {
                // colors: ['#1A56DB', '#FDBA8C'],
                series: [],
                chart: {
                    type: 'bar',
                    height: '420px',
                    fontFamily: 'Inter, sans-serif',
                    foreColor: '#29cc7d',
                    toolbar: {
                        show: false
                    }
                },
                plotOptions: {
                    bar: {
                        columnWidth: '90%',
                        borderRadius: 3
                    }
                },
                tooltip: {
                    shared: true,
                    intersect: false,
                    style: {
                        fontSize: '14px',
                        fontFamily: 'Inter, sans-serif'
                    },
                    y: {
                        formatter: function(value, {
                            series,
                            seriesIndex,
                            dataPointIndex,
                            w
                        }) {
                            return formatter.format(value);
                        }
                    }
                },
                states: {
                    hover: {
                        filter: {
                            type: 'darken',
                            value: 1
                        }
                    }
                },
                stroke: {
                    show: true,
                    width: 5,
                    colors: ['transparent']
                },
                grid: {
                    show: false
                },
                dataLabels: {
                    enabled: false
                },
                // legend: {
                //     show: false
                // },
                xaxis: {
                    floating: false,
                    labels: {
                        show: true
                    },
                    axisBorder: {
                        show: false
                    },
                    axisTicks: {
                        show: false
                    },
                },
                yaxis: {
                    show: false
                },
                fill: {
                    opacity: 1
                }
            });
            chartDptPerKabupatenKota.render();


            function transformDataDptPerKabupatenKota(results) {
                var datas = {
                    series: [{
                        "name": "DPT",
                        "data": []
                    }],
                    labels: []
                };
                let total = 0;
                for (let index = 0; index < results.length; index++) {
                    const element = results[index];
                    for (let x = 0; x < element.length; x++) {
                        const result = element[x];
                        datas.series[0].data.push({
                            x: result.nama,
                            y: result.jumlah_dpt
                        })
                        total += result.jumlah_dpt;

                    }

                }
                chartDptPerKabupatenKota.updateOptions({
                    series: datas.series
                });

                if (total > 0) {
                    document.getElementById("jumlah-dpt-per-kabupaten-kota").innerHTML = formatter.format(total);
                }

            }

            getInfoZona();

            function getInfoZona() {
                const loadings = document.querySelectorAll('.loading');
                loadings.forEach((loading) => {
                    loading.classList.remove('hidden');
                });
                const serversElm = document.querySelectorAll('.servers');


                const urls = @json(Helper::urlServers('/api/info'));

                Promise.allSettled(urls.map(url => fetch(url + filterParam())
                        .then(response => {
                            if (!response.ok) {
                                throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
                            }
                            return response.json(); // assuming the response is JSON
                        })
                    ))
                    .then(results => {
                        console.log(results);
                        const successfulResults = results
                            .filter(result => result.status === 'fulfilled') // only keep successful fetches
                            .map(result => result.value); // extract the value (response data)

                        const failedResults = results
                            .filter(result => result.status === 'rejected') // only keep failed fetches
                            .map(result => result.reason); // extract the error reason

                        //hide all .loading

                        loadings.forEach((loading) => {
                            loading.classList.add('hidden');
                        });

                        for (let index = 0; index < urls.length; index++) {
                            const url = urls[index];
                            const {
                                hostname
                            } = new URL(url);
                            const sub = hostname.split('.')[0];
                            const elm = document.getElementById('server-' + sub);

                            if (results[index].status == "fulfilled") {
                                elm.querySelector(".status").classList.remove("bg-yellow-500");
                                elm.querySelector(".status").classList.add("bg-green-500");

                                const result = results[index].value;

                                const options = {
                                    series: [0, 0],
                                    labels: ['Used', 'Free'],
                                    colors: ['#ca0705', '#1A56DB'],
                                    chart: {
                                        type: 'donut',
                                        height: 400,
                                        fontFamily: 'Inter, sans-serif',
                                        toolbar: {
                                            show: false
                                        },
                                    },
                                    responsive: [{
                                        breakpoint: 430,
                                        options: {
                                            chart: {
                                                height: 300
                                            }
                                        }
                                    }],

                                    states: {
                                        hover: {
                                            filter: {
                                                type: 'darken',
                                                value: 0.9
                                            }
                                        }
                                    },
                                    tooltip: {
                                        shared: true,
                                        followCursor: false,
                                        fillSeriesColor: false,
                                        inverseOrder: true,
                                        style: {
                                            fontSize: '14px',
                                            fontFamily: 'Inter, sans-serif'
                                        },
                                        x: {
                                            show: true,
                                            formatter: function(_, {
                                                seriesIndex,
                                                w
                                            }) {
                                                const label = w.config.labels[seriesIndex];
                                                return label
                                            }
                                        },
                                        y: {
                                            formatter: function(value) {
                                                return parseFloat(value).toFixed(2);
                                            }
                                        }
                                    },
                                    grid: {
                                        show: false
                                    },

                                    legend: {
                                        show: false
                                    },

                                };

                                const chart = new ApexCharts(elm.querySelector(".chart-storage"), options);
                                chart.render();

                                chart.updateOptions({
                                    series: [
                                        result.storage_usage.used,
                                        result.storage_usage.free
                                    ],
                                });

                                const chart2 = new ApexCharts(elm.querySelector(".chart-memory"), options);
                                chart2.render();

                                chart2.updateOptions({
                                    series: [
                                        result.memory_usage.used / 1024 / 1024 / 1024,
                                        result.memory_usage.free / 1024 / 1024 / 1024
                                    ],
                                });

                                const chart3 = new ApexCharts(elm.querySelector(".chart-cpu"), options);
                                chart3.render();

                                chart3.updateOptions({
                                    series: [
                                        result.cpu_usage,
                                        100 - result.cpu_usage
                                    ]
                                });
                            } else {
                                elm.querySelector(".status").classList.remove("bg-yellow-500");
                                elm.querySelector(".status").classList.add("bg-red-700");
                            }



                        }

                        console.log(successfulResults);

                        totalSaksiElm.innerHTML = formatter.format(successfulResults.map(r => r.jumlah_saksi).reduce(
                            function(a, b) {
                                return a + b;
                            }, 0));
                        totalDptElm.innerHTML = formatter.format(successfulResults.map(r => r.jumlah_dpt).reduce(function(a,
                            b) {
                            return a + b;
                        }, 0));
                        totalTpsElm.innerHTML = formatter.format(successfulResults.map(r => r.jumlah_tps).reduce(function(a,
                            b) {
                            return a + b;
                        }, 0));
                        totalSuaraKonfirmasiElm.innerHTML = formatter.format(successfulResults.map(r => r.jumlah_suara)
                            .reduce(function(a, b) {
                                return a + b;
                            }, 0));

                        tranformDataCalon(successfulResults.map(r => r.suara_calon));
                        transformDataPerKabupatenKota(successfulResults.map(r => r.suara_kabupaten_kota));
                        transformDataTpsPerKabupatenKota(successfulResults.map(r => r.tps_kabupaten_kota));
                        transformDataDptPerKabupatenKota(successfulResults.map(r => r.dpt_kabupaten_kota))
                        transformDataSuara(successfulResults);


                    });




            }
        </script>
    </x-slot:scripts>
</x-layout>

Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]