diff --git a/ui/src/pages/CreateMatrix.tsx b/ui/src/pages/CreateMatrix.tsx index c6cc68c..8f19c33 100644 --- a/ui/src/pages/CreateMatrix.tsx +++ b/ui/src/pages/CreateMatrix.tsx @@ -45,6 +45,9 @@ export const CreateMatrix: React.FC = () => { const [snackbarErrorOpen, setSnackbarErrorOpen] = useState(false); const [titleError, setTitleError] = useState(false); const [snackbarTargetErrorOpen, setSnackbarTargetErrorOpen] = useState(false); + const [snackbarTargetErrorCharsOpen, setSnackbarTargetErrorCharsOpen] = useState(false); + const [snackbarCollaboratorsEmailsOpen, setSnackbarCollaboratorsEmailsOpen] = useState(false); + const [snackbarDuplicateEmailsOpen, setSnackbarDuplicateEmailsOpen] = useState(false); const [snackbarParticipantErrorOpen, setSnackbarParticipantErrorOpen] = useState(false); const [participantsData, setParticipantsData] = useState< { email: string; role: string }[] @@ -240,6 +243,31 @@ export const CreateMatrix: React.FC = () => { try { // Duplicate check for targets const trimmedTargets = targets.map((target) => target.trim()); + + // Check for empty targets + const hasEmptyTarget = trimmedTargets.some((target) => target === ""); + if (hasEmptyTarget) { + setSnackbarTargetErrorCharsOpen(true); + return; + } + + // Check for empty emails + const hasEmptyEmail = participantsData.some((p) => p.email.trim() === ""); + if (hasEmptyEmail) { + setSnackbarCollaboratorsEmailsOpen(true); + return; + } + + // Check for duplicate emails + const emails = participantsData.map(p => p.email.trim().toLowerCase()); + const uniqueEmails = new Set(emails); + + if (uniqueEmails.size !== emails.length) + { + setSnackbarDuplicateEmailsOpen(true); + return; + } + const uniqueTargets = new Set(trimmedTargets); if (uniqueTargets.size !== trimmedTargets.length) { setSnackbarErrorOpen(true); @@ -280,7 +308,6 @@ export const CreateMatrix: React.FC = () => { recognizability: {}, images: targetImages[index] || [] })); - const hosts = [ email, ...participantsData @@ -1210,6 +1237,81 @@ export const CreateMatrix: React.FC = () => { + setSnackbarTargetErrorCharsOpen(false)} + > + setSnackbarTargetErrorCharsOpen(false)} + severity="error" + variant="filled" + sx={{ + width: "100%", + backgroundColor: '#7C0B02', + color: '#ffffff', + '& .MuiAlert-icon': { + color: '#ffffff' + }, + boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', + border: '1px solid rgba(255, 255, 255, 0.1)', + backdropFilter: 'blur(10px)', + }} + > + Each target must have at least 1 character + + + + setSnackbarCollaboratorsEmailsOpen(false)} + > + setSnackbarCollaboratorsEmailsOpen(false)} + severity="error" + variant="filled" + sx={{ + width: "100%", + backgroundColor: '#7C0B02', + color: '#ffffff', + '& .MuiAlert-icon': { + color: '#ffffff' + }, + boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', + border: '1px solid rgba(255, 255, 255, 0.1)', + backdropFilter: 'blur(10px)', + }} + > + Cannot have empty email + + + + setSnackbarDuplicateEmailsOpen(false)} + > + setSnackbarDuplicateEmailsOpen(false)} + severity="error" + variant="filled" + sx={{ + width: "100%", + backgroundColor: '#7C0B02', + color: '#ffffff', + '& .MuiAlert-icon': { + color: '#ffffff' + }, + boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', + border: '1px solid rgba(255, 255, 255, 0.1)', + backdropFilter: 'blur(10px)', + }} + > + Cannot have duplicate emails + + +