cityssm/lottery-licence-manager

View on GitHub
public-typescript/licence-search.js

Summary

Maintainability
D
2 days
Test Coverage
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
(() => {
    const urlPrefix = document.querySelector("main").dataset.urlPrefix;
    const licenceType_keyToName = new Map();
    const formElement = document.querySelector("#form--filters");
    const limitElement = document.querySelector("#filter--limit");
    const offsetElement = document.querySelector("#filter--offset");
    const searchResultsElement = document.querySelector("#container--searchResults");
    const externalLicenceNumberLabel = searchResultsElement.getAttribute("data-external-licence-number-label");
    const doLicenceSearchFunction = () => {
        const currentLimit = Number.parseInt(limitElement.value, 10);
        const currentOffset = Number.parseInt(offsetElement.value, 10);
        searchResultsElement.innerHTML = "<p class=\"has-text-centered has-text-grey-lighter\">" +
            "<i class=\"fas fa-3x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
            "<em>Loading licences...</em>" +
            "</p>";
        cityssm.postJSON(urlPrefix + "/licences/doSearch", formElement, (licenceResults) => {
            const licenceList = licenceResults.licences;
            if (licenceList.length === 0) {
                searchResultsElement.innerHTML = "<div class=\"message is-info\">" +
                    "<div class=\"message-body\">" +
                    "<strong>Your search returned no results.</strong><br />" +
                    "Please try expanding your search criteria." +
                    "</div>" +
                    "</div>";
                return;
            }
            searchResultsElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable has-sticky-header\">" +
                "<thead><tr>" +
                "<th>" + cityssm.escapeHTML(externalLicenceNumberLabel) + "</th>" +
                "<th>Licence</th>" +
                "<th>Organization Name</th>" +
                "<th>Location</th>" +
                "<th>Active Date Range</th>" +
                "<th class=\"is-hidden-print\"><span class=\"sr-only\">Options</span></th>" +
                "</tr></thead>" +
                "<tbody></tbody>" +
                "</table>";
            const tbodyElement = searchResultsElement.querySelector("tbody");
            for (const licenceObject of licenceList) {
                const licenceType = licenceType_keyToName.get(licenceObject.licenceTypeKey);
                const trElement = document.createElement("tr");
                let locationHTML = "";
                locationHTML = licenceObject.locationID
                    ? ("<a data-tooltip=\"View Location\" href=\"" + cityssm.escapeHTML(urlPrefix) + "/locations/" + licenceObject.locationID.toString() + "\">" +
                        cityssm.escapeHTML(licenceObject.locationDisplayName) +
                        "</a>" +
                        (licenceObject.locationDisplayName === licenceObject.locationAddress1
                            ? ""
                            : `<br /> <small>${cityssm.escapeHTML(licenceObject.locationAddress1)} </small>`))
                    : "<span class=\"has-text-grey\">(No Location Set)</span>";
                trElement.innerHTML =
                    ("<td>" +
                        "<a data-tooltip=\"View Licence\" href=\"" + cityssm.escapeHTML(urlPrefix) + "/licences/" + licenceObject.licenceID.toString() + "\">" +
                        cityssm.escapeHTML(licenceObject.externalLicenceNumber) + "<br />" +
                        "<small>Licence #" + licenceObject.licenceID.toString() + "</small>" +
                        "</a>" +
                        "</td>") +
                        ("<td>" + cityssm.escapeHTML(licenceType || licenceObject.licenceTypeKey) + "<br />" +
                            "<small>" + cityssm.escapeHTML(licenceObject.licenceDetails) + "</small>" +
                            "</td>") +
                        ("<td>" +
                            "<a data-tooltip=\"View Organization\"" +
                            " href=\"" + cityssm.escapeHTML(urlPrefix) + "/organizations/" + licenceObject.organizationID.toString() + "\">" +
                            cityssm.escapeHTML(licenceObject.organizationName) +
                            "</a>" +
                            "</td>") +
                        ("<td>" + locationHTML + "</td>") +
                        ("<td class=\"is-nowrap\">" +
                            "<span class=\"has-cursor-default has-tooltip-right\" data-tooltip=\"Start Date\">" +
                            "<i class=\"fas fa-fw fa-play\" aria-hidden=\"true\"></i> " + licenceObject.startDateString +
                            "</span><br />" +
                            "<span class=\"has-cursor-default has-tooltip-right\" data-tooltip=\"End Date\">" +
                            "<i class=\"fas fa-fw fa-stop\" aria-hidden=\"true\"></i> " + licenceObject.endDateString +
                            "</span>" +
                            "</td>") +
                        "<td class=\"has-text-right is-nowrap is-hidden-print\">" +
                        (licenceObject.canUpdate
                            ? "<a class=\"button is-small\" data-tooltip=\"Edit Licence\"" +
                                " href=\"" + cityssm.escapeHTML(urlPrefix) + "/licences/" + licenceObject.licenceID.toString() + "/edit\">" +
                                "<span class=\"icon\"><i class=\"fas fa-pencil-alt\" aria-hidden=\"true\"></i></span>" +
                                "<span>Edit</span>" +
                                "</a> "
                            : "") +
                        (licenceObject.issueDate
                            ? "<a class=\"button is-small\" data-tooltip=\"Print Licence\"" +
                                " href=\"" + cityssm.escapeHTML(urlPrefix) + "/licences/" + licenceObject.licenceID.toString() + "/print\" download>" +
                                "<i class=\"fas fa-print\" aria-hidden=\"true\"></i>" +
                                "<span class=\"sr-only\">Print</span>" +
                                "</a>"
                            : "<span class=\"tag is-warning\">Not Issued</span>") +
                        "</div>" +
                        "</td>";
                tbodyElement.append(trElement);
            }
            searchResultsElement.insertAdjacentHTML("beforeend", "<div class=\"level is-block-print\">" +
                "<div class=\"level-left has-text-weight-bold\">" +
                "Displaying licences " +
                (currentOffset + 1).toString() +
                " to " +
                Math.min(currentLimit + currentOffset, licenceResults.count).toString() +
                " of " +
                licenceResults.count.toString() +
                "</div>" +
                "</div>");
            if (currentLimit < licenceResults.count) {
                const paginationElement = document.createElement("nav");
                paginationElement.className = "level-right is-hidden-print";
                paginationElement.setAttribute("role", "pagination");
                paginationElement.setAttribute("aria-label", "pagination");
                if (currentOffset > 0) {
                    const previousElement = document.createElement("a");
                    previousElement.className = "button";
                    previousElement.textContent = "Previous";
                    previousElement.addEventListener("click", (clickEvent) => {
                        clickEvent.preventDefault();
                        offsetElement.value = Math.max(0, currentOffset - currentLimit).toString();
                        doLicenceSearchFunction();
                    });
                    paginationElement.append(previousElement);
                }
                if (currentLimit + currentOffset < licenceResults.count) {
                    const nextElement = document.createElement("a");
                    nextElement.className = "button ml-3";
                    nextElement.innerHTML =
                        "<span>Next Licences</span>" +
                            "<span class=\"icon\"><i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i></span>";
                    nextElement.addEventListener("click", (clickEvent) => {
                        clickEvent.preventDefault();
                        offsetElement.value = (currentOffset + currentLimit).toString();
                        doLicenceSearchFunction();
                    });
                    paginationElement.append(nextElement);
                }
                searchResultsElement.querySelector(".level").append(paginationElement);
            }
        });
    };
    const resetOffsetAndDoLicenceSearchFunction = () => {
        offsetElement.value = "0";
        doLicenceSearchFunction();
    };
    const licenceTypeOptionElements = document.querySelectorAll("#filter--licenceTypeKey option");
    for (let optionIndex = 1; optionIndex < licenceTypeOptionElements.length; optionIndex += 1) {
        const optionElement = licenceTypeOptionElements[optionIndex];
        licenceType_keyToName.set(optionElement.value, optionElement.textContent);
    }
    formElement.addEventListener("submit", (formEvent) => {
        formEvent.preventDefault();
    });
    const inputElements = formElement.querySelectorAll(".input, .select select");
    for (const inputElement of inputElements) {
        inputElement.addEventListener("change", resetOffsetAndDoLicenceSearchFunction);
    }
    resetOffsetAndDoLicenceSearchFunction();
})();