@rolatech/angular-onboarding 20.3.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-detail-page-DKJQX3cs.mjs +224 -0
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-detail-page-DKJQX3cs.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-index-page-BO4pC_NU.mjs +206 -0
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-index-page-BO4pC_NU.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-review-page-BERcLBeQ.mjs +419 -0
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-review-page-BERcLBeQ.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-banking-page-VYNfR4fy.mjs +133 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-banking-page-VYNfR4fy.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-financial-page-Ck3Rowke.mjs +132 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-financial-page-Ck3Rowke.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-profile-page-DNepDxHu.mjs +122 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-profile-page-DNepDxHu.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-qualification-page-CSwupuKt.mjs +108 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-qualification-page-CSwupuKt.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-review-page-DugCjfvK.mjs +182 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-review-page-DugCjfvK.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-shell-page-DibWYeD1.mjs +150 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-shell-page-DibWYeD1.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-start-page-DC7gyOnS.mjs +144 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-start-page-DC7gyOnS.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-submitted-page-BMkV2V8K.mjs +55 -0
- package/fesm2022/rolatech-angular-onboarding-agent-apply-submitted-page-BMkV2V8K.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-documents-page-DWBGTj5J.mjs +99 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-documents-page-DWBGTj5J.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-issues-page-CSVgCJ7t.mjs +28 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-issues-page-CSVgCJ7t.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-overview-page-8sTSvFZ7.mjs +67 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-overview-page-8sTSvFZ7.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-shell-page-B6ffcJ5A.mjs +125 -0
- package/fesm2022/rolatech-angular-onboarding-agent-onboarding-shell-page-B6ffcJ5A.mjs.map +1 -0
- package/fesm2022/rolatech-angular-onboarding.mjs +1495 -0
- package/fesm2022/rolatech-angular-onboarding.mjs.map +1 -0
- package/package.json +35 -0
- package/types/rolatech-angular-onboarding.d.ts +244 -0
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# @rolatech/angular-onboarding
|
|
2
|
+
|
|
3
|
+
Dedicated Angular onboarding UI/state package for PrimeCasa and Rolatech.
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
Owns:
|
|
8
|
+
- onboarding pages
|
|
9
|
+
- onboarding route definitions
|
|
10
|
+
- onboarding facades/signals/forms
|
|
11
|
+
- onboarding reusable components
|
|
12
|
+
- apply flow UI
|
|
13
|
+
- applicant dashboard UI
|
|
14
|
+
- admin review UI
|
|
15
|
+
|
|
16
|
+
Does not own:
|
|
17
|
+
- HTTP transport logic
|
|
18
|
+
- API DTO definitions
|
|
19
|
+
- backend request/response contracts
|
|
20
|
+
- auth/session transport
|
|
21
|
+
- organization provisioning logic
|
|
22
|
+
|
|
23
|
+
Transport and contracts are consumed from `@rolatech/angular-services`.
|
|
24
|
+
|
|
25
|
+
## Route Exports
|
|
26
|
+
|
|
27
|
+
- `AGENT_APPLY_ROUTES`
|
|
28
|
+
- `AGENT_ONBOARDING_ROUTES`
|
|
29
|
+
- `ADMIN_ONBOARDING_ROUTES`
|
|
30
|
+
|
|
31
|
+
## Integration Example
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { Routes } from '@angular/router';
|
|
35
|
+
import {
|
|
36
|
+
ADMIN_ONBOARDING_ROUTES,
|
|
37
|
+
AGENT_APPLY_ROUTES,
|
|
38
|
+
AGENT_ONBOARDING_ROUTES,
|
|
39
|
+
} from '@rolatech/angular-onboarding';
|
|
40
|
+
|
|
41
|
+
export const routes: Routes = [
|
|
42
|
+
{
|
|
43
|
+
path: 'agents/apply',
|
|
44
|
+
children: AGENT_APPLY_ROUTES,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
path: 'onboarding',
|
|
48
|
+
children: AGENT_ONBOARDING_ROUTES,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
path: 'onboarding/applications',
|
|
52
|
+
children: ADMIN_ONBOARDING_ROUTES,
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
```
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, signal, computed, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { ActivatedRoute, RouterLink } from '@angular/router';
|
|
5
|
+
import { onboardingApplicantTypeLabel, onboardingVatModeLabel } from '@rolatech/angular-services';
|
|
6
|
+
import { AdminOnboardingDetailFacade, OnboardingPageShell, OnboardingStatusBadge, OnboardingSummaryCard, OnboardingIssueList, OnboardingTimelineDrawer } from './rolatech-angular-onboarding.mjs';
|
|
7
|
+
|
|
8
|
+
class AdminOnboardingDetailPage {
|
|
9
|
+
facade = inject(AdminOnboardingDetailFacade);
|
|
10
|
+
timelineOpen = signal(false, ...(ngDevMode ? [{ debugName: "timelineOpen" }] : []));
|
|
11
|
+
route = inject(ActivatedRoute);
|
|
12
|
+
paramMap = toSignal(this.route.paramMap, {
|
|
13
|
+
initialValue: this.route.snapshot.paramMap,
|
|
14
|
+
});
|
|
15
|
+
subtitle = computed(() => {
|
|
16
|
+
const detail = this.facade.detail();
|
|
17
|
+
if (!detail) {
|
|
18
|
+
return 'Inspect onboarding data, documents, and review notes.';
|
|
19
|
+
}
|
|
20
|
+
return `${detail.organizationName || 'Unknown organization'} • ${detail.contactName || 'Unknown contact'}`;
|
|
21
|
+
}, ...(ngDevMode ? [{ debugName: "subtitle" }] : []));
|
|
22
|
+
profileItems = computed(() => {
|
|
23
|
+
const detail = this.facade.detail();
|
|
24
|
+
if (!detail) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
return [
|
|
28
|
+
{ label: 'Organization', value: detail.organizationName },
|
|
29
|
+
{ label: 'Contact name', value: detail.contactName },
|
|
30
|
+
{ label: 'Contact email', value: detail.contactEmail },
|
|
31
|
+
{ label: 'Contact phone', value: detail.contactPhone },
|
|
32
|
+
{ label: 'Country', value: detail.companyCountry },
|
|
33
|
+
{ label: 'Applicant type', value: onboardingApplicantTypeLabel(detail.applicantType) },
|
|
34
|
+
];
|
|
35
|
+
}, ...(ngDevMode ? [{ debugName: "profileItems" }] : []));
|
|
36
|
+
complianceItems = computed(() => {
|
|
37
|
+
const detail = this.facade.detail();
|
|
38
|
+
if (!detail) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
return [
|
|
42
|
+
{ label: 'VAT mode', value: onboardingVatModeLabel(detail.vatMode ?? null) },
|
|
43
|
+
{ label: 'VAT number', value: detail.vatNumber },
|
|
44
|
+
{ label: 'Bank', value: detail.bankName },
|
|
45
|
+
{ label: 'Account holder', value: detail.accountHolderName },
|
|
46
|
+
{ label: 'Sort code', value: detail.sortCode },
|
|
47
|
+
{ label: 'Account number', value: detail.accountNumber },
|
|
48
|
+
];
|
|
49
|
+
}, ...(ngDevMode ? [{ debugName: "complianceItems" }] : []));
|
|
50
|
+
constructor() {
|
|
51
|
+
effect(() => {
|
|
52
|
+
const applicationId = this.paramMap().get('applicationId');
|
|
53
|
+
if (!applicationId) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
void this.facade.load(applicationId);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
openTimeline() {
|
|
60
|
+
this.timelineOpen.set(true);
|
|
61
|
+
}
|
|
62
|
+
closeTimeline() {
|
|
63
|
+
this.timelineOpen.set(false);
|
|
64
|
+
}
|
|
65
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: AdminOnboardingDetailPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
66
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: AdminOnboardingDetailPage, isStandalone: true, selector: "rolatech-admin-onboarding-detail-page", host: { classAttribute: "block" }, providers: [AdminOnboardingDetailFacade], ngImport: i0, template: `
|
|
67
|
+
<rolatech-onboarding-page-shell title="Onboarding Application Detail" [subtitle]="subtitle()" kicker="Admin Console">
|
|
68
|
+
<div header-leading>
|
|
69
|
+
<a
|
|
70
|
+
[routerLink]="['../']"
|
|
71
|
+
class="inline-flex items-center rounded-xl border border-(--rt-border-color) bg-(--rt-base-background) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) transition hover:bg-(--rt-raised-background) cursor-pointer"
|
|
72
|
+
>
|
|
73
|
+
← Back
|
|
74
|
+
</a>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div header-actions>
|
|
78
|
+
<rolatech-onboarding-status-badge [status]="facade.detail()?.status || null" />
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
@if (facade.error()) {
|
|
82
|
+
<div class="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">{{ facade.error() }}</div>
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@if (facade.detail(); as detail) {
|
|
86
|
+
<section class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 shadow-sm">
|
|
87
|
+
<div class="flex flex-wrap items-center justify-between gap-3">
|
|
88
|
+
<p class="text-sm text-(--rt-text-secondary)">
|
|
89
|
+
Application ID: <span class="font-semibold text-(--rt-text-primary)">{{ detail.id }}</span>
|
|
90
|
+
</p>
|
|
91
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
92
|
+
<button
|
|
93
|
+
type="button"
|
|
94
|
+
class="rounded-xl border border-(--rt-border-color) bg-(--rt-base-background) px-4 py-2 text-sm font-semibold text-(--rt-text-secondary) transition hover:bg-(--rt-raised-background)"
|
|
95
|
+
(click)="openTimeline()"
|
|
96
|
+
>
|
|
97
|
+
Timeline
|
|
98
|
+
</button>
|
|
99
|
+
<a
|
|
100
|
+
[routerLink]="['review']"
|
|
101
|
+
class="rounded-xl bg-(--rt-brand-color) px-4 py-2 text-sm font-semibold text-(--rt-text-primary-inverse) transition hover:opacity-90 cursor-pointer"
|
|
102
|
+
>
|
|
103
|
+
Open Review
|
|
104
|
+
</a>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</section>
|
|
108
|
+
|
|
109
|
+
<rolatech-onboarding-summary-card [title]="'Applicant Profile'" [items]="profileItems()" />
|
|
110
|
+
|
|
111
|
+
<rolatech-onboarding-summary-card [title]="'Compliance & Banking'" [items]="complianceItems()" />
|
|
112
|
+
|
|
113
|
+
<rolatech-onboarding-issue-list [issues]="detail.issues" />
|
|
114
|
+
} @else {
|
|
115
|
+
<div
|
|
116
|
+
class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 text-sm text-(--rt-text-secondary) shadow-sm"
|
|
117
|
+
>
|
|
118
|
+
Loading application details...
|
|
119
|
+
</div>
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
@if (facade.detail(); as detail) {
|
|
123
|
+
<rolatech-onboarding-timeline-drawer
|
|
124
|
+
floating
|
|
125
|
+
[open]="timelineOpen()"
|
|
126
|
+
[title]="'Application Timeline'"
|
|
127
|
+
[items]="detail.timeline"
|
|
128
|
+
[zIndex]="9100"
|
|
129
|
+
(closeRequested)="closeTimeline()"
|
|
130
|
+
/>
|
|
131
|
+
}
|
|
132
|
+
</rolatech-onboarding-page-shell>
|
|
133
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: OnboardingPageShell, selector: "rolatech-onboarding-page-shell", inputs: ["title", "subtitle", "kicker"] }, { kind: "component", type: OnboardingStatusBadge, selector: "rolatech-onboarding-status-badge", inputs: ["status"] }, { kind: "component", type: OnboardingSummaryCard, selector: "rolatech-onboarding-summary-card", inputs: ["title", "items"] }, { kind: "component", type: OnboardingIssueList, selector: "rolatech-onboarding-issue-list", inputs: ["issues"] }, { kind: "component", type: OnboardingTimelineDrawer, selector: "rolatech-onboarding-timeline-drawer", inputs: ["open", "title", "items", "zIndex"], outputs: ["closeRequested"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
134
|
+
}
|
|
135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: AdminOnboardingDetailPage, decorators: [{
|
|
136
|
+
type: Component,
|
|
137
|
+
args: [{
|
|
138
|
+
selector: 'rolatech-admin-onboarding-detail-page',
|
|
139
|
+
standalone: true,
|
|
140
|
+
imports: [
|
|
141
|
+
RouterLink,
|
|
142
|
+
OnboardingPageShell,
|
|
143
|
+
OnboardingStatusBadge,
|
|
144
|
+
OnboardingSummaryCard,
|
|
145
|
+
OnboardingIssueList,
|
|
146
|
+
OnboardingTimelineDrawer,
|
|
147
|
+
],
|
|
148
|
+
providers: [AdminOnboardingDetailFacade],
|
|
149
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
150
|
+
encapsulation: ViewEncapsulation.None,
|
|
151
|
+
host: { class: 'block' },
|
|
152
|
+
template: `
|
|
153
|
+
<rolatech-onboarding-page-shell title="Onboarding Application Detail" [subtitle]="subtitle()" kicker="Admin Console">
|
|
154
|
+
<div header-leading>
|
|
155
|
+
<a
|
|
156
|
+
[routerLink]="['../']"
|
|
157
|
+
class="inline-flex items-center rounded-xl border border-(--rt-border-color) bg-(--rt-base-background) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) transition hover:bg-(--rt-raised-background) cursor-pointer"
|
|
158
|
+
>
|
|
159
|
+
← Back
|
|
160
|
+
</a>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<div header-actions>
|
|
164
|
+
<rolatech-onboarding-status-badge [status]="facade.detail()?.status || null" />
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
@if (facade.error()) {
|
|
168
|
+
<div class="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">{{ facade.error() }}</div>
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@if (facade.detail(); as detail) {
|
|
172
|
+
<section class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 shadow-sm">
|
|
173
|
+
<div class="flex flex-wrap items-center justify-between gap-3">
|
|
174
|
+
<p class="text-sm text-(--rt-text-secondary)">
|
|
175
|
+
Application ID: <span class="font-semibold text-(--rt-text-primary)">{{ detail.id }}</span>
|
|
176
|
+
</p>
|
|
177
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
178
|
+
<button
|
|
179
|
+
type="button"
|
|
180
|
+
class="rounded-xl border border-(--rt-border-color) bg-(--rt-base-background) px-4 py-2 text-sm font-semibold text-(--rt-text-secondary) transition hover:bg-(--rt-raised-background)"
|
|
181
|
+
(click)="openTimeline()"
|
|
182
|
+
>
|
|
183
|
+
Timeline
|
|
184
|
+
</button>
|
|
185
|
+
<a
|
|
186
|
+
[routerLink]="['review']"
|
|
187
|
+
class="rounded-xl bg-(--rt-brand-color) px-4 py-2 text-sm font-semibold text-(--rt-text-primary-inverse) transition hover:opacity-90 cursor-pointer"
|
|
188
|
+
>
|
|
189
|
+
Open Review
|
|
190
|
+
</a>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
</section>
|
|
194
|
+
|
|
195
|
+
<rolatech-onboarding-summary-card [title]="'Applicant Profile'" [items]="profileItems()" />
|
|
196
|
+
|
|
197
|
+
<rolatech-onboarding-summary-card [title]="'Compliance & Banking'" [items]="complianceItems()" />
|
|
198
|
+
|
|
199
|
+
<rolatech-onboarding-issue-list [issues]="detail.issues" />
|
|
200
|
+
} @else {
|
|
201
|
+
<div
|
|
202
|
+
class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 text-sm text-(--rt-text-secondary) shadow-sm"
|
|
203
|
+
>
|
|
204
|
+
Loading application details...
|
|
205
|
+
</div>
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
@if (facade.detail(); as detail) {
|
|
209
|
+
<rolatech-onboarding-timeline-drawer
|
|
210
|
+
floating
|
|
211
|
+
[open]="timelineOpen()"
|
|
212
|
+
[title]="'Application Timeline'"
|
|
213
|
+
[items]="detail.timeline"
|
|
214
|
+
[zIndex]="9100"
|
|
215
|
+
(closeRequested)="closeTimeline()"
|
|
216
|
+
/>
|
|
217
|
+
}
|
|
218
|
+
</rolatech-onboarding-page-shell>
|
|
219
|
+
`,
|
|
220
|
+
}]
|
|
221
|
+
}], ctorParameters: () => [] });
|
|
222
|
+
|
|
223
|
+
export { AdminOnboardingDetailPage };
|
|
224
|
+
//# sourceMappingURL=rolatech-angular-onboarding-admin-onboarding-detail-page-DKJQX3cs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rolatech-angular-onboarding-admin-onboarding-detail-page-DKJQX3cs.mjs","sources":["../../../../packages/angular-onboarding/src/lib/pages/admin-onboarding/admin-onboarding-detail-page.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, ViewEncapsulation } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { onboardingApplicantTypeLabel, onboardingVatModeLabel } from '@rolatech/angular-services';\nimport { OnboardingIssueList } from '../../components/onboarding/onboarding-issue-list';\nimport { OnboardingPageShell } from '../../components/onboarding/onboarding-page-shell';\nimport { OnboardingStatusBadge } from '../../components/onboarding/onboarding-status-badge';\nimport { OnboardingSummaryCard } from '../../components/onboarding/onboarding-summary-card';\nimport { OnboardingTimelineDrawer } from '../../components/onboarding/onboarding-timeline-drawer';\nimport { AdminOnboardingDetailFacade } from '../../store/admin-onboarding-detail.facade';\n\n@Component({\n selector: 'rolatech-admin-onboarding-detail-page',\n standalone: true,\n imports: [\n RouterLink,\n OnboardingPageShell,\n OnboardingStatusBadge,\n OnboardingSummaryCard,\n OnboardingIssueList,\n OnboardingTimelineDrawer,\n ],\n providers: [AdminOnboardingDetailFacade],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'block' },\n template: `\n <rolatech-onboarding-page-shell title=\"Onboarding Application Detail\" [subtitle]=\"subtitle()\" kicker=\"Admin Console\">\n <div header-leading>\n <a\n [routerLink]=\"['../']\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) bg-(--rt-base-background) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) transition hover:bg-(--rt-raised-background) cursor-pointer\"\n >\n ← Back\n </a>\n </div>\n\n <div header-actions>\n <rolatech-onboarding-status-badge [status]=\"facade.detail()?.status || null\" />\n </div>\n\n @if (facade.error()) {\n <div class=\"rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700\">{{ facade.error() }}</div>\n }\n\n @if (facade.detail(); as detail) {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 shadow-sm\">\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\n <p class=\"text-sm text-(--rt-text-secondary)\">\n Application ID: <span class=\"font-semibold text-(--rt-text-primary)\">{{ detail.id }}</span>\n </p>\n <div class=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n class=\"rounded-xl border border-(--rt-border-color) bg-(--rt-base-background) px-4 py-2 text-sm font-semibold text-(--rt-text-secondary) transition hover:bg-(--rt-raised-background)\"\n (click)=\"openTimeline()\"\n >\n Timeline\n </button>\n <a\n [routerLink]=\"['review']\"\n class=\"rounded-xl bg-(--rt-brand-color) px-4 py-2 text-sm font-semibold text-(--rt-text-primary-inverse) transition hover:opacity-90 cursor-pointer\"\n >\n Open Review\n </a>\n </div>\n </div>\n </section>\n\n <rolatech-onboarding-summary-card [title]=\"'Applicant Profile'\" [items]=\"profileItems()\" />\n\n <rolatech-onboarding-summary-card [title]=\"'Compliance & Banking'\" [items]=\"complianceItems()\" />\n\n <rolatech-onboarding-issue-list [issues]=\"detail.issues\" />\n } @else {\n <div\n class=\"rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 text-sm text-(--rt-text-secondary) shadow-sm\"\n >\n Loading application details...\n </div>\n }\n\n @if (facade.detail(); as detail) {\n <rolatech-onboarding-timeline-drawer\n floating\n [open]=\"timelineOpen()\"\n [title]=\"'Application Timeline'\"\n [items]=\"detail.timeline\"\n [zIndex]=\"9100\"\n (closeRequested)=\"closeTimeline()\"\n />\n }\n </rolatech-onboarding-page-shell>\n `,\n})\nexport class AdminOnboardingDetailPage {\n readonly facade = inject(AdminOnboardingDetailFacade);\n readonly timelineOpen = signal(false);\n private readonly route = inject(ActivatedRoute);\n\n private readonly paramMap = toSignal(this.route.paramMap, {\n initialValue: this.route.snapshot.paramMap,\n });\n\n readonly subtitle = computed(() => {\n const detail = this.facade.detail();\n\n if (!detail) {\n return 'Inspect onboarding data, documents, and review notes.';\n }\n\n return `${detail.organizationName || 'Unknown organization'} • ${detail.contactName || 'Unknown contact'}`;\n });\n\n readonly profileItems = computed(() => {\n const detail = this.facade.detail();\n if (!detail) {\n return [];\n }\n\n return [\n { label: 'Organization', value: detail.organizationName },\n { label: 'Contact name', value: detail.contactName },\n { label: 'Contact email', value: detail.contactEmail },\n { label: 'Contact phone', value: detail.contactPhone },\n { label: 'Country', value: detail.companyCountry },\n { label: 'Applicant type', value: onboardingApplicantTypeLabel(detail.applicantType) },\n ];\n });\n\n readonly complianceItems = computed(() => {\n const detail = this.facade.detail();\n if (!detail) {\n return [];\n }\n\n return [\n { label: 'VAT mode', value: onboardingVatModeLabel(detail.vatMode ?? null) },\n { label: 'VAT number', value: detail.vatNumber },\n { label: 'Bank', value: detail.bankName },\n { label: 'Account holder', value: detail.accountHolderName },\n { label: 'Sort code', value: detail.sortCode },\n { label: 'Account number', value: detail.accountNumber },\n ];\n });\n\n constructor() {\n effect(() => {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n void this.facade.load(applicationId);\n });\n }\n\n openTimeline(): void {\n this.timelineOpen.set(true);\n }\n\n closeTimeline(): void {\n this.timelineOpen.set(false);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { RouterLink } from '@angular/router';
|
|
4
|
+
import { onboardingStatusLabel } from '@rolatech/angular-services';
|
|
5
|
+
import { AdminOnboardingListFacade, OnboardingPageShell, OnboardingStatusBadge } from './rolatech-angular-onboarding.mjs';
|
|
6
|
+
|
|
7
|
+
class AdminOnboardingIndexPage {
|
|
8
|
+
facade = inject(AdminOnboardingListFacade);
|
|
9
|
+
statusLabel = onboardingStatusLabel;
|
|
10
|
+
statuses = [
|
|
11
|
+
'DRAFT',
|
|
12
|
+
'IN_PROGRESS',
|
|
13
|
+
'SUBMITTED',
|
|
14
|
+
'IN_REVIEW',
|
|
15
|
+
'NEED_MORE_INFO',
|
|
16
|
+
'APPROVED',
|
|
17
|
+
'FAILED',
|
|
18
|
+
];
|
|
19
|
+
constructor() {
|
|
20
|
+
void this.facade.load();
|
|
21
|
+
}
|
|
22
|
+
onSearch(event) {
|
|
23
|
+
const target = event.target;
|
|
24
|
+
this.facade.setSearch(target.value);
|
|
25
|
+
void this.facade.load();
|
|
26
|
+
}
|
|
27
|
+
onStatus(event) {
|
|
28
|
+
const target = event.target;
|
|
29
|
+
const status = target.value ? target.value : undefined;
|
|
30
|
+
this.facade.setStatus(status);
|
|
31
|
+
void this.facade.load();
|
|
32
|
+
}
|
|
33
|
+
async reload() {
|
|
34
|
+
await this.facade.load();
|
|
35
|
+
}
|
|
36
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: AdminOnboardingIndexPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
37
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: AdminOnboardingIndexPage, isStandalone: true, selector: "rolatech-admin-onboarding-index-page", host: { classAttribute: "block" }, providers: [AdminOnboardingListFacade], ngImport: i0, template: `
|
|
38
|
+
<rolatech-onboarding-page-shell
|
|
39
|
+
title="Onboarding Applications"
|
|
40
|
+
subtitle="Review incoming onboarding requests and triage approvals."
|
|
41
|
+
kicker="Admin Console"
|
|
42
|
+
>
|
|
43
|
+
<section class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 shadow-sm">
|
|
44
|
+
<div class="grid gap-3 md:grid-cols-3">
|
|
45
|
+
<label class="grid gap-2">
|
|
46
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Search</span>
|
|
47
|
+
<input
|
|
48
|
+
class="h-10 rounded-xl border border-(--rt-border-color) px-3"
|
|
49
|
+
[value]="facade.filters().search || ''"
|
|
50
|
+
(input)="onSearch($event)"
|
|
51
|
+
placeholder="Organization or contact"
|
|
52
|
+
/>
|
|
53
|
+
</label>
|
|
54
|
+
|
|
55
|
+
<label class="grid gap-2">
|
|
56
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Status</span>
|
|
57
|
+
<select class="h-10 rounded-xl border border-(--rt-border-color) px-3" [value]="facade.filters().status || ''" (change)="onStatus($event)">
|
|
58
|
+
<option value="">All</option>
|
|
59
|
+
@for (status of statuses; track status) {
|
|
60
|
+
<option [value]="status">{{ statusLabel(status) }}</option>
|
|
61
|
+
}
|
|
62
|
+
</select>
|
|
63
|
+
</label>
|
|
64
|
+
|
|
65
|
+
<div class="flex items-end justify-start md:justify-end">
|
|
66
|
+
<button
|
|
67
|
+
type="button"
|
|
68
|
+
class="rounded-xl bg-(--rt-brand-color) px-4 py-2 text-sm font-semibold text-(--rt-text-primary-inverse) transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60"
|
|
69
|
+
[disabled]="facade.loading()"
|
|
70
|
+
(click)="reload()"
|
|
71
|
+
>
|
|
72
|
+
Refresh
|
|
73
|
+
</button>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</section>
|
|
77
|
+
|
|
78
|
+
@if (facade.error()) {
|
|
79
|
+
<div class="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">{{ facade.error() }}</div>
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
<section class="overflow-hidden rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) shadow-sm">
|
|
83
|
+
<table class="min-w-full text-left text-sm">
|
|
84
|
+
<thead class="border-b border-(--rt-border-color) bg-(--rt-raised-background) text-(--rt-text-secondary)">
|
|
85
|
+
<tr>
|
|
86
|
+
<th class="px-4 py-3 font-semibold">ID</th>
|
|
87
|
+
<th class="px-4 py-3 font-semibold">Organization</th>
|
|
88
|
+
<th class="px-4 py-3 font-semibold">Applicant</th>
|
|
89
|
+
<th class="px-4 py-3 font-semibold">Status</th>
|
|
90
|
+
</tr>
|
|
91
|
+
</thead>
|
|
92
|
+
<tbody>
|
|
93
|
+
@for (item of facade.items(); track item.id) {
|
|
94
|
+
<tr class="border-b border-(--rt-border-color) text-(--rt-text-secondary) last:border-b-0">
|
|
95
|
+
<td class="px-4 py-3">
|
|
96
|
+
<a [routerLink]="[item.id]" class="font-medium text-(--rt-text-primary) hover:underline cursor-pointer">{{ item.id }}</a>
|
|
97
|
+
</td>
|
|
98
|
+
<td class="px-4 py-3">{{ item.organizationName || '-' }}</td>
|
|
99
|
+
<td class="px-4 py-3">{{ item.contactName || '-' }}</td>
|
|
100
|
+
<td class="px-4 py-3">
|
|
101
|
+
<rolatech-onboarding-status-badge [status]="item.status" />
|
|
102
|
+
</td>
|
|
103
|
+
</tr>
|
|
104
|
+
}
|
|
105
|
+
</tbody>
|
|
106
|
+
</table>
|
|
107
|
+
|
|
108
|
+
@if (facade.items().length === 0 && !facade.loading()) {
|
|
109
|
+
<div class="px-4 py-6 text-sm text-(--rt-text-secondary)">No onboarding applications found.</div>
|
|
110
|
+
}
|
|
111
|
+
</section>
|
|
112
|
+
</rolatech-onboarding-page-shell>
|
|
113
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: OnboardingPageShell, selector: "rolatech-onboarding-page-shell", inputs: ["title", "subtitle", "kicker"] }, { kind: "component", type: OnboardingStatusBadge, selector: "rolatech-onboarding-status-badge", inputs: ["status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
114
|
+
}
|
|
115
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: AdminOnboardingIndexPage, decorators: [{
|
|
116
|
+
type: Component,
|
|
117
|
+
args: [{
|
|
118
|
+
selector: 'rolatech-admin-onboarding-index-page',
|
|
119
|
+
standalone: true,
|
|
120
|
+
imports: [RouterLink, OnboardingPageShell, OnboardingStatusBadge],
|
|
121
|
+
providers: [AdminOnboardingListFacade],
|
|
122
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
123
|
+
encapsulation: ViewEncapsulation.None,
|
|
124
|
+
host: { class: 'block' },
|
|
125
|
+
template: `
|
|
126
|
+
<rolatech-onboarding-page-shell
|
|
127
|
+
title="Onboarding Applications"
|
|
128
|
+
subtitle="Review incoming onboarding requests and triage approvals."
|
|
129
|
+
kicker="Admin Console"
|
|
130
|
+
>
|
|
131
|
+
<section class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 shadow-sm">
|
|
132
|
+
<div class="grid gap-3 md:grid-cols-3">
|
|
133
|
+
<label class="grid gap-2">
|
|
134
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Search</span>
|
|
135
|
+
<input
|
|
136
|
+
class="h-10 rounded-xl border border-(--rt-border-color) px-3"
|
|
137
|
+
[value]="facade.filters().search || ''"
|
|
138
|
+
(input)="onSearch($event)"
|
|
139
|
+
placeholder="Organization or contact"
|
|
140
|
+
/>
|
|
141
|
+
</label>
|
|
142
|
+
|
|
143
|
+
<label class="grid gap-2">
|
|
144
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Status</span>
|
|
145
|
+
<select class="h-10 rounded-xl border border-(--rt-border-color) px-3" [value]="facade.filters().status || ''" (change)="onStatus($event)">
|
|
146
|
+
<option value="">All</option>
|
|
147
|
+
@for (status of statuses; track status) {
|
|
148
|
+
<option [value]="status">{{ statusLabel(status) }}</option>
|
|
149
|
+
}
|
|
150
|
+
</select>
|
|
151
|
+
</label>
|
|
152
|
+
|
|
153
|
+
<div class="flex items-end justify-start md:justify-end">
|
|
154
|
+
<button
|
|
155
|
+
type="button"
|
|
156
|
+
class="rounded-xl bg-(--rt-brand-color) px-4 py-2 text-sm font-semibold text-(--rt-text-primary-inverse) transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60"
|
|
157
|
+
[disabled]="facade.loading()"
|
|
158
|
+
(click)="reload()"
|
|
159
|
+
>
|
|
160
|
+
Refresh
|
|
161
|
+
</button>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
</section>
|
|
165
|
+
|
|
166
|
+
@if (facade.error()) {
|
|
167
|
+
<div class="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">{{ facade.error() }}</div>
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
<section class="overflow-hidden rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) shadow-sm">
|
|
171
|
+
<table class="min-w-full text-left text-sm">
|
|
172
|
+
<thead class="border-b border-(--rt-border-color) bg-(--rt-raised-background) text-(--rt-text-secondary)">
|
|
173
|
+
<tr>
|
|
174
|
+
<th class="px-4 py-3 font-semibold">ID</th>
|
|
175
|
+
<th class="px-4 py-3 font-semibold">Organization</th>
|
|
176
|
+
<th class="px-4 py-3 font-semibold">Applicant</th>
|
|
177
|
+
<th class="px-4 py-3 font-semibold">Status</th>
|
|
178
|
+
</tr>
|
|
179
|
+
</thead>
|
|
180
|
+
<tbody>
|
|
181
|
+
@for (item of facade.items(); track item.id) {
|
|
182
|
+
<tr class="border-b border-(--rt-border-color) text-(--rt-text-secondary) last:border-b-0">
|
|
183
|
+
<td class="px-4 py-3">
|
|
184
|
+
<a [routerLink]="[item.id]" class="font-medium text-(--rt-text-primary) hover:underline cursor-pointer">{{ item.id }}</a>
|
|
185
|
+
</td>
|
|
186
|
+
<td class="px-4 py-3">{{ item.organizationName || '-' }}</td>
|
|
187
|
+
<td class="px-4 py-3">{{ item.contactName || '-' }}</td>
|
|
188
|
+
<td class="px-4 py-3">
|
|
189
|
+
<rolatech-onboarding-status-badge [status]="item.status" />
|
|
190
|
+
</td>
|
|
191
|
+
</tr>
|
|
192
|
+
}
|
|
193
|
+
</tbody>
|
|
194
|
+
</table>
|
|
195
|
+
|
|
196
|
+
@if (facade.items().length === 0 && !facade.loading()) {
|
|
197
|
+
<div class="px-4 py-6 text-sm text-(--rt-text-secondary)">No onboarding applications found.</div>
|
|
198
|
+
}
|
|
199
|
+
</section>
|
|
200
|
+
</rolatech-onboarding-page-shell>
|
|
201
|
+
`,
|
|
202
|
+
}]
|
|
203
|
+
}], ctorParameters: () => [] });
|
|
204
|
+
|
|
205
|
+
export { AdminOnboardingIndexPage };
|
|
206
|
+
//# sourceMappingURL=rolatech-angular-onboarding-admin-onboarding-index-page-BO4pC_NU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rolatech-angular-onboarding-admin-onboarding-index-page-BO4pC_NU.mjs","sources":["../../../../packages/angular-onboarding/src/lib/pages/admin-onboarding/admin-onboarding-index-page.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, ViewEncapsulation } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { onboardingStatusLabel, OnboardingStatus } from '@rolatech/angular-services';\nimport { OnboardingPageShell } from '../../components/onboarding/onboarding-page-shell';\nimport { OnboardingStatusBadge } from '../../components/onboarding/onboarding-status-badge';\nimport { AdminOnboardingListFacade } from '../../store/admin-onboarding-list.facade';\n\n@Component({\n selector: 'rolatech-admin-onboarding-index-page',\n standalone: true,\n imports: [RouterLink, OnboardingPageShell, OnboardingStatusBadge],\n providers: [AdminOnboardingListFacade],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'block' },\n template: `\n <rolatech-onboarding-page-shell\n title=\"Onboarding Applications\"\n subtitle=\"Review incoming onboarding requests and triage approvals.\"\n kicker=\"Admin Console\"\n >\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 shadow-sm\">\n <div class=\"grid gap-3 md:grid-cols-3\">\n <label class=\"grid gap-2\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)\">Search</span>\n <input\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3\"\n [value]=\"facade.filters().search || ''\"\n (input)=\"onSearch($event)\"\n placeholder=\"Organization or contact\"\n />\n </label>\n\n <label class=\"grid gap-2\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)\">Status</span>\n <select class=\"h-10 rounded-xl border border-(--rt-border-color) px-3\" [value]=\"facade.filters().status || ''\" (change)=\"onStatus($event)\">\n <option value=\"\">All</option>\n @for (status of statuses; track status) {\n <option [value]=\"status\">{{ statusLabel(status) }}</option>\n }\n </select>\n </label>\n\n <div class=\"flex items-end justify-start md:justify-end\">\n <button\n type=\"button\"\n class=\"rounded-xl bg-(--rt-brand-color) px-4 py-2 text-sm font-semibold text-(--rt-text-primary-inverse) transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60\"\n [disabled]=\"facade.loading()\"\n (click)=\"reload()\"\n >\n Refresh\n </button>\n </div>\n </div>\n </section>\n\n @if (facade.error()) {\n <div class=\"rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700\">{{ facade.error() }}</div>\n }\n\n <section class=\"overflow-hidden rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) shadow-sm\">\n <table class=\"min-w-full text-left text-sm\">\n <thead class=\"border-b border-(--rt-border-color) bg-(--rt-raised-background) text-(--rt-text-secondary)\">\n <tr>\n <th class=\"px-4 py-3 font-semibold\">ID</th>\n <th class=\"px-4 py-3 font-semibold\">Organization</th>\n <th class=\"px-4 py-3 font-semibold\">Applicant</th>\n <th class=\"px-4 py-3 font-semibold\">Status</th>\n </tr>\n </thead>\n <tbody>\n @for (item of facade.items(); track item.id) {\n <tr class=\"border-b border-(--rt-border-color) text-(--rt-text-secondary) last:border-b-0\">\n <td class=\"px-4 py-3\">\n <a [routerLink]=\"[item.id]\" class=\"font-medium text-(--rt-text-primary) hover:underline cursor-pointer\">{{ item.id }}</a>\n </td>\n <td class=\"px-4 py-3\">{{ item.organizationName || '-' }}</td>\n <td class=\"px-4 py-3\">{{ item.contactName || '-' }}</td>\n <td class=\"px-4 py-3\">\n <rolatech-onboarding-status-badge [status]=\"item.status\" />\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n @if (facade.items().length === 0 && !facade.loading()) {\n <div class=\"px-4 py-6 text-sm text-(--rt-text-secondary)\">No onboarding applications found.</div>\n }\n </section>\n </rolatech-onboarding-page-shell>\n `,\n})\nexport class AdminOnboardingIndexPage {\n readonly facade = inject(AdminOnboardingListFacade);\n readonly statusLabel = onboardingStatusLabel;\n readonly statuses: OnboardingStatus[] = [\n 'DRAFT',\n 'IN_PROGRESS',\n 'SUBMITTED',\n 'IN_REVIEW',\n 'NEED_MORE_INFO',\n 'APPROVED',\n 'FAILED',\n ];\n\n constructor() {\n void this.facade.load();\n }\n\n onSearch(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.facade.setSearch(target.value);\n void this.facade.load();\n }\n\n onStatus(event: Event): void {\n const target = event.target as HTMLSelectElement;\n const status = target.value ? (target.value as OnboardingStatus) : undefined;\n this.facade.setStatus(status);\n void this.facade.load();\n }\n\n async reload(): Promise<void> {\n await this.facade.load();\n }\n}\n"],"names":[],"mappings":";;;;;;MA6Fa,wBAAwB,CAAA;AAC1B,IAAA,MAAM,GAAG,MAAM,CAAC,yBAAyB,CAAC;IAC1C,WAAW,GAAG,qBAAqB;AACnC,IAAA,QAAQ,GAAuB;QACtC,OAAO;QACP,aAAa;QACb,WAAW;QACX,WAAW;QACX,gBAAgB;QAChB,UAAU;QACV,QAAQ;KACT;AAED,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACzB;AAEA,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;QAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;AACnC,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACzB;AAEA,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;AAChD,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,GAAI,MAAM,CAAC,KAA0B,GAAG,SAAS;AAC5E,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;AAC7B,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACzB;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAC1B;uGAhCW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAlFxB,CAAC,yBAAyB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAI5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4ET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjFS,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAmFrD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAtFpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sCAAsC;AAChD,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,CAAC;oBACjE,SAAS,EAAE,CAAC,yBAAyB,CAAC;oBACtC,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;AACxB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4ET,EAAA,CAAA;AACF,iBAAA;;;;;"}
|