feat: dead-config sweep, test suite foundation, widget settingsSchema validation
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
Sprint G: audited every BootstrapConfig field for a real runtime consumer (docs/DEAD-CONFIG-AUDIT.md). Wired 3 previously-dead editable fields: footer.logoUrl, company.address.street/contacts.phone, catalog.suggestionsEnabled. Remaining dead fields needing a business/design decision tracked in PRODUCT_BACKLOG.md/KNOWN-ISSUES.md, not silently left. Sprint H: 6 new spec files (test count 57 -> 83), covering ProjectEditorFacade (undo/redo, draft persistence, publish gating), AdminAnalyticsFacade (never-fabricate-a-number contract), and regression coverage for this session's carousel/hero/profile-toggle fixes. Sprint I: widget settingsSchema (declared in widget-manifest.json, never validated) now enforced via a new lightweight schema check in ProjectValidator, surfaced through the existing issuesByField pipeline. Same check reused in diagnostics so editor and diagnostics can't disagree. Verification: tsc clean, ng build clean, 83/83 tests pass, barry-cache validate clean (2 pre-existing unrelated warnings only). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<div class="app-footer__container page-container">
|
||||
<div class="app-footer__top">
|
||||
<div class="app-footer__brand">
|
||||
<app-logo />
|
||||
<app-logo [srcOverride]="footerLogoUrl()" />
|
||||
<p>{{ 'footer.description' | translate }}</p>
|
||||
</div>
|
||||
|
||||
@@ -46,6 +46,12 @@
|
||||
@if (contactEmail) {
|
||||
<a [href]="'mailto:' + contactEmail">{{ contactEmail }}</a>
|
||||
}
|
||||
@if (contactPhone) {
|
||||
<a [href]="'tel:' + contactPhone">{{ contactPhone }}</a>
|
||||
}
|
||||
@if (companyAddress) {
|
||||
<span class="app-footer__address">{{ companyAddress }}</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@@ -21,6 +21,7 @@ export class FooterComponent {
|
||||
readonly footerGroups = signal<FooterResolvedGroup[]>([]);
|
||||
readonly paymentIcons = signal<FooterPaymentIcon[]>([]);
|
||||
readonly copyrightText = signal('');
|
||||
readonly footerLogoUrl = signal<string | undefined>(undefined);
|
||||
|
||||
private readonly configService = inject(ConfigService);
|
||||
|
||||
@@ -35,6 +36,7 @@ export class FooterComponent {
|
||||
this.footerGroups.set([]);
|
||||
this.paymentIcons.set([]);
|
||||
this.copyrightText.set('');
|
||||
this.footerLogoUrl.set(undefined);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -42,6 +44,7 @@ export class FooterComponent {
|
||||
this.footerGroups.set(model.groups);
|
||||
this.paymentIcons.set(model.paymentIcons);
|
||||
this.copyrightText.set(model.copyrightText);
|
||||
this.footerLogoUrl.set(model.logoUrl);
|
||||
});
|
||||
|
||||
this.configService.loadBootstrap().subscribe();
|
||||
@@ -56,4 +59,12 @@ export class FooterComponent {
|
||||
get contactEmail(): string {
|
||||
return this.uiRuntime.contactEmail();
|
||||
}
|
||||
|
||||
get contactPhone(): string {
|
||||
return this.uiRuntime.contactPhone();
|
||||
}
|
||||
|
||||
get companyAddress(): string {
|
||||
return this.uiRuntime.companyAddress();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user