{"version":3,"mappings":"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","names":["constructor","x","P","this","canActivate","R","url","authService","isUserLoggedIn","setRedirectUrl","router","navigate","getLoginUrl","canActivateChild","datevalidator","Date","getDate","getHours","u","e","factory","d","path","redirectTo","pathMatch","loadChildren","Promise","then","Z","OrderModule","WaiterorderModule","TableModule","HomeModule","LoginModule","AboutModule","ClubModule","OrdermanagementModule","o","SettingModule","PortalModule","GameModule","PaymentModule","FinalfactorModule","NotFoundModule","c","y","relativeLinkResolution","onSameUrlNavigation","V","ct","share","getSetting","storageManager","initialiseStorageSyncListener","goodsGroupList","setLanguage","sharemodel","language","translate","setDefaultLang","use","savePermanentData","isrtl","go","ngOnInit","s","getData","document","body","classList","contains","isToggledUppercase","window","localStorage","getItem","JSON","parse","getTableList","api","getEntity","subscribe","tableList","F","selectors","transform","opacity","handleError","G","spinner","stopAll","message","toLowerCase","includes","hasShowError","dialog","open","W","componentInstance","title","instant","hasCancel","hasOK","afterClosed","console","error","status","errorCode","errorMessage","split","replace","X","urlValidation","toLocaleLowerCase","intercept","isMultilanguage","sendRequest","clone","headers","set","authToken","handle","start","pipe","Q","j","injector","bootstrap","T","Y","t","$","D","E","provide","useClass","multi","imports","lt","r","loader","useFactory","k","deps","N","nt","tt","b","l","et","idle","timeout","ping","K","enabled","w","registrationStrategy","g","dialogRef","close","confirmation","translateText","callWaiters","refresh","it","sidemenuGarsonCall","checkNotification","headerGarsonCall","hasLogo","hasRefresh","getDigitalMenuCount","refresher","emit","afterConfirm","getFilterEntity","digitalmenuTableId","isToggleOpen","setting","showTablesPage","tableId","lastUrl","log","systemLayer","hideNotification","hasDigitalMenu","IsDigitalAlbumTransfer","isDigitalAlbum","hasTabletOrder","hasPager","exit","location","reload","toggle","i","a","C","I","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","reportProgress","responseType","get_unique_string","push","charAt","Math","floor","random","length","join","uploadFile","FormData","H","z","h","type","toString","m","code","goods","append","size","sizeErr","typeErr","fileErr","toast","L","action","ufile","pt","params","getFiles","get","setPath","fileUrl","fileName","J","date","closeAll","DateNow","now","q","v","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","tableName","uploadService","reloadCurrentRoute","getLinkPicture","timeStamp","linkPicture","setLinkPicture","getTime","navigateByUrl","skipLocationChange","gt","showUploadState","mt","click","downloadStatus","download","Blob","setAttribute","href","removeChild","ft","ngOnChange","safeFiles","showDownloadError","showProgress","showUploadError","ut","Pt","component","children","runGuardsAndResolvers","ht","f","O","_","M","A","p","rt","n","ot","at","String","prototype","toAddPrefix","Array","isValid","maper","Object","keys","some","Map","SetInArray","has","_location","_snackBar","storage","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","dt","st","vt","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","waiterorderGoodsGroupList","clearData","order","openFactor","waiterFactor","waiterOrder","New_waiterFactor","loginuser","formBuilder","cache","deleteData","digitalMenuThem","setTheme","digitalmenuFactorCount","documentElement","currentTheme","ActivateTab","isUserAuthenticated","users","password","isloggedIn","loggedInUser","getRedirectUrl","redirectUrl","getLoggedInUser","getOrdermanagementUrl","ordermanagementUrl","logoutUser","getDiffDays","onUserActivity","destroy$","timerSubscription","unsubscribe","startTimer","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","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/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 { CanActivate, CanActivateChild, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { AuthService } from './auth.service';\r\n\r\n@Injectable()\r\nexport class AuthGuardService implements CanActivate, CanActivateChild {\r\n constructor(private authService: AuthService, private router: Router) {\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 { 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 { RestApiService } from 'src/services/rest-api.service';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { Subscription } from 'rxjs-compat';\r\n\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\r\n title = 'SepidzDigitalMenu';\r\n isToggledUppercase = false;\r\n hideComponents = false;\r\n hideGuides = false;\r\n hideCDK = false;\r\n selectedthem = 2;\r\n isTestScreen = false;\r\n subscription: Subscription;\r\n constructor(\r\n public translate: TranslateService,\r\n public share: ShareDataService,\r\n private storageManager: LocalStoreManager,\r\n private router: Router,\r\n private api: RestApiService,\r\n ) {\r\n this.share.getSetting();\r\n this.storageManager.initialiseStorageSyncListener();\r\n this.share.goodsGroupList();\r\n }\r\n setLanguage(lan: string) {\r\n this.share.sharemodel.language = (!lan) ? 'FA' : 'EN';\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.router.navigate([url]);\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 }\r\n getTableList() {\r\n this.api.getEntity('AllTables').subscribe(res => {\r\n this.share.tableList = res;\r\n });\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 if (this.errorMessage.toLowerCase().includes('system.exception: object reference not set to an instance of an object.')) {\r\n this.errorMessage = 'مشکلی رخ داده است لطفا صفحه را رفرش کنید.'\r\n }\r\n\r\n if (this.errorMessage.toLowerCase().includes('system.exception:')) {\r\n this.errorMessage = this.errorMessage.replace('System.Exception: ', '');\r\n }\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 { 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: [\r\n AuthGuardService,\r\n HttpClientModule,\r\n LocalStoreManager,\r\n GlobalErrorHandlerService,\r\n PushNotificationsService,\r\n AuthService,\r\n WebsocketService,\r\n ParsianPosService,\r\n PosClearingService,\r\n {\r\n provide: ErrorHandler,\r\n useClass: GlobalErrorHandlerService\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor, multi: true\r\n }\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.0902.2.0
\r\n
\r\n
\r\n","import { Component, OnInit, Input, Output, EventEmitter } 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\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 }\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 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.router.navigate(['/' + url]);\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 exit() {\r\n window.location.reload()\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, HttpParams } from '@angular/common/http';\r\nimport { 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 } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.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 } 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\nimport { NgModule } from '@angular/core';\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\n\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\nimport { TranslateModule } from '@ngx-translate/core';\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\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 }\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 pard: number;\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\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: 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 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 waiterorderGoodsGroupList(): Observable {\r\n return this.api.getEntity('WaiterorderGoodsGroupList').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 { timer } from 'rxjs';\r\nimport { Subject, Subscription } from 'rxjs-compat';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { UserModel } from 'src/models/user.model';\r\nimport { ShareDataService } from '../providers/sharedata.service';\r\nimport { CorrectYeKeService } from './correctyeke.service';\r\nimport { RestApiService } from './rest-api.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 public isloggedIn = false;\r\n public loggedInUser: UserModel;\r\n public users: UserModel[];\r\n public destroy$ = new Subject();\r\n public timerSubscription: Subscription;\r\n constructor(private api: RestApiService, private share: ShareDataService) {\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 } 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 onUserActivity() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n if (this.timerSubscription) {\r\n this.timerSubscription.unsubscribe();\r\n }\r\n this.startTimer();\r\n }\r\n startTimer() {\r\n this.timerSubscription = timer(20 * 60 * 1000)\r\n .pipe(\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n window.location.reload();\r\n });\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 { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material\";\r\nimport { NgxUiLoaderService } from \"ngx-ui-loader\";\r\nimport { Subject } from \"rxjs/Rx\";\r\nimport { DialogComponent } from \"src/app/dialog/dialog.component\";\r\nimport { 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 );\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"}