@internetarchive/donation-monthly-portal 4.0.0 → 5.0.0

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.
@@ -6,7 +6,6 @@ import './receipts';
6
6
  import type { IauxMgcReceipts } from './receipts';
7
7
  import './presentational/ia-button';
8
8
  import type { MonthlyPlan } from './models/plan';
9
- import './edit-plan-form';
10
9
  export declare type APlanUpdate = {
11
10
  plan?: MonthlyPlan;
12
11
  donationId?: string;
@@ -20,12 +19,14 @@ export declare class MonthlyGivingCircle extends LitElement {
20
19
  updates: APlanUpdate[];
21
20
  plans: never[];
22
21
  editingThisPlan?: MonthlyPlan;
23
- viewToDisplay: 'welcome' | 'receipts' | 'plans' | 'editPlan';
22
+ viewToDisplay: 'welcome' | 'receipts' | 'plans';
24
23
  protected createRenderRoot(): this;
25
24
  updated(changed: PropertyValues): void;
25
+ protected render(): TemplateResult<1>;
26
26
  get receiptListElement(): IauxMgcReceipts;
27
27
  updateReceived(update: APlanUpdate): void;
28
- protected render(): TemplateResult<1>;
28
+ get currentView(): TemplateResult;
29
+ get receiptsView(): TemplateResult;
30
+ get plansView(): TemplateResult;
29
31
  get sectionTitle(): TemplateResult;
30
- get nonEditView(): TemplateResult;
31
32
  }
@@ -7,7 +7,6 @@ import './plans';
7
7
  import './presentational/mgc-title';
8
8
  import './receipts';
9
9
  import './presentational/ia-button';
10
- import './edit-plan-form';
11
10
  let MonthlyGivingCircle = class MonthlyGivingCircle extends LitElement {
12
11
  constructor() {
13
12
  super(...arguments);
@@ -25,51 +24,49 @@ let MonthlyGivingCircle = class MonthlyGivingCircle extends LitElement {
25
24
  this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';
26
25
  }
27
26
  }
27
+ render() {
28
+ return html ` ${this.sectionTitle} ${this.currentView} `;
29
+ }
28
30
  get receiptListElement() {
29
31
  return this.querySelector('ia-mgc-receipts');
30
32
  }
31
33
  /* Update Callback */
32
34
  updateReceived(update) {
33
- var _a, _b;
35
+ var _a;
34
36
  // log update
35
37
  this.updates.unshift(update);
36
38
  const { plan, donationId = '' } = update;
37
39
  const idToUse = (_a = plan === null || plan === void 0 ? void 0 : plan.id) !== null && _a !== void 0 ? _a : donationId;
38
- const editingPlanIsUpdating = ((_b = this.editingThisPlan) === null || _b === void 0 ? void 0 : _b.id) === idToUse;
39
- if (editingPlanIsUpdating) {
40
- console.log('edit received, mismatch plans', {
41
- planCurrentlyEditing: this.editingThisPlan,
42
- planReceived: update.plan,
43
- });
44
- return;
45
- }
46
- if (plan === null || plan === void 0 ? void 0 : plan.hasBeenCancelled) {
47
- this.editingThisPlan = undefined;
48
- this.viewToDisplay = 'plans';
49
- return;
50
- }
51
40
  this.receiptListElement.emailSent({
52
41
  id: idToUse,
53
42
  emailStatus: update.status,
54
43
  });
55
44
  }
56
45
  /* VIEWS */
57
- render() {
58
- const isEditingPlan = this.viewToDisplay === 'editPlan' && this.editingThisPlan;
59
- return html `
60
- ${this.sectionTitle}
61
- ${isEditingPlan
62
- ? html `<ia-mgc-edit-plan
63
- .plan=${this.editingThisPlan}
64
- .cancelPlanHandler=${(plan) => {
65
- console.log('cancelPlan', plan);
66
- this.dispatchEvent(new CustomEvent('cancelPlan', {
67
- detail: { plan },
68
- }));
69
- }}
70
- ></ia-mgc-edit-plan>`
71
- : this.nonEditView}
72
- `;
46
+ get currentView() {
47
+ if (this.viewToDisplay === 'receipts') {
48
+ return this.receiptsView;
49
+ }
50
+ if (this.viewToDisplay === 'plans' && this.plans.length) {
51
+ return this.plansView;
52
+ }
53
+ return html `<ia-mgc-welcome
54
+ .patronName=${this.patronName}
55
+ ></ia-mgc-welcome>`;
56
+ }
57
+ get receiptsView() {
58
+ return html ` <ia-mgc-receipts
59
+ .receipts=${this.receipts}
60
+ @EmailReceiptRequest=${(event) => {
61
+ console.log('EmailReceiptRequest', event.detail);
62
+ this.dispatchEvent(new CustomEvent('EmailReceiptRequest', {
63
+ detail: { ...event.detail },
64
+ }));
65
+ }}
66
+ ></ia-mgc-receipts>`;
67
+ }
68
+ get plansView() {
69
+ return html ` <ia-mgc-plans .plans=${this.plans}></ia-mgc-plans> `;
73
70
  }
74
71
  get sectionTitle() {
75
72
  let title = '';
@@ -104,22 +101,6 @@ let MonthlyGivingCircle = class MonthlyGivingCircle extends LitElement {
104
101
  }}
105
102
  >
106
103
  Back to account settings
107
- </ia-button>`;
108
- break;
109
- case 'editPlan':
110
- title = 'Edit plan';
111
- titleStyle = 'default';
112
- cta = html `<ia-button
113
- class="primary"
114
- id="close-edit-plan"
115
- .clickHandler=${async () => {
116
- this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';
117
- this.dispatchEvent(new CustomEvent('ShowWelcome'));
118
- this.updates = [];
119
- await this.updateComplete;
120
- }}
121
- >
122
- Back to account settings
123
104
  </ia-button>`;
124
105
  break;
125
106
  default:
@@ -137,38 +118,6 @@ let MonthlyGivingCircle = class MonthlyGivingCircle extends LitElement {
137
118
  </ia-mgc-title>
138
119
  `;
139
120
  }
140
- get nonEditView() {
141
- if (this.viewToDisplay === 'receipts') {
142
- return html `
143
- <ia-mgc-receipts
144
- .receipts=${this.receipts}
145
- @EmailReceiptRequest=${(event) => {
146
- console.log('EmailReceiptRequest', event.detail);
147
- this.dispatchEvent(new CustomEvent('EmailReceiptRequest', {
148
- detail: { ...event.detail },
149
- }));
150
- }}
151
- ></ia-mgc-receipts>
152
- `;
153
- }
154
- return html `
155
- ${this.viewToDisplay === 'plans' && this.plans.length
156
- ? html `
157
- <ia-mgc-plans
158
- @editThisPlan=${async (event) => {
159
- this.editingThisPlan = event.detail.plan;
160
- this.viewToDisplay = 'editPlan';
161
- this.dispatchEvent(new Event('ShowEditForm'));
162
- await this.updateComplete;
163
- }}
164
- .plans=${this.plans}
165
- ></ia-mgc-plans>
166
- `
167
- : html `<ia-mgc-welcome
168
- .patronName=${this.patronName}
169
- ></ia-mgc-welcome>`}
170
- `;
171
- }
172
121
  };
173
122
  __decorate([
174
123
  property({ type: String })
@@ -1 +1 @@
1
- {"version":3,"file":"monthly-giving-circle.js","sourceRoot":"","sources":["../../src/monthly-giving-circle.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-debugger */\n\nimport { LitElement, html, TemplateResult, PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport './welcome-message';\nimport './plans';\nimport './presentational/mgc-title';\nimport './receipts';\nimport type { IauxMgcReceipts } from './receipts';\nimport './presentational/ia-button';\nimport type { MonthlyPlan } from './models/plan';\nimport './edit-plan-form';\n\nexport type APlanUpdate = {\n plan?: MonthlyPlan;\n donationId?: string;\n status: 'success' | 'fail';\n action: 'receiptSent' | 'cancel';\n message: string;\n};\n\n@customElement('ia-monthly-giving-circle')\nexport class MonthlyGivingCircle extends LitElement {\n @property({ type: String }) patronName: string = '';\n\n @property({ type: Array }) receipts = [];\n\n @property({ type: Array }) updates: APlanUpdate[] = [];\n\n @property({ type: Array }) plans = [];\n\n @property({ type: Object }) editingThisPlan?: MonthlyPlan;\n\n @property({ type: String, reflect: true }) viewToDisplay:\n | 'welcome'\n | 'receipts'\n | 'plans'\n | 'editPlan' = 'welcome';\n\n protected createRenderRoot() {\n return this;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('plans')) {\n this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';\n }\n }\n\n get receiptListElement(): IauxMgcReceipts {\n return this.querySelector('ia-mgc-receipts') as IauxMgcReceipts;\n }\n\n /* Update Callback */\n updateReceived(update: APlanUpdate) {\n // log update\n this.updates.unshift(update);\n\n const { plan, donationId = '' } = update;\n const idToUse = plan?.id ?? donationId;\n const editingPlanIsUpdating = this.editingThisPlan?.id === idToUse;\n\n if (editingPlanIsUpdating) {\n console.log('edit received, mismatch plans', {\n planCurrentlyEditing: this.editingThisPlan,\n planReceived: update.plan,\n });\n return;\n }\n\n if (plan?.hasBeenCancelled) {\n this.editingThisPlan = undefined;\n this.viewToDisplay = 'plans';\n return;\n }\n\n this.receiptListElement.emailSent({\n id: idToUse,\n emailStatus: update.status,\n });\n }\n\n /* VIEWS */\n protected render() {\n const isEditingPlan =\n this.viewToDisplay === 'editPlan' && this.editingThisPlan;\n return html`\n ${this.sectionTitle}\n ${isEditingPlan\n ? html`<ia-mgc-edit-plan\n .plan=${this.editingThisPlan}\n .cancelPlanHandler=${(plan: MonthlyPlan) => {\n console.log('cancelPlan', plan);\n this.dispatchEvent(\n new CustomEvent('cancelPlan', {\n detail: { plan },\n })\n );\n }}\n ></ia-mgc-edit-plan>`\n : this.nonEditView}\n `;\n }\n\n get sectionTitle(): TemplateResult {\n let title = '';\n let titleStyle = '';\n let cta = html``;\n\n const receiptsCTA = html`\n <ia-button\n class=\"link slim\"\n .clickHandler=${async () => {\n this.viewToDisplay = 'receipts';\n await this.updateComplete;\n this.dispatchEvent(new CustomEvent('ShowReceipts'));\n }}\n >\n View recent donation history\n </ia-button>\n `;\n\n const displayReceiptsLink =\n this.receipts.length &&\n (this.viewToDisplay === 'plans' || this.viewToDisplay === 'welcome');\n\n switch (this.viewToDisplay) {\n case 'receipts':\n title = 'Recent donations';\n titleStyle = 'default';\n cta = html`<ia-button\n class=\"link slim\"\n id=\"close-receipts\"\n .clickHandler=${async () => {\n this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';\n this.dispatchEvent(new CustomEvent('ShowWelcome'));\n this.updates = [];\n await this.updateComplete;\n }}\n >\n Back to account settings\n </ia-button>`;\n break;\n\n case 'editPlan':\n title = 'Edit plan';\n titleStyle = 'default';\n cta = html`<ia-button\n class=\"primary\"\n id=\"close-edit-plan\"\n .clickHandler=${async () => {\n this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';\n this.dispatchEvent(new CustomEvent('ShowWelcome'));\n this.updates = [];\n await this.updateComplete;\n }}\n >\n Back to account settings\n </ia-button>`;\n break;\n\n default:\n title = 'Monthly Giving Circle';\n titleStyle = 'heart';\n if (displayReceiptsLink) {\n cta = receiptsCTA;\n }\n break;\n }\n\n return html`\n <ia-mgc-title titleStyle=${titleStyle}>\n <span slot=\"title\">${title}</span>\n <span slot=\"action\">${cta}</span>\n </ia-mgc-title>\n `;\n }\n\n get nonEditView(): TemplateResult {\n if (this.viewToDisplay === 'receipts') {\n return html`\n <ia-mgc-receipts\n .receipts=${this.receipts}\n @EmailReceiptRequest=${(event: CustomEvent) => {\n console.log('EmailReceiptRequest', event.detail);\n this.dispatchEvent(\n new CustomEvent('EmailReceiptRequest', {\n detail: { ...event.detail },\n })\n );\n }}\n ></ia-mgc-receipts>\n `;\n }\n\n return html`\n ${this.viewToDisplay === 'plans' && this.plans.length\n ? html`\n <ia-mgc-plans\n @editThisPlan=${async (event: CustomEvent) => {\n this.editingThisPlan = event.detail.plan;\n this.viewToDisplay = 'editPlan';\n this.dispatchEvent(new Event('ShowEditForm'));\n await this.updateComplete;\n }}\n .plans=${this.plans}\n ></ia-mgc-plans>\n `\n : html`<ia-mgc-welcome\n .patronName=${this.patronName}\n ></ia-mgc-welcome>`}\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"monthly-giving-circle.js","sourceRoot":"","sources":["../../src/monthly-giving-circle.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-debugger */\n\nimport { LitElement, html, TemplateResult, PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport './welcome-message';\nimport './plans';\nimport './presentational/mgc-title';\nimport './receipts';\nimport type { IauxMgcReceipts } from './receipts';\nimport './presentational/ia-button';\nimport type { MonthlyPlan } from './models/plan';\n\nexport type APlanUpdate = {\n plan?: MonthlyPlan;\n donationId?: string;\n status: 'success' | 'fail';\n action: 'receiptSent' | 'cancel';\n message: string;\n};\n\n@customElement('ia-monthly-giving-circle')\nexport class MonthlyGivingCircle extends LitElement {\n @property({ type: String }) patronName: string = '';\n\n @property({ type: Array }) receipts = [];\n\n @property({ type: Array }) updates: APlanUpdate[] = [];\n\n @property({ type: Array }) plans = [];\n\n @property({ type: Object }) editingThisPlan?: MonthlyPlan;\n\n @property({ type: String, reflect: true }) viewToDisplay:\n | 'welcome'\n | 'receipts'\n | 'plans' = 'welcome';\n\n protected createRenderRoot() {\n return this;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('plans')) {\n this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';\n }\n }\n\n protected render() {\n return html` ${this.sectionTitle} ${this.currentView} `;\n }\n\n get receiptListElement(): IauxMgcReceipts {\n return this.querySelector('ia-mgc-receipts') as IauxMgcReceipts;\n }\n\n /* Update Callback */\n updateReceived(update: APlanUpdate) {\n // log update\n this.updates.unshift(update);\n\n const { plan, donationId = '' } = update;\n const idToUse = plan?.id ?? donationId;\n\n this.receiptListElement.emailSent({\n id: idToUse,\n emailStatus: update.status,\n });\n }\n\n /* VIEWS */\n get currentView(): TemplateResult {\n if (this.viewToDisplay === 'receipts') {\n return this.receiptsView;\n }\n\n if (this.viewToDisplay === 'plans' && this.plans.length) {\n return this.plansView;\n }\n\n return html`<ia-mgc-welcome\n .patronName=${this.patronName}\n ></ia-mgc-welcome>`;\n }\n\n get receiptsView(): TemplateResult {\n return html` <ia-mgc-receipts\n .receipts=${this.receipts}\n @EmailReceiptRequest=${(event: CustomEvent) => {\n console.log('EmailReceiptRequest', event.detail);\n this.dispatchEvent(\n new CustomEvent('EmailReceiptRequest', {\n detail: { ...event.detail },\n })\n );\n }}\n ></ia-mgc-receipts>`;\n }\n\n get plansView(): TemplateResult {\n return html` <ia-mgc-plans .plans=${this.plans}></ia-mgc-plans> `;\n }\n\n get sectionTitle(): TemplateResult {\n let title = '';\n let titleStyle = '';\n let cta = html``;\n\n const receiptsCTA = html`\n <ia-button\n class=\"link slim\"\n .clickHandler=${async () => {\n this.viewToDisplay = 'receipts';\n await this.updateComplete;\n this.dispatchEvent(new CustomEvent('ShowReceipts'));\n }}\n >\n View recent donation history\n </ia-button>\n `;\n\n const displayReceiptsLink =\n this.receipts.length &&\n (this.viewToDisplay === 'plans' || this.viewToDisplay === 'welcome');\n\n switch (this.viewToDisplay) {\n case 'receipts':\n title = 'Recent donations';\n titleStyle = 'default';\n cta = html`<ia-button\n class=\"link slim\"\n id=\"close-receipts\"\n .clickHandler=${async () => {\n this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';\n this.dispatchEvent(new CustomEvent('ShowWelcome'));\n this.updates = [];\n await this.updateComplete;\n }}\n >\n Back to account settings\n </ia-button>`;\n break;\n\n default:\n title = 'Monthly Giving Circle';\n titleStyle = 'heart';\n if (displayReceiptsLink) {\n cta = receiptsCTA;\n }\n break;\n }\n\n return html`\n <ia-mgc-title titleStyle=${titleStyle}>\n <span slot=\"title\">${title}</span>\n <span slot=\"action\">${cta}</span>\n </ia-mgc-title>\n `;\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { LitElement } from 'lit';
2
- import './presentational/ia-button';
3
2
  export declare class IauxMgcPlans extends LitElement {
4
3
  plans: never[];
4
+ mailToText(): string;
5
5
  protected render(): import("lit").TemplateResult<1>;
6
6
  static styles: import("lit").CSSResult;
7
7
  }
package/dist/src/plans.js CHANGED
@@ -2,12 +2,14 @@ import { __decorate } from "tslib";
2
2
  /* eslint-disable no-param-reassign */
3
3
  import { LitElement, html, css, nothing } from 'lit';
4
4
  import { customElement, property } from 'lit/decorators.js';
5
- import './presentational/ia-button';
6
5
  let IauxMgcPlans = class IauxMgcPlans extends LitElement {
7
6
  constructor() {
8
7
  super(...arguments);
9
8
  this.plans = [];
10
9
  }
10
+ mailToText() {
11
+ return `mailto:donations@archive.org?subject=I'd like to update my monthly donation`;
12
+ }
11
13
  render() {
12
14
  return html `
13
15
  <section class="monthly-giving-circle">
@@ -22,9 +24,6 @@ let IauxMgcPlans = class IauxMgcPlans extends LitElement {
22
24
  const last4 = ((_e = plan.payment) === null || _e === void 0 ? void 0 : _e.last4)
23
25
  ? `...${(_f = plan.payment) === null || _f === void 0 ? void 0 : _f.last4}`
24
26
  : 'CC number not found';
25
- const ctaText = plan.plan.isCancelled
26
- ? 'Plan is cancelled'
27
- : 'Manage this monthly donation';
28
27
  return html `
29
28
  <li class=${`${plan.plan.isCancelled ? 'cancelled' : ''}`}>
30
29
  <div class="info">
@@ -73,18 +72,10 @@ let IauxMgcPlans = class IauxMgcPlans extends LitElement {
73
72
  <p>${plan.nextBillingDate}</p>
74
73
  </div>
75
74
  </div>
76
- <ia-button
77
- class="ia-button link edit-donation"
78
- .isDisabled=${plan.plan.isCancelled}
79
- .clickHandler=${async (e, iaButton) => {
80
- // disable button
81
- iaButton.isDisabled = true;
82
- // open form
83
- this.dispatchEvent(new CustomEvent('editThisPlan', { detail: { plan } }));
84
- }}
85
- >
86
- ${ctaText}
87
- </ia-button>
75
+ <p class="email-edit-plan">
76
+ To update your monthly plan, please email us at
77
+ <a href=${this.mailToText}>donations@archive.org</a>.
78
+ </p>
88
79
  </li>
89
80
  `;
90
81
  })}
@@ -170,6 +161,9 @@ IauxMgcPlans.styles = css `
170
161
  margin: 0;
171
162
  }
172
163
 
164
+ p.email-edit-plan {
165
+ margin: 10px 0 0;
166
+ }
173
167
  @media screen and (max-width: 500px) {
174
168
  ul li .info {
175
169
  display: block;
@@ -1 +1 @@
1
- {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/plans.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { MonthlyPlan } from './models/plan';\n\nimport './presentational/ia-button';\nimport type { IauxButton } from './presentational/ia-button';\n\n@customElement('ia-mgc-plans')\nexport class IauxMgcPlans extends LitElement {\n @property({ type: Array }) plans = [];\n\n protected render() {\n return html`\n <section class=\"monthly-giving-circle\">\n <ul>\n ${this.plans.map((plan: MonthlyPlan) => {\n let methodType =\n plan.payment?.paymentMethodType ?? 'Method not found';\n if (methodType === 'creditCard') {\n methodType = 'Credit card';\n }\n const cardType = plan.payment?.cardType ?? 'Card type not found';\n const last4 = plan.payment?.last4\n ? `...${plan.payment?.last4}`\n : 'CC number not found';\n\n const ctaText = plan.plan.isCancelled\n ? 'Plan is cancelled'\n : 'Manage this monthly donation';\n\n return html`\n <li class=${`${plan.plan.isCancelled ? 'cancelled' : ''}`}>\n <div class=\"info\">\n <div class=\"amount\">\n <h3>Amount</h3>\n <p>\n ${plan.currency}\n ${plan.currencySymbol}${plan.amount}/month\n </p>\n ${plan.isTest\n ? html`<p class=\"is-test\">(Test payment)</p>`\n : nothing}\n </div>\n <div class=\"payment-details\">\n <h3>Method</h3>\n <p>${methodType}</p>\n ${plan.payment?.paymentMethodType === 'creditCard'\n ? html`<p>${cardType}</p>\n <p>${last4}</p>`\n : nothing}\n ${plan.payment?.paymentMethodType === 'Paypal'\n ? html`<p>\n Paypal email:\n <a href=${`mailto:${plan.payment?.paypalEmail}`}\n >${plan.payment?.paypalEmail}</a\n >\n </p>`\n : nothing}\n ${plan.payment?.paymentMethodType === 'Venmo'\n ? html`<p>\n Venmo username:\n <a href=${`mailto:${plan.payment?.venmoUsername}`}\n >${plan.payment?.paypalEmail}</a\n >\n </p>`\n : nothing}\n ${plan.payment?.paymentMethodType !== 'creditCard'\n ? html`<p>\n Expires:\n ${plan.payment?.expirationMonth ??\n 'month not found'}/${plan.payment?.expirationYear ??\n 'year not found'}\n </p>`\n : nothing}\n </div>\n <div class=\"next-donation\">\n <h3>Next Donation</h3>\n <p>${plan.nextBillingDate}</p>\n </div>\n </div>\n <ia-button\n class=\"ia-button link edit-donation\"\n .isDisabled=${plan.plan.isCancelled}\n .clickHandler=${async (e: Event, iaButton: IauxButton) => {\n // disable button\n iaButton.isDisabled = true;\n // open form\n this.dispatchEvent(\n new CustomEvent('editThisPlan', { detail: { plan } })\n );\n }}\n >\n ${ctaText}\n </ia-button>\n </li>\n `;\n })}\n </ul>\n </section>\n `;\n }\n\n static styles = css`\n :host {\n max-height: 500px;\n overflow-y: scroll;\n display: block;\n }\n\n .is-test {\n font-size: 0.8rem;\n }\n\n li {\n border: 1px solid #23765d;\n background-color: #eeffee;\n display: block;\n width: inherit;\n }\n li.cancelled {\n background-color: lightgoldenrodyellow;\n }\n table {\n width: 100%;\n text-align: left;\n max-width: 600px;\n }\n\n ul {\n padding: 0;\n list-style-type: none;\n margin: 0;\n }\n\n ul li {\n border: 1px solid #23765d;\n background-color: #eeffee;\n margin: 0.5rem 0;\n padding: 0.5rem 0.5rem 1rem 0.5rem;\n position: relative;\n }\n\n ul li button.edit-donation {\n height: 30px;\n display: block;\n position: absolute;\n bottom: 0;\n }\n\n ul li .info {\n display: grid;\n min-height: 90px;\n grid-template-columns: 0.5fr 1fr 0.5fr;\n grid-template-rows: 1fr;\n gap: 0px 5px;\n grid-auto-flow: row;\n grid-template-areas: 'amount details next-donation';\n }\n\n ul li .info .amount {\n grid-area: amount;\n }\n\n ul li .info .payment-details {\n grid-area: details;\n }\n\n ul li .info .next-donation {\n grid-area: next-donation;\n }\n\n ul li .info > * {\n margin: 0 0 0.5rem 0;\n }\n\n ul li .info > * > * {\n margin: 0;\n }\n\n @media screen and (max-width: 500px) {\n ul li .info {\n display: block;\n }\n }\n `;\n}\n"]}
1
+ {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/plans.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { MonthlyPlan } from './models/plan';\n\n@customElement('ia-mgc-plans')\nexport class IauxMgcPlans extends LitElement {\n @property({ type: Array }) plans = [];\n\n mailToText(): string {\n return `mailto:donations@archive.org?subject=I'd like to update my monthly donation`;\n }\n\n protected render() {\n return html`\n <section class=\"monthly-giving-circle\">\n <ul>\n ${this.plans.map((plan: MonthlyPlan) => {\n let methodType =\n plan.payment?.paymentMethodType ?? 'Method not found';\n if (methodType === 'creditCard') {\n methodType = 'Credit card';\n }\n const cardType = plan.payment?.cardType ?? 'Card type not found';\n const last4 = plan.payment?.last4\n ? `...${plan.payment?.last4}`\n : 'CC number not found';\n\n return html`\n <li class=${`${plan.plan.isCancelled ? 'cancelled' : ''}`}>\n <div class=\"info\">\n <div class=\"amount\">\n <h3>Amount</h3>\n <p>\n ${plan.currency}\n ${plan.currencySymbol}${plan.amount}/month\n </p>\n ${plan.isTest\n ? html`<p class=\"is-test\">(Test payment)</p>`\n : nothing}\n </div>\n <div class=\"payment-details\">\n <h3>Method</h3>\n <p>${methodType}</p>\n ${plan.payment?.paymentMethodType === 'creditCard'\n ? html`<p>${cardType}</p>\n <p>${last4}</p>`\n : nothing}\n ${plan.payment?.paymentMethodType === 'Paypal'\n ? html`<p>\n Paypal email:\n <a href=${`mailto:${plan.payment?.paypalEmail}`}\n >${plan.payment?.paypalEmail}</a\n >\n </p>`\n : nothing}\n ${plan.payment?.paymentMethodType === 'Venmo'\n ? html`<p>\n Venmo username:\n <a href=${`mailto:${plan.payment?.venmoUsername}`}\n >${plan.payment?.paypalEmail}</a\n >\n </p>`\n : nothing}\n ${plan.payment?.paymentMethodType !== 'creditCard'\n ? html`<p>\n Expires:\n ${plan.payment?.expirationMonth ??\n 'month not found'}/${plan.payment?.expirationYear ??\n 'year not found'}\n </p>`\n : nothing}\n </div>\n <div class=\"next-donation\">\n <h3>Next Donation</h3>\n <p>${plan.nextBillingDate}</p>\n </div>\n </div>\n <p class=\"email-edit-plan\">\n To update your monthly plan, please email us at\n <a href=${this.mailToText}>donations@archive.org</a>.\n </p>\n </li>\n `;\n })}\n </ul>\n </section>\n `;\n }\n\n static styles = css`\n :host {\n max-height: 500px;\n overflow-y: scroll;\n display: block;\n }\n\n .is-test {\n font-size: 0.8rem;\n }\n\n li {\n border: 1px solid #23765d;\n background-color: #eeffee;\n display: block;\n width: inherit;\n }\n li.cancelled {\n background-color: lightgoldenrodyellow;\n }\n table {\n width: 100%;\n text-align: left;\n max-width: 600px;\n }\n\n ul {\n padding: 0;\n list-style-type: none;\n margin: 0;\n }\n\n ul li {\n border: 1px solid #23765d;\n background-color: #eeffee;\n margin: 0.5rem 0;\n padding: 0.5rem 0.5rem 1rem 0.5rem;\n position: relative;\n }\n\n ul li button.edit-donation {\n height: 30px;\n display: block;\n position: absolute;\n bottom: 0;\n }\n\n ul li .info {\n display: grid;\n min-height: 90px;\n grid-template-columns: 0.5fr 1fr 0.5fr;\n grid-template-rows: 1fr;\n gap: 0px 5px;\n grid-auto-flow: row;\n grid-template-areas: 'amount details next-donation';\n }\n\n ul li .info .amount {\n grid-area: amount;\n }\n\n ul li .info .payment-details {\n grid-area: details;\n }\n\n ul li .info .next-donation {\n grid-area: next-donation;\n }\n\n ul li .info > * {\n margin: 0 0 0.5rem 0;\n }\n\n ul li .info > * > * {\n margin: 0;\n }\n\n p.email-edit-plan {\n margin: 10px 0 0;\n }\n @media screen and (max-width: 500px) {\n ul li .info {\n display: block;\n }\n }\n `;\n}\n"]}
@@ -118,7 +118,7 @@ let IauxMgcReceipts = class IauxMgcReceipts extends LitElement {
118
118
  <ia-button
119
119
  class="link slim"
120
120
  style="--link-button-flex-align-items: center;"
121
- .clickHandler=${async (iauxButton) => {
121
+ .clickHandler=${async (e, iauxButton) => {
122
122
  const initialClick = !emailUnavailable;
123
123
  if (initialClick) {
124
124
  // eslint-disable-next-line no-param-reassign
@@ -1 +1 @@
1
- {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/receipts.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { LitElement, html, css, PropertyValues, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { Receipt } from './models/receipt';\n\nimport './presentational/ia-button';\nimport type { IauxButton } from './presentational/ia-button';\n\ntype ReceiptEmailStatus = {\n id: string;\n emailStatus: 'success' | 'fail' | 'pending' | '';\n};\n\ntype receiptDispatcherMap = {\n [id: string]: ReceiptEmailStatus;\n};\n\n@customElement('ia-mgc-receipts')\nexport class IauxMgcReceipts extends LitElement {\n @property({ type: Array }) receipts = [];\n\n @property({ type: Object })\n receiptDispatcher: receiptDispatcherMap | null = null;\n\n shouldUpdate(changed: PropertyValues) {\n if (changed.has('receiptDispatcher')) {\n return true;\n }\n return false;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('receipts')) {\n this.updateReceiptSentMap();\n }\n if (changed.has('receiptDispatcher')) {\n console.log('receiptDispatcher UPDATED ---- ', this.receiptDispatcher);\n }\n }\n\n updateReceiptSentMap() {\n if (!this.receipts.length) {\n this.receiptDispatcher = null;\n } else {\n const receiptDispatcher: receiptDispatcherMap = {};\n this.receipts.forEach((receipt: Receipt) => {\n receiptDispatcher[receipt.id] = {\n id: receipt.id,\n emailStatus: '',\n };\n });\n this.receiptDispatcher = receiptDispatcher;\n }\n }\n\n emailReceipt(receipt: Receipt) {\n this.dispatchEvent(\n new CustomEvent('EmailReceiptRequest', {\n detail: {\n donation: receipt,\n },\n })\n );\n }\n\n /** callback that confirms status of an receipt email request */\n async emailSent(receiptEmailed: ReceiptEmailStatus) {\n const currStatusMap = this.receiptDispatcher;\n this.receiptDispatcher = null;\n await this.updateComplete;\n const statusMap = {\n ...currStatusMap,\n } as receiptDispatcherMap;\n const { id } = receiptEmailed;\n statusMap[id] = receiptEmailed;\n\n this.receiptDispatcher = { ...statusMap };\n console.log(\n 'RECEIPTS -- emailSent',\n this.receiptDispatcher,\n receiptEmailed\n );\n\n // re-enable email request button\n const escapedId = CSS.escape(id);\n const button = this.shadowRoot?.querySelector(\n `#donation-${escapedId} ia-button`\n ) as IauxButton;\n button.isDisabled = false;\n }\n\n /* renderings */\n emailStatusMessageToDisplay(receiptSentStatus: ReceiptEmailStatus): string {\n switch (receiptSentStatus.emailStatus) {\n case 'success':\n return '✓ Sent';\n case 'fail':\n return '✖ Failed';\n default:\n return '';\n }\n }\n\n ctaButtonText(donation: Receipt, emailStatus?: ReceiptEmailStatus) {\n if (emailStatus?.emailStatus === 'pending') {\n return 'Sending...';\n }\n\n return 'Email receipt';\n }\n\n protected render() {\n return html`\n <section id=\"recent-donations-list\">\n <table>\n <tr>\n <th class=\"date\">Date</th>\n <th class=\"amount\">Amount</th>\n <th class=\"action\">Action</th>\n </tr>\n ${this.receipts.length\n ? this.receipts.map((donation: Receipt) => {\n const emailStatus = this.receiptDispatcher?.[donation.id];\n\n const emailUnavailable = emailStatus?.emailStatus === 'pending';\n const emailStatusToDisplay =\n !emailStatus || !emailStatus.emailStatus\n ? nothing\n : html`<span\n class=${`sent-status ${emailStatus.emailStatus}`}\n >${this.emailStatusMessageToDisplay(emailStatus)}</span\n >`;\n return html`\n <tr\n id=${`donation-${donation.id}`}\n class=${`${donation.isTest ? 'test' : ''}`}\n >\n <td>\n <div class=\"donation-date\">${donation.date}</div>\n </td>\n <td>\n <div class=\"donation-amount\">\n ${donation.amountFormatted}\n </div>\n </td>\n <td>\n <div class=\"request-receipt\">\n <ia-button\n class=\"link slim\"\n style=\"--link-button-flex-align-items: center;\"\n .clickHandler=${async (iauxButton: IauxButton) => {\n const initialClick = !emailUnavailable;\n if (initialClick) {\n // eslint-disable-next-line no-param-reassign\n iauxButton.isDisabled = true;\n await iauxButton.updateComplete;\n }\n\n if (emailUnavailable) return;\n this.emailReceipt(donation);\n if (this.receiptDispatcher) {\n const statusMap = {\n ...this.receiptDispatcher,\n } as receiptDispatcherMap;\n statusMap[donation.id].emailStatus = 'pending';\n this.receiptDispatcher = statusMap;\n }\n }}\n >\n ${this.ctaButtonText(donation, emailStatus)}\n </ia-button>\n ${emailStatusToDisplay}\n </div>\n </td>\n </tr>\n `;\n })\n : html`<p>No recent donations found</p>`}\n </table>\n </section>\n `;\n }\n\n static styles = css`\n table {\n text-align: left;\n table-layout: fixed;\n min-width: 600px;\n }\n\n button {\n padding: 1rem 0;\n }\n\n td {\n padding: 0;\n }\n\n th.date {\n width: 55px;\n }\n th.amount {\n width: 55px;\n }\n th.action {\n width: 200px;\n }\n ia-button-style {\n display: inline-block;\n }\n\n .request-receipt {\n display: flex;\n flex-wrap: nowrap;\n align-content: center;\n justify-content: flex-start;\n align-items: center;\n gap: 10px;\n }\n\n .sent-status.success,\n .sent-status.fail {\n padding: 5px;\n background: rgb(238, 253, 238);\n width: 55px;\n min-height: 20px;\n }\n .sent-status.success {\n color: rgb(33, 149, 24);\n border-left: 5px solid rgb(33, 149, 24);\n }\n .sent-status.fail {\n color: #bb0505;\n border-left: 5px solid #bb0505;\n }\n `;\n}\n"]}
1
+ {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/receipts.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { LitElement, html, css, PropertyValues, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { Receipt } from './models/receipt';\n\nimport './presentational/ia-button';\nimport type { IauxButton } from './presentational/ia-button';\n\ntype ReceiptEmailStatus = {\n id: string;\n emailStatus: 'success' | 'fail' | 'pending' | '';\n};\n\ntype receiptDispatcherMap = {\n [id: string]: ReceiptEmailStatus;\n};\n\n@customElement('ia-mgc-receipts')\nexport class IauxMgcReceipts extends LitElement {\n @property({ type: Array }) receipts = [];\n\n @property({ type: Object })\n receiptDispatcher: receiptDispatcherMap | null = null;\n\n shouldUpdate(changed: PropertyValues) {\n if (changed.has('receiptDispatcher')) {\n return true;\n }\n return false;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('receipts')) {\n this.updateReceiptSentMap();\n }\n if (changed.has('receiptDispatcher')) {\n console.log('receiptDispatcher UPDATED ---- ', this.receiptDispatcher);\n }\n }\n\n updateReceiptSentMap() {\n if (!this.receipts.length) {\n this.receiptDispatcher = null;\n } else {\n const receiptDispatcher: receiptDispatcherMap = {};\n this.receipts.forEach((receipt: Receipt) => {\n receiptDispatcher[receipt.id] = {\n id: receipt.id,\n emailStatus: '',\n };\n });\n this.receiptDispatcher = receiptDispatcher;\n }\n }\n\n emailReceipt(receipt: Receipt) {\n this.dispatchEvent(\n new CustomEvent('EmailReceiptRequest', {\n detail: {\n donation: receipt,\n },\n })\n );\n }\n\n /** callback that confirms status of an receipt email request */\n async emailSent(receiptEmailed: ReceiptEmailStatus) {\n const currStatusMap = this.receiptDispatcher;\n this.receiptDispatcher = null;\n await this.updateComplete;\n const statusMap = {\n ...currStatusMap,\n } as receiptDispatcherMap;\n const { id } = receiptEmailed;\n statusMap[id] = receiptEmailed;\n\n this.receiptDispatcher = { ...statusMap };\n console.log(\n 'RECEIPTS -- emailSent',\n this.receiptDispatcher,\n receiptEmailed\n );\n\n // re-enable email request button\n const escapedId = CSS.escape(id);\n const button = this.shadowRoot?.querySelector(\n `#donation-${escapedId} ia-button`\n ) as IauxButton;\n button.isDisabled = false;\n }\n\n /* renderings */\n emailStatusMessageToDisplay(receiptSentStatus: ReceiptEmailStatus): string {\n switch (receiptSentStatus.emailStatus) {\n case 'success':\n return '✓ Sent';\n case 'fail':\n return '✖ Failed';\n default:\n return '';\n }\n }\n\n ctaButtonText(donation: Receipt, emailStatus?: ReceiptEmailStatus) {\n if (emailStatus?.emailStatus === 'pending') {\n return 'Sending...';\n }\n\n return 'Email receipt';\n }\n\n protected render() {\n return html`\n <section id=\"recent-donations-list\">\n <table>\n <tr>\n <th class=\"date\">Date</th>\n <th class=\"amount\">Amount</th>\n <th class=\"action\">Action</th>\n </tr>\n ${this.receipts.length\n ? this.receipts.map((donation: Receipt) => {\n const emailStatus = this.receiptDispatcher?.[donation.id];\n\n const emailUnavailable = emailStatus?.emailStatus === 'pending';\n const emailStatusToDisplay =\n !emailStatus || !emailStatus.emailStatus\n ? nothing\n : html`<span\n class=${`sent-status ${emailStatus.emailStatus}`}\n >${this.emailStatusMessageToDisplay(emailStatus)}</span\n >`;\n return html`\n <tr\n id=${`donation-${donation.id}`}\n class=${`${donation.isTest ? 'test' : ''}`}\n >\n <td>\n <div class=\"donation-date\">${donation.date}</div>\n </td>\n <td>\n <div class=\"donation-amount\">\n ${donation.amountFormatted}\n </div>\n </td>\n <td>\n <div class=\"request-receipt\">\n <ia-button\n class=\"link slim\"\n style=\"--link-button-flex-align-items: center;\"\n .clickHandler=${async (\n e: Event,\n iauxButton: IauxButton\n ) => {\n const initialClick = !emailUnavailable;\n if (initialClick) {\n // eslint-disable-next-line no-param-reassign\n iauxButton.isDisabled = true;\n await iauxButton.updateComplete;\n }\n\n if (emailUnavailable) return;\n this.emailReceipt(donation);\n if (this.receiptDispatcher) {\n const statusMap = {\n ...this.receiptDispatcher,\n } as receiptDispatcherMap;\n statusMap[donation.id].emailStatus = 'pending';\n this.receiptDispatcher = statusMap;\n }\n }}\n >\n ${this.ctaButtonText(donation, emailStatus)}\n </ia-button>\n ${emailStatusToDisplay}\n </div>\n </td>\n </tr>\n `;\n })\n : html`<p>No recent donations found</p>`}\n </table>\n </section>\n `;\n }\n\n static styles = css`\n table {\n text-align: left;\n table-layout: fixed;\n min-width: 600px;\n }\n\n button {\n padding: 1rem 0;\n }\n\n td {\n padding: 0;\n }\n\n th.date {\n width: 55px;\n }\n th.amount {\n width: 55px;\n }\n th.action {\n width: 200px;\n }\n ia-button-style {\n display: inline-block;\n }\n\n .request-receipt {\n display: flex;\n flex-wrap: nowrap;\n align-content: center;\n justify-content: flex-start;\n align-items: center;\n gap: 10px;\n }\n\n .sent-status.success,\n .sent-status.fail {\n padding: 5px;\n background: rgb(238, 253, 238);\n width: 55px;\n min-height: 20px;\n }\n .sent-status.success {\n color: rgb(33, 149, 24);\n border-left: 5px solid rgb(33, 149, 24);\n }\n .sent-status.fail {\n color: #bb0505;\n border-left: 5px solid #bb0505;\n }\n `;\n}\n"]}
@@ -18,8 +18,7 @@ describe('IauxMonthlyGivingCircle', () => {
18
18
  expect(joinLink.href).to.equal('https://archive.org/donate/?amt=5&contrib_type=monthly&origin=iawww-usrsttng');
19
19
  });
20
20
  describe('Plans View:', () => {
21
- it('displays list & shows form', async () => {
22
- var _a, _b;
21
+ it('displays list', async () => {
23
22
  const el = await fixture(html `<ia-monthly-giving-circle
24
23
  .plans=${[
25
24
  new MonthlyPlan({
@@ -48,21 +47,6 @@ describe('IauxMonthlyGivingCircle', () => {
48
47
  ></ia-monthly-giving-circle>`);
49
48
  expect(el.viewToDisplay).to.equal('plans');
50
49
  expect(el.plans.length).to.equal(1);
51
- // displays edit plan form
52
- el.addEventListener('ShowEditForm', () => {
53
- expect(el.viewToDisplay).to.equal('editPlan');
54
- });
55
- const mgcPlans = el.querySelector('ia-mgc-plans');
56
- expect(mgcPlans).to.exist;
57
- const editPlanButton = (_a = mgcPlans.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('ia-button.edit-donation');
58
- expect(editPlanButton).to.exist;
59
- const innerButton = (_b = editPlanButton.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('button');
60
- expect(innerButton).to.exist;
61
- innerButton.click();
62
- await el.updateComplete;
63
- expect(el.viewToDisplay).to.equal('editPlan');
64
- const editPlanForm = el.querySelector('ia-mgc-edit-plan');
65
- expect(editPlanForm).to.exist;
66
50
  });
67
51
  });
68
52
  describe('Receipts View - CTA & onclick display:', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"monthly-giving-circle.test.js","sourceRoot":"","sources":["../../test/monthly-giving-circle.test.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport { html, fixture, expect } from '@open-wc/testing';\n\nimport type { MonthlyGivingCircle } from '../src/monthly-giving-circle';\n\nimport '../src/monthly-giving-circle';\nimport type { IauxButton } from '../src/presentational/ia-button';\nimport { MonthlyPlan } from '../src/models/plan';\n\ndescribe('IauxMonthlyGivingCircle', () => {\n it('displays welcome message on load', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle></ia-monthly-giving-circle>`\n );\n\n expect(el.viewToDisplay).to.equal('welcome');\n\n const titleEl = el.querySelector('ia-mgc-title');\n expect(titleEl).to.not.be.null;\n expect(titleEl!.getAttribute('titlestyle')).to.equal('heart');\n expect(titleEl!.children.length).to.equal(2);\n expect((titleEl!.children[0] as HTMLElement).innerText).to.equal(\n 'Monthly Giving Circle'\n );\n\n const welcomeEl = el.querySelector('ia-mgc-welcome');\n const joinLink = welcomeEl!.shadowRoot?.querySelector(\n 'a.join-mgc'\n ) as HTMLAnchorElement;\n expect(joinLink).to.not.be.null;\n expect(joinLink.href).to.equal(\n 'https://archive.org/donate/?amt=5&contrib_type=monthly&origin=iawww-usrsttng'\n );\n });\n\n describe('Plans View:', () => {\n it('displays list & shows form', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle\n .plans=${[\n new MonthlyPlan({\n token: 'a.va.lid.T0ken',\n amount: 5,\n currency: 'USD',\n start_date: '2024-07-01 00:00:00',\n is_test: true,\n btdata: {\n billingDayOfMonth: 22,\n nextBillingDate: {\n date: '2024-08-22 00:00:00.000000',\n timezone_type: 3,\n timezone: 'UTC',\n },\n status: 'Active',\n paymentMethodType: 'Venmo',\n last4: null,\n cardType: null,\n expirationMonth: null,\n expirationYear: null,\n venmoUsername: 'venmojoe',\n },\n }),\n ]}\n ></ia-monthly-giving-circle>`\n );\n\n expect(el.viewToDisplay).to.equal('plans');\n expect(el.plans.length).to.equal(1);\n\n // displays edit plan form\n el.addEventListener('ShowEditForm', () => {\n expect(el.viewToDisplay).to.equal('editPlan');\n });\n\n const mgcPlans = el.querySelector('ia-mgc-plans');\n expect(mgcPlans).to.exist;\n\n const editPlanButton = mgcPlans!.shadowRoot?.querySelector(\n 'ia-button.edit-donation'\n ) as IauxButton;\n expect(editPlanButton).to.exist;\n const innerButton = editPlanButton.shadowRoot?.querySelector('button');\n expect(innerButton).to.exist;\n innerButton!.click();\n\n await el.updateComplete;\n\n expect(el.viewToDisplay).to.equal('editPlan');\n\n const editPlanForm = el.querySelector('ia-mgc-edit-plan');\n expect(editPlanForm).to.exist;\n });\n });\n\n describe('Receipts View - CTA & onclick display:', () => {\n it('Displays receipts CTA when receipts are available', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle\n .receipts=${[\n {\n amount: 9999.99,\n date: '2020-09-01',\n donor: 'John Doe',\n paymentMethod: 'Credit Card',\n status: 'Completed',\n id: 'foo-id-1',\n },\n ]}\n ></ia-monthly-giving-circle>`\n );\n\n const titleEl = el.querySelector('ia-mgc-title');\n const receiptsButton = titleEl!.querySelector('ia-button') as IauxButton;\n expect(receiptsButton).to.exist;\n expect(receiptsButton!.innerText).to.equal(\n 'View recent donation history'\n );\n\n el.receipts = [];\n await el.updateComplete;\n\n const newTitleEl = el.querySelector('ia-mgc-title');\n expect(newTitleEl).to.exist;\n\n const newReceiptsButton = newTitleEl!.querySelector('button');\n expect(newReceiptsButton).to.not.exist;\n });\n\n it('Display receipts table when receipts CTA is clicked', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle\n .receipts=${[\n {\n amount: 9999.99,\n date: '2020-09-01',\n donor: 'John Doe',\n paymentMethod: 'Credit Card',\n status: 'Completed',\n id: 'foo-id-1',\n },\n ]}\n ></ia-monthly-giving-circle>`\n );\n\n const titleEl = el.querySelector('ia-mgc-title');\n expect(titleEl).to.exist;\n\n const receiptsButton = titleEl!.querySelector('ia-button') as IauxButton;\n\n expect(receiptsButton.innerText).to.equal('View recent donation history');\n\n const innerButton = receiptsButton.shadowRoot?.querySelector(\n 'button'\n ) as HTMLButtonElement;\n innerButton.click();\n\n await el.updateComplete;\n\n expect(el.viewToDisplay).to.equal('receipts');\n\n const welcomeEl = el.querySelector('ia-mgc-welcome');\n expect(welcomeEl).to.not.exist;\n\n // shows proper title\n const titleEl2 = el.querySelector('ia-mgc-title');\n expect(titleEl2).to.exist;\n expect(titleEl2!.getAttribute('titlestyle')).to.equal('default');\n const titleValueEl = titleEl2?.querySelector(\n 'span[slot=\"title\"]'\n ) as HTMLSpanElement;\n expect(titleValueEl).to.exist;\n expect(titleValueEl.innerText).to.equal('Recent donations');\n\n // shows back button\n const backButton = titleEl2?.querySelector(\n 'ia-button#close-receipts'\n ) as IauxButton;\n expect(backButton!.innerText).to.equal('Back to account settings');\n\n // shows receipts element\n const receiptsEl = el.querySelector('ia-mgc-receipts');\n expect(receiptsEl).to.exist;\n\n // goes back to welcome page if back button is clicked\n // dig into the shadowRoot to get the button\n backButton.shadowRoot?.querySelector('button')?.click();\n await el.updateComplete;\n\n expect(el.viewToDisplay).to.equal('welcome');\n\n const titleEl3 = el.querySelector('ia-mgc-title');\n expect(titleEl3).to.exist;\n expect(titleEl3!.getAttribute('titlestyle')).to.equal('heart');\n const welcomeTitle = titleEl3?.querySelector(\n 'span[slot=\"title\"]'\n ) as HTMLSpanElement;\n expect(welcomeTitle.innerText).to.equal('Monthly Giving Circle');\n });\n });\n});\n"]}
1
+ {"version":3,"file":"monthly-giving-circle.test.js","sourceRoot":"","sources":["../../test/monthly-giving-circle.test.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport { html, fixture, expect } from '@open-wc/testing';\n\nimport type { MonthlyGivingCircle } from '../src/monthly-giving-circle';\n\nimport '../src/monthly-giving-circle';\nimport type { IauxButton } from '../src/presentational/ia-button';\nimport { MonthlyPlan } from '../src/models/plan';\n\ndescribe('IauxMonthlyGivingCircle', () => {\n it('displays welcome message on load', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle></ia-monthly-giving-circle>`\n );\n\n expect(el.viewToDisplay).to.equal('welcome');\n\n const titleEl = el.querySelector('ia-mgc-title');\n expect(titleEl).to.not.be.null;\n expect(titleEl!.getAttribute('titlestyle')).to.equal('heart');\n expect(titleEl!.children.length).to.equal(2);\n expect((titleEl!.children[0] as HTMLElement).innerText).to.equal(\n 'Monthly Giving Circle'\n );\n\n const welcomeEl = el.querySelector('ia-mgc-welcome');\n const joinLink = welcomeEl!.shadowRoot?.querySelector(\n 'a.join-mgc'\n ) as HTMLAnchorElement;\n expect(joinLink).to.not.be.null;\n expect(joinLink.href).to.equal(\n 'https://archive.org/donate/?amt=5&contrib_type=monthly&origin=iawww-usrsttng'\n );\n });\n\n describe('Plans View:', () => {\n it('displays list', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle\n .plans=${[\n new MonthlyPlan({\n token: 'a.va.lid.T0ken',\n amount: 5,\n currency: 'USD',\n start_date: '2024-07-01 00:00:00',\n is_test: true,\n btdata: {\n billingDayOfMonth: 22,\n nextBillingDate: {\n date: '2024-08-22 00:00:00.000000',\n timezone_type: 3,\n timezone: 'UTC',\n },\n status: 'Active',\n paymentMethodType: 'Venmo',\n last4: null,\n cardType: null,\n expirationMonth: null,\n expirationYear: null,\n venmoUsername: 'venmojoe',\n },\n }),\n ]}\n ></ia-monthly-giving-circle>`\n );\n\n expect(el.viewToDisplay).to.equal('plans');\n expect(el.plans.length).to.equal(1);\n });\n });\n\n describe('Receipts View - CTA & onclick display:', () => {\n it('Displays receipts CTA when receipts are available', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle\n .receipts=${[\n {\n amount: 9999.99,\n date: '2020-09-01',\n donor: 'John Doe',\n paymentMethod: 'Credit Card',\n status: 'Completed',\n id: 'foo-id-1',\n },\n ]}\n ></ia-monthly-giving-circle>`\n );\n\n const titleEl = el.querySelector('ia-mgc-title');\n const receiptsButton = titleEl!.querySelector('ia-button') as IauxButton;\n expect(receiptsButton).to.exist;\n expect(receiptsButton!.innerText).to.equal(\n 'View recent donation history'\n );\n\n el.receipts = [];\n await el.updateComplete;\n\n const newTitleEl = el.querySelector('ia-mgc-title');\n expect(newTitleEl).to.exist;\n\n const newReceiptsButton = newTitleEl!.querySelector('button');\n expect(newReceiptsButton).to.not.exist;\n });\n\n it('Display receipts table when receipts CTA is clicked', async () => {\n const el = await fixture<MonthlyGivingCircle>(\n html`<ia-monthly-giving-circle\n .receipts=${[\n {\n amount: 9999.99,\n date: '2020-09-01',\n donor: 'John Doe',\n paymentMethod: 'Credit Card',\n status: 'Completed',\n id: 'foo-id-1',\n },\n ]}\n ></ia-monthly-giving-circle>`\n );\n\n const titleEl = el.querySelector('ia-mgc-title');\n expect(titleEl).to.exist;\n\n const receiptsButton = titleEl!.querySelector('ia-button') as IauxButton;\n\n expect(receiptsButton.innerText).to.equal('View recent donation history');\n\n const innerButton = receiptsButton.shadowRoot?.querySelector(\n 'button'\n ) as HTMLButtonElement;\n innerButton.click();\n\n await el.updateComplete;\n\n expect(el.viewToDisplay).to.equal('receipts');\n\n const welcomeEl = el.querySelector('ia-mgc-welcome');\n expect(welcomeEl).to.not.exist;\n\n // shows proper title\n const titleEl2 = el.querySelector('ia-mgc-title');\n expect(titleEl2).to.exist;\n expect(titleEl2!.getAttribute('titlestyle')).to.equal('default');\n const titleValueEl = titleEl2?.querySelector(\n 'span[slot=\"title\"]'\n ) as HTMLSpanElement;\n expect(titleValueEl).to.exist;\n expect(titleValueEl.innerText).to.equal('Recent donations');\n\n // shows back button\n const backButton = titleEl2?.querySelector(\n 'ia-button#close-receipts'\n ) as IauxButton;\n expect(backButton!.innerText).to.equal('Back to account settings');\n\n // shows receipts element\n const receiptsEl = el.querySelector('ia-mgc-receipts');\n expect(receiptsEl).to.exist;\n\n // goes back to welcome page if back button is clicked\n // dig into the shadowRoot to get the button\n backButton.shadowRoot?.querySelector('button')?.click();\n await el.updateComplete;\n\n expect(el.viewToDisplay).to.equal('welcome');\n\n const titleEl3 = el.querySelector('ia-mgc-title');\n expect(titleEl3).to.exist;\n expect(titleEl3!.getAttribute('titlestyle')).to.equal('heart');\n const welcomeTitle = titleEl3?.querySelector(\n 'span[slot=\"title\"]'\n ) as HTMLSpanElement;\n expect(welcomeTitle.innerText).to.equal('Monthly Giving Circle');\n });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/donation-monthly-portal",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "The Internet Archive Monthly Portal",
5
5
  "license": "AGPL-3.0-only",
6
6
  "main": "dist/index.js",
@@ -10,7 +10,6 @@ import './receipts';
10
10
  import type { IauxMgcReceipts } from './receipts';
11
11
  import './presentational/ia-button';
12
12
  import type { MonthlyPlan } from './models/plan';
13
- import './edit-plan-form';
14
13
 
15
14
  export type APlanUpdate = {
16
15
  plan?: MonthlyPlan;
@@ -35,8 +34,7 @@ export class MonthlyGivingCircle extends LitElement {
35
34
  @property({ type: String, reflect: true }) viewToDisplay:
36
35
  | 'welcome'
37
36
  | 'receipts'
38
- | 'plans'
39
- | 'editPlan' = 'welcome';
37
+ | 'plans' = 'welcome';
40
38
 
41
39
  protected createRenderRoot() {
42
40
  return this;
@@ -48,6 +46,10 @@ export class MonthlyGivingCircle extends LitElement {
48
46
  }
49
47
  }
50
48
 
49
+ protected render() {
50
+ return html` ${this.sectionTitle} ${this.currentView} `;
51
+ }
52
+
51
53
  get receiptListElement(): IauxMgcReceipts {
52
54
  return this.querySelector('ia-mgc-receipts') as IauxMgcReceipts;
53
55
  }
@@ -59,21 +61,6 @@ export class MonthlyGivingCircle extends LitElement {
59
61
 
60
62
  const { plan, donationId = '' } = update;
61
63
  const idToUse = plan?.id ?? donationId;
62
- const editingPlanIsUpdating = this.editingThisPlan?.id === idToUse;
63
-
64
- if (editingPlanIsUpdating) {
65
- console.log('edit received, mismatch plans', {
66
- planCurrentlyEditing: this.editingThisPlan,
67
- planReceived: update.plan,
68
- });
69
- return;
70
- }
71
-
72
- if (plan?.hasBeenCancelled) {
73
- this.editingThisPlan = undefined;
74
- this.viewToDisplay = 'plans';
75
- return;
76
- }
77
64
 
78
65
  this.receiptListElement.emailSent({
79
66
  id: idToUse,
@@ -82,25 +69,36 @@ export class MonthlyGivingCircle extends LitElement {
82
69
  }
83
70
 
84
71
  /* VIEWS */
85
- protected render() {
86
- const isEditingPlan =
87
- this.viewToDisplay === 'editPlan' && this.editingThisPlan;
88
- return html`
89
- ${this.sectionTitle}
90
- ${isEditingPlan
91
- ? html`<ia-mgc-edit-plan
92
- .plan=${this.editingThisPlan}
93
- .cancelPlanHandler=${(plan: MonthlyPlan) => {
94
- console.log('cancelPlan', plan);
95
- this.dispatchEvent(
96
- new CustomEvent('cancelPlan', {
97
- detail: { plan },
98
- })
99
- );
100
- }}
101
- ></ia-mgc-edit-plan>`
102
- : this.nonEditView}
103
- `;
72
+ get currentView(): TemplateResult {
73
+ if (this.viewToDisplay === 'receipts') {
74
+ return this.receiptsView;
75
+ }
76
+
77
+ if (this.viewToDisplay === 'plans' && this.plans.length) {
78
+ return this.plansView;
79
+ }
80
+
81
+ return html`<ia-mgc-welcome
82
+ .patronName=${this.patronName}
83
+ ></ia-mgc-welcome>`;
84
+ }
85
+
86
+ get receiptsView(): TemplateResult {
87
+ return html` <ia-mgc-receipts
88
+ .receipts=${this.receipts}
89
+ @EmailReceiptRequest=${(event: CustomEvent) => {
90
+ console.log('EmailReceiptRequest', event.detail);
91
+ this.dispatchEvent(
92
+ new CustomEvent('EmailReceiptRequest', {
93
+ detail: { ...event.detail },
94
+ })
95
+ );
96
+ }}
97
+ ></ia-mgc-receipts>`;
98
+ }
99
+
100
+ get plansView(): TemplateResult {
101
+ return html` <ia-mgc-plans .plans=${this.plans}></ia-mgc-plans> `;
104
102
  }
105
103
 
106
104
  get sectionTitle(): TemplateResult {
@@ -143,23 +141,6 @@ export class MonthlyGivingCircle extends LitElement {
143
141
  </ia-button>`;
144
142
  break;
145
143
 
146
- case 'editPlan':
147
- title = 'Edit plan';
148
- titleStyle = 'default';
149
- cta = html`<ia-button
150
- class="primary"
151
- id="close-edit-plan"
152
- .clickHandler=${async () => {
153
- this.viewToDisplay = this.plans.length ? 'plans' : 'welcome';
154
- this.dispatchEvent(new CustomEvent('ShowWelcome'));
155
- this.updates = [];
156
- await this.updateComplete;
157
- }}
158
- >
159
- Back to account settings
160
- </ia-button>`;
161
- break;
162
-
163
144
  default:
164
145
  title = 'Monthly Giving Circle';
165
146
  titleStyle = 'heart';
@@ -176,40 +157,4 @@ export class MonthlyGivingCircle extends LitElement {
176
157
  </ia-mgc-title>
177
158
  `;
178
159
  }
179
-
180
- get nonEditView(): TemplateResult {
181
- if (this.viewToDisplay === 'receipts') {
182
- return html`
183
- <ia-mgc-receipts
184
- .receipts=${this.receipts}
185
- @EmailReceiptRequest=${(event: CustomEvent) => {
186
- console.log('EmailReceiptRequest', event.detail);
187
- this.dispatchEvent(
188
- new CustomEvent('EmailReceiptRequest', {
189
- detail: { ...event.detail },
190
- })
191
- );
192
- }}
193
- ></ia-mgc-receipts>
194
- `;
195
- }
196
-
197
- return html`
198
- ${this.viewToDisplay === 'plans' && this.plans.length
199
- ? html`
200
- <ia-mgc-plans
201
- @editThisPlan=${async (event: CustomEvent) => {
202
- this.editingThisPlan = event.detail.plan;
203
- this.viewToDisplay = 'editPlan';
204
- this.dispatchEvent(new Event('ShowEditForm'));
205
- await this.updateComplete;
206
- }}
207
- .plans=${this.plans}
208
- ></ia-mgc-plans>
209
- `
210
- : html`<ia-mgc-welcome
211
- .patronName=${this.patronName}
212
- ></ia-mgc-welcome>`}
213
- `;
214
- }
215
160
  }
package/src/plans.ts CHANGED
@@ -4,13 +4,14 @@ import { customElement, property } from 'lit/decorators.js';
4
4
 
5
5
  import type { MonthlyPlan } from './models/plan';
6
6
 
7
- import './presentational/ia-button';
8
- import type { IauxButton } from './presentational/ia-button';
9
-
10
7
  @customElement('ia-mgc-plans')
11
8
  export class IauxMgcPlans extends LitElement {
12
9
  @property({ type: Array }) plans = [];
13
10
 
11
+ mailToText(): string {
12
+ return `mailto:donations@archive.org?subject=I'd like to update my monthly donation`;
13
+ }
14
+
14
15
  protected render() {
15
16
  return html`
16
17
  <section class="monthly-giving-circle">
@@ -26,10 +27,6 @@ export class IauxMgcPlans extends LitElement {
26
27
  ? `...${plan.payment?.last4}`
27
28
  : 'CC number not found';
28
29
 
29
- const ctaText = plan.plan.isCancelled
30
- ? 'Plan is cancelled'
31
- : 'Manage this monthly donation';
32
-
33
30
  return html`
34
31
  <li class=${`${plan.plan.isCancelled ? 'cancelled' : ''}`}>
35
32
  <div class="info">
@@ -80,20 +77,10 @@ export class IauxMgcPlans extends LitElement {
80
77
  <p>${plan.nextBillingDate}</p>
81
78
  </div>
82
79
  </div>
83
- <ia-button
84
- class="ia-button link edit-donation"
85
- .isDisabled=${plan.plan.isCancelled}
86
- .clickHandler=${async (e: Event, iaButton: IauxButton) => {
87
- // disable button
88
- iaButton.isDisabled = true;
89
- // open form
90
- this.dispatchEvent(
91
- new CustomEvent('editThisPlan', { detail: { plan } })
92
- );
93
- }}
94
- >
95
- ${ctaText}
96
- </ia-button>
80
+ <p class="email-edit-plan">
81
+ To update your monthly plan, please email us at
82
+ <a href=${this.mailToText}>donations@archive.org</a>.
83
+ </p>
97
84
  </li>
98
85
  `;
99
86
  })}
@@ -179,6 +166,9 @@ export class IauxMgcPlans extends LitElement {
179
166
  margin: 0;
180
167
  }
181
168
 
169
+ p.email-edit-plan {
170
+ margin: 10px 0 0;
171
+ }
182
172
  @media screen and (max-width: 500px) {
183
173
  ul li .info {
184
174
  display: block;
package/src/receipts.ts CHANGED
@@ -148,7 +148,10 @@ export class IauxMgcReceipts extends LitElement {
148
148
  <ia-button
149
149
  class="link slim"
150
150
  style="--link-button-flex-align-items: center;"
151
- .clickHandler=${async (iauxButton: IauxButton) => {
151
+ .clickHandler=${async (
152
+ e: Event,
153
+ iauxButton: IauxButton
154
+ ) => {
152
155
  const initialClick = !emailUnavailable;
153
156
  if (initialClick) {
154
157
  // eslint-disable-next-line no-param-reassign