返回提交历史
Modified
static/webui/index.html
+14
-14
Modified
static/webui/script.js
+35
-25
XFEstudio/XFESpaceNinjaServer
chore(webui): debounce inventory bulk actions (#2533)
Closes #2513 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2533 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
2307a408
代码差异
2 个文件
+49
-39
@@ -436,22 +436,22 @@
436
436
<h5 class="card-header" data-loc="general_bulkActions"></h5>
437
437
<div class="card-body">
438
438
<div class="mb-2 d-flex flex-wrap gap-2">
439
<button class="btn btn-primary" onclick="addMissingEquipment(['Suits']);" data-loc="inventory_bulkAddSuits"></button>
440
<button class="btn btn-primary" onclick="addMissingEquipment(['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkAddWeapons"></button>
441
<button class="btn btn-primary" onclick="addMissingEquipment(['SpaceSuits']);" data-loc="inventory_bulkAddSpaceSuits"></button>
442
<button class="btn btn-primary" onclick="addMissingEquipment(['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkAddSpaceWeapons"></button>
443
<button class="btn btn-primary" onclick="addMissingEquipment(['Sentinels']);" data-loc="inventory_bulkAddSentinels"></button>
444
<button class="btn btn-primary" onclick="addMissingEquipment(['SentinelWeapons']);" data-loc="inventory_bulkAddSentinelWeapons"></button>
445
<button class="btn btn-primary" onclick="addMissingEvolutionProgress();" data-loc="inventory_bulkAddEvolutionProgress"></button>
439
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['Suits']);" data-loc="inventory_bulkAddSuits"></button>
440
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkAddWeapons"></button>
441
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SpaceSuits']);" data-loc="inventory_bulkAddSpaceSuits"></button>
442
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkAddSpaceWeapons"></button>
443
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['Sentinels']);" data-loc="inventory_bulkAddSentinels"></button>
444
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SentinelWeapons']);" data-loc="inventory_bulkAddSentinelWeapons"></button>
445
<button class="btn btn-primary" onclick="debounce(addMissingEvolutionProgress);" data-loc="inventory_bulkAddEvolutionProgress"></button>
446
446
</div>
447
447
<div class="mb-2 d-flex flex-wrap gap-2">
448
<button class="btn btn-success" onclick="maxRankAllEquipment(['Suits']);" data-loc="inventory_bulkRankUpSuits"></button>
449
<button class="btn btn-success" onclick="maxRankAllEquipment(['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkRankUpWeapons"></button>
450
<button class="btn btn-success" onclick="maxRankAllEquipment(['SpaceSuits']);" data-loc="inventory_bulkRankUpSpaceSuits"></button>
451
<button class="btn btn-success" onclick="maxRankAllEquipment(['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkRankUpSpaceWeapons"></button>
452
<button class="btn btn-success" onclick="maxRankAllEquipment(['Sentinels']);" data-loc="inventory_bulkRankUpSentinels"></button>
453
<button class="btn btn-success" onclick="maxRankAllEquipment(['SentinelWeapons']);" data-loc="inventory_bulkRankUpSentinelWeapons"></button>
454
<button class="btn btn-success" onclick="maxRankAllEvolutions();" data-loc="inventory_bulkRankUpEvolutionProgress"></button>
448
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Suits']);" data-loc="inventory_bulkRankUpSuits"></button>
449
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Melee', 'LongGuns', 'Pistols']);" data-loc="inventory_bulkRankUpWeapons"></button>
450
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['SpaceSuits']);" data-loc="inventory_bulkRankUpSpaceSuits"></button>
451
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkRankUpSpaceWeapons"></button>
452
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Sentinels']);" data-loc="inventory_bulkRankUpSentinels"></button>
453
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['SentinelWeapons']);" data-loc="inventory_bulkRankUpSentinelWeapons"></button>
454
<button class="btn btn-success" onclick="debounce(maxRankAllEvolutions);" data-loc="inventory_bulkRankUpEvolutionProgress"></button>
455
455
</div>
456
456
</div>
457
457
</div>
@@ -872,15 +872,11 @@ function updateInventory() {
872
872
873
873
const datalistEvolutionProgress = document.querySelectorAll("#datalist-EvolutionProgress option");
874
874
const formEvolutionProgress = document.querySelector('form[onsubmit*="doAcquireEvolution()"]');
875
const giveAllQEvolutionProgress = document.querySelector(
876
'button[onclick*="addMissingEvolutionProgress()"]'
877
);
878
875
879
876
if (datalistEvolutionProgress.length === 0) {
880
877
formEvolutionProgress.classList.add("disabled");
881
878
formEvolutionProgress.querySelector("input").disabled = true;
882
879
formEvolutionProgress.querySelector("button").disabled = true;
883
giveAllQEvolutionProgress.disabled = true;
884
880
}
885
881
886
882
if (data.CrewShipHarnesses?.length) {
@@ -1541,14 +1537,17 @@ $(document).on("input", "input[list]", function () {
1541
1537
});
1542
1538
1543
1539
function dispatchAddItemsRequestsBatch(requests) {
1544
revalidateAuthz().then(() => {
1545
const req = $.post({
1546
url: "/custom/addItems?" + window.authz,
1547
contentType: "application/json",
1548
data: JSON.stringify(requests)
1549
});
1550
req.done(() => {
1551
updateInventory();
1540
return new Promise(resolve => {
1541
revalidateAuthz().then(() => {
1542
const req = $.post({
1543
url: "/custom/addItems?" + window.authz,
1544
contentType: "application/json",
1545
data: JSON.stringify(requests)
1546
});
1547
req.done(() => {
1548
updateInventory();
1549
resolve();
1550
});
1552
1551
});
1553
1552
});
1554
1553
}
@@ -1569,7 +1568,7 @@ function addMissingEquipment(categories) {
1569
1568
});
1570
1569
});
1571
1570
if (requests.length != 0 && window.confirm(loc("code_addItemsConfirm").split("|COUNT|").join(requests.length))) {
1572
dispatchAddItemsRequestsBatch(requests);
1571
return dispatchAddItemsRequestsBatch(requests);
1573
1572
}
1574
1573
}
1575
1574
@@ -1585,7 +1584,7 @@ function addMissingEvolutionProgress() {
1585
1584
requests.push({ ItemType: uniqueName, Rank: permanentEvolutionWeapons.has(uniqueName) ? 0 : 1 });
1586
1585
});
1587
1586
if (requests.length != 0 && window.confirm(loc("code_addItemsConfirm").split("|COUNT|").join(requests.length))) {
1588
setEvolutionProgress(requests);
1587
return setEvolutionProgress(requests);
1589
1588
}
1590
1589
}
1591
1590
@@ -1812,14 +1811,17 @@ function maturePet(oid, revert) {
1812
1811
}
1813
1812
1814
1813
function setEvolutionProgress(requests) {
1815
revalidateAuthz().then(() => {
1816
const req = $.post({
1817
url: "/custom/setEvolutionProgress?" + window.authz,
1818
contentType: "application/json",
1819
data: JSON.stringify(requests)
1820
});
1821
req.done(() => {
1822
updateInventory();
1814
return new Promise(resolve => {
1815
revalidateAuthz().then(() => {
1816
const req = $.post({
1817
url: "/custom/setEvolutionProgress?" + window.authz,
1818
contentType: "application/json",
1819
data: JSON.stringify(requests)
1820
});
1821
req.done(() => {
1822
updateInventory();
1823
resolve();
1824
});
1823
1825
});
1824
1826
});
1825
1827
}
@@ -2511,9 +2513,17 @@ function formatDatetime(fmt, date) {
2511
2513
const calls_in_flight = new Set();
2512
2514
2513
2515
async function debounce(func, ...args) {
2514
calls_in_flight.add(func);
2515
await func(...args);
2516
calls_in_flight.delete(func);
2516
if (!func.name) {
2517
throw new Error(`cannot debounce anonymous functions`);
2518
}
2519
const callid = JSON.stringify({ func: func.name, args });
2520
if (!calls_in_flight.has(callid)) {
2521
calls_in_flight.add(callid);
2522
await func(...args);
2523
calls_in_flight.delete(callid);
2524
} else {
2525
console.log("debouncing", callid);
2526
}
2517
2527
}
2518
2528
2519
2529
async function doMaxPlexus() {