{"version":3,"mappings":"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","names":["constructor","C","M","this","Login","share","loginuser","storage","getData","waiterFactor","New_waiterFactor","c","e","factory","R","k","canActivate","url","authService","isUserLoggedIn","setRedirectUrl","router","navigate","getLoginUrl","canActivateChild","datevalidator","Date","getDate","getHours","n","s","path","redirectTo","pathMatch","loadChildren","Promise","then","U","OrderModule","WaiterorderModule","TableModule","HomeModule","o","LoginModule","AboutModule","ClubModule","OrdermanagementModule","SettingModule","PortalModule","GameModule","PaymentModule","FinalfactorModule","NotFoundModule","r","y","relativeLinkResolution","onSameUrlNavigation","it","rt","ot","vt","ct","getSetting","storageManager","initialiseStorageSyncListener","goodsGroupList","targetElement","setLanguage","sharemodel","language","translate","setDefaultLang","use","savePermanentData","isrtl","go","ngOnInit","x","document","body","classList","contains","isToggledUppercase","window","localStorage","getItem","JSON","parse","getTableList","api","getEntity","subscribe","tableList","j","selectors","transform","opacity","handleError","A","spinner","stopAll","message","toLowerCase","includes","hasShowError","dialog","open","$","componentInstance","title","instant","hasCancel","hasOK","afterClosed","console","error","status","errorCode","errorMessage","split","V","urlValidation","toLocaleLowerCase","intercept","isMultilanguage","sendRequest","clone","headers","set","authToken","handle","start","pipe","tt","nt","injector","bootstrap","d","X","provide","useClass","multi","t","I","l","J","imports","D","O","loader","useFactory","gt","deps","dt","et","Q","p","F","P","idle","timeout","ping","H","enabled","lt","registrationStrategy","g","dialogRef","close","confirmation","translateText","replace","callWaiters","refresh","sidemenuGarsonCall","checkNotification","headerGarsonCall","hasLogo","hasRefresh","getDigitalMenuCount","refresher","emit","afterConfirm","getFilterEntity","digitalmenuTableId","isToggleOpen","setting","showTablesPage","tableId","lastUrl","log","systemLayer","hideNotification","hasDigitalMenu","IsDigitalAlbumTransfer","isDigitalAlbum","hasTabletOrder","hasPager","toggle","i","a","b","_","super","name","value","links","isSiteOnline","cWebsite","setActiveTab","hasSwitchTabIndex","selectedtab","imageCompressor","onSelect","selected","cLink","setTimeout","createElement","onload","clearTimeout","onerror","src","baseApiUrl","apiUrl","apiDownloadUrl","apiUploadUrl","apiFileUrl","downloadFile","httpClient","request","N","reportProgress","responseType","get_unique_string","push","charAt","Math","floor","random","length","join","uploadFile","FormData","B","z","h","type","toString","m","code","goods","append","size","sizeErr","typeErr","fileErr","toast","w","W","action","ufile","pt","params","getFiles","get","setPath","fileUrl","fileName","Y","G","date","L","closeAll","DateNow","now","f","oxw","upload","selectFiles","getElementById","uploadStatus","sliders","previewImgs","totalFiles","imgUpload","files","imgPreview","remove","previewTitle","style","fontWeight","previewTitleText","createTextNode","appendChild","img","URL","createObjectURL","target","add","selectedFiles","previews","FileReader","result","readAsDataURL","service","sanitizer","bypassSecurityTrustUrl","percentage","round","loaded","total","inputFile","nativeElement","social","getSocialMedia","save","postEntity","ngUnsubscribe","goodsGroup","stringify","selectedgoods","forEach","foodtypeUrl","goodsUrl","orderTable","getTableOrder","Number","st","tableName","uploadService","reloadCurrentRoute","getLinkPicture","timeStamp","linkPicture","setLinkPicture","getTime","navigateByUrl","skipLocationChange","showUploadState","mt","click","downloadStatus","download","Blob","setAttribute","href","removeChild","ft","ngOnChange","safeFiles","showDownloadError","showProgress","showUploadError","ut","Pt","component","children","runGuardsAndResolvers","ht","u","T","Z","v","at","q","String","prototype","toAddPrefix","Array","isValid","maper","Object","keys","some","Map","SetInArray","has","_location","_snackBar","ngOnDestroy","next","complete","back","test","duration","openSnackBar","text","verticalPosition","horizontalPosition","panelClass","normalizeValidator","validator","func","validate","bind","composeValidators","validators","Validators","map","asyncValidators","Subject","EventEmitter","email","mobile","telephone","nationalcode","lockserial","number","minMax","patternKey","_pattern","change","newValue","valueChange","control","asyncValidator","of","model","patternIsOk","patterns","valid","RegExp","setErrors","invalid","setMinMax","min","max","textType","failures","key","BaseControlComponent","i0","inputs","trim","hexadecimal","useExisting","ButtonComponent","NG_VALIDATORS","NG_ASYNC_VALIDATORS","NgModel","NG_VALUE_ACCESSOR","_validator","parseInt","cyk","autocomplete","show","isshow","focusFunction","focus","focusOutFunction","numberValue","withComma","parts","onChange","numberValueChange","CorrectYeKeService","InputComponent","ctx","Ct","bt","Mt","yt","Tt","Ot","ngModule","providers","production","baseUrl","loginUrl","bootstrapModule","catch","num","FarsiDate","id","price","clubCardNo","creationTime","mergeHeaderId","discountPercent","discountAmount","serviceAmount","servicePercent","taxAmount","taxPercent","roundedAmount","phoneNumber","branchCode","description","transactionNo","errorCodePay","errorMessagePay","merchantIDPay","terminalIDPay","paymentTypeCode","flagPda","customerName","flag","waiterName","guestQty","waiterId","time","sourceFlag","pdaPrintFlag","hasCashPrint","tas","factorDetail","checked","creditPrice","digitalMenuHeaderId","sumQty","sumPrice","invoiceDetail","farsiDate","usedCredit","sumUnitPrice","qty","unitPrice","toz","instagram","telegram","twitter","facebook","whatsApp","website","navLinks","route","routeConfig","buildNavItems","filter","data","label","icon","isLinkActive","linksWithHrefs","first","isActive","urlTree","clearData","order","openFactor","waiterOrder","formBuilder","cache","deleteData","digitalMenuThem","setTheme","digitalmenuFactorCount","documentElement","currentTheme","ActivateTab","isUserAuthenticated","users","password","isloggedIn","loggedInUser","getRedirectUrl","redirectUrl","getLoggedInUser","getOrdermanagementUrl","ordermanagementUrl","logoutUser","getDiffDays","static","fromCharCode","checkNoNetwork","noNetworkMessageCaption","captionAndMessageSeparator","noNetworkMessageDetail","getResponseBody","checkAccessDenied","splice","accessDeniedMessageCaption","accessDeniedMessageDetail","checkNotFound","notFoundMessageCaption","notFoundMessageDetail","findHttpResponseMessage","getHttpResponseMessages","splitInTwo","firstPart","indexOf","secondPart","statusText","hostname","substr","hasOwnProperty","toUpperCase","slice","randomNumber","location","origin","protocol","port","getDay","getMonth","getFullYear","getMinutes","printDateOnly","printTimeOnly","setHours","setDate","toDateString","printDate","search","abs","valueOf","testIsAbsoluteUrl","removeNulls","arguments","apply","decodeURIComponent","cookie","encodeURIComponent","setItem","toUTCString","removeItem","hasItem","sessionStorage","localStorageSetItem","syncKeys","loadSyncKeys","syncKeysContains","sessionStorageSetItem","onInit","addToSessionStorageHelper","removeFromSessionStorageHelper","clearInstanceSessionStorage","addToSyncKeysHelper","removeFromSyncKeysHelper","syncListenerInitialised","addEventListener","sessionStorageTransferHandler","syncSessionStorage","deinitialiseStorageSyncListener","removeEventListener","clearAllStorage","clearAllSessionsStorage","clearLocalStorage","setSeconds","getSeconds","DBKEY_SYNC_KEYS","clear","saveSessionData","DBKEY_USER_DATA","testForInvalidKeys","removeFromSyncKeys","saveSyncedSessionData","addToSessionStorage","removeFromSessionStorage","moveDataToSessionStorage","moveDataToSyncedSessionStorage","moveDataToPermanentStorage","exists","sessionStorageGetItem","localStorageGetItem","getDataObject","getInitEvent","initEvent","asObservable","addToSyncKeysBackup","removeFromSyncKeysBackup","Error","reservedKeys","getSyncKeysFromStorage","addToSyncKeys","groupby","reduce","disconnect","connection","stop","isEnabled","Notification","permission","_notificationService","requestPermission","notify","alertContent","tag","sound","dir","generateNotification","selectedGroup","selectedFilter","assign","tableGroup","selectedGroupIndex","tables","refreshTableTimeLeft","find","playAudio","Audio","load","play","playNAudio","CompanyName","RequestType","AM","paymentType","ID","GovID","SC","invoice","connect","messages","wsService","ER","RS","SN","currentLang","toPersianNumber","toEnglishNumber","pure","tasvieh","Id","clearing","parsianpayment","warn","parsianSerice","CP","print","ParsianPrint","restaurantName","brandName","currency","pr","forbidden","isSupported","create","onshow","notification","event","onclick","onclose","badge","image","getToken","http","post","getIpCliente","testConnection","getWaiterList","getEntityById","updateEntity","put","deleteEntity","delete","subject","WebSocket","onmessage","readyState","OPEN","send"],"sources":["./src/app/login/login.service.ts","./src/services/authguard.service.ts","./src/app/app-routing.module.ts","./src/app/app.component.html","./src/app/app.component.ts","./src/services/globalerrorhandler.service.ts","./src/providers/authInterceptor.service.ts","./src/app/app.module.ts","./src/app/dialog/dialog.component.html","./src/app/dialog/dialog.component.ts","./src/app/header/header.component.html","./src/app/header/header.component.ts","./src/app/portal/portal.component.html","./src/app/portal/portal.component.ts","./src/app/portal/file-upload/upload-download.service.ts","./src/models/progress-status.model.ts","./src/app/portal/logo/logo.component.html","./src/app/portal/logo/logo.component.ts","./src/app/portal/slider/slider.component.html","./src/app/portal/slider/slider.component.ts","./src/app/portal/social/social.component.html","./src/app/portal/social/social.component.ts","./src/app/portal/goods/goods.component.html","./src/app/portal/goods/goods.component.ts","./src/app/portal/upload/upload.component.ts","./src/app/portal/upload/upload.component.html","./src/app/portal/download/download.component.ts","./src/app/portal/file-manager/file-manager.component.html","./src/app/portal/download/download.component.html","./src/app/portal/file-manager/file-manager.component.ts","./src/app/portal/portal.module.ts","./src/app/material.module.ts","./src/app/header/header.module.ts","./src/app/share.module.ts","./src/core/extended/extensions.ts","./src/core/controls/base.component.ts","./src/core/controls/shared/controls/base/validate.ts","./src/core/controls/shared/controls/base/base-control.component.ts","./src/core/controls/shared/controls/validators/hexadecimal-validator.ts","./src/core/controls/shared/controls/validators/validation.ts","./src/core/controls/shared/controls/button/button.component.ts","./src/core/controls/shared/controls/button/button.component.html","./src/core/controls/shared/controls/base/min.max.directive.ts","./src/core/controls/shared/controls/input/input.component.html","./src/core/controls/shared/controls/input/input.component.ts","./src/core/controls/shared/material.module.ts","./src/core/controls/shared/controls.mudule.ts","./src/environments/environment.ts","./src/main.ts","./src/models/enum/sourceprogram.enum.ts","./src/models/enum/state.enum.ts","./src/models/factor.model.ts","./src/models/share.model.ts","./src/models/socialmedia.model.ts","./src/models/table.model.ts","./src/models/enum/theme.enum.ts","./src/providers/sharedata.service.ts","./src/services/auth.service.ts","./src/services/correctyeke.service.ts","./src/services/utilities.ts","./src/services/local-store-manager.service.ts","./src/providers/groupby.service.ts","./src/services/order.service.ts","./src/services/parsianpos.service.ts","./src/services/persian-number.pipe.ts","./src/services/posclearing.service.ts","./src/services/push.notification.service.ts","./src/services/rest-api.service.ts","./src/services/websocket.service.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { ShareDataService } from \"../../providers/sharedata.service\";\r\nimport { LocalStoreManager } from \"../../services/local-store-manager.service\";\r\n\r\n@Injectable()\r\nexport class LoginService {\r\n constructor(private share: ShareDataService, private storage: LocalStoreManager) {\r\n }\r\n Login() {\r\n this.share.loginuser = this.storage.getData('user');\r\n if (!this.share.waiterFactor)\r\n this.share.New_waiterFactor();\r\n //if ((this.share.lastUrl === '/ordermanagement' || !this.share.setting?.systemLayer?.hasTabletOrder) && !this.share.setting?.systemLayer?.isDigitalAlbum) {\r\n //this.router.navigate(['ordermanagement']);\r\n //return;\r\n //}\r\n //if (this.share.setting && this.share.setting.showTablesPage === 0 && this.share.setting?.systemLayer?.hasTabletOrder) {\r\n // this.share.selectedGroupIndex = (!this.share.loginuser.default_Group || this.share.loginuser.default_Group === 0) ? 0 : this.share.loginuser.default_Group - 1;\r\n // this.router.navigate(['table']);\r\n // return;\r\n //}\r\n //if (this.share.setting && this.share.setting.showTablesPage !== 0 && this.share.setting?.systemLayer?.hasTabletOrder) {\r\n // this.router.navigate(['waiterorder']);\r\n // return true;\r\n //}\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CanActivate, CanActivateChild, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { debug } from 'console';\r\nimport { start } from 'repl';\r\nimport { LoginService } from 'src/app/login/login.service';\r\nimport { UserModel } from 'src/models/user.model';\r\nimport { AuthService } from './auth.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\n\r\n@Injectable()\r\nexport class AuthGuardService implements CanActivate, CanActivateChild {\r\n constructor(private authService: AuthService, private loginService: LoginService, private router: Router, private storage: LocalStoreManager) {\r\n }\r\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n const url: string = state.url;\r\n/* const request = this.storage.getData('posPaymentModelReq');*/\r\n //const hasUser: UserModel = this.storage.getData('user');\r\n //if (this.authService.isUserLoggedIn() || (hasUser && hasUser.loginDate && this.datevalidator(hasUser.loginDate))) {\r\n if (this.authService.isUserLoggedIn()) {\r\n return true;\r\n }\r\n this.authService.setRedirectUrl(url);\r\n this.router.navigate([this.authService.getLoginUrl()]);\r\n return false;\r\n }\r\n canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n // let loggedInUser= this.authService.getLoggedInUser();\r\n // if (loggedInUser.role ==='ADMIN') {\r\n // return true;\r\n // } else {\r\n // \tconsole.log('Unauthorized to open link: '+ state.url);\r\n // \treturn false;\r\n // }\r\n // }\r\n return false;\r\n }\r\n datevalidator(loginDate: Date): boolean {\r\n const endDate = new Date();\r\n const startDate = new Date(loginDate);\r\n if (endDate.getDate() !== startDate.getDate() && endDate.getHours() > startDate.getHours())\r\n return false;\r\n else\r\n return true;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { AuthGuardService } from 'src/services/authguard.service';\r\n\r\nconst routes: Routes = [\r\n { path: '', redirectTo: 'home', pathMatch: 'full' },\r\n // {path: 'home', loadChildren: () => import('./app.module').then(m => m.AppModule)},\r\n { path: 'order', loadChildren: () => import('./order/order.module').then(m => m.OrderModule) },\r\n {\r\n path: 'waiterorder', loadChildren: () => import('./waiterorder/waiterorder.module').then(m => m.WaiterorderModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'table', loadChildren: () => import('./table/table.module').then(m => m.TableModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n { path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },\r\n { path: 'login', loadChildren: () => import('./login/login.module').then(m => m.LoginModule) },\r\n { path: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) },\r\n { path: 'club', loadChildren: () => import('./club/club.module').then(m => m.ClubModule) },\r\n {\r\n path: 'ordermanagement', loadChildren: () => import('./ordermanagement/ordermanagement.module').then(m => m.OrdermanagementModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'setting', loadChildren: () => import('./setting/setting.module').then(m => m.SettingModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'portal', loadChildren: () => import('./portal/portal.module').then(m => m.PortalModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n { path: 'game', loadChildren: () => import('./game/game.module').then(m => m.GameModule) },\r\n {\r\n path: 'payment', loadChildren: () => import('./payment/payment.module').then(m => m.PaymentModule)\r\n // , canActivate: [ AuthGuardService ]\r\n },\r\n { path: 'finalfactor', loadChildren: () => import('./finalfactor/finalfactor.module').then(m => m.FinalfactorModule) },\r\n { path: '**', loadChildren: () => import('./notfound/not-found.module').then(m => m.NotFoundModule) },\r\n // {path: 'factor', loadChildren: () => import('./factor/factor.module').then(m => m.FactorModule)},\r\n\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot(routes // , //{\r\n// scrollPositionRestoration: 'enabled',\r\n// anchorScrolling: 'enabled',\r\n// scrollOffset: [0, 64] // [x, y]\r\n// }\r\n, { relativeLinkResolution: 'legacy' , onSameUrlNavigation: 'reload' })],\r\n exports: [RouterModule]\r\n})\r\nexport class AppRoutingModule { }\r\n","\r\n\r\n\r\n
\r\n
این نسخه دیجیتال منو برای تست است
\r\n \r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { LocalStoreManager } from '../services/local-store-manager.service';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { ShareModel } from 'src/models/share.model';\r\nimport { Router } from '@angular/router';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { UserIdleService } from 'angular-user-idle';\r\nimport { HttpClient } from '@angular/common/http';\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss'],\r\n animations: [\r\n trigger('enterAnimation', [\r\n transition(':enter', [\r\n style({ transform: 'translateY(-20%)', opacity: 0 }),\r\n animate('250ms', style({ transform: 'translateY(0)', opacity: 1 }))\r\n ]),\r\n transition(':leave', [\r\n style({ transform: 'translateY(0)', opacity: 1 }),\r\n animate('250ms', style({ transform: 'translateY(-20%)', opacity: 0 }))\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class AppComponent implements OnInit {\r\n title = 'SepidzDigitalMenu';\r\n\r\n isToggledUppercase = false;\r\n hideComponents = false;\r\n hideGuides = false;\r\n hideCDK = false;\r\n selectedthem = 2;\r\n // isrtl:string= 'rtl';\r\n isTestScreen = false;\r\n constructor(\r\n private breakObserver: BreakpointObserver,\r\n public translate: TranslateService,\r\n private storageManager: LocalStoreManager,\r\n public share: ShareDataService,\r\n private router: Router,\r\n private spinner: NgxUiLoaderService,\r\n private api: RestApiService,\r\n private userIdle: UserIdleService,\r\n private http: HttpClient\r\n\r\n // private auth:AuthService\r\n ) {\r\n // this.setTheme(this.storageManager.getData('Theme'));\r\n this.share.getSetting();\r\n this.storageManager.initialiseStorageSyncListener();\r\n this.share.goodsGroupList();\r\n\r\n\r\n }\r\n private get targetElement(): HTMLElement {\r\n let elem: HTMLElement;\r\n return elem;\r\n }\r\n\r\n // get isMobile() {\r\n // if (this.breakObserver.isMatched(\"(max-width: 599px)\")) {\r\n // return true;\r\n // } else {\r\n // return false;\r\n // }\r\n // }\r\n // changeTitle(title: string) {\r\n // this.title = title;\r\n // }\r\n // toggleGuides() {\r\n // this.hideGuides = !this.hideGuides;\r\n // }\r\n // toggleComponents() {\r\n // this.hideComponents = !this.hideComponents;\r\n // }\r\n // toggleUppercase() {\r\n // this.isToggledUppercase = !this.isToggledUppercase;\r\n // if (this.isToggledUppercase) {\r\n // document.body.classList.add(\"button-uppercase\");\r\n // window.localStorage.setItem(\"isToggledUppercase\", JSON.stringify(true));\r\n // } else {\r\n // document.body.classList.remove(\"button-uppercase\");\r\n // window.localStorage.setItem(\"isToggledUppercase\", JSON.stringify(false));\r\n // }\r\n // }\r\n setLanguage(lan: string) {\r\n this.share.sharemodel.language = (!lan) ? 'FA' : 'EN';\r\n // let defaultLanguage = this.translate.getDefaultLang();\r\n this.translate.setDefaultLang(lan);\r\n this.translate.use(lan);\r\n this.storageManager.savePermanentData(lan, 'Language');\r\n switch (lan) {\r\n case 'FA': {\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n case 'EN': {\r\n this.share.sharemodel.isrtl = false;\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n }\r\n }\r\n go(url: string) {\r\n // this.spinner.start();\r\n this.router.navigate([url]);\r\n // this.spinner.stopAll();\r\n }\r\n ngOnInit() {\r\n this.share.sharemodel = new ShareModel();\r\n this.share.sharemodel.language = this.storageManager.getData(\r\n 'Language'\r\n );\r\n switch (this.storageManager.getData('Language')) {\r\n case 'FA': {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n case 'EN': {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('EN');\r\n this.share.sharemodel.isrtl = false;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (document.body.classList.contains('button-uppercase')) {\r\n this.isToggledUppercase = true;\r\n } else if (window.localStorage.getItem('isToggledUppercase')) {\r\n this.isToggledUppercase = JSON.parse(\r\n window.localStorage.getItem('isToggledUppercase')\r\n );\r\n }\r\n // this.userIdle.startWatching();\r\n // // Start watching when user idle is starting.\r\n // this.userIdle.onTimerStart().subscribe(count => console.log(count));\r\n\r\n // // Start watch when time is up.\r\n // this.userIdle.onTimeout().subscribe(() => console.log('Time is up!'));\r\n }\r\n getTableList() {\r\n this.api.getEntity('AllTables').subscribe(res => {\r\n this.share.tableList = res;\r\n });\r\n }\r\n // @HostListener('click', ['$event'])\r\n // onClick(event: MouseEvent) {\r\n // this.userIdle.stopTimer();\r\n // }\r\n // @HostListener('document:keydown', ['$event'])\r\n // onKeydownHandler(event: KeyboardEvent) {\r\n // this.userIdle.stopTimer();\r\n // }\r\n}\r\n","import { Injectable, ErrorHandler } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { MatDialog } from '@angular/material';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { DialogComponent } from 'src/app/dialog/dialog.component';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GlobalErrorHandlerService implements ErrorHandler {\r\n errorCode: number;\r\n errorMessage: string;\r\n hasShowError: boolean;\r\n constructor(\r\n public dialog: MatDialog,\r\n public translate: TranslateService,\r\n private spinner: NgxUiLoaderService,\r\n ) { }\r\n handleError(error: any) {\r\n if (error instanceof HttpErrorResponse) {\r\n this.spinner.stopAll();\r\n if(error.message.toLowerCase().includes(`web server received an invalid response`)){\r\n this.hasShowError = true;\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = this.translate.instant('Message.ConnectionSuccessful');\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.hasOK = false;\r\n dialogRef.componentInstance.message = `${error.message}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n this.hasShowError = false;\r\n });\r\n return;\r\n }\r\n // Backend returns unsuccessful response codes such as 404, 500 etc.\r\n console.error('Backend returned status code: ', error.status);\r\n console.error('Response body:', error.message);\r\n this.errorCode = error.status;\r\n switch (error.status) {\r\n case 0:\r\n this.errorMessage = this.translate.instant('Errors.ConnectionFailed');\r\n break;\r\n\r\n default:\r\n this.errorMessage = error.message;\r\n break;\r\n }\r\n if ((error.error)) {\r\n this.errorMessage = error.error.split('at')[0];\r\n }\r\n this.spinner.stopAll();\r\n if (!this.hasShowError) {\r\n this.hasShowError = true;\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = this.translate.instant('MessageHeader.Error');\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `${this.errorMessage}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n this.hasShowError = false;\r\n });\r\n }\r\n // throw(this.errorMessage);\r\n } else {\r\n // A client-side or network error occurred.\r\n console.error('An error occurred:', error.message);\r\n const err = error.message.toLowerCase();\r\n if (!err.includes('scrollintoview') && !err.includes('minposition') && !err.includes('maxposition') ) {\r\n this.spinner.stopAll();\r\n if (!this.hasShowError) {\r\n this.hasShowError = true;\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = this.translate.instant('MessageHeader.Error');\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.hasOK = false;\r\n dialogRef.componentInstance.message = `${error.message}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n this.hasShowError = false;\r\n });\r\n }\r\n }\r\n // this.message.showMessage('',error.message);\r\n }\r\n this.spinner.stopAll();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent, HttpResponse, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable } from 'rxjs-compat';\r\n\r\nimport { AuthService } from 'src/services/auth.service';\r\nimport { LocalStoreManager } from 'src/services/local-store-manager.service';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\nimport { tap } from 'rxjs/operators/tap';\r\n\r\nconst TTL = 40;\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n authToken: string;\r\n constructor(\r\n private auth: AuthService,\r\n private cache: LocalStoreManager,\r\n private spinner: NgxUiLoaderService,\r\n ) {\r\n }\r\n urlValidation(req: HttpRequest): boolean {\r\n const filte = req.url.toLocaleLowerCase();\r\n const validation = filte.includes('i18n') || filte.includes('test') || filte.includes('waiters') || filte.includes('token') || filte.includes('goodsgrouplist') || filte.includes('setting') || filte.includes('savefactor') || filte.includes('tables') || filte.includes('Waiters')\r\n || filte.includes('GetFactor') || filte.includes('IntegratedFactor') || filte.includes('UpdateFactors') || filte.includes('CheckInventory') || filte.includes('TablesGroup') || filte.includes('GetTableFactor')\r\n || filte.includes('UpdateFactorState') || filte.includes('TableHasOrder') || filte.includes('CallWaiters')\r\n || filte.includes('GetTableOrder') || filte.includes('SystemValidation') || filte.includes('GetTableTimeLeft')\r\n || filte.includes('GetDigitalMenuFactorCount') || filte.includes('SystemLanguage') || filte.includes('OnlinePaymentResult')|| filte.includes('SocialMedia')\r\n || filte.includes('AllTables');\r\n return validation;\r\n }\r\n intercept(req: HttpRequest, next: HttpHandler) {\r\n //if (req && !req.url.includes('/i18n/') ) {\r\n // this.spinner.start();\r\n //}\r\n if (!this.urlValidation(req)) {\r\n //this.authToken = this.auth.getAuthorizationToken();\r\n const authReq = req.clone({\r\n headers: req.headers.set('Authorization', 'Bearer ' + this.authToken)\r\n });\r\n if (!this.isMultilanguage(authReq)) {\r\n // this.messge.present();\r\n }\r\n //this.spinner.stopAll();\r\n return next.handle(authReq);\r\n // return this.sendRequest(authReq, next);\r\n } else {\r\n if (!this.isMultilanguage(req)) {\r\n // this.messge.present();\r\n }\r\n // return next.handle(req);\r\n return this.sendRequest(req, next);\r\n }\r\n }\r\n isMultilanguage(req: HttpRequest): boolean {\r\n const filte = req.url.toLocaleLowerCase();\r\n const validation = filte.includes('i18n');\r\n return validation;\r\n }\r\n\r\n sendRequest(\r\n req: HttpRequest,\r\n next: HttpHandler\r\n ): Observable> {\r\n // try {\r\n if (req && !req.url.includes('/i18n/')) {\r\n this.spinner.start();\r\n }\r\n return next.handle(req).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n // if (event.url !== 'http://localhost:2121/GoodsGroupList') {\r\n // this.spinner.stop();\r\n // }\r\n this.spinner.stopAll();\r\n }\r\n if (event instanceof HttpErrorResponse) {\r\n this.spinner.stopAll();\r\n }\r\n // this.spinner.stopAll();\r\n })\r\n );\r\n // } catch (error) {\r\n // this.spinner.stopAll();\r\n // return next.handle(req);\r\n // }\r\n }\r\n}\r\n","import { NgModule, ErrorHandler, Injector } from '@angular/core';\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { AppComponent } from './app.component';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\nimport { LocalStoreManager } from 'src/services/local-store-manager.service';\r\nimport { DialogComponent } from './dialog/dialog.component';\r\nimport { GlobalErrorHandlerService } from 'src/services/globalerrorhandler.service';\r\nimport { AuthInterceptor } from 'src/providers/authInterceptor.service';\r\nimport { AuthService } from 'src/services/auth.service';\r\nimport { NgxUiLoaderModule } from 'ngx-ui-loader';\r\nimport { AuthGuardService } from 'src/services/authguard.service';\r\nimport { ShareModule } from './share.module';\r\nimport { ControlsModule } from 'src/core/controls/shared/controls.mudule';\r\nimport { ToastrModule } from 'ngx-toastr';\r\nimport { SepidzToastComponent } from 'src/core/controls/shared/controls/toaster/SepidzToast.component';\r\nimport { DescriptionDialogComponent } from './orderdescription/description-dialog.component';\r\nimport { UserIdleModule } from 'angular-user-idle';\r\nimport { LoginService } from './login/login.service';\r\nimport { WebsocketService } from 'src/services/websocket.service';\r\nimport { ParsianPosService } from 'src/services/parsianpos.service';\r\nimport { PosClearingService } from 'src/services/posclearing.service';\r\nimport { InvoiceComponent } from './invoice/invoice.component';\r\nimport { PortalModule } from './portal/portal.module';\r\nimport { ServiceWorkerModule } from '@angular/service-worker';\r\nimport { environment } from '../environments/environment';\r\nimport { PushNotificationsService } from 'src/services/push.notification.service';\r\n\r\nexport function createTranslateLoader(http: HttpClient) {\r\n return new TranslateHttpLoader(http, './assets/i18n/', '.json');\r\n}\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n DialogComponent,\r\n SepidzToastComponent,\r\n DescriptionDialogComponent,\r\n InvoiceComponent\r\n ],\r\n imports: [\r\n // BrowserModule,\r\n HttpClientModule,\r\n ToastrModule.forRoot(\r\n // {toastComponent: SepidzToastComponent, // added custom toast!\r\n // }\r\n ),\r\n TranslateModule.forRoot({\r\n loader: {\r\n provide: TranslateLoader,\r\n useFactory: createTranslateLoader,\r\n deps: [HttpClient]\r\n }\r\n }),\r\n AppRoutingModule,\r\n BrowserAnimationsModule,\r\n ShareModule,\r\n ControlsModule,\r\n NgxUiLoaderModule,\r\n PortalModule,\r\n UserIdleModule.forRoot({ idle: 15, timeout: 5, ping: 3 }),\r\n ServiceWorkerModule.register('ngsw-worker.js', {\r\n enabled: environment.production,\r\n // Register the ServiceWorker as soon as the app is stable\r\n // or after 30 seconds (whichever comes first).\r\n registrationStrategy: 'registerWhenStable:30000'\r\n })\r\n // SlideshowModule\r\n // ShareModule\r\n ],\r\n providers: [AuthGuardService, HttpClientModule, LocalStoreManager,\r\n GlobalErrorHandlerService, PushNotificationsService,\r\n { provide: ErrorHandler, useClass: GlobalErrorHandlerService },\r\n {\r\n provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true\r\n },\r\n AuthService,\r\n LoginService,\r\n WebsocketService,\r\n ParsianPosService,\r\n PosClearingService\r\n ],\r\n exports: [],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule {\r\n static injector: Injector;\r\n constructor(injector: Injector) {\r\n AppModule.injector = injector;\r\n }\r\n}\r\n","

{{title}}

\r\n\r\n
\r\n

{{message}}

\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { MatDialogRef } from '@angular/material';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-dialog',\r\n templateUrl: './dialog.component.html',\r\n styleUrls: ['./dialog.component.scss']\r\n})\r\nexport class DialogComponent implements OnInit {\r\n title = '';\r\n message = '';\r\n hasCancel: boolean;\r\n hasOK: boolean;\r\n constructor(public dialogRef: MatDialogRef\r\n , protected translateText: TranslateService) {\r\n }\r\n ngOnInit() {\r\n if (!this.message || this.message === '') {\r\n this.dialogRef.close();\r\n }\r\n }\r\n confirmation(middleMessage: string) {\r\n this.hasCancel = true;\r\n this.hasOK = true;\r\n this.title = this.translateText.instant('Public.Attention');\r\n this.message = this.translateText.instant('Message.Confirm');\r\n this.message = this.message.replace('{0}', middleMessage);\r\n }\r\n}\r\n","
\r\n
\r\n \r\n \r\n
\r\n {{this.share.loginuser ? this.share.loginuser.name : ''}}\r\n
\r\n
\r\n
\r\n \"logo\"\r\n
\r\n
\r\n \r\n\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n SEPIDZ\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
www.SEPIDZ.com 2.0.0909.1.0
\r\n
\r\n
\r\n","import { Component, OnInit, Input, Output, EventEmitter, TRANSLATIONS } from '@angular/core';\r\nimport { ShareModel } from '../../models/share.model';\r\nimport { LocalStoreManager } from '../../services/local-store-manager.service';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { ShareDataService } from '../../providers/sharedata.service';\r\n\r\nimport { Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { DialogComponent } from '../dialog/dialog.component';\r\nimport { MatDialog } from '@angular/material';\r\n\r\n@Component({\r\n selector: 'app-header',\r\n templateUrl: './header.component.html',\r\n styleUrls: ['./header.component.scss']\r\n})\r\nexport class HeaderComponent implements OnInit {\r\n @Input('title') title: string;\r\n @Input('url') url?: string;\r\n @Input('hasLogo') hasLogo: boolean;\r\n @Input('hasRefresh') hasRefresh: boolean;\r\n @Input('hasPager') hasPager: boolean;\r\n @Input('hasnotification') hasnotification: boolean;\r\n @Output() refresher: EventEmitter = new EventEmitter();\r\n\r\n isToggledUppercase = false;\r\n hideComponents = false;\r\n hideGuides = false;\r\n hideCDK = false;\r\n selectedthem = 2;\r\n isToggleOpen = false;\r\n currenturl = '';\r\n hideNotification: boolean = false;\r\n sidemenuGarsonCall: boolean; headerGarsonCall: boolean;\r\n constructor(\r\n private breakObserver: BreakpointObserver,\r\n private storageManager: LocalStoreManager,\r\n public share: ShareDataService,\r\n protected router: Router,\r\n protected translate: TranslateService,\r\n protected api: RestApiService,\r\n protected dialog: MatDialog\r\n ) {\r\n this.storageManager.initialiseStorageSyncListener();\r\n // this.spinner.stopAll();\r\n }\r\n ngOnInit() {\r\n this.sidemenuGarsonCall = this.checkNotification('sidemenu');\r\n this.headerGarsonCall = this.checkNotification();\r\n if (!(this.hasLogo)) {\r\n this.hasLogo = false;\r\n }\r\n if (!(this.hasRefresh)) {\r\n this.hasRefresh = false;\r\n }\r\n this.share.sharemodel = new ShareModel();\r\n this.share.sharemodel.language = this.storageManager.getData(\r\n 'Language'\r\n );\r\n switch (this.storageManager.getData('Language')) {\r\n case 'FA': {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n case 'EN': {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('EN');\r\n this.share.sharemodel.isrtl = false;\r\n this.share.sharemodel.language = 'EN';\r\n\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n }\r\n }\r\n setLanguage(lan: string) {\r\n this.share.sharemodel.language = lan;\r\n // let defaultLanguage = this.translate.getDefaultLang();\r\n this.translate.setDefaultLang(lan);\r\n this.translate.use(lan);\r\n this.storageManager.savePermanentData(lan, 'Language');\r\n switch (lan) {\r\n case 'FA': {\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n case 'EN': {\r\n this.share.sharemodel.isrtl = false;\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n }\r\n }\r\n refresh() {\r\n this.share.getDigitalMenuCount();\r\n this.refresher.emit(this.url);\r\n }\r\n callWaiters() {\r\n this.confirmation(this.translate.instant('MainPage.GarsonCall'));\r\n }\r\n confirmation(title: string) {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.confirmation(title);\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result === 'Ok') {\r\n this.afterConfirm();\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n afterConfirm() {\r\n this.api.getFilterEntity('CallWaiters', this.share.digitalmenuTableId).subscribe((res: number) => {\r\n this.isToggleOpen = false;\r\n });\r\n this.isToggleOpen = false;\r\n }\r\n go(url: string) {\r\n this.isToggleOpen = !this.isToggleOpen;\r\n if (url === 'waiterorder') {\r\n if (this.share.setting.showTablesPage === 0) {\r\n url = 'table';\r\n } else {\r\n url = 'waiterorder';\r\n }\r\n }\r\n if (url === 'order/TableId/' && this.share.tableId && this.share.tableId != '')\r\n url = url + this.share.tableId\r\n if (url === 'order/TableId/' && (!this.share.tableId || this.share.tableId != '')) {\r\n this.share.tableId = '1';\r\n url = url + this.share.tableId;\r\n }\r\n this.share.lastUrl = '/' + url;\r\n console.log(this.share.lastUrl);\r\n // this.spinner.start();\r\n this.router.navigate(['/' + url]);\r\n // this.spinner.stopAll();\r\n }\r\n\r\n //---- @checkNotification ----\r\n //home و tableid/0 اگر در کنار لایسنس منوی آنلاین ، نسخه کلاینت اندروید در لایسنس موجود بود به جز صفحات \r\n //اگر دیجیتال منو بود یا تبدیل منوی آنلاین به دیجیتال منو بود هم نمایش بده\r\n //تمامی میزها دارای فراخوانی گارسون خواهند بود.\r\n //-----\r\n checkNotification(x?: string): boolean {\r\n let systemLayer = this.share.setting.systemLayer;\r\n if (this.router.url == \"/home\") { this.hideNotification = true; return false; }\r\n if (this.router.url == \"/table\" || this.router.url == \"/setting\" || this.router.url == \"/portal\" || this.router.url == \"/ordermanagement\" || this.router.url == \"/waiterorder\") { this.hideNotification = true; return false; }\r\n \r\n if (this.share.tableId === '0' || this.router.url === \"/order/TableId/0\") {\r\n this.hideNotification = true;\r\n return false;\r\n }\r\n\r\n if (systemLayer.hasDigitalMenu || systemLayer.IsDigitalAlbumTransfer)\r\n this.hideNotification = false;\r\n\r\n if(systemLayer.isDigitalAlbum && systemLayer.hasTabletOrder === false)\r\n this.hideNotification = true;\r\n\r\n if (this.share.tableId === '0')\r\n this.hideNotification = true;\r\n else if (this.share.setting.systemLayer.isDigitalAlbum && this.share.setting.systemLayer.hasTabletOrder)\r\n this.hideNotification = false;\r\n\r\n if(systemLayer.isDigitalAlbum && systemLayer.hasTabletOrder)\r\n this.hideNotification = false;\r\n\r\n if (x == 'sidemenu' && this.hasPager && this.hideNotification)\r\n return true;\r\n if (this.hasPager && this.share.setting.systemLayer.hasDigitalMenu && this.share.tableId !== \"0\")\r\n return true;\r\n\r\n return true;\r\n }\r\n\r\n // isGarsonCall() {\r\n // if (this.router.url == \"/home\") { return false; }\r\n\r\n \r\n // let systemLayer = this.share.setting.systemLayer;\r\n // if(systemLayer.hasTabletOrder)\r\n // }\r\n}\r\n","\r\n\r\n
\r\n

portal works!

\r\n\r\n \r\n \r\n\r\n
","import { Component, OnInit } from '@angular/core';\r\nimport { ThemePalette } from '@angular/material/core';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { OrderService } from 'src/services/order.service';\r\nimport { ShareModule } from '../share.module';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\n\r\n@Component({\r\n selector: 'app-portal',\r\n templateUrl: './portal.component.html',\r\n styleUrls: ['./portal.component.scss'],\r\n})\r\nexport class PortalComponent extends BaseComponent implements OnInit {\r\n title: string = \"Digital-Menu Portal\";\r\n selected: string;\r\n printed: string;\r\n \r\n cWebsite: string;\r\n cLink: boolean=true;\r\n\r\n // LogoFormControl = new FormControl('');\r\n\r\n options = [\r\n { name: \"Logo\", value: 1 },\r\n { name: \"Goods\", value: 2 },\r\n { name: \"Slider\", value: 3 },\r\n { name: \"social media\", value: 4 }\r\n ]\r\n\r\n links: object[] = [\r\n {name: 'کد گروه کالا'},\r\n {name: 'کد لیست کالا'}\r\n ];\r\n canChange = true;\r\n isFinish: boolean = true;\r\n\r\n activeLink = this.links[0];\r\n background: ThemePalette = undefined;\r\n \r\n constructor(\r\n public shared: ShareModule,\r\n public share: ShareDataService,\r\n private order: OrderService,\r\n private spinner: NgxUiLoaderService) {\r\n super();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.share.lastUrl = 'portal';\r\n\r\n this.isSiteOnline(\"https://imageresizer.com/image-compressor\",found =>{\r\n if(found) {\r\n // site is online\r\n this.cWebsite = \"https://imageresizer.com/image-compressor\";\r\n }\r\n else {\r\n this.cWebsite= \"https://www.freeconvert.com/image-converter\";\r\n }\r\n });\r\n }\r\n\r\n setActiveTab(event: any) {\r\n if (event === 1)\r\n this.share.hasSwitchTabIndex = true;\r\n switch (this.share.selectedtab) {\r\n case 0: // index of the tab\r\n this.router.navigate(['/portal/logo']);\r\n break;\r\n case 1:\r\n this.router.navigate(['/portal/goods']);\r\n break;\r\n case 2:\r\n this.router.navigate(['/portal/slider']);\r\n break;\r\n case 3:\r\n this.router.navigate(['/portal/social']);\r\n break;\r\n }\r\n this.imageCompressor();\r\n }\r\n\r\n onSelect(evt: any) {\r\n this.selected = evt.value;\r\n console.log(this.selected);\r\n }\r\n\r\n imageCompressor() { \r\n switch (this.share.selectedtab) {\r\n case 3:\r\n this.cLink = false;\r\n break;\r\n default:\r\n this.cLink = true;\r\n break;\r\n } \r\n }\r\n\r\n isSiteOnline(url,callback) {\r\n // try to load favicon\r\n var timer = setTimeout(function(){\r\n // timeout after 5 seconds\r\n callback(false);\r\n },5000)\r\n\r\n var img = document.createElement(\"img\");\r\n img.onload = function() {\r\n clearTimeout(timer);\r\n callback(true);\r\n }\r\n\r\n img.onerror = function() {\r\n clearTimeout(timer);\r\n callback(false);\r\n }\r\n\r\n img.src = url+\"/favicon.ico\";\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpRequest, HttpEvent, HttpResponse, HttpParams, HttpHeaders } from '@angular/common/http';\r\nimport { of, Observable } from 'rxjs';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { GoodsModel } from 'src/models/goods.model';\r\nimport { GoodsGroupModel } from 'src/models/goodsgroup.model';\r\n\r\n@Injectable()\r\nexport class UploadDownloadService extends BaseComponent {\r\n private baseApiUrl: string;\r\n private apiDownloadUrl: string;\r\n private apiUploadUrl: string;\r\n private apiFileUrl: any;\r\n\r\n sizeErr: number;\r\n typeErr: any;\r\n fileErr: string;\r\n\r\n fileUrl: any;\r\n fileName: string;\r\n\r\n gg: GoodsGroupModel;\r\n goods: GoodsModel;\r\n\r\n constructor(private httpClient: HttpClient,public share: ShareDataService) {\r\n super();\r\n this.baseApiUrl = this.api.apiUrl + '/api/';\r\n this.apiDownloadUrl = this.baseApiUrl + 'download';\r\n this.apiUploadUrl = this.baseApiUrl + 'upload';\r\n this.apiFileUrl = this.baseApiUrl + 'files';\r\n }\r\n\r\n public downloadFile(file: string): Observable> {\r\n return this.httpClient.request(new HttpRequest(\r\n 'GET',\r\n `${this.apiDownloadUrl}?file=${file}`,\r\n null,\r\n {\r\n reportProgress: true,\r\n responseType: 'blob'\r\n }));\r\n }\r\n\r\n get_unique_string (strLength, charSet=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") {\r\n var result = [];\r\n\r\n strLength = strLength || 5;\r\n charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n\r\n while (--strLength) {\r\n result.push(charSet.charAt(Math.floor(Math.random() * charSet.length)));\r\n }\r\n\r\n return result.join('');\r\n }\r\n\r\n public uploadFile(file: Blob, action: string, data?: any): Observable> {\r\n const formData = new FormData();\r\n const emptyData = new FormData();\r\n let aName;\r\n let file_name_array = file.type.toString().split(\"/\");\r\n let file_extension = file_name_array[1];\r\n const actionType = action;\r\n\r\n switch (action) {\r\n case \"default\": aName=action;\r\n action = this.get_unique_string(\"8\")+\".\" + file_extension;\r\n break;\r\n case \"logo\":\r\n aName=action;\r\n action += \".png\";\r\n break;\r\n case \"foodtype\":\r\n aName=action;\r\n if (file_extension !== \"png\") action = data.code + \".\" + 'png'; else action = data.code + \".\" + file_extension;\r\n break;\r\n case \"goods\":\r\n aName=action;\r\n this.goods = data;\r\n action = this.goods.code + \".\"+'jpg';\r\n break;\r\n case \"slider\":\r\n aName=action;\r\n action = data+\".\"+'jpg';\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n formData.append('file', file, action);\r\n \r\n if(aName == \"logo\" && file.size > 150000) {\r\n console.error('LOGO/لوگو is too big! '+ file_extension +' '+ file.size);\r\n this.sizeErr = file.size; this.typeErr = file.type;\r\n this.fileErr = 'حجم لوگو بیشتر از حد مجاز است!';\r\n this.toast( 'حجم لوگو بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST',this.apiUploadUrl,emptyData,{reportProgress: true}));\r\n }\r\n if (aName == \"goods\" && file.size > 500000) { //اگر حجم فایل بزرگ تر از 500 کیلوبایت بود، خطا\r\n console.error('تصویرکالا is too big! '+ file_extension +' '+ file.size);\r\n this.sizeErr = file.size; this.typeErr = file.type;\r\n this.fileErr = 'حجم تصویر بیشتر از حد مجاز است!';\r\n this.toast( 'حجم تصویر بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST',this.apiUploadUrl,emptyData,{reportProgress: true}));\r\n }\r\n if (aName == \"foodtype\" && file.size > 500000) {\r\n console.error('تصویر سرگروه is too big! ' + file_extension + ' ' + file.size);\r\n this.sizeErr = file.size; this.typeErr = file.type;\r\n this.fileErr = 'حجم تصویر بیشتر از حد مجاز است!';\r\n this.toast('حجم تصویر بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST', this.apiUploadUrl, emptyData, { reportProgress: true }));\r\n }\r\n if (aName == \"slider\" && file.size > 500000) {\r\n this.fileErr = 'حجم تصویر اسلاید بیشتر از حد مجاز است!';\r\n this.toast('حجم تصویر اسلاید بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST', this.apiUploadUrl, emptyData, { reportProgress: true }));\r\n }\r\n const fileUpload = new FileUploadModel();\r\n fileUpload.action = actionType;\r\n fileUpload.ufile = file;\r\n let params = new HttpParams();\r\n params.append('Action', '1');\r\n formData.append('Action', actionType);\r\n // .set('password','12345678');\r\n return this.httpClient.request(new HttpRequest(\r\n 'POST',\r\n this.apiUploadUrl,\r\n formData,\r\n {\r\n reportProgress: true,\r\n params: params,\r\n }\r\n ));\r\n }\r\n\r\n\r\n public getFiles(): Observable {\r\n return this.httpClient.get(this.apiFileUrl);\r\n }\r\n\r\n setPath(file: any) {\r\n this.fileUrl = file;\r\n this.fileName = file.name;\r\n }\r\n}\r\nexport class FileUploadModel{\r\n public ufile :any;\r\n public action :any;\r\n}\r\n","export interface ProgressStatus {\r\n status: ProgressStatusEnum;\r\n percentage?: number;\r\n}\r\n \r\nexport enum ProgressStatusEnum {\r\n START, COMPLETE, IN_PROGRESS, ERROR\r\n}","
\r\n {{ 'Portal.Hint.Logo' | translate | persianNumber}}\r\n \"\"\r\n \r\n {{uploadService.typeErr}}\r\n \r\n \r\n {{ 'Portal.Hint.Logo' | translate }}\r\n \r\n \r\n
\r\n","import {Component, OnInit, ViewChild, ElementRef} from '@angular/core';\r\n\r\nimport {HttpEventType, HttpErrorResponse} from '@angular/common/http';\r\n\r\nimport {of} from 'rxjs';\r\n\r\nimport {catchError, map} from 'rxjs/operators';\r\n\r\nimport {FileUploadService} from '../file-upload/remote/file-upload.service';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { ShareService } from 'src/services/share.service';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { DialogComponent } from 'src/app/dialog/dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\n\r\n@Component({\r\n selector: 'app-logo',\r\n templateUrl: './logo.component.html',\r\n styleUrls: ['./logo.component.scss']\r\n})\r\nexport class LogoComponent implements OnInit {\r\n loading: boolean = false;\r\n loader: string;\r\n fileName: string;\r\n selectedFile: FormData;\r\n DateNow: string;\r\n \r\n constructor(public uploadService: UploadDownloadService, public router: Router, public share: ShareDataService,public dialog: MatDialog) { }\r\n \r\n\r\n ngOnInit(): void {\r\n this.date();\r\n }\r\n\r\n confirmation(title: string) {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.confirmation(title);\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result === 'Ok') {\r\n this.dialog.closeAll();\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n date(): void { this.DateNow = `?${Date.now()}`; }\r\n\r\n}\r\n","
\r\n {{ 'Portal.Hint.Images' | translate | persianNumber}}\r\n
\r\n

{{ 'Portal.Menu.Images' | translate }}

\r\n
\r\n
\r\n \r\n +\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n","import { HttpEventType } from '@angular/common/http';\r\nimport { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ProgressStatus, ProgressStatusEnum } from 'src/models/progress-status.model';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\n\r\n@Component({\r\n selector: 'app-slider',\r\n templateUrl: './slider.component.html',\r\n styleUrls: ['./slider.component.scss']\r\n})\r\nexport class SliderComponent implements OnInit {\r\n\r\n imgUpload: any;\r\n previews: string[] = [];\r\n selectedFiles?: FileList;\r\n imgPreview = document.getElementById('img_preview');\r\n imgUploadForm = document.getElementById('img-upload-form');\r\n totalFiles: any;\r\n previewTitle: any;\r\n previewTitleText: any;\r\n img: any;\r\n sliders: object[];\r\n \r\n @Input() public disabled: boolean;\r\n @Output() public uploadStatus: EventEmitter;\r\n @ViewChild('inputFile') inputFile: ElementRef;\r\n @Output() public showUploadState: any;\r\n DateNow: string;\r\n\r\n constructor(public service: UploadDownloadService,public share: ShareDataService,private sanitizer: DomSanitizer,public dialog: MatDialog) { \r\n this.uploadStatus = new EventEmitter();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.date();\r\n this.sliders = [\r\n {'name': 'slider1', 'src': '/1'},\r\n {'name': 'slider2', 'src': '/2'},\r\n {'name': 'slider3', 'src': '/3'},\r\n {'name': 'slider4', 'src': '/4'},\r\n {'name': 'slider5', 'src': '/5'},\r\n {'name': 'slider6', 'src': '/6'}\r\n ]\r\n }\r\n\r\npreviewImgs(event) {\r\n this.totalFiles = this.imgUpload.files;\r\n \r\n if(!!this.totalFiles) {\r\n this.imgPreview.classList.remove('quote-imgs-thumbs--hidden');\r\n this.previewTitle = document.createElement('p');\r\n this.previewTitle.style.fontWeight = 'bold';\r\n this.previewTitleText = document.createTextNode(this.totalFiles + ' Total Images Selected');\r\n this.previewTitle.appendChild(this.previewTitleText);\r\n this.imgPreview.appendChild(this.previewTitle);\r\n }\r\n \r\n for(var i = 0; i < this.totalFiles; i++) {\r\n this.img = document.createElement('img');\r\n this.img.src = URL.createObjectURL(event.target.files[i]);\r\n this.img.classList.add('img-preview-thumb');\r\n this.imgPreview.appendChild(this.img);\r\n }\r\n}\r\n\r\nselectFiles(event: any): void {\r\n this.selectedFiles = event.target.files;\r\n\r\n this.previews = [];\r\n if (this.selectedFiles && this.selectedFiles[0]) {\r\n const numberOfFiles = this.selectedFiles.length;\r\n for (let i = 0; i < numberOfFiles; i++) {\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n this.previews.push(e.target.result);\r\n };\r\n\r\n reader.readAsDataURL(this.selectedFiles[i]);\r\n }\r\n }\r\n}\r\n\r\npublic upload(event, action: string, sdata: string) {\r\n if (event.target.files && event.target.files.length > 0) {\r\n const file = event.target.files[0];\r\n this.service.setPath(this.sanitizer.bypassSecurityTrustUrl(file));\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.service.uploadFile(file, action, sdata).subscribe(\r\n data => {\r\n if (data && data.type !== 0) {\r\n switch (data.type) {\r\n case HttpEventType.UploadProgress:\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.date();\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n //this.showUploadState = \"حجم فایل های آپلود شده بیشتر از حد مجاز است!\";\r\n break;\r\n }\r\n }\r\n },\r\n error => {\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n}\r\n\r\ndate(): void { this.DateNow = `?${Date.now()}`; }\r\n\r\n}\r\n","
\r\n {{ 'Portal.Hint.Social' | translate }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
","import { Component, OnInit } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { SocialMedia } from 'src/models/socialmedia.model';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\n\r\n@Component({\r\n selector: 'app-social',\r\n templateUrl: './social.component.html',\r\n styleUrls: ['./social.component.scss']\r\n})\r\nexport class SocialComponent extends BaseComponent implements OnInit {\r\n\r\n ngUnsubscribe = new Subject();\r\n social: SocialMedia;\r\n\r\n constructor(protected api: RestApiService) { super(); }\r\n\r\n ngOnInit(): void {\r\n this.social = new SocialMedia();\r\n this.getSocialMedia();\r\n }\r\n\r\n save() {\r\n this.api.postEntity(this.social, 'SocialMedia')\r\n .pipe(takeUntil(this.ngUnsubscribe)).subscribe( data => {\r\n if(data) this.toast(\"✓ شبکه های اجتماعی ذخیره شد\");\r\n })\r\n }\r\n\r\n getSocialMedia() {\r\n this.api.getEntity('GetSocialMedia')\r\n .pipe(takeUntil(this.ngUnsubscribe)).subscribe( data => {\r\n if(data)\r\n this.social = data[0];\r\n console.log(data);\r\n });\r\n }\r\n}\r\n","
\r\n {{ 'Portal.Hint.Goods' | translate }}\r\n {{ 'Portal.Hint.Goods' | translate }}\r\n
    \r\n
  • \r\n
    \r\n
    \r\n \"FoodImage\"\r\n
    \r\n
    \r\n
    \r\n {{gg.nameLatin && !share.sharemodel.isrtl ? gg.nameLatin : gg.name}}\r\n
    \r\n
    \r\n
    \r\n
      \r\n
    • \r\n
      \r\n
      \r\n {{goods.code | persianNumber}}\r\n \"FoodImage\"\r\n
      \r\n {{goods.name}}\r\n
    • \r\n
    \r\n
  • \r\n
\r\n
\r\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { GoodsModel } from 'src/models/goods.model';\r\nimport { GoodsGroupModel } from 'src/models/goodsgroup.model';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ProgressStatus, ProgressStatusEnum } from 'src/models/progress-status.model';\r\nimport { HttpEventType } from '@angular/common/http';\r\n\r\n@Component({\r\n selector: 'app-goods',\r\n templateUrl: './goods.component.html',\r\n styleUrls: ['./goods.component.scss']\r\n})\r\nexport class GoodsComponent extends BaseComponent implements OnInit {\r\n\r\n @Input() public disabled: boolean;\r\n @Output() public uploadStatus: EventEmitter;\r\n @ViewChild('inputFile') inputFile: ElementRef;\r\n @ViewChild(\"myFoodElem\") myFoodElem: ElementRef;\r\n @ViewChild(\"myFoodtypeElem\") myFoodtypeElem: ElementRef;\r\n goodsGroup: GoodsGroupModel[];\r\n selectedGoodsGroup: GoodsGroupModel;\r\n firstGoodsGroup: GoodsGroupModel;\r\n selectedIndex = 0;\r\n selectedGoodsGroupIndex = 0;\r\n selectedgoods: GoodsModel[]; timeStamp: any; linkPicture: string;\r\n DateNow: string;\r\n\r\n constructor(public share: ShareDataService, public uploadService: UploadDownloadService,\r\n private sanitizer: DomSanitizer) {\r\n super();\r\n this.uploadStatus = new EventEmitter();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.goodsGroupList(); this.date();\r\n }\r\n\r\n goodsGroupList() {\r\n if (!(this.share.goodsGroup)) {\r\n this.goodsGroup = null;\r\n this.api.getEntity('GoodsGroupList')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(res => {\r\n this.goodsGroup = res;\r\n this.share.goodsGroup = JSON.parse(JSON.stringify(this.goodsGroup));\r\n this.goodsGroup.forEach(e => {\r\n e.foodtypeUrl = '../../../assets/imgs/foodtype/' + e.code + '.png';\r\n e.goods.forEach(ele => {\r\n ele.goodsUrl = '../../../assets/imgs/' + ele.code + '.jpg';\r\n });\r\n });\r\n });\r\n } else {\r\n this.goodsGroup = JSON.parse(JSON.stringify(this.share.goodsGroup));\r\n this.selectedgoods = null;\r\n this.goodsGroup.forEach(e => {\r\n e.foodtypeUrl = '../../../assets/imgs/foodtype/' + e.code + '.png';\r\n e.goods.forEach(ele => {\r\n ele.goodsUrl = '../../../assets/imgs/' + ele.code + '.jpg';\r\n });\r\n });\r\n }\r\n if (!(this.share.orderTable)) {\r\n this.getTableOrder();\r\n }\r\n }\r\n\r\n getTableOrder() {\r\n if (this.share.tableId !== '0') {\r\n this.api.getFilterEntity('GetTableOrder', Number(this.share.tableId))\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(res => {\r\n this.share.orderTable = res;\r\n });\r\n }\r\n else {\r\n this.share.orderTable = new TableModel;\r\n this.share.orderTable.tableName = 'حضوری';\r\n this.share.orderTable.tableId = 0;\r\n }\r\n }\r\n\r\n public upload(event, action, goods) {\r\n if (event.target.files && event.target.files.length > 0) {\r\n const file = event.target.files[0];\r\n this.uploadService.setPath(this.sanitizer.bypassSecurityTrustUrl(file));\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.uploadService.uploadFile(file, action, goods).subscribe(\r\n data => {\r\n if (data) {\r\n switch (data.type) {\r\n case HttpEventType.UploadProgress:\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n this.router.navigate(['/portal/goods']);\r\n this.share.reloadCurrentRoute();\r\n break;\r\n }\r\n }\r\n },\r\n error => {\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n }\r\n\r\n getLinkPicture(ftu: GoodsGroupModel) { //foodTypeUrl\r\n if(this.timeStamp) {\r\n return this.linkPicture + '?' + this.timeStamp;\r\n }\r\n console.log(ftu.foodtypeUrl);\r\n return this.linkPicture;\r\n }\r\n public setLinkPicture(url: string) {\r\n this.linkPicture = url;\r\n this.timeStamp = (new Date()).getTime();\r\n }\r\n\r\n reloadCurrentRoute() {\r\n let currentUrl = this.router.url;\r\n this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {\r\n this.router.navigate([currentUrl]);\r\n });\r\n }\r\n\r\n date(): void {\r\n this.DateNow = `?${Date.now()}`;\r\n }\r\n}\r\n","import { Component, Output, EventEmitter, Input, ViewChild, ElementRef } from '@angular/core';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { HttpEventType } from '@angular/common/http';\r\nimport { ProgressStatus, ProgressStatusEnum } from '../../../models/progress-status.model';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'app-upload',\r\n templateUrl: 'upload.component.html',\r\n styleUrls: ['./upload.component.scss'],\r\n})\r\n\r\nexport class UploadComponent {\r\n @Input() public disabled: boolean;\r\n @Output() public uploadStatus: EventEmitter;\r\n @ViewChild('inputFile') inputFile: ElementRef;\r\n @Output() public showUploadState: any;\r\n\r\n constructor(private service: UploadDownloadService,private sanitizer: DomSanitizer) {\r\n this.uploadStatus = new EventEmitter();\r\n }\r\n\r\n public upload(event, action) {\r\n if (event.target.files && event.target.files.length > 0) {\r\n const file = event.target.files[0];\r\n this.service.setPath(this.sanitizer.bypassSecurityTrustUrl(file));\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.service.uploadFile(file, action).subscribe(\r\n data => {\r\n if (data) {\r\n switch (data.type) {\r\n case HttpEventType.UploadProgress:\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n this.showUploadState = \"حجم فایل آپلود شده بیشتر از حد مجاز است!\";\r\n break;\r\n }\r\n }\r\n },\r\n error => {\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n }\r\n}\r\n","
\r\n \r\n
\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { HttpEventType } from '@angular/common/http';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { ProgressStatus, ProgressStatusEnum } from '../../../models/progress-status.model';\r\n\r\n@Component({\r\n selector: 'app-download',\r\n templateUrl: 'download.component.html'\r\n})\r\n\r\nexport class DownloadComponent {\r\n @Input() public disabled: boolean;\r\n @Input() public fileName: string;\r\n @Output() public downloadStatus: EventEmitter;\r\n\r\n constructor(private service: UploadDownloadService) {\r\n this.downloadStatus = new EventEmitter();\r\n }\r\n\r\n public download() {\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.service.downloadFile(this.fileName).subscribe(\r\n data => {\r\n switch (data.type) {\r\n case HttpEventType.DownloadProgress:\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n const downloadedFile = new Blob([data.body], { type: data.body.type });\r\n const a = document.createElement('a');\r\n a.setAttribute('style', 'display:none;');\r\n document.body.appendChild(a);\r\n a.download = this.fileName;\r\n a.href = URL.createObjectURL(downloadedFile);\r\n a.target = '_blank';\r\n a.click();\r\n document.body.removeChild(a);\r\n break;\r\n }\r\n },\r\n error => {\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n}\r\n","\r\n

progress {{percentage}}%

\r\n\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n\r\n","download\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { ProgressStatusEnum, ProgressStatus } from '../../../models/progress-status.model';\r\n\r\n@Component({\r\n selector: 'app-filemanager',\r\n templateUrl: './file-manager.component.html',\r\n styleUrls: ['./file-manager.component.scss']\r\n})\r\nexport class FileManagerComponent implements OnInit {\r\n\r\n public files: string[];\r\n public fileInDownload: string;\r\n public percentage: number;\r\n public showProgress: boolean;\r\n public showDownloadError: boolean;\r\n public showUploadError: boolean;\r\n\r\n constructor(public service: UploadDownloadService) { }\r\n\r\n ngOnInit() {\r\n this.getFiles();\r\n }\r\n\r\n ngOnChange() {\r\n if(this.files.length > 0) this.safeFiles();\r\n }\r\n\r\n private getFiles() {\r\n this.service.getFiles().subscribe(\r\n data => {\r\n this.files = data;\r\n }\r\n );\r\n }\r\n\r\n safeFiles() {\r\n for (let index = 0; index < this.files.length; index++) {\r\n const element = this.files[index];\r\n console.log(element);\r\n }\r\n }\r\n\r\n public downloadStatus(event: ProgressStatus) {\r\n switch (event.status) {\r\n case ProgressStatusEnum.START:\r\n this.showDownloadError = false;\r\n break;\r\n case ProgressStatusEnum.IN_PROGRESS:\r\n this.showProgress = true;\r\n this.percentage = event.percentage;\r\n break;\r\n case ProgressStatusEnum.COMPLETE:\r\n this.showProgress = false;\r\n break;\r\n case ProgressStatusEnum.ERROR:\r\n this.showProgress = false;\r\n this.showDownloadError = true;\r\n break;\r\n }\r\n }\r\n\r\n public uploadStatus(event: ProgressStatus) {\r\n switch (event.status) {\r\n case ProgressStatusEnum.START:\r\n this.showUploadError = false;\r\n break;\r\n case ProgressStatusEnum.IN_PROGRESS:\r\n this.showProgress = true;\r\n this.percentage = event.percentage;\r\n break;\r\n case ProgressStatusEnum.COMPLETE:\r\n this.showProgress = false;\r\n this.getFiles();\r\n break;\r\n case ProgressStatusEnum.ERROR:\r\n this.showProgress = false;\r\n this.showUploadError = true;\r\n break;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PortalComponent } from './portal.component';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { ShareModule } from '../share.module';\r\nimport { ControlsModule } from 'src/core/controls/shared/controls.mudule';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { LogoComponent } from './logo/logo.component';\r\nimport { SliderComponent } from './slider/slider.component';\r\nimport { SocialComponent } from './social/social.component';\r\nimport { GoodsComponent } from './goods/goods.component';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { UploadComponent } from './upload/upload.component';\r\nimport { DownloadComponent } from './download/download.component';\r\nimport { FileManagerComponent } from './file-manager/file-manager.component';\r\nimport { UploadDownloadService } from './file-upload/upload-download.service';\r\nimport { HintFileSizeComponent } from './upload/hint-file-size/hint-file-size.component';\r\n\r\n\r\nconst routes: Routes = \r\n [\r\n {\r\n path: '', component: PortalComponent,\r\n children: \r\n [\r\n {\r\n path:'logo', component: LogoComponent\r\n },\r\n {\r\n path:'goods', component: GoodsComponent\r\n },\r\n {\r\n path:'slider', component: SliderComponent\r\n },\r\n {\r\n path:'social', component: SocialComponent\r\n }\r\n ],\r\n runGuardsAndResolvers: 'always'\r\n }\r\n ]\r\n\r\n@NgModule({\r\n declarations: [\r\n PortalComponent,\r\n LogoComponent,\r\n SliderComponent,\r\n SocialComponent,\r\n GoodsComponent,\r\n UploadComponent,\r\n DownloadComponent,\r\n FileManagerComponent,\r\n HintFileSizeComponent\r\n ],\r\n imports: [\r\n RouterModule.forChild(routes),\r\n CommonModule,\r\n ShareModule,\r\n MatTabsModule,\r\n MatMenuModule,\r\n ControlsModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n HttpClientModule\r\n ],\r\n providers: [UploadDownloadService]\r\n})\r\nexport class PortalModule { }\r\n","import { A11yModule } from '@angular/cdk/a11y';\r\nimport { BidiModule } from '@angular/cdk/bidi';\r\nimport { LayoutModule } from '@angular/cdk/layout';\r\nimport { ObserversModule } from '@angular/cdk/observers';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PlatformModule } from '@angular/cdk/platform';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { ScrollDispatchModule } from '@angular/cdk/scrolling';\r\nimport { CdkStepperModule } from '@angular/cdk/stepper';\r\nimport { CdkTableModule } from '@angular/cdk/table';\r\n\r\nimport {\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatStepperModule,\r\n MatBottomSheetModule,\r\n MatBadgeModule\r\n} from '@angular/material';\r\nimport { NgModule } from '@angular/core';\r\nconst MATERIAL_MODULES = [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSlideToggleModule,\r\n MatSliderModule,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatGridListModule,\r\n MatStepperModule,\r\n MatNativeDateModule,\r\n MatBottomSheetModule,\r\n MatBadgeModule\r\n];\r\nconst CDK_MODULES = [\r\n A11yModule,\r\n BidiModule,\r\n LayoutModule,\r\n ObserversModule,\r\n OverlayModule,\r\n PlatformModule,\r\n PortalModule,\r\n ScrollDispatchModule,\r\n CdkStepperModule,\r\n CdkTableModule\r\n];\r\n@NgModule({\r\n imports: [\r\n CDK_MODULES,\r\n MATERIAL_MODULES\r\n ],\r\n exports: [\r\n CDK_MODULES,\r\n MATERIAL_MODULES\r\n ]\r\n})\r\nexport class MaterialModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HeaderComponent } from './header.component';\r\nimport { MaterialModule } from '../material.module';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@NgModule({\r\n declarations: [HeaderComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FormsModule,\r\n // ToastrModule.forRoot(),\r\n ReactiveFormsModule,\r\n // ShareModule\r\n TranslateModule.forChild(),\r\n ],\r\n exports: [HeaderComponent],\r\n})\r\nexport class HeaderModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { HeaderModule } from './header/header.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from './material.module';\r\n// import { RouterModule } from '@angular/router';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\n// import { createTranslateLoader } from './app.module';\r\n// import { HttpClient } from '@angular/common/http';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { PersianNumberPipe } from 'src/services/persian-number.pipe';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n HeaderModule,\r\n TranslateModule.forChild(),\r\n ],\r\n declarations: [PersianNumberPipe,],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n HeaderModule,\r\n TranslateModule,\r\n PersianNumberPipe,\r\n ],\r\n providers: []\r\n})\r\nexport class ShareModule { }\r\n","\r\nimport { TableModule } from 'src/app/table/table.module';\r\nimport { TableModel } from 'src/models/table.model';\r\n\r\ndeclare global {\r\n interface String {\r\n toAddPrefix(prefix: string): string;\r\n }\r\n interface Array {\r\n isValid(): boolean;\r\n // map(T, value: boolean): Array;\r\n }\r\n interface Array {\r\n maper(TModel: T): Array;\r\n }\r\n interface Map {\r\n SetInArray(this: Map, key: K, value: V): boolean;\r\n }\r\n}\r\nString.prototype.toAddPrefix = function (prefixStr: string) {\r\n return `${prefixStr}${this}`;\r\n};\r\nArray.prototype.isValid = function (): boolean {\r\n if (!(this) || this.length <= 0) {\r\n return false;\r\n }\r\n return true;\r\n};\r\nArray.prototype.maper = function maper(destination_model: T): Array {\r\n const arr = [];\r\n // //var destination_model = new T();\r\n const destination = Object.keys(destination_model);\r\n const source = Object.keys(this[0]);\r\n this.forEach(item => {\r\n const obj = JSON.parse(JSON.stringify(destination_model));\r\n source.forEach(key => {\r\n if (destination.some(el => el === key)) {\r\n obj[key] = item[key];\r\n }\r\n });\r\n arr.push(obj);\r\n });\r\n return arr;\r\n};\r\nMap.prototype.SetInArray = function (this: Map, key: K, value: V): boolean {\r\n let isNew = false;\r\n if (this.has(key) === false) {\r\n this.set(key, []);\r\n isNew = true;\r\n }\r\n const items: V[] = this.get(key)!;\r\n items.push(value);\r\n return isNew;\r\n};\r\n\r\nexport { };\r\n","import { Router } from '@angular/router';\r\nimport { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { Subject } from 'rxjs-compat';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { Location } from '@angular/common';\r\nimport '../extended/extensions';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { AppModule } from 'src/app/app.module';\r\nimport { DialogComponent } from 'src/app/dialog/dialog.component';\r\nimport { MatDialog, MatSnackBar } from '@angular/material';\r\nimport { LocalStoreManager } from 'src/services/local-store-manager.service';\r\n\r\n@Component({\r\n selector: 'app-base',\r\n template: 'mock widget'\r\n})\r\n\r\nexport class BaseComponent implements OnInit, OnDestroy {\r\n ngUnsubscribe = new Subject();\r\n table: TableModel;\r\n protected dialog: MatDialog;\r\n protected _snackBar: MatSnackBar;\r\n protected confirmState: number;\r\n protected DialogComponent: DialogComponent;\r\n protected router: Router;\r\n protected translateText: TranslateService;\r\n protected api: RestApiService;\r\n protected _location: Location;\r\n protected storage: LocalStoreManager;\r\n\r\n constructor() {\r\n this.api = AppModule.injector.get(RestApiService);\r\n this.router = AppModule.injector.get(Router);\r\n this.translateText = AppModule.injector.get(TranslateService);\r\n this._location = AppModule.injector.get(Location);\r\n this.dialog = AppModule.injector.get(MatDialog);\r\n this._snackBar = AppModule.injector.get(MatSnackBar);\r\n this.storage = AppModule.injector.get(LocalStoreManager);\r\n }\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n ngOnInit(): void {\r\n }\r\n go(url: string) {\r\n if (url === 'goback') {\r\n this._location.back();\r\n return;\r\n }\r\n this.router.navigate([`/${url}`]);\r\n }\r\n translate(str: string): string {\r\n return this.translateText.instant(str);\r\n }\r\n test() {\r\n const str0 = 'str';\r\n const prefixStr = str0.toAddPrefix('prefix_');\r\n console.log(prefixStr); // prefix_str\r\n const arr = ['str'];\r\n const val = arr.isValid();\r\n console.log(val);\r\n }\r\n confirmation(title: string) {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.confirmation(title);\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result === 'Ok') {\r\n this.afterConfirm();\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n afterConfirm() { }\r\n toast(message: string) {\r\n this._snackBar.open(message, null, {\r\n duration: 1000,\r\n });\r\n }\r\n openSnackBar(message, action: string, className: string) {\r\n if (message instanceof Array) {\r\n message.forEach((message, index) => {\r\n setTimeout(() => {\r\n this._snackBar.open(message.text, action, {\r\n duration: 2000,\r\n verticalPosition: 'bottom', // 'top' | 'bottom'\r\n horizontalPosition: 'end', //'start' | 'center' | 'end' | 'left' | 'right'\r\n panelClass: [className],\r\n });\r\n }, index * (2000 + 500)); // 500 => timeout between two messages\r\n });\r\n } else {\r\n this._snackBar.open(message.text, action, {\r\n duration: 1000,\r\n verticalPosition: 'bottom', // 'top' | 'bottom'\r\n horizontalPosition: 'end', //'start' | 'center' | 'end' | 'left' | 'right'\r\n panelClass: [className],\r\n\r\n });\r\n }\r\n }\r\n}\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n Validator,\r\n Validators,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Observable, of } from 'rxjs';\r\nexport type ValidationResult = { [validator: string]: string | boolean };\r\nexport type AsyncValidatorArray = Array;\r\nexport type ValidatorArray = Array;\r\nconst normalizeValidator =\r\n (validator: Validator | ValidatorFn): ValidatorFn | AsyncValidatorFn => {\r\n const func = (validator as Validator).validate.bind(validator);\r\n if (typeof func === 'function') {\r\n return (c: AbstractControl) => func(c);\r\n } else {\r\n return validator;\r\n }\r\n };\r\nexport const composeValidators =\r\n (validators: ValidatorArray): AsyncValidatorFn | ValidatorFn => {\r\n if (validators == null || validators.length === 0) {\r\n return null;\r\n }\r\n return Validators.compose(validators.map(normalizeValidator));\r\n };\r\nexport const validate =\r\n (validators: ValidatorArray, asyncValidators: AsyncValidatorArray) => {\r\n return (control: AbstractControl) => {\r\n const synchronousValid = () => composeValidators(validators)(control);\r\n if (asyncValidators) {\r\n const asyncValidator = composeValidators(asyncValidators);\r\n return asyncValidator(control);\r\n //return asyncValidator(control).bind( v => {\r\n // const secondary = synchronousValid();\r\n // if (secondary || v) { // compose async and sync validator results\r\n // return Object.assign({}, secondary, v);\r\n // }\r\n //});\r\n }\r\n if (validators) {\r\n return of(synchronousValid());\r\n }\r\n return of(null);\r\n };\r\n };\r\nexport const message = (validator: ValidationResult, key: string): string => {\r\n switch (key) {\r\n case 'required':\r\n return 'Please enter a value';\r\n case 'pattern':\r\n return 'Value does not match required pattern';\r\n case 'minlength':\r\n return 'Value must be N characters';\r\n case 'maxlength':\r\n return 'Value must be a maximum of N characters';\r\n case 'min':\r\n return 'Value must be a grater than N ';\r\n case 'max':\r\n return 'Value must be a less than N';\r\n }\r\n switch (typeof validator[key]) {\r\n case 'string':\r\n return validator[key];\r\n default:\r\n return `Validation failed: ${key}`;\r\n }\r\n};\r\n","import { OnInit, EventEmitter, Output, Input, Directive, OnDestroy } from '@angular/core';\r\nimport { NgModel } from '@angular/forms';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport {\r\n ValidationResult,\r\n validate,\r\n message,\r\n} from './validate';\r\nimport { map } from 'rxjs/operators';\r\n// @Directive()\r\n@Directive()\r\nexport abstract class BaseControlComponent implements OnInit,OnDestroy {\r\n protected abstract model: NgModel;\r\n //value: T;\r\n ngUnsubscribe = new Subject();\r\n _pattern: string;\r\n value: any;\r\n @Output() valueChange = new EventEmitter();\r\n @Input() label: string;\r\n @Input() name: string;\r\n @Input() id: string;\r\n @Input() required: boolean = false;\r\n @Input() hidden: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() textType: string = \"text\";\r\n @Input() minLength: string;\r\n @Input() maxLength: string;\r\n @Input() min: number;\r\n @Input() max: number;\r\n @Input() placeholder: string;\r\n @Input() multiple: boolean = false;\r\n @Input() pattern: string;\r\n // @Input() set patternKey(value: string) {\r\n // this._pattern = value;\r\n // }\r\n get patternKey(): string {\r\n return this._pattern;\r\n }\r\n @Input() mainclass: string = 'col-lg-12 col-sm-12';\r\n @Input() labelclass: string = 'col-lg-3 col-sm-3';\r\n @Input() inputclass: string = 'col-lg-9 col-sm-9';\r\n //private _formBuilder: FormBuilder;\r\n public patterns = {\r\n email: \"([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+\",\r\n url: \"(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]\",\r\n mobile: \"^[0-0][9-9]\\\\d{9}\",\r\n telephone: \"^[1-9]\\\\d{3,7}\",\r\n nationalcode: \"^[0-9]\\\\d{9}\",\r\n lockserial: \"^\\d{4}-\\d{4}-\\d{4}\",\r\n number: \"^\\\\d+$\",\r\n minMax: \"^$|^([0-9]|[1-9][0-9]|[1][0][0])?\"\r\n };\r\n constructor(\r\n private validators: Array,\r\n private asyncValidators: Array) {\r\n }\r\n ngOnDestroy(): void {\r\n if(this.ngUnsubscribe)\r\n {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n }\r\n ngOnInit() {\r\n }\r\n change(newValue: any) {\r\n this.value = newValue;\r\n this.valueChange.emit(newValue);\r\n }\r\n protected validate(): Observable {\r\n var v = validate(this.validators, this.asyncValidators)(this.model.control);\r\n return null;\r\n }\r\n private patternIsOk() {\r\n if (this.value && this.patternKey && this.patterns[this.patternKey] && this.model.control.valid) {\r\n var regex = new RegExp(this.patterns[this.patternKey]);\r\n if (!regex.test(this.value.toString())) {\r\n this.model.control.setErrors({ invalid: true });\r\n }\r\n }\r\n }\r\n private setMinMax() {\r\n if (this.min && Number(this.value) < Number(this.min))\r\n this.model.control.setErrors({ min: true });\r\n if (this.max && Number(this.value) > Number(this.max))\r\n this.model.control.setErrors({ max: true });\r\n }\r\n public get invalid(): Observable {\r\n this.patternIsOk();\r\n if (this.textType == 'number')\r\n this.setMinMax();\r\n if (this.validate() == null) {\r\n return null;\r\n }\r\n return this.validate().pipe(map(v => Object.keys(v || {}).length > 0));\r\n }\r\n public get failures(): Observable> {\r\n if (this.validate() == null) {\r\n return null;\r\n }\r\n return this.validate().pipe(map(v => Object.keys(v).map(k => message(v, k))));\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\nimport {\r\n NG_VALIDATORS,\r\n AbstractControl,\r\n} from '@angular/forms';\r\n@Directive({\r\n selector: '[hexadecimal][ngModel]',\r\n providers: [\r\n { provide: NG_VALIDATORS, useExisting: HexadecimalValueValidator, multi: true }\r\n ]\r\n})\r\nexport class HexadecimalValueValidator {\r\n validate(control: AbstractControl): { [validator: string]: string } {\r\n const expression = /^([0-9a-fA-F]+)$/i;\r\n if (!control.value) { // the [required] validator will check presence, not us\r\n return null;\r\n }\r\n const value = control.value.trim();\r\n if (expression.test(value)) {\r\n return null;\r\n }\r\n return { hexadecimal: 'Please enter a hexadecimal value (alphanumeric, 0-9 and A-F)' };\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n@Component({\r\n selector: 'validation',\r\n template: `\r\n
\r\n
{{message}}
\r\n
\r\n `,\r\n styles: [`\r\n .validation {\r\n color: #999;\r\n margin: 12px;\r\n }`\r\n ]\r\n})\r\nexport class ValidationComponent {\r\n @Input() messages: Array;\r\n}\r\n","import { Component, ViewChild, Optional, Inject, Input } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, NG_VALIDATORS, NgModel, NG_ASYNC_VALIDATORS, ControlContainer, NgForm } from '@angular/forms';\r\nimport { BaseControlComponent } from '../base/base-control.component';\r\n@Component({\r\n // moduleId: module.id,\r\n selector: 'sep-button',\r\n templateUrl: 'button.component.html',\r\n styleUrls: ['button.component.scss'],\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: ButtonComponent, multi: true }\r\n ]\r\n})\r\nexport class ButtonComponent extends BaseControlComponent {\r\n @ViewChild(NgModel) model: NgModel;\r\n @Input() icon: string;\r\n @Input() size: string;\r\n constructor(\r\n @Optional()\r\n @Inject(NG_VALIDATORS)\r\n validators: Array,\r\n @Optional()\r\n @Inject(NG_ASYNC_VALIDATORS)\r\n asyncValidators: Array) {\r\n super(validators, asyncValidators);\r\n }\r\n}\r\n","\r\n","import { Directive, Input } from \"@angular/core\";\r\nimport { NG_VALIDATORS, Validator, ValidatorFn, AbstractControl, Validators } from \"@angular/forms\";\r\n@Directive({\r\n selector: \"[min][formControlName],[min][formControl],[min][ngModel]\",\r\n providers: [\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: MinDirective,\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class MinDirective implements Validator {\r\n private _validator: ValidatorFn;\r\n @Input() public set min(value: string) {\r\n this._validator = Validators.min(parseInt(value, 10));\r\n }\r\n public validate(control: AbstractControl): { [key: string]: any } {\r\n return this._validator(control);\r\n }\r\n}\r\n@Directive({\r\n selector: \"[max][formControlName],[max][formControl],[max][ngModel]\",\r\n providers: [\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: MaxDirective,\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class MaxDirective implements Validator {\r\n private _validator: ValidatorFn;\r\n @Input() public set max(value: string) {\r\n this._validator = Validators.max(parseInt(value, 10));\r\n }\r\n public validate(control: AbstractControl): { [key: string]: any } {\r\n return this._validator(control);\r\n }\r\n}\r\n","
\r\n
\r\n {{label}}\r\n * \r\n
\r\n
\r\n \r\n
\r\n {{hint}}\r\n
\r\n
\r\n \r\n {{label}} {{'Errors.Required'| translate}}\r\n \r\n \r\n {{label}} {{'Errors.Pattern' | translate}}\r\n \r\n \r\n {{('Errors.Minlength'| translate ).replace( '[0]' , label).replace( '[1]' , minLength) }}\r\n \r\n \r\n {{('Errors.Maxlength'| translate ).replace( '[0]' , label).replace( '[1]' , minLength) }}\r\n \r\n \r\n {{('Errors.Length'| translate ).replace( '[0]' , label).replace( '[1]' , min).replace( '[2]' , max) }}\r\n \r\n
\r\n
\r\n","import { Component, ViewChild, Optional, Inject, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BaseControlComponent } from \"../base/base-control.component\";\r\nimport { NG_VALUE_ACCESSOR, NgModel, NG_VALIDATORS, NG_ASYNC_VALIDATORS } from '@angular/forms';\r\nimport { retry } from 'rxjs/operators';\r\nimport { CorrectYeKeService } from 'src/services/correctyeke.service';\r\n@Component({\r\n //moduleId: module.id,\r\n selector: 'sep-input',\r\n styleUrls: ['input.component.scss'],\r\n templateUrl: 'input.component.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: InputComponent, multi: true }\r\n ],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class InputComponent extends BaseControlComponent {\r\n isshow: boolean;\r\n show() {\r\n this.isshow = !this.isshow;\r\n }\r\n focusFunction() {\r\n this.isshow = true;\r\n document.getElementById(this.name).focus();\r\n }\r\n focusOutFunction() {\r\n if (!this.value || this.value == '') {\r\n this.isshow = false;\r\n }\r\n }\r\n // @HostBinding('class') @Input('class') classList: string = '';\r\n\r\n @Input() class: string\r\n @Input() name: string;\r\n @Input() hint: string;\r\n @Input() icon: string;\r\n @Input() autocomplete: string = \"on\";\r\n @Input() withComma: boolean = true;\r\n @Output() numberValueChange: EventEmitter = new EventEmitter();\r\n @ViewChild(NgModel) model: NgModel;\r\n @Input() inputMask: string;\r\n _value: number;\r\n @Input()\r\n set numberValue(value: any) {\r\n if (value && this.textType == 'number' && this.withComma.toString().toLowerCase() === 'true') {\r\n var parts = value.toString().split(\".\");\r\n parts[0] = parts[0].replace(/,/g, \"\").replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n this.value = parts.join(\".\");\r\n }\r\n else\r\n this.value = value as any;\r\n }\r\n get numberValue(): any {\r\n if (this.textType == 'number' && this.withComma.toString().toLowerCase() === 'true') {\r\n return Number(this.value.replace(/,/g, \"\"));\r\n }\r\n return this.value as any;\r\n }\r\n constructor(\r\n @Optional() @Inject(NG_VALIDATORS) validators: Array,\r\n @Optional() @Inject(NG_ASYNC_VALIDATORS) asyncValidators: Array,\r\n private cyk: CorrectYeKeService\r\n ) {\r\n super(validators, asyncValidators);\r\n if (!this.autocomplete) {\r\n this.autocomplete = \"on\";\r\n }\r\n }\r\n onChange(value: any) {\r\n if (value && this.textType == 'number' && this.withComma.toString().toLowerCase() === 'true') {\r\n this.valueChange.emit(this.value.replace(/,/g, \"\"));\r\n this.numberValueChange.emit(this.numberValue)\r\n }\r\n else {\r\n this.value = CorrectYeKeService.getCorrectYeKe(this.value);\r\n this.valueChange.emit(this.value);\r\n this.numberValueChange.emit(this.numberValue)\r\n }\r\n }\r\n}\r\n","import {\r\n DateAdapter,\r\n MAT_DATE_FORMATS,\r\n MAT_DATE_LOCALE\r\n} from '@angular/material/core';\r\n\r\n// import {A11yModule} from '@angular/cdk/a11y';\r\n// import {DragDropModule} from '@angular/cdk/drag-drop';\r\n// import {PortalModule} from '@angular/cdk/portal';\r\n// import {ScrollingModule} from '@angular/cdk/scrolling';\r\n// import {CdkStepperModule} from '@angular/cdk/stepper';\r\nimport { CdkTableModule } from '@angular/cdk/table';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatStepperModule } from '@angular/material/stepper';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatGridListModule } from '@angular/material/grid-list';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatNativeDateModule, MatRippleModule } from '@angular/material/core';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTreeModule } from '@angular/material/tree';\r\n\r\nimport { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n imports: [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatBottomSheetModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatSnackBarModule,\r\n MatStepperModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n CdkTableModule,\r\n MatTreeModule,\r\n MatBadgeModule\r\n ],\r\n exports: [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatBottomSheetModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatSnackBarModule,\r\n MatStepperModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n CdkTableModule,\r\n MatTreeModule,\r\n MatBadgeModule\r\n ],\r\n providers: [\r\n ]\r\n})\r\nexport class MaterialModule { }\r\n","import { NgModule, ModuleWithProviders, Injector, ErrorHandler } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport {\r\n HexadecimalValueValidator,\r\n ValidationComponent,\r\n ButtonComponent,\r\n InputComponent,\r\n} from './controls';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';\r\nimport { MinDirective, MaxDirective } from './controls/base/min.max.directive';\r\nimport { MaterialModule } from './material.module';\r\nimport { PersianNumberPipe } from 'src/services/persian-number.pipe';\r\nimport { CorrectYeKeService } from 'src/services/correctyeke.service';\r\n\r\nexport let AppInjector: Injector;\r\nconst components = [\r\n HexadecimalValueValidator,\r\n ValidationComponent,\r\n MinDirective,\r\n MaxDirective,\r\n ButtonComponent,\r\n InputComponent,\r\n]\r\nconst providers = [\r\n CorrectYeKeService\r\n\r\n]\r\n@NgModule({\r\n declarations: [...components],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n HttpClientModule,\r\n MaterialModule,\r\n TranslateModule\r\n ],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n ...components,\r\n MaterialModule,\r\n TranslateModule,\r\n ],\r\n providers: [\r\n ...providers,\r\n ]\r\n})\r\nexport class ControlsModule {\r\n constructor(private injector: Injector) {\r\n AppInjector = this.injector;\r\n }\r\n static forRoot(): ModuleWithProviders {\r\n return {\r\n ngModule: ControlsModule,\r\n providers: [...providers]\r\n };\r\n }\r\n}\r\n","// This file can be replaced during build by using the `fileReplacements` array.\r\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\r\n// The list of file replacements can be found in `angular.json`.\r\n\r\nexport const environment = {\r\n production: false,\r\n baseUrl: null, // Change this to the address of your backend API if different from frontend address\r\n loginUrl: '/Login'\r\n};\r\n\r\n/*\r\n * For easier debugging in development mode, you can import the following file\r\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\r\n *\r\n * This import should be commented out in production mode because it will have a negative impact\r\n * on performance if an error is thrown.\r\n */\r\n// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.\r\n","import 'hammerjs';\r\nimport { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n","export enum SourceProgramEnum {\r\n Tablet = 2,\r\n Kiosk = 4,\r\n DigitalMeuOffline = 5,\r\n DigitalMeuOnline = 6\r\n}\r\n","export enum StateEnum {\r\n Add = 0,\r\n Merge = 1,\r\n DeletedMerge = 2,\r\n Edited = 3,\r\n Deleted = 4,\r\n Save = 5,\r\n SaveMerge = 6,\r\n EditWithoutChange = 7, // 2ستونی\r\n EditWithChangeIncrease = 8, // 3ستونی\r\n DeletedForDuplicateFactor = 9,\r\n DeletedForTabletMerge = 10\r\n}\r\n\r\nexport enum ActionStateEnum {\r\n Save = 0,\r\n Merge = 1,\r\n Deleted = 2,\r\n Edited = 3,\r\n}\r\n","import { FactorDetailsModel } from './factordetails.model';\r\n\r\nexport class FactorModel {\r\n num: number;\r\n id: number;\r\n price?: number;\r\n status: number;\r\n mergeHeaderId?: number;\r\n discountPercent?: number;\r\n discountAmount?: number;\r\n serviceAmount?: number;\r\n servicePercent?: number;\r\n taxAmount?: number;\r\n taxPercent?: number;\r\n roundedAmount?: number;\r\n phoneNumber: string;\r\n fireLevel?: number;\r\n printAsh?: number;\r\n branchCode: number;\r\n description: string;\r\n transactionNo: string;\r\n errorCodePay: string;\r\n errorMessagePay: string;\r\n merchantIDPay: string;\r\n terminalIDPay: string;\r\n paymentTypeCode: number;\r\n flagPda?: number;\r\n tableId: string;\r\n tableName: string;\r\n customerName: string;\r\n flag: string;\r\n waiterName: string;\r\n guestQty?: number;\r\n waiterId?: number;\r\n time: string;\r\n sourceFlag: string;\r\n pdaPrintFlag?: number;\r\n hasCashPrint?: number;\r\n tas?: number;\r\n creationTime: string;\r\n checked: boolean;\r\n redirectUrl: string;\r\n clubCardNo: number;\r\n usedCredit: number;\r\n creditUsedPersent: number;\r\n creditUsedRial: number;\r\n creditPersent: number;\r\n credit: number;\r\n creditPrice?: number;\r\n factorDetail?: FactorDetailsModel[];\r\n digitalMenuHeaderId?: number;\r\n FarsiDate: string;\r\n isOrderPrint?: number;\r\n constructor() {\r\n this.num = 0;\r\n this.FarsiDate = '';\r\n this.id = 0;\r\n this.price = 0;\r\n this.status = 0;\r\n this.clubCardNo = null;\r\n this.creationTime = \"\";\r\n this.mergeHeaderId = 0;\r\n this.discountPercent = 0;\r\n this.discountAmount = 0;\r\n this.serviceAmount = 0;\r\n this.servicePercent = 0;\r\n this.taxAmount = 0;\r\n this.taxPercent = 0;\r\n this.roundedAmount = 0;\r\n this.phoneNumber = '';\r\n this.branchCode = 0;\r\n this.description = '';\r\n this.transactionNo = '';\r\n this.errorCodePay = '';\r\n this.errorMessagePay = '';\r\n this.merchantIDPay = '';\r\n this.terminalIDPay = '';\r\n this.paymentTypeCode = 0;\r\n this.flagPda = 0;\r\n this.tableId = '';\r\n this.tableName = '';\r\n this.customerName = '';\r\n this.flag = '';\r\n this.waiterName = '';\r\n this.guestQty = null;\r\n this.waiterId = 0;\r\n this.time = '';\r\n this.sourceFlag = '';\r\n this.pdaPrintFlag = 0;\r\n this.hasCashPrint = 0;\r\n this.tas = 0;\r\n this.factorDetail = [];\r\n this.checked = false;\r\n this.creditPrice = null;\r\n this.digitalMenuHeaderId = null;\r\n }\r\n}\r\n\r\nexport class InvoiceModel {\r\n // شماره فاکتور \r\n num: number;\r\n // مبلغ قابل پرداخت\r\n price?: number;\r\n //تخفیف\r\n discountAmount?: number;\r\n serviceAmount?: number;\r\n taxAmount?: number;\r\n roundedAmount?: number;\r\n phoneNumber: string;\r\n description: string;\r\n //transactionNo: string;\r\n tableName: string;\r\n customerName: string;\r\n waiterName: string;\r\n // تعداد نفرات\r\n guestQty?: number;\r\n time: string;\r\n creationTime: string;\r\n // اعتبار باشگاه\r\n usedCredit: number;\r\n creditPrice?: number;\r\n sumQty: number;\r\n sumPrice: number;\r\n restaurantName: string;\r\n farsiDate: string;\r\n invoiceDetail?: InvoiceDetailsModel[];\r\n constructor() {\r\n this.num = 0;\r\n this.sumQty = 0;\r\n this.sumPrice = 0;\r\n this.price = 0;\r\n this.discountAmount = 0;\r\n this.serviceAmount = 0;\r\n this.taxAmount = 0;\r\n this.roundedAmount = 0;\r\n this.phoneNumber = '';\r\n this.description = '';\r\n //this.transactionNo = '';\r\n this.tableName = '';\r\n this.customerName = '';\r\n this.waiterName = '';\r\n this.guestQty = 0;\r\n this.creationTime = '';\r\n //this.time = '';\r\n this.invoiceDetail = [];\r\n this.creditPrice = 0;\r\n this.farsiDate = '';\r\n this.usedCredit = 0;\r\n\r\n }\r\n}\r\nexport class InvoiceDetailsModel {\r\n //radif: number;\r\n // نام کالا\r\n name: string;\r\n //unit: string;\r\n // تعداد\r\n qty?: number;\r\n unitPrice: number;\r\n // توضیحات\r\n toz: string;\r\n sumUnitPrice: number;\r\n constructor() {\r\n //this.radif = 0;\r\n this.sumUnitPrice = 0;\r\n this.name = '';\r\n //this.unit = '';\r\n this.qty = 0;\r\n this.unitPrice = 0;\r\n this.toz = '';\r\n }\r\n}\r\nexport class PrintInvoiceModel {\r\n num: number;\r\n pr: number;\r\n branchCode: number;\r\n printTime: string;\r\n}\r\n","export class ShareModel {\r\n language: string;\r\n isrtl: boolean;\r\n}\r\n","export class SocialMedia {\r\n id?: number;\r\n branchCode?: number;\r\n instagram?: string;\r\n telegram?: string;\r\n twitter?: string;\r\n facebook?: string;\r\n whatsApp?: string;\r\n website?: string;\r\n constructor() {\r\n this.instagram=\"\";\r\n this.telegram=\"\";\r\n this.twitter=\"\";\r\n this.facebook=\"\";\r\n this.whatsApp=\"\";\r\n this.website=\"\";\r\n }\r\n}","export class TableModel {\r\n tableId: number;\r\n tableName: string;\r\n nameGroup: string;\r\n tableCategoryId: number;\r\n num: number;\r\n time: string;\r\n waiterId?: number;\r\n waiterName: string;\r\n customerName: string;\r\n phoneNumber: string;\r\n guestQty: number;\r\n branchCode: number;\r\n isTas: number;\r\n fireLevel: number;\r\n printAsh: number;\r\n hasCashPrint: number;\r\n isOrderPrint?: number;\r\n}\r\n","export enum ThemeEnum {\r\n Dark = 0,\r\n Light = 1,\r\n Blue = 2,\r\n Orange = 3,\r\n}\r\n//export enum ThemeColor {\r\n// Dark = \"dark\",\r\n// Light = \"light\",\r\n// Blue = \"blue\",\r\n// Orange = \"orange\"\r\n//}\r\n","import { Injectable } from '@angular/core';\r\nimport { GoodsModel } from 'src/models/goods.model';\r\nimport { GoodsGroupModel } from 'src/models/goodsgroup.model';\r\nimport { SettingModel } from 'src/models/setting.model';\r\nimport { ShareModel } from 'src/models/share.model';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { UserModel } from 'src/models/user.model';\r\nimport { FactorModel } from 'src/models/factor.model';\r\nimport { LocalStoreManager } from '../services/local-store-manager.service';\r\n\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { StateEnum } from '../models/enum/state.enum';\r\nimport { SourceProgramEnum } from '../models/enum/sourceprogram.enum';\r\nimport { FormBuilder} from '@angular/forms';\r\nimport { ThemeEnum } from 'src/models/enum/theme.enum';\r\nimport { ActivatedRoute, Router, RouterLinkActive, Routes } from '@angular/router';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ShareDataService {\r\n public goodsGroup: GoodsGroupModel[];\r\n public order: GoodsModel[];\r\n public setting: SettingModel;\r\n public sharemodel: ShareModel;\r\n public filterTableList: TableModel[];\r\n public tableList: TableModel[];\r\n public orderTable: TableModel;\r\n public loginuser: UserModel;\r\n public openFactor: FactorModel;\r\n public waiterFactor: FactorModel[];\r\n public waiterOrder: GoodsModel[];\r\n //public imageUrls: (string | IImage)[];\r\n public imageUrls: any[];\r\n public lastUrl: string;\r\n public validations_form: any;\r\n public formBuilder: FormBuilder;\r\n public digitalmenuFactorCount: Number;\r\n public selectedTableGroupIndex: number;\r\n public digitalmenuTableId: number;\r\n public hasSwitchTabIndex: boolean;\r\n public isClub: boolean;\r\n public tableId: string;\r\n public BranchCode: number;\r\n public currentTheme: string;\r\n public selectedGroupIndex?: number;\r\n public selectedtab: number = 0;\r\n \r\n navLinks = [];\r\n \r\n constructor(\r\n public api: RestApiService,\r\n private cache: LocalStoreManager,\r\n private storage: LocalStoreManager,\r\n private route: ActivatedRoute,\r\n public router: Router,\r\n ) {\r\n }\r\n ngOnInit() {\r\n this.navLinks = (\r\n this.route.routeConfig && this.route.routeConfig.children ?\r\n this.buildNavItems(this.route.routeConfig.children) :\r\n []\r\n );\r\n }\r\n\r\n buildNavItems(routes: Routes) {\r\n return (routes)\r\n .filter(route => route.data)\r\n .map(({ path = '', data }) => ({\r\n path: path,\r\n label: data.label,\r\n icon: data.icon\r\n }));\r\n }\r\n\r\n isLinkActive(rla: RouterLinkActive): boolean {\r\n const routerLink = rla.linksWithHrefs.first;\r\n \r\n return this.router.isActive(routerLink.urlTree, false);\r\n }\r\n \r\n public goodsGroupList(): Observable {\r\n return this.api.getEntity('GoodsGroupList').pipe(\r\n map((res: GoodsGroupModel[]) => {\r\n this.goodsGroup = res;\r\n return this.goodsGroup;\r\n }),\r\n catchError((err) => {\r\n return of(null);\r\n }));\r\n }\r\n public clearData() {\r\n this.goodsGroup = [];\r\n this.order = [];\r\n this.openFactor = null;\r\n this.waiterFactor = [];\r\n this.waiterOrder = [];\r\n }\r\n // public getSetting(): Observable {\r\n // if ((this.setting)) {\r\n // return;\r\n // }\r\n // return this.api.getFilterEntity(\"Setting\", 0).pipe(\r\n // map((res: SettingModel) => {\r\n // this.setting = res;\r\n // return this.setting;\r\n // }),\r\n // catchError((err) => {\r\n // return of(null);\r\n // }));\r\n // }\r\n New_waiterFactor() {\r\n this.waiterFactor = null;\r\n this.waiterFactor = [];\r\n const factor = new FactorModel();\r\n this.waiterFactor.push(factor);\r\n this.waiterFactor[0].status = StateEnum.Save;\r\n this.waiterFactor[0].sourceFlag = SourceProgramEnum.Tablet.toString();\r\n this.waiterFactor[0].waiterId = this.loginuser.code;\r\n this.waiterFactor[0].waiterName = this.loginuser.name;\r\n this.formBuilder = new FormBuilder();\r\n }\r\n public getSetting(): Observable {\r\n this.cache.deleteData('setting');\r\n if ((this.setting)) {\r\n return null;\r\n }\r\n this.api.getFilterEntity('Setting', 0).subscribe(res => {\r\n this.setting = res;\r\n switch (this.setting.digitalMenuThem) {\r\n case ThemeEnum.Dark:\r\n this.setTheme('dark');\r\n break;\r\n case ThemeEnum.Light:\r\n this.setTheme('light');\r\n break;\r\n case ThemeEnum.Blue:\r\n this.setTheme('blue');\r\n break;\r\n case ThemeEnum.Orange:\r\n this.setTheme('orange');\r\n break;\r\n }\r\n this.cache.savePermanentData(this.setting, 'setting');\r\n });\r\n }\r\n getDigitalMenuCount() {\r\n this.api.getEntity('GetDigitalMenuFactorCount').subscribe((res: Number) => {\r\n this.digitalmenuFactorCount = res;\r\n });\r\n }\r\n setTheme(theme: string) {\r\n if (!theme) {\r\n theme = 'custom';\r\n this.cache.savePermanentData(theme, 'Theme');\r\n document.documentElement.classList.add(theme);\r\n } else {\r\n let currentTheme: string = this.cache.getData('Theme');\r\n if (currentTheme) {\r\n document.documentElement.classList.remove(currentTheme);\r\n }\r\n this.cache.savePermanentData(theme, 'Theme');\r\n document.documentElement.classList.add(theme);\r\n }\r\n this.currentTheme = theme;\r\n }\r\n\r\n ActivateTab(key: any) {\r\n switch (key) {\r\n case 0: // index of the tab\r\n this.router.navigate(['/portal/logo']);\r\n break;\r\n case 1:\r\n this.router.navigate(['/portal/goods']);\r\n break;\r\n case 2:\r\n this.router.navigate(['/portal/slider']);\r\n break;\r\n case 3:\r\n this.router.navigate(['/portal/social']);\r\n break;\r\n default:\r\n this.router.navigate(['/portal']);\r\n break;\r\n }\r\n }\r\n\r\n public reloadCurrentRoute() {\r\n let currentUrl = this.router.url;\r\n this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {\r\n this.router.navigate([currentUrl]);\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UserModel } from 'src/models/user.model';\r\nimport { ShareDataService } from '../providers/sharedata.service';\r\nimport { CorrectYeKeService } from './correctyeke.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthService {\r\n private redirectUrl = '/';\r\n private loginUrl = '/login';\r\n private ordermanagementUrl = '/ordermanagement';\r\n private isloggedIn = false;\r\n public loggedInUser: UserModel;\r\n public users: UserModel[];\r\n // = [\r\n // {username: 'admin' , password : 'Sepidz@123'},\r\n // {username: 'user', password : '123'}];\r\n constructor(private storage: LocalStoreManager) {\r\n\r\n }\r\n isUserAuthenticated(username: string, password: string): boolean {\r\n let user: any;\r\n user = this.users.filter(\r\n u => CorrectYeKeService.getCorrectYeKe(u.name) === CorrectYeKeService.getCorrectYeKe(username) &&\r\n CorrectYeKeService.getCorrectYeKe(u.password) === CorrectYeKeService.getCorrectYeKe(password)\r\n );\r\n if (user.length !== 0) {\r\n this.isloggedIn = true;\r\n this.loggedInUser = user[0];\r\n //this.loggedInUser.loginDate = new Date();\r\n //this.storage.savePermanentData(this.loggedInUser, 'user');\r\n } else {\r\n this.isloggedIn = false;\r\n }\r\n return this.isloggedIn;\r\n }\r\n isUserLoggedIn(): boolean {\r\n return this.isloggedIn;\r\n }\r\n getRedirectUrl(): string {\r\n return this.redirectUrl;\r\n }\r\n setRedirectUrl(url: string): void {\r\n this.redirectUrl = url;\r\n }\r\n getLoginUrl(): string {\r\n return this.loginUrl;\r\n }\r\n getLoggedInUser(): UserModel {\r\n return this.loggedInUser;\r\n }\r\n getOrdermanagementUrl(): string {\r\n return this.ordermanagementUrl;\r\n }\r\n logoutUser(): void {\r\n this.isloggedIn = false;\r\n }\r\n getDiffDays(sDate, eDate) {\r\n var startDate = new Date(sDate);\r\n var endDate = new Date(eDate);\r\n var Time = endDate.getTime() - startDate.getTime();\r\n return Time / (1000 * 3600 * 24);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n@Injectable()\r\nexport class CorrectYeKeService {\r\n public static getCorrectYeKe(text: string): string {\r\n if (!(text))\r\n return text;\r\n var s = \"\";\r\n for (var i = 0; i <= text.length; i++) {\r\n if (text[i]) {\r\n switch (text[i]) {\r\n case String.fromCharCode(1705):\r\n s = s + String.fromCharCode(1603);\r\n break;\r\n case String.fromCharCode(1609):\r\n case String.fromCharCode(1740):\r\n s = s + String.fromCharCode(1610);\r\n break;\r\n default:\r\n s += text[i];\r\n break;\r\n }\r\n }\r\n }\r\n if (!(s))\r\n return text;\r\n return s;\r\n }\r\n}\r\n","// ===========================================\r\n// Email: info@ebenmonney.com\r\n// www.ebenmonney.com/templates\r\n// ===========================================\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpResponseBase, HttpResponse, HttpErrorResponse } from '@angular/common/http';\r\n\r\n@Injectable()\r\nexport class Utilities {\r\n public static readonly captionAndMessageSeparator = ':';\r\n public static readonly noNetworkMessageCaption = 'No Network';\r\n public static readonly noNetworkMessageDetail = 'The server cannot be reached';\r\n public static readonly accessDeniedMessageCaption = 'Access Denied!';\r\n public static readonly accessDeniedMessageDetail = '';\r\n public static readonly notFoundMessageCaption = 'Not Found';\r\n public static readonly notFoundMessageDetail = 'The target resource cannot be found';\r\n\r\n public static cookies =\r\n {\r\n getItem: (sKey) => {\r\n return decodeURIComponent(document.cookie.replace(new RegExp('(?:(?:^|.*;)\\\\s*' + encodeURIComponent(sKey).replace(/[\\-\\.\\+\\*]/g, '\\\\$&') + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$'), '$1')) || null;\r\n },\r\n setItem: (sKey, sValue, vEnd, sPath, sDomain, bSecure) => {\r\n if (!sKey || /^(?:expires|max\\-age|path|domain|secure)$/i.test(sKey)) {\r\n return false;\r\n }\r\n\r\n let sExpires = '';\r\n\r\n if (vEnd) {\r\n switch (vEnd.constructor) {\r\n case Number:\r\n sExpires = vEnd === Infinity ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT' : '; max-age=' + vEnd;\r\n break;\r\n case String:\r\n sExpires = '; expires=' + vEnd;\r\n break;\r\n case Date:\r\n sExpires = '; expires=' + vEnd.toUTCString();\r\n break;\r\n }\r\n }\r\n\r\n document.cookie = encodeURIComponent(sKey) + '=' + encodeURIComponent(sValue) + sExpires + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '') + (bSecure ? '; secure' : '');\r\n return true;\r\n },\r\n removeItem: (sKey, sPath, sDomain) => {\r\n if (!sKey) {\r\n return false;\r\n }\r\n document.cookie = encodeURIComponent(sKey) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '');\r\n return true;\r\n },\r\n hasItem: (sKey) => {\r\n return (new RegExp('(?:^|;\\\\s*)' + encodeURIComponent(sKey).replace(/[\\-\\.\\+\\*]/g, '\\\\$&') + '\\\\s*\\\\=')).test(document.cookie);\r\n },\r\n keys: () => {\r\n const aKeys = document.cookie.replace(/((?:^|\\s*;)[^\\=]+)(?=;|$)|^\\s*|\\s*(?:\\=[^;]*)?(?:\\1|$)/g, '').split(/\\s*(?:\\=[^;]*)?;\\s*/);\r\n for (let nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }\r\n return aKeys;\r\n }\r\n };\r\n\r\n public static getHttpResponseMessages(data: HttpResponseBase | any): string[] {\r\n const responses: string[] = [];\r\n\r\n if (data instanceof HttpResponseBase) {\r\n if (this.checkNoNetwork(data)) {\r\n responses.push(`${this.noNetworkMessageCaption}${this.captionAndMessageSeparator} ${this.noNetworkMessageDetail}`);\r\n } else {\r\n const responseObject = this.getResponseBody(data);\r\n\r\n if (responseObject && (typeof responseObject === 'object' || responseObject instanceof Object)) {\r\n for (const key in responseObject) {\r\n if (key) {\r\n responses.push(`${key}${this.captionAndMessageSeparator} ${responseObject[key]}`);\r\n } else if (responseObject[key]) {\r\n responses.push(responseObject[key].toString());\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!responses.length) {\r\n if ((data as any).body) {\r\n responses.push(`body: ${(data as any).body}`);\r\n }\r\n\r\n if ((data as any).error) {\r\n responses.push(`error: ${(data as any).error}`);\r\n }\r\n }\r\n }\r\n\r\n if (!responses.length) {\r\n if (this.getResponseBody(data)) {\r\n responses.push(this.getResponseBody(data).toString());\r\n } else {\r\n responses.push(data.toString());\r\n }\r\n }\r\n\r\n if (this.checkAccessDenied(data)) {\r\n responses.splice(0, 0, `${this.accessDeniedMessageCaption}${this.captionAndMessageSeparator} ${this.accessDeniedMessageDetail}`);\r\n }\r\n\r\n if (this.checkNotFound(data)) {\r\n let message = `${this.notFoundMessageCaption}${this.captionAndMessageSeparator} ${this.notFoundMessageDetail}`;\r\n if (data.url) {\r\n message += `. ${data.url}`;\r\n }\r\n\r\n responses.splice(0, 0, message);\r\n }\r\n\r\n return responses;\r\n }\r\n\r\n public static getHttpResponseMessage(data: HttpResponseBase | any): string {\r\n const httpMessage =\r\n Utilities.findHttpResponseMessage(Utilities.noNetworkMessageCaption, data) ||\r\n Utilities.findHttpResponseMessage(Utilities.notFoundMessageCaption, data) ||\r\n Utilities.findHttpResponseMessage('error_description', data) ||\r\n Utilities.findHttpResponseMessage('error', data) ||\r\n Utilities.getHttpResponseMessages(data).join();\r\n\r\n return httpMessage;\r\n }\r\n\r\n public static findHttpResponseMessage(messageToFind: string, data: HttpResponse | any, seachInCaptionOnly = true, includeCaptionInResult = false): string {\r\n const searchString = messageToFind.toLowerCase();\r\n const httpMessages = this.getHttpResponseMessages(data);\r\n\r\n for (const message of httpMessages) {\r\n const fullMessage = Utilities.splitInTwo(message, this.captionAndMessageSeparator);\r\n\r\n if (fullMessage.firstPart && fullMessage.firstPart.toLowerCase().indexOf(searchString) !== -1) {\r\n return includeCaptionInResult ? message : fullMessage.secondPart || fullMessage.firstPart;\r\n }\r\n }\r\n\r\n if (!seachInCaptionOnly) {\r\n for (const message of httpMessages) {\r\n if (message.toLowerCase().indexOf(searchString) !== -1) {\r\n if (includeCaptionInResult) {\r\n return message;\r\n } else {\r\n const fullMessage = Utilities.splitInTwo(message, this.captionAndMessageSeparator);\r\n return fullMessage.secondPart || fullMessage.firstPart;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public static getResponseBody(response: HttpResponseBase) {\r\n if (response instanceof HttpResponse) {\r\n return response.body;\r\n }\r\n\r\n if (response instanceof HttpErrorResponse) {\r\n return response.error || response.message || response.statusText;\r\n }\r\n }\r\n\r\n public static checkNoNetwork(response: HttpResponseBase) {\r\n if (response instanceof HttpResponseBase) {\r\n return response.status === 0;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static checkAccessDenied(response: HttpResponseBase) {\r\n if (response instanceof HttpResponseBase) {\r\n return response.status === 403;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static checkNotFound(response: HttpResponseBase) {\r\n if (response instanceof HttpResponseBase) {\r\n return response.status === 404;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static checkIsLocalHost(url: string, base?: string) {\r\n if (url) {\r\n const location = new URL(url, base);\r\n return location.hostname === 'localhost' || location.hostname === '127.0.0.1';\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static getQueryParamsFromString(paramString: string) {\r\n if (!paramString) {\r\n return null;\r\n }\r\n\r\n const params: { [key: string]: string } = {};\r\n\r\n for (const param of paramString.split('&')) {\r\n const keyValue = Utilities.splitInTwo(param, '=');\r\n params[keyValue.firstPart] = keyValue.secondPart;\r\n }\r\n\r\n return params;\r\n }\r\n\r\n public static splitInTwo(text: string, separator: string): { firstPart: string, secondPart: string } {\r\n const separatorIndex = text.indexOf(separator);\r\n\r\n if (separatorIndex === -1) {\r\n return { firstPart: text, secondPart: null };\r\n }\r\n\r\n const part1 = text.substr(0, separatorIndex).trim();\r\n const part2 = text.substr(separatorIndex + 1).trim();\r\n\r\n return { firstPart: part1, secondPart: part2 };\r\n }\r\n\r\n public static safeStringify(object) {\r\n let result: string;\r\n\r\n try {\r\n result = JSON.stringify(object);\r\n return result;\r\n } catch (error) {\r\n }\r\n\r\n const simpleObject = {};\r\n\r\n for (const prop in object) {\r\n if (!object.hasOwnProperty(prop)) {\r\n continue;\r\n }\r\n if (typeof (object[prop]) === 'object') {\r\n continue;\r\n }\r\n if (typeof (object[prop]) === 'function') {\r\n continue;\r\n }\r\n simpleObject[prop] = object[prop];\r\n }\r\n\r\n result = '[***Sanitized Object***]: ' + JSON.stringify(simpleObject);\r\n\r\n return result;\r\n }\r\n\r\n public static JsonTryParse(value: string) {\r\n try {\r\n return JSON.parse(value);\r\n } catch (e) {\r\n if (value === 'undefined') {\r\n return void 0;\r\n }\r\n return value;\r\n }\r\n }\r\n\r\n public static TestIsObjectEmpty(obj: any) {\r\n for (const prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public static TestIsUndefined(value: any) {\r\n return typeof value === 'undefined';\r\n // return value ===undefined;\r\n }\r\n\r\n public static TestIsString(value: any) {\r\n return typeof value === 'string' || value instanceof String;\r\n }\r\n\r\n public static capitalizeFirstLetter(text: string) {\r\n if (text) {\r\n return text.charAt(0).toUpperCase() + text.slice(1);\r\n } else {\r\n return text;\r\n }\r\n }\r\n\r\n public static toTitleCase(text: string) {\r\n return text.replace(/\\w\\S*/g, (subString) => {\r\n return subString.charAt(0).toUpperCase() + subString.substr(1).toLowerCase();\r\n });\r\n }\r\n\r\n public static toLowerCase(items: string);\r\n public static toLowerCase(items: string[]);\r\n public static toLowerCase(items: any): string | string[] {\r\n if (items instanceof Array) {\r\n const loweredRoles: string[] = [];\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n loweredRoles[i] = items[i].toLowerCase();\r\n }\r\n\r\n return loweredRoles;\r\n } else if (typeof items === 'string' || items instanceof String) {\r\n return items.toLowerCase();\r\n }\r\n }\r\n\r\n public static uniqueId() {\r\n return this.randomNumber(1000000, 9000000).toString();\r\n }\r\n\r\n public static randomNumber(min: number, max: number) {\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n public static baseUrl() {\r\n let base = '';\r\n\r\n if (window.location.origin) {\r\n base = window.location.origin;\r\n } else {\r\n base = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');\r\n }\r\n\r\n return base.replace(/\\/$/, '');\r\n }\r\n\r\n public static printDateOnly(date: Date) {\r\n date = new Date(date);\r\n\r\n const dayNames = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');\r\n const monthNames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');\r\n\r\n const dayOfWeek = date.getDay();\r\n const dayOfMonth = date.getDate();\r\n let sup = '';\r\n const month = date.getMonth();\r\n const year = date.getFullYear();\r\n\r\n if (dayOfMonth === 1 || dayOfMonth === 21 || dayOfMonth === 31) {\r\n sup = 'st';\r\n } else if (dayOfMonth === 2 || dayOfMonth === 22) {\r\n sup = 'nd';\r\n } else if (dayOfMonth === 3 || dayOfMonth === 23) {\r\n sup = 'rd';\r\n } else {\r\n sup = 'th';\r\n }\r\n\r\n const dateString = dayNames[dayOfWeek] + ', ' + dayOfMonth + sup + ' ' + monthNames[month] + ' ' + year;\r\n\r\n return dateString;\r\n }\r\n\r\n public static printTimeOnly(date: Date) {\r\n date = new Date(date);\r\n\r\n let period = '';\r\n let minute = date.getMinutes().toString();\r\n let hour = date.getHours();\r\n\r\n period = hour < 12 ? 'AM' : 'PM';\r\n\r\n if (hour === 0) {\r\n hour = 12;\r\n }\r\n if (hour > 12) {\r\n hour = hour - 12;\r\n }\r\n\r\n if (minute.length === 1) {\r\n minute = '0' + minute;\r\n }\r\n\r\n const timeString = hour + ':' + minute + ' ' + period;\r\n\r\n return timeString;\r\n }\r\n\r\n public static printDate(date: Date, separator = 'at') {\r\n return `${Utilities.printDateOnly(date)} ${separator} ${Utilities.printTimeOnly(date)}`;\r\n }\r\n\r\n public static printFriendlyDate(date: Date, separator = '-') {\r\n const today = new Date(); today.setHours(0, 0, 0, 0);\r\n const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1);\r\n const test = new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n\r\n if (test.toDateString() === today.toDateString()) {\r\n return `Today ${separator} ${Utilities.printTimeOnly(date)}`;\r\n }\r\n if (test.toDateString() === yesterday.toDateString()) {\r\n return `Yesterday ${separator} ${Utilities.printTimeOnly(date)}`;\r\n } else {\r\n return Utilities.printDate(date, separator);\r\n }\r\n }\r\n\r\n public static printShortDate(date: Date, separator = '/', dateTimeSeparator = '-') {\r\n let day = date.getDate().toString();\r\n let month = (date.getMonth() + 1).toString();\r\n const year = date.getFullYear();\r\n\r\n if (day.length === 1) {\r\n day = '0' + day;\r\n }\r\n\r\n if (month.length === 1) {\r\n month = '0' + month;\r\n }\r\n\r\n return `${month}${separator}${day}${separator}${year} ${dateTimeSeparator} ${Utilities.printTimeOnly(date)}`;\r\n }\r\n\r\n public static parseDate(date) {\r\n if (date) {\r\n if (date instanceof Date) {\r\n return date;\r\n }\r\n\r\n if (typeof date === 'string' || date instanceof String) {\r\n if (date.search(/[a-su-z+]/i) === -1) {\r\n date = date + 'Z';\r\n }\r\n\r\n return new Date(date);\r\n }\r\n\r\n if (typeof date === 'number' || date instanceof Number) {\r\n return new Date(date as any);\r\n }\r\n }\r\n }\r\n\r\n public static printDuration(start: Date, end: Date) {\r\n start = new Date(start);\r\n end = new Date(end);\r\n\r\n // get total seconds between the times\r\n let delta = Math.abs(start.valueOf() - end.valueOf()) / 1000;\r\n\r\n // calculate (and subtract) whole days\r\n const days = Math.floor(delta / 86400);\r\n delta -= days * 86400;\r\n\r\n // calculate (and subtract) whole hours\r\n const hours = Math.floor(delta / 3600) % 24;\r\n delta -= hours * 3600;\r\n\r\n // calculate (and subtract) whole minutes\r\n const minutes = Math.floor(delta / 60) % 60;\r\n delta -= minutes * 60;\r\n\r\n // what's left is seconds\r\n const seconds = delta % 60; // in theory the modulus is not required\r\n\r\n let printedDays = '';\r\n\r\n if (days) {\r\n printedDays = `${days} days`;\r\n }\r\n\r\n if (hours) {\r\n printedDays += printedDays ? `, ${hours} hours` : `${hours} hours`;\r\n }\r\n\r\n if (minutes) {\r\n printedDays += printedDays ? `, ${minutes} minutes` : `${minutes} minutes`;\r\n }\r\n\r\n if (seconds) {\r\n printedDays += printedDays ? ` and ${seconds} seconds` : `${seconds} seconds`;\r\n }\r\n\r\n if (!printedDays) {\r\n printedDays = '0';\r\n }\r\n\r\n return printedDays;\r\n }\r\n\r\n public static getAge(birthDate, otherDate) {\r\n birthDate = new Date(birthDate);\r\n otherDate = new Date(otherDate);\r\n\r\n let years = (otherDate.getFullYear() - birthDate.getFullYear());\r\n\r\n if (otherDate.getMonth() < birthDate.getMonth() ||\r\n otherDate.getMonth() === birthDate.getMonth() && otherDate.getDate() < birthDate.getDate()) {\r\n years--;\r\n }\r\n\r\n return years;\r\n }\r\n\r\n public static searchArray(searchTerm: string, caseSensitive: boolean, ...values: any[]) {\r\n if (!searchTerm) {\r\n return true;\r\n }\r\n\r\n let filter = searchTerm.trim();\r\n let data = values.join();\r\n\r\n if (!caseSensitive) {\r\n filter = filter.toLowerCase();\r\n data = data.toLowerCase();\r\n }\r\n\r\n return data.indexOf(filter) !== -1;\r\n }\r\n\r\n public static moveArrayItem(array: any[], oldIndex, newIndex) {\r\n if (oldIndex < 0) {\r\n return;\r\n }\r\n\r\n if (newIndex < 0) {\r\n newIndex += array.length;\r\n }\r\n\r\n if (newIndex >= array.length) {\r\n let k = newIndex - array.length;\r\n while ((k--) + 1) {\r\n array.push(undefined);\r\n }\r\n }\r\n\r\n array.splice(newIndex, 0, array.splice(oldIndex, 1)[0]);\r\n }\r\n\r\n public static expandCamelCase(text: string) {\r\n if (!text) {\r\n return text;\r\n }\r\n\r\n return text.replace(/([A-Z][a-z]+)/g, ' $1')\r\n .replace(/([A-Z][A-Z]+)/g, ' $1')\r\n .replace(/([^A-Za-z ]+)/g, ' $1');\r\n }\r\n\r\n public static testIsAbsoluteUrl(url: string) {\r\n const r = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n return r.test(url);\r\n }\r\n\r\n public static convertToAbsoluteUrl(url: string) {\r\n return Utilities.testIsAbsoluteUrl(url) ? url : '//' + url;\r\n }\r\n\r\n public static removeNulls(obj) {\r\n const isArray = obj instanceof Array;\r\n\r\n for (let k = 0; k < obj.length; k++) {\r\n if (obj[k] === null) {\r\n isArray ? obj.splice(k, 1) : delete obj[k];\r\n } else if (typeof obj[k] === 'object') {\r\n Utilities.removeNulls(obj[k]);\r\n }\r\n\r\n if (isArray && obj.length === k) {\r\n Utilities.removeNulls(obj);\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n public static debounce(func: (...args) => any, wait: number, immediate?: boolean) {\r\n let timeout;\r\n\r\n return function () {\r\n const context = this;\r\n const args_ = arguments;\r\n\r\n const later = function () {\r\n timeout = null;\r\n if (!immediate) {\r\n func.apply(context, args_);\r\n }\r\n };\r\n\r\n const callNow = immediate && !timeout;\r\n\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n\r\n if (callNow) {\r\n func.apply(context, args_);\r\n }\r\n };\r\n }\r\n}\r\n","// ===========================================\r\n// Email: info@ebenmonney.com\r\n// www.ebenmonney.com/templates\r\n// ===========================================\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { Utilities } from './utilities';\r\n\r\n@Injectable()\r\n/**\r\n* Provides a wrapper for accessing the web storage API and synchronizing session storage across tabs/windows.\r\n*/\r\nexport class LocalStoreManager {\r\n private static syncListenerInitialised = false;\r\n\r\n public static readonly DBKEY_USER_DATA = 'user_data';\r\n private static readonly DBKEY_SYNC_KEYS = 'sync_keys';\r\n private syncKeys: string[] = [];\r\n private initEvent = new Subject();\r\n\r\n private reservedKeys: string[] =\r\n [\r\n 'sync_keys',\r\n 'addToSyncKeys',\r\n 'removeFromSyncKeys',\r\n 'getSessionStorage',\r\n 'setSessionStorage',\r\n 'addToSessionStorage',\r\n 'removeFromSessionStorage',\r\n 'clearAllSessionsStorage'\r\n ];\r\n\r\n public initialiseStorageSyncListener() {\r\n if (LocalStoreManager.syncListenerInitialised === true) {\r\n return;\r\n }\r\n\r\n LocalStoreManager.syncListenerInitialised = true;\r\n window.addEventListener('storage', this.sessionStorageTransferHandler, false);\r\n this.syncSessionStorage();\r\n }\r\n\r\n public deinitialiseStorageSyncListener() {\r\n window.removeEventListener('storage', this.sessionStorageTransferHandler, false);\r\n LocalStoreManager.syncListenerInitialised = false;\r\n }\r\n\r\n public clearAllStorage() {\r\n this.clearAllSessionsStorage();\r\n this.clearLocalStorage();\r\n }\r\n public set(key, value, ttl = null) {\r\n if (ttl) {\r\n const expires = new Date();\r\n expires.setSeconds(expires.getSeconds() + ttl);\r\n localStorage.set(key, [expires, value]);\r\n } else {\r\n localStorage.set(key, [null, value]);\r\n }\r\n }\r\n public clearAllSessionsStorage() {\r\n this.clearInstanceSessionStorage();\r\n localStorage.removeItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n\r\n localStorage.setItem('clearAllSessionsStorage', '_dummy');\r\n localStorage.removeItem('clearAllSessionsStorage');\r\n }\r\n\r\n public clearInstanceSessionStorage() {\r\n sessionStorage.clear();\r\n this.syncKeys = [];\r\n }\r\n\r\n public clearLocalStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n public saveSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSyncKeys(key);\r\n localStorage.removeItem(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n public saveSyncedSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n localStorage.removeItem(key);\r\n this.addToSessionStorage(data, key);\r\n }\r\n\r\n public savePermanentData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n this.localStorageSetItem(key, data);\r\n }\r\n\r\n public moveDataToSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n const data = this.getData(key);\r\n\r\n if (data === null) {\r\n return;\r\n }\r\n\r\n this.saveSessionData(data, key);\r\n }\r\n\r\n public moveDataToSyncedSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n const data = this.getData(key);\r\n\r\n if (data === null) {\r\n return;\r\n }\r\n\r\n this.saveSyncedSessionData(data, key);\r\n }\r\n\r\n public moveDataToPermanentStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n const data = this.getData(key);\r\n\r\n if (data === null) {\r\n return;\r\n }\r\n\r\n this.savePermanentData(data, key);\r\n }\r\n\r\n public exists(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n let data = sessionStorage.getItem(key);\r\n\r\n if (data === null) {\r\n data = localStorage.getItem(key);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n public getData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.sessionStorageGetItem(key);\r\n\r\n if (data === null) {\r\n data = this.localStorageGetItem(key);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n public getDataObject(key = LocalStoreManager.DBKEY_USER_DATA, isDateType = false): T {\r\n let data = this.getData(key);\r\n\r\n if (data !== null) {\r\n if (isDateType) {\r\n data = new Date(data);\r\n }\r\n return data as T;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n public deleteData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n localStorage.removeItem(key);\r\n }\r\n\r\n public getInitEvent(): Observable<{}> {\r\n return this.initEvent.asObservable();\r\n }\r\n\r\n private sessionStorageTransferHandler = (event: StorageEvent) => {\r\n if (!event.newValue) {\r\n return;\r\n }\r\n\r\n if (event.key === 'getSessionStorage') {\r\n if (sessionStorage.length) {\r\n this.localStorageSetItem('setSessionStorage', sessionStorage);\r\n localStorage.removeItem('setSessionStorage');\r\n }\r\n } else if (event.key === 'setSessionStorage') {\r\n if (!this.syncKeys.length) {\r\n this.loadSyncKeys();\r\n }\r\n const data = JSON.parse(event.newValue);\r\n // console.info(\"Set => Key: Transfer setSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n for (const key in data) {\r\n if (this.syncKeysContains(key)) {\r\n this.sessionStorageSetItem(key, JSON.parse(data[key]));\r\n }\r\n }\r\n\r\n this.onInit();\r\n } else if (event.key === 'addToSessionStorage') {\r\n const data = JSON.parse(event.newValue);\r\n\r\n // console.warn(\"Set => Key: Transfer addToSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n this.addToSessionStorageHelper(data.data, data.key);\r\n } else if (event.key === 'removeFromSessionStorage') {\r\n this.removeFromSessionStorageHelper(event.newValue);\r\n } else if (event.key === 'clearAllSessionsStorage' && sessionStorage.length) {\r\n this.clearInstanceSessionStorage();\r\n } else if (event.key === 'addToSyncKeys') {\r\n this.addToSyncKeysHelper(event.newValue);\r\n } else if (event.key === 'removeFromSyncKeys') {\r\n this.removeFromSyncKeysHelper(event.newValue);\r\n }\r\n }\r\n\r\n private syncSessionStorage() {\r\n localStorage.setItem('getSessionStorage', '_dummy');\r\n localStorage.removeItem('getSessionStorage');\r\n }\r\n\r\n private addToSessionStorage(data: any, key: string) {\r\n this.addToSessionStorageHelper(data, key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n this.localStorageSetItem('addToSessionStorage', { key, data });\r\n localStorage.removeItem('addToSessionStorage');\r\n }\r\n\r\n private addToSessionStorageHelper(data: any, key: string) {\r\n this.addToSyncKeysHelper(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n private removeFromSessionStorage(keyToRemove: string) {\r\n this.removeFromSessionStorageHelper(keyToRemove);\r\n this.removeFromSyncKeysBackup(keyToRemove);\r\n\r\n localStorage.setItem('removeFromSessionStorage', keyToRemove);\r\n localStorage.removeItem('removeFromSessionStorage');\r\n }\r\n\r\n private removeFromSessionStorageHelper(keyToRemove: string) {\r\n sessionStorage.removeItem(keyToRemove);\r\n this.removeFromSyncKeysHelper(keyToRemove);\r\n }\r\n\r\n private testForInvalidKeys(key: string) {\r\n if (!key) {\r\n throw new Error('key cannot be empty');\r\n }\r\n\r\n if (this.reservedKeys.some(x => x === key)) {\r\n throw new Error(`The storage key \"${key}\" is reserved and cannot be used. Please use a different key`);\r\n }\r\n }\r\n\r\n private syncKeysContains(key: string) {\r\n return this.syncKeys.some(x => x === key);\r\n }\r\n\r\n private loadSyncKeys() {\r\n if (this.syncKeys.length) {\r\n return;\r\n }\r\n\r\n this.syncKeys = this.getSyncKeysFromStorage();\r\n }\r\n\r\n private getSyncKeysFromStorage(defaultValue: string[] = []): string[] {\r\n const data = this.localStorageGetItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n\r\n if (data === null) {\r\n return defaultValue;\r\n } else {\r\n return data as string[];\r\n }\r\n }\r\n\r\n private addToSyncKeys(key: string) {\r\n this.addToSyncKeysHelper(key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n localStorage.setItem('addToSyncKeys', key);\r\n localStorage.removeItem('addToSyncKeys');\r\n }\r\n\r\n private addToSyncKeysBackup(key: string) {\r\n const storedSyncKeys = this.getSyncKeysFromStorage();\r\n\r\n if (!storedSyncKeys.some(x => x === key)) {\r\n storedSyncKeys.push(key);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n private removeFromSyncKeysBackup(key: string) {\r\n const storedSyncKeys = this.getSyncKeysFromStorage();\r\n\r\n const index = storedSyncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n storedSyncKeys.splice(index, 1);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n private addToSyncKeysHelper(key: string) {\r\n if (!this.syncKeysContains(key)) {\r\n this.syncKeys.push(key);\r\n }\r\n }\r\n\r\n private removeFromSyncKeys(key: string) {\r\n this.removeFromSyncKeysHelper(key);\r\n this.removeFromSyncKeysBackup(key);\r\n\r\n localStorage.setItem('removeFromSyncKeys', key);\r\n localStorage.removeItem('removeFromSyncKeys');\r\n }\r\n\r\n private removeFromSyncKeysHelper(key: string) {\r\n const index = this.syncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n this.syncKeys.splice(index, 1);\r\n }\r\n }\r\n\r\n private localStorageSetItem(key: string, data: any) {\r\n localStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private sessionStorageSetItem(key: string, data: any) {\r\n sessionStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private localStorageGetItem(key: string) {\r\n return Utilities.JsonTryParse(localStorage.getItem(key));\r\n }\r\n\r\n private sessionStorageGetItem(key: string) {\r\n return Utilities.JsonTryParse(sessionStorage.getItem(key));\r\n }\r\n\r\n private onInit() {\r\n setTimeout(() => {\r\n this.initEvent.next();\r\n this.initEvent.complete();\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GroupByService {\r\n groupby(value: Array, field: string): Array {\r\n const groupedObj = value.reduce((prev, cur) => {\r\n if (!prev[cur[field]]) {\r\n prev[cur[field]] = [cur];\r\n } else {\r\n prev[cur[field]].push(cur);\r\n }\r\n return prev;\r\n }, {});\r\n return Object.keys(groupedObj).map(key => ({\r\n key,\r\n value: groupedObj[key]\r\n }));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FactorModel } from 'src/models/factor.model';\r\nimport { TableGroupModel } from 'src/models/tablegroup.model';\r\n\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { RestApiService } from './rest-api.service';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\nimport { StateEnum } from 'src/models/enum/state.enum';\r\nimport { ShareDataService } from '../providers/sharedata.service';\r\nimport { GroupByService } from '../providers/groupby.service';\r\nimport { state } from '@angular/animations';\r\nimport { MatSnackBar } from '@angular/material';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { Router } from '@angular/router';\r\nimport { debug } from 'console';\r\nimport { PushNotificationsService } from './push.notification.service';\r\nimport { SwPush } from '@angular/service-worker';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class OrderService {\r\n private connection: signalR.HubConnection;\r\n tableGroup: TableGroupModel[];\r\n selectedGroup: TableModel[];\r\n groupFactors: any[];\r\n selectedFilter: string;\r\n factors: FactorModel[];\r\n selecteditem: any;\r\n tableCall: string;\r\n //selecteditem: boolean;\r\n forbidden: boolean;\r\n isConnect : boolean;\r\n constructor(\r\n private api: RestApiService,\r\n private spinner: NgxUiLoaderService,\r\n private share: ShareDataService,\r\n public grouplist: GroupByService,\r\n protected _snackBar: MatSnackBar,\r\n public toastr: ToastrService,\r\n public router: Router,\r\n private _notificationService: PushNotificationsService\r\n ) {\r\n // this._notificationService.requestPermission();\r\n }\r\n // public hubConnection: signalR.HubConnection;\r\n // public startConnection = () => {\r\n // if (!this.connection && !this.isConnect ) {\r\n // // this.getSetting();\r\n // this.hubConnection = new signalR.HubConnectionBuilder()\r\n // .withUrl(this.api.apiUrl + '/TableHub')\r\n // .configureLogging(signalR.LogLevel.Trace)\r\n // .build();\r\n // this.hubConnection.serverTimeoutInMilliseconds = 1000 * 60 * 1.2; // 1 second * 60 * 10 = 10 minutes.\r\n // this.hubConnection\r\n // .start()\r\n // .then(() => { console.log('Connection started'); this.isConnect = true; this.addTransferDataListener(); })\r\n // .catch(err => console.log('Error while starting connection: ' + err));\r\n // }\r\n // this.hubConnection.keepAliveIntervalInMilliseconds = 31104000000;\r\n // this.hubConnection\r\n // .onclose(() => {\r\n // setTimeout(() => {\r\n // if (!this.forbidden) {\r\n // this.isConnect = false;\r\n // this.startConnection();\r\n // }\r\n // }, 2000);\r\n // });\r\n // }\r\n disconnect() {\r\n if (this.connection) {\r\n this.connection.stop();\r\n this.connection = null;\r\n }\r\n }\r\n\r\n isEnabled() {\r\n return Notification.permission == \"granted\" ? true : false;\r\n }\r\n\r\n request() {\r\n this._notificationService.requestPermission();\r\n }\r\n\r\n notify(t: string, c: string) {\r\n let data: Array = [];\r\n data.push({\r\n title: t,\r\n alertContent: c,\r\n tag: \"گارسون\",\r\n sound: `${this.share.api.apiUrl}/assets/audio/notification.mp3`,\r\n dir: \"rtl\"\r\n });\r\n // data.push({\r\n // title: \"2 Title with badge\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // tag: \"tag_2\"\r\n // });\r\n\r\n // data.push({\r\n // title: \"3 Title, badge & body\",\r\n // alertContent: \"Notification body\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // tag: \"tag_3\"\r\n // });\r\n // data.push({\r\n // title: \"4 Tile, badge, body & icon\",\r\n // alertContent: \"Notification body\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // tag: \"tag_4\"\r\n // });\r\n // data.push({\r\n // title: \"5 Title, badge, body, icon & image\",\r\n // alertContent: \"Notification body\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // image: \"https://live.staticflickr.com/4134/4897775884_0d3b982b2f_b.jpg\",\r\n // tag: \"tag_5\"\r\n // });\r\n // data.push({\r\n // title: \"4 Tile, badge, body & icon\",\r\n // alertContent: \"Notification body - updated!\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // tag: \"tag_4\"\r\n // });\r\n // data.push({\r\n // title: \"6 Tile, badge, body & icon\",\r\n // alertContent: \"Notification body - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // tag: \"tag_6\"\r\n // });\r\n this._notificationService.generateNotification(data);\r\n }\r\n\r\n\r\n // addTransferDataListener = () => {\r\n // this.hubConnection.on('transferNotification', (res: number) => {\r\n // // for (let i = 0; i < this.tableGroup.length; i++) {\r\n // // const find = this.tableGroup[i].tables.find(f => f.tableId === res);\r\n // // if (find && find.tableName && find.tableName !== '') {\r\n // // this.tableCall = find.tableName;\r\n // // break;\r\n // // }\r\n // // }\r\n // const find = this.selectedGroup.find(f => f.tableId === res);\r\n // if (find && find.tableName && find.tableName !== '') {\r\n // this.request();\r\n // this.notify(find.tableName);\r\n // this.playAudio();\r\n // this.toastr.warning(`${find.tableName} در خواست مراجعه دارد`, 'توجه', { timeOut: 1000000, closeButton: true, positionClass: 'toast-bottom-right', });\r\n // }\r\n // });\r\n // this.hubConnection.on('transferOrderData', (data: FactorModel) => {\r\n // if (data.status != 0 && ((this.tableGroup) && (data.status === StateEnum.Save || data.status === StateEnum.SaveMerge))) {\r\n // for (let i = 0; i < this.tableGroup.length; i++) {\r\n // const find = this.tableGroup[i].tables.filter(f => f.tableId.toString() === data.tableId && f.branchCode === data.branchCode)[0];\r\n // if ((find)) {\r\n // if (data.tas && data.tas === 1) {\r\n // find.waiterId = null;\r\n // find.waiterName = '';\r\n // find.customerName = '';\r\n // find.time = null;\r\n // find.num = null;\r\n // if (this.share.filterTableList && this.share.tableList) {\r\n // const find = this.share.tableList.find(f => f.tableId.toString() === data.tableId);\r\n // if (!this.share.filterTableList.some(s => find.tableId === s.tableId))\r\n // this.share.filterTableList.push(find);\r\n // }\r\n // this.filter(this.selectedFilter);\r\n // break;\r\n // } else {\r\n // find.waiterId = data.waiterId;\r\n // find.waiterName = data.waiterName;\r\n // find.customerName = data.customerName;\r\n // find.time = data.time;\r\n // find.num = data.num;\r\n // if (this.share.filterTableList) {\r\n // const findIndex = this.share.filterTableList.findIndex(f => f.tableId === Number(data.tableId));\r\n // if ((findIndex))\r\n // this.share.filterTableList.splice(findIndex, 1);\r\n // }\r\n // this.filter(this.selectedFilter);\r\n // break;\r\n // }\r\n // }\r\n // }\r\n // if (this.share.setting?.systemLayer?.hasTabletOrder) {\r\n // this.refreshTableTimeLeft();\r\n // }\r\n // }\r\n // if ((data.id) && data.id !== 0 && (this.groupFactors) && data.status === StateEnum.Add) {\r\n // if (!this.groupFactors.some(s => s.key === data.tableId) && data.status === StateEnum.Add) {\r\n // this.factors.push(data);\r\n // this.groupFactors = this.grouplist.groupby(this.factors, 'tableId');\r\n // if (this.groupFactors.length === 1)\r\n // this.selecteditem = this.groupFactors[0].value;\r\n // }\r\n // else {\r\n // for (let j = 0; j < this.groupFactors.length; j++) {\r\n // if (!this.groupFactors.some(s => s.key === data.tableId)) {\r\n // this.factors.push(data);\r\n // this.groupFactors = this.grouplist.groupby(this.factors, 'tableId');\r\n // break;\r\n // }\r\n // if (this.groupFactors[j].value[0].tableId === data.tableId) {\r\n // if (data.status === StateEnum.Add) {\r\n // this.factors.push(data);\r\n // if (this.selecteditem[0].tableId === data.tableId)\r\n // this.selecteditem.push(data);\r\n // this.groupFactors = this.grouplist.groupby(this.factors, 'tableId');\r\n // break;\r\n // }\r\n // if (data.status === StateEnum.Deleted || data.status === StateEnum.Save || data.status === StateEnum.SaveMerge) {\r\n // this.groupFactors.splice(j, 1);\r\n // break;\r\n // }\r\n // }\r\n // }\r\n // //if (!this.groupFactors || this.groupFactors.length <= 0) {\r\n // // this.selecteditem = false;\r\n // //}\r\n // }\r\n // if (this.share.loginuser && this.share.loginuser.code)\r\n // this.playAudio();\r\n // }\r\n // this.spinner.stopAll();\r\n // this.share.getDigitalMenuCount();\r\n // });\r\n // this.hubConnection.on('RedirectResult', (data: any) => {\r\n // this.router.navigate([`/payment`]);\r\n // });\r\n // }\r\n filter(event: string) {\r\n this.selectedGroup = [];\r\n if (!(event)) {\r\n this.selectedFilter = 'All';\r\n } else {\r\n this.selectedFilter = event;\r\n }\r\n switch (this.selectedFilter) {\r\n case 'All':\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables);\r\n break;\r\n case 'Busy':\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables.filter(f => (f.num)));\r\n break;\r\n case 'Free':\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables.filter(f => !(f.num)));\r\n break;\r\n default:\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables);\r\n break;\r\n }\r\n }\r\n refreshTableTimeLeft() {\r\n this.api.getEntity('GetTableTimeLeft').subscribe((res: TableModel[]) => {\r\n if (res && res.length > 0 && this.tableGroup && this.tableGroup.length > 0) {\r\n for (let i = 0; i < this.tableGroup.length; i++) {\r\n res.forEach(el => {\r\n const find = this.tableGroup[i].tables.find(f => f.tableId === el.tableId);\r\n if (find)\r\n find.time = el.time;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n playAudio() {\r\n let audio = new Audio();\r\n audio.src = \"../../../assets/audio/alarm.mp4\";\r\n audio.load();\r\n audio.play();\r\n }\r\n playNAudio() {\r\n let audio = new Audio();\r\n audio.src = \"../../../assets/audio/notification.mp3\";\r\n audio.load();\r\n audio.play();\r\n }\r\n //stopConnection() {\r\n // this.hubConnection.stop();\r\n //}\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material\";\r\nimport { NgxUiLoaderService } from \"ngx-ui-loader\";\r\nimport { Observable, Subject } from \"rxjs/Rx\";\r\nimport { DialogComponent } from \"src/app/dialog/dialog.component\";\r\nimport { FactorModel, InvoiceModel } from \"../models/factor.model\";\r\nimport { WebsocketService } from \"./websocket.service\";\r\n\r\nconst CHAT_URL = \"ws://127.0.0.1:1372/\";\r\n//const CHAT_URL = \"ws://192.168.247.65:1372/\";\r\n\r\nexport class ParsianPaymentModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n AM: string;\r\n paymentType: string;\r\n GovID: string;\r\n SC: string;\r\n ID: string;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = \"Sale\";\r\n this.AM = \"0\";\r\n this.paymentType = \"CARD\";\r\n this.ID = \"\";\r\n this.GovID = \"\";\r\n this.SC = \"4020\";\r\n }\r\n}\r\nexport class ParsianPosInfoModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = 'getMerchantInfo';\r\n }\r\n}\r\nexport class ParsianHasPaperModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = 'checkPaper';\r\n }\r\n}\r\nexport class ParsianReceiptBitMapModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n invoice: InvoiceModel;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = 'receiptBitMap';\r\n this.invoice = null;\r\n }\r\n}\r\nexport class ParsianResponseModel {\r\n compName: string;\r\n trxType: string;\r\n RS: any;\r\n CN: any;\r\n RN: any;\r\n SN: any;\r\n TN: any;\r\n DT: any;\r\n AM: any;\r\n PS: any;\r\n CP: any;\r\n GI: any;\r\n TO: any;\r\n BR: any;\r\n MI: any;\r\n TS: any;\r\n TF: any;\r\n ER: any;\r\n RC: any;\r\n}\r\n@Injectable()\r\nexport class ParsianPosService {\r\n public messages: Subject;\r\n public factorPrin = '';\r\n constructor(private wsService: WebsocketService, private dialog: MatDialog, private spinner: NgxUiLoaderService) { }\r\n\r\n connect(){\r\n this.messages = >this.wsService.connect(CHAT_URL).map(\r\n (response: MessageEvent): ParsianResponseModel => {\r\n let data: ParsianResponseModel = JSON.parse(response.data);\r\n let res: boolean = false;\r\n if (data.ER !== 'null') {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `${data.ER}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n res = false;\r\n this.spinner.stopAll();\r\n return;\r\n\r\n });\r\n }\r\n else {\r\n if (data.RS !== 'null') {\r\n if (data.RS === '00') {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `پرداخت با موفقیت انجام شد شماره پیگیری : ${data.SN}`;\r\n res = true;\r\n dialogRef.afterClosed().subscribe(result => {\r\n res = true;\r\n this.spinner.stopAll();\r\n\r\n });\r\n }\r\n else {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `پرداخت با خطا روبرو شد `;\r\n dialogRef.afterClosed().subscribe(result => {\r\n res = false;\r\n this.spinner.stopAll();\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.spinner.stopAll();\r\n return data;\r\n }\r\n );\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Pipe({\r\n name: 'persianNumber',\r\n pure: false\r\n})\r\nexport class PersianNumberPipe implements PipeTransform {\r\n constructor(private translate: TranslateService) { }\r\n\r\n transform(value: any): string {\r\n if ((value === undefined || value === null) ||\r\n (this.translate.currentLang && this.translate.currentLang.toLowerCase() !== \"fa\")) {\r\n // return this.toEnglishNumber(value.toString());\r\n return value;\r\n }\r\n return this.toPersianNumber(value.toString());\r\n }\r\n public toPersianNumber(number: string): string {\r\n if (number === undefined) {\r\n return '';\r\n }\r\n let str = number.toString().trim();\r\n if (str === '') {\r\n return '';\r\n }\r\n str = str.replace(/0/g, '۰');\r\n str = str.replace(/1/g, '۱');\r\n str = str.replace(/2/g, '۲');\r\n str = str.replace(/3/g, '۳');\r\n str = str.replace(/4/g, '۴');\r\n str = str.replace(/5/g, '۵');\r\n str = str.replace(/6/g, '۶');\r\n str = str.replace(/7/g, '۷');\r\n str = str.replace(/8/g, '۸');\r\n str = str.replace(/9/g, '۹');\r\n return str;\r\n }\r\n public toEnglishNumber(number: string): string {\r\n if (number === undefined) {\r\n return '';\r\n }\r\n let str = number.toString().trim();\r\n if (str === '') {\r\n return '';\r\n }\r\n str = str.replace('۰', '0');\r\n str = str.replace('۱', '1');\r\n str = str.replace('۲', '2');\r\n str = str.replace('۳', '3');\r\n str = str.replace('۴', '4');\r\n str = str.replace('۵', '5');\r\n str = str.replace('۶', '6');\r\n str = str.replace('۷', '7');\r\n str = str.replace('۸', '8');\r\n str = str.replace('۹', '9');\r\n return str;\r\n }\r\n}\r\n","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { Subject } from \"rxjs-compat\";\r\nimport { FactorModel, InvoiceDetailsModel, InvoiceModel, PrintInvoiceModel } from \"src/models/factor.model\";\r\nimport { LocalStoreManager } from \"./local-store-manager.service\";\r\nimport { ParsianHasPaperModel, ParsianPaymentModel, ParsianPosService, ParsianReceiptBitMapModel, ParsianResponseModel } from \"./parsianpos.service\";\r\nimport { RestApiService } from \"./rest-api.service\";\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { MatDialog, MatSnackBar } from '@angular/material';\r\nimport { DialogComponent } from \"../app/dialog/dialog.component\";\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\nimport { TableGroupModel } from \"../models/tablegroup.model\";\r\nimport { OrderService } from \"./order.service\";\r\nimport { ShareDataService } from \"../providers/sharedata.service\";\r\n\r\n@Injectable()\r\nexport class PosClearingService implements OnDestroy {\r\n tasvieh: any;\r\n constructor(private parsianSerice: ParsianPosService,\r\n private api: RestApiService,\r\n private storage: LocalStoreManager,\r\n protected translateText: TranslateService,\r\n private dialog: MatDialog,\r\n protected _snackBar: MatSnackBar,\r\n private order: OrderService,\r\n private share: ShareDataService) {\r\n }\r\n ngUnsubscribe = new Subject();\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n clear(factor?: FactorModel,) {\r\n\r\n this.tasvieh = this.storage.getData('Settlement');\r\n // Matin Req For zero Price Print\r\n if ((this.tasvieh && this.tasvieh?.Id <= 1) || !this.tasvieh || factor.price === 0) {\r\n this.clearing(factor);\r\n return;\r\n }\r\n switch (this.tasvieh?.Id) {\r\n case 2:\r\n this.parsianpayment(factor);\r\n break;\r\n case 3:\r\n this.parsianpayment(factor);\r\n break;\r\n case 4:\r\n this.parsianpayment(factor);\r\n break;\r\n default:\r\n console.warn('نحوه پرداخت پیدا نشد');\r\n break;\r\n }\r\n }\r\n parsianpayment(factor: FactorModel) {\r\n this.parsianSerice.connect();\r\n this.parsianSerice.messages.next(new ParsianHasPaperModel);\r\n this.parsianSerice.messages.subscribe((res: ParsianResponseModel) => {\r\n if (res?.CP === '-1') {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `پرینتر کاغذ ندارد`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n return;\r\n });\r\n }\r\n else {\r\n const payment = new ParsianPaymentModel();\r\n payment.AM = factor.price.toString();\r\n this.parsianSerice.connect();\r\n this.parsianSerice.messages.next(payment);\r\n this.parsianSerice.messages.subscribe((res: ParsianResponseModel) => {\r\n this._snackBar.open('', this.translateText.instant('Message.SaveData'), {\r\n duration: 10000,\r\n });\r\n factor.transactionNo = res?.SN;\r\n factor.errorMessagePay = res?.ER;\r\n factor.transactionNo = res?.SN;\r\n if (res?.RS === '00')\r\n this.clearing(factor);\r\n });\r\n }\r\n });\r\n }\r\n clearing(factor: FactorModel) {\r\n this.api.postEntity(factor, 'UpdateFactorState')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((res: FactorModel) => {\r\n this._snackBar.open('', this.translateText.instant('Message.SaveData'), {\r\n duration: 10000,\r\n });\r\n this.print(res)\r\n });\r\n }\r\n print(factor: FactorModel) {\r\n if (this.tasvieh && this.tasvieh.Id === 2 || this.tasvieh.Id === 3 || this.tasvieh.Id === 4) { //2_saman & 4_irankish also use the same method as parsian\r\n this.ParsianPrint(factor)\r\n }\r\n }\r\n ParsianPrint(factor: FactorModel) {\r\n const factorList = [];\r\n const payment = new ParsianReceiptBitMapModel();\r\n factorList.push(factor);\r\n payment.invoice = factorList.maper(new InvoiceModel())[0];\r\n payment.invoice.invoiceDetail = factorList[0].factorDetail.maper(new InvoiceDetailsModel());\r\n payment.invoice.restaurantName = this.share.setting.brandName;\r\n for (const element of payment.invoice.invoiceDetail) {\r\n if (this.share.setting.currency === 1) element.unitPrice /= 10; //if Toman, convert price to toman\r\n element.qty = element.qty ;\r\n payment.invoice.sumQty += element.qty;\r\n payment.invoice.sumPrice += element.qty * element.unitPrice * 10;\r\n element.sumUnitPrice = element.qty * element.unitPrice * 10;\r\n }\r\n if (!payment.invoice.usedCredit)\r\n payment.invoice.usedCredit = 0;\r\n payment.invoice.creditPrice = payment.invoice.usedCredit;\r\n this.parsianSerice.connect();\r\n this.parsianSerice.messages.next(payment);\r\n this.parsianSerice.messages.subscribe((res: ParsianResponseModel) => {\r\n //this.dialogRef.close();\r\n const print = new PrintInvoiceModel();\r\n print.branchCode = factor.branchCode;\r\n print.num = factor.num;\r\n print.pr =1;\r\n this.api.postEntity(print, 'UpdateInvoicePrintFlag')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((res: FactorModel) => {\r\n this.refresh();\r\n });\r\n });\r\n }\r\n refresh() {\r\n this.api.getEntity('TablesGroup')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((res: TableGroupModel[]) => {\r\n if (!res) {\r\n throw new Error('');\r\n }\r\n this.order.tableGroup = res;\r\n if (!this.share.selectedGroupIndex) {\r\n this.order.selectedGroup = Object.assign([], this.order.tableGroup[0].tables);\r\n this.share.selectedGroupIndex = 0;\r\n }\r\n else {\r\n this.order.selectedGroup = Object.assign([], this.order.tableGroup[this.share.selectedGroupIndex].tables);\r\n }\r\n this.order.forbidden = false;\r\n // this.order.startConnection();\r\n this.order.refreshTableTimeLeft();\r\n this.order.filter(this.order.selectedFilter);\r\n //this.tabGroup.selectedIndex = this.share.selectedGroupIndex;\r\n });\r\n }\r\n}\r\n","import { Observable } from \"rxjs\";\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n@Injectable()\r\nexport class PushNotificationsService {\r\n public permission: Permission;\r\n\r\n constructor() {\r\n this.permission = this.isSupported() ? \"default\" : \"denied\";\r\n }\r\n\r\n public isSupported(): boolean {\r\n return \"Notification\" in window;\r\n }\r\n\r\n requestPermission(): void {\r\n let self = this;\r\n if (\"Notification\" in window) {\r\n Notification.requestPermission(function(status) {\r\n return (self.permission = status);\r\n });\r\n }\r\n }\r\n\r\n create(title: string, options?: PushNotification): any {\r\n let self = this;\r\n return new Observable(function(obs) {\r\n if (!(\"Notification\" in window)) {\r\n console.log(\"Notifications are not available in this environment\");\r\n obs.complete();\r\n }\r\n\r\n if (self.permission !== \"granted\") {\r\n console.log(\r\n \"The user hasn't granted you permission to send push notifications\"\r\n );\r\n obs.complete();\r\n }\r\n\r\n let _notify = new Notification(title, options);\r\n _notify.onshow = function(e) {\r\n setTimeout(function() {\r\n _notify.close();\r\n }, 7500);\r\n return obs.next({\r\n notification: _notify,\r\n event: e\r\n });\r\n };\r\n\r\n _notify.onclick = function(e) {\r\n _notify.close();\r\n return obs.next({\r\n notification: _notify,\r\n event: e\r\n });\r\n };\r\n\r\n _notify.onerror = function(e) {\r\n return obs.error({\r\n notification: _notify,\r\n event: e\r\n });\r\n };\r\n\r\n _notify.onclose = function() {\r\n return obs.complete();\r\n };\r\n });\r\n }\r\n\r\n generateNotification(source: Array): void {\r\n if (this.permission == \"granted\") {\r\n source.forEach((item, i) => {\r\n let options = {\r\n badge: item.badge,\r\n body: item.alertContent,\r\n icon: item.icon,\r\n image: item.image,\r\n tag: item.tag,\r\n sound: item.sound,\r\n dir: item.dir\r\n };\r\n setTimeout(() => {\r\n let ref = this.create(item.title, options).subscribe(res => {\r\n // console.log(\"res\", res);\r\n });\r\n // console.log(\"ref\", ref);\r\n }, i * 3000);\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport declare type Permission = \"denied\" | \"granted\" | \"default\";\r\n\r\nexport interface PushNotification {\r\n body?: string;\r\n icon?: string;\r\n tag?: string;\r\n data?: any;\r\n renotify?: boolean;\r\n silent?: boolean;\r\n sound?: string;\r\n noscreen?: boolean;\r\n sticky?: boolean;\r\n dir?: \"auto\" | \"ltr\" | \"rtl\";\r\n lang?: string;\r\n vibrate?: number[];\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, of, throwError } from 'rxjs';\r\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\r\nimport { catchError, tap, map } from 'rxjs/operators';\r\n\r\nimport { SettingModel } from 'src/models/setting.model';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { environment } from 'src/environments/environment';\r\n\r\nconst httpOptions = {\r\n headers: new HttpHeaders({ 'Content-Type': 'application/json; charset=utf-8' })\r\n};\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RestApiService {\r\n apiUrl: string;\r\n setting: SettingModel;\r\n protected storage: LocalStoreManager;\r\n // accessToken:string='';\r\n constructor(private http: HttpClient) {\r\n // this.apiUrl = \"http://192.168.247.50:14000\";\r\n this.apiUrl = environment.baseUrl || this.baseUrl();\r\n }\r\n public baseUrl() {\r\n let base = '';\r\n\r\n if (window.location.origin) {\r\n base = window.location.origin;\r\n } else {\r\n base = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');\r\n }\r\n\r\n return base.replace(/\\/$/, '');\r\n }\r\n getToken(data: any): Observable {\r\n const fullUrl = `${this.apiUrl}Token`;\r\n const a = JSON.stringify(data);\r\n return this.http.post(fullUrl, JSON.stringify(data), httpOptions);\r\n }\r\n get(): Observable {\r\n const fullUrl = `${this.apiUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n getIpCliente(): Observable {\r\n return this.http.get('http://api.ipify.org/?format=jsonp&callback=JSONP_CALLBACK') // ...using post request '\r\n .map((res: Response) => {\r\n console.log('res ', res);\r\n console.log('res.json() ', res.text());\r\n //console.log('parseado ', JSON.parse(res.text()));\r\n console.log('parseado stringify ', JSON.stringify(res.text()));\r\n let ipVar = res.text();\r\n //let num = ipVar.indexOf(\":\");\r\n //let num2 = ipVar.indexOf(\"\\\"});\");\r\n //ipVar = ipVar.slice(num + 2, num2);\r\n console.log('ipVar -- ', ipVar);\r\n return ipVar\r\n }); // ...and calling .json() on the response to return data\r\n //.catch((error:any) => Observable.throw(error.json().error || 'Server error')); //...errors if any\r\n }\r\n testConnection(testUrl: string, CntUrl: string): Observable {\r\n const fullUrl = `${testUrl}${CntUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getEntity(CntUrl: string): Observable {\r\n const fullUrl = `${this.apiUrl}/${CntUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getWaiterList(CntUrl: string): Observable {\r\n const fullUrl = `${this.apiUrl}${CntUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getFilterEntity(CntUrl: string, filter: any): Observable {\r\n const fullUrl = `${this.apiUrl}/${CntUrl}?Filter=${filter}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getEntityById(CntUrl: string, id: number): Observable {\r\n const url = `${this.apiUrl}${CntUrl}/${id}`;\r\n return this.http.get(url, httpOptions);\r\n }\r\n\r\n postEntity(data, CntUrl: string): Observable {\r\n const fullUrl = `${this.apiUrl}/${CntUrl}`;\r\n const jason = JSON.stringify(data);\r\n return this.http.post(fullUrl, jason, httpOptions);\r\n }\r\n\r\n updateEntity(id: string, data, CntUrl: string): Observable {\r\n const url = `${this.apiUrl}${CntUrl}/${id}`;\r\n return this.http.put(url, data, httpOptions);\r\n }\r\n\r\n deleteEntity(id: string, CntUrl: string): Observable<{}> {\r\n const url = `${this.apiUrl}${CntUrl}/${id}`;\r\n return this.http.delete(url, httpOptions);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatSnackBar } from \"@angular/material\";\r\nimport * as Rx from \"rxjs/Rx\";\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\n\r\n\r\n@Injectable()\r\nexport class WebsocketService {\r\n constructor( protected _snackBar: MatSnackBar,\r\n private spinner: NgxUiLoaderService,) {}\r\n\r\n private subject: Rx.Subject;\r\n\r\n public connect(url): Rx.Subject {\r\n //const url = \"ws://localhost:1372/\"\r\n if (!this.subject) {\r\n this.subject = this.create(url);\r\n console.log(\"Successfully connected: \" + url);\r\n }\r\n return this.subject;\r\n }\r\n\r\n private create(url): Rx.Subject {\r\n // const url = \"ws://localhost:1372/\"\r\n\r\n\r\n let ws = new WebSocket(url);\r\n let observable = Rx.Observable.create((obs: Rx.Observer) => {\r\n ws.onmessage = obs.next.bind(obs);\r\n ws.onerror = obs.error.bind(obs);\r\n ws.onclose = obs.complete.bind(obs);\r\n return ws.close.bind(ws);\r\n });\r\n let observer = {\r\n next: (data: Object) => {\r\n if (ws.readyState === WebSocket.OPEN) {\r\n this.spinner.start();\r\n ws.send(JSON.stringify(data));\r\n }\r\n }\r\n };\r\n return Rx.Subject.create(observer, observable);\r\n }\r\n}\r\n"],"sourceRoot":"webpack:///","file":"main.js"}