OneCompiler

Final_V4

105
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dynamic Hierarchical Filtering with Gender, Ethnicity, and Age</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .container {
            margin-bottom: 20px;
        }
        .hidden {
            display: none;
        }
    </style>
</head>
<body>
    <h1>Dynamic Hierarchical Filtering with Gender, Ethnicity, and Age</h1>

    <form id="filterForm">
        <!-- Gender Selection -->
        <div class="container">
            <h2>Gender</h2>
            <label>
                <input type="radio" name="gender" value="Male" onchange="updateGender()" checked> Male
            </label><br>
            <label>
                <input type="radio" name="gender" value="Female" onchange="updateGender()"> Female
            </label><br>
        </div>

        <!-- Ethnicity Selection -->
        <div class="container">
            <h2>Ethnicity</h2>
            <div id="ethnicityContainer"></div>  <!-- Ethnicity options will appear dynamically -->
        </div>

        <!-- Main Ranges -->
        <div class="container">
            <h2>Main Ranges</h2>
            <label>
                <input type="checkbox" class="main-range" data-group="0-4" onchange="updateSubRanges()"> 0 - 4
            </label><br>
            <label>
                <input type="checkbox" class="main-range" data-group="5-30" onchange="updateSubRanges()"> 5 - 30
            </label><br>
            <label>
                <input type="checkbox" class="main-range" data-group="31-60" onchange="updateSubRanges()"> 31 - 60
            </label><br>
            <label>
                <input type="checkbox" class="main-range" data-group="61-120" onchange="updateSubRanges()"> 61 - 120
            </label><br>
        </div>

        <!-- Sub Ranges -->
        <div class="container">
            <h2>Sub Ranges</h2>
            <div id="subRangesContainer"></div> <!-- Subranges will appear dynamically -->
        </div>

        <!-- Years -->
        <div class="container">
            <h2>Years</h2>
            <div id="yearsContainer"></div> <!-- Years will appear dynamically -->
        </div>

        <button type="button" onclick="handleSubmit()">Submit</button>
    </form>

    <h2>Selected Filters</h2>
    <div id="selectedFilters"></div>

    <script>
        // Subrange data including ethnicity
        const subRangesData = {
            "Total people": [
                { range: "European" },
                { range: "Maori" },
                { range: "Pacific Peoples" },
                { range: "Asian" },
                { range: "Middle Eastern/Latin American/African" },
                { range: "Other ethnicity", years: ["New Zealander", "Other ethnicity nec"] },
                { range: "Total people stated" },
                { range: "Not elsewhere included" }
            ]
        };

        // Current gender selection
        let selectedGender = "Male";
        let selectedEthnicities = [];

        // Update gender selection
        function updateGender() {
            const genderRadioButtons = document.querySelectorAll('input[name="gender"]');
            genderRadioButtons.forEach((radio) => {
                if (radio.checked) {
                    selectedGender = radio.value;
                }
            });
        }

        // Dynamically update ethnicity
        function updateEthnicity() {
            const ethnicityContainer = document.getElementById("ethnicityContainer");
            ethnicityContainer.innerHTML = "";

            const ethnicityData = subRangesData["Total people"];
            ethnicityData.forEach(({ range, years }) => {
                const ethnicityDiv = document.createElement("div");
                if (years) {
                    // If years are specified, display a multi-selection checkbox
                    const yearCheckboxes = years.map(year => {
                        return `<label>
                                    <input type="checkbox" class="ethnicity-year" data-range="${range}" data-year="${year}" onchange="updateSelectedEthnicity()"> ${year}
                                 </label><br>`;
                    }).join("");
                    ethnicityDiv.innerHTML = `
                        <label>
                            <input type="checkbox" class="ethnicity-group" data-group="${range}" onchange="updateSelectedEthnicity()"> ${range}
                        </label><br>
                        ${yearCheckboxes}
                    `;
                } else {
                    // If no years, just display the ethnicity as a checkbox
                    ethnicityDiv.innerHTML = `
                        <label>
                            <input type="checkbox" class="ethnicity-group" data-group="${range}" onchange="updateSelectedEthnicity()"> ${range}
                        </label><br>
                    `;
                }
                ethnicityContainer.appendChild(ethnicityDiv);
            });
        }

        // Update ethnicity selection
        function updateSelectedEthnicity() {
            const selectedEthnicityGroups = document.querySelectorAll(".ethnicity-group:checked");
            const selectedYears = document.querySelectorAll(".ethnicity-year:checked");

            selectedEthnicities = [];
            selectedEthnicityGroups.forEach((group) => {
                selectedEthnicities.push(group.dataset.group);
            });

            // Include selected years in ethnicity groups
            selectedYears.forEach((year) => {
                const group = year.dataset.range;
                if (!selectedEthnicities.includes(group)) {
                    selectedEthnicities.push(group);
                }
            });

            console.log("Selected Ethnicities: ", selectedEthnicities);  // For debugging
        }

        // Dynamically update subranges
        function updateSubRanges() {
            const subRangesContainer = document.getElementById("subRangesContainer");
            const yearsContainer = document.getElementById("yearsContainer");
            subRangesContainer.innerHTML = "";
            yearsContainer.innerHTML = "";

            const selectedMainRanges = document.querySelectorAll(".main-range:checked");
            selectedMainRanges.forEach((mainRange) => {
                const group = mainRange.dataset.group;
                const subRanges = subRangesData[group];

                if (subRanges && subRanges.length > 0) {
                    subRanges.forEach(({ range }) => {
                        const subRangeDiv = document.createElement("div");
                        subRangeDiv.innerHTML = `
                            <label>
                                <input type="checkbox" class="sub-range" data-group="${range}" data-parent="${group}" onchange="updateYears()"> ${range}
                            </label>
                        `;
                        subRangesContainer.appendChild(subRangeDiv);
                    });
                }
            });
        }

        // Dynamically update years
        function updateYears() {
            const yearsContainer = document.getElementById("yearsContainer");
            yearsContainer.innerHTML = "";

            const selectedSubRanges = document.querySelectorAll(".sub-range:checked");
            selectedSubRanges.forEach((subRange) => {
                const group = subRange.dataset.group;
                const parent = subRange.dataset.parent;
                const subRanges = subRangesData[parent];

                if (subRanges) {
                    const matchingSubRange = subRanges.find((sub) => sub.range === group);
                    if (matchingSubRange && matchingSubRange.years) {
                        matchingSubRange.years.forEach((year) => {
                            const yearDiv = document.createElement("div");
                            yearDiv.innerHTML = `
                                <label>
                                    <input type="checkbox" class="year" data-group="${year}" data-parent="${group}"> ${year}
                                </label>
                            `;
                            yearsContainer.appendChild(yearDiv);
                        });
                    }
                }
            });
        }

        // Handle form submission
        function handleSubmit() {
            const selectedFilters = [`Gender: ${selectedGender}`];

            // Add selected ethnicities
            selectedFilters.push(`Ethnicities: ${selectedEthnicities.join(", ")}`);

            const years = document.querySelectorAll(".year:checked");
            const subRanges = document.querySelectorAll(".sub-range:checked");
            const mainRanges = document.querySelectorAll(".main-range:checked");

            // Add selected years
            years.forEach((year) => {
                selectedFilters.push(`Year: ${year.dataset.group}`);
            });

            // Add subranges without selected years
            subRanges.forEach((subRange) => {
                const group = subRange.dataset.group;
                const selectedYears = document.querySelectorAll(`.year[data-parent="${group}"]:checked`);
                if (selectedYears.length === 0) {
                    selectedFilters.push(`Subrange: ${group}`);
                }
            });

            // Add main ranges without selected subranges or years
            mainRanges.forEach((mainRange) => {
                const group = mainRange.dataset.group;
                const selectedSubRanges = document.querySelectorAll(`.sub-range[data-parent="${group}"]:checked`);
                const selectedYears = document.querySelectorAll(`.year[data-parent^="${group}"]:checked`);
                if (selectedSubRanges.length === 0 && selectedYears.length === 0) {
                    selectedFilters.push(`Main Range: ${group}`);
                }
            });

            // Display selected filters
            const selectedDiv = document.getElementById("selectedFilters");
            selectedDiv.innerHTML = selectedFilters.length > 0
                ? `Selected: ${selectedFilters.join(", ")}`
                : "No filters selected.";
        }

        // Initialize the ethnicity options
        updateEthnicity();
    </script>
</body>
</html>