update
This commit is contained in:
@@ -162,6 +162,10 @@
|
|||||||
],
|
],
|
||||||
"extractLicenses": false,
|
"extractLicenses": false,
|
||||||
"fileReplacements": [
|
"fileReplacements": [
|
||||||
|
{
|
||||||
|
"replace": "src/config.ts",
|
||||||
|
"with": "src/tenants/tis/config.ts"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"replace": "src/assets/images/brandingAssets.ts",
|
"replace": "src/assets/images/brandingAssets.ts",
|
||||||
"with": "src/tenants/tis/brandingAssets.ts"
|
"with": "src/tenants/tis/brandingAssets.ts"
|
||||||
|
|||||||
+3
-2
@@ -1,8 +1,9 @@
|
|||||||
{
|
{
|
||||||
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
|
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
|
||||||
"appData": {
|
"appData": {
|
||||||
"appVersion": "0.0.0",
|
"appVersion": "0.0.3",
|
||||||
"buildDate": "2026-05-11T10:08:38.776Z"
|
"buildDate": "2026-05-11T13:52:49.314Z",
|
||||||
|
"buildNumber": 3
|
||||||
},
|
},
|
||||||
"assetGroups": [
|
"assetGroups": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,12 +2,24 @@
|
|||||||
"background_color": "#ffffff",
|
"background_color": "#ffffff",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"icons": [
|
"icons": [
|
||||||
|
{
|
||||||
|
"purpose": "any",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"src": "/favicon/web-app-manifest-192x192.png",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"purpose": "maskable",
|
"purpose": "maskable",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"src": "/favicon/web-app-manifest-192x192.png",
|
"src": "/favicon/web-app-manifest-192x192.png",
|
||||||
"type": "image/png"
|
"type": "image/png"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"purpose": "any",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"src": "/favicon/web-app-manifest-512x512.png",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"purpose": "maskable",
|
"purpose": "maskable",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
|
|||||||
@@ -2,16 +2,28 @@
|
|||||||
"background_color": "#ffffff",
|
"background_color": "#ffffff",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"icons": [
|
"icons": [
|
||||||
|
{
|
||||||
|
"purpose": "any",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"src": "/favicon/web-app-manifest-192x192.png",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"purpose": "maskable",
|
"purpose": "maskable",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"src": "/web-app-manifest-192x192.png",
|
"src": "/favicon/web-app-manifest-192x192.png",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"purpose": "any",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"src": "/favicon/web-app-manifest-512x512.png",
|
||||||
"type": "image/png"
|
"type": "image/png"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"purpose": "maskable",
|
"purpose": "maskable",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"src": "/web-app-manifest-512x512.png",
|
"src": "/favicon/web-app-manifest-512x512.png",
|
||||||
"type": "image/png"
|
"type": "image/png"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
|
import { PwaInstallService } from '@/core/services/pwa-install.service';
|
||||||
import { Component, HostListener } from '@angular/core';
|
import { Component, HostListener } from '@angular/core';
|
||||||
import { RouterModule } from '@angular/router';
|
import { RouterModule } from '@angular/router';
|
||||||
import { ConfirmDialog } from 'primeng/confirmdialog';
|
import { ConfirmDialog } from 'primeng/confirmdialog';
|
||||||
import { ToastModule } from 'primeng/toast';
|
import { ToastModule } from 'primeng/toast';
|
||||||
|
import { brandingConfig } from './app/branding/branding.config';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-root',
|
selector: 'app-root',
|
||||||
@@ -16,8 +18,11 @@ import { ToastModule } from 'primeng/toast';
|
|||||||
export class AppComponent {
|
export class AppComponent {
|
||||||
toastPosition: 'top-center' | 'bottom-right' = 'bottom-right';
|
toastPosition: 'top-center' | 'bottom-right' = 'bottom-right';
|
||||||
|
|
||||||
constructor() {
|
constructor(private readonly pwaInstallService: PwaInstallService) {
|
||||||
this.updateToastPosition();
|
this.updateToastPosition();
|
||||||
|
if (brandingConfig.enableInstallPrompt) {
|
||||||
|
this.pwaInstallService.init();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@HostListener('window:resize')
|
@HostListener('window:resize')
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { Router } from '@angular/router';
|
|||||||
import { CookieService } from 'ngx-cookie-service';
|
import { CookieService } from 'ngx-cookie-service';
|
||||||
import { BehaviorSubject, Observable, throwError } from 'rxjs';
|
import { BehaviorSubject, Observable, throwError } from 'rxjs';
|
||||||
import { catchError, finalize, tap } from 'rxjs/operators';
|
import { catchError, finalize, tap } from 'rxjs/operators';
|
||||||
|
import config from 'src/config';
|
||||||
import { COOKIE_KEYS, LOCAL_STORAGE_KEYS } from '../../../assets/constants';
|
import { COOKIE_KEYS, LOCAL_STORAGE_KEYS } from '../../../assets/constants';
|
||||||
import {
|
import {
|
||||||
IAuthAccountResponse,
|
IAuthAccountResponse,
|
||||||
@@ -75,7 +76,7 @@ export class AuthService {
|
|||||||
return this.http
|
return this.http
|
||||||
.post<IAuthResponse>(
|
.post<IAuthResponse>(
|
||||||
'/api/v1/auth/login',
|
'/api/v1/auth/login',
|
||||||
{ username, password },
|
{ username, password, isPos: config.isPosApplication },
|
||||||
{
|
{
|
||||||
headers: baseHeaders,
|
headers: baseHeaders,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ export { ErrorHandlerService } from './error-handler.service';
|
|||||||
export { ConfigService } from './config.service';
|
export { ConfigService } from './config.service';
|
||||||
export * from './breadcrumb.service';
|
export * from './breadcrumb.service';
|
||||||
export * from './native-bridge.service';
|
export * from './native-bridge.service';
|
||||||
|
export * from './pwa-install.service';
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import { Injectable, signal } from '@angular/core';
|
||||||
|
import { ConfirmationService } from 'primeng/api';
|
||||||
|
|
||||||
|
@Injectable({ providedIn: 'root' })
|
||||||
|
export class PwaInstallService {
|
||||||
|
private deferredInstallPrompt: any = null;
|
||||||
|
readonly isInstalled = signal(false);
|
||||||
|
readonly canInstall = signal(false);
|
||||||
|
|
||||||
|
constructor(private readonly confirmationService: ConfirmationService) {
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
if (typeof window === 'undefined') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const standalone =
|
||||||
|
window.matchMedia('(display-mode: standalone)').matches ||
|
||||||
|
(window.navigator as any).standalone === true;
|
||||||
|
|
||||||
|
console.log(window.matchMedia('(display-mode: standalone)').matches);
|
||||||
|
console.log(window.navigator);
|
||||||
|
|
||||||
|
this.isInstalled.set(standalone);
|
||||||
|
|
||||||
|
window.addEventListener('beforeinstallprompt', (event: any) => {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
this.deferredInstallPrompt = event;
|
||||||
|
this.canInstall.set(true);
|
||||||
|
console.log(this.deferredInstallPrompt);
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('appinstalled', () => {
|
||||||
|
this.deferredInstallPrompt = null;
|
||||||
|
this.canInstall.set(false);
|
||||||
|
this.isInstalled.set(true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
openInstallConfirm() {
|
||||||
|
if (this.isInstalled() || !this.canInstall() || !this.deferredInstallPrompt) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('openInstallConfirm');
|
||||||
|
|
||||||
|
this.confirmationService.confirm({
|
||||||
|
header: 'نصب اپلیکیشن',
|
||||||
|
message: 'برای ادامه میبایست نیازمندیهای نرمافزار را نصب کنید',
|
||||||
|
acceptLabel: 'نصب',
|
||||||
|
rejectButtonProps: {
|
||||||
|
outlined: true,
|
||||||
|
},
|
||||||
|
accept: () => {
|
||||||
|
this.deferredInstallPrompt.prompt();
|
||||||
|
this.deferredInstallPrompt.userChoice.finally(() => {
|
||||||
|
this.deferredInstallPrompt = null;
|
||||||
|
this.canInstall.set(false);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,18 @@
|
|||||||
<div class="h-svh w-svw flex flex-col items-center justify-center">
|
<div class="h-svh w-svw flex flex-col items-center justify-center">
|
||||||
|
{{ requireInstall }}
|
||||||
|
{{ pwaInstalled() }}
|
||||||
<img [src]="logo" class="w-32 animate-pulse" />
|
<img [src]="logo" class="w-32 animate-pulse" />
|
||||||
|
@if (requireInstall && !pwaInstalled()) {
|
||||||
|
<div class="mt-6 flex flex-col items-center gap-3">
|
||||||
|
<span class="text-base font-medium text-center text-muted-color">برای ادامه، نصب برنامه الزامی است.</span>
|
||||||
|
@if (canInstall()) {
|
||||||
|
<button pButton type="button" size="small" (click)="installPwa()">نصب برنامه</button>
|
||||||
|
} @else {
|
||||||
|
<span class="text-sm text-center text-muted-color">منتظر فعال شدن امکان نصب در مرورگر...</span>
|
||||||
|
}
|
||||||
|
<button pButton type="button" outlined size="small" (click)="continueAfterInstall()">ادامه</button>
|
||||||
|
</div>
|
||||||
|
} @else {
|
||||||
<span class="text-xl font-medium text-center text-muted-color mt-4"> در حال بارگذاری ... </span>
|
<span class="text-xl font-medium text-center text-muted-color mt-4"> در حال بارگذاری ... </span>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
import { PwaInstallService } from '@/core/services';
|
||||||
import { Component, EventEmitter, inject, Output } from '@angular/core';
|
import { Component, EventEmitter, inject, Output } from '@angular/core';
|
||||||
|
import { ButtonDirective } from 'primeng/button';
|
||||||
import { finalize, forkJoin } from 'rxjs';
|
import { finalize, forkJoin } from 'rxjs';
|
||||||
import images from 'src/assets/images';
|
import images from 'src/assets/images';
|
||||||
import { PosInfoStore, PosProfileStore } from '../store';
|
import { PosInfoStore, PosProfileStore } from '../store';
|
||||||
@@ -7,6 +9,7 @@ import { DeviceInfoStore } from '../store/device.store';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'pos-splash',
|
selector: 'pos-splash',
|
||||||
templateUrl: 'splash.component.html',
|
templateUrl: 'splash.component.html',
|
||||||
|
imports: [ButtonDirective],
|
||||||
})
|
})
|
||||||
export class PosSplashComponent {
|
export class PosSplashComponent {
|
||||||
@Output() onComplete = new EventEmitter<void>();
|
@Output() onComplete = new EventEmitter<void>();
|
||||||
@@ -14,8 +17,27 @@ export class PosSplashComponent {
|
|||||||
private readonly posProfileStore = inject(PosProfileStore);
|
private readonly posProfileStore = inject(PosProfileStore);
|
||||||
private readonly posInfoStore = inject(PosInfoStore);
|
private readonly posInfoStore = inject(PosInfoStore);
|
||||||
private readonly deviceInfoStore = inject(DeviceInfoStore);
|
private readonly deviceInfoStore = inject(DeviceInfoStore);
|
||||||
|
private readonly pwaInstallService = inject(PwaInstallService);
|
||||||
|
|
||||||
logo = images.logo;
|
logo = images.logo;
|
||||||
|
requireInstall = false;
|
||||||
|
// requireInstall = brandingConfig.enableInstallPrompt;
|
||||||
|
pwaInstalled = this.pwaInstallService.isInstalled;
|
||||||
|
canInstall = this.pwaInstallService.canInstall;
|
||||||
|
private installPromptShown = false;
|
||||||
|
|
||||||
|
// constructor() {
|
||||||
|
// effect(() => {
|
||||||
|
// if (!this.requireInstall || this.pwaInstalled() || this.installPromptShown) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (this.canInstall()) {
|
||||||
|
// this.installPromptShown = true;
|
||||||
|
// this.pwaInstallService.openInstallConfirm();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
async ngOnInit() {
|
async ngOnInit() {
|
||||||
const data = await this.deviceInfoStore.getData();
|
const data = await this.deviceInfoStore.getData();
|
||||||
@@ -25,9 +47,27 @@ export class PosSplashComponent {
|
|||||||
forkJoin([profileObs, infoObs])
|
forkJoin([profileObs, infoObs])
|
||||||
.pipe(
|
.pipe(
|
||||||
finalize(() => {
|
finalize(() => {
|
||||||
|
if (!this.requireInstall || this.pwaInstalled()) {
|
||||||
this.onComplete.emit();
|
this.onComplete.emit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.canInstall()) {
|
||||||
|
this.pwaInstallService.openInstallConfirm();
|
||||||
|
this.installPromptShown = true;
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.subscribe(([profileResult, infoResult]) => {});
|
.subscribe(([profileResult, infoResult]) => {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
installPwa() {
|
||||||
|
this.pwaInstallService.openInstallConfirm();
|
||||||
|
}
|
||||||
|
|
||||||
|
continueAfterInstall() {
|
||||||
|
if (this.pwaInstalled()) {
|
||||||
|
this.onComplete.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,18 +19,18 @@
|
|||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
pRipple
|
pRipple
|
||||||
routerLink="/pos/sale_invoices"
|
routerLink="/sale_invoices"
|
||||||
(click)="drawerRef.close($event)"
|
(click)="drawerRef.close($event)"
|
||||||
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
||||||
>
|
>
|
||||||
<i class="pi pi-home me-2"></i>
|
<i class="pi pi-home me-2"></i>
|
||||||
<span class="font-medium">مشاهدهی فاکتورها</span>
|
<span class="font-medium">فاکتورها</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
pRipple
|
pRipple
|
||||||
routerLink="/pos"
|
routerLink="/"
|
||||||
(click)="drawerRef.close($event)"
|
(click)="drawerRef.close($event)"
|
||||||
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
||||||
>
|
>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
pRipple
|
pRipple
|
||||||
routerLink="/pos/about"
|
routerLink="/about"
|
||||||
(click)="drawerRef.close($event)"
|
(click)="drawerRef.close($event)"
|
||||||
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
||||||
>
|
>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
pRipple
|
pRipple
|
||||||
routerLink="/pos/support"
|
routerLink="/support"
|
||||||
(click)="drawerRef.close($event)"
|
(click)="drawerRef.close($event)"
|
||||||
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
class="flex items-center cursor-pointer p-4 rounded-border text-surface-700 dark:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-700 duration-150 transition-colors p-ripple"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { ToastService } from '@/core/services/toast.service';
|
||||||
import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog';
|
import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog';
|
||||||
import { Component, computed, inject } from '@angular/core';
|
import { Component, computed, inject } from '@angular/core';
|
||||||
import { RouterLink } from '@angular/router';
|
import { RouterLink } from '@angular/router';
|
||||||
@@ -16,6 +17,7 @@ import { PosInfoStore } from '../../store';
|
|||||||
export class PosMainMenuSidebarComponent extends AbstractDialog {
|
export class PosMainMenuSidebarComponent extends AbstractDialog {
|
||||||
private readonly posInfoStore = inject(PosInfoStore);
|
private readonly posInfoStore = inject(PosInfoStore);
|
||||||
private readonly swUpdate = inject(SwUpdate);
|
private readonly swUpdate = inject(SwUpdate);
|
||||||
|
private readonly toastService = inject(ToastService);
|
||||||
|
|
||||||
readonly posInfo = computed(() => this.posInfoStore.entity());
|
readonly posInfo = computed(() => this.posInfoStore.entity());
|
||||||
appVersion = '0.0.0';
|
appVersion = '0.0.0';
|
||||||
@@ -31,12 +33,15 @@ export class PosMainMenuSidebarComponent extends AbstractDialog {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.isPwaBuild = this.swUpdate.isEnabled;
|
this.isPwaBuild = this.swUpdate.isEnabled;
|
||||||
|
console.log(this.swUpdate);
|
||||||
|
|
||||||
if (!this.isPwaBuild) return;
|
if (!this.isPwaBuild) return;
|
||||||
|
|
||||||
fetch('/ngsw.json')
|
fetch('/ngsw.json')
|
||||||
.then((res) => res.json())
|
.then((res) => res.json())
|
||||||
.then((data: { appData?: { appVersion?: string } }) => {
|
.then((data: { appData?: { appVersion?: string } }) => {
|
||||||
this.appVersion = data?.appData?.appVersion || this.appVersion;
|
this.appVersion = data?.appData?.appVersion || this.appVersion;
|
||||||
|
this.toastService.info({ text: this.appVersion });
|
||||||
console.log('appVersion:', data?.appData);
|
console.log('appVersion:', data?.appData);
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { POS_ROUTES } from '@/domains/pos/routes';
|
||||||
import { InnerPagesHeaderComponent } from '@/shared/components/innerPagesHeader/inner-pages-header.component';
|
import { InnerPagesHeaderComponent } from '@/shared/components/innerPagesHeader/inner-pages-header.component';
|
||||||
import { Component, computed, inject, signal } from '@angular/core';
|
import { Component, computed, inject, signal } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
@@ -70,7 +71,7 @@ export class PosSaleInvoiceListComponent {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
activeFilterCount = computed(() => this.activeFilters().length);
|
activeFilterCount = computed(() => this.activeFilters().length);
|
||||||
backRoute = '/pos';
|
backRoute = POS_ROUTES.path || '/';
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.getData();
|
this.getData();
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import { Component, inject } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { RouterModule } from '@angular/router';
|
import { RouterModule } from '@angular/router';
|
||||||
import { ButtonModule } from 'primeng/button';
|
import { ButtonModule } from 'primeng/button';
|
||||||
import images from 'src/assets/images';
|
import images from 'src/assets/images';
|
||||||
|
import config from 'src/config';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-notfound',
|
selector: 'app-notfound',
|
||||||
@@ -12,6 +13,8 @@ import images from 'src/assets/images';
|
|||||||
export class Notfound {
|
export class Notfound {
|
||||||
readonly logo = images.logo;
|
readonly logo = images.logo;
|
||||||
|
|
||||||
|
isPosApplication = config.isPosApplication;
|
||||||
|
|
||||||
readonly notFoundListItems = [
|
readonly notFoundListItems = [
|
||||||
{
|
{
|
||||||
icon: 'pi-table',
|
icon: 'pi-table',
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
// TIS tenant environment configuration
|
// TIS tenant environment configuration
|
||||||
export const environment = {
|
export const environment = {
|
||||||
production: true,
|
production: true,
|
||||||
apiBaseUrl: 'http://194.59.214.243:5002',
|
// apiBaseUrl: 'http://194.59.214.243:5002',
|
||||||
// apiBaseUrl: 'http://192.168.128.73:5002',
|
apiBaseUrl: 'http://192.168.128.73:5002',
|
||||||
host: 'localhost',
|
host: 'localhost',
|
||||||
port: 5000,
|
port: 5000,
|
||||||
enableLogging: false,
|
enableLogging: false,
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ export interface BrandingConfig {
|
|||||||
appTitle: string;
|
appTitle: string;
|
||||||
manifestPath: string;
|
manifestPath: string;
|
||||||
themeColor: string;
|
themeColor: string;
|
||||||
|
enableInstallPrompt?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const brandingConfig: BrandingConfig = {
|
export const brandingConfig: BrandingConfig = {
|
||||||
appTitle: 'پنل مدیریت صورتحسابهای مالیاتی',
|
appTitle: 'پنل مدیریت صورتحسابهای مالیاتی',
|
||||||
manifestPath: '/favicon/site.webmanifest',
|
manifestPath: '/favicon/site.webmanifest',
|
||||||
themeColor: '#ffffff',
|
themeColor: '#ffffff',
|
||||||
|
enableInstallPrompt: false,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ export const brandingConfig: BrandingConfig = {
|
|||||||
appTitle: 'تیس - مدیریت صورتحسابهای مالیاتی',
|
appTitle: 'تیس - مدیریت صورتحسابهای مالیاتی',
|
||||||
manifestPath: '/favicon/site.webmanifest',
|
manifestPath: '/favicon/site.webmanifest',
|
||||||
themeColor: '#ffffff',
|
themeColor: '#ffffff',
|
||||||
|
enableInstallPrompt: true,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user