@internetarchive/donation-monthly-portal 5.0.0 → 7.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.
Files changed (55) hide show
  1. package/dist/src/edit-plan-form.d.ts +12 -1
  2. package/dist/src/edit-plan-form.js +50 -5
  3. package/dist/src/edit-plan-form.js.map +1 -1
  4. package/dist/src/form-sections/amount.d.ts +29 -0
  5. package/dist/src/form-sections/amount.js +318 -0
  6. package/dist/src/form-sections/amount.js.map +1 -0
  7. package/dist/src/form-sections/cancel.js +6 -2
  8. package/dist/src/form-sections/cancel.js.map +1 -1
  9. package/dist/src/form-sections/date.d.ts +38 -0
  10. package/dist/src/form-sections/date.js +370 -0
  11. package/dist/src/form-sections/date.js.map +1 -0
  12. package/dist/src/models/plan.d.ts +10 -1
  13. package/dist/src/models/plan.js +21 -3
  14. package/dist/src/models/plan.js.map +1 -1
  15. package/dist/src/monthly-giving-circle.d.ts +8 -6
  16. package/dist/src/monthly-giving-circle.js +114 -30
  17. package/dist/src/monthly-giving-circle.js.map +1 -1
  18. package/dist/src/plans.d.ts +4 -1
  19. package/dist/src/plans.js +33 -10
  20. package/dist/src/plans.js.map +1 -1
  21. package/dist/src/presentational/ia-button.js +1 -0
  22. package/dist/src/presentational/ia-button.js.map +1 -1
  23. package/dist/src/presentational/mgc-title.d.ts +1 -1
  24. package/dist/src/presentational/mgc-title.js +10 -7
  25. package/dist/src/presentational/mgc-title.js.map +1 -1
  26. package/dist/src/presentational/mgc-update-status.d.ts +7 -0
  27. package/dist/src/presentational/mgc-update-status.js +53 -0
  28. package/dist/src/presentational/mgc-update-status.js.map +1 -0
  29. package/dist/src/receipts.js +6 -22
  30. package/dist/src/receipts.js.map +1 -1
  31. package/dist/src/welcome-message.js +1 -0
  32. package/dist/src/welcome-message.js.map +1 -1
  33. package/dist/test/edit-plan-form.test.js +39 -29
  34. package/dist/test/edit-plan-form.test.js.map +1 -1
  35. package/dist/test/form-sections/amount.test.d.ts +1 -0
  36. package/dist/test/form-sections/amount.test.js +49 -0
  37. package/dist/test/form-sections/amount.test.js.map +1 -0
  38. package/dist/test/form-sections/date.test.d.ts +1 -0
  39. package/dist/test/form-sections/date.test.js +136 -0
  40. package/dist/test/form-sections/date.test.js.map +1 -0
  41. package/dist/test/monthly-giving-circle.test.js +23 -1
  42. package/dist/test/monthly-giving-circle.test.js.map +1 -1
  43. package/package.json +2 -1
  44. package/src/edit-plan-form.ts +67 -4
  45. package/src/form-sections/amount.ts +349 -0
  46. package/src/form-sections/cancel.ts +7 -3
  47. package/src/form-sections/date.ts +401 -0
  48. package/src/models/plan.ts +34 -3
  49. package/src/monthly-giving-circle.ts +140 -40
  50. package/src/plans.ts +37 -10
  51. package/src/presentational/ia-button.ts +1 -0
  52. package/src/presentational/mgc-title.ts +5 -2
  53. package/src/presentational/mgc-update-status.ts +47 -0
  54. package/src/receipts.ts +8 -22
  55. package/src/welcome-message.ts +1 -0
@@ -1,8 +1,19 @@
1
1
  import { LitElement } from 'lit';
2
2
  import type { MonthlyPlan } from './models/plan';
3
+ import './form-sections/amount';
4
+ import './form-sections/date';
3
5
  import './form-sections/cancel';
4
6
  export declare class IauxEditPlanForm extends LitElement {
5
7
  plan?: MonthlyPlan;
6
- cancelPlanHandler?: (plan: MonthlyPlan) => void;
8
+ updateAmountHandler?: (plan: MonthlyPlan, amountUpdates: {
9
+ amount: number;
10
+ baseAmount: number;
11
+ coverFees: boolean;
12
+ feeCovered: number;
13
+ }) => void;
14
+ createRenderRoot(): this;
15
+ amountUpdates(status: 'success' | 'fail'): void;
16
+ dateUpdates(status: 'success' | 'fail'): void;
7
17
  render(): import("lit").TemplateResult<1>;
18
+ mailToText(): string;
8
19
  }
@@ -1,31 +1,76 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { LitElement, html } from 'lit';
3
3
  import { customElement, property } from 'lit/decorators.js';
4
+ import './form-sections/amount';
5
+ import './form-sections/date';
4
6
  import './form-sections/cancel';
5
7
  let IauxEditPlanForm = class IauxEditPlanForm extends LitElement {
8
+ createRenderRoot() {
9
+ return this;
10
+ }
11
+ amountUpdates(status) {
12
+ const amountForm = this.querySelector('ia-mgc-edit-plan-amount');
13
+ amountForm.amountUpdated(status);
14
+ }
15
+ dateUpdates(status) {
16
+ const dateForm = this.querySelector('ia-mgc-edit-date');
17
+ dateForm.dateUpdated(status);
18
+ }
6
19
  render() {
7
20
  return html `
8
21
  <section class="mgc-edit-plan">
9
- <hr />
10
- <ia-mgc-cancel-plan
22
+ <ia-mgc-edit-plan-amount
11
23
  .plan=${this.plan}
12
- @cancelPlan=${() => {
24
+ @updateAmount=${(e) => {
13
25
  var _a;
26
+ const { amount, baseAmount, coverFees, feeCovered } = e.detail;
27
+ if (this.plan) {
28
+ (_a = this.updateAmountHandler) === null || _a === void 0 ? void 0 : _a.call(this, this.plan, {
29
+ amount,
30
+ baseAmount,
31
+ coverFees,
32
+ feeCovered,
33
+ });
34
+ }
35
+ }}
36
+ ></ia-mgc-edit-plan-amount>
37
+ <hr />
38
+ <ia-mgc-edit-date
39
+ @updateDate=${(e) => {
40
+ const { newDate } = e.detail;
14
41
  if (this.plan) {
15
- (_a = this.cancelPlanHandler) === null || _a === void 0 ? void 0 : _a.call(this, this.plan);
42
+ this.dispatchEvent(new CustomEvent('updateDate', {
43
+ detail: { plan: this.plan, newDate },
44
+ }));
16
45
  }
46
+ }}
47
+ .plan=${this.plan}
48
+ ></ia-mgc-edit-date>
49
+ <hr />
50
+ <ia-mgc-cancel-plan
51
+ .plan=${this.plan}
52
+ @cancelPlan=${() => {
53
+ this.dispatchEvent(new Event('cancelPlan'));
17
54
  }}
18
55
  ></ia-mgc-cancel-plan>
56
+ <hr />
57
+ <p class="email-edit-plan">
58
+ Need to update your plan further? Please email us at
59
+ <a href=${this.mailToText}>donations@archive.org</a>.
60
+ </p>
19
61
  </section>
20
62
  `;
21
63
  }
64
+ mailToText() {
65
+ return `mailto:donations@archive.org?subject=I'd like to update my monthly donation`;
66
+ }
22
67
  };
23
68
  __decorate([
24
69
  property({ type: Object })
25
70
  ], IauxEditPlanForm.prototype, "plan", void 0);
26
71
  __decorate([
27
72
  property({ type: Object })
28
- ], IauxEditPlanForm.prototype, "cancelPlanHandler", void 0);
73
+ ], IauxEditPlanForm.prototype, "updateAmountHandler", void 0);
29
74
  IauxEditPlanForm = __decorate([
30
75
  customElement('ia-mgc-edit-plan')
31
76
  ], IauxEditPlanForm);
@@ -1 +1 @@
1
- {"version":3,"file":"edit-plan-form.js","sourceRoot":"","sources":["../../src/edit-plan-form.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,wBAAwB,CAAC;AAGhC,IAAa,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,UAAU;IAK9C,MAAM;QACJ,OAAO,IAAI,CAAA;;;;kBAIG,IAAI,CAAC,IAAI;wBACH,GAAG,EAAE;;YACjB,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,MAAA,IAAI,CAAC,iBAAiB,qDAAG,IAAI,CAAC,IAAI,CAAC,CAAC;aACrC;QACH,CAAC;;;KAGN,CAAC;IACJ,CAAC;CACF,CAAA;AAnB6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAoB;AAEnB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2DAAiD;AAHjE,gBAAgB;IAD5B,aAAa,CAAC,kBAAkB,CAAC;GACrB,gBAAgB,CAoB5B;SApBY,gBAAgB","sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { MonthlyPlan } from './models/plan';\nimport './form-sections/cancel';\n\n@customElement('ia-mgc-edit-plan')\nexport class IauxEditPlanForm extends LitElement {\n @property({ type: Object }) plan?: MonthlyPlan;\n\n @property({ type: Object }) cancelPlanHandler?: (plan: MonthlyPlan) => void;\n\n render() {\n return html`\n <section class=\"mgc-edit-plan\">\n <hr />\n <ia-mgc-cancel-plan\n .plan=${this.plan}\n @cancelPlan=${() => {\n if (this.plan) {\n this.cancelPlanHandler?.(this.plan);\n }\n }}\n ></ia-mgc-cancel-plan>\n </section>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"edit-plan-form.js","sourceRoot":"","sources":["../../src/edit-plan-form.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,wBAAwB,CAAC;AAChC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,wBAAwB,CAAC;AAKhC,IAAa,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,UAAU;IAa9C,gBAAgB;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,MAA0B;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CACnC,yBAAyB,CACL,CAAC;QACvB,UAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,WAAW,CAAC,MAA0B;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAoB,CAAC;QAC3E,QAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;kBAGG,IAAI,CAAC,IAAI;0BACD,CAAC,CAAc,EAAE,EAAE;;YACjC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,MAAA,IAAI,CAAC,mBAAmB,qDAAG,IAAI,CAAC,IAAI,EAAE;oBACpC,MAAM;oBACN,UAAU;oBACV,SAAS;oBACT,UAAU;iBACX,CAAC,CAAC;aACJ;QACH,CAAC;;;;wBAIa,CAAC,CAAc,EAAE,EAAE;YAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;YAC7B,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,YAAY,EAAE;oBAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE;iBACrC,CAAC,CACH,CAAC;aACH;QACH,CAAC;kBACO,IAAI,CAAC,IAAI;;;;kBAIT,IAAI,CAAC,IAAI;wBACH,GAAG,EAAE;YACjB,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9C,CAAC;;;;;oBAKS,IAAI,CAAC,UAAU;;;KAG9B,CAAC;IACJ,CAAC;IAED,UAAU;QACR,OAAO,6EAA6E,CAAC;IACvF,CAAC;CACF,CAAA;AA9E6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAoB;AAEnB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6DAQjB;AAXC,gBAAgB;IAD5B,aAAa,CAAC,kBAAkB,CAAC;GACrB,gBAAgB,CA+E5B;SA/EY,gBAAgB","sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { MonthlyPlan } from './models/plan';\nimport './form-sections/amount';\nimport './form-sections/date';\nimport './form-sections/cancel';\nimport type { MGCEditPlanAmount } from './form-sections/amount';\nimport type { MGCEditPlanDate } from './form-sections/date';\n\n@customElement('ia-mgc-edit-plan')\nexport class IauxEditPlanForm extends LitElement {\n @property({ type: Object }) plan?: MonthlyPlan;\n\n @property({ type: Object }) updateAmountHandler?: (\n plan: MonthlyPlan,\n amountUpdates: {\n amount: number;\n baseAmount: number;\n coverFees: boolean;\n feeCovered: number;\n }\n ) => void;\n\n createRenderRoot() {\n return this;\n }\n\n amountUpdates(status: 'success' | 'fail') {\n const amountForm = this.querySelector(\n 'ia-mgc-edit-plan-amount'\n ) as MGCEditPlanAmount;\n amountForm!.amountUpdated(status);\n }\n\n dateUpdates(status: 'success' | 'fail') {\n const dateForm = this.querySelector('ia-mgc-edit-date') as MGCEditPlanDate;\n dateForm!.dateUpdated(status);\n }\n\n render() {\n return html`\n <section class=\"mgc-edit-plan\">\n <ia-mgc-edit-plan-amount\n .plan=${this.plan}\n @updateAmount=${(e: CustomEvent) => {\n const { amount, baseAmount, coverFees, feeCovered } = e.detail;\n if (this.plan) {\n this.updateAmountHandler?.(this.plan, {\n amount,\n baseAmount,\n coverFees,\n feeCovered,\n });\n }\n }}\n ></ia-mgc-edit-plan-amount>\n <hr />\n <ia-mgc-edit-date\n @updateDate=${(e: CustomEvent) => {\n const { newDate } = e.detail;\n if (this.plan) {\n this.dispatchEvent(\n new CustomEvent('updateDate', {\n detail: { plan: this.plan, newDate },\n })\n );\n }\n }}\n .plan=${this.plan}\n ></ia-mgc-edit-date>\n <hr />\n <ia-mgc-cancel-plan\n .plan=${this.plan}\n @cancelPlan=${() => {\n this.dispatchEvent(new Event('cancelPlan'));\n }}\n ></ia-mgc-cancel-plan>\n <hr />\n <p class=\"email-edit-plan\">\n Need to update your plan further? Please email us at\n <a href=${this.mailToText}>donations@archive.org</a>.\n </p>\n </section>\n `;\n }\n\n mailToText(): string {\n return `mailto:donations@archive.org?subject=I'd like to update my monthly donation`;\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { LitElement, PropertyValues, TemplateResult } from 'lit';
2
+ import '@internetarchive/donation-form-section';
3
+ import { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';
4
+ import type { MonthlyPlan } from '../models/plan';
5
+ import '../presentational/ia-button';
6
+ import '../presentational/mgc-update-status';
7
+ export declare class MGCEditPlanAmount extends LitElement {
8
+ plan?: MonthlyPlan;
9
+ donationPaymentInfo?: DonationPaymentInfo;
10
+ newAmount: number;
11
+ currentlyEditing: boolean;
12
+ coverFees: boolean;
13
+ updateMessage: string;
14
+ errorMessage: string;
15
+ updateStatus: 'success' | 'fail' | '';
16
+ form: HTMLFormElement;
17
+ updated(changed: PropertyValues): void;
18
+ protected render(): TemplateResult<1>;
19
+ amountUpdated(status: 'success' | 'fail'): Promise<void>;
20
+ requestAmountUpdate(e: Event): void;
21
+ captureAmountChanges(newAmount?: number): void;
22
+ closeForm(): void;
23
+ clearInputField(): void;
24
+ clearStatusMessaging(): Promise<void>;
25
+ totalAmountWithFees(): number;
26
+ get coveredFeesText(): string;
27
+ get editAmountForm(): TemplateResult;
28
+ static styles: import("lit").CSSResult;
29
+ }
@@ -0,0 +1,318 @@
1
+ import { __decorate } from "tslib";
2
+ import { LitElement, html, nothing, css, } from 'lit';
3
+ import { customElement, property, query } from 'lit/decorators.js';
4
+ import '@internetarchive/donation-form-section';
5
+ import { DonationPaymentInfo, DonationType, } from '@internetarchive/donation-form-data-models';
6
+ import '../presentational/ia-button';
7
+ import '../presentational/mgc-update-status';
8
+ let MGCEditPlanAmount = class MGCEditPlanAmount extends LitElement {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.newAmount = 0;
12
+ this.currentlyEditing = false;
13
+ this.coverFees = false;
14
+ this.updateMessage = '';
15
+ this.errorMessage = '';
16
+ this.updateStatus = '';
17
+ }
18
+ updated(changed) {
19
+ if (changed.has('plan') && this.plan) {
20
+ this.captureAmountChanges();
21
+ }
22
+ if (changed.has('coverFees')) {
23
+ this.captureAmountChanges();
24
+ }
25
+ if (changed.has('currentlyEditing') && this.currentlyEditing) {
26
+ this.form.focus();
27
+ }
28
+ if (changed.has('donationPaymentInfo') && !this.donationPaymentInfo) {
29
+ this.captureAmountChanges();
30
+ }
31
+ }
32
+ render() {
33
+ var _a;
34
+ return html `
35
+ <section>
36
+ <donation-form-section badgemode="hidebadge" headline="Amount">
37
+ ${!this.currentlyEditing
38
+ ? html ` <p class="current-amount">
39
+ USD $${(_a = this.plan) === null || _a === void 0 ? void 0 : _a.amount}
40
+ <ia-mgc-update-status .status=${this.updateStatus}
41
+ >${this.updateMessage}</ia-mgc-update-status
42
+ >
43
+ </p>
44
+ <ia-button
45
+ id="edit-amount"
46
+ class="ia-button link"
47
+ .clickHandler=${() => {
48
+ this.currentlyEditing = true;
49
+ this.clearStatusMessaging();
50
+ }}
51
+ >
52
+ Edit...
53
+ </ia-button>`
54
+ : nothing}
55
+ ${this.currentlyEditing ? this.editAmountForm : nothing}
56
+ </donation-form-section>
57
+ </section>
58
+ `;
59
+ }
60
+ /* External Function that is called by consumer to tell the form there has been data update */
61
+ async amountUpdated(status) {
62
+ this.clearInputField();
63
+ this.updateStatus = status;
64
+ this.updateMessage =
65
+ status === 'success' ? 'Amount updated' : 'Failed. Try again.';
66
+ if (status === 'success') {
67
+ this.closeForm();
68
+ await this.updateComplete;
69
+ this.updateStatus = status;
70
+ this.updateMessage = 'Amount updated';
71
+ return;
72
+ }
73
+ this.form.querySelector('ia-button#update-amount').isDisabled = false;
74
+ this.captureAmountChanges();
75
+ await this.updateComplete;
76
+ }
77
+ /* Dispatches amount change request */
78
+ requestAmountUpdate(e) {
79
+ var _a, _b, _c, _d, _e;
80
+ e.preventDefault();
81
+ const input = this.form.querySelector('input[name="amount"]');
82
+ this.newAmount = Number(input.value);
83
+ this.captureAmountChanges(this.newAmount);
84
+ console.log('<plan-amount> - update amount', {
85
+ newValue: this.newAmount,
86
+ oldValue: (_a = this.plan) === null || _a === void 0 ? void 0 : _a.plan.amount,
87
+ display: (_b = this.donationPaymentInfo) === null || _b === void 0 ? void 0 : _b.amount,
88
+ });
89
+ const newAmount = Number(DonationPaymentInfo.calculateTotal(Number((_c = this.donationPaymentInfo) === null || _c === void 0 ? void 0 : _c.amount), this.coverFees));
90
+ this.dispatchEvent(new CustomEvent('updateAmount', {
91
+ detail: {
92
+ plan: this.plan,
93
+ amount: newAmount,
94
+ baseAmount: (_d = this.donationPaymentInfo) === null || _d === void 0 ? void 0 : _d.amount,
95
+ coverFees: this.coverFees,
96
+ feeCovered: (_e = this.donationPaymentInfo) === null || _e === void 0 ? void 0 : _e.feeAmountCovered,
97
+ },
98
+ }));
99
+ }
100
+ /* captures form changes */
101
+ captureAmountChanges(newAmount) {
102
+ if (!this.donationPaymentInfo && this.plan) {
103
+ this.donationPaymentInfo = new DonationPaymentInfo({
104
+ donationType: DonationType.Monthly,
105
+ amount: 0,
106
+ coverFees: true,
107
+ });
108
+ return;
109
+ }
110
+ let newPlan;
111
+ if (newAmount) {
112
+ newPlan = new DonationPaymentInfo({
113
+ donationType: DonationType.Monthly,
114
+ amount: newAmount,
115
+ coverFees: true,
116
+ });
117
+ }
118
+ else {
119
+ const amount = this.donationPaymentInfo
120
+ ? this.donationPaymentInfo.amount
121
+ : this.plan.amount;
122
+ newPlan = new DonationPaymentInfo({
123
+ donationType: DonationType.Monthly,
124
+ amount,
125
+ coverFees: true,
126
+ });
127
+ }
128
+ this.donationPaymentInfo = newPlan;
129
+ }
130
+ closeForm() {
131
+ this.clearInputField();
132
+ this.clearStatusMessaging();
133
+ this.currentlyEditing = false;
134
+ this.coverFees = false;
135
+ this.errorMessage = '';
136
+ }
137
+ clearInputField() {
138
+ const input = this.form.querySelector('input[name="amount"]');
139
+ input.value = '';
140
+ this.newAmount = 0;
141
+ this.donationPaymentInfo = undefined;
142
+ }
143
+ async clearStatusMessaging() {
144
+ this.errorMessage = '';
145
+ this.updateMessage = '';
146
+ this.updateStatus = '';
147
+ await this.updateComplete;
148
+ }
149
+ /* DISPLAY */
150
+ totalAmountWithFees() {
151
+ if (this.newAmount === 0) {
152
+ return 0;
153
+ }
154
+ return DonationPaymentInfo.calculateTotal(this.newAmount, this.coverFees);
155
+ }
156
+ get coveredFeesText() {
157
+ var _a;
158
+ return `I'll generously add $${(_a = this.donationPaymentInfo) === null || _a === void 0 ? void 0 : _a.feeAmountCovered} to cover fees.`;
159
+ }
160
+ get editAmountForm() {
161
+ var _a;
162
+ return html `
163
+ <section>
164
+ <form id="edit-plan-amount">
165
+ <p>Current donation amount: $${(_a = this.plan) === null || _a === void 0 ? void 0 : _a.amount}</p>
166
+ <div>
167
+ $
168
+ <input
169
+ min="1"
170
+ max="9999"
171
+ type="number"
172
+ id="amount"
173
+ name="amount"
174
+ required="true"
175
+ @focus=${() => this.clearStatusMessaging()}
176
+ @input=${(e) => {
177
+ const newAmount = Number(e.target.value);
178
+ this.captureAmountChanges(newAmount);
179
+ this.newAmount = newAmount;
180
+ }}
181
+ />
182
+ / month
183
+ </div>
184
+ <div>
185
+ <div class="checkbox-option-container">
186
+ <input
187
+ type="checkbox"
188
+ id="cover-fees"
189
+ tabindex="0"
190
+ @change=${(e) => {
191
+ const input = e.target;
192
+ const coverFees = input.checked;
193
+ this.coverFees = coverFees;
194
+ this.captureAmountChanges();
195
+ }}
196
+ />
197
+ <label for="cover-fees">${this.coveredFeesText}</label>
198
+ </div>
199
+ <p>Total: USD $${this.totalAmountWithFees()}</p>
200
+ <div class="cta-container">
201
+ <ia-button
202
+ class="ia-button secondary"
203
+ .clickHandler=${(e) => {
204
+ e.preventDefault();
205
+ this.closeForm();
206
+ }}
207
+ >
208
+ Cancel
209
+ </ia-button>
210
+ <ia-button
211
+ id="update-amount"
212
+ class="ia-button primary"
213
+ type="submit"
214
+ .clickHandler=${async (e, iaButton) => {
215
+ var _a;
216
+ this.clearStatusMessaging();
217
+ if (!this.newAmount) {
218
+ this.errorMessage = 'Please enter a new amount';
219
+ return;
220
+ }
221
+ // eslint-disable-next-line no-param-reassign
222
+ iaButton.isDisabled = true;
223
+ await iaButton.updateComplete;
224
+ // check if request is in range
225
+ const input = this.form.querySelector('input[name="amount"]');
226
+ const requestedAmount = (_a = Number(input.value)) !== null && _a !== void 0 ? _a : 0;
227
+ const amountTooLow = requestedAmount < 1;
228
+ const amountTooHigh = requestedAmount >= 9999;
229
+ if (amountTooLow) {
230
+ this.errorMessage = 'Please enter a valid amount';
231
+ }
232
+ if (amountTooHigh) {
233
+ this.errorMessage =
234
+ 'Amount must be less than $9,999. Would you like to donate more? Please contact us at donations@archive.org';
235
+ }
236
+ if (amountTooHigh || amountTooLow) {
237
+ // eslint-disable-next-line no-param-reassign
238
+ iaButton.isDisabled = false;
239
+ await iaButton.updateComplete;
240
+ return;
241
+ }
242
+ this.requestAmountUpdate(e);
243
+ }}
244
+ >
245
+ Update
246
+ </ia-button>
247
+ <ia-mgc-update-status .status=${this.updateStatus}
248
+ >${this.updateMessage}</ia-mgc-update-status
249
+ >
250
+ </div>
251
+ </div>
252
+ <p class="error">${this.errorMessage}</p>
253
+ </form>
254
+ </section>
255
+ `;
256
+ }
257
+ };
258
+ MGCEditPlanAmount.styles = css `
259
+ input#amount {
260
+ width: 50px;
261
+ }
262
+
263
+ .cta-container {
264
+ display: flex;
265
+ flex-direction: row;
266
+ flex-wrap: wrap;
267
+ align-content: center;
268
+ justify-content: flex-start;
269
+ align-items: center;
270
+ gap: 10px;
271
+ }
272
+
273
+ p.error {
274
+ color: var(--mgc-warning-color-dark, #bb0505);
275
+ }
276
+
277
+ ia-mgc-update-status {
278
+ display: inline-block;
279
+ margin-left: 1rem;
280
+ }
281
+
282
+ .checkbox-option-container {
283
+ margin: 10px 0;
284
+ display: flex;
285
+ }
286
+ `;
287
+ __decorate([
288
+ property({ type: Object })
289
+ ], MGCEditPlanAmount.prototype, "plan", void 0);
290
+ __decorate([
291
+ property({ type: Object })
292
+ ], MGCEditPlanAmount.prototype, "donationPaymentInfo", void 0);
293
+ __decorate([
294
+ property({ type: Number })
295
+ ], MGCEditPlanAmount.prototype, "newAmount", void 0);
296
+ __decorate([
297
+ property({ type: Boolean, reflect: true })
298
+ ], MGCEditPlanAmount.prototype, "currentlyEditing", void 0);
299
+ __decorate([
300
+ property({ type: Boolean })
301
+ ], MGCEditPlanAmount.prototype, "coverFees", void 0);
302
+ __decorate([
303
+ property({ type: String })
304
+ ], MGCEditPlanAmount.prototype, "updateMessage", void 0);
305
+ __decorate([
306
+ property({ type: String })
307
+ ], MGCEditPlanAmount.prototype, "errorMessage", void 0);
308
+ __decorate([
309
+ property({ type: String })
310
+ ], MGCEditPlanAmount.prototype, "updateStatus", void 0);
311
+ __decorate([
312
+ query('form')
313
+ ], MGCEditPlanAmount.prototype, "form", void 0);
314
+ MGCEditPlanAmount = __decorate([
315
+ customElement('ia-mgc-edit-plan-amount')
316
+ ], MGCEditPlanAmount);
317
+ export { MGCEditPlanAmount };
318
+ //# sourceMappingURL=amount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../src/form-sections/amount.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,IAAI,EAEJ,OAAO,EACP,GAAG,GAEJ,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,wCAAwC,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,YAAY,GACb,MAAM,4CAA4C,CAAC;AAGpD,OAAO,6BAA6B,CAAC;AAErC,OAAO,qCAAqC,CAAC;AAG7C,IAAa,iBAAiB,GAA9B,MAAa,iBAAkB,SAAQ,UAAU;IAAjD;;QAM8B,cAAS,GAAW,CAAC,CAAC;QAEN,qBAAgB,GAAY,KAAK,CAAC;QAEjD,cAAS,GAAY,KAAK,CAAC;QAE5B,kBAAa,GAAW,EAAE,CAAC;QAE3B,iBAAY,GAAW,EAAE,CAAC;QAE1B,iBAAY,GAA4B,EAAE,CAAC;IAuTzE,CAAC;IAnTC,OAAO,CAAC,OAAuB;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;YACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAC7B;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAC7B;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAC5D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;SACnB;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACnE,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAC7B;IACH,CAAC;IAES,MAAM;;QACd,OAAO,IAAI,CAAA;;;YAGH,CAAC,IAAI,CAAC,gBAAgB;YACtB,CAAC,CAAC,IAAI,CAAA;yBACO,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM;kDACQ,IAAI,CAAC,YAAY;uBAC5C,IAAI,CAAC,aAAa;;;;;;kCAMP,GAAG,EAAE;gBACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC;;;6BAGU;YACjB,CAAC,CAAC,OAAO;YACT,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO;;;KAG5D,CAAC;IACJ,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,aAAa,CAAC,MAA0B;QAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,aAAa;YAChB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAEjE,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,cAAc,CAAC;YAE1B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC;YAEtC,OAAO;SACR;QAGC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAClD,CAAC,UAAU,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED,sCAAsC;IACtC,mBAAmB,CAAC,CAAQ;;QAC1B,CAAC,CAAC,cAAc,EAAE,CAAC;QAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CACnC,sBAAsB,CACH,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE;YAC3C,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,QAAQ,EAAE,MAAA,IAAI,CAAC,IAAI,0CAAE,IAAI,CAAC,MAAM;YAChC,OAAO,EAAE,MAAA,IAAI,CAAC,mBAAmB,0CAAE,MAAM;SAC1C,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CACtB,mBAAmB,CAAC,cAAc,CAChC,MAAM,CAAC,MAAA,IAAI,CAAC,mBAAmB,0CAAE,MAAM,CAAC,EACxC,IAAI,CAAC,SAAS,CACf,CACF,CAAC;QACF,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;YAC9B,MAAM,EAAE;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,MAAA,IAAI,CAAC,mBAAmB,0CAAE,MAAM;gBAC5C,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,MAAA,IAAI,CAAC,mBAAmB,0CAAE,gBAAgB;aACvD;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,oBAAoB,CAAC,SAAkB;QACrC,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,IAAI,EAAE;YAC1C,IAAI,CAAC,mBAAmB,GAAG,IAAI,mBAAmB,CAAC;gBACjD,YAAY,EAAE,YAAY,CAAC,OAAO;gBAClC,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,OAAO;SACR;QAED,IAAI,OAAO,CAAC;QACZ,IAAI,SAAS,EAAE;YACb,OAAO,GAAG,IAAI,mBAAmB,CAAC;gBAChC,YAAY,EAAE,YAAY,CAAC,OAAO;gBAClC,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;SACJ;aAAM;YACL,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB;gBACrC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM;gBACjC,CAAC,CAAC,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC;YAEtB,OAAO,GAAG,IAAI,mBAAmB,CAAC;gBAChC,YAAY,EAAE,YAAY,CAAC,OAAO;gBAClC,MAAM;gBACN,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;SACJ;QAED,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;IACrC,CAAC;IAED,SAAS;QACP,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,eAAe;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CACnC,sBAAsB,CACH,CAAC;QACtB,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED,aAAa;IACb,mBAAmB;QACjB,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE;YACxB,OAAO,CAAC,CAAC;SACV;QAED,OAAO,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,eAAe;;QACjB,OAAO,wBAAwB,MAAA,IAAI,CAAC,mBAAmB,0CAAE,gBAAgB,iBAAiB,CAAC;IAC7F,CAAC;IAED,IAAI,cAAc;;QAChB,OAAO,IAAI,CAAA;;;yCAG0B,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM;;;;;;;;;;uBAUnC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;uBACjC,CAAC,CAAQ,EAAE,EAAE;YACpB,MAAM,SAAS,GAAG,MAAM,CAAE,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;;;;;;;;;;0BAUW,CAAC,CAAQ,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,CAAC,CAAC,MAA0B,CAAC;YAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;;wCAEuB,IAAI,CAAC,eAAe;;6BAE/B,IAAI,CAAC,mBAAmB,EAAE;;;;gCAIvB,CAAC,CAAQ,EAAE,EAAE;YAC3B,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;;;;;;;;gCAQe,KAAK,EAAE,CAAQ,EAAE,QAAoB,EAAE,EAAE;;YACvD,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAE5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACnB,IAAI,CAAC,YAAY,GAAG,2BAA2B,CAAC;gBAChD,OAAO;aACR;YAED,6CAA6C;YAC5C,QAAuB,CAAC,UAAU,GAAG,IAAI,CAAC;YAC3C,MAAM,QAAQ,CAAC,cAAc,CAAC;YAE9B,+BAA+B;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CACnC,sBAAsB,CACH,CAAC;YACtB,MAAM,eAAe,GAAG,MAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAI,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,eAAe,GAAG,CAAC,CAAC;YACzC,MAAM,aAAa,GAAG,eAAe,IAAI,IAAI,CAAC;YAC9C,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,YAAY,GAAG,6BAA6B,CAAC;aACnD;YACD,IAAI,aAAa,EAAE;gBACjB,IAAI,CAAC,YAAY;oBACf,4GAA4G,CAAC;aAChH;YACD,IAAI,aAAa,IAAI,YAAY,EAAE;gBACjC,6CAA6C;gBAC5C,QAAuB,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC5C,MAAM,QAAQ,CAAC,cAAc,CAAC;gBAC9B,OAAO;aACR;YAED,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;;;;8CAI6B,IAAI,CAAC,YAAY;mBAC5C,IAAI,CAAC,aAAa;;;;6BAIR,IAAI,CAAC,YAAY;;;KAGzC,CAAC;IACJ,CAAC;CA+BF,CAAA;AA7BQ,wBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BlB,CAAC;AArU0B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAAoB;AAGnB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8DAA2C;AAE1C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAAuB;AAEN;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;2DAAmC;AAEjD;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oDAA4B;AAE5B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAA4B;AAE3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAA2B;AAE1B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAA4C;AAExD;IAAd,KAAK,CAAC,MAAM,CAAC;+CAAwB;AAlB3B,iBAAiB;IAD7B,aAAa,CAAC,yBAAyB,CAAC;GAC5B,iBAAiB,CAuU7B;SAvUY,iBAAiB","sourcesContent":["import {\n LitElement,\n html,\n PropertyValues,\n nothing,\n css,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport '@internetarchive/donation-form-section';\nimport {\n DonationPaymentInfo,\n DonationType,\n} from '@internetarchive/donation-form-data-models';\n\nimport type { MonthlyPlan } from '../models/plan';\nimport '../presentational/ia-button';\nimport type { IauxButton } from '../presentational/ia-button';\nimport '../presentational/mgc-update-status';\n\n@customElement('ia-mgc-edit-plan-amount')\nexport class MGCEditPlanAmount extends LitElement {\n @property({ type: Object }) plan?: MonthlyPlan;\n\n // captures the changes made to the amount && calculates the total amount with fees\n @property({ type: Object }) donationPaymentInfo?: DonationPaymentInfo;\n\n @property({ type: Number }) newAmount: number = 0;\n\n @property({ type: Boolean, reflect: true }) currentlyEditing: boolean = false;\n\n @property({ type: Boolean }) coverFees: boolean = false;\n\n @property({ type: String }) updateMessage: string = '';\n\n @property({ type: String }) errorMessage: string = '';\n\n @property({ type: String }) updateStatus: 'success' | 'fail' | '' = '';\n\n @query('form') form!: HTMLFormElement;\n\n updated(changed: PropertyValues) {\n if (changed.has('plan') && this.plan) {\n this.captureAmountChanges();\n }\n if (changed.has('coverFees')) {\n this.captureAmountChanges();\n }\n if (changed.has('currentlyEditing') && this.currentlyEditing) {\n this.form.focus();\n }\n\n if (changed.has('donationPaymentInfo') && !this.donationPaymentInfo) {\n this.captureAmountChanges();\n }\n }\n\n protected render() {\n return html`\n <section>\n <donation-form-section badgemode=\"hidebadge\" headline=\"Amount\">\n ${!this.currentlyEditing\n ? html` <p class=\"current-amount\">\n USD $${this.plan?.amount}\n <ia-mgc-update-status .status=${this.updateStatus}\n >${this.updateMessage}</ia-mgc-update-status\n >\n </p>\n <ia-button\n id=\"edit-amount\"\n class=\"ia-button link\"\n .clickHandler=${() => {\n this.currentlyEditing = true;\n this.clearStatusMessaging();\n }}\n >\n Edit...\n </ia-button>`\n : nothing}\n ${this.currentlyEditing ? this.editAmountForm : nothing}\n </donation-form-section>\n </section>\n `;\n }\n\n /* External Function that is called by consumer to tell the form there has been data update */\n async amountUpdated(status: 'success' | 'fail') {\n this.clearInputField();\n\n this.updateStatus = status;\n this.updateMessage =\n status === 'success' ? 'Amount updated' : 'Failed. Try again.';\n\n if (status === 'success') {\n this.closeForm();\n await this.updateComplete;\n\n this.updateStatus = status;\n this.updateMessage = 'Amount updated';\n\n return;\n }\n\n (\n this.form.querySelector('ia-button#update-amount') as IauxButton\n ).isDisabled = false;\n\n this.captureAmountChanges();\n\n await this.updateComplete;\n }\n\n /* Dispatches amount change request */\n requestAmountUpdate(e: Event): void {\n e.preventDefault();\n\n const input = this.form.querySelector(\n 'input[name=\"amount\"]'\n ) as HTMLInputElement;\n this.newAmount = Number(input.value);\n\n this.captureAmountChanges(this.newAmount);\n\n console.log('<plan-amount> - update amount', {\n newValue: this.newAmount,\n oldValue: this.plan?.plan.amount,\n display: this.donationPaymentInfo?.amount,\n });\n const newAmount = Number(\n DonationPaymentInfo.calculateTotal(\n Number(this.donationPaymentInfo?.amount),\n this.coverFees\n )\n );\n this.dispatchEvent(\n new CustomEvent('updateAmount', {\n detail: {\n plan: this.plan,\n amount: newAmount,\n baseAmount: this.donationPaymentInfo?.amount,\n coverFees: this.coverFees,\n feeCovered: this.donationPaymentInfo?.feeAmountCovered,\n },\n })\n );\n }\n\n /* captures form changes */\n captureAmountChanges(newAmount?: number) {\n if (!this.donationPaymentInfo && this.plan) {\n this.donationPaymentInfo = new DonationPaymentInfo({\n donationType: DonationType.Monthly,\n amount: 0,\n coverFees: true,\n });\n return;\n }\n\n let newPlan;\n if (newAmount) {\n newPlan = new DonationPaymentInfo({\n donationType: DonationType.Monthly,\n amount: newAmount,\n coverFees: true,\n });\n } else {\n const amount = this.donationPaymentInfo\n ? this.donationPaymentInfo.amount\n : this.plan!.amount;\n\n newPlan = new DonationPaymentInfo({\n donationType: DonationType.Monthly,\n amount,\n coverFees: true,\n });\n }\n\n this.donationPaymentInfo = newPlan;\n }\n\n closeForm() {\n this.clearInputField();\n this.clearStatusMessaging();\n this.currentlyEditing = false;\n this.coverFees = false;\n this.errorMessage = '';\n }\n\n clearInputField() {\n const input = this.form.querySelector(\n 'input[name=\"amount\"]'\n ) as HTMLInputElement;\n input.value = '';\n this.newAmount = 0;\n this.donationPaymentInfo = undefined;\n }\n\n async clearStatusMessaging() {\n this.errorMessage = '';\n this.updateMessage = '';\n this.updateStatus = '';\n await this.updateComplete;\n }\n\n /* DISPLAY */\n totalAmountWithFees(): number {\n if (this.newAmount === 0) {\n return 0;\n }\n\n return DonationPaymentInfo.calculateTotal(this.newAmount, this.coverFees);\n }\n\n get coveredFeesText() {\n return `I'll generously add $${this.donationPaymentInfo?.feeAmountCovered} to cover fees.`;\n }\n\n get editAmountForm(): TemplateResult {\n return html`\n <section>\n <form id=\"edit-plan-amount\">\n <p>Current donation amount: $${this.plan?.amount}</p>\n <div>\n $\n <input\n min=\"1\"\n max=\"9999\"\n type=\"number\"\n id=\"amount\"\n name=\"amount\"\n required=\"true\"\n @focus=${() => this.clearStatusMessaging()}\n @input=${(e: Event) => {\n const newAmount = Number((e.target as HTMLInputElement).value);\n this.captureAmountChanges(newAmount);\n this.newAmount = newAmount;\n }}\n />\n / month\n </div>\n <div>\n <div class=\"checkbox-option-container\">\n <input\n type=\"checkbox\"\n id=\"cover-fees\"\n tabindex=\"0\"\n @change=${(e: Event) => {\n const input = e.target as HTMLInputElement;\n const coverFees = input.checked;\n this.coverFees = coverFees;\n this.captureAmountChanges();\n }}\n />\n <label for=\"cover-fees\">${this.coveredFeesText}</label>\n </div>\n <p>Total: USD $${this.totalAmountWithFees()}</p>\n <div class=\"cta-container\">\n <ia-button\n class=\"ia-button secondary\"\n .clickHandler=${(e: Event) => {\n e.preventDefault();\n this.closeForm();\n }}\n >\n Cancel\n </ia-button>\n <ia-button\n id=\"update-amount\"\n class=\"ia-button primary\"\n type=\"submit\"\n .clickHandler=${async (e: Event, iaButton: IauxButton) => {\n this.clearStatusMessaging();\n\n if (!this.newAmount) {\n this.errorMessage = 'Please enter a new amount';\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n (iaButton as IauxButton).isDisabled = true;\n await iaButton.updateComplete;\n\n // check if request is in range\n const input = this.form.querySelector(\n 'input[name=\"amount\"]'\n ) as HTMLInputElement;\n const requestedAmount = Number(input.value) ?? 0;\n const amountTooLow = requestedAmount < 1;\n const amountTooHigh = requestedAmount >= 9999;\n if (amountTooLow) {\n this.errorMessage = 'Please enter a valid amount';\n }\n if (amountTooHigh) {\n this.errorMessage =\n 'Amount must be less than $9,999. Would you like to donate more? Please contact us at donations@archive.org';\n }\n if (amountTooHigh || amountTooLow) {\n // eslint-disable-next-line no-param-reassign\n (iaButton as IauxButton).isDisabled = false;\n await iaButton.updateComplete;\n return;\n }\n\n this.requestAmountUpdate(e);\n }}\n >\n Update\n </ia-button>\n <ia-mgc-update-status .status=${this.updateStatus}\n >${this.updateMessage}</ia-mgc-update-status\n >\n </div>\n </div>\n <p class=\"error\">${this.errorMessage}</p>\n </form>\n </section>\n `;\n }\n\n static styles = css`\n input#amount {\n width: 50px;\n }\n\n .cta-container {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-content: center;\n justify-content: flex-start;\n align-items: center;\n gap: 10px;\n }\n\n p.error {\n color: var(--mgc-warning-color-dark, #bb0505);\n }\n\n ia-mgc-update-status {\n display: inline-block;\n margin-left: 1rem;\n }\n\n .checkbox-option-container {\n margin: 10px 0;\n display: flex;\n }\n `;\n}\n"]}
@@ -29,7 +29,7 @@ let IauxMgcCancelPlan = class IauxMgcCancelPlan extends LitElement {
29
29
  }
30
30
  return html `
31
31
  <ia-button
32
- class="clear-container"
32
+ class="clear-container slim"
33
33
  .clickHandler=${(e, iaButton) => {
34
34
  // eslint-disable-next-line no-param-reassign
35
35
  iaButton.isDisabled = true;
@@ -104,6 +104,9 @@ let IauxMgcCancelPlan = class IauxMgcCancelPlan extends LitElement {
104
104
  }
105
105
  };
106
106
  IauxMgcCancelPlan.styles = css `
107
+ :host {
108
+ --formSectionTitleFontSize: 1.4rem;
109
+ }
107
110
  .warning > * {
108
111
  margin: 5px 0;
109
112
  }
@@ -141,7 +144,8 @@ IauxMgcCancelPlan.styles = css `
141
144
  }
142
145
 
143
146
  .checkbox-option-container {
144
- margin-bottom: 5px;
147
+ display: flex;
148
+ margin: 10px 0;
145
149
  }
146
150
  `;
147
151
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../../src/form-sections/cancel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LitElement,\n html,\n TemplateResult,\n PropertyValues,\n nothing,\n css,\n} from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport type { MonthlyPlan } from '../models/plan';\n\nimport type { IauxButton } from '../presentational/ia-button';\nimport '@internetarchive/donation-form/dist/src/form-elements/contact-form/contact-form.js';\n\nimport '@internetarchive/donation-form-section';\n\n@customElement('ia-mgc-cancel-plan')\nexport class IauxMgcCancelPlan extends LitElement {\n @property({ type: Object }) plan?: MonthlyPlan;\n\n @property({ type: Boolean, reflect: true }) patronWantsToKeepPlan = true;\n\n @property({ type: Boolean, reflect: true }) initialCancelRequest = false;\n\n @query('form') form!: HTMLFormElement;\n\n updated(changed: PropertyValues) {\n if (changed.has('plan')) {\n console.log('plan updated', this.plan);\n }\n }\n\n async cancelThisPlan(e: Event) {\n e.preventDefault();\n this.patronWantsToKeepPlan = false;\n this.dispatchEvent(new Event('cancelPlan'));\n }\n\n get formId(): string {\n return `cancel-donation-form-${this.plan?.id}`;\n }\n\n protected render() {\n if (this.initialCancelRequest) {\n return this.confirmCancelation;\n }\n\n return html`\n <ia-button\n class=\"clear-container\"\n .clickHandler=${(e: CustomEvent, iaButton: IauxButton) => {\n // eslint-disable-next-line no-param-reassign\n iaButton.isDisabled = true;\n if (this.initialCancelRequest) {\n this.initialCancelRequest = false;\n this.patronWantsToKeepPlan = true;\n return;\n }\n this.initialCancelRequest = true;\n }}\n >\n <donation-form-section\n badgemode=\"hidebadge\"\n headline=\"Cancel recurring donation (requires confirmation)\"\n >\n <div class=\"warning\">\n <p>\n You can also pause your recurring donation by setting the next\n donation date up to 12 months in the future.\n </p>\n <p>Let's cancel my donation</p>\n </div>\n </donation-form-section>\n </ia-button>\n\n ${this.initialCancelRequest ? this.confirmCancelation : nothing}\n `;\n }\n\n get confirmCancelation(): TemplateResult | typeof nothing {\n return html`\n <section class=\"cancel-donation\">\n <donation-form-section badgemode=\"hidebadge\" headline=\"Cancel recurring donation\">\n\n <ia-button class='text exit-cancel' @click=${() => {\n this.initialCancelRequest = false;\n this.patronWantsToKeepPlan = true;\n }}>X</ia-button>\n\n <p>Canceling ends your monthly recurring donation to the Internet Archive, effective immediately. You will not be charged moving forward.</p>\n <p>Canceling does not affect your account or access to the Internet Archive, although you will no longer have access to any of the Monthly Giving Circle perks.</p>\n <p>If you have any questions regarding donations, contact us at <a href=\"mailto:donations@archive.org\">donations@archive.org</a></p>\n\n <form id=${this.formId} @submit=${(e: Event) => this.cancelThisPlan(e)}>\n <div class=\"checkbox-option-container\">\n <input\n id=${`confirm-${this.formId}`}\n type=\"checkbox\"\n required\n @change=${async (e: Event) => {\n e.preventDefault();\n this.patronWantsToKeepPlan = !(e.target as HTMLInputElement)\n .checked;\n await this.updateComplete;\n }}>\n <label for=${`confirm-${this.formId}`}><b>I'm sure I want to cancel my subscription</b></label>\n </div>\n\n <ia-button\n class=\"cancel\"\n .isDisabled=${this.patronWantsToKeepPlan}\n id=${`submit-${this.formId}`}\n type=\"submit\"\n .clickHandler=${(e: Event, iaButton: IauxButton) => {\n // eslint-disable-next-line no-param-reassign\n iaButton.isDisabled = true;\n this.cancelThisPlan(e);\n }}\n >I'm sure I want to cancel my recurring donation.</ia-button>\n </form>\n </section>\n `;\n }\n\n static styles = css`\n .warning > * {\n margin: 5px 0;\n }\n\n .cancel-donation {\n display: block;\n border: 2px solid #d9534f;\n background-color: #ffeeee;\n }\n\n .cancel-donation > * {\n padding: 5px;\n position: relative;\n }\n\n ia-button.exit-cancel {\n --button-border: 1px solid;\n --button-border-radius: 50%;\n position: absolute;\n top: -5px;\n right: -10px;\n }\n\n ia-button {\n --button-height: auto;\n }\n\n ia-button > * {\n text-align: left;\n text-wrap: wrap;\n }\n\n h3 {\n position: relative;\n }\n\n .checkbox-option-container {\n margin-bottom: 5px;\n }\n `;\n}\n"]}
1
+ {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../../src/form-sections/cancel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LitElement,\n html,\n TemplateResult,\n PropertyValues,\n nothing,\n css,\n} from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport type { MonthlyPlan } from '../models/plan';\n\nimport type { IauxButton } from '../presentational/ia-button';\nimport '@internetarchive/donation-form/dist/src/form-elements/contact-form/contact-form.js';\n\nimport '@internetarchive/donation-form-section';\n\n@customElement('ia-mgc-cancel-plan')\nexport class IauxMgcCancelPlan extends LitElement {\n @property({ type: Object }) plan?: MonthlyPlan;\n\n @property({ type: Boolean, reflect: true }) patronWantsToKeepPlan = true;\n\n @property({ type: Boolean, reflect: true }) initialCancelRequest = false;\n\n @query('form') form!: HTMLFormElement;\n\n updated(changed: PropertyValues) {\n if (changed.has('plan')) {\n console.log('plan updated', this.plan);\n }\n }\n\n async cancelThisPlan(e: Event) {\n e.preventDefault();\n this.patronWantsToKeepPlan = false;\n this.dispatchEvent(new Event('cancelPlan'));\n }\n\n get formId(): string {\n return `cancel-donation-form-${this.plan?.id}`;\n }\n\n protected render() {\n if (this.initialCancelRequest) {\n return this.confirmCancelation;\n }\n\n return html`\n <ia-button\n class=\"clear-container slim\"\n .clickHandler=${(e: Event, iaButton: IauxButton) => {\n // eslint-disable-next-line no-param-reassign\n iaButton.isDisabled = true;\n if (this.initialCancelRequest) {\n this.initialCancelRequest = false;\n this.patronWantsToKeepPlan = true;\n return;\n }\n this.initialCancelRequest = true;\n }}\n >\n <donation-form-section\n badgemode=\"hidebadge\"\n headline=\"Cancel recurring donation (requires confirmation)\"\n >\n <div class=\"warning\">\n <p>\n You can also pause your recurring donation by setting the next\n donation date up to 12 months in the future.\n </p>\n <p>Let's cancel my donation</p>\n </div>\n </donation-form-section>\n </ia-button>\n\n ${this.initialCancelRequest ? this.confirmCancelation : nothing}\n `;\n }\n\n get confirmCancelation(): TemplateResult | typeof nothing {\n return html`\n <section class=\"cancel-donation\">\n <donation-form-section badgemode=\"hidebadge\" headline=\"Cancel recurring donation\">\n\n <ia-button class='text exit-cancel' @click=${() => {\n this.initialCancelRequest = false;\n this.patronWantsToKeepPlan = true;\n }}>X</ia-button>\n\n <p>Canceling ends your monthly recurring donation to the Internet Archive, effective immediately. You will not be charged moving forward.</p>\n <p>Canceling does not affect your account or access to the Internet Archive, although you will no longer have access to any of the Monthly Giving Circle perks.</p>\n <p>If you have any questions regarding donations, contact us at <a href=\"mailto:donations@archive.org\">donations@archive.org</a></p>\n\n <form id=${this.formId} @submit=${(e: Event) => this.cancelThisPlan(e)}>\n <div class=\"checkbox-option-container\">\n <input\n id=${`confirm-${this.formId}`}\n type=\"checkbox\"\n required\n @change=${async (e: Event) => {\n e.preventDefault();\n this.patronWantsToKeepPlan = !(e.target as HTMLInputElement)\n .checked;\n await this.updateComplete;\n }}>\n <label for=${`confirm-${this.formId}`}><b>I'm sure I want to cancel my subscription</b></label>\n </div>\n\n <ia-button\n class=\"cancel\"\n .isDisabled=${this.patronWantsToKeepPlan}\n id=${`submit-${this.formId}`}\n type=\"submit\"\n .clickHandler=${(e: Event, iaButton: IauxButton) => {\n // eslint-disable-next-line no-param-reassign\n iaButton.isDisabled = true;\n this.cancelThisPlan(e);\n }}\n >I'm sure I want to cancel my recurring donation.</ia-button>\n </form>\n </section>\n `;\n }\n\n static styles = css`\n :host {\n --formSectionTitleFontSize: 1.4rem;\n }\n .warning > * {\n margin: 5px 0;\n }\n\n .cancel-donation {\n display: block;\n border: 2px solid #d9534f;\n background-color: #ffeeee;\n }\n\n .cancel-donation > * {\n padding: 5px;\n position: relative;\n }\n\n ia-button.exit-cancel {\n --button-border: 1px solid;\n --button-border-radius: 50%;\n position: absolute;\n top: -5px;\n right: -10px;\n }\n\n ia-button {\n --button-height: auto;\n }\n\n ia-button > * {\n text-align: left;\n text-wrap: wrap;\n }\n\n h3 {\n position: relative;\n }\n\n .checkbox-option-container {\n display: flex;\n margin: 10px 0;\n }\n `;\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import { LitElement, PropertyValues, TemplateResult } from 'lit';
2
+ import '@internetarchive/donation-form-section';
3
+ import type { MonthlyPlan } from '../models/plan';
4
+ import '../presentational/ia-button';
5
+ import type { IauxButton } from '../presentational/ia-button';
6
+ import '../presentational/mgc-update-status';
7
+ declare type InvalidDateErrorCode = 'invalid_date' | 'date_too_early' | 'second_donation_this_month' | 'date_out_of_range' | 'same_next_billing_date' | '';
8
+ export declare class MGCEditPlanDate extends LitElement {
9
+ plan?: MonthlyPlan;
10
+ newDate?: string;
11
+ currentlyEditing: boolean;
12
+ allowEditing: boolean;
13
+ updateMessage: string;
14
+ errorMessage: string;
15
+ warningMessage: string;
16
+ updateStatus: 'success' | 'fail' | '';
17
+ form: HTMLFormElement;
18
+ formSubmitButton: IauxButton;
19
+ dateInput: HTMLInputElement;
20
+ willUpdate(changed: PropertyValues): void;
21
+ updated(changed: PropertyValues): void;
22
+ protected render(): TemplateResult<1>;
23
+ dateUpdated(status: 'success' | 'fail'): Promise<void>;
24
+ requestDateUpdate(e: Event): void;
25
+ closeForm(): void;
26
+ clearInputField(): void;
27
+ formatDateToYYYYMMDD(date: Date): string;
28
+ clearStatusMessaging(): Promise<void>;
29
+ validateChosenDate(dateString: string): {
30
+ valid: boolean;
31
+ errorCode: InvalidDateErrorCode | '';
32
+ };
33
+ get minDate(): string;
34
+ get maxDate(): string;
35
+ get editDateForm(): TemplateResult;
36
+ static styles: import("lit").CSSResult;
37
+ }
38
+ export {};