From b69852817e7a9417640f5396a6e1c651031eadeb Mon Sep 17 00:00:00 2001 From: andrewlalis Date: Thu, 20 Feb 2025 11:55:25 -0500 Subject: [PATCH] Improved alert formatting, and edit student page. --- app/src/alerts.ts | 21 +++++++-- app/src/api/base.ts | 19 +++++++- .../classroom_compliance/EditStudentView.vue | 47 +++++++++++++------ app/src/assets/base.css | 6 +++ app/src/components/AlertDialog.vue | 9 ++++ 5 files changed, 84 insertions(+), 18 deletions(-) diff --git a/app/src/alerts.ts b/app/src/alerts.ts index 58d4fa3..acaec50 100644 --- a/app/src/alerts.ts +++ b/app/src/alerts.ts @@ -2,16 +2,31 @@ * Shows a simple message dialog, with a 'close' button. It uses a pre-rendered * dialog element that's globally defined for the whole app. * @param msg The message to show. + * @param alertType The type of alert. "info", "warning", "error" * @returns A promise that resolves when the alert is closed. */ -export function showAlert(msg: string): Promise { +export function showAlert(msg: string, alertType: string = 'info'): Promise { const dialog = document.getElementById('alert-dialog') as HTMLDialogElement + dialog.classList.remove('alert-dialog-error', 'alert-dialog-warning') // Clear old styling classes if they're present. + if (alertType === 'warning') { + dialog.classList.add('alert-dialog-warning') + } else if (alertType === 'error') { + dialog.classList.add('alert-dialog-error') + } const messageBox = document.getElementById('alert-dialog-message') as HTMLParagraphElement const closeButton = document.getElementById('alert-dialog-close-button') as HTMLButtonElement - closeButton.addEventListener('click', () => dialog.close()) + closeButton.addEventListener('click', closeAlertDialog) messageBox.innerText = msg dialog.showModal() return new Promise((resolve) => { - dialog.addEventListener('close', () => resolve()) + dialog.addEventListener('close', () => { + closeButton.removeEventListener('click', closeAlertDialog) + resolve() + }) }) } + +function closeAlertDialog() { + const dialog = document.getElementById('alert-dialog') as HTMLDialogElement + dialog.close() +} diff --git a/app/src/api/base.ts b/app/src/api/base.ts index 16014bd..e1d7a62 100644 --- a/app/src/api/base.ts +++ b/app/src/api/base.ts @@ -30,12 +30,29 @@ export class APIResponse { async handleErrorsWithAlert(): Promise { const value = await this.result if (value instanceof APIError) { - await showAlert(value.message) + if (value instanceof BadRequestError || value instanceof AuthenticationError) { + await showAlert(value.message, 'warning') + } else { + await showAlert(value.message, 'error') + } return null } return value } + async handleErrorsWithAlertNoBody(): Promise { + const value = await this.result + if (value instanceof APIError) { + if (value instanceof BadRequestError || value instanceof AuthenticationError) { + await showAlert(value.message, 'warning') + } else { + await showAlert(value.message, 'error') + } + return false + } + return true + } + async getOrThrow(): Promise { const value = await this.result if (value instanceof APIError) throw value diff --git a/app/src/apps/classroom_compliance/EditStudentView.vue b/app/src/apps/classroom_compliance/EditStudentView.vue index 230ff82..c31f5be 100644 --- a/app/src/apps/classroom_compliance/EditStudentView.vue +++ b/app/src/apps/classroom_compliance/EditStudentView.vue @@ -1,6 +1,4 @@