Enabled weapon editing functionality in calculator, updated modal handling, and improved edit button UX.
This commit is contained in:
+75
-28
@@ -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,53 +496,77 @@ 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;
|
||||||
|
|
||||||
//Handle form submission
|
|
||||||
form.addEventListener('submit', e => {
|
|
||||||
e.preventDefault();
|
|
||||||
const data = new FormData(form);
|
|
||||||
const newId = weapons.length
|
|
||||||
? Math.max(...weapons.map(w => w.id)) + 1
|
|
||||||
: 1;
|
|
||||||
const weapon = {
|
|
||||||
id: newId,
|
|
||||||
name: data.get('name'),
|
|
||||||
damage: parseFloat(data.get('damage')),
|
|
||||||
rpm: parseFloat(data.get('rpm')),
|
|
||||||
mag_size: parseFloat(data.get('magazin')),
|
|
||||||
reload_time: parseFloat(data.get('reload-time')),
|
|
||||||
damage_multiplier: parseFloat(data.get('multiplier')),
|
|
||||||
guntype: data.getAll('gun-type')
|
|
||||||
};
|
|
||||||
weapons.push(weapon);
|
|
||||||
populateWeapons();
|
|
||||||
modal.style.display = 'none';
|
|
||||||
form.reset();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
modal.addEventListener('click', e => {
|
modal.addEventListener('click', e => {
|
||||||
if (e.target === modal) {
|
if (e.target === modal) {
|
||||||
modal.style.display = 'none';
|
modal.style.display = 'none';
|
||||||
form.reset();
|
form.reset();
|
||||||
|
isEditing = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
//Handle form submission
|
||||||
|
form.addEventListener('submit', e => {
|
||||||
|
e.preventDefault();
|
||||||
|
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
|
||||||
|
? Math.max(...weapons.map(w => w.id)) + 1
|
||||||
|
: 1;
|
||||||
|
weapons.push({
|
||||||
|
id: newId,
|
||||||
|
name: data.get('name'),
|
||||||
|
damage: parseFloat(data.get('damage')),
|
||||||
|
rpm: parseFloat(data.get('rpm')),
|
||||||
|
mag_size: parseFloat(data.get('magazin')),
|
||||||
|
reload_time: parseFloat(data.get('reload-time')),
|
||||||
|
damage_multiplier: parseFloat(data.get('multiplier')),
|
||||||
|
guntype: types
|
||||||
|
});
|
||||||
|
}
|
||||||
|
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 () => {
|
||||||
const statsTable = document.querySelector('#weapon-stats table tr + tr');
|
const statsTable = document.querySelector('#weapon-stats table tr + tr');
|
||||||
if (!statsTable) {
|
if (!statsTable) {
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user