appointments.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. "use strict";
  2. import {fetchWithToken, getTimeSpan, parseOrRedirect} from "./utils.js";
  3. let last_clicked = "";
  4. let click_counter = 0;
  5. // Call the function to render data
  6. window.addEventListener("load", async function () {
  7. await fetchAppointments();
  8. document.getElementById("content").classList.remove("hidden");
  9. });
  10. // Render the appointments into the table
  11. function renderAppointments(data) {
  12. const tableBody = document.getElementById('appointment-table-body');
  13. tableBody.innerHTML = '';
  14. data.forEach(appointment => {
  15. const row = document.createElement('tr');
  16. const titleCell = document.createElement('td');
  17. const descriptionCell = document.createElement('td');
  18. const placeCell = document.createElement('td');
  19. const dueDateCell = document.createElement('td');
  20. const timeSpanCell = document.createElement('td');
  21. const shareCell = document.createElement('td');
  22. const participantCell = document.createElement('td');
  23. const editCell = document.createElement('td');
  24. const deleteCell = document.createElement('td');
  25. const shareATag = document.createElement('a');
  26. const participantATag = document.createElement('a');
  27. const editATag = document.createElement('a');
  28. const deleteButton = document.createElement('button');
  29. const searchParams = new URLSearchParams({
  30. appointment: appointment._id,
  31. });
  32. participantATag.href = '/html/bookings.html?' + searchParams.toString();
  33. participantATag.innerText = 'participants';
  34. participantATag.classList.add('participants-link');
  35. editATag.href = '/html/appointmentscreator.html?' + searchParams.toString();
  36. shareATag.href = '/html/schedule.html?' + searchParams.toString();
  37. shareATag.innerText = 'share';
  38. shareATag.classList.add('share-link');
  39. editATag.innerText = 'edit';
  40. editATag.classList.add('edit-link');
  41. deleteButton.onclick = async () => {
  42. if (last_clicked !== appointment._id) {
  43. click_counter += 1;
  44. last_clicked = appointment._id;
  45. return;
  46. }
  47. await deleteAppointment(appointment._id);
  48. }
  49. deleteButton.innerText = 'delete';
  50. shareCell.appendChild(shareATag);
  51. participantCell.appendChild(participantATag);
  52. editCell.appendChild(editATag);
  53. deleteCell.appendChild(deleteButton);
  54. titleCell.textContent = appointment.title;
  55. descriptionCell.textContent = appointment.description;
  56. dueDateCell.textContent = new Date(appointment.dueDate).toLocaleDateString();
  57. placeCell.textContent = appointment.place;
  58. timeSpanCell.textContent = getTimeSpan(appointment.startDate, appointment.endDate);
  59. timeSpanCell.classList.add('time-span');
  60. // Append cells to the row
  61. row.appendChild(titleCell);
  62. row.appendChild(descriptionCell);
  63. row.appendChild(dueDateCell);
  64. row.appendChild(placeCell);
  65. row.appendChild(timeSpanCell);
  66. row.appendChild(shareCell);
  67. row.appendChild(participantCell);
  68. row.appendChild(editCell);
  69. row.appendChild(deleteCell);
  70. // Append the row to the table body
  71. tableBody.appendChild(row);
  72. tableBody.appendChild(row);
  73. });
  74. }
  75. async function deleteAppointment(appointmentId) {
  76. const response = await fetchWithToken(`/api/users/delete`, {
  77. method: 'DELETE',
  78. body: JSON.stringify({appointmentId: appointmentId})
  79. });
  80. await parseOrRedirect(response);
  81. if (response.ok) {
  82. await fetchAppointments();
  83. }
  84. }
  85. async function fetchAppointments() {
  86. const response = await fetchWithToken("/api/users/appointments");
  87. const js = await parseOrRedirect(response);
  88. if (js.length === 0) return;
  89. renderAppointments(js);
  90. }