', { html: $(this).html() }); + }); + $("#signatureConfirmation").show(); + $("#signatureButtons").hide(); + } + }) + } +}); diff --git a/app/static/js/rosterManagement.js b/app/static/js/rosterManagement.js new file mode 100644 index 000000000..0010fd48f --- /dev/null +++ b/app/static/js/rosterManagement.js @@ -0,0 +1,90 @@ +import searchUser from './searchUser.js' + +$(document).ready(function(){ + var dt = $('#rosterTable').DataTable(); + + searchUser("searchStudentsInput", callback, "searchStudentsInput"); // initialize ONCE + + $("#searchIcon").click(function (e) { + e.preventDefault(); + callback($("#searchStudentsInput").val()); + }); + + $("#searchStudentsInput").focus(); + + $("#dismissModal").click(function() { + location.reload(); + }) +}); + +function callback(selected) { + var form = $("#searchStudentForm"); + form.attr("action", "/" + selected["username"] + "/addInterest/" + form.data("program") + "/False"); + $("#searchStudentForm").submit(); +} + +$('#searchStudentForm').on('submit', function(e) { + e.preventDefault(); // stops the browser's normal form submission/redirect + + var formData = $(this).serialize(); // or new FormData(this) if you have file inputs + $.ajax({ + url: $(this).attr('action'), + type: $(this).attr('method') || 'POST', + success: function(response) { + var targetDiv = $("#addedNameDivTarget"); + var targetP = $("#addedNameToClone").clone(); + targetDiv.append(targetP); + var targetSpan = targetP.find(".addedNameTarget"); + targetSpan.text(response['firstName'] + " " + response["lastName"]); + targetP.attr("hidden", false); + }, + error: function(xhr, status, error) { + var targetDiv = $("#addedNameDivTarget"); + var targetP = $("#addedNameToClone"); + var targetSpan = targetP.find(".addedNameTarget"); + targetP.html(targetSpan); + targetSpan.text("Uh oh... something went wrong. Contact a CELTS staff member."); + targetP.attr("hidden", false); + console.log(status, error); + } + }) +}); + +$("#exportRoster").click(function() { + var year = $(this).data("year"); + var program = $(this).data('program'); + $.ajax({ + url: "/exportRosters/" + program + "/" + year, + type: 'GET', + xhrFields: { responseType: "blob" }, + success: function(blob, status, xhr) { + msgFlash("Download Successful", "success"); + var filename = 'download.xlsx'; // fallback if header is missing/unparseable + var disposition = xhr.getResponseHeader('Content-Disposition'); + if (disposition) { + // handles both: filename="report.xlsx" and filename=report.xlsx + var match = disposition.match(/filename\*?=(?:UTF-\d['"]*)?["']?([^"';\n]+)["']?/i); + if (match && match[1]) { + filename = decodeURIComponent(match[1]); + } + } + + var xlsxBlob = new Blob([blob], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }); + + var url = window.URL.createObjectURL(xlsxBlob); + var a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + a.remove(); + window.URL.revokeObjectURL(url); + }, + error: function(xhr, status, error) { + console.log(status, error); + } + }) +}) + diff --git a/app/static/js/searchStudent.js b/app/static/js/searchStudent.js index 93062f6de..bdfcc9e1f 100644 --- a/app/static/js/searchStudent.js +++ b/app/static/js/searchStudent.js @@ -1,16 +1,16 @@ import searchUser from './searchUser.js' + function callback(selected) { - $("#searchStudent").submit(); + $("#searchStudentsInput").submit(); } + $(document).ready(function() { - $("#searchStudentsInput").on("input", function() { - searchUser("searchStudentsInput", callback); - }); - + searchUser("searchStudentsInput", callback); // initialize ONCE + $("#searchIcon").click(function (e) { e.preventDefault(); callback($("#searchStudentsInput").val()); }); - $("#searchStudentsInput").focus() -}) + $("#searchStudentsInput").focus(); +}); \ No newline at end of file diff --git a/app/static/js/searchUser.js b/app/static/js/searchUser.js index 5ebf57c70..db6ee7e7e 100644 --- a/app/static/js/searchUser.js +++ b/app/static/js/searchUser.js @@ -1,41 +1,36 @@ export default function searchUser(inputId, callback, clear=false, parentElementId=null, category = null) { - var query = $(`#${inputId}`).val() - let columnDict = {}; $(`#${inputId}`).autocomplete({ appendTo: (parentElementId === null) ? null : `#${parentElementId}`, minLength: 2, - source: function(request, response) { + source: function(request, response) { $.ajax({ - url: `/searchUser/${query}`, + url: `/searchUser/${request.term}`, // use the live term type: "GET", dataType: "json", - data:{"category":category}, + data: {"category": category}, success: function(searchResults) { - response(Object.entries(searchResults).map( (item) => { - return { - // label: firstName lastName (username) - // value: username - label: (item[1]["firstName"]+" "+item[1]["lastName"]+" ("+item[0]+")"), - value: item[1]["username"], - dictvalue: item[1], - } - } - ))}, + response(Object.entries(searchResults).map((item) => { + return { + label: (item[1]["firstName"] + " " + item[1]["lastName"] + " (" + item[0] + ")"), + value: item[1]["username"], + dictvalue: item[1], + } + })) + }, error: function(request, status, error) { console.log(status, error); } }) }, - select: function(event, ui) { - $(`#${inputId}`).val(ui.item.value); - callback(ui.item.dictvalue); - if(clear){ - $(`#${inputId}`).val(""); - } - - return false; - }, - autoFocus: true + select: function(event, ui) { + $(`#${inputId}`).val(ui.item.value); + callback(ui.item.dictvalue); + if(clear){ + $(`#${inputId}`).val(""); + } + return false; + }, + autoFocus: true }); -}; +}; \ No newline at end of file diff --git a/app/static/js/userManagement.js b/app/static/js/userManagement.js index 2e5e91998..7a9c5e8fe 100644 --- a/app/static/js/userManagement.js +++ b/app/static/js/userManagement.js @@ -27,6 +27,7 @@ function callbackProgramManager(selected, action = 'add') { } $(document).ready(function(){ + // Admin Management $("#searchCeltsAdminInput").on("input", function(){ searchUser("searchCeltsAdminInput", callbackAdmin, false, null, "celtsLinkAdmin") @@ -152,6 +153,13 @@ $(document).ready(function(){ }) }); +$('.viewRoster').on('click', function() { + // Openning the modal after the data was received + $('#programPlaceholder').data('programid', $(this).data('programid')) + let modal = new bootstrap.Modal($('#viewRosterModal')); + modal.show(); +}); + function submitRequest(method, username){ let data = { method: method, @@ -244,12 +252,31 @@ function submitTerm(){ url: "/admin/changeTerm", type: "POST", data: termInfo, - success: function(s){ - msgFlash("Current term successfully changed to " + selectedTerm.html(), "success") + success: function(response){ + console.log(response) + msgFlash("Current term successfully changed to " + response["description"], "success") + $(".uploaders").each(function(idx) { + // update the form action attribute to point at the right term + $(this).attr("action", $(this).attr("action").split("/").slice(0, -1).join("/") + "/" + termInfo["id"]); + }) + + // Update all other fields in the form uploader section + $("#collapseTwo h5").text("AY " + response["academicYear"] + " files"); + if(response["volunteerHandbook"]) { + $("#volunteerHandbookURL").text("AY " + response["academicYear"] + " - CELTS Student Handbook") + $("#volunteerHandbookURL").removeAttr("hidden"); + } else { + $("#volunteerHandbookURL").attr("hidden", true); + } + if(response["laborHandbook"]) { + $("#laborHandbookURL").text("AY " + response["academicYear"] + " - CELTS Labor Handbook") + $("#laborHandbookURL").removeAttr("hidden"); + } else { + $("#laborHandbookURL").attr("hidden", true); + } }, error: function(error, status){ - msgFlash("Current term was not changed. Please try again.", "warning") - console.log(error, status) + msgFlash("Current term was not changed. Please reload the page and try again.", "warning") } }) } diff --git a/app/static/js/userProfile.js b/app/static/js/userProfile.js index 61af76787..883520502 100644 --- a/app/static/js/userProfile.js +++ b/app/static/js/userProfile.js @@ -1,6 +1,10 @@ -$(document).ready(function(){ +$(document).ready(function(){ + + $('#editVolunteerModal').modal({ + backdrop: 'static' + }); - $("#checkDietRestriction").on("change", function() { + $("#checkDietRestriction").on("change", function() { let norestrict = $(this).is(':checked'); if (norestrict) { $("#dietContainer").hide(); @@ -36,6 +40,7 @@ $(document).ready(function(){ }) $("#phoneInput").inputmask('(999)-999-9999'); + $(".notifyInput").click(function updateInterest(){ var programID = $(this).data("programid"); var username = $(this).data('username'); @@ -160,45 +165,45 @@ $(document).ready(function(){ /* * Note Functionality */ - function bonnerNoteOff() { - $("#bonnerInput").prop("checked", false); - $("#noteDropdown").show() - $("#bonnerStatement").hide() - $("#visibilityLabel").show() - } + function bonnerNoteOff() { + $("#bonnerInput").prop("checked", false); + $("#noteDropdown").show() + $("#bonnerStatement").hide() + $("#visibilityLabel").show() + } - function bonnerNoteOn() { - $("#bonnerInput").prop("checked", true); - $("#noteDropdown").hide() - $("#bonnerStatement").show() - $("#visibilityLabel").hide() - } + function bonnerNoteOn() { + $("#bonnerInput").prop("checked", true); + $("#noteDropdown").hide() + $("#bonnerStatement").show() + $("#visibilityLabel").hide() + } - $("#addNoteButton").click(function() { - bonnerNoteOff() - $("#addNoteTextArea").val('') - $("#notesSaveButton").data('mode', 'add') - $("#notesSaveButton").data('noteid', null) - $("#noteModal").modal("toggle") - }); + $("#addNoteButton").click(function() { + bonnerNoteOff() + $("#addNoteTextArea").val('') + $("#notesSaveButton").data('mode', 'add') + $("#notesSaveButton").data('noteid', null) + $("#noteModal").modal("toggle") + }); - $("#addVisibility").click(function() { - var bonnerChecked = $("input[name='bonner']:checked").val() + $("#addVisibility").click(function() { + var bonnerChecked = $("input[name='bonner']:checked").val() - if (bonnerChecked == 'on') { - bonnerNoteOn() - } else { - bonnerNoteOff() - } - }); + if (bonnerChecked == 'on') { + bonnerNoteOn() + } else { + bonnerNoteOff() + } + }); - $("#addBonnerNoteButton").click(function() { - bonnerNoteOn() - $("#addNoteTextArea").val('') - $("#notesSaveButton").data('mode', 'add') - $("#notesSaveButton").data('noteid', null) - $("#noteModal").modal("toggle"); - }); + $("#addBonnerNoteButton").click(function() { + bonnerNoteOn() + $("#addNoteTextArea").val('') + $("#notesSaveButton").data('mode', 'add') + $("#notesSaveButton").data('noteid', null) + $("#noteModal").modal("toggle"); + }); $('#addNoteForm').submit(function(event) { @@ -220,9 +225,9 @@ $(document).ready(function(){ method: "POST", url: "/profile/addNote", data: {"username": username, - "visibility": $("#noteDropdown").val(), - "noteTextbox": $("#addNoteTextArea").val(), - "bonner": isBonner ? "yes" : "no"}, + "visibility": $("#noteDropdown").val(), + "noteTextbox": $("#addNoteTextArea").val(), + "bonner": isBonner ? "yes" : "no"}, success: function(response) { target = isBonner ? "bonner" : "notes" msgFlash("Successfully added a note", "success", 1300, true); @@ -238,7 +243,7 @@ $(document).ready(function(){ $("#confirmDeleteNote").data('username', $(this).data('username')) $("#confirmDeleteNote").data('noteid', $(this).data('noteid')) $("#deleteNoteWarning").modal("show") - + }); $("#confirmDeleteNote").click(function() { @@ -277,7 +282,8 @@ $(document).ready(function(){ $("#noteModal").modal("toggle") -}); + + $.ajax({ method: "POST", url: "/" + username + "/editNote", @@ -287,6 +293,7 @@ $(document).ready(function(){ } }); }); +}); /* * Background Check Functionality */ @@ -365,14 +372,16 @@ $(document).ready(function(){ }); // Popover functionality - var requiredTraining = $(".trainingPopover"); - requiredTraining.popover({ + var requiredTraining = document.querySelectorAll(".trainingPopover"); + requiredTraining.forEach(function(el) { + new bootstrap.Popover(el, { trigger: "hover", sanitize: false, html: true, content: function() { - return $(this).attr('data-content'); + return this.getAttribute('data-content'); } + }); }); setupPhoneNumber("#updatePhone", "#phoneInput") @@ -443,4 +452,4 @@ function updateManagers(el, volunteerUsername ) { console.log(error, status) } }) -} +} \ No newline at end of file diff --git a/app/templates/admin/searchStudentPage.html b/app/templates/admin/searchStudentPage.html index cf3af8987..6c7ddb589 100644 --- a/app/templates/admin/searchStudentPage.html +++ b/app/templates/admin/searchStudentPage.html @@ -3,13 +3,13 @@ {% block scripts %} {{super()}} - + {% endblock %} {% block app_content %} -