Compare commits
16 Commits
ae6728998d
...
34afb5142d
| Author | SHA1 | Date | |
|---|---|---|---|
| 34afb5142d | |||
| 8eba15155e | |||
| 85c31579e2 | |||
| 159ec36cb2 | |||
| 32b1eb5639 | |||
| 0f9d3e79d4 | |||
| b97753f825 | |||
| f1b724ed63 | |||
| 571cae0f98 | |||
| 30b8527c9a | |||
| 0e5f6dceb0 | |||
| cd0a6e9b5e | |||
| 1bbb3d0914 | |||
| e4157a4005 | |||
| c9f8a1c4a6 | |||
| 308af52ad5 |
@@ -17,6 +17,8 @@ const tenant: Tenant = {
|
|||||||
codigo: 'test',
|
codigo: 'test',
|
||||||
nombre: 'Test Tenant',
|
nombre: 'Test Tenant',
|
||||||
dominio: 'localhost',
|
dominio: 'localhost',
|
||||||
|
site_title: 'Test Store',
|
||||||
|
favicon: 'https://example.com/favicon.png',
|
||||||
primary_color: '#6376F3',
|
primary_color: '#6376F3',
|
||||||
secondary_color: '#A0A0A0',
|
secondary_color: '#A0A0A0',
|
||||||
danger_color: '#FF8888',
|
danger_color: '#FF8888',
|
||||||
@@ -90,6 +92,9 @@ describe('App', () => {
|
|||||||
expect(fixture.nativeElement.style.getPropertyValue('--tenant-danger-rgb')).toBe(
|
expect(fixture.nativeElement.style.getPropertyValue('--tenant-danger-rgb')).toBe(
|
||||||
'255, 136, 136'
|
'255, 136, 136'
|
||||||
);
|
);
|
||||||
|
expect(document.title).toBe(tenant.site_title);
|
||||||
|
expect(document.head.querySelector<HTMLLinkElement>('link[rel~="icon"]')?.getAttribute('href'))
|
||||||
|
.toBe(tenant.favicon);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('renders the tenant not found screen when the tenant is missing', async () => {
|
it('renders the tenant not found screen when the tenant is missing', async () => {
|
||||||
@@ -108,5 +113,8 @@ describe('App', () => {
|
|||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
expect(fixture.nativeElement.textContent).toContain('No encontramos una tienda para este dominio');
|
expect(fixture.nativeElement.textContent).toContain('No encontramos una tienda para este dominio');
|
||||||
|
expect(document.title).toBe('ShopitFront');
|
||||||
|
expect(document.head.querySelector<HTMLLinkElement>('link[rel~="icon"]')?.getAttribute('href'))
|
||||||
|
.toBe('favicon.ico');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import { Component, computed, inject } from '@angular/core';
|
import { DOCUMENT } from '@angular/common';
|
||||||
|
import { Component, computed, effect, inject } from '@angular/core';
|
||||||
|
import { Title } from '@angular/platform-browser';
|
||||||
import { RouterOutlet } from '@angular/router';
|
import { RouterOutlet } from '@angular/router';
|
||||||
|
|
||||||
import { TenantService } from './core/services/tenant.service';
|
import { TenantService } from './core/services/tenant.service';
|
||||||
@@ -57,6 +59,28 @@ function hexToRgb(hex: string): string {
|
|||||||
})
|
})
|
||||||
export class App {
|
export class App {
|
||||||
private readonly tenantService = inject(TenantService);
|
private readonly tenantService = inject(TenantService);
|
||||||
|
private readonly document = inject(DOCUMENT);
|
||||||
|
private readonly title = inject(Title);
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
effect(() => {
|
||||||
|
const tenant = this.tenantService.tenant();
|
||||||
|
const siteTitle = tenant?.site_title?.trim() || 'ShopitFront';
|
||||||
|
const faviconHref = tenant?.favicon || 'favicon.ico';
|
||||||
|
|
||||||
|
this.title.setTitle(siteTitle);
|
||||||
|
|
||||||
|
let favicon = this.document.head.querySelector<HTMLLinkElement>('link[rel~="icon"]');
|
||||||
|
|
||||||
|
if (!favicon) {
|
||||||
|
favicon = this.document.createElement('link');
|
||||||
|
favicon.setAttribute('rel', 'icon');
|
||||||
|
this.document.head.appendChild(favicon);
|
||||||
|
}
|
||||||
|
|
||||||
|
favicon.setAttribute('href', faviconHref);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected readonly status = this.tenantService.status;
|
protected readonly status = this.tenantService.status;
|
||||||
|
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ export interface Tenant {
|
|||||||
codigo: string;
|
codigo: string;
|
||||||
nombre: string;
|
nombre: string;
|
||||||
dominio: string;
|
dominio: string;
|
||||||
|
site_title?: string | null;
|
||||||
|
favicon?: string | null;
|
||||||
primary_color: string;
|
primary_color: string;
|
||||||
secondary_color: string;
|
secondary_color: string;
|
||||||
danger_color: string;
|
danger_color: string;
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
export interface TimeWindowValidityTime {
|
|
||||||
id: number;
|
|
||||||
type: 'time_window';
|
|
||||||
is_valid: boolean;
|
|
||||||
start_time?: string;
|
|
||||||
end_time?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FixedWindowValidityTime {
|
|
||||||
id: number;
|
|
||||||
type: 'fixed_window';
|
|
||||||
is_valid: boolean;
|
|
||||||
fixed_starts_at?: string;
|
|
||||||
fixed_expires_at?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type ValidityTime = TimeWindowValidityTime | FixedWindowValidityTime;
|
|
||||||
@@ -3,16 +3,6 @@ import { firstValueFrom } from 'rxjs';
|
|||||||
|
|
||||||
import { BaseApiService } from '../../../../../../core/services/base-api.service';
|
import { BaseApiService } from '../../../../../../core/services/base-api.service';
|
||||||
import { TenantService } from '../../../../../../core/services/tenant.service';
|
import { TenantService } from '../../../../../../core/services/tenant.service';
|
||||||
import { ValidityTime } from '../../../../../../core/services/validity-time.interface';
|
|
||||||
|
|
||||||
export interface TicketValidityGroupResponse {
|
|
||||||
id: number;
|
|
||||||
validity_times: ValidityTime[];
|
|
||||||
starts_at: string | null;
|
|
||||||
expires_at: string | null;
|
|
||||||
is_valid: boolean;
|
|
||||||
is_expired: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TicketResponse {
|
export interface TicketResponse {
|
||||||
id: number;
|
id: number;
|
||||||
@@ -22,8 +12,6 @@ export interface TicketResponse {
|
|||||||
description: string | null;
|
description: string | null;
|
||||||
source_catalog_item_id: number | null;
|
source_catalog_item_id: number | null;
|
||||||
source_variant_id: number | null;
|
source_variant_id: number | null;
|
||||||
validity_times?: ValidityTime[];
|
|
||||||
validity_groups?: TicketValidityGroupResponse[];
|
|
||||||
starts_at: string | null;
|
starts_at: string | null;
|
||||||
expires_at: string | null;
|
expires_at: string | null;
|
||||||
used_at: string | null;
|
used_at: string | null;
|
||||||
|
|||||||
Reference in New Issue
Block a user