@rolatech/angular-onboarding 20.3.0-beta.3 → 20.3.0-beta.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.
- package/README.md +1 -1
- package/fesm2022/{rolatech-angular-onboarding-admin-onboarding-detail-page-DD-5SdjA.mjs → rolatech-angular-onboarding-admin-onboarding-detail-page-DREEMvoT.mjs} +13 -1
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-detail-page-DREEMvoT.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.mjs +3 -3
- package/fesm2022/rolatech-angular-onboarding.mjs.map +1 -1
- package/package.json +1 -1
- package/fesm2022/rolatech-angular-onboarding-admin-onboarding-detail-page-DD-5SdjA.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ Transport and contracts are consumed from `@rolatech/angular-services`.
|
|
|
26
26
|
|
|
27
27
|
- `AGENT_APPLY_ROUTES`
|
|
28
28
|
- `AGENT_ONBOARDING_ROUTES`
|
|
29
|
-
- `ADMIN_ONBOARDING_ROUTES`
|
|
29
|
+
- `ADMIN_ONBOARDING_ROUTES` for the admin list, detail, and review pages
|
|
30
30
|
|
|
31
31
|
## Integration Example
|
|
32
32
|
|
|
@@ -214,6 +214,12 @@ class AdminOnboardingDetailPage {
|
|
|
214
214
|
@if (facade.detail()?.status || null; as status) {
|
|
215
215
|
<rolatech-onboarding-status-badge [status]="status" />
|
|
216
216
|
}
|
|
217
|
+
<a
|
|
218
|
+
[routerLink]="['review']"
|
|
219
|
+
class="inline-flex items-center rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-medium hover:bg-(--rt-raised-background) cursor-pointer"
|
|
220
|
+
>
|
|
221
|
+
Review Page
|
|
222
|
+
</a>
|
|
217
223
|
<button
|
|
218
224
|
type="button"
|
|
219
225
|
class="inline-flex items-center rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-medium"
|
|
@@ -479,6 +485,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
479
485
|
@if (facade.detail()?.status || null; as status) {
|
|
480
486
|
<rolatech-onboarding-status-badge [status]="status" />
|
|
481
487
|
}
|
|
488
|
+
<a
|
|
489
|
+
[routerLink]="['review']"
|
|
490
|
+
class="inline-flex items-center rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-medium hover:bg-(--rt-raised-background) cursor-pointer"
|
|
491
|
+
>
|
|
492
|
+
Review Page
|
|
493
|
+
</a>
|
|
482
494
|
<button
|
|
483
495
|
type="button"
|
|
484
496
|
class="inline-flex items-center rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-medium"
|
|
@@ -705,4 +717,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
705
717
|
}], ctorParameters: () => [] });
|
|
706
718
|
|
|
707
719
|
export { AdminOnboardingDetailPage };
|
|
708
|
-
//# sourceMappingURL=rolatech-angular-onboarding-admin-onboarding-detail-page-
|
|
720
|
+
//# sourceMappingURL=rolatech-angular-onboarding-admin-onboarding-detail-page-DREEMvoT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rolatech-angular-onboarding-admin-onboarding-detail-page-DREEMvoT.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 {\n onboardingApplicantTypeLabel,\n OnboardingDocumentResponse,\n onboardingDocumentTypeLabel,\n onboardingStatusLabel,\n onboardingVatModeLabel,\n OnboardingDocumentType,\n} from '@rolatech/angular-services';\nimport { PlatformPageHeader, PlatformStatCard } from '@rolatech/angular-platform';\nimport { OnboardingDocumentPreviewDialog } from '../../components/onboarding/onboarding-document-preview-dialog';\nimport { OnboardingIssueList } from '../../components/onboarding/onboarding-issue-list';\nimport { OnboardingReviewIssuesBanner } from '../../components/onboarding/onboarding-review-issues-banner';\nimport { OnboardingReviewRow } from '../../components/onboarding/onboarding-review-row';\nimport { OnboardingStatusBadge } from '../../components/onboarding/onboarding-status-badge';\nimport { OnboardingTimelineDrawer } from '../../components/onboarding/onboarding-timeline-drawer';\nimport {\n OnboardingReviewIssueDraft,\n OnboardingReviewIssueOption,\n onboardingDocumentIssueOptions,\n onboardingFieldIssueOptions,\n} from '../../models/onboarding-review.models';\nimport { AdminOnboardingReviewFacade } from '../../store/admin-onboarding-review.facade';\n\ninterface AdminReviewItem {\n key: string;\n label: string;\n value: string | null | undefined;\n helper: string;\n}\n\ninterface AdminDocumentReviewItem {\n documentType: OnboardingDocumentType;\n label: string;\n value: string | null | undefined;\n helper: string;\n document: OnboardingDocumentResponse | null;\n}\n\n@Component({\n selector: 'rolatech-admin-onboarding-detail-page',\n standalone: true,\n imports: [\n RouterLink,\n PlatformPageHeader,\n PlatformStatCard,\n OnboardingStatusBadge,\n OnboardingIssueList,\n OnboardingTimelineDrawer,\n OnboardingReviewRow,\n OnboardingReviewIssuesBanner,\n OnboardingDocumentPreviewDialog,\n ],\n providers: [AdminOnboardingReviewFacade],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'block' },\n template: `\n <section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-2\">\n <div class=\"flex flex-wrap items-center gap-2 text-sm text-muted-foreground\">\n <a [routerLink]=\"['../']\" class=\"hover:underline cursor-pointer\">Agent Applications</a>\n @if (facade.detail(); as detail) {\n <span>/</span>\n <span>{{ detail.organizationName || detail.contactName || detail.id }}</span>\n }\n </div>\n\n <div>\n <h1 class=\"text-2xl font-semibold tracking-tight\">{{ title() }}</h1>\n <p class=\"mt-1 text-sm text-muted-foreground\">{{ subtitle() }}</p>\n </div>\n </div>\n\n <div header-actions>\n @if (facade.detail()?.status || null; as status) {\n <rolatech-onboarding-status-badge [status]=\"status\" />\n }\n <a\n [routerLink]=\"['review']\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-medium hover:bg-(--rt-raised-background) cursor-pointer\"\n >\n Review Page\n </a>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-medium\"\n (click)=\"openTimeline()\"\n >\n Timeline\n </button>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Documents</div>\n <div stat-value>{{ documentCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Open Issues</div>\n <div stat-value>{{ openIssueCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Timeline Events</div>\n <div stat-value>{{ timelineCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Draft Issues</div>\n <div stat-value>{{ facade.issueDrafts().length }}</div>\n </rolatech-platform-stat-card>\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 @if (facade.detail(); as detail) {\n <div class=\"space-y-4\">\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-5 shadow-sm\">\n <div class=\"flex flex-wrap items-center gap-3 text-sm text-muted-foreground\">\n <span>Application ID: <span class=\"font-semibold text-(--rt-text-primary)\">{{ detail.id }}</span></span>\n <span>•</span>\n <span>{{ onboardingStatusLabel(detail.status) }}</span>\n <span>•</span>\n <span>{{ onboardingApplicantTypeLabel(detail.applicantType) }}</span>\n <span>•</span>\n <span>{{ countryLabel(detail.companyCountry) }}</span>\n </div>\n </section>\n\n @if (detail.status === 'NEED_MORE_INFO') {\n <rolatech-onboarding-review-issues-banner [issues]=\"detail.issues\" [status]=\"detail.status\" />\n }\n\n <section class=\"space-y-4 rounded-3xl border border-(--rt-border-color) bg-(--rt-base-background) p-6 shadow-sm\">\n <div class=\"flex flex-wrap items-start justify-between gap-4\">\n <div class=\"space-y-2\">\n <h2 class=\"text-lg font-semibold text-(--rt-text-primary)\">Inline Review Workspace</h2>\n <p class=\"max-w-2xl text-sm text-(--rt-text-secondary)\">\n Review the application in place. Mark a field or document as passed, or leave an issue directly beside the item that needs correction.\n </p>\n </div>\n\n <span class=\"rounded-full border border-(--rt-border-color) bg-(--rt-raised-background) px-3 py-1 text-xs font-semibold text-(--rt-text-secondary)\">\n {{ facade.issueDrafts().length }} draft issues\n </span>\n </div>\n\n <label class=\"grid gap-2\">\n <span class=\"text-sm font-medium text-(--rt-text-secondary)\">Review summary</span>\n <textarea\n class=\"min-h-28 rounded-xl border border-(--rt-border-color) px-3 py-2\"\n [value]=\"facade.reviewComment()\"\n (input)=\"setComment($event)\"\n placeholder=\"Add a high-level review note or final decision context...\"\n ></textarea>\n </label>\n\n <div class=\"flex flex-wrap gap-3\">\n <button\n type=\"button\"\n class=\"rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-semibold text-(--rt-text-secondary) hover:bg-(--rt-raised-background)\"\n [disabled]=\"facade.saving()\"\n (click)=\"startReview()\"\n >\n Start Review\n </button>\n\n <button\n type=\"button\"\n class=\"rounded-xl border border-amber-300 bg-amber-50 px-4 py-2 text-sm font-semibold text-amber-800 hover:bg-amber-100\"\n [disabled]=\"facade.saving()\"\n (click)=\"needMoreInfo()\"\n >\n Need More Info\n </button>\n\n <button\n type=\"button\"\n class=\"rounded-xl border border-emerald-300 bg-emerald-50 px-4 py-2 text-sm font-semibold text-emerald-800 hover:bg-emerald-100\"\n [disabled]=\"facade.saving()\"\n (click)=\"approve()\"\n >\n Approve\n </button>\n\n <button\n type=\"button\"\n class=\"rounded-xl border border-rose-300 bg-rose-50 px-4 py-2 text-sm font-semibold text-rose-800 hover:bg-rose-100\"\n [disabled]=\"facade.saving()\"\n (click)=\"fail()\"\n >\n Fail\n </button>\n </div>\n </section>\n\n <section class=\"space-y-4\">\n <div class=\"space-y-1\">\n <h2 class=\"text-lg font-semibold text-(--rt-text-primary)\">Applicant Profile</h2>\n <p class=\"text-sm text-(--rt-text-secondary)\">Check identity, contact, and company information.</p>\n </div>\n\n <div class=\"grid gap-4 lg:grid-cols-2\">\n @for (item of profileItems(); track item.key) {\n <rolatech-onboarding-review-row\n [label]=\"item.label\"\n [value]=\"item.value\"\n [helper]=\"item.helper\"\n [issueOptions]=\"fieldIssueOptions(item.key)\"\n [existingIssue]=\"fieldExistingIssue(item.key)\"\n [draftIssue]=\"facade.fieldDraft(item.key)\"\n [passed]=\"facade.fieldPassed(item.key)\"\n [busy]=\"facade.saving()\"\n (passedChange)=\"onFieldPassed(item.key, $event)\"\n (draftIssueChange)=\"onFieldIssue(item.key, $event)\"\n />\n }\n </div>\n </section>\n\n <section class=\"space-y-4\">\n <div class=\"space-y-1\">\n <h2 class=\"text-lg font-semibold text-(--rt-text-primary)\">Compliance and Banking</h2>\n <p class=\"text-sm text-(--rt-text-secondary)\">Check VAT setup and settlement account details.</p>\n </div>\n\n <div class=\"grid gap-4 lg:grid-cols-2\">\n @for (item of complianceItems(); track item.key) {\n <rolatech-onboarding-review-row\n [label]=\"item.label\"\n [value]=\"item.value\"\n [helper]=\"item.helper\"\n [issueOptions]=\"fieldIssueOptions(item.key)\"\n [existingIssue]=\"fieldExistingIssue(item.key)\"\n [draftIssue]=\"facade.fieldDraft(item.key)\"\n [passed]=\"facade.fieldPassed(item.key)\"\n [busy]=\"facade.saving()\"\n (passedChange)=\"onFieldPassed(item.key, $event)\"\n (draftIssueChange)=\"onFieldIssue(item.key, $event)\"\n />\n }\n </div>\n </section>\n\n <section class=\"space-y-4\">\n <div class=\"space-y-1\">\n <h2 class=\"text-lg font-semibold text-(--rt-text-primary)\">Documents</h2>\n <p class=\"text-sm text-(--rt-text-secondary)\">Review required documents and flag anything missing or unreadable.</p>\n </div>\n\n <div class=\"grid gap-4 lg:grid-cols-2\">\n @for (item of documentItems(); track item.documentType + item.label) {\n <rolatech-onboarding-review-row\n [label]=\"item.label\"\n [value]=\"item.value\"\n [helper]=\"item.helper\"\n [issueOptions]=\"documentIssueOptions(item.documentType)\"\n [existingIssue]=\"documentExistingIssue(item.documentType)\"\n [draftIssue]=\"facade.documentDraft(item.documentType)\"\n [passed]=\"facade.documentPassed(item.documentType)\"\n [busy]=\"facade.saving()\"\n [actionLabel]=\"item.document ? 'Preview' : null\"\n [actionDisabled]=\"!item.document\"\n (passedChange)=\"onDocumentPassed(item.documentType, $event)\"\n (draftIssueChange)=\"onDocumentIssue(item.documentType, $event)\"\n (actionTriggered)=\"openDocumentPreview(item)\"\n />\n }\n </div>\n </section>\n\n <rolatech-onboarding-issue-list [issues]=\"detail.issues\" />\n </div>\n } @else {\n <div class=\"rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 text-sm text-(--rt-text-secondary) shadow-sm\">\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\n <rolatech-onboarding-document-preview-dialog\n [open]=\"previewOpen()\"\n [title]=\"previewTitle()\"\n [subtitle]=\"previewSubtitle()\"\n [url]=\"facade.previewUrl()\"\n [loading]=\"facade.previewLoading()\"\n [error]=\"facade.previewError()\"\n (closeRequested)=\"closeDocumentPreview()\"\n />\n </section>\n `,\n})\nexport class AdminOnboardingDetailPage {\n readonly facade = inject(AdminOnboardingReviewFacade);\n readonly timelineOpen = signal(false);\n readonly previewOpen = signal(false);\n readonly previewTitle = signal<string | null>(null);\n readonly previewSubtitle = signal<string | null>(null);\n readonly onboardingApplicantTypeLabel = onboardingApplicantTypeLabel;\n readonly onboardingStatusLabel = onboardingStatusLabel;\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 and triage approvals inline.';\n }\n\n return `${detail.organizationName || detail.contactName || 'Applicant'} • ${detail.contactEmail || 'No email'}`;\n });\n readonly title = computed(() => {\n const detail = this.facade.detail();\n\n if (!detail) {\n return 'Agent Application Review';\n }\n\n return detail.organizationName || detail.contactName || 'Agent Application Review';\n });\n readonly documentCount = computed(() => this.facade.detail()?.documents.length ?? 0);\n readonly timelineCount = computed(() => this.facade.detail()?.timeline.length ?? 0);\n readonly openIssueCount = computed(() => (this.facade.detail()?.issues ?? []).filter((issue) => !issue.resolved).length);\n\n readonly profileItems = computed<AdminReviewItem[]>(() => {\n const detail = this.facade.detail();\n\n if (!detail) {\n return [];\n }\n\n return [\n ...(detail.applicantType === 'COMPANY'\n ? [{ key: 'organizationName', label: 'Company legal name', value: detail.organizationName, helper: '' }]\n : [{ key: 'contactName', label: 'Applicant name', value: detail.contactName, helper: '' }]),\n ...(detail.applicantType === 'COMPANY'\n ? [{ key: 'contactName', label: 'Primary contact', value: detail.contactName, helper: '' }]\n : []),\n { key: 'contactEmail', label: 'Primary email', value: detail.contactEmail, helper: '' },\n { key: 'contactPhone', label: 'Phone number', value: detail.contactPhone, helper: '' },\n { key: 'countryCode', label: 'Country code', value: detail.countryCode, helper: '' },\n ];\n });\n\n readonly complianceItems = computed<AdminReviewItem[]>(() => {\n const detail = this.facade.detail();\n\n if (!detail) {\n return [];\n }\n\n return [\n { key: 'vatMode', label: 'VAT mode', value: onboardingVatModeLabel(detail.vatMode ?? null), helper: '' },\n { key: 'vatNumber', label: 'VAT number', value: detail.vatNumber || 'Missing', helper: '' },\n { key: 'bankName', label: 'Bank name', value: detail.bankName, helper: '' },\n { key: 'accountHolderName', label: 'Account holder', value: detail.accountHolderName, helper: '' },\n { key: 'sortCode', label: 'Sort code', value: detail.sortCode, helper: '' },\n { key: 'accountNumber', label: 'Account number', value: detail.accountNumber, helper: '' },\n ];\n });\n\n readonly documentItems = computed<AdminDocumentReviewItem[]>(() => {\n const detail = this.facade.detail();\n\n if (!detail) {\n return [];\n }\n\n const requiredItems = this.facade.requiredDocuments().map((spec) => {\n const document = detail.documents.find((item) => item.documentType === spec.type) ?? null;\n\n return {\n documentType: spec.type,\n label: spec.label,\n helper: spec.helperText ?? '',\n document,\n value: document?.originalFilename ?? 'Missing',\n };\n });\n\n const requiredTypes = new Set(requiredItems.map((item) => item.documentType));\n const additionalItems = detail.documents\n .filter((item) => !requiredTypes.has(item.documentType))\n .map((item) => ({\n documentType: item.documentType,\n label: `Additional: ${onboardingDocumentTypeLabel(item.documentType)}`,\n helper: 'Supporting document uploaded by the applicant.',\n document: item,\n value: item.originalFilename,\n }));\n\n return [...requiredItems, ...additionalItems];\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 setComment(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n this.facade.setComment(target.value);\n }\n\n fieldIssueOptions(fieldKey: string): OnboardingReviewIssueOption[] {\n return onboardingFieldIssueOptions(fieldKey);\n }\n\n documentIssueOptions(documentType: OnboardingDocumentType): OnboardingReviewIssueOption[] {\n return onboardingDocumentIssueOptions(documentType);\n }\n\n onFieldIssue(fieldKey: string, draft: OnboardingReviewIssueDraft | null): void {\n this.facade.setFieldIssueDraft(fieldKey, draft);\n }\n\n fieldExistingIssue(fieldKey: string): string | null {\n const existing = this.facade.existingFieldIssues();\n return Object.prototype.hasOwnProperty.call(existing, fieldKey) ? existing[fieldKey] : null;\n }\n\n onFieldPassed(fieldKey: string, passed: boolean): void {\n this.facade.toggleFieldPassed(fieldKey, passed);\n }\n\n onDocumentIssue(documentType: OnboardingDocumentType, draft: OnboardingReviewIssueDraft | null): void {\n this.facade.setDocumentIssueDraft(documentType, draft);\n }\n\n documentExistingIssue(documentType: OnboardingDocumentType): string | null {\n const existing = this.facade.existingDocumentIssues();\n return existing[documentType] ?? null;\n }\n\n onDocumentPassed(documentType: OnboardingDocumentType, passed: boolean): void {\n this.facade.toggleDocumentPassed(documentType, passed);\n }\n\n async openDocumentPreview(item: AdminDocumentReviewItem): Promise<void> {\n if (!item.document) {\n return;\n }\n\n this.previewTitle.set(item.label);\n this.previewSubtitle.set(item.document.originalFilename || null);\n this.previewOpen.set(true);\n await this.facade.openDocumentPreview(item.document.id);\n }\n\n async startReview(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.startReview(applicationId);\n }\n\n async needMoreInfo(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.requestMoreInfo(applicationId);\n }\n\n async approve(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.approve(applicationId);\n }\n\n async fail(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.fail(applicationId);\n }\n\n openTimeline(): void {\n this.timelineOpen.set(true);\n }\n\n closeTimeline(): void {\n this.timelineOpen.set(false);\n }\n\n closeDocumentPreview(): void {\n this.previewOpen.set(false);\n this.previewTitle.set(null);\n this.previewSubtitle.set(null);\n this.facade.clearDocumentPreview();\n }\n\n countryLabel(value: string | null | undefined): string {\n switch ((value ?? '').toUpperCase()) {\n case 'CN':\n return 'China';\n case 'UK':\n return 'United Kingdom';\n default:\n return value || '—';\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
|
+
import * as i1 from '@angular/forms';
|
|
5
|
+
import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { ActivatedRoute, RouterLink } from '@angular/router';
|
|
7
|
+
import { onboardingDocumentTypeLabel, onboardingIssueTypeLabel } from '@rolatech/angular-services';
|
|
8
|
+
import { AdminOnboardingReviewFacade, OnboardingPageShell, OnboardingStatusBadge, OnboardingIssueList } from './rolatech-angular-onboarding.mjs';
|
|
9
|
+
|
|
10
|
+
class AdminOnboardingReviewPage {
|
|
11
|
+
facade = inject(AdminOnboardingReviewFacade);
|
|
12
|
+
fb = inject(FormBuilder);
|
|
13
|
+
route = inject(ActivatedRoute);
|
|
14
|
+
documentTypeLabel = onboardingDocumentTypeLabel;
|
|
15
|
+
issueTypeLabel = onboardingIssueTypeLabel;
|
|
16
|
+
documentTypes = [
|
|
17
|
+
'PASSPORT',
|
|
18
|
+
'CERTIFICATE_OF_INCORPORATION',
|
|
19
|
+
'INDUSTRY_CERTIFICATE',
|
|
20
|
+
'PROOF_OF_ADDRESS',
|
|
21
|
+
'BANK_STATEMENT',
|
|
22
|
+
'OTHER',
|
|
23
|
+
];
|
|
24
|
+
issueForm = this.fb.nonNullable.group({
|
|
25
|
+
fieldKey: ['', [Validators.required]],
|
|
26
|
+
documentType: ['PASSPORT', [Validators.required]],
|
|
27
|
+
comment: ['', [Validators.required]],
|
|
28
|
+
});
|
|
29
|
+
paramMap = toSignal(this.route.paramMap, {
|
|
30
|
+
initialValue: this.route.snapshot.paramMap,
|
|
31
|
+
});
|
|
32
|
+
constructor() {
|
|
33
|
+
effect(() => {
|
|
34
|
+
const applicationId = this.paramMap().get('applicationId');
|
|
35
|
+
if (!applicationId) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
void this.facade.load(applicationId);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
setComment(event) {
|
|
42
|
+
const target = event.target;
|
|
43
|
+
this.facade.setComment(target.value);
|
|
44
|
+
}
|
|
45
|
+
addFieldIssue() {
|
|
46
|
+
const value = this.issueForm.getRawValue();
|
|
47
|
+
if (!value.comment || !value.fieldKey) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.facade.addFieldIssue(value.fieldKey, value.comment);
|
|
51
|
+
}
|
|
52
|
+
addDocumentIssue() {
|
|
53
|
+
const value = this.issueForm.getRawValue();
|
|
54
|
+
if (!value.comment || !value.documentType) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.facade.addDocumentIssue(value.documentType, value.comment);
|
|
58
|
+
}
|
|
59
|
+
async startReview() {
|
|
60
|
+
const applicationId = this.paramMap().get('applicationId');
|
|
61
|
+
if (!applicationId) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
await this.facade.startReview(applicationId);
|
|
65
|
+
}
|
|
66
|
+
async needMoreInfo() {
|
|
67
|
+
const applicationId = this.paramMap().get('applicationId');
|
|
68
|
+
if (!applicationId) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await this.facade.requestMoreInfo(applicationId);
|
|
72
|
+
}
|
|
73
|
+
async approve() {
|
|
74
|
+
const applicationId = this.paramMap().get('applicationId');
|
|
75
|
+
if (!applicationId) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
await this.facade.approve(applicationId);
|
|
79
|
+
}
|
|
80
|
+
async fail() {
|
|
81
|
+
const applicationId = this.paramMap().get('applicationId');
|
|
82
|
+
if (!applicationId) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
await this.facade.fail(applicationId);
|
|
86
|
+
}
|
|
87
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: AdminOnboardingReviewPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
88
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: AdminOnboardingReviewPage, isStandalone: true, selector: "rolatech-admin-onboarding-review-page", host: { classAttribute: "block" }, providers: [AdminOnboardingReviewFacade], ngImport: i0, template: `
|
|
89
|
+
<rolatech-onboarding-page-shell
|
|
90
|
+
title="Onboarding Review Workspace"
|
|
91
|
+
subtitle="Create actionable review notes and make a final decision."
|
|
92
|
+
kicker="Admin Console"
|
|
93
|
+
>
|
|
94
|
+
<div header-leading>
|
|
95
|
+
<a
|
|
96
|
+
[routerLink]="['../']"
|
|
97
|
+
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"
|
|
98
|
+
>
|
|
99
|
+
← Back
|
|
100
|
+
</a>
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
<div header-actions>
|
|
104
|
+
<rolatech-onboarding-status-badge [status]="facade.detail()?.status || null" />
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
@if (facade.error()) {
|
|
108
|
+
<div class="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">{{ facade.error() }}</div>
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@if (facade.detail(); as detail) {
|
|
112
|
+
<section class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-6 shadow-sm">
|
|
113
|
+
<h2 class="text-lg font-semibold text-(--rt-text-primary)">{{ detail.organizationName || 'Organization' }}</h2>
|
|
114
|
+
<p class="mt-1 text-sm text-(--rt-text-secondary)">{{ detail.contactName }} • {{ detail.contactEmail }}</p>
|
|
115
|
+
|
|
116
|
+
<label class="mt-6 grid gap-2">
|
|
117
|
+
<span class="text-sm font-medium text-(--rt-text-secondary)">Review comment</span>
|
|
118
|
+
<textarea
|
|
119
|
+
class="min-h-28 rounded-xl border border-(--rt-border-color) px-3 py-2"
|
|
120
|
+
[value]="facade.reviewComment()"
|
|
121
|
+
(input)="setComment($event)"
|
|
122
|
+
placeholder="Add a review summary or final decision context..."
|
|
123
|
+
></textarea>
|
|
124
|
+
</label>
|
|
125
|
+
|
|
126
|
+
<form
|
|
127
|
+
[formGroup]="issueForm"
|
|
128
|
+
class="mt-6 grid gap-3 rounded-xl border border-(--rt-border-color) bg-(--rt-raised-background) p-4 md:grid-cols-3"
|
|
129
|
+
>
|
|
130
|
+
<label class="grid gap-1">
|
|
131
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Field key</span>
|
|
132
|
+
<input
|
|
133
|
+
formControlName="fieldKey"
|
|
134
|
+
class="h-10 rounded-lg border border-(--rt-border-color) px-3"
|
|
135
|
+
placeholder="financial.vatNumber"
|
|
136
|
+
/>
|
|
137
|
+
</label>
|
|
138
|
+
|
|
139
|
+
<label class="grid gap-1">
|
|
140
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Document type</span>
|
|
141
|
+
<select formControlName="documentType" class="h-10 rounded-lg border border-(--rt-border-color) px-3">
|
|
142
|
+
@for (type of documentTypes; track type) {
|
|
143
|
+
<option [value]="type">{{ documentTypeLabel(type) }}</option>
|
|
144
|
+
}
|
|
145
|
+
</select>
|
|
146
|
+
</label>
|
|
147
|
+
|
|
148
|
+
<label class="grid gap-1 md:col-span-3">
|
|
149
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Issue comment</span>
|
|
150
|
+
<input
|
|
151
|
+
formControlName="comment"
|
|
152
|
+
class="h-10 rounded-lg border border-(--rt-border-color) px-3"
|
|
153
|
+
placeholder="Describe what needs correction"
|
|
154
|
+
/>
|
|
155
|
+
</label>
|
|
156
|
+
|
|
157
|
+
<div class="md:col-span-3 flex flex-wrap gap-2">
|
|
158
|
+
<button
|
|
159
|
+
type="button"
|
|
160
|
+
class="rounded-lg border border-(--rt-border-color) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) hover:bg-(--rt-base-background)"
|
|
161
|
+
(click)="addFieldIssue()"
|
|
162
|
+
>
|
|
163
|
+
Add Field Issue
|
|
164
|
+
</button>
|
|
165
|
+
<button
|
|
166
|
+
type="button"
|
|
167
|
+
class="rounded-lg border border-(--rt-border-color) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) hover:bg-(--rt-base-background)"
|
|
168
|
+
(click)="addDocumentIssue()"
|
|
169
|
+
>
|
|
170
|
+
Add Document Issue
|
|
171
|
+
</button>
|
|
172
|
+
</div>
|
|
173
|
+
</form>
|
|
174
|
+
|
|
175
|
+
@if (facade.issueDrafts().length > 0) {
|
|
176
|
+
<section class="mt-6 space-y-3">
|
|
177
|
+
<h3 class="text-sm font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Draft Issues</h3>
|
|
178
|
+
@for (item of facade.issueDrafts(); track $index) {
|
|
179
|
+
<article class="rounded-xl border border-(--rt-border-color) p-3">
|
|
180
|
+
<p class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">{{ issueTypeLabel(item.issueType) }}</p>
|
|
181
|
+
<p class="mt-1 text-sm text-(--rt-text-secondary)">
|
|
182
|
+
{{ item.fieldKey || documentTypeLabel(item.documentType || null) }}
|
|
183
|
+
</p>
|
|
184
|
+
<p class="mt-1 text-sm text-(--rt-text-primary)">{{ item.comment }}</p>
|
|
185
|
+
<button
|
|
186
|
+
type="button"
|
|
187
|
+
class="mt-2 text-xs font-semibold uppercase tracking-wide text-rose-700"
|
|
188
|
+
(click)="facade.removeIssue($index)"
|
|
189
|
+
>
|
|
190
|
+
Remove
|
|
191
|
+
</button>
|
|
192
|
+
</article>
|
|
193
|
+
}
|
|
194
|
+
</section>
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
<div class="mt-8 flex flex-wrap gap-3">
|
|
198
|
+
<button
|
|
199
|
+
type="button"
|
|
200
|
+
class="rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-semibold text-(--rt-text-secondary) hover:bg-(--rt-raised-background)"
|
|
201
|
+
[disabled]="facade.saving()"
|
|
202
|
+
(click)="startReview()"
|
|
203
|
+
>
|
|
204
|
+
Start Review
|
|
205
|
+
</button>
|
|
206
|
+
|
|
207
|
+
<button
|
|
208
|
+
type="button"
|
|
209
|
+
class="rounded-xl border border-amber-300 bg-amber-50 px-4 py-2 text-sm font-semibold text-amber-800 hover:bg-amber-100"
|
|
210
|
+
[disabled]="facade.saving()"
|
|
211
|
+
(click)="needMoreInfo()"
|
|
212
|
+
>
|
|
213
|
+
Need More Info
|
|
214
|
+
</button>
|
|
215
|
+
|
|
216
|
+
<button
|
|
217
|
+
type="button"
|
|
218
|
+
class="rounded-xl border border-emerald-300 bg-emerald-50 px-4 py-2 text-sm font-semibold text-emerald-800 hover:bg-emerald-100"
|
|
219
|
+
[disabled]="facade.saving()"
|
|
220
|
+
(click)="approve()"
|
|
221
|
+
>
|
|
222
|
+
Approve
|
|
223
|
+
</button>
|
|
224
|
+
|
|
225
|
+
<button
|
|
226
|
+
type="button"
|
|
227
|
+
class="rounded-xl border border-rose-300 bg-rose-50 px-4 py-2 text-sm font-semibold text-rose-800 hover:bg-rose-100"
|
|
228
|
+
[disabled]="facade.saving()"
|
|
229
|
+
(click)="fail()"
|
|
230
|
+
>
|
|
231
|
+
Fail
|
|
232
|
+
</button>
|
|
233
|
+
</div>
|
|
234
|
+
</section>
|
|
235
|
+
|
|
236
|
+
<rolatech-onboarding-issue-list [issues]="detail.issues" />
|
|
237
|
+
} @else {
|
|
238
|
+
<div
|
|
239
|
+
class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 text-sm text-(--rt-text-secondary) shadow-sm"
|
|
240
|
+
>
|
|
241
|
+
Loading review workspace...
|
|
242
|
+
</div>
|
|
243
|
+
}
|
|
244
|
+
</rolatech-onboarding-page-shell>
|
|
245
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { 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: OnboardingIssueList, selector: "rolatech-onboarding-issue-list", inputs: ["issues"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
246
|
+
}
|
|
247
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: AdminOnboardingReviewPage, decorators: [{
|
|
248
|
+
type: Component,
|
|
249
|
+
args: [{
|
|
250
|
+
selector: 'rolatech-admin-onboarding-review-page',
|
|
251
|
+
standalone: true,
|
|
252
|
+
imports: [ReactiveFormsModule, RouterLink, OnboardingPageShell, OnboardingStatusBadge, OnboardingIssueList],
|
|
253
|
+
providers: [AdminOnboardingReviewFacade],
|
|
254
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
255
|
+
encapsulation: ViewEncapsulation.None,
|
|
256
|
+
host: { class: 'block' },
|
|
257
|
+
template: `
|
|
258
|
+
<rolatech-onboarding-page-shell
|
|
259
|
+
title="Onboarding Review Workspace"
|
|
260
|
+
subtitle="Create actionable review notes and make a final decision."
|
|
261
|
+
kicker="Admin Console"
|
|
262
|
+
>
|
|
263
|
+
<div header-leading>
|
|
264
|
+
<a
|
|
265
|
+
[routerLink]="['../']"
|
|
266
|
+
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"
|
|
267
|
+
>
|
|
268
|
+
← Back
|
|
269
|
+
</a>
|
|
270
|
+
</div>
|
|
271
|
+
|
|
272
|
+
<div header-actions>
|
|
273
|
+
<rolatech-onboarding-status-badge [status]="facade.detail()?.status || null" />
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
@if (facade.error()) {
|
|
277
|
+
<div class="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">{{ facade.error() }}</div>
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
@if (facade.detail(); as detail) {
|
|
281
|
+
<section class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-6 shadow-sm">
|
|
282
|
+
<h2 class="text-lg font-semibold text-(--rt-text-primary)">{{ detail.organizationName || 'Organization' }}</h2>
|
|
283
|
+
<p class="mt-1 text-sm text-(--rt-text-secondary)">{{ detail.contactName }} • {{ detail.contactEmail }}</p>
|
|
284
|
+
|
|
285
|
+
<label class="mt-6 grid gap-2">
|
|
286
|
+
<span class="text-sm font-medium text-(--rt-text-secondary)">Review comment</span>
|
|
287
|
+
<textarea
|
|
288
|
+
class="min-h-28 rounded-xl border border-(--rt-border-color) px-3 py-2"
|
|
289
|
+
[value]="facade.reviewComment()"
|
|
290
|
+
(input)="setComment($event)"
|
|
291
|
+
placeholder="Add a review summary or final decision context..."
|
|
292
|
+
></textarea>
|
|
293
|
+
</label>
|
|
294
|
+
|
|
295
|
+
<form
|
|
296
|
+
[formGroup]="issueForm"
|
|
297
|
+
class="mt-6 grid gap-3 rounded-xl border border-(--rt-border-color) bg-(--rt-raised-background) p-4 md:grid-cols-3"
|
|
298
|
+
>
|
|
299
|
+
<label class="grid gap-1">
|
|
300
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Field key</span>
|
|
301
|
+
<input
|
|
302
|
+
formControlName="fieldKey"
|
|
303
|
+
class="h-10 rounded-lg border border-(--rt-border-color) px-3"
|
|
304
|
+
placeholder="financial.vatNumber"
|
|
305
|
+
/>
|
|
306
|
+
</label>
|
|
307
|
+
|
|
308
|
+
<label class="grid gap-1">
|
|
309
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Document type</span>
|
|
310
|
+
<select formControlName="documentType" class="h-10 rounded-lg border border-(--rt-border-color) px-3">
|
|
311
|
+
@for (type of documentTypes; track type) {
|
|
312
|
+
<option [value]="type">{{ documentTypeLabel(type) }}</option>
|
|
313
|
+
}
|
|
314
|
+
</select>
|
|
315
|
+
</label>
|
|
316
|
+
|
|
317
|
+
<label class="grid gap-1 md:col-span-3">
|
|
318
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Issue comment</span>
|
|
319
|
+
<input
|
|
320
|
+
formControlName="comment"
|
|
321
|
+
class="h-10 rounded-lg border border-(--rt-border-color) px-3"
|
|
322
|
+
placeholder="Describe what needs correction"
|
|
323
|
+
/>
|
|
324
|
+
</label>
|
|
325
|
+
|
|
326
|
+
<div class="md:col-span-3 flex flex-wrap gap-2">
|
|
327
|
+
<button
|
|
328
|
+
type="button"
|
|
329
|
+
class="rounded-lg border border-(--rt-border-color) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) hover:bg-(--rt-base-background)"
|
|
330
|
+
(click)="addFieldIssue()"
|
|
331
|
+
>
|
|
332
|
+
Add Field Issue
|
|
333
|
+
</button>
|
|
334
|
+
<button
|
|
335
|
+
type="button"
|
|
336
|
+
class="rounded-lg border border-(--rt-border-color) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) hover:bg-(--rt-base-background)"
|
|
337
|
+
(click)="addDocumentIssue()"
|
|
338
|
+
>
|
|
339
|
+
Add Document Issue
|
|
340
|
+
</button>
|
|
341
|
+
</div>
|
|
342
|
+
</form>
|
|
343
|
+
|
|
344
|
+
@if (facade.issueDrafts().length > 0) {
|
|
345
|
+
<section class="mt-6 space-y-3">
|
|
346
|
+
<h3 class="text-sm font-semibold uppercase tracking-wide text-(--rt-text-secondary)">Draft Issues</h3>
|
|
347
|
+
@for (item of facade.issueDrafts(); track $index) {
|
|
348
|
+
<article class="rounded-xl border border-(--rt-border-color) p-3">
|
|
349
|
+
<p class="text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)">{{ issueTypeLabel(item.issueType) }}</p>
|
|
350
|
+
<p class="mt-1 text-sm text-(--rt-text-secondary)">
|
|
351
|
+
{{ item.fieldKey || documentTypeLabel(item.documentType || null) }}
|
|
352
|
+
</p>
|
|
353
|
+
<p class="mt-1 text-sm text-(--rt-text-primary)">{{ item.comment }}</p>
|
|
354
|
+
<button
|
|
355
|
+
type="button"
|
|
356
|
+
class="mt-2 text-xs font-semibold uppercase tracking-wide text-rose-700"
|
|
357
|
+
(click)="facade.removeIssue($index)"
|
|
358
|
+
>
|
|
359
|
+
Remove
|
|
360
|
+
</button>
|
|
361
|
+
</article>
|
|
362
|
+
}
|
|
363
|
+
</section>
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
<div class="mt-8 flex flex-wrap gap-3">
|
|
367
|
+
<button
|
|
368
|
+
type="button"
|
|
369
|
+
class="rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-semibold text-(--rt-text-secondary) hover:bg-(--rt-raised-background)"
|
|
370
|
+
[disabled]="facade.saving()"
|
|
371
|
+
(click)="startReview()"
|
|
372
|
+
>
|
|
373
|
+
Start Review
|
|
374
|
+
</button>
|
|
375
|
+
|
|
376
|
+
<button
|
|
377
|
+
type="button"
|
|
378
|
+
class="rounded-xl border border-amber-300 bg-amber-50 px-4 py-2 text-sm font-semibold text-amber-800 hover:bg-amber-100"
|
|
379
|
+
[disabled]="facade.saving()"
|
|
380
|
+
(click)="needMoreInfo()"
|
|
381
|
+
>
|
|
382
|
+
Need More Info
|
|
383
|
+
</button>
|
|
384
|
+
|
|
385
|
+
<button
|
|
386
|
+
type="button"
|
|
387
|
+
class="rounded-xl border border-emerald-300 bg-emerald-50 px-4 py-2 text-sm font-semibold text-emerald-800 hover:bg-emerald-100"
|
|
388
|
+
[disabled]="facade.saving()"
|
|
389
|
+
(click)="approve()"
|
|
390
|
+
>
|
|
391
|
+
Approve
|
|
392
|
+
</button>
|
|
393
|
+
|
|
394
|
+
<button
|
|
395
|
+
type="button"
|
|
396
|
+
class="rounded-xl border border-rose-300 bg-rose-50 px-4 py-2 text-sm font-semibold text-rose-800 hover:bg-rose-100"
|
|
397
|
+
[disabled]="facade.saving()"
|
|
398
|
+
(click)="fail()"
|
|
399
|
+
>
|
|
400
|
+
Fail
|
|
401
|
+
</button>
|
|
402
|
+
</div>
|
|
403
|
+
</section>
|
|
404
|
+
|
|
405
|
+
<rolatech-onboarding-issue-list [issues]="detail.issues" />
|
|
406
|
+
} @else {
|
|
407
|
+
<div
|
|
408
|
+
class="rounded-2xl border border-(--rt-border-color) bg-(--rt-base-background) p-5 text-sm text-(--rt-text-secondary) shadow-sm"
|
|
409
|
+
>
|
|
410
|
+
Loading review workspace...
|
|
411
|
+
</div>
|
|
412
|
+
}
|
|
413
|
+
</rolatech-onboarding-page-shell>
|
|
414
|
+
`,
|
|
415
|
+
}]
|
|
416
|
+
}], ctorParameters: () => [] });
|
|
417
|
+
|
|
418
|
+
export { AdminOnboardingReviewPage };
|
|
419
|
+
//# sourceMappingURL=rolatech-angular-onboarding-admin-onboarding-review-page-BERcLBeQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rolatech-angular-onboarding-admin-onboarding-review-page-BERcLBeQ.mjs","sources":["../../../../packages/angular-onboarding/src/lib/pages/admin-onboarding/admin-onboarding-review-page.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, effect, inject, ViewEncapsulation } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport {\n onboardingDocumentTypeLabel,\n onboardingIssueTypeLabel,\n OnboardingDocumentType,\n} 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 { AdminOnboardingReviewFacade } from '../../store/admin-onboarding-review.facade';\n\n@Component({\n selector: 'rolatech-admin-onboarding-review-page',\n standalone: true,\n imports: [ReactiveFormsModule, RouterLink, OnboardingPageShell, OnboardingStatusBadge, OnboardingIssueList],\n providers: [AdminOnboardingReviewFacade],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'block' },\n template: `\n <rolatech-onboarding-page-shell\n title=\"Onboarding Review Workspace\"\n subtitle=\"Create actionable review notes and make a final decision.\"\n kicker=\"Admin Console\"\n >\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-6 shadow-sm\">\n <h2 class=\"text-lg font-semibold text-(--rt-text-primary)\">{{ detail.organizationName || 'Organization' }}</h2>\n <p class=\"mt-1 text-sm text-(--rt-text-secondary)\">{{ detail.contactName }} • {{ detail.contactEmail }}</p>\n\n <label class=\"mt-6 grid gap-2\">\n <span class=\"text-sm font-medium text-(--rt-text-secondary)\">Review comment</span>\n <textarea\n class=\"min-h-28 rounded-xl border border-(--rt-border-color) px-3 py-2\"\n [value]=\"facade.reviewComment()\"\n (input)=\"setComment($event)\"\n placeholder=\"Add a review summary or final decision context...\"\n ></textarea>\n </label>\n\n <form\n [formGroup]=\"issueForm\"\n class=\"mt-6 grid gap-3 rounded-xl border border-(--rt-border-color) bg-(--rt-raised-background) p-4 md:grid-cols-3\"\n >\n <label class=\"grid gap-1\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)\">Field key</span>\n <input\n formControlName=\"fieldKey\"\n class=\"h-10 rounded-lg border border-(--rt-border-color) px-3\"\n placeholder=\"financial.vatNumber\"\n />\n </label>\n\n <label class=\"grid gap-1\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)\">Document type</span>\n <select formControlName=\"documentType\" class=\"h-10 rounded-lg border border-(--rt-border-color) px-3\">\n @for (type of documentTypes; track type) {\n <option [value]=\"type\">{{ documentTypeLabel(type) }}</option>\n }\n </select>\n </label>\n\n <label class=\"grid gap-1 md:col-span-3\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)\">Issue comment</span>\n <input\n formControlName=\"comment\"\n class=\"h-10 rounded-lg border border-(--rt-border-color) px-3\"\n placeholder=\"Describe what needs correction\"\n />\n </label>\n\n <div class=\"md:col-span-3 flex flex-wrap gap-2\">\n <button\n type=\"button\"\n class=\"rounded-lg border border-(--rt-border-color) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) hover:bg-(--rt-base-background)\"\n (click)=\"addFieldIssue()\"\n >\n Add Field Issue\n </button>\n <button\n type=\"button\"\n class=\"rounded-lg border border-(--rt-border-color) px-3 py-2 text-sm font-medium text-(--rt-text-secondary) hover:bg-(--rt-base-background)\"\n (click)=\"addDocumentIssue()\"\n >\n Add Document Issue\n </button>\n </div>\n </form>\n\n @if (facade.issueDrafts().length > 0) {\n <section class=\"mt-6 space-y-3\">\n <h3 class=\"text-sm font-semibold uppercase tracking-wide text-(--rt-text-secondary)\">Draft Issues</h3>\n @for (item of facade.issueDrafts(); track $index) {\n <article class=\"rounded-xl border border-(--rt-border-color) p-3\">\n <p class=\"text-xs font-semibold uppercase tracking-wide text-(--rt-text-secondary)\">{{ issueTypeLabel(item.issueType) }}</p>\n <p class=\"mt-1 text-sm text-(--rt-text-secondary)\">\n {{ item.fieldKey || documentTypeLabel(item.documentType || null) }}\n </p>\n <p class=\"mt-1 text-sm text-(--rt-text-primary)\">{{ item.comment }}</p>\n <button\n type=\"button\"\n class=\"mt-2 text-xs font-semibold uppercase tracking-wide text-rose-700\"\n (click)=\"facade.removeIssue($index)\"\n >\n Remove\n </button>\n </article>\n }\n </section>\n }\n\n <div class=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n class=\"rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-semibold text-(--rt-text-secondary) hover:bg-(--rt-raised-background)\"\n [disabled]=\"facade.saving()\"\n (click)=\"startReview()\"\n >\n Start Review\n </button>\n\n <button\n type=\"button\"\n class=\"rounded-xl border border-amber-300 bg-amber-50 px-4 py-2 text-sm font-semibold text-amber-800 hover:bg-amber-100\"\n [disabled]=\"facade.saving()\"\n (click)=\"needMoreInfo()\"\n >\n Need More Info\n </button>\n\n <button\n type=\"button\"\n class=\"rounded-xl border border-emerald-300 bg-emerald-50 px-4 py-2 text-sm font-semibold text-emerald-800 hover:bg-emerald-100\"\n [disabled]=\"facade.saving()\"\n (click)=\"approve()\"\n >\n Approve\n </button>\n\n <button\n type=\"button\"\n class=\"rounded-xl border border-rose-300 bg-rose-50 px-4 py-2 text-sm font-semibold text-rose-800 hover:bg-rose-100\"\n [disabled]=\"facade.saving()\"\n (click)=\"fail()\"\n >\n Fail\n </button>\n </div>\n </section>\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 review workspace...\n </div>\n }\n </rolatech-onboarding-page-shell>\n `,\n})\nexport class AdminOnboardingReviewPage {\n readonly facade = inject(AdminOnboardingReviewFacade);\n private readonly fb = inject(FormBuilder);\n private readonly route = inject(ActivatedRoute);\n readonly documentTypeLabel = onboardingDocumentTypeLabel;\n readonly issueTypeLabel = onboardingIssueTypeLabel;\n\n readonly documentTypes: OnboardingDocumentType[] = [\n 'PASSPORT',\n 'CERTIFICATE_OF_INCORPORATION',\n 'INDUSTRY_CERTIFICATE',\n 'PROOF_OF_ADDRESS',\n 'BANK_STATEMENT',\n 'OTHER',\n ];\n\n readonly issueForm = this.fb.nonNullable.group({\n fieldKey: ['', [Validators.required]],\n documentType: ['PASSPORT' as OnboardingDocumentType, [Validators.required]],\n comment: ['', [Validators.required]],\n });\n\n private readonly paramMap = toSignal(this.route.paramMap, {\n initialValue: this.route.snapshot.paramMap,\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 setComment(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n this.facade.setComment(target.value);\n }\n\n addFieldIssue(): void {\n const value = this.issueForm.getRawValue();\n\n if (!value.comment || !value.fieldKey) {\n return;\n }\n\n this.facade.addFieldIssue(value.fieldKey, value.comment);\n }\n\n addDocumentIssue(): void {\n const value = this.issueForm.getRawValue();\n\n if (!value.comment || !value.documentType) {\n return;\n }\n\n this.facade.addDocumentIssue(value.documentType, value.comment);\n }\n\n async startReview(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.startReview(applicationId);\n }\n\n async needMoreInfo(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.requestMoreInfo(applicationId);\n }\n\n async approve(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.approve(applicationId);\n }\n\n async fail(): Promise<void> {\n const applicationId = this.paramMap().get('applicationId');\n\n if (!applicationId) {\n return;\n }\n\n await this.facade.fail(applicationId);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -987,13 +987,13 @@ const ADMIN_ONBOARDING_ROUTES = [
|
|
|
987
987
|
},
|
|
988
988
|
{
|
|
989
989
|
path: ':applicationId/review',
|
|
990
|
-
|
|
991
|
-
|
|
990
|
+
canActivate: [applicationIdGuard],
|
|
991
|
+
loadComponent: () => import('./rolatech-angular-onboarding-admin-onboarding-review-page-BERcLBeQ.mjs').then((m) => m.AdminOnboardingReviewPage),
|
|
992
992
|
},
|
|
993
993
|
{
|
|
994
994
|
path: ':applicationId',
|
|
995
995
|
canActivate: [applicationIdGuard],
|
|
996
|
-
loadComponent: () => import('./rolatech-angular-onboarding-admin-onboarding-detail-page-
|
|
996
|
+
loadComponent: () => import('./rolatech-angular-onboarding-admin-onboarding-detail-page-DREEMvoT.mjs').then((m) => m.AdminOnboardingDetailPage),
|
|
997
997
|
},
|
|
998
998
|
];
|
|
999
999
|
|