Browse Source

Merge pull request 'bulk-members-dialog-refactor' (#218) from bulk-members-dialog-refactor into master

Reviewed-on: https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/pulls/218
master
Jose Olarte 3 16 hours ago
parent
commit
1053bb6e4c
  1. 155
      src/components/BulkMembersDialog.vue
  2. 1
      src/components/MembersList.vue

155
src/components/BulkMembersDialog.vue

@ -111,7 +111,7 @@
? 'bg-blue-600 text-white cursor-pointer' ? 'bg-blue-600 text-white cursor-pointer'
: 'bg-slate-400 text-slate-200 cursor-not-allowed', : 'bg-slate-400 text-slate-200 cursor-not-allowed',
]" ]"
@click="handleMainAction" @click="processSelectedMembers"
> >
{{ buttonText }} {{ buttonText }}
</button> </button>
@ -145,7 +145,7 @@ import { Contact } from "@/db/tables/contacts";
export default class BulkMembersDialog extends Vue { export default class BulkMembersDialog extends Vue {
@Prop({ default: "" }) activeDid!: string; @Prop({ default: "" }) activeDid!: string;
@Prop({ default: "" }) apiServer!: string; @Prop({ default: "" }) apiServer!: string;
@Prop({ required: true }) dialogType!: "admit" | "visibility"; // isOrganizer: true = organizer mode (admit members), false = member mode (set visibility)
@Prop({ required: true }) isOrganizer!: boolean; @Prop({ required: true }) isOrganizer!: boolean;
// Vue notification system // Vue notification system
@ -252,15 +252,7 @@ export default class BulkMembersDialog extends Vue {
return this.selectedMembers.includes(memberDid); return this.selectedMembers.includes(memberDid);
} }
async handleMainAction() { async processSelectedMembers() {
if (this.dialogType === "admit") {
await this.organizerAdmitAndAddWithVisibility();
} else {
await this.memberAddContactWithVisibility();
}
}
async organizerAdmitAndAddWithVisibility() {
try { try {
const selectedMembers: MemberData[] = this.membersData.filter((member) => const selectedMembers: MemberData[] = this.membersData.filter((member) =>
this.selectedMembers.includes(member.did), this.selectedMembers.includes(member.did),
@ -275,16 +267,20 @@ export default class BulkMembersDialog extends Vue {
for (const member of selectedMembers) { for (const member of selectedMembers) {
try { try {
// First, admit the member // Organizer mode: admit and register the member first
await this.admitMember(member); if (this.isOrganizer) {
await this.admitMember(member);
// Register them await this.registerMember(member);
await this.registerMember(member); admittedCount++;
admittedCount++; }
// If they're not a contact yet, add them as a contact // If they're not a contact yet, add them as a contact
if (!member.isContact) { if (!member.isContact) {
await this.addAsContact(member, true); // Organizer mode: set isRegistered to true, member mode: undefined
await this.addAsContact(
member,
this.isOrganizer ? true : undefined,
);
contactAddedCount++; contactAddedCount++;
} }
@ -299,88 +295,51 @@ export default class BulkMembersDialog extends Vue {
} }
// Show success notification // Show success notification
if (admittedCount > 0) { if (this.isOrganizer) {
this.$notify( if (admittedCount > 0) {
{ this.$notify(
group: "alert", {
type: "success", group: "alert",
title: "Members Admitted Successfully", type: "success",
text: `${admittedCount} member${admittedCount === 1 ? "" : "s"} admitted and registered${contactAddedCount === 0 ? "" : admittedCount === contactAddedCount ? " and" : `, ${contactAddedCount}`}${contactAddedCount === 0 ? "" : ` added as contact${contactAddedCount === 1 ? "" : "s"}`}.`, title: "Members Admitted Successfully",
}, text: `${admittedCount} member${admittedCount === 1 ? "" : "s"} admitted and registered${contactAddedCount === 0 ? "" : admittedCount === contactAddedCount ? " and" : `, ${contactAddedCount}`}${contactAddedCount === 0 ? "" : ` added as contact${contactAddedCount === 1 ? "" : "s"}`}.`,
10000, },
); 5000,
} );
if (errors > 0) { }
this.$notify( if (errors > 0) {
{ this.$notify(
group: "alert", {
type: "danger", group: "alert",
title: "Error", type: "danger",
text: "Failed to fully admit some members. Work with them individually below.", title: "Error",
}, text: "Failed to fully admit some members. Work with them individually below.",
5000, },
); 5000,
} );
}
this.close(notSelectedMembers.map((member) => member.did)); } else {
} catch (error) { // Member mode: show contacts added notification
// eslint-disable-next-line no-console if (contactAddedCount > 0) {
console.error("Error admitting members:", error); this.$notify(
this.$notify( {
{ group: "alert",
group: "alert", type: "success",
type: "danger", title: "Contacts Added Successfully",
title: "Error", text: `${contactAddedCount} member${contactAddedCount === 1 ? "" : "s"} added as contact${contactAddedCount === 1 ? "" : "s"}.`,
text: "Some errors occurred. Work with members individually below.", },
}, 5000,
5000, );
);
}
}
async memberAddContactWithVisibility() {
try {
const selectedMembers: MemberData[] = this.membersData.filter((member) =>
this.selectedMembers.includes(member.did),
);
const notSelectedMembers: MemberData[] = this.membersData.filter(
(member) => !this.selectedMembers.includes(member.did),
);
let contactsAddedCount = 0;
for (const member of selectedMembers) {
try {
// If they're not a contact yet, add them as a contact first
if (!member.isContact) {
await this.addAsContact(member, undefined);
contactsAddedCount++;
}
// Set their seesMe to true
await this.updateContactVisibility(member.did, true);
} catch (error) {
// eslint-disable-next-line no-console
console.error(`Error processing member ${member.did}:`, error);
// Continue with other members even if one fails
} }
} }
// Show success notification
this.$notify(
{
group: "alert",
type: "success",
title: "Contacts Added Successfully",
text: `${contactsAddedCount} member${contactsAddedCount === 1 ? "" : "s"} added as contact${contactsAddedCount === 1 ? "" : "s"}.`,
},
5000,
);
this.close(notSelectedMembers.map((member) => member.did)); this.close(notSelectedMembers.map((member) => member.did));
} catch (error) { } catch (error) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.error("Error adding contacts:", error); console.error(
`Error ${this.isOrganizer ? "admitting members" : "adding contacts"}:`,
error,
);
this.$notify( this.$notify(
{ {
group: "alert", group: "alert",
@ -487,10 +446,10 @@ export default class BulkMembersDialog extends Vue {
} }
showContactInfo() { showContactInfo() {
const message = // isOrganizer: true = admit mode, false = visibility mode
this.dialogType === "admit" const message = this.isOrganizer
? "This user is already your contact, but they are not yet admitted to the meeting." ? "This user is already your contact, but they are not yet admitted to the meeting."
: "This user is already your contact, but your activities are not visible to them yet."; : "This user is already your contact, but your activities are not visible to them yet.";
this.$notify( this.$notify(
{ {

1
src/components/MembersList.vue

@ -223,7 +223,6 @@
ref="bulkMembersDialog" ref="bulkMembersDialog"
:active-did="activeDid" :active-did="activeDid"
:api-server="apiServer" :api-server="apiServer"
:dialog-type="isOrganizer ? 'admit' : 'visibility'"
:is-organizer="isOrganizer" :is-organizer="isOrganizer"
@close="closeBulkMembersDialogCallback" @close="closeBulkMembersDialogCallback"
/> />

Loading…
Cancel
Save