@ -1,40 +1,41 @@
< template >
< template >
< div class = "space-y-4" >
< div class = "space-y-4" >
<!-- Loading State -- >
<!-- Loading State -- >
< div v-if ="isLoading" class="flex justify-center items-center py-8" >
< div
v - if = "isLoading"
class = "mt-16 text-center text-4xl bg-slate-400 text-white w-14 py-2.5 rounded-full mx-auto"
>
< fa icon = "spinner" class = "fa-spin-pulse" / >
< fa icon = "spinner" class = "fa-spin-pulse" / >
< / div >
< / div >
<!-- Members List -- >
<!-- Members List -- >
< p
< div v-else >
v - if = "decryptedMembers.length < members.length"
< div class = "text-center text-red-600 py-4" >
class = "text-center text-red-600 py-4"
{ { decryptionErrorMessage ( ) } }
>
< / div >
{ {
decryptFailureMessage ||
"Your password failed. Please go back and try again."
} }
< / p >
< div v -else class = "space-y-4" >
< div v-if ="missingMyself" class="py-4 text-red-600" >
< div v-if ="missingMyself" class="py-4 text-red-600" >
You are not admitted . The organizer will admit you .
You are not currently admitted by the organizer .
< / div >
< div v-if ="!firstName" class="py-4 text-red-600" >
Your name is not set , so others may not recognize you . Reload this page
to set it .
< / div >
< / div >
< div >
< div >
< span
< span
v - if = "showOrganizerTools && isOrganizer"
v - if = "membersToShow().length > 0 && showOrganizerTools && isOrganizer"
class = "inline-flex items-center flex-wrap"
class = "inline-flex items-center flex-wrap"
>
>
< span class = "inline-flex items-center" >
< span class = "inline-flex items-center" >
Use
& bull ; Click
< span
< span
class = "mx-2 min-w-[24px] min-h-[24px] w-6 h-6 flex items-center justify-center rounded-full bg-blue-100 text-blue-600"
class = "mx-2 min-w-[24px] min-h-[24px] w-6 h-6 flex items-center justify-center rounded-full bg-blue-100 text-blue-600"
>
>
< fa icon = "plus" class = "text-sm" / >
< fa icon = "plus" class = "text-sm" / >
< / span >
< / span >
and
/
< span
< span
class = "mx-2 min-w-[24px] min-h-[24px] w-6 h-6 flex items-center justify-center rounded-full bg-blue-100 text-blue-600"
class = "mx-2 min-w-[24px] min-h-[24px] w-6 h-6 flex items-center justify-center rounded-full bg-blue-100 text-blue-600"
>
>
@ -45,8 +46,11 @@
< / span >
< / span >
< / div >
< / div >
< div >
< div >
< span class = "inline-flex items-center" >
< span
Use
v - if = "membersToShow().length > 0"
class = "inline-flex items-center"
>
& bull ; Click
< span
< span
class = "mx-2 w-8 h-8 flex items-center justify-center rounded-full bg-green-100 text-green-600"
class = "mx-2 w-8 h-8 flex items-center justify-center rounded-full bg-green-100 text-green-600"
>
>
@ -56,7 +60,8 @@
< / span >
< / span >
< / div >
< / div >
< div v-if ="members.length > 0" class="flex justify-center" >
< div class = "flex justify-center" >
<!-- always have at least one refresh button even without members in case the organizer changes the password -- >
< button
< button
@ click = "fetchMembers"
@ click = "fetchMembers"
class = "w-8 h-8 flex items-center justify-center rounded-full bg-blue-100 text-blue-600 hover:bg-blue-200 hover:text-blue-800 transition-colors"
class = "w-8 h-8 flex items-center justify-center rounded-full bg-blue-100 text-blue-600 hover:bg-blue-200 hover:text-blue-800 transition-colors"
@ -68,7 +73,7 @@
< div
< div
v - for = "member in membersToShow()"
v - for = "member in membersToShow()"
: key = "member.member.memberId"
: key = "member.member.memberId"
class = "p-4 bg-gray-50 rounded-lg"
class = "mt-2 p-4 bg-gray-50 rounded-lg"
>
>
< div class = "flex items-center justify-between" >
< div class = "flex items-center justify-between" >
< div class = "flex items-center" >
< div class = "flex items-center" >
@ -131,7 +136,7 @@
{ { member . did } }
{ { member . did } }
< / p >
< / p >
< / div >
< / div >
< div v-if ="members.length > 0" class="flex justify-center mt-4" >
< div v-if ="membersToShow() .length > 0" class="flex justify-center mt-4" >
< button
< button
@ click = "fetchMembers"
@ click = "fetchMembers"
class = "w-8 h-8 flex items-center justify-center rounded-full bg-blue-100 text-blue-600 hover:bg-blue-200 hover:text-blue-800 transition-colors"
class = "w-8 h-8 flex items-center justify-center rounded-full bg-blue-100 text-blue-600 hover:bg-blue-200 hover:text-blue-800 transition-colors"
@ -187,16 +192,15 @@ export default class MembersList extends Vue {
libsUtil = libsUtil ;
libsUtil = libsUtil ;
@ Prop ( { required : true } ) password ! : string ;
@ Prop ( { required : true } ) password ! : string ;
@ Prop ( { default : "Your password failed. Please go back and try again." } )
decryptFailureMessage ! : string ;
@ Prop ( { default : false } ) showOrganizerTools ! : boolean ;
@ Prop ( { default : false } ) showOrganizerTools ! : boolean ;
decryptedMembers : DecryptedMember [ ] = [ ] ;
decryptedMembers : DecryptedMember [ ] = [ ] ;
missingPassword = false ;
firstName = "" ;
missingMyself = false ;
isLoading = true ;
isLoading = false ;
isOrganizer = false ;
isOrganizer = false ;
members : Member [ ] = [ ] ;
members : Member [ ] = [ ] ;
missingPassword = false ;
missingMyself = false ;
activeDid = "" ;
activeDid = "" ;
apiServer = "" ;
apiServer = "" ;
contacts : Array < Contact > = [ ] ;
contacts : Array < Contact > = [ ] ;
@ -205,13 +209,14 @@ export default class MembersList extends Vue {
const settings = await retrieveSettingsForActiveAccount ( ) ;
const settings = await retrieveSettingsForActiveAccount ( ) ;
this . activeDid = settings . activeDid || "" ;
this . activeDid = settings . activeDid || "" ;
this . apiServer = settings . apiServer || "" ;
this . apiServer = settings . apiServer || "" ;
this . firstName = settings . firstName || "" ;
await this . fetchMembers ( ) ;
await this . fetchMembers ( ) ;
await this . loadContacts ( ) ;
await this . loadContacts ( ) ;
}
}
async fetchMembers ( ) {
async fetchMembers ( ) {
this . isLoading = true ;
try {
try {
this . isLoading = true ;
const headers = await getHeaders ( this . activeDid ) ;
const headers = await getHeaders ( this . activeDid ) ;
const response = await this . axios . get (
const response = await this . axios . get (
` ${ this . apiServer } /api/partner/groupOnboardMembers ` ,
` ${ this . apiServer } /api/partner/groupOnboardMembers ` ,
@ -274,6 +279,28 @@ export default class MembersList extends Vue {
this . missingMyself = ! foundMyself ;
this . missingMyself = ! foundMyself ;
}
}
decryptionErrorMessage ( ) : string {
if ( this . isOrganizer ) {
if ( this . decryptedMembers . length < this . members . length ) {
return "Some members have data that cannot be decrypted with that password." ;
} else {
/ / t h e l i s t s m u s t b e e q u a l
return "" ;
}
} else {
/ / n o n - o r g a n i z e r s s h o u l d o n l y s e e p r o b l e m s i f t h e f i r s t ( o r g a n i z e r ) m e m b e r i s n o t d e c r y p t e d
if (
this . decryptedMembers . length === 0 ||
this . decryptedMembers [ 0 ] . member . memberId !== this . members [ 0 ] . memberId
) {
return "Your password is not the same as the organizer. Reload or have them check their password." ;
} else {
/ / t h e f i r s t ( o r g a n i z e r ) m e m b e r w a s d e c r y p t e d O K
return "" ;
}
}
}
membersToShow ( ) : DecryptedMember [ ] {
membersToShow ( ) : DecryptedMember [ ] {
if ( this . isOrganizer ) {
if ( this . isOrganizer ) {
if ( this . showOrganizerTools ) {
if ( this . showOrganizerTools ) {
@ -356,7 +383,7 @@ export default class MembersList extends Vue {
group : "modal" ,
group : "modal" ,
type : "confirm" ,
type : "confirm" ,
title : "Continue Without Adding?" ,
title : "Continue Without Adding?" ,
text : "Are you sure you want to proceed with admission even though they are not a contact? " ,
text : "Are you sure you want to proceed with admission? If they are not a contact, you will not know their name after this meeting. " ,
yesText : "Continue" ,
yesText : "Continue" ,
onYes : async ( ) => {
onYes : async ( ) => {
await this . toggleAdmission ( decrMember ) ;
await this . toggleAdmission ( decrMember ) ;