This commit is contained in:
@@ -29,6 +29,22 @@
|
||||
|
||||
<!-- Password Setup Form -->
|
||||
<v-form ref="formRef" v-model="formValid" @submit.prevent="setupPassword">
|
||||
<!-- Email Input (shown when email is not provided in URL) -->
|
||||
<v-text-field
|
||||
v-if="showEmailInput"
|
||||
v-model="email"
|
||||
label="Email Address"
|
||||
variant="outlined"
|
||||
density="comfortable"
|
||||
:rules="emailRules"
|
||||
:error="!!errorMessage"
|
||||
prepend-inner-icon="mdi-email"
|
||||
class="mb-3"
|
||||
autocomplete="email"
|
||||
type="email"
|
||||
placeholder="Enter your email address"
|
||||
/>
|
||||
|
||||
<v-text-field
|
||||
v-model="password"
|
||||
:type="showPassword ? 'text' : 'password'"
|
||||
@@ -187,6 +203,7 @@ const confirmPassword = ref('');
|
||||
const route = useRoute();
|
||||
const email = ref((route.query.email as string) || '');
|
||||
const token = ref((route.query.token as string) || '');
|
||||
const showEmailInput = ref(!email.value); // Show email input if email is not provided
|
||||
|
||||
// Form ref
|
||||
const formRef = ref();
|
||||
@@ -235,6 +252,11 @@ const confirmPasswordRules = [
|
||||
(v: string) => v === password.value || 'Passwords do not match',
|
||||
];
|
||||
|
||||
const emailRules = [
|
||||
(v: string) => !!v || 'Email address is required',
|
||||
(v: string) => /.+@.+\..+/.test(v) || 'Please enter a valid email address',
|
||||
];
|
||||
|
||||
// Set page title with mobile viewport optimization
|
||||
useHead({
|
||||
title: 'Set Your Password - MonacoUSA Portal',
|
||||
|
||||
@@ -205,6 +205,13 @@
|
||||
@edit="editMember"
|
||||
/>
|
||||
|
||||
<!-- Create Portal Account Dialog -->
|
||||
<CreatePortalAccountDialog
|
||||
v-model="showCreatePortalAccountDialog"
|
||||
:member="selectedMemberForPortalAccount"
|
||||
@account-created="handlePortalAccountCreated"
|
||||
/>
|
||||
|
||||
<!-- Delete Confirmation Dialog -->
|
||||
<v-dialog v-model="showDeleteDialog" max-width="400">
|
||||
<v-card>
|
||||
@@ -285,7 +292,9 @@ const showAddDialog = ref(false);
|
||||
const showEditDialog = ref(false);
|
||||
const showViewDialog = ref(false);
|
||||
const showDeleteDialog = ref(false);
|
||||
const showCreatePortalAccountDialog = ref(false);
|
||||
const selectedMember = ref<Member | null>(null);
|
||||
const selectedMemberForPortalAccount = ref<Member | null>(null);
|
||||
const deleteLoading = ref(false);
|
||||
|
||||
// Success handling
|
||||
@@ -512,55 +521,20 @@ const handleMemberUpdated = (updatedMember: Member) => {
|
||||
successMessage.value = `${updatedMember.FullName} has been updated successfully.`;
|
||||
};
|
||||
|
||||
const createPortalAccount = async (member: Member) => {
|
||||
if (!member.Id || creatingPortalAccountIds.value.includes(member.Id)) return;
|
||||
|
||||
// Add to creating array to show loading state
|
||||
creatingPortalAccountIds.value.push(member.Id);
|
||||
|
||||
try {
|
||||
const response = await $fetch<any>(`/api/members/${member.Id}/create-portal-account`, {
|
||||
method: 'POST'
|
||||
});
|
||||
const createPortalAccount = (member: Member) => {
|
||||
selectedMemberForPortalAccount.value = member;
|
||||
showCreatePortalAccountDialog.value = true;
|
||||
};
|
||||
|
||||
if (response?.success) {
|
||||
// Update the member in the local array to reflect the new keycloak_id
|
||||
const index = members.value.findIndex(m => m.Id === member.Id);
|
||||
if (index !== -1) {
|
||||
// Get keycloak_id from response.data
|
||||
members.value[index] = { ...members.value[index], keycloak_id: response.data?.keycloak_id };
|
||||
}
|
||||
|
||||
showSuccess.value = true;
|
||||
successMessage.value = response.message || `Portal account created successfully for ${member.FullName}.`;
|
||||
} else {
|
||||
throw new Error(response?.message || 'Failed to create portal account');
|
||||
}
|
||||
} catch (err: any) {
|
||||
console.error('Error creating portal account:', err);
|
||||
|
||||
// Better error handling
|
||||
let errorMessage = 'Failed to create portal account. Please try again.';
|
||||
if (err.statusCode === 409) {
|
||||
errorMessage = 'This member already has a portal account or a user with this email already exists.';
|
||||
} else if (err.statusCode === 400) {
|
||||
errorMessage = 'Member must have email, first name, and last name to create a portal account.';
|
||||
} else if (err.data?.message) {
|
||||
errorMessage = err.data.message;
|
||||
} else if (err.message) {
|
||||
errorMessage = err.message;
|
||||
}
|
||||
|
||||
// Show error in snackbar
|
||||
showSuccess.value = true; // Reuse success snackbar for errors
|
||||
successMessage.value = errorMessage;
|
||||
} finally {
|
||||
// Remove from creating array
|
||||
const index = creatingPortalAccountIds.value.indexOf(member.Id);
|
||||
if (index > -1) {
|
||||
creatingPortalAccountIds.value.splice(index, 1);
|
||||
}
|
||||
const handlePortalAccountCreated = (updatedMember: Member) => {
|
||||
// Update the member in the local array to reflect the new keycloak_id
|
||||
const index = members.value.findIndex(m => m.Id === updatedMember.Id);
|
||||
if (index !== -1) {
|
||||
members.value[index] = updatedMember;
|
||||
}
|
||||
|
||||
showSuccess.value = true;
|
||||
successMessage.value = `Portal account created successfully for ${updatedMember.FullName}.`;
|
||||
};
|
||||
|
||||
// Overdue dues handlers
|
||||
|
||||
Reference in New Issue
Block a user