{"version":3,"file":"main.6d78d658d7ed4771.js","mappings":"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9R,QAAQuQ,KAAK,iCACbshD,GAAUj8D,KAAK,CACXmwC,QAAS0rB,MACTxrB,SAAUurB,MAoDZ,MAAOU,GAASn+D,SAAAH,KAAA,mBAAAI,iBAATk+D,GAAS,EAAAn+D,SAAAH,KAAA,UAAAO,EAAA8vD,GAAA,MAATiO,GAASC,UAAA,CAFNnE,MAAYj6D,SAAAH,KAAA,UAAAO,EAAA+vD,IAAA,WADb2N,GAASO,QAAA,CAVhBC,MACArO,GACAsO,KACAC,KAEAC,MACAnO,KACAoO,MACAC,SC1GJ5gD,gBAAYgB,EACZ6/C,SAGJC,QAAyBC,gBAAgBX,IACpCY,MAAMlsC,GAAO5mB,QAAQC,MAAM2mB,sBCpBhC,IAAA1mB,GAAA,CACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,cACA,iBACA,eACA,kBACA,eACA,kBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,WACA,cACA,WACA,cACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,qBACA,kBACA,qBACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,WACA,cACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,WACA,cACA,YACA,eACA,UACA,aACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,eACA,kBACA,cACA,iBACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,iBACA,oBACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,eACA,kBACA,YACA,eACA,YACA,eACA,WACA,iBACA,oBACA,cACA,UACA,aACA,iBACA,oBACA,WACA,cACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,mBAIA,SAAA6yD,GAAAC,GACA,IAAAl1D,EAAAm1D,EAAAD,GACA,OAAAE,EAAAp1D,EACA,CACA,SAAAm1D,EAAAD,GACA,IAAAE,EAAA37D,EAAA2I,GAAA8yD,GAAA,CACA,IAAA70C,EAAA,IAAA9Z,MAAA,uBAAA2uD,EAAA,KACA,MAAA70C,EAAAg1C,KAAA,mBACAh1C,CACA,CACA,OAAAje,GAAA8yD,EACA,CACAD,GAAA95D,KAAA,WACA,OAAAJ,OAAAI,KAAAiH,GACA,EACA6yD,GAAA1jD,QAAA4jD,EACAG,GAAAC,QAAAN,GACAA,GAAAj1D,GAAA","names":["DashboardType","SilverWareArrays","SilverWareIcons","AvailableChartType","MissingChainIDComponent","constructor","router","activeRoute","this","ngOnInit","ngOnDestroy","static","t","i0","i1","core","VBU","selectors","decls","vars","consts","template","rf","ctx","Any","Heartbeat","Custom","Sales","Employees","LossPrevention","Guests","Other","forEach","array","callback","length","i","where","items","val","push","find","item","indexOf","forEachTill","firstOrDefault","count","result","sortAsc","sortBy","sort","a","b","sortAscCaseInsensitive","toLowerCase","sortDesc","sortAscMultiple","sortByProps","fieldAPoints","fieldBPoints","fieldA","fieldB","pointsFactor","Math","pow","sortNatural","getNestedProperty","o","s","replace","split","n","k","toString","ax","bx","_","$1","$2","Infinity","an","shift","bn","nn","localeCompare","isEqual","value","other","type","Object","prototype","call","valueLen","keys","compare","item1","item2","itemType","key","hasOwnProperty","select","selectMany","x","any","all","sum","chartsIcon","iconKey","Unknown","BarChart","BubbleChart","DoughnutChart","LineChart","PieChart","RadarChart","TextChart","Report","databitParametersIcon","parameters","storeID","MajorClassType","MajorClasses","MinorClasses","MenuItems","OrderStatus","ReportBy","Users","CostCenters","Segments","ServiceTypes","MajorJobs","MinorJobs","IncludeZeroPriced","DateRange","TimeRange","PaymentMethods","Control","CheckNumber","OrderNumber","MoreFilters","FiscalYearStartDate","undefined","fallBackIcon","globalIcons","global","heartbeat","heart","plus","edit","more","chart","trash","filter","share","question","sync","navIcons","nav","menu","dashboards","sales","comparison","guests","employees","lostPrevention","cannedReports","settings","notification","userProfile","Dashboard","id","userID","name","databits","DatabitCategory","Auditing","ServerReporting","Operations","ClientGiftCards","None","All","CommonService","ALL_LIST_ITEM","findDuplicates","sortedArray","slice","results","byID","index","ID","byValue","fixObjectCasing","obj","v","validateEmail","email","test","String","convertToChartFormat","data","chartType","parsedData","values","label","console","error","map","dataset","reducer","Number","cloneDeep","groupDataBySize","groupSize","dataIn","doNotSort","doNotGroup","chartData","orderedLabels","comparisonsData","dataCount","additionalValueDictionaries","labelDict","baseValueDict","Array","isArray","labels","fixDuplicateLabels","referenceDataset","dataSet","dict","first","second","group","currentDataSortPosition","dictToSort","baseValuePosition","offset","itemsLength","kvPair","position","amountAtPosition","realPosition","splice","processedData","otherData","reduce","isNaN","toFixed","getCategoryTypeFromDashboard","dbType","category","concat","onlyUnique","self","duplicateLabels","indexOfduplicateLabel","findNextDuplicatedLabelAndMakeUnique","duplicateLabel","isNotNullAndUndefinedAndEmpty","trim","flattenErrorMessages","ex","finalMessage","errorDetails","doFlattenErrors","details","HttpErrorResponse","message","errorDetail","Message","Errors","errors","join","Error","Messages","JSON","stringify","availableChartType","jDH","factory","ɵfac","providedIn","ObjectState","item_r2","_r1","$implicit","ctx_r2","swipeDelete","delete","DragDropComponent_div_1_i_9_Template","i_r4","deleteToggle","DragDropComponent","commonService","list","drop","event","moveItemInArray","previousIndex","currentIndex","show","ind","databitName","inputs","$event","DragDropComponent_div_1_Template","trigger","state","style","width","transition","animate","visibility","opacity","Added","Unchanged","Modified","Deleted","AutoAdded","SilverWareCommon","Guid","newGuid","c","r","random","empty","isValid","str","toJSON","getCheckTotal","chk","runningTotal","addNumbers","TaxTotal","SubTotal","getCheckGratuityAmount","gratTotal","Gratuities","chkGrat","Amount","sumPaymentNetAmounts","payments","total","chkPay","netPayAmt","substractNumbers","PayAmount","TipAmount","calculateCheckPaymentsNetAmount","Payments","getCheckBalanceOwing","balanceOwing","roundDecimal","ArithmeticOperation","doOperation","operation","atens","btens","finalTens","max","aVal","round","bVal","Add","Multiply","Substract","Divide","decimalAdjust","exp","NaN","isNotNullEmptyUndefined","element","d","Date","getTime","window","performance","now","floor","generateCheckFromPOS","posChk","Status","isFullyPaid","IsFullyPaid","multiplyDecimals","divideNumbers","amount","isNegative","rounded","abs","BaseDashBoardComponent","pageService","navigationService","modalService","dashboardService","authService","logService","dashboardType","dashboardName","dashboardDatabits","canExit","changedItemsCount","undoQueue","of","createNewWidget","allAvailableDatabits","categories","db","modalObject","buttons","class","click","flex","margin","isMultiSelect","selectList","databit","displayName","rightIcon","active","cancelStyle","inputData","selectedDatabits","chainStores","getChainStores","chainId","store","icon","objectModal","response","selectedStoreID","currentDatabit","debug","paramValues","typedChartTypeStr","chartConfigs","defaultChartType","dt","parameterValues","chainID","objectState","seriesOverride","comparisonParameterValues","currentDashboard","dashboardId","userId","queueChanges","saveDashboard","Promise","resolve","doProcessError","errorMsg","dashboard","user","saveUserDashboards","subscribe","next","success","getPageOrder","moveList","widget","addToHeartBeat","heartBeat","getSavedDashboardsByType","getUserDashboard","heartbeatDashboard","savedWidgetIndex","info","warn","addWidgetToDashboard","dashboardID","customDashboard","loadDataBitsByCategory","databitparams","updateDataBitParamValues","dataBitParams","updateDatabits","addToQueue","rearrange","widgetsList","size","title","old","assign","w","override","buttonsContainerStyle","display","justifyContent","templateInputs","environment","groupings","graphProperties","chartOthersColor","clearBackgroundColor","barDefaultColor","lineDefaultColor","pieDefaultColor","doughnutDefaultColor","pieChartGraphForegroundColor","doughnutChartGraphForegroundColor","pieDoughnutColors","AppConfig","defaultGrouping","minGrouping","medGrouping","production","appSettings","applicationUrl","myPassUrl","blogUrl","reportingUrl","authCookieName","LogType","modalType","Trace","Debug","Warn","Info","Fatal","Log","level","parentLogID","date","Level","ParentLogID","Stack","stack","logLevelName","prepareForServer","tmpLog","LogService","appConfig","logs","pad","num","substring","doLog","logApi","url","method","logDuration","parent","totalTimeMilliseconds","logger","log","addLog","text","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","colouredConsole","msg","logLevel","args","flattenArgs","arg","logLevelDetails","getLogLevelDetails","logTypeName","color","colouredConsoleDebug","colouredConsoleWarning","colouredConsoleInfo","colouredConsoleError","logStorage","i2","DashboardService","http","availableDashboards","savedUserDashboards","BehaviorSubject","heartbeatDashboards","excludeDatabitConfigs","post","ExcludeDatabitConfigs","savedUserDashboards$","asObservable","heartbeatDashboard$","getUserDatabitConfigs","headers","HttpHeaders","UserId","getSavedDashboard","deleteUserDashboard","getUserDashboards","savedDashboards","i3","ModalService","componentFactoryResolver","modalHeight","modalStyle","modalButtons","modalListButtons","modalButtonHolderStyle","modalOptions","backdrop","focus","keyboard","hideCancel","hideTitle","cancelText","isMultiLine","isReadOnly","inputMaxlength","inputLabel","selectMainList","searchText","showSearch","xLabel","yLabel","showLegend","formatInfo","databitHTML","widgetId","isTimeSeriesOrTextData","chartProps","chartTitle","chartSubtitle","chartDateFilter","chartProps$","chartData$","options","dismissCallback","callBack","destroy","custom","fillModalGeneral","fillModalTemplate","showModal","modalTitle","modalBody","warning","input","fillModalInput","selectInputList","fillModalInputList","setTimeout","listButton","buttonList","button","listButtonV2","buttonV2","confirm","cancelButtonLabel","yesButtonLabel","yesCallback","btn","primary","isDismiss","fillModalChart","fillModalChartProperties","modalID","modalSize","modalCustomButtons","hideDismissBtn","btnAction","actionName","dismissModal","onClickFunction","isDismissing","inputValidator","inputErrorText","filterList","validateResult","$","hide","removeClass","onCallBack","close","onDismissCallBack","onSelect","itemIndex","option","isSelectedItem","inp","dismiss","css","addClass","onclick","target","document","keyup","e","off","modalClass","height","buttonsContainerClass","modalButtonHolderClass","cancelClass","modalTemplate","templateData","inputType","props","dialogClass","isTitleHidden","isCancelButtonHidden","buttonsHolderClass","buttonsHolderStyles","cancelLabel","cancelStyles","cancelClasses","overrideModal","inputFieldType","inputValidationError","isInputMultiline","isInputReadOnly","inputFieldMaxlength","inputFieldLabel","modalTypeEnum","isMultiSelectList","itemList","chartInfo","chartInfo$","chartProperties$","showHideSearchBar","DatabitService","getDatabitsInfo","get","getDatabitParameterValues","parameterName","runDatabit","storeId","forceRun","compareParameters","path","Parameters","ForceRun","ComparisonParameters","NavigationService","isMobileView","isSideBarExpanded","isSideBarDashboardExpanded","SideBarCurrentTab","currentPage","updateScreenWidth","newWidth","navigate","updateScreenHeight","documentElement","scrollTo","updateCurrentPage","updateURL","navigateByUrl","PageService","databitService","loadingOverLay","processedQueuesLength","processDataDelay","queueLimit","rearrangedQueueChanges","queueData","processingQueues","runningDatabitsQueue","processedQueues","interval","availableDatabitsArray","bit","params","parse","chartConfig","allAvailableDatabitsDictionary","getDatabitInfo","getDatabitInfoByCategory","databitParamValues","databitByCategory","currentStoreID","currentChainID","refreshOtherPage","refreshPage","clearQueueWatch","currentDashBoard","pageCategory","currentCategories","currentPageWidgets","clearQueue","intervalDelay","currentDashboardType","currentDashboardId","currentDashboardName","setDashboardUser","defaultChainID","setting","currentUser","firstStore","defaultChainId","chains","currentChain","chain","chainInfo","ch","stores","hasData","getStoreInfo","getStoreNameByStoreId","setCurrentDashBoardComponent","dashBoard","getCurrentDashBoardComponent","saveQueue","clearInterval","setInterval","processData","addToQueueProcessData","databitsParameterValues","compareParameterValues","isProcessing","runResponse","requestToProcess","queue","q","isProcessedDone","isProcessed","getProcessed","pr","index1","p","index2","then","rdb","pq","err","reject","errMsg","addToHeartbeat","createNewDashboard","otherDashboardType","getUsersDashboards","dashboardOptions","changeDashboardTitle","deleteDashboard","dash","saveBtn","customDashboards","updateChain","updateStore","i4","i5","i6","DatabitParameterType","AuthService","myPassLogOnURL","mypassURL","myPassLogOffURL","loggedIn","logOn","_this","_asyncToGenerator","handleError","clearUserState","navigateToMyPass","myPassUser","loadMyPassUserFromWindowObject","getElementById","logOut","withRedirect","deleteCookie","location","logOnURL","href","getCookie","ca","cookie","caLen","cookieName","setCookie","expireDays","setTime","session","toUTCString","protocol","secure","hasAuthCookie","authCookie","isAuthenticated","Boolean","List","Collection","Currency","Percentage","Integer","HammerjsService","HammerGestureConfig","overrides","swipe","direction","hammer","pinch","enable","rotate","pan","press","tap","ctx_r1","toggleMenu","selectedSmartDate","header_r4","date_r6","_r5","calendarDateSelected","htmlClass","number","CalendarComponent_div_2_div_1_div_15_div_1_Template","calDates","_r3","previousMonth","picMonths","nextMonth","CalendarComponent_div_2_div_1_div_12_Template","CalendarComponent_div_2_div_1_div_14_Template","CalendarComponent_div_2_div_1_div_15_Template","monthString","changedYear","calHeaders","month_r9","_r8","changeMonth","CalendarComponent_div_2_div_2_div_7_div_1_Template","months","_r7","picYears","CalendarComponent_div_2_div_2_div_6_Template","CalendarComponent_div_2_div_2_div_7_Template","year_r12","_r11","changeYear","CalendarComponent_div_2_div_3_div_7_div_1_Template","years","_r10","picDays","CalendarComponent_div_2_div_3_div_6_Template","CalendarComponent_div_2_div_3_div_7_Template","hr_r14","_r13","selectTimeHour","hour","isStartHourSelected","min_r16","_r15","selectTimeMinute","minute","isStartMinSelected","hr_r18","_r17","isEndHourSelected","min_r20","_r19","isEndMinSelected","CalendarComponent_div_2_div_4_a_9_Template","CalendarComponent_div_2_div_4_a_18_Template","CalendarComponent_div_2_div_4_a_27_Template","CalendarComponent_div_2_div_4_a_36_Template","startHour","hours","startMinute","minutes","endHour","endMinute","hr_r22","_r21","min_r24","_r23","hr_r26","_r25","min_r28","_r27","CalendarComponent_div_2_div_5_a_10_Template","CalendarComponent_div_2_div_5_a_19_Template","CalendarComponent_div_2_div_5_a_28_Template","CalendarComponent_div_2_div_5_a_37_Template","CalendarComponent_div_2_div_1_Template","CalendarComponent_div_2_div_2_Template","CalendarComponent_div_2_div_3_Template","CalendarComponent_div_2_div_4_Template","CalendarComponent_div_2_div_5_Template","isSmallScreen","_c1","scale","showDays","showMonths","showYears","showTimePicker","showDatePicker","_c2","formattedStartDay","formattedEndDay","hr_r31","_r30","min_r33","_r32","hr_r35","_r34","min_r37","_r36","CalendarComponent_div_4_a_12_Template","CalendarComponent_div_4_a_21_Template","CalendarComponent_div_4_a_31_Template","CalendarComponent_div_4_a_40_Template","_r29","getAllDay","date_r39","_r38","onSmartDateSelected","smartDateDesc","CalendarComponent","showSmartDatesMenu","smartDates","smartDate","DateRangeFilters","CurrentDay","PreviousDay","CurrentWeek","PreviousWeek","CurrentMonth","PreviousMonth","CurrentYear","PreviousYear","CurrentDayLastWeek","PreviousDayLastWeek","CurrentDayLastMonth","PreviousDayLastMonth","calenderMonthDifference","selectedDays","dayPeriods","timePickerButtons","timePeriodChange","EventEmitter","dayPeriodChange","snapshot","paramMap","getCurrentInfo","populateCalendar","currentMonth","currentYear","resize","fillHours","fillMinutes","extractTimeFromInput","extractDateFromInput","currentFilter","dayPeriod","getDat","selectSmartDate","getToday","getYesterDay","getThisWeek","lastWeek","getThisMonth","getLastMonth","getThisYear","getLastYear","getCurrentDayLastWeek","getCurrentDayLastMonth","getYesterdayDayLastWeek","getYesterdayDayLastMonth","CurrentDayLastYear","getCurrentDayLastYear","PreviousDayLastYear","getPreviousDayLastYear","selectDay","timePeriod","getTimes","startTime","endTime","formatDay","startDay","moment","month","format","day","year","endDay","currentDate","currentDay","parseInt","add","changedMonth","chaneYear","firstDateMoment","firstDate","firstDay","lastDate","endOf","previousMonthFirstDate","previousMonthsYear","previousLastDate","previousFirstDate","totalCount","nextMonthCount","dayId","dayHtmlCalss","dateObj","today","nextYear","h","hr","hrObj","m","min","minObj","populateCalendarWithChangedDays","initCalendar","showCurrentDayCalender","pIndex","disableSmartDates","canContinue","isAfter","dayAfterEndDay","dayInBetween","isSame","makeDayString","hideCalBody","date1","date2","monthsDiff","diff","yesterday","subtract","firstDayOfWeek","startOf","lastDayOfWeek","firstDayOfWeekStr","lastWeekMonth","lastWeekYear","firstDayOfMonth","lastDayOfMonth","firstDayOfCurrentMonth","firstDayOfLastMonth","firstDayOfLastMonthStr","lastDayOfLastMonth","prMonth","firstDayOfThisYear","endDayOfThisYear","firstDayOfLastYear","endDayOfLastYear","currentDayInWeekDay","weekday","currentDayLastWeek","daysToAdd","week","currentDayLastMonth","currentDayLastMonthStr","currentDayLastYear","isoWeek","isoWeekday","customDate","isStart","makeTimeString","emit","innerWidth","hostBindings","CalendarComponent_div_1_Template","CalendarComponent_div_2_Template","CalendarComponent_div_3_Template","CalendarComponent_div_4_Template","CalendarComponent_div_9_Template","_c0","ctx_r0","LoadingAnimationComponent_Conditional_1_div_0_Template","isInline","LoadingAnimationComponent","LoadingAnimationComponent_Conditional_0_Template","LoadingAnimationComponent_Conditional_1_Template","setToDefault","defaultValue","autoFocus","item_r5","_r4","SelectListComponent_div_9_i_1_Template","isSelected","SelectListComponent","listArray","mainList","highlightSelectedItems","selectedItems","undoSelected","selectedItemsString","showSearchBar","searchBar","selected","allowMultiSelect","selectedItemsChange","searchbar","nativeElement","undo","allindex","returnSelectedItems","findIndex","isAllSelected","viewQuery","SelectListComponent_div_2_Template","SelectListComponent_div_6_Template","SelectListComponent_div_9_Template","AddWhiteSpacePipe","transform","separator","words","EJ8","pure","updateComparisonName","deleteComparison","getCompareName","getStoreName","getStoreLocations","FilterOptionsComponent_a_5_div_6_Template","FilterOptionsComponent_a_5_i_8_Template","FilterOptionsComponent_a_5_i_9_Template","parameterIcon","storeLocation","isToggled","_r6","FilterOptionsComponent_a_6_div_1_Template","FilterOptionsComponent_a_6_i_8_Template","FilterOptionsComponent_a_6_i_9_Template","openPar","selectedValues","FilterOptionsComponent_div_7_div_3_Template","availableValues","isLoading","getModifiedValue","pr_r11","getParameterValues","FilterOptionsComponent_div_8_a_2_div_6_Template","FilterOptionsComponent_div_8_a_2_i_8_Template","FilterOptionsComponent_div_8_a_2_i_9_Template","FilterOptionsComponent_div_8_a_2_i_10_Template","FilterOptionsComponent_div_8_a_2_i_11_Template","_r14","_r16","FilterOptionsComponent_div_8_a_3_div_1_Template","_r12","FilterOptionsComponent_div_8_a_3_i_8_Template","FilterOptionsComponent_div_8_a_3_i_9_Template","FilterOptionsComponent_div_8_a_3_i_10_Template","selectedValue","updateParameterValues","_r18","_r20","_r22","_r24","Value","FilterOptionsComponent_div_8_div_4_div_1_Template","FilterOptionsComponent_div_8_div_4_div_2_Template","FilterOptionsComponent_div_8_div_4_div_3_Template","FilterOptionsComponent_div_8_div_4_div_4_Template","FilterOptionsComponent_div_8_div_4_div_5_Template","FilterOptionsComponent_div_8_div_4_div_6_Template","FilterOptionsComponent_div_8_div_4_div_7_Template","FilterOptionsComponent_div_8_div_4_div_8_Template","FilterOptionsComponent_div_8_div_4_div_9_Template","_r9","swipeLeft","swipeRight","FilterOptionsComponent_div_8_a_2_Template","FilterOptionsComponent_div_8_a_3_Template","FilterOptionsComponent_div_8_div_4_Template","i_r27","_r26","changeComparison","currentComparisonIndex","FilterOptionsComponent_div_9_div_1_ng_container_1_Template","comparisons","FilterOptionsComponent_div_9_div_1_Template","newComparison","FilterOptionsComponent","databitsParameters","databitsCollection","comparisonsValues","showCompare","parametersDetails","hiddenParametersDetails","modalDefaultButtons","expandedFilterSelectedValue","currentStore","sortDateAndTime","sortRest","sortByValue","databitValueNames","defaultDate","databitParam","savedParameterValue","pv","savedSelectedValue","valueToPars","convertToBoolean","Name","databitParamObject","preSortByValue","preSortLength","offSet","allParamDetails","compareParams","paramDetail","compareParam","compareParamDetail","valueName","paramDeatilCopy","uniqueParamValues","apiParamValues","unique","getDataBitParamValuesAndRunFilter","param","storedId","runUniqueFilter","allExists","pVal","cancelBtn","paramValue","sl","listSelectedItems","objectToSave","parameter","names","updateStoreLocation","manualUpdate","newStoreID","currentComparison","currentComparisonName","compareNameInput","features","provide","HAMMER_GESTURE_CONFIG","useClass","FilterOptionsComponent_div_1_Template","FilterOptionsComponent_a_5_Template","FilterOptionsComponent_a_6_Template","FilterOptionsComponent_div_7_Template","FilterOptionsComponent_div_8_Template","FilterOptionsComponent_div_9_Template","ChartTypePipe","SilverWareEnums","SeriesDataType","getNames","getObjValues","getNamesAndValues","getValues","Decimal","DateTime","Percent","FormatChartNumberPipe","decimalPipe","currencyPipe","percentPipe","finalVal","dataType","currencyCode","numberVal","isFinite","ChartBase","graphService","shareService","formatChartNumberPipe","downloadGraph","fileName","getDownloadableHTMLDataImageUrl","canvasElement","imageUrl","getDownloadableDataImageUrl","getGraphDataUrlAsync","graphDataUrl","getCanvasDataImageUrl","ChartJsBase","super","prevLabels","chartTypeRegistry","bar","chartOptions","datasetOptions","defaultDataPoint","metaExtensions","parsedDataType","scales","bubble","doughnut","line","pie","polarArea","radar","scatter","isRenderForExport","renderForExport","animation","duration","onComplete","getChartBase64Data","buildPieAndDoughnutChartDataset","bgColors","flattenData","backgroundColor","prepareGraphFonts","foregroundColors","datasets","plugins","datalabels","chartFullSizeChartOptions","getPieAndDoughnutChartToolTipLabelInfo","tooltipItem","raw","dataIndex","dataSetIndex","datasetIndex","doAddPieAndDoughnutChartFullScreenLegend","isFullScreen","customLegend","chartComponent","legends","innerHTML","doughnutChart","on","currentTarget","toggleClass","curr","getDatasetMeta","hidden","update","reportData","Datasets","Labels","ChartType","chartJsType","FormatInfo","availableChartJSTypes","chartJsTypes","res","typedKey","defaultScaleChartOptions","y","ticks","pieAndDoughnutChartOptions","responsive","maintainAspectRatio","formatter","allData","legendItems","legend","parseFloat","font","family","usePointStyle","boxWidth","tooltip","callbacks","GraphService","toDataURL","htmlElementID","newHeight","scrollHeight","scrollWidth","html2canvas","logging","onclone","doc","clonedChart","clientHeight","maxHeight","minHeight","marginTop","clientWidth","minWidth","clonedWrapper","canvas","ShareService","emailGraph","request","imageDataUrl","downloadAnchor","createElement","download","PieChartComponent","newDataSet","ngDoCheck","BaseChartDirective","DecimalPipe","CurrencyPipe","PercentPipe","PieChartComponent_div_3_Template","BarChartComponent","colors","dataSetsLength","localTotal","localAverage","averageDatasetData","nextColour","j","ds","dataElementsLength","others","mainColor","borderColor","hoverBackgroundColor","borderWidth","average","order","averageDataSet","hoverBorderColor","pointBackgroundColor","pointBorderColor","pointHoverBackgroundColor","pointHoverBorderColor","fill","averageIndex","varianceFromAverage","varianceFromFirstPosition","negativeVarianceFromAverage","negativeVarianceFirstPosition","arrayOfLabels","varianceFormatInfo","firstPositionVal","generateLabels","labelItem","config","fillStyle","strokeStyle","DoughnutChartComponent","DoughnutChartComponent_div_3_Template","LineChartComponent","overrideShowLegend","tension","j_r1","TextChartComponent_tr_4_th_2_Template","dataEl_r3","iconStyle","valStyle","TextChartComponent_tr_5_td_3_Template","label_r5","TextChartComponent","doSetup","heightLimit","newData","addVarianceColumn","varianceData","varianceVal","showDownArrow","styleColour","dataObject","TextChartComponent_tr_4_Template","TextChartComponent_tr_5_Template","ReportChartComponent","contentDiv","destroyInterval","overflow","InputType","i_r3","ctx_r3","removeInput","input_r2","ErrorMsg","detectInputChanges","validateInputChanges","MultiLineInputComponent_div_5_a_3_Template","MultiLineInputComponent_div_5_div_4_Template","placeHolder","Text","Email","Tel","Password","MultiLineInputComponent","required","validationCallback","initialValues","inputsWithValue","addNewInput","MultiLineInputComponent_div_5_Template","ChartComponent_div_9_app_bar_chart_1_Template","ChartComponent_div_9_app_line_chart_2_Template","ChartComponent_div_9_app_pie_chart_3_Template","ChartComponent_div_9_app_doughnut_chart_4_Template","ChartComponent_div_9_app_text_chart_5_Template","ChartComponent_div_9_app_report_chart_6_Template","loadingError","chartState","ChartComponent","barChartComponent","content","graphComponent","doughnutChartComponent","lineChartComponent","pieChartComponent","textChartComponent","reportChartComponent","databitInfo","databitCategory","subTitle","description","comparable","includeInAvrio","orientation","missing","chartWidget","getWidgetChartType","getChartData","chartTypeConverter","addWhiteSpaceConverter","enlargeHeart","heartOn","compareDataSeries","labelsConst","isNoResultData","chartTypes","allSeries","widgetChartType","widgetChartTypeStr","allowedChartTypes","defaultChartTypeStr","compareData","cData","labelOverride","isResultDataNonEmpty","numbersArray","numStr","match","OnHoverHeart","OnLeaveHeart","OnClickHeart","newChart","saveChanges","convertSeriesToModal","seriesList","modalSeries","ngAfterViewInit","showFilterOptions","originalComparisons","showLoading","copyDatabitsParameterValues","copyComparisons","currentCompareDetails","parameterDetail","prerenderChart","renderChart","cancelCleanUpComparisons","getChartTypeString","queueId","canProcess","fetchData","getDataInterval","changeTitle","changeGraphType","graphTypeModalObject","chartTypeResult","dataSeries","defaultSeriesAndCategories","dataCategory","dataConst","selectedDataSeries","tempChartData","groupedData","changeGraphSeries","metricModalObject","series","chartMetricResult","selectedSeries","DataType","showOptions","btns","sequence","deleteWidget","currentWidget","chartFullscreen","compareParamValues","dateFilters","storeIDs","curDateFilter","firstStoreID","runDatabitResponse","compareDefaults","currentDefault","getDefaultSeriesAndCategories","currentDefaultPosition","checkingDefaultPosition","labelPosition","checkingDefault","currentLabel","indexOfLabel","indexOfDupLabel","indexOfOrginalLabel","currentLableNonDup","baseCompare","indexOfMatchingLabel","valueOfLabel","htmlOutput","compareDefault","runTimeInfo","seriesMetadata","seriesMetaData","Series","isDefault","IsDefault","Categories","Type","defaultCategory","defaultDataSeries","defaultDataCategories","allCategories","widgetData","DatabitName","DatabitsParameterValues","ComparisonParameterValues","IsHtmlData","WidgetType","emails","userEmails","emailAddress","requestBody","StoreID","ChainID","DashboardID","WidgetID","WidgetData","FromAddress","FromDisplayName","firstName","Subject","To","em","tmp","states","objState","getTimeSinceLastRunString","dateInput","getDurationToNowInMinutes","toDate","i7","i8","ChartComponent_app_loading_animation_8_Template","ChartComponent_div_9_Template","ChartComponent_div_10_Template","ChartComponent_div_11_Template","ChartComponent_div_14_Template","ChartComponent_div_15_Template","widget_r1","_r2","DashboardComponent_div_1_div_1_Template","DashboardComponent_div_1_div_2_Template","DashboardComponent","getValue","latestDatabit","DashboardComponent_div_1_Template","ReportsComponent","SettingsComponent","ComparisonComponent","UserService","saveUserSettings","UserSettings","lastName","chain_r3","UserProfileComponent_div_0_div_45_div_1_Template","store_r4","UserProfileComponent_div_0_div_46_div_1_Template","UserProfileComponent_div_0_div_7_Template","UserProfileComponent_div_0_div_8_Template","UserProfileComponent_div_0_div_18_Template","UserProfileComponent_div_0_div_19_Template","isChain","UserProfileComponent_div_0_div_45_Template","UserProfileComponent_div_0_div_46_Template","UserProfileComponent_div_1_div_10_Template","UserProfileComponent_div_1_strong_17_Template","UserProfileComponent_div_1_strong_23_Template","changeChain","UserProfileComponent","userService","isMobile","isMyPassOpen","isMyCompanyOpen","isMyChainOpen","scrollBy","listchain","defaultChainUserSetting","UserProfileComponent_div_0_Template","UserProfileComponent_div_1_Template","Page","MissingChainId","Comparison","Reports","Settings","UserProfile","Notifications","ExportWidgets","RouteGuard","canDeactivate","component","route","nextState","Widget","ExportWidgetComponent_div_0_app_chart_3_Template","WidgetId","ExportWidgetComponent","ChainId","DashboardId","CanvasId","loadData","availableDatabitsArrayJsonString","jsonData","prams","dashboardDatabit","canvasType","getBase64Data","innerText","ExportWidgetComponent_div_0_Template","routes","page","AppRoutingModule","$C","G2t","RouterModule","forRoot","HttpClientModule","dashboard_r5","tabChanged","SideBarComponent_ul_3_li_15_a_1_Template","toggleDashboardMenu","SideBarComponent_ul_3_li_15_Template","dashboardsOpen","_c3","menuOpen","dashboards$","SideBarComponent","cdRef","currentTab","pipe","detectChanges","newTab","switchTab","open","SideBarComponent_ul_1_Template","SideBarComponent_ul_3_Template","dashboard_r2","_c6","_c10","_c11","BottomBarComponent","subDashboardsOpen","menuToggled","isMenuModalSet","goToSilverWareBlog","goToSilverWareReporting","modal","showProfile","border","borderRadius","fontWeight","BottomBarComponent_i_13_Template","BottomBarComponent_i_14_Template","BottomBarComponent_a_31_Template","BottomBarComponent_a_32_Template","BottomBarComponent_div_34_Template","_c4","_c5","_c7","_c8","_c9","PageDetectorComponent_ng_container_1_ng_container_1_div_2_Template","PageDetectorComponent_ng_container_1_ng_container_2_div_5_Template","PageDetectorComponent_ng_container_1_ng_container_1_Template","PageDetectorComponent_ng_container_1_ng_container_2_Template","PageDetectorComponent","changeDetectorRef","dataBitsParameterValues","storeSelection","dbit","wid","ngOnChanges","getFilterIcon","PageDetectorComponent_ng_container_1_Template","TopBarComponent_div_6_div_8_Template","onChangeChainClick","tmp_2_0","TopBarComponent","outputs","TopBarComponent_div_1_Template","TopBarComponent_div_2_Template","TopBarComponent_div_5_Template","TopBarComponent_div_6_Template","DynamicDirective","viewContainerRef","FsC","AddDynamicComponent","loadComponent","componentInputs","componentFactory","resolveComponentFactory","adHost","clear","componentRef","createComponent","instance","AddDynamicComponent_ng_template_0_Template","ModalDialogComponent_div_2_div_1_div_7_i_1_Template","ModalDialogComponent_div_2_div_1_div_7_Template","ModalDialogComponent_div_2_div_1_div_9_Template","ModalDialogComponent_div_2_div_6_div_1_div_5_Template","ModalDialogComponent_div_2_div_6_div_1_Template","ModalDialogComponent_div_2_div_6_div_2_Template","item_r7","ModalDialogComponent_div_2_div_7_div_1_Template","ModalDialogComponent_div_2_div_7_option_7_Template","item_r9","ModalDialogComponent_div_2_div_8_div_4_div_2_Template","ModalDialogComponent_div_2_div_8_div_4_div_5_Template","ModalDialogComponent_div_2_div_8_div_2_Template","ModalDialogComponent_div_2_div_8_div_3_Template","ModalDialogComponent_div_2_div_8_div_4_Template","btn_r11","ModalDialogComponent_div_2_div_9_div_2_Template","btn_r13","ModalDialogComponent_div_2_div_10_a_2_Template","onDecreaseSizeClicked","onIncreaseSizeClicked","currentGroupSize","groupSizes","Minimum","Maximum","ModalDialogComponent_div_2_div_11_div_11_app_bar_chart_2_Template","ModalDialogComponent_div_2_div_11_div_11_app_line_chart_3_Template","ModalDialogComponent_div_2_div_11_div_11_app_pie_chart_4_Template","ModalDialogComponent_div_2_div_11_div_11_app_doughnut_chart_5_Template","ModalDialogComponent_div_2_div_11_div_11_app_text_chart_6_Template","ModalDialogComponent_div_2_div_11_div_11_app_report_chart_7_Template","ModalDialogComponent_div_2_div_11_div_9_Template","ModalDialogComponent_div_2_div_11_div_11_Template","button_r17","ModalDialogComponent_div_2_div_12_button_1_Template","ModalDialogComponent_div_2_div_12_button_2_Template","ModalDialogComponent_div_2_div_1_Template","ModalDialogComponent_div_2_div_4_Template","ModalDialogComponent_div_2_div_5_Template","ModalDialogComponent_div_2_div_6_Template","ModalDialogComponent_div_2_div_7_Template","ModalDialogComponent_div_2_div_8_Template","ModalDialogComponent_div_2_div_9_Template","ModalDialogComponent_div_2_div_10_Template","ModalDialogComponent_div_2_div_11_Template","ModalDialogComponent_div_2_div_12_Template","button_r20","ModalDialogComponent_div_3_button_3_Template","ModalDialogComponent_div_3_button_4_Template","GroupSizes","Medium","ModalDialogComponent","subscription","cd","canBeMinGrouped","canBeMedGrouped","MAX_VALUE","canBeMaxGrouped","cp","unsubscribe","onMinGroupClicked","onMedGroupClicked","onMaxGroupClicked","ModalDialogComponent_div_2_Template","ModalDialogComponent_div_3_Template","ModalDialogComponent_div_4_Template","tmp_1_0","onActivate","AppComponent_Conditional_3_div_3_div_3_Template","AppComponent_Conditional_3_app_side_bar_1_Template","AppComponent_Conditional_3_div_2_Template","AppComponent_Conditional_3_div_3_Template","AppComponent_Conditional_3_app_bottom_bar_4_Template","hasError","AppComponent","firstLoad","Chart","register","ChartDataLabels","events","NavigationStart","RoutesRecognized","activatedRoute","root","firstChild","validateState","_this2","widgetToExport","getAvailableDatabits","defaultChain","doGetUserDashboards","doSelectDefaultChain","_this3","_this4","databitsInfoResponse","databitsInfo","doSaveUserDefaultChain","_this5","doLogError","_this6","isRequired","_this7","scroll","onResize","onOrientationChange","i9","i10","AppComponent_Conditional_2_Template","AppComponent_Conditional_3_Template","AppComponent_div_5_Template","HttpRequestAuthInterceptor","APIS_TO_TRACK","intercept","logObj","trackAPI","timer","el","destroyTimer","destroySyncMessage","handle","catchError","status","throwError","finalize","HttpHeaderInterceptor","clone","withCredentials","setHeaders","HttpErrorInterceptor","body","GlobalErrorHandler","ErrorHandler","injector","stackTrace","logMessage","providers","provideCharts","withDefaultRegisterables","HTTP_INTERCEPTORS","multi","AppModule","bootstrap","imports","BrowserModule","FormsModule","ReactiveFormsModule","BrowserAnimationsModule","DragDropModule","HammerModule","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","webpackContext","req","webpackContextResolve","__webpack_require__","code","module","exports"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/interfaces/DashboardType.ts","./src/app/shared/services/SilverWareArrays.ts","./src/app/shared/services/SilverWareIcons.ts","./src/app/shared/enums/available-chart-type.enum.ts","./src/app/missing-chain-id/missing-chain-id.component.ts","./src/app/missing-chain-id/missing-chain-id.component.html","./src/app/shared/interfaces/Dashboard.ts","./src/app/shared/interfaces/DatabitCategory.ts","./src/app/shared/services/common.service.ts","./src/app/shared/interfaces/ObjectState.ts","./src/app/drag-drop/drag-drop.component.html","./src/app/drag-drop/drag-drop.component.ts","./src/app/shared/services/SilverWareCommon.ts","./src/app/shared/generate-guid.component.ts","./src/app/shared/classes/basedashboardcomponent.ts","./src/environments/environment.prod.ts","./src/app/shared/app.config.ts","./src/app/shared/enums/log-type.ts","./src/app/shared/services/modal.service.ts","./src/app/shared/classes/log.ts","./src/app/shared/services/log.service.ts","./src/app/shared/services/dashboard.service.ts","./src/app/shared/services/databit.service.ts","./src/app/shared/services/navigation.service.ts","./src/app/shared/services/page.service.ts","./src/app/shared/interfaces/DatabitParameter.ts","./src/app/shared/services/auth.service.ts","./src/app/shared/services/hammerjs.service.ts","./src/app/calendar/calendar.component.html","./src/app/calendar/calendar.component.ts","./src/app/loading-animation/loading-animation.component.html","./src/app/loading-animation/loading-animation.component.ts","./src/app/select-list/select-list.component.html","./src/app/select-list/select-list.component.ts","./src/app/shared/filters/add-white-space.pipe.ts","./src/app/charts/filter-options/filter-options.component.html","./src/app/charts/filter-options/filter-options.component.ts","./src/app/shared/filters/chart-type.pipe.ts","./src/app/shared/services/SilverWareEnums.ts","./src/app/shared/interfaces/SeriesDataType.ts","./src/app/shared/filters/format-chart-number-pipe.ts","./src/app/shared/classes/chart-base.ts","./src/app/shared/classes/chart-js-base.ts","./src/app/shared/services/graph.service.ts","./src/app/shared/services/share.service.ts","./src/app/charts/pie-chart/pie-chart.component.html","./src/app/charts/pie-chart/pie-chart.component.ts","./src/app/charts/bar-chart/bar-chart.component.ts","./src/app/charts/bar-chart/bar-chart.component.html","./src/app/charts/doughnut-chart/doughnut-chart.component.html","./src/app/charts/doughnut-chart/doughnut-chart.component.ts","./src/app/charts/line-chart/line-chart.component.ts","./src/app/charts/line-chart/line-chart.component.html","./src/app/charts/text-chart/text-chart.component.html","./src/app/charts/text-chart/text-chart.component.ts","./src/app/charts/report-chart/report-chart.component.ts","./src/app/charts/report-chart/report-chart.component.html","./src/app/shared/enums/input-type.enum.ts","./src/app/templates/multi-line-input/multi-line-input.component.html","./src/app/templates/multi-line-input/multi-line-input.component.ts","./src/app/charts/chart/chart.component.html","./src/app/charts/chart/chart.component.ts","./src/app/dashboard/dashboard.component.html","./src/app/dashboard/dashboard.component.ts","./src/app/reports/reports.component.ts","./src/app/reports/reports.component.html","./src/app/settings/settings.component.ts","./src/app/settings/settings.component.html","./src/app/comparison/comparison.component.ts","./src/app/comparison/comparison.component.html","./src/app/shared/services/user.service.ts","./src/app/user-profile/user-profile.component.html","./src/app/user-profile/user-profile.component.ts","./src/app/shared/interfaces/Page.ts","./src/app/shared/classes/RouteGuard.ts","./src/app/export-widget/export-widget.component.html","./src/app/export-widget/export-widget.component.ts","./src/app/app-routing.module.ts","./src/app/navigation-bars/side-bar/side-bar.component.html","./src/app/navigation-bars/side-bar/side-bar.component.ts","./src/app/navigation-bars/bottom-bar/bottom-bar.component.html","./src/app/navigation-bars/bottom-bar/bottom-bar.component.ts","./src/app/page-detector/page-detector.component.html","./src/app/page-detector/page-detector.component.ts","./src/app/navigation-bars/top-bar/top-bar.component.html","./src/app/navigation-bars/top-bar/top-bar.component.ts","./src/app/dynamic.directive.ts","./src/app/add-dynamic/add-dynamic.component.ts","./src/app/add-dynamic/add-dynamic.component.html","./src/app/modal-dialog/modal-dialog.component.html","./src/app/modal-dialog/modal-dialog.component.ts","./src/app/app.component.html","./src/app/app.component.ts","./src/app/shared/interceptor/http-request.interceptor.ts","./src/app/shared/interceptor/http-header.interceptor.ts","./src/app/shared/interceptor/http-error.interceptor.ts","./src/app/shared/global/global-error-handler.ts","./src/app/app.module.ts","./src/main.ts","./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["export enum DashboardType {\r\n Any = 0,\r\n Heartbeat = 1,\r\n Custom = 2,\r\n Sales = 3,\r\n Employees = 4,\r\n LossPrevention = 5,\r\n Guests = 6,\r\n Other = 7\r\n}\r\n","export module SilverWareArrays {\r\n\r\n export function find(array: T[], item: T): T {\r\n var length = 0;\r\n\r\n if (array != null) {\r\n length = array.length\r\n }\r\n\r\n for (var i = 0; i < length; i++) {\r\n var val = array[i];\r\n if (item === val) {\r\n return val;\r\n }\r\n }\r\n }\r\n\r\n export function indexOf(array: T[], callback: (item: T) => boolean): number {\r\n var length = 0;\r\n\r\n if (array != null) {\r\n length = array.length;\r\n }\r\n\r\n for (let i = 0; i < length; i++) {\r\n var val = array[i];\r\n if (callback(val) === true) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n export function forEach(array: T[], callback: (item: T) => void): void {\r\n var length = 0;\r\n\r\n if (array != null) {\r\n length = array.length;\r\n }\r\n\r\n for (var i = 0; i < length; i++) {\r\n callback(array[i]);\r\n }\r\n }\r\n\r\n export function forEachTill(array: T[], callback: (item: T) => boolean): void {\r\n var length = 0;\r\n\r\n if (array != null) {\r\n length = array.length\r\n }\r\n\r\n for (var i = 0; i < length; i++) {\r\n if (callback(array[i]) === false) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n export function firstOrDefault(array: T[], callback: (item: T) => boolean): T {\r\n var length = 0;\r\n\r\n if (array != null) {\r\n length = array.length\r\n }\r\n\r\n for (var i = 0; i < length; i++) {\r\n var val = array[i];\r\n if (callback(val) === true) {\r\n return val;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n export function where(array: T[], callback: (item: T) => boolean): T[] {\r\n var length = 0;\r\n\r\n if (array != null) {\r\n length = array.length\r\n }\r\n\r\n\r\n var items: T[] = [];\r\n for (var i = 0; i < length; i++) {\r\n var val = array[i];\r\n if (callback(val) == true) {\r\n items.push(val);\r\n }\r\n }\r\n return items;\r\n }\r\n\r\n export function count(array: T[], callback: (item: T) => boolean): number {\r\n let length = 0;\r\n\r\n if (array != null) {\r\n length = array.length;\r\n }\r\n\r\n let result: number;\r\n result = 0;\r\n\r\n for (var i = 0; i < length; i++) {\r\n var val = array[i];\r\n if (callback(val) == true) {\r\n result += 1;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n\r\n\r\n /**\r\n * sorts original array\r\n * @param array\r\n * @param sortBy\r\n */\r\n export function sortAsc(array: T[], sortBy: string): void {\r\n array.sort((a, b) => { return a[sortBy] > b[sortBy] ? 1 : (a[sortBy] < b[sortBy] ? -1 : 0); });\r\n }\r\n\r\n export function sortAscCaseInsensitive(array: T[], sortBy: string): void {\r\n array.sort((a, b) => { return a[sortBy].toLowerCase() > b[sortBy].toLowerCase() ? 1 : (a[sortBy].toLowerCase() < b[sortBy].toLowerCase() ? -1 : 0); });\r\n }\r\n\r\n export function sortDesc(array: T[], sortBy: string): void {\r\n array.sort((a, b) => { return a[sortBy] < b[sortBy] ? 1 : (a[sortBy] > b[sortBy] ? -1 : 0); });\r\n }\r\n\r\n export function sortAscMultiple(array: T[], sortByProps: string[]): void {\r\n\r\n array.sort((a, b) => {\r\n\r\n var fieldAPoints = 0;\r\n var fieldBPoints = 0;\r\n\r\n for (var i = 0; i < sortByProps.length; i++) {\r\n var fieldA = a[sortByProps[i]];\r\n var fieldB = b[sortByProps[i]];\r\n\r\n var pointsFactor = Math.pow(10, sortByProps.length - (i + 1));\r\n\r\n if (fieldA > fieldB)\r\n fieldAPoints += pointsFactor;\r\n else if (fieldA < fieldB)\r\n fieldBPoints += pointsFactor;\r\n else\r\n fieldBPoints += 0;\r\n }\r\n\r\n return fieldAPoints > fieldBPoints ? 1 : (fieldAPoints < fieldBPoints ? -1 : 0);\r\n });\r\n }\r\n\r\n /*\r\n can sort array of objects with child propertry\r\n eg. To sort by property of object table, sortNatural(tableOrders, 'table.Name')\r\n */\r\n export function sortNatural(array: T[], sortBy: string): void {\r\n\r\n var getNestedProperty = function (o, s) {\r\n s = s.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\r\n s = s.replace(/^\\./, ''); // strip a leading dot\r\n var a = s.split('.');\r\n for (var i = 0, n = a.length; i < n; ++i) {\r\n var k = a[i];\r\n if (k in o) {\r\n o = o[k];\r\n } else {\r\n return;\r\n }\r\n }\r\n return o.toString();\r\n }\r\n\r\n\r\n array.sort(function (a, b) {\r\n var ax = [], bx = [];\r\n\r\n getNestedProperty(a, sortBy).replace(/(\\d+)|(\\D+)/g, function (_, $1, $2) { ax.push([$1 || Infinity, $2 || \"\"]) });\r\n getNestedProperty(b, sortBy).replace(/(\\d+)|(\\D+)/g, function (_, $1, $2) { bx.push([$1 || Infinity, $2 || \"\"]) });\r\n\r\n while (ax.length && bx.length) {\r\n var an = ax.shift();\r\n var bn = bx.shift();\r\n var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);\r\n if (nn) return nn;\r\n }\r\n\r\n return ax.length - bx.length;\r\n });\r\n }\r\n\r\n export function isEqual(value, other) {\r\n\r\n // Get the value type\r\n var type = Object.prototype.toString.call(value);\r\n\r\n // If the two objects are not the same type, return false\r\n if (type !== Object.prototype.toString.call(other)) return false;\r\n\r\n // If items are not an object or array, return false\r\n if (['[object Array]', '[object Object]'].indexOf(type) < 0) return false;\r\n\r\n // Compare the length of the length of the two items\r\n var valueLen = type === '[object Array]' ? value.length : Object.keys(value).length;\r\n var otherLen = type === '[object Array]' ? other.length : Object.keys(other).length;\r\n if (valueLen !== otherLen) return false;\r\n\r\n // Compare two items\r\n var compare = function (item1, item2) {\r\n\r\n // Get the object type\r\n var itemType = Object.prototype.toString.call(item1);\r\n\r\n // If an object or array, compare recursively\r\n if (['[object Array]', '[object Object]'].indexOf(itemType) >= 0) {\r\n if (!isEqual(item1, item2)) return false;\r\n }\r\n\r\n // Otherwise, do a simple comparison\r\n else {\r\n\r\n // If the two items are not the same type, return false\r\n if (itemType !== Object.prototype.toString.call(item2)) return false;\r\n\r\n // Else if it's a function, convert to a string and compare\r\n // Otherwise, just compare\r\n if (itemType === '[object Function]') {\r\n if (item1.toString() !== item2.toString()) return false;\r\n } else {\r\n if (item1 !== item2) return false;\r\n }\r\n\r\n }\r\n };\r\n\r\n // Compare properties\r\n if (type === '[object Array]') {\r\n for (var i = 0; i < valueLen; i++) {\r\n if (compare(value[i], other[i]) === false) return false;\r\n }\r\n } else {\r\n for (var key in value) {\r\n if (value.hasOwnProperty(key)) {\r\n if (compare(value[key], other[key]) === false) return false;\r\n }\r\n }\r\n }\r\n\r\n // If nothing failed, return true\r\n return true;\r\n\r\n }\r\n\r\n /* Select certain items from within an array */\r\n export function select(array: T[], callback: (item: T) => any): any[] {\r\n var items = [];\r\n\r\n for (var i = 0; i < array.length; i++) {\r\n items.push(callback(array[i]))\r\n }\r\n\r\n return items;\r\n }\r\n\r\n export function selectMany(array: T[], callback: (item: T) => any): any[] {\r\n var items = [];\r\n\r\n // Loop through each of our callback's array's items and added them to our collection\r\n for (var i = 0; i < array.length; i++) {\r\n forEach(callback(array[i]), function (x) {\r\n items.push(x);\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n export function any(array: T[], callback: (item: T) => boolean): boolean {\r\n\r\n if (array == null || array.length == 0) {\r\n return false;\r\n }\r\n\r\n if (callback != null) {\r\n var items = where(array, callback)\r\n\r\n return (items != null && items.length > 0)\r\n }\r\n else {\r\n return (array != null && array.length > 0)\r\n }\r\n }\r\n\r\n export function all(array: T[], callback: (item: T) => boolean): boolean {\r\n var items = where(array, callback);\r\n\r\n return (items != null && items.length == array.length);\r\n }\r\n export function sum(array: T[], callback: (item: T) => any): number {\r\n var length = 0;\r\n\r\n if (array != null) {\r\n length = array.length\r\n }\r\n\r\n\r\n var sum = 0\r\n for (var i = 0; i < length; i++) {\r\n var val = array[i];\r\n sum = sum + callback(val);\r\n }\r\n return sum;\r\n }\r\n}\r\n","export namespace SilverWareIcons {\r\n export function chartsIcon(iconKey: string): string {\r\n const charts = {\r\n Unknown: 'fas fa-chart-area',\r\n BarChart: 'fas fa-chart-bar',\r\n BubbleChart: 'fas fa-chart-area',\r\n DoughnutChart: 'fas fa-chart-pie',\r\n LineChart: 'fas fa-chart-line',\r\n PieChart: 'fas fa-chart-pie',\r\n RadarChart: 'fas fa-chart-area',\r\n TextChart: 'fas icon-text-icon',\r\n Report: 'fas icon-report-icon'\r\n };\r\n return charts[iconKey];\r\n }\r\n export function databitParametersIcon(iconKey: string): string {\r\n const parameters = {\r\n storeID: 'fas fa-store-alt',\r\n MajorClassType: 'fab fa-sourcetree',\r\n MajorClasses: 'fas icon-major-category-icon',\r\n MinorClasses: 'fas icon-minor-category-icon',\r\n MenuItems: 'fas icon-menu-items-icon',\r\n OrderStatus: 'fas icon-status-icon',\r\n ReportBy: 'fas icon-report-by-icon-2',\r\n Users: 'fas icon-users-icon',\r\n CostCenters: 'fas fa-donate',\r\n Segments: 'fas icon-segments-icon',\r\n ServiceTypes: 'fas icon-service-type-icon',\r\n MajorJobs: 'fas icon-major-job-icon',\r\n MinorJobs: 'fas icon-minor-job-icon',\r\n IncludeZeroPriced: 'fas fa-money-bill-wave-alt',\r\n DateRange: 'fas fa-calendar-alt',\r\n TimeRange: 'far icon-time-range-icon',\r\n PaymentMethods: 'fas fa-cash-register',\r\n Control: 'fas fa-list-alt',\r\n CheckNumber: 'fas fa-money-check',\r\n OrderNumber: 'fas fa-receipt',\r\n MoreFilters: 'fas icon-more-filters',\r\n FiscalYearStartDate: 'fas fa-calendar-alt',\r\n };\r\n if (parameters[iconKey] != undefined) {\r\n return parameters[iconKey];\r\n }\r\n return this.fallBackIcon();\r\n }\r\n\r\n export function globalIcons(iconKey: string): string {\r\n const global = {\r\n heartbeat: 'fas fa-heartbeat',\r\n heart: 'fas fa-heart heart',\r\n plus: 'fas fa-plus',\r\n edit: 'fas icon-edit-icon',\r\n more: 'fas fa-ellipsis-h',\r\n chart: 'fas fa-chart-bar',\r\n trash: 'fas fa-trash-alt',\r\n filter: 'fas fa-filter',\r\n share: 'fas icon-share-icon-arrow',\r\n question: 'fas fa-question',\r\n sync: 'fas fa-sync-alt'\r\n };\r\n if (global[iconKey] != undefined) {\r\n return global[iconKey];\r\n }\r\n return this.fallBackIcon();\r\n }\r\n\r\n export function navIcons(iconKey: string): string {\r\n const nav = {\r\n heartbeat: 'fas fa-heartbeat',\r\n menu: 'fas fa-bars',\r\n dashboards: 'fas fa-tachometer-alt',\r\n sales: 'fas fa-chart-line',\r\n comparison: 'fas fa-cubes',\r\n guests: 'fas fa-users',\r\n employees: 'fas fa-suitcase',\r\n lostPrevention: 'fas fa-exclamation',\r\n cannedReports: 'fas fa-folder-open',\r\n settings: 'fas fa-cog',\r\n notification: 'fas fa-bell',\r\n userProfile: 'far fa-user-circle'\r\n };\r\n if (nav[iconKey] != undefined) {\r\n return nav[iconKey];\r\n }\r\n return this.fallBackIcon();\r\n }\r\n export function fallBackIcon() {\r\n return 'fas fa-question';\r\n }\r\n}\r\n","export enum AvailableChartType {\r\n Unknown = 0,\r\n BarChart = 1,\r\n //BubbleChart = 2,\r\n DoughnutChart = 3,\r\n LineChart = 4,\r\n PieChart = 5,\r\n //RadarChart = 6,\r\n TextChart = 7,\r\n Report = 8\r\n}\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-missing-chain-id',\r\n templateUrl: './missing-chain-id.component.html',\r\n styleUrls: ['./missing-chain-id.component.css']\r\n})\r\nexport class MissingChainIDComponent implements OnInit {\r\n constructor(private router: Router, private activeRoute: ActivatedRoute) { }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n\r\n }\r\n}\r\n","\r\n
Invalid Link. A valid chain ID was not specified.
\r\n","import {Page} from './Page';\r\nimport {Databit} from './Databit';\r\nimport {DashboardType} from './DashboardType';\r\nimport {DatabitConfig} from './DatabitConfig';\r\n\r\nexport class Dashboard {\r\n //id: string;\r\n //userID: string;\r\n //type: DashboardType;\r\n //name: string;\r\n //databits: Array;\r\n constructor(public id: string, public userID: string, public type: DashboardType, public name: string, public databits: Array) { }\r\n}\r\n","export enum DatabitCategory {\r\n Sales= 'Sales',\r\n Auditing = 'Auditing',\r\n LossPrevention = 'Loss Prevention',\r\n ServerReporting = 'Server Reporting',\r\n Control = 'Control',\r\n Operations = 'Operations',\r\n ClientGiftCards = 'Client/Gift Cards',\r\n None = 'None',\r\n All = 'All'\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {AvailableChartType} from '../enums/available-chart-type.enum';\r\nimport {SilverWareArrays} from './SilverWareArrays';\r\nimport {DashboardType} from '../interfaces/DashboardType';\r\nimport {DatabitCategory} from '../interfaces/DatabitCategory';\r\nimport {HttpErrorResponse} from '@angular/common/http';\r\nimport * as _ from 'lodash';\r\nimport {ChartParsedData} from '../types/chart-parsed-data';\r\nimport {GroupCharData} from '../types/group-char-data';\r\nimport {ChartDataset, ChartType} from 'chart.js';\r\nimport {NameValue} from '../types/name-value';\r\nimport {NameValueIcon} from '../types/name-value-icon';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommonService {\r\n\r\n readonly ALL_LIST_ITEM: NameValueIcon = {name: 'All', value: 'All'};\r\n constructor() { }\r\n\r\n // -------------- *ngFor trackBy --------------\r\n byID(index: number, item: T): string {\r\n if (item.id)\r\n return item.id;\r\n\r\n return item.ID;\r\n }\r\n\r\n byValue(index: number, item: T): string {\r\n return item.value;\r\n }\r\n\r\n fixObjectCasing(obj: T): T2 {\r\n return _.mapKeys(obj, (v, k) => _.camelCase(k))\r\n }\r\n\r\n validateEmail(email): boolean {\r\n const re = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return re.test(String(email).toLowerCase());\r\n }\r\n\r\n convertToChartFormat(data: any, chartType: AvailableChartType) {\r\n const parsedData = [{ data: data.values, label: data.id }];\r\n switch (chartType) {\r\n case AvailableChartType.Unknown:\r\n console.error('Chart type is unknown!');\r\n break;\r\n case AvailableChartType.BarChart:\r\n case AvailableChartType.LineChart:\r\n case AvailableChartType.TextChart:\r\n case AvailableChartType.Report:\r\n return parsedData;\r\n case AvailableChartType.DoughnutChart:\r\n case AvailableChartType.PieChart:\r\n return parsedData.map((dataset) => {\r\n return dataset.data;\r\n });\r\n default:\r\n console.error('Chart Type NOT IMPLEMENTED!');\r\n }\r\n }\r\n\r\n private reducer(a, b): number {\r\n return Number(a) + Number(b);\r\n }\r\n /**\r\n * Provides a deep clone from an object\r\n * @param obj\r\n */\r\n cloneDeep(obj: T): T {\r\n return _.cloneDeep(obj);\r\n }\r\n\r\n // Orders the data and corresponding labels from highest value to lowest\r\n // If more data elements are given than can be displayed we will, after ordering, group the remaining elements into a single element with the label 'Others'\r\n // Optional bools can be passed in to prevent sorting and/or grouping\r\n groupDataBySize(groupSize: number, dataIn: GroupCharData, doNotSort?: boolean, doNotGroup?: boolean): GroupCharData {\r\n\r\n\r\n // If we have no data, return null\r\n if (!dataIn) {\r\n return;\r\n }\r\n\r\n let chartData = _.cloneDeep(dataIn); // Object has an array of data arrays and an array of string labels\r\n let orderedLabels = []; // Array of string labels\r\n\r\n let comparisonsData = []; // Array for holding comparisons\r\n let dataCount = 0; // Position counter\r\n\r\n let additionalValueDictionaries = []; // A Dictionary for each set of additional data\r\n let labelDict = {}; // Dictionary with the label as key and the data number as a value\r\n let baseValueDict = {}; // Dictionary used to compare our additional value dictionaries where key is index and value is amount\r\n\r\n if (chartData.data.length == 0) {\r\n return chartData;\r\n }\r\n\r\n\r\n // Fill our additional data araay\r\n if (chartData.data.length > 0) {\r\n SilverWareArrays.forEach(chartData.data, (x: any) => {\r\n if (x.data != null && Array.isArray(x.data)) {\r\n comparisonsData.push(x.data);\r\n }\r\n else if (Array.isArray(x)) {\r\n comparisonsData.push(x);\r\n }\r\n });\r\n }\r\n\r\n // Get our labels\r\n orderedLabels = chartData.labels;\r\n\r\n // Since we are using labels as the key to our dictionary we need to make sure every label is unique\r\n // By doing this we ensure every data value on the graph has a corresponding label (and therefore no 'undefined' label)\r\n if (comparisonsData.length < 2) {\r\n this.fixDuplicateLabels(comparisonsData, orderedLabels);\r\n }\r\n\r\n // Fill our dictionaries\r\n let referenceDataset = comparisonsData[0];\r\n SilverWareArrays.forEach(comparisonsData, (dataSet: any) => {\r\n\r\n // On the first loop fill our reference and label dictionary\r\n if (dataCount == 0) {\r\n orderedLabels.forEach((key, i) => labelDict[key] = referenceDataset[i]);\r\n referenceDataset.forEach((key, i) => baseValueDict[i] = referenceDataset[i]);\r\n\r\n }\r\n // Add a new dictionary for each comparison\r\n else {\r\n let dict = {};\r\n\r\n dataSet.forEach((key, i) => dict[i] = dataSet[i]);\r\n\r\n additionalValueDictionaries.push(dict);\r\n }\r\n\r\n dataCount++;\r\n });\r\n\r\n\r\n // Do we sort?\r\n if (doNotSort != null && !doNotSort) {\r\n\r\n // Sort our data from heighst to lowest\r\n comparisonsData[0].sort((a, b) => b - a);\r\n\r\n // We need to sourt our labels the same way we sourt our data\r\n // This will be an array of arrays, each nested array's 0 index will be a label and the 1 index will be a data value\r\n let items = Object.keys(labelDict).map (key => {\r\n return [key, labelDict[key]];\r\n });\r\n\r\n // Sort from heighst to lowest\r\n items.sort( (first, second) => {\r\n return second[1] - first[1];\r\n });\r\n\r\n // Clear our ordered label array\r\n orderedLabels = [];\r\n\r\n // Fill our ordered label array with our items object\r\n // Since the item object is now sorted we just need to get the label which is the nested array's 0 index\r\n items.forEach((group, i) => orderedLabels.push(group[0]));\r\n\r\n // We need to sourt our labels the same way we sourt our data\r\n // This will be an array of arrays, each nested array's 0 index will be a label and the 1 index will be a data value\r\n items = Object.keys(baseValueDict).map(key =>{\r\n return [key, baseValueDict[key]];\r\n });\r\n\r\n // Sort from heighst to lowest\r\n items.sort((first, second) => {\r\n return second[1] - first[1];\r\n });\r\n\r\n // If we have any additional data it needs to be sorted too\r\n if (comparisonsData.length > 1) {\r\n\r\n let currentDataSortPosition = 1; // Used for indexing\r\n\r\n // Loop through and fix each additional data\r\n SilverWareArrays.forEach(additionalValueDictionaries, (dictToSort: any) => {\r\n\r\n let baseValuePosition = 0; // used for idexing\r\n let offset = 0; // Offset ised to keep track of the position changes of our data\r\n let itemsLength = items.length-1;\r\n\r\n // kvPair is the value we will be comparing agenst\r\n SilverWareArrays.forEach(items, (kvPair: any) => {\r\n\r\n // Get our index\r\n let position = kvPair[0];\r\n\r\n // Find our current amount at that position\r\n let amountAtPosition = dictToSort[position];\r\n\r\n // Fix our index with our offset\r\n let realPosition = Number(position) + offset;\r\n\r\n if (realPosition > itemsLength) {\r\n realPosition = itemsLength;\r\n }\r\n\r\n // Remove the value where it currently is and add it back to the same position as our refence dictionary\r\n comparisonsData[currentDataSortPosition].splice(realPosition, 1);\r\n comparisonsData[currentDataSortPosition].splice(baseValuePosition, 0, amountAtPosition);\r\n\r\n // Handle offset\r\n if (realPosition > baseValuePosition) {\r\n offset++;\r\n }\r\n else if (realPosition < baseValuePosition) {\r\n offset--;\r\n }\r\n\r\n\r\n baseValuePosition++;\r\n });\r\n\r\n currentDataSortPosition++;\r\n });\r\n }\r\n }\r\n\r\n // Find out if we can group\r\n let canGroup = doNotGroup != null && !doNotGroup;\r\n dataCount = 0;\r\n\r\n // If we have more items than can be displayed and we're allowed to group\r\n if (canGroup) {\r\n\r\n SilverWareArrays.forEach(comparisonsData, (data: any) => {\r\n if ((data && data.length > groupSize)) {\r\n\r\n // Slice to the group size\r\n let processedData = data.slice(0, groupSize);\r\n\r\n // Get our left over amount\r\n let otherData = data.slice(groupSize).reduce(this.reducer, 0);\r\n otherData = isNaN(otherData) ? \"NA\" : otherData.toFixed(2)\r\n\r\n\r\n // Add our other, left over, amount\r\n processedData.push(otherData);\r\n data = processedData;\r\n }\r\n\r\n // Set our ordered data plus others\r\n if (chartData.data[dataCount].data) {\r\n chartData.data[dataCount].data = data;\r\n }\r\n else {\r\n chartData.data[dataCount] = data;\r\n }\r\n\r\n dataCount++;\r\n });\r\n\r\n if (chartData.labels.length > groupSize) {\r\n\r\n // Use our already ordered labels, spliced to the group size\r\n let labels = orderedLabels.splice(0, groupSize);\r\n\r\n // Set our ordered labels plus others\r\n labels.push(\"Others\");\r\n chartData.labels = labels;\r\n }\r\n else {\r\n chartData.labels = orderedLabels; // Set our ordered labels\r\n }\r\n\r\n }\r\n\r\n // Return our now grouped and ordered data and labels\r\n return chartData;\r\n }\r\n\r\n // Returns any duplcates found\r\n findDuplicates = (array) => {\r\n\r\n // if we have to data return null\r\n if (array == null || array.length == 0) {\r\n return;\r\n }\r\n\r\n // We use slice to clone the array so the original array won't be modified\r\n // Order our array so our duplicate values are beside each other\r\n let sortedArray = array.slice().sort();\r\n\r\n let results = [];\r\n\r\n // If two elements next to each other are the same value they are duplcates\r\n for (let i = 0; i < sortedArray.length - 1; i++) {\r\n if (sortedArray[i + 1] == sortedArray[i]) {\r\n results.push(sortedArray[i]);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n\r\n getCategoryTypeFromDashboard(dbType: DashboardType): DatabitCategory[] {\r\n let category = new Array();\r\n switch (dbType) {\r\n case DashboardType.Sales: category.push(DatabitCategory.Sales);\r\n break;\r\n case DashboardType.Employees: category.push(DatabitCategory.ServerReporting);\r\n break;\r\n case DashboardType.LossPrevention: category.push(DatabitCategory.LossPrevention);\r\n break;\r\n case DashboardType.Guests: category = category.concat([DatabitCategory.Operations, DatabitCategory.ClientGiftCards]);\r\n break;\r\n default: category.push(DatabitCategory.None);\r\n }\r\n return category;\r\n }\r\n\r\n onlyUnique(value, index, self): boolean {\r\n return self.indexOf(value) === index;\r\n }\r\n\r\n fixDuplicateLabels(duplicateLabels: any, orderedLabels: any): void {\r\n // Get our duplicates labels\r\n duplicateLabels = this.findDuplicates(orderedLabels);\r\n\r\n // Only fix duplicate labels if we have any\r\n if (duplicateLabels != null && duplicateLabels.length > 0) {\r\n\r\n let count = 0; // Used to keep track of how many duplicates we have encountered so far\r\n let indexOfduplicateLabel = -1; // Used for finding the index of the next duplicate\r\n\r\n // We will use this function to fix our duplicate labels recursively\r\n let findNextDuplicatedLabelAndMakeUnique = (label): void => {\r\n\r\n // Up our count\r\n count = count + 1;\r\n\r\n // Find the next duplicate's index\r\n indexOfduplicateLabel = orderedLabels.indexOf(label);\r\n\r\n // If there still is a duplicate\r\n if (indexOfduplicateLabel > -1) {\r\n\r\n // Mark the duplicate diffrent by adding a dash (-) followed by the current duplicate count\r\n // For example Wine - 1, Wine - 2, Wine - 3 ...\r\n orderedLabels[indexOfduplicateLabel] = label + \" - \" + count;\r\n\r\n // Use recursion to check for the next duplicate\r\n findNextDuplicatedLabelAndMakeUnique(label);\r\n }\r\n else {\r\n\r\n // Reset values for next iteration\r\n count = 0;\r\n indexOfduplicateLabel = -1;\r\n }\r\n }\r\n\r\n // Call our recursive function for each duplicate\r\n duplicateLabels.forEach((duplicateLabel, i) => {\r\n findNextDuplicatedLabelAndMakeUnique(duplicateLabel);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Validates if passed @param is not empty\r\n * @param value can be anything\r\n * @returns false if value is null or undefined or if value is string and empty or value is an array, and it's empty otherwise return true\r\n */\r\n isNotNullAndUndefinedAndEmpty(value: any): boolean {\r\n // Check if it's not null and undefined\r\n if (value !== null && value !== undefined && typeof value !== 'undefined') {\r\n // if it's string validate for being empty\r\n // If is not a string return true\r\n if (typeof value === 'string') {\r\n if (value.trim() !== '') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n // if it's array check is not empty\r\n if (Array.isArray(value)) {\r\n if (value.length > 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n // TODO: Let's extend this function to validate more data types\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n /**\r\n * Extract error message from request response ApplicationResponse or General TS & JS errors\r\n * @param ex\r\n * @return string error message\r\n */\r\n flattenErrorMessages(ex: any): string {\r\n let finalMessage: string = null;\r\n let errorDetails: string[] = [];\r\n const doFlattenErrors = (details: object): void => {\r\n Object.keys(details).forEach(key => {\r\n const error = details[key];\r\n if (this.isNotNullAndUndefinedAndEmpty(error)) {\r\n if (typeof error === 'string')\r\n errorDetails.push(error);\r\n else if (Array.isArray(error))\r\n errorDetails.push(...error);\r\n }\r\n\r\n });\r\n }\r\n if (ex instanceof HttpErrorResponse) {\r\n\r\n if (this.isNotNullAndUndefinedAndEmpty(ex.message))\r\n finalMessage = ex.message\r\n\r\n\r\n\r\n if (this.isNotNullAndUndefinedAndEmpty(ex.error)) {\r\n let errorDetail = ex.error;\r\n if (typeof errorDetail === 'string') {\r\n errorDetails.push(errorDetail);\r\n } else if(typeof errorDetail === 'object') {\r\n if (this.isNotNullAndUndefinedAndEmpty(errorDetail.Message) && typeof errorDetail.Message === 'string') {\r\n errorDetails.push(errorDetail.Message);\r\n }\r\n if (this.isNotNullAndUndefinedAndEmpty(errorDetail.message) && typeof errorDetail.message === 'string') {\r\n errorDetails.push(errorDetail.message);\r\n }\r\n\r\n if (this.isNotNullAndUndefinedAndEmpty(errorDetail.Errors) && typeof errorDetail.Errors === 'object') {\r\n errorDetail = errorDetail.Errors;\r\n doFlattenErrors(errorDetail)\r\n }\r\n if (this.isNotNullAndUndefinedAndEmpty(errorDetail.errors) && typeof errorDetail.errors === 'object') {\r\n errorDetail = errorDetail.errors;\r\n doFlattenErrors(errorDetail)\r\n }\r\n }\r\n }\r\n\r\n if (errorDetails.length > 0 && this.isNotNullAndUndefinedAndEmpty(finalMessage)) {\r\n finalMessage += '. Details: '\r\n }\r\n if (errorDetails.length > 0)\r\n finalMessage += errorDetails.join('. ');\r\n }\r\n\r\n if (this.isNotNullAndUndefinedAndEmpty(finalMessage))\r\n return finalMessage;\r\n\r\n if (ex instanceof Error) {\r\n finalMessage = ex.message;\r\n } else if (typeof ex === 'string') {\r\n finalMessage = ex;\r\n } else if (this.isNotNullAndUndefinedAndEmpty(ex) && typeof ex.Message !== 'undefined') {\r\n finalMessage = ex.Message;\r\n } else if (this.isNotNullAndUndefinedAndEmpty(ex) && typeof ex.Messages !== 'undefined') {\r\n finalMessage = ex.Messages.join(', ');\r\n } else {\r\n try {\r\n finalMessage = JSON.stringify(ex);\r\n } catch (e) {\r\n console.error(ex);\r\n finalMessage = 'Unknown Error';\r\n }\r\n }\r\n return finalMessage;\r\n }\r\n\r\n\r\n get availableChartType() {\r\n return AvailableChartType;\r\n }\r\n}\r\n","export enum ObjectState {\r\n None = 0,\r\n Added = 1,\r\n Unchanged = 2,\r\n Modified = 3,\r\n Deleted = 4,\r\n AutoAdded = 5\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{item.name}}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n","import {Component, Input, OnInit} from '@angular/core';\r\nimport {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop';\r\nimport {animate, state, style, transition, trigger} from '@angular/animations';\r\nimport {SilverWareArrays} from '../shared/services/SilverWareArrays';\r\nimport {CommonService} from \"../shared/services/common.service\";\r\n\r\n@Component({\r\n selector: 'app-drag-drop',\r\n templateUrl: './drag-drop.component.html',\r\n styleUrls: ['./drag-drop.component.css'],\r\n animations: [\r\n trigger('toggle', [\r\n state('open', style({\r\n width: '80px',\r\n })),\r\n state('closed', style({\r\n width: '0px',\r\n })),\r\n transition('open => closed', [\r\n animate('.1s')\r\n ]),\r\n transition('closed => open', [\r\n animate('0.1s')\r\n ]),\r\n ]),\r\n trigger(\r\n 'inOutAnimation',\r\n [\r\n transition(\r\n ':enter',\r\n [\r\n style({ visibility: 'hidden', opacity: 0 }),\r\n animate('.1s ease-out',\r\n style({ visibility: 'visible', opacity: 1 }))\r\n ]\r\n ),\r\n transition(\r\n ':leave',\r\n [\r\n style({ visibility: 'visible', opacity: 1 }),\r\n animate('1s ease-out',\r\n style({ visibility: 'hidden', opacity: 0 }))\r\n ]\r\n )\r\n ]\r\n )\r\n ],\r\n})\r\nexport class DragDropComponent implements OnInit {\r\n @Input() list = [];\r\n constructor(public commonService: CommonService) { }\r\n\r\n ngOnInit() {\r\n }\r\n drop(event: CdkDragDrop) {\r\n moveItemInArray(this.list, event.previousIndex, event.currentIndex);\r\n }\r\n swipeDelete(show: boolean, item: any) {\r\n item.deleteToggle = show;\r\n }\r\n delete(item: any) {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(item)) {\r\n return;\r\n }\r\n\r\n const index = SilverWareArrays.indexOf(this.list, (ind: any) => ind.databitName == item.databitName)\r\n if (index > -1) {\r\n this.list.splice(index, 1);\r\n }\r\n }\r\n\r\n}\r\n","export module SilverWareCommon {\r\n\r\n export function isNotNullEmptyUndefined(element: any): boolean {\r\n if (element != null && element != undefined) {\r\n const isArray = Array.isArray(element);\r\n const elemetType = typeof (element);\r\n\r\n if (elemetType == 'string' && element.trim() == '')\r\n return false;\r\n\r\n if (isArray && element.length > 0)\r\n return true;\r\n else if (isArray && element.length == 0)\r\n return false;\r\n else if (!isArray)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n export function newGuid() {\r\n var d = new Date().getTime();\r\n if (typeof (window) !== 'undefined') {\r\n if (window.performance && typeof window.performance.now === \"function\") {\r\n d += performance.now(); //use high-precision timer if available\r\n }\r\n }\r\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = (d + Math.random() * 16) % 16 | 0;\r\n d = Math.floor(d / 16);\r\n return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\r\n });\r\n return uuid;\r\n }\r\n\r\n export function generateCheckFromPOS(posChk: any) {\r\n\r\n let item = {};\r\n item['CheckNumber'] = posChk.CheckNumber;\r\n item['Status'] = posChk.Status;\r\n item['TaxTotal'] = posChk.TaxTotal;\r\n\r\n var isFullyPaid = 0;\r\n\r\n if (getCheckBalanceOwing(posChk) <= 0) {\r\n isFullyPaid = 1;\r\n }\r\n\r\n item['IsFullyPaid'] = isFullyPaid;\r\n item['SubTotal'] = posChk.SubTotal;\r\n\r\n return item\r\n }\r\n\r\n\r\n export function getCheckTotal(chk: any): number {\r\n var length = 0;\r\n\r\n var runningTotal = SilverWareCommon.addNumbers(Number(chk.TaxTotal), Number(chk.SubTotal));\r\n\r\n runningTotal = SilverWareCommon.addNumbers(runningTotal, getCheckGratuityAmount(chk));\r\n\r\n return runningTotal;\r\n //return chk.TaxTotal + chk.SubTotal + getCheckGratuityAmount(chk);\r\n }\r\n\r\n export function getCheckGratuityAmount(chk: any): number {\r\n\r\n var gratTotal = 0;\r\n\r\n if (chk.Gratuities != null && chk.Gratuities.length > 0) {\r\n for (var i = 0; i < chk.Gratuities.length; i++) {\r\n var chkGrat: any = chk.Gratuities[i];\r\n\r\n gratTotal = SilverWareCommon.addNumbers(gratTotal, Number(chkGrat.Amount));\r\n\r\n //gratTotal += chkGrat.Amount;\r\n }\r\n }\r\n\r\n return gratTotal;\r\n }\r\n\r\n /// gets net\r\n export function sumPaymentNetAmounts(payments: []): number {\r\n\r\n var total = 0;\r\n\r\n if (payments != null && payments.length > 0) {\r\n\r\n for (var i = 0; i < payments.length; i++) {\r\n let chkPay: any = payments[i];\r\n\r\n var netPayAmt = SilverWareCommon.substractNumbers(Number(chkPay.PayAmount), Number(chkPay.TipAmount));\r\n total = SilverWareCommon.addNumbers(total, netPayAmt);\r\n\r\n //var netPayAmt = chkPay.PayAmount - chkPay.TipAmount;\r\n //total += netPayAmt;\r\n }\r\n }\r\n\r\n return total;\r\n }\r\n\r\n export function calculateCheckPaymentsNetAmount(chk: any) {\r\n\r\n var appliedAmt = sumPaymentNetAmounts(chk.Payments);\r\n return appliedAmt;\r\n\r\n }\r\n\r\n export function getCheckBalanceOwing(chk: any): number {\r\n\r\n var balanceOwing = 0;\r\n var total = getCheckTotal(chk);\r\n\r\n balanceOwing = SilverWareCommon.substractNumbers(total, calculateCheckPaymentsNetAmount(chk));\r\n\r\n //balanceOwing = total - calculateCheckPaymentsNetAmount(chk, incomigPayments);\r\n // round to 2 decimals\r\n return SilverWareCommon.roundDecimal(balanceOwing);\r\n }\r\n\r\n export enum ArithmeticOperation {\r\n Add,\r\n Substract,\r\n Multiply,\r\n Divide\r\n }\r\n\r\n export function addNumbers(a: number, b: number): number {\r\n return doOperation(a, b, ArithmeticOperation.Add);\r\n }\r\n\r\n export function substractNumbers(a: number, b: number): number {\r\n return doOperation(a, b, ArithmeticOperation.Substract);\r\n }\r\n\r\n export function multiplyDecimals(a: number, b: number): number {\r\n return doOperation(a, b, ArithmeticOperation.Multiply);\r\n }\r\n\r\n export function divideNumbers(a: number, b: number): number {\r\n return doOperation(a, b, ArithmeticOperation.Divide);\r\n }\r\n\r\n export function doOperation(a: number, b: number, operation: ArithmeticOperation): number {\r\n\r\n var atens = 1;\r\n var btens = 1;\r\n\r\n if (String(a).indexOf('.') != -1) {\r\n // we have a decimal\r\n atens = Math.pow(10, String(a).length - String(a).indexOf('.') - 1);\r\n }\r\n\r\n if (String(b).indexOf('.') != -1) {\r\n // we have a decimal\r\n btens = Math.pow(10, String(b).length - String(b).indexOf('.') - 1);\r\n }\r\n\r\n var finalTens = Math.max(atens, btens);\r\n\r\n //var aVal = Math.ceil((a * finalTens));\r\n //var bVal = Math.ceil((b * finalTens));\r\n\r\n var aVal = Math.round(a * finalTens);\r\n var bVal = Math.round(b * finalTens);\r\n\r\n if (operation == ArithmeticOperation.Add)\r\n return (aVal + bVal) / finalTens;\r\n else if (operation == ArithmeticOperation.Multiply)\r\n return (aVal * bVal) / (finalTens * finalTens);\r\n else if (operation == ArithmeticOperation.Substract)\r\n return (aVal - bVal) / finalTens;\r\n else if (operation == ArithmeticOperation.Divide) {\r\n var result = aVal / bVal;\r\n\r\n\r\n return result; // not tested\r\n }\r\n }\r\n\r\n export function roundDecimal(amount: number): number {\r\n\r\n var isNegative = amount < 0;\r\n\r\n //// We need to round to 3 decimal places first...\r\n //var amount3Places = decimalAdjust('round', Math.abs(amount), -3);\r\n\r\n // Then we round to 2 decimal places...\r\n var rounded = decimalAdjust('round', Math.abs(amount), -2);\r\n\r\n if (isNegative == true) {\r\n return rounded * -1;\r\n }\r\n return rounded;\r\n\r\n //return Math.round(amount * 100) / 100;\r\n }\r\n\r\n /*\r\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\r\n */\r\n export function decimalAdjust(type, value, exp) {\r\n // If the exp is undefined or zero...\r\n if (typeof exp === 'undefined' || +exp === 0) {\r\n return Math[type](value);\r\n }\r\n value = +value;\r\n exp = +exp;\r\n // If the value is not a number or the exp is not an integer...\r\n if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {\r\n return NaN;\r\n }\r\n // Shift\r\n value = value.toString().split('e');\r\n value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));\r\n // Shift back\r\n value = value.toString().split('e');\r\n return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));\r\n }\r\n}\r\n","// Generate Guid for payment\r\nexport class Guid {\r\n\r\n public static newGuid(): Guid {\r\n return new Guid('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = Math.random() * 16 | 0;\r\n const v = (c == 'x') ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n }));\r\n }\r\n\r\n public static get empty(): string {\r\n return '00000000-0000-0000-0000-000000000000';\r\n }\r\n\r\n public get empty(): string {\r\n return Guid.empty;\r\n }\r\n\r\n public static isValid(str: string): boolean {\r\n const validRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n return validRegex.test(str);\r\n }\r\n\r\n private value: string = this.empty;\r\n\r\n constructor(value?: string) {\r\n if (value) {\r\n if (Guid.isValid(value)) {\r\n this.value = value;\r\n }\r\n }\r\n }\r\n\r\n public toString() {\r\n return this.value;\r\n }\r\n\r\n public toJSON(): string {\r\n return this.value;\r\n }\r\n\r\n}\r\n","import { DatabitConfig } from '../interfaces/DatabitConfig';\r\nimport { SilverWareArrays } from '../services/SilverWareArrays';\r\nimport { SilverWareIcons } from '../services/SilverWareIcons';\r\nimport { PageService } from '../services/page.service';\r\nimport { NavigationService } from '../services/navigation.service';\r\nimport { ModalService } from '../services/modal.service';\r\nimport { AvailableChartType } from '../enums/available-chart-type.enum';\r\nimport { Dashboard } from '../interfaces/Dashboard';\r\nimport { DashboardType } from '../interfaces/DashboardType';\r\nimport { DragDropComponent } from '../../drag-drop/drag-drop.component';\r\nimport { ObjectState } from '../interfaces/ObjectState';\r\nimport { DashboardService } from '../services/dashboard.service';\r\nimport { DatabitCategory } from '../interfaces/DatabitCategory';\r\nimport { Databit } from '../interfaces/Databit';\r\nimport { DatabitParameterValue } from '../interfaces/DatabitParameterValue';\r\nimport { Observable, of } from 'rxjs';\r\nimport { AuthService } from '../services/auth.service';\r\nimport { Guid } from '../generate-guid.component';\r\nimport { ShareService } from '../services/share.service';\r\nimport { SilverWareCommon } from '../services/SilverWareCommon';\r\nimport {CommonService} from '../services/common.service';\r\nimport {LogService} from \"../services/log.service\";\r\n\r\nexport class BaseDashBoardComponent {\r\n chainId: string;\r\n dashboardId: string;\r\n name: string;\r\n userId: string;\r\n page: string;\r\n dashboardType = DashboardType.Heartbeat; //default is HeartBeat\r\n dashboardName = '';\r\n public dashboardDatabits: Array = [];\r\n constructor(public pageService: PageService, public navigationService: NavigationService, public modalService: ModalService, public dashboardService: DashboardService,\r\n public authService: AuthService = null, public commonService: CommonService, protected logService: LogService) { }\r\n\r\n\r\n public canExit(): Observable{\r\n if (this.pageService.changedItemsCount() > 0) {\r\n this.pageService.undoQueue(false);\r\n }\r\n return of(true);\r\n //if (this.pageService.changedItemsCount() > 0) {\r\n // this.modalService.confirm('Do you want to exit?', 'You have unsaved changes', 'No',\r\n // () => { this.canComponentExit.next(false) },\r\n // 'Yes',\r\n // () => {\r\n // this.pageService.saveQueue(null);\r\n // this.pageService.clearQueue();\r\n // this.pageService.clearQueueWatch();\r\n // this.canComponentExit.next(true);\r\n // });\r\n //}\r\n //return this.canComponentExit.asObservable();\r\n }\r\n\r\n public createNewWidget(dbType: DashboardType) {\r\n let databits = this.pageService.allAvailableDatabits;\r\n\r\n if (dbType != DashboardType.Custom) {\r\n let categories = this.commonService.getCategoryTypeFromDashboard(dbType);\r\n databits = this.pageService.allAvailableDatabits.filter((db) => categories.indexOf(db.category) > -1);\r\n }\r\n const listDatabit = databits.map(databit => ({ name: databit.displayName, value: databit.name, rightIcon: databit.active ? 'fas fa-chart-bar' : '' }));\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const modalObject = {\r\n buttons: [saveBtn],\r\n isMultiSelect: false,\r\n selectList: listDatabit,\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.list(null, 'Please choose your widget', modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData != '') {\r\n if (this.dashboardDatabits == null || this.dashboardDatabits == undefined) {\r\n this.dashboardDatabits = new Array();\r\n }\r\n const selectedDatabits = result.inputData;\r\n const chainStores = this.pageService.getChainStores(this.chainId).map(store => ({ name: store.name, value: store.id, icon: 'fas fa-store' }));\r\n SilverWareArrays.sortAsc(chainStores, 'name');\r\n const btnSave = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const objectModal = {\r\n buttons: [btnSave],\r\n isMultiSelect: false,\r\n selectList: chainStores,\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.list(null, 'Please choose your store', objectModal, null, 'Cancel', (response: any) => {\r\n if (response.inputData != null && response.inputData != '') {\r\n const selectedStoreID = response.inputData;\r\n const currentDatabit = this.pageService.allAvailableDatabits.find((d) => d.name == selectedDatabits);\r\n\r\n this.logService.debug(`Display Name ==> ${currentDatabit.displayName}`);\r\n\r\n var paramValues = new Array();\r\n\r\n if (currentDatabit.name == \"CheckDetailsDataBit\") {\r\n paramValues.push({\r\n name: \"CheckNumber\",\r\n value: '{ \"Name\": \"CheckNumber\", \"Value\": \"1\" }'\r\n });\r\n }\r\n else if (currentDatabit.name == \"OrderDataBit\") {\r\n paramValues.push({\r\n name: \"OrderNumber\",\r\n value: '{ \"Name\": \"OrderNumber\", \"Value\": \"1\" }'\r\n });\r\n }\r\n\r\n var defaultChartType: AvailableChartType;\r\n var typedChartTypeStr = currentDatabit.chartConfigs.defaultChartType as keyof AvailableChartType\r\n defaultChartType = AvailableChartType[typedChartTypeStr];\r\n var defaultDate = {\r\n name: 'DateRange',\r\n value: 'CurrentDay'\r\n }\r\n\r\n const dt: DatabitConfig = {\r\n parameterValues: paramValues,\r\n chartType: defaultChartType, // TODO: we need the chart type\r\n displayName: currentDatabit.displayName,\r\n storeID: selectedStoreID,\r\n chainID: this.chainId,\r\n databitName: currentDatabit.name,\r\n objectState: ObjectState.Added,\r\n chartConfigs: currentDatabit.chartConfigs,\r\n id: SilverWareCommon.newGuid(),\r\n seriesOverride: null,\r\n comparisonParameterValues: []\r\n };\r\n dt.parameterValues.push(defaultDate); //\r\n\r\n this.dashboardDatabits.push(dt);\r\n const currentDashboard: Dashboard = {\r\n id: this.dashboardId,\r\n type: DashboardType.Custom,\r\n name: this.name,\r\n userID: this.userId,\r\n databits: this.dashboardDatabits\r\n };\r\n this.pageService.queueChanges.push(currentDashboard);\r\n }\r\n });\r\n }\r\n\r\n });\r\n }\r\n public saveDashboard(type: DashboardType, name: string): Promise {\r\n return new Promise(resolve => {\r\n const doProcessError = (ex: any): void => {\r\n const errorMsg = this.commonService.flattenErrorMessages(ex);\r\n this.logService.error(errorMsg);\r\n this.modalService.error(`Error during saving dashboard '${name}'. Error: ${errorMsg}`, 'Error');\r\n resolve(false);\r\n };\r\n let dashboard = new Dashboard(Guid.newGuid().toString(), this.authService.user.id, type, name, this.dashboardDatabits)\r\n this.logService.debug(`Saving dashboard ${name}...`);\r\n this.dashboardService.saveUserDashboards(dashboard).subscribe({\r\n next: response => {\r\n if (response.success === true) {\r\n this.logService.debug(`Dashboard ${name} saved successfully.`);\r\n resolve(true);\r\n } else {\r\n doProcessError(response.message)\r\n }\r\n },\r\n error: ex => {\r\n doProcessError(ex)\r\n }\r\n });\r\n });\r\n }\r\n public getPageOrder() {\r\n const moveList = [];\r\n SilverWareArrays.forEach(this.dashboardDatabits, (widget: DatabitConfig) => {\r\n const obj = {\r\n // TODO: get the default name\r\n name: widget.displayName != null ? widget.displayName : widget.databitName,\r\n chartType: SilverWareIcons.chartsIcon(AvailableChartType[widget.chartType]),\r\n deleteToggle: false,\r\n databitName: widget.databitName,\r\n id: widget.id\r\n };\r\n moveList.push(obj);\r\n });\r\n return moveList;\r\n }\r\n\r\n public addToHeartBeat(chart: DatabitConfig) {\r\n this.logService.debug('Add to Heartbeat');\r\n // TODO: Should we keep the data and if they navigate to heartbeat don't send request?\r\n const heartBeat = this.dashboardService.getSavedDashboardsByType(DashboardType.Heartbeat);\r\n if (heartBeat.length > 1) {\r\n this.logService.error('We found more than one Heartbeat record for this user!');\r\n }\r\n if (heartBeat.length == 0) {\r\n this.logService.error('We could not find any Heartbeat record for this user!');\r\n // TODO: is it possible that user doesn't have heart beat record?\r\n }\r\n if (heartBeat.length > 0) {\r\n //this.loadingOverLay = true;\r\n this.dashboardService.getUserDashboard(heartBeat[0].id, false).subscribe((response: any) => {\r\n if (response.dashboard != null && response.dashboard != undefined) {\r\n const heartbeatDashboard = response.dashboard;\r\n chart.objectState = ObjectState.None;\r\n if (heartbeatDashboard.databits == null || heartbeatDashboard.databits == undefined) {\r\n this.logService.debug('the widgets array is empty make new one');\r\n heartbeatDashboard.databits = new Array();\r\n } else {\r\n\r\n // TODO: we need to check for the store id and chain ID of they are the same override it\r\n const savedWidgetIndex = SilverWareArrays.indexOf(heartbeatDashboard.databits, (widget: DatabitConfig) =>\r\n widget.databitName === chart.databitName && widget.storeID === chart.storeID && widget.chainID === chart.chainID);\r\n\r\n if (savedWidgetIndex > -1) {\r\n this.logService.debug('Found the same widget removing the old one');\r\n heartbeatDashboard.databits.splice(savedWidgetIndex, 1);\r\n }\r\n }\r\n heartbeatDashboard.databits.push(chart);\r\n\r\n this.dashboardService.saveUserDashboards(heartbeatDashboard).subscribe({\r\n next: result => {\r\n if (result.success === true) {\r\n this.modalService.info(`${chart.displayName} has been added to Heartbeat page successfully`, 'Success', null, null, 'Done');\r\n } else {\r\n this.logService.error(result.message);\r\n }\r\n //this.loadingOverLay = false;\r\n }, error: ex => {\r\n this.logService.error(this.commonService.flattenErrorMessages(ex));\r\n //this.loadingOverLay = false;\r\n }\r\n });\r\n } else {\r\n this.logService.warn('This dashboard doesnot have saved databits');\r\n //this.loadingOverLay = false;\r\n }\r\n\r\n }, ex => {\r\n this.logService.error(`dashboardConfigsObservable error: ${this.commonService.flattenErrorMessages(ex)}`);\r\n //this.loadingOverLay = false;\r\n });\r\n }\r\n }\r\n public addWidgetToDashboard(widget: DatabitConfig) {\r\n const listDashboards = this.dashboardService.getSavedDashboardsByType(DashboardType.Custom).map(dashboard => ({ name: dashboard.name, value: dashboard.id }));\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const modalObject = {\r\n buttons: [saveBtn],\r\n selectList: listDashboards,\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.list(null, 'Please choose your dashboard', modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData != '') {\r\n const dashboardID = result.inputData;\r\n //this.loadingOverLay = true;\r\n this.dashboardService.getUserDashboard(dashboardID, false).subscribe((response: any) => {\r\n if (response.dashboard != null && response.dashboard != undefined) {\r\n const customDashboard = response.dashboard;\r\n widget.objectState = ObjectState.None;\r\n if (customDashboard.databits == null || customDashboard.databits == undefined) {\r\n this.logService.debug('the widgets array is empty make new one');\r\n customDashboard.databits = new Array();\r\n } else {\r\n //TODO: we need to check for the store id and chain ID of they are the same override it\r\n //const savedWidgetIndex = SilverWareArrays.indexOf(customDashboard.databits, (dashboardWidget: DatabitConfig) => dashboardWidget.databitName === widget.databitName && dashboardWidget.storeID === widget.storeID && dashboardWidget.chainID === widget.chainID);\r\n //if (savedWidgetIndex > -1) {\r\n //console.log('Found the same widget removing the old one');\r\n //customDashboard.databits.splice(savedWidgetIndex, 1);\r\n //}\r\n }\r\n customDashboard.databits.push(widget);\r\n this.dashboardService.saveUserDashboards(customDashboard).subscribe({\r\n next: result => {\r\n if (result.success === true) {\r\n this.modalService.info(`${widget.displayName} has been added to ${customDashboard.name} successfully`, 'Info', null, null, 'OK');\r\n } else {\r\n this.logService.error(result.message);\r\n }\r\n //this.loadingOverLay = false;\r\n },\r\n error: error => {\r\n this.logService.error(this.commonService.flattenErrorMessages(error));\r\n //this.loadingOverLay = false;\r\n }});\r\n } else {\r\n this.logService.info('This dashboard does not have saved databits');\r\n //this.loadingOverLay = false;\r\n }\r\n\r\n }, ex => {\r\n this.logService.error(`dashboardConfigsObservable error: ${this.commonService.flattenErrorMessages(ex)}`);\r\n //this.loadingOverLay = false;\r\n });\r\n }\r\n\r\n });\r\n\r\n }\r\n public loadDataBitsByCategory(dbType: DashboardType, databitparams = null) {\r\n let categories = this.commonService.getCategoryTypeFromDashboard(dbType);\r\n let databits = this.pageService.allAvailableDatabits.filter((db) => categories.indexOf(db.category) > -1);\r\n SilverWareArrays.forEach(databits, (databit: Databit) => {\r\n const dt: DatabitConfig = {\r\n parameterValues: databitparams ? databitparams : new Array(),\r\n chartType: AvailableChartType[databit.chartConfigs.defaultChartType], // TODO: we need the chart type\r\n displayName: databit.displayName,\r\n storeID: this.pageService.storeID,\r\n chainID: this.chainId,\r\n databitName: databit.name,\r\n objectState: ObjectState.None,\r\n chartConfigs: databit.chartConfigs,\r\n id: SilverWareCommon.newGuid(),\r\n seriesOverride: null,\r\n comparisonParameterValues: []\r\n };\r\n this.dashboardDatabits.push(dt);\r\n });\r\n }\r\n\r\n public updateDataBitParamValues(dataBitParams) { }\r\n\r\n public updateDatabits() {\r\n this.chainId = this.pageService.chainID;\r\n this.dashboardService.getUserDashboard(this.dashboardId, false).subscribe((response: any) => {\r\n if (response.dashboard != null && response.dashboard != undefined) {\r\n this.dashboardDatabits = response.dashboard.databits;\r\n } else {\r\n this.logService.info('This dashboard does not have saved databits');\r\n this.dashboardDatabits = null;\r\n }\r\n\r\n // this.setInterval();\r\n }, ex => {\r\n this.logService.error(`dashboardConfigsObservable error: ${this.commonService.flattenErrorMessages(ex)}`);\r\n this.dashboardDatabits = null;\r\n });\r\n\r\n }\r\n\r\n\r\n public addToQueue(item: DatabitConfig) {\r\n const widget = SilverWareArrays.firstOrDefault(this.dashboardDatabits,\r\n (x: DatabitConfig) => x.id === item.id);\r\n if (widget != null) {\r\n if (item.objectState === ObjectState.Modified) {\r\n widget.chartType = item.chartType;\r\n widget.displayName = item.displayName;\r\n widget.parameterValues = item.parameterValues;\r\n widget.storeID = item.storeID;\r\n widget.chartConfigs = item.chartConfigs;\r\n widget.objectState = ObjectState.None; // set the object state to normal\r\n widget.seriesOverride = item.seriesOverride;\r\n widget.comparisonParameterValues = item.comparisonParameterValues;\r\n } else if (item.objectState === ObjectState.Deleted) {\r\n const index = SilverWareArrays.indexOf(this.dashboardDatabits,\r\n (x: DatabitConfig) => x.id === widget.id);\r\n if (index > -1) {\r\n this.dashboardDatabits.splice(index, 1);\r\n //this.dashboardDatabits.splice(index, 1);\r\n } else {\r\n this.logService.error(`Error - we could not find the index to delete!`);\r\n }\r\n this.logService.error(`We Deleted widget form configs! We are saving now...!`);\r\n }\r\n\r\n const currentDashboard: Dashboard = {\r\n id: this.dashboardId,\r\n type: this.dashboardType,\r\n name: this.dashboardName,\r\n userID: this.userId,\r\n databits: this.dashboardDatabits\r\n };\r\n this.pageService.queueChanges.push(currentDashboard);\r\n } else {\r\n this.logService.error('Error - cant find the config');\r\n }\r\n }\r\n public rearrange() {\r\n const widgetsList = this.getPageOrder();\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n const old = this.dashboardDatabits.map(x => Object.assign({}, x));\r\n this.dashboardDatabits = [];\r\n SilverWareArrays.forEach(widgetsList, (w: any) => {\r\n const find = SilverWareArrays.firstOrDefault(old, (databit: DatabitConfig) => { return databit.id === w.id; });\r\n if (find != null) {\r\n this.dashboardDatabits.push(find);\r\n }\r\n });\r\n const currentDashboard: Dashboard = {\r\n id: this.dashboardId,\r\n type: this.dashboardType,\r\n name: this.dashboardName,\r\n userID: this.userId,\r\n databits: this.dashboardDatabits\r\n };\r\n this.pageService.queueChanges.push(currentDashboard);\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const modalObject = {\r\n size: 'modal-lg',\r\n title: 'Custom Filters',\r\n template: DragDropComponent,\r\n buttons: [saveBtn],\r\n override: true,\r\n buttonsContainerStyle: { display: 'flex', justifyContent: 'space-evenly' },\r\n templateInputs: [\r\n { key: 'list', value: widgetsList },\r\n ],\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.show(modalObject);\r\n }\r\n}\r\n","import { IAppSettings } from \"../app/shared/interfaces/iapp-settings\";\r\n\r\nexport const environment = {\r\n production: true,\r\n appSettings: ({\r\n // These will come from window.appSettings inside index.html so we can set them during deployment pipeline\r\n })\r\n};\r\n\r\nexport const groupings = {\r\n defaultGrouping: 5,\r\n minGrouping: 5,\r\n medGrouping: 10\r\n};\r\n\r\nexport const graphProperties = {\r\n chartOthersColor: 'rgba(200,200,200,1)',\r\n clearBackgroundColor: 'rgba(255,255,255,0)',\r\n barDefaultColor: 'rgba(102, 81, 145, 1)',\r\n lineDefaultColor: 'rgba(212, 80, 135, 1)',\r\n pieDefaultColor: 'rgba(47, 75, 124, 1)',\r\n doughnutDefaultColor: 'rgba(255, 166, 0, 1)',\r\n pieChartGraphForegroundColor: 'white',\r\n doughnutChartGraphForegroundColor: 'white',\r\n pieDoughnutColors: [\r\n 'rgba(102, 81, 145, 1)',\r\n 'rgba(255, 166, 0, 1)',\r\n 'rgba(212, 80, 135, 1)',\r\n 'rgba(0, 63, 92, 1)',\r\n 'rgba(249, 93, 106, 1)',\r\n\r\n 'rgba(47, 75, 124, 1)',\r\n 'rgba(255, 124, 67, 1)',\r\n 'rgba(160, 81, 149, 1)',\r\n 'rgba(166,206,227, 1)',\r\n 'rgba(31,120,180, 1)',\r\n\r\n 'rgba(178,223,138, 1)',\r\n 'rgba(51,160,44, 1)',\r\n 'rgba(251,154,153, 1)',\r\n 'rgba(227,26,28, 1)',\r\n 'rgba(253,191,111, 1)',\r\n\r\n 'rgba(255,127,0, 1)',\r\n 'rgba(202,178,214, 1)',\r\n 'rgba(106,61,154, 1)',\r\n 'rgba(255,255,153, 1)',\r\n 'rgba(177,89,40, 1)',\r\n\r\n 'rgba(102, 81, 145, 0.5)',\r\n 'rgba(255, 166, 0, 0.5)',\r\n 'rgba(212, 80, 135, 0.5)',\r\n 'rgba(0, 63, 92, 0.5)',\r\n 'rgba(249, 93, 106, 0.5)',\r\n\r\n 'rgba(47, 75, 124, 0.5)',\r\n 'rgba(255, 124, 67, 0.5)',\r\n 'rgba(160, 81, 149, 0.5)',\r\n 'rgba(166,206,227, 0.5)',\r\n 'rgba(31,120,180, 0.5)'\r\n ]\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { environment } from './../../environments/environment';\r\nimport { groupings } from '../../environments/environment';\r\nimport { IAppSettings } from './interfaces/iapp-settings';\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class AppConfig implements IAppSettings {\r\n\r\n public readonly production: boolean;\r\n\r\n readonly defaultGrouping: number = groupings.defaultGrouping;\r\n readonly minGrouping: number = groupings.minGrouping;\r\n readonly medGrouping: number = groupings.medGrouping;\r\n\r\n readonly applicationUrl: string;\r\n readonly myPassUrl: string;\r\n readonly blogUrl: string;\r\n readonly reportingUrl: string;\r\n readonly authCookieName: string;\r\n\r\n constructor() {\r\n if (!environment.production)\r\n console.warn(`Running environment 'DEBUG'`);\r\n\r\n this.production = environment.production;\r\n\r\n let appSettings: IAppSettings = window['appSettings'];\r\n if (appSettings === null || appSettings === undefined) {\r\n appSettings = environment.appSettings;\r\n }\r\n\r\n this.applicationUrl = appSettings.applicationUrl;\r\n this.myPassUrl = appSettings.myPassUrl;\r\n this.myPassUrl = appSettings.myPassUrl;\r\n this.blogUrl = appSettings.blogUrl;\r\n this.reportingUrl = appSettings.reportingUrl;\r\n this.authCookieName = appSettings.authCookieName;\r\n }\r\n\r\n\r\n}\r\n","// This is matching with SilverWare.Logging\r\nexport enum LogType {\r\n Trace = 0,\r\n Debug,\r\n Warn,\r\n Info,\r\n Error,\r\n Fatal\r\n}\r\n","import {ComponentFactoryResolver, Injectable, Input} from '@angular/core';\r\nimport {SilverWareCommon} from './SilverWareCommon';\r\nimport {SilverWareArrays} from './SilverWareArrays';\r\nimport {generateTypeCheckBlock} from '@angular/compiler-cli/src/ngtsc/typecheck/src/type_check_block';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport * as _ from 'lodash';\r\n\r\ndeclare var $: any;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ModalService {\r\n // *************** Instructions ********************\r\n // This modal service is using modal-dialog component\r\n // We can call this modal in different ways\r\n // 1. show (options: object, dismissCallback: any = null, callBack: (result: object) => void = null): void\r\n // options is an object which is looking for certain parameters\r\n // options= {\r\n // size: string - \"modal-sm\" or \"modal-lg\" or \"modal-xl\" or don't include to use the default or any class that u will adjust the modal size\r\n // style: {} - will get an object with javascript css styles similar to [ngStyle]\r\n // css : string - modal-dialog css classes\r\n // title: string - will hold the modal title, however if it's empty will hide the title section\r\n // hideTitle: boolean - will allows to hide or show the title\r\n // text: string - will render a text in the modal\r\n // template: component - will display the passed component or template (we need to make sure in app.module.ts add that component as an entryComponents)\r\n // templateInputs: [{key: 'component Input parameter name', value: Input parameter value}] - since we are rendering the component dynamically we need to pass the inputs parameters\r\n // buttons: [{class: string , style: {}, click: function , label: string, isDismiss: true}] - will hold custom buttons data\r\n // buttonsContainerStyle : {} - will get an object with javascript css styles similar to [ngStyle]\r\n // buttonsContainerClass: string - button container css classes\r\n // hideCancel: boolean - can hide or show cancel button\r\n // cancelStyle: {} - css styles for cancel button - javascript css styles similar to [ngStyle]\r\n // cancelClass: string - css class for cancel button\r\n // backdrop: boolean - Includes a modal-backdrop element. Alternatively, specify static for a backdrop which doesn't close the modal on click.\r\n // keyboard: boolean - Closes the modal when escape key is pressed\r\n // focus: boolean - Puts the focus on the modal when initialized.\r\n // cancelText: string - cancel button text\r\n // override: boolean - if we want completely use our own template and don't see bootstrap modal design set to true\r\n // }\r\n // dismissCallback: function - expects a dismiss function which will be executed when modal dismisses\r\n //\r\n // Some of the calls are not completed yet\r\n // 2. this.modalService.success(message: string, title: string)\r\n // message: string - will hold modal body message\r\n // title: String - modal title\r\n // 3. this.modalService.info(message: string, title: string, dismissCallback: any = null)\r\n // 4. this.modalService.warning(message: string, title: string, dismissCallback: any = null)\r\n // 5. this.modalService.inputs(message: string, title: string, options: object, dismissCallback: any = null, callBack: (result: object) => void = null)\r\n // message: string - modal body message\r\n // title: string - modal title\r\n // options: object - input details. It will look for these properties {\r\n // inputType: string - the actual HTML input field type ex: text, password, ...\r\n // inputLabel: string - the input field label text\r\n // isMultiLine: boolean = false - if true it will show text area\r\n // isReadOnly: boolean = false - if true make the input field or text area read only\r\n // inputMaxlength: number = 100 - the maximum character for input or text area\r\n // inputData: any - the binding variable to the input field or text area\r\n // }\r\n // 6. this.modalService.confirm(message: string, title: string, dismissCallback: any = null, yesCallback: any = null)\r\n // 7. this.modalService.error(message: string, title: string, dismissCallback: any = null)\r\n //\r\n // Modal service has call back function which will get called when modal is closing and it will return appropriate data based on modal type\r\n\r\n\r\n private modalID: string;\r\n private modalSize: string;\r\n private modalHeight = 0;\r\n private modalStyle = {};\r\n private modalClass: string;\r\n private modalTitle: string;\r\n private modalBody: string;\r\n private modalTemplate: any;\r\n private templateData: [];\r\n private modalButtons = [];\r\n private modalListButtons = [];\r\n private modalButtonHolderStyle = {};\r\n private modalButtonHolderClass: string;\r\n private modalOptions = {\r\n backdrop: true,\r\n focus: true,\r\n keyboard: true\r\n };\r\n private hideCancel = false;\r\n private hideTitle = false;\r\n private override = false;\r\n private cancelText = 'Cancel';\r\n private cancelStyle = {};\r\n private cancelClass: string;\r\n private modalType: modalType;\r\n private inputType: string;\r\n private isMultiLine = false;\r\n private isReadOnly = false;\r\n private inputMaxlength = 100;\r\n private inputLabel = null;\r\n private inputErrorText: string;\r\n private isMultiSelect = false;\r\n private selectList = [];\r\n private selectMainList = [];\r\n private dismiss: any;\r\n public inputData: any;\r\n public callback: any;\r\n public searchText = null;\r\n public showSearch = false;\r\n private chartData = {\r\n type: null,\r\n labels: [],\r\n data: [],\r\n xLabel: null,\r\n yLabel: null,\r\n showLegend: true,\r\n formatInfo: null,\r\n databitHTML: null,\r\n widgetId: null,\r\n isTimeSeriesOrTextData: null\r\n }\r\n private chartProps = {\r\n chartTitle: null,\r\n chartSubtitle: null,\r\n chartDateFilter: null\r\n }\r\n\r\n private chartProps$: BehaviorSubject = new BehaviorSubject(null);\r\n\r\n private chartData$: BehaviorSubject = new BehaviorSubject(null);\r\n constructor(private componentFactoryResolver: ComponentFactoryResolver) {\r\n this.modalID = 'defaultModal';\r\n this.modalSize = '';\r\n }\r\n\r\n public show = (options: object, dismissCallback: () => void = null, callBack: (result: object) => void = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.custom;\r\n if (SilverWareCommon.isNotNullEmptyUndefined(options)) {\r\n this.fillModalGeneral(options);\r\n this.fillModalTemplate(options);\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n }\r\n public success = (message: string, title: string, dismissCallback: () => void = null, callBack: (result: object) => void = null, options: object = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.success;\r\n this.fillModalGeneral(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = 'Cancel';\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n public info = (message: string, title: string, dismissCallback: () => void = null, callBack: (result: object) => void = null, cancelText = 'Cancel', options: object = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.info;\r\n this.fillModalGeneral(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = cancelText;\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n public warning = (message: string, title: string, dismissCallback: () => void = null, callBack: (result: object) => void = null, options: object = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.warning;\r\n this.fillModalGeneral(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = 'Cancel';\r\n this.showModal(dismissCallback, null);\r\n }\r\n public input = (message: string, title: string, options: object, dismissCallback: () => void = null, cancelText: string = 'Cancel', callBack: (result: object) => void = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.inputs;\r\n this.fillModalGeneral(options);\r\n this.fillModalInput(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = cancelText;\r\n // this.inputErrorText =\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n\r\n public selectInputList = (message: string, title: string, options: object, dismissCallback: () => void = null, cancelText: string = 'Cancel', callBack: (result: object) => void = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.selectInputList;\r\n this.fillModalGeneral(options);\r\n this.fillModalInputList(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = cancelText;\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n\r\n public list = (message: string, title: string, options: object, dismissCallback: () => void = null, cancelText: string = 'Cancel', callBack: (result: object) => void = null): void => {\r\n var self = this;\r\n\r\n // Show the modal empty to we scroll to the top and then destroy to show list\r\n self.destroy();\r\n self.showModal();\r\n var millisecondsToWait = 1;\r\n setTimeout(function () {\r\n self.destroy();\r\n self.modalType = modalType.list;\r\n self.fillModalGeneral(options);\r\n self.fillModalInputList(options);\r\n self.modalTitle = title;\r\n self.modalBody = message;\r\n self.cancelText = cancelText;\r\n self.showModal(dismissCallback, callBack);\r\n }, millisecondsToWait);\r\n }\r\n\r\n public listButton = (message: string, title: string, buttonList: any[], options: object, dismissCallback: () => void = null, cancelText: string = 'Cancel', callBack: (result: object) => void = null): void => {\r\n this.destroy();\r\n this.modalListButtons = buttonList;\r\n this.modalType = modalType.button;\r\n this.fillModalGeneral(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = cancelText;\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n\r\n public listButtonV2 = (message: string, title: string, buttonList: any[], options: object, dismissCallback: () => void = null, cancelText: string = 'Cancel', callBack: (result: object) => void = null): void => {\r\n this.destroy();\r\n this.modalListButtons = buttonList;\r\n this.modalType = modalType.buttonV2;\r\n this.fillModalGeneral(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = cancelText;\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n\r\n public confirm = (message: string, title: string, cancelButtonLabel: string = 'Cancel', dismissCallback: () => void = null, yesButtonLabel: string = 'Confirm' , yesCallback: any = null, callBack: (result: object) => void = null, options: object = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.confirm;\r\n this.fillModalGeneral(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n if (yesCallback != null) {\r\n this.modalButtons = [];\r\n const btn = {\r\n label: yesButtonLabel,\r\n click: yesCallback,\r\n class: 'btn-default',\r\n primary: true,\r\n style: {flex: '1'},\r\n isDismiss: true\r\n };\r\n this.modalButtons.push(btn);\r\n }\r\n this.cancelStyle = {flex: 1};\r\n this.cancelText = cancelButtonLabel;\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n public error = (message: string, title: string, dismissCallback: () => void = null, callBack: (result: object) => void = null, options: object = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.error;\r\n this.fillModalGeneral(options);\r\n this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = 'Cancel';\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n\r\n public chart = (message: string, chartProps: object, options: object, dismissCallback: () => void = null, cancelText: string = 'Cancel', callBack: (result: object) => void = null): void => {\r\n this.destroy();\r\n this.modalType = modalType.chart;\r\n this.fillModalGeneral(options);\r\n this.fillModalChart(options);\r\n\r\n this.fillModalChartProperties(chartProps);\r\n\r\n //this.modalTitle = title;\r\n this.modalBody = message;\r\n this.cancelText = cancelText;\r\n this.showModal(dismissCallback, callBack);\r\n }\r\n\r\n public get modalCustomButtons() {\r\n return this.modalButtons;\r\n }\r\n public set modalCustomButtons(buttons: any[]) {\r\n this.modalButtons = buttons;\r\n }\r\n\r\n public set hideDismissBtn(input: boolean) {\r\n this.hideCancel = input;\r\n }\r\n\r\n public btnAction(actionName: string) {\r\n this.inputData = actionName;\r\n this.dismissModal(null, true);\r\n }\r\n\r\n public dismissModal(onClickFunction: any = null, isDismissing: boolean = true, inputValidator: any = null) {\r\n // reset validation error text\r\n this.inputErrorText = null;\r\n if (onClickFunction != null) {\r\n onClickFunction();\r\n }\r\n\r\n if (this.modalType == modalType.list) {\r\n this.searchText = null;\r\n this.filterList();\r\n this.showSearch = false;\r\n }\r\n\r\n if (inputValidator != null) {\r\n const validateResult = inputValidator(this.inputData);\r\n if (validateResult != null) {\r\n this.inputErrorText = validateResult;\r\n return;\r\n }\r\n }\r\n\r\n // this.onDismissCallBack();\r\n if (isDismissing) {\r\n $(`#${this.modalID}`).hide();\r\n $('body').removeClass('modal-open');\r\n }\r\n\r\n this.onCallBack({inputData: this.inputData});\r\n }\r\n\r\n public close() {\r\n if (this.modalType == modalType.list) {\r\n this.searchText = null;\r\n this.filterList();\r\n this.showSearch = false;\r\n }\r\n\r\n\r\n this.onDismissCallBack();\r\n $(`#${this.modalID}`).hide();\r\n $('body').removeClass('modal-open');\r\n this.onCallBack({inputData: null});\r\n }\r\n\r\n public onSelect(item: any) {\r\n this.inputErrorText = null;\r\n if (this.isMultiSelect) {\r\n if (this.inputData == null) {\r\n this.inputData = [];\r\n }\r\n\r\n const itemIndex = SilverWareArrays.indexOf(this.inputData, (option: any) => {\r\n return option == item;\r\n });\r\n if (itemIndex == -1) {\r\n this.inputData.push(item);\r\n } else {\r\n this.inputData.splice(itemIndex, 1);\r\n }\r\n\r\n } else {\r\n this.inputData = item;\r\n }\r\n }\r\n\r\n public isSelectedItem(item: any) {\r\n if (this.isMultiSelect) {\r\n const selected = SilverWareArrays.firstOrDefault(this.inputData, (inp: any) => inp == item);\r\n if (selected != null) {\r\n return true;\r\n }\r\n } else {\r\n if (this.inputData == item) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private showModal(dismissCallback: () => void = null, callBack: (result: object) => void = null) {\r\n\r\n\r\n this.dismiss = dismissCallback;\r\n this.callback = callBack;\r\n $(`#${this.modalID}`).css({display: 'flex'});\r\n $('body').addClass('modal-open');\r\n if (this.modalOptions.backdrop) {\r\n window.onclick = (event) => {\r\n if (event.target == $(`#${this.modalID}`)[0]) {\r\n this.dismissModal();\r\n }\r\n };\r\n }\r\n if (this.modalOptions.keyboard) {\r\n $(document).keyup((e) => {\r\n if (e.key === 'Escape') {\r\n this.dismissModal();\r\n }\r\n });\r\n }\r\n\r\n // $(`#${this.modalID}`).modal({\r\n // show: true,\r\n // backdrop: this.modalOptions.backdrop,\r\n // keyboard: this.modalOptions.keyboard,\r\n // focus: this.modalOptions.focus,\r\n // }).on('hide.bs.modal', (e) => {\r\n // returnData = this.inputData;\r\n // this.dismiss = dismissCallback;\r\n // // this.destroy();\r\n // }).on('hidden.bs.modal', (e) => {\r\n // // if (dismiss != null) {\r\n // // dismiss();\r\n // // }\r\n // this.onDismissCallBack();\r\n // console.log('hidden.bs.modal');\r\n // if ( callBack != null && !this.isCancelClicked) {\r\n // // if (this.type === modalType.inputs) {\r\n // // callBack({inputData: this.inputData});\r\n // // } else if (this.type === modalType.selectInputList || this.type === modalType.list) {\r\n // // callBack({inputData: this.inputData});\r\n // // } else {\r\n // //\r\n // // }\r\n // callBack({inputData: returnData});\r\n // }\r\n // $(`#${this.modalID}`).off('hide.bs.modal');\r\n // $(`#${this.modalID}`).off('hidden.bs.modal');\r\n // this.isOpen = false;\r\n // this.isNew++;\r\n // //this.destroy();\r\n // });\r\n\r\n }\r\n\r\n private destroy() {\r\n const obj = {};\r\n this.fillModalGeneral(obj);\r\n this.fillModalTemplate(obj);\r\n this.fillModalInput(obj);\r\n this.fillModalInputList(obj);\r\n window.onclick = null;\r\n $(document).off('keyup');\r\n }\r\n\r\n private onDismissCallBack() {\r\n if (this.dismiss != null) {\r\n this.dismiss();\r\n }\r\n }\r\n\r\n private onCallBack(result: any) {\r\n if (this.callback != null) {\r\n this.callback(result);\r\n }\r\n }\r\n\r\n\r\n private fillModalGeneral(options: any) {\r\n if (options != null && options.modalID != undefined && options.modalID != null) {\r\n this.modalID = options.modalID;\r\n } else {\r\n this.modalID = 'defaultModal';\r\n }\r\n if (options != null && options.class != undefined && options.class != null) {\r\n this.modalClass = options.class;\r\n } else {\r\n this.modalClass = '';\r\n }\r\n if (options != null && options.size != undefined && options.size != null) {\r\n this.modalSize = options.size;\r\n } else {\r\n this.modalSize = '';\r\n }\r\n if (options != null && options.height != undefined && options.height != null) {\r\n this.modalHeight = options.height;\r\n } else {\r\n switch (this.modalType) {\r\n case modalType.info:\r\n this.modalHeight = 300;\r\n break;\r\n case modalType.inputs:\r\n this.modalHeight = 300;\r\n break;\r\n case modalType.error:\r\n this.modalHeight = 300;\r\n break;\r\n case modalType.confirm:\r\n this.modalHeight = 300;\r\n break;\r\n case modalType.success:\r\n this.modalHeight = 500;\r\n break;\r\n case modalType.warning:\r\n this.modalHeight = 300;\r\n break;\r\n default:\r\n this.modalHeight = 0;\r\n break;\r\n }\r\n\r\n }\r\n if (options != null && options.style != undefined && options.style != null) {\r\n this.modalStyle = options.style;\r\n } else {\r\n this.modalStyle = {};\r\n }\r\n if (options != null && options.title != undefined && options.title != null) {\r\n this.modalTitle = options.title;\r\n } else {\r\n this.modalTitle = null;\r\n }\r\n if (options != null && options.hideTitle != undefined && options.hideTitle != null) {\r\n this.hideTitle = options.hideTitle;\r\n } else {\r\n this.hideTitle = false;\r\n }\r\n if (options != null && options.text != undefined && options.text != null) {\r\n this.modalBody = options.text;\r\n } else {\r\n this.modalBody = null;\r\n }\r\n if (options != null && options.buttons != undefined && options.buttons != null) {\r\n this.modalButtons = options.buttons;\r\n } else {\r\n this.modalButtons = [];\r\n }\r\n if (options != null && options.buttonsContainerStyle != undefined && options.buttonsContainerStyle != null) {\r\n this.modalButtonHolderStyle = options.buttonsContainerStyle;\r\n } else {\r\n this.modalButtonHolderStyle = {};\r\n }\r\n if (options != null && options.buttonsContainerClass != undefined && options.buttonsContainerClass != null) {\r\n this.modalButtonHolderClass = options.buttonsContainerClass;\r\n } else {\r\n this.modalButtonHolderClass = null;\r\n }\r\n if (options != null && options.hideCancel != undefined && options.hideCancel != null) {\r\n this.hideCancel = options.hideCancel;\r\n } else {\r\n this.hideCancel = false;\r\n }\r\n if (options != null && options.cancelStyle != undefined && options.cancelStyle != null) {\r\n this.cancelStyle = options.cancelStyle;\r\n } else {\r\n this.cancelStyle = {};\r\n }\r\n if (options != null && options.cancelClass != undefined && options.cancelClass != null) {\r\n this.cancelClass = options.cancelClass;\r\n } else {\r\n this.cancelClass = null;\r\n }\r\n if (options != null && options.backdrop != undefined && options.backdrop != null) {\r\n this.modalOptions.backdrop = options.backdrop;\r\n } else {\r\n this.modalOptions.backdrop = true;\r\n }\r\n if (options != null && options.focus != undefined && options.focus != null) {\r\n this.modalOptions.focus = options.focus;\r\n } else {\r\n this.modalOptions.focus = true;\r\n }\r\n if (options != null && options.keyboard != undefined && options.keyboard != null) {\r\n this.modalOptions.keyboard = options.keyboard;\r\n } else {\r\n this.modalOptions.keyboard = true;\r\n }\r\n if (options != null && options.cancelText != undefined && options.cancelText != null) {\r\n this.cancelText = options.cancelText;\r\n } else {\r\n this.cancelText = 'Cancel';\r\n }\r\n if (options != null && options.override != undefined && options.override != null) {\r\n this.override = options.override;\r\n } else {\r\n this.override = false;\r\n }\r\n\r\n }\r\n private fillModalTemplate(options: any) {\r\n if (options.template != undefined) {\r\n this.modalTemplate = options.template;\r\n } else {\r\n this.modalTemplate = null;\r\n }\r\n if (options.templateInputs != undefined) {\r\n this.templateData = options.templateInputs;\r\n } else {\r\n this.templateData = [];\r\n }\r\n }\r\n private fillModalInput(options: any) {\r\n\r\n if (options.inputType != undefined) {\r\n this.inputType = options.inputType;\r\n } else {\r\n this.inputType = null;\r\n }\r\n if (options.inputLabel != undefined) {\r\n this.inputLabel = options.inputLabel;\r\n } else {\r\n this.inputLabel = null;\r\n }\r\n if (options.isMultiLine != undefined) {\r\n this.isMultiLine = options.isMultiLine;\r\n } else {\r\n this.isMultiLine = false;\r\n }\r\n if (options.isReadOnly != undefined) {\r\n this.isReadOnly = options.isReadOnly;\r\n } else {\r\n this.isReadOnly = false;\r\n }\r\n if (options.inputMaxlength != undefined) {\r\n this.inputMaxlength = options.inputMaxlength;\r\n } else {\r\n this.inputMaxlength = 100;\r\n }\r\n if (options.inputData != undefined) {\r\n this.inputData = options.inputData;\r\n } else {\r\n this.inputData = null;\r\n }\r\n }\r\n private fillModalInputList(options: any) {\r\n\r\n if (options.inputLabel != undefined) {\r\n this.inputLabel = options.inputLabel;\r\n } else {\r\n this.inputLabel = null;\r\n }\r\n if (options.isMultiSelect != undefined) {\r\n this.isMultiSelect = options.isMultiSelect;\r\n } else {\r\n this.isMultiSelect = false;\r\n }\r\n if (options.isReadOnly != undefined) {\r\n this.isReadOnly = options.isReadOnly;\r\n } else {\r\n this.isReadOnly = false;\r\n }\r\n if (options.inputData != undefined) {\r\n this.inputData = options.inputData;\r\n } else {\r\n if (this.isMultiSelect) {\r\n this.inputData = [];\r\n } else {\r\n this.inputData = null;\r\n }\r\n }\r\n if (options.selectList != undefined) {\r\n this.selectList = options.selectList;\r\n this.selectMainList = options.selectList;\r\n } else {\r\n this.selectList = [];\r\n this.selectMainList = [];\r\n }\r\n }\r\n private fillModalChart(options: any) {\r\n if (options.chartType != undefined) {\r\n this.chartData.type = options.chartType;\r\n } else {\r\n this.chartData.type = null;\r\n }\r\n if (options.labels != undefined) {\r\n this.chartData.labels = options.labels;\r\n } else {\r\n this.chartData.labels = [];\r\n }\r\n if (options.data != undefined) {\r\n this.chartData.data = options.data;\r\n } else {\r\n this.chartData.data = [];\r\n }\r\n if (options.xLabel != undefined) {\r\n this.chartData.xLabel = options.xLabel;\r\n } else {\r\n this.chartData.xLabel = null;\r\n }\r\n if (options.yLabel != undefined) {\r\n this.chartData.yLabel = options.yLabel;\r\n } else {\r\n this.chartData.yLabel = null;\r\n }\r\n if (options.showLegend != undefined) {\r\n this.chartData.showLegend = options.showLegend;\r\n } else {\r\n this.chartData.showLegend = true;\r\n }\r\n if (options.formatInfo != undefined) {\r\n this.chartData.formatInfo = options.formatInfo;\r\n } else {\r\n this.chartData.formatInfo = null;\r\n }\r\n if (options.databitHTML != undefined) {\r\n this.chartData.databitHTML = options.databitHTML;\r\n } else {\r\n this.chartData.databitHTML = null;\r\n }\r\n if (options.widgetId != undefined) {\r\n this.chartData.widgetId = 'fullScreen ' + options.widgetId;\r\n } else {\r\n this.chartData.widgetId = null;\r\n }\r\n if (options.isTimeSeriesOrTextData != undefined) {\r\n this.chartData.isTimeSeriesOrTextData = options.isTimeSeriesOrTextData;\r\n } else {\r\n this.chartData.isTimeSeriesOrTextData = null;\r\n }\r\n\r\n this.chartData$.next(_.cloneDeep(this.chartData));\r\n }\r\n\r\n private fillModalChartProperties(props: any) {\r\n\r\n if (props.chartTitle != undefined) {\r\n this.chartProps.chartTitle = props.chartTitle;\r\n } else {\r\n this.chartProps.chartTitle = null;\r\n }\r\n if (props.chartSubtitle != undefined) {\r\n this.chartProps.chartSubtitle = props.chartSubtitle;\r\n } else {\r\n this.chartProps.chartSubtitle = [];\r\n }\r\n if (props.chartDateFilter != undefined) {\r\n this.chartProps.chartDateFilter = props.chartDateFilter;\r\n } else {\r\n this.chartProps.chartDateFilter = [];\r\n }\r\n\r\n this.chartProps$.next(_.cloneDeep(this.chartProps));\r\n }\r\n\r\n\r\n get id() {\r\n return this.modalID;\r\n }\r\n get size() {\r\n return this.modalSize;\r\n }\r\n get height() {\r\n return this.modalHeight;\r\n }\r\n\r\n get dialogClass() {\r\n return this.modalClass;\r\n }\r\n get isTitleHidden() {\r\n return this.hideTitle;\r\n }\r\n get isCancelButtonHidden() {\r\n return this.hideCancel;\r\n }\r\n get style() {\r\n return this.modalStyle;\r\n }\r\n get title() {\r\n return this.modalTitle;\r\n }\r\n get text() {\r\n return this.modalBody;\r\n }\r\n get template() {\r\n return this.modalTemplate;\r\n }\r\n get data() {\r\n return this.templateData;\r\n }\r\n get buttons() {\r\n return this.modalButtons;\r\n }\r\n get buttonsHolderClass() {\r\n return this.modalButtonHolderClass;\r\n }\r\n get buttonsHolderStyles() {\r\n return this.modalButtonHolderStyle;\r\n }\r\n get cancelLabel() {\r\n return this.cancelText;\r\n }\r\n get cancelStyles() {\r\n return this.cancelStyle;\r\n }\r\n get cancelClasses() {\r\n return this.cancelClass;\r\n }\r\n get type() {\r\n return this.modalType;\r\n }\r\n get overrideModal() {\r\n return this.override;\r\n }\r\n get inputFieldType() {\r\n return this.inputType;\r\n }\r\n get inputValidationError() {\r\n return this.inputErrorText;\r\n }\r\n get isInputMultiline() {\r\n return this.isMultiLine;\r\n }\r\n get isInputReadOnly() {\r\n return this.isReadOnly;\r\n }\r\n get inputFieldMaxlength() {\r\n return this.inputMaxlength;\r\n }\r\n get inputFieldLabel() {\r\n return this.inputLabel;\r\n }\r\n get modalTypeEnum() {\r\n return modalType;\r\n }\r\n get isMultiSelectList() {\r\n return this.isMultiSelect;\r\n }\r\n get itemList() {\r\n return this.selectList;\r\n }\r\n get options() {\r\n return this.modalOptions;\r\n }\r\n get buttonList() {\r\n return this.modalListButtons;\r\n }\r\n get chartInfo() {\r\n return this.chartData;\r\n }\r\n\r\n get chartInfo$() {\r\n return this.chartData$.asObservable();\r\n }\r\n\r\n get chartProperties$() {\r\n return this.chartProps$.asObservable();\r\n }\r\n\r\n public filterList() {\r\n if (this.searchText != null && this.searchText.trim() != '') {\r\n const result = SilverWareArrays.where(this.selectMainList, (item: any) => {\r\n return item.name.toLowerCase().indexOf(this.searchText.toLowerCase()) > -1;\r\n });\r\n this.selectList = result;\r\n } else {\r\n this.selectList = this.selectMainList;\r\n }\r\n\r\n }\r\n public showHideSearchBar() {\r\n\r\n if (this.type == this.modalTypeEnum.list) {\r\n this.showSearch = !this.showSearch;\r\n if (!this.showSearch) {\r\n this.searchText = null;\r\n this.filterList();\r\n }\r\n }\r\n }\r\n}\r\nenum modalType {\r\n custom = 0,\r\n success = 1,\r\n info = 2,\r\n warning = 3,\r\n inputs = 4,\r\n confirm = 5,\r\n list = 6,\r\n selectInputList = 7,\r\n error = 8,\r\n button = 9,\r\n chart = 10,\r\n buttonV2 = 11\r\n}\r\n\r\n","import {LogType} from \"../enums/log-type\";\r\nimport {SilverWareCommon} from \"../services/SilverWareCommon\";\r\n\r\nexport class Log {\r\n private readonly Date: Date;\r\n private readonly ID: string;\r\n private readonly Level: LogType;\r\n private readonly ParentLogID: string;\r\n\r\n private Stack: any;\r\n private Message: string;\r\n\r\n constructor(level: LogType, id: string = null, parentLogID: string = null, date: Date = null) {\r\n\r\n if (date === null || date === undefined)\r\n this.Date = new Date();\r\n else\r\n this.Date = date;\r\n\r\n\r\n this.Level = level;\r\n this.ID = SilverWareCommon.newGuid().toString();\r\n if (id !== null && id !== undefined && id.trim() !== '')\r\n this.ID = id;\r\n\r\n this.ParentLogID = null;\r\n if (parentLogID !== null && parentLogID !== undefined && parentLogID.trim() !== '')\r\n this.ParentLogID = id;\r\n\r\n this.Stack = null;\r\n this.Message = null;\r\n }\r\n\r\n get id(): string {\r\n return this.ID;\r\n }\r\n get parentLogID(): string {\r\n return this.ParentLogID;\r\n }\r\n get date(): Date {\r\n return this.Date;\r\n }\r\n get level(): LogType {\r\n return this.Level;\r\n }\r\n get stack(): any {\r\n return this.Stack;\r\n }\r\n set stack(stack: any) {\r\n this.Stack = stack;\r\n }\r\n get message(): string {\r\n return this.Message;\r\n }\r\n set message(message: string) {\r\n this.Message = message;\r\n }\r\n\r\n get logLevelName(): string {\r\n switch (this.level) {\r\n case LogType.Debug:\r\n return 'Debug';\r\n case LogType.Error:\r\n return 'Error';\r\n case LogType.Fatal:\r\n return 'Fatal';\r\n case LogType.Info:\r\n return 'Info';\r\n case LogType.Trace:\r\n return 'Trace';\r\n case LogType.Warn:\r\n return 'Warn';\r\n }\r\n }\r\n\r\n get prepareForServer(): Log {\r\n const tmpLog = new Log(this.level, this.id, this.parentLogID, this.date);\r\n let message = this.message;\r\n if (this.stack !== null && this.stack !== undefined)\r\n message += ` - Stack: ${this.stack}`;\r\n\r\n tmpLog.message = message;\r\n\r\n return tmpLog;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {Log} from \"../classes/log\";\r\nimport {AppConfig} from \"../app.config\";\r\nimport {CommonService} from \"./common.service\";\r\nimport {LogType} from \"../enums/log-type\";\r\nimport {SilverWareCommon} from \"./SilverWareCommon\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LogService {\r\n private logs: Log[] = [];\r\n // private logsToUpload: Log[] = [];\r\n\r\n constructor(private appConfig: AppConfig, private commonService: CommonService) {}\r\n\r\n private pad(num: number, size: number): string {\r\n const s = \"000000000\" + num;\r\n return s.substring(s.length - size);\r\n };\r\n\r\n public info(message: string): Log {\r\n return this.doLog(LogType.Info, message, null);\r\n };\r\n public warn(message: string): Log {\r\n return this.doLog(LogType.Warn, message, null);\r\n };\r\n public error(message: string, stack = null): Log {\r\n return this.doLog(LogType.Error, message, stack);\r\n };\r\n public debug(message: string): Log {\r\n return this.doLog(LogType.Debug, message, null);\r\n };\r\n\r\n public logApi(url: string, method: string): Log {\r\n const requestID = SilverWareCommon.newGuid().toString();\r\n const message = `HTTP ${method} request ${requestID} to '${url.replace(this.appConfig.applicationUrl, '').replace(this.appConfig.myPassUrl, '')}'`;\r\n return this.doLog(LogType.Debug, message, null);\r\n }\r\n public logDuration(parentLogID: string, message: string = null): void {\r\n const parent = this.logs.find(x => x.id === parentLogID);\r\n if (parent === null || parent === undefined) {\r\n this.doLog(LogType.Debug, message, null);\r\n return;\r\n }\r\n const logger = new Log(parent.level, null, parent.id);\r\n const totalTimeMilliseconds = logger.date.getTime() - parent.date.getTime();\r\n if (message === null)\r\n message = parent.message;\r\n this.doLog(LogType.Debug, `${message} - Took ${totalTimeMilliseconds} ms`, null);\r\n }\r\n\r\n private doLog(level: LogType, message: string, stack: any, logger: Log = null): Log {\r\n const log = logger ? logger : new Log(level);\r\n\r\n log.message = message;\r\n log.stack = stack;\r\n\r\n this.addLog(log);\r\n\r\n try {\r\n let text = `${log.date.getFullYear()}-${this.pad(log.date.getMonth() + 1, 2)}-${this.pad(log.date.getDate(), 2)} ${this.pad(log.date.getHours(), 2)}:${this.pad(log.date.getMinutes(), 2)}:${this.pad(log.date.getSeconds(), 2)}.${this.pad(log.date.getMilliseconds(), 3)} - ${log.logLevelName} - ${log.message}`;\r\n\r\n switch (level) {\r\n case LogType.Info:\r\n console.info(text);\r\n break;\r\n case LogType.Warn:\r\n console.warn(text);\r\n break\r\n case LogType.Error:\r\n case LogType.Fatal:\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(stack)) {\r\n console.error(`${text} - Stack: `, stack);\r\n } else\r\n console.error(text);\r\n break\r\n default:\r\n console.log(text);\r\n break;\r\n }\r\n\r\n } catch (e) {\r\n\r\n }\r\n return log;\r\n };\r\n\r\n private addLog(log: Log): void {\r\n switch (log.level) {\r\n case LogType.Warn:\r\n case LogType.Error:\r\n // TODO: Upload logs\r\n // this.logsToUpload.push(log);\r\n // // Don't upload all the time keep some then upload\r\n // if (this.logsToUpload.length >= 10)\r\n // this.uploadLogs();\r\n\r\n break;\r\n default:\r\n // Flush logs\r\n if (this.logs.length > 200)\r\n this.logs = [];\r\n\r\n this.logs.push(log);\r\n break;\r\n }\r\n };\r\n\r\n private colouredConsole(msg: string, logLevel: LogType, ...args: Object[]): void {\r\n try {\r\n\r\n const flattenArgs: Object[] = [];\r\n\r\n if (args !== null && args !== undefined && args.length !== 0) {\r\n args.forEach(arg => {\r\n if (Array.isArray(arg)) {\r\n arg.forEach(x => {\r\n if (x !== null && x !== undefined)\r\n flattenArgs.push(x);\r\n });\r\n return;\r\n }\r\n if (arg !== null && arg !== undefined)\r\n flattenArgs.push(arg);\r\n });\r\n }\r\n\r\n if ((msg === null || msg === undefined || msg.trim() === '') && flattenArgs.length === 0)\r\n return;\r\n\r\n const logLevelDetails = this.getLogLevelDetails(logLevel);\r\n\r\n\r\n if (!this.appConfig.production) {\r\n const now = new Date();\r\n let text = `${now.getFullYear()}-${this.pad(now.getMonth() + 1, 2)}-${this.pad(now.getDate(), 2)} ${this.pad(now.getHours(), 2)}:${this.pad(now.getMinutes(), 2)}:${this.pad(now.getSeconds(), 2)}.${this.pad(now.getMilliseconds(), 3)} - ${logLevelDetails.logTypeName}`;\r\n if (msg !== undefined && msg !== null && msg.trim() !== '')\r\n text = `${text} - ${msg}${flattenArgs.length > 0 ? ':' : ''} `;\r\n else\r\n text = `${text}${flattenArgs.length > 0 ? ':' : ''} `;\r\n\r\n if (flattenArgs.length > 0) {\r\n console.log(`%c**************************** DEBUG Log - Start **************************** `, `font-weight:bold; color:${logLevelDetails.color};`);\r\n if (logLevel === LogType.Error) {\r\n flattenArgs.forEach(x => {\r\n console.error(text, x);\r\n });\r\n } else {\r\n flattenArgs.forEach(x => {\r\n console.log(text, x);\r\n });\r\n }\r\n console.log(`%c**************************** DEBUG Log - End **************************** `, `font-weight:bold; color:${logLevelDetails.color};`);\r\n }\r\n else\r\n console.log(`%c**** DEBUG Log - ${text} **** `, `font-weight:bold; color:${logLevelDetails.color};`);\r\n\r\n }\r\n } catch (ex) {\r\n console.error(`Failed to console log store state. Error: `, ex);\r\n }\r\n }\r\n\r\n getLogLevelDetails(logLevel: LogType): LoglevelDetails {\r\n const details: LoglevelDetails = {\r\n color: 'white',\r\n logTypeName: 'Debug',\r\n displayName: 'Debug'\r\n };\r\n\r\n switch (logLevel){\r\n case LogType.Debug:\r\n details.color = '#085cf2';\r\n details.logTypeName = 'Debug';\r\n details.displayName = 'Debug';\r\n break;\r\n case LogType.Info:\r\n details.color = 'gray';\r\n details.logTypeName = 'Info';\r\n details.displayName = 'Information';\r\n break;\r\n case LogType.Warn:\r\n details.color = 'yellow';\r\n details.logTypeName = 'Warn';\r\n details.displayName = 'Warning';\r\n break;\r\n case LogType.Error:\r\n details.color = 'red';\r\n details.logTypeName = 'Error';\r\n details.displayName = 'Error';\r\n break;\r\n }\r\n\r\n return details;\r\n }\r\n colouredConsoleDebug(msg: string = null, ...args: Object[]): void {\r\n this.colouredConsole(msg, LogType.Debug, args);\r\n }\r\n\r\n colouredConsoleWarning(msg: string = null, ...args: Object[]): void {\r\n this.colouredConsole(msg, LogType.Warn, args);\r\n }\r\n\r\n colouredConsoleInfo(msg: string = null, ...args: Object[]): void {\r\n this.colouredConsole(msg, LogType.Info, args);\r\n }\r\n\r\n colouredConsoleError(msg: string = null, ...args: Object[]): void {\r\n this.colouredConsole(msg, LogType.Error, args);\r\n }\r\n\r\n get logStorage(): Log[]{\r\n return this.logs;\r\n }\r\n\r\n // TODO: Save UI logs in DB\r\n // uploadLogs(useWorkerService: boolean = true): void {\r\n // if (this.logsToUpload.length === 0)\r\n // return;\r\n //\r\n // const pendingToUploadLogs = this.logsToUpload.map(log => log.prepareForServer);\r\n // this.flushLogs();\r\n // const token = this._authToken.split(' ')[1];\r\n // const url = `${this.cloudDatabaseUrl}/SaveLogs`;\r\n //\r\n // this.colouredConsoleInfo(`Start saving logs for ${url}...`);\r\n //\r\n // const payload = {Logs: pendingToUploadLogs, URL: url, AuthToken: token};\r\n // const useSendBeacon = (): void => {\r\n // const headers = {\r\n // type: 'application/json'\r\n // };\r\n // const blob = new Blob([JSON.stringify({Logs: payload.Logs, AuthToken: payload.AuthToken})], headers);\r\n // const result = navigator.sendBeacon(`${payload.URL}`, blob);\r\n // if (result) {\r\n // this.debug('Logs saved successfully.');\r\n // return;\r\n // } else {\r\n // this.error(`Failed to save logs.`);\r\n // return;\r\n // }\r\n // };\r\n //\r\n // if (!useWorkerService) {\r\n // this.colouredConsoleInfo('Using SendBeacon to save logs.');\r\n // useSendBeacon();\r\n // return;\r\n // }\r\n //\r\n // if (typeof Worker !== 'undefined') {\r\n // this.colouredConsoleInfo('Using Worker to save logs.');\r\n // // Create a new\r\n // const worker = new Worker(new URL('../web-workers/logs-processor.worker.ts', import.meta.url), { type: 'module' });\r\n // worker.onmessage = ({ data }) => {\r\n // this.colouredConsoleInfo('Finished saving logs...');\r\n // if (!data) {\r\n // return;\r\n // }\r\n //\r\n // if (data.Success === true) {\r\n // this.debug('Logs saved successfully.');\r\n // return;\r\n // }\r\n //\r\n // try {\r\n // this.error(`Failed to save logs. EX: ${this.commonService.flattenErrorMessages(data)}`);\r\n // }\r\n // catch (ex) {\r\n // console.error(ex);\r\n // }\r\n // };\r\n // worker.postMessage(payload);\r\n // } else {\r\n // this.warn('Falling back to SendBeacon to save logs.');\r\n // useSendBeacon();\r\n // }\r\n // }\r\n\r\n // private flushLogs(): void {\r\n // // this.logsToUpload = [];\r\n // this.logs = [];\r\n // }\r\n\r\n}\r\ntype LoglevelDetails = {\r\n color: string;\r\n logTypeName: string;\r\n displayName: string;\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Dashboard } from '../interfaces/Dashboard';\r\nimport { DatabitConfig } from '../interfaces/DatabitConfig';\r\nimport { DashboardType } from '../interfaces/DashboardType';\r\nimport {BehaviorSubject, Observable} from 'rxjs';\r\nimport { SilverWareArrays } from './SilverWareArrays';\r\nimport { AppConfig } from '../app.config';\r\nimport {ApplicationResponse} from '../responses/application-response';\r\nimport {GetDashboardsResponse} from '../responses/get-dashboards-response';\r\nimport {LogService} from \"./log.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DashboardService {\r\n private availableDashboards: Array = new Array();\r\n private savedUserDashboards: BehaviorSubject> = new BehaviorSubject>(null);\r\n private heartbeatDashboards: BehaviorSubject> = new BehaviorSubject>(null);\r\n constructor(private http: HttpClient, private appConfig: AppConfig, private logService: LogService) { }\r\n\r\n getUserDashboard(id: string, excludeDatabitConfigs: boolean) {\r\n return this.http.post(this.appConfig.applicationUrl + `/api/Dashboard/${id}`,\r\n { ExcludeDatabitConfigs: excludeDatabitConfigs });\r\n }\r\n\r\n get savedUserDashboards$(): Observable {\r\n return this.savedUserDashboards.asObservable();\r\n }\r\n\r\n get heartbeatDashboard$(): Observable {\r\n return this.heartbeatDashboards.asObservable();\r\n }\r\n getUserDatabitConfigs(userId: string, dashboardType: DashboardType, id: string): Observable {\r\n // get config for current navigated page\r\n return this.http.post>(this.appConfig.applicationUrl + '/api/Dashboard/GetDashboardDatabits',\r\n { headers: new HttpHeaders({ 'Access-Control-Allow-Origin': '*' }), UserId: userId, DashboardType: dashboardType, ID: id });\r\n }\r\n\r\n saveUserDashboards(dashboard: Dashboard): Observable> {\r\n // Saving Here\r\n let db = this.getSavedDashboard(dashboard.type, dashboard.id);\r\n if (db !== null) {\r\n db.databits = dashboard.databits;\r\n }\r\n else {\r\n this.availableDashboards.push(dashboard);\r\n this.savedUserDashboards.next(this.availableDashboards);\r\n }\r\n return this.http.post>(this.appConfig.applicationUrl + `/api/Dashboard/${dashboard.id}/Save`, { Dashboard: dashboard });\r\n }\r\n\r\n deleteUserDashboard(dashboard: Dashboard): Observable> {\r\n // Saving Here\r\n return this.http.post>(this.appConfig.applicationUrl + `/api/Dashboard/${dashboard.id}/Delete`, { Dashboard: dashboard });\r\n }\r\n\r\n getUserDashboards(userId: string, dashboardType: DashboardType, excludeDatabitConfigs: boolean): Observable {\r\n return this.http.post(this.appConfig.applicationUrl + '/api/Dashboards',\r\n { UserId: userId, DashboardType: dashboardType, ExcludeDatabitConfigs: excludeDatabitConfigs });\r\n }\r\n\r\n // store saved dashboards in memory\r\n public set savedDashboards(dashboards: Array) {\r\n this.availableDashboards = dashboards;\r\n this.savedUserDashboards.next(this.availableDashboards);\r\n }\r\n public get savedDashboards(): Dashboard[] {\r\n return this.availableDashboards;\r\n }\r\n public getSavedDashboardsByType(dashboardType: DashboardType): Dashboard[] {\r\n const dashboards = SilverWareArrays.where(this.availableDashboards, (dashboard: Dashboard) => {\r\n return dashboard.type == dashboardType;\r\n });\r\n return dashboards;\r\n }\r\n\r\n public getSavedDashboard(dashboardType: DashboardType, id: string = null): Dashboard {\r\n let dashboard: Dashboard = null;\r\n if (id != null) {\r\n dashboard = SilverWareArrays.firstOrDefault(this.availableDashboards,(dashboard: Dashboard) => dashboard.id == id && dashboard.type == dashboardType);\r\n } else {\r\n dashboard = SilverWareArrays.firstOrDefault(this.availableDashboards, (dashboard: Dashboard) => dashboard.type == dashboardType);\r\n }\r\n if (dashboard == null) {\r\n this.logService.warn(`${dashboardType} did not exists in users dashboard list`);\r\n }\r\n return dashboard;\r\n }\r\n\r\n}\r\n","import {Injectable} from '@angular/core';\r\nimport {HttpClient, HttpHeaders} from '@angular/common/http';\r\nimport {Databit} from '../interfaces/Databit';\r\nimport {DatabitParameter} from '../interfaces/DatabitParameter';\r\nimport { DatabitParameterValue } from '../interfaces/DatabitParameterValue';\r\nimport {SilverWareArrays} from './SilverWareArrays';\r\nimport forEach = SilverWareArrays.forEach;\r\nimport { environment } from '../../../environments/environment';\r\nimport { ComparisonParameterValue } from '../../shared/interfaces/ComparisonParameterValue';\r\nimport { AppConfig } from '../app.config';\r\nimport {Observable} from 'rxjs';\r\nimport {GetDatabitParameterValuesResponse} from '../responses/get-databit-parameter-values-response';\r\nimport {RunDatabitResponse} from '../responses/run-databit-response';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DatabitService {\r\n constructor(private http: HttpClient, private appConfig: AppConfig) {\r\n }\r\n\r\n getDatabitsInfo(): Observable {\r\n return this.http.get>(this.appConfig.applicationUrl + '/api/Databits',\r\n {headers: new HttpHeaders({'Access-Control-Allow-Origin': '*'})});\r\n }\r\n\r\n getDatabitParameterValues(databitName: string, parameterName: string, storeID: string): Observable {\r\n return this.http.post(this.appConfig.applicationUrl + `/api/Databits/${databitName}/Parameters/${parameterName}/Values/${storeID}`, {});\r\n\r\n }\r\n\r\n runDatabit(databitName: string, chainId: string, storeId: string, parameters: Array, forceRun: boolean = false, compareParameters: Array = []): Observable {\r\n const path = `${databitName}/Run/${storeId}`;\r\n const url = `${this.appConfig.applicationUrl}/api/Databits/${path}`;\r\n return this.http.post(url,\r\n { Parameters: parameters, ForceRun: forceRun, ComparisonParameters: compareParameters});\r\n }\r\n\r\n // \"\"\r\n\r\n}\r\n","import {Injectable} from '@angular/core';\r\nimport {DashboardType} from '../interfaces/DashboardType';\r\nimport {Router} from '@angular/router';\r\nimport {CommonService} from \"./common.service\";\r\nimport {LogService} from \"./log.service\";\r\n\r\nexport const SideBarDefaultOpen = true;\r\nexport const SideBarDefaultTab = 'HeartBeat';\r\nexport const SideBarDashBoardOpen = true;\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavigationService {\r\n private width = 0;\r\n private height = \"100%\";\r\n isMobileView = false;\r\n isSideBarExpanded = SideBarDefaultOpen;\r\n isSideBarDashboardExpanded = SideBarDashBoardOpen;\r\n SideBarCurrentTab = SideBarDefaultTab;\r\n currentPage = '';\r\n dashboardType = DashboardType.Any;\r\n dashboardId = '';\r\n chainId: string;\r\n constructor(private router: Router, private commonService: CommonService, private logService: LogService) {\r\n }\r\n\r\n updateScreenWidth(newWidth: number): void {\r\n\r\n if (newWidth < 768) {\r\n this.isMobileView = true;\r\n if (this.currentPage == 'UserProfile') {\r\n this.router.navigate([`/${this.chainId}`]);\r\n }\r\n } else if (newWidth >= 768) {\r\n this.isMobileView = false;\r\n }\r\n this.width = newWidth;\r\n }\r\n\r\n // Set the height to 100% after a short delay to fix white bar caused by safari web tools\r\n updateScreenHeight(): void {\r\n setTimeout((): void => {\r\n document.documentElement.style.height = '100%';\r\n setTimeout(() => {\r\n // this line prevents the content\r\n // from hiding behind the address bar\r\n window.scrollTo(0, 1);\r\n }, 500);\r\n }, 500);\r\n }\r\n\r\n updateCurrentPage(currentPage: string, dashboardType: DashboardType, dashboardId: string): void {\r\n this.currentPage = currentPage;\r\n this.dashboardType = dashboardType;\r\n this.dashboardId = dashboardId;\r\n if (this.dashboardType === DashboardType.Custom) {\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(dashboardId))\r\n this.currentPage = `${currentPage}-${dashboardId}`;\r\n else\r\n this.logService.error(`Custom dashboard does not have an ID`);\r\n } else\r\n this.dashboardId = null; // We don't store Dashboard IDs for non custom dashboards\r\n\r\n }\r\n\r\n updateURL(chainID: string): void {\r\n this.chainId = chainID;\r\n if (this.dashboardType == DashboardType.Custom) {\r\n this.router.navigateByUrl(`/${chainID}/Dashboard/${this.dashboardId}`, { state: { dashboardType: this.dashboardType } });\r\n }\r\n else {\r\n this.router.navigateByUrl(`${this.chainId}/${this.currentPage}`, { state: { dashboardType: this.dashboardType } });\r\n }\r\n\r\n }\r\n // getDashboardsByType(dashboardType: DashboardType) {\r\n // console.log(this.availableDashboards);\r\n // const dashboards = SilverWareArrays.where(this.availableDashboards, (dashboard: Dashboard) => {\r\n // return dashboard.type == dashboardType;\r\n // });\r\n // if (dashboards.length == 0 ) {\r\n // console.log(`${dashboardType} did not exists in users dashboard list`);\r\n // }\r\n // return dashboards;\r\n // }\r\n //\r\n // getDashboard(dashboardType: DashboardType, id: string = null) {\r\n // let dashboard = null;\r\n // if (id != null) {\r\n // dashboard = SilverWareArrays.firstOrDefault(this.availableDashboards,\r\n // (dashboard: Dashboard) => dashboard.id == id && dashboard.type == dashboardType);\r\n // } else {\r\n // dashboard = SilverWareArrays.firstOrDefault(this.availableDashboards, (dashboard: Dashboard) => dashboard.type == dashboardType);\r\n // }\r\n // if (dashboard == null ) {\r\n // console.log(`${dashboardType} did not exists in users dashboard list`);\r\n // }\r\n // return dashboard;\r\n // }\r\n\r\n get DashboardType() {\r\n return DashboardType;\r\n }\r\n}\r\n","import {Injectable} from '@angular/core';\r\nimport {SilverWareArrays} from './SilverWareArrays';\r\nimport {ModalService} from './modal.service';\r\nimport {DatabitParameterValue} from '../interfaces/DatabitParameterValue';\r\nimport {Guid} from '../generate-guid.component';\r\nimport {DatabitService} from './databit.service';\r\nimport {ObjectState} from '../interfaces/ObjectState';\r\nimport {DatabitConfig} from '../interfaces/DatabitConfig';\r\nimport {DashboardService} from './dashboard.service';\r\nimport {DashboardType} from '../interfaces/DashboardType';\r\nimport {Dashboard} from '../interfaces/Dashboard';\r\nimport {User} from '../interfaces/User';\r\nimport {DatabitCategory} from '../interfaces/DatabitCategory';\r\nimport {Databit} from '../interfaces/Databit';\r\nimport {Store} from '../interfaces/Store';\r\nimport {Chain} from '../interfaces/Chain';\r\nimport {UserSetting} from '../interfaces/UserSetting';\r\nimport {NavigationService} from './navigation.service';\r\nimport { BaseDashBoardComponent } from '../classes/basedashboardcomponent';\r\nimport { SilverWareCommon } from './SilverWareCommon';\r\nimport { ComparisonParameterValue } from '../../shared/interfaces/ComparisonParameterValue';\r\nimport {QueueData} from '../types/queue-data';\r\nimport {RunDatabitResponse, RunDatabitResult} from '../responses/run-databit-response';\r\nimport {CommonService} from \"./common.service\";\r\nimport {LogService} from \"./log.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PageService {\r\n private currentDashBoard: BaseDashBoardComponent;\r\n public loadingOverLay = false;\r\n private processedQueuesLength = 0;\r\n public processDataDelay = 100;\r\n private queueLimit = 2;\r\n private dashboardID: string;\r\n private dashboardType: DashboardType;\r\n private defaultChainID: string;\r\n private currentChainID: string;\r\n private currentStoreID: string;\r\n private user: User;\r\n // Will hold Modified and deleted widgets\r\n public queueChanges = [];\r\n // List of widgets for current dashboard\r\n public dashboardDatabits: Array;\r\n\r\n // Will keep a copy from all available databits\r\n public allAvailableDatabitsDictionary: {[index: string]: Databit; };\r\n public allAvailableDatabits: Array;\r\n // Hold the rearranged dashboardConfigs\r\n private rearrangedQueueChanges = [];\r\n // Will hold the created Queues from charts\r\n private queueData: QueueData[] = [];\r\n // Will hold the queues that are processing now\r\n private processingQueues: QueueData[] = [];\r\n private runningDatabitsQueue: QueueData[] = [];\r\n // Will hold the all the processed queues\r\n private processedQueues: QueueData[] = [];\r\n // Page interval for fetching data\r\n private interval = null;\r\n private currentCategories: Array;\r\n public currentPageWidgets: Array;\r\n constructor(private modalService: ModalService, private databitService: DatabitService, private dashboardService: DashboardService,\r\n private navigationService: NavigationService, private commonService: CommonService, private logService: LogService) { }\r\n // keep copy from all available databits\r\n public set availableDatabitsArray(databits: any) {\r\n\r\n SilverWareArrays.forEach(databits, (bit: any) => {\r\n if (bit.parameters && bit.parameters != '') {\r\n var params = JSON.parse(bit.parameters);\r\n\r\n bit.parameters = params;\r\n }\r\n\r\n if (bit.chartConfig && bit.chartConfig != '') {\r\n bit.chartConfigs = JSON.parse(bit.chartConfig);\r\n }\r\n });\r\n\r\n // Sort so our databits show in alphabetical order\r\n SilverWareArrays.sortAscCaseInsensitive(databits, 'displayName');\r\n this.allAvailableDatabits = databits;\r\n this.allAvailableDatabitsDictionary = Object.assign({}, ...this.allAvailableDatabits.map((x: Databit) => ({[x.name]: x})));\r\n }\r\n // Creat a dictionary from all the available databits\r\n public getDatabitInfo(databitName: string): Databit {\r\n return this.allAvailableDatabitsDictionary[databitName];\r\n }\r\n // Get all the databits from databits catch by category for other pages except heartbeat and dashboard\r\n public getDatabitInfoByCategory(category: DatabitCategory, databitParamValues = null): DatabitConfig[] {\r\n const databitByCategory = SilverWareArrays.where(this.allAvailableDatabits, (databit: Databit) => { return databit.category == category });\r\n\r\n const databits = Array();\r\n SilverWareArrays.forEach(databitByCategory, (databit: Databit) => {\r\n const dt: DatabitConfig = {\r\n parameterValues: databitParamValues ? databitParamValues : new Array(),\r\n chartType: Math.floor(Math.random() * (5 - 3 + 1) + 3), // TODO: we need the chart type\r\n displayName: databit.displayName,\r\n storeID: this.currentStoreID,\r\n chainID: this.currentChainID,\r\n databitName: databit.name,\r\n chartConfigs: databit.chartConfigs,\r\n objectState: ObjectState.None,\r\n id: SilverWareCommon.newGuid(),\r\n seriesOverride: null,\r\n comparisonParameterValues: []\r\n };\r\n databits.push(dt);\r\n });\r\n return databits;\r\n }\r\n\r\n public refreshOtherPage(): void {\r\n this.refreshPage(null);\r\n //this.clearQueueWatch();\r\n //this.currentPageWidgets = new Array();\r\n //this.clearQueue();\r\n //console.log(this.currentCategories);\r\n //SilverWareArrays.forEach(this.currentCategories, (category: DatabitCategory) => {\r\n // this.currentPageWidgets = this.currentPageWidgets.concat(this.getDatabitInfoByCategory(category));\r\n //});\r\n }\r\n\r\n public refreshPage(databitParamValues): void {\r\n this.clearQueueWatch();\r\n //this.currentPageWidgets = new Array();\r\n //SilverWareArrays.forEach(this.currentCategories, (category: DatabitCategory) => {\r\n // this.currentPageWidgets = this.currentPageWidgets.concat(this.getDatabitInfoByCategory(category, databitParamValues));\r\n //});\r\n this.currentDashBoard.updateDataBitParamValues(databitParamValues);\r\n }\r\n\r\n public pageCategory(categories: Array): void {\r\n this.currentCategories = categories;\r\n this.clearQueueWatch();\r\n this.currentPageWidgets = new Array();\r\n this.clearQueue();\r\n SilverWareArrays.forEach(this.currentCategories, (category: DatabitCategory) => {\r\n this.currentPageWidgets = this.currentPageWidgets.concat(this.getDatabitInfoByCategory(category));\r\n });\r\n }\r\n\r\n // Return the the custom assigned delay on loading data\r\n public get intervalDelay() {\r\n return this.processDataDelay;\r\n }\r\n // Return current page type\r\n public get currentDashboardType() {\r\n return this.currentDashBoard.dashboardType;\r\n }\r\n public get currentDashboardId() {\r\n return this.currentDashBoard.dashboardId;\r\n }\r\n // Return DashboardType Enum for front end use\r\n public get DashboardType() {\r\n return DashboardType;\r\n }\r\n public get currentDashboardName() {\r\n return this.currentDashBoard.dashboardName;\r\n }\r\n // Add the modified widget to the queue changes\r\n public addToQueue(item: DatabitConfig): void {\r\n this.currentDashBoard.addToQueue(item);\r\n //const widget = SilverWareArrays.firstOrDefault(this.dashboardDatabits,\r\n // (configs: DatabitConfig) => configs.databitName === item.databitName);\r\n //if (widget != null) {\r\n // if (item.objectState === ObjectState.Modified) {\r\n // widget.chartType = item.chartType;\r\n // widget.objectState = item.objectState;\r\n // widget.displayName = item.displayName;\r\n // widget.parameterValues = item.parameterValues;\r\n // widget.storeID = item.storeID;\r\n // widget.objectState = ObjectState.None; // set the object state to normal\r\n // } else if (item.objectState === ObjectState.Deleted) {\r\n // const index = SilverWareArrays.indexOf(this.dashboardDatabits,\r\n // (x: DatabitConfig) => x.databitName === widget.databitName);\r\n // if (index > -1) {\r\n // this.currentDashBoard.dashboardDatabits.splice(index, 1);\r\n // //this.dashboardDatabits.splice(index, 1);\r\n // } else {\r\n // console.error(`Error - we could not find the index to delete!`);\r\n // }\r\n // console.error(`We Deleted widget form configs! We are saving now...!`);\r\n // }\r\n\r\n // const currentDashboard: Dashboard = {\r\n // id: this.currentDashBoard.dashboardId,\r\n // type: this.currentDashBoard.dashboardType,\r\n // name: this.currentDashBoard.name,\r\n // userID: this.user.id,\r\n // databits: this.currentDashBoard.dashboardDatabits\r\n // };\r\n // this.queueChanges.push(currentDashboard);\r\n //} else {\r\n // console.error('Error - cant find the config');\r\n //}\r\n\r\n }\r\n\r\n // Store the current requested dashboard from app.component navigation function\r\n //public setCurrentDashboard(currentDashboard: Dashboard) {\r\n // console.log('current Dashboard');\r\n // console.log(currentDashboard);\r\n // this.clearQueueWatch();\r\n // this.interval = null;\r\n // this.dashboardID = currentDashboard.id;\r\n // this.dashboardType = currentDashboard.type;\r\n // this.dashboardName = currentDashboard.name;\r\n // if (this.user.id != currentDashboard.userID) {\r\n // console.error('not the same user!');\r\n // }\r\n // if (this.dashboardID != null && this.dashboardType != null) {\r\n // console.log('this.dashboardID');\r\n // console.log(this.dashboardID);\r\n // if (this.dashboardType == DashboardType.Heartbeat || this.dashboardType == DashboardType.Custom) {\r\n // this.getDashboardDatabitConfigs();\r\n // }\r\n\r\n // }\r\n\r\n\r\n //}\r\n // Store the current user info\r\n public setDashboardUser(user: User): void {\r\n this.user = user;\r\n const defaultChainID = SilverWareArrays.firstOrDefault(user.settings, (setting: UserSetting) => setting.name == 'DefaultChainID' && setting.userID == user.id);\r\n if (defaultChainID != null) {\r\n this.logService.debug(`defaultChainID: ${defaultChainID.value}`);\r\n this.defaultChainID = defaultChainID.value.toLowerCase();\r\n } else {\r\n this.logService.error('Cannot find default chain ID');\r\n }\r\n }\r\n public get currentUser(): User {\r\n return this.user;\r\n }\r\n\r\n public set chainID(chainID: string) {\r\n this.currentChainID = chainID;\r\n const firstStore = this.getChainStores(chainID);\r\n if (firstStore.length > 0) {\r\n this.currentStoreID = firstStore[0].id.toLowerCase();\r\n } else {\r\n this.logService.error('Could not find any stores for this chain!');\r\n }\r\n }\r\n\r\n public get defaultChainId(): string {\r\n return this.defaultChainID;\r\n }\r\n public get chainID(): string {\r\n return this.currentChainID;\r\n }\r\n\r\n public get chains(): Chain[] {\r\n return this.user.chains;\r\n }\r\n\r\n get currentChain(): Chain {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(this.currentChainID)) {\r\n return null;\r\n }\r\n const chain = this.chainInfo(this.currentChainID);\r\n\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(chain)) {\r\n return chain;\r\n }\r\n\r\n return null;\r\n }\r\n public chainInfo(chainId: string): Chain {\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(chainId) && this.commonService.isNotNullAndUndefinedAndEmpty(this.user) &&\r\n this.commonService.isNotNullAndUndefinedAndEmpty(this.user.chains)) {\r\n const chain = SilverWareArrays.firstOrDefault(this.user.chains, (ch: Chain) => ch.id.toLowerCase() == chainId.toLowerCase());\r\n if (chain != null) {\r\n return chain;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public getChainStores(chainID: string): Store[] {\r\n return SilverWareArrays.where(this.user.stores, (ch: Store) => ch.hasData == true && ch.chainID.toLowerCase() == chainID.toLowerCase());\r\n }\r\n\r\n public set storeID(storeID: string) {\r\n this.currentStoreID = storeID;\r\n }\r\n\r\n public get storeID(): string {\r\n return this.currentStoreID;\r\n }\r\n\r\n public getStoreInfo(storeID: string): Store {\r\n if (storeID != null && storeID != undefined && this.user != null && this.user != undefined) {\r\n const store = SilverWareArrays.firstOrDefault(this.user.stores, (ch: Store) => ch.hasData == true && ch.id.toLowerCase() == storeID.toLowerCase());\r\n if (store != null) {\r\n return store;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public getStoreNameByStoreId(storeId: string): string {\r\n if (!SilverWareCommon.isNotNullEmptyUndefined(storeId)) {\r\n return null;\r\n }\r\n const stores = SilverWareArrays.where(this.user.stores, (x) => {\r\n return x.id.toLowerCase() === storeId.toLowerCase();\r\n });\r\n return stores.length > 0 ? stores[0].name : null;\r\n }\r\n\r\n public setCurrentDashBoardComponent(dashBoard: BaseDashBoardComponent): void {\r\n this.currentDashBoard = dashBoard\r\n this.dashboardID = dashBoard.dashboardId;\r\n }\r\n\r\n public getCurrentDashBoardComponent(): BaseDashBoardComponent {\r\n return this.currentDashBoard;\r\n }\r\n // Saving the queue changes\r\n public saveQueue(callback: () => void = null, updateDatabits: boolean = true): void {\r\n this.logService.debug(`We are saving the changes. We have ${this.queueChanges.length} change(s) to save.`);\r\n // We still keep the multi saving dashboards.\r\n // But right now we force to save on changing the pages so we always\r\n // get the latest on the array\r\n this.dashboardService.saveUserDashboards(this.queueChanges[this.queueChanges.length - 1]).subscribe(response => {\r\n this.undoQueue(updateDatabits);\r\n if (callback != null) {\r\n callback();\r\n }\r\n }, error => {\r\n this.logService.error(this.commonService.flattenErrorMessages(error));\r\n });\r\n }\r\n\r\n // Clear the queue changes\r\n public clearQueue(): void {\r\n this.queueChanges = [];\r\n this.rearrangedQueueChanges = [];\r\n this.dashboardDatabits = [];\r\n }\r\n // Clear the queue changes\r\n public undoQueue(updateDatabits: boolean = true): void {\r\n this.queueChanges = [];\r\n this.rearrangedQueueChanges = [];\r\n this.dashboardDatabits = [];\r\n this.clearQueueWatch();\r\n\r\n if (updateDatabits == true) {\r\n this.currentDashBoard.updateDatabits();\r\n }\r\n //this.getDashboardDatabitConfigs();\r\n }\r\n\r\n // Get all the dashboard's widgets\r\n //public getDashboardDatabitConfigs() {\r\n // this.clearQueueWatch();\r\n // console.log(this.dashboardID);\r\n // this.dashboardService.getUserDashboard(this.dashboardID, false).subscribe((response: any) => {\r\n // if (response.dashboard != null && response.dashboard != undefined) {\r\n // this.dashboardDatabits = response.dashboard.databits;\r\n // } else {\r\n // console.log('This dashboard does not have saved databits');\r\n // this.dashboardDatabits = null;\r\n // }\r\n\r\n // // this.setInterval();\r\n // }, ex => {\r\n // console.error(`dashboardConfigsObservable error: ${ex.message}`);\r\n // this.dashboardDatabits = null;\r\n // });\r\n\r\n //}\r\n // Clear all the processing queue and intervals\r\n public clearQueueWatch(): void {\r\n this.processedQueues = [];\r\n this.processingQueues = [];\r\n this.queueData = [];\r\n this.clearInterval();\r\n }\r\n // Start a new interval for processing and loading charts\r\n private setInterval(): void {\r\n this.interval = setInterval(() => { this.processData(); }, this.processDataDelay);\r\n }\r\n // Add the databit to the queue for getting the chart data\r\n // make a queue object for chart adn return the queue id\r\n // to chart for fetching the chart data\r\n public addToQueueProcessData(databitName: string, databitsParameterValues: Array, storeID: string, compareParameterValues: Array = []): string {\r\n // If we are adding new queue to process array and our interval is null (deactivated) start a new on\r\n // When we call the clearInterval() we set interval to null. This will avoid the queue breakage on\r\n // sudden page changes while the charts are still loading\r\n if (this.interval == null) {\r\n this.setInterval();\r\n }\r\n const queueId = Guid.newGuid().toString();\r\n const obj: QueueData = {\r\n id: queueId,\r\n name: databitName,\r\n parameterValues: databitsParameterValues,\r\n storeId: storeID,\r\n isProcessing: false,\r\n compareParameterValues: compareParameterValues,\r\n runResponse: null,\r\n error: null,\r\n log: null\r\n };\r\n obj.log = this.logService.debug(`Added a new data to queue Queue ID: ${obj.id} - Name: ${obj.name}`);\r\n this.queueData.push(obj);\r\n\r\n return obj.id;\r\n }\r\n // Adding the queue object to the processing queue if it has space\r\n // otherwise will return false (can't process now request later)\r\n public requestToProcess(id: string): boolean {\r\n if (this.interval == null) {\r\n this.setInterval();\r\n }\r\n const queue = SilverWareArrays.firstOrDefault(this.queueData, (q: any): boolean => q.id === id);\r\n if (queue != null) {\r\n if (this.processingQueues.length < this.queueLimit) {\r\n this.logService.debug(`Added to the process queue ${id}`);\r\n this.processingQueues.push(queue);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n // Check if current queue process has been done\r\n public isProcessedDone(id: string): boolean {\r\n const isProcessed = SilverWareArrays.firstOrDefault(this.processedQueues, (q: QueueData): boolean => q.id === id);\r\n if (isProcessed != null) {\r\n this.logService.logDuration(isProcessed.log?.id, ` Queue ID: ${isProcessed.id} - Name: ${isProcessed.name} Already processed!`);\r\n return true;\r\n }\r\n return false;\r\n }\r\n // Return the specific queue from processed queues array\r\n public getProcessed(id: string): QueueData {\r\n return SilverWareArrays.firstOrDefault(this.processedQueues, (pr: QueueData) => {\r\n return pr.id === id;\r\n });\r\n }\r\n // Will Process the processing queues and add them to the processes array\r\n // Make the processing array empty and when everything is done\r\n // It will clear the interval for processing data\r\n private processData(): void {\r\n SilverWareArrays.forEach(this.processingQueues, pr => {\r\n const index1 = SilverWareArrays.indexOf(this.processedQueues, (p: QueueData) => p.id === pr.id)\r\n const index2 = SilverWareArrays.indexOf(this.runningDatabitsQueue, (q: QueueData) => q.id === pr.id)\r\n if (index1 === -1 && index2 === -1) {\r\n this.logService.debug(`This databit is not processed yet. Start to process - Queue ID: ${pr.id} - Name: ${pr.name}`);\r\n this.runDatabit(pr.name, 'no-chain-id', pr.storeId, pr.parameterValues, false, pr.compareParameterValues).then(response => {\r\n let obj = pr;\r\n obj.isProcessing = true;\r\n obj.runResponse = response;\r\n // obj.message = response.message;\r\n this.logService.logDuration(obj.log.id, `Report Run successfully for ${obj.name}`);\r\n this.processedQueues.push(obj);\r\n this.runningDatabitsQueue = this.runningDatabitsQueue.filter((rdb) => rdb.id !== pr.id);\r\n this.processingQueues = this.processingQueues.filter((pq) => pq.id !== pr.id);\r\n }, err => {\r\n let obj = pr;\r\n obj.isProcessing = true;\r\n obj.error = err.message;\r\n this.processedQueues.push(obj);\r\n this.runningDatabitsQueue = this.runningDatabitsQueue.filter((rdb) => rdb.id !== pr.id);\r\n this.processingQueues = this.processingQueues.filter((pq) => pq.id !== pr.id);\r\n });\r\n this.runningDatabitsQueue.push(pr);\r\n }\r\n });\r\n //this.processingQueues = [];\r\n\r\n if (this.processedQueues.length === this.queueData.length) {\r\n this.logService.debug('Load Data Completed. Clear the interval.');\r\n this.clearInterval();\r\n this.interval = null;\r\n }\r\n // Fixing the bug if user change the page fast and doesn't let the queue to finish loading charts\r\n // The interval was keep working\r\n if (this.processedQueues.length === this.processedQueuesLength && this.processedQueues.length !== 0) {\r\n this.clearInterval();\r\n this.interval = null;\r\n }\r\n if (this.processedQueues.length > this.processedQueuesLength) {\r\n this.processedQueuesLength = this.processedQueues.length;\r\n }\r\n }\r\n // Run the databit\r\n public runDatabit(databitName: string, chainId: string, storeId: string, parameters: Array, forceRun: boolean = false, compareParameters: Array =[]): Promise {\r\n return new Promise((resolve, reject): void => {\r\n this.databitService.runDatabit(databitName, chainId, storeId, parameters, forceRun, compareParameters).subscribe(\r\n {\r\n next: runResponse => {\r\n if (runResponse.success === true) {\r\n resolve(runResponse);\r\n } else\r\n reject(runResponse.message);\r\n }, error: ex => {\r\n const errMsg = this.commonService.flattenErrorMessages(ex);\r\n this.logService.error(`Could not process data - error: ${errMsg}`);\r\n reject(errMsg);\r\n }\r\n });\r\n });\r\n\r\n }\r\n\r\n // Clearing the interval for processing data\r\n public clearInterval(): void {\r\n clearInterval(this.interval);\r\n // Set to null to avoid the queue breakage on\r\n // sudden page changes while the charts are still loading\r\n this.interval = null;\r\n }\r\n // Return the number of items in changed queue\r\n public changedItemsCount(): number {\r\n return this.queueChanges.length;\r\n }\r\n // Will return current widgets order in the current dashboard\r\n //public getPageOrder() {\r\n // const moveList = [];\r\n // SilverWareArrays.forEach(this.dashboardDatabits, (widgets: DatabitConfig) => {\r\n // const obj = {\r\n // // TODO: get the default name\r\n // name: widgets.displayName != null ? widgets.displayName : widgets.databitName,\r\n // chartType: SilverWareIcons.chartsIcon(ChartTypeEnum[widgets.chartType]),\r\n // deleteToggle: false,\r\n // databitName: widgets.databitName\r\n // };\r\n // moveList.push(obj);\r\n // });\r\n // return moveList;\r\n //}\r\n // Show page rearrange window and rearrange the widgets\r\n public rearrange(): void {\r\n this.currentDashBoard.rearrange();\r\n //const widgetsList = this.getPageOrder();\r\n //console.log(widgetsList);\r\n //const saveBtn = {\r\n // class: 'btn-default',\r\n // click: () => {\r\n // const old = this.dashboardDatabits.map(x => Object.assign({}, x));\r\n // this.dashboardDatabits = [];\r\n // SilverWareArrays.forEach(widgetsList, (w: any) => {\r\n // const find = SilverWareArrays.firstOrDefault(old, (databit: DatabitConfig) => { return databit.databitName === w.databitName; });\r\n // if (find != null) {\r\n // this.dashboardDatabits.push(find);\r\n // }\r\n // });\r\n // const currentDashboard: Dashboard = {\r\n // id: this.dashboardID,\r\n // type: this.dashboardType,\r\n // name: this.dashboardName,\r\n // userID: this.user.id,\r\n // databits: this.dashboardDatabits\r\n // };\r\n // this.queueChanges.push(currentDashboard);\r\n // },\r\n // label: 'Apply',\r\n // style: {flex: 1, margin: '5px'}\r\n //};\r\n //const modalObject = {\r\n // size: 'modal-lg',\r\n // title: 'Custom Filters',\r\n // template: DragDropComponent,\r\n // buttons: [saveBtn],\r\n // override: true,\r\n // buttonsContainerStyle : {display: 'flex', justifyContent: 'space-evenly'},\r\n // templateInputs: [\r\n // {key: 'list', value: widgetsList},\r\n // ],\r\n // cancelStyle: {flex: 1, margin: '5px'}\r\n //};\r\n //this.modalService.show(modalObject);\r\n }\r\n\r\n\r\n public addToHeartbeat(chart: DatabitConfig): void {\r\n this.currentDashBoard.addToHeartBeat(chart);\r\n //console.log(chart);\r\n //console.log('Add to Heartbeat');\r\n //// TODO: Should we keep the data and if they navigate to heartbeat don't send request?\r\n //const heartBeat = this.dashboardService.getSavedDashboardsByType(DashboardType.Heartbeat);\r\n //console.log(heartBeat);\r\n //if (heartBeat.length > 1) {\r\n // console.error('We found more than one Heartbeat record for this user!');\r\n //}\r\n //if (heartBeat.length == 0) {\r\n // console.error('We could not find any Heartbeat record for this user!');\r\n // // TODO: is it possible that user doesn't have heart beat record?\r\n //}\r\n //if (heartBeat.length > 0) {\r\n // this.loadingOverLay = true;\r\n // this.dashboardService.getUserDashboard(heartBeat[0].id, false).subscribe((response: any) => {\r\n // if (response.dashboard != null && response.dashboard != undefined) {\r\n // console.log(response.dashboard);\r\n // const heartbeatDashboard = response.dashboard;\r\n // chart.objectState = ObjectState.None;\r\n // if (heartbeatDashboard.databits == null || heartbeatDashboard.databits == undefined) {\r\n // console.log('the widgets array is empty make new one');\r\n // heartbeatDashboard.databits = new Array();\r\n // } else {\r\n\r\n // // TODO: we need to check for the store id and chain ID of they are the same override it\r\n // const savedWidgetIndex = SilverWareArrays.indexOf(heartbeatDashboard.databits, (widget: DatabitConfig) =>\r\n // widget.databitName === chart.databitName && widget.storeID === chart.storeID && widget.chainID === chart.chainID);\r\n\r\n // if (savedWidgetIndex > -1) {\r\n // console.log('Found the same widget removing the old one');\r\n // heartbeatDashboard.databits.splice(savedWidgetIndex, 1);\r\n // }\r\n // }\r\n // heartbeatDashboard.databits.push(chart);\r\n // console.log(heartbeatDashboard.databits);\r\n\r\n // this.dashboardService.saveUserDashboards(heartbeatDashboard).subscribe(result => {\r\n // console.log(result);\r\n // if (result.success && result.message == null) {\r\n // this.modalService.info(`${chart.displayName} has been added to Heartbeat page successfully`, 'Success', null, null, 'Done');\r\n // }\r\n // this.loadingOverLay = false;\r\n // }, error => {\r\n // console.error(error);\r\n // this.loadingOverLay = false;\r\n // });\r\n // } else {\r\n // console.log('This dashboard doesnot have saved databits');\r\n // this.loadingOverLay = false;\r\n // }\r\n\r\n // }, ex => {\r\n // console.error(`dashboardConfigsObservable error: ${ex.message}`);\r\n // this.loadingOverLay = false;\r\n // });\r\n //}\r\n }\r\n\r\n public createNewDashboard(): void {\r\n const otherDashboardType: Dashboard = {\r\n id: Guid.newGuid().toString(),\r\n userID: this.user.id,\r\n type: DashboardType.Custom,\r\n name: '',\r\n databits: []\r\n };\r\n\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n },\r\n label: 'Apply',\r\n style: {flex: 1, margin: '5px'}\r\n };\r\n const dashboardName = '';\r\n const modalObject = {\r\n inputData : dashboardName,\r\n inputType: 'text',\r\n inputLabel: 'Dashboard Name',\r\n buttons: [saveBtn],\r\n cancelStyle: {flex: 1, margin: '5px'}\r\n };\r\n this.modalService.input(null, `Please type your dashboard name`, modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData.trim() != '') {\r\n this.loadingOverLay = true;\r\n otherDashboardType.name = result.inputData;\r\n this.dashboardService.saveUserDashboards(otherDashboardType).subscribe(response => {\r\n this.loadingOverLay = false;\r\n this.navigationService.updateCurrentPage(DashboardType[DashboardType.Custom], DashboardType.Custom, otherDashboardType.id);\r\n this.navigationService.updateURL(this.chainID);\r\n }, error => {\r\n this.logService.error(this.commonService.flattenErrorMessages(error));\r\n this.loadingOverLay = false;\r\n });\r\n }\r\n });\r\n }\r\n\r\n private getUsersDashboards(): void {\r\n this.dashboardService.getUserDashboards(this.user.id, DashboardType.Any, false).subscribe(response => {\r\n if (response.success === true) {\r\n this.dashboardService.savedDashboards = response.dashboards;\r\n } else\r\n this.logService.error(response.message);\r\n\r\n }, err => {\r\n this.logService.error(`Cannot get dashboards! Error: ${this.commonService.flattenErrorMessages(err)}`);\r\n });\r\n }\r\n\r\n public dashboardOptions(id: string): void {\r\n const btns = [\r\n {name: 'Modify Title', icon: 'fas fa-edit'},\r\n {name: 'Delete Dashboard', icon: 'fas fa-trash-alt'}\r\n ];\r\n this.modalService.listButtonV2(null, null, btns, null, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null) {\r\n switch (result.inputData) {\r\n case 'Modify Title':\r\n this.changeDashboardTitle(id);\r\n break;\r\n case 'Delete Dashboard':\r\n this.deleteDashboard(id);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private deleteDashboard(id: string): void {\r\n if (id != this.currentDashboardId) {\r\n const dashboard = SilverWareArrays.firstOrDefault(this.dashboardService.savedDashboards, (dash: Dashboard) => dash.id == id);\r\n if (dashboard != null) {\r\n this.dashboardService.deleteUserDashboard(dashboard).subscribe(result => {\r\n this.getUsersDashboards();\r\n }, error => {\r\n this.logService.error(error);\r\n });\r\n } else {\r\n this.logService.error(`Did not find saved dashboard with id: ${id}`);\r\n }\r\n } else {\r\n this.modalService.info(`You cannot delete current navigated dashboard. Please navigate to another page and try again.`, 'Alert');\r\n }\r\n\r\n }\r\n\r\n private changeDashboardTitle(id: string): void {\r\n const dashboard = SilverWareArrays.firstOrDefault(this.dashboardService.savedDashboards, (dash: Dashboard) => dash.id == id);\r\n if (dashboard != null) {\r\n\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n },\r\n label: 'Apply',\r\n style: {flex: 1, margin: '5px'}\r\n };\r\n const dashboardName = dashboard.name;\r\n const modalObject = {\r\n inputData : dashboardName,\r\n inputType: 'text',\r\n inputLabel: 'Dashboard Name',\r\n buttons: [saveBtn],\r\n cancelStyle: {flex: 1, margin: '5px'}\r\n };\r\n this.modalService.input(null, `Please type your dashboard name`, modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData.trim() != '' && dashboard.name != result.inputData.trim()) {\r\n dashboard.name = result.inputData;\r\n this.dashboardService.saveUserDashboards(dashboard).subscribe(response => {\r\n if (response.success && dashboard.id == this.dashboardID) {\r\n this.currentDashBoard.dashboardName = dashboard.name;\r\n }\r\n }, error => {\r\n this.logService.error(this.commonService.flattenErrorMessages(error));\r\n });\r\n }\r\n });\r\n\r\n } else {\r\n this.logService.error(`Did not find saved dashboard with id: ${id}`);\r\n }\r\n }\r\n\r\n public addWidgetToDashboard(widget: DatabitConfig) {\r\n this.currentDashBoard.addWidgetToDashboard(widget);\r\n //const listDashboards = this.dashboardService.getSavedDashboardsByType(DashboardType.Custom).map(dashboard => ({ name: dashboard.name, value: dashboard.id }));\r\n ////const listDashboards = this.customDashboards.map(dashboard => ({ name: dashboard.name, value: dashboard.id }));\r\n //const saveBtn = {\r\n // class: 'btn-default',\r\n // click: () => {\r\n\r\n // },\r\n // label: 'Apply',\r\n // style: {flex: 1, margin: '5px'}\r\n //};\r\n //const modalObject = {\r\n // buttons: [saveBtn],\r\n // selectList: listDashboards,\r\n // cancelStyle: {flex: 1, margin: '5px'}\r\n //};\r\n //this.modalService.list(null, 'Please choose your dashboard', modalObject, null, 'Cancel', (result: any) => {\r\n // if (result.inputData != null && result.inputData != '') {\r\n // console.log(result.inputData);\r\n // const dashboardID = result.inputData;\r\n // this.loadingOverLay = true;\r\n // this.dashboardService.getUserDashboard(dashboardID, false).subscribe((response: any) => {\r\n // if (response.dashboard != null && response.dashboard != undefined) {\r\n // console.log(response.dashboard);\r\n // const customDashboard = response.dashboard;\r\n // widget.objectState = ObjectState.None;\r\n // if (customDashboard.databits == null || customDashboard.databits == undefined) {\r\n // console.log('the widgets array is empty make new one');\r\n // customDashboard.databits = new Array();\r\n // } else {\r\n // //TODO: we need to check for the store id and chain ID of they are the same override it\r\n // //const savedWidgetIndex = SilverWareArrays.indexOf(customDashboard.databits, (dashboardWidget: DatabitConfig) => dashboardWidget.databitName === widget.databitName && dashboardWidget.storeID === widget.storeID && dashboardWidget.chainID === widget.chainID);\r\n // //if (savedWidgetIndex > -1) {\r\n // //console.log('Found the same widget removing the old one');\r\n // //customDashboard.databits.splice(savedWidgetIndex, 1);\r\n // //}\r\n // }\r\n // customDashboard.databits.push(widget);\r\n // console.log(customDashboard.databits);\r\n // this.dashboardService.saveUserDashboards(customDashboard).subscribe(result => {\r\n // console.log(result);\r\n // if (result.success && result.message == null) {\r\n // this.modalService.info(`${widget.displayName} has been added to ${customDashboard.name} page successfully`, 'Alert');\r\n // }\r\n // this.loadingOverLay = false;\r\n // }, error => {\r\n // console.error(error);\r\n // this.loadingOverLay = false;\r\n // });\r\n // } else {\r\n // console.log('This dashboard does not have saved databits');\r\n // this.loadingOverLay = false;\r\n // }\r\n\r\n // }, ex => {\r\n // console.error(`dashboardConfigsObservable error: ${ex.message}`);\r\n // this.loadingOverLay = false;\r\n // });\r\n // }\r\n\r\n //});\r\n\r\n }\r\n //public creatNewWidget() {\r\n // const listDatabit = this.allAvailableDatabits.map(databit => ({ name: databit.displayName, value: databit.name }));\r\n // const saveBtn = {\r\n // class: 'btn-default',\r\n // click: () => {\r\n\r\n // },\r\n // label: 'Apply',\r\n // style: {flex: 1, margin: '5px'}\r\n // };\r\n // const modalObject = {\r\n // buttons: [saveBtn],\r\n // isMultiSelect: true,\r\n // selectList: listDatabit,\r\n // cancelStyle: {flex: 1, margin: '5px'}\r\n // };\r\n // this.modalService.list(null, 'Please choose your widget', modalObject, null, 'Cancel', (result: any) => {\r\n // if (result.inputData != null && result.inputData != '') {\r\n // console.log(result.inputData);\r\n // if (this.dashboardDatabits == null || this.dashboardDatabits == undefined) {\r\n // this.dashboardDatabits = new Array();\r\n // }\r\n // const selectedDatabits = result.inputData;\r\n // const chainStores = this.getChainStores(this.currentChainID).map(store => ({ name: store.name, value: store.id , icon: 'fas fa-store'}));\r\n // SilverWareArrays.sortAsc(chainStores, 'name');\r\n // const btnSave = {\r\n // class: 'btn-default',\r\n // click: () => {\r\n\r\n // },\r\n // label: 'Apply',\r\n // style: {flex: 1, margin: '5px'}\r\n // };\r\n // const objectModal = {\r\n // buttons: [btnSave],\r\n // isMultiSelect: false,\r\n // selectList: chainStores,\r\n // cancelStyle: {flex: 1, margin: '5px'}\r\n // };\r\n // this.modalService.list(null, 'Please choose your store', objectModal, null, 'Cancel', (response: any) => {\r\n // if (response.inputData != null && response.inputData != '') {\r\n // const selectedStoreID = response.inputData;\r\n // SilverWareArrays.forEach(selectedDatabits, (databitName: string) => {\r\n // // Find the old one and deleted it\r\n // // TODO: we need to check the chain and store id as well\r\n // const index = SilverWareArrays.indexOf(this.dashboardDatabits, (item: DatabitConfig) => item.databitName === databitName && item.chainID == this.currentChainID && item.storeID == selectedStoreID);\r\n // if (index > -1) {\r\n // this.dashboardDatabits.splice(index, 1);\r\n // }\r\n // const currentDatabit = this.allAvailableDatabitsDictionary[databitName];\r\n // console.log(currentDatabit);\r\n // const dt: DatabitConfig = {\r\n // parameterValues: new Array(),\r\n // chartType: Math.floor(Math.random() * (5 - 3 + 1) + 3), // TODO: we need the chart type\r\n // displayName: currentDatabit.displayName,\r\n // storeID: selectedStoreID,\r\n // chainID: this.currentChainID,\r\n // databitName: currentDatabit.name,\r\n // objectState: ObjectState.Added,\r\n // };\r\n // this.dashboardDatabits.push(dt);\r\n // });\r\n // const currentDashboard: Dashboard = {\r\n // id: this.dashboardID,\r\n // type: this.dashboardType,\r\n // name: this.dashboardName,\r\n // userID: this.user.id,\r\n // databits: this.dashboardDatabits\r\n // };\r\n // this.queueChanges.push(currentDashboard);\r\n // }\r\n // });\r\n // }\r\n\r\n // });\r\n // }\r\n public get customDashboards(): Dashboard[] {\r\n return this.dashboardService.getSavedDashboardsByType(DashboardType.Custom);\r\n }\r\n\r\n public updateChain(chainId: string): void {\r\n this.chainID = chainId;\r\n this.currentDashBoard.updateDatabits();\r\n }\r\n\r\n public updateStore(storeId: string): void {\r\n this.storeID = storeId;\r\n this.currentDashBoard.updateDatabits();\r\n }\r\n //public changeChain() {\r\n // const listchain = this.user.chains.sort().map(chain => ({ name: chain.name, value: chain.id.toLowerCase() }));\r\n // if (listchain) {\r\n // listchain.sort((a, b) => {\r\n // if (a.name > b.name) return 1;\r\n // if (a.name < b.name) return -1;\r\n // if (a.name === b.name) return 0;\r\n // })\r\n // }\r\n // const saveBtn = {\r\n // class: 'btn-default',\r\n // click: () => {\r\n\r\n // },\r\n // label: 'Apply',\r\n // style: {flex: 1, margin: '5px'}\r\n // };\r\n // const modalObject = {\r\n // buttons: [saveBtn],\r\n // isMultiSelect: false,\r\n // inputData : this.currentChainID,\r\n // selectList: listchain,\r\n // cancelStyle: {flex: 1, margin: '5px'}\r\n // };\r\n // this.modalService.list(null, 'Please choose your chain', modalObject, null, 'Cancel', (result: any) => {\r\n // if (result.inputData != null && result.inputData != '') {\r\n // console.log(result.inputData);\r\n // this.chainID = result.inputData;\r\n // this.navigationService.updateURL(this.chainID);\r\n // if (this.dashboardType == DashboardType.Other) {\r\n // this.refreshOtherPage();\r\n // } else if (this.dashboardType == DashboardType.Heartbeat || this.dashboardType == DashboardType.Custom ) {\r\n // this.undoQueue();\r\n // }\r\n // }\r\n\r\n // });\r\n //}\r\n}\r\n","import {DatabitParameterValue} from './DatabitParameterValue';\r\n\r\nexport enum DatabitParameterType {\r\n String = 0,\r\n Boolean = 1,\r\n List = 2,\r\n Collection = 3,\r\n DateRange = 4,\r\n TimeRange = 5,\r\n Currency = 6,\r\n Percentage = 7,\r\n Integer = 8,\r\n Date = 9,\r\n MoreFilters = 10\r\n}\r\n\r\nexport interface DatabitParameter {\r\n name: string;\r\n displayName: string;\r\n type: DatabitParameterType;\r\n availableValues: Array;\r\n defaultValue: DatabitParameterValue;\r\n isArray: boolean;\r\n}\r\n","import {Injectable} from '@angular/core';\r\nimport {\r\n HttpClient,\r\n} from '@angular/common/http';\r\nimport {User} from '../interfaces/User';\r\nimport { AppConfig } from '../app.config';\r\nimport {CommonService} from './common.service';\r\nimport {LogOnResponse} from '../responses/log-on-response';\r\nimport {LogService} from \"./log.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthService {\r\n\r\n private readonly myPassLogOnURL = `${this.mypassURL}/Account/LogOn?site=Dashboards`;\r\n private readonly myPassLogOffURL = `${this.mypassURL}/Account/LogOff?site=Dashboards`;\r\n\r\n public loggedIn: boolean = false;\r\n private myPassUser: User;\r\n constructor(private http: HttpClient, private appConfig: AppConfig, private commonService: CommonService, private logService: LogService) {}\r\n\r\n async logOn(): Promise {\r\n const url = this.appConfig.applicationUrl + '/api/Auth/LogOn';\r\n return new Promise((resolve, reject) => {\r\n const handleError = (error: any): void => {\r\n const errMsg = this.commonService.flattenErrorMessages(error);\r\n this.logService.error(`Failed to authenticate user. EX: ${errMsg}`);\r\n this.clearUserState();\r\n this.navigateToMyPass();\r\n reject();\r\n };\r\n this.http.post(url, null).subscribe({\r\n next: (response: LogOnResponse) => {\r\n if (response.success === true) {\r\n this.myPassUser = response.user;\r\n this.loggedIn = true;\r\n resolve();\r\n } else {\r\n handleError(response);\r\n }\r\n },\r\n error: (ex: any) => {\r\n handleError(ex);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private clearUserState(): void {\r\n this.loggedIn = false;\r\n this.myPassUser = null;\r\n }\r\n\r\n loadMyPassUserFromWindowObject(): void {\r\n const myPassUser = document.getElementById('myPassUser');\r\n if (!myPassUser || myPassUser.value.trim() === '') {\r\n this.logOut(true);\r\n return;\r\n }\r\n this.myPassUser = JSON.parse(myPassUser.value);\r\n this.loggedIn = true;\r\n }\r\n\r\n /**\r\n * If withRedirect is true we will redirect to logon\r\n * @param withRedirect\r\n */\r\n logOut(withRedirect: boolean = false): void {\r\n this.deleteCookie(this.appConfig.authCookieName);\r\n this.clearUserState();\r\n if (withRedirect) {\r\n window.location.assign(`${this.myPassLogOffURL}&returnUrl=${this.logOnURL}`);\r\n return;\r\n }\r\n window.location.assign(`${this.myPassLogOffURL}&returnUrl=${window.location.href}`);\r\n }\r\n\r\n public getCookie(name: string) {\r\n let ca: Array = document.cookie.split(';');\r\n let caLen: number = ca.length;\r\n let cookieName = `${name}=`;\r\n let c: string;\r\n\r\n for (let i: number = 0; i < caLen; i += 1) {\r\n c = ca[i].replace(/^\\s+/g, '');\r\n if (c.indexOf(cookieName) == 0) {\r\n return c.substring(cookieName.length, c.length);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public deleteCookie(name: string) {\r\n this.setCookie({ name: name, value: '', expireDays: -1 });\r\n }\r\n\r\n public setCookie(params: any) {\r\n let d: Date = new Date();\r\n d.setTime(\r\n d.getTime() +\r\n (params.expireDays ? params.expireDays : 1) * 24 * 60 * 60 * 1000\r\n );\r\n document.cookie =\r\n (params.name ? params.name : '') +\r\n '=' +\r\n (params.value ? params.value : '') +\r\n ';' +\r\n (params.session && params.session == true\r\n ? ''\r\n : 'expires=' + d.toUTCString() + ';') +\r\n 'path=' +\r\n (params.path && params.path.length > 0 ? params.path : '/') +\r\n ';' +\r\n (location.protocol === 'https:' && params.secure && params.secure == true\r\n ? 'secure'\r\n : '');\r\n }\r\n\r\n hasAuthCookie(): boolean {\r\n const authCookie = this.getCookie(this.appConfig.authCookieName);\r\n return this.commonService.isNotNullAndUndefinedAndEmpty(authCookie);\r\n }\r\n\r\n isAuthenticated(): boolean {\r\n return this.hasAuthCookie() && this.commonService.isNotNullAndUndefinedAndEmpty(this.user);\r\n }\r\n\r\n get mypassURL(): string {\r\n return this.appConfig.myPassUrl;\r\n }\r\n private get logOnURL(): string {\r\n return `${this.myPassLogOnURL}&returnUrl=${window.location.href}`;\r\n }\r\n navigateToMyPass(): void {\r\n this.deleteCookie(this.appConfig.authCookieName);\r\n this.logService.error('error validating login with auth service, redirecting to MyPass login page.');\r\n window.location.assign(this.logOnURL);\r\n }\r\n get user(): User {\r\n return this.myPassUser;\r\n }\r\n}\r\n\r\n\r\n","import { HammerGestureConfig } from \"@angular/platform-browser\";\r\nimport * as hammer from 'hammerjs';\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n@Injectable()\r\nexport class HammerjsService extends HammerGestureConfig {\r\n overrides = {\r\n 'swipe': { direction: hammer.DIRECTION_HORIZONTAL },\r\n 'pinch': { enable: false },\r\n 'rotate': { enable: false },\r\n 'pan': { enable: false },\r\n 'press': { enable: false },\r\n 'tap': {enable: false}\r\n };\r\n}\r\n","
\r\n
\r\n
{{selectedSmartDate}}
\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 {{header}}\r\n
\r\n
\r\n
\r\n
\r\n {{ error }}\r\n
\r\n
\r\n
\r\n
\r\n {{date.number}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {{ error }}\r\n
\r\n
\r\n
\r\n
\r\n {{month}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{ error }}\r\n
\r\n
\r\n
\r\n
\r\n {{year}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Start Time:
\r\n
\r\n
\r\n
\r\n {{startHour}}\r\n
\r\n
\r\n {{hr.hour}}\r\n
\r\n
\r\n  : \r\n
\r\n
\r\n {{startMinute}}\r\n
\r\n
\r\n {{min.minute}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
End Time:
\r\n
\r\n
\r\n
\r\n {{endHour}}\r\n
\r\n
\r\n {{hr.hour}}\r\n
\r\n
\r\n  : \r\n
\r\n
\r\n {{endMinute}}\r\n
\r\n
\r\n {{min.minute}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Start Time:
\r\n
\r\n
\r\n
\r\n {{startHour}}\r\n
\r\n
\r\n {{hr.hour}}\r\n
\r\n
\r\n  : \r\n
\r\n
\r\n {{startMinute}}\r\n
\r\n
\r\n {{min.minute}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
End Time:
\r\n
\r\n
\r\n
\r\n {{endHour}}\r\n
\r\n
\r\n {{hr.hour}}\r\n
\r\n
\r\n  : \r\n
\r\n
\r\n {{endMinute}}\r\n
\r\n
\r\n {{min.minute}}\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
Start Time:
\r\n
\r\n
\r\n
\r\n {{startHour}}\r\n
\r\n
\r\n {{hr.hour}}\r\n
\r\n
\r\n  : \r\n
\r\n
\r\n {{startMinute}}\r\n
\r\n
\r\n {{min.minute}}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n
\r\n
End Time:
\r\n
\r\n
\r\n
\r\n {{endHour}}\r\n
\r\n
\r\n {{hr.hour}}\r\n
\r\n
\r\n  : \r\n
\r\n
\r\n {{endMinute}}\r\n
\r\n
\r\n {{min.minute}}\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
{{date.smartDateDesc}}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import {Component, EventEmitter, HostListener, Input, OnInit, Output, ViewEncapsulation} from '@angular/core';\r\nimport {ActivatedRoute} from '@angular/router';\r\nimport {NavigationService} from '../shared/services/navigation.service';\r\nimport * as moment from 'moment';\r\nimport {LogService} from \"../shared/services/log.service\";\r\n\r\ndeclare var $: any;\r\n\r\n@Component({\r\n selector: 'app-calendar',\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './calendar.component.html',\r\n styleUrls: ['./calendar.component.css']\r\n\r\n})\r\nexport class CalendarComponent implements OnInit {\r\n selectedSmartDate = '';\r\n showSmartDatesMenu = false;\r\n chainId: string;\r\n smartDates = [{ smartDate: DateRangeFilters.CurrentDay, smartDateDesc: \"Current Day\" }, { smartDate: DateRangeFilters.PreviousDay, smartDateDesc: \"Previous Day\" },\r\n { smartDate: DateRangeFilters.CurrentWeek, smartDateDesc: \"Current Week\" }, { smartDate: DateRangeFilters.PreviousWeek, smartDateDesc: \"Previous Week\" },\r\n { smartDate: DateRangeFilters.CurrentMonth, smartDateDesc: \"Current Month\" }, { smartDate: DateRangeFilters.PreviousMonth, smartDateDesc: \"Previous Month\" },\r\n { smartDate: DateRangeFilters.CurrentYear, smartDateDesc: \"Current Year\" }, { smartDate: DateRangeFilters.PreviousYear, smartDateDesc: \"Previous Year\" },\r\n { smartDate: DateRangeFilters.CurrentDayLastWeek, smartDateDesc: \"Current Day Last Week\" }, { smartDate: DateRangeFilters.PreviousDayLastWeek, smartDateDesc: \"Previous Day Last Week\" },\r\n { smartDate: DateRangeFilters.CurrentDayLastMonth, smartDateDesc: \"Current Day Last Month\" }, { smartDate: DateRangeFilters.PreviousDayLastMonth, smartDateDesc: \"Previous Day Last Month\" }\r\n /*{ smartDate: DateRangeFilters.CurrentDayLastYear, smartDateDesc: \"Current Day Last Year\" }, { smartDate: DateRangeFilters.PreviousDayLastYear, smartDateDesc: \"Previous Day Last Year\" }*/]\r\n // TODO: Fix typing\r\n public calHeaders = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\r\n public calDates = [];\r\n public currentDate: any;\r\n public currentDay: any;\r\n public currentMonth: any;\r\n public monthString: string;\r\n public currentYear: any;\r\n public changedMonth: any;\r\n public changedYear: any;\r\n public showDays: boolean;\r\n public showMonths: boolean;\r\n public showYears: boolean;\r\n public startDay: any;\r\n public endDay: any;\r\n public months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n public hours = [];\r\n public minutes = [];\r\n public years = [];\r\n public error: string;\r\n private calenderMonthDifference = 0;\r\n private selectedDays = [];\r\n private dayPeriods = [];\r\n public startHour = '00';\r\n public startMinute = '00';\r\n public endHour = '23';\r\n public endMinute = '59';\r\n public isSmallScreen: boolean;\r\n public scale: string;\r\n\r\n public currentFilter: DateRangeFilters;\r\n\r\n @Input() showTimePicker = false;\r\n @Input() showDatePicker = true;\r\n @Input() timePeriod: string;\r\n @Input() dayPeriod: string;\r\n @Input() timePickerButtons = [];\r\n @Input() disableSmartDates: boolean;\r\n\r\n @Output()\r\n timePeriodChange = new EventEmitter();\r\n\r\n @Output()\r\n dayPeriodChange = new EventEmitter();\r\n\r\n\r\n constructor(private activeRoute: ActivatedRoute, public navigationService: NavigationService, private logService: LogService) { }\r\n\r\n ngOnInit() {\r\n this.chainId = this.activeRoute.snapshot.paramMap.get('chain-id');\r\n for (let i = 1; i < 32; i++) {\r\n this.calDates.push(i);\r\n }\r\n\r\n if (this.getCurrentInfo()) {\r\n this.populateCalendar(this.currentMonth, this.currentYear);\r\n } else {\r\n this.error = 'Could not get the current day, month and year information.';\r\n }\r\n this.resize(null);\r\n this.fillHours();\r\n this.fillMinutes();\r\n\r\n if (this.showTimePicker) {\r\n this.extractTimeFromInput();\r\n }\r\n if (this.showDatePicker) {\r\n this.extractDateFromInput();\r\n this.selectedSmartDate = this.currentFilter == DateRangeFilters.Custom ? this.currentFilter.toString() : this.smartDates.find((s => s.smartDate === this.currentFilter)).smartDateDesc;\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n toggleMenu(): void {\r\n this.showSmartDatesMenu = !this.showSmartDatesMenu;\r\n }\r\n private extractDateFromInput() {\r\n if (this.dayPeriod !== null && this.dayPeriod !== undefined) {\r\n const getDat = this.dayPeriod.split('|');\r\n if (getDat[0] != null && getDat[0] != undefined) {\r\n this.selectSmartDate(getDat[0]);\r\n }\r\n if (getDat[1] != null && getDat[1] != undefined) {\r\n this.selectSmartDate(getDat[1]);\r\n }\r\n } else {\r\n this.getToday(true);\r\n\r\n }\r\n }\r\n onSmartDateSelected(date): void {\r\n this.selectedSmartDate = date.smartDateDesc;\r\n this.selectSmartDate(date.smartDate);\r\n\r\n this.showSmartDatesMenu = false\r\n }\r\n private selectSmartDate(date: string): void {\r\n switch (date) {\r\n case DateRangeFilters.CurrentDay:\r\n this.currentFilter = DateRangeFilters.CurrentDay;\r\n this.getToday();\r\n break;\r\n case DateRangeFilters.PreviousDay:\r\n this.currentFilter = DateRangeFilters.PreviousDay;\r\n this.getYesterDay();\r\n break;\r\n case DateRangeFilters.CurrentWeek:\r\n this.currentFilter = DateRangeFilters.CurrentWeek;\r\n this.getThisWeek();\r\n break;\r\n case DateRangeFilters.PreviousWeek:\r\n this.currentFilter = DateRangeFilters.PreviousWeek;\r\n this.lastWeek();\r\n break;\r\n //case DateRangeFilters.CurrentPayPeriod:\r\n // console.log('CurrentPayPeriod');\r\n // this.currentFilter = DateRangeFilters.CurrentPayPeriod;\r\n // break;\r\n //case DateRangeFilters.PreviousPayPeriod:\r\n // console.log('PreviousPayPeriod');\r\n // this.currentFilter = DateRangeFilters.PreviousPayPeriod;\r\n //break;\r\n case DateRangeFilters.CurrentMonth:\r\n this.currentFilter = DateRangeFilters.CurrentMonth;\r\n this.getThisMonth();\r\n break;\r\n case DateRangeFilters.PreviousMonth:\r\n this.currentFilter = DateRangeFilters.PreviousMonth;\r\n this.getLastMonth();\r\n break;\r\n case DateRangeFilters.CurrentYear:\r\n this.currentFilter = DateRangeFilters.CurrentYear;\r\n this.getThisYear();\r\n break;\r\n case DateRangeFilters.PreviousYear:\r\n this.currentFilter = DateRangeFilters.PreviousYear;\r\n this.getLastYear();\r\n break;\r\n case DateRangeFilters.CurrentDayLastWeek:\r\n this.currentFilter = DateRangeFilters.CurrentDayLastWeek;\r\n this.getCurrentDayLastWeek();\r\n break;\r\n case DateRangeFilters.CurrentDayLastMonth:\r\n this.currentFilter = DateRangeFilters.CurrentDayLastMonth;\r\n this.getCurrentDayLastMonth();\r\n break;\r\n case DateRangeFilters.PreviousDayLastWeek:\r\n this.currentFilter = DateRangeFilters.PreviousDayLastWeek;\r\n this.getYesterdayDayLastWeek();\r\n break;\r\n case DateRangeFilters.PreviousDayLastMonth:\r\n this.currentFilter = DateRangeFilters.PreviousDayLastMonth;\r\n this.getYesterdayDayLastMonth();\r\n break;\r\n case DateRangeFilters.CurrentDayLastYear:\r\n this.currentFilter = DateRangeFilters.CurrentDayLastYear;\r\n this.getCurrentDayLastYear();\r\n break;\r\n case DateRangeFilters.PreviousDayLastYear:\r\n this.currentFilter = DateRangeFilters.PreviousDayLastYear;\r\n this.getPreviousDayLastYear();\r\n break;\r\n default:\r\n this.currentFilter = DateRangeFilters.Custom;\r\n this.selectDay(date);\r\n break;\r\n }\r\n }\r\n\r\n private extractTimeFromInput(): void {\r\n if (this.timePeriod !== null && this.timePeriod !== undefined) {\r\n const getTimes = this.timePeriod.split('|');\r\n let startTime = ['00', '00'];\r\n if (getTimes[0] != null && getTimes[0] != undefined) {\r\n startTime = getTimes[0].split(':');\r\n }\r\n let endTime = ['23', '59'];\r\n if (getTimes[1] != null && getTimes[1] != undefined) {\r\n endTime = getTimes[1].split(':');\r\n }\r\n\r\n this.startHour = startTime[0];\r\n this.startMinute = startTime[1];\r\n this.selectTimeHour(this.startHour, true);\r\n this.selectTimeMinute(this.startMinute, true);\r\n\r\n this.endHour = endTime[0];\r\n this.endMinute = endTime[1];\r\n this.selectTimeHour(this.endHour, false);\r\n this.selectTimeMinute(this.endMinute, false);\r\n }\r\n }\r\n\r\n get formattedStartDay(): string {\r\n return this.formatDay(this.startDay);\r\n }\r\n\r\n private formatDay(date: string): string {\r\n let d = moment(date, \"D-M-YYYY\", false);\r\n\r\n let month = d.format(\"MMM\");\r\n let day = d.format(\"DD\");\r\n let year = d.format(\"YYYY\");\r\n let day2 = d.format(\"ddd\");\r\n\r\n return day2 + ', ' + month + ' ' + day + ' ' + year;\r\n }\r\n\r\n get formattedEndDay(): string {\r\n return this.formatDay(this.endDay);\r\n }\r\n\r\n private getCurrentInfo(): boolean {\r\n this.currentDate = moment().format('MMM YYYY');\r\n this.currentDay = parseInt(moment().format('D'), 10);\r\n this.currentMonth = parseInt(moment().add(this.calenderMonthDifference, 'months').format('M'), 10);\r\n this.currentYear = parseInt(moment().add(this.calenderMonthDifference, 'months').format('YYYY'), 10);\r\n this.monthString = moment().add(this.calenderMonthDifference, 'months').format('MMM');\r\n this.changedMonth = parseInt(moment().add(this.calenderMonthDifference, 'months').format('M'), 10);\r\n this.changedYear = parseInt(moment().add(this.calenderMonthDifference, 'months').format('YYYY'), 10);\r\n\r\n if (this.currentDate !== null && this.currentDate !== undefined) {\r\n\r\n let chaneYear = this.currentYear;\r\n for (let i = 0; i < 30; i++) {\r\n this.years.push(chaneYear);\r\n chaneYear = chaneYear - 1;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private populateCalendar(month, year): void {\r\n this.picDays();\r\n this.calDates = [];\r\n\r\n // Finding the current month first day\r\n const firstDateMoment = moment([year, month - 1]);\r\n const firstDate = parseInt(moment([year, month - 1]).format('D'), 10);\r\n let firstDay = firstDateMoment.day();\r\n\r\n // If first day is 0 its Sunday which is 7\r\n if (firstDay == 0) {\r\n firstDay = 7;\r\n }\r\n\r\n // Find current month last day\r\n const lastDate = parseInt(moment(firstDateMoment).endOf('month').format('D'), 10);\r\n\r\n // Finding the previous month first day\r\n let previousMonthFirstDate = moment([year, month - 2]);\r\n // Finding previous month and previous months year\r\n const previousMonth = month - 1;\r\n let previousMonthsYear = year;\r\n // If we str in January we need to go one year back\r\n if (month == 1) {\r\n previousMonthFirstDate = moment([year - 1, 11]);\r\n previousMonthsYear = year - 1;\r\n }\r\n\r\n // Finding previous months last day and first day\r\n const previousLastDate = parseInt(moment(previousMonthFirstDate).endOf('month').format('D'), 10);\r\n const previousFirstDate = previousLastDate - firstDay + 1;\r\n\r\n // Current month details\r\n const currentDate = this.currentDay;\r\n const currentMonth = this.currentMonth;\r\n const currentYear = this.currentYear;\r\n\r\n // Keep track of how many days we are showing in the calendar\r\n let totalCount = 0;\r\n // Keep track of next months days\r\n let nextMonthCount = 1;\r\n\r\n // If some of the previous months days are visible populate the calendar\r\n\r\n for (let i = previousFirstDate; i <= previousLastDate; i++) {\r\n // Make id for date\r\n const dayId = `${i}-${previousMonth}-${previousMonthsYear}`;\r\n // check if it's exists in selected days\r\n const index = this.dayPeriods.indexOf(dayId);\r\n // If exist highlight it\r\n let dayHtmlCalss = 'cal-dates-inactive';\r\n if (index != -1) {\r\n dayHtmlCalss = dayHtmlCalss + ' cal-dates-selected';\r\n // console.log(`day: ${dayId} - SELECTED`);\r\n }\r\n const dateObj = { number: i, htmlClass: dayHtmlCalss, id: dayId };\r\n this.calDates.push(dateObj);\r\n totalCount++;\r\n }\r\n\r\n // Adding current months days to calendar\r\n for (let i = firstDate; i <= lastDate; i++) {\r\n // Make id for date\r\n const dayId = `${i}-${month}-${year}`;\r\n // check if it's exists in selected days\r\n const index = this.dayPeriods.indexOf(dayId);\r\n // If exist highlight it\r\n let dayHtmlCalss = '';\r\n if (index != -1) {\r\n dayHtmlCalss = dayHtmlCalss + ' cal-dates-selected';\r\n // console.log(`day: ${dayId} - SELECTED`);\r\n }\r\n const dateObj = { number: i, htmlClass: dayHtmlCalss, id: dayId };\r\n if (i == currentDate && year == currentYear && month == currentMonth) {\r\n dateObj.htmlClass = 'cal-dates-today';\r\n let today = moment().format('D-M-YYYY');\r\n if (this.dayPeriods.indexOf(today) > -1) {\r\n dateObj.htmlClass = 'cal-dates-today-selected';\r\n }\r\n }\r\n this.calDates.push(dateObj);\r\n totalCount++;\r\n }\r\n\r\n let nextMonth = month + 1;\r\n let nextYear = year;\r\n if (month == 12) {\r\n nextMonth = 1;\r\n nextYear = year + 1;\r\n }\r\n // Adding future months days to calendar if they are visible\r\n while (totalCount < 42) {\r\n // Make id for date\r\n const dayId = `${nextMonthCount}-${nextMonth}-${nextYear}`;\r\n // check if it's exists in selected days\r\n const index = this.dayPeriods.indexOf(dayId);\r\n // If exist highlight it\r\n let dayHtmlCalss = 'cal-dates-inactive';\r\n if (index != -1) {\r\n dayHtmlCalss = dayHtmlCalss + ' cal-dates-selected';\r\n // console.log(`day: ${dayId} - SELECTED`);\r\n }\r\n const dateObj = { number: nextMonthCount, htmlClass: dayHtmlCalss, id: dayId };\r\n this.calDates.push(dateObj);\r\n nextMonthCount++;\r\n totalCount++;\r\n }\r\n\r\n }\r\n\r\n private fillHours() {\r\n this.hours = [];\r\n for (let h = 0; h < 24; h++) {\r\n let hr = '';\r\n if (h < 10) {\r\n hr = `0${h}`;\r\n } else {\r\n hr = `${h}`;\r\n }\r\n const hrObj = {\r\n hour: hr,\r\n isStartHourSelected: false,\r\n isEndHourSelected: false\r\n };\r\n\r\n if (hr == this.startHour) {\r\n hrObj.isStartHourSelected = true;\r\n } else {\r\n hrObj.isStartHourSelected = false;\r\n }\r\n\r\n if (hr == this.endHour) {\r\n hrObj.isEndHourSelected = true;\r\n } else {\r\n hrObj.isEndHourSelected = false;\r\n }\r\n\r\n this.hours.push(hrObj);\r\n }\r\n }\r\n\r\n private fillMinutes() {\r\n this.minutes = [];\r\n for (let m = 0; m < 60; m++) {\r\n let min = '';\r\n if (m < 10) {\r\n min = `0${m}`;\r\n } else {\r\n min = `${m}`;\r\n }\r\n const minObj = {\r\n minute: min,\r\n isStartMinSelected: false,\r\n isEndMinSelected: false\r\n };\r\n if (min == this.startMinute) {\r\n minObj.isStartMinSelected = true;\r\n } else {\r\n minObj.isStartMinSelected = false;\r\n }\r\n\r\n if (min == this.endMinute) {\r\n minObj.isEndMinSelected = true;\r\n } else {\r\n minObj.isEndMinSelected = false;\r\n }\r\n\r\n this.minutes.push(minObj);\r\n }\r\n }\r\n\r\n public previousMonth() {\r\n this.calenderMonthDifference -= 1;\r\n this.populateCalendarWithChangedDays();\r\n }\r\n\r\n public nextMonth(): void {\r\n this.calenderMonthDifference += 1;\r\n this.populateCalendarWithChangedDays();\r\n }\r\n\r\n public getToday(initCalendar = false): void {\r\n this.currentFilter = DateRangeFilters.CurrentDay;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n this.picDays();\r\n const today = moment().format('D-M-YYYY');\r\n this.calenderMonthDifference = 0;\r\n this.populateCalendarWithChangedDays();\r\n this.selectDay(today, initCalendar);\r\n this.startDay = today;\r\n this.endDay = today;\r\n }\r\n\r\n private showCurrentDayCalender(): void {\r\n this.picDays();\r\n this.calenderMonthDifference = 0;\r\n this.populateCalendarWithChangedDays();\r\n }\r\n\r\n private populateCalendarWithChangedDays(): void {\r\n this.currentDate = moment().add(this.calenderMonthDifference, 'months').format('MMMM YYYY');\r\n this.changedMonth = parseInt(moment().add(this.calenderMonthDifference, 'months').format('M'), 10);\r\n this.changedYear = parseInt(moment().add(this.calenderMonthDifference, 'months').format('YYYY'), 10);\r\n this.monthString = moment().add(this.calenderMonthDifference, 'months').format('MMM');\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n\r\n public calendarDateSelected(id: string): void {\r\n this.currentFilter = DateRangeFilters.Custom;\r\n this.selectedSmartDate = DateRangeFilters.Custom.toString();\r\n $('.smart-dates a.current').removeClass('current');\r\n this.selectDay(id);\r\n }\r\n public selectDay(id: string, initCalendar: boolean = false): void {\r\n if (id === null || id === undefined) {\r\n this.calDates = [];\r\n this.error = 'Could not find selected day id!';\r\n return;\r\n }\r\n\r\n const index = this.selectedDays.indexOf(id);\r\n if (index != -1) {\r\n this.selectedDays.splice(index, 1);\r\n const pIndex = this.dayPeriods.indexOf(id);\r\n if (pIndex != -1) {\r\n this.dayPeriods.splice(pIndex, 1);\r\n }\r\n if (this.startDay == id) {\r\n this.startDay = null;\r\n } else if (this.endDay == id) {\r\n this.endDay = null;\r\n }\r\n } else {\r\n if (this.selectedDays.length == 2 || this.disableSmartDates) {\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n this.startDay = null;\r\n this.endDay = null;\r\n }\r\n if (this.startDay == null) {\r\n this.startDay = id;\r\n }\r\n if (this.endDay == null) {\r\n this.endDay = id;\r\n }\r\n this.selectedDays.push(id);\r\n }\r\n\r\n if (this.selectedDays.length == 1 || this.selectedDays.length == 0) {\r\n this.startDay = id;\r\n this.endDay = id;\r\n\r\n this.dayPeriods = [];\r\n this.selectedDays = [];\r\n\r\n this.dayPeriods.push(id);\r\n this.selectedDays.push(id);\r\n\r\n }\r\n if (this.selectedDays.length == 2) {\r\n let startDay = moment(this.selectedDays[0], 'D-M-YYYY');\r\n let endDay = moment(this.selectedDays[1], 'D-M-YYYY');\r\n let canContinue = false;\r\n if (endDay.isAfter(startDay)) {\r\n canContinue = true;\r\n } else {\r\n this.selectedDays = [];\r\n this.selectedDays.push(endDay.format('D-M-YYYY'));\r\n this.selectedDays.push(startDay.format('D-M-YYYY'));\r\n startDay = moment(this.selectedDays[0], 'D-M-YYYY');\r\n endDay = moment(this.selectedDays[1], 'D-M-YYYY');\r\n if (endDay.isAfter(startDay)) {\r\n canContinue = true;\r\n }\r\n }\r\n if (canContinue) {\r\n this.startDay = startDay.format('D-M-YYYY');\r\n this.endDay = endDay.format('D-M-YYYY');\r\n const dayAfterEndDay = endDay.add(1, 'day');\r\n let dayInBetween = moment(this.selectedDays[0], 'D-M-YYYY');\r\n this.dayPeriods = [];\r\n while (!dayInBetween.isSame(dayAfterEndDay)) {\r\n this.dayPeriods.push(dayInBetween.format('D-M-YYYY'));\r\n dayInBetween = dayInBetween.add(1, 'day');\r\n }\r\n }\r\n }\r\n\r\n\r\n this.makeDayString(initCalendar);\r\n this.populateCalendarWithChangedDays();\r\n }\r\n\r\n public picMonths(): void {\r\n this.hideCalBody();\r\n this.showMonths = true;\r\n }\r\n\r\n public picYears(): void {\r\n this.hideCalBody();\r\n this.showYears = true;\r\n }\r\n\r\n public picDays(): void {\r\n this.hideCalBody();\r\n this.showDays = true;\r\n }\r\n\r\n private hideCalBody(): void {\r\n this.showMonths = false;\r\n this.showDays = false;\r\n this.showYears = false;\r\n }\r\n\r\n public changeYear(year: string): void {\r\n if (year != null) {\r\n // We are changing the year\r\n this.changedYear = parseInt(year, 10);\r\n this.logService.colouredConsoleDebug(`currentDate: ${this.currentDate} - changedMonth: ${this.changedMonth} - changedYear: ${this.changedYear} - monthString: ${this.monthString}`);\r\n this.picMonths();\r\n } else {\r\n this.error = 'Could not find selected day id!';\r\n }\r\n\r\n }\r\n\r\n public changeMonth(month: string): void {\r\n if (month != null) {\r\n // We are changing the month\r\n this.changedMonth = parseInt(moment().month(month).format('M'), 10);\r\n // We are changing the month string\r\n this.monthString = month;\r\n this.logService.colouredConsoleDebug(`currentDate: ${this.currentDate} - changedMonth: ${this.changedMonth} - changedYear: ${this.changedYear} - monthString: ${this.monthString}`);\r\n\r\n let date1 = moment([this.changedYear, this.changedMonth, 1]);\r\n let date2 = moment([this.currentYear, this.currentMonth, 1]);\r\n\r\n if (date1 <= date2) {\r\n // Past date is chosen\r\n let monthsDiff = date2.diff(date1, 'months', true);\r\n this.calenderMonthDifference -= monthsDiff;\r\n } else {\r\n // Future date is chosen\r\n let monthsDiff = date1.diff(date2, 'months', true);\r\n this.calenderMonthDifference += monthsDiff;\r\n }\r\n\r\n\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n } else {\r\n this.error = 'Could not find selected day id!';\r\n }\r\n\r\n }\r\n\r\n public getYesterDay(): void {\r\n this.currentFilter = DateRangeFilters.PreviousDay;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const yesterday = moment().subtract(1, 'day').format('D-M-YYYY');\r\n this.startDay = null;\r\n this.endDay = null;\r\n this.selectDay(yesterday);\r\n this.startDay = yesterday;\r\n this.endDay = yesterday;\r\n this.showCurrentDayCalender();\r\n }\r\n\r\n public getThisWeek(): void {\r\n this.currentFilter = DateRangeFilters.CurrentWeek;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const firstDayOfWeek = moment().startOf('week').format('D-M-YYYY');\r\n const lastDayOfWeek = moment().endOf('week').format('D-M-YYYY');\r\n this.selectDay(firstDayOfWeek);\r\n this.selectDay(lastDayOfWeek);\r\n this.showCurrentDayCalender();\r\n }\r\n\r\n public lastWeek(): void {\r\n this.currentFilter = DateRangeFilters.PreviousWeek;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const firstDayOfWeekOfToday = moment().startOf('week');\r\n const firstDayOfWeek = firstDayOfWeekOfToday.subtract('1', 'week');\r\n const firstDayOfWeekStr = firstDayOfWeek.startOf('week').format('D-M-YYYY');\r\n const lastDayOfWeek = firstDayOfWeek.endOf('week').format('D-M-YYYY');\r\n this.selectDay(firstDayOfWeekStr);\r\n this.selectDay(lastDayOfWeek);\r\n const lastWeekMonth = firstDayOfWeek.startOf('week').format('M');\r\n const currentDayMonth = moment().format('M');\r\n // we need to check if last week month is before the current month calendar needs to\r\n // go to last month\r\n if (lastWeekMonth < currentDayMonth && this.changedMonth != lastWeekMonth) {\r\n this.previousMonth();\r\n }\r\n const lastWeekYear = firstDayOfWeek.startOf('week').format('YYYY');\r\n const currentDayYear = moment().format('YYYY');\r\n // we need to check if last week year is before the current year calendar needs to\r\n // go to last year\r\n if (lastWeekYear < currentDayYear && this.changedYear != lastWeekYear) {\r\n this.changedYear = lastWeekYear;\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n\r\n }\r\n\r\n public getThisMonth(): void {\r\n this.currentFilter = DateRangeFilters.CurrentMonth;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const firstDayOfMonth = moment().startOf('month').format('D-M-YYYY');\r\n const lastDayOfMonth = moment().endOf('month').format('D-M-YYYY');\r\n this.selectDay(firstDayOfMonth);\r\n this.selectDay(lastDayOfMonth);\r\n this.showCurrentDayCalender();\r\n }\r\n\r\n public getLastMonth(): void {\r\n this.currentFilter = DateRangeFilters.PreviousMonth;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const firstDayOfCurrentMonth = moment().startOf('month');\r\n const firstDayOfLastMonth = firstDayOfCurrentMonth.subtract('1', 'month');\r\n const firstDayOfLastMonthStr = firstDayOfLastMonth.format('D-M-YYYY');\r\n const lastDayOfLastMonth = firstDayOfCurrentMonth.endOf('month').format('D-M-YYYY');\r\n this.selectDay(firstDayOfLastMonthStr);\r\n this.selectDay(lastDayOfLastMonth);\r\n const prMonth = firstDayOfLastMonth.format('M');\r\n if (this.changedMonth != prMonth) {\r\n this.previousMonth();\r\n }\r\n }\r\n\r\n public getThisYear(): void {\r\n this.currentFilter = DateRangeFilters.CurrentYear;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n this.changedYear = this.currentYear;\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n const firstDayOfThisYear = moment().startOf('year').format('D-M-YYYY');\r\n const endDayOfThisYear = moment().endOf('year').format('D-M-YYYY');\r\n this.selectDay(firstDayOfThisYear);\r\n this.selectDay(endDayOfThisYear);\r\n this.showCurrentDayCalender();\r\n\r\n }\r\n\r\n public getLastYear(): void {\r\n this.currentFilter = DateRangeFilters.PreviousYear;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const firstDayOfLastYear = moment().startOf('year').subtract(1, 'year').format('D-M-YYYY');\r\n const endDayOfLastYear = moment().endOf('year').subtract(1, 'year').format('D-M-YYYY');\r\n this.selectDay(firstDayOfLastYear);\r\n this.selectDay(endDayOfLastYear);\r\n this.changedYear = this.currentYear - 1;\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n\r\n public getCurrentDayLastWeek(): void {\r\n this.currentFilter = DateRangeFilters.CurrentDayLastWeek;\r\n const currentDayInWeekDay = moment().weekday();\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const firstDayOfWeekOfToday = moment().startOf('week');\r\n const firstDayOfWeek = firstDayOfWeekOfToday.subtract('1', 'week');\r\n const currentDayLastWeek = firstDayOfWeek.startOf('week').add(currentDayInWeekDay, 'day').format('D-M-YYYY');\r\n this.selectDay(currentDayLastWeek);\r\n this.startDay = currentDayLastWeek;\r\n this.endDay = currentDayLastWeek;\r\n const lastWeekMonth = firstDayOfWeek.startOf('week').format('M');\r\n const currentDayMonth = moment().format('M');\r\n // we need to check if last week month is before the current month calendar needs to\r\n // go to last month\r\n if (lastWeekMonth < currentDayMonth && this.changedMonth != lastWeekMonth) {\r\n this.previousMonth();\r\n }\r\n const lastWeekYear = firstDayOfWeek.startOf('week').format('YYYY');\r\n const currentDayYear = moment().format('YYYY');\r\n // we need to check if last week year is before the current year calendar needs to\r\n // go to last year\r\n if (lastWeekYear < currentDayYear && this.changedYear != lastWeekYear) {\r\n this.changedYear = lastWeekYear;\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n }\r\n\r\n public getCurrentDayLastMonth(): void {\r\n this.currentFilter = DateRangeFilters.CurrentDayLastMonth;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const currentDayInWeekDay = moment().weekday();\r\n const firstDayOfCurrentMonth = moment().startOf('month');\r\n const lastDayOfMonth = moment().endOf('month');\r\n const currentDayWeekInMonth = moment().week() - moment().startOf('month').week();\r\n const lastMonthFistDay = firstDayOfCurrentMonth.subtract(1, 'month');\r\n const daysToAdd = (currentDayWeekInMonth * 7) + currentDayInWeekDay + 1;\r\n const currentDayLastMonth = lastMonthFistDay.add(daysToAdd, 'day');\r\n const currentDayLastMonthStr = currentDayLastMonth.format('D-M-YYYY');\r\n this.selectDay(currentDayLastMonthStr);\r\n this.startDay = currentDayLastMonthStr;\r\n this.endDay = currentDayLastMonthStr;\r\n\r\n if (this.changedMonth != currentDayLastMonth.format('M')) {\r\n this.previousMonth();\r\n }\r\n if (this.changedYear != currentDayLastMonth.format('YYYY')) {\r\n this.changedYear = currentDayLastMonth.format('YYYY');\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n }\r\n\r\n public getYesterdayDayLastWeek(): void {\r\n this.currentFilter = DateRangeFilters.PreviousDayLastWeek;\r\n const currentDayInWeekDay = moment().subtract(1, 'day').weekday();\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const firstDayOfWeekOfToday = moment().subtract(1, 'day').startOf('week');\r\n const firstDayOfWeek = firstDayOfWeekOfToday.subtract('1', 'week');\r\n const currentDayLastWeek = firstDayOfWeek.startOf('week').add(currentDayInWeekDay, 'day').format('D-M-YYYY');\r\n this.selectDay(currentDayLastWeek);\r\n this.startDay = currentDayLastWeek;\r\n this.endDay = currentDayLastWeek;\r\n const lastWeekMonth = firstDayOfWeek.startOf('week').format('M');\r\n const currentDayMonth = moment().subtract(1, 'day').format('M');\r\n // we need to check if last week month is before the current month calendar needs to\r\n // go to last month\r\n if (lastWeekMonth < currentDayMonth && this.changedMonth != lastWeekMonth) {\r\n this.previousMonth();\r\n }\r\n const lastWeekYear = firstDayOfWeek.startOf('week').format('YYYY');\r\n const currentDayYear = moment().subtract(1, 'day').format('YYYY');\r\n // we need to check if last week year is before the current year calendar needs to\r\n // go to last year\r\n if (lastWeekYear < currentDayYear && this.changedYear != lastWeekYear) {\r\n this.changedYear = lastWeekYear;\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n }\r\n\r\n public getCurrentDayLastYear(): void {\r\n this.currentFilter = DateRangeFilters.CurrentDayLastYear;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const today = moment();\r\n const currentDayLastYear = moment().subtract(1, 'year')\r\n .isoWeek(today.isoWeek())\r\n .isoWeekday(today.isoWeekday());\r\n\r\n this.selectDay(currentDayLastYear.format('D-M-YYYY'));\r\n this.startDay = currentDayLastYear;\r\n this.endDay = currentDayLastYear;\r\n if (this.changedMonth != currentDayLastYear.format('M')) {\r\n this.changedMonth = currentDayLastYear.format('M');\r\n }\r\n this.changedYear = currentDayLastYear.format('YYYY');\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n\r\n public getPreviousDayLastYear(): void {\r\n this.currentFilter = DateRangeFilters.PreviousDayLastYear;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const yesterday = moment().subtract(1, 'day');\r\n const currentDayLastYear = moment().subtract(1, 'year')\r\n .isoWeek(yesterday.isoWeek())\r\n .isoWeekday(yesterday.isoWeekday());\r\n\r\n this.selectDay(currentDayLastYear.format('D-M-YYYY'));\r\n this.startDay = currentDayLastYear;\r\n this.endDay = currentDayLastYear;\r\n if (this.changedMonth != currentDayLastYear.format('M')) {\r\n this.changedMonth = currentDayLastYear.format('M');\r\n }\r\n this.changedYear = currentDayLastYear.format('YYYY');\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n\r\n public getYesterdayDayLastMonth(): void {\r\n this.currentFilter = DateRangeFilters.PreviousDayLastMonth;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n const currentDayInWeekDay = moment().subtract(1, 'day').weekday();\r\n const firstDayOfCurrentMonth = moment().subtract(1, 'day').startOf('month');\r\n const lastDayOfMonth = moment().subtract(1, 'day').endOf('month');\r\n const currentDayWeekInMonth = moment().subtract(1, 'day').week() - moment().subtract(1, 'day').startOf('month').week();\r\n const lastMonthFistDay = firstDayOfCurrentMonth.subtract(1, 'month');\r\n const daysToAdd = (currentDayWeekInMonth * 7) + currentDayInWeekDay + 1;\r\n const currentDayLastMonth = lastMonthFistDay.add(daysToAdd, 'day');\r\n const currentDayLastMonthStr = currentDayLastMonth.format('D-M-YYYY');\r\n this.selectDay(currentDayLastMonthStr);\r\n this.startDay = currentDayLastMonthStr;\r\n this.endDay = currentDayLastMonthStr;\r\n\r\n if (this.changedMonth != currentDayLastMonth.format('M')) {\r\n this.previousMonth();\r\n }\r\n if (this.changedYear != currentDayLastMonth.format('YYYY')) {\r\n this.changedYear = currentDayLastMonth.format('YYYY');\r\n this.populateCalendar(this.changedMonth, this.changedYear);\r\n }\r\n }\r\n\r\n public customDate(): void {\r\n this.currentFilter = DateRangeFilters.Custom;\r\n this.selectedDays = [];\r\n this.dayPeriods = [];\r\n this.picDays();\r\n }\r\n\r\n public selectTimeHour(hour: string, isStart: boolean): void {\r\n if (isStart) {\r\n this.startHour = hour;\r\n } else if (!isStart) {\r\n this.endHour = hour;\r\n }\r\n this.fillHours();\r\n this.makeTimeString();\r\n }\r\n\r\n private makeDayString(initCalendar: boolean = false): void {\r\n // when we initialize the calendar we set the current filter to CurrentDay\r\n // and select/highlight today. We need to emit the event using setTimeOut\r\n // else the filter component event receiver will receive the value and try\r\n // to send the changed value via the dayPeriod and this will result in a\r\n // ExpressionChangedAfterItHasBeenChecked error\r\n if (initCalendar) {\r\n setTimeout(() => this.dayPeriodChange.emit(this.currentFilter), 0);\r\n return;\r\n }\r\n if (this.currentFilter == DateRangeFilters.Custom) {\r\n this.dayPeriod = this.disableSmartDates ? this.startDay : `${this.startDay}|${this.endDay}`;\r\n this.dayPeriodChange.emit(this.dayPeriod);\r\n } else {\r\n this.dayPeriodChange.emit(this.currentFilter);\r\n }\r\n }\r\n\r\n private makeTimeString(): void {\r\n this.timePeriod = `${this.startHour}:${this.startMinute}|${this.endHour}:${this.endMinute}`;\r\n this.timePeriodChange.emit(this.timePeriod);\r\n }\r\n\r\n public selectTimeMinute(minute: string, isStart: boolean): void {\r\n if (isStart) {\r\n this.startMinute = minute;\r\n } else if (!isStart) {\r\n this.endMinute = minute;\r\n }\r\n\r\n this.fillMinutes();\r\n this.makeTimeString();\r\n }\r\n\r\n public getAllDay(): void {\r\n this.selectTimeHour('00', true);\r\n this.selectTimeMinute('00', true);\r\n this.selectTimeHour('23', false);\r\n this.selectTimeMinute('59', false);\r\n }\r\n\r\n public get DateRangeFilters() {\r\n return DateRangeFilters;\r\n }\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n public resize(event) {\r\n const width = window.innerWidth;\r\n if (width <= 768) {\r\n this.isSmallScreen = true;\r\n } else {\r\n this.isSmallScreen = false;\r\n }\r\n\r\n if (width < 303) {\r\n let scale = Math.min(width / 350);\r\n //scale = scale + 0.1;\r\n this.scale = `scale(${scale.toFixed(2)})`;\r\n } else {\r\n this.scale = null;\r\n }\r\n }\r\n}\r\nenum DateRangeFilters {\r\n Custom = 'Custom',\r\n CurrentDay = 'CurrentDay',\r\n PreviousDay = 'PreviousDay',\r\n CurrentWeek = 'CurrentWeek',\r\n PreviousWeek = 'PreviousWeek',\r\n //CurrentPayPeriod = 'CurrentPayPeriod',\r\n //PreviousPayPeriod = 'PreviousPayPeriod',\r\n CurrentMonth = 'CurrentMonth',\r\n PreviousMonth = 'PreviousMonth',\r\n CurrentYear = 'CurrentYear',\r\n PreviousYear = 'PreviousYear',\r\n CurrentDayLastWeek = 'CurrentDayLastWeek',\r\n CurrentDayLastMonth = 'CurrentDayLastMonth',\r\n PreviousDayLastWeek = 'PreviousDayLastWeek',\r\n PreviousDayLastMonth = 'PreviousDayLastMonth',\r\n CurrentDayLastYear = 'CurrentDayLastYear',\r\n PreviousDayLastYear = 'PreviousDayLastYear'\r\n}\r\n","@if (!isInline) {\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Hang tight while we sync your information
\r\n\r\n} @else {\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n}\r\n\r\n","import {Component, Input, OnInit} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-loading-animation',\r\n templateUrl: './loading-animation.component.html',\r\n styleUrls: ['./loading-animation.component.css']\r\n})\r\nexport class LoadingAnimationComponent implements OnInit {\r\n @Input() width: number;\r\n @Input() height: number;\r\n @Input() isInline: boolean;\r\n constructor() {\r\n if (this.width == undefined) {\r\n this.width = 80;\r\n }\r\n if (this.height == undefined) {\r\n this.height = 80;\r\n }\r\n if (this.isInline == undefined) {\r\n this.isInline = false;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","
\r\n
\r\n \r\n
\r\n Undo\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{autoFocus()}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
-1}\" (click)=\"select(item)\">\r\n \r\n {{item.name}}\r\n
\r\n
\r\n
\r\n\r\n\r\n","import {Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild} from '@angular/core';\r\nimport {SilverWareArrays} from '../shared/services/SilverWareArrays';\r\nimport {NameValueIcon} from '../shared/types/name-value-icon';\r\nimport {CommonService} from '../shared/services/common.service';\r\n\r\n@Component({\r\n selector: 'app-select-list',\r\n templateUrl: './select-list.component.html',\r\n styleUrls: ['./select-list.component.css']\r\n})\r\nexport class SelectListComponent implements OnInit, OnDestroy {\r\n private selected: NameValueIcon[] = [];\r\n private undoSelected: NameValueIcon[] = null;\r\n @Input() set listArray(list: NameValueIcon[]) {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(list))\r\n return;\r\n\r\n this.list = this.commonService.cloneDeep(list);\r\n SilverWareArrays.sortAsc(this.list, 'name');\r\n this.mainList = this.commonService.cloneDeep(this.list);\r\n this.highlightSelectedItems();\r\n }\r\n @Input() set selectedItems(values: NameValueIcon[]) {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(values))\r\n return;\r\n\r\n if (this.undoSelected == null) {\r\n this.undoSelected = this.commonService.cloneDeep(values);\r\n }\r\n this.selectedItemsString = this.commonService.cloneDeep(values);\r\n this.highlightSelectedItems();\r\n }\r\n public list: NameValueIcon[] = [];\r\n private mainList: NameValueIcon[] = [];\r\n private selectedItemsString: NameValueIcon[] = [];\r\n @Input() set showSearchBar(show: boolean) {\r\n this.searchBar = show;\r\n if (!show) {\r\n this.searchText = null;\r\n this.filterList();\r\n }\r\n }\r\n @Input() defaultValue: NameValueIcon = null;\r\n @Input() allowMultiSelect: boolean = false;\r\n @Output()\r\n selectedItemsChange = new EventEmitter();\r\n public searchText: string = null;\r\n public searchBar: boolean = false;\r\n @ViewChild('searchbar') searchbar: ElementRef;\r\n constructor(public commonService: CommonService) { }\r\n\r\n ngOnInit(): void {}\r\n ngOnDestroy(): void {\r\n this.undoSelected = null;\r\n }\r\n\r\n public setToDefault(): void {\r\n this.selected = [];\r\n this.select(this.defaultValue);\r\n }\r\n\r\n private highlightSelectedItems(): void {\r\n this.selected = [];\r\n // If we selecte all the items in the master list\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(this.list) && this.selectedItemsString.length === this.mainList.length - 1 ) {\r\n // They selected all and all is not default\r\n this.selected.push(this.commonService.ALL_LIST_ITEM);\r\n } else {\r\n SilverWareArrays.forEach(this.selectedItemsString, (item: NameValueIcon): void => {\r\n if (item != null) {\r\n this.selected.push({name: item.name, value: item.value});\r\n }\r\n\r\n });\r\n }\r\n }\r\n public autoFocus(): void {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(this.searchbar)) {\r\n return;\r\n }\r\n\r\n this.searchbar.nativeElement.focus();\r\n\r\n }\r\n\r\n public filterList(): void {\r\n if (this.searchText != null && this.searchText.trim() != '') {\r\n const result = SilverWareArrays.where(this.mainList, (item: NameValueIcon): boolean => {\r\n return item.name.toLowerCase().indexOf(this.searchText.toLowerCase()) > -1;\r\n });\r\n this.list = result;\r\n } else {\r\n this.list = this.mainList;\r\n }\r\n\r\n }\r\n\r\n public undo(): void {\r\n this.selected = [];\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(this.undoSelected) && this.commonService.isNotNullAndUndefinedAndEmpty(this.list) && this.undoSelected.length === this.mainList.length - 1) {\r\n // They selected all and all is not default\r\n this.selected.push(this.commonService.ALL_LIST_ITEM);\r\n } else {\r\n SilverWareArrays.forEach(this.undoSelected, (item: NameValueIcon): void => {\r\n this.selected.push({name: item.name, value: item.value});\r\n });\r\n }\r\n }\r\n\r\n public select(item: NameValueIcon): void {\r\n if (this.allowMultiSelect) {\r\n if (item.value === this.commonService.ALL_LIST_ITEM.value) {\r\n this.selected = [];\r\n this.selected.push(item);\r\n } else {\r\n const allindex = this.isSelected(this.commonService.ALL_LIST_ITEM.value);\r\n if (allindex > -1) {\r\n this.selected.splice(allindex, 1);\r\n }\r\n const index = this.isSelected(item.value);\r\n if (index > -1) {\r\n this.selected.splice(index, 1);\r\n } else {\r\n this.selected.push(item);\r\n }\r\n }\r\n\r\n } else {\r\n this.selected = [];\r\n this.selected.push(item);\r\n }\r\n this.returnSelectedItems();\r\n }\r\n\r\n public isSelected(value: string): number {\r\n return this.selected.findIndex(x => x.value === value);\r\n }\r\n\r\n get isAllSelected(): boolean {\r\n return this.selected.length === 1 && this.selected[0].value === this.commonService.ALL_LIST_ITEM.value;\r\n }\r\n\r\n private returnSelectedItems(): void {\r\n this.selectedItemsChange.emit(this.selected.length > 0 ? this.selected : null);\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'addWhiteSpace'\r\n})\r\nexport class AddWhiteSpacePipe implements PipeTransform {\r\n\r\n transform(text: string, separator: string = ' '): string {\r\n if (text != null && typeof text == \"string\") {\r\n let words = text.split(/(?=[A-Z])/);\r\n if (words.length > 1) {\r\n return words.join(separator);\r\n }\r\n words = text.split(/[.\\-_]/);\r\n if (words.length > 1) {\r\n return words.join(separator);\r\n }\r\n return text;\r\n }\r\n return text;\r\n }\r\n\r\n}\r\n","
\r\n \r\n
1\">\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 {{pr.displayName}}\r\n
{{getModifiedValue(pr) | addWhiteSpace}}
\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 {{pr.displayName}}\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
1\" class=\"d-flex justify-content-center flex-wrap\" id=\"compareDots\">\r\n \r\n \r\n\r\n \r\n \r\n
\r\n
\r\n
\r\n
    \r\n
  • + Comparison
  • \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n","import { Component, Input, OnInit} from '@angular/core';\r\nimport { SilverWareArrays } from '../../shared/services/SilverWareArrays';\r\nimport { DatabitParameter, DatabitParameterType } from '../../shared/interfaces/DatabitParameter';\r\nimport { DatabitService } from '../../shared/services/databit.service';\r\nimport { DatabitParameterValue } from '../../shared/interfaces/DatabitParameterValue';\r\nimport { animate, state, style, transition, trigger } from '@angular/animations';\r\nimport { ModalService } from '../../shared/services/modal.service';\r\nimport { PageService } from '../../shared/services/page.service';\r\n\r\nimport { SilverWareIcons } from '../../shared/services/SilverWareIcons';\r\nimport { HammerjsService } from '../../shared/services/hammerjs.service';\r\nimport { HAMMER_GESTURE_CONFIG } from '@angular/platform-browser';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {NameValueIcon} from '../../shared/types/name-value-icon';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n@Component({\r\n selector: 'app-filter-options',\r\n templateUrl: './filter-options.component.html',\r\n styleUrls: ['./filter-options.component.css'],\r\n animations: [\r\n trigger('childAnimation', [\r\n // ...\r\n state('open', style({\r\n opacity: 1,\r\n })),\r\n state('closed', style({\r\n opacity: 0,\r\n })),\r\n transition('* => *', [\r\n animate('.7s')\r\n ]),\r\n ]),\r\n trigger(\r\n 'inOutAnimation',\r\n [\r\n transition(\r\n ':enter',\r\n [\r\n style({ visibility: 'hidden', opacity: 0 }),\r\n animate('.7s ease-out',\r\n style({ visibility: 'visible', opacity: 1 }))\r\n ]\r\n ),\r\n transition(\r\n ':leave',\r\n [\r\n style({ visibility: 'visible', opacity: 1 }),\r\n animate('0s',\r\n style({ visibility: 'hidden', opacity: 0 }))\r\n ]\r\n )\r\n ]\r\n )\r\n ],\r\n providers: [\r\n {\r\n provide: HAMMER_GESTURE_CONFIG,\r\n useClass: HammerjsService\r\n }\r\n ]\r\n})\r\n\r\nexport class FilterOptionsComponent implements OnInit {\r\n @Input() databitsParameterValues = [];\r\n @Input() databitsParameters = [];\r\n @Input() currentDatabit = '';\r\n @Input() databitsCollection: string[] = [];\r\n @Input() storeId = '';\r\n @Input() comparisonsValues = [];\r\n @Input() showCompare = false;\r\n public parametersDetails = [];\r\n public hiddenParametersDetails = [];\r\n public comparisons = [];\r\n public openPar = 'all';\r\n private modalDefaultButtons = [];\r\n private expandedFilterSelectedValue = null;\r\n public showSearch = false;\r\n public storeLocation: StoreLocationInfo = {\r\n name: 'storeID',\r\n displayName: 'Store Location',\r\n availableValues: null,\r\n defaultValue: null,\r\n isToggled: false, // for toggle arrows\r\n isLoading: false, // for loading animation\r\n selectedValues: null // current selected value\r\n };\r\n\r\n public currentComparisonIndex = 0;\r\n\r\n constructor(private databitService: DatabitService, private modalService: ModalService, private pageService: PageService,\r\n public commonService: CommonService, private logService: LogService) { }\r\n\r\n ngOnInit(): void {\r\n this.modalDefaultButtons = this.modalService.modalCustomButtons;\r\n const currentStore = this.pageService.getStoreInfo(this.storeId);\r\n if (currentStore != null) {\r\n this.storeLocation.selectedValues = [{ name: currentStore.name, value: currentStore.id }];\r\n } else {\r\n this.storeLocation.selectedValues = [{ name: 'Store Name', value: this.storeId }];\r\n }\r\n const sortDateAndTime = [];\r\n const sortRest = [];\r\n const sortByValue = [];\r\n const databitValueNames = [];\r\n\r\n // Default date if it is not set\r\n const defaultDate = {\r\n name: 'DateRange',\r\n value: 'CurrentDay'\r\n };\r\n\r\n // Copy our comparisons\r\n if (this.comparisonsValues != null && this.comparisonsValues.length > 0) {\r\n for (let i = 0; i < this.comparisonsValues.length; i++) {\r\n this.comparisons.push(this.comparisonsValues[i]);\r\n this.comparisons[i].parametersDetails = this.commonService.cloneDeep(this.comparisonsValues[i].parametersDetails);\r\n }\r\n }\r\n\r\n // Fill our array of param names that we have values for\r\n for (let i = 0; i < this.databitsParameterValues.length; i++) {\r\n databitValueNames.push(this.databitsParameterValues[i].name);\r\n }\r\n\r\n // If we don't have our date range add the default\r\n const indexOfValue = databitValueNames.indexOf('DateRange');\r\n if (indexOfValue == -1) {\r\n this.databitsParameterValues.push(defaultDate);\r\n databitValueNames.push(defaultDate.name);\r\n }\r\n\r\n // Making a custom Array of Databits Parameters.\r\n SilverWareArrays.forEach(this.databitsParameters, (databitParam: DatabitParameter): void => {\r\n // If we save the Parameter before get the value and store it\r\n if (databitParam.defaultValue != null) {\r\n if (databitParam.defaultValue.name === this.commonService.ALL_LIST_ITEM.name) {\r\n databitParam.defaultValue.value = this.commonService.ALL_LIST_ITEM.value;\r\n }\r\n }\r\n const savedParameterValue = SilverWareArrays.firstOrDefault(this.databitsParameterValues, (pv: DatabitParameterValue) => pv.name == databitParam.name);\r\n let savedSelectedValue = null;\r\n // If we found the save parameter put it's value as selected value\r\n if (savedParameterValue != null) {\r\n // If it's boolean we need to convert it\r\n if (databitParam.type == this.DatabitParameterType.Boolean) {\r\n const valueToPars = JSON.parse(savedParameterValue.value);\r\n savedSelectedValue = this.convertToBoolean(valueToPars.Value);\r\n } else if (databitParam.type == this.DatabitParameterType.List || databitParam.type == this.DatabitParameterType.Collection) {\r\n if (savedParameterValue.value == null) {\r\n savedSelectedValue = [this.commonService.ALL_LIST_ITEM];\r\n } else {\r\n savedSelectedValue = JSON.parse(savedParameterValue.value);\r\n }\r\n\r\n } else if (databitParam.type == this.DatabitParameterType.TimeRange || databitParam.type == this.DatabitParameterType.DateRange) {\r\n savedSelectedValue = savedParameterValue.value;\r\n } else {\r\n savedSelectedValue = JSON.parse(savedParameterValue.value);\r\n }\r\n\r\n // Otherwise get the default value and put it to the selectedValue\r\n } else if (databitParam.defaultValue != null) {\r\n if (databitParam.type == this.DatabitParameterType.Boolean) {\r\n savedSelectedValue = this.convertToBoolean(databitParam.defaultValue.value);\r\n } else if (databitParam.type == this.DatabitParameterType.List || databitParam.type == this.DatabitParameterType.Collection) {\r\n savedSelectedValue = [{ Name: databitParam.defaultValue.name, Value: databitParam.defaultValue.value }];\r\n } else {\r\n savedSelectedValue = databitParam.defaultValue.value;\r\n }\r\n }\r\n\r\n if (databitParam.type === DatabitParameterType.Integer) {\r\n if (savedSelectedValue == null || savedSelectedValue === '') {\r\n savedSelectedValue = { Name: databitParam.name, Value: '' };\r\n }\r\n }\r\n\r\n const databitParamObject = {\r\n name: databitParam.name,\r\n displayName: databitParam.displayName,\r\n type: databitParam.type,\r\n availableValues: databitParam.availableValues,\r\n defaultValue: databitParam.defaultValue,\r\n isArray: databitParam.isArray,\r\n isToggled: false, // for toggle arrows\r\n isLoading: false, // for loading animation\r\n selectedValue: savedSelectedValue // current selected value\r\n };\r\n\r\n if (databitParam.type == DatabitParameterType.DateRange || databitParam.type == DatabitParameterType.TimeRange) {\r\n sortDateAndTime.push(databitParamObject);\r\n } else {\r\n sortRest.push(databitParamObject);\r\n }\r\n\r\n });\r\n\r\n // Values sorted normally\r\n const preSortByValue = sortDateAndTime.concat(sortRest);\r\n\r\n const preSortLength = preSortByValue.length;\r\n\r\n // Look through our params and push any we have a value for\r\n // The rest will be hidden for now\r\n let offSet = 0;\r\n for (let i = 0; i < preSortLength; i++) {\r\n\r\n const indexOfValue = databitValueNames.indexOf(preSortByValue[i - offSet].name);\r\n if (indexOfValue > -1) {\r\n sortByValue.push(preSortByValue[i - offSet]);\r\n preSortByValue.splice(i - offSet, 1);\r\n offSet++;\r\n }\r\n }\r\n\r\n const allParamDetails = sortByValue.concat(preSortByValue);\r\n\r\n // Add the button that will show the hidden params\r\n if (preSortByValue.length > 0) {\r\n sortByValue.push({\r\n name: \"MoreFilters\",\r\n displayName: \"More Filters\",\r\n type: DatabitParameterType.MoreFilters\r\n });\r\n }\r\n\r\n this.parametersDetails = sortByValue;\r\n this.hiddenParametersDetails = preSortByValue;\r\n\r\n // Set up our comparisons param values\r\n if (this.comparisons != null && this.comparisons.length > 0) {\r\n\r\n // The compareison who's params we will be setting up\r\n SilverWareArrays.forEach(this.comparisons, (comparison: any): void => {\r\n\r\n comparison.hiddenParametersDetails = [];\r\n\r\n // Copy before clearing our param details\r\n const compareParams = this.commonService.cloneDeep(comparison.parametersDetails);\r\n comparison.parametersDetails = [];\r\n\r\n // The params to compare against\r\n SilverWareArrays.forEach(allParamDetails, (paramDetail: any) => {\r\n\r\n // Get the param\r\n const compareParam = SilverWareArrays.firstOrDefault(compareParams, (compareParamDetail: any) => { return compareParamDetail.name == paramDetail.name; });\r\n\r\n // Get the param's name\r\n const valueName = SilverWareArrays.firstOrDefault(databitValueNames, (x: string) => { return x == paramDetail.name; });\r\n\r\n // Make a copy of our param\r\n const paramDeatilCopy = this.commonService.cloneDeep(paramDetail);\r\n\r\n // If we don't have this param in our comparison add it to the hidding params\r\n if (compareParam == null || valueName == null) {\r\n comparison.hiddenParametersDetails.push(paramDeatilCopy);\r\n }\r\n\r\n // Otherwise update the value and then add it\r\n else {\r\n if (Array.isArray(paramDeatilCopy.selectedValue)) {\r\n paramDeatilCopy.selectedValue = JSON.parse(compareParam.value);\r\n }\r\n else {\r\n paramDeatilCopy.selectedValue = compareParam.value;\r\n }\r\n\r\n comparison.parametersDetails.push(paramDeatilCopy);\r\n }\r\n\r\n });\r\n\r\n // Add the more filters param if missing\r\n const compareParam = SilverWareArrays.firstOrDefault(comparison.parametersDetails, (compareParamDetail: any) => { return compareParamDetail.type == DatabitParameterType.MoreFilters; });\r\n\r\n if (compareParam == null && comparison.hiddenParametersDetails.length > 0) {\r\n comparison.parametersDetails.push({\r\n name: \"MoreFilters\",\r\n displayName: \"More Filters\",\r\n type: DatabitParameterType.MoreFilters\r\n });\r\n }\r\n });\r\n\r\n // Set the comparison to the first one\r\n this.changeComparison(0);\r\n }\r\n }\r\n\r\n parameterIcon(key: string): string {\r\n return SilverWareIcons.databitParametersIcon(key);\r\n }\r\n // get function. will allow to access the DatabitParameterType in HTML\r\n get DatabitParameterType() {\r\n return DatabitParameterType;\r\n }\r\n\r\n private uniqueParamValues(apiParamValues, paramValues): void {\r\n let unique = paramValues.map((i) => i.name);\r\n for (let i = 0; i < apiParamValues.length; i++) {\r\n if (unique.indexOf(apiParamValues[i].name) === -1) {\r\n unique.push(apiParamValues[i].name);\r\n paramValues.push(apiParamValues[i]);\r\n }\r\n }\r\n }\r\n\r\n private getDataBitParamValuesAndRunFilter(databit, param, storedId, runUniqueFilter): void {\r\n this.databitService.getDatabitParameterValues(databit, param.name, this.storeId).subscribe({\r\n next: response => {\r\n if (response.success === true) {\r\n if (response.parameterValues != null) {\r\n if (runUniqueFilter) {\r\n this.uniqueParamValues(response.parameterValues, param.availableValues);\r\n }\r\n else {\r\n param.availableValues = response.parameterValues;\r\n }\r\n // Added to fix the some of the parameters that the default value was All but the availableValues didn't have All\r\n if (param.type == this.DatabitParameterType.List) {\r\n const allExists = SilverWareArrays.firstOrDefault(response.parameterValues,\r\n (pVal: DatabitParameterValue) => pVal.name === this.commonService.ALL_LIST_ITEM.name);\r\n if (allExists == null) {\r\n response.parameterValues.push(this.commonService.ALL_LIST_ITEM);\r\n } else {\r\n allExists.value = this.commonService.ALL_LIST_ITEM.value;\r\n }\r\n }\r\n }\r\n } else {\r\n this.logService.error(response.message);\r\n }\r\n param.isLoading = false;\r\n }, error: err => {\r\n param.isLoading = false;\r\n this.logService.error(this.commonService.flattenErrorMessages(err));\r\n }\r\n });\r\n }\r\n // Sends the request to get the DatabitParameterValues\r\n getParameterValues(parameterName: string): void {\r\n\r\n // Finding the passed parameter. If we find it we will check if it has availableValues\r\n // If passed parameter does not have availableValues we show loading animation and send the request to get availableValues\r\n const param = SilverWareArrays.firstOrDefault(this.parametersDetails, (pr: any) => pr.name == parameterName);\r\n if (param != null) {\r\n\r\n // If more filters is selected show hidden params and remove the more filters button\r\n if (param.type === DatabitParameterType.MoreFilters) {\r\n this.parametersDetails.splice(this.parametersDetails.length - 1);\r\n this.parametersDetails = this.parametersDetails.concat(this.hiddenParametersDetails);\r\n\r\n if (this.comparisons.length > 0) {\r\n this.comparisons[this.currentComparisonIndex].parametersDetails = this.parametersDetails;\r\n }\r\n }\r\n else {\r\n param.isToggled = !param.isToggled;\r\n if (param.isToggled) {\r\n // Hide the search Bar\r\n this.showSearch = false;\r\n this.openPar = parameterName;\r\n this.expandedFilterSelectedValue = param.selectedValue;\r\n if (param.availableValues == null) {\r\n param.availableValues = [];\r\n param.isLoading = true;\r\n if (this.databitsCollection.length > 0) {\r\n if (param.type === DatabitParameterType.DateRange) {\r\n this.getDataBitParamValuesAndRunFilter(this.databitsCollection[0], param, this.storeId, false);\r\n }\r\n this.databitsCollection.forEach((databit, index) => {\r\n this.getDataBitParamValuesAndRunFilter(databit, param, this.storeId, true)\r\n });\r\n }\r\n else {\r\n this.getDataBitParamValuesAndRunFilter(this.currentDatabit, param, this.storeId, false);\r\n }\r\n }\r\n\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n this.getParameterValues(parameterName);\r\n },\r\n label: 'Apply',\r\n isDismiss: false,\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const cancelBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n param.selectedValue = this.expandedFilterSelectedValue;\r\n this.updateParameterValues(parameterName, param.selectedValue);\r\n this.getParameterValues(parameterName);\r\n },\r\n label: 'Dismiss',\r\n isDismiss: false,\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.hideDismissBtn = true;\r\n this.modalService.modalCustomButtons = [cancelBtn, saveBtn];\r\n } else {\r\n this.openPar = 'all';\r\n this.modalService.hideDismissBtn = false;\r\n this.modalService.modalCustomButtons = this.modalDefaultButtons;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Event Listener on changing the Parameters Value\r\n updateParameterValues(parameterName, paramValue) {\r\n // TODO: need to take care of multiple selected list and see how we store other type ex: text, percentage and ...\r\n const param = SilverWareArrays.firstOrDefault(this.parametersDetails, (pr: any) => pr.name == parameterName);\r\n if (param != null) {\r\n const index = SilverWareArrays.indexOf(this.databitsParameterValues, (pv: DatabitParameterValue) => pv.name == param.name);\r\n // Boolean value need to converted to string DatabitParameterValue holds name: string, value: string\r\n // if they select databit parameter default value we remove it from the parameter value\r\n if (param.type === this.DatabitParameterType.List || param.type === this.DatabitParameterType.Collection) {\r\n const isAllSelected = SilverWareArrays.firstOrDefault(param.selectedValue, (sl: any) => { return sl.Value === this.commonService.ALL_LIST_ITEM.value; });\r\n\r\n let listSelectedItems = param.selectedValue.filter(x => x.value != undefined);\r\n if (isAllSelected) {\r\n listSelectedItems = [];\r\n SilverWareArrays.forEach(param.availableValues, (pv: DatabitParameterValue) => {\r\n if (pv.value !== this.commonService.ALL_LIST_ITEM.value) {\r\n listSelectedItems.push({ Name: pv.name, Value: pv.value });\r\n }\r\n });\r\n }\r\n\r\n if (isAllSelected && param.defaultValue.value === this.commonService.ALL_LIST_ITEM.value) {\r\n if (index > -1) {\r\n this.databitsParameterValues.splice(index, 1);\r\n }\r\n } else {\r\n if (index === -1 && param.selectedValue != null && param.selectedValue[0].Value != param.defaultValue.value) {\r\n this.databitsParameterValues.push({ name: param.name, value: JSON.stringify(listSelectedItems) });\r\n\r\n } else if (index > -1 && param.selectedValue != null && param.selectedValue[0].Value != param.defaultValue.value) {\r\n this.databitsParameterValues[index].value = JSON.stringify(listSelectedItems);\r\n\r\n } else if (index > -1 && (param.selectedValue == null || param.selectedValue[0].Value == param.defaultValue.value)) {\r\n this.databitsParameterValues.splice(index, 1);\r\n\r\n }\r\n }\r\n }\r\n else if (param.type === this.DatabitParameterType.DateRange || param.type === this.DatabitParameterType.TimeRange || param.type === this.DatabitParameterType.Date) {\r\n param.selectedValue = paramValue;\r\n if (index === -1 && param.selectedValue != null) {\r\n this.databitsParameterValues.push({ name: param.name, value: param.selectedValue });\r\n\r\n } else if (index > -1 && param.selectedValue != null) {\r\n this.databitsParameterValues[index].value = param.selectedValue;\r\n\r\n } else if (index > -1 && (param.selectedValue == null || param.selectedValue === param.defaultValue)) {\r\n this.databitsParameterValues.splice(index, 1);\r\n }\r\n }\r\n else if (param.type === this.DatabitParameterType.Integer) {\r\n const objectToSave = { Name: param.name, Value: param.selectedValue != null && param.selectedValue.Value != null ? param.selectedValue.Value.toString() : null };\r\n if (index === -1 && param.selectedValue != null) {\r\n this.databitsParameterValues.push({ name: param.name, value: JSON.stringify(objectToSave) });\r\n\r\n } else if (index > -1 && param.selectedValue != null) {\r\n this.databitsParameterValues[index].value = JSON.stringify(objectToSave);\r\n\r\n } else if (index > -1 && (param.selectedValue == null || param.selectedValue === param.defaultValue)) {\r\n this.databitsParameterValues.splice(index, 1);\r\n }\r\n }\r\n else {\r\n const objectToSave = { Name: param.name, Value: param.selectedValue != null ? param.selectedValue.toString() : null };\r\n if (index === -1 && param.selectedValue != null) {\r\n this.databitsParameterValues.push({ name: param.name, value: JSON.stringify(objectToSave) });\r\n\r\n } else if (index > -1 && param.selectedValue != null) {\r\n this.databitsParameterValues[index].value = JSON.stringify(objectToSave);\r\n\r\n } else if (index > -1 && (param.selectedValue == null || param.selectedValue === param.defaultValue)) {\r\n this.databitsParameterValues.splice(index, 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Convert boolean string to boolean\r\n convertToBoolean(value: string) {\r\n if (value.trim() === 'true') {\r\n return true;\r\n } else if (value.trim() === 'false') {\r\n return false;\r\n }\r\n }\r\n getModifiedValue(parameter: any) {\r\n if (parameter != null) {\r\n if (parameter.type == this.DatabitParameterType.Boolean) {\r\n if (parameter.defaultValue != parameter.selectedValue) {\r\n let str = 'Disable';\r\n if (parameter.selectedValue) {\r\n str = 'Active';\r\n }\r\n return str;\r\n }\r\n } else if (parameter.type == this.DatabitParameterType.List || parameter.type == this.DatabitParameterType.Collection) {\r\n const found = SilverWareArrays.firstOrDefault(parameter.selectedValue, (item: any) => item.Value == parameter.defaultValue.value);\r\n if (found == null) {\r\n const names = [];\r\n SilverWareArrays.forEach(parameter.selectedValue, (item: any) => { names.push(item.name); });\r\n return names.join(', ');\r\n }\r\n } else if (parameter.type == this.DatabitParameterType.TimeRange) {\r\n if (parameter.defaultValue != parameter.selectedValue) {\r\n return parameter.selectedValue.replace('|', ' To ');\r\n }\r\n } else if (parameter.type == this.DatabitParameterType.Integer) {\r\n if (parameter.defaultValue != parameter.selectedValue && parameter.selectedValue.Value != null && parameter.selectedValue.Value !== '') {\r\n return parameter.selectedValue.Value\r\n }\r\n } else {\r\n if (parameter.defaultValue != parameter.selectedValue) {\r\n return parameter.selectedValue;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n getStoreLocations() {\r\n this.storeLocation.isToggled = !this.storeLocation.isToggled;\r\n this.expandedFilterSelectedValue = this.storeLocation.selectedValues;\r\n this.openPar = this.storeLocation.name;\r\n if (this.storeLocation.isToggled) {\r\n if (this.storeLocation.availableValues == null) {\r\n this.storeLocation.isLoading = true;\r\n const stores: NameValueIcon[] = this.pageService.getChainStores(this.pageService.chainID).map(store => ({ name: store.name, value: store.id, icon: 'fas fa-store-alt' }));\r\n this.storeLocation.availableValues = stores;\r\n this.storeLocation.isLoading = false;\r\n }\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n this.getStoreLocations();\r\n this.updateStoreLocation(true);\r\n },\r\n label: 'Apply',\r\n isDismiss: false,\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const cancelBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n this.storeLocation.selectedValues = this.expandedFilterSelectedValue;\r\n this.getStoreLocations();\r\n this.updateStoreLocation();\r\n },\r\n label: 'Dismiss',\r\n isDismiss: false,\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.hideDismissBtn = true;\r\n this.modalService.modalCustomButtons = [cancelBtn, saveBtn];\r\n } else {\r\n this.openPar = 'all';\r\n this.modalService.hideDismissBtn = false;\r\n this.modalService.modalCustomButtons = this.modalDefaultButtons;\r\n }\r\n }\r\n public getStoreName() {\r\n const currentStore = this.pageService.getStoreInfo(this.storeId);\r\n if (currentStore != null) {\r\n let text = currentStore.name;\r\n if (currentStore.chainID != this.pageService.chainID) {\r\n text = `${currentStore.name} - This store does not belong to your current chain!`;\r\n }\r\n return text;\r\n }\r\n return null;\r\n }\r\n updateStoreLocation(manualUpdate: boolean = false): void {\r\n if (this.storeLocation.selectedValues != null && this.storeLocation.selectedValues[0].value != null && this.storeLocation.selectedValues[0].value != undefined) {\r\n const newStoreID = this.storeLocation.selectedValues[0].value.toLowerCase();\r\n\r\n // Update compare store ID\r\n if (this.comparisons.length > 1) {\r\n if (manualUpdate == true) {\r\n const allStoreIDsTheSame = SilverWareArrays.all(this.comparisons, (comparison: any) => {\r\n return comparison.storeID == this.storeId;\r\n });\r\n\r\n const options = {\r\n modalID: \"messageBox\",\r\n class: \"messageBox\"\r\n //,rootWindow: $('#messageModal')\r\n };\r\n\r\n //if (allStoreIDsTheSame == true) {\r\n // this.modalService.confirm('Would you like to update all comparisons?', 'Update All Comparisons', 'No', () => {\r\n // this.comparisons[this.currentComparisonIndex].storeID = newStoreID;\r\n // }, 'Yes', () => {\r\n // for (var i = 0; i < this.comparisons.length; i++) {\r\n // this.comparisons[i].storeID = newStoreID;\r\n // }\r\n // }, null, options);\r\n //}\r\n //else {\r\n this.comparisons[this.currentComparisonIndex].storeID = newStoreID;\r\n // }\r\n }\r\n else {\r\n this.comparisons[this.currentComparisonIndex].storeID = newStoreID;\r\n }\r\n }\r\n\r\n this.storeId = newStoreID\r\n\r\n const index = SilverWareArrays.indexOf(this.databitsParameterValues, (pv: DatabitParameterValue) => pv.name == this.storeLocation.name);\r\n if (index > -1) {\r\n this.databitsParameterValues[index].value = this.storeId;\r\n } else {\r\n this.databitsParameterValues.push({ name: this.storeLocation.name, value: this.storeId });\r\n }\r\n }\r\n }\r\n\r\n newComparison(): void {\r\n\r\n // We have no comparisons\r\n if (this.comparisons.length == 0) {\r\n\r\n // Add two exact same comparisons to the array\r\n this.comparisons.push({\r\n name: '',\r\n parametersDetails: this.commonService.cloneDeep(this.parametersDetails),\r\n hiddenParametersDetails:this.commonService.cloneDeep(this.hiddenParametersDetails),\r\n storeID: this.commonService.cloneDeep(this.storeId)\r\n });\r\n this.comparisons.push({\r\n name: '',\r\n parametersDetails: this.commonService.cloneDeep(this.parametersDetails),\r\n hiddenParametersDetails: this.commonService.cloneDeep(this.hiddenParametersDetails),\r\n storeID: this.commonService.cloneDeep(this.storeId)\r\n });\r\n\r\n // Set our index to be the second comare we added\r\n this.currentComparisonIndex = 1;\r\n\r\n }\r\n\r\n // We are adding a new comparison to our existing list\r\n else {\r\n // Clonse our current comparison\r\n const currentComparison = this.comparisons[this.currentComparisonIndex];\r\n this.comparisons.splice(this.currentComparisonIndex + 1, 0, {\r\n name: '',\r\n parametersDetails: this.commonService.cloneDeep(currentComparison.parametersDetails),\r\n hiddenParametersDetails: this.commonService.cloneDeep(currentComparison.hiddenParametersDetails),\r\n storeID: this.commonService.cloneDeep(this.storeId)\r\n });\r\n\r\n // Set our index to be our new comparion\r\n this.currentComparisonIndex = this.currentComparisonIndex + 1;\r\n\r\n }\r\n\r\n // Update the params\r\n this.changeComparison(this.currentComparisonIndex);\r\n }\r\n\r\n // Updates our parameters\r\n changeComparison(index: number): void {\r\n\r\n this.currentComparisonIndex = index;\r\n\r\n this.parametersDetails = this.comparisons[this.currentComparisonIndex].parametersDetails;\r\n this.hiddenParametersDetails = this.comparisons[this.currentComparisonIndex].hiddenParametersDetails;\r\n this.storeLocation.selectedValues[0].value = this.comparisons[this.currentComparisonIndex].storeID;\r\n this.updateStoreLocation();\r\n }\r\n\r\n deleteComparison(): void {\r\n\r\n // Remove the comparison\r\n this.comparisons.splice(this.currentComparisonIndex, 1);\r\n\r\n // If we removed the last element in the list switch to the new last\r\n if (this.currentComparisonIndex > this.comparisons.length - 1) {\r\n this.currentComparisonIndex = this.comparisons.length - 1;\r\n }\r\n\r\n // Update the params\r\n this.changeComparison(this.currentComparisonIndex);\r\n }\r\n\r\n // Fills the comparisons name\r\n getCompareName(): string {\r\n const currentComparisonName = this.comparisons[this.currentComparisonIndex].name;\r\n\r\n if (currentComparisonName == null || currentComparisonName == '') {\r\n return \"Criteria for Comparison \" + (this.currentComparisonIndex + 1);\r\n }\r\n else {\r\n return currentComparisonName;\r\n }\r\n\r\n }\r\n\r\n // Sets the comparison name\r\n updateComparisonName(): void {\r\n\r\n const compareNameInput = document.getElementById(\"compareName\");\r\n\r\n this.comparisons[this.currentComparisonIndex].name = compareNameInput.value;\r\n }\r\n\r\n swipeRight(e): void {\r\n // If we aren't going to overflow display the pervious comparison\r\n if (this.comparisons.length > 1 && this.currentComparisonIndex != 0) {\r\n this.currentComparisonIndex--;\r\n\r\n this.changeComparison(this.currentComparisonIndex);\r\n }\r\n\r\n }\r\n\r\n swipeLeft(e): void {\r\n // If we aren't going to overflow display the next comparison\r\n if (this.comparisons.length > 1 && this.currentComparisonIndex != this.comparisons.length - 1) {\r\n this.currentComparisonIndex++;\r\n\r\n this.changeComparison(this.currentComparisonIndex);\r\n }\r\n }\r\n}\r\ntype StoreLocationInfo = {\r\n name: string;\r\n displayName: string;\r\n availableValues: NameValueIcon[];\r\n defaultValue: NameValueIcon;\r\n isToggled: boolean; // for toggle arrows\r\n isLoading: boolean; // for loading animation\r\n selectedValues: NameValueIcon[]; // current selected values\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {AvailableChartType} from \"../enums/available-chart-type.enum\";\r\n\r\n@Pipe({\r\n name: 'chartType'\r\n})\r\nexport class ChartTypePipe implements PipeTransform {\r\n transform(value: AvailableChartType): string {\r\n switch (value) {\r\n case AvailableChartType.Unknown:\r\n return 'unknown';\r\n case AvailableChartType.BarChart:\r\n return 'bar';\r\n //case ChartTypeEnum.BubbleChart:\r\n // return 'bubble';\r\n case AvailableChartType.DoughnutChart:\r\n return 'doughnut';\r\n case AvailableChartType.LineChart:\r\n return 'line';\r\n case AvailableChartType.PieChart:\r\n return 'pie';\r\n //case ChartTypeEnum.RadarChart:\r\n // return 'radar';\r\n case AvailableChartType.TextChart:\r\n return 'text';\r\n case AvailableChartType.Report:\r\n return 'report'\r\n }\r\n }\r\n\r\n}\r\n","export module SilverWareEnums {\r\n export function getNamesAndValues(e: any) {\r\n return getNames(e).map(n => ({ name: n, value: e[n] as T }));\r\n }\r\n\r\n export function getNames(e: any) {\r\n return getObjValues(e).filter(v => typeof v === 'string') as string[];\r\n }\r\n\r\n export function getValues(e: any) {\r\n return getObjValues(e).filter(v => typeof v === 'number') as T[];\r\n }\r\n\r\n function getObjValues(e: any): (number | string)[] {\r\n return Object.keys(e).map(k => e[k]);\r\n }\r\n}\r\n","export enum SeriesDataType {\r\n None = 0,\r\n String = 1,\r\n Decimal = 2,\r\n DateTime = 3,\r\n Currency = 4,\r\n Percent = 5\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { ChartFormatInfo } from '../../shared/interfaces/ChartFormatInfo';\r\nimport { DecimalPipe } from '@angular/common';\r\nimport { CurrencyPipe } from '@angular/common';\r\nimport { PercentPipe } from '@angular/common';\r\nimport { SeriesDataType } from '../interfaces/SeriesDataType';\r\n\r\n@Pipe({\r\n name: 'formatChartNumber'\r\n})\r\nexport class FormatChartNumberPipe implements PipeTransform {\r\n\r\n constructor(private decimalPipe: DecimalPipe, private currencyPipe: CurrencyPipe, private percentPipe: PercentPipe) { }\r\n\r\n transform(val: string, formatInfo: ChartFormatInfo): string {\r\n\r\n if (formatInfo != null) {\r\n\r\n let finalVal: string = val;\r\n\r\n if (formatInfo.dataType == SeriesDataType.Decimal) {\r\n finalVal = this.decimalPipe.transform(val, '1.0-0', 'en-US');\r\n }\r\n else if (formatInfo.dataType == SeriesDataType.Currency) {\r\n if (formatInfo.currencyCode == \"CAD\" || formatInfo.currencyCode == \"USD\") {\r\n finalVal = this.decimalPipe.transform(val, '1.0-0', 'en-US');\r\n return \"$\" + finalVal; // if we dont this here, angular pipe will convert canadian dollar as CA$.\r\n }\r\n else {\r\n return this.currencyPipe.transform(val, formatInfo.currencyCode, \"symbol\", \"1.0-0\");\r\n }\r\n\r\n }\r\n else if (formatInfo.dataType == SeriesDataType.Percent) {\r\n\r\n // Convert to a number for validity check\r\n let numberVal = Number(val);\r\n\r\n // If we are a number and are finite...\r\n if (!isNaN(numberVal) && isFinite(numberVal)) {\r\n\r\n // Formatted to leave at least one zero infront of the decimal and up to two zeros after the decimal\r\n return this.percentPipe.transform(val, '1.0-2');\r\n }\r\n else { // Returns blank\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n return val;\r\n }\r\n\r\n}\r\n","import {GraphService} from '../services/graph.service';\r\nimport {ShareService} from '../services/share.service';\r\nimport {FormatChartNumberPipe} from '../filters/format-chart-number-pipe';\r\nimport {ElementRef} from '@angular/core';\r\nimport {AvailableChartType} from '../enums/available-chart-type.enum';\r\nimport {PageService} from '../services/page.service';\r\nimport {CommonService} from '../services/common.service';\r\nimport {LogService} from \"../services/log.service\";\r\n\r\nexport abstract class ChartBase {\r\n abstract canvasElement: ElementRef;\r\n protected abstract chartType: AvailableChartType;\r\n\r\n protected constructor(protected graphService: GraphService, protected shareService: ShareService,\r\n protected formatChartNumberPipe: FormatChartNumberPipe, protected pageService: PageService,\r\n public commonService: CommonService, protected logService: LogService) {}\r\n\r\n\r\n downloadGraph(fileName: string = null) {\r\n switch(this.chartType) {\r\n case AvailableChartType.Report:\r\n case AvailableChartType.TextChart:\r\n this.pageService.loadingOverLay = true;\r\n this.graphService.getDownloadableHTMLDataImageUrl(this.canvasElement.nativeElement.id).then((response: {url: string, callback: any}) => {\r\n if (response && response.url) {\r\n this.shareService.downloadGraph(response.url, fileName);\r\n } else {\r\n this.logService.error(`${response.url} is not valid.`);\r\n }\r\n response.callback();\r\n // this.heightLimit = l;\r\n this.pageService.loadingOverLay = false;\r\n }, (ex: any) => {\r\n this.logService.error(this.commonService.flattenErrorMessages(ex));\r\n // this.heightLimit = l;\r\n this.pageService.loadingOverLay = false;\r\n });\r\n break;\r\n default:\r\n const imageUrl = this.graphService.getDownloadableDataImageUrl(this.canvasElement);\r\n this.shareService.downloadGraph(imageUrl, fileName);\r\n break;\r\n }\r\n\r\n }\r\n async getGraphDataUrlAsync(): Promise {\r\n\r\n switch(this.chartType) {\r\n case AvailableChartType.Report:\r\n case AvailableChartType.TextChart:\r\n return new Promise((resolve, reject) => {\r\n let url = '';\r\n this.pageService.loadingOverLay = true;\r\n this.graphService.getDownloadableHTMLDataImageUrl(this.canvasElement.nativeElement.id).then((response: {url: string, callback: any}) => {\r\n if (response && response.url) {\r\n url = response.url;\r\n } else {\r\n this.logService.error(`${response.url} is not valid.`);\r\n }\r\n response.callback();\r\n // this.heightLimit = l;\r\n this.pageService.loadingOverLay = false;\r\n resolve(url);\r\n return url;\r\n }, (ex: any) => {\r\n this.logService.error(this.commonService.flattenErrorMessages(ex));\r\n // this.heightLimit = l;\r\n this.pageService.loadingOverLay = false;\r\n resolve(url);\r\n });\r\n });\r\n default:\r\n return new Promise((resolve, reject) => {\r\n resolve(this.graphDataUrl);\r\n });\r\n }\r\n\r\n }\r\n\r\n\r\n get graphDataUrl(): string {\r\n return this.graphService.getCanvasDataImageUrl(this.canvasElement);\r\n }\r\n}\r\n","import {ChartReportData} from '../types/chart-report-data';\r\nimport {GraphService} from '../services/graph.service';\r\nimport {ShareService} from '../services/share.service';\r\nimport {Chart, ChartDataset, ChartOptions, ChartType, ChartTypeRegistry, Tick, TooltipItem} from 'chart.js';\r\nimport {ChartFormatInfo} from '../interfaces/ChartFormatInfo';\r\nimport {FormatChartNumberPipe} from '../filters/format-chart-number-pipe';\r\nimport {graphProperties} from '../../../environments/environment';\r\nimport {BaseChartDirective} from 'ng2-charts';\r\nimport {ChartBase} from './chart-base';\r\nimport {PageService} from '../services/page.service';\r\nimport {CommonService} from '../services/common.service';\r\nimport {LogService} from \"../services/log.service\";\r\ndeclare let $: any;\r\n\r\nexport abstract class ChartJsBase extends ChartBase {\r\n\r\n abstract readonly chartJsType: ChartType;\r\n\r\n abstract set data(d: ChartDataset[])\r\n\r\n abstract chartComponent: BaseChartDirective;\r\n\r\n abstract showLegend: boolean;\r\n abstract renderForExport: boolean;\r\n abstract labels: string[];\r\n abstract xLabel: string;\r\n abstract yLabel: string;\r\n abstract isFullScreen: boolean;\r\n abstract formatInfo: ChartFormatInfo;\r\n\r\n averageIndex: number;\r\n\r\n chartOptions: ChartOptions;\r\n chartFullSizeChartOptions: ChartOptions;\r\n\r\n datasets: ChartDataset[];\r\n\r\n\r\n protected prevLabels: string[] = [];\r\n\r\n private readonly chartTypeRegistry: ChartTypeRegistry = {\r\n bar: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: undefined,\r\n metaExtensions: {},\r\n parsedDataType: undefined,\r\n scales: undefined\r\n },\r\n bubble: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: undefined,\r\n metaExtensions: {},\r\n parsedDataType: undefined,\r\n scales: undefined\r\n },\r\n doughnut: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: undefined,\r\n metaExtensions: undefined,\r\n parsedDataType: 0,\r\n scales: undefined\r\n },\r\n line: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: undefined,\r\n metaExtensions: {},\r\n parsedDataType: undefined,\r\n scales: undefined\r\n },\r\n pie: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: undefined,\r\n metaExtensions: undefined,\r\n parsedDataType: 0,\r\n scales: undefined\r\n },\r\n polarArea: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: 0,\r\n metaExtensions: {},\r\n parsedDataType: undefined,\r\n scales: undefined\r\n },\r\n radar: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: undefined,\r\n metaExtensions: {},\r\n parsedDataType: undefined,\r\n scales: undefined\r\n },\r\n scatter: {\r\n chartOptions: undefined,\r\n datasetOptions: undefined,\r\n defaultDataPoint: undefined,\r\n metaExtensions: {},\r\n parsedDataType: undefined,\r\n scales: undefined\r\n }\r\n };\r\n private k = 0;\r\n\r\n protected constructor(graphService: GraphService, shareService: ShareService, formatChartNumberPipe: FormatChartNumberPipe,\r\n pageService: PageService, commonService: CommonService, logService: LogService) {\r\n super(graphService, shareService, formatChartNumberPipe, pageService, commonService, logService)\r\n }\r\n\r\n protected isRenderForExport(): void {\r\n if (this.renderForExport === true) {\r\n // Remove chart animation\r\n this.chartOptions.animation = {\r\n duration: 0,\r\n onComplete: chart => {\r\n document.getElementById('getBase64Data').style.visibility = 'visible';\r\n }\r\n };\r\n // Set javaScript global function for chart canvas base64 data\r\n window['getChartBase64Data'] = (): string => {\r\n const url = this.graphDataUrl;\r\n return url;\r\n };\r\n }\r\n }\r\n protected buildPieAndDoughnutChartDataset(d: ChartDataset<'doughnut' | 'pie'>[]): ChartDataset {\r\n let bgColors: string[] = [];\r\n\r\n const flattenData = d.map(dataset => dataset.data);\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(d))\r\n return null;\r\n\r\n if (flattenData[0].length == 1) {\r\n bgColors.push(graphProperties.doughnutDefaultColor);\r\n }\r\n else {\r\n bgColors = graphProperties.pieDoughnutColors;\r\n }\r\n\r\n // when we ran out of colors, choose a default color..\r\n if (flattenData.length > graphProperties.pieDoughnutColors.length) {\r\n for (let i = 0; i < flattenData[0].length - graphProperties.pieDoughnutColors.length; i++) {\r\n bgColors.push(graphProperties.chartOthersColor);\r\n }\r\n }\r\n\r\n\r\n return {\r\n data: flattenData[0],\r\n backgroundColor: bgColors\r\n };\r\n }\r\n protected prepareGraphFonts() {\r\n let foregroundColors = [];\r\n\r\n for (let i = 0; i < this.datasets[0].data.length; i++) {\r\n foregroundColors.push(graphProperties.doughnutChartGraphForegroundColor);\r\n }\r\n\r\n this.chartOptions.plugins.datalabels.color = foregroundColors;\r\n this.chartFullSizeChartOptions.plugins.datalabels.color = foregroundColors;\r\n }\r\n protected getPieAndDoughnutChartToolTipLabelInfo(tooltipItem: TooltipItem<'doughnut' | 'pie'>): string {\r\n const data = tooltipItem.chart.data;\r\n // && tooltipItem.value.length > 0\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(tooltipItem.label) && this.commonService.isNotNullAndUndefinedAndEmpty(tooltipItem.raw)) {\r\n return tooltipItem.label + ': ' + this.formatChartNumberPipe.transform(`${tooltipItem.raw}`, this.formatInfo);\r\n }\r\n // pie chart and doughnot chart implementation, not sure why yet.\r\n let index = tooltipItem.dataIndex;\r\n let dataSetIndex = tooltipItem.datasetIndex;\r\n\r\n let dataSet = data.datasets[dataSetIndex];\r\n let label = data.labels[index];\r\n let val = dataSet.data[index];\r\n\r\n return label + ': ' + this.formatChartNumberPipe.transform(val.toString(), this.formatInfo);\r\n }\r\n protected doAddPieAndDoughnutChartFullScreenLegend(): void {\r\n if (!this.isFullScreen)\r\n return;\r\n\r\n if (this.prevLabels.length == this.labels.length)\r\n return;\r\n\r\n this.prevLabels = this.labels;\r\n setTimeout(() => {\r\n let customLegend = document.getElementById(\"customLegend\");\r\n const chart = this.chartComponent.chart;\r\n const legends: string[] = [];\r\n chart.data.labels.forEach((label, i) => {\r\n legends.push(`\r\n
  • \r\n \r\n \r\n ${ label }\r\n
  • \r\n `);\r\n });\r\n customLegend.innerHTML = `
      ${legends.join('')}
    `;\r\n const doughnutChart = this.chartComponent;\r\n $(\"#customLegend > ul > li\").on(\"click\", e => {\r\n const element = $(e.currentTarget);\r\n let index = $(element).index();\r\n $(element).toggleClass(\"strike\")\r\n let curr: any = doughnutChart.chart.getDatasetMeta(0).data[index];\r\n curr.hidden = !curr.hidden\r\n doughnutChart.update();\r\n })\r\n }, 1);\r\n }\r\n\r\n\r\n get reportData(): ChartReportData {\r\n return {\r\n Datasets: this.datasets,\r\n Labels: this.labels,\r\n ChartType: this.chartJsType,\r\n FormatInfo: this.formatInfo\r\n };\r\n }\r\n\r\n get availableChartJSTypes(): keyof ChartTypeRegistry {\r\n return\r\n }\r\n\r\n /**\r\n * Get ChartTypeRegistry keys (Available chart types)\r\n */\r\n get chartJsTypes(): Record {\r\n return Object.keys(this.chartTypeRegistry).reduce((res, key: string) => {\r\n const typedKey = key as keyof ChartTypeRegistry\r\n res[typedKey] = typedKey\r\n return res\r\n }, {} as Record)\r\n }\r\n\r\n get defaultScaleChartOptions() {\r\n return {\r\n x: {\r\n title : {\r\n text: this.xLabel,\r\n display: this.commonService.isNotNullAndUndefinedAndEmpty(this.xLabel)\r\n },\r\n },\r\n y: {\r\n title : {\r\n text: this.yLabel,\r\n display: this.commonService.isNotNullAndUndefinedAndEmpty(this.yLabel)\r\n },\r\n ticks: {\r\n callback: (value: string | number, index: number, values: Tick[]): string | null => {\r\n if (value !== null && value !== undefined) {\r\n return this.formatChartNumberPipe.transform(value.toString(), this.formatInfo);\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n get pieAndDoughnutChartOptions(): ChartOptions {\r\n return {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n plugins: {\r\n datalabels: {\r\n formatter: (value, ctx): string => {\r\n\r\n const chart: Chart = ctx.chart;\r\n const allData: any = chart.data.datasets[ctx.datasetIndex].data;\r\n const legendItems = chart.legend.legendItems;\r\n let total = 0;\r\n for (let i: number = 0; i < allData.length; i++) {\r\n if (legendItems[i].hidden === true)\r\n continue;\r\n\r\n total += parseFloat(allData[i]);\r\n }\r\n\r\n if (total === 0)\r\n return '';\r\n\r\n const percentage = Math.round((value / total) * 100);\r\n return `${percentage}%`;\r\n },\r\n font: {\r\n family: 'Montserrat Regular',\r\n }\r\n },\r\n legend: {\r\n display: !this.isFullScreen,\r\n position: 'bottom',\r\n labels: {\r\n font: {\r\n size: 10,\r\n family: 'Montserrat Regular'\r\n },\r\n usePointStyle: true,\r\n boxWidth: 100\r\n }\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: tooltipItem => {\r\n return this.getPieAndDoughnutChartToolTipLabelInfo(tooltipItem);\r\n },\r\n title: tooltipItem => {\r\n return '';\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import {ElementRef, Injectable} from '@angular/core';\r\nimport html2canvas from 'html2canvas';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GraphService {\r\n public getDownloadableDataImageUrl(canvasElement: ElementRef): string {\r\n return this.getCanvasDataImageUrl(canvasElement).replace('image/png', 'image/octet-stream');\r\n }\r\n\r\n public getCanvasDataImageUrl(canvasElement: ElementRef): string {\r\n return canvasElement.nativeElement.toDataURL('image/png', 1.0);\r\n }\r\n\r\n public getDownloadableHTMLDataImageUrl(htmlElementID: string): Promise<{url: string, callback: any}> {\r\n return new Promise<{url: string, callback: any}>(((resolve, reject): void => {\r\n const chart = document.getElementById(htmlElementID);\r\n if (chart) {\r\n const newHeight = chart.scrollHeight + 100;\r\n const newWidth = chart.scrollWidth;\r\n html2canvas(chart, {\r\n logging: false,\r\n height: newHeight,\r\n width: newWidth,\r\n onclone: (doc: Document ):void => {\r\n const clonedChart = doc.getElementById(htmlElementID);\r\n if (clonedChart) {\r\n if (clonedChart.clientHeight < newHeight) {\r\n clonedChart.style.maxHeight = `${newHeight}px` ;\r\n clonedChart.style.minHeight = `${newHeight}px` ;\r\n clonedChart.style.height = `${newHeight}px` ;\r\n clonedChart.style.marginTop = '10px';\r\n // clonedChart.style.marginLeft = '100px';\r\n }\r\n\r\n if (clonedChart.clientWidth < newWidth) {\r\n clonedChart.style.minWidth = `${newWidth}px` ;\r\n clonedChart.style.width = `${newWidth}px` ;\r\n }\r\n\r\n }\r\n\r\n const clonedWrapper = doc.getElementById(`chart-wrapper-${htmlElementID}`);\r\n if (clonedWrapper) {\r\n if (clonedWrapper.clientHeight < newHeight) {\r\n clonedWrapper.style.minHeight = `${newHeight}px`;\r\n clonedWrapper.style.height = `${newHeight}px`;\r\n }\r\n\r\n if (clonedWrapper.clientWidth < newWidth) {\r\n clonedWrapper.style.minWidth = `${newWidth}px`;\r\n clonedWrapper.style.width = `${newWidth}px`;\r\n }\r\n\r\n\r\n }\r\n }\r\n }).then((canvas: HTMLCanvasElement): void => {\r\n resolve({url: canvas.toDataURL('image/png', 1.0), callback: () => {\r\n }});\r\n }, (ex: any): void => {\r\n reject(ex);\r\n });\r\n }\r\n }));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {HttpClient} from '@angular/common/http';\r\nimport {ShareReportRequest} from '../interfaces/requests/share-report-request';\r\nimport {Observable} from 'rxjs';\r\nimport { AppConfig } from '../app.config';\r\nimport {ApplicationResponse} from '../responses/application-response';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ShareService {\r\n\r\n public constructor(private http: HttpClient, private appConfig: AppConfig) {\r\n\r\n }\r\n\r\n public emailGraph(request: ShareReportRequest): Observable> {\r\n return this.http.post>(this.appConfig.applicationUrl + `/api/Share/Email/Chart`, request);\r\n }\r\n\r\n public downloadGraph(imageDataUrl: string, fileName = 'graph'): void {\r\n const downloadAnchor = document.createElement('a');\r\n downloadAnchor.download = fileName + '.png';\r\n downloadAnchor.href = imageDataUrl;\r\n downloadAnchor.click();\r\n }\r\n}\r\n","
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n","import {\r\n Component,\r\n DoCheck,\r\n ElementRef,\r\n Input,\r\n OnInit,\r\n ViewChild,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport {GraphService} from '../../shared/services/graph.service';\r\nimport {ShareService} from '../../shared/services/share.service';\r\nimport { FormatChartNumberPipe } from '../../shared/filters/format-chart-number-pipe';\r\nimport { ChartFormatInfo } from '../../shared/interfaces/ChartFormatInfo';\r\nimport { DecimalPipe, CurrencyPipe, PercentPipe } from '@angular/common';\r\nimport { graphProperties } from '../../../environments/environment';\r\nimport {ChartDataset} from 'chart.js';\r\nimport {ChartJsBase} from '../../shared/classes/chart-js-base';\r\nimport {BaseChartDirective} from 'ng2-charts';\r\nimport {AvailableChartType} from '../../shared/enums/available-chart-type.enum';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n\r\n@Component({\r\n encapsulation: ViewEncapsulation.None,\r\n selector: 'app-pie-chart',\r\n templateUrl: './pie-chart.component.html',\r\n styleUrls: ['./pie-chart.component.css'],\r\n providers: [FormatChartNumberPipe, DecimalPipe, CurrencyPipe, PercentPipe]\r\n})\r\n\r\nexport class PieChartComponent extends ChartJsBase implements OnInit, DoCheck {\r\n\r\n readonly chartJsType = this.chartJsTypes.pie;\r\n readonly chartType = AvailableChartType.PieChart;\r\n\r\n @ViewChild('pieChartCanvas') canvasElement: ElementRef;\r\n @ViewChild(BaseChartDirective) chartComponent: BaseChartDirective;\r\n\r\n\r\n // ChartDataSets\r\n public datasets: ChartDataset[];\r\n\r\n @Input() set data(d: ChartDataset<'pie'>[]) {\r\n this.datasets = [];\r\n const newDataSet = this.buildPieAndDoughnutChartDataset(d);\r\n this.datasets.push(newDataSet);\r\n\r\n }\r\n\r\n\r\n @Input() isFullScreen: boolean = false;\r\n @Input() formatInfo: ChartFormatInfo;\r\n @Input() showLegend: boolean = true;\r\n @Input() renderForExport: boolean = false;\r\n @Input() labels: string[] = [];\r\n @Input() xLabel: string;\r\n @Input() yLabel: string;\r\n\r\n\r\n constructor(graphService: GraphService, shareService: ShareService, formatChartNumberPipe: FormatChartNumberPipe,\r\n pageService: PageService, commonService: CommonService, logService: LogService) {\r\n super(graphService, shareService, formatChartNumberPipe, pageService, commonService, logService)\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.chartOptions = this.commonService.cloneDeep(this.pieAndDoughnutChartOptions);\r\n\r\n this.chartFullSizeChartOptions = this.commonService.cloneDeep(this.chartOptions);\r\n\r\n this.chartFullSizeChartOptions.plugins.legend = {display: false};\r\n\r\n this.isRenderForExport();\r\n\r\n this.prepareGraphFonts();\r\n }\r\n\r\n ngDoCheck(): void {\r\n this.doAddPieAndDoughnutChartFullScreenLegend();\r\n }\r\n\r\n}\r\n","import {Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\r\nimport {ChartDataset} from 'chart.js';\r\nimport { GraphService } from '../../shared/services/graph.service';\r\nimport { ShareService } from '../../shared/services/share.service';\r\nimport { BaseChartDirective } from 'ng2-charts';\r\n\r\nimport { FormatChartNumberPipe } from '../../shared/filters/format-chart-number-pipe';\r\nimport { ChartFormatInfo } from '../../shared/interfaces/ChartFormatInfo';\r\nimport { DecimalPipe, CurrencyPipe, PercentPipe } from '@angular/common';\r\nimport { graphProperties } from '../../../environments/environment';\r\nimport { SilverWareArrays } from '../../shared/services/SilverWareArrays';\r\nimport { SeriesDataType } from '../../shared/interfaces/SeriesDataType';\r\nimport {ChartJsBase} from '../../shared/classes/chart-js-base';\r\nimport {AvailableChartType} from '../../shared/enums/available-chart-type.enum';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n@Component({\r\n selector: 'app-bar-chart',\r\n templateUrl: './bar-chart.component.html',\r\n styleUrls: ['./bar-chart.component.css'],\r\n providers: [FormatChartNumberPipe, DecimalPipe, CurrencyPipe, PercentPipe]\r\n})\r\nexport class BarChartComponent extends ChartJsBase implements OnInit {\r\n\r\n readonly chartJsType = this.chartJsTypes.bar;\r\n readonly chartType = AvailableChartType.BarChart;\r\n\r\n\r\n @Input() set data(d: ChartDataset<'bar'>[]) {\r\n this.datasets = d;\r\n\r\n let colors: string[] = []; // Used to hold the colours of our bar graph(s)\r\n\r\n let dataSetsLength = d.length; // Used for looping\r\n let localTotal = 0; // Holds the average for the specific category\r\n let localAverage = 0; // Holds the average for the specific category\r\n let averageDatasetData: number[] = []; // The data used in the average line graph\r\n\r\n let nextColour: string = null; // The colour of our line graph\r\n\r\n // Loop through and set the colours for each dataset\r\n for (let j = 0; j < dataSetsLength; j++) {\r\n let ds = this.datasets[j];\r\n let dataElementsLength = 0; // Used for looping through and adding colours\r\n\r\n if (ds.data == null) {\r\n dataElementsLength = (>ds).length;\r\n }\r\n else {\r\n dataElementsLength = ds.data.length;\r\n }\r\n\r\n // Find any other columns\r\n let others = SilverWareArrays.firstOrDefault(this.labels, (x: any) => x == \"Others\");\r\n\r\n if (others != null) {\r\n dataElementsLength--;\r\n }\r\n\r\n // Get our colour\r\n let mainColor = graphProperties.pieDoughnutColors[j];\r\n\r\n // Find the next colour for our average graph, make sure to not go outside the colour array's bounds\r\n nextColour = j == graphProperties.pieDoughnutColors.length - 1 ? graphProperties.pieDoughnutColors[j] : graphProperties.pieDoughnutColors[j + 1];\r\n\r\n // Add to our colours\r\n for (let i = 0; i < dataElementsLength; i++) {\r\n colors.push(mainColor);\r\n }\r\n\r\n // If we have others add the other colour\r\n if (others != null) {\r\n colors.push(graphProperties.chartOthersColor);\r\n }\r\n\r\n // Set colour and graph properies\r\n this.datasets[j].backgroundColor = colors;\r\n this.datasets[j].borderColor = colors;\r\n this.datasets[j].hoverBackgroundColor = colors;\r\n this.datasets[j].borderWidth = 0;\r\n\r\n // Clear colours for next dataset\r\n colors = [];\r\n }\r\n\r\n // Now we will fill our average data array\r\n // If we this is a comparison the average will be a local one\r\n if (this.datasets.length > 1) {\r\n for (let i = 0; i < this.labels.length; i++) {\r\n\r\n // Clear our values\r\n localTotal = 0;\r\n localAverage = 0;\r\n\r\n // Sum up our total\r\n for (let j = 0; j < this.datasets.length; j++) {\r\n localTotal += +this.datasets[j].data[i];\r\n }\r\n\r\n // Find the average for just this category\r\n localAverage = localTotal / this.datasets.length;\r\n\r\n // Add to our data array\r\n averageDatasetData.push(localAverage);\r\n\r\n }\r\n }\r\n // Otherwise the average is for the whole dataset\r\n else {\r\n\r\n // Sum up our total\r\n let total = SilverWareArrays.sum(this.datasets[0].data, (x: any) => {\r\n return Number(x);\r\n })\r\n\r\n // Get our average\r\n let average = total / this.labels.length;\r\n\r\n // Add the average value for each category we have\r\n for (let i = 0; i < this.labels.length; i++) {\r\n averageDatasetData.push(average);\r\n }\r\n }\r\n\r\n // Make sure each non average dataset has an order greator than 1\r\n // We want our average dataset to have an order of 1 so it has highest priority and is drawn on top of any other datasets\r\n for (let j = 0; j < this.datasets.length; j++) {\r\n this.datasets[j].order = j + 2;\r\n this.datasets[j].label = this.datasets[j].label.replace(/([A-Z])/g, ' $1').trim();\r\n }\r\n\r\n // Create our average dataset\r\n const averageDataSet: ChartDataset = {\r\n data: averageDatasetData, // The data array we filled above\r\n label: \"Average\", // Label for legend\r\n type: this.chartJsTypes.line, // We want this to be displayed as a line graph\r\n\r\n // Set colours\r\n borderColor: nextColour,\r\n hoverBorderColor: nextColour,\r\n pointBackgroundColor: nextColour,\r\n pointBorderColor: nextColour,\r\n pointHoverBackgroundColor: nextColour,\r\n pointHoverBorderColor: nextColour,\r\n backgroundColor: graphProperties.clearBackgroundColor,\r\n hoverBackgroundColor: graphProperties.clearBackgroundColor,\r\n\r\n borderWidth: 0.7,\r\n\r\n // No fill so we can still see our bar graph(s)\r\n fill: false,\r\n\r\n // We want to draw the line infront of our graph(s)\r\n order: 1\r\n };\r\n // Add our average dataset\r\n this.datasets.push(averageDataSet);\r\n this.averageIndex = this.datasets.length - 1;\r\n }\r\n\r\n @ViewChild('barChartCanvas') canvasElement: ElementRef;\r\n @ViewChild(BaseChartDirective) chartComponent: BaseChartDirective;\r\n\r\n @Input() showLegend: boolean = true;\r\n @Input() renderForExport: boolean = false;\r\n @Input() labels: string[] = [];\r\n @Input() xLabel: string;\r\n @Input() yLabel: string;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() formatInfo: ChartFormatInfo;\r\n\r\n\r\n constructor(graphService: GraphService, shareService: ShareService, formatChartNumberPipe: FormatChartNumberPipe,\r\n pageService: PageService, commonService: CommonService, logService: LogService) {\r\n super(graphService, shareService, formatChartNumberPipe, pageService, commonService, logService)\r\n }\r\n\r\n ngOnInit(): void {\r\n this.chartOptions = {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n plugins: {\r\n datalabels: {\r\n display: false,\r\n },\r\n tooltip: {\r\n callbacks: {\r\n // This is where we send the text for the tool tips\r\n label: tooltipItem => {\r\n const data = tooltipItem.chart.data;\r\n // The value of the graph element we are hovering over\r\n let value = this.formatChartNumberPipe.transform(`${tooltipItem.raw}`, this.formatInfo);\r\n\r\n let average = null; // Used for getting variance from average\r\n let localAverage = null; // Used for getting variance from average\r\n let varianceFromAverage = null; // Displayed in the tool tip for all bars\r\n let varianceFromFirstPosition = null; // Displayed in the tool tip for all bars except for the first comparison bar graph\r\n let negativeVarianceFromAverage = false; // Used for deciding if we'll say up or down\r\n let negativeVarianceFirstPosition = false; // Used for deciding if we'll say up or down\r\n\r\n // This array will hold the strings that will be displayed in the tool tip\r\n // We will return up to three rows:\r\n // [category]: [value]\r\n // [Up/Down] [VarianceFromAverage] from Average\r\n // [VarianceFromAverageFirstValue] from [FirstDataSetName] (This line is only shown if we are NOT the first comparison AND the first comparison has a value)\r\n let arrayOfLabels: string[] = [];\r\n\r\n // If we're hovering over an average data point just return our value\r\n // We have the return up here to avoid unnessary processing\r\n if (tooltipItem.datasetIndex == this.averageIndex) {\r\n arrayOfLabels.push(\" Average\" + ': ' + value);\r\n return arrayOfLabels;\r\n }\r\n\r\n // Variances are formatted as a percentage\r\n let varianceFormatInfo = {\r\n dataType: SeriesDataType.Percent,\r\n currencyCode: ''\r\n };\r\n\r\n // If we're comparing the average variance is for all comparisons' value of the current category\r\n if (data.datasets.length > 2) {\r\n\r\n // Sub up our local total\r\n let localTotal = 0;\r\n for (let i = 0; i < data.datasets.length; i++) {\r\n localTotal += +data.datasets[i].data[tooltipItem.dataIndex];\r\n }\r\n\r\n // Get our local average\r\n localAverage = localTotal / data.datasets.length;\r\n\r\n // Calculate our variance from the average\r\n varianceFromAverage = (localAverage - +data.datasets[tooltipItem.datasetIndex].data[tooltipItem.dataIndex]) / localAverage;\r\n\r\n // If we are hovering over a bar that isn't first in the category\r\n if (tooltipItem.datasetIndex > 0) {\r\n\r\n // Get the first comparison's value\r\n let firstPositionVal = +data.datasets[0].data[tooltipItem.dataIndex];\r\n\r\n // Calculate our variance from the first value\r\n varianceFromFirstPosition = (firstPositionVal - +data.datasets[tooltipItem.datasetIndex].data[tooltipItem.dataIndex]) / firstPositionVal;\r\n }\r\n }\r\n\r\n // Otherwise we get the average for all values in the bar dataset\r\n else {\r\n\r\n // Sum up our total\r\n let total = SilverWareArrays.sum(this.datasets[0].data, (x: any) => {\r\n return Number(x);\r\n })\r\n\r\n // Find our average\r\n average = total / this.labels.length;\r\n\r\n // Calculate our variance from the average\r\n varianceFromAverage = (average - +data.datasets[tooltipItem.datasetIndex].data[tooltipItem.dataIndex]) / average;\r\n }\r\n\r\n // If our value is negative, flip it positive\r\n if (varianceFromAverage < 0) {\r\n varianceFromAverage = varianceFromAverage * -1;\r\n }\r\n\r\n // Otherwise make sure we write 'Down'\r\n else {\r\n negativeVarianceFromAverage = true;\r\n }\r\n\r\n // If our value is negative, flip it positive\r\n if (varianceFromFirstPosition < 0) {\r\n varianceFromFirstPosition = varianceFromFirstPosition * -1;\r\n }\r\n\r\n // Otherwise make sure we write 'Down'\r\n else {\r\n negativeVarianceFirstPosition = true;\r\n }\r\n\r\n // Add our label and value\r\n arrayOfLabels.push(' ' + tooltipItem.label + ': ' + value);\r\n\r\n // Add our average variance line\r\n if (varianceFromAverage != null) {\r\n arrayOfLabels.push((negativeVarianceFromAverage ? \" Down \" : \" Up \") + this.formatChartNumberPipe.transform(varianceFromAverage, varianceFormatInfo) + \" from average\");\r\n }\r\n\r\n // Add our variance from first position line\r\n if (varianceFromFirstPosition != null && !isNaN(varianceFromFirstPosition) && isFinite(varianceFromFirstPosition)) {\r\n arrayOfLabels.push((negativeVarianceFirstPosition ? \" Down \" : \" Up \") + this.formatChartNumberPipe.transform(varianceFromFirstPosition, varianceFormatInfo) + \" from \" + data.datasets[0].label);\r\n }\r\n\r\n return arrayOfLabels;\r\n },\r\n title: tooltipItem => {\r\n return '';\r\n }\r\n\r\n }\r\n },\r\n legend: {\r\n display: this.showLegend,\r\n position: 'bottom',\r\n labels: {\r\n generateLabels: chart => {\r\n let labelItem = [];\r\n\r\n // We need to go through and create our legend items manually because for some reason the built in function will fill the average line graph label so it looks like a solid square\r\n // We want the average legend to have a clear fill and a boarder that matches the colour of the line, like a box whith a square hole in the middle\r\n for (let datasetIndex = 0; datasetIndex < chart.config.data.datasets.length; datasetIndex++) {\r\n let dataset = chart.config.data.datasets[datasetIndex];\r\n\r\n labelItem.push({\r\n text: dataset.label,\r\n fillStyle: dataset.backgroundColor,\r\n strokeStyle: dataset.borderColor,\r\n index: datasetIndex,\r\n datasetIndex: datasetIndex\r\n });\r\n }\r\n\r\n return labelItem;\r\n }\r\n }\r\n }\r\n },\r\n scales: this.defaultScaleChartOptions\r\n };\r\n\r\n this.isRenderForExport();\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, DoCheck, ElementRef, Input, OnInit, ViewChild, ViewEncapsulation} from '@angular/core';\r\nimport {ChartDataset} from 'chart.js';\r\nimport {BaseChartDirective} from 'ng2-charts';\r\nimport {GraphService} from '../../shared/services/graph.service';\r\nimport {ShareService} from '../../shared/services/share.service';\r\nimport {FormatChartNumberPipe} from '../../shared/filters/format-chart-number-pipe';\r\nimport {ChartFormatInfo} from '../../shared/interfaces/ChartFormatInfo';\r\nimport {CurrencyPipe, DecimalPipe, PercentPipe} from '@angular/common';\r\nimport {ChartJsBase} from '../../shared/classes/chart-js-base';\r\nimport {AvailableChartType} from '../../shared/enums/available-chart-type.enum';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n\r\n@Component({\r\n encapsulation: ViewEncapsulation.None,\r\n selector: 'app-doughnut-chart',\r\n templateUrl: './doughnut-chart.component.html',\r\n styleUrls: ['./doughnut-chart.component.css'],\r\n providers: [FormatChartNumberPipe, DecimalPipe, CurrencyPipe, PercentPipe]\r\n})\r\n\r\nexport class DoughnutChartComponent extends ChartJsBase implements OnInit, DoCheck {\r\n\r\n readonly chartJsType = this.chartJsTypes.doughnut;\r\n readonly chartType = AvailableChartType.DoughnutChart;\r\n\r\n @ViewChild('doughnutChartCanvas') canvasElement: ElementRef;\r\n @ViewChild(BaseChartDirective) chartComponent: BaseChartDirective;\r\n\r\n @Input() set data(d: ChartDataset<'doughnut'>[]) {\r\n this.datasets = [];\r\n const newDataSet = this.buildPieAndDoughnutChartDataset(d);\r\n\r\n if (newDataSet === null)\r\n return;\r\n\r\n this.datasets.push(newDataSet);\r\n\r\n }\r\n @Input() isFullScreen: boolean = false;\r\n @Input() formatInfo: ChartFormatInfo;\r\n @Input() showLegend: boolean = true;\r\n @Input() renderForExport: boolean = false;\r\n @Input() labels: string[] = [];\r\n @Input() xLabel: string;\r\n @Input() yLabel: string;\r\n\r\n\r\n constructor(graphService: GraphService, shareService: ShareService, formatChartNumberPipe: FormatChartNumberPipe,\r\n pageService: PageService, commonService: CommonService, logService: LogService) {\r\n super(graphService, shareService, formatChartNumberPipe, pageService, commonService, logService)\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.chartOptions = this.commonService.cloneDeep(this.pieAndDoughnutChartOptions);\r\n\r\n this.chartFullSizeChartOptions = this.commonService.cloneDeep(this.chartOptions);\r\n this.chartFullSizeChartOptions.plugins.legend = {display: false};\r\n\r\n this.isRenderForExport();\r\n\r\n this.prepareGraphFonts();\r\n\r\n }\r\n\r\n ngDoCheck(): void {\r\n this.doAddPieAndDoughnutChartFullScreenLegend();\r\n }\r\n\r\n\r\n}\r\n","import {Component, ElementRef, Input, OnInit, ViewChild} from '@angular/core';\r\nimport {ChartDataset} from 'chart.js';\r\nimport {GraphService} from '../../shared/services/graph.service';\r\nimport { ShareService } from '../../shared/services/share.service';\r\n\r\nimport { FormatChartNumberPipe } from '../../shared/filters/format-chart-number-pipe';\r\nimport { DecimalPipe, CurrencyPipe, PercentPipe } from '@angular/common';\r\nimport { ChartFormatInfo } from '../../shared/interfaces/ChartFormatInfo';\r\nimport { graphProperties } from '../../../environments/environment';\r\nimport { SilverWareArrays } from '../../shared/services/SilverWareArrays';\r\nimport {ChartJsBase} from '../../shared/classes/chart-js-base';\r\nimport {BaseChartDirective} from 'ng2-charts';\r\nimport {AvailableChartType} from '../../shared/enums/available-chart-type.enum';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n@Component({\r\n selector: 'app-line-chart',\r\n templateUrl: './line-chart.component.html',\r\n styleUrls: ['./line-chart.component.css'],\r\n providers: [FormatChartNumberPipe, DecimalPipe, CurrencyPipe, PercentPipe]\r\n})\r\n\r\nexport class LineChartComponent extends ChartJsBase implements OnInit {\r\n\r\n readonly chartJsType = this.chartJsTypes.line;\r\n readonly chartType = AvailableChartType.LineChart;\r\n\r\n @Input() set data(d: ChartDataset<'line'>[]) {\r\n\r\n this.datasets = d;\r\n\r\n let colors: string[] = [];\r\n const dataSetsLength = d.length;\r\n\r\n // If we have more than one comparisons update our legend\r\n this.overrideShowLegend = dataSetsLength > 1;\r\n\r\n // For each compare update our colours\r\n for (let j = 0; j < dataSetsLength; j++) {\r\n\r\n let dataset = >this.datasets[j];\r\n\r\n\r\n let dataElementsLength = dataset.data.length;\r\n let others = SilverWareArrays.firstOrDefault(this.labels, (x: any) => x == \"Others\");\r\n\r\n if (others != null) {\r\n dataElementsLength--;\r\n }\r\n\r\n let mainColor = j == 0 ? graphProperties.lineDefaultColor : graphProperties.pieDoughnutColors[j];\r\n for (let i = 0; i < dataElementsLength; i++) {\r\n colors.push(mainColor);\r\n }\r\n\r\n if (others != null) {\r\n colors.push(graphProperties.chartOthersColor);\r\n }\r\n dataset.borderWidth = 0.2; // Thin line connecting the dots\r\n dataset.tension = 0.4; // Smooth curve\r\n dataset.borderColor = colors;\r\n dataset.hoverBorderColor = colors;\r\n dataset.pointBackgroundColor = colors;\r\n dataset.pointBorderColor = colors;\r\n dataset.pointHoverBackgroundColor = colors;\r\n dataset.pointHoverBorderColor = colors;\r\n dataset.backgroundColor = graphProperties.clearBackgroundColor;\r\n dataset.hoverBackgroundColor = graphProperties.clearBackgroundColor;\r\n\r\n colors = [];\r\n }\r\n\r\n }\r\n\r\n @ViewChild('lineChartCanvas') canvasElement: ElementRef;\r\n @ViewChild(BaseChartDirective) chartComponent: BaseChartDirective;\r\n\r\n @Input() showLegend: boolean = false;\r\n @Input() renderForExport: boolean = false;\r\n @Input() labels: string[] = [];\r\n @Input() xLabel: string;\r\n @Input() yLabel: string;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() formatInfo: ChartFormatInfo;\r\n\r\n private overrideShowLegend: boolean = false;\r\n\r\n ngOnInit(): void {\r\n\r\n this.chartOptions = {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n plugins: {\r\n datalabels: {\r\n display: false,\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: tooltipItem => {\r\n const data = tooltipItem.chart.data;\r\n return tooltipItem.label + ': ' + this.formatChartNumberPipe.transform(`${tooltipItem.raw}`, this.formatInfo) + (data.datasets.length > 1 ? \" \" + data.datasets[tooltipItem.datasetIndex].label : '');\r\n },\r\n title: tooltipItem => {\r\n return '';\r\n }\r\n\r\n }\r\n },\r\n legend: {\r\n display: this.showLegend,\r\n position: 'bottom'\r\n }\r\n },\r\n scales: this.defaultScaleChartOptions\r\n };\r\n\r\n if (this.overrideShowLegend !== this.showLegend) {\r\n this.chartOptions.plugins.legend.display = this.overrideShowLegend;\r\n if (!this.chartOptions.plugins.legend.display)\r\n this.chartOptions.plugins.legend.position = null\r\n }\r\n\r\n\r\n this.isRenderForExport();\r\n\r\n }\r\n constructor(graphService: GraphService, shareService: ShareService, formatChartNumberPipe: FormatChartNumberPipe,\r\n pageService: PageService, commonService: CommonService, logService: LogService) {\r\n super(graphService, shareService, formatChartNumberPipe, pageService, commonService, logService)\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 1\">\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
    {{categories[j]}}
    {{label}}\r\n \r\n {{dataEl.data[i].val}}\r\n
    \r\n\r\n
    \r\n\r\n\r\n","import {Component, ElementRef, Input, ViewChild} from '@angular/core';\r\n\r\nimport { FormatChartNumberPipe } from '../../shared/filters/format-chart-number-pipe';\r\nimport { ChartFormatInfo } from '../../shared/interfaces/ChartFormatInfo';\r\nimport { DecimalPipe, CurrencyPipe, PercentPipe } from '@angular/common';\r\nimport { SilverWareArrays } from '../../shared/services/SilverWareArrays';\r\nimport { SeriesDataType } from '../../shared/interfaces/SeriesDataType';\r\nimport {GraphService} from '../../shared/services/graph.service';\r\nimport {ShareService} from '../../shared/services/share.service';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport {Guid} from '../../shared/generate-guid.component';\r\nimport {AvailableChartType} from '../../shared/enums/available-chart-type.enum';\r\nimport {ChartBase} from '../../shared/classes/chart-base';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {ChartDataset} from 'chart.js';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n@Component({\r\n selector: 'app-text-chart',\r\n templateUrl: './text-chart.component.html',\r\n styleUrls: ['./text-chart.component.css'],\r\n providers: [FormatChartNumberPipe, DecimalPipe, CurrencyPipe, PercentPipe]\r\n})\r\nexport class TextChartComponent extends ChartBase {\r\n\r\n @ViewChild('textChartCanvas') canvasElement: ElementRef;\r\n readonly chartType = AvailableChartType.TextChart;\r\n\r\n\r\n @Input() set state(state: {labels: string[], data: ChartDataset[], categories?: string[]}) {\r\n this.categories = state.categories ?? [];\r\n this.data = state.data ?? [];\r\n this.labels = state.labels ?? [];\r\n this.doSetup();\r\n }\r\n\r\n categories: string[];\r\n data: ChartDataset[];\r\n labels: string[];\r\n readonly widgetId: string = Guid.newGuid().toString();\r\n\r\n @Input() heightLimit = 0;\r\n @Input() formatInfo: ChartFormatInfo;\r\n\r\n\r\n constructor(graphService: GraphService, shareService: ShareService, formatChartNumberPipe: FormatChartNumberPipe,\r\n pageService: PageService, commonService: CommonService, logService: LogService) {\r\n super(graphService, shareService, formatChartNumberPipe, pageService, commonService, logService)\r\n }\r\n\r\n private doSetup(): void {\r\n let newData = [];\r\n let dataCount = 0;\r\n this.categories = [];\r\n\r\n // If we have exactly two data sets add the variance column\r\n let addVarianceColumn = this.data.length == 2;\r\n let varianceData = [];\r\n\r\n if (addVarianceColumn == true) {\r\n\r\n // variance is displayed as a percentage\r\n let varianceFormatInfo = {\r\n dataType: SeriesDataType.Percent,\r\n currencyCode: ''\r\n };\r\n\r\n // Formula for variance: ([column 1 value] - [column 2 value]) / [column 1 value]\r\n // Formatted as a percent\r\n for (let i = 0; i < this.data[0].data.length; i++) {\r\n let varianceVal = (Number(this.data[0].data[i]) - Number(this.data[1].data[i])) / Number(this.data[0].data[i]);\r\n\r\n if (!isNaN(varianceVal) && isFinite(varianceVal)) {\r\n let showDownArrow = false;\r\n\r\n if (varianceVal < 0) {\r\n varianceVal = varianceVal * -1;\r\n }\r\n else {\r\n showDownArrow = true;\r\n }\r\n\r\n let styleColour = showDownArrow ? \"red\" : \"green\";\r\n\r\n let dataObject = {\r\n val: \" \" + this.formatChartNumberPipe.transform(varianceVal.toString(), varianceFormatInfo),\r\n icon: showDownArrow ? \"fas fa-caret-down\": \"fas fa-caret-up\",\r\n valStyle: styleColour,\r\n iconStyle: styleColour\r\n }\r\n\r\n varianceData.push(dataObject);\r\n }\r\n else {\r\n varianceData.push({});\r\n }\r\n }\r\n }\r\n\r\n // Loop through and create the table\r\n SilverWareArrays.forEach(this.data, (data: any) => {\r\n\r\n newData = [];\r\n SilverWareArrays.forEach(data.data, (x: any) => {\r\n\r\n let dataObject = {\r\n val: this.formatChartNumberPipe.transform(x, this.formatInfo)\r\n }\r\n\r\n newData.push(dataObject)\r\n });\r\n\r\n this.data[dataCount].data = newData;\r\n this.categories.push(this.data[dataCount].label);\r\n dataCount++;\r\n });\r\n\r\n // Add variance column to our data\r\n if (addVarianceColumn == true) {\r\n this.data.push({\r\n data: varianceData,\r\n label: \"Variance\"\r\n });\r\n\r\n this.categories.push(\"Variance\");\r\n }\r\n }\r\n}\r\n","import {Component, ElementRef, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';\r\n\r\nimport { FormatChartNumberPipe } from '../../shared/filters/format-chart-number-pipe';\r\nimport { DecimalPipe, CurrencyPipe, PercentPipe } from '@angular/common';\r\nimport {GraphService} from '../../shared/services/graph.service';\r\nimport {ShareService} from '../../shared/services/share.service';\r\nimport {ChartBase} from '../../shared/classes/chart-base';\r\nimport {AvailableChartType} from '../../shared/enums/available-chart-type.enum';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n@Component({\r\n selector: 'app-report-chart',\r\n templateUrl: './report-chart.component.html',\r\n styleUrls: ['./report-chart.component.css'],\r\n providers: [FormatChartNumberPipe, DecimalPipe, CurrencyPipe, PercentPipe]\r\n})\r\nexport class ReportChartComponent extends ChartBase implements OnInit, OnDestroy {\r\n readonly chartType = AvailableChartType.Report;\r\n\r\n @ViewChild('reportChartCanvas') canvasElement: ElementRef;\r\n\r\n @Input() heightLimit = 0;\r\n @Input() databitHTML: string;\r\n @Input() widgetId: string;\r\n private interval: any = null;\r\n\r\n constructor(graphService: GraphService, shareService: ShareService, formatChartNumberPipe: FormatChartNumberPipe,\r\n pageService: PageService, commonService: CommonService, logService: LogService) {\r\n super(graphService, shareService, formatChartNumberPipe, pageService, commonService, logService)\r\n }\r\n\r\n ngOnInit(): void {\r\n this.interval = setInterval(() => {\r\n // Set our html to the databit's output\r\n const contentDiv = document.getElementById(this.widgetId);\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(contentDiv)) {\r\n return;\r\n }\r\n\r\n this.destroyInterval();\r\n contentDiv.innerHTML = this.databitHTML;\r\n\r\n // If we're full screen allow scrolling\r\n const indexOfFullScreen = this.widgetId.indexOf('fullScreen');\r\n if (indexOfFullScreen > -1) {\r\n contentDiv.style.maxHeight = '100%';\r\n contentDiv.style.overflow = 'visible';\r\n\r\n const dateFilterDiv = document.getElementById(\"chartDateFilter\");\r\n dateFilterDiv.style.width = \"100%\";\r\n\r\n }\r\n }, 100);\r\n }\r\n\r\n private destroyInterval(): void {\r\n if (this.interval !== null) {\r\n this.logService.colouredConsoleDebug(`Interval destroy for widget ${this.widgetId}`);\r\n clearInterval(this.interval);\r\n this.interval = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyInterval();\r\n }\r\n}\r\n","
    \r\n\r\n
    \r\n
    \r\n","export enum InputType {\r\n Text = 'text',\r\n Email = 'email',\r\n Tel = 'tel',\r\n Password = 'password',\r\n Number = 'number'\r\n}\r\n","
    \r\n
    \r\n

    \r\n {{title}}\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n {{input.ErrorMsg}}\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n","import {Component, Input, OnInit, Output} from '@angular/core';\r\nimport {Guid} from '../../shared/generate-guid.component';\r\nimport {InputType} from '../../shared/enums/input-type.enum';\r\nimport {SilverWareArrays} from '../../shared/services/SilverWareArrays';\r\n\r\n@Component({\r\n selector: 'app-multi-line-input',\r\n templateUrl: './multi-line-input.component.html',\r\n styleUrls: ['./multi-line-input.component.css']\r\n})\r\nexport class MultiLineInputComponent implements OnInit {\r\n inputsWithValue: InputWithValue[];\r\n\r\n @Input() inputType: InputType = InputType.Text;\r\n @Input() title: string = '';\r\n @Input() required: boolean = true;\r\n @Input() validationCallback = (value: T): string => {return null};\r\n @Input() placeHolder: any = '[Please enter your input value]';\r\n @Input() values = (values: string[]): void => {};\r\n @Input() initialValues: string[] = [];\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.inputsWithValue = [];\r\n if (this.initialValues && this.initialValues.length > 0) {\r\n this.initialValues.forEach((e: string) => {\r\n this.inputsWithValue.push({\r\n ID: Guid.newGuid().toString(),\r\n Value: e\r\n });\r\n\r\n });\r\n this.values(this.initialValues);\r\n } else {\r\n this.addNewInput();\r\n }\r\n\r\n }\r\n\r\n // -------------------- Helpers ---------------------\r\n byID(index, item) {\r\n return item.ID;\r\n }\r\n\r\n addNewInput(): void {\r\n this.inputsWithValue.push({\r\n ID: Guid.newGuid().toString(),\r\n Value: null\r\n });\r\n }\r\n\r\n removeInput(index: number): void {\r\n if (this.inputsWithValue.length > 1) {\r\n this.inputsWithValue.splice(index, 1);\r\n }\r\n }\r\n\r\n detectInputChanges(index: number): void {\r\n this.inputsWithValue[index].ErrorMsg = null;\r\n const values: string[] = [];\r\n SilverWareArrays.forEach(this.inputsWithValue, (x: InputWithValue) => {\r\n if (x.ErrorMsg === null || x.ErrorMsg === undefined) {\r\n values.push(x.Value);\r\n }\r\n });\r\n this.values(values);\r\n }\r\n\r\n validateInputChanges(index: number): void {\r\n const input = this.inputsWithValue[index];\r\n input.ErrorMsg = null;\r\n if (this.required) {\r\n if (input.Value === null || input.Value === undefined || input.Value.toString().trim() === '') {\r\n this.inputsWithValue[index].ErrorMsg = 'This field is required';\r\n return;\r\n }\r\n }\r\n if (this.validationCallback) {\r\n this.inputsWithValue[index].ErrorMsg = this.validationCallback(input.Value);\r\n }\r\n }\r\n\r\n\r\n}\r\ninterface InputWithValue {\r\n ID: string;\r\n Value: any;\r\n ErrorMsg?: string;\r\n}\r\n","
    \r\n\r\n\r\n\r\n
    \r\n
    \r\n
    {{title}}
    \r\n
    \r\n
    \r\n
    {{subTitle}}
    \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
    Error:
    \r\n

    \r\n {{loadingError}}\r\n

    \r\n

    \r\n Please contact technical support team!\r\n

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

    There were no results from that report. Please adjust your report parameters. You can do this from the Widget Filter.

    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n {{chartDateFilter}}\r\n
    \r\n
    \r\n
    \r\n\r\n
    [{{chartState}}]
    \r\n
    \r\n
    \r\n \r\n
    \r\n\r\n
    \r\n
    \r\n","import {AfterViewInit, Component, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';\r\nimport {animate, style, transition, trigger} from '@angular/animations';\r\nimport {ModalService} from '../../shared/services/modal.service';\r\nimport {FilterOptionsComponent} from '../filter-options/filter-options.component';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport {ChartTypePipe} from '../../shared/filters/chart-type.pipe';\r\nimport {AddWhiteSpacePipe} from '../../shared/filters/add-white-space.pipe';\r\nimport {DatabitParameterValue} from '../../shared/interfaces/DatabitParameterValue';\r\nimport {ComparisonParameterValue} from '../../shared/interfaces/ComparisonParameterValue';\r\nimport {AvailableChartType} from '../../shared/enums/available-chart-type.enum';\r\nimport {SilverWareEnums} from '../../shared/services/SilverWareEnums';\r\nimport {SilverWareArrays} from '../../shared/services/SilverWareArrays';\r\nimport {ObjectState} from '../../shared/interfaces/ObjectState';\r\nimport {DatabitConfig} from '../../shared/interfaces/DatabitConfig';\r\nimport {DatabitParameter} from '../../shared/interfaces/DatabitParameter';\r\nimport {DatabitCategory} from '../../shared/interfaces/DatabitCategory';\r\nimport {Databit} from '../../shared/interfaces/Databit';\r\nimport {Email} from '../../shared/interfaces/Email';\r\nimport {DashboardType} from '../../shared/interfaces/DashboardType';\r\nimport {SilverWareIcons} from '../../shared/services/SilverWareIcons';\r\nimport * as moment from 'moment';\r\nimport {PieChartComponent} from '../pie-chart/pie-chart.component';\r\nimport {BarChartComponent} from '../bar-chart/bar-chart.component';\r\nimport {DoughnutChartComponent} from '../doughnut-chart/doughnut-chart.component';\r\nimport {LineChartComponent} from '../line-chart/line-chart.component';\r\nimport {TextChartComponent} from '../text-chart/text-chart.component';\r\nimport {ReportChartComponent} from '../report-chart/report-chart.component';\r\nimport {ShareService} from '../../shared/services/share.service';\r\n\r\nimport {ChartConfig} from '../../shared/interfaces/ChartConfig';\r\nimport {ChartFormatInfo} from '../../shared/interfaces/ChartFormatInfo';\r\nimport {SilverWareCommon} from '../../shared/services/SilverWareCommon';\r\n\r\nimport {groupings} from '../../../environments/environment';\r\nimport * as _ from 'lodash';\r\nimport {ShareReportRequest} from '../../shared/interfaces/requests/share-report-request';\r\nimport {AuthService} from '../../shared/services/auth.service';\r\nimport {MultiLineInputComponent} from '../../templates/multi-line-input/multi-line-input.component';\r\nimport {InputType} from '../../shared/enums/input-type.enum';\r\nimport {ChartBase} from '../../shared/classes/chart-base';\r\nimport {CommonService} from '../../shared/services/common.service';\r\nimport {RunDatabitResult} from '../../shared/responses/run-databit-response';\r\nimport {SeriesResult} from '../../shared/types/series-result';\r\nimport {DefaultSeriesAndCategories} from '../../shared/types/default-series-and-categories';\r\nimport {DatabitSiries, DatabitSiriesCategoryInfo, DatabitSiriesInfo} from '../../shared/types/databit-siries';\r\nimport {SeriesData} from '../../shared/types/series-data';\r\nimport {CategoryData} from '../../shared/types/category-data';\r\nimport {NameValue} from '../../shared/types/name-value';\r\nimport {ChartDataset} from 'chart.js';\r\nimport {NameValueIcon} from '../../shared/types/name-value-icon';\r\nimport {ChartParsedData} from '../../shared/types/chart-parsed-data';\r\nimport {GroupCharData} from '../../shared/types/group-char-data';\r\nimport {LogService} from \"../../shared/services/log.service\";\r\n\r\n\r\n@Component({\r\n selector: 'app-chart',\r\n templateUrl: './chart.component.html',\r\n styleUrls: ['./chart.component.css'],\r\n providers: [ChartTypePipe, AddWhiteSpacePipe],\r\n animations: [\r\n trigger(\r\n 'inOutAnimation',\r\n [\r\n transition(\r\n ':enter',\r\n [\r\n style({ visibility: 'hidden', opacity: 0 }),\r\n animate('.7s ease-out',\r\n style({ visibility: 'visible', opacity: 1 }))\r\n ]\r\n ),\r\n transition(\r\n ':leave',\r\n [\r\n style({ visibility: 'visible', opacity: 1 }),\r\n animate('0s',\r\n style({ visibility: 'hidden', opacity: 0 }))\r\n ]\r\n )\r\n ]\r\n )\r\n ]\r\n})\r\n\r\nexport class ChartComponent implements OnInit, OnDestroy, AfterViewInit {\r\n private graphComponent: ChartBase;\r\n\r\n @ViewChild(BarChartComponent) set barChartComponent(content: BarChartComponent) {\r\n if (content != null) {\r\n this.graphComponent = content;\r\n }\r\n }\r\n @ViewChild(DoughnutChartComponent) set doughnutChartComponent(content: DoughnutChartComponent) {\r\n if (content != null) {\r\n this.graphComponent = content;\r\n }\r\n }\r\n @ViewChild(LineChartComponent) set lineChartComponent(content: LineChartComponent) {\r\n if (content != null) {\r\n this.graphComponent = content;\r\n }\r\n }\r\n @ViewChild(PieChartComponent) set pieChartComponent(content: PieChartComponent) {\r\n if (content != null) {\r\n this.graphComponent = content;\r\n }\r\n }\r\n @ViewChild(TextChartComponent) set textChartComponent(content: TextChartComponent) {\r\n if (content != null) {\r\n this.graphComponent = content;\r\n }\r\n }\r\n @ViewChild(ReportChartComponent) set reportChartComponent(content: ReportChartComponent) {\r\n if (content != null) {\r\n this.graphComponent = content;\r\n }\r\n }\r\n\r\n @Input() set widget(widget: DatabitConfig) {\r\n // console.log(widget);\r\n this.databitName = widget.databitName;\r\n // console.log(`Looking for ${this.databitName} databit`);\r\n this.databitInfo = this.pageService.getDatabitInfo(this.databitName);\r\n if (this.databitInfo != null) {\r\n // console.log(`Found ${this.databitName} databit`);\r\n this.title = widget.displayName != null ? widget.displayName : this.databitInfo.displayName;\r\n this.databitCategory = this.databitInfo.category;\r\n this.chainID = widget.chainID;\r\n this.chartConfig = this.databitInfo.chartConfigs;\r\n this.subTitle = this.pageService.getStoreNameByStoreId(widget.storeID);\r\n this.storeID = widget.storeID;\r\n this.description = this.databitInfo.description;\r\n this.databitsParameters = this.databitInfo.parameters;\r\n this.comparable = this.databitInfo.comparable;\r\n this.includeInAvrio = this.databitInfo.includeInAvrio;\r\n this.orientation = this.databitInfo.orientation;\r\n this.active = this.databitInfo.active;\r\n this.missing = this.databitInfo.missing;\r\n this.databitsParameterValues = widget.parameterValues;\r\n this.comparisonParameterValues = widget.comparisonParameterValues;\r\n this.chartWidget = widget;\r\n this.chartState = null;\r\n this.widgetId = widget.id;\r\n this.seriesOverride = widget.seriesOverride;\r\n // TODO: we default chart type\r\n // We want to use the chart type which was saved on the widget, however we also want to make sure that\r\n // that chart type is still available for this widget\r\n this.defaultChartType = this.getWidgetChartType(widget.chartType, this.databitInfo);\r\n this.getChartData();\r\n } else {\r\n this.logService.error(`ChartComponent - could not find the ${this.databitName} in Available Databits Array!`);\r\n this.loadingError = `Could not find the ${this.databitName} in Available Databits Array!`;\r\n }\r\n }\r\n @Input() renderForExport: boolean = false;\r\n @Input() showLegend: boolean = false;\r\n\r\n enlargeHeart: boolean = false;\r\n heartOn: boolean = this.pageService.currentDashboardType === DashboardType.Heartbeat;\r\n\r\n private chainID: string;\r\n private storeID: string;\r\n\r\n private databitName: string;\r\n private databitCategory: DatabitCategory;\r\n private chartWidget: DatabitConfig;\r\n private databitInfo: Databit;\r\n private dataSeries: SeriesResult;\r\n\r\n private defaultSeriesAndCategories: DefaultSeriesAndCategories;\r\n\r\n private comparisonsData: SeriesResult[];\r\n private selectedDataSeries: SeriesData;\r\n private compareDataSeries: SeriesData[] = [];\r\n\r\n public type: AvailableChartType;\r\n public labels: string[] = [];\r\n public data: ChartDataset[];\r\n\r\n public formatInfo: ChartFormatInfo;\r\n private isTimeSeriesOrTextData: boolean;\r\n\r\n\r\n private dataConst: ChartDataset[];\r\n private labelsConst: string[] = [];\r\n public widgetId: string;\r\n public title: string;\r\n public description: string;\r\n public comparable: boolean;\r\n public includeInAvrio: boolean;\r\n public orientation: number;\r\n public active: boolean;\r\n public missing: boolean;\r\n public subTitle: string;\r\n public xLabel: string;\r\n public yLabel: string;\r\n public databitsParameterValues: Array;\r\n public databitsParameters: Array;\r\n public showLoading: boolean;\r\n public loadingError = null;\r\n public isNoResultData: boolean = false;\r\n public chartTypes = [];\r\n public defaultChartType: number;\r\n public chartState: AvailableChartType;\r\n private getDataInterval: any;\r\n private chartConfig: ChartConfig;\r\n private seriesOverride = [];\r\n private allSeries = [];\r\n public databitHTML: string;\r\n public comparisonParameterValues: Array;\r\n\r\n public chartDateFilter: string; // display text of widget's date filter underneath the graph\r\n\r\n\r\n constructor(private modalService: ModalService, public pageService: PageService,\r\n private chartTypeConverter: ChartTypePipe, private addWhiteSpaceConverter: AddWhiteSpacePipe,\r\n private shareService: ShareService, private authService: AuthService, public commonService: CommonService,\r\n protected logService: LogService) {\r\n\r\n }\r\n\r\n private getWidgetChartType(widgetChartType: AvailableChartType, databit: Databit): AvailableChartType {\r\n\r\n let widgetChartTypeStr = AvailableChartType[widgetChartType];\r\n\r\n if (databit.chartConfigs.allowedChartTypes && databit.chartConfigs.allowedChartTypes.length > 0 && databit.chartConfigs.allowedChartTypes[0] == \"All\") {\r\n return widgetChartType;\r\n }\r\n\r\n let existingChartType = SilverWareArrays.firstOrDefault(databit.chartConfigs.allowedChartTypes, (x) => x == widgetChartTypeStr);\r\n\r\n if (existingChartType != null) {\r\n return widgetChartType;\r\n }\r\n else {\r\n let defaultChartTypeStr = databit.chartConfigs.defaultChartType;\r\n let defaultChartType = AvailableChartType[defaultChartTypeStr];\r\n return defaultChartType;\r\n }\r\n }\r\n\r\n private static convertToChartFormat(data: SeriesData, chartType: AvailableChartType, compareData: SeriesData[] = []): ChartDataset[] {\r\n const parsedData: ChartDataset[] = [];\r\n\r\n // Create a dataset for each comparison\r\n if (compareData != null && compareData.length > 1) {\r\n SilverWareArrays.forEach(compareData, (cData: SeriesData): void => {\r\n let label = cData.labelOverride;\r\n\r\n if (cData.values == null) {\r\n cData.values = [];\r\n }\r\n parsedData.push({ data: cData.values, label: label })\r\n });\r\n\r\n }\r\n else {\r\n parsedData.push({ data: data.values, label: data.id })\r\n }\r\n return parsedData;\r\n // switch (chartType) {\r\n // case AvailableChartType.Unknown:\r\n // console.error('Chart type is unknown!');\r\n // break;\r\n // case AvailableChartType.BarChart:\r\n // case AvailableChartType.LineChart:\r\n // case AvailableChartType.TextChart:\r\n // case AvailableChartType.Report:\r\n // case AvailableChartType.DoughnutChart:\r\n // return parsedData;\r\n //\r\n // case AvailableChartType.PieChart:\r\n // return parsedData.map((dataset) => {\r\n // return dataset.data;\r\n // });\r\n // default:\r\n // console.error('Chart Type NOT IMPLEMENTED!');\r\n // }\r\n }\r\n\r\n private static isResultDataNonEmpty(data: string[], type: number) {\r\n\r\n if (data && data.length > 0) {\r\n let numbersArray = [];\r\n\r\n\r\n SilverWareArrays.forEach(data, (val: string) => {\r\n let matches = val.match(/\\d+/g); // filter all currency symbols, thousand separators and decimal separators.\r\n\r\n let numStr = matches.join(\"\");\r\n\r\n numbersArray.push(parseInt(numStr));\r\n });\r\n\r\n if (type == AvailableChartType.Report)\r\n return numbersArray.length > 0;\r\n\r\n return numbersArray.filter((x) => x > 0).length > 0;\r\n }\r\n\r\n return false;\r\n\r\n\r\n\r\n\r\n }\r\n\r\n OnHoverHeart(): void {\r\n this.enlargeHeart = true;\r\n }\r\n\r\n OnLeaveHeart(): void {\r\n this.enlargeHeart = false;\r\n }\r\n\r\n OnClickHeart(): void {\r\n if (this.pageService.currentDashboardType !== DashboardType.Heartbeat) {\r\n const dismiss = () => {\r\n this.heartOn = false;\r\n };\r\n this.modalService.confirm('Are you sure you want to add this widget to heartbeat?',\r\n 'Add the Widget to Heartbeat', 'No', dismiss, 'Yes', () => {\r\n const newChart: DatabitConfig = {\r\n databitName: this.chartWidget.databitName,\r\n displayName: this.title,\r\n chartType: this.defaultChartType,\r\n chartConfigs: this.chartConfig,\r\n storeID: this.storeID,\r\n chainID: this.chainID,\r\n objectState: ObjectState.Added,\r\n parameterValues: this.databitsParameterValues,\r\n id: SilverWareCommon.newGuid(),\r\n seriesOverride: this.seriesOverride,\r\n comparisonParameterValues: this.comparisonParameterValues\r\n };\r\n this.pageService.addToHeartbeat(newChart);\r\n this.heartOn = false;\r\n });\r\n } else {\r\n if (this.heartOn) {\r\n const dismiss = () => {\r\n this.heartOn = true;\r\n };\r\n this.modalService.confirm('Are you sure you want to delete this widget?', 'Delete Widget', 'No', dismiss, 'Yes', () => {\r\n this.saveChanges(ObjectState.Deleted);\r\n });\r\n }\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n const chartTypes = SilverWareEnums.getNamesAndValues(AvailableChartType);\r\n\r\n SilverWareArrays.forEach(chartTypes, (type: any) => {\r\n if (type.value !== 0) {\r\n this.chartTypes.push({\r\n name: this.addWhiteSpaceConverter.transform(type.name),\r\n value: type.value, icon: SilverWareIcons.chartsIcon(type.name)\r\n });\r\n }\r\n });\r\n }\r\n\r\n get allowedChartTypes(): NameValueIcon[] {\r\n let allowedChartTypes = [];\r\n let chartTypes = [];\r\n if (!this.chartConfig || !this.chartConfig.allowedChartTypes || this.chartConfig.allowedChartTypes[0] === 'All') {\r\n chartTypes = SilverWareEnums.getNamesAndValues(AvailableChartType);\r\n SilverWareArrays.forEach(chartTypes, (type: any) => {\r\n if (type.value !== 0 && (this.comparisonParameterValues == null || this.comparisonParameterValues.length < 2 || (type.value != AvailableChartType.DoughnutChart && type.value != AvailableChartType.PieChart && type.value != AvailableChartType.Report))) {\r\n allowedChartTypes.push({\r\n name: this.addWhiteSpaceConverter.transform(type.name),\r\n value: type.value, icon: SilverWareIcons.chartsIcon(type.name)\r\n });\r\n }\r\n });\r\n }\r\n else if (this.chartConfig.allowedChartTypes[0] === 'None') {\r\n return [];\r\n }\r\n else {\r\n this.chartConfig.allowedChartTypes.forEach(str => {\r\n let type = AvailableChartType[str]\r\n if (this.comparisonParameterValues == null || this.comparisonParameterValues.length < 2 || (type.value != AvailableChartType.DoughnutChart && type.value != AvailableChartType.PieChart && type.value != AvailableChartType.Report)) {\r\n allowedChartTypes.push({\r\n name: this.addWhiteSpaceConverter.transform(str),\r\n value: type, icon: SilverWareIcons.chartsIcon(str)\r\n });\r\n }\r\n\r\n });\r\n }\r\n\r\n return allowedChartTypes;\r\n }\r\n\r\n // Adds a space before each capital letter and then trims\r\n convertSeriesToModal(seriesList: any[]): NameValue[] {\r\n let modalSeries: NameValue[] = [];\r\n for (let i = 0; i < seriesList.length; i++) {\r\n modalSeries.push({\r\n name: seriesList[i].id.replace(/([A-Z])/g, ' $1').trim(),\r\n value: seriesList[i].id\r\n })\r\n }\r\n\r\n return modalSeries;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n\r\n }\r\n\r\n\r\n // Load the dynamic filter-option component into modal service\r\n // Let the user to change the databit parameters\r\n showFilterOptions(): void {\r\n let originalComparisons = _.cloneDeep(this.comparisonParameterValues);\r\n\r\n // Set our comparison back to the original object if canceled our of the filter window\r\n const cancelCleanUpComparisons = (): void => {\r\n this.comparisonParameterValues = originalComparisons;\r\n };\r\n\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n this.showLoading = true;\r\n this.loadingError = null;\r\n const index = SilverWareArrays.indexOf(copyDatabitsParameterValues,\r\n (item: DatabitParameterValue) => item.name === 'storeID');\r\n if (index > -1) {\r\n this.storeID = copyDatabitsParameterValues[index].value;\r\n copyDatabitsParameterValues.splice(index, 1);\r\n }\r\n this.databitsParameterValues = copyDatabitsParameterValues;\r\n //this.comparisonParameterValues = copyComparisons;\r\n this.subTitle = this.pageService.getStoreNameByStoreId(this.storeID);\r\n // If we changed the filter we need to run the databit again\r\n this.isNoResultData = false;\r\n\r\n let comparisonParameterValues = [];\r\n\r\n // Loop through each comparison and save the parameters\r\n if (copyComparisons != null && copyComparisons.length > 0) {\r\n SilverWareArrays.forEach(copyComparisons, (comparison: any) => {\r\n\r\n let currentCompareDetails = [];\r\n SilverWareArrays.forEach(comparison.parametersDetails, (parameterDetail: any) => {\r\n\r\n // Type 9 is more filters we don't want to include it\r\n if (parameterDetail.type != 9 && parameterDetail.selectedValue != null) {\r\n let value = parameterDetail.selectedValue;\r\n\r\n // If the value is an array serialize it\r\n if (Array.isArray(value)) {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n currentCompareDetails.push({\r\n name: parameterDetail.name,\r\n value: value\r\n });\r\n }\r\n });\r\n\r\n comparisonParameterValues.push({\r\n name: comparison.name,\r\n parametersDetails: currentCompareDetails,\r\n storeID: comparison.storeID\r\n });\r\n });\r\n\r\n // If we are currently not a bar, line or text chart change type to bar chart\r\n if (copyComparisons.length > 1 && this.defaultChartType != AvailableChartType.BarChart && this.defaultChartType != AvailableChartType.LineChart && this.defaultChartType != AvailableChartType.TextChart) {\r\n this.type = this.defaultChartType = AvailableChartType.BarChart;\r\n }\r\n }\r\n\r\n this.comparisonParameterValues = comparisonParameterValues;\r\n\r\n this.prerenderChart();\r\n\r\n this.pageService.runDatabit(this.databitName, 'no-chain-id', this.storeID, this.databitsParameterValues, false, this.comparisonParameterValues).then(response => {\r\n\r\n this.renderChart(response);\r\n\r\n }, err => {\r\n const errorMsg = this.commonService.flattenErrorMessages(err);\r\n this.logService.error(errorMsg);\r\n this.loadingError = errorMsg;\r\n this.showLoading = false;\r\n });\r\n if (this.pageService.currentDashboardType !== DashboardType.Other) {\r\n this.saveChanges(ObjectState.Modified);\r\n }\r\n\r\n },\r\n isDismiss: true,\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n // Deep copy the object\r\n let copyDatabitsParameterValues = [];\r\n if (this.databitsParameterValues != null) {\r\n copyDatabitsParameterValues = this.databitsParameterValues.map(x => Object.assign({}, x));\r\n }\r\n\r\n // Deep copy comparisons\r\n let copyComparisons = [];\r\n if (this.comparisonParameterValues != null) {\r\n SilverWareArrays.forEach(this.comparisonParameterValues, (compare: any) => {\r\n\r\n copyComparisons.push({\r\n name: compare.name,\r\n parametersDetails: compare.parametersDetails,\r\n storeID: compare.storeID\r\n })\r\n });\r\n\r\n }\r\n const modalObject = {\r\n size: 'modal-lg',\r\n title: 'Custom Filters',\r\n template: FilterOptionsComponent,\r\n buttons: [saveBtn],\r\n override: true,\r\n buttonsContainerStyle: { display: 'flex', justifyContent: 'space-evenly' },\r\n templateInputs: [\r\n { key: 'databitsParameterValues', value: copyDatabitsParameterValues },\r\n { key: 'databitsParameters', value: this.databitsParameters },\r\n { key: 'currentDatabit', value: this.databitName },\r\n { key: 'storeId', value: this.storeID },\r\n { key: 'comparisons', value: copyComparisons },\r\n { key: 'showCompare', value: this.active }\r\n ],\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.show(modalObject, cancelCleanUpComparisons);\r\n }\r\n\r\n private getChartTypeString(databit: Databit, chartType: number) {\r\n\r\n // if proposed chartType is not available in the list of Charts for this databit..Pick the first available one\r\n //if (databit.chartConfigs != null && databit.chartConfigs.defaultChartType) {\r\n // return this.chartTypeConverter.transform(chartType)\r\n //}\r\n\r\n return this.chartTypeConverter.transform(chartType);\r\n }\r\n\r\n // Will add the chart to page service queue and get the run data from page service queue\r\n private getChartData() {\r\n this.loadingError = null;\r\n this.showLoading = true;\r\n const queueId = this.pageService.addToQueueProcessData(this.databitName, this.databitsParameterValues, this.storeID, this.comparisonParameterValues);\r\n let canProcess = this.pageService.requestToProcess(queueId);\r\n\r\n this.prerenderChart();\r\n\r\n const fetchData = () => {\r\n\r\n const queueData = this.pageService.getProcessed(queueId);\r\n if (queueData != null) {\r\n this.logService.colouredConsoleDebug(`Chart Got Data Queue ID: ${queueData.id}`);\r\n clearInterval(this.getDataInterval);\r\n this.logService.colouredConsoleDebug('Cleared chart interval for fetching data');\r\n\r\n this.showLoading = false;\r\n if (queueData.error == null) {\r\n\r\n // chart.js takes the chart type in string\r\n this.isNoResultData = false;\r\n\r\n if (queueData.runResponse != null) {\r\n\r\n this.renderChart(queueData.runResponse);\r\n\r\n\r\n }\r\n else {\r\n if (queueData.error != null && queueData.error != '') {\r\n this.loadingError = queueData.error;\r\n }\r\n else {\r\n this.loadingError = `Could not get data for \"${this.databitName}\" from server!`;\r\n }\r\n\r\n this.logService.error(this.loadingError);\r\n\r\n this.chartDateFilter = null;\r\n }\r\n\r\n this.showLoading = false;\r\n\r\n } else {\r\n this.logService.error(`Chart getDatabitParameterValues error: ${queueData.error}`);\r\n this.loadingError = queueData.error;\r\n this.showLoading = false;\r\n this.chartDateFilter = null;\r\n }\r\n }\r\n };\r\n this.getDataInterval = setInterval(() => {\r\n if (canProcess) {\r\n // console.log(`Chart data is ready for process: ${canProcess}`);\r\n fetchData();\r\n } else {\r\n canProcess = this.pageService.requestToProcess(queueId);\r\n // console.log(`Chart Data is ready for process: ${canProcess}`);\r\n // console.log(`We will wait for the next interval`);\r\n const isProcessedDone = this.pageService.isProcessedDone(queueId);\r\n // Timeout\r\n if (isProcessedDone) {\r\n clearInterval(this.getDataInterval);\r\n }\r\n }\r\n }, this.pageService.intervalDelay);\r\n }\r\n ngOnDestroy() {\r\n // Will clear when component is destroyed e.g. route is navigated away from.\r\n clearInterval(this.getDataInterval);\r\n this.logService.colouredConsoleDebug('chart.component clear interval on destroy');\r\n }\r\n // Allows to change the chart title\r\n public changeTitle() {\r\n const newTitle = this.title;\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const modalObject = {\r\n inputData: newTitle,\r\n inputType: 'text',\r\n inputLabel: 'Title',\r\n buttons: [saveBtn],\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.input(null, 'Modify Title', modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData !== this.title) {\r\n this.title = result.inputData;\r\n this.saveChanges(ObjectState.Modified);\r\n }\r\n\r\n });\r\n }\r\n\r\n // Allows to change the chart graph type\r\n public changeGraphType(): void {\r\n\r\n const chartType = this.defaultChartType;\r\n\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n\r\n // Object for asking what graph type the users wants\r\n const graphTypeModalObject = {\r\n inputData: chartType,\r\n inputLabel: 'Graph type',\r\n buttons: [saveBtn],\r\n selectList: this.allowedChartTypes,\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n\r\n\r\n // First ask what type of graph they would like\r\n this.modalService.list(null, 'Change Graph Type', graphTypeModalObject, null, 'Cancel', (chartTypeResult: {inputData: number}) => {\r\n\r\n if (chartTypeResult.inputData === null || chartTypeResult.inputData === undefined || chartTypeResult.inputData === this.defaultChartType)\r\n return;\r\n\r\n this.defaultChartType = chartTypeResult.inputData;\r\n this.type = this.defaultChartType;\r\n \r\n // Not needed. We have already chosen which series and category to use it. We dont need to re-do this.\r\n if (this.dataSeries != null && this.defaultSeriesAndCategories.dataCategory != null) {\r\n this.labelsConst = this.defaultSeriesAndCategories.dataCategory.values;\r\n }\r\n this.dataConst = ChartComponent.convertToChartFormat(this.selectedDataSeries, this.defaultChartType, this.compareDataSeries);\r\n\r\n let tempChartData: GroupCharData = {\r\n data: this.dataConst,\r\n labels: this.labelsConst\r\n };\r\n\r\n let groupedData = this.commonService.groupDataBySize(groupings.defaultGrouping, tempChartData, this.isTimeSeriesOrTextData, this.isTimeSeriesOrTextData);\r\n this.labels = groupedData.labels;\r\n this.data = groupedData.data;\r\n this.saveChanges(ObjectState.Modified);\r\n });\r\n }\r\n\r\n // Allows to change the chart graph type\r\n public changeGraphSeries() {\r\n\r\n if (this.selectedDataSeries != null) {\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n\r\n // Object for asking what metric to graph\r\n const metricModalObject = {\r\n inputData: this.selectedDataSeries.id,\r\n inputLabel: 'Graph Metric',\r\n buttons: [saveBtn],\r\n selectList: this.convertSeriesToModal(this.dataSeries.series),\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n\r\n // First ask what type of graph they would like\r\n // Next ask what metric they would like to graph, if they cancel we will still change the graph type\r\n this.modalService.list(null, 'Change Metric', metricModalObject, null, 'Cancel', (chartMetricResult: any) => {\r\n\r\n if (chartMetricResult.inputData != null) {\r\n // Set our new selected series\r\n this.selectedDataSeries = SilverWareArrays.firstOrDefault(this.dataSeries.series, (x: SeriesData) => x.id == chartMetricResult.inputData);\r\n\r\n // Update data type\r\n let selectedSeries = SilverWareArrays.firstOrDefault(this.allSeries, (x: any) => x.ID == chartMetricResult.inputData);\r\n this.formatInfo.dataType = selectedSeries.DataType;\r\n\r\n // Update the series override\r\n this.seriesOverride = [];\r\n this.seriesOverride.push(this.selectedDataSeries.id);\r\n\r\n // Not needed. We have already chosen which series and category to use it. We dont need to re-do this.\r\n this.labelsConst = this.dataSeries.categories[0].values;\r\n this.dataConst = ChartComponent.convertToChartFormat(this.selectedDataSeries, this.defaultChartType);\r\n let tempChartData = {\r\n data: this.dataConst,\r\n labels: this.labelsConst\r\n }\r\n\r\n let groupedData = this.commonService.groupDataBySize(groupings.defaultGrouping, tempChartData, this.isTimeSeriesOrTextData, this.isTimeSeriesOrTextData);\r\n this.labels = groupedData.labels;\r\n this.data = groupedData.data;\r\n this.saveChanges(ObjectState.Modified);\r\n\r\n }\r\n });\r\n }\r\n else {\r\n this.logService.warn(\"selected data series is null\");\r\n }\r\n }\r\n\r\n // show chart options\r\n public showOptions() {\r\n const btns = [\r\n { name: 'Edit Title', icon: 'fas icon-edit-icon', sequence: 4 },\r\n { name: 'Filter', icon: 'fas fa-filter', sequence: 0 },\r\n { name: 'Refresh', icon: 'fas fa-sync-alt', sequence: 5 },\r\n { name: 'Share', icon: 'fas icon-share-icon-arrow', sequence: 6 }\r\n ];\r\n if (!this.chartConfig || !this.chartConfig.allowedChartTypes || this.chartConfig.allowedChartTypes[0] !== 'None') {\r\n btns.push({ name: 'Chart Type', icon: 'fas fa-chart-bar', sequence: 2 })\r\n }\r\n if (this.selectedDataSeries != null && this.allSeries && this.allSeries.length > 1) {\r\n btns.push({ name: 'Chart Metric', icon: 'fas icon-chart-metric', sequence: 3 })\r\n }\r\n if (this.pageService.currentDashboardType !== this.pageService.DashboardType.Other) {\r\n btns.push({ name: 'Delete', icon: 'fas fa-trash-alt', sequence: 8 }\r\n //,{ name: 'Sort Charts', icon: 'fas fa-sort', sequence: 6 }\r\n );\r\n }\r\n\r\n if (!this.loadingError) {\r\n btns.push({ name: 'Full Screen', icon: 'fas fa-expand-alt', sequence: 1 });\r\n }\r\n\r\n btns.push({ name: 'Add to Dashboard', icon: 'fas fa-plus', sequence: 7 });\r\n\r\n //if (this.pageService.currentDashboardType === this.pageService.DashboardType.Custom\r\n // && this.pageService.customDashboards != null && this.pageService.customDashboards.length > 0) {\r\n // //btns.push({ name: 'Add to Dashboard', icon: 'fas fa-plus', sequence: 7 });\r\n //}\r\n SilverWareArrays.sortAsc(btns, 'sequence');\r\n this.modalService.listButtonV2(null, null, btns, null, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null) {\r\n switch (result.inputData) {\r\n case 'Edit Title':\r\n this.changeTitle();\r\n break;\r\n case 'Chart Type':\r\n this.changeGraphType();\r\n break;\r\n case 'Chart Metric':\r\n this.changeGraphSeries();\r\n break;\r\n case 'Delete':\r\n this.deleteWidget();\r\n break;\r\n case 'Sort Charts': {\r\n this.pageService.rearrange();\r\n break;\r\n }\r\n case 'Add to Dashboard':\r\n const currentWidget: DatabitConfig = {\r\n databitName: this.chartWidget.databitName,\r\n displayName: this.title,\r\n chartType: this.defaultChartType,\r\n storeID: this.storeID,\r\n chainID: this.chainID,\r\n chartConfigs: this.chartConfig,\r\n objectState: ObjectState.Added,\r\n parameterValues: this.databitsParameterValues,\r\n id: SilverWareCommon.newGuid(),\r\n seriesOverride: this.seriesOverride,\r\n comparisonParameterValues: this.comparisonParameterValues\r\n };\r\n this.pageService.addWidgetToDashboard(currentWidget);\r\n break;\r\n case 'Filter':\r\n this.showFilterOptions();\r\n break;\r\n case 'Refresh':\r\n this.forceRun();\r\n break;\r\n case 'Share':\r\n this.share();\r\n break;\r\n case 'Full Screen':\r\n this.chartFullscreen();\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private prerenderChart() {\r\n\r\n let curDateFilter = SilverWareArrays.firstOrDefault(this.databitsParameterValues, (x: any) => x.name == \"DateRange\");\r\n let compareParamValues;\r\n let dateFilters;\r\n let storeIDs;\r\n\r\n // Set our date filter sand store ID variables\r\n if (this.comparisonParameterValues != null && this.comparisonParameterValues.length > 1) {\r\n compareParamValues = SilverWareArrays.selectMany(this.comparisonParameterValues, (x: ComparisonParameterValue) => x.parametersDetails);\r\n storeIDs = SilverWareArrays.select(this.comparisonParameterValues, (x: ComparisonParameterValue) => x.storeID);\r\n\r\n if (compareParamValues != null && compareParamValues.length > 0) {\r\n dateFilters = SilverWareArrays.where(compareParamValues, (x: any) => x.name == \"DateRange\");\r\n }\r\n }\r\n\r\n // If we have one date or each date is the same use the date's value\r\n // Otherwise set the date to be [number of unique dates] Dates\r\n if (curDateFilter != null && dateFilters == null) {\r\n this.chartDateFilter = curDateFilter.value;\r\n }\r\n else if (dateFilters != null && dateFilters.length > 0) {\r\n let firstDate = dateFilters[0].value;\r\n\r\n if (SilverWareArrays.any(dateFilters, (x: any) => x.value != firstDate)) {\r\n this.chartDateFilter = dateFilters.length + \" Dates\";\r\n }\r\n else if (firstDate != null) {\r\n this.chartDateFilter = firstDate;\r\n }\r\n else {\r\n this.chartDateFilter = \"Current Day\";\r\n }\r\n }\r\n else {\r\n this.chartDateFilter = \"Current Day\";\r\n }\r\n\r\n // If we have more than one store ID set the subtitle to be [number of stores] Stores\r\n // Otherwise use the only store's name\r\n if (storeIDs != null && storeIDs.length > 0) {\r\n let firstStoreID = storeIDs[0];\r\n\r\n if (SilverWareArrays.any(storeIDs, (x: any) => x != firstStoreID)) {\r\n this.subTitle = dateFilters.length + \" Stores\";\r\n }\r\n else if (firstStoreID != null) {\r\n this.subTitle = this.pageService.getStoreNameByStoreId(firstStoreID);\r\n }\r\n }\r\n }\r\n\r\n private renderChart(runDatabitResponse: RunDatabitResult): void {\r\n\r\n this.type = this.defaultChartType;\r\n\r\n let data: SeriesResult = runDatabitResponse.result.data;\r\n let comparisonsData: SeriesResult[] = runDatabitResponse.result.comparisonsData;\r\n let databit: Databit = this.pageService.allAvailableDatabits.find(d => d.name === this.databitName);\r\n let compareDefaults: DefaultSeriesAndCategories[] = [];\r\n\r\n // The logic below will take the following steps to standardise the labels before grouping them:\r\n // 1. Fix any duplicate labels\r\n // 2. Add in any labels not present in a dataset relative to the other dataset so that each dataset has all labels\r\n // 3. Update the value of the labels and arange them to be in order, highest to lowest, after the first dataset\r\n if (comparisonsData != null && comparisonsData.length > 1) {\r\n SilverWareArrays.forEach(comparisonsData, (compareData: SeriesResult) => {\r\n\r\n let currentDefault = this.getDefaultSeriesAndCategories(databit, compareData);\r\n\r\n // Fix any duplicate labels\r\n this.commonService.fixDuplicateLabels(comparisonsData, currentDefault.dataCategory.values);\r\n\r\n currentDefault.dataSeries.labelOverride = compareData.labelOverride;\r\n compareDefaults.push(currentDefault);\r\n\r\n });\r\n\r\n let currentDefaultPosition = 0; // Used for accessing the comparison we're comparing against\r\n let checkingDefaultPosition = 0; // Used for accessing the comparison we're fixing\r\n let labelPosition = 0; // Used for accessing the label's position\r\n\r\n // We will loop through each dataset for each data set to make sure every possible label exists in each dataset\r\n // Loop of data set we will use as a base line\r\n SilverWareArrays.forEach(compareDefaults, (currentDefault): void => {\r\n\r\n checkingDefaultPosition = 0;\r\n\r\n // Loop of data set we will be correcting\r\n SilverWareArrays.forEach(compareDefaults, (checkingDefault): void => {\r\n\r\n // Don't need to correct a dataset with it's own data\r\n if (currentDefaultPosition != checkingDefaultPosition && checkingDefault.dataCategory.values != null) {\r\n\r\n labelPosition = 0;\r\n SilverWareArrays.forEach(currentDefault.dataCategory.values, (currentLabel: any) => {\r\n\r\n // Get the indext of our current label\r\n let indexOfLabel = checkingDefault.dataCategory.values.indexOf(currentLabel);\r\n\r\n // Check to see if there is an edited duplicate of our current label\r\n let indexOfDupLabel = checkingDefault.dataCategory.values.indexOf(currentLabel + \" - 1\");\r\n\r\n // Check to see if there is an orignal of our current label\r\n let indexOfOrginalLabel = -1;\r\n\r\n // Is our current label a duplicate? If so get the index of the non duplicate version\r\n if (currentLabel.substring(currentLabel.length - 4, currentLabel.length) == \" - 1\") {\r\n let currentLableNonDup = currentLabel.substring(0, currentLabel.length - 4)\r\n indexOfOrginalLabel = checkingDefault.dataCategory.values.indexOf(currentLableNonDup);\r\n }\r\n\r\n // If we did not find our current label at all, add it to the end\r\n if (indexOfLabel == -1 && indexOfDupLabel == -1 && indexOfOrginalLabel == -1) {\r\n checkingDefault.dataCategory.values.splice(checkingDefault.dataCategory.values.length, 0, currentLabel);\r\n\r\n // TODO: ??\r\n checkingDefault.dataSeries.values.splice(checkingDefault.dataCategory.values.length, 0, '0');\r\n }\r\n\r\n // If we found our label but it was in original form, add a - 1 to match the duplicate fix\r\n else if (indexOfLabel == -1 && indexOfDupLabel != -1) {\r\n currentDefault.dataCategory.values.splice(labelPosition, 1, currentLabel + \" - 1\");\r\n }\r\n\r\n // If we found our label but in duplicate form remove the - 1 to match the non duplicate label\r\n else if (indexOfLabel == -1 && indexOfOrginalLabel != -1) {\r\n checkingDefault.dataCategory.values.splice(indexOfOrginalLabel, 1, currentLabel);\r\n }\r\n\r\n labelPosition++;\r\n });\r\n\r\n }\r\n\r\n checkingDefaultPosition++;\r\n\r\n });\r\n\r\n currentDefaultPosition++;\r\n\r\n });\r\n\r\n currentDefaultPosition = 0;\r\n let baseCompare = compareDefaults[0];\r\n\r\n // Now we will loop through each compare, besides the first, and update the label's position to match the first comparison\r\n SilverWareArrays.forEach(compareDefaults, (currentDefault: any) => {\r\n\r\n // Don't need to fix the first compare\r\n if (currentDefaultPosition != 0 && currentDefault.dataCategory.values != null) {\r\n\r\n // Useed to match the positon of the label in the first comparison\r\n labelPosition = 0;\r\n\r\n // We will be compareing againts the first compare's label\r\n SilverWareArrays.forEach(baseCompare.dataCategory.values, (currentLabel: any) => {\r\n\r\n // Get the index of the current label\r\n let indexOfMatchingLabel = currentDefault.dataCategory.values.indexOf(currentLabel);\r\n\r\n // Get it's corresponding value\r\n let valueOfLabel = currentDefault.dataSeries.values[indexOfMatchingLabel];\r\n\r\n // Remove from it's current postion (category label)\r\n currentDefault.dataCategory.values.splice(indexOfMatchingLabel, 1);\r\n\r\n // Add back to the position of the same label in the first comparison (category label)\r\n currentDefault.dataCategory.values.splice(labelPosition, 0, currentLabel);\r\n\r\n // Remove from it's current postion (data value)\r\n currentDefault.dataSeries.values.splice(indexOfMatchingLabel, 1);\r\n\r\n // Add back to the position of the same label in the first comparison (data value)\r\n currentDefault.dataSeries.values.splice(labelPosition, 0, valueOfLabel);\r\n\r\n\r\n labelPosition++;\r\n });\r\n }\r\n currentDefaultPosition++;\r\n });\r\n }\r\n\r\n\r\n if (data != null) {\r\n\r\n // Set our html\r\n this.databitHTML = data.htmlOutput;\r\n\r\n if (data.categories != null && data.series != null) {\r\n\r\n // Get our defaults\r\n this.defaultSeriesAndCategories = this.getDefaultSeriesAndCategories(databit, runDatabitResponse.result.data);\r\n let compareDataSeries: SeriesData[] = [];\r\n\r\n this.isTimeSeriesOrTextData = (this.defaultSeriesAndCategories.category.type == 1 || this.defaultSeriesAndCategories.category.type == 2);\r\n if (this.defaultSeriesAndCategories.dataSeries != null && (ChartComponent.isResultDataNonEmpty(this.defaultSeriesAndCategories.dataSeries.values, this.type)) || (comparisonsData != null && comparisonsData.length > 0)) {\r\n\r\n\r\n // If we have any comparisons add them to the array and get our labels and data series\r\n if (comparisonsData != null && comparisonsData.length > 1) {\r\n SilverWareArrays.forEach(compareDefaults, (compareDefault: DefaultSeriesAndCategories) => {\r\n\r\n compareDataSeries.push(compareDefault.dataSeries);\r\n\r\n // Get our label and series from the first compare that has data\r\n if (compareDefault.dataSeries.values != null && compareDefault.dataSeries.values.length > 0 && this.labelsConst.length == 0) {\r\n this.labelsConst = compareDefault.dataCategory.values;\r\n this.dataSeries = {\r\n series: [compareDefault.dataSeries],\r\n categories: [compareDefault.dataSeries],\r\n };\r\n }\r\n\r\n });\r\n\r\n }\r\n else {\r\n this.labelsConst = this.defaultSeriesAndCategories.dataCategory.values;\r\n this.dataSeries = data;\r\n }\r\n\r\n\r\n this.comparisonsData = comparisonsData;\r\n\r\n this.selectedDataSeries = this.defaultSeriesAndCategories.dataSeries;\r\n this.allSeries = this.defaultSeriesAndCategories.allSeries;\r\n\r\n this.compareDataSeries = compareDataSeries\r\n\r\n this.dataConst = ChartComponent.convertToChartFormat(this.selectedDataSeries, this.defaultChartType, this.compareDataSeries);\r\n let tempChartData = {\r\n data: this.dataConst,\r\n labels: this.labelsConst\r\n }\r\n\r\n // groupDataBySize creates others section OR orders numbers in descending order\r\n let groupedData = this.commonService.groupDataBySize(groupings.defaultGrouping, tempChartData, this.isTimeSeriesOrTextData, this.isTimeSeriesOrTextData);\r\n this.labels = groupedData.labels;\r\n this.data = groupedData.data;\r\n\r\n this.formatInfo = {\r\n currencyCode: runDatabitResponse.result.runTimeInfo.currencyCode,\r\n dataType: this.defaultSeriesAndCategories.series.dataType\r\n }\r\n\r\n } else if (data == null) {\r\n this.logService.error(`Could not get data for \"${this.databitName}\" from server!`);\r\n this.loadingError = `Could not get data for \"${this.databitName}\" from server!`;\r\n }\r\n else {\r\n this.logService.warn('No data found for the given criteria');\r\n this.isNoResultData = true;\r\n }\r\n\r\n }\r\n } else {\r\n if (data == null) {\r\n this.logService.error(`Could not get data for \"${this.databitName}\" from server!`);\r\n this.loadingError = `Could not get data for \"${this.databitName}\" from server!`;\r\n }\r\n else {\r\n this.logService.info('No data found for the given criteria');\r\n this.isNoResultData = true;\r\n }\r\n }\r\n\r\n this.showLoading = false;\r\n\r\n }\r\n\r\n // Force Run a databit\r\n public forceRun() {\r\n this.showLoading = true;\r\n this.loadingError = null;\r\n this.isNoResultData = false;\r\n\r\n this.prerenderChart();\r\n\r\n this.pageService.runDatabit(this.databitName, 'no-chain-id', this.storeID, this.databitsParameterValues, true, this.comparisonParameterValues).then(response => {\r\n\r\n this.renderChart(response);\r\n\r\n\r\n }, err => {\r\n const errMsg = this.commonService.flattenErrorMessages(err);\r\n this.logService.error(errMsg);\r\n this.loadingError = errMsg;\r\n this.showLoading = false;\r\n });\r\n }\r\n\r\n // figure out default series and its data type, default category\r\n private getDefaultSeriesAndCategories(databit: Databit, data: SeriesResult): DefaultSeriesAndCategories {\r\n\r\n let selectedSeries: DatabitSiriesInfo = null; // The series we will graph\r\n\r\n const seriesMetadata = JSON.parse(databit.seriesMetadata)\r\n // Fix the casing\r\n // Pick default series and category.\r\n const seriesMetaData: DatabitSiries = {\r\n series: seriesMetadata.Series?.map(x => {\r\n const info: DatabitSiriesInfo = {\r\n id: x.ID,\r\n name: x.Name,\r\n isDefault: x.IsDefault,\r\n dataType: x.DataType,\r\n };\r\n\r\n return info;\r\n }),\r\n categories: seriesMetadata.Categories?.map(x => {\r\n const info: DatabitSiriesCategoryInfo = {\r\n id: x.ID,\r\n name: x.Name,\r\n isDefault: x.IsDefault,\r\n type: x.Type,\r\n };\r\n\r\n return info;\r\n }),\r\n };\r\n\r\n // If we have an override look for it\r\n if (this.seriesOverride != null && this.seriesOverride[0] != null) {\r\n selectedSeries = SilverWareArrays.firstOrDefault(seriesMetaData.series, (x: DatabitSiriesInfo): boolean => x.id == this.seriesOverride[0]);\r\n }\r\n\r\n // If the override was not found fall back to the default\r\n if (selectedSeries == null) {\r\n selectedSeries = SilverWareArrays.firstOrDefault(seriesMetaData.series, (x: DatabitSiriesInfo): boolean => x.isDefault == true);\r\n\r\n // If the default is not found pick the first series in the array\r\n if (selectedSeries == null) {\r\n selectedSeries = seriesMetaData.series[0];\r\n }\r\n }\r\n\r\n let defaultCategory = SilverWareArrays.firstOrDefault(seriesMetaData.categories, (x: DatabitSiriesCategoryInfo): boolean => x.isDefault == true);\r\n\r\n if (defaultCategory == null) {\r\n defaultCategory = seriesMetaData.categories[0];\r\n }\r\n\r\n\r\n // Cross reference default series and category by ID\r\n\r\n let defaultDataSeries = SilverWareArrays.firstOrDefault(data.series, (x: SeriesData) => x.id == selectedSeries.id);\r\n let defaultDataCategories = SilverWareArrays.firstOrDefault(data.categories, (x: CategoryData) => x.id == defaultCategory.id);\r\n\r\n const defaults: DefaultSeriesAndCategories = {\r\n dataSeries: defaultDataSeries,\r\n series: selectedSeries,\r\n allSeries: seriesMetaData.series,\r\n dataCategory: defaultDataCategories,\r\n category: defaultCategory,\r\n allCategories: seriesMetaData.categories\r\n }\r\n\r\n return defaults;\r\n }\r\n\r\n // Show the chart in full screen\r\n public chartFullscreen() {\r\n const modalObject = {\r\n cancelStyle: { flex: 1, margin: '5px' },\r\n chartType: this.type,\r\n labels: this.labelsConst,\r\n data: this.dataConst,\r\n xLabel: this.xLabel,\r\n yLabel: this.yLabel,\r\n size: 'modal-xl',\r\n formatInfo: this.formatInfo,\r\n databitHTML: this.databitHTML,\r\n widgetId: this.widgetId,\r\n isTimeSeriesOrTextData: this.isTimeSeriesOrTextData\r\n\r\n };\r\n\r\n let chartProps = {\r\n chartTitle: this.title,\r\n chartSubtitle: this.subTitle,\r\n chartDateFilter: this.chartDateFilter\r\n };\r\n\r\n this.modalService.chart(null, chartProps, modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData !== '') { }\r\n });\r\n\r\n }\r\n // allows to delete a widget from heartbeat and dashboard\r\n public deleteWidget() {\r\n this.modalService.confirm('Are you sure you want to delete this widget?', 'Delete Widget', 'No', null, 'Yes', () => {\r\n this.saveChanges(ObjectState.Deleted);\r\n });\r\n }\r\n // share the widget\r\n public share(): void {\r\n\r\n const widgetData = {\r\n DatabitName: this.databitName,\r\n DatabitsParameterValues: this.databitsParameterValues,\r\n ComparisonParameterValues: this.comparisonParameterValues,\r\n IsHtmlData: this.type === AvailableChartType.TextChart || this.type === AvailableChartType.Report,\r\n WidgetType: this.defaultChartType\r\n };\r\n\r\n const btns = [\r\n { name: 'Download', icon: 'fas fa-download' },\r\n { name: 'Email', icon: 'fas fa-paper-plane' },\r\n ];\r\n this.modalService.listButtonV2(null, null, btns, null, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null) {\r\n switch (result.inputData) {\r\n case 'Download':\r\n this.graphComponent.downloadGraph(`${this.title}-Store-${this.subTitle}-${moment().format('YYYY-MM-DD HH-mm-ss')}`);\r\n break;\r\n case 'Email':\r\n let emails: string[] = [];\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n if (emails.length === 0 ) {\r\n return;\r\n }\r\n const userEmails: Email[] = [];\r\n emails.forEach((e: string) => {\r\n userEmails.push(\r\n {\r\n emailAddress: e,\r\n displayName: 'Silverware Reporting Dashboard'\r\n }\r\n );\r\n });\r\n let chainID = this.chainID;\r\n if (chainID === null || chainID === undefined || chainID.trim() === '') {\r\n chainID = this.pageService.chainID;\r\n }\r\n const requestBody: ShareReportRequest = {\r\n StoreID: this.storeID,\r\n ChainID: chainID,\r\n DashboardID: this.pageService.currentDashboardId,\r\n WidgetID: this.widgetId,\r\n WidgetData: JSON.stringify(widgetData),\r\n FromAddress: this.authService.user.email,\r\n FromDisplayName: this.authService.user.firstName,\r\n Subject: `${this.title} for ${this.subTitle}`,\r\n To: userEmails\r\n };\r\n this.logService.colouredConsoleDebug(`ExportWidget/${requestBody.ChainID}/Dashboard/${requestBody.DashboardID}/Widget/${requestBody.WidgetID}`);\r\n this.pageService.loadingOverLay = true;\r\n this.shareService.emailGraph(requestBody).subscribe((response: any) => {\r\n\r\n if (response.success === true) {\r\n this.modalService.info(`The chart has been shared successfully with ${requestBody.To.map((em: Email) => em.emailAddress).join(', ')}`, 'Info');\r\n } else {\r\n this.logService.error(response.message);\r\n this.modalService.error(`Failed to share the chart. Please try again. ${response.message}`, 'Error');\r\n }\r\n this.pageService.loadingOverLay = false;\r\n }, (ex: any) => {\r\n const errorMsg = this.commonService.flattenErrorMessages(ex);\r\n this.logService.error(errorMsg);\r\n this.modalService.error(`Failed to share the chart. Please try again. Error: ${errorMsg}`, 'Error');\r\n this.pageService.loadingOverLay = false;\r\n });\r\n },\r\n isDismiss: true,\r\n label: 'Share',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const modalObject = {\r\n size: 'modal-lg',\r\n title: 'Share by Email',\r\n template: MultiLineInputComponent,\r\n buttons: [saveBtn],\r\n override: true,\r\n buttonsContainerStyle: { display: 'flex', justifyContent: 'space-evenly' },\r\n templateInputs: [\r\n { key: 'initialValues', value: [this.authService.user.email] },\r\n { key: 'title', value: 'Share by Email' },\r\n { key: 'inputType', value: InputType.Email },\r\n { key: 'placeHolder', value: 'Please enter a valid email address' },\r\n { key: 'validationCallback', value: (value: string): string => {\r\n if (value === null || value === undefined || value.trim() === '' || !this.commonService.validateEmail(value)) {\r\n return 'Email address entered is not valid. Please try again.';\r\n }\r\n return null;\r\n }},\r\n { key: 'values', value: (values: string[]): void => {\r\n emails = values;\r\n }},\r\n ],\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.show(modalObject);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n // make a databitconfig object and add it to the save queue on page service\r\n private saveChanges(state: ObjectState) {\r\n const tmp: DatabitConfig = {\r\n databitName: this.databitName,\r\n displayName: this.title,\r\n chartType: this.defaultChartType,\r\n storeID: this.storeID,\r\n chainID: this.chainID,\r\n chartConfigs: this.chartConfig,\r\n objectState: state,\r\n parameterValues: this.databitsParameterValues,\r\n id: this.widgetId,\r\n seriesOverride: this.seriesOverride,\r\n comparisonParameterValues: this.comparisonParameterValues\r\n };\r\n\r\n const states = SilverWareEnums.getNamesAndValues(ObjectState);\r\n const objState = SilverWareArrays.firstOrDefault(states, (s: any) => s.value === state);\r\n if (objState != null) {\r\n this.chartState = objState.name;\r\n }\r\n this.pageService.addToQueue(tmp);\r\n }\r\n\r\n\r\n private getTimeSinceLastRunString(dateInput: any): string {\r\n return 'As of ' + Math.floor(this.getDurationToNowInMinutes(dateInput)) + ' minutes ago.';\r\n }\r\n\r\n private getDurationToNowInMinutes(dateInput: any): number {\r\n const dateTimeNow: any = moment.utc().toDate();\r\n return (dateTimeNow - dateInput) / 60000;\r\n }\r\n\r\n public globalIcons(key: string) {\r\n return SilverWareIcons.globalIcons(key);\r\n }\r\n\r\n}\r\ntype WidgetDatabitInfo = {\r\n name: string;\r\n category: DatabitCategory;\r\n config: DatabitConfig;\r\n info: Databit\r\n}\r\ntype WidgetState = {\r\n id: string;\r\n chainID: string;\r\n storeID: string;\r\n\r\n databit: WidgetDatabitInfo;\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 { Router, ActivatedRoute, Navigation } from '@angular/router';\r\nimport { PageService } from '../shared/services/page.service';\r\nimport { NavigationService } from '../shared/services/navigation.service';\r\nimport { DashboardType } from '../shared/interfaces/DashboardType';\r\nimport { DatabitConfig } from '../shared/interfaces/DatabitConfig';\r\nimport { DashboardService } from '../shared/services/dashboard.service';\r\nimport { ModalService } from '../shared/services/modal.service';\r\nimport { SilverWareArrays } from '../shared/services/SilverWareArrays';\r\nimport { DatabitParameterValue } from '../shared/interfaces/DatabitParameterValue';\r\nimport { ObjectState } from '../shared/interfaces/ObjectState';\r\nimport { Dashboard } from '../shared/interfaces/Dashboard';\r\nimport { BaseDashBoardComponent } from '../shared/classes/basedashboardcomponent';\r\nimport * as _ from 'lodash';\r\nimport { AuthService } from '../shared/services/auth.service';\r\nimport { DatabitCategory } from '../shared/interfaces/DatabitCategory';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { AvailableChartType } from '../shared/enums/available-chart-type.enum';\r\nimport {CommonService} from '../shared/services/common.service';\r\nimport {LogService} from \"../shared/services/log.service\";\r\n@Component({\r\n selector: 'app-dashboard',\r\n templateUrl: './dashboard.component.html',\r\n styleUrls: ['./dashboard.component.css']\r\n})\r\n/**\r\n * This is a shared component all the Dashboards (Heartbeat, Sales,...) will use this component from now on\r\n */\r\nexport class DashboardComponent extends BaseDashBoardComponent implements OnInit {\r\n\r\n state: any;\r\n\r\n constructor(private activeRoute: ActivatedRoute, dashboardService: DashboardService,\r\n pageService: PageService, navigationService: NavigationService, modalService: ModalService, authService: AuthService,\r\n commonService: CommonService, logService: LogService) {\r\n super(pageService, navigationService, modalService, dashboardService, authService, commonService, logService);\r\n }\r\n\r\n ngOnInit() {\r\n this.chainId = this.activeRoute.snapshot.paramMap.get('chain-id');\r\n this.dashboardId = this.activeRoute.snapshot.paramMap.get('dashboard-id');\r\n this.activeRoute.params.subscribe((params) => {\r\n this.dashboardType = (this.activeRoute.data as BehaviorSubject).getValue().dashboardType;\r\n this.chainId = params['chain-id'];\r\n this.dashboardId = params['dashboard-id'];\r\n this.pageService.clearQueueWatch();\r\n this.pageService.clearQueue();\r\n\r\n\r\n this.dashboardService.savedUserDashboards$.subscribe((dashboards) => {\r\n if (!dashboards)\r\n return;\r\n\r\n\r\n let currentStoreID = this.pageService.storeID;\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(currentStoreID)) {\r\n const chainStores = this.pageService.getChainStores(this.pageService.chainID);\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(chainStores)) {\r\n this.modalService.error('No stores found for the selected chain', 'Error');\r\n return;\r\n }\r\n this.pageService.storeID = chainStores[0].id;\r\n }\r\n\r\n const dashboard = this.dashboardService.getSavedDashboard(this.dashboardType, this.dashboardId);\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(dashboard)) {\r\n this.dashboardId = dashboard.id;\r\n this.dashboardName = dashboard.name;\r\n this.userId = dashboard.userID;\r\n this.dashboardType = dashboard.type;\r\n this.dashboardDatabits = _.cloneDeep(dashboard.databits);\r\n\r\n this.dashboardDatabits.forEach((db) => {\r\n if (!db.chartConfigs || !db.chartConfigs.defaultChartType || !db.chartConfigs.allowedChartTypes) {\r\n const latestDatabit = this.pageService.allAvailableDatabits.find(d => d.name === db.databitName);\r\n db.chartConfigs = latestDatabit.chartConfigs;\r\n }\r\n if (db.chartType == 0 && db.chartConfigs != null) {\r\n // if not set, set it to default\r\n let defaultChartType: AvailableChartType;\r\n const typedChartTypeStr = db.chartConfigs.defaultChartType as keyof AvailableChartType\r\n defaultChartType = AvailableChartType[typedChartTypeStr];\r\n db.chartType = defaultChartType;\r\n }\r\n\r\n // Make sure charts always have store ID\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(db.storeID)) {\r\n db.storeID = this.pageService.storeID;\r\n }\r\n });\r\n }\r\n else if (this.dashboardType !== DashboardType.Custom) {\r\n this.logService.warn(`Setting up Dashboard '${DashboardType[this.dashboardType]}'...`);\r\n super.loadDataBitsByCategory(this.dashboardType);\r\n super.saveDashboard(this.dashboardType, DashboardType[this.dashboardType]).then(_ => {});\r\n }\r\n });\r\n\r\n this.pageService.clearQueueWatch();\r\n this.pageService.clearQueue();\r\n this.pageService.setCurrentDashBoardComponent(this);\r\n this.navigationService.updateCurrentPage(DashboardType[this.dashboardType], this.dashboardType, this.dashboardId);\r\n });\r\n }\r\n\r\n createNewWidget() {\r\n super.createNewWidget(this.dashboardType);\r\n }\r\n\r\n\r\n}\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport {NavigationService} from '../shared/services/navigation.service';\r\n\r\n@Component({\r\n selector: 'app-reports',\r\n templateUrl: './reports.component.html',\r\n styleUrls: ['./reports.component.css'] //,\r\n //providers: [SystemService]\r\n})\r\nexport class ReportsComponent implements OnInit {\r\n\r\n chainId: string;\r\n state: any;\r\n\r\n constructor(private router: Router, private activeRoute: ActivatedRoute, public navigationService: NavigationService) { }\r\n\r\n ngOnInit() {\r\n\r\n this.chainId = this.activeRoute.snapshot.paramMap.get('chain-id');\r\n }\r\n}\r\n","
    \r\n
    \r\n
    \r\n
    \r\n Coming Soon!\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-settings',\r\n templateUrl: './settings.component.html',\r\n styleUrls: ['./settings.component.css']\r\n})\r\nexport class SettingsComponent implements OnInit {\r\n\r\n chainId: string;\r\n\r\n constructor(private router: Router, private activeRoute: ActivatedRoute) { }\r\n\r\n ngOnInit() {\r\n this.chainId = this.activeRoute.snapshot.paramMap.get('chain-id');\r\n }\r\n}\r\n","
    \r\n
    \r\n
    \r\n
    \r\n Coming Soon!\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n","import { Component, OnInit } from '@angular/core';\r\nimport {NavigationService} from '../shared/services/navigation.service';\r\n\r\n@Component({\r\n selector: 'app-comparison',\r\n templateUrl: './comparison.component.html',\r\n styleUrls: ['./comparison.component.css']\r\n})\r\nexport class ComparisonComponent implements OnInit {\r\n\r\n constructor(public navigationService: NavigationService) { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","
    \r\n
    \r\n
    \r\n
    \r\n Coming Soon!\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { UserSetting } from '../interfaces/UserSetting';\r\nimport { AppConfig } from '../app.config';\r\nimport {UpdateUserSettingsResponse} from '../responses/update-user-settings-response';\r\nimport {Observable} from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class UserService {\r\n\r\n constructor(private http: HttpClient, private appConfig: AppConfig) { }\r\n\r\n saveUserSettings(settings: UserSetting[]): Observable {\r\n return this.http.post(this.appConfig.applicationUrl + `/api/User/SaveSettings`,\r\n { UserSettings: settings});\r\n }\r\n\r\n}\r\n","
    \r\n
    \r\n \"User\r\n
    \r\n
    \r\n
    \r\n \"User\r\n
    \r\n
    \r\n
    \r\n

    {{pageService.currentUser.firstName ? pageService.currentUser.firstName : ''}} {{pageService.currentUser.lastName ? pageService.currentUser.lastName : ''}}

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

    {{pageService.chainInfo(pageService.chainID).name}}

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n MyPass\r\n
    \r\n
    \r\n
    \r\n
    Name:
    \r\n
    {{pageService.currentUser.firstName}}
    \r\n
    \r\n
    \r\n
    E-Mail:
    \r\n
    {{pageService.currentUser.email}}
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n MyCompany\r\n
    \r\n
    \r\n
    \r\n

    Coming Soon

    \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 MyCompany\r\n All Chains   \r\n Current Chain's Stores\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {{chain.name}}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {{store.name}}\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 \"User\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    {{pageService.currentUser.firstName ? pageService.currentUser.firstName : ''}} {{pageService.currentUser.lastName ? pageService.currentUser.lastName : ''}}

    \r\n
    \r\n
    \r\n
    {{pageService.chainInfo(pageService.chainID).name}}
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    Name:
    \r\n
    {{pageService.currentUser.firstName}}
    \r\n
    \r\n
    \r\n
    E-Mail:
    \r\n
    {{pageService.currentUser.email}}
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n

    Coming Soon!

    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n Select Chains\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 Sign Out\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n","import {AfterViewInit, Component, ElementRef, Input, OnInit, ViewChild} from '@angular/core';\r\nimport { environment } from '../../environments/environment';\r\nimport { AuthService } from '../shared/services/auth.service';\r\nimport {PageService} from '../shared/services/page.service';\r\nimport { ModalService } from '../shared/services/modal.service';\r\nimport { Navigation } from '@angular/router';\r\nimport { NavigationService } from '../shared/services/navigation.service';\r\nimport { SilverWareArrays } from '../shared/services/SilverWareArrays';\r\nimport { UserSetting } from '../shared/interfaces/UserSetting';\r\nimport { SilverWareCommon } from '../shared/services/SilverWareCommon';\r\nimport { UserService } from '../shared/services/user.service';\r\n\r\n@Component({\r\n selector: 'app-user-profile',\r\n templateUrl: './user-profile.component.html',\r\n styleUrls: ['./user-profile.component.css']\r\n})\r\nexport class UserProfileComponent implements OnInit {\r\n\r\n @Input() isMobile = false;\r\n\r\n public isMyPassOpen = false;\r\n public isMyCompanyOpen = false;\r\n public isMyChainOpen = false;\r\n public isChain = true;\r\n constructor(public authService: AuthService, public pageService: PageService, public modalService: ModalService, public navigationService: NavigationService, public userService: UserService) { }\r\n\r\n ngOnInit() {\r\n window.scrollBy(0, 100); // Adjust scrolling with a negative value here\r\n }\r\n\r\n public changeChain() {\r\n const listchain = this.pageService.currentUser.chains.sort().map(chain => ({ name: chain.name, value: chain.id.toLowerCase() }));\r\n if (listchain) {\r\n listchain.sort((a, b) => {\r\n if (a.name > b.name) return 1;\r\n if (a.name < b.name) return -1;\r\n if (a.name === b.name) return 0;\r\n })\r\n }\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n const modalObject = {\r\n buttons: [saveBtn],\r\n isMultiSelect: false,\r\n inputData: this.pageService.chainID,\r\n selectList: listchain,\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.list(null, 'Please choose your chain', modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData != '') {\r\n let chainID = result.inputData;\r\n\r\n var defaultChainUserSetting = SilverWareArrays.firstOrDefault(this.pageService.currentUser.settings, (x: UserSetting) => x.name == \"DefaultChainID\");\r\n\r\n if (defaultChainUserSetting != null) {\r\n defaultChainUserSetting.value = chainID;\r\n }\r\n else {\r\n defaultChainUserSetting = {\r\n id: SilverWareCommon.newGuid().toString(),\r\n name: \"DefaultChainID\",\r\n userID: this.pageService.currentUser.id,\r\n value: chainID\r\n };\r\n }\r\n\r\n this.userService.saveUserSettings([defaultChainUserSetting]).subscribe((response: any) => {\r\n\r\n\r\n // settings saved successully\r\n }, ex => {\r\n // had an error save user settings\r\n });\r\n\r\n\r\n this.navigationService.updateURL(chainID);\r\n this.pageService.updateChain(chainID);\r\n }\r\n\r\n });\r\n }\r\n}\r\n","export enum Page {\r\n MissingChainId = 'MissingChainId',\r\n Heartbeat= 'Heartbeat',\r\n Dashboard= 'Dashboard',\r\n Sales= 'Sales',\r\n Comparison= 'Comparison',\r\n Guests= 'Guests',\r\n Employees= 'Employees',\r\n LossPrevention= 'LossPrevention',\r\n Reports= 'Reports',\r\n Settings= 'Settings',\r\n UserProfile= 'UserProfile',\r\n Notifications= 'Notifications',\r\n ExportWidgets= 'ExportWidgets'\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\n\r\nimport { ModalService } from '../services/modal.service';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseDashBoardComponent } from './basedashboardcomponent';\r\n\r\n@Injectable()\r\nexport class RouteGuard {\r\n\r\n constructor() {\r\n }\r\n\r\n canDeactivate(component: BaseDashBoardComponent, route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot,\r\n nextState: RouterStateSnapshot): Observable | Promise | boolean {\r\n\r\n return component.canExit();\r\n }\r\n}\r\n","
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\nloadData\r\n
    \r\ngetBase64Data\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 {ActivatedRoute, Router} from '@angular/router';\r\nimport {DashboardService} from '../shared/services/dashboard.service';\r\nimport {DatabitConfig} from '../shared/interfaces/DatabitConfig';\r\nimport {AvailableChartType} from '../shared/enums/available-chart-type.enum';\r\nimport {SilverWareArrays} from '../shared/services/SilverWareArrays';\r\nimport {PageService} from '../shared/services/page.service';\r\nimport {BaseDashBoardComponent} from '../shared/classes/basedashboardcomponent';\r\nimport {NavigationService} from '../shared/services/navigation.service';\r\nimport {AuthService} from '../shared/services/auth.service';\r\nimport {ModalService} from '../shared/services/modal.service';\r\nimport {CommonService} from '../shared/services/common.service';\r\nimport {LogService} from \"../shared/services/log.service\";\r\n\r\n@Component({\r\n selector: 'app-export-widget',\r\n templateUrl: './export-widget.component.html',\r\n styleUrls: ['./export-widget.component.css']\r\n})\r\nexport class ExportWidgetComponent extends BaseDashBoardComponent implements OnInit {\r\n\r\n state: State = null;\r\n constructor(private router: Router, private activeRoute: ActivatedRoute, dashboardService: DashboardService,\r\n pageService: PageService, navigationService: NavigationService, modalService: ModalService,\r\n authService: AuthService, commonService: CommonService, logService: LogService) {\r\n super(pageService, navigationService, modalService, dashboardService, authService, commonService, logService);\r\n }\r\n\r\n\r\n ngOnInit() {\r\n this.pageService.setCurrentDashBoardComponent(this);\r\n this.state = {\r\n ChainId: this.activeRoute.snapshot.paramMap.get('chain-id'),\r\n DashboardId: this.activeRoute.snapshot.paramMap.get('dashboard-id'),\r\n WidgetId: this.activeRoute.snapshot.paramMap.get('widget-id'),\r\n Widget: null,\r\n CanvasId: null\r\n };\r\n }\r\n\r\n loadData(): void {\r\n this.logService.debug('loadData...');\r\n this.authService.loadMyPassUserFromWindowObject();\r\n this.pageService.setDashboardUser(this.authService.user);\r\n\r\n this.pageService.chainID = this.state.ChainId;\r\n this.navigationService.chainId = this.pageService.chainID;\r\n // Get all injected available databits from window\r\n const availableDatabitsArrayJsonString = document.getElementById('allDatabist');\r\n if (availableDatabitsArrayJsonString === null || availableDatabitsArrayJsonString === undefined || availableDatabitsArrayJsonString.value === '') {\r\n this.logService.error('Missing Available Databits Array');\r\n return;\r\n }\r\n\r\n this.pageService.availableDatabitsArray = JSON.parse(availableDatabitsArrayJsonString.value);\r\n\r\n // Get all injected widget data form window\r\n const jsonData = document.getElementById('widgetData');\r\n let prams = null;\r\n if (jsonData === null || jsonData === undefined || jsonData.value === '') {\r\n\r\n this.logService.error('Missing widgetData');\r\n return;\r\n }\r\n prams = JSON.parse(jsonData.value);\r\n this.dashboardService.getUserDashboard(this.state.DashboardId, false).subscribe((response: any) => {\r\n if (response.success === true && response.dashboard) {\r\n const dashboard = response.dashboard;\r\n const dashboardDatabit = SilverWareArrays.firstOrDefault(dashboard.databits, (x: any) => x.id === this.state.WidgetId);\r\n if (dashboardDatabit) {\r\n if (!dashboardDatabit.chartConfigs || !dashboardDatabit.chartConfigs.defaultChartType || !dashboardDatabit.chartConfigs.allowedChartTypes) {\r\n const latestDatabit = this.pageService.allAvailableDatabits.find(d => d.name === dashboardDatabit.databitName);\r\n dashboardDatabit.chartConfigs = latestDatabit.chartConfigs;\r\n }\r\n\r\n if (prams) {\r\n if (prams.WidgetType) {\r\n dashboardDatabit.chartType = prams.WidgetType;\r\n }\r\n if (prams.ComparisonParameterValues) {\r\n dashboardDatabit.comparisonParameterValues = prams.ComparisonParameterValues;\r\n }\r\n if (prams.DatabitsParameterValues) {\r\n dashboardDatabit.parameterValues = prams.DatabitsParameterValues;\r\n\r\n }\r\n }\r\n\r\n if (dashboardDatabit.chartType === 0 && dashboardDatabit.chartConfigs !== null) {\r\n // if not set, set it to default\r\n let defaultChartType: AvailableChartType = null;\r\n const canvasType = dashboardDatabit.chartConfigs.defaultChartType as keyof AvailableChartType;\r\n defaultChartType = AvailableChartType[canvasType];\r\n dashboardDatabit.chartType = defaultChartType;\r\n }\r\n this.state.Widget = dashboardDatabit;\r\n }\r\n\r\n } else {\r\n this.logService.error(response.message);\r\n }\r\n }, (ex: any) => {\r\n this.logService.error(this.commonService.flattenErrorMessages(ex));\r\n });\r\n }\r\n\r\n getBase64Data(): void {\r\n const base64Data = document.getElementById('base64Data');\r\n base64Data.innerText = window['getChartBase64Data']();\r\n }\r\n\r\n}\r\ninterface State {\r\n ChainId: string;\r\n DashboardId: string;\r\n WidgetId: string;\r\n Widget: DatabitConfig;\r\n CanvasId: string;\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { HttpClientModule } from '@angular/common/http';\r\n\r\nimport { MissingChainIDComponent } from './missing-chain-id/missing-chain-id.component';\r\nimport { DashboardComponent } from './dashboard/dashboard.component';\r\n\r\nimport { ReportsComponent } from './reports/reports.component';\r\nimport { SettingsComponent } from './settings/settings.component';\r\nimport {ComparisonComponent} from './comparison/comparison.component';\r\nimport {UserProfileComponent} from './user-profile/user-profile.component';\r\nimport {Page} from './shared/interfaces/Page';\r\nimport { RouteGuard } from './shared/classes/RouteGuard';\r\nimport { DashboardType } from './shared/interfaces/DashboardType';\r\nimport {ExportWidgetComponent} from './export-widget/export-widget.component';\r\n\r\nconst routes: Routes = [\r\n { path: '', component: DashboardComponent, data: { page: Page.Heartbeat, dashboardType: DashboardType.Heartbeat }, canDeactivate: [RouteGuard] },\r\n { path: 'missing-chain-id', component: MissingChainIDComponent, data: {page: Page.MissingChainId} },\r\n { path: ':chain-id', component: DashboardComponent, data: { page: Page.Heartbeat, dashboardType: DashboardType.Heartbeat }, canDeactivate: [RouteGuard] },\r\n { path: ':chain-id/Heartbeat', component: DashboardComponent, data: { page: Page.Heartbeat, dashboardType: DashboardType.Heartbeat }, canDeactivate: [RouteGuard] },\r\n { path: ':chain-id/Dashboard/:dashboard-id', component: DashboardComponent, data: { page: Page.Dashboard, dashboardType: DashboardType.Custom }, canDeactivate: [RouteGuard] },\r\n { path: ':chain-id/Sales', component: DashboardComponent, data: { page: Page.Sales, dashboardType: DashboardType.Sales } },\r\n { path: ':chain-id/Comparison', component: ComparisonComponent, data: { page: Page.Comparison } },\r\n { path: ':chain-id/Guests', component: DashboardComponent, data: { page: Page.Guests, dashboardType: DashboardType.Guests } },\r\n { path: ':chain-id/Employees', component: DashboardComponent, data: { page: Page.Employees, dashboardType: DashboardType.Employees } },\r\n { path: ':chain-id/LossPrevention', component: DashboardComponent, data: { page: Page.LossPrevention, dashboardType: DashboardType.LossPrevention } },\r\n { path: ':chain-id/Reports', component: ReportsComponent, data: {page: Page.Reports} },\r\n { path: ':chain-id/Settings', component: SettingsComponent, data: {page: Page.Settings} },\r\n { path: ':chain-id/UserProfile', component: UserProfileComponent, data: {page: Page.UserProfile}},\r\n { path: 'ExportWidget/:chain-id/Dashboard/:dashboard-id/Widget/:widget-id', component: ExportWidgetComponent, data: {page: Page.ExportWidgets}}\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n RouterModule.forRoot(routes),\r\n HttpClientModule\r\n ],\r\n exports: [RouterModule]\r\n})\r\nexport class AppRoutingModule { }\r\n\r\nexport const routingComponents = [MissingChainIDComponent, DashboardComponent, ReportsComponent, SettingsComponent];\r\n","
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n","import { Component, Input, OnInit, ChangeDetectorRef } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { NavigationService } from '../../shared/services/navigation.service';\r\nimport { Dashboard } from '../../shared/interfaces/Dashboard';\r\nimport { PageService } from '../../shared/services/page.service';\r\nimport { DashboardService } from '../../shared/services/dashboard.service';\r\nimport { filter, map } from 'rxjs/operators';\r\nimport { Observable } from 'rxjs';\r\nimport { DashboardType } from '../../shared/interfaces/DashboardType';\r\nimport { state } from '@angular/animations';\r\nimport { DatabitCategory } from '../../shared/interfaces/DatabitCategory';\r\nimport { ModalService } from '../../shared/services/modal.service';\r\nimport { AppConfig } from '../../shared/app.config';\r\n\r\n@Component({\r\n selector: 'app-side-bar',\r\n templateUrl: './side-bar.component.html',\r\n styleUrls: ['./side-bar.component.css']\r\n})\r\nexport class SideBarComponent implements OnInit {\r\n @Input() chainId: string;\r\n currentTab: string;\r\n menuOpen: boolean;\r\n dashboardsOpen = true;\r\n dashboardType = DashboardType;\r\n dashboards$: Observable>;\r\n constructor(private router: Router, public navigationService: NavigationService, public pageService: PageService, public cdRef: ChangeDetectorRef, public dashboardService: DashboardService, private modalService: ModalService, private appConfig: AppConfig) {\r\n // this.dashboards = [{name: 'Dashboard 1', id: '1111'}, {name: 'Dashboard 2', id: '2222'}, {name: 'Dashboard 3', id: '3333'}];\r\n }\r\n\r\n ngOnInit() {\r\n // get values from navigation service.\r\n this.menuOpen = this.navigationService.isSideBarExpanded;\r\n this.currentTab = this.navigationService.SideBarCurrentTab;\r\n this.dashboardsOpen = this.navigationService.isSideBarDashboardExpanded;\r\n this.dashboards$ = this.dashboardService.savedUserDashboards$.pipe(map(\r\n db => db && db.filter(d => d.type === DashboardType.Custom)\r\n )\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdRef.detectChanges();\r\n }\r\n toggleMenu() {\r\n this.menuOpen = !this.menuOpen;\r\n if (this.menuOpen) {\r\n } else {\r\n if (this.dashboardsOpen) {\r\n this.toggleDashboardMenu();\r\n }\r\n }\r\n this.navigationService.isSideBarExpanded = this.menuOpen;\r\n }\r\n\r\n toggleDashboardMenu() {\r\n this.dashboardsOpen = !this.dashboardsOpen;\r\n this.navigationService.isSideBarDashboardExpanded = this.dashboardsOpen; // update navigation service\r\n if (this.dashboardsOpen) {\r\n\r\n if (!this.menuOpen) {\r\n\r\n // if (!this.currentTab) {\r\n // this.router.navigate(['/', this.chainId, 'Dashboard', '1']);\r\n // }\r\n\r\n this.toggleMenu();\r\n }\r\n }\r\n }\r\n\r\n tabChanged(newTab: string) {\r\n var self = this;\r\n\r\n var switchTab = function () {\r\n if (newTab == \"Reports\") {\r\n window.open(self.appConfig.reportingUrl, '_blank');\r\n }\r\n else {\r\n self.currentTab = newTab;\r\n self.navigationService.SideBarCurrentTab = self.currentTab;\r\n }\r\n\r\n // If we were given a guid then we're navigating to a custom bashboard\r\n if (newTab.length == 36) {\r\n self.router.navigateByUrl(`${self.navigationService.chainId}/Dashboard/${newTab}`);\r\n }\r\n else {\r\n self.router.navigateByUrl(`${self.navigationService.chainId}/${newTab}`);\r\n }\r\n };\r\n\r\n // If we have any saved changes ask if they want to save first\r\n if (self.pageService.changedItemsCount() > 0) {\r\n self.modalService.confirm('Do you want to save your changes before leaving this page?', 'Save Changes', 'No', () => {\r\n switchTab();\r\n }, 'Yes', () => {\r\n // Save then switch tabs\r\n // Don't refresh the databits as we're about to navigate to another dashboard\r\n self.pageService.saveQueue(switchTab, false);\r\n });\r\n }\r\n else {\r\n switchTab();\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 {{dashboard.name}}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n  Add New\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n Sales\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n Employees\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n Loss Prevention\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n Reports\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n","import {Component, Input, OnInit} from '@angular/core';\r\nimport { NavigationService } from '../../shared/services/navigation.service';\r\nimport {ModalService} from '../../shared/services/modal.service';\r\nimport {UserProfileComponent} from '../../user-profile/user-profile.component';\r\nimport {PageService} from '../../shared/services/page.service';\r\nimport { AppConfig } from '../../shared/app.config';\r\n\r\ndeclare var $: any;\r\n\r\n@Component({\r\n selector: 'app-bottom-bar',\r\n templateUrl: './bottom-bar.component.html',\r\n styleUrls: ['./bottom-bar.component.css']\r\n})\r\nexport class BottomBarComponent implements OnInit {\r\n @Input() chainId: string;\r\n public dashboards: Array<{name: string, id: string}>;\r\n public subDashboardsOpen = false;\r\n public menuToggled = false;\r\n private isMenuModalSet = false;\r\n currentTab: string;\r\n constructor(public navigationService: NavigationService, private modalService: ModalService, public pageService: PageService, private appConfig: AppConfig) {\r\n }\r\n\r\n ngOnInit() {\r\n this.currentTab = this.navigationService.SideBarCurrentTab;\r\n }\r\n\r\n public goToSilverWareBlog() {\r\n window.open(this.appConfig.blogUrl, '_blank');\r\n }\r\n\r\n public goToSilverWareReporting() {\r\n window.open(this.appConfig.reportingUrl, '_blank');\r\n }\r\n\r\n toggleMenu() {\r\n this.menuToggled = !this.menuToggled;\r\n // show the modal\r\n $('#menuModal').modal({\r\n show: this.menuToggled\r\n });\r\n // make a event listener and destroy it after close\r\n $('#menuModal').on('hide.bs.modal', (e) => {\r\n this.menuToggled = false;\r\n $('#menuModal').off('hide.bs.modal');\r\n });\r\n\r\n }\r\n\r\n tabChanged(newTab: string) {\r\n this.currentTab = newTab;\r\n this.navigationService.SideBarCurrentTab = this.currentTab;\r\n }\r\n\r\n showProfile() {\r\n\r\n this.modalService.show(\r\n {template: UserProfileComponent,\r\n templateInputs: [{key: 'isMobile', value: true}],\r\n override: true,\r\n id: 'profileModal',\r\n buttonsContainerStyle : {display: 'flex', justifyContent: 'center'},\r\n cancelStyle: {height: '50px', backgroundColor: 'white', border: 'none', color: 'black', borderRadius: '8px', fontWeight: 'bold', flex: 1}\r\n }\r\n );\r\n }\r\n\r\n}\r\n","
    \r\n \r\n \r\n
    \r\n
    0\" class=\"text-end\" style=\"flex: 1; min-width: 200px; max-width: 400px;\">\r\n You have ({{pageService.changedItemsCount()}}) {{pageService.changedItemsCount() > 1 ? 'changes':'change'}}\r\n Cancel\r\n Save\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 {{pageService.currentDashboardName != null && pageService.currentDashboardName != ''? pageService.currentDashboardName : navigationService.currentPage|addWhiteSpace}}\r\n\r\n
    0\" class=\"text-start d-flex flex-wrap\" style=\"flex: 1; max-width: 400px; padding-top: 8px; padding-bottom: 8px;\">\r\n
    You have ({{pageService.changedItemsCount()}}) {{pageService.changedItemsCount() > 1 ? 'changes':'change'}}
    \r\n
    \r\n Cancel\r\n Apply\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, OnChanges, ChangeDetectorRef } from '@angular/core';\r\nimport {PageService} from '../shared/services/page.service';\r\nimport {NavigationService} from '../shared/services/navigation.service';\r\nimport {SilverWareIcons} from '../shared/services/SilverWareIcons';\r\nimport {SilverWareArrays} from '../shared/services/SilverWareArrays';\r\nimport {DatabitParameterValue} from '../shared/interfaces/DatabitParameterValue';\r\nimport {DashboardType} from '../shared/interfaces/DashboardType';\r\nimport {ObjectState} from '../shared/interfaces/ObjectState';\r\nimport {FilterOptionsComponent} from '../charts/filter-options/filter-options.component';\r\nimport {ModalService} from '../shared/services/modal.service';\r\nimport {DatabitConfig} from '../shared/interfaces/DatabitConfig';\r\nimport {Dashboard} from '../shared/interfaces/Dashboard';\r\nimport { DatabitParameter, DatabitParameterType } from '../shared/interfaces/DatabitParameter';\r\nimport { __param } from 'tslib';\r\n\r\n@Component({\r\n selector: 'app-page-detector',\r\n templateUrl: './page-detector.component.html',\r\n styleUrls: ['./page-detector.component.css']\r\n})\r\nexport class PageDetectorComponent implements OnInit, OnChanges {\r\n\r\n dataBitsParameterValues: Array;\r\n databitsParameters: Array;\r\n constructor(public pageService: PageService, public navigationService: NavigationService, private modalService: ModalService,\r\n public changeDetectorRef: ChangeDetectorRef) { }\r\n\r\n ngOnInit() {\r\n this.dataBitsParameterValues = [\r\n { name: 'DateRange', value: null },\r\n { name: 'ServiceTypes', value: null },\r\n { name: 'Segments', value: null },\r\n { name: 'CostCenters', value: null },\r\n { name: 'Users', value: null }\r\n ];\r\n this.databitsParameters = [\r\n { name: 'DateRange', displayName: 'Date Range', availableValues: null, defaultValue: null, isArray: false, type: DatabitParameterType.DateRange },\r\n { name: 'ServiceTypes', displayName: 'Service Types', availableValues: null, defaultValue: { name: 'All', value: 'All' }, isArray: true, type: DatabitParameterType.List },\r\n { name: 'Segments', displayName: 'Segments', availableValues: null, defaultValue: { name: 'All', value: 'All' }, isArray: true, type: DatabitParameterType.List },\r\n { name: 'CostCenters', displayName: 'Cost Centers', availableValues: null, defaultValue: { name: 'All', value: 'All' }, isArray: true, type: DatabitParameterType.List },\r\n { name: 'Users', displayName: 'Users', availableValues: null, defaultValue: { name: 'All', value: 'All' }, isArray: true, type: DatabitParameterType.List }\r\n ];\r\n }\r\n\r\n public storeSelection() {\r\n const listStore = this.pageService.getChainStores(this.pageService.chainID).map(store => ({ name: store.name, value: store.id , icon: SilverWareIcons.databitParametersIcon('storeID')}));\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: {flex: 1, margin: '5px'}\r\n };\r\n const modalObject = {\r\n buttons: [saveBtn],\r\n isMultiSelect: false,\r\n selectList: listStore,\r\n inputData : this.pageService.storeID,\r\n cancelStyle: {flex: 1, margin: '5px'}\r\n };\r\n this.modalService.list(null, 'Please choose your store', modalObject, null, 'Cancel', (result: any) => {\r\n if (result.inputData != null && result.inputData != '' && result.inputData != this.pageService.storeID) {\r\n this.pageService.storeID = result.inputData;\r\n this.pageService.refreshOtherPage();\r\n }\r\n\r\n });\r\n }\r\n\r\n public ngDoCheck() {\r\n\r\n }\r\n public showOptions() {\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n const index = SilverWareArrays.indexOf(copyDatabitsParameterValues,\r\n (item: DatabitParameterValue) => item.name === 'storeID');\r\n if (index > -1) {\r\n this.pageService.updateStore(copyDatabitsParameterValues[index].value);\r\n copyDatabitsParameterValues.splice(index, 1);\r\n }\r\n else {\r\n this.dataBitsParameterValues = copyDatabitsParameterValues;\r\n this.dataBitsParameterValues = this.dataBitsParameterValues.filter((dbit) => dbit.value != null);\r\n // If we changed the filter we need to run the databit again\r\n //this.pageService.currentPageWidgets.map((w) => w.parameterValues = [...w.parameterValues, ...this.dataBitsParameterValues]);\r\n this.pageService.refreshPage(this.dataBitsParameterValues);\r\n }\r\n\r\n },\r\n isDismiss: true,\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' }\r\n };\r\n // Deep copy the object\r\n let copyDatabitsParameterValues = [];\r\n if (this.dataBitsParameterValues != null) {\r\n copyDatabitsParameterValues = this.dataBitsParameterValues.map(x => Object.assign({}, x));\r\n }\r\n const modalObject = {\r\n size: 'modal-lg',\r\n title: 'Custom Filters',\r\n template: FilterOptionsComponent,\r\n buttons: [saveBtn],\r\n override: true,\r\n buttonsContainerStyle: { display: 'flex', justifyContent: 'space-evenly' },\r\n templateInputs: [\r\n { key: 'databitsParameterValues', value: copyDatabitsParameterValues },\r\n { key: 'databitsParameters', value: this.databitsParameters },\r\n //{ key: 'currentDatabit', value: this.databitName },\r\n { key: 'storeId', value: this.pageService.storeID },\r\n { key: 'databitsCollection', value: this.pageService.getCurrentDashBoardComponent().dashboardDatabits.map((wid) => wid.databitName) }\r\n ],\r\n cancelStyle: { flex: 1, margin: '5px' }\r\n };\r\n this.modalService.show(modalObject);\r\n }\r\n\r\n ngOnChanges() {}\r\n\r\n public getFilterIcon(key: string) {\r\n return SilverWareIcons.databitParametersIcon(key);\r\n }\r\n}\r\n","
    \r\n\r\n
    \r\n
    \r\n \"Silverware\r\n
    \r\n
    \r\n
    SILVERWARE
    \r\n
    Advanced Hospitality Technology
    \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 {{pageService.currentUser.firstName ? pageService.currentUser.firstName : ''}} {{pageService.currentUser.lastName ? pageService.currentUser.lastName : ''}}\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 Sign Out\r\n
    \r\n\r\n \r\n
    \r\n\r\n\r\n
    \r\n
    \r\n","import {Component, EventEmitter, OnInit, Output} from '@angular/core';\r\nimport {NavigationService} from '../../shared/services/navigation.service';\r\nimport { AuthService } from '../../shared/services/auth.service';\r\nimport { PageService } from '../../shared/services/page.service';\r\nimport { ModalService } from '../../shared/services/modal.service';\r\nimport { UserService } from '../../shared/services/user.service';\r\nimport { AppConfig } from '../../shared/app.config';\r\n\r\n@Component({\r\n selector: 'app-top-bar',\r\n templateUrl: './top-bar.component.html',\r\n styleUrls: ['./top-bar.component.css']\r\n})\r\nexport class TopBarComponent implements OnInit {\r\n\r\n @Output() onChangeChainClick = new EventEmitter();\r\n constructor(public navigationService: NavigationService, public authService: AuthService, public pageService: PageService, public modalService: ModalService, public userService: UserService, private appConfig: AppConfig) { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n public goToSilverWareBlog() {\r\n window.open(this.appConfig.blogUrl, '_blank');\r\n }\r\n\r\n tabChanged(newTab: string) {\r\n this.navigationService.SideBarCurrentTab = newTab;\r\n }\r\n}\r\n","import { Directive, ViewContainerRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appDynamic]'\r\n})\r\nexport class DynamicDirective {\r\n\r\n constructor(public viewContainerRef: ViewContainerRef) { }\r\n\r\n}\r\n","import { Component, Input, OnInit, ViewChild, ComponentFactoryResolver } from '@angular/core';\r\nimport {DynamicDirective} from '../dynamic.directive';\r\nimport {SilverWareArrays} from '../shared/services/SilverWareArrays';\r\n\r\n@Component({\r\n selector: 'app-add-dynamic',\r\n templateUrl: './add-dynamic.component.html',\r\n styleUrls: ['./add-dynamic.component.css']\r\n})\r\nexport class AddDynamicComponent implements OnInit {\r\n @ViewChild(DynamicDirective, {static: true}) adHost: DynamicDirective;\r\n private component: any ;\r\n @Input() set template(component: any ) {\r\n this.component = component;\r\n this.loadComponent();\r\n }\r\n private componentInputs: [];\r\n @Input() set templateInputs(inputs: []) {\r\n this.componentInputs = inputs;\r\n this.loadComponent();\r\n }\r\n watch: any;\r\n constructor(private componentFactoryResolver: ComponentFactoryResolver) { }\r\n\r\n ngOnInit() {\r\n this.loadComponent();\r\n }\r\n loadComponent() {\r\n\r\n if (this.component != null) {\r\n const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.component);\r\n\r\n const viewContainerRef = this.adHost.viewContainerRef;\r\n viewContainerRef.clear();\r\n\r\n const componentRef = viewContainerRef.createComponent(componentFactory);\r\n SilverWareArrays.forEach(this.componentInputs, function (input: any) {\r\n if (componentRef.instance[input.key] != undefined) {\r\n componentRef.instance[input.key] = input.value;\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
    {{modalService.title}}
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n {{autoFocus()}}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {{modalService.text}}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n {{modalService.inputValidationError}}\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 {{modalService.inputValidationError}}\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {{modalService.inputFieldLabel}}:\r\n
    \r\n
    \r\n {{modalService.inputValidationError}}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {{item.name}}\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
    {{btn.name}}
    \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
    {{chartProps.chartTitle}}
    \r\n
    \r\n
    {{chartProps.chartSubtitle}}
        \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
    {{chartProps.chartDateFilter}}
    \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, ElementRef, OnInit, ViewChild, OnDestroy} from '@angular/core';\r\nimport {ModalService} from '../shared/services/modal.service';\r\nimport {NavigationService} from '../shared/services/navigation.service';\r\nimport { ShareService } from '../shared/services/share.service';\r\nimport { groupings } from './../../environments/environment';\r\nimport * as _ from 'lodash';\r\nimport { Subscription } from 'rxjs';\r\nimport { group } from '@angular/animations';\r\nimport {CommonService} from '../shared/services/common.service';\r\nimport {AvailableChartType} from '../shared/enums/available-chart-type.enum';\r\nimport {ChartDataset} from 'chart.js';\r\nimport {ChartFormatInfo} from '../shared/interfaces/ChartFormatInfo';\r\nimport {GroupCharData} from '../shared/types/group-char-data';\r\n\r\nexport enum GroupSizes {\r\n Minimum = 0,\r\n Medium = 1,\r\n Maximum = 2\r\n}\r\n\r\n@Component({\r\n selector: 'app-modal-dialog',\r\n templateUrl: './modal-dialog.component.html',\r\n styleUrls: ['./modal-dialog.component.css']\r\n})\r\nexport class ModalDialogComponent implements OnInit, OnDestroy {\r\n chartData: ModalChartData = {\r\n type: null,\r\n labels: [],\r\n data: [],\r\n xLabel: null,\r\n yLabel: null,\r\n showLegend: true,\r\n formatInfo: null,\r\n databitHTML: null,\r\n widgetId: null\r\n };\r\n chartProps = {\r\n chartTitle: null,\r\n chartSubtitle: null,\r\n chartDateFilter: null\r\n };\r\n\r\n canBeMinGrouped: boolean;\r\n canBeMedGrouped: boolean;\r\n canBeMaxGrouped: boolean;\r\n\r\n currentGroupSize: GroupSizes;\r\n\r\n groupSizes = GroupSizes;\r\n\r\n private subscription: Subscription;\r\n\r\n constructor(public modalService: ModalService, public navigationService: NavigationService, public commonService: CommonService) {\r\n this.subscription = modalService.chartInfo$.subscribe((cd) => {\r\n this.chartData = cd;\r\n this.canBeMinGrouped = true;\r\n this.canBeMedGrouped = true;\r\n\r\n this.currentGroupSize = GroupSizes.Maximum;\r\n\r\n // Modal dialog with chart data will be shown when user hits the full screen. So MaxGrouping is already enabled\r\n this.chartData = this.commonService.groupDataBySize(Number.MAX_VALUE, cd, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.canBeMaxGrouped = false;\r\n });\r\n\r\n\r\n this.subscription = modalService.chartProperties$.subscribe((cp) => {\r\n this.chartProps = cp;\r\n });\r\n\r\n\r\n }\r\n @ViewChild('searchbar') searchbar: ElementRef;\r\n ngOnInit() {\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription.unsubscribe();\r\n }\r\n public autoFocus() {\r\n if (this.searchbar != undefined && this.searchbar != null) {\r\n this.searchbar.nativeElement.focus();\r\n }\r\n\r\n }\r\n public onDecreaseSizeClicked() {\r\n if (this.currentGroupSize != GroupSizes.Minimum) {\r\n switch (this.currentGroupSize) {\r\n case GroupSizes.Maximum: {\r\n this.chartData = this.commonService.groupDataBySize(groupings.medGrouping, this.modalService.chartInfo, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.currentGroupSize = GroupSizes.Medium;\r\n break;\r\n }\r\n case GroupSizes.Medium: {\r\n this.chartData = this.commonService.groupDataBySize(groupings.minGrouping, this.modalService.chartInfo, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.currentGroupSize = GroupSizes.Minimum;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public onIncreaseSizeClicked() {\r\n if (this.currentGroupSize != GroupSizes.Maximum) {\r\n switch (this.currentGroupSize) {\r\n case GroupSizes.Minimum: {\r\n this.chartData = this.commonService.groupDataBySize(groupings.medGrouping, this.modalService.chartInfo, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.currentGroupSize = GroupSizes.Medium;\r\n break;\r\n }\r\n case GroupSizes.Medium: {\r\n this.chartData = this.commonService.groupDataBySize(Number.MAX_VALUE, this.modalService.chartInfo, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.currentGroupSize = GroupSizes.Maximum;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public onMinGroupClicked() {\r\n if (this.canBeMinGrouped) {\r\n this.chartData = this.commonService.groupDataBySize(groupings.minGrouping, this.modalService.chartInfo, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.canBeMinGrouped = false;\r\n }\r\n this.canBeMedGrouped = true;\r\n this.canBeMaxGrouped = true;\r\n\r\n\r\n }\r\n public onMedGroupClicked() {\r\n if (this.canBeMedGrouped) {\r\n this.chartData = this.commonService.groupDataBySize(groupings.medGrouping, this.modalService.chartInfo, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.canBeMedGrouped = false;\r\n }\r\n this.canBeMinGrouped = true;\r\n this.canBeMaxGrouped = true;\r\n\r\n }\r\n public onMaxGroupClicked() {\r\n this.canBeMinGrouped = true;\r\n this.canBeMedGrouped = true;\r\n if (this.canBeMaxGrouped) {\r\n this.chartData = this.commonService.groupDataBySize(Number.MAX_VALUE, this.modalService.chartInfo, this.modalService.chartInfo.isTimeSeriesOrTextData, this.modalService.chartInfo.isTimeSeriesOrTextData);\r\n this.canBeMaxGrouped = false;\r\n }\r\n }\r\n}\r\ntype ModalChartData = GroupCharData & {\r\n type?: AvailableChartType,\r\n xLabel?: string,\r\n yLabel?: string,\r\n showLegend?: boolean,\r\n formatInfo?: ChartFormatInfo,\r\n databitHTML?: string,\r\n widgetId?: string\r\n}\r\n","\r\n\r\n
    0}\">\r\n @if(state.hasError) {\r\n
    \r\n
    \r\n

    {{state.errorMsg ?? 'An unknown error occurred! Please contact technical support team.'}}

    \r\n
    \r\n
    \r\n } @else {\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n

    Please Wait...

    \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, HostListener, OnInit} from '@angular/core';\r\nimport {ActivatedRouteSnapshot, NavigationStart, Router, RoutesRecognized} from '@angular/router';\r\nimport {NavigationService} from './shared/services/navigation.service';\r\nimport {DatabitService} from './shared/services/databit.service';\r\nimport {DashboardService} from './shared/services/dashboard.service';\r\nimport {PageService} from './shared/services/page.service';\r\nimport {AuthService} from './shared/services/auth.service';\r\nimport {DashboardType} from './shared/interfaces/DashboardType';\r\nimport {ModalService} from './shared/services/modal.service';\r\nimport {Guid} from './shared/generate-guid.component';\r\nimport {SilverWareArrays} from './shared/services/SilverWareArrays';\r\nimport {UserSetting} from './shared/interfaces/UserSetting';\r\nimport {Page} from './shared/interfaces/Page';\r\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\r\nimport {Chart} from 'chart.js';\r\nimport {NameValue} from \"./shared/types/name-value\";\r\nimport {SilverWareCommon} from \"./shared/services/SilverWareCommon\";\r\nimport {Chain} from \"./shared/interfaces/Chain\";\r\nimport {ApplicationResponse} from \"./shared/responses/application-response\";\r\nimport {UserService} from \"./shared/services/user.service\";\r\nimport {CommonService} from \"./shared/services/common.service\";\r\nimport {LogService} from \"./shared/services/log.service\";\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.css']\r\n})\r\nexport class AppComponent implements OnInit {\r\n // public innerWidth: any;\r\n state: AppComponentState = {\r\n chainId: null, errorMsg: null, firstLoad: false, hasError: false\r\n\r\n };\r\n\r\n constructor(private router: Router, public navigationService: NavigationService,\r\n private databitService: DatabitService, private dashboardService: DashboardService,\r\n public pageService: PageService, public authService: AuthService,\r\n private modalService: ModalService, private userService: UserService, public commonService: CommonService,\r\n private logService: LogService) {\r\n Chart.register(ChartDataLabels);\r\n }\r\n\r\n async ngOnInit(): Promise {\r\n this.state = {\r\n chainId: null, errorMsg: null, firstLoad: true, hasError: false\r\n };\r\n\r\n // Redirect to home page on refreshing any page\r\n this.router.events.subscribe((event): void => {\r\n if (event instanceof NavigationStart) {\r\n\r\n } else if (event instanceof RoutesRecognized) { // && !router.navigated\r\n const activatedRoute = event.state.root.firstChild;\r\n if (!activatedRoute) {\r\n\r\n } else {\r\n this.navigationService.updateScreenWidth(window.innerWidth);\r\n this.validateState(activatedRoute);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private async validateState(activatedRoute: ActivatedRouteSnapshot): Promise {\r\n if (this.state.hasError) {\r\n this.authService.loggedIn = false;\r\n } else if (activatedRoute) {\r\n\r\n if (activatedRoute.data['page'] === Page.ExportWidgets) {\r\n\r\n // this.pageService.loadingOverLay = true;\r\n const loadQueryParams = (): Promise<{ChainId: string, DashboardId: string, WidgetId: string}> => {\r\n this.pageService.loadingOverLay = true;\r\n return new Promise<{ChainId: string, DashboardId: string, WidgetId: string}>((resolve, reject): void => {\r\n const obj = {ChainId: null, DashboardId: null, WidgetId: null};\r\n const chainId = activatedRoute.params['chain-id'];\r\n if (Guid.isValid(chainId)) {\r\n obj.ChainId = chainId;\r\n }\r\n const dashboardId = activatedRoute.params['dashboard-id'];\r\n if (Guid.isValid(dashboardId)) {\r\n obj.DashboardId = dashboardId;\r\n }\r\n\r\n const widgetId = activatedRoute.params['widget-id'];\r\n if (Guid.isValid(widgetId)) {\r\n obj.WidgetId = widgetId;\r\n }\r\n resolve(obj);\r\n });\r\n };\r\n\r\n const widgetToExport = await loadQueryParams();\r\n // Valid url prams\r\n // Don't load the rest of the app\r\n if (widgetToExport.ChainId && widgetToExport.DashboardId && widgetToExport.WidgetId) {\r\n // this.pageService.chainID = widgetToExport.ChainId.toLowerCase();\r\n this.authService.loggedIn = true;\r\n // this.pageService.loadingOverLay = false;\r\n\r\n return;\r\n }\r\n // this.pageService.loadingOverLay = false;\r\n // Fix the url and load the whole app\r\n this.router.navigate(['/']);\r\n\r\n }\r\n // We need to call the rest of the function only once. Skip if we already laaded the Auth user, chains and databits\r\n if (this.state.firstLoad === false) {\r\n return;\r\n }\r\n this.state.firstLoad = false;\r\n\r\n if (!this.authService.hasAuthCookie()) {\r\n this.logService.debug('Auth cookie not found. navigating to MyPass...');\r\n // Redirect to MyPass Logon with redirect to CM\r\n this.authService.logOut(true);\r\n return;\r\n }\r\n\r\n\r\n // Let's Validate the user cookie\r\n if (!this.authService.isAuthenticated()) {\r\n this.logService.debug('User is not authenticated yet. Authenticating user...');\r\n await this.authService.logOn();\r\n }\r\n\r\n this.pageService.loadingOverLay = true;\r\n await this.getAvailableDatabits();\r\n this.pageService.loadingOverLay = false;\r\n\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(this.state.chainId) && this.commonService.isNotNullAndUndefinedAndEmpty(this.defaultChain)) {\r\n this.state.chainId = this.defaultChain.value.toLowerCase();\r\n }\r\n this.logService.debug('Chain ID: ' + this.state.chainId);\r\n this.pageService.setDashboardUser(this.authService.user);\r\n\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(this.state.chainId)) {\r\n const chainInfo = this.pageService.chainInfo(this.state.chainId.toLowerCase());\r\n if (this.commonService.isNotNullAndUndefinedAndEmpty(chainInfo)) {\r\n this.logService.debug(`Chain is valid. Current Chain ${chainInfo.name}`);\r\n this.pageService.chainID = this.state.chainId ;\r\n this.navigationService.updateURL(this.state.chainId);\r\n this.pageService.loadingOverLay = true;\r\n await this.doGetUserDashboards();\r\n this.pageService.loadingOverLay = false;\r\n return;\r\n }\r\n }\r\n\r\n this.logService.warn('No chain in URL. get default');\r\n await this.doSelectDefaultChain().then(_ => {\r\n if (this.state.hasError)\r\n return;\r\n\r\n this.doGetUserDashboards().then(_ => {});\r\n });\r\n }\r\n this.pageService.loadingOverLay = false;\r\n }\r\n\r\n private async doGetUserDashboards(): Promise {\r\n return new Promise(resolve => {\r\n const doProcessError = (ex): void => {\r\n const errMsg = this.commonService.flattenErrorMessages(ex);\r\n this.logService.error(`Error during loading user dashboards. Error: ${errMsg}`);\r\n this.state.hasError = true;\r\n this.state.errorMsg = errMsg;\r\n this.pageService.loadingOverLay = false;\r\n resolve();\r\n };\r\n this.dashboardService.getUserDashboards(this.authService.user.id, DashboardType.Any, false).subscribe({\r\n next: response => {\r\n if (response.success === true) {\r\n // save the dashboards in navigation service\r\n // this.navigationService.availableDashboards = response.dashboards;\r\n this.dashboardService.savedDashboards = response.dashboards;\r\n // Finding the current navigated dashboard in the saved dashboards array at navigation service\r\n // and set it in the page service\r\n this.navigationService.chainId = this.pageService.chainID;\r\n this.pageService.loadingOverLay = false;\r\n } else {\r\n doProcessError(response.message);\r\n }\r\n\r\n }, error: err => {\r\n doProcessError(err);\r\n }\r\n });\r\n })\r\n }\r\n\r\n private get defaultChain(): UserSetting {\r\n return SilverWareArrays.firstOrDefault(this.authService.user.settings, (setting: UserSetting) => setting.name == 'DefaultChainID' && setting.userID == this.authService.user.id) ?? null;\r\n }\r\n\r\n async getAvailableDatabits(): Promise {\r\n return new Promise((resolve, reject) => {\r\n this.databitService.getDatabitsInfo().subscribe((databitsInfoResponse: any) => {\r\n if (databitsInfoResponse.success) {\r\n const databits = databitsInfoResponse.databitsInfo;\r\n this.pageService.availableDatabitsArray = databits;\r\n resolve(true);\r\n } else {\r\n this.state.errorMsg = databitsInfoResponse.message;\r\n this.state.hasError = true;\r\n this.pageService.loadingOverLay = false;\r\n\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private async doSaveUserDefaultChain(chain: Chain): Promise> {\r\n return new Promise>(resolve => {\r\n let defaultChainUserSetting = SilverWareArrays.firstOrDefault(this.pageService.currentUser.settings, (x: UserSetting) => x.name == \"DefaultChainID\");\r\n if (SilverWareCommon.isNotNullEmptyUndefined(defaultChainUserSetting)) {\r\n defaultChainUserSetting.value = chain.id;\r\n } else {\r\n defaultChainUserSetting = {\r\n id: SilverWareCommon.newGuid().toString(),\r\n name: \"DefaultChainID\",\r\n userID: this.pageService.currentUser.id,\r\n value: chain.id\r\n };\r\n }\r\n\r\n const doLogError = (ex: any): void => {\r\n const errMsg = this.commonService.flattenErrorMessages(ex);\r\n this.state.hasError = true;\r\n this.state.errorMsg = errMsg;\r\n this.pageService.loadingOverLay = false;\r\n this.modalService.error(`Error during saving user default chain. Error: ${errMsg}`, 'Error');\r\n resolve({success: false, message: errMsg});\r\n };\r\n this.pageService.loadingOverLay = true;\r\n this.userService.saveUserSettings([defaultChainUserSetting]).subscribe({\r\n next: response => {\r\n if (response.success === true) {\r\n this.logService.debug(`User chain saved successfully.`);\r\n this.navigationService.updateURL(chain.id);\r\n this.pageService.updateChain(chain.id);\r\n this.state.chainId = chain.id;\r\n this.pageService.loadingOverLay = false;\r\n } else {\r\n doLogError(response.message);\r\n }\r\n },\r\n error: err => {\r\n doLogError(err);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private async doSelectDefaultChain(): Promise {\r\n return new Promise(resolve => {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(this.pageService.currentUser.chains)) {\r\n this.state.hasError = true;\r\n this.state.errorMsg = 'No Chains found! Please contact technical support team.';\r\n resolve();\r\n return;\r\n }\r\n if (this.pageService.currentUser.chains.length === 1) {\r\n const chain = this.pageService.currentUser.chains[0];\r\n this.doSaveUserDefaultChain(chain).then(() => {\r\n resolve();\r\n });\r\n\r\n return;\r\n }\r\n\r\n this.changeChain(true).then(chain => {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(chain)) {\r\n resolve();\r\n return;\r\n }\r\n\r\n this.doSaveUserDefaultChain(chain).then(() => {\r\n resolve();\r\n });\r\n });\r\n\r\n });\r\n }\r\n\r\n async changeChain(isRequired: boolean): Promise {\r\n return new Promise(resolve => {\r\n const chains: NameValue[] = this.pageService.currentUser.chains.sort().map(chain => ({ name: chain.name, value: chain.id.toLowerCase() }));\r\n if (chains) {\r\n chains.sort((a, b) => {\r\n if (a.name > b.name) return 1;\r\n if (a.name < b.name) return -1;\r\n if (a.name === b.name) return 0;\r\n });\r\n }\r\n const saveBtn = {\r\n class: 'btn-default',\r\n click: () => {\r\n\r\n },\r\n label: 'Apply',\r\n style: { flex: 1, margin: '5px' },\r\n inputValidator: isRequired ? (chainID: string): string => {\r\n return this.commonService.isNotNullAndUndefinedAndEmpty(chainID) ? null : 'Please select a chain';\r\n } : null\r\n };\r\n const modalObject = {\r\n buttons: [saveBtn],\r\n isMultiSelect: false,\r\n inputData: this.pageService.chainID,\r\n selectList: chains,\r\n cancelStyle: { flex: 1, margin: '5px' },\r\n hideCancel: isRequired,\r\n keyboard: isRequired\r\n };\r\n\r\n this.modalService.list(null, 'Please choose your chain', modalObject, null, 'Cancel', (result: any) => {\r\n if (!this.commonService.isNotNullAndUndefinedAndEmpty(result.inputData)) {\r\n if (isRequired) {\r\n this.logService.error('No chain is selected');\r\n }\r\n resolve(null);\r\n return;\r\n }\r\n const chainId = result.inputData;\r\n const chain = this.pageService.currentUser.chains.find(ch => ch.id === chainId);\r\n this.doSaveUserDefaultChain(chain).then(response => {\r\n if (response.success === true) {\r\n resolve(chain);\r\n } else {\r\n resolve(null);\r\n }\r\n })\r\n });\r\n });\r\n }\r\n // Scroll to top on every route click\r\n onActivate(event) {\r\n window.scroll(0, 0);\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event) {\r\n this.navigationService.updateScreenWidth(window.innerWidth);\r\n }\r\n\r\n // Set the height to 100% after a short delay to fix white bar caused by safari web tools\r\n @HostListener('window:orientationchange', ['$event'])\r\n onOrientationChange(event) {\r\n this.navigationService.updateScreenHeight();\r\n }\r\n}\r\ntype AppComponentState = {\r\n chainId: string;\r\n firstLoad: boolean;\r\n hasError: boolean;\r\n errorMsg: string;\r\n}\r\n","import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\r\nimport {Injectable} from \"@angular/core\";\r\nimport {AuthService} from \"../services/auth.service\";\r\nimport {LogService} from \"../services/log.service\";\r\nimport {finalize, Observable, throwError} from \"rxjs\";\r\nimport {catchError} from \"rxjs/operators\";\r\n\r\n@Injectable()\r\nexport class HttpRequestAuthInterceptor implements HttpInterceptor {\r\n constructor(private authService: AuthService, private logService: LogService) {}\r\n private readonly APIS_TO_TRACK = ['Databits']\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n const logObj = this.logService.logApi(request.url, request.method);\r\n const trackAPI = this.APIS_TO_TRACK.find(x => request.url.indexOf(x) > -1);\r\n let timer: any = null;\r\n let duration = 0;\r\n let el: HTMLElement = null;\r\n // Display a message while Pick chain is syncing\r\n if (trackAPI !== null && trackAPI !== undefined) {\r\n timer = setInterval(() => {\r\n if (duration >= 5) {\r\n el = document.getElementById('syncMessage');\r\n if (el) {\r\n el.style.display = 'block';\r\n destroyTimer();\r\n return;\r\n }\r\n }\r\n duration++;\r\n }, 1000);\r\n }\r\n const destroySyncMessage = (): void => {\r\n if (!el)\r\n return;\r\n\r\n el.style.display = 'none';\r\n };\r\n const destroyTimer = (): void => {\r\n if (timer === null)\r\n return;\r\n\r\n clearInterval(timer);\r\n timer = null;\r\n };\r\n return next.handle(request).pipe(\r\n catchError((error) => {\r\n destroyTimer();\r\n destroySyncMessage();\r\n if (error.status === 401) {\r\n this.logService.error('No Authorized.');\r\n this.authService.logOut();\r\n }\r\n return throwError(error);\r\n })\r\n ).pipe(\r\n finalize(() => {\r\n destroyTimer();\r\n destroySyncMessage();\r\n this.logService.logDuration(logObj.id);\r\n })\r\n )\r\n }\r\n}\r\n","import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\r\nimport {Injectable} from \"@angular/core\";\r\nimport {AuthService} from \"../services/auth.service\";\r\nimport {Observable} from \"rxjs\";\r\n\r\n@Injectable()\r\nexport class HttpHeaderInterceptor implements HttpInterceptor {\r\n\r\n constructor(private authService: AuthService) {}\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n request = request.clone({\r\n withCredentials: true,\r\n setHeaders: {}\r\n });\r\n request.clone();\r\n\r\n return next.handle(request);\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpInterceptorFn,\r\n HttpRequest\r\n} from '@angular/common/http';\r\nimport {Injectable} from \"@angular/core\";\r\nimport {LogService} from \"../services/log.service\";\r\nimport {Observable, throwError} from \"rxjs\";\r\nimport {catchError} from \"rxjs/operators\";\r\n\r\n\r\n@Injectable()\r\nexport class HttpErrorInterceptor implements HttpInterceptor {\r\n\r\n constructor(private logService: LogService) {}\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n return next.handle(request).pipe(\r\n catchError((error: HttpErrorResponse) => {\r\n this.logService.error(`Http Error - Code: ${error.status} - Request Body: ${JSON.stringify(request.body)}`);\r\n if (error.status === 0) {\r\n return throwError(() => 'Failed to communicate to the server');\r\n }\r\n return throwError(() => error);\r\n })\r\n )\r\n }\r\n}\r\n","import {ErrorHandler, Injectable, Injector} from \"@angular/core\";\r\nimport {HttpErrorResponse} from \"@angular/common/http\";\r\nimport {LogService} from \"../services/log.service\";\r\n\r\n@Injectable()\r\nexport class GlobalErrorHandler extends ErrorHandler {\r\n // Error handling is important and needs to be loaded first.\r\n // Because of this we should manually inject the services with Injector.\r\n constructor(private injector: Injector) {\r\n super()\r\n }\r\n\r\n override handleError(error: Error | HttpErrorResponse): void {\r\n // super.handleError(error);\r\n\r\n const logger = this.injector.get(LogService);\r\n let message = 'Unknown Error';\r\n let name = '';\r\n let stackTrace = null;\r\n\r\n if (error) {\r\n if (typeof error === 'string') {\r\n message = error;\r\n } else {\r\n if (error.name)\r\n name = `[${error.name}] `;\r\n\r\n if(error.message)\r\n message = error.message;\r\n }\r\n if (error instanceof Error) {\r\n if (error.stack)\r\n stackTrace = error.stack;\r\n }\r\n }\r\n\r\n // Always log errors\r\n const logMessage = `${name}${message}`;\r\n logger.error(logMessage, stackTrace);\r\n }\r\n}\r\n","import {BrowserModule, HammerModule} from '@angular/platform-browser';\r\nimport {EnvironmentProviders, ErrorHandler, NgModule, Provider} from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\n\r\n// Import material drag and drop\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { AppRoutingModule, routingComponents } from './app-routing.module';\r\nimport { AppComponent } from './app.component';\r\nimport { BarChartComponent } from './charts/bar-chart/bar-chart.component';\r\nimport { DoughnutChartComponent } from './charts/doughnut-chart/doughnut-chart.component';\r\nimport { PieChartComponent } from './charts/pie-chart/pie-chart.component';\r\nimport { ChartComponent } from './charts/chart/chart.component';\r\nimport { LineChartComponent } from './charts/line-chart/line-chart.component';\r\n\r\n// Config\r\nimport { AppConfig } from './shared/app.config';\r\n\r\nimport {BaseChartDirective, provideCharts, withDefaultRegisterables} from 'ng2-charts';\r\nimport { SideBarComponent } from './navigation-bars/side-bar/side-bar.component';\r\nimport { ComparisonComponent } from './comparison/comparison.component';\r\nimport { GuestsComponent } from './guests/guests.component';\r\nimport { BottomBarComponent } from './navigation-bars/bottom-bar/bottom-bar.component';\r\nimport { UserProfileComponent } from './user-profile/user-profile.component';\r\nimport { NotificationsComponent } from './notifications/notifications.component';\r\nimport { TopBarComponent } from './navigation-bars/top-bar/top-bar.component';\r\nimport { TextChartComponent } from './charts/text-chart/text-chart.component';\r\nimport { ReportChartComponent } from './charts/report-chart/report-chart.component';\r\nimport { CalendarComponent } from './calendar/calendar.component';\r\nimport { ModalDialogComponent } from './modal-dialog/modal-dialog.component';\r\nimport { DynamicDirective } from './dynamic.directive';\r\nimport { AddDynamicComponent } from './add-dynamic/add-dynamic.component';\r\nimport { FilterOptionsComponent } from './charts/filter-options/filter-options.component';\r\nimport { PageDetectorComponent } from './page-detector/page-detector.component';\r\n\r\nimport { AddWhiteSpacePipe } from './shared/filters/add-white-space.pipe';\r\nimport { ChartTypePipe } from './shared/filters/chart-type.pipe';\r\nimport { FormatChartNumberPipe } from './shared/filters/format-chart-number-pipe';\r\n\r\nimport { LoadingAnimationComponent } from './loading-animation/loading-animation.component';\r\nimport { AuthService } from './shared/services/auth.service';\r\nimport { SelectListComponent } from './select-list/select-list.component';\r\nimport { DragDropComponent } from './drag-drop/drag-drop.component';\r\nimport { RouteGuard } from './shared/classes/RouteGuard';\r\nimport { ExportWidgetComponent } from './export-widget/export-widget.component';\r\nimport { MultiLineInputComponent } from './templates/multi-line-input/multi-line-input.component';\r\nimport {HttpRequestAuthInterceptor} from \"./shared/interceptor/http-request.interceptor\";\r\nimport {HttpHeaderInterceptor} from \"./shared/interceptor/http-header.interceptor\";\r\nimport {HttpErrorInterceptor} from \"./shared/interceptor/http-error.interceptor\";\r\nimport {environment} from \"../environments/environment\";\r\nimport {GlobalErrorHandler} from \"./shared/global/global-error-handler\";\r\n\r\n\r\nconst providers: Array = [\r\n AppConfig,\r\n RouteGuard,\r\n AuthService,\r\n // Register All ChartJS charts\r\n provideCharts(withDefaultRegisterables()),\r\n // Http Interceptor(s) - adds with Client Credentials\r\n [\r\n { provide: HTTP_INTERCEPTORS, useClass: HttpRequestAuthInterceptor, multi: true },\r\n { provide: HTTP_INTERCEPTORS, useClass: HttpHeaderInterceptor, multi: true },\r\n { provide: HTTP_INTERCEPTORS, useClass: HttpErrorInterceptor, multi: true }\r\n ],\r\n];\r\n\r\n// Only add global error handler for production\r\n// On Debug we get a nice line number and can jump to the error\r\nif (environment.production) {\r\n console.info('Global error handler attached');\r\n providers.push({\r\n provide: ErrorHandler,\r\n useClass: GlobalErrorHandler,\r\n });\r\n}\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n routingComponents,\r\n BarChartComponent,\r\n DoughnutChartComponent,\r\n PieChartComponent,\r\n ChartComponent,\r\n LineChartComponent,\r\n SideBarComponent,\r\n ComparisonComponent,\r\n GuestsComponent,\r\n BottomBarComponent,\r\n UserProfileComponent,\r\n NotificationsComponent,\r\n TopBarComponent,\r\n TextChartComponent,\r\n ReportChartComponent,\r\n CalendarComponent,\r\n ModalDialogComponent,\r\n DynamicDirective,\r\n AddDynamicComponent,\r\n FilterOptionsComponent,\r\n PageDetectorComponent,\r\n AddWhiteSpacePipe,\r\n ChartTypePipe,\r\n FormatChartNumberPipe,\r\n LoadingAnimationComponent,\r\n SelectListComponent,\r\n DragDropComponent,\r\n ExportWidgetComponent,\r\n MultiLineInputComponent\r\n ],\r\n imports: [\r\n BrowserModule,\r\n AppRoutingModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n BaseChartDirective ,\r\n BrowserAnimationsModule,\r\n HttpClientModule,\r\n DragDropModule,\r\n HammerModule\r\n ],\r\n providers: providers,\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n","/***************************************************************************************************\r\n * Load `$localize` onto the global scope - used if i18n tags appear in Angular templates.\r\n */\r\nimport '@angular/localize/init';\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\n/**\r\n * Hammerjs must be imported for gestures\r\n */\r\nimport 'hammerjs';\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","var map = {\n\t\"./af\": 5637,\n\t\"./af.js\": 5637,\n\t\"./ar\": 6777,\n\t\"./ar-dz\": 4508,\n\t\"./ar-dz.js\": 4508,\n\t\"./ar-kw\": 7504,\n\t\"./ar-kw.js\": 7504,\n\t\"./ar-ly\": 5373,\n\t\"./ar-ly.js\": 5373,\n\t\"./ar-ma\": 2412,\n\t\"./ar-ma.js\": 2412,\n\t\"./ar-ps\": 8823,\n\t\"./ar-ps.js\": 8823,\n\t\"./ar-sa\": 6670,\n\t\"./ar-sa.js\": 6670,\n\t\"./ar-tn\": 6448,\n\t\"./ar-tn.js\": 6448,\n\t\"./ar.js\": 6777,\n\t\"./az\": 3009,\n\t\"./az.js\": 3009,\n\t\"./be\": 8299,\n\t\"./be.js\": 8299,\n\t\"./bg\": 4685,\n\t\"./bg.js\": 4685,\n\t\"./bm\": 1171,\n\t\"./bm.js\": 1171,\n\t\"./bn\": 3590,\n\t\"./bn-bd\": 5841,\n\t\"./bn-bd.js\": 5841,\n\t\"./bn.js\": 3590,\n\t\"./bo\": 4309,\n\t\"./bo.js\": 4309,\n\t\"./br\": 4130,\n\t\"./br.js\": 4130,\n\t\"./bs\": 8033,\n\t\"./bs.js\": 8033,\n\t\"./ca\": 5294,\n\t\"./ca.js\": 5294,\n\t\"./cs\": 3028,\n\t\"./cs.js\": 3028,\n\t\"./cv\": 5807,\n\t\"./cv.js\": 5807,\n\t\"./cy\": 342,\n\t\"./cy.js\": 342,\n\t\"./da\": 8269,\n\t\"./da.js\": 8269,\n\t\"./de\": 1489,\n\t\"./de-at\": 2123,\n\t\"./de-at.js\": 2123,\n\t\"./de-ch\": 7757,\n\t\"./de-ch.js\": 7757,\n\t\"./de.js\": 1489,\n\t\"./dv\": 8152,\n\t\"./dv.js\": 8152,\n\t\"./el\": 7687,\n\t\"./el.js\": 7687,\n\t\"./en-au\": 6668,\n\t\"./en-au.js\": 6668,\n\t\"./en-ca\": 6798,\n\t\"./en-ca.js\": 6798,\n\t\"./en-gb\": 3615,\n\t\"./en-gb.js\": 3615,\n\t\"./en-ie\": 1364,\n\t\"./en-ie.js\": 1364,\n\t\"./en-il\": 9907,\n\t\"./en-il.js\": 9907,\n\t\"./en-in\": 533,\n\t\"./en-in.js\": 533,\n\t\"./en-nz\": 3190,\n\t\"./en-nz.js\": 3190,\n\t\"./en-sg\": 1096,\n\t\"./en-sg.js\": 1096,\n\t\"./eo\": 3962,\n\t\"./eo.js\": 3962,\n\t\"./es\": 7726,\n\t\"./es-do\": 5010,\n\t\"./es-do.js\": 5010,\n\t\"./es-mx\": 3654,\n\t\"./es-mx.js\": 3654,\n\t\"./es-us\": 9043,\n\t\"./es-us.js\": 9043,\n\t\"./es.js\": 7726,\n\t\"./et\": 5343,\n\t\"./et.js\": 5343,\n\t\"./eu\": 728,\n\t\"./eu.js\": 728,\n\t\"./fa\": 787,\n\t\"./fa.js\": 787,\n\t\"./fi\": 1771,\n\t\"./fi.js\": 1771,\n\t\"./fil\": 5335,\n\t\"./fil.js\": 5335,\n\t\"./fo\": 9761,\n\t\"./fo.js\": 9761,\n\t\"./fr\": 1670,\n\t\"./fr-ca\": 8991,\n\t\"./fr-ca.js\": 8991,\n\t\"./fr-ch\": 7280,\n\t\"./fr-ch.js\": 7280,\n\t\"./fr.js\": 1670,\n\t\"./fy\": 4203,\n\t\"./fy.js\": 4203,\n\t\"./ga\": 9858,\n\t\"./ga.js\": 9858,\n\t\"./gd\": 8605,\n\t\"./gd.js\": 8605,\n\t\"./gl\": 7365,\n\t\"./gl.js\": 7365,\n\t\"./gom-deva\": 3896,\n\t\"./gom-deva.js\": 3896,\n\t\"./gom-latn\": 5587,\n\t\"./gom-latn.js\": 5587,\n\t\"./gu\": 7950,\n\t\"./gu.js\": 7950,\n\t\"./he\": 2029,\n\t\"./he.js\": 2029,\n\t\"./hi\": 1897,\n\t\"./hi.js\": 1897,\n\t\"./hr\": 9816,\n\t\"./hr.js\": 9816,\n\t\"./hu\": 2253,\n\t\"./hu.js\": 2253,\n\t\"./hy-am\": 8196,\n\t\"./hy-am.js\": 8196,\n\t\"./id\": 1307,\n\t\"./id.js\": 1307,\n\t\"./is\": 5474,\n\t\"./is.js\": 5474,\n\t\"./it\": 3099,\n\t\"./it-ch\": 8188,\n\t\"./it-ch.js\": 8188,\n\t\"./it.js\": 3099,\n\t\"./ja\": 9127,\n\t\"./ja.js\": 9127,\n\t\"./jv\": 182,\n\t\"./jv.js\": 182,\n\t\"./ka\": 758,\n\t\"./ka.js\": 758,\n\t\"./kk\": 3444,\n\t\"./kk.js\": 3444,\n\t\"./km\": 2034,\n\t\"./km.js\": 2034,\n\t\"./kn\": 6223,\n\t\"./kn.js\": 6223,\n\t\"./ko\": 3064,\n\t\"./ko.js\": 3064,\n\t\"./ku\": 8714,\n\t\"./ku-kmr\": 961,\n\t\"./ku-kmr.js\": 961,\n\t\"./ku.js\": 8714,\n\t\"./ky\": 2062,\n\t\"./ky.js\": 2062,\n\t\"./lb\": 4796,\n\t\"./lb.js\": 4796,\n\t\"./lo\": 9279,\n\t\"./lo.js\": 9279,\n\t\"./lt\": 106,\n\t\"./lt.js\": 106,\n\t\"./lv\": 1840,\n\t\"./lv.js\": 1840,\n\t\"./me\": 2240,\n\t\"./me.js\": 2240,\n\t\"./mi\": 3588,\n\t\"./mi.js\": 3588,\n\t\"./mk\": 5518,\n\t\"./mk.js\": 5518,\n\t\"./ml\": 7823,\n\t\"./ml.js\": 7823,\n\t\"./mn\": 8657,\n\t\"./mn.js\": 8657,\n\t\"./mr\": 1285,\n\t\"./mr.js\": 1285,\n\t\"./ms\": 3014,\n\t\"./ms-my\": 6253,\n\t\"./ms-my.js\": 6253,\n\t\"./ms.js\": 3014,\n\t\"./mt\": 167,\n\t\"./mt.js\": 167,\n\t\"./my\": 7940,\n\t\"./my.js\": 7940,\n\t\"./nb\": 14,\n\t\"./nb.js\": 14,\n\t\"./ne\": 9023,\n\t\"./ne.js\": 9023,\n\t\"./nl\": 4208,\n\t\"./nl-be\": 1412,\n\t\"./nl-be.js\": 1412,\n\t\"./nl.js\": 4208,\n\t\"./nn\": 1354,\n\t\"./nn.js\": 1354,\n\t\"./oc-lnc\": 870,\n\t\"./oc-lnc.js\": 870,\n\t\"./pa-in\": 389,\n\t\"./pa-in.js\": 389,\n\t\"./pl\": 7342,\n\t\"./pl.js\": 7342,\n\t\"./pt\": 4774,\n\t\"./pt-br\": 3003,\n\t\"./pt-br.js\": 3003,\n\t\"./pt.js\": 4774,\n\t\"./ro\": 5333,\n\t\"./ro.js\": 5333,\n\t\"./ru\": 3451,\n\t\"./ru.js\": 3451,\n\t\"./sd\": 3921,\n\t\"./sd.js\": 3921,\n\t\"./se\": 9682,\n\t\"./se.js\": 9682,\n\t\"./si\": 582,\n\t\"./si.js\": 582,\n\t\"./sk\": 4348,\n\t\"./sk.js\": 4348,\n\t\"./sl\": 5337,\n\t\"./sl.js\": 5337,\n\t\"./sq\": 9358,\n\t\"./sq.js\": 9358,\n\t\"./sr\": 683,\n\t\"./sr-cyrl\": 9382,\n\t\"./sr-cyrl.js\": 9382,\n\t\"./sr.js\": 683,\n\t\"./ss\": 1156,\n\t\"./ss.js\": 1156,\n\t\"./sv\": 9855,\n\t\"./sv.js\": 9855,\n\t\"./sw\": 8536,\n\t\"./sw.js\": 8536,\n\t\"./ta\": 7754,\n\t\"./ta.js\": 7754,\n\t\"./te\": 7809,\n\t\"./te.js\": 7809,\n\t\"./tet\": 1297,\n\t\"./tet.js\": 1297,\n\t\"./tg\": 2527,\n\t\"./tg.js\": 2527,\n\t\"./th\": 5862,\n\t\"./th.js\": 5862,\n\t\"./tk\": 9331,\n\t\"./tk.js\": 9331,\n\t\"./tl-ph\": 4387,\n\t\"./tl-ph.js\": 4387,\n\t\"./tlh\": 3592,\n\t\"./tlh.js\": 3592,\n\t\"./tr\": 9732,\n\t\"./tr.js\": 9732,\n\t\"./tzl\": 9570,\n\t\"./tzl.js\": 9570,\n\t\"./tzm\": 3553,\n\t\"./tzm-latn\": 7699,\n\t\"./tzm-latn.js\": 7699,\n\t\"./tzm.js\": 3553,\n\t\"./ug-cn\": 5674,\n\t\"./ug-cn.js\": 5674,\n\t\"./uk\": 9974,\n\t\"./uk.js\": 9974,\n\t\"./ur\": 5773,\n\t\"./ur.js\": 5773,\n\t\"./uz\": 357,\n\t\"./uz-latn\": 7135,\n\t\"./uz-latn.js\": 7135,\n\t\"./uz.js\": 357,\n\t\"./vi\": 43,\n\t\"./vi.js\": 43,\n\t\"./x-pseudo\": 767,\n\t\"./x-pseudo.js\": 767,\n\t\"./yo\": 150,\n\t\"./yo.js\": 150,\n\t\"./zh-cn\": 1828,\n\t\"./zh-cn.js\": 1828,\n\t\"./zh-hk\": 6644,\n\t\"./zh-hk.js\": 6644,\n\t\"./zh-mo\": 9305,\n\t\"./zh-mo.js\": 9305,\n\t\"./zh-tw\": 1860,\n\t\"./zh-tw.js\": 1860\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 5358;"],"x_google_ignoreList":[99]}