From 984a25c5fa2304a4b60c04078e90ecea12bd5f03 Mon Sep 17 00:00:00 2001
From: Samuel Couillard <43917914+scouillard@users.noreply.github.com>
Date: Thu, 2 Feb 2023 14:31:53 -0500
Subject: [PATCH] Improve Delete Modals (#4744)

* Fix Delete Modals

* Add Delete Presentation modal

* esf
---
 app/assets/locales/en.json                             |  5 ++++-
 .../components/admin/roles/forms/DeleteRoleForm.jsx    | 10 +++++++++-
 .../components/admin/roles/forms/EditRoleForm.jsx      |  1 -
 .../components/admin/server_rooms/ServerRoomRow.jsx    |  1 -
 app/javascript/components/recordings/RecordingRow.jsx  |  2 --
 .../recordings/forms/DeleteRecordingForm.jsx           | 10 +++++++++-
 .../components/rooms/room/forms/DeleteRoomForm.jsx     | 10 +++++++++-
 .../rooms/room/presentation/Presentation.jsx           |  1 -
 .../room/presentation/forms/DeletePresentationForm.jsx | 10 +++++++++-
 .../rooms/room/room_settings/RoomSettings.jsx          |  3 +--
 .../components/shared_components/modals/Modal.jsx      |  5 +++--
 app/javascript/components/users/user/DeleteAccount.jsx |  1 -
 .../components/users/user/forms/DeleteUserForm.jsx     | 10 +++++++++-
 13 files changed, 53 insertions(+), 16 deletions(-)

diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json
index 17898ad3..82866828 100644
--- a/app/assets/locales/en.json
+++ b/app/assets/locales/en.json
@@ -24,6 +24,7 @@
   "return_home": "Return Home",
   "created_at": "Created at",
   "no_result_search_input": "Could not find any results for \"{{ searchInput }}\"",
+  "action_permanent": "This action cannot be undone.",
   "homepage": {
     "welcome_bbb": "Welcome to BigBlueButton.",
     "bigbluebutton_description": "BigBlueButton is an open source web conferencing system for online classes. The platform maximizes time for applied learning by enabling students to collaborate and receive feedback in real-time.",
@@ -153,7 +154,8 @@
       "access_code_required": "Please enter the access code",
       "wrong_access_code": "Wrong Access Code",
       "generate_viewers_access_code": "Generate access code for viewers",
-      "generate_mods_access_code": "Generate access code for moderators"
+      "generate_mods_access_code": "Generate access code for moderators",
+      "are_you_sure_delete_room": "Are you sure you want to delete this room?"
     }
   },
   "recording": {
@@ -173,6 +175,7 @@
     "copy_recording_urls": "Copy Recording Url(s)",
     "recordings_list_empty": "You don't have any recordings yet!",
     "recordings_list_empty_description": "Recordings will appear here after you start a meeting and record it.",
+    "delete_recording": "Delete Recording",
     "are_you_sure_delete_recording": "Are you sure you want to delete this recording?",
     "search_not_found": "No Recordings found"
   },
diff --git a/app/javascript/components/admin/roles/forms/DeleteRoleForm.jsx b/app/javascript/components/admin/roles/forms/DeleteRoleForm.jsx
index 83dbd906..5a7bc222 100644
--- a/app/javascript/components/admin/roles/forms/DeleteRoleForm.jsx
+++ b/app/javascript/components/admin/roles/forms/DeleteRoleForm.jsx
@@ -5,6 +5,7 @@ import {
 } from 'react-bootstrap';
 import PropTypes from 'prop-types';
 import { useTranslation } from 'react-i18next';
+import { ExclamationTriangleIcon } from '@heroicons/react/24/outline';
 import Form from '../../../shared_components/forms/Form';
 import Spinner from '../../../shared_components/utilities/Spinner';
 import useDeleteRole from '../../../../hooks/mutations/admin/roles/useDeleteRole';
@@ -16,7 +17,14 @@ export default function DeleteRoleForm({ role, handleClose }) {
 
   return (
     <>
-      <p className="text-center">{ t('admin.roles.are_you_sure_delete_role') }</p>
+      <Stack direction="horizontal" className="mb-3">
+        <ExclamationTriangleIcon className="text-danger hi-xl" />
+        <Stack direction="vertical" className="ps-3">
+          <h3> { t('admin.roles.delete_role') } </h3>
+          <p className="mb-0"> { t('admin.roles.are_you_sure_delete_role') } </p>
+          <p className="mt-0"><strong> { t('action_permanent') } </strong></p>
+        </Stack>
+      </Stack>
       <Form methods={methods} onSubmit={deleteRoleAPI.mutate}>
         <Stack direction="horizontal" gap={1} className="float-end">
           <Button variant="neutral" onClick={handleClose}>
diff --git a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx
index 627c2c38..914569a5 100644
--- a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx
+++ b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx
@@ -41,7 +41,6 @@ export default function EditRoleForm({ role }) {
       <div>
         <Modal
           modalButton={<Button variant="delete" className="float-end my-4"> { t('admin.roles.delete_role') } </Button>}
-          title={t('admin.roles.delete_role')}
           body={<DeleteRoleForm role={role} />}
         />
       </div>
diff --git a/app/javascript/components/admin/server_rooms/ServerRoomRow.jsx b/app/javascript/components/admin/server_rooms/ServerRoomRow.jsx
index b49a637f..5ecddf38 100644
--- a/app/javascript/components/admin/server_rooms/ServerRoomRow.jsx
+++ b/app/javascript/components/admin/server_rooms/ServerRoomRow.jsx
@@ -84,7 +84,6 @@ export default function ServerRoomRow({ room }) {
             </Dropdown.Item>
             <Modal
               modalButton={<Dropdown.Item><TrashIcon className="hi-s me-2" />{ t('delete') }</Dropdown.Item>}
-              title={t('admin.server_rooms.delete_server_rooms')}
               body={<DeleteRoomForm mutation={mutationWrapper} />}
             />
           </Dropdown.Menu>
diff --git a/app/javascript/components/recordings/RecordingRow.jsx b/app/javascript/components/recordings/RecordingRow.jsx
index e7a9b552..2cfadf4b 100644
--- a/app/javascript/components/recordings/RecordingRow.jsx
+++ b/app/javascript/components/recordings/RecordingRow.jsx
@@ -111,7 +111,6 @@ export default function RecordingRow({
                 </Dropdown.Item>
                 <Modal
                   modalButton={<Dropdown.Item><TrashIcon className="hi-s me-2" />{ t('delete') }</Dropdown.Item>}
-                  title={t('are_you_sure')}
                   body={(
                     <DeleteRecordingForm
                       mutation={useDeleteAPI}
@@ -133,7 +132,6 @@ export default function RecordingRow({
               </Button>
               <Modal
                 modalButton={<Dropdown.Item className="btn btn-icon"><TrashIcon className="hi-s me-2" /></Dropdown.Item>}
-                title={t('are_you_sure')}
                 body={(
                   <DeleteRecordingForm
                     mutation={useDeleteAPI}
diff --git a/app/javascript/components/recordings/forms/DeleteRecordingForm.jsx b/app/javascript/components/recordings/forms/DeleteRecordingForm.jsx
index 80e6cdb1..0459a135 100644
--- a/app/javascript/components/recordings/forms/DeleteRecordingForm.jsx
+++ b/app/javascript/components/recordings/forms/DeleteRecordingForm.jsx
@@ -5,6 +5,7 @@ import {
 } from 'react-bootstrap';
 import PropTypes from 'prop-types';
 import { useTranslation } from 'react-i18next';
+import { ExclamationTriangleIcon } from '@heroicons/react/24/outline';
 import Form from '../../shared_components/forms/Form';
 import Spinner from '../../shared_components/utilities/Spinner';
 
@@ -15,7 +16,14 @@ export default function DeleteRecordingForm({ mutation: useDeleteAPI, recordId,
 
   return (
     <>
-      <p className="text-center"> { t('recording.are_you_sure_delete_recording') }</p>
+      <Stack direction="horizontal" className="mb-3">
+        <ExclamationTriangleIcon className="text-danger hi-xl" />
+        <Stack direction="vertical" className="ps-3">
+          <h3> { t('recording.delete_recording') } </h3>
+          <p className="mb-0"> { t('recording.are_you_sure_delete_recording') }</p>
+          <p className="mt-0"><strong> { t('action_permanent') } </strong></p>
+        </Stack>
+      </Stack>
       <Form methods={methods} onSubmit={deleteAPI.mutate}>
         <Stack direction="horizontal" gap={1} className="float-end">
           <Button variant="neutral" onClick={handleClose}>
diff --git a/app/javascript/components/rooms/room/forms/DeleteRoomForm.jsx b/app/javascript/components/rooms/room/forms/DeleteRoomForm.jsx
index eb2564aa..565e5987 100644
--- a/app/javascript/components/rooms/room/forms/DeleteRoomForm.jsx
+++ b/app/javascript/components/rooms/room/forms/DeleteRoomForm.jsx
@@ -5,6 +5,7 @@ import {
 } from 'react-bootstrap';
 import PropTypes from 'prop-types';
 import { useTranslation } from 'react-i18next';
+import { ExclamationTriangleIcon } from '@heroicons/react/24/outline';
 import Form from '../../../shared_components/forms/Form';
 import Spinner from '../../../shared_components/utilities/Spinner';
 
@@ -15,7 +16,14 @@ export default function DeleteRoomForm({ mutation: useDeleteRoomAPI, handleClose
 
   return (
     <>
-      <p className="text-center"> Are you sure you want to delete this room?</p>
+      <Stack direction="horizontal" className="mb-3">
+        <ExclamationTriangleIcon className="text-danger hi-xl" />
+        <Stack direction="vertical" className="ps-3">
+          <h3> { t('room.delete_room') } </h3>
+          <p className="mb-0"> { t('room.settings.are_you_sure_delete_room') } </p>
+          <p className="mt-0"><strong> { t('action_permanent') } </strong></p>
+        </Stack>
+      </Stack>
       <Form methods={methods} onSubmit={deleteRoomAPI.mutate}>
         <Stack direction="horizontal" gap={1} className="float-end">
           <Button variant="neutral" onClick={handleClose}>
diff --git a/app/javascript/components/rooms/room/presentation/Presentation.jsx b/app/javascript/components/rooms/room/presentation/Presentation.jsx
index 0a52b0ea..955ddabf 100644
--- a/app/javascript/components/rooms/room/presentation/Presentation.jsx
+++ b/app/javascript/components/rooms/room/presentation/Presentation.jsx
@@ -78,7 +78,6 @@ export default function Presentation() {
             <Col>
               <Modal
                 modalButton={<TrashIcon className="cursor-pointer hi-s" />}
-                title={t('are_you_sure')}
                 body={<DeletePresentationForm />}
               />
             </Col>
diff --git a/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx b/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx
index 1a8559b2..34429688 100644
--- a/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx
+++ b/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx
@@ -6,6 +6,7 @@ import {
 import { useParams } from 'react-router-dom';
 import PropTypes from 'prop-types';
 import { useTranslation } from 'react-i18next';
+import { ExclamationTriangleIcon } from '@heroicons/react/24/outline';
 import Form from '../../../../shared_components/forms/Form';
 import Spinner from '../../../../shared_components/utilities/Spinner';
 import useDeletePresentation from '../../../../../hooks/mutations/rooms/useDeletePresentation';
@@ -17,7 +18,14 @@ export default function DeletePresentationForm({ handleClose }) {
   const deletePresentation = useDeletePresentation(friendlyId);
   return (
     <>
-      <p className="text-center"> { t('room.presentation.are_you_sure_delete_presentation') }</p>
+      <Stack direction="horizontal" className="mb-3">
+        <ExclamationTriangleIcon className="text-danger hi-xl" />
+        <Stack direction="vertical" className="ps-3">
+          <h3> { t('recording.delete_recording') } </h3>
+          <p className="mb-0"> { t('room.presentation.are_you_sure_delete_presentation') } </p>
+          <p className="mt-0"><strong> { t('action_permanent') } </strong></p>
+        </Stack>
+      </Stack>
       <Form methods={methods} onSubmit={deletePresentation.mutate}>
         <Stack direction="horizontal" gap={1} className="float-end">
           <Button variant="neutral" onClick={handleClose}>
diff --git a/app/javascript/components/rooms/room/room_settings/RoomSettings.jsx b/app/javascript/components/rooms/room/room_settings/RoomSettings.jsx
index 8d2896ef..f4bf1228 100644
--- a/app/javascript/components/rooms/room/room_settings/RoomSettings.jsx
+++ b/app/javascript/components/rooms/room/room_settings/RoomSettings.jsx
@@ -103,8 +103,7 @@ export default function RoomSettings() {
                       className="mt-1 mx-2 float-end"
                     >{t('room.delete_room')}
                     </Button>
-)}
-                  title={t('room.delete_room')}
+                  )}
                   body={<DeleteRoomForm mutation={deleteMutationWrapper} />}
                 />
                 )}
diff --git a/app/javascript/components/shared_components/modals/Modal.jsx b/app/javascript/components/shared_components/modals/Modal.jsx
index 1ff769b9..d5f78304 100644
--- a/app/javascript/components/shared_components/modals/Modal.jsx
+++ b/app/javascript/components/shared_components/modals/Modal.jsx
@@ -17,7 +17,7 @@ export default function Modal({
     <>
       {ModalButton}
       <BootstrapModal show={show} onHide={handleClose} centered size={size} id={id} contentClassName="border-0 shadow-sm">
-        <BootstrapModal.Header className="d-block mx-auto border-0 pb-0">
+        <BootstrapModal.Header className="border-0 pb-0">
           <BootstrapModal.Title>{title}</BootstrapModal.Title>
         </BootstrapModal.Header>
         <BootstrapModal.Body>{Body}</BootstrapModal.Body>
@@ -27,7 +27,7 @@ export default function Modal({
 }
 
 Modal.propTypes = {
-  title: PropTypes.string.isRequired,
+  title: PropTypes.string,
   modalButton: PropTypes.element.isRequired,
   body: PropTypes.node.isRequired,
   size: PropTypes.string,
@@ -37,4 +37,5 @@ Modal.propTypes = {
 Modal.defaultProps = {
   id: '',
   size: '',
+  title: '',
 };
diff --git a/app/javascript/components/users/user/DeleteAccount.jsx b/app/javascript/components/users/user/DeleteAccount.jsx
index 667f6914..7190a14d 100644
--- a/app/javascript/components/users/user/DeleteAccount.jsx
+++ b/app/javascript/components/users/user/DeleteAccount.jsx
@@ -15,7 +15,6 @@ export default function DeleteAccount() {
       </p>
       <Modal
         modalButton={<Button variant="delete">{ t('user.account.delete_account_confirmation') }</Button>}
-        title={t('are_you_sure')}
         body={<DeleteUserForm />}
       />
     </div>
diff --git a/app/javascript/components/users/user/forms/DeleteUserForm.jsx b/app/javascript/components/users/user/forms/DeleteUserForm.jsx
index 773edbec..6daa6583 100644
--- a/app/javascript/components/users/user/forms/DeleteUserForm.jsx
+++ b/app/javascript/components/users/user/forms/DeleteUserForm.jsx
@@ -5,6 +5,7 @@ import {
 } from 'react-bootstrap';
 import PropTypes from 'prop-types';
 import { useTranslation } from 'react-i18next';
+import { ExclamationTriangleIcon } from '@heroicons/react/24/outline';
 import Form from '../../../shared_components/forms/Form';
 import useDeleteUser from '../../../../hooks/mutations/users/useDeleteUser';
 import { useAuth } from '../../../../contexts/auth/AuthProvider';
@@ -18,7 +19,14 @@ export default function DeleteUserForm({ handleClose }) {
 
   return (
     <>
-      <p className="text-center"> { t('user.account.are_you_sure_delete_account') }</p>
+      <Stack direction="horizontal" className="mb-3">
+        <ExclamationTriangleIcon className="text-danger hi-xl" />
+        <Stack direction="vertical" className="ps-3">
+          <h3> { t('user.account.delete_account') } </h3>
+          <p className="mb-0"> { t('user.account.are_you_sure_delete_account') } </p>
+          <p className="mt-0"><strong> { t('action_permanent') } </strong></p>
+        </Stack>
+      </Stack>
       <Form methods={methods} onSubmit={deleteUserAPI.mutate}>
         <Stack direction="horizontal" gap={1} className="float-end">
           <Button variant="neutral" onClick={handleClose}> { t('close') } </Button>
-- 
GitLab