feat(webui): add item by ItemType #2704
@ -689,6 +689,7 @@ export const addItem = async (
 | 
				
			|||||||
    // Path-based duck typing
 | 
					    // Path-based duck typing
 | 
				
			||||||
    switch (typeName.substr(1).split("/")[1]) {
 | 
					    switch (typeName.substr(1).split("/")[1]) {
 | 
				
			||||||
        case "Powersuits":
 | 
					        case "Powersuits":
 | 
				
			||||||
 | 
					            if (typeName.endsWith("AugmentCard")) break;
 | 
				
			||||||
            switch (typeName.substr(1).split("/")[2]) {
 | 
					            switch (typeName.substr(1).split("/")[2]) {
 | 
				
			||||||
                default: {
 | 
					                default: {
 | 
				
			||||||
                    return {
 | 
					                    return {
 | 
				
			||||||
@ -773,6 +774,10 @@ export const addItem = async (
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                case "Skins": {
 | 
				
			||||||
 | 
					                    return addSkin(inventory, typeName);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -869,6 +874,26 @@ export const addItem = async (
 | 
				
			|||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					        case "Weapons": {
 | 
				
			||||||
 | 
					            if (typeName.substr(1).split("/")[4] == "MeleeTrees") break;
 | 
				
			||||||
 | 
					            const productCategory = typeName.substr(1).split("/")[3];
 | 
				
			||||||
 | 
					            switch (productCategory) {
 | 
				
			||||||
 | 
					                case "Pistols":
 | 
				
			||||||
 | 
					                case "LongGuns":
 | 
				
			||||||
 | 
					                case "Melee": {
 | 
				
			||||||
 | 
					                    const inventoryChanges = addEquipment(inventory, productCategory, typeName);
 | 
				
			||||||
 | 
					                    return {
 | 
				
			||||||
 | 
					                        ...inventoryChanges,
 | 
				
			||||||
 | 
					                        ...occupySlot(
 | 
				
			||||||
 | 
					                            inventory,
 | 
				
			||||||
 | 
					                            productCategoryToInventoryBin(productCategory) ?? InventorySlot.WEAPONS,
 | 
				
			||||||
 | 
					                            premiumPurchase
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    throw new Error(`unable to add item: ${typeName}`);
 | 
					    throw new Error(`unable to add item: ${typeName}`);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -92,12 +92,36 @@
 | 
				
			|||||||
            <div data-route="/webui/inventory" data-title="Inventory | OpenWF WebUI">
 | 
					            <div data-route="/webui/inventory" data-title="Inventory | OpenWF WebUI">
 | 
				
			||||||
                <p class="mb-3" data-loc="general_inventoryUpdateNote"></p>
 | 
					                <p class="mb-3" data-loc="general_inventoryUpdateNote"></p>
 | 
				
			||||||
                <div class="card mb-3">
 | 
					                <div class="card mb-3">
 | 
				
			||||||
                    <h5 class="card-header" data-loc="inventory_addItems"></h5>
 | 
					                    <div class="card-header">
 | 
				
			||||||
                    <form class="card-body input-group" onsubmit="doAcquireMiscItems();return false;">
 | 
					                        <ul class="nav nav-tabs card-header-tabs">
 | 
				
			||||||
                        <input class="form-control" id="miscitem-count" type="number" value="1" />
 | 
					                            <li class="nav-item">
 | 
				
			||||||
                        <input class="form-control w-50" id="miscitem-type" list="datalist-miscitems" />
 | 
					                                <button class="nav-link" id="miscItems-tab" data-bs-toggle="tab" data-bs-target="#miscItems-tab-content" data-loc="inventory_addItems"></button>
 | 
				
			||||||
                        <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
 | 
					                            </li>
 | 
				
			||||||
                    </form>
 | 
					                            <li class="nav-item">
 | 
				
			||||||
 | 
					                                <button class="nav-link" id="typeName-tab" data-bs-toggle="tab" data-bs-target="#typeName-tab-content" data-loc="inventory_addItemByItemType"></button>
 | 
				
			||||||
 | 
					                            </li>
 | 
				
			||||||
 | 
					                        </ul>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                    <div class="card-body">
 | 
				
			||||||
 | 
					                        <div class="tab-content">
 | 
				
			||||||
 | 
					                            <div class="tab-pane" id="miscItems-tab-content">
 | 
				
			||||||
 | 
					                                <form class="card-body input-group" onsubmit="doAcquireMiscItems();return false;">
 | 
				
			||||||
 | 
					                                    <input class="form-control" id="miscitem-count" type="number" value="1" />
 | 
				
			||||||
 | 
					                                    <input class="form-control w-50" id="miscitem-type" list="datalist-miscitems" />
 | 
				
			||||||
 | 
					                                    <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
 | 
				
			||||||
 | 
					                                </form>
 | 
				
			||||||
 | 
					                            </div>
 | 
				
			||||||
 | 
					                            <div class="tab-pane" id="typeName-tab-content">
 | 
				
			||||||
 | 
					                                <form class="card-body" onsubmit="addItemByItemType();return false;">
 | 
				
			||||||
 | 
					                                    <p data-loc="inventory_addItemByItemType_warning"></p>
 | 
				
			||||||
 | 
					                                    <div class="input-group">
 | 
				
			||||||
 | 
					                                        <input class="form-control" id="typeName-type" />
 | 
				
			||||||
 | 
					                                        <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                </form>
 | 
				
			||||||
 | 
					                            </div>
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <div class="row g-3 mb-3">
 | 
					                <div class="row g-3 mb-3">
 | 
				
			||||||
                    <div class="col-md-3">
 | 
					                    <div class="col-md-3">
 | 
				
			||||||
 | 
				
			|||||||
@ -649,6 +649,14 @@ function updateInventory() {
 | 
				
			|||||||
            ];
 | 
					            ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Populate inventory route
 | 
					            // Populate inventory route
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.getElementById("typeName-tab").classList.remove("active");
 | 
				
			||||||
 | 
					            document.getElementById("typeName-tab-content").classList.remove("active", "show");
 | 
				
			||||||
 | 
					            document.getElementById("typeName-type").value = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.getElementById("miscItems-tab").classList.add("active");
 | 
				
			||||||
 | 
					            document.getElementById("miscItems-tab-content").classList.add("active", "show");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ["RegularCredits", "PremiumCredits", "FusionPoints", "PrimeTokens"].forEach(currency => {
 | 
					            ["RegularCredits", "PremiumCredits", "FusionPoints", "PrimeTokens"].forEach(currency => {
 | 
				
			||||||
                document.getElementById(currency + "-owned").textContent = loc("currency_owned")
 | 
					                document.getElementById(currency + "-owned").textContent = loc("currency_owned")
 | 
				
			||||||
                    .split("|COUNT|")
 | 
					                    .split("|COUNT|")
 | 
				
			||||||
@ -1685,7 +1693,7 @@ function doAcquireEvolution() {
 | 
				
			|||||||
    setEvolutionProgress([{ ItemType: uniqueName, Rank: permanentEvolutionWeapons.has(uniqueName) ? 0 : 1 }]);
 | 
					    setEvolutionProgress([{ ItemType: uniqueName, Rank: permanentEvolutionWeapons.has(uniqueName) ? 0 : 1 }]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(document).on("input", "input[list]", function () {
 | 
					$(document).on("input", "input", function () {
 | 
				
			||||||
    $(this).removeClass("is-invalid");
 | 
					    $(this).removeClass("is-invalid");
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2008,6 +2016,35 @@ function doAcquireMiscItems() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function addItemByItemType() {
 | 
				
			||||||
 | 
					    const ItemType = document.getElementById("typeName-type").value;
 | 
				
			||||||
 | 
					    // Must start with "/Lotus/", contain only A–Z letters, no "//", and not end with "/"
 | 
				
			||||||
 | 
					    if (!ItemType || !/^\/Lotus\/(?:[A-Za-z]+(?:\/[A-Za-z]+)*)$/.test(ItemType)) {
 | 
				
			||||||
 | 
					        $("#typeName-type").addClass("is-invalid").focus();
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    revalidateAuthz().then(() => {
 | 
				
			||||||
 | 
					        $.post({
 | 
				
			||||||
 | 
					            url: "/custom/addItems?" + window.authz,
 | 
				
			||||||
 | 
					            contentType: "application/json",
 | 
				
			||||||
 | 
					            data: JSON.stringify([
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    ItemType,
 | 
				
			||||||
 | 
					                    ItemCount: 1
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ])
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					            .done(function (_, _, jqXHR) {
 | 
				
			||||||
 | 
					                if (jqXHR.status === 200) {
 | 
				
			||||||
 | 
					                    updateInventory();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .fail(function () {
 | 
				
			||||||
 | 
					                $("#typeName-type").addClass("is-invalid").focus();
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function doAcquireRiven() {
 | 
					function doAcquireRiven() {
 | 
				
			||||||
    let fingerprint;
 | 
					    let fingerprint;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
 | 
				
			|||||||
@ -79,6 +79,8 @@ dict = {
 | 
				
			|||||||
    navbar_cheats: `Cheats`,
 | 
					    navbar_cheats: `Cheats`,
 | 
				
			||||||
    navbar_import: `Importieren`,
 | 
					    navbar_import: `Importieren`,
 | 
				
			||||||
    inventory_addItems: `Gegenstände hinzufügen`,
 | 
					    inventory_addItems: `Gegenstände hinzufügen`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType: `[UNTRANSLATED] Raw`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType_warning: `[UNTRANSLATED] Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`,
 | 
				
			||||||
    inventory_suits: `Warframes`,
 | 
					    inventory_suits: `Warframes`,
 | 
				
			||||||
    inventory_longGuns: `Primärwaffen`,
 | 
					    inventory_longGuns: `Primärwaffen`,
 | 
				
			||||||
    inventory_pistols: `Sekundärwaffen`,
 | 
					    inventory_pistols: `Sekundärwaffen`,
 | 
				
			||||||
 | 
				
			|||||||
@ -78,6 +78,8 @@ dict = {
 | 
				
			|||||||
    navbar_cheats: `Cheats`,
 | 
					    navbar_cheats: `Cheats`,
 | 
				
			||||||
    navbar_import: `Import`,
 | 
					    navbar_import: `Import`,
 | 
				
			||||||
    inventory_addItems: `Add Items`,
 | 
					    inventory_addItems: `Add Items`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType: `Raw`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType_warning: `Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`,
 | 
				
			||||||
    inventory_suits: `Warframes`,
 | 
					    inventory_suits: `Warframes`,
 | 
				
			||||||
    inventory_longGuns: `Primary Weapons`,
 | 
					    inventory_longGuns: `Primary Weapons`,
 | 
				
			||||||
    inventory_pistols: `Secondary Weapons`,
 | 
					    inventory_pistols: `Secondary Weapons`,
 | 
				
			||||||
 | 
				
			|||||||
@ -79,6 +79,8 @@ dict = {
 | 
				
			|||||||
    navbar_cheats: `Trucos`,
 | 
					    navbar_cheats: `Trucos`,
 | 
				
			||||||
    navbar_import: `Importar`,
 | 
					    navbar_import: `Importar`,
 | 
				
			||||||
    inventory_addItems: `Agregar objetos`,
 | 
					    inventory_addItems: `Agregar objetos`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType: `[UNTRANSLATED] Raw`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType_warning: `[UNTRANSLATED] Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`,
 | 
				
			||||||
    inventory_suits: `Warframes`,
 | 
					    inventory_suits: `Warframes`,
 | 
				
			||||||
    inventory_longGuns: `Armas primarias`,
 | 
					    inventory_longGuns: `Armas primarias`,
 | 
				
			||||||
    inventory_pistols: `Armas secundarias`,
 | 
					    inventory_pistols: `Armas secundarias`,
 | 
				
			||||||
 | 
				
			|||||||
@ -79,6 +79,8 @@ dict = {
 | 
				
			|||||||
    navbar_cheats: `Cheats`,
 | 
					    navbar_cheats: `Cheats`,
 | 
				
			||||||
    navbar_import: `Importer`,
 | 
					    navbar_import: `Importer`,
 | 
				
			||||||
    inventory_addItems: `Ajouter des items`,
 | 
					    inventory_addItems: `Ajouter des items`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType: `[UNTRANSLATED] Raw`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType_warning: `[UNTRANSLATED] Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`,
 | 
				
			||||||
    inventory_suits: `Warframes`,
 | 
					    inventory_suits: `Warframes`,
 | 
				
			||||||
    inventory_longGuns: `Armes principales`,
 | 
					    inventory_longGuns: `Armes principales`,
 | 
				
			||||||
    inventory_pistols: `Armes secondaires`,
 | 
					    inventory_pistols: `Armes secondaires`,
 | 
				
			||||||
 | 
				
			|||||||
@ -79,6 +79,8 @@ dict = {
 | 
				
			|||||||
    navbar_cheats: `Читы`,
 | 
					    navbar_cheats: `Читы`,
 | 
				
			||||||
    navbar_import: `Импорт`,
 | 
					    navbar_import: `Импорт`,
 | 
				
			||||||
    inventory_addItems: `Добавить предметы`,
 | 
					    inventory_addItems: `Добавить предметы`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType: `[UNTRANSLATED] Raw`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType_warning: `Используйте эту функцию на свой страх и риск. Она может повредить ваш инвентарь, и в случае проблем вам придётся удалять предметы вручную.`,
 | 
				
			||||||
    inventory_suits: `Варфреймы`,
 | 
					    inventory_suits: `Варфреймы`,
 | 
				
			||||||
    inventory_longGuns: `Основное оружие`,
 | 
					    inventory_longGuns: `Основное оружие`,
 | 
				
			||||||
    inventory_pistols: `Вторичное оружие`,
 | 
					    inventory_pistols: `Вторичное оружие`,
 | 
				
			||||||
 | 
				
			|||||||
@ -79,6 +79,8 @@ dict = {
 | 
				
			|||||||
    navbar_cheats: `Чити`,
 | 
					    navbar_cheats: `Чити`,
 | 
				
			||||||
    navbar_import: `Імпорт`,
 | 
					    navbar_import: `Імпорт`,
 | 
				
			||||||
    inventory_addItems: `Додати предмети`,
 | 
					    inventory_addItems: `Додати предмети`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType: `[UNTRANSLATED] Raw`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType_warning: `[UNTRANSLATED] Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`,
 | 
				
			||||||
    inventory_suits: `Ворфрейми`,
 | 
					    inventory_suits: `Ворфрейми`,
 | 
				
			||||||
    inventory_longGuns: `Основна зброя`,
 | 
					    inventory_longGuns: `Основна зброя`,
 | 
				
			||||||
    inventory_pistols: `Допоміжна зброя`,
 | 
					    inventory_pistols: `Допоміжна зброя`,
 | 
				
			||||||
 | 
				
			|||||||
@ -79,6 +79,8 @@ dict = {
 | 
				
			|||||||
    navbar_cheats: `作弊选项`,
 | 
					    navbar_cheats: `作弊选项`,
 | 
				
			||||||
    navbar_import: `导入`,
 | 
					    navbar_import: `导入`,
 | 
				
			||||||
    inventory_addItems: `添加物品`,
 | 
					    inventory_addItems: `添加物品`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType: `[UNTRANSLATED] Raw`,
 | 
				
			||||||
 | 
					    inventory_addItemByItemType_warning: `[UNTRANSLATED] Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`,
 | 
				
			||||||
    inventory_suits: `战甲`,
 | 
					    inventory_suits: `战甲`,
 | 
				
			||||||
    inventory_longGuns: `主要武器`,
 | 
					    inventory_longGuns: `主要武器`,
 | 
				
			||||||
    inventory_pistols: `次要武器`,
 | 
					    inventory_pistols: `次要武器`,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user