@almatar/smart-booking-dashboard 0.0.2-alpha.2 → 0.0.2-alpha.4

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 (58) hide show
  1. package/esm2022/lib/components/almatar-aside/aside.component.mjs +6 -7
  2. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +17 -12
  3. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +9 -3
  4. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.mjs +210 -0
  5. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +3 -3
  6. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +4 -4
  7. package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +11 -4
  8. package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +23 -21
  9. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +42 -34
  10. package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
  11. package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
  12. package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
  13. package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
  14. package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
  15. package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
  16. package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
  17. package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
  18. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
  19. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
  20. package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
  21. package/esm2022/lib/config/dashboard.config.mjs +3 -1
  22. package/esm2022/lib/models/reissue.types.mjs +2 -0
  23. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +9 -3
  24. package/esm2022/lib/services/reissue.service.mjs +142 -0
  25. package/esm2022/lib/services/toast.service.mjs +15 -7
  26. package/esm2022/lib/utils/reissue-format.mjs +64 -0
  27. package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
  28. package/esm2022/public-api.mjs +3 -1
  29. package/fesm2022/almatar-smart-booking-dashboard.mjs +2211 -102
  30. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  31. package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
  32. package/lib/components/almatar-aside/aside.component.d.ts +1 -2
  33. package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +3 -0
  34. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +1 -0
  35. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.d.ts +46 -0
  36. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +2 -1
  37. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +6 -0
  38. package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
  39. package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
  40. package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
  41. package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
  42. package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
  43. package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
  44. package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
  45. package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
  46. package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
  47. package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
  48. package/lib/components/result-panel/result-panel.component.d.ts +1 -1
  49. package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
  50. package/lib/config/dashboard.config.d.ts +29 -0
  51. package/lib/models/reissue.types.d.ts +147 -0
  52. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +4 -1
  53. package/lib/services/reissue.service.d.ts +45 -0
  54. package/lib/services/toast.service.d.ts +14 -1
  55. package/lib/utils/reissue-format.d.ts +28 -0
  56. package/lib/utils/reissue-url.builder.d.ts +24 -0
  57. package/package.json +9 -7
  58. package/public-api.d.ts +5 -1
@@ -0,0 +1,140 @@
1
+ import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
2
+ import { SbdReissueNoticeComponent } from '../reissue-notice/reissue-notice.component';
3
+ import * as i0 from "@angular/core";
4
+ /** Leg cards in the cancel dialog's "Select Leg" design: checkbox overlay, outline badge, times row. */
5
+ export class SbdReissueLegsStepComponent {
6
+ constructor() {
7
+ this.rows = input.required();
8
+ this.anyAvailable = input(true);
9
+ this.unavailableText = input('None of these flights can be changed online. Handle this booking manually.');
10
+ /** Extra info line, e.g. "these flights must be upgraded together". */
11
+ this.note = input(null);
12
+ this.error = input(null);
13
+ this.toggled = output();
14
+ }
15
+ /** The note under a disabled leg. */
16
+ reasonText(reason) {
17
+ switch (reason) {
18
+ case 'flown': return 'This flight has already departed.';
19
+ case 'no-options': return 'No upgrade options are available for this flight.';
20
+ default: return 'This flight doesn’t support online reissue.';
21
+ }
22
+ }
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueLegsStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdReissueLegsStepComponent, isStandalone: true, selector: "app-sbd-reissue-legs-step", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null }, anyAvailable: { classPropertyName: "anyAvailable", publicName: "anyAvailable", isSignal: true, isRequired: false, transformFunction: null }, unavailableText: { classPropertyName: "unavailableText", publicName: "unavailableText", isSignal: true, isRequired: false, transformFunction: null }, note: { classPropertyName: "note", publicName: "note", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggled: "toggled" }, host: { classAttribute: "sbd-rlegs" }, ngImport: i0, template: `
25
+ @if (!anyAvailable()) {
26
+ <app-sbd-reissue-notice tone="warn" icon="pi pi-exclamation-triangle">{{ unavailableText() }}</app-sbd-reissue-notice>
27
+ }
28
+ @if (note()) {
29
+ <app-sbd-reissue-notice icon="pi pi-info-circle">{{ note() }}</app-sbd-reissue-notice>
30
+ }
31
+ @if (error()) {
32
+ <app-sbd-reissue-notice tone="error" icon="pi pi-exclamation-circle">{{ error() }}</app-sbd-reissue-notice>
33
+ }
34
+
35
+ @for (row of rows(); track row.leg.legId) {
36
+ <div class="sbd-rlegs__card" role="checkbox" tabindex="0"
37
+ [attr.aria-checked]="row.selected" [attr.aria-disabled]="!row.available"
38
+ [class.sbd-rlegs__card--selected]="row.selected"
39
+ [class.sbd-rlegs__card--disabled]="!row.available"
40
+ (click)="toggled.emit(row.leg.legId)"
41
+ (keydown.enter)="toggled.emit(row.leg.legId)"
42
+ (keydown.space)="$event.preventDefault(); toggled.emit(row.leg.legId)">
43
+
44
+ <span class="sbd-rlegs__checkbox" [class.sbd-rlegs__checkbox--on]="row.selected" [class.sbd-rlegs__checkbox--off]="!row.available">
45
+ <i class="pi pi-check"></i>
46
+ </span>
47
+
48
+ <div class="sbd-rlegs__content">
49
+ <div class="sbd-rlegs__top">
50
+ <div>
51
+ <span class="sbd-rlegs__name">{{ row.from }} to {{ row.to }}</span>
52
+ <div class="sbd-rlegs__date">{{ row.direction ? row.direction + ' · ' : '' }}{{ row.dateLabel }}</div>
53
+ </div>
54
+ <span class="sbd-rlegs__badge" [class.sbd-rlegs__badge--green]="row.available">
55
+ {{ row.reason === 'flown' ? 'Used Flight' : row.reason === 'offline' ? 'Not supported' : row.reason ? 'Not available' : 'Available' }}
56
+ </span>
57
+ </div>
58
+
59
+ <div class="sbd-rlegs__times">
60
+ <span class="sbd-rlegs__time">{{ row.depTime }}</span>
61
+ <span class="sbd-rlegs__line">
62
+ <span class="sbd-rlegs__stops">{{ row.stopsLabel }}</span>
63
+ <i class="pi pi-arrow-right sbd-rlegs__arrow"></i>
64
+ </span>
65
+ <span class="sbd-rlegs__time">{{ row.arrTime }}</span>
66
+ </div>
67
+
68
+ @if (row.airlineLine) { <span class="sbd-rlegs__airline">{{ row.airlineLine }}</span> }
69
+
70
+ @if (!row.available) {
71
+ <div class="sbd-rlegs__notice">
72
+ <i class="pi pi-info-circle"></i>
73
+ <span>{{ reasonText(row.reason) }}</span>
74
+ </div>
75
+ }
76
+ </div>
77
+ </div>
78
+ }
79
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rlegs__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;position:relative;padding:16px 16px 16px 48px;cursor:pointer}.sbd-rlegs__card:focus-visible{outline:2px solid var(--sbd-accent, #6d4aff);outline-offset:2px}.sbd-rlegs__card--selected{border-color:var(--sbd-accent, #6d4aff)}.sbd-rlegs__card--disabled{opacity:.7;cursor:not-allowed}.sbd-rlegs__checkbox{position:absolute;top:16px;left:16px;width:22px;height:22px;border-radius:6px;border:1.5px solid #cbd5e1;background:#fff;color:#fff;font-size:12px;display:flex;align-items:center;justify-content:center}.sbd-rlegs__checkbox--on{background:var(--sbd-accent, #6d4aff);border-color:var(--sbd-accent, #6d4aff)}.sbd-rlegs__checkbox--off{background:#f1f5f9;border-color:#e2e8f0}.sbd-rlegs__content{display:flex;flex-direction:column;gap:8px}.sbd-rlegs__top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.sbd-rlegs__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rlegs__date{font-size:13px;color:#64748b;margin-top:2px}.sbd-rlegs__badge{font-size:11.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;border-radius:20px;padding:4px 14px;width:max-content;background:#f8fafc;color:#64748b;box-shadow:inset 0 0 0 1px #e2e8f0}.sbd-rlegs__badge--green{background:transparent;color:#16a34a;box-shadow:inset 0 0 0 1.5px currentColor}.sbd-rlegs__times{display:flex;align-items:center;gap:8px}.sbd-rlegs__time{font-size:18px;font-weight:700;color:#1e2e4a;font-variant-numeric:tabular-nums}.sbd-rlegs__line{flex:1;position:relative;display:flex;flex-direction:column;align-items:center;gap:2px;padding:0 16px 0 8px}.sbd-rlegs__line:before{content:\"\";position:absolute;left:0;right:14px;top:50%;height:2px;background:#cbd5e1;z-index:1}.sbd-rlegs__stops{font-size:12px;color:#64748b;background:#fff;padding:0 6px;z-index:2}.sbd-rlegs__arrow{position:absolute;right:4px;top:51%;transform:translateY(-50%);font-size:11px;color:#64748b}.sbd-rlegs__airline{font-size:12.5px;color:#64748b}.sbd-rlegs__notice{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:10px;background:#fdf1e0;color:#6b4a16;font-size:12.5px;line-height:1.4}.sbd-rlegs__notice i{flex-shrink:0;margin-top:1px;color:#b98a3e}\n"], dependencies: [{ kind: "component", type: SbdReissueNoticeComponent, selector: "app-sbd-reissue-notice", inputs: ["icon", "tone"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
80
+ }
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueLegsStepComponent, decorators: [{
82
+ type: Component,
83
+ args: [{ selector: 'app-sbd-reissue-legs-step', standalone: true, imports: [SbdReissueNoticeComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
84
+ @if (!anyAvailable()) {
85
+ <app-sbd-reissue-notice tone="warn" icon="pi pi-exclamation-triangle">{{ unavailableText() }}</app-sbd-reissue-notice>
86
+ }
87
+ @if (note()) {
88
+ <app-sbd-reissue-notice icon="pi pi-info-circle">{{ note() }}</app-sbd-reissue-notice>
89
+ }
90
+ @if (error()) {
91
+ <app-sbd-reissue-notice tone="error" icon="pi pi-exclamation-circle">{{ error() }}</app-sbd-reissue-notice>
92
+ }
93
+
94
+ @for (row of rows(); track row.leg.legId) {
95
+ <div class="sbd-rlegs__card" role="checkbox" tabindex="0"
96
+ [attr.aria-checked]="row.selected" [attr.aria-disabled]="!row.available"
97
+ [class.sbd-rlegs__card--selected]="row.selected"
98
+ [class.sbd-rlegs__card--disabled]="!row.available"
99
+ (click)="toggled.emit(row.leg.legId)"
100
+ (keydown.enter)="toggled.emit(row.leg.legId)"
101
+ (keydown.space)="$event.preventDefault(); toggled.emit(row.leg.legId)">
102
+
103
+ <span class="sbd-rlegs__checkbox" [class.sbd-rlegs__checkbox--on]="row.selected" [class.sbd-rlegs__checkbox--off]="!row.available">
104
+ <i class="pi pi-check"></i>
105
+ </span>
106
+
107
+ <div class="sbd-rlegs__content">
108
+ <div class="sbd-rlegs__top">
109
+ <div>
110
+ <span class="sbd-rlegs__name">{{ row.from }} to {{ row.to }}</span>
111
+ <div class="sbd-rlegs__date">{{ row.direction ? row.direction + ' · ' : '' }}{{ row.dateLabel }}</div>
112
+ </div>
113
+ <span class="sbd-rlegs__badge" [class.sbd-rlegs__badge--green]="row.available">
114
+ {{ row.reason === 'flown' ? 'Used Flight' : row.reason === 'offline' ? 'Not supported' : row.reason ? 'Not available' : 'Available' }}
115
+ </span>
116
+ </div>
117
+
118
+ <div class="sbd-rlegs__times">
119
+ <span class="sbd-rlegs__time">{{ row.depTime }}</span>
120
+ <span class="sbd-rlegs__line">
121
+ <span class="sbd-rlegs__stops">{{ row.stopsLabel }}</span>
122
+ <i class="pi pi-arrow-right sbd-rlegs__arrow"></i>
123
+ </span>
124
+ <span class="sbd-rlegs__time">{{ row.arrTime }}</span>
125
+ </div>
126
+
127
+ @if (row.airlineLine) { <span class="sbd-rlegs__airline">{{ row.airlineLine }}</span> }
128
+
129
+ @if (!row.available) {
130
+ <div class="sbd-rlegs__notice">
131
+ <i class="pi pi-info-circle"></i>
132
+ <span>{{ reasonText(row.reason) }}</span>
133
+ </div>
134
+ }
135
+ </div>
136
+ </div>
137
+ }
138
+ `, host: { class: 'sbd-rlegs' }, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rlegs__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;position:relative;padding:16px 16px 16px 48px;cursor:pointer}.sbd-rlegs__card:focus-visible{outline:2px solid var(--sbd-accent, #6d4aff);outline-offset:2px}.sbd-rlegs__card--selected{border-color:var(--sbd-accent, #6d4aff)}.sbd-rlegs__card--disabled{opacity:.7;cursor:not-allowed}.sbd-rlegs__checkbox{position:absolute;top:16px;left:16px;width:22px;height:22px;border-radius:6px;border:1.5px solid #cbd5e1;background:#fff;color:#fff;font-size:12px;display:flex;align-items:center;justify-content:center}.sbd-rlegs__checkbox--on{background:var(--sbd-accent, #6d4aff);border-color:var(--sbd-accent, #6d4aff)}.sbd-rlegs__checkbox--off{background:#f1f5f9;border-color:#e2e8f0}.sbd-rlegs__content{display:flex;flex-direction:column;gap:8px}.sbd-rlegs__top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.sbd-rlegs__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rlegs__date{font-size:13px;color:#64748b;margin-top:2px}.sbd-rlegs__badge{font-size:11.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;border-radius:20px;padding:4px 14px;width:max-content;background:#f8fafc;color:#64748b;box-shadow:inset 0 0 0 1px #e2e8f0}.sbd-rlegs__badge--green{background:transparent;color:#16a34a;box-shadow:inset 0 0 0 1.5px currentColor}.sbd-rlegs__times{display:flex;align-items:center;gap:8px}.sbd-rlegs__time{font-size:18px;font-weight:700;color:#1e2e4a;font-variant-numeric:tabular-nums}.sbd-rlegs__line{flex:1;position:relative;display:flex;flex-direction:column;align-items:center;gap:2px;padding:0 16px 0 8px}.sbd-rlegs__line:before{content:\"\";position:absolute;left:0;right:14px;top:50%;height:2px;background:#cbd5e1;z-index:1}.sbd-rlegs__stops{font-size:12px;color:#64748b;background:#fff;padding:0 6px;z-index:2}.sbd-rlegs__arrow{position:absolute;right:4px;top:51%;transform:translateY(-50%);font-size:11px;color:#64748b}.sbd-rlegs__airline{font-size:12.5px;color:#64748b}.sbd-rlegs__notice{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:10px;background:#fdf1e0;color:#6b4a16;font-size:12.5px;line-height:1.4}.sbd-rlegs__notice i{flex-shrink:0;margin-top:1px;color:#b98a3e}\n"] }]
139
+ }] });
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1sZWdzLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL3JlaXNzdWUtZGlhbG9nL3N0ZXBzL3JlaXNzdWUtbGVncy1zdGVwL3JlaXNzdWUtbGVncy1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBRXZGLHdHQUF3RztBQWlFeEcsTUFBTSxPQUFPLDJCQUEyQjtJQWhFeEM7UUFpRUUsU0FBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW1CLENBQUM7UUFDekMsaUJBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0Isb0JBQWUsR0FBRyxLQUFLLENBQUMsNEVBQTRFLENBQUMsQ0FBQztRQUN0Ryx1RUFBdUU7UUFDdkUsU0FBSSxHQUFHLEtBQUssQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDbEMsVUFBSyxHQUFHLEtBQUssQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDbkMsWUFBTyxHQUFHLE1BQU0sRUFBVSxDQUFDO0tBVTVCO0lBUkMscUNBQXFDO0lBQzNCLFVBQVUsQ0FBQyxNQUErQjtRQUNsRCxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxPQUFPLENBQUMsQ0FBQyxPQUFPLG1DQUFtQyxDQUFDO1lBQ3pELEtBQUssWUFBWSxDQUFDLENBQUMsT0FBTyxtREFBbUQsQ0FBQztZQUM5RSxPQUFPLENBQUMsQ0FBQyxPQUFPLDZDQUE2QyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDOytHQWhCVSwyQkFBMkI7bUdBQTNCLDJCQUEyQiw2eUJBM0Q1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVEVCwrMUVBekRTLHlCQUF5Qjs7NEZBNkR4QiwyQkFBMkI7a0JBaEV2QyxTQUFTOytCQUNFLDJCQUEyQixjQUN6QixJQUFJLFdBQ1AsQ0FBQyx5QkFBeUIsQ0FBQyxtQkFDbkIsdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVEVCxRQUVLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlaXNzdWVMZWdSb3cgfSBmcm9tICcuLi8uLi9yZWlzc3VlLnN0b3JlJztcbmltcG9ydCB7IFNiZFJlaXNzdWVOb3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi9yZWlzc3VlLW5vdGljZS9yZWlzc3VlLW5vdGljZS5jb21wb25lbnQnO1xuXG4vKiogTGVnIGNhcmRzIGluIHRoZSBjYW5jZWwgZGlhbG9nJ3MgXCJTZWxlY3QgTGVnXCIgZGVzaWduOiBjaGVja2JveCBvdmVybGF5LCBvdXRsaW5lIGJhZGdlLCB0aW1lcyByb3cuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2JkLXJlaXNzdWUtbGVncy1zdGVwJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1NiZFJlaXNzdWVOb3RpY2VDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKCFhbnlBdmFpbGFibGUoKSkge1xuICAgICAgPGFwcC1zYmQtcmVpc3N1ZS1ub3RpY2UgdG9uZT1cIndhcm5cIiBpY29uPVwicGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGVcIj57eyB1bmF2YWlsYWJsZVRleHQoKSB9fTwvYXBwLXNiZC1yZWlzc3VlLW5vdGljZT5cbiAgICB9XG4gICAgQGlmIChub3RlKCkpIHtcbiAgICAgIDxhcHAtc2JkLXJlaXNzdWUtbm90aWNlIGljb249XCJwaSBwaS1pbmZvLWNpcmNsZVwiPnt7IG5vdGUoKSB9fTwvYXBwLXNiZC1yZWlzc3VlLW5vdGljZT5cbiAgICB9XG4gICAgQGlmIChlcnJvcigpKSB7XG4gICAgICA8YXBwLXNiZC1yZWlzc3VlLW5vdGljZSB0b25lPVwiZXJyb3JcIiBpY29uPVwicGkgcGktZXhjbGFtYXRpb24tY2lyY2xlXCI+e3sgZXJyb3IoKSB9fTwvYXBwLXNiZC1yZWlzc3VlLW5vdGljZT5cbiAgICB9XG5cbiAgICBAZm9yIChyb3cgb2Ygcm93cygpOyB0cmFjayByb3cubGVnLmxlZ0lkKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwic2JkLXJsZWdzX19jYXJkXCIgcm9sZT1cImNoZWNrYm94XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInJvdy5zZWxlY3RlZFwiIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIXJvdy5hdmFpbGFibGVcIlxuICAgICAgICBbY2xhc3Muc2JkLXJsZWdzX19jYXJkLS1zZWxlY3RlZF09XCJyb3cuc2VsZWN0ZWRcIlxuICAgICAgICBbY2xhc3Muc2JkLXJsZWdzX19jYXJkLS1kaXNhYmxlZF09XCIhcm93LmF2YWlsYWJsZVwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVkLmVtaXQocm93LmxlZy5sZWdJZClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0b2dnbGVkLmVtaXQocm93LmxlZy5sZWdJZClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlZC5lbWl0KHJvdy5sZWcubGVnSWQpXCI+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcmxlZ3NfX2NoZWNrYm94XCIgW2NsYXNzLnNiZC1ybGVnc19fY2hlY2tib3gtLW9uXT1cInJvdy5zZWxlY3RlZFwiIFtjbGFzcy5zYmQtcmxlZ3NfX2NoZWNrYm94LS1vZmZdPVwiIXJvdy5hdmFpbGFibGVcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZWNrXCI+PC9pPlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ybGVnc19fY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmxlZ3NfX3RvcFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcmxlZ3NfX25hbWVcIj57eyByb3cuZnJvbSB9fSB0byB7eyByb3cudG8gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmxlZ3NfX2RhdGVcIj57eyByb3cuZGlyZWN0aW9uID8gcm93LmRpcmVjdGlvbiArICcgwrcgJyA6ICcnIH19e3sgcm93LmRhdGVMYWJlbCB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ybGVnc19fYmFkZ2VcIiBbY2xhc3Muc2JkLXJsZWdzX19iYWRnZS0tZ3JlZW5dPVwicm93LmF2YWlsYWJsZVwiPlxuICAgICAgICAgICAgICB7eyByb3cucmVhc29uID09PSAnZmxvd24nID8gJ1VzZWQgRmxpZ2h0JyA6IHJvdy5yZWFzb24gPT09ICdvZmZsaW5lJyA/ICdOb3Qgc3VwcG9ydGVkJyA6IHJvdy5yZWFzb24gPyAnTm90IGF2YWlsYWJsZScgOiAnQXZhaWxhYmxlJyB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ybGVnc19fdGltZXNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXJsZWdzX190aW1lXCI+e3sgcm93LmRlcFRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ybGVnc19fbGluZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ybGVnc19fc3RvcHNcIj57eyByb3cuc3RvcHNMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1hcnJvdy1yaWdodCBzYmQtcmxlZ3NfX2Fycm93XCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcmxlZ3NfX3RpbWVcIj57eyByb3cuYXJyVGltZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAocm93LmFpcmxpbmVMaW5lKSB7IDxzcGFuIGNsYXNzPVwic2JkLXJsZWdzX19haXJsaW5lXCI+e3sgcm93LmFpcmxpbmVMaW5lIH19PC9zcGFuPiB9XG5cbiAgICAgICAgICBAaWYgKCFyb3cuYXZhaWxhYmxlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXJsZWdzX19ub3RpY2VcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgcmVhc29uVGV4dChyb3cucmVhc29uKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi9yZWlzc3VlLWxlZ3Mtc3RlcC5jb21wb25lbnQuc2NzcycsXG4gIGhvc3Q6IHsgY2xhc3M6ICdzYmQtcmxlZ3MnIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNiZFJlaXNzdWVMZWdzU3RlcENvbXBvbmVudCB7XG4gIHJvd3MgPSBpbnB1dC5yZXF1aXJlZDxSZWlzc3VlTGVnUm93W10+KCk7XG4gIGFueUF2YWlsYWJsZSA9IGlucHV0KHRydWUpO1xuICB1bmF2YWlsYWJsZVRleHQgPSBpbnB1dCgnTm9uZSBvZiB0aGVzZSBmbGlnaHRzIGNhbiBiZSBjaGFuZ2VkIG9ubGluZS4gSGFuZGxlIHRoaXMgYm9va2luZyBtYW51YWxseS4nKTtcbiAgLyoqIEV4dHJhIGluZm8gbGluZSwgZS5nLiBcInRoZXNlIGZsaWdodHMgbXVzdCBiZSB1cGdyYWRlZCB0b2dldGhlclwiLiAqL1xuICBub3RlID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGVycm9yID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHRvZ2dsZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBUaGUgbm90ZSB1bmRlciBhIGRpc2FibGVkIGxlZy4gKi9cbiAgcHJvdGVjdGVkIHJlYXNvblRleHQocmVhc29uOiBSZWlzc3VlTGVnUm93WydyZWFzb24nXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChyZWFzb24pIHtcbiAgICAgIGNhc2UgJ2Zsb3duJzogcmV0dXJuICdUaGlzIGZsaWdodCBoYXMgYWxyZWFkeSBkZXBhcnRlZC4nO1xuICAgICAgY2FzZSAnbm8tb3B0aW9ucyc6IHJldHVybiAnTm8gdXBncmFkZSBvcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgZmxpZ2h0Lic7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ1RoaXMgZmxpZ2h0IGRvZXNu4oCZdCBzdXBwb3J0IG9ubGluZSByZWlzc3VlLic7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** Icon + message box used for the info callout, loading / error states and the validation hint. */
4
+ export class SbdReissueNoticeComponent {
5
+ constructor() {
6
+ this.icon = input('pi pi-info-circle');
7
+ this.tone = input('info');
8
+ }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueNoticeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: SbdReissueNoticeComponent, isStandalone: true, selector: "app-sbd-reissue-notice", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "\"sbd-notice sbd-notice--\" + tone()" } }, ngImport: i0, template: `<i [class]="icon()"></i><span class="sbd-notice__text"><ng-content /></span><ng-content select="[action]" />`, isInline: true, styles: [":host{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:12px;font-size:13px;line-height:1.5}:host i{flex-shrink:0;margin-top:1px}:host .sbd-notice__text{flex:1}:host(.sbd-notice--info){background:#eaf2ff;border:1px solid #b9d6ff;color:#1a5fd6}:host(.sbd-notice--warn){background:#fdf3e3;border:1px solid #f3d9a4;color:#8a5a1e}:host(.sbd-notice--warn) i{color:#b98a3e}:host(.sbd-notice--error){background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}:host(.sbd-notice--success){background:#f0fdf4;border:1px solid #bbf7d0;color:#166534}:host(.sbd-notice--muted){align-items:center;color:#64748b}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueNoticeComponent, decorators: [{
13
+ type: Component,
14
+ args: [{ selector: 'app-sbd-reissue-notice', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class]': '"sbd-notice sbd-notice--" + tone()' }, template: `<i [class]="icon()"></i><span class="sbd-notice__text"><ng-content /></span><ng-content select="[action]" />`, styles: [":host{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:12px;font-size:13px;line-height:1.5}:host i{flex-shrink:0;margin-top:1px}:host .sbd-notice__text{flex:1}:host(.sbd-notice--info){background:#eaf2ff;border:1px solid #b9d6ff;color:#1a5fd6}:host(.sbd-notice--warn){background:#fdf3e3;border:1px solid #f3d9a4;color:#8a5a1e}:host(.sbd-notice--warn) i{color:#b98a3e}:host(.sbd-notice--error){background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}:host(.sbd-notice--success){background:#f0fdf4;border:1px solid #bbf7d0;color:#166534}:host(.sbd-notice--muted){align-items:center;color:#64748b}\n"] }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1ub3RpY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL3JlaXNzdWUtZGlhbG9nL3N0ZXBzL3JlaXNzdWUtbm90aWNlL3JlaXNzdWUtbm90aWNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFMUUsb0dBQW9HO0FBU3BHLE1BQU0sT0FBTyx5QkFBeUI7SUFSdEM7UUFTRSxTQUFJLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEMsU0FBSSxHQUFHLEtBQUssQ0FBa0QsTUFBTSxDQUFDLENBQUM7S0FDdkU7K0dBSFkseUJBQXlCO21HQUF6Qix5QkFBeUIsbVpBSDFCLDhHQUE4Rzs7NEZBRzdHLHlCQUF5QjtrQkFSckMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDLEVBQUUsU0FBUyxFQUFFLG9DQUFvQyxFQUFFLFlBQy9DLDhHQUE4RyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKiBJY29uICsgbWVzc2FnZSBib3ggdXNlZCBmb3IgdGhlIGluZm8gY2FsbG91dCwgbG9hZGluZyAvIGVycm9yIHN0YXRlcyBhbmQgdGhlIHZhbGlkYXRpb24gaGludC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zYmQtcmVpc3N1ZS1ub3RpY2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyAnW2NsYXNzXSc6ICdcInNiZC1ub3RpY2Ugc2JkLW5vdGljZS0tXCIgKyB0b25lKCknIH0sXG4gIHRlbXBsYXRlOiBgPGkgW2NsYXNzXT1cImljb24oKVwiPjwvaT48c3BhbiBjbGFzcz1cInNiZC1ub3RpY2VfX3RleHRcIj48bmctY29udGVudCAvPjwvc3Bhbj48bmctY29udGVudCBzZWxlY3Q9XCJbYWN0aW9uXVwiIC8+YCxcbiAgc3R5bGVVcmw6ICcuL3JlaXNzdWUtbm90aWNlLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgU2JkUmVpc3N1ZU5vdGljZUNvbXBvbmVudCB7XG4gIGljb24gPSBpbnB1dCgncGkgcGktaW5mby1jaXJjbGUnKTtcbiAgdG9uZSA9IGlucHV0PCdpbmZvJyB8ICdlcnJvcicgfCAnd2FybicgfCAnbXV0ZWQnIHwgJ3N1Y2Nlc3MnPignaW5mbycpO1xufVxuIl19
@@ -0,0 +1,104 @@
1
+ import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { NgSelectModule } from '@ng-select/ng-select';
4
+ import { compareAirports } from '../../../../utils/reissue-format';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@ng-select/ng-select";
8
+ export class SbdReissueRouteStepComponent {
9
+ constructor() {
10
+ this.rows = input.required();
11
+ this.options = input.required();
12
+ this.airportChanged = output();
13
+ this.searched = output();
14
+ this.swapped = output();
15
+ this.compare = compareAirports;
16
+ this.sides = [
17
+ { key: 'origin', label: 'From' },
18
+ { key: 'destination', label: 'To' },
19
+ ];
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueRouteStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdReissueRouteStepComponent, isStandalone: true, selector: "app-sbd-reissue-route-step", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { airportChanged: "airportChanged", searched: "searched", swapped: "swapped" }, host: { classAttribute: "sbd-rroute" }, ngImport: i0, template: `
23
+ @for (row of rows(); track row.leg.legId) {
24
+ <div class="sbd-rroute__card">
25
+ <div class="sbd-rroute__head">
26
+ <span class="sbd-rroute__name">{{ row.leg.originCode }} to {{ row.leg.destinationCode }}</span>
27
+ <span class="sbd-rroute__current">Currently {{ row.current }}</span>
28
+ </div>
29
+
30
+ <div class="sbd-rroute__pair">
31
+ @for (side of sides; track side.key) {
32
+ <label class="sbd-rroute__field">
33
+ <span>{{ side.label }}</span>
34
+ <ng-select class="sbd-rroute__select" bindLabel="label" [clearable]="false"
35
+ [items]="options()" [compareWith]="compare" [ngModel]="row[side.key]"
36
+ (ngModelChange)="airportChanged.emit({ legId: row.leg.legId, side: side.key, airport: $event })"
37
+ (search)="searched.emit($event.term)">
38
+ <ng-template ng-label-tmp let-item="item">{{ item.city_name }} ({{ item.id }})</ng-template>
39
+ <ng-template ng-option-tmp let-item="item">
40
+ <div class="sbd-rroute__opt"><b>{{ item.city_name }} ({{ item.id }})</b><small>{{ item.name }}</small></div>
41
+ </ng-template>
42
+ </ng-select>
43
+ </label>
44
+
45
+ <!-- Swap arrow, between From and To -->
46
+ @if ($first) {
47
+ <button type="button" class="sbd-rroute__swap" aria-label="Swap origin and destination"
48
+ (click)="swapped.emit(row.leg.legId)">
49
+ <!-- Inline SVG: primeicons 4.x has no horizontal swap arrows. -->
50
+ <svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.6"
51
+ stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
52
+ <path d="M2 5.5h11M10.5 3l2.5 2.5-2.5 2.5M14 10.5H3M5.5 8 3 10.5 5.5 13" />
53
+ </svg>
54
+ </button>
55
+ }
56
+ }
57
+ </div>
58
+ </div>
59
+ }
60
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rroute__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:14px}.sbd-rroute__head{display:flex;flex-direction:column;gap:2px}.sbd-rroute__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rroute__current{font-size:13px;color:#64748b}.sbd-rroute__field{display:flex;flex-direction:column;gap:6px;min-width:0;font-size:12.5px;font-weight:600;color:#475569}.sbd-rroute__pair{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:8px;align-items:end}.sbd-rroute__swap{width:32px;height:32px;margin-bottom:4px;border-radius:50%;border:1.5px solid #e2e8f0;background:#fff;color:#1e2e4a;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s,border-color .15s}.sbd-rroute__swap .pi{font-size:13px}.sbd-rroute__swap:hover{background:#f8fafc;border-color:var(--sbd-accent, #6d4aff)}.sbd-rroute__opt{display:flex;flex-direction:column;line-height:1.3;min-width:0}.sbd-rroute__opt b{font-size:13px;font-weight:600;color:#1e2e4a}.sbd-rroute__opt small{font-size:11px;color:#64748b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .sbd-rroute__select{font-size:13px;font-weight:400;color:#1e2e4a}:host ::ng-deep .sbd-rroute__select .ng-select-container{min-height:40px;border-radius:10px;border:1.5px solid #e2e8f0}:host ::ng-deep .sbd-rroute__select.ng-select-focused:not(.ng-select-opened)>.ng-select-container{border-color:var(--sbd-accent, #6d4aff);box-shadow:none}:host ::ng-deep .sbd-rroute__select .ng-value-container .ng-value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel{min-width:100%;z-index:1100;border-radius:10px}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-dropdown-panel-items{max-height:220px}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-option{padding:8px 12px;font-size:13px;white-space:normal}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-option.ng-option-selected,:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-option.ng-option-marked{background:var(--sbd-accent-soft, #ede9fe)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "ariaLabel", "markFirst", "placeholder", "fixedPlaceholder", "notFoundText", "typeToSearchText", "preventToggleOnRightClick", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "ngClass", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick", "keyDownFn"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i2.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i2.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
61
+ }
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueRouteStepComponent, decorators: [{
63
+ type: Component,
64
+ args: [{ selector: 'app-sbd-reissue-route-step', standalone: true, imports: [FormsModule, NgSelectModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
65
+ @for (row of rows(); track row.leg.legId) {
66
+ <div class="sbd-rroute__card">
67
+ <div class="sbd-rroute__head">
68
+ <span class="sbd-rroute__name">{{ row.leg.originCode }} to {{ row.leg.destinationCode }}</span>
69
+ <span class="sbd-rroute__current">Currently {{ row.current }}</span>
70
+ </div>
71
+
72
+ <div class="sbd-rroute__pair">
73
+ @for (side of sides; track side.key) {
74
+ <label class="sbd-rroute__field">
75
+ <span>{{ side.label }}</span>
76
+ <ng-select class="sbd-rroute__select" bindLabel="label" [clearable]="false"
77
+ [items]="options()" [compareWith]="compare" [ngModel]="row[side.key]"
78
+ (ngModelChange)="airportChanged.emit({ legId: row.leg.legId, side: side.key, airport: $event })"
79
+ (search)="searched.emit($event.term)">
80
+ <ng-template ng-label-tmp let-item="item">{{ item.city_name }} ({{ item.id }})</ng-template>
81
+ <ng-template ng-option-tmp let-item="item">
82
+ <div class="sbd-rroute__opt"><b>{{ item.city_name }} ({{ item.id }})</b><small>{{ item.name }}</small></div>
83
+ </ng-template>
84
+ </ng-select>
85
+ </label>
86
+
87
+ <!-- Swap arrow, between From and To -->
88
+ @if ($first) {
89
+ <button type="button" class="sbd-rroute__swap" aria-label="Swap origin and destination"
90
+ (click)="swapped.emit(row.leg.legId)">
91
+ <!-- Inline SVG: primeicons 4.x has no horizontal swap arrows. -->
92
+ <svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.6"
93
+ stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
94
+ <path d="M2 5.5h11M10.5 3l2.5 2.5-2.5 2.5M14 10.5H3M5.5 8 3 10.5 5.5 13" />
95
+ </svg>
96
+ </button>
97
+ }
98
+ }
99
+ </div>
100
+ </div>
101
+ }
102
+ `, host: { class: 'sbd-rroute' }, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rroute__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:14px}.sbd-rroute__head{display:flex;flex-direction:column;gap:2px}.sbd-rroute__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rroute__current{font-size:13px;color:#64748b}.sbd-rroute__field{display:flex;flex-direction:column;gap:6px;min-width:0;font-size:12.5px;font-weight:600;color:#475569}.sbd-rroute__pair{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:8px;align-items:end}.sbd-rroute__swap{width:32px;height:32px;margin-bottom:4px;border-radius:50%;border:1.5px solid #e2e8f0;background:#fff;color:#1e2e4a;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s,border-color .15s}.sbd-rroute__swap .pi{font-size:13px}.sbd-rroute__swap:hover{background:#f8fafc;border-color:var(--sbd-accent, #6d4aff)}.sbd-rroute__opt{display:flex;flex-direction:column;line-height:1.3;min-width:0}.sbd-rroute__opt b{font-size:13px;font-weight:600;color:#1e2e4a}.sbd-rroute__opt small{font-size:11px;color:#64748b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .sbd-rroute__select{font-size:13px;font-weight:400;color:#1e2e4a}:host ::ng-deep .sbd-rroute__select .ng-select-container{min-height:40px;border-radius:10px;border:1.5px solid #e2e8f0}:host ::ng-deep .sbd-rroute__select.ng-select-focused:not(.ng-select-opened)>.ng-select-container{border-color:var(--sbd-accent, #6d4aff);box-shadow:none}:host ::ng-deep .sbd-rroute__select .ng-value-container .ng-value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel{min-width:100%;z-index:1100;border-radius:10px}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-dropdown-panel-items{max-height:220px}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-option{padding:8px 12px;font-size:13px;white-space:normal}:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-option.ng-option-selected,:host ::ng-deep .sbd-rroute__select .ng-dropdown-panel .ng-option.ng-option-marked{background:var(--sbd-accent-soft, #ede9fe)}\n"] }]
103
+ }] });
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1yb3V0ZS1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9yZWlzc3VlLWRpYWxvZy9zdGVwcy9yZWlzc3VlLXJvdXRlLXN0ZXAvcmVpc3N1ZS1yb3V0ZS1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFrRG5FLE1BQU0sT0FBTyw0QkFBNEI7SUEvQ3pDO1FBZ0RFLFNBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFxQixDQUFDO1FBQzNDLFlBQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFtQixDQUFDO1FBQzVDLG1CQUFjLEdBQUcsTUFBTSxFQUF3RSxDQUFDO1FBQ2hHLGFBQVEsR0FBRyxNQUFNLEVBQVUsQ0FBQztRQUM1QixZQUFPLEdBQUcsTUFBTSxFQUFVLENBQUM7UUFFbEIsWUFBTyxHQUFHLGVBQWUsQ0FBQztRQUMxQixVQUFLLEdBQTBDO1lBQ3RELEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQ2hDLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1NBQ3BDLENBQUM7S0FDSDsrR0FaWSw0QkFBNEI7bUdBQTVCLDRCQUE0QixvZEExQzdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDVCxtekVBeENTLFdBQVcsOFZBQUUsY0FBYzs7NEZBNEMxQiw0QkFBNEI7a0JBL0N4QyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1AsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLG1CQUNyQix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDVCxRQUVLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmdTZWxlY3RNb2R1bGUgfSBmcm9tICdAbmctc2VsZWN0L25nLXNlbGVjdCc7XG5pbXBvcnQgeyBSZWlzc3VlQWlycG9ydCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9yZWlzc3VlLnR5cGVzJztcbmltcG9ydCB7IGNvbXBhcmVBaXJwb3J0cyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL3JlaXNzdWUtZm9ybWF0JztcbmltcG9ydCB7IEFpcnBvcnRPcHRpb24sIEFpcnBvcnRTaWRlLCBSZWlzc3VlUm91dGVSb3cgfSBmcm9tICcuLi8uLi9yZWlzc3VlLnN0b3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNiZC1yZWlzc3VlLXJvdXRlLXN0ZXAnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIE5nU2VsZWN0TW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgQGZvciAocm93IG9mIHJvd3MoKTsgdHJhY2sgcm93LmxlZy5sZWdJZCkge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ycm91dGVfX2NhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ycm91dGVfX2hlYWRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ycm91dGVfX25hbWVcIj57eyByb3cubGVnLm9yaWdpbkNvZGUgfX0gdG8ge3sgcm93LmxlZy5kZXN0aW5hdGlvbkNvZGUgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcnJvdXRlX19jdXJyZW50XCI+Q3VycmVudGx5IHt7IHJvdy5jdXJyZW50IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXJyb3V0ZV9fcGFpclwiPlxuICAgICAgICAgIEBmb3IgKHNpZGUgb2Ygc2lkZXM7IHRyYWNrIHNpZGUua2V5KSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzYmQtcnJvdXRlX19maWVsZFwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBzaWRlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8bmctc2VsZWN0IGNsYXNzPVwic2JkLXJyb3V0ZV9fc2VsZWN0XCIgYmluZExhYmVsPVwibGFiZWxcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwib3B0aW9ucygpXCIgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVcIiBbbmdNb2RlbF09XCJyb3dbc2lkZS5rZXldXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJhaXJwb3J0Q2hhbmdlZC5lbWl0KHsgbGVnSWQ6IHJvdy5sZWcubGVnSWQsIHNpZGU6IHNpZGUua2V5LCBhaXJwb3J0OiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgIChzZWFyY2gpPVwic2VhcmNoZWQuZW1pdCgkZXZlbnQudGVybSlcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctbGFiZWwtdG1wIGxldC1pdGVtPVwiaXRlbVwiPnt7IGl0ZW0uY2l0eV9uYW1lIH19ICh7eyBpdGVtLmlkIH19KTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXJyb3V0ZV9fb3B0XCI+PGI+e3sgaXRlbS5jaXR5X25hbWUgfX0gKHt7IGl0ZW0uaWQgfX0pPC9iPjxzbWFsbD57eyBpdGVtLm5hbWUgfX08L3NtYWxsPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxuICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgPCEtLSBTd2FwIGFycm93LCBiZXR3ZWVuIEZyb20gYW5kIFRvIC0tPlxuICAgICAgICAgICAgQGlmICgkZmlyc3QpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYmQtcnJvdXRlX19zd2FwXCIgYXJpYS1sYWJlbD1cIlN3YXAgb3JpZ2luIGFuZCBkZXN0aW5hdGlvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3YXBwZWQuZW1pdChyb3cubGVnLmxlZ0lkKVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gSW5saW5lIFNWRzogcHJpbWVpY29ucyA0LnggaGFzIG5vIGhvcml6b250YWwgc3dhcCBhcnJvd3MuIC0tPlxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDUuNWgxMU0xMC41IDNsMi41IDIuNS0yLjUgMi41TTE0IDEwLjVIM001LjUgOCAzIDEwLjUgNS41IDEzXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3JlaXNzdWUtcm91dGUtc3RlcC5jb21wb25lbnQuc2NzcycsXG4gIGhvc3Q6IHsgY2xhc3M6ICdzYmQtcnJvdXRlJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBTYmRSZWlzc3VlUm91dGVTdGVwQ29tcG9uZW50IHtcbiAgcm93cyA9IGlucHV0LnJlcXVpcmVkPFJlaXNzdWVSb3V0ZVJvd1tdPigpO1xuICBvcHRpb25zID0gaW5wdXQucmVxdWlyZWQ8QWlycG9ydE9wdGlvbltdPigpO1xuICBhaXJwb3J0Q2hhbmdlZCA9IG91dHB1dDx7IGxlZ0lkOiBzdHJpbmc7IHNpZGU6IEFpcnBvcnRTaWRlOyBhaXJwb3J0OiBSZWlzc3VlQWlycG9ydCB8IG51bGwgfT4oKTtcbiAgc2VhcmNoZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICBzd2FwcGVkID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICByZWFkb25seSBjb21wYXJlID0gY29tcGFyZUFpcnBvcnRzO1xuICByZWFkb25seSBzaWRlczogeyBrZXk6IEFpcnBvcnRTaWRlOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IGtleTogJ29yaWdpbicsIGxhYmVsOiAnRnJvbScgfSxcbiAgICB7IGtleTogJ2Rlc3RpbmF0aW9uJywgbGFiZWw6ICdUbycgfSxcbiAgXTtcbn1cbiJdfQ==
@@ -0,0 +1,44 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ const OPTIONS = [
4
+ { key: 'change_date', icon: 'pi pi-calendar', title: 'Change Flight Date', description: 'Move one or more flights to a new date' },
5
+ { key: 'change_route', icon: 'pi pi-map', title: 'Change Route', description: 'Change the origin or destination airport' },
6
+ { key: 'upgrade_class', icon: 'pi pi-arrow-up', title: 'Upgrade Class', description: 'Move to a higher cabin or fare class' },
7
+ ];
8
+ export class SbdReissueServiceStepComponent {
9
+ constructor() {
10
+ this.upgradeAvailable = input(false);
11
+ this.chosen = output();
12
+ /** Upgrade Class is listed only when the upgrade-class API returned options. */
13
+ this.options = computed(() => OPTIONS.filter(o => o.key !== 'upgrade_class' || this.upgradeAvailable()));
14
+ }
15
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueServiceStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdReissueServiceStepComponent, isStandalone: true, selector: "app-sbd-reissue-service-step", inputs: { upgradeAvailable: { classPropertyName: "upgradeAvailable", publicName: "upgradeAvailable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { chosen: "chosen" }, host: { classAttribute: "sbd-rsvc" }, ngImport: i0, template: `
17
+ @for (option of options(); track option.key) {
18
+ <button type="button" class="sbd-rsvc__option" (click)="chosen.emit(option.key)">
19
+ <span class="sbd-rsvc__icon"><i [class]="option.icon"></i></span>
20
+ <span class="sbd-rsvc__text">
21
+ <strong>{{ option.title }}</strong>
22
+ <small>{{ option.description }}</small>
23
+ </span>
24
+ <i class="pi pi-chevron-right sbd-rsvc__arrow"></i>
25
+ </button>
26
+ }
27
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rsvc__option{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;display:flex;align-items:center;gap:12px;width:100%;padding:16px;text-align:left;font-family:inherit;cursor:pointer}.sbd-rsvc__option:hover{border-color:var(--sbd-accent, #6d4aff)}.sbd-rsvc__icon{flex-shrink:0;width:44px;height:44px;border-radius:10px;border:1px solid #e2e8f0;color:#1e2e4a;display:flex;align-items:center;justify-content:center}.sbd-rsvc__icon .pi{font-size:16px}.sbd-rsvc__text{flex:1;display:flex;flex-direction:column;gap:2px}.sbd-rsvc__text strong{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rsvc__text small{font-size:12.5px;color:#64748b}.sbd-rsvc__arrow{color:#94a3b8;font-size:12px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueServiceStepComponent, decorators: [{
30
+ type: Component,
31
+ args: [{ selector: 'app-sbd-reissue-service-step', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
32
+ @for (option of options(); track option.key) {
33
+ <button type="button" class="sbd-rsvc__option" (click)="chosen.emit(option.key)">
34
+ <span class="sbd-rsvc__icon"><i [class]="option.icon"></i></span>
35
+ <span class="sbd-rsvc__text">
36
+ <strong>{{ option.title }}</strong>
37
+ <small>{{ option.description }}</small>
38
+ </span>
39
+ <i class="pi pi-chevron-right sbd-rsvc__arrow"></i>
40
+ </button>
41
+ }
42
+ `, host: { class: 'sbd-rsvc' }, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rsvc__option{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;display:flex;align-items:center;gap:12px;width:100%;padding:16px;text-align:left;font-family:inherit;cursor:pointer}.sbd-rsvc__option:hover{border-color:var(--sbd-accent, #6d4aff)}.sbd-rsvc__icon{flex-shrink:0;width:44px;height:44px;border-radius:10px;border:1px solid #e2e8f0;color:#1e2e4a;display:flex;align-items:center;justify-content:center}.sbd-rsvc__icon .pi{font-size:16px}.sbd-rsvc__text{flex:1;display:flex;flex-direction:column;gap:2px}.sbd-rsvc__text strong{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rsvc__text small{font-size:12.5px;color:#64748b}.sbd-rsvc__arrow{color:#94a3b8;font-size:12px}\n"] }]
43
+ }] });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1zZXJ2aWNlLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL3JlaXNzdWUtZGlhbG9nL3N0ZXBzL3JlaXNzdWUtc2VydmljZS1zdGVwL3JlaXNzdWUtc2VydmljZS1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUs1RixNQUFNLE9BQU8sR0FBb0I7SUFDL0IsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLHdDQUF3QyxFQUFFO0lBQ2xJLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLDBDQUEwQyxFQUFFO0lBQzFILEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsc0NBQXNDLEVBQUU7Q0FDOUgsQ0FBQztBQXFCRixNQUFNLE9BQU8sOEJBQThCO0lBbkIzQztRQW9CRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsV0FBTSxHQUFHLE1BQU0sRUFBcUIsQ0FBQztRQUVyQyxnRkFBZ0Y7UUFDdEUsWUFBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxlQUFlLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQy9HOytHQU5ZLDhCQUE4QjttR0FBOUIsOEJBQThCLGtVQWYvQjs7Ozs7Ozs7Ozs7R0FXVDs7NEZBSVUsOEJBQThCO2tCQW5CMUMsU0FBUzsrQkFDRSw4QkFBOEIsY0FDNUIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7OztHQVdULFFBRUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlaXNzdWVTZXJ2aWNlS2V5IH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlaXNzdWUudHlwZXMnO1xuXG5pbnRlcmZhY2UgU2VydmljZU9wdGlvbiB7IGtleTogUmVpc3N1ZVNlcnZpY2VLZXk7IGljb246IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9XG5cbmNvbnN0IE9QVElPTlM6IFNlcnZpY2VPcHRpb25bXSA9IFtcbiAgeyBrZXk6ICdjaGFuZ2VfZGF0ZScsIGljb246ICdwaSBwaS1jYWxlbmRhcicsIHRpdGxlOiAnQ2hhbmdlIEZsaWdodCBEYXRlJywgZGVzY3JpcHRpb246ICdNb3ZlIG9uZSBvciBtb3JlIGZsaWdodHMgdG8gYSBuZXcgZGF0ZScgfSxcbiAgeyBrZXk6ICdjaGFuZ2Vfcm91dGUnLCBpY29uOiAncGkgcGktbWFwJywgdGl0bGU6ICdDaGFuZ2UgUm91dGUnLCBkZXNjcmlwdGlvbjogJ0NoYW5nZSB0aGUgb3JpZ2luIG9yIGRlc3RpbmF0aW9uIGFpcnBvcnQnIH0sXG4gIHsga2V5OiAndXBncmFkZV9jbGFzcycsIGljb246ICdwaSBwaS1hcnJvdy11cCcsIHRpdGxlOiAnVXBncmFkZSBDbGFzcycsIGRlc2NyaXB0aW9uOiAnTW92ZSB0byBhIGhpZ2hlciBjYWJpbiBvciBmYXJlIGNsYXNzJyB9LFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNiZC1yZWlzc3VlLXNlcnZpY2Utc3RlcCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zKCk7IHRyYWNrIG9wdGlvbi5rZXkpIHtcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2JkLXJzdmNfX29wdGlvblwiIChjbGljayk9XCJjaG9zZW4uZW1pdChvcHRpb24ua2V5KVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1yc3ZjX19pY29uXCI+PGkgW2NsYXNzXT1cIm9wdGlvbi5pY29uXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcnN2Y19fdGV4dFwiPlxuICAgICAgICAgIDxzdHJvbmc+e3sgb3B0aW9uLnRpdGxlIH19PC9zdHJvbmc+XG4gICAgICAgICAgPHNtYWxsPnt7IG9wdGlvbi5kZXNjcmlwdGlvbiB9fTwvc21hbGw+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jaGV2cm9uLXJpZ2h0IHNiZC1yc3ZjX19hcnJvd1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3JlaXNzdWUtc2VydmljZS1zdGVwLmNvbXBvbmVudC5zY3NzJyxcbiAgaG9zdDogeyBjbGFzczogJ3NiZC1yc3ZjJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBTYmRSZWlzc3VlU2VydmljZVN0ZXBDb21wb25lbnQge1xuICB1cGdyYWRlQXZhaWxhYmxlID0gaW5wdXQoZmFsc2UpO1xuICBjaG9zZW4gPSBvdXRwdXQ8UmVpc3N1ZVNlcnZpY2VLZXk+KCk7XG5cbiAgLyoqIFVwZ3JhZGUgQ2xhc3MgaXMgbGlzdGVkIG9ubHkgd2hlbiB0aGUgdXBncmFkZS1jbGFzcyBBUEkgcmV0dXJuZWQgb3B0aW9ucy4gKi9cbiAgcHJvdGVjdGVkIG9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiBPUFRJT05TLmZpbHRlcihvID0+IG8ua2V5ICE9PSAndXBncmFkZV9jbGFzcycgfHwgdGhpcy51cGdyYWRlQXZhaWxhYmxlKCkpKTtcbn1cbiJdfQ==
@@ -0,0 +1,193 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';
2
+ import { ButtonModule } from 'primeng/button';
3
+ import { formatCountdown, parseLinkExpiry } from '../../../../utils/reissue-format';
4
+ import { SbdReissueNoticeComponent } from '../reissue-notice/reissue-notice.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "primeng/button";
7
+ export class SbdReissueUpgradeConfirmStepComponent {
8
+ constructor() {
9
+ this.rows = input.required();
10
+ this.total = input(0);
11
+ this.totalLabel = input('');
12
+ this.priceChanged = input(false);
13
+ /** `book-now` was sent. */
14
+ this.booked = input(false);
15
+ this.link = input(null);
16
+ this.error = input(null);
17
+ /** The link expired and the agent chose to redo the upgrade from the beginning. */
18
+ this.restart = output();
19
+ this.copied = signal(false);
20
+ /** Ticks every second so the countdown (and the expired state) update on their own. */
21
+ this.now = signal(Date.now());
22
+ this.remainingMs = computed(() => {
23
+ const expiry = parseLinkExpiry(this.link()?.expiresAt);
24
+ return expiry == null ? null : expiry - this.now();
25
+ });
26
+ this.expired = computed(() => {
27
+ const left = this.remainingMs();
28
+ return left != null && left <= 0;
29
+ });
30
+ /** `mm:ss` until the link expires; empty when the backend sent no (valid) expiry. */
31
+ this.countdown = computed(() => {
32
+ const left = this.remainingMs();
33
+ return left == null || left <= 0 ? '' : formatCountdown(left);
34
+ });
35
+ /** Last two minutes: highlight the countdown. */
36
+ this.soon = computed(() => (this.remainingMs() ?? Infinity) <= 2 * 60 * 1000);
37
+ const timer = setInterval(() => this.now.set(Date.now()), 1000);
38
+ inject(DestroyRef).onDestroy(() => clearInterval(timer));
39
+ }
40
+ async copy(url) {
41
+ try {
42
+ await navigator.clipboard.writeText(url);
43
+ this.copied.set(true);
44
+ setTimeout(() => this.copied.set(false), 1500);
45
+ }
46
+ catch {
47
+ // Clipboard blocked (e.g. insecure context): the input is selectable, so the agent can still copy by hand.
48
+ }
49
+ }
50
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueUpgradeConfirmStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
51
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdReissueUpgradeConfirmStepComponent, isStandalone: true, selector: "app-sbd-reissue-upgrade-confirm-step", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, totalLabel: { classPropertyName: "totalLabel", publicName: "totalLabel", isSignal: true, isRequired: false, transformFunction: null }, priceChanged: { classPropertyName: "priceChanged", publicName: "priceChanged", isSignal: true, isRequired: false, transformFunction: null }, booked: { classPropertyName: "booked", publicName: "booked", isSignal: true, isRequired: false, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { restart: "restart" }, host: { classAttribute: "sbd-rconf" }, ngImport: i0, template: `
52
+ @if (priceChanged()) {
53
+ <app-sbd-reissue-notice tone="warn" icon="pi pi-exclamation-triangle">
54
+ The price changed since the options were loaded. Check the total below.
55
+ </app-sbd-reissue-notice>
56
+ }
57
+ @if (error()) {
58
+ <app-sbd-reissue-notice tone="error" icon="pi pi-exclamation-circle">{{ error() }}</app-sbd-reissue-notice>
59
+ }
60
+
61
+ <div class="sbd-rconf__summary">
62
+ @for (row of rows(); track row.title) {
63
+ <div class="sbd-rconf__row">
64
+ <span class="sbd-rconf__row-main">
65
+ <b>{{ row.title }}</b>
66
+ <small>{{ row.from ? row.from + ' → ' : '' }}{{ row.to }}</small>
67
+ </span>
68
+ <strong>{{ row.extraLabel }}</strong>
69
+ </div>
70
+ }
71
+ <div class="sbd-rconf__total">
72
+ <span>Total to pay</span>
73
+ <strong>{{ totalLabel() }}</strong>
74
+ </div>
75
+ </div>
76
+
77
+ @if (link(); as link) {
78
+ @if (expired()) {
79
+ <app-sbd-reissue-notice tone="error" icon="pi pi-clock">
80
+ The payment link expired. Start the upgrade again from the beginning.
81
+ <button action pButton type="button" class="p-button-sm p-button-outlined p-button-secondary" label="Start again"
82
+ (click)="restart.emit()"></button>
83
+ </app-sbd-reissue-notice>
84
+ } @else {
85
+ <div class="sbd-rconf__link">
86
+ <div class="sbd-rconf__link-head"><b>Payment link</b><small>Send it to the customer</small></div>
87
+ <div class="sbd-rconf__link-row">
88
+ <input class="sbd-rconf__link-input" readonly [value]="link.url" (focus)="$any($event.target).select()" />
89
+ <button pButton type="button" class="p-button-sm p-button-outlined p-button-secondary"
90
+ [icon]="copied() ? 'pi pi-check' : 'pi pi-copy'" [label]="copied() ? 'Copied' : 'Copy'" (click)="copy(link.url)"></button>
91
+ </div>
92
+ @if (countdown(); as left) {
93
+ <small class="sbd-rconf__expiry" [class.sbd-rconf__expiry--soon]="soon()">Link expires in {{ left }}</small>
94
+ } @else if (link.expiresAt) {
95
+ <small class="sbd-rconf__expiry">Expires {{ link.expiresAt.slice(0, 16).replace('T', ' ') }}</small>
96
+ }
97
+ </div>
98
+ }
99
+ }
100
+
101
+ <!-- The dialog does not follow the result: after book-now, or once the link is sent, the agent follows the booking. -->
102
+ @if (booked()) {
103
+ <app-sbd-reissue-notice tone="success" icon="pi pi-check-circle">
104
+ The upgrade request was sent. Check the booking for the result.
105
+ </app-sbd-reissue-notice>
106
+ } @else if (link()) {
107
+ @if (!expired()) {
108
+ <app-sbd-reissue-notice tone="success" icon="pi pi-check-circle">
109
+ Copy the link and send it to the customer. The upgrade is placed once they pay: check the booking then.
110
+ </app-sbd-reissue-notice>
111
+ }
112
+ } @else {
113
+ <app-sbd-reissue-notice icon="pi pi-info-circle">
114
+ {{ total() > 0
115
+ ? 'A payment link will be generated for the customer to pay the difference.'
116
+ : 'Nothing to pay: confirming places the upgrade straight away.' }}
117
+ </app-sbd-reissue-notice>
118
+ }
119
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:14px}.sbd-rconf__summary{background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:12px}.sbd-rconf__row{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13.5px}.sbd-rconf__row strong{font-size:14px;font-weight:800;color:#1e2e4a;font-variant-numeric:tabular-nums;white-space:nowrap}.sbd-rconf__row-main{display:flex;flex-direction:column;gap:2px;min-width:0}.sbd-rconf__row-main b{font-weight:700;color:#1e2e4a}.sbd-rconf__row-main small{font-size:12.5px;color:#64748b}.sbd-rconf__total{display:flex;align-items:center;justify-content:space-between;border-top:1px solid #e2e8f0;padding-top:12px}.sbd-rconf__total span{font-size:14.5px;font-weight:700;color:#1e2e4a}.sbd-rconf__total strong{font-size:17px;font-weight:800;color:#1e2e4a;font-variant-numeric:tabular-nums}.sbd-rconf__link{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:10px}.sbd-rconf__link-head{display:flex;justify-content:space-between;align-items:center;font-size:14px;color:#1e2e4a}.sbd-rconf__link-head small{color:#94a3b8;font-size:12.5px}.sbd-rconf__link-row{display:flex;gap:8px}.sbd-rconf__link-input{height:40px;padding:0 12px;border:1.5px solid #e2e8f0;border-radius:10px;background:#fff;font-size:13px;font-family:inherit;color:#1e2e4a}.sbd-rconf__link-input:focus{outline:none;border-color:var(--sbd-accent, #6d4aff)}.sbd-rconf__link-input{flex:1;min-width:0;height:36px;font-size:12px;color:#334155}.sbd-rconf__expiry{color:#94a3b8;font-size:12.5px;font-variant-numeric:tabular-nums}.sbd-rconf__expiry--soon{color:#b45309;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: SbdReissueNoticeComponent, selector: "app-sbd-reissue-notice", inputs: ["icon", "tone"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
120
+ }
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueUpgradeConfirmStepComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'app-sbd-reissue-upgrade-confirm-step', standalone: true, imports: [ButtonModule, SbdReissueNoticeComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
124
+ @if (priceChanged()) {
125
+ <app-sbd-reissue-notice tone="warn" icon="pi pi-exclamation-triangle">
126
+ The price changed since the options were loaded. Check the total below.
127
+ </app-sbd-reissue-notice>
128
+ }
129
+ @if (error()) {
130
+ <app-sbd-reissue-notice tone="error" icon="pi pi-exclamation-circle">{{ error() }}</app-sbd-reissue-notice>
131
+ }
132
+
133
+ <div class="sbd-rconf__summary">
134
+ @for (row of rows(); track row.title) {
135
+ <div class="sbd-rconf__row">
136
+ <span class="sbd-rconf__row-main">
137
+ <b>{{ row.title }}</b>
138
+ <small>{{ row.from ? row.from + ' → ' : '' }}{{ row.to }}</small>
139
+ </span>
140
+ <strong>{{ row.extraLabel }}</strong>
141
+ </div>
142
+ }
143
+ <div class="sbd-rconf__total">
144
+ <span>Total to pay</span>
145
+ <strong>{{ totalLabel() }}</strong>
146
+ </div>
147
+ </div>
148
+
149
+ @if (link(); as link) {
150
+ @if (expired()) {
151
+ <app-sbd-reissue-notice tone="error" icon="pi pi-clock">
152
+ The payment link expired. Start the upgrade again from the beginning.
153
+ <button action pButton type="button" class="p-button-sm p-button-outlined p-button-secondary" label="Start again"
154
+ (click)="restart.emit()"></button>
155
+ </app-sbd-reissue-notice>
156
+ } @else {
157
+ <div class="sbd-rconf__link">
158
+ <div class="sbd-rconf__link-head"><b>Payment link</b><small>Send it to the customer</small></div>
159
+ <div class="sbd-rconf__link-row">
160
+ <input class="sbd-rconf__link-input" readonly [value]="link.url" (focus)="$any($event.target).select()" />
161
+ <button pButton type="button" class="p-button-sm p-button-outlined p-button-secondary"
162
+ [icon]="copied() ? 'pi pi-check' : 'pi pi-copy'" [label]="copied() ? 'Copied' : 'Copy'" (click)="copy(link.url)"></button>
163
+ </div>
164
+ @if (countdown(); as left) {
165
+ <small class="sbd-rconf__expiry" [class.sbd-rconf__expiry--soon]="soon()">Link expires in {{ left }}</small>
166
+ } @else if (link.expiresAt) {
167
+ <small class="sbd-rconf__expiry">Expires {{ link.expiresAt.slice(0, 16).replace('T', ' ') }}</small>
168
+ }
169
+ </div>
170
+ }
171
+ }
172
+
173
+ <!-- The dialog does not follow the result: after book-now, or once the link is sent, the agent follows the booking. -->
174
+ @if (booked()) {
175
+ <app-sbd-reissue-notice tone="success" icon="pi pi-check-circle">
176
+ The upgrade request was sent. Check the booking for the result.
177
+ </app-sbd-reissue-notice>
178
+ } @else if (link()) {
179
+ @if (!expired()) {
180
+ <app-sbd-reissue-notice tone="success" icon="pi pi-check-circle">
181
+ Copy the link and send it to the customer. The upgrade is placed once they pay: check the booking then.
182
+ </app-sbd-reissue-notice>
183
+ }
184
+ } @else {
185
+ <app-sbd-reissue-notice icon="pi pi-info-circle">
186
+ {{ total() > 0
187
+ ? 'A payment link will be generated for the customer to pay the difference.'
188
+ : 'Nothing to pay: confirming places the upgrade straight away.' }}
189
+ </app-sbd-reissue-notice>
190
+ }
191
+ `, host: { class: 'sbd-rconf' }, styles: [":host{display:flex;flex-direction:column;gap:14px}.sbd-rconf__summary{background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:12px}.sbd-rconf__row{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13.5px}.sbd-rconf__row strong{font-size:14px;font-weight:800;color:#1e2e4a;font-variant-numeric:tabular-nums;white-space:nowrap}.sbd-rconf__row-main{display:flex;flex-direction:column;gap:2px;min-width:0}.sbd-rconf__row-main b{font-weight:700;color:#1e2e4a}.sbd-rconf__row-main small{font-size:12.5px;color:#64748b}.sbd-rconf__total{display:flex;align-items:center;justify-content:space-between;border-top:1px solid #e2e8f0;padding-top:12px}.sbd-rconf__total span{font-size:14.5px;font-weight:700;color:#1e2e4a}.sbd-rconf__total strong{font-size:17px;font-weight:800;color:#1e2e4a;font-variant-numeric:tabular-nums}.sbd-rconf__link{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:10px}.sbd-rconf__link-head{display:flex;justify-content:space-between;align-items:center;font-size:14px;color:#1e2e4a}.sbd-rconf__link-head small{color:#94a3b8;font-size:12.5px}.sbd-rconf__link-row{display:flex;gap:8px}.sbd-rconf__link-input{height:40px;padding:0 12px;border:1.5px solid #e2e8f0;border-radius:10px;background:#fff;font-size:13px;font-family:inherit;color:#1e2e4a}.sbd-rconf__link-input:focus{outline:none;border-color:var(--sbd-accent, #6d4aff)}.sbd-rconf__link-input{flex:1;min-width:0;height:36px;font-size:12px;color:#334155}.sbd-rconf__expiry{color:#94a3b8;font-size:12.5px;font-variant-numeric:tabular-nums}.sbd-rconf__expiry--soon{color:#b45309;font-weight:600}\n"] }]
192
+ }], ctorParameters: () => [] });
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS11cGdyYWRlLWNvbmZpcm0tc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvcmVpc3N1ZS1kaWFsb2cvc3RlcHMvcmVpc3N1ZS11cGdyYWRlLWNvbmZpcm0tc3RlcC9yZWlzc3VlLXVwZ3JhZGUtY29uZmlybS1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7QUErRXZGLE1BQU0sT0FBTyxxQ0FBcUM7SUFnQ2hEO1FBL0JBLFNBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF1QixDQUFDO1FBQzdDLFVBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsZUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixpQkFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QiwyQkFBMkI7UUFDM0IsV0FBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixTQUFJLEdBQUcsS0FBSyxDQUE0QixJQUFJLENBQUMsQ0FBQztRQUM5QyxVQUFLLEdBQUcsS0FBSyxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUNuQyxtRkFBbUY7UUFDbkYsWUFBTyxHQUFHLE1BQU0sRUFBUSxDQUFDO1FBRWYsV0FBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqQyx1RkFBdUY7UUFDL0UsUUFBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN6QixnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxPQUFPLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUNPLFlBQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNILHFGQUFxRjtRQUMzRSxjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsaURBQWlEO1FBQ3ZDLFNBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUdqRixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRVMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFXO1FBQzlCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyR0FBMkc7UUFDN0csQ0FBQztJQUNILENBQUM7K0dBN0NVLHFDQUFxQzttR0FBckMscUNBQXFDLDRoQ0F4RXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9FVCxrekRBdEVTLFlBQVksdUtBQUUseUJBQXlCOzs0RkEwRXRDLHFDQUFxQztrQkE3RWpELFNBQVM7K0JBQ0Usc0NBQXNDLGNBQ3BDLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSx5QkFBeUIsQ0FBQyxtQkFDakMsdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvRVQsUUFFSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFJlaXNzdWVQYXltZW50TGluayB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9yZWlzc3VlLnR5cGVzJztcbmltcG9ydCB7IGZvcm1hdENvdW50ZG93biwgcGFyc2VMaW5rRXhwaXJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvcmVpc3N1ZS1mb3JtYXQnO1xuaW1wb3J0IHsgVXBncmFkZVN1bW1hcnlSb3cgfSBmcm9tICcuLi8uLi9yZWlzc3VlLXVwZ3JhZGUuc3RvcmUnO1xuaW1wb3J0IHsgU2JkUmVpc3N1ZU5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4uL3JlaXNzdWUtbm90aWNlL3JlaXNzdWUtbm90aWNlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zYmQtcmVpc3N1ZS11cGdyYWRlLWNvbmZpcm0tc3RlcCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtCdXR0b25Nb2R1bGUsIFNiZFJlaXNzdWVOb3RpY2VDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKHByaWNlQ2hhbmdlZCgpKSB7XG4gICAgICA8YXBwLXNiZC1yZWlzc3VlLW5vdGljZSB0b25lPVwid2FyblwiIGljb249XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZVwiPlxuICAgICAgICBUaGUgcHJpY2UgY2hhbmdlZCBzaW5jZSB0aGUgb3B0aW9ucyB3ZXJlIGxvYWRlZC4gQ2hlY2sgdGhlIHRvdGFsIGJlbG93LlxuICAgICAgPC9hcHAtc2JkLXJlaXNzdWUtbm90aWNlPlxuICAgIH1cbiAgICBAaWYgKGVycm9yKCkpIHtcbiAgICAgIDxhcHAtc2JkLXJlaXNzdWUtbm90aWNlIHRvbmU9XCJlcnJvclwiIGljb249XCJwaSBwaS1leGNsYW1hdGlvbi1jaXJjbGVcIj57eyBlcnJvcigpIH19PC9hcHAtc2JkLXJlaXNzdWUtbm90aWNlPlxuICAgIH1cblxuICAgIDxkaXYgY2xhc3M9XCJzYmQtcmNvbmZfX3N1bW1hcnlcIj5cbiAgICAgIEBmb3IgKHJvdyBvZiByb3dzKCk7IHRyYWNrIHJvdy50aXRsZSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXJjb25mX19yb3dcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1yY29uZl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgIDxiPnt7IHJvdy50aXRsZSB9fTwvYj5cbiAgICAgICAgICAgIDxzbWFsbD57eyByb3cuZnJvbSA/IHJvdy5mcm9tICsgJyDihpIgJyA6ICcnIH19e3sgcm93LnRvIH19PC9zbWFsbD5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHN0cm9uZz57eyByb3cuZXh0cmFMYWJlbCB9fTwvc3Ryb25nPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmNvbmZfX3RvdGFsXCI+XG4gICAgICAgIDxzcGFuPlRvdGFsIHRvIHBheTwvc3Bhbj5cbiAgICAgICAgPHN0cm9uZz57eyB0b3RhbExhYmVsKCkgfX08L3N0cm9uZz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChsaW5rKCk7IGFzIGxpbmspIHtcbiAgICAgIEBpZiAoZXhwaXJlZCgpKSB7XG4gICAgICAgIDxhcHAtc2JkLXJlaXNzdWUtbm90aWNlIHRvbmU9XCJlcnJvclwiIGljb249XCJwaSBwaS1jbG9ja1wiPlxuICAgICAgICAgIFRoZSBwYXltZW50IGxpbmsgZXhwaXJlZC4gU3RhcnQgdGhlIHVwZ3JhZGUgYWdhaW4gZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAgICAgIDxidXR0b24gYWN0aW9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicC1idXR0b24tc20gcC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tc2Vjb25kYXJ5XCIgbGFiZWw9XCJTdGFydCBhZ2FpblwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVzdGFydC5lbWl0KClcIj48L2J1dHRvbj5cbiAgICAgICAgPC9hcHAtc2JkLXJlaXNzdWUtbm90aWNlPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmNvbmZfX2xpbmtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXJjb25mX19saW5rLWhlYWRcIj48Yj5QYXltZW50IGxpbms8L2I+PHNtYWxsPlNlbmQgaXQgdG8gdGhlIGN1c3RvbWVyPC9zbWFsbD48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXJjb25mX19saW5rLXJvd1wiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwic2JkLXJjb25mX19saW5rLWlucHV0XCIgcmVhZG9ubHkgW3ZhbHVlXT1cImxpbmsudXJsXCIgKGZvY3VzKT1cIiRhbnkoJGV2ZW50LnRhcmdldCkuc2VsZWN0KClcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInAtYnV0dG9uLXNtIHAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImNvcGllZCgpID8gJ3BpIHBpLWNoZWNrJyA6ICdwaSBwaS1jb3B5J1wiIFtsYWJlbF09XCJjb3BpZWQoKSA/ICdDb3BpZWQnIDogJ0NvcHknXCIgKGNsaWNrKT1cImNvcHkobGluay51cmwpXCI+PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChjb3VudGRvd24oKTsgYXMgbGVmdCkge1xuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwic2JkLXJjb25mX19leHBpcnlcIiBbY2xhc3Muc2JkLXJjb25mX19leHBpcnktLXNvb25dPVwic29vbigpXCI+TGluayBleHBpcmVzIGluIHt7IGxlZnQgfX08L3NtYWxsPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGxpbmsuZXhwaXJlc0F0KSB7XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJzYmQtcmNvbmZfX2V4cGlyeVwiPkV4cGlyZXMge3sgbGluay5leHBpcmVzQXQuc2xpY2UoMCwgMTYpLnJlcGxhY2UoJ1QnLCAnICcpIH19PC9zbWFsbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIDwhLS0gVGhlIGRpYWxvZyBkb2VzIG5vdCBmb2xsb3cgdGhlIHJlc3VsdDogYWZ0ZXIgYm9vay1ub3csIG9yIG9uY2UgdGhlIGxpbmsgaXMgc2VudCwgdGhlIGFnZW50IGZvbGxvd3MgdGhlIGJvb2tpbmcuIC0tPlxuICAgIEBpZiAoYm9va2VkKCkpIHtcbiAgICAgIDxhcHAtc2JkLXJlaXNzdWUtbm90aWNlIHRvbmU9XCJzdWNjZXNzXCIgaWNvbj1cInBpIHBpLWNoZWNrLWNpcmNsZVwiPlxuICAgICAgICBUaGUgdXBncmFkZSByZXF1ZXN0IHdhcyBzZW50LiBDaGVjayB0aGUgYm9va2luZyBmb3IgdGhlIHJlc3VsdC5cbiAgICAgIDwvYXBwLXNiZC1yZWlzc3VlLW5vdGljZT5cbiAgICB9IEBlbHNlIGlmIChsaW5rKCkpIHtcbiAgICAgIEBpZiAoIWV4cGlyZWQoKSkge1xuICAgICAgICA8YXBwLXNiZC1yZWlzc3VlLW5vdGljZSB0b25lPVwic3VjY2Vzc1wiIGljb249XCJwaSBwaS1jaGVjay1jaXJjbGVcIj5cbiAgICAgICAgICBDb3B5IHRoZSBsaW5rIGFuZCBzZW5kIGl0IHRvIHRoZSBjdXN0b21lci4gVGhlIHVwZ3JhZGUgaXMgcGxhY2VkIG9uY2UgdGhleSBwYXk6IGNoZWNrIHRoZSBib29raW5nIHRoZW4uXG4gICAgICAgIDwvYXBwLXNiZC1yZWlzc3VlLW5vdGljZT5cbiAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxhcHAtc2JkLXJlaXNzdWUtbm90aWNlIGljb249XCJwaSBwaS1pbmZvLWNpcmNsZVwiPlxuICAgICAgICB7eyB0b3RhbCgpID4gMFxuICAgICAgICAgID8gJ0EgcGF5bWVudCBsaW5rIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGUgY3VzdG9tZXIgdG8gcGF5IHRoZSBkaWZmZXJlbmNlLidcbiAgICAgICAgICA6ICdOb3RoaW5nIHRvIHBheTogY29uZmlybWluZyBwbGFjZXMgdGhlIHVwZ3JhZGUgc3RyYWlnaHQgYXdheS4nIH19XG4gICAgICA8L2FwcC1zYmQtcmVpc3N1ZS1ub3RpY2U+XG4gICAgfVxuICBgLFxuICBzdHlsZVVybDogJy4vcmVpc3N1ZS11cGdyYWRlLWNvbmZpcm0tc3RlcC5jb21wb25lbnQuc2NzcycsXG4gIGhvc3Q6IHsgY2xhc3M6ICdzYmQtcmNvbmYnIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNiZFJlaXNzdWVVcGdyYWRlQ29uZmlybVN0ZXBDb21wb25lbnQge1xuICByb3dzID0gaW5wdXQucmVxdWlyZWQ8VXBncmFkZVN1bW1hcnlSb3dbXT4oKTtcbiAgdG90YWwgPSBpbnB1dCgwKTtcbiAgdG90YWxMYWJlbCA9IGlucHV0KCcnKTtcbiAgcHJpY2VDaGFuZ2VkID0gaW5wdXQoZmFsc2UpO1xuICAvKiogYGJvb2stbm93YCB3YXMgc2VudC4gKi9cbiAgYm9va2VkID0gaW5wdXQoZmFsc2UpO1xuICBsaW5rID0gaW5wdXQ8UmVpc3N1ZVBheW1lbnRMaW5rIHwgbnVsbD4obnVsbCk7XG4gIGVycm9yID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBUaGUgbGluayBleHBpcmVkIGFuZCB0aGUgYWdlbnQgY2hvc2UgdG8gcmVkbyB0aGUgdXBncmFkZSBmcm9tIHRoZSBiZWdpbm5pbmcuICovXG4gIHJlc3RhcnQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBwcm90ZWN0ZWQgY29waWVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvKiogVGlja3MgZXZlcnkgc2Vjb25kIHNvIHRoZSBjb3VudGRvd24gKGFuZCB0aGUgZXhwaXJlZCBzdGF0ZSkgdXBkYXRlIG9uIHRoZWlyIG93bi4gKi9cbiAgcHJpdmF0ZSBub3cgPSBzaWduYWwoRGF0ZS5ub3coKSk7XG4gIHByaXZhdGUgcmVtYWluaW5nTXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZXhwaXJ5ID0gcGFyc2VMaW5rRXhwaXJ5KHRoaXMubGluaygpPy5leHBpcmVzQXQpO1xuICAgIHJldHVybiBleHBpcnkgPT0gbnVsbCA/IG51bGwgOiBleHBpcnkgLSB0aGlzLm5vdygpO1xuICB9KTtcbiAgcHJvdGVjdGVkIGV4cGlyZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMucmVtYWluaW5nTXMoKTtcbiAgICByZXR1cm4gbGVmdCAhPSBudWxsICYmIGxlZnQgPD0gMDtcbiAgfSk7XG4gIC8qKiBgbW06c3NgIHVudGlsIHRoZSBsaW5rIGV4cGlyZXM7IGVtcHR5IHdoZW4gdGhlIGJhY2tlbmQgc2VudCBubyAodmFsaWQpIGV4cGlyeS4gKi9cbiAgcHJvdGVjdGVkIGNvdW50ZG93biA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5yZW1haW5pbmdNcygpO1xuICAgIHJldHVybiBsZWZ0ID09IG51bGwgfHwgbGVmdCA8PSAwID8gJycgOiBmb3JtYXRDb3VudGRvd24obGVmdCk7XG4gIH0pO1xuICAvKiogTGFzdCB0d28gbWludXRlczogaGlnaGxpZ2h0IHRoZSBjb3VudGRvd24uICovXG4gIHByb3RlY3RlZCBzb29uID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMucmVtYWluaW5nTXMoKSA/PyBJbmZpbml0eSkgPD0gMiAqIDYwICogMTAwMCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLm5vdy5zZXQoRGF0ZS5ub3coKSksIDEwMDApO1xuICAgIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4gY2xlYXJJbnRlcnZhbCh0aW1lcikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNvcHkodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodXJsKTtcbiAgICAgIHRoaXMuY29waWVkLnNldCh0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb3BpZWQuc2V0KGZhbHNlKSwgMTUwMCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDbGlwYm9hcmQgYmxvY2tlZCAoZS5nLiBpbnNlY3VyZSBjb250ZXh0KTogdGhlIGlucHV0IGlzIHNlbGVjdGFibGUsIHNvIHRoZSBhZ2VudCBjYW4gc3RpbGwgY29weSBieSBoYW5kLlxuICAgIH1cbiAgfVxufVxuIl19