@myclub_se/data-access 3.7.0 → 3.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2137,7 +2137,7 @@ const eventFactory = (apiEvent) => new Event(apiEvent.id, apiEvent.activity_id,
2137
2137
  const externalLinkFactory = (apiExternalLink) => new ExternalLink(apiExternalLink.text, apiExternalLink.value);
2138
2138
 
2139
2139
  const featureFlagsFactory = (apiFeatureFlags) => {
2140
- return new FeatureFlags(apiFeatureFlags.extra_distribution, apiFeatureFlags.booking_system, apiFeatureFlags.core_invoices, apiFeatureFlags.member_booking, apiFeatureFlags.public_booking, apiFeatureFlags.section_handle_invoices_rfs, apiFeatureFlags.api, apiFeatureFlags.my_pages_menu, apiFeatureFlags.use_databank);
2140
+ return new FeatureFlags(apiFeatureFlags.extra_distribution, apiFeatureFlags.booking_system, apiFeatureFlags.core_invoices, apiFeatureFlags.member_booking, apiFeatureFlags.public_booking, apiFeatureFlags.section_handle_invoices_rfs, apiFeatureFlags.api, apiFeatureFlags.member_pdf_exports, apiFeatureFlags.member_map, apiFeatureFlags.activity_guests, apiFeatureFlags.my_pages_menu, apiFeatureFlags.use_databank);
2141
2141
  };
2142
2142
 
2143
2143
  const giroFactory = (apiGiro) => new Giro(apiGiro.club_id, apiGiro.section_id, apiGiro.giro_type, apiGiro.name, apiGiro.number, apiGiro.ocr);
@@ -4065,9 +4065,12 @@ class FeatureFlags {
4065
4065
  public_booking;
4066
4066
  section_handle_invoices_rfs;
4067
4067
  api;
4068
+ member_pdf_exports;
4069
+ member_map;
4070
+ activity_guests;
4068
4071
  my_pages_menu;
4069
4072
  use_databank;
4070
- constructor(extra_distribution, booking_system, core_invoices, member_booking, public_booking, section_handle_invoices_rfs, api, my_pages_menu, use_databank) {
4073
+ constructor(extra_distribution, booking_system, core_invoices, member_booking, public_booking, section_handle_invoices_rfs, api, member_pdf_exports, member_map, activity_guests, my_pages_menu, use_databank) {
4071
4074
  this.extra_distribution = extra_distribution;
4072
4075
  this.booking_system = booking_system;
4073
4076
  this.core_invoices = core_invoices;
@@ -4075,11 +4078,14 @@ class FeatureFlags {
4075
4078
  this.public_booking = public_booking;
4076
4079
  this.section_handle_invoices_rfs = section_handle_invoices_rfs;
4077
4080
  this.api = api;
4081
+ this.member_pdf_exports = member_pdf_exports;
4082
+ this.member_map = member_map;
4083
+ this.activity_guests = activity_guests;
4078
4084
  this.my_pages_menu = my_pages_menu;
4079
4085
  this.use_databank = use_databank;
4080
4086
  }
4081
4087
  static defaultValues() {
4082
- return new FeatureFlags(false, false, false, false, false, false, false, false, false);
4088
+ return new FeatureFlags(false, false, false, false, false, false, false, false, false, false, false, false);
4083
4089
  }
4084
4090
  }
4085
4091
 
@@ -5726,7 +5732,7 @@ class ActivityService {
5726
5732
  activityId
5727
5733
  });
5728
5734
  }
5729
- signUpMemberOpenActivity(memberId, activityId, comment, optionalFees, responses) {
5735
+ signUpMemberOpenActivity(memberId, activityId, comment, optionalFees, responses, guests = []) {
5730
5736
  return this.apiService
5731
5737
  .updateResource(openActivityFactory, Role.MemberAdmin, MEMBER_OPEN_ACTIVITY_RESPOND_WITH_DATA_PATH, {
5732
5738
  memberId,
@@ -5734,17 +5740,19 @@ class ActivityService {
5734
5740
  }, {
5735
5741
  comment,
5736
5742
  optional_fees: optionalFees,
5737
- responses
5743
+ responses,
5744
+ guests
5738
5745
  });
5739
5746
  }
5740
- signUpPublicOpenActivity(activityId, comment, optionalFees, responses) {
5747
+ signUpPublicOpenActivity(activityId, comment, optionalFees, responses, guests = []) {
5741
5748
  return this.apiService
5742
5749
  .updateResource(openActivityFactory, Role.Public, PUBLIC_OPEN_ACTIVITY_RESPOND_WITH_DATA_PATH, {
5743
5750
  activityId
5744
5751
  }, {
5745
5752
  comment,
5746
5753
  optional_fees: optionalFees,
5747
- responses
5754
+ responses,
5755
+ guests
5748
5756
  });
5749
5757
  }
5750
5758
  updateMemberActivity(memberId, activityInviteId, activityInvite) {
@@ -8820,61 +8828,45 @@ class ActivityEffects extends ExtraMembersMixin {
8820
8828
  }
8821
8829
  }), catchError((error) => of(updateMemberActivityAttendanceFailureAction({ payload: error })))))));
8822
8830
  updateMemberActivityInvite$ = createEffect(() => this.actions$
8823
- .pipe(ofType(updateMemberActivityInviteAction), exhaustMap(({ payload }) => this.activityService.updateMemberActivity(payload.memberId, payload.activityInvite.id, payload.activityInvite)
8824
- .pipe(mergeMap((activityInvite) => {
8825
- const guests = payload.guests ?? [];
8826
- const existingGuests = activityInvite.guests ?? [];
8827
- return reconcileMemberGuests(payload.memberId, activityInvite.id, guests, existingGuests, this.activityService)
8828
- .pipe(catchError(() => of(null)), mergeMap(() => this.activityService.getMemberActivityInvite(payload.memberId, activityInvite.id)), catchError(() => of(activityInvite)), map((updatedInvite) => updateMemberActivityInviteSuccessAction({ payload: updatedInvite })));
8829
- }), catchError((error) => of(updateMemberActivityInviteFailureAction({ payload: error })))))));
8831
+ .pipe(ofType(updateMemberActivityInviteAction), exhaustMap(({ payload }) => {
8832
+ // New guests are sent inline with the respond request so the backend can
8833
+ // include their guest fees in the invoice it creates on accept. Existing
8834
+ // guests are reconciled (update/delete) before responding, so removed
8835
+ // guests are not invoiced.
8836
+ const existingGuests = payload.activityInvite.guests ?? [];
8837
+ const reconcile$ = payload.guests
8838
+ ? reconcileMemberGuests(payload.memberId, payload.activityInvite.id, payload.guests, existingGuests, this.activityService)
8839
+ .pipe(catchError(() => of(null)))
8840
+ : of(null);
8841
+ return reconcile$.pipe(mergeMap(() => this.activityService.updateMemberActivity(payload.memberId, payload.activityInvite.id, { ...payload.activityInvite, guests: newGuests(payload.guests) })
8842
+ .pipe(map((activityInvite) => updateMemberActivityInviteSuccessAction({ payload: activityInvite })), catchError((error) => of(updateMemberActivityInviteFailureAction({ payload: error }))))));
8843
+ })));
8830
8844
  updateMemberOpenActivity$ = createEffect(() => this.actions$
8831
- .pipe(ofType(updateMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpMemberOpenActivity(payload.memberId, payload.activityId, payload.comment, payload.optional_fees, payload.responses)
8832
- .pipe(mergeMap((openActivity) => {
8833
- const guests = payload.guests ?? [];
8834
- if (guests.length === 0) {
8835
- return of(updateMemberOpenActivitySuccessAction({ payload: openActivity }));
8836
- }
8837
- // Step 2: fetch activity to find member's invite ID, then add guests
8838
- return this.activityService.getMemberActivity(payload.memberId, openActivity.id)
8839
- .pipe(mergeMap((activity) => {
8840
- const memberInvite = activity.invited_members.find(m => m.member_id === payload.memberId);
8841
- if (!memberInvite) {
8842
- return of(updateMemberOpenActivitySuccessAction({ payload: openActivity }));
8843
- }
8844
- const guestOps = guests.map(g => this.activityService.addMemberActivityGuest(payload.memberId, memberInvite.id, { name: g.name, comment: g.comment ?? undefined }));
8845
- return forkJoin(guestOps).pipe(catchError(() => of(null)), map(() => updateMemberOpenActivitySuccessAction({ payload: openActivity })));
8846
- }), catchError(() => of(updateMemberOpenActivitySuccessAction({ payload: openActivity }))));
8847
- }), catchError((error) => of(updateMemberOpenActivityFailureAction({ payload: error })))))));
8845
+ .pipe(ofType(updateMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpMemberOpenActivity(payload.memberId, payload.activityId, payload.comment, payload.optional_fees, payload.responses, newGuests(payload.guests))
8846
+ .pipe(map((openActivity) => updateMemberOpenActivitySuccessAction({ payload: openActivity })), catchError((error) => of(updateMemberOpenActivityFailureAction({ payload: error })))))));
8848
8847
  updatePublicActivityInvite$ = createEffect(() => this.actions$
8849
- .pipe(ofType(updatePublicActivityInviteAction), exhaustMap(({ payload }) => this.activityService.updatePublicActivityInvite(payload.activityInvite.id, payload.token, payload.activityInvite)
8850
- .pipe(mergeMap((activityInvite) => {
8851
- const guests = payload.guests ?? [];
8852
- const existingGuests = activityInvite.guests ?? [];
8853
- return reconcilePublicTokenGuests(activityInvite.id, payload.token, guests, existingGuests, this.activityService)
8854
- .pipe(catchError(() => of(null)), mergeMap(() => this.activityService.getPublicActivityInvite(activityInvite.id, payload.token)), catchError(() => of(activityInvite)), map((updatedInvite) => updatePublicActivityInviteSuccessAction({ payload: updatedInvite })));
8855
- }), catchError((error) => of(updatePublicActivityInviteFailureAction({ payload: error })))))));
8848
+ .pipe(ofType(updatePublicActivityInviteAction), exhaustMap(({ payload }) => {
8849
+ const existingGuests = payload.activityInvite.guests ?? [];
8850
+ const reconcile$ = payload.guests
8851
+ ? reconcilePublicTokenGuests(payload.activityInvite.id, payload.token, payload.guests, existingGuests, this.activityService)
8852
+ .pipe(catchError(() => of(null)))
8853
+ : of(null);
8854
+ return reconcile$.pipe(mergeMap(() => this.activityService.updatePublicActivityInvite(payload.activityInvite.id, payload.token, { ...payload.activityInvite, guests: newGuests(payload.guests) })
8855
+ .pipe(map((activityInvite) => updatePublicActivityInviteSuccessAction({ payload: activityInvite })), catchError((error) => of(updatePublicActivityInviteFailureAction({ payload: error }))))));
8856
+ })));
8856
8857
  updatePublicMemberActivityInvite$ = createEffect(() => this.actions$
8857
- .pipe(ofType(updatePublicMemberActivityInviteAction), exhaustMap(({ payload }) => this.activityService.updatePublicMemberActivityInvite(payload.activityInvite.id, payload.activityInvite)
8858
- .pipe(mergeMap((activityInvite) => {
8859
- const guests = payload.guests ?? [];
8860
- const existingGuests = activityInvite.guests ?? [];
8861
- return reconcilePublicTokenGuests(activityInvite.id, activityInvite.token, guests, existingGuests, this.activityService)
8862
- .pipe(catchError(() => of(null)), mergeMap(() => this.activityService.getPublicMemberActivityInvite(activityInvite.id)), catchError(() => of(activityInvite)), map((updatedInvite) => updatePublicMemberActivityInviteSuccessAction({ payload: updatedInvite })));
8863
- }), catchError((error) => of(updatePublicMemberActivityInviteFailureAction({ payload: error })))))));
8858
+ .pipe(ofType(updatePublicMemberActivityInviteAction), exhaustMap(({ payload }) => {
8859
+ const existingGuests = payload.activityInvite.guests ?? [];
8860
+ const reconcile$ = payload.guests
8861
+ ? reconcilePublicTokenGuests(payload.activityInvite.id, payload.activityInvite.token, payload.guests, existingGuests, this.activityService)
8862
+ .pipe(catchError(() => of(null)))
8863
+ : of(null);
8864
+ return reconcile$.pipe(mergeMap(() => this.activityService.updatePublicMemberActivityInvite(payload.activityInvite.id, { ...payload.activityInvite, guests: newGuests(payload.guests) })
8865
+ .pipe(map((activityInvite) => updatePublicMemberActivityInviteSuccessAction({ payload: activityInvite })), catchError((error) => of(updatePublicMemberActivityInviteFailureAction({ payload: error }))))));
8866
+ })));
8864
8867
  updatePublicMemberOpenActivity$ = createEffect(() => this.actions$
8865
- .pipe(ofType(updatePublicMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpPublicOpenActivity(payload.activityId, payload.comment, payload.optional_fees, payload.responses)
8866
- .pipe(mergeMap((openActivity) => {
8867
- const guests = payload.guests ?? [];
8868
- if (guests.length === 0) {
8869
- return of(updatePublicMemberOpenActivitySuccessAction({ payload: openActivity }));
8870
- }
8871
- return this.activityService.getPublicOpenActivityGuests(payload.activityId)
8872
- .pipe(mergeMap((existingCollection) => {
8873
- const existingGuests = existingCollection.toArray();
8874
- return reconcilePublicOpenActivityGuests(payload.activityId, guests, existingGuests, this.activityService)
8875
- .pipe(catchError(() => of(null)), map(() => updatePublicMemberOpenActivitySuccessAction({ payload: openActivity })));
8876
- }), catchError(() => of(updatePublicMemberOpenActivitySuccessAction({ payload: openActivity }))));
8877
- }), catchError((error) => of(updatePublicMemberOpenActivityFailureAction({ payload: error })))))));
8868
+ .pipe(ofType(updatePublicMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpPublicOpenActivity(payload.activityId, payload.comment, payload.optional_fees, payload.responses, newGuests(payload.guests))
8869
+ .pipe(map((openActivity) => updatePublicMemberOpenActivitySuccessAction({ payload: openActivity })), catchError((error) => of(updatePublicMemberOpenActivityFailureAction({ payload: error })))))));
8878
8870
  updateTeamActivity = createEffect(() => this.actions$
8879
8871
  .pipe(ofType(updateTeamActivityAction), exhaustMap(({ payload }) => this.activityService.updateTeamActivity(payload.teamId, payload.activity)
8880
8872
  .pipe(map((activity) => updateTeamActivitySuccessAction({ payload: activity })), catchError((error) => of(updateTeamActivityFailureAction({ payload: error })))))));
@@ -8893,11 +8885,17 @@ class ActivityEffects extends ExtraMembersMixin {
8893
8885
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ActivityEffects, decorators: [{
8894
8886
  type: Injectable
8895
8887
  }] });
8888
+ // New guests (no id yet) are sent inline with the respond request, so the
8889
+ // backend creates them before the invoice and includes their guest fees.
8890
+ function newGuests(guests) {
8891
+ return (guests ?? []).filter(g => !g.id).map(g => ({ name: g.name, comment: g.comment ?? undefined }));
8892
+ }
8893
+ // Updates and deletes of existing guests still use the dedicated guest
8894
+ // endpoints; new guests are sent inline with the respond request instead.
8896
8895
  function reconcileMemberGuests(memberId, inviteId, desiredGuests, existingGuests, activityService) {
8897
8896
  const existingById = new Map(existingGuests.map(g => [g.id, g]));
8898
8897
  const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
8899
8898
  const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
8900
- const toAdd = desiredGuests.filter(g => !g.id);
8901
8899
  const toUpdate = desiredGuests.filter(g => {
8902
8900
  if (!g.id)
8903
8901
  return false;
@@ -8906,7 +8904,6 @@ function reconcileMemberGuests(memberId, inviteId, desiredGuests, existingGuests
8906
8904
  });
8907
8905
  const ops = [
8908
8906
  ...toDelete.map(g => activityService.deleteMemberActivityGuest(memberId, inviteId, g.id)),
8909
- ...toAdd.map(g => activityService.addMemberActivityGuest(memberId, inviteId, { name: g.name, comment: g.comment ?? undefined })),
8910
8907
  ...toUpdate.map(g => activityService.updateMemberActivityGuest(memberId, inviteId, g.id, { name: g.name, comment: g.comment ?? undefined })),
8911
8908
  ];
8912
8909
  return ops.length > 0 ? forkJoin(ops) : of(null);
@@ -8915,7 +8912,6 @@ function reconcilePublicTokenGuests(id, token, desiredGuests, existingGuests, ac
8915
8912
  const existingById = new Map(existingGuests.map(g => [g.id, g]));
8916
8913
  const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
8917
8914
  const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
8918
- const toAdd = desiredGuests.filter(g => !g.id);
8919
8915
  const toUpdate = desiredGuests.filter(g => {
8920
8916
  if (!g.id)
8921
8917
  return false;
@@ -8924,29 +8920,10 @@ function reconcilePublicTokenGuests(id, token, desiredGuests, existingGuests, ac
8924
8920
  });
8925
8921
  const ops = [
8926
8922
  ...toDelete.map(g => activityService.deletePublicActivityGuestByToken(id, token, g.id)),
8927
- ...toAdd.map(g => activityService.addPublicActivityGuestByToken(id, token, { name: g.name, comment: g.comment ?? undefined })),
8928
8923
  ...toUpdate.map(g => activityService.updatePublicActivityGuestByToken(id, token, g.id, { name: g.name, comment: g.comment ?? undefined })),
8929
8924
  ];
8930
8925
  return ops.length > 0 ? forkJoin(ops) : of(null);
8931
8926
  }
8932
- function reconcilePublicOpenActivityGuests(activityId, desiredGuests, existingGuests, activityService) {
8933
- const existingById = new Map(existingGuests.map(g => [g.id, g]));
8934
- const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
8935
- const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
8936
- const toAdd = desiredGuests.filter(g => !g.id);
8937
- const toUpdate = desiredGuests.filter(g => {
8938
- if (!g.id)
8939
- return false;
8940
- const existing = existingById.get(g.id);
8941
- return existing && (existing.name !== g.name || existing.comment !== g.comment);
8942
- });
8943
- const ops = [
8944
- ...toDelete.map(g => activityService.deletePublicOpenActivityGuest(activityId, g.id)),
8945
- ...toAdd.map(g => activityService.addPublicOpenActivityGuest(activityId, { name: g.name, comment: g.comment ?? undefined })),
8946
- ...toUpdate.map(g => activityService.updatePublicOpenActivityGuest(activityId, g.id, { name: g.name, comment: g.comment ?? undefined })),
8947
- ];
8948
- return ops.length > 0 ? forkJoin(ops) : of(null);
8949
- }
8950
8927
 
8951
8928
  class AuthEffects {
8952
8929
  actions$ = inject(Actions);