返回提交历史
Modified
src/controllers/custom/getItemListsController.ts
+27
-22
Modified
static/webui/index.html
+39
-7
Modified
static/webui/script.js
+17
-29
XFEstudio/SpaceNinjaServer
chore(webui): split weapons by category (#820)
4ce03ad5
代码差异
3 个文件
+83
-58
@@ -17,23 +17,30 @@ interface ListedItem {
17
17
fusionLimit?: number;
18
18
}
19
19
20
const getItemListsController: RequestHandler = (req, res) => {
20
const getItemListsController: RequestHandler = (req, response) => {
21
21
const lang = getDict(typeof req.query.lang == "string" ? req.query.lang : "en");
22
const weapons = [];
23
const miscitems = [];
22
const res: Record<string, ListedItem[]> = {};
23
res.LongGuns = [];
24
res.Pistols = [];
25
res.Melee = [];
26
res.miscitems = [];
24
27
for (const [uniqueName, item] of Object.entries(ExportWeapons)) {
25
if (item.productCategory !== "OperatorAmps") {
26
if (item.totalDamage !== 0) {
27
weapons.push({
28
if (item.totalDamage !== 0) {
29
if (
30
item.productCategory == "LongGuns" ||
31
item.productCategory == "Pistols" ||
32
item.productCategory == "Melee"
33
) {
34
res[item.productCategory].push({
28
35
uniqueName,
29
36
name: getString(item.name, lang)
30
37
});
31
} else if (!item.excludeFromCodex) {
32
miscitems.push({
33
uniqueName: "MiscItems:" + uniqueName,
34
name: getString(item.name, lang)
35
});
36
38
}
39
} else if (!item.excludeFromCodex) {
40
res.miscitems.push({
41
uniqueName: "MiscItems:" + uniqueName,
42
name: getString(item.name, lang)
43
});
37
44
}
38
45
}
39
46
for (const [uniqueName, item] of Object.entries(ExportResources)) {
@@ -48,13 +55,13 @@ const getItemListsController: RequestHandler = (req, res) => {
48
55
name = name.split("|FISH_SIZE|").join(getString("/Lotus/Language/Fish/FishSizeSmallAbbrev", lang));
49
56
}
50
57
}
51
miscitems.push({
58
res.miscitems.push({
52
59
uniqueName: item.productCategory + ":" + uniqueName,
53
60
name: name
54
61
});
55
62
}
56
63
for (const [uniqueName, item] of Object.entries(ExportGear)) {
57
miscitems.push({
64
res.miscitems.push({
58
65
uniqueName: "Consumables:" + uniqueName,
59
66
name: getString(item.name, lang)
60
67
});
@@ -64,7 +71,7 @@ const getItemListsController: RequestHandler = (req, res) => {
64
71
if (!item.hidden) {
65
72
const resultName = getItemName(item.resultType);
66
73
if (resultName) {
67
miscitems.push({
74
res.miscitems.push({
68
75
uniqueName: "Recipes:" + uniqueName,
69
76
name: recipeNameTemplate.replace("|ITEM|", getString(resultName, lang))
70
77
});
@@ -72,10 +79,10 @@ const getItemListsController: RequestHandler = (req, res) => {
72
79
}
73
80
}
74
81
75
const mods: ListedItem[] = [];
82
res.mods = [];
76
83
const badItems: Record<string, boolean> = {};
77
84
for (const [uniqueName, upgrade] of Object.entries(ExportUpgrades)) {
78
mods.push({
85
res.mods.push({
79
86
uniqueName,
80
87
name: getString(upgrade.name, lang),
81
88
fusionLimit: upgrade.fusionLimit
@@ -85,7 +92,7 @@ const getItemListsController: RequestHandler = (req, res) => {
85
92
}
86
93
}
87
94
for (const [uniqueName, arcane] of Object.entries(ExportArcanes)) {
88
mods.push({
95
res.mods.push({
89
96
uniqueName,
90
97
name: getString(arcane.name, lang)
91
98
});
@@ -94,7 +101,7 @@ const getItemListsController: RequestHandler = (req, res) => {
94
101
}
95
102
}
96
103
97
res.json({
104
response.json({
98
105
warframes: Object.entries(ExportWarframes)
99
106
.filter(([_uniqueName, warframe]) => warframe.productCategory == "Suits")
100
107
.map(([uniqueName, warframe]) => {
@@ -104,11 +111,9 @@ const getItemListsController: RequestHandler = (req, res) => {
104
111
exalted: warframe.exalted
105
112
};
106
113
}),
107
weapons,
108
miscitems,
109
mods,
110
114
badItems,
111
archonCrystalUpgrades
115
archonCrystalUpgrades,
116
...res
112
117
});
113
118
};
114
119
@@ -96,7 +96,7 @@
96
96
</div>
97
97
<div class="row g-3">
98
98
<div class="col-lg-6">
99
<div class="card mb-3" style="height: 480px;">
99
<div class="card mb-3" style="height: 400px;">
100
100
<h5 class="card-header">Warframes</h5>
101
101
<div class="card-body overflow-auto">
102
102
<form class="input-group mb-3" onsubmit="doAcquireWarframe();return false;">
@@ -110,15 +110,45 @@
110
110
</div>
111
111
</div>
112
112
<div class="col-lg-6">
113
<div class="card mb-3" style="height: 480px;">
114
<h5 class="card-header">Weapons</h5>
113
<div class="card mb-3" style="height: 400px;">
114
<h5 class="card-header">Primary Weapons</h5>
115
115
<div class="card-body overflow-auto">
116
<form class="input-group mb-3" onsubmit="doAcquireWeapon();return false;">
117
<input class="form-control" id="weapon-to-acquire" list="datalist-weapons" />
116
<form class="input-group mb-3" onsubmit="doAcquireWeapon('LongGuns');return false;">
117
<input class="form-control" id="acquire-type-LongGuns" list="datalist-LongGuns" />
118
118
<button class="btn btn-primary" type="submit">Add</button>
119
119
</form>
120
120
<table class="table table-hover w-100">
121
<tbody id="weapon-list"></tbody>
121
<tbody id="LongGuns-list"></tbody>
122
</table>
123
</div>
124
</div>
125
</div>
126
</div>
127
<div class="row g-3">
128
<div class="col-lg-6">
129
<div class="card mb-3" style="height: 400px;">
130
<h5 class="card-header">Secondary Weapons</h5>
131
<div class="card-body overflow-auto">
132
<form class="input-group mb-3" onsubmit="doAcquireWeapon('Pistols');return false;">
133
<input class="form-control" id="acquire-type-Pistols" list="datalist-Pistols" />
134
<button class="btn btn-primary" type="submit">Add</button>
135
</form>
136
<table class="table table-hover w-100">
137
<tbody id="Pistols-list"></tbody>
138
</table>
139
</div>
140
</div>
141
</div>
142
<div class="col-lg-6">
143
<div class="card mb-3" style="height: 400px;">
144
<h5 class="card-header">Melee Weapons</h5>
145
<div class="card-body overflow-auto">
146
<form class="input-group mb-3" onsubmit="doAcquireWeapon('Melee');return false;">
147
<input class="form-control" id="acquire-type-Melee" list="datalist-Melee" />
148
<button class="btn btn-primary" type="submit">Add</button>
149
</form>
150
<table class="table table-hover w-100">
151
<tbody id="Melee-list"></tbody>
122
152
</table>
123
153
</div>
124
154
</div>
@@ -355,7 +385,9 @@
355
385
</div>
356
386
</div>
357
387
<datalist id="datalist-warframes"></datalist>
358
<datalist id="datalist-weapons"></datalist>
388
<datalist id="datalist-LongGuns"></datalist>
389
<datalist id="datalist-Pistols"></datalist>
390
<datalist id="datalist-Melee"></datalist>
359
391
<datalist id="datalist-miscitems"></datalist>
360
392
<datalist id="datalist-mods">
361
393
<option data-key="/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser" value="Legendary Core"></option>
@@ -265,8 +265,8 @@ function updateInventory() {
265
265
}
266
266
document.getElementById("warframe-list").appendChild(tr);
267
267
});
268
document.getElementById("weapon-list").innerHTML = "";
269
268
["LongGuns", "Pistols", "Melee"].forEach(category => {
269
document.getElementById(category + "-list").innerHTML = "";
270
270
data[category].forEach(item => {
271
271
const tr = document.createElement("tr");
272
272
tr.setAttribute("data-item-type", item.ItemType);
@@ -319,7 +319,7 @@ function updateInventory() {
319
319
}
320
320
tr.appendChild(td);
321
321
}
322
document.getElementById("weapon-list").appendChild(tr);
322
document.getElementById(category + "-list").appendChild(tr);
323
323
});
324
324
});
325
325
@@ -548,14 +548,16 @@ function doAcquireWarframe() {
548
548
});
549
549
}
550
550
551
$("#warframe-to-acquire").on("input", () => {
552
$("#warframe-to-acquire").removeClass("is-invalid");
551
$("input[list]").on("input", function () {
552
$(this).removeClass("is-invalid");
553
553
});
554
554
555
function doAcquireWeapon() {
556
const uniqueName = getKey(document.getElementById("weapon-to-acquire"));
555
function doAcquireWeapon(category) {
556
const uniqueName = getKey(document.getElementById("acquire-type-" + category));
557
557
if (!uniqueName) {
558
$("#weapon-to-acquire").addClass("is-invalid").focus();
558
$("#acquire-type-" + category)
559
.addClass("is-invalid")
560
.focus();
559
561
return;
560
562
}
561
563
revalidateAuthz(() => {
@@ -570,16 +572,12 @@ function doAcquireWeapon() {
570
572
])
571
573
});
572
574
req.done(() => {
573
document.getElementById("weapon-to-acquire").value = "";
575
document.getElementById("acquire-type-" + category).value = "";
574
576
updateInventory();
575
577
});
576
578
});
577
579
}
578
580
579
$("#weapon-to-acquire").on("input", () => {
580
$("#weapon-to-acquire").removeClass("is-invalid");
581
});
582
583
581
function dispatchAddItemsRequestsBatch(requests) {
584
582
revalidateAuthz(() => {
585
583
const req = $.post({
@@ -650,11 +648,13 @@ function maxRankAllWarframes() {
650
648
651
649
function addMissingWeapons() {
652
650
const requests = [];
653
document.querySelectorAll("#datalist-weapons option").forEach(elm => {
654
if (!document.querySelector("#weapon-list [data-item-type='" + elm.getAttribute("data-key") + "']")) {
655
requests.push({ type: "Weapon", internalName: elm.getAttribute("data-key") });
656
}
657
});
651
document
652
.querySelectorAll("#datalist-LongGuns option, #datalist-Pistols option, #datalist-Melee option")
653
.forEach(elm => {
654
if (!document.querySelector("#weapon-list [data-item-type='" + elm.getAttribute("data-key") + "']")) {
655
requests.push({ type: "Weapon", internalName: elm.getAttribute("data-key") });
656
}
657
});
658
658
if (
659
659
requests.length != 0 &&
660
660
window.confirm("Are you sure you want to add " + requests.length + " items to your account?")
@@ -809,10 +809,6 @@ function doAcquireMiscItems() {
809
809
});
810
810
}
811
811
812
$("#miscitem-type").on("input", () => {
813
$("#miscitem-type").removeClass("is-invalid");
814
});
815
816
812
function doAcquireRiven() {
817
813
let fingerprint;
818
814
try {
@@ -925,10 +921,6 @@ function doAcquireMod() {
925
921
});
926
922
}
927
923
928
$("#mod-to-acquire").on("input", () => {
929
$("#mod-to-acquire").removeClass("is-invalid");
930
});
931
932
924
const uiConfigs = [...$("#server-settings input[id]")].map(x => x.id);
933
925
934
926
function doChangeSettings() {
@@ -1155,10 +1147,6 @@ function doPushArchonCrystalUpgrade() {
1155
1147
});
1156
1148
}
1157
1149
1158
$("[list='datalist-archonCrystalUpgrades']").on("input", () => {
1159
$("[list='datalist-archonCrystalUpgrades']").removeClass("is-invalid");
1160
});
1161
1162
1150
function doPopArchonCrystalUpgrade(type) {
1163
1151
revalidateAuthz(() => {
1164
1152
$.get(