chore(webui): split weapons by category #820
@ -17,25 +17,28 @@ interface ListedItem {
 | 
			
		||||
    fusionLimit?: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const getItemListsController: RequestHandler = (req, res) => {
 | 
			
		||||
const getItemListsController: RequestHandler = (req, response) => {
 | 
			
		||||
    const lang = getDict(typeof req.query.lang == "string" ? req.query.lang : "en");
 | 
			
		||||
    const weapons = [];
 | 
			
		||||
    const miscitems = [];
 | 
			
		||||
    const res: Record<string, ListedItem[]> = {};
 | 
			
		||||
    res.LongGuns = [];
 | 
			
		||||
    res.Pistols = [];
 | 
			
		||||
    res.Melee = [];
 | 
			
		||||
    res.miscitems = [];
 | 
			
		||||
    for (const [uniqueName, item] of Object.entries(ExportWeapons)) {
 | 
			
		||||
        if (item.productCategory !== "OperatorAmps") {
 | 
			
		||||
        if (item.totalDamage !== 0) {
 | 
			
		||||
                weapons.push({
 | 
			
		||||
            if (item.productCategory == "LongGuns" || item.productCategory == "Pistols" || item.productCategory == "Melee") {
 | 
			
		||||
                res[item.productCategory].push({
 | 
			
		||||
                    uniqueName,
 | 
			
		||||
                    name: getString(item.name, lang)
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        } else if (!item.excludeFromCodex) {
 | 
			
		||||
                miscitems.push({
 | 
			
		||||
            res.miscitems.push({
 | 
			
		||||
                uniqueName: "MiscItems:" + uniqueName,
 | 
			
		||||
                name: getString(item.name, lang)
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
    for (const [uniqueName, item] of Object.entries(ExportResources)) {
 | 
			
		||||
        let name = getString(item.name, lang);
 | 
			
		||||
        if ("dissectionParts" in item) {
 | 
			
		||||
@ -48,13 +51,13 @@ const getItemListsController: RequestHandler = (req, res) => {
 | 
			
		||||
                name = name.split("|FISH_SIZE|").join(getString("/Lotus/Language/Fish/FishSizeSmallAbbrev", lang));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        miscitems.push({
 | 
			
		||||
        res.miscitems.push({
 | 
			
		||||
            uniqueName: item.productCategory + ":" + uniqueName,
 | 
			
		||||
            name: name
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    for (const [uniqueName, item] of Object.entries(ExportGear)) {
 | 
			
		||||
        miscitems.push({
 | 
			
		||||
        res.miscitems.push({
 | 
			
		||||
            uniqueName: "Consumables:" + uniqueName,
 | 
			
		||||
            name: getString(item.name, lang)
 | 
			
		||||
        });
 | 
			
		||||
@ -64,7 +67,7 @@ const getItemListsController: RequestHandler = (req, res) => {
 | 
			
		||||
        if (!item.hidden) {
 | 
			
		||||
            const resultName = getItemName(item.resultType);
 | 
			
		||||
            if (resultName) {
 | 
			
		||||
                miscitems.push({
 | 
			
		||||
                res.miscitems.push({
 | 
			
		||||
                    uniqueName: "Recipes:" + uniqueName,
 | 
			
		||||
                    name: recipeNameTemplate.replace("|ITEM|", getString(resultName, lang))
 | 
			
		||||
                });
 | 
			
		||||
@ -72,10 +75,10 @@ const getItemListsController: RequestHandler = (req, res) => {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const mods: ListedItem[] = [];
 | 
			
		||||
    res.mods = [];
 | 
			
		||||
    const badItems: Record<string, boolean> = {};
 | 
			
		||||
    for (const [uniqueName, upgrade] of Object.entries(ExportUpgrades)) {
 | 
			
		||||
        mods.push({
 | 
			
		||||
        res.mods.push({
 | 
			
		||||
            uniqueName,
 | 
			
		||||
            name: getString(upgrade.name, lang),
 | 
			
		||||
            fusionLimit: upgrade.fusionLimit
 | 
			
		||||
@ -85,7 +88,7 @@ const getItemListsController: RequestHandler = (req, res) => {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    for (const [uniqueName, arcane] of Object.entries(ExportArcanes)) {
 | 
			
		||||
        mods.push({
 | 
			
		||||
        res.mods.push({
 | 
			
		||||
            uniqueName,
 | 
			
		||||
            name: getString(arcane.name, lang)
 | 
			
		||||
        });
 | 
			
		||||
@ -94,7 +97,7 @@ const getItemListsController: RequestHandler = (req, res) => {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    res.json({
 | 
			
		||||
    response.json({
 | 
			
		||||
        warframes: Object.entries(ExportWarframes)
 | 
			
		||||
            .filter(([_uniqueName, warframe]) => warframe.productCategory == "Suits")
 | 
			
		||||
            .map(([uniqueName, warframe]) => {
 | 
			
		||||
@ -104,11 +107,9 @@ const getItemListsController: RequestHandler = (req, res) => {
 | 
			
		||||
                    exalted: warframe.exalted
 | 
			
		||||
                };
 | 
			
		||||
            }),
 | 
			
		||||
        weapons,
 | 
			
		||||
        miscitems,
 | 
			
		||||
        mods,
 | 
			
		||||
        badItems,
 | 
			
		||||
        archonCrystalUpgrades
 | 
			
		||||
        archonCrystalUpgrades,
 | 
			
		||||
        ...res
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -96,7 +96,7 @@
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="row g-3">
 | 
			
		||||
                    <div class="col-lg-6">
 | 
			
		||||
                        <div class="card mb-3" style="height: 480px;">
 | 
			
		||||
                        <div class="card mb-3" style="height: 400px;">
 | 
			
		||||
                            <h5 class="card-header">Warframes</h5>
 | 
			
		||||
                            <div class="card-body overflow-auto">
 | 
			
		||||
                                <form class="input-group mb-3" onsubmit="doAcquireWarframe();return false;">
 | 
			
		||||
@ -110,15 +110,45 @@
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="col-lg-6">
 | 
			
		||||
                        <div class="card mb-3" style="height: 480px;">
 | 
			
		||||
                            <h5 class="card-header">Weapons</h5>
 | 
			
		||||
                        <div class="card mb-3" style="height: 400px;">
 | 
			
		||||
                            <h5 class="card-header">Primary Weapons</h5>
 | 
			
		||||
                            <div class="card-body overflow-auto">
 | 
			
		||||
                                <form class="input-group mb-3" onsubmit="doAcquireWeapon();return false;">
 | 
			
		||||
                                    <input class="form-control" id="weapon-to-acquire" list="datalist-weapons" />
 | 
			
		||||
                                <form class="input-group mb-3" onsubmit="doAcquireWeapon('LongGuns');return false;">
 | 
			
		||||
                                    <input class="form-control" id="acquire-type-LongGuns" list="datalist-LongGuns" />
 | 
			
		||||
                                    <button class="btn btn-primary" type="submit">Add</button>
 | 
			
		||||
                                </form>
 | 
			
		||||
                                <table class="table table-hover w-100">
 | 
			
		||||
                                    <tbody id="weapon-list"></tbody>
 | 
			
		||||
                                    <tbody id="LongGuns-list"></tbody>
 | 
			
		||||
                                </table>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="row g-3">
 | 
			
		||||
                    <div class="col-lg-6">
 | 
			
		||||
                        <div class="card mb-3" style="height: 400px;">
 | 
			
		||||
                            <h5 class="card-header">Secondary Weapons</h5>
 | 
			
		||||
                            <div class="card-body overflow-auto">
 | 
			
		||||
                                <form class="input-group mb-3" onsubmit="doAcquireWeapon('Pistols');return false;">
 | 
			
		||||
                                    <input class="form-control" id="acquire-type-Pistols" list="datalist-Pistols" />
 | 
			
		||||
                                    <button class="btn btn-primary" type="submit">Add</button>
 | 
			
		||||
                                </form>
 | 
			
		||||
                                <table class="table table-hover w-100">
 | 
			
		||||
                                    <tbody id="Pistols-list"></tbody>
 | 
			
		||||
                                </table>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="col-lg-6">
 | 
			
		||||
                        <div class="card mb-3" style="height: 400px;">
 | 
			
		||||
                            <h5 class="card-header">Melee Weapons</h5>
 | 
			
		||||
                            <div class="card-body overflow-auto">
 | 
			
		||||
                                <form class="input-group mb-3" onsubmit="doAcquireWeapon('Melee');return false;">
 | 
			
		||||
                                    <input class="form-control" id="acquire-type-Melee" list="datalist-Melee" />
 | 
			
		||||
                                    <button class="btn btn-primary" type="submit">Add</button>
 | 
			
		||||
                                </form>
 | 
			
		||||
                                <table class="table table-hover w-100">
 | 
			
		||||
                                    <tbody id="Melee-list"></tbody>
 | 
			
		||||
                                </table>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
@ -355,7 +385,9 @@
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <datalist id="datalist-warframes"></datalist>
 | 
			
		||||
    <datalist id="datalist-weapons"></datalist>
 | 
			
		||||
    <datalist id="datalist-LongGuns"></datalist>
 | 
			
		||||
    <datalist id="datalist-Pistols"></datalist>
 | 
			
		||||
    <datalist id="datalist-Melee"></datalist>
 | 
			
		||||
    <datalist id="datalist-miscitems"></datalist>
 | 
			
		||||
    <datalist id="datalist-mods">
 | 
			
		||||
        <option data-key="/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser" value="Legendary Core"></option>
 | 
			
		||||
 | 
			
		||||
@ -265,8 +265,8 @@ function updateInventory() {
 | 
			
		||||
                }
 | 
			
		||||
                document.getElementById("warframe-list").appendChild(tr);
 | 
			
		||||
            });
 | 
			
		||||
            document.getElementById("weapon-list").innerHTML = "";
 | 
			
		||||
            ["LongGuns", "Pistols", "Melee"].forEach(category => {
 | 
			
		||||
                document.getElementById(category + "-list").innerHTML = "";
 | 
			
		||||
                data[category].forEach(item => {
 | 
			
		||||
                    const tr = document.createElement("tr");
 | 
			
		||||
                    tr.setAttribute("data-item-type", item.ItemType);
 | 
			
		||||
@ -319,7 +319,7 @@ function updateInventory() {
 | 
			
		||||
                        }
 | 
			
		||||
                        tr.appendChild(td);
 | 
			
		||||
                    }
 | 
			
		||||
                    document.getElementById("weapon-list").appendChild(tr);
 | 
			
		||||
                    document.getElementById(category + "-list").appendChild(tr);
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
@ -546,14 +546,14 @@ function doAcquireWarframe() {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$("#warframe-to-acquire").on("input", () => {
 | 
			
		||||
    $("#warframe-to-acquire").removeClass("is-invalid");
 | 
			
		||||
$("input[list]").on("input", function () {
 | 
			
		||||
    $(this).removeClass("is-invalid");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function doAcquireWeapon() {
 | 
			
		||||
    const uniqueName = getKey(document.getElementById("weapon-to-acquire"));
 | 
			
		||||
function doAcquireWeapon(category) {
 | 
			
		||||
    const uniqueName = getKey(document.getElementById("acquire-type-" + category));
 | 
			
		||||
    if (!uniqueName) {
 | 
			
		||||
        $("#weapon-to-acquire").addClass("is-invalid").focus();
 | 
			
		||||
        $("#acquire-type-" + category).addClass("is-invalid").focus();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    revalidateAuthz(() => {
 | 
			
		||||
@ -568,16 +568,12 @@ function doAcquireWeapon() {
 | 
			
		||||
            ])
 | 
			
		||||
        });
 | 
			
		||||
        req.done(() => {
 | 
			
		||||
            document.getElementById("weapon-to-acquire").value = "";
 | 
			
		||||
            document.getElementById("acquire-type-" + category).value = "";
 | 
			
		||||
| 
					
	
	
	
	
	
	
	
	 | 
			||||
            updateInventory();
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$("#weapon-to-acquire").on("input", () => {
 | 
			
		||||
    $("#weapon-to-acquire").removeClass("is-invalid");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function dispatchAddItemsRequestsBatch(requests) {
 | 
			
		||||
    revalidateAuthz(() => {
 | 
			
		||||
        const req = $.post({
 | 
			
		||||
@ -648,7 +644,7 @@ function maxRankAllWarframes() {
 | 
			
		||||
 | 
			
		||||
function addMissingWeapons() {
 | 
			
		||||
    const requests = [];
 | 
			
		||||
    document.querySelectorAll("#datalist-weapons option").forEach(elm => {
 | 
			
		||||
    document.querySelectorAll("#datalist-LongGuns option, #datalist-Pistols option, #datalist-Melee option").forEach(elm => {
 | 
			
		||||
        if (!document.querySelector("#weapon-list [data-item-type='" + elm.getAttribute("data-key") + "']")) {
 | 
			
		||||
            requests.push({ type: "Weapon", internalName: elm.getAttribute("data-key") });
 | 
			
		||||
        }
 | 
			
		||||
@ -807,10 +803,6 @@ function doAcquireMiscItems() {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$("#miscitem-type").on("input", () => {
 | 
			
		||||
    $("#miscitem-type").removeClass("is-invalid");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function doAcquireRiven() {
 | 
			
		||||
    let fingerprint;
 | 
			
		||||
    try {
 | 
			
		||||
@ -923,10 +915,6 @@ function doAcquireMod() {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$("#mod-to-acquire").on("input", () => {
 | 
			
		||||
    $("#mod-to-acquire").removeClass("is-invalid");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const uiConfigs = [...$("#server-settings input[id]")].map(x => x.id);
 | 
			
		||||
 | 
			
		||||
function doChangeSettings() {
 | 
			
		||||
@ -1153,10 +1141,6 @@ function doPushArchonCrystalUpgrade() {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$("[list='datalist-archonCrystalUpgrades']").on("input", () => {
 | 
			
		||||
    $("[list='datalist-archonCrystalUpgrades']").removeClass("is-invalid");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function doPopArchonCrystalUpgrade(type) {
 | 
			
		||||
    revalidateAuthz(() => {
 | 
			
		||||
        $.get(
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	
⚠️ Potential issue
Declare jQuery dependency.
The '$' variable is undefined. Add a declaration to fix the ESLint error:
📝 Committable suggestion
🧰 Tools
🪛 eslint
[error] 549-549: '$' is not defined.
(no-undef)
[error] 550-550: '$' is not defined.
(no-undef)