@isaiahiroko/tilmart-ngx-apps-buyer 0.2.3 → 0.2.5
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/fesm2022/{isaiahiroko-tilmart-ngx-apps-buyer-account.module-NwaAXgVS.mjs → isaiahiroko-tilmart-ngx-apps-buyer-account.module-CLVC0SX-.mjs} +35 -9
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer-account.module-CLVC0SX-.mjs.map +1 -0
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer-checkout.module-C3Ncr5fc.mjs +453 -0
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer-checkout.module-C3Ncr5fc.mjs.map +1 -0
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer.mjs +77 -21
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer.mjs.map +1 -1
- package/package.json +1 -1
- package/types/isaiahiroko-tilmart-ngx-apps-buyer.d.ts +21 -4
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer-account.module-NwaAXgVS.mjs.map +0 -1
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer-checkout.module-8gkn9duj.mjs +0 -426
- package/fesm2022/isaiahiroko-tilmart-ngx-apps-buyer-checkout.module-8gkn9duj.mjs.map +0 -1
|
@@ -4,7 +4,7 @@ import * as i1 from '@angular/router';
|
|
|
4
4
|
import { ActivatedRoute, RouterModule } from '@angular/router';
|
|
5
5
|
import { ApiService, ControlService, BaseDirective, using, notify, SharedModule } from '@thescaffold/ngx-core';
|
|
6
6
|
import { ReplaySubject, firstValueFrom, map, catchError, of, takeUntil, switchMap, forkJoin } from 'rxjs';
|
|
7
|
-
import {
|
|
7
|
+
import { StaticListService, CartStoreService } from './isaiahiroko-tilmart-ngx-apps-buyer.mjs';
|
|
8
8
|
import * as i1$1 from '@angular/forms';
|
|
9
9
|
import * as i2 from '@angular/common';
|
|
10
10
|
import { ThemeService } from '@thescaffold/ngx-common';
|
|
@@ -102,11 +102,11 @@ class AccountComponent extends BaseDirective {
|
|
|
102
102
|
this.router.navigate(['/start']);
|
|
103
103
|
}
|
|
104
104
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: AccountComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
105
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: AccountComponent, isStandalone: false, selector: "x-account", usesInheritance: true, ngImport: i0, template: "<div class=\"x-acct\">\n @if (loading) {\n <div class=\"x-acct-note\">Loading your account\u2026</div>\n } @else if (!isLoggedIn) {\n <div class=\"x-acct-signin\">\n <h1>Your account</h1>\n <p>Sign in to see your orders, saved systems, addresses and settings.</p>\n <button type=\"button\" class=\"x-acct-btn\" (click)=\"signIn()\">Sign in</button>\n <p class=\"x-acct-muted\">\n No account yet? You can still\n <a routerLink=\"/track\">track an order</a> with your order number.\n </p>\n </div>\n } @else {\n <header class=\"x-acct-head\">\n <h1>{{ customerName }}</h1>\n </header>\n <div class=\"x-acct-body\">\n <nav class=\"x-acct-nav\">\n @for (item of nav; track item.path) {\n <a\n [routerLink]=\"item.path\"\n routerLinkActive=\"x-acct-nav-on\"\n class=\"x-acct-nav-link\"\n >\n <i class=\"fa-solid\" [class]=\"item.icon\"></i>\n <span>{{ item.label }}</span>\n </a>\n }\n </nav>\n <main class=\"x-acct-main\">\n <router-outlet></router-outlet>\n </main>\n </div>\n }\n</div>\n", styles: [".x-acct{max-width:1080px;margin:0 auto;padding:24px 20px 64px}.x-acct-note,.x-acct-muted{font-size:13.5px;color:var(--color-text-muted)}.x-acct-signin{max-width:420px;margin:48px auto;text-align:center}.x-acct-signin h1{font-size:26px;font-weight:800;color:var(--color-text);margin-bottom:10px}.x-acct-signin p{font-size:14.5px;color:var(--color-text-muted);margin-bottom:18px}.x-acct-signin a{color:var(--color-accent-hover);font-weight:700}.x-acct-head h1{font-size:28px;font-weight:800;color:var(--color-text);margin:4px 0 24px}.x-acct-body{display:grid;grid-template-columns:208px 1fr;gap:32px}.x-acct-nav{display:flex;flex-direction:column;gap:2px}.x-acct-nav-link{display:flex;align-items:center;gap:12px;padding:11px 14px;border-radius:var(--radius-lg);font-size:14px;font-weight:700;color:var(--color-text-muted);text-decoration:none;cursor:pointer}.x-acct-nav-link i{width:16px;text-align:center}.x-acct-nav-link:hover{background:var(--color-surface-2);color:var(--color-text)}.x-acct-nav-on{background:color-mix(in srgb,var(--color-accent) 12%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-main{min-width:0}.x-acct-h2{font-size:19px;font-weight:800;color:var(--color-text);margin:0 0 4px}.x-acct-sub{font-size:13.5px;color:var(--color-text-muted);margin:0 0 20px}.x-acct-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:20px;margin-bottom:16px}.x-acct-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 0;border-bottom:1px solid var(--color-border-muted)}.x-acct-row:last-child{border-bottom:0}.x-acct-empty{font-size:13.5px;color:var(--color-text-muted);padding:8px 0}.x-acct-btn{display:inline-block;background:var(--color-accent);color:var(--color-accent-fg);border:0;border-radius:var(--radius-lg);padding:11px 18px;font-size:14px;font-weight:800;cursor:pointer;text-decoration:none}.x-acct-btn:hover:not(:disabled){background:var(--color-accent-hover)}.x-acct-btn:disabled{opacity:.55;cursor:default}.x-acct-btn-ghost{background:transparent;color:var(--color-accent-hover);border:1px solid var(--color-border);padding:9px 14px;border-radius:var(--radius-lg);font-size:13px;font-weight:700;cursor:pointer}.x-acct-btn-ghost:hover{border-color:var(--color-accent)}.x-acct-pill{display:inline-block;font-size:11.5px;font-weight:800;padding:3px 9px;border-radius:var(--radius-sm);background:var(--color-surface-2);color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.3px}.x-acct-pill-ok{background:color-mix(in srgb,var(--color-accent) 15%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-pill-warn{background:color-mix(in srgb,var(--color-warn) 20%,var(--color-surface));color:color-mix(in srgb,var(--color-warn) 72%,black)}.x-acct-pill-bad{background:color-mix(in srgb,var(--color-danger) 15%,var(--color-surface));color:var(--color-danger)}.x-acct-field{margin-bottom:16px}.x-acct-field label{display:block;font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:var(--color-text-muted);margin-bottom:7px}.x-acct-field input,.x-acct-field select{width:100%;box-sizing:border-box;padding:12px 14px;border-radius:var(--radius-lg);border:1px solid var(--color-border);font:inherit;font-size:14.5px;background:var(--color-surface);color:var(--color-text);outline:none}.x-acct-err{font-size:12.5px;color:var(--color-danger);margin-bottom:12px}.x-acct-ok{font-size:12.5px;color:var(--color-accent-hover);margin-bottom:12px}.x-acct-checkline{display:flex;align-items:center;gap:10px;padding:9px 0;font-size:13.5px;color:var(--color-text)}.x-acct-checkline input{width:auto}@media(max-width:720px){.x-acct-body{grid-template-columns:1fr;gap:16px}.x-acct-nav{flex-direction:row;flex-wrap:wrap}}\n"], dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
105
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: AccountComponent, isStandalone: false, selector: "x-account", usesInheritance: true, ngImport: i0, template: "<div class=\"x-acct\">\n @if (loading) {\n <div class=\"x-acct-note\">Loading your account\u2026</div>\n } @else if (!isLoggedIn) {\n <div class=\"x-acct-signin\">\n <h1>Your account</h1>\n <p>Sign in to see your orders, saved systems, addresses and settings.</p>\n <button type=\"button\" class=\"x-acct-btn\" (click)=\"signIn()\">Sign in</button>\n <p class=\"x-acct-muted\">\n No account yet? You can still\n <a routerLink=\"/track\">track an order</a> with your order number.\n </p>\n </div>\n } @else {\n <header class=\"x-acct-head\">\n <h1>{{ customerName }}</h1>\n </header>\n <div class=\"x-acct-body\">\n <nav class=\"x-acct-nav\">\n @for (item of nav; track item.path) {\n <a\n [routerLink]=\"item.path\"\n routerLinkActive=\"x-acct-nav-on\"\n class=\"x-acct-nav-link\"\n >\n <i class=\"fa-solid\" [class]=\"item.icon\"></i>\n <span>{{ item.label }}</span>\n </a>\n }\n </nav>\n <main class=\"x-acct-main\">\n <router-outlet></router-outlet>\n </main>\n </div>\n }\n</div>\n", styles: [".x-acct{max-width:1080px;margin:0 auto;padding:24px 20px 64px}.x-acct-note,.x-acct-muted{font-size:13.5px;color:var(--color-text-muted)}.x-acct-signin{max-width:420px;margin:48px auto;text-align:center}.x-acct-signin h1{font-size:26px;font-weight:800;color:var(--color-text);margin-bottom:10px}.x-acct-signin p{font-size:14.5px;color:var(--color-text-muted);margin-bottom:18px}.x-acct-signin a{color:var(--color-accent-hover);font-weight:700}.x-acct-head h1{font-size:28px;font-weight:800;color:var(--color-text);margin:4px 0 24px}.x-acct-body{display:grid;grid-template-columns:208px 1fr;gap:32px}.x-acct-nav{display:flex;flex-direction:column;gap:2px}.x-acct-nav-link{display:flex;align-items:center;gap:12px;padding:11px 14px;border-radius:var(--radius-lg);font-size:14px;font-weight:700;color:var(--color-text-muted);text-decoration:none;cursor:pointer}.x-acct-nav-link i{width:16px;text-align:center}.x-acct-nav-link:hover{background:var(--color-surface-2);color:var(--color-text)}.x-acct-nav-on{background:color-mix(in srgb,var(--color-accent) 12%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-main{min-width:0}.x-acct-h2{font-size:19px;font-weight:800;color:var(--color-text);margin:0 0 4px}.x-acct-sub{font-size:13.5px;color:var(--color-text-muted);margin:0 0 20px}.x-acct-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:20px;margin-bottom:16px}.x-acct-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 0;border-bottom:1px solid var(--color-border-muted)}.x-acct-row:last-child{border-bottom:0}.x-acct-empty{font-size:13.5px;color:var(--color-text-muted);padding:8px 0}.x-acct-btn{display:inline-block;background:var(--color-accent);color:var(--color-accent-fg);border:0;border-radius:var(--radius-lg);padding:11px 18px;font-size:14px;font-weight:800;cursor:pointer;text-decoration:none}.x-acct-btn:hover:not(:disabled){background:var(--color-accent-hover)}.x-acct-btn:disabled{opacity:.55;cursor:default}.x-acct-btn-ghost{background:transparent;color:var(--color-accent-hover);border:1px solid var(--color-border);padding:9px 14px;border-radius:var(--radius-lg);font-size:13px;font-weight:700;cursor:pointer}.x-acct-btn-ghost:hover{border-color:var(--color-accent)}.x-acct-pill{display:inline-block;font-size:11.5px;font-weight:800;padding:3px 9px;border-radius:var(--radius-sm);background:var(--color-surface-2);color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.3px}.x-acct-pill-ok{background:color-mix(in srgb,var(--color-accent) 15%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-pill-warn{background:color-mix(in srgb,var(--color-warn) 20%,var(--color-surface));color:color-mix(in srgb,var(--color-warn) 72%,black)}.x-acct-pill-bad{background:color-mix(in srgb,var(--color-danger) 15%,var(--color-surface));color:var(--color-danger)}.x-acct-field{margin-bottom:16px}.x-acct-field label{display:block;font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:var(--color-text-muted);margin-bottom:7px}.x-acct-field input,.x-acct-field select{width:100%;box-sizing:border-box;padding:12px 14px;border-radius:var(--radius-lg);border:1px solid var(--color-border);font:inherit;font-size:14.5px;background:var(--color-surface);color:var(--color-text);outline:none}.x-acct-field .x-acct-pwd{position:relative;display:flex}.x-acct-field .x-acct-pwd input{padding-right:42px}.x-acct-field .x-acct-pwd-toggle{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:none;background:transparent;color:var(--color-text-muted);padding:6px 8px;cursor:pointer}.x-acct-field .x-acct-pwd-toggle:hover{color:var(--color-text)}.x-acct-err{font-size:12.5px;color:var(--color-danger);margin-bottom:12px}.x-acct-ok{font-size:12.5px;color:var(--color-accent-hover);margin-bottom:12px}.x-acct-checkline{display:flex;align-items:center;gap:10px;padding:9px 0;font-size:13.5px;color:var(--color-text)}.x-acct-checkline input{width:auto}@media(max-width:720px){.x-acct-body{grid-template-columns:1fr;gap:16px}.x-acct-nav{flex-direction:row;flex-wrap:wrap}}\n"], dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
106
106
|
}
|
|
107
107
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: AccountComponent, decorators: [{
|
|
108
108
|
type: Component,
|
|
109
|
-
args: [{ standalone: false, selector: 'x-account', encapsulation: ViewEncapsulation.None, template: "<div class=\"x-acct\">\n @if (loading) {\n <div class=\"x-acct-note\">Loading your account\u2026</div>\n } @else if (!isLoggedIn) {\n <div class=\"x-acct-signin\">\n <h1>Your account</h1>\n <p>Sign in to see your orders, saved systems, addresses and settings.</p>\n <button type=\"button\" class=\"x-acct-btn\" (click)=\"signIn()\">Sign in</button>\n <p class=\"x-acct-muted\">\n No account yet? You can still\n <a routerLink=\"/track\">track an order</a> with your order number.\n </p>\n </div>\n } @else {\n <header class=\"x-acct-head\">\n <h1>{{ customerName }}</h1>\n </header>\n <div class=\"x-acct-body\">\n <nav class=\"x-acct-nav\">\n @for (item of nav; track item.path) {\n <a\n [routerLink]=\"item.path\"\n routerLinkActive=\"x-acct-nav-on\"\n class=\"x-acct-nav-link\"\n >\n <i class=\"fa-solid\" [class]=\"item.icon\"></i>\n <span>{{ item.label }}</span>\n </a>\n }\n </nav>\n <main class=\"x-acct-main\">\n <router-outlet></router-outlet>\n </main>\n </div>\n }\n</div>\n", styles: [".x-acct{max-width:1080px;margin:0 auto;padding:24px 20px 64px}.x-acct-note,.x-acct-muted{font-size:13.5px;color:var(--color-text-muted)}.x-acct-signin{max-width:420px;margin:48px auto;text-align:center}.x-acct-signin h1{font-size:26px;font-weight:800;color:var(--color-text);margin-bottom:10px}.x-acct-signin p{font-size:14.5px;color:var(--color-text-muted);margin-bottom:18px}.x-acct-signin a{color:var(--color-accent-hover);font-weight:700}.x-acct-head h1{font-size:28px;font-weight:800;color:var(--color-text);margin:4px 0 24px}.x-acct-body{display:grid;grid-template-columns:208px 1fr;gap:32px}.x-acct-nav{display:flex;flex-direction:column;gap:2px}.x-acct-nav-link{display:flex;align-items:center;gap:12px;padding:11px 14px;border-radius:var(--radius-lg);font-size:14px;font-weight:700;color:var(--color-text-muted);text-decoration:none;cursor:pointer}.x-acct-nav-link i{width:16px;text-align:center}.x-acct-nav-link:hover{background:var(--color-surface-2);color:var(--color-text)}.x-acct-nav-on{background:color-mix(in srgb,var(--color-accent) 12%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-main{min-width:0}.x-acct-h2{font-size:19px;font-weight:800;color:var(--color-text);margin:0 0 4px}.x-acct-sub{font-size:13.5px;color:var(--color-text-muted);margin:0 0 20px}.x-acct-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:20px;margin-bottom:16px}.x-acct-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 0;border-bottom:1px solid var(--color-border-muted)}.x-acct-row:last-child{border-bottom:0}.x-acct-empty{font-size:13.5px;color:var(--color-text-muted);padding:8px 0}.x-acct-btn{display:inline-block;background:var(--color-accent);color:var(--color-accent-fg);border:0;border-radius:var(--radius-lg);padding:11px 18px;font-size:14px;font-weight:800;cursor:pointer;text-decoration:none}.x-acct-btn:hover:not(:disabled){background:var(--color-accent-hover)}.x-acct-btn:disabled{opacity:.55;cursor:default}.x-acct-btn-ghost{background:transparent;color:var(--color-accent-hover);border:1px solid var(--color-border);padding:9px 14px;border-radius:var(--radius-lg);font-size:13px;font-weight:700;cursor:pointer}.x-acct-btn-ghost:hover{border-color:var(--color-accent)}.x-acct-pill{display:inline-block;font-size:11.5px;font-weight:800;padding:3px 9px;border-radius:var(--radius-sm);background:var(--color-surface-2);color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.3px}.x-acct-pill-ok{background:color-mix(in srgb,var(--color-accent) 15%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-pill-warn{background:color-mix(in srgb,var(--color-warn) 20%,var(--color-surface));color:color-mix(in srgb,var(--color-warn) 72%,black)}.x-acct-pill-bad{background:color-mix(in srgb,var(--color-danger) 15%,var(--color-surface));color:var(--color-danger)}.x-acct-field{margin-bottom:16px}.x-acct-field label{display:block;font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:var(--color-text-muted);margin-bottom:7px}.x-acct-field input,.x-acct-field select{width:100%;box-sizing:border-box;padding:12px 14px;border-radius:var(--radius-lg);border:1px solid var(--color-border);font:inherit;font-size:14.5px;background:var(--color-surface);color:var(--color-text);outline:none}.x-acct-err{font-size:12.5px;color:var(--color-danger);margin-bottom:12px}.x-acct-ok{font-size:12.5px;color:var(--color-accent-hover);margin-bottom:12px}.x-acct-checkline{display:flex;align-items:center;gap:10px;padding:9px 0;font-size:13.5px;color:var(--color-text)}.x-acct-checkline input{width:auto}@media(max-width:720px){.x-acct-body{grid-template-columns:1fr;gap:16px}.x-acct-nav{flex-direction:row;flex-wrap:wrap}}\n"] }]
|
|
109
|
+
args: [{ standalone: false, selector: 'x-account', encapsulation: ViewEncapsulation.None, template: "<div class=\"x-acct\">\n @if (loading) {\n <div class=\"x-acct-note\">Loading your account\u2026</div>\n } @else if (!isLoggedIn) {\n <div class=\"x-acct-signin\">\n <h1>Your account</h1>\n <p>Sign in to see your orders, saved systems, addresses and settings.</p>\n <button type=\"button\" class=\"x-acct-btn\" (click)=\"signIn()\">Sign in</button>\n <p class=\"x-acct-muted\">\n No account yet? You can still\n <a routerLink=\"/track\">track an order</a> with your order number.\n </p>\n </div>\n } @else {\n <header class=\"x-acct-head\">\n <h1>{{ customerName }}</h1>\n </header>\n <div class=\"x-acct-body\">\n <nav class=\"x-acct-nav\">\n @for (item of nav; track item.path) {\n <a\n [routerLink]=\"item.path\"\n routerLinkActive=\"x-acct-nav-on\"\n class=\"x-acct-nav-link\"\n >\n <i class=\"fa-solid\" [class]=\"item.icon\"></i>\n <span>{{ item.label }}</span>\n </a>\n }\n </nav>\n <main class=\"x-acct-main\">\n <router-outlet></router-outlet>\n </main>\n </div>\n }\n</div>\n", styles: [".x-acct{max-width:1080px;margin:0 auto;padding:24px 20px 64px}.x-acct-note,.x-acct-muted{font-size:13.5px;color:var(--color-text-muted)}.x-acct-signin{max-width:420px;margin:48px auto;text-align:center}.x-acct-signin h1{font-size:26px;font-weight:800;color:var(--color-text);margin-bottom:10px}.x-acct-signin p{font-size:14.5px;color:var(--color-text-muted);margin-bottom:18px}.x-acct-signin a{color:var(--color-accent-hover);font-weight:700}.x-acct-head h1{font-size:28px;font-weight:800;color:var(--color-text);margin:4px 0 24px}.x-acct-body{display:grid;grid-template-columns:208px 1fr;gap:32px}.x-acct-nav{display:flex;flex-direction:column;gap:2px}.x-acct-nav-link{display:flex;align-items:center;gap:12px;padding:11px 14px;border-radius:var(--radius-lg);font-size:14px;font-weight:700;color:var(--color-text-muted);text-decoration:none;cursor:pointer}.x-acct-nav-link i{width:16px;text-align:center}.x-acct-nav-link:hover{background:var(--color-surface-2);color:var(--color-text)}.x-acct-nav-on{background:color-mix(in srgb,var(--color-accent) 12%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-main{min-width:0}.x-acct-h2{font-size:19px;font-weight:800;color:var(--color-text);margin:0 0 4px}.x-acct-sub{font-size:13.5px;color:var(--color-text-muted);margin:0 0 20px}.x-acct-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:20px;margin-bottom:16px}.x-acct-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 0;border-bottom:1px solid var(--color-border-muted)}.x-acct-row:last-child{border-bottom:0}.x-acct-empty{font-size:13.5px;color:var(--color-text-muted);padding:8px 0}.x-acct-btn{display:inline-block;background:var(--color-accent);color:var(--color-accent-fg);border:0;border-radius:var(--radius-lg);padding:11px 18px;font-size:14px;font-weight:800;cursor:pointer;text-decoration:none}.x-acct-btn:hover:not(:disabled){background:var(--color-accent-hover)}.x-acct-btn:disabled{opacity:.55;cursor:default}.x-acct-btn-ghost{background:transparent;color:var(--color-accent-hover);border:1px solid var(--color-border);padding:9px 14px;border-radius:var(--radius-lg);font-size:13px;font-weight:700;cursor:pointer}.x-acct-btn-ghost:hover{border-color:var(--color-accent)}.x-acct-pill{display:inline-block;font-size:11.5px;font-weight:800;padding:3px 9px;border-radius:var(--radius-sm);background:var(--color-surface-2);color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.3px}.x-acct-pill-ok{background:color-mix(in srgb,var(--color-accent) 15%,var(--color-surface));color:var(--color-accent-hover)}.x-acct-pill-warn{background:color-mix(in srgb,var(--color-warn) 20%,var(--color-surface));color:color-mix(in srgb,var(--color-warn) 72%,black)}.x-acct-pill-bad{background:color-mix(in srgb,var(--color-danger) 15%,var(--color-surface));color:var(--color-danger)}.x-acct-field{margin-bottom:16px}.x-acct-field label{display:block;font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:var(--color-text-muted);margin-bottom:7px}.x-acct-field input,.x-acct-field select{width:100%;box-sizing:border-box;padding:12px 14px;border-radius:var(--radius-lg);border:1px solid var(--color-border);font:inherit;font-size:14.5px;background:var(--color-surface);color:var(--color-text);outline:none}.x-acct-field .x-acct-pwd{position:relative;display:flex}.x-acct-field .x-acct-pwd input{padding-right:42px}.x-acct-field .x-acct-pwd-toggle{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:none;background:transparent;color:var(--color-text-muted);padding:6px 8px;cursor:pointer}.x-acct-field .x-acct-pwd-toggle:hover{color:var(--color-text)}.x-acct-err{font-size:12.5px;color:var(--color-danger);margin-bottom:12px}.x-acct-ok{font-size:12.5px;color:var(--color-accent-hover);margin-bottom:12px}.x-acct-checkline{display:flex;align-items:center;gap:10px;padding:9px 0;font-size:13.5px;color:var(--color-text)}.x-acct-checkline input{width:auto}@media(max-width:720px){.x-acct-body{grid-template-columns:1fr;gap:16px}.x-acct-nav{flex-direction:row;flex-wrap:wrap}}\n"] }]
|
|
110
110
|
}] });
|
|
111
111
|
|
|
112
112
|
function blankForm() {
|
|
@@ -128,7 +128,10 @@ class AccountAddressesComponent extends BaseDirective {
|
|
|
128
128
|
constructor() {
|
|
129
129
|
super(...arguments);
|
|
130
130
|
this.store = inject(AccountStoreService);
|
|
131
|
-
this.
|
|
131
|
+
this.staticList = inject(StaticListService);
|
|
132
|
+
this.states = [];
|
|
133
|
+
this.lgas = [];
|
|
134
|
+
this.lgasLoading = false;
|
|
132
135
|
this.loading = true;
|
|
133
136
|
this.customerId = '';
|
|
134
137
|
this.addresses = [];
|
|
@@ -137,6 +140,7 @@ class AccountAddressesComponent extends BaseDirective {
|
|
|
137
140
|
this.form = blankForm();
|
|
138
141
|
this.formError = '';
|
|
139
142
|
this.init = () => {
|
|
143
|
+
void this.staticList.getStates().then((states) => (this.states = states));
|
|
140
144
|
this.store
|
|
141
145
|
.customer()
|
|
142
146
|
.pipe(takeUntil(this.$))
|
|
@@ -150,6 +154,23 @@ class AccountAddressesComponent extends BaseDirective {
|
|
|
150
154
|
}));
|
|
151
155
|
};
|
|
152
156
|
}
|
|
157
|
+
async onFormStateChange() {
|
|
158
|
+
this.form.lga = '';
|
|
159
|
+
await this.loadLgas(this.form.state);
|
|
160
|
+
}
|
|
161
|
+
async loadLgas(state) {
|
|
162
|
+
if (!state) {
|
|
163
|
+
this.lgas = [];
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
this.lgasLoading = true;
|
|
167
|
+
try {
|
|
168
|
+
this.lgas = await this.staticList.getLgas(state).catch(() => []);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
this.lgasLoading = false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
153
174
|
async load() {
|
|
154
175
|
const res = await firstValueFrom(this.apiService
|
|
155
176
|
.on('apps/commerce/address')
|
|
@@ -174,11 +195,13 @@ class AccountAddressesComponent extends BaseDirective {
|
|
|
174
195
|
this.form = blankForm();
|
|
175
196
|
this.formError = '';
|
|
176
197
|
this.editing = true;
|
|
198
|
+
this.lgas = [];
|
|
177
199
|
}
|
|
178
200
|
startEdit(a) {
|
|
179
201
|
this.form = { ...a };
|
|
180
202
|
this.formError = '';
|
|
181
203
|
this.editing = true;
|
|
204
|
+
void this.loadLgas(this.form.state);
|
|
182
205
|
}
|
|
183
206
|
cancel() {
|
|
184
207
|
this.editing = false;
|
|
@@ -251,11 +274,11 @@ class AccountAddressesComponent extends BaseDirective {
|
|
|
251
274
|
}
|
|
252
275
|
}
|
|
253
276
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: AccountAddressesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
254
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: AccountAddressesComponent, isStandalone: false, selector: "x-account-addresses", usesInheritance: true, ngImport: i0, template: "<h2 class=\"x-acct-h2\">Addresses</h2>\n<p class=\"x-acct-sub\">Used for delivery and, later, installation visits.</p>\n\n@if (loading) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n} @else {\n @if (editing) {\n <div class=\"x-acct-card\">\n <strong>{{ form.id ? 'Edit address' : 'New address' }}</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Label</label>\n <input [(ngModel)]=\"form.label\" placeholder=\"Home, Office, Site\u2026\" />\n </div>\n <div class=\"x-acct-field\">\n <label>State</label>\n <select aria-label=\"State\" [(ngModel)]=\"form.state\">\n <option value=\"\">Select a state</option>\n @for (s of states; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n </div>\n <div class=\"x-acct-field\">\n <label>LGA / area</label>\n <
|
|
277
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: AccountAddressesComponent, isStandalone: false, selector: "x-account-addresses", usesInheritance: true, ngImport: i0, template: "<h2 class=\"x-acct-h2\">Addresses</h2>\n<p class=\"x-acct-sub\">Used for delivery and, later, installation visits.</p>\n\n@if (loading) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n} @else {\n @if (editing) {\n <div class=\"x-acct-card\">\n <strong>{{ form.id ? 'Edit address' : 'New address' }}</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Label</label>\n <input [(ngModel)]=\"form.label\" placeholder=\"Home, Office, Site\u2026\" />\n </div>\n <div class=\"x-acct-field\">\n <label>State</label>\n <select aria-label=\"State\" data-testid=\"address-state\" [(ngModel)]=\"form.state\" (ngModelChange)=\"onFormStateChange()\">\n <option value=\"\">Select a state</option>\n @for (s of states; track s.value) {\n <option [value]=\"s.value\">{{ s.label }}</option>\n }\n </select>\n </div>\n <div class=\"x-acct-field\">\n <label>LGA / area</label>\n <select aria-label=\"LGA\" data-testid=\"address-lga\" [(ngModel)]=\"form.lga\" [disabled]=\"!form.state || lgasLoading\">\n <option value=\"\">{{ form.state ? 'Select an LGA' : 'Select a state first' }}</option>\n @for (l of lgas; track l.value) {\n <option [value]=\"l.value\">{{ l.label }}</option>\n }\n </select>\n </div>\n <div class=\"x-acct-field\">\n <label>Street</label>\n <input [(ngModel)]=\"form.street\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Nearest landmark</label>\n <input [(ngModel)]=\"form.landmark\" placeholder=\"e.g. opposite Zenith Bank\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Building / flat info</label>\n <input [(ngModel)]=\"form.buildingInfo\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Delivery notes</label>\n <input [(ngModel)]=\"form.notes\" />\n </div>\n @if (formError) {\n <div class=\"x-acct-err\">{{ formError }}</div>\n }\n <button type=\"button\" class=\"x-acct-btn\" [disabled]=\"saving\" (click)=\"save()\">\n {{ saving ? 'Saving\u2026' : 'Save address' }}\n </button>\n <button type=\"button\" class=\"x-acct-btn-ghost\" (click)=\"cancel()\" style=\"margin-left: 8px\">\n Cancel\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"x-acct-btn\" (click)=\"startAdd()\">Add an address</button>\n }\n\n @for (a of addresses; track a.id) {\n <div class=\"x-acct-card\">\n <div class=\"x-acct-row\" style=\"border-bottom: 0; padding-top: 0\">\n <strong>\n {{ a.label }}\n @if (a.isDefault) {\n <span class=\"x-acct-pill x-acct-pill-ok\" style=\"margin-left: 6px\">Default</span>\n }\n </strong>\n <span>\n <button type=\"button\" class=\"x-acct-btn-ghost\" (click)=\"startEdit(a)\">Edit</button>\n <button type=\"button\" class=\"x-acct-btn-ghost\" (click)=\"remove(a)\" style=\"margin-left: 6px\">\n Delete\n </button>\n </span>\n </div>\n <p class=\"x-acct-sub\" style=\"margin: 0\">\n {{ a.street }}@if (a.landmark) {, near {{ a.landmark }}}<br />\n {{ a.lga ? a.lga + ', ' : '' }}{{ a.state }}\n </p>\n @if (!a.isDefault) {\n <button\n type=\"button\"\n class=\"x-acct-btn-ghost\"\n style=\"margin-top: 10px\"\n (click)=\"makeDefault(a)\"\n >\n Make default\n </button>\n }\n </div>\n } @empty {\n @if (!editing) {\n <div class=\"x-acct-empty\">No saved addresses yet.</div>\n }\n }\n}\n", dependencies: [{ kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.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$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
255
278
|
}
|
|
256
279
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: AccountAddressesComponent, decorators: [{
|
|
257
280
|
type: Component,
|
|
258
|
-
args: [{ standalone: false, selector: 'x-account-addresses', template: "<h2 class=\"x-acct-h2\">Addresses</h2>\n<p class=\"x-acct-sub\">Used for delivery and, later, installation visits.</p>\n\n@if (loading) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n} @else {\n @if (editing) {\n <div class=\"x-acct-card\">\n <strong>{{ form.id ? 'Edit address' : 'New address' }}</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Label</label>\n <input [(ngModel)]=\"form.label\" placeholder=\"Home, Office, Site\u2026\" />\n </div>\n <div class=\"x-acct-field\">\n <label>State</label>\n <select aria-label=\"State\" [(ngModel)]=\"form.state\">\n <option value=\"\">Select a state</option>\n @for (s of states; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n </div>\n <div class=\"x-acct-field\">\n <label>LGA / area</label>\n <
|
|
281
|
+
args: [{ standalone: false, selector: 'x-account-addresses', template: "<h2 class=\"x-acct-h2\">Addresses</h2>\n<p class=\"x-acct-sub\">Used for delivery and, later, installation visits.</p>\n\n@if (loading) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n} @else {\n @if (editing) {\n <div class=\"x-acct-card\">\n <strong>{{ form.id ? 'Edit address' : 'New address' }}</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Label</label>\n <input [(ngModel)]=\"form.label\" placeholder=\"Home, Office, Site\u2026\" />\n </div>\n <div class=\"x-acct-field\">\n <label>State</label>\n <select aria-label=\"State\" data-testid=\"address-state\" [(ngModel)]=\"form.state\" (ngModelChange)=\"onFormStateChange()\">\n <option value=\"\">Select a state</option>\n @for (s of states; track s.value) {\n <option [value]=\"s.value\">{{ s.label }}</option>\n }\n </select>\n </div>\n <div class=\"x-acct-field\">\n <label>LGA / area</label>\n <select aria-label=\"LGA\" data-testid=\"address-lga\" [(ngModel)]=\"form.lga\" [disabled]=\"!form.state || lgasLoading\">\n <option value=\"\">{{ form.state ? 'Select an LGA' : 'Select a state first' }}</option>\n @for (l of lgas; track l.value) {\n <option [value]=\"l.value\">{{ l.label }}</option>\n }\n </select>\n </div>\n <div class=\"x-acct-field\">\n <label>Street</label>\n <input [(ngModel)]=\"form.street\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Nearest landmark</label>\n <input [(ngModel)]=\"form.landmark\" placeholder=\"e.g. opposite Zenith Bank\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Building / flat info</label>\n <input [(ngModel)]=\"form.buildingInfo\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Delivery notes</label>\n <input [(ngModel)]=\"form.notes\" />\n </div>\n @if (formError) {\n <div class=\"x-acct-err\">{{ formError }}</div>\n }\n <button type=\"button\" class=\"x-acct-btn\" [disabled]=\"saving\" (click)=\"save()\">\n {{ saving ? 'Saving\u2026' : 'Save address' }}\n </button>\n <button type=\"button\" class=\"x-acct-btn-ghost\" (click)=\"cancel()\" style=\"margin-left: 8px\">\n Cancel\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"x-acct-btn\" (click)=\"startAdd()\">Add an address</button>\n }\n\n @for (a of addresses; track a.id) {\n <div class=\"x-acct-card\">\n <div class=\"x-acct-row\" style=\"border-bottom: 0; padding-top: 0\">\n <strong>\n {{ a.label }}\n @if (a.isDefault) {\n <span class=\"x-acct-pill x-acct-pill-ok\" style=\"margin-left: 6px\">Default</span>\n }\n </strong>\n <span>\n <button type=\"button\" class=\"x-acct-btn-ghost\" (click)=\"startEdit(a)\">Edit</button>\n <button type=\"button\" class=\"x-acct-btn-ghost\" (click)=\"remove(a)\" style=\"margin-left: 6px\">\n Delete\n </button>\n </span>\n </div>\n <p class=\"x-acct-sub\" style=\"margin: 0\">\n {{ a.street }}@if (a.landmark) {, near {{ a.landmark }}}<br />\n {{ a.lga ? a.lga + ', ' : '' }}{{ a.state }}\n </p>\n @if (!a.isDefault) {\n <button\n type=\"button\"\n class=\"x-acct-btn-ghost\"\n style=\"margin-top: 10px\"\n (click)=\"makeDefault(a)\"\n >\n Make default\n </button>\n }\n </div>\n } @empty {\n @if (!editing) {\n <div class=\"x-acct-empty\">No saved addresses yet.</div>\n }\n }\n}\n" }]
|
|
259
282
|
}] });
|
|
260
283
|
|
|
261
284
|
// PRD Appendix B — the 17 order states, buyer-friendly labels. Shared by
|
|
@@ -1078,6 +1101,9 @@ class AccountSettingsComponent extends BaseDirective {
|
|
|
1078
1101
|
this.currentSecret = '';
|
|
1079
1102
|
this.newSecret = '';
|
|
1080
1103
|
this.confirmNewSecret = '';
|
|
1104
|
+
this.showCurrentSecret = false;
|
|
1105
|
+
this.showNewSecret = false;
|
|
1106
|
+
this.showConfirmSecret = false;
|
|
1081
1107
|
this.changingPassword = false;
|
|
1082
1108
|
this.passwordError = '';
|
|
1083
1109
|
this.passwordDone = false;
|
|
@@ -1223,11 +1249,11 @@ class AccountSettingsComponent extends BaseDirective {
|
|
|
1223
1249
|
}
|
|
1224
1250
|
}
|
|
1225
1251
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: AccountSettingsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
1226
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: AccountSettingsComponent, isStandalone: false, selector: "x-account-settings", usesInheritance: true, ngImport: i0, template: "<h2 class=\"x-acct-h2\">Settings</h2>\n<p class=\"x-acct-sub\">Profile, security, appearance and how we reach you.</p>\n\n<div class=\"x-acct-card\">\n <strong>Profile</strong>\n @if (loadingProfile) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Name</label>\n <input [value]=\"fullName\" disabled />\n </div>\n <div class=\"x-acct-field\">\n <label>Phone number</label>\n <input type=\"tel\" [(ngModel)]=\"phoneNumber\" placeholder=\"+234\u2026\" />\n </div>\n @if (profileError) {\n <div class=\"x-acct-err\">{{ profileError }}</div>\n }\n <button type=\"button\" class=\"x-acct-btn\" [disabled]=\"savingProfile\" (click)=\"saveProfile()\">\n {{ savingProfile ? 'Saving\u2026' : 'Save profile' }}\n </button>\n </div>\n }\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Change password</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Current password</label>\n <input type=\"password\" [(ngModel)]=\"currentSecret\" />\n </div>\n <div class=\"x-acct-field\">\n <label>New password</label>\n <input type=\"password\" [(ngModel)]=\"newSecret\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Confirm new password</label>\n <input type=\"password\" [(ngModel)]=\"confirmNewSecret\" />\n </div>\n @if (passwordError) {\n <div class=\"x-acct-err\">{{ passwordError }}</div>\n }\n @if (passwordDone) {\n <div class=\"x-acct-ok\">Password changed. Signing you out\u2026</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n [disabled]=\"!canChangePassword || changingPassword\"\n (click)=\"changePassword()\"\n >\n {{ changingPassword ? 'Saving\u2026' : 'Change password' }}\n </button>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Appearance</strong>\n <div class=\"x-acct-field\" style=\"margin-top: 14px; max-width: 240px\">\n <label>Theme</label>\n <select aria-label=\"Theme\" [ngModel]=\"theme\" (ngModelChange)=\"setTheme($event)\">\n <option value=\"system\">Match my device</option>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Notifications</strong>\n @if (loadingPrefs) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <p class=\"x-acct-sub\" style=\"margin: 8px 0 16px\">\n Order and payment updates are always sent. Everything else is up to you.\n </p>\n\n @for (cat of categories; track cat.key) {\n <div style=\"padding: 10px 0; border-bottom: 1px solid var(--color-border-muted)\">\n <div style=\"font-weight: 700; font-size: 13.5px; margin-bottom: 8px\">\n {{ cat.label }}\n @if (cat.locked) {\n <span class=\"x-acct-pill\" style=\"margin-left: 6px\">Always on</span>\n }\n </div>\n @if (cat.consent && !marketingConsent) {\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Opt in to offers and promotions\n </label>\n } @else {\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap\">\n @for (ch of channels; track ch.key) {\n <label class=\"x-acct-checkline\">\n <input\n type=\"checkbox\"\n [disabled]=\"cat.locked || unsubscribedAll || (cat.consent && !marketingConsent)\"\n [checked]=\"channelOn(cat.key, ch.key)\"\n (change)=\"toggleChannel(cat.key, ch.key)\"\n />\n {{ ch.label }}\n </label>\n }\n </div>\n @if (cat.consent && marketingConsent) {\n <label class=\"x-acct-checkline\" style=\"margin-top: 4px\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Keep me opted in to offers\n </label>\n }\n }\n </div>\n }\n\n <div style=\"padding: 14px 0\">\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"quietHoursEnabled\" />\n Quiet hours \u2014 hold non-urgent messages overnight\n </label>\n @if (quietHoursEnabled) {\n <div style=\"display: flex; gap: 12px; margin-top: 8px\">\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>From</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursStart\" />\n </div>\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>To</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursEnd\" />\n </div>\n </div>\n }\n </div>\n\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"unsubscribedAll\" />\n Unsubscribe from everything except order & payment updates\n </label>\n\n @if (prefsError) {\n <div class=\"x-acct-err\" style=\"margin-top: 12px\">{{ prefsError }}</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n style=\"margin-top: 14px\"\n [disabled]=\"savingPrefs\"\n (click)=\"savePrefs()\"\n >\n {{ savingPrefs ? 'Saving\u2026' : 'Save preferences' }}\n </button>\n }\n</div>\n", dependencies: [{ kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.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$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
1252
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: AccountSettingsComponent, isStandalone: false, selector: "x-account-settings", usesInheritance: true, ngImport: i0, template: "<h2 class=\"x-acct-h2\">Settings</h2>\n<p class=\"x-acct-sub\">Profile, security, appearance and how we reach you.</p>\n\n<div class=\"x-acct-card\">\n <strong>Profile</strong>\n @if (loadingProfile) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Name</label>\n <input [value]=\"fullName\" disabled />\n </div>\n <div class=\"x-acct-field\">\n <label>Phone number</label>\n <input type=\"tel\" [(ngModel)]=\"phoneNumber\" placeholder=\"+234\u2026\" />\n </div>\n @if (profileError) {\n <div class=\"x-acct-err\">{{ profileError }}</div>\n }\n <button type=\"button\" class=\"x-acct-btn\" [disabled]=\"savingProfile\" (click)=\"saveProfile()\">\n {{ savingProfile ? 'Saving\u2026' : 'Save profile' }}\n </button>\n </div>\n }\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Change password</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Current password</label>\n <div class=\"x-acct-pwd\">\n <input [type]=\"showCurrentSecret ? 'text' : 'password'\" [(ngModel)]=\"currentSecret\" />\n <button\n type=\"button\"\n class=\"x-acct-pwd-toggle\"\n [title]=\"showCurrentSecret ? 'Hide password' : 'Show password'\"\n [attr.aria-label]=\"showCurrentSecret ? 'Hide password' : 'Show password'\"\n (click)=\"showCurrentSecret = !showCurrentSecret\"\n >\n <i class=\"fa-solid\" [ngClass]=\"showCurrentSecret ? 'fa-eye' : 'fa-eye-slash'\"></i>\n </button>\n </div>\n </div>\n <div class=\"x-acct-field\">\n <label>New password</label>\n <div class=\"x-acct-pwd\">\n <input [type]=\"showNewSecret ? 'text' : 'password'\" [(ngModel)]=\"newSecret\" />\n <button\n type=\"button\"\n class=\"x-acct-pwd-toggle\"\n [title]=\"showNewSecret ? 'Hide password' : 'Show password'\"\n [attr.aria-label]=\"showNewSecret ? 'Hide password' : 'Show password'\"\n (click)=\"showNewSecret = !showNewSecret\"\n >\n <i class=\"fa-solid\" [ngClass]=\"showNewSecret ? 'fa-eye' : 'fa-eye-slash'\"></i>\n </button>\n </div>\n </div>\n <div class=\"x-acct-field\">\n <label>Confirm new password</label>\n <div class=\"x-acct-pwd\">\n <input [type]=\"showConfirmSecret ? 'text' : 'password'\" [(ngModel)]=\"confirmNewSecret\" />\n <button\n type=\"button\"\n class=\"x-acct-pwd-toggle\"\n [title]=\"showConfirmSecret ? 'Hide password' : 'Show password'\"\n [attr.aria-label]=\"showConfirmSecret ? 'Hide password' : 'Show password'\"\n (click)=\"showConfirmSecret = !showConfirmSecret\"\n >\n <i class=\"fa-solid\" [ngClass]=\"showConfirmSecret ? 'fa-eye' : 'fa-eye-slash'\"></i>\n </button>\n </div>\n </div>\n @if (passwordError) {\n <div class=\"x-acct-err\">{{ passwordError }}</div>\n }\n @if (passwordDone) {\n <div class=\"x-acct-ok\">Password changed. Signing you out\u2026</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n [disabled]=\"!canChangePassword || changingPassword\"\n (click)=\"changePassword()\"\n >\n {{ changingPassword ? 'Saving\u2026' : 'Change password' }}\n </button>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Appearance</strong>\n <div class=\"x-acct-field\" style=\"margin-top: 14px; max-width: 240px\">\n <label>Theme</label>\n <select aria-label=\"Theme\" [ngModel]=\"theme\" (ngModelChange)=\"setTheme($event)\">\n <option value=\"system\">Match my device</option>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Notifications</strong>\n @if (loadingPrefs) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <p class=\"x-acct-sub\" style=\"margin: 8px 0 16px\">\n Order and payment updates are always sent. Everything else is up to you.\n </p>\n\n @for (cat of categories; track cat.key) {\n <div style=\"padding: 10px 0; border-bottom: 1px solid var(--color-border-muted)\">\n <div style=\"font-weight: 700; font-size: 13.5px; margin-bottom: 8px\">\n {{ cat.label }}\n @if (cat.locked) {\n <span class=\"x-acct-pill\" style=\"margin-left: 6px\">Always on</span>\n }\n </div>\n @if (cat.consent && !marketingConsent) {\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Opt in to offers and promotions\n </label>\n } @else {\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap\">\n @for (ch of channels; track ch.key) {\n <label class=\"x-acct-checkline\">\n <input\n type=\"checkbox\"\n [disabled]=\"cat.locked || unsubscribedAll || (cat.consent && !marketingConsent)\"\n [checked]=\"channelOn(cat.key, ch.key)\"\n (change)=\"toggleChannel(cat.key, ch.key)\"\n />\n {{ ch.label }}\n </label>\n }\n </div>\n @if (cat.consent && marketingConsent) {\n <label class=\"x-acct-checkline\" style=\"margin-top: 4px\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Keep me opted in to offers\n </label>\n }\n }\n </div>\n }\n\n <div style=\"padding: 14px 0\">\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"quietHoursEnabled\" />\n Quiet hours \u2014 hold non-urgent messages overnight\n </label>\n @if (quietHoursEnabled) {\n <div style=\"display: flex; gap: 12px; margin-top: 8px\">\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>From</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursStart\" />\n </div>\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>To</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursEnd\" />\n </div>\n </div>\n }\n </div>\n\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"unsubscribedAll\" />\n Unsubscribe from everything except order & payment updates\n </label>\n\n @if (prefsError) {\n <div class=\"x-acct-err\" style=\"margin-top: 12px\">{{ prefsError }}</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n style=\"margin-top: 14px\"\n [disabled]=\"savingPrefs\"\n (click)=\"savePrefs()\"\n >\n {{ savingPrefs ? 'Saving\u2026' : 'Save preferences' }}\n </button>\n }\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.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$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
1227
1253
|
}
|
|
1228
1254
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: AccountSettingsComponent, decorators: [{
|
|
1229
1255
|
type: Component,
|
|
1230
|
-
args: [{ standalone: false, selector: 'x-account-settings', template: "<h2 class=\"x-acct-h2\">Settings</h2>\n<p class=\"x-acct-sub\">Profile, security, appearance and how we reach you.</p>\n\n<div class=\"x-acct-card\">\n <strong>Profile</strong>\n @if (loadingProfile) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Name</label>\n <input [value]=\"fullName\" disabled />\n </div>\n <div class=\"x-acct-field\">\n <label>Phone number</label>\n <input type=\"tel\" [(ngModel)]=\"phoneNumber\" placeholder=\"+234\u2026\" />\n </div>\n @if (profileError) {\n <div class=\"x-acct-err\">{{ profileError }}</div>\n }\n <button type=\"button\" class=\"x-acct-btn\" [disabled]=\"savingProfile\" (click)=\"saveProfile()\">\n {{ savingProfile ? 'Saving\u2026' : 'Save profile' }}\n </button>\n </div>\n }\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Change password</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Current password</label>\n <input type=\"password\" [(ngModel)]=\"currentSecret\" />\n </div>\n <div class=\"x-acct-field\">\n <label>New password</label>\n <input type=\"password\" [(ngModel)]=\"newSecret\" />\n </div>\n <div class=\"x-acct-field\">\n <label>Confirm new password</label>\n <input type=\"password\" [(ngModel)]=\"confirmNewSecret\" />\n </div>\n @if (passwordError) {\n <div class=\"x-acct-err\">{{ passwordError }}</div>\n }\n @if (passwordDone) {\n <div class=\"x-acct-ok\">Password changed. Signing you out\u2026</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n [disabled]=\"!canChangePassword || changingPassword\"\n (click)=\"changePassword()\"\n >\n {{ changingPassword ? 'Saving\u2026' : 'Change password' }}\n </button>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Appearance</strong>\n <div class=\"x-acct-field\" style=\"margin-top: 14px; max-width: 240px\">\n <label>Theme</label>\n <select aria-label=\"Theme\" [ngModel]=\"theme\" (ngModelChange)=\"setTheme($event)\">\n <option value=\"system\">Match my device</option>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Notifications</strong>\n @if (loadingPrefs) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <p class=\"x-acct-sub\" style=\"margin: 8px 0 16px\">\n Order and payment updates are always sent. Everything else is up to you.\n </p>\n\n @for (cat of categories; track cat.key) {\n <div style=\"padding: 10px 0; border-bottom: 1px solid var(--color-border-muted)\">\n <div style=\"font-weight: 700; font-size: 13.5px; margin-bottom: 8px\">\n {{ cat.label }}\n @if (cat.locked) {\n <span class=\"x-acct-pill\" style=\"margin-left: 6px\">Always on</span>\n }\n </div>\n @if (cat.consent && !marketingConsent) {\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Opt in to offers and promotions\n </label>\n } @else {\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap\">\n @for (ch of channels; track ch.key) {\n <label class=\"x-acct-checkline\">\n <input\n type=\"checkbox\"\n [disabled]=\"cat.locked || unsubscribedAll || (cat.consent && !marketingConsent)\"\n [checked]=\"channelOn(cat.key, ch.key)\"\n (change)=\"toggleChannel(cat.key, ch.key)\"\n />\n {{ ch.label }}\n </label>\n }\n </div>\n @if (cat.consent && marketingConsent) {\n <label class=\"x-acct-checkline\" style=\"margin-top: 4px\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Keep me opted in to offers\n </label>\n }\n }\n </div>\n }\n\n <div style=\"padding: 14px 0\">\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"quietHoursEnabled\" />\n Quiet hours \u2014 hold non-urgent messages overnight\n </label>\n @if (quietHoursEnabled) {\n <div style=\"display: flex; gap: 12px; margin-top: 8px\">\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>From</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursStart\" />\n </div>\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>To</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursEnd\" />\n </div>\n </div>\n }\n </div>\n\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"unsubscribedAll\" />\n Unsubscribe from everything except order & payment updates\n </label>\n\n @if (prefsError) {\n <div class=\"x-acct-err\" style=\"margin-top: 12px\">{{ prefsError }}</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n style=\"margin-top: 14px\"\n [disabled]=\"savingPrefs\"\n (click)=\"savePrefs()\"\n >\n {{ savingPrefs ? 'Saving\u2026' : 'Save preferences' }}\n </button>\n }\n</div>\n" }]
|
|
1256
|
+
args: [{ standalone: false, selector: 'x-account-settings', template: "<h2 class=\"x-acct-h2\">Settings</h2>\n<p class=\"x-acct-sub\">Profile, security, appearance and how we reach you.</p>\n\n<div class=\"x-acct-card\">\n <strong>Profile</strong>\n @if (loadingProfile) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Name</label>\n <input [value]=\"fullName\" disabled />\n </div>\n <div class=\"x-acct-field\">\n <label>Phone number</label>\n <input type=\"tel\" [(ngModel)]=\"phoneNumber\" placeholder=\"+234\u2026\" />\n </div>\n @if (profileError) {\n <div class=\"x-acct-err\">{{ profileError }}</div>\n }\n <button type=\"button\" class=\"x-acct-btn\" [disabled]=\"savingProfile\" (click)=\"saveProfile()\">\n {{ savingProfile ? 'Saving\u2026' : 'Save profile' }}\n </button>\n </div>\n }\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Change password</strong>\n <div style=\"margin-top: 14px\">\n <div class=\"x-acct-field\">\n <label>Current password</label>\n <div class=\"x-acct-pwd\">\n <input [type]=\"showCurrentSecret ? 'text' : 'password'\" [(ngModel)]=\"currentSecret\" />\n <button\n type=\"button\"\n class=\"x-acct-pwd-toggle\"\n [title]=\"showCurrentSecret ? 'Hide password' : 'Show password'\"\n [attr.aria-label]=\"showCurrentSecret ? 'Hide password' : 'Show password'\"\n (click)=\"showCurrentSecret = !showCurrentSecret\"\n >\n <i class=\"fa-solid\" [ngClass]=\"showCurrentSecret ? 'fa-eye' : 'fa-eye-slash'\"></i>\n </button>\n </div>\n </div>\n <div class=\"x-acct-field\">\n <label>New password</label>\n <div class=\"x-acct-pwd\">\n <input [type]=\"showNewSecret ? 'text' : 'password'\" [(ngModel)]=\"newSecret\" />\n <button\n type=\"button\"\n class=\"x-acct-pwd-toggle\"\n [title]=\"showNewSecret ? 'Hide password' : 'Show password'\"\n [attr.aria-label]=\"showNewSecret ? 'Hide password' : 'Show password'\"\n (click)=\"showNewSecret = !showNewSecret\"\n >\n <i class=\"fa-solid\" [ngClass]=\"showNewSecret ? 'fa-eye' : 'fa-eye-slash'\"></i>\n </button>\n </div>\n </div>\n <div class=\"x-acct-field\">\n <label>Confirm new password</label>\n <div class=\"x-acct-pwd\">\n <input [type]=\"showConfirmSecret ? 'text' : 'password'\" [(ngModel)]=\"confirmNewSecret\" />\n <button\n type=\"button\"\n class=\"x-acct-pwd-toggle\"\n [title]=\"showConfirmSecret ? 'Hide password' : 'Show password'\"\n [attr.aria-label]=\"showConfirmSecret ? 'Hide password' : 'Show password'\"\n (click)=\"showConfirmSecret = !showConfirmSecret\"\n >\n <i class=\"fa-solid\" [ngClass]=\"showConfirmSecret ? 'fa-eye' : 'fa-eye-slash'\"></i>\n </button>\n </div>\n </div>\n @if (passwordError) {\n <div class=\"x-acct-err\">{{ passwordError }}</div>\n }\n @if (passwordDone) {\n <div class=\"x-acct-ok\">Password changed. Signing you out\u2026</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n [disabled]=\"!canChangePassword || changingPassword\"\n (click)=\"changePassword()\"\n >\n {{ changingPassword ? 'Saving\u2026' : 'Change password' }}\n </button>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Appearance</strong>\n <div class=\"x-acct-field\" style=\"margin-top: 14px; max-width: 240px\">\n <label>Theme</label>\n <select aria-label=\"Theme\" [ngModel]=\"theme\" (ngModelChange)=\"setTheme($event)\">\n <option value=\"system\">Match my device</option>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </div>\n</div>\n\n<div class=\"x-acct-card\">\n <strong>Notifications</strong>\n @if (loadingPrefs) {\n <div class=\"x-acct-empty\">Loading\u2026</div>\n } @else {\n <p class=\"x-acct-sub\" style=\"margin: 8px 0 16px\">\n Order and payment updates are always sent. Everything else is up to you.\n </p>\n\n @for (cat of categories; track cat.key) {\n <div style=\"padding: 10px 0; border-bottom: 1px solid var(--color-border-muted)\">\n <div style=\"font-weight: 700; font-size: 13.5px; margin-bottom: 8px\">\n {{ cat.label }}\n @if (cat.locked) {\n <span class=\"x-acct-pill\" style=\"margin-left: 6px\">Always on</span>\n }\n </div>\n @if (cat.consent && !marketingConsent) {\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Opt in to offers and promotions\n </label>\n } @else {\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap\">\n @for (ch of channels; track ch.key) {\n <label class=\"x-acct-checkline\">\n <input\n type=\"checkbox\"\n [disabled]=\"cat.locked || unsubscribedAll || (cat.consent && !marketingConsent)\"\n [checked]=\"channelOn(cat.key, ch.key)\"\n (change)=\"toggleChannel(cat.key, ch.key)\"\n />\n {{ ch.label }}\n </label>\n }\n </div>\n @if (cat.consent && marketingConsent) {\n <label class=\"x-acct-checkline\" style=\"margin-top: 4px\">\n <input type=\"checkbox\" [(ngModel)]=\"marketingConsent\" />\n Keep me opted in to offers\n </label>\n }\n }\n </div>\n }\n\n <div style=\"padding: 14px 0\">\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"quietHoursEnabled\" />\n Quiet hours \u2014 hold non-urgent messages overnight\n </label>\n @if (quietHoursEnabled) {\n <div style=\"display: flex; gap: 12px; margin-top: 8px\">\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>From</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursStart\" />\n </div>\n <div class=\"x-acct-field\" style=\"margin: 0\">\n <label>To</label>\n <input type=\"time\" [(ngModel)]=\"quietHoursEnd\" />\n </div>\n </div>\n }\n </div>\n\n <label class=\"x-acct-checkline\">\n <input type=\"checkbox\" [(ngModel)]=\"unsubscribedAll\" />\n Unsubscribe from everything except order & payment updates\n </label>\n\n @if (prefsError) {\n <div class=\"x-acct-err\" style=\"margin-top: 12px\">{{ prefsError }}</div>\n }\n <button\n type=\"button\"\n class=\"x-acct-btn\"\n style=\"margin-top: 14px\"\n [disabled]=\"savingPrefs\"\n (click)=\"savePrefs()\"\n >\n {{ savingPrefs ? 'Saving\u2026' : 'Save preferences' }}\n </button>\n }\n</div>\n" }]
|
|
1231
1257
|
}] });
|
|
1232
1258
|
|
|
1233
1259
|
// P5.6, ACC-06 — one registered system: product, serial, dates,
|
|
@@ -1749,4 +1775,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
1749
1775
|
}] });
|
|
1750
1776
|
|
|
1751
1777
|
export { AccountModule };
|
|
1752
|
-
//# sourceMappingURL=isaiahiroko-tilmart-ngx-apps-buyer-account.module-
|
|
1778
|
+
//# sourceMappingURL=isaiahiroko-tilmart-ngx-apps-buyer-account.module-CLVC0SX-.mjs.map
|