Skip to content

Commit bfd4ba2

Browse files
authored
Merge pull request #36 from jhotmann/1.0.0-tweaks
Validation of device initials before add/edit
2 parents 4af77d4 + 8dc8f3c commit bfd4ba2

3 files changed

Lines changed: 28 additions & 9 deletions

File tree

src/public/javascripts/user.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,14 @@ $(() => {
1717
$('#password2').addClass('is-invalid');
1818
}
1919
});
20+
21+
document.body.addEventListener('invalidInitials', () => {
22+
$('#initials-feedback').text('Initials taken');
23+
$('#initials').addClass('is-invalid');
24+
});
25+
26+
const addEditModal = new bootstrap.Modal(document.getElementById('add-edit-device-modal'));
27+
document.body.addEventListener('deviceSave', () => {
28+
addEditModal.hide();
29+
});
2030
});

src/routes/user.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,17 @@ router.post('/add-device', upload.single('avatar'), userMw.one, async (req, res)
5353
fs.unlink(req.file.path, () => { console.log('Temp file deleted') });
5454
}
5555
const existingInitials = await Device.findOne({ initials: req.body.initials });
56-
if (existingInitials) return res.send('Initials Invalid');
56+
if (existingInitials) {
57+
res.header('HX-Trigger', 'invalidInitials');
58+
return res.status(400).send('Initials Invalid');
59+
}
5760
const device = await Device.create(req.body.deviceName, req.body.initials, card, req.User);
5861
if (device) {
5962
if (req.envSettings.mqttEnabled) publishDeviceCards(req.User.username, req.User.friends, [ device ]);
6063
}
61-
const userDevices = await Device.getByUserId(req.User._id);
62-
res.render('user-devices.html', { userDevices });
64+
req.pageData.userDevices = await Device.getByUserId(req.User._id);
65+
res.header('HX-Trigger', 'deviceSave');
66+
res.render('user-devices.html', req.pageData);
6367
});
6468

6569
router.get('/edit-device/:deviceId', userMw.one, devMw.one, async (req, res) => {
@@ -82,11 +86,17 @@ router.post('/edit-device/:deviceId', upload.single('avatar'), userMw.one, devMw
8286
fs.unlink(req.file.path, () => { console.log('Temp file deleted') });
8387
}
8488
if (req.Device && req.Device.userId === req.User._id) {
89+
const existingInitials = await Device.findOne({ initials: req.body.initials });
90+
if (existingInitials && existingInitials._id !== req.Device._id) {
91+
res.header('HX-Trigger', 'invalidInitials');
92+
return res.status(400).send('Initials Invalid');
93+
}
8594
req.Device = await req.Device.update(req.body.deviceName, req.body.initials, card, req.User);
8695
await CardSeen.update({ deviceId: req.params.deviceId }, { $set: { seen: false } }); // Force friends to re-download card data (HTTP mode)
8796
if (req.envSettings.mqttEnabled) publishDeviceCards(req.User.username, req.User.friends, [ req.Device ]); // Send card (MQTT mode)
8897
}
8998
req.pageData.userDevices = await Device.getByUserId(req.User._id);
99+
res.header('HX-Trigger', 'deviceSave');
90100
res.render('user-devices.html', req.pageData);
91101
});
92102

@@ -96,8 +106,8 @@ router.get('/delete-device/:deviceId', userMw.one, devMw.one, async (req, res) =
96106
await req.Device.remove();
97107
await CardSeen.remove({ deviceId: req.params.deviceId }, { multi: true });
98108
}
99-
const userDevices = await Device.getByUserId(req.User._id);
100-
res.render('user-devices.html', { userDevices });
109+
req.pageData.userDevices = await Device.getByUserId(req.User._id);
110+
res.render('user-devices.html', req.pageData);
101111
});
102112

103113
// !!!! friends !!!!

src/views/form-add-edit-device.html

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ <h5 class="modal-title" id="create-group-modal-label">{{ "Edit" if deviceData el
1717
</div>
1818
<div class="form-floating mt-3">
1919
<input type="text" class="form-control" id="initials" name="initials" placeholder="AA" pattern="[A-Z]{2}" value="{{ deviceData.initials }}" required>
20-
<label for="initials">Initials</label>
21-
<div class="invalid-feedback">
20+
<label for="initials">Initials (two uppercase letters)</label>
21+
<div id="initials-feedback" class="invalid-feedback">
2222
Initials must be two uppercase letters
2323
</div>
2424
</div>
@@ -40,11 +40,10 @@ <h5 class="modal-title" id="create-group-modal-label">{{ "Edit" if deviceData el
4040
<div class="container pt-3">
4141
<div class="row justify-items-start">
4242
<div class="col-3">
43-
<button id="device-save" class="btn btn-primary" type="submit" data-bs-dismiss="modal">Save</button>
43+
<button id="device-save" class="btn btn-primary" type="submit">Save</button>
4444
</div>
4545
{% if deviceData %}
4646
<div class="col-2">
47-
<!--<a id="delete-button" class="btn btn-danger" href="#" role="button" data-bs-dismiss="modal">Delete</a>-->
4847
<button id="delete-button" class="btn btn-danger" role="button" data-bs-dismiss="modal"
4948
hx-get="/user/delete-device/{{ deviceData._id }}" hx-target="#devices-table-body">Delete</button>
5049
</div>

0 commit comments

Comments
 (0)