Add Employee Recognition feature to notifications system

- Add Recognition notification type (ID 5) with blue color
- Add employeesso field to notifications table
- Create carousel display for Recognition on shopfloor dashboard
- Show employee names (lookup from wjf_employees) instead of SSO
- Auto-set starttime to NOW and endtime to 4AM next day
- Auto-enable shopfloor display for Recognition type
- Add Achievements tab to employee profile (displayprofile.asp)
- Hide Recognition from calendar view
- Add lookupemployee.asp AJAX endpoint for name preview
- Fix datetime double-formatting bug in save/update files
- Fix URL parameter loading on shopfloor dashboard init

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
cproudlock
2026-01-09 07:27:37 -05:00
parent dd8729393f
commit 28e8071570
10 changed files with 938 additions and 51 deletions

View File

@@ -188,7 +188,7 @@
<small class="form-text text-muted">Link this notification to a specific application (e.g., for software updates)</small>
</div>
<div class="form-group">
<div class="form-group" id="ticketnumberGroup">
<label for="ticketnumber">Ticket Number</label>
<input type="text" class="form-control" id="ticketnumber" name="ticketnumber"
value="<%=Server.HTMLEncode(rs("ticketnumber") & "")%>"
@@ -196,7 +196,18 @@
<small class="form-text text-muted">Optional ServiceNow ticket number</small>
</div>
<div class="form-row">
<div class="form-group" id="employeessoGroup" style="display:none;">
<label for="employeesso">Employee SSO(s) <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="employeesso" name="employeesso"
value="<%=Server.HTMLEncode(rs("employeesso") & "")%>"
maxlength="100" placeholder="123456789 or 123456789, 987654321">
<small class="form-text text-muted">Enter one or more SSOs separated by commas</small>
<div id="employeePreview" class="mt-2" style="display:none;">
<span class="badge badge-info" id="employeeNames"></span>
</div>
</div>
<div class="form-row" id="timeFieldsRow">
<div class="form-group col-md-6">
<label for="starttime">Start Time <span class="text-danger">*</span></label>
<div class="input-group">
@@ -318,6 +329,75 @@
function clearEndtime() {
document.getElementById('endtime').value = '';
}
// Handle notification type change for Recognition
document.addEventListener('DOMContentLoaded', function() {
var typeSelect = document.getElementById('notificationtypeid');
typeSelect.addEventListener('change', handleTypeChange);
handleTypeChange(); // Initial check
// Employee lookup on SSO input
var ssoInput = document.getElementById('employeesso');
ssoInput.addEventListener('input', function() {
clearTimeout(window.lookupTimeout);
window.lookupTimeout = setTimeout(lookupEmployees, 500);
});
// Trigger initial lookup if SSO has value
if (ssoInput.value.trim()) {
lookupEmployees();
}
});
function handleTypeChange() {
var typeSelect = document.getElementById('notificationtypeid');
var selectedText = typeSelect.options[typeSelect.selectedIndex].text;
var isRecognition = selectedText.toLowerCase().indexOf('recognition') !== -1;
// Show/hide SSO field
document.getElementById('employeessoGroup').style.display = isRecognition ? 'block' : 'none';
document.getElementById('employeesso').required = isRecognition;
// Show/hide time fields and ticket number for Recognition
document.getElementById('timeFieldsRow').style.display = isRecognition ? 'none' : 'flex';
document.getElementById('ticketnumberGroup').style.display = isRecognition ? 'none' : 'block';
// For Recognition, remove required from starttime
document.getElementById('starttime').required = !isRecognition;
// Auto-check shopfloor dashboard for Recognition
if (isRecognition) {
document.getElementById('isshopfloor').checked = true;
}
}
function lookupEmployees() {
var ssoInput = document.getElementById('employeesso');
var ssos = ssoInput.value.trim();
var previewDiv = document.getElementById('employeePreview');
var namesSpan = document.getElementById('employeeNames');
if (!ssos) {
previewDiv.style.display = 'none';
return;
}
fetch('./lookupemployee.asp?sso=' + encodeURIComponent(ssos))
.then(function(response) { return response.json(); })
.then(function(data) {
if (data.success && data.names) {
namesSpan.textContent = data.names;
namesSpan.className = 'badge badge-info';
previewDiv.style.display = 'block';
} else {
namesSpan.textContent = data.error || 'Employee not found';
namesSpan.className = 'badge badge-warning';
previewDiv.style.display = 'block';
}
})
.catch(function(err) {
previewDiv.style.display = 'none';
});
}
</script>
</body>