Enabled weapon editing functionality in calculator, updated modal handling, and improved edit button UX.

This commit is contained in:
IM23a-spirgif
2025-06-16 18:03:51 +02:00
parent 46ae1d7aa8
commit 558469e448
3 changed files with 97 additions and 36 deletions
+65 -18
View File
@@ -6,6 +6,7 @@ let selectedGunTypes = [];
let headshotMultiplier = 0; let headshotMultiplier = 0;
let headshotBaseApplied = false; let headshotBaseApplied = false;
let ignoreHeadshots = false; let ignoreHeadshots = false;
let isEditing = false;
//fetch operatives data from JSON //fetch operatives data from JSON
function fetchOperativesData() { function fetchOperativesData() {
@@ -96,15 +97,17 @@ function populateWeapons() {
select.appendChild(option); select.appendChild(option);
}); });
select.addEventListener('change', (event) => { select.addEventListener('change', (event) => {
const selectedWeaponId = parseInt(event.target.value); const id = parseInt(event.target.value, 10);
if (!selectedWeaponId) { if (!id) {
document.getElementById('weapon-stats').innerHTML = ''; document.getElementById('weapon-stats').innerHTML = '';
editBtn.disabled = true;
return; return;
} }
selectedWeapon = weapons.find(weapon => weapon.id === selectedWeaponId); selectedWeapon = weapons.find(w => w.id === id);
if (selectedWeapon) { if (selectedWeapon) {
updateWeaponStats(selectedWeapon); updateWeaponStats(selectedWeapon);
applyModifiers(); applyModifiers();
editBtn.disabled = false;
} }
}); });
} }
@@ -493,31 +496,57 @@ document.querySelectorAll('#guntype-filters input').forEach(checkbox => {
checkbox.addEventListener('change', filterWeapons); checkbox.addEventListener('change', filterWeapons);
}); });
//Create a Weapon //Create/Edit a Weapon
const openBtn = document.getElementById('weapon-create'); const openBtn = document.getElementById('weapon-create');
const closeBtn = document.getElementById('weapon-cancel'); const closeBtn = document.getElementById('weapon-cancel');
const modal = document.getElementById('weapon-form'); const modal = document.getElementById('weapon-form');
const form = document.getElementById('weaponForm'); const form = document.getElementById('weaponForm');
const editBtn = document.getElementById('weapon-edit');
const editError = document.getElementById('edit-error');
//Show the modal //Show the modal
openBtn.addEventListener('click', () => { openBtn.addEventListener('click', () => {
modal.style.display = 'flex'; modal.style.display = 'flex';
}); });
//Hide the modal
closeBtn.addEventListener('click', () => { closeBtn.addEventListener('click', () => {
modal.style.display = 'none'; modal.style.display = 'none';
form.reset(); form.reset();
isEditing = false;
}); });
modal.addEventListener('click', e => {
if (e.target === modal) {
modal.style.display = 'none';
form.reset();
isEditing = false;
}
});
//Handle form submission //Handle form submission
form.addEventListener('submit', e => { form.addEventListener('submit', e => {
e.preventDefault(); e.preventDefault();
const data = new FormData(form); const data = new FormData(form);
const types = Array.from(form.querySelectorAll('input[name="gun-type"]:checked'))
.map(cb => cb.value);
if (types.length === 0) {
alert('Please select at least one weapon type.');
return;
}
if (isEditing) {
selectedWeapon.name = data.get('name');
selectedWeapon.damage = parseFloat(data.get('damage'));
selectedWeapon.rpm = parseFloat(data.get('rpm'));
selectedWeapon.mag_size = parseFloat(data.get('magazin'));
selectedWeapon.reload_time = parseFloat(data.get('reload-time'));
selectedWeapon.damage_multiplier = parseFloat(data.get('multiplier'));
selectedWeapon.guntype = types;
} else {
const newId = weapons.length const newId = weapons.length
? Math.max(...weapons.map(w => w.id)) + 1 ? Math.max(...weapons.map(w => w.id)) + 1
: 1; : 1;
const weapon = { weapons.push({
id: newId, id: newId,
name: data.get('name'), name: data.get('name'),
damage: parseFloat(data.get('damage')), damage: parseFloat(data.get('damage')),
@@ -525,19 +554,17 @@ form.addEventListener('submit', e => {
mag_size: parseFloat(data.get('magazin')), mag_size: parseFloat(data.get('magazin')),
reload_time: parseFloat(data.get('reload-time')), reload_time: parseFloat(data.get('reload-time')),
damage_multiplier: parseFloat(data.get('multiplier')), damage_multiplier: parseFloat(data.get('multiplier')),
guntype: data.getAll('gun-type') guntype: types
}; });
weapons.push(weapon);
populateWeapons();
modal.style.display = 'none';
form.reset();
});
modal.addEventListener('click', e => {
if (e.target === modal) {
modal.style.display = 'none';
form.reset();
} }
populateWeapons();
const weaponSelect = document.getElementById('weapon-select');
weaponSelect.value = selectedWeapon.id;
weaponSelect.dispatchEvent(new Event('change'));
modal.style.display = 'none';
form.reset();
isEditing = false;
editBtn.disabled = true;
}); });
document.getElementById('copy-stats').addEventListener('click', async () => { document.getElementById('copy-stats').addEventListener('click', async () => {
@@ -578,6 +605,26 @@ document.getElementById('copy-stats').addEventListener('click', async () => {
} }
}); });
editBtn.addEventListener('click', () => {
if (!selectedWeapon) {
editError.textContent = '⚠️ You must select a weapon first.';
return;
}
editError.textContent = '';
isEditing = true;
isEditing = true;
form.elements['name'].value = selectedWeapon.name;
form.elements['damage'].value = selectedWeapon.damage;
form.elements['rpm'].value = selectedWeapon.rpm;
form.elements['magazin'].value = selectedWeapon.mag_size;
form.elements['reload-time'].value = selectedWeapon.reload_time;
form.elements['multiplier'].value = selectedWeapon.damage_multiplier;
form.querySelectorAll('input[name="gun-type"]').forEach(cb => {
cb.checked = selectedWeapon.guntype.includes(cb.value);
});
modal.style.display = 'flex';
});
function showCopyMessage(text, type) { function showCopyMessage(text, type) {
const msg = document.getElementById('copy-message'); const msg = document.getElementById('copy-message');
msg.textContent = text; msg.textContent = text;
+20
View File
@@ -594,10 +594,30 @@ body.menu-open {
cursor: pointer; cursor: pointer;
} }
#weapon-edit {
margin: 0 0 20px;
padding: 10px 16px;
background-color: darkred;
border: none;
border-radius: 6px;
color: white;
font-size: 1rem;
cursor: pointer;
}
#weapon-create:hover { #weapon-create:hover {
background-color: red; background-color: red;
} }
#weapon-edit:hover {
background-color: red;
}
#weapon-edit:disabled {
background-color: #666;
cursor: not-allowed;
}
#copy-stats { #copy-stats {
background: darkred; background: darkred;
color: #fff; color: #fff;
+2 -8
View File
@@ -35,6 +35,8 @@
</select> </select>
</div> </div>
<button id="weapon-create">Create New Weapon</button> <button id="weapon-create">Create New Weapon</button>
<button id="weapon-edit" disabled>Edit Weapon</button>
<div id="edit-error" class="error-message" aria-live="polite"></div>
<div id="weapon-form"> <div id="weapon-form">
<div> <div>
<h2>New Weapon</h2> <h2>New Weapon</h2>
@@ -126,7 +128,6 @@
</div> </div>
<script src="{{ url_for('static', filename='filterWeapons.js') }}"></script> <script src="{{ url_for('static', filename='filterWeapons.js') }}"></script>
<script> <script>
//
const hamburger = document.querySelector('.hamburger'); const hamburger = document.querySelector('.hamburger');
const navMenu = document.querySelector('.nav-menu'); const navMenu = document.querySelector('.nav-menu');
hamburger.addEventListener('click', () => { hamburger.addEventListener('click', () => {
@@ -155,13 +156,6 @@
}); });
} }
}); });
document.getElementById('weaponForm').addEventListener('submit', function (event) {
const checkboxes = document.querySelectorAll('input[name="gun-type"]:checked');
if (checkboxes.length === 0) {
event.preventDefault();
alert('Please select at least one weapon type.');
}
});
</script> </script>
</main> </main>
</body> </body>