forked from OpenWF/SpaceNinjaServer
		
	chore(webui): debounce inventory bulk actions (#2533)
Closes #2513 Reviewed-on: OpenWF/SpaceNinjaServer#2533 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									304af514e2
								
							
						
					
					
						commit
						2307a40833
					
				@ -436,22 +436,22 @@
 | 
			
		||||
                    <h5 class="card-header" data-loc="general_bulkActions"></h5>
 | 
			
		||||
                    <div class="card-body">
 | 
			
		||||
                        <div class="mb-2 d-flex flex-wrap gap-2">
 | 
			
		||||
                            <button class="btn btn-primary" onclick="addMissingEquipment(['Suits']);" data-loc="inventory_bulkAddSuits"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="addMissingEquipment(['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkAddWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="addMissingEquipment(['SpaceSuits']);" data-loc="inventory_bulkAddSpaceSuits"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="addMissingEquipment(['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkAddSpaceWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="addMissingEquipment(['Sentinels']);" data-loc="inventory_bulkAddSentinels"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="addMissingEquipment(['SentinelWeapons']);" data-loc="inventory_bulkAddSentinelWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="addMissingEvolutionProgress();" data-loc="inventory_bulkAddEvolutionProgress"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['Suits']);" data-loc="inventory_bulkAddSuits"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkAddWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SpaceSuits']);" data-loc="inventory_bulkAddSpaceSuits"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkAddSpaceWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['Sentinels']);" data-loc="inventory_bulkAddSentinels"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SentinelWeapons']);" data-loc="inventory_bulkAddSentinelWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-primary" onclick="debounce(addMissingEvolutionProgress);" data-loc="inventory_bulkAddEvolutionProgress"></button>
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="mb-2 d-flex flex-wrap gap-2">
 | 
			
		||||
                            <button class="btn btn-success" onclick="maxRankAllEquipment(['Suits']);" data-loc="inventory_bulkRankUpSuits"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="maxRankAllEquipment(['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkRankUpWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="maxRankAllEquipment(['SpaceSuits']);" data-loc="inventory_bulkRankUpSpaceSuits"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="maxRankAllEquipment(['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkRankUpSpaceWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="maxRankAllEquipment(['Sentinels']);" data-loc="inventory_bulkRankUpSentinels"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="maxRankAllEquipment(['SentinelWeapons']);" data-loc="inventory_bulkRankUpSentinelWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="maxRankAllEvolutions();" data-loc="inventory_bulkRankUpEvolutionProgress"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Suits']);" data-loc="inventory_bulkRankUpSuits"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkRankUpWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['SpaceSuits']);" data-loc="inventory_bulkRankUpSpaceSuits"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkRankUpSpaceWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Sentinels']);" data-loc="inventory_bulkRankUpSentinels"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['SentinelWeapons']);" data-loc="inventory_bulkRankUpSentinelWeapons"></button>
 | 
			
		||||
                            <button class="btn btn-success" onclick="debounce(maxRankAllEvolutions);" data-loc="inventory_bulkRankUpEvolutionProgress"></button>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
@ -872,15 +872,11 @@ function updateInventory() {
 | 
			
		||||
 | 
			
		||||
            const datalistEvolutionProgress = document.querySelectorAll("#datalist-EvolutionProgress option");
 | 
			
		||||
            const formEvolutionProgress = document.querySelector('form[onsubmit*="doAcquireEvolution()"]');
 | 
			
		||||
            const giveAllQEvolutionProgress = document.querySelector(
 | 
			
		||||
                'button[onclick*="addMissingEvolutionProgress()"]'
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            if (datalistEvolutionProgress.length === 0) {
 | 
			
		||||
                formEvolutionProgress.classList.add("disabled");
 | 
			
		||||
                formEvolutionProgress.querySelector("input").disabled = true;
 | 
			
		||||
                formEvolutionProgress.querySelector("button").disabled = true;
 | 
			
		||||
                giveAllQEvolutionProgress.disabled = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (data.CrewShipHarnesses?.length) {
 | 
			
		||||
@ -1541,14 +1537,17 @@ $(document).on("input", "input[list]", function () {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function dispatchAddItemsRequestsBatch(requests) {
 | 
			
		||||
    revalidateAuthz().then(() => {
 | 
			
		||||
        const req = $.post({
 | 
			
		||||
            url: "/custom/addItems?" + window.authz,
 | 
			
		||||
            contentType: "application/json",
 | 
			
		||||
            data: JSON.stringify(requests)
 | 
			
		||||
        });
 | 
			
		||||
        req.done(() => {
 | 
			
		||||
            updateInventory();
 | 
			
		||||
    return new Promise(resolve => {
 | 
			
		||||
        revalidateAuthz().then(() => {
 | 
			
		||||
            const req = $.post({
 | 
			
		||||
                url: "/custom/addItems?" + window.authz,
 | 
			
		||||
                contentType: "application/json",
 | 
			
		||||
                data: JSON.stringify(requests)
 | 
			
		||||
            });
 | 
			
		||||
            req.done(() => {
 | 
			
		||||
                updateInventory();
 | 
			
		||||
                resolve();
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
@ -1569,7 +1568,7 @@ function addMissingEquipment(categories) {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    if (requests.length != 0 && window.confirm(loc("code_addItemsConfirm").split("|COUNT|").join(requests.length))) {
 | 
			
		||||
        dispatchAddItemsRequestsBatch(requests);
 | 
			
		||||
        return dispatchAddItemsRequestsBatch(requests);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1585,7 +1584,7 @@ function addMissingEvolutionProgress() {
 | 
			
		||||
        requests.push({ ItemType: uniqueName, Rank: permanentEvolutionWeapons.has(uniqueName) ? 0 : 1 });
 | 
			
		||||
    });
 | 
			
		||||
    if (requests.length != 0 && window.confirm(loc("code_addItemsConfirm").split("|COUNT|").join(requests.length))) {
 | 
			
		||||
        setEvolutionProgress(requests);
 | 
			
		||||
        return setEvolutionProgress(requests);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1812,14 +1811,17 @@ function maturePet(oid, revert) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setEvolutionProgress(requests) {
 | 
			
		||||
    revalidateAuthz().then(() => {
 | 
			
		||||
        const req = $.post({
 | 
			
		||||
            url: "/custom/setEvolutionProgress?" + window.authz,
 | 
			
		||||
            contentType: "application/json",
 | 
			
		||||
            data: JSON.stringify(requests)
 | 
			
		||||
        });
 | 
			
		||||
        req.done(() => {
 | 
			
		||||
            updateInventory();
 | 
			
		||||
    return new Promise(resolve => {
 | 
			
		||||
        revalidateAuthz().then(() => {
 | 
			
		||||
            const req = $.post({
 | 
			
		||||
                url: "/custom/setEvolutionProgress?" + window.authz,
 | 
			
		||||
                contentType: "application/json",
 | 
			
		||||
                data: JSON.stringify(requests)
 | 
			
		||||
            });
 | 
			
		||||
            req.done(() => {
 | 
			
		||||
                updateInventory();
 | 
			
		||||
                resolve();
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
@ -2511,9 +2513,17 @@ function formatDatetime(fmt, date) {
 | 
			
		||||
const calls_in_flight = new Set();
 | 
			
		||||
 | 
			
		||||
async function debounce(func, ...args) {
 | 
			
		||||
    calls_in_flight.add(func);
 | 
			
		||||
    await func(...args);
 | 
			
		||||
    calls_in_flight.delete(func);
 | 
			
		||||
    if (!func.name) {
 | 
			
		||||
        throw new Error(`cannot debounce anonymous functions`);
 | 
			
		||||
    }
 | 
			
		||||
    const callid = JSON.stringify({ func: func.name, args });
 | 
			
		||||
    if (!calls_in_flight.has(callid)) {
 | 
			
		||||
        calls_in_flight.add(callid);
 | 
			
		||||
        await func(...args);
 | 
			
		||||
        calls_in_flight.delete(callid);
 | 
			
		||||
    } else {
 | 
			
		||||
        console.log("debouncing", callid);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function doMaxPlexus() {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user