{"version":3,"sources":["wwwroot/js/Custom/devextreme-license.ts","wwwroot/js/Custom/global.ts","wwwroot/Scripts/front-custom-shared.js","wwwroot/js/Custom/chart.ts","wwwroot/js/Custom/chartDesigner.ts","wwwroot/js/Custom/chartService.ts","wwwroot/js/Custom/chartTypes.ts","wwwroot/js/Custom/widgetKPI.ts","wwwroot/js/Custom/widgetChart.js","wwwroot/js/Custom/widgetReport.js","wwwroot/js/Custom/widgetPivot.js","wwwroot/js/Custom/widgetFilter.ts","wwwroot/js/Custom/widgetTreeMap.ts","wwwroot/js/Custom/widgetMap.ts","wwwroot/js/Custom/widgetGauge.ts","wwwroot/js/Custom/dashboard.ts","wwwroot/js/Custom/dashboardDesigner.ts","wwwroot/js/Custom/mappingDataSource.ts","wwwroot/js/Custom/tabView.ts","wwwroot/js/Custom/filtersManager.ts","wwwroot/js/Custom/report.ts","wwwroot/js/Custom/reportTypes.ts","wwwroot/js/Custom/reportView.ts","wwwroot/js/Custom/widgetDesigner.ts","wwwroot/js/Custom/formattingRule.ts","wwwroot/js/Custom/pivotGrid.ts","wwwroot/js/Custom/email.js","wwwroot/js/Custom/pdfTemplates.ts","wwwroot/js/Custom/reportSettings.ts","wwwroot/js/Custom/revision.ts","wwwroot/js/Custom/filterTypes.ts","wwwroot/js/Custom/types.ts","wwwroot/Components/components.ts","wwwroot/js/Custom/workbookCopies.ts"],"names":["DevExpress","config","licenseKey","bbAlert","bootbox","alert","errorText","callback","ISNULL","value","nullValue","IIF","boolValue","trueValue","falseValue","$fn","$","fn","animateRotate","angle","duration","easing","complete","args","speed","step","this","each","i","e","now","style","apply","arguments","deg","animate","Intl","NumberFormat","irng","NumberFormatOriginal","locale","options","format","number","scaleSymbol","prop","undefined","precision","maximumFractionDigits","minimumFractionDigits","largerNumber","absValue","Math","abs","output","decimalOptions","Object","assign","simpleValue","replace","currencyDisplay","currency","currencySign","toString","caret","begin","end","length","setSelectionRange","createTextRange","range","collapse","moveEnd","moveStart","select","ex","selectionStart","selectionEnd","document","selection","createRange","duplicate","text","irGlobal","hexDigits","Array","hex","x","isNaN","getUpdateButton","getJqueryElement","enableUpdateButton","enable","callbackOnClick","isFunction","updateButton","off","on","objectToTest","call","element","jQuery","showInfo","infoMessage","info","removeClass","addClass","find","delay","slideUp","showError","ui","notify","message","position","my","at","notifyError","align","yOffset","from","type","settings","placement","z_index","offset","y","handleAlerts","data","getParentContext","activeTab","tabView","getActiveTab","TabTypeStrEnum","Dashboard","activeWidget","getMode","parentContext","val","jsonReplacer","key","jsonStringfy","jsonInput","JSON","stringify","requestServer","async","showIndicator","processData","evt","getTabConfig","isPlainObject","isAdmin","methodVerb","verb","ajaxSettings","url","global","headers","dataType","contentType","ajax","done","successFunction","dontUpdateFilters","updateApplyButton","filterValues","filtersManager","getFilterValues","globalFilters","removedfilters","updatedFilters","tabFilters","widgetFilters","fail","jqXHR","textStatus","errorThrown","failureText","parseInt","status","failureFunction","isJson","json","parse","authenticationMode","location","reload","htmlData","dialog","title","show","size","btn","css","click","currentTarget","hasClass","preventDefault","divError","attr","divCompany","companyId","UserName","Password","CompanyId","Ismodal","__RequestVerificationToken","response","html","removeAttr","updateFromServer","modal","height","loginOnModal","responseJSON","error","responseText","startsWith","workbookId","mt","match","href","urlConfigs","tabs","console","debug","parsed","defaultErrorFunction","lut","changePassword","requestServerAdmin","confirmButton","cancelButton","generalErrors","modalElement","closest","isRunning","password","newPassword","confirmPassword","isValid","messageCurrent","messageNew","messageConfirm","NewPassword","ConfirmPassword","success","htmlErrors","errors","statusText","keyPress","keyCode","trigger","iconFor","input","focusedElementId","inputElements","setTimeout","focus","which","setup","window","onorientationchange","$ul","children","$button","ulOffset","spaceUp","top","scrollTop","spaceDown","remove","showEmailPopup","emailButton","nowName","container","popup","currentBtn","emailType","defaultSubject","email","scope","popupErrorEmail","dxPopup","width","showTitle","visible","hideOnOutsideClick","showCloseButton","toolbarItems","widget","toolbar","onClick","hide","popupOptions","dragEnabled","resizeEnabled","deferRendering","elementAttr","id","icon","stylingMode","popupContent","content","subject","bodyText","showInfoBodyEmailNow","dxSwitch","option","requestJson","formats","subjectText","reportObj","pdfTemplateId","result","errorMessage","resultEmailSent","reportMessage","emailsMessage","forEach","emailError","item1","item2","item3","contentTemplate","scrollView","append","dxScrollView","setUpPopupContent","el","_a","formatButtons","emailPopup","checkedLabel","parents","btne","clickedButt","radioInput","requestObj","jsonReq","template","debounce","func","wait","immediate","timeout","context","callNow","clearTimeout","getGuid","d0","random","d1","d2","d3","shadeColor","color","percent","f","slice","t","p","R","G","B","round","getRandomColor","brightness","rgb","mix","mixedrgb","map","rgbToHex","changeUrl","page","history","pushState","obj","Page","Url","isLocal","hostname","updateOutput","fullTabResult","replaceWith","reportView","mode","$results","handleFilterErrors","pivotMetrics","$filterList","updateWorkbookReportList","updateWorkbookDashboardList","updateReportList","persistedElements","index","persistedElement","$persistedElement","enabledMessage","tabDefinition","currentTab","persisted","lastSaved","div","partialViewResult","filterResult","filter","outerHTML","dashboard","tabType","setupDefaultFilterBehaviours","setupTabActions","toggleSimpleChevron","customDate","custom","none","today","all","splitOnUpper","trim","str","charAt","toUpperCase","substr","showYesNoMessage","confirm","buttons","label","className","cancel","copyTextToClipboard","navigator","clipboard","writeText","then","err","textArea","createElement","left","body","appendChild","execCommand","removeChild","fallbackCopyTextToClipboard","setupChangePassword","ready","changePasswordElement","isMobile","groupBy","array","isObservable","reduce","rv","push","showToast","general","chart","log","chartVM","pushStatus","chartStatus","popStatus","pop","getStatus","createChart","save","ChartStatus","Ready","Date","Rendering","colorPosition","chartDefinition","colorTheme","colors","chartService","colorThemes","chartDesigner","setChartSettings","setupChart","$context","saveChartDefinition","metricDiv","metric","yAxisFields","enabled","allowColorPerSerie","colorPerSerie","spectrum","prepareDataSource","metricFields","dataSource","jsonData","hasGroup","hasGrouping","stringfy","stringSize","places","String","padStart","padEnd","substring","newResult","field","fieldNames","queryName","xAxisFields","xArgument","xArgumentSort","columnSeparator","autoGrouping","report","getAutoGroupingText","dateFormat","dateSeparator","weekStartDay","moment","split","groupField","groupFields","fieldName","xGroupArgument","xGroupArgumentSort","valueSeries","sort","a","b","groupSerieValues","metricField","Error","DataSource","store","paginate","ko","toJS","name","chartType","$canvas","mixedChartType","ChartType","Mixed","generateAxes","Donut","Pie","Polar","RadarArea","chartOptions","getRegularChartOptions","disposeChart","dxPieChart","commonSeriesSettings","backgroundColor","font","Radar","dxPolarChart","dxChart","getChartOptions","dxChartType","createSerie","argumentField","sizeFieldName","formatType","groupSerieValue","currencyCode","serieType","yAxisChartDefinition","valueField","stack","stackGroup","axis","yAxisID","displayName","sizeField","labelDecimalPlaces","metricFormat","decimalPlaces","accountingStyle","labelFormat","point","border","Bubble","Area","StackedArea","tag","getFirstYAxisField","bubbleScatterType","typeField","planField","BubbleScatterType","YAxis","fields","xMetric","bubbleSizeMetric","series","bubbleType","XAxis","BubbleSize","Scatter","scatterType","leftAxis","rightAxis","xField","showMetricsYAxis","FieldFormatEnum","Currency","Percentage","tooltipFormat","serie","getSeries","valueAxis","synchronizedValue","maxValueMargin","axisValueMargin","minValueMargin","palette","getColorsOfTheme","rotated","HorizontalBar","HorizontalBarStacked","redrawOnResize","argumentAxis","displayMode","axisLabelDisplayMode","toLowerCase","rotationAngle","axisLabelAngle","indentFromAxis","overlappingBehavior","tooltip","shared","zIndex","customizeTooltip","arg","argumentText","valueText","localization","formatNumber","seriesName","getColor","StackedBar","percentText","total","xMetricValueText","bubbleSizeValueText","legend","getLegendOptions","legendPosition","alignment","labelAlign","labelApplyBackgroundColor","labelFontColor","connector","labelConnector","labelPosition","customizeText","labelShowElement","labelShowGroupingElement","labelShowMetricName","labelShowValue","customizeLabelText","labelRotationAngle","showForZeroValues","labelVisibility","resolveLabelOverlapping","labelOverlapping","useSpiderWeb","onPointClick","fromPDF","onDrillDown","animation","zoomAndPan","dragToZoom","onZoomEnd","actionType","component","zoomFactor","addFilterCallback","updateChartTypeCallback","widgetViewModel","$result","prototype","equals","every","string","addChartFilterDrilldown","observable","Starting","applyObservable","dashboardWidget","chartHeight","outerHeight","canvasChart","chartResize","offSet","calculatedHeight","widgetResultDiv","divOptionsChart","renderChart","ResizeObserver","observe","knockoutContext","chartDesignerVM","ChartDesignerViewModel","applyBindings","hideAfterPaletteSelect","showInitial","showInput","showAlpha","allowEmpty","appendTo","change","toHexString","showHideChartOptions","showChartOptions","hideChartOptions","showHideChartOptionsWidget","event","target","is","parent","stopPropagation","chartButtonChange","reportSettings","basicSetup","addChartPlot","chartElements","chartElement","creating","divOptionsChartHeight","pixelHeight","changeCallback","chartButtons","currentButton","parentElement","chartTypeId","panel","_b","_c","_d","_e","_f","_g","_h","_j","_k","_l","_m","_o","_p","bubbleMaxSize","bubbleMinSize","bubbleXMetric","updateChart","subscribe","MetricField","YAxisChartDefinition","bubbleIcon","computed","getBubbleIcon","scatterIcon","getScatterIcon","bind","ChangingProperties","enableColor","scatterTypeManualChange","reportField","ReportField","inputModel","widgetId","tabId","mappingId","baseUrl","workBook","self","tabsOptions","tab","disableBubble","disableBubbleMessage","disableScatter","disableScatterMessage","chartTypes","ChartTypeItem","chartTypeSelectBoxOptions","itemTemplate","image","fieldTemplate","dxTextBox","readOnly","disabled","hint","legendPositionSelectBoxOptions","mixedChartTypes","bubbleTypes","BubbleScatterTypeItem","scatterTypes","colorThemeId","pureComputed","read","write","owner","disableColorPerSerie","disableYAxisOptions","disableColorPerSerieSetting","disableMixedOptions","visibleStackGroupOptions","stacked","hasGroupFields","item","settingsTottleButton","bootstrapToggle","slideDown","labelShowItems","dataOnOff","dataBind","labelAlignOptions","legendPositions","yAxes","decimalPlacesOptions","labelFormatOptions","axisLabelDisplayModeOptions","colorThemeSelectBoxOptions","displayExpr","valueExpr","wrapItemText","floor","$content","resetVisualRange","render","chartPoint","drilldownIsPossible","isWidget","inputValues","tabValues","isGroupBy","startCondition","isGroupField","updateOutputAfterDrilldown","theme","verticalAlignment","horizontalAlignment","itemTextPosition","LegendPositionEnum","None","Bottom","Top","Left","Right","Line","Bar","ChartDefinition","constructor","getIcon","static","siteRoot","widgetKPI","updateNames","vm","indicatorMetricName","mappingDataSource","getMetricName","indicatorMetric","targetMetricName","targetMetric","trendAxisFieldName","getFieldName","trendAxisField","getField","trendAxisDisplayName","trendAxisFieldAutoGrouping","AutoGroupingStrEnum","isNamesUpdated","getDistanceOptions","setBaseTextConfig","vmSettings","alignmentArray","observableArray","newValue","alignmentOptions","items","keyExpr","selectedItemKeys","class","fontSizeOptions","fontSize","showSpinButtons","min","max","formatValue","FieldFormatStrEnum","Numeric","showLargeNumber","dx","formatHelper","includes","dataBindElement","resultData","formattingRuleObj","formattingRule","getFormattingRuleById","getNewFormattingRule","percentageValue","targetValue","distanceType","indicatorValue","variance","toFixed","getFormattingRuleScale","referenceValue","scales","scale","minValue","indicatorFontColor","comparisonFilter","dateOption","ComparisonDateOptionStrEnum","Manual","fontColor","iconColor","sparkLineColor","targetColor","indicator","resizeObserver","sparkLine","dxSparkline","unobserve","setupViewModel","widgetContainer","customTitle","titleText","formattingRuleName","titleTextSettings","targetTextSettings","titleTextConfig","targetTextConfig","trendAxisHeightOptions","trendAxisHeight","indicatorFontSizeOptions","indicatorFontSize","iconSizeOptions","iconSize","indicatorPopoverButtonOptions","setDblClickDataSource","shouldUpdateData","nodeName","metricId","formattingRuleId","fRule","formattingRuleService","saveWidgetConfig","showDataSourcePopover","siblings","indicatorRemoveButtonOptions","targetPopoverButtonOptions","targetRemoveButtonOptions","trendAxisPopoverButtonOptions","fieldId","trendAxisRemoveButtonOptions","indicatorTextBoxOptions","targetTextBoxOptions","trendAxisTextBoxOptions","fontStyleOptions","filterZerosOptions","filterZeros","onValueChanged","useLastPeriodOptions","useLastPeriod","showTrendAxis","formattingRuleTextBoxOptions","formattingRulePopoverButtonOptions","openList","copyProperties","model","formattingRuleRemoveButtonOptions","blankRule","dateUnit","ComparisonDateUnitStrEnum","Day","dateUnitValue","dateRange","isSetupWidget","comparisonDateOptions","Previous","Predefined","dxSelectBoxComparisonDateOption","comparisonDateUnitOptions","Year","Quarter","Month","dxSelectBoxComparisonDateUnit","comparisonDateUnitValueOptions","distanceOptions","tabDetailButtonOptios","fieldAutoGrouping","filterValue","trendValues","axisValue","submitObject","fromTabDetail","fromTabDetailWidget","filterFieldId","filterFieldAutoGrouping","openTab","widgetChart","widgetReport","widgetPivot","FilterWidgetConditionEnum","FilterWidgetConditionTypeEnum","FilterWidgetEditorTypeEnum","FilterWidgetApplyConditionEnum","FilterWidgetDataTypeEnum","widgetFilter","boundFieldName","boundField","boundFieldDisplayName","displayFieldName","displayField","displayFieldDisplayName","metricFieldName","compareArrays","array1","array2","refreshEditor","editorType","DropDown","dropDown","dxDropDownBox","repaint","List","list","dxDataGrid","updateValuesStyle","DateRange","valuesTextConfig","fontBold","fontItalic","updateDataEditor","updateOptions","columns","selectedValues","beginUpdate","dropDownOptions","dataTable","values","listValues","endUpdate","checkDateFunctions","conditionOptions","getDataSourceCondition","conditionTypeOptions","getDataSourceConditionType","editorTypeOptions","getDataSourceEditorType","disabledEditors","removeBoundField","allowRemoveMapping","dynamicParameterName","enabledAvailableFilters","removeMappingFilter","removeDisplayField","boundFieldVisible","removeMetricField","mappingFilter","mappingFilterName","dataSourceCondition","Between","MultipleSelection","SingleSelection","condition","In","NotIn","Equals","Different","dataSourceEditorType","displayFieldTextBoxOptions","displayFieldPopoverButtonOptions","displayFieldRemoveButtonOptions","boundFieldVisibleOptions","metricFieldTextBoxOptions","metricFieldPopoverButtonOptions","metricFieldRemoveButtonOptions","updateWidgets","widgets","getWidgets","widgetsId","refreshWidgets","clearRemovedFilterList","publishValues","saveConfig","useDelayMultipleSelection","refreshWidget","publish","update","applyCondition","Manually","Automatic","idTimeoutPublish","getAvailableFilters","filterFieldName","filterFieldTableName","tableName","updateVisible","dateRanges","dates","typeDateRange","oldEditingDefaultDates","editingDefaultDates","calculateHeightFilterList","showMappingFilter","valuesSelectedTitleText","computedValuesSelectedTitleText","saveValueChanged","defaultDateRange","valuesTextSettings","refreshValuesStyle","oldValue","startDate","endDate","updateAndRefreshEditor","filterEditorType","FilterEditorTypeEnum","endCondition","functionDate","conditionType","editorTypeChanging","conditionChanging","newCondition","isArray","scopeAction","applyConditionOptions","ArrayStore","previousValue","boundFieldChanging","scopeActionOptions","dataGrid","placeholder","displayValueFormatter","showClearButton","minWidth","dataField","caption","getColumns","$dataGrid","hoverStateEnabled","searchPanel","scrolling","showCheckBoxesMode","selectedRowKeys","onInitialized","clearSorting","valA","valB","valASelected","valBSelected","sortBySelectedRows","onSelectionChanged","selectedItems","keys","close","onRowClick","isRowSelected","deselectRows","selectRows","locateInMenu","dateTypeBoundField","boundFieldTextBoxOptions","selectBoundField","searchDashboardFilter","allowPublishValues","allowRemoveMappingFilter","dateRangeId","dashboardFilter","getDashboardFilters","removeElement","dynamicParameter","dynamicName","newListValues","isMultiSelect","boundFieldDataType","Number","parseFloat","getFieldByName","displayFieldTableName","boundFieldPopoverButtonOptions","boundFields","nodes","getDataSourcePopover","newNodes","node","newNode","boundFieldRemoveButtonOptions","selectDisplayField","mappingFilterTextBoxOptions","mappingFilterPopoverButtonOptions","tableNode","n","displayFieldNode","filterId","availableFilters","availableFilter","fieldNode","filterName","mappingFilterRemoveButtonOptions","newSelectedValues","Filter","mapping","fromJS","irSettings","shortDateFormat","customPublish","oldSaveValueChanged","dateRangeConfig","userDates","lastDateUsed","multiplier","multiSelectGrid","onContentReady","removedWidget","calculateHeight","TreeMapColorizationEnum","widgetTreeMap","hasDrillDown","fieldsDrillDown","resetDrillDown","first","getFeildDisplayName","AutoGroupingEnum","getColorizer","colorization","Range","maxValue","colorizeGroups","Discrete","Gradient","startColor","endColor","isLabel","unitFormat","LabelFormatEnum","Billions","Millions","Thousands","getDataSource","drillDown","createObj","propertName","ByDay","ByYear","DataTypeEnum","DATE","labelField","showMetric","parentsForTreeMap","Set","metricName","groupFieldName","topBottomValueOptions","topBottomValue","topBottomType","topBottomTypeOptions","updateColorizer","treeMap","dxTreeMap","layout","prepareViewModel","treeMapSettings","idField","layoutAlgorithm","parentField","colorizer","isPrinting","getDrilldown","$currentDrilldownSelect","popoverDiv","newDrilldownId","newReportId","getTabBaseObject","nextDrilldown","groupingType","GroupingTypeEnum","GROUP_BY","metricPopoverButtonOptions","metricRemoveButtonOptions","metricTextBoxOptions","fieldPopoverButtonOptions","convertAutoGrouping","fieldRemoveButtonOptions","fieldTextBoxOptions","groupFieldPopoverButtonOptions","groupFieldAutoGrouping","groupFieldRemoveButtonOptions","groupFieldTextBoxOptions","updateDataSource","prepareSetup","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","next","rejected","MapColorizationEnum","MapDataSourceEnum","widgetMap","notFoundColumn","isLegend","isCustomMap","source","Africa","Canada","Europe","USA","World","USACities","IrelandCounties","getDataSourceMap","mapSelectOptions","viz","sources","africa","attributeNameItems","fieldLabel","canada","europe","usa","world","vectormaputils","features","properties","attributes","indexOf","attributeName","getPaletteColorGroups","colorGroups","frColorGroups","legendLength","gradientRanges","stepValue","paletteColorGroups","centerTimeoutId","zoomTimeoutId","warningVisible","warningText","warningPopover","showEvent","mapSettings","center","zoomingEnabled","panningEnabled","attribute","layers","colorGroupingField","customize","elements","_","trimEnd","row","missingRecords","join","legends","layer","grouping","start","showLegend","onCenterChanged","notSaveConfig","onZoomFactorChanged","dataSourceMapOptions","customMaps","customMap","attributeNameOptions","vectorMap","dxVectorMap","r","dataSourceMap","updateLegend","legendSettings","GaugeTypeEnum","GaugeCircularIndicatorTypeEnum","GaugeShowIndicatorValueEnum","GaugeTickIntervalTypeEnum","GaugeScalePositionEnum","widgetGauge","updatingEndValue","getRanges","ranges","Circular","frValues","nextScale","startValue","endValue","lastScale","getValue","getTargetValue","setRange","getGauge","dxCircularGauge","getTick","tickIntervalType","Value","tickIntervalValue","Percentual","getIndentFromTick","scalesFormat","Inside","tick","getTickLength","Outside","getMinorTickLength","getIndicatorColor","isPrincipalIndicator","defaultColor","formattingScale","getIndicatorOffset","widgetBackgroundColor","appearance","gaugeSettings","subvalues","tickInterval","minorTickInterval","orientation","indentFromTick","labelColor","labelFontSize","minorTick","rangeContainer","valueIndicator","secondColor","indicatorFormat","subvalueIndicator","centerTemplate","gauge","showIndicatorValue","Middle","rect","fill","createElementNS","setAttribute","createRect","minSize","textAnchor","textContent","createText","margin","bottom","right","Normal","updateTicks","updateFormatValue","applySubscribe","WidgetTypeEnum","tabContext","getDashboardDesigner","getDashboardContainer","getWidgetContainer","getBaseSubmitObject","inputObject","getWidget","addWidget","button","widgetLayout","widgettype","canvasWidth","widgetWidth","widgetHeight","KPI","Map","Gauge","addObject","newWidgetType","newWidgetId","partial","widgetPartial","dashboardDesigner","widgetObj","prepend","addWidgetActions","widgetVM","setupWidget","widgetType","Report","newDashboardWidget","refreshWidgetData","clickWidget","fixeReportTableHeader","setWidgetAnalysis","setWidgetPivot","reportType","ReportTypeStrEnum","Analysis","Pivot","widgetElement","expandWidget","resizeExpandedWidget","pivotGrid","getPivotGridInstance","getGridInstance","getExpandedWidgets","designerWidth","outerWidth","designerHeight","designerOffset","_zoom","editMode","setEditMode","newEditMode","workbookViewModel","editing","settingsVM","hideAllPopupDetails","applyEditMode","addResize","addDraggable","removeResize","removeDraggable","designerWidthTotal","designerHeightTotal","scaleForView","scaleForEdit","dontAnimate","dashboardContainer","dashboardDesignerResizer","dashboardSettingsPanel","getElementById","scrollWidth","scrollHeight","paddingWidth","paddingHeight","scaleWidth","scaleHeight","span","cssDisplay","widgetSelected","dashboardVM","applySettings","editWidget","openHtmlEditor","openReportDesigner","contextFor","$data","changeReportType","Chart","showPopupDetails","open","popoverSettings","dataFor","changeReportTypeVisible","excelDownloadVisible","showPopover","hidePopupDetails","hidePopover","doNotClickWidget","settingsVMApplied","clicksWidgetCount","timer","containmentW","containmentH","objW","objH","forceClick","oldSelectedWidget","oldWidgetContainer","unselectWidget","getWidgetSettings","addEventAvaliableFilters","widgetDesigner","openPopupDrillDown","htmlOutput","widgetNameDoubleClick","addFilterPopover","applyingBinding","allowShowPopover","tracker","layoutTracker","notSaveLayout","updatingDrilldown","topBottom","TopBottomEnum","All","resultCount","topBottomError","topBottomQueryName","topBottomFieldName","topBottomFields","metrics","metricContainer","includeAllMetrics","getAllMetrics","getInitialMetrics","popoverOptions","shading","collision","minHeight","cssClass","instance","onShowing","addDrilldownActions","convertReportBtn","onShown","last","transform","regexp","matches","widgetTopPosition","getBoundingClientRect","widgetLeftPosition","reportVM","getSettings","updatingTopBottom","showHideSearchBox","showHideFilterPanel","enableFilterPanel","openTabDetail","copyWidget","showSql","showDebugSql","excelDownload","addDownloadExcelClick","selectionRowClick","enableRowSelection","openOrderByFields","popupAdditionalOrderSelect","showPopoverClick","dxPopover","populateOrderSelect","applyTopBottom","orderField","afterUpdatedWidgetData","TreeMap","updatePopoverTitle","tabDetailId","copyMetricsToTab","copyDimensionsToTab","oldJsonConfig","jsonConfig","toJSON","oldJsonLayout","jsonLayout","saveWidgetLayout","$widget","param","errorContainer","errorInfo","errorType","updateWidgetContents","workbookDashboardList","workbookReportList","filterResults","$dashboardFilterList","dashboardFilterResults","addDefaultFilterEvents","$currentResult","checkFiltersErrors","updateWidgetNameClick","popover","updateNameObj","loadWidgets","widgetsIdRefresh","addLoaderWidget","widgetResult","divLoader","removeLoaderWidget","selectAfterUpdate","isSelected","enableDisabledDrilldown","reporttype","updateObj","widgetIdForUpdate","link","$element","po","$tip","currentWidgetLink","currentWidgetName","$widgetNameElement","oldName","designer","baseObject","designerMode","callbackFunction","tempId","widgetUpdateObj","updateWidgetPartial","focusStateEnabled","view","dragOutsideBoundary","reportDesigner","settingsReportButtonClick","schema","_$wrapper","resize","onHidden","isWidgetSelected","newDashboardContainer","resizable","handles","autoHide","changeLeft","originalPosition","newLeft","changeTop","newTop","changeWidth","originalSize","newWidth","changeHeight","newHeight","containment","stop","draggable","handle","cursor","drag","boundReached","helper","clickEvt","contentArea","htmlcontent","$mceModal","richEditConfig","completeFunction","htmlText","richTextResult","originalHtml","modalEvt","tinymce","activeEditor","getContent","htmlContent","setContent","destroy","moreToolbarButton","baseURL","tinyMceBase","init","selector","content_style","editor","registry","addMenuButton","fetch","onAction","insertContent","getItem","isMetric","isWidgetFilter","filterVariables","getFilterVariables","filters","isDateFilter","getSubmenuItems","subMenuItems","isDateRange","variable","content_css","tinyMceTheme","skin_url","tinyMceSkin","plugins","statusbar","menubar","rel_list","insertdatetime_formats","tinyMceDateFmt1","tinyMceDateFmt2","stopImmediatePropagation","backdrop","oldReportType","$glyphSpan","changeButton","updateData","showDefaultIndicator","dashboardAppearance","getDashboardSettings","shadow","header","widgetDefaultBackgroundColor","mainWidgetNav","backColor","borderColor","fontAlignment","applyWorkbookBinding","htmlOutputSetup","htmlWidgetOutputSetup","prepareDataSourcePopover","trendAxisFieldId","enableSearchBox","filtersLi","dataset","filtername","filterfieldname","filterfieldtablename","filterdisplayfieldname","filterdisplayfieldtablename","filterdynamicparameter","filterdynamicparametername","editortype","daterangeid","filtericon","updateVisibleFilterAvaliable","boundfield","names","displayfield","boundfielddatatype","dateformat","ismetric","metricid","dynamicparameter","dynamicparametername","startcondition","endcondition","daterange","ismultiselect","removeWidget","widgetName","widgetReportSelectPopup","onReportClick","templateSelectObj","reportId","reportSource","getReportList","tabSettings","activeStateEnabled","templates","itemTitleTemplate","rowAlternationEnabled","showColumnHeaders","paging","dataRowTemplate","fullDisplayName","dxTabPanel","recalculateDashboardZoom","resizeExpandedWidgets","disableEditMode","designerVM","databindElment","popupElement","shadingColor","popupVisible","openPopup","Function","widgetConfigElement","createVM","FieldNameInputModel","copy","clone","toObject","fromObject","property","fromValue","itemArray","newItemArray","onDblClickDataSource","titlePopover","dxTreeView","visibility","VisibilityEnum","tables","table","newTable","j","newField","concat","treeView","expandItem","tableMetrics","shift","metricsData","metricData","treeViewOptions","itemsExpr","searchEnabled","searchMode","scrollDirection","selectedItem","onItemClick","itemData","dxSortable","group","dropFeedbackMode","moveItemOnDrop","allowDropInsideItem","allowReordering","jsonTablesConfigHtml","m","fieldTableName","WorkbookViewModel","hasDashboardTab","TabTypeEnum","loggedUser","workbookOpeningMode","WorkbookOpeningModeEnum","Edit","tabElement","objectToExtend","getDrilldownId","extend","getReportConfig","ReportDesigner","ChartDesigner","tabDetailDrilldown","workbookHasPendingChanges","hasPendingChanges","pendingChanges","setUrl","forceSet","showOptionsButton","addSubMenuEvent","li","ul","widthReport","toggle","newReportClick","addNewDashboardTab","reportReportsList","thisSelector","selectedReport","customSelection","customGroupFieldsId","addReportSelectorEvents","updateTabView","createTab","updateIconDefaultTab","setupDesigner","dashboardId","addNewTab","removeTab","tabDiv","tabName","changeActiveTab","renamingTab","jsonResult","activeTabId","objectParameter","isTabDetail","newActiveTabId","tabPageHeader","getTabPageHeader","scrollableContainer","get","scrollLeft","detailingTab","getTabList","getTabName","onInputRenameTab","parentNode","firstChild","updateTimeStamp","createTabEvents","hidePopoverOnOffClick","has","inState","workbookNameClick","resetNameEdit","cancelNameEdit","savedName","isSaving","saveWorkbookName","homeButtonClicked","submitObj","duplicatedName","reportid","setAsDefaultWorkbook","defaultWorkbook","updateIconDefaultWorkbook","setAsDefaultTab","hiddenTab","defaultTabId","refreshTabs","afterFilterAdded","showOptions","showOptionsPopup","ok","selectedDataGrid","selectedEntities","selectedVals","Id","entityType","EntityType","shareType","ShareType","user","userIds","availableDiv","selectedDiv","available","selected","availableDataGrid","showBorders","noDataText","calculateDisplayValue","rowData","FullName","Name","onRowPrepared","rowType","rowElement","allowUpdating","allowAdding","allowDeleting","allowEditing","lookup","showEditorAlways","currentSelectedRowKeys","some","splice","add","rows","getSelectedRowsData","saveCopyButton","updateModel","worbookNameTextBox","copyEmailsCheckBox","saveCheckBox","tabGrid","divWorkbookName","divCopyEmails","dxCheckBox","divSave","divTabs","tabWidgetDependencies","workbookName","copyScheduledEmails","getSelectedRowKeys","permissions","viewSQL","$debugSql","saveWorkbook","reloadPage","isNew","$lastSaved","updatedTab","order","created","descriptionLastSaved","lastDate","timeAgo","timeago","getDxTabPanel","selectedIndex","tabPanelItems","edit","tabPanel","scrollByContent","showNavButtons","loop","animationEnabled","swipeEnabled","itemIndex","itemElement","workbooks","viewOnly","itemOrientation","dragDirection","onReorder","fromIndex","toIndex","newOrder","tabOrder","positionScrollTab","divSelectedTab","scrollIntoView","_tabs","_forcePointerDownFocus","_itemClickHandler","updateVisibilityOptionsTabs","mappingViewModel","openMappingsPopup","showMappingPopup","listOptions","goToURL","dxList","companiesViewModel","openCompaniesPopup","fromHome","showCompaniesPopup","company_id","company_name","emptyWorkbook","setupCompaniesPopup","getMenuTabList","path","createWorkbooks","editFormattingRules","formattingRules","openEditor","editPDFTemplates","pdfTemplates","pdfTemplatesService","emailsManagement","scheduledEmail","openEmailsManagement","emailLogs","getWorkbookTabList","iconType","updateMenuList","changeWorkbookEditMode","itemListElement","iconElement","yes","no","enableViewSql","scheduleEmails","openEmailsPopup","mappingName","mappingDescription","workbookDescription","workbookCategory","lastCompanySaved","enableMultiTenant","empty","rData","gridView","calculateSortValue","sortOrder","workbookCopies","drawMenu","selectedWorkbook","getAllMenuList","menuList","nogroup","company","mobileDevice","drawer","dxDrawer","revealMode","openedStateMode","opened","$template","iconName","ownerUserName","ownerEmail","sharedIcon","workbookClass","selectionMode","searchExpr","grouped","collapsibleGroups","loadUrl","cached","companyName","currentCompanyName","groupTemplate","sharedWorkbookIcon","otherOwners","otherOwnersIcon","otherOwnersTitle","showOtherOwnersWorkbooks","sharedTitle","showSharedWorkbooks","workbookMenuGroupClass","groupElement","onGroupRendered","groupData","collapseGroup","groupIndex","sharedWorkbooks","ev","sharedWorkbookButton","showShared","home","saveShowHideWorkbooks","userId","otherOwnerWorkbooks","otherOwnersButton","showOtherOwners","onOptionChanged","dxToolbar","initials","beginGroup","profileName","organizationName","version","dateVersion","hideSubmenuOnMouseLeave","afterDrawMenu","setupMapping","logoutClick","display","iconDiv","defaultTab","eventsToExecute","updateServer","params","nodeElement","showAll","lis","setInterval","navbar","renameTab","$tabNameElement","updateTabName","tabNameObj","updateTabColors","cleanNode","currentLink","$popNameElement","currentName","confirmNameChange","downloadHardcopy","openPopupEmailTemplate","getPdfTemplates","resultTemplates","pdfTemplateLookup","landscapeCheckBox","tmp","divPdfTemplate","dxSelectBox","divLandscape","landscape","isCSV","printMessage","reportName","groupingName","orderBy","glReport","subtotalsPosition","subTotalText","fileName","exportToExcel","exportPivotToExcel","updatePropertiesTabs","newTab","showSharedPopup","getFilterContextObject","currentFilter","getFilterContext","clear","isDirty","globalFiltersElement","tabFiltersElement","widgetFiltersElement","filterElement","getWidgetFilterContainerValues","forceUpdateMultiSelectFilter","onlyGetDirtyFilters","widgetFiltersArr","$obj","getFilterContainerValues","currentWidgetId","parentContainer","outJson","filterVM","AutoComplete","ValuesCombo","MultiSelect","adjustOpenFilterPosition","changeVisibility","divFilterEditor","divFilter","toggleClass","containerWidth","leftAdjustment","filterList","filterListJson","filterListElement","filtersVM","addFilterAction","filterSelect","selectedFilter","filterContext","action","getUrl","inputJson","addedFilter","addedMetricFilter","idx","updateFiltersChanged","filterAddedComplete","getUrlByTabType","idArray","filtersWithError","hideFiltersClick","actualFilter","filtersSettings","dropDownAddFilter","addButtonPosition","divFilters","clearFilter","filterContainer","filterControlsContainer","addFilterComplete","saveFilterValuesCompleteEvent","searchBox","clearSearchBox","showComplexFilter","openFilterSettings","divPopover","removeComponentFilter","filterContextObj","removedFilters","fakeColumnName","tagLinkDrilldown","linkDrilldown","getGridDiv","grid","_$element","gridContainer","addDrilldownClick","aggregateReport","drilldownSelect","getPivotDiv","changeDirectionOrder","getVisibleColumns","column","columnOption","directionIndicator","persistOrderChange","orderIndex","ByWeek","day","getDate","month","getMonth","year","getFullYear","todaysZeller","_locale","_week","dow","weekStartDayJS","dateNo","setDate","momentDate","weekOfYear","isoWeek","startOf","endOf","ByMonth","ByQuarter","ByMonthOnly","ByQuarterOnly","drawBarColumn","minRowHeight","getTotalSummaryValue","totalColumn","hasNegativeValues","isNegative","widthBar","barColor","visualizationMode","negativeColor","foreColor","barChartText","percentValue","getFormattingScaleColor","divider","formatStr","thresholdValue","thresholdColor","spanWidth","barChartTextPosition","halfNegativeBar","applyFormattingRuleCell","isTotal","isPercent","ReportTypeEnum","applyColors","bColor","fColor","cell","endsWith","totalCell","totalStyle","cells","applyRow","tds","setupGridColumns","totalItems","groupItems","baseColumns","deubgLog","gridColumns","groupColumns","indexBase","encodeHtml","headerCellTemplate","titleAlignment","functionType","FunctionTypeEnum","Rank","showTotalValue","showSubtotalValue","SUM","isCustomMetric","WSUM","DSUM","WDSUM","comparisonType","ComparisonTypeEnum","Variation","TSUM","AccumulatedAll","PercentOfTotal","Accumulated","summaryType","MIN","MAX","totalsPosition","TotalsPositionEnum","showInColumn","displayFormat","valueFormat","showInGroupFooter","alignByColumn","calculateCellValue","calculateColumn","returnValue","valueTop","valueBottom","indexBottom","valueGrandTotal","valueTopComparison","indexComparison","valueBottomComparison","indexBottomComparison","valueComparison","valueGrandTotalComparison","valueVariation","PercentageVariation","pow","cellTemplate","hasFormattingRule","hasBarChart","columnWidth","area","isGrouping","groupId","groupOrder","groupColumn","groupCellTemplate","displayValue","groupName","allowExpandAll","expanded","gridGroupColumn","setupGroup","formulasResolved","re","variables","dependentColumns","formula","formulaTop","replaceAll","exec","dColumn","unshift","debugLog","groupColumnIndex","col","groupingColumn","showReportRowCount","summary","summaryItems","reportRowClick","sortingMethod","value1","value2","sortColumn","val1","val2","groupValues","resultRow","groupValue","valueOf","visibleField","handled","gc","columnGroup","calculateCustomSummary","summaryProcess","count","valueSubTotal","metricValues","topValue","bottomValue","totalValue","calculateTotals","CalculateTotalsEnum","UseFormula","dColumnValue","eval","resizeColumns","ignoreColumn","visibleColumns","gridWidth","gridColumn","gridField","columnsWidthType","ColumnsWidthTypeEnum","headerId","Pixel","visualizationModeDefinition","addReportEvents","addSeachBoxEvent","showSearchBox","ctrlKey","metaKey","isExcelPrinting","gridResult","searchBoxHeight","dobounceReflow","isGlReport","countColumns","grandTotalText","defaultCurrency","collapseRows","numberFixedColumns","fixed","firstColumn","resizeColumnsCfg","inProgress","optionName","getScrollable","clientWidth","borderWidth","saveSettings","focusedRowKey","focusedRowEnabled","allowColumnResizing","columnResizingMode","ColumnResizingModeEnum","Widget","NextColumn","columnAutoWidth","showRowLines","showColumnLines","searchVisibleColumnsOnly","sorting","allowCollapsing","autoExpandAll","expandAllRows","onEditorPreparing","editorName","onContextMenuPreparing","hasGroupColumn","expandAll","collapseAll","selectable","onCellPrepared","cellElement","orderFields","firstOrder","lkDrillDown","onKeyDown","insertBefore","headerTable","headerRow","tableBody","thead","rowKey","collapseRow","groupCount","footerTDSelectors","visColumns","c","groupTotals","g","footerTDSelector","irngCustom","enableCustomization","onContentReadyReport","prev","fullName","getTagLinkDrilldown","getLinkDrilldown","_isMetric","serieName","isReportMetric","super","MetricContainer","MetricFormat","pivotSelected","selectGroupBy","noReportSelectedOption","selectAnalyzeBy","getPivotMetrics","colorContainer","isChecked","metricContainerValues","comparisonFilterId","nextDrilldownId","drilldownId","analyzeByChanged","switching","analyzeById","groupById","analyzeBy","results","setTotalsVisibility","isPivotSelected","groupConfig","groupByChanged","selectedGroupId","changePivotVisibility","removeGroupBy","showDrilldownPopup","drilldownListElementClass","drillDialog","listElements","drilldownReports","drilldownIndex","currentSelect","isAggregative","reports","hasChanged","notAggregatives","minOrder","confirmDrillDialog","drilldownList","addDrilldownElement","currentElement","newElement","after","changeOrderVisibility","checkDuplicate","moveField","orderDown","listElement","previousElement","prevOrderIndex","currOrderIndex","before","changeField","elementCount","addDrilldown","removeDrilldown","selectElement","changeOrderUp","changeOrderDown","orderElement","removeField","reportList","drilldownElements","$popuplList","drilldownData","getDrilldownData","nextDrilldownSelect","existingDrilldown","existingIndex","selectedNextReportId","maxOrder","d","$newElement","liItems","$listElement","onDrillBack","hiddenDropDown","$drillbackButton","links","previousLink","previousDrilldown","$links","chartSelected","updateResult","selectedGroupBy","selectedAnalyzeBy","configObject","updateResults","AnalysisGroupReportId","pivotGroupId","updateConfig","orderConfig","useJson","postUpdateFunction","groupByElement","adjustReportTypeTitle","resizeReportSettings","pivotColorClick","popLi","$foreColorSelector","$backColorSelector","colorModal","popupControl","enablePivotPost","updatePivotMetricColor","analyzeByReport","setupPivotMetrics","drilldownReportConfig","filterAddList","controlElementVisibility","canvas","visibleHeight","updateChartType","jsonObject","setupDisplayTypeChanged","selectReportType","selectedChanged","searchBoxButton","filterPivotButton","populateTopBottomSelect","groupByDiv","reportTypeChanged","selectpicker","jsonString","groupBySelect","changeTopBottom","liTopOrderList","selectedValue","orderFieldGroup","selectedField","columnFields","selectList","colSelect","topBottomSelect","columnOpts","getOrderFieldData","orderFieldData","returnOject","currDialog","orderElements","orderData","currIndex","duplicateFields","currSelect","currField","isDashboard","listElementClass","removeOrderField","selectItem","changeDirection","$field","prevOrder","currOrder","addNewSelect","plusIcon","newSelect","changeSelected","$selectElement","$directionIndicator","ascClass","descClass","noneClass","upField","downField","lastIndex","modalBody","newSortFieldBtn","selectedFieldName","reportMetricId","selectedOption","showOrderCursor","divField","additional","fieldOrder","orderFieldName","changeReportSelectOrder","$current","colIsMetric","selectTopBottom","selectedValueTopBottom","newOrderFields","existingOrderFields","keepScrollLeftPosition","updateOnlySortFields","scrollLeftPosition","dataTables_scrollBody","sortFields","chartConfig","reportConfig","pivotConfig","analysisConfig","isChart","isPivot","tabIconText","formatState","state","$currentElement","select2","templateResult","templateSelection","dropdownCssClass","maximizeSelect2Height","changeToDesigner","hideSettingsReportDesigner","openReportSettings","settingsDiv","resultsDiv","disable","ViewModel","workbookEditingMode","updateValues","switchAnalyzeByAndGroupBy","switchAnalyzeByAndGroupByToolTip","switchAnalyzeByAndGroupByEnable","groupByText","mainOptions","koData","toolButtons","advancedOptions","notToggleToggles","not","matchMedia","addListener","mql","$toolButtons","fx","clip","onTabSelection","countCallback","whenFinished","tabsListOptions","tabPopoverOptions","prepareTabPopover","dxTabs","allowDetailTab","tabNameTextBoxOptions","tabNamePopoverButtonOptions","setTabSelection","selectedTab","showTabsPopover","tabNameRemoveButtonOptions","onWidgetChangedWidth","dashboardWidth","onWidgetChangedLeft","onWidgetChangedHeight","dashboardHeight","onWidgetChangedTop","FormattingRule","createDefault","object","createNewIdForObject","externalId","FormattingRuleConfig","organisationId","FormattingRuleScales","calculateMaxMinValues","newFormattingRule","sucessCallback","failureCallback","sortScalesByMinValue","delete","firstEl","secondEl","dxLinearGaugeOptions","FormattingRuleViewModel","hasOwnProperty","fromScale","toScale","colorCellTemplate","formattingRuleViewModel","onFormattingRuleSelected","onFormattingRulePopoverHidding","loadFormattingRuleViewModel","allFormattingRules","scalesData","currentFormattingRule","allowEditingScale","createFormattingRules","newRules","rule","newRule","organisations","companies","multiTenant","formattingRulesConfig","getFormattingRules","dataGridOptions","allowSorting","validationRules","validationCallback","v","setCellValue","defaultSetCellValue","isEditing","clonedItem","newName","countName","useIcons","focusedRowIndex","onFocusedRowChanged","onInitNewRow","onRowInserted","onRowUpdated","onRowRemoving","deferred","Deferred","promise","onRowRemoved","onEditorPrepared","editorElement","scalesDataGridOptions","editCellTemplate","cellInfo","dxLookup","iconOptions","closeOnOutsideClick","setValue","currentRowData","onRowInserting","onRowUpdating","parentType","buttonOptions","prepareEditor","onHiding","listVM","gaugeClick","viewModel","localeCompare","prepareList","getFormattingRuleViewModel","onFormattingRuleSelectedCallback","onFormattingRulePopoverHiddingCallback","fr","isBlankFormattingRule","bindSelectButton","dxButton","bindRemoveButton","outputScale","functionTypeOptions","isDataCell","columnType","isTotalCell","getAreaFields","dataIndex","clickDrillDown","createDrillDownDataSource","load","addFilter","di","sortMetric","sortMetricIdx","sortBy","sortBySummaryField","sortBySummaryPath","showGrandTotals","calculateSummaryValue","groupColumnCount","acc","curr","colTop","runningTotal","colBottom","stackTopValue","stackBottomValue","prevCell","summaryDisplayMode","wordWrapEnabled","expandAllColumns","depColumn","valueChangeEvent","pivotSource","dxPivotGrid","allowSortingBySummary","allowFiltering","headerFilter","search","fieldPanel","allowFieldDragging","showFilterFields","showDataFields","showColumnGrandTotals","showColumnTotals","showRowGrandTotals","showRowTotals","dataFieldArea","pivotLayout","fieldChooser","texts","grandTotal","rowHeaderLayout","rowHeaderLayoutPivot","enableDrawIconSelectRow","collapseText","rowPath","onCellClick","mainTable","collapsedRows","collapseHeaderItem","isReadyIR","onContentReadyPivot","maxWidth","pivotWidth","setWorkbookWidth","reportsReady","grids","charts","readyItems","isReady","pivot","pie","polar","repaintGrids","refresh","setExcelColumnFormat","currencySymbol","excelNumberFormat","workbook","ExcelJS","Workbook","worksheet","addWorksheet","def","skip","rowIndex","rowNumber","default_report_colour","trimStart","default_report_odd_colour","default_headfoot_font_colour","default_headfoot_colour","totalItemsUpdated","rowsToRemove","rowsCollapsed","rowsToReplaceSubtotalText","borderStyle","argb","applyFormattingRule","excelCell","pattern","fgColor","cellsToApplyFormattingRule","customExport","excelExporter","exportDataGrid","topLeftCell","customizeCell","gridCell","formattingRuleScale","groupSummaryItems","bold","horizontal","collapsed","numFmt","totalSummaryItemName","spaces","addIdentation","cellRange","rowIdx","spliceRows","columnCount","getRow","getCell","printedRow","companyRow","mappingRow","reportRow","groupByRow","orderByRow","filterRow","csv","writeBuffer","buffer","saveAs","Blob","xlsx","totalItemsWhitoutBarChart","looping","clearInterval","addBorderToRow","borderStyleThin","exportPivotGrid","pivotCell","isLast","cellCount","PdfTemplate","PdfTemplateConfig","newPdfTemplate","pdfTemplate","footer","headerHeight","footerHeight","PdfTemplateViewModel","saveFunction","heightContent","contentDocument","menuItems","pdfTemplatesViewModel","variableName","getMenu","fontsize_formats","allPdfs","newTemplates","newTemplate","getRowIndexByKey","cellValue","editorOptions","componentType","itemConfig","reportTypeStr","keepMetricsDrillDown","runSetup","redrawComponent","defaultSettings","analysisSettings","_q","pivotSettings","scrollTo","oRevision","DefinedFieldEnum","ContainerScopeEnum","ScopeActionEnum","FilterConditionTypeEnum","FilterTypeEnum","FilterModifiersEnum","FilterVM","getConditionTypeOptions","TextBox","NotBetween","GreaterThan","LessThan","EqualsOrGreaterThan","EqualsOrLessThan","isComparisonFilter","nextPreviousDateChange","isNextDate","lastDateRangeUsed","newDateRangeId","nextDate","previousDate","usersDate","dxDateBox","dxDateRangeBox","isCombinedDate","Combine","DateRangeConfigFilter","requirejs","IRSettings","componentRoot","waitSeconds","moduleId","moduleIdTemp","templateFromUrlLoader","loadTemplate","templateConfig","fromUrl","fullUrl","markupString","components","defaultLoader","loaders","register","require","WorkbookCopy","WorkbookCopyViewModel","originalWorkbook","wb","workbookCopy","originalWb","hasAccess","origin"],"mappings":"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I8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACrF,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YACpO,CAAE9K,GAAI,GAAI8K,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YAC/O,CAAE9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","file":"wwwroot/Scripts/front-custom-shared.js","sourcesContent":["DevExpress.config({ licenseKey: 'ewogICJmb3JtYXQiOiAxLAogICJjdXN0b21lcklkIjogImUzMjM4ZDJhLTY4YWMtNGVkNy1hZDczLTdiMGJhNmRlYTY3OSIsCiAgIm1heFZlcnNpb25BbGxvd2VkIjogMjMyCn0=.b6DwDkVvFsPEy+HqWI3SilkXRRiY77WOD7iBzDS3Za4+jxMFmdz6DtdpY6t7gGNTf2DiLTDyMu0NOeHH4jj3Y+CHPFW/wUWT42OLecOb4slua2PAvbbr5Mw1TieBoO8ZK00Sxg==' });","declare var authenticationMode: any;\r\n\r\ninterface RequestServerParams {\r\n evt: any,\r\n url: string,\r\n data: any,\r\n verb: string,\r\n showIndicator: boolean,\r\n headers: any,\r\n dontUpdateFilters: boolean,\r\n async: boolean,\r\n isAdmin: boolean,\r\n dataType: string,\r\n contentType: any, //bool or string\r\n processData: boolean,\r\n\r\n successFunction: Function | undefined,\r\n failureFunction: Function | undefined,\r\n}\r\n\r\nlet bbAlert = bootbox.alert;\r\nbootbox.alert = function (errorText, callback) {\r\n if (errorText && errorText !== \"\") {\r\n bbAlert(errorText, callback);\r\n }\r\n}\r\n\r\n//Global functions to calculate metric expressions\r\nvar ISNULL = function (value, nullValue) {\r\n return value == null ? nullValue : value;\r\n}\r\n\r\nvar IIF = function (boolValue, trueValue, falseValue) {\r\n return boolValue ? trueValue : falseValue;\r\n}\r\n\r\nlet $fn = $.fn as any;\r\n$fn.animateRotate = function (angle, duration, easing, complete) {\r\n var args = $.speed(duration, easing, complete) as any;\r\n var step = args.step;\r\n return this.each(function (i, e) {\r\n args.step = function (now) {\r\n ($ as any).style(e, \"transform\", \"rotate(\" + now + \"deg)\");\r\n if (step) return step.apply(this, arguments);\r\n };\r\n if (angle !== -180) $({ deg: 0 }).animate({ deg: angle }, args);\r\n else $({ deg: -180 }).animate({ deg: 0 }, args);\r\n });\r\n};\r\n//SCOTTGAL -\\Disabled as we are mjssing this lib.\r\n// dirty hack for bootstrap-tooltip.js, like 253ish, where it screws with titles\r\n/*$.fn.popover.Constructor.prototype.fixTitle = function () {\r\n var $e = this.$element;\r\n if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\r\n $e.attr('data-original-title', $e.attr('title') || '');\r\n }\r\n};\r\n*/\r\n\r\n//override the default builtin function because of the wrong currency symbol for some of the currencies\r\nif (!(new Intl.NumberFormat() as any).irng) {\r\n var NumberFormatOriginal = Intl.NumberFormat;\r\n (Intl.NumberFormat as any) = function (locale, options: any) {\r\n return {\r\n irng: true,\r\n format: function (number) {\r\n let scaleSymbol = null;\r\n\r\n if (options) {\r\n //there cannot be null properties because they override the default\r\n for (var prop in options) {\r\n if (options[prop] === null)\r\n options[prop] = undefined;\r\n }\r\n\r\n if (options.precision !== undefined && (options.maximumFractionDigits === undefined || options.minimumFractionDigits === undefined)) {\r\n options.maximumFractionDigits = options.precision;\r\n options.minimumFractionDigits = options.precision;\r\n }\r\n\r\n if (options.largerNumber) {\r\n let absValue = Math.abs(number);\r\n let format = options.largerNumber;\r\n\r\n if ((absValue > 1000000000 && format === \"Automatic\") || format === \"Billions\") {\r\n scaleSymbol = \"B\";\r\n number = number / 1000000000;\r\n }\r\n else if ((absValue > 1000000 && format === \"Automatic\") || format === \"Millions\") {\r\n scaleSymbol = \"M\";\r\n number = number / 1000000;\r\n }\r\n else if ((absValue > 1000 && format === \"Automatic\") || format === \"Thousands\") {\r\n scaleSymbol = \"K\";\r\n number = number / 1000;\r\n }\r\n }\r\n }\r\n\r\n let output = new NumberFormatOriginal(locale, options).format(number);\r\n\r\n if (options) {\r\n\r\n if (options.largerNumber && scaleSymbol) {\r\n if (options.style === \"currency\") {\r\n let decimalOptions = { ...options };\r\n decimalOptions.style = \"decimal\";\r\n let simpleValue = new NumberFormatOriginal(locale, decimalOptions).format(number);\r\n output = output.replace(simpleValue, `${simpleValue}${scaleSymbol}`);\r\n }\r\n else {\r\n output += scaleSymbol;\r\n }\r\n }\r\n\r\n if (options.style === \"currency\" && options.currencyDisplay === \"narrowSymbol\" && options.currency) {\r\n switch (options.currency) {\r\n case \"PGK\":\r\n output = output.replace(options.currency, \"K\");\r\n break;\r\n case \"AED\":\r\n output = output.replace(options.currency, \"D\");\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n \r\n if (output && options.currencySign === \"accounting\" && number < 0) {\r\n if (options.style === \"decimal\" || options.style === \"percent\") {\r\n output = `(${output.toString().replace(\"-\", \"\")})`;\r\n }\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n };\r\n }\r\n}\r\n\r\n// https://stackoverflow.com/questions/1891444/cursor-position-in-a-textarea-character-index-not-x-y-coordinates\r\n($.fn as any).caret = function (begin, end) {\r\n if (this.length === 0) return;\r\n if (typeof begin === 'number') {\r\n end = (typeof end === 'number') ? end : begin;\r\n return this.each(function () {\r\n if (this.setSelectionRange) {\r\n this.setSelectionRange(begin, end);\r\n } else if (this.createTextRange) {\r\n var range = this.createTextRange();\r\n range.collapse(true);\r\n range.moveEnd('character', end);\r\n range.moveStart('character', begin);\r\n try {\r\n range.select();\r\n } catch (ex) {\r\n // do nothing\r\n }\r\n }\r\n });\r\n } else {\r\n if (this[0].setSelectionRange) {\r\n begin = this[0].selectionStart;\r\n end = this[0].selectionEnd;\r\n } else if ((document as any).selection && (document as any).selection.createRange) {\r\n var range = (document as any).selection.createRange();\r\n begin = 0 - range.duplicate().moveStart('character', -100000);\r\n end = begin + range.text.length;\r\n }\r\n return { begin: begin, end: end };\r\n }\r\n}\r\n\r\nvar irGlobal = (function () {\r\n var hexDigits = new Array(\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\");\r\n\r\n //Function to convert rgb color to hex format\r\n function rgb2hex(rgb) {\r\n rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\r\n return \"#\" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);\r\n }\r\n\r\n function hex(x) {\r\n return isNaN(x) ? \"00\" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];\r\n }\r\n\r\n function splitOnUpper(text) {\r\n let titleCaseString = text\r\n .replace(/(_)/g, ' ')\r\n .trim()\r\n .replace(/\\w\\S*/g, function (str) {\r\n return str.charAt(0).toUpperCase() + str.substr(1)\r\n })\r\n .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')\r\n\r\n return titleCaseString;\r\n }\r\n\r\n var copyTextToClipboard = function (text, message) {\r\n if (!text) {\r\n return;\r\n }\r\n\r\n let fallbackCopyTextToClipboard = function () {\r\n let textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n\r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n let successful = document.execCommand('copy');\r\n if (successful) {\r\n bootbox.alert(message);\r\n }\r\n } catch (err) { }\r\n\r\n document.body.removeChild(textArea);\r\n };\r\n\r\n if (!navigator.clipboard) {\r\n fallbackCopyTextToClipboard();\r\n return;\r\n }\r\n\r\n navigator.clipboard.writeText(text).then(function () {\r\n bootbox.alert(message)\r\n }, function (err) { });\r\n };\r\n\r\n var getUpdateButton = function () {\r\n return getJqueryElement(\"button#UpdateReport\");\r\n };\r\n\r\n var enableUpdateButton = function (enable, callbackOnClick: Function = undefined) {\r\n if (isFunction(enable)) enable = enable();\r\n let updateButton = getUpdateButton() as any;\r\n updateButton.prop(\"disabled\", !enable);\r\n\r\n //So if we enabled the button and there's something to do if do then enable it.\r\n if (enable && isFunction(callbackOnClick))\r\n updateButton.off(\"click\").on(\"click\", callbackOnClick);\r\n };\r\n\r\n // Returns a function, that, as long as it continues to be invoked, will not\r\n // be triggered. The function will be called after it stops being called for\r\n // N milliseconds. If `immediate` is passed, trigger the function on the\r\n // leading edge, instead of the trailing.\r\n var debounce = function (func, wait = undefined, immediate = undefined) {\r\n var timeout;\r\n return function () {\r\n var context = this, args = arguments;\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n var callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n };\r\n var isLocal = function () {\r\n return location.hostname === \"localhost\" || location.hostname === \"127.0.0.1\";\r\n };\r\n\r\n var isFunction = function (objectToTest) {\r\n //Check for null objects...\r\n if (!objectToTest) return false;\r\n var getType = {};\r\n return getType.toString.call(objectToTest) === \"[object Function]\";\r\n\r\n };\r\n\r\n var changeUrl = function (page, url) {\r\n //So this will NOT work with browsers which aren't HTML5 friendly\r\n if (typeof history.pushState === \"undefined\") return;\r\n var obj = { Page: page, Url: url };\r\n history.pushState(obj, obj.Page, obj.Url);\r\n\r\n };\r\n var shadeColor = function (color, percent) {\r\n var f = parseInt(color.slice(1), 16),\r\n t = percent < 0 ? 0 : 255,\r\n p = percent < 0 ? percent * -1 : percent,\r\n R = f >> 16,\r\n G = f >> 8 & 0x00FF,\r\n B = f & 0x0000FF;\r\n return \"#\" +\r\n (0x1000000 +\r\n (Math.round((t - R) * p) + R) * 0x10000 +\r\n (Math.round((t - G) * p) + G) * 0x100 +\r\n (Math.round((t - B) * p) + B)).toString(16).slice(1);\r\n };\r\n\r\n var getJqueryElement = function (element) {\r\n if (!(element instanceof jQuery)) {\r\n return $(element);\r\n }\r\n return element;\r\n };\r\n\r\n function getRandColor(brightness) {\r\n //6 levels of brightness from 0 to 5, 0 being the darkest\r\n var rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256] as any;\r\n var mix = [brightness * 51, brightness * 51, brightness * 51]; //51 => 255/5\r\n var mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]]\r\n .map(function (x) { return Math.round(x / 2.0); });\r\n rgb = mixedrgb[2] | mixedrgb[1] << 8 | mixedrgb[0] << 16;\r\n return \"#\" + rgb.toString(16);\r\n }\r\n\r\n var showInfo = function (showInfo, infoMessage: string = undefined) {\r\n let info = $(\"div.infoDisplay\");\r\n if (info.length === 0) return;\r\n if (showInfo) {\r\n info.removeClass(\"hidden\");\r\n info.addClass(\"in\");\r\n info.find(\"p.infoMessage\").text(infoMessage);\r\n info.delay(4000).slideUp(200,\r\n function () {\r\n $(this).addClass(\"hidden\");\r\n $(this).removeClass(\"in\");\r\n $(this).find(\"p.message\").text(\"\");\r\n });\r\n\r\n } else {\r\n info.slideUp(200,\r\n function () {\r\n $(this).addClass(\"hidden\");\r\n $(this).removeClass(\"in\");\r\n $(this).find(\"p.message\").text(\"\");\r\n });\r\n }\r\n };\r\n\r\n\r\n var showError = function (showError: boolean, errorText: string) {\r\n if (showError) {\r\n DevExpress.ui.notify({\r\n message: errorText,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\"\r\n }\r\n }, \"error\", 3000);\r\n }\r\n };\r\n var showToast = function (message: string = undefined, type: string = \"success\", width: number = 300) {\r\n if (!message || message === \"\") {\r\n return;\r\n }\r\n\r\n DevExpress.ui.notify({\r\n message: message,\r\n position: { my: 'right top', at: 'right top', offset: { x: -20, y: 20 } },\r\n width: width\r\n }, type ,3000);\r\n };\r\n var notifyError = function (message, align = undefined, yOffset = undefined, element = undefined, from = undefined) {\r\n notify(message, align, yOffset, \"danger\", element, from);\r\n };\r\n var notify = function (message, align = \"right\", yOffset = undefined, type = \"warning\", element = undefined, from = \"top\") {\r\n var settings = {\r\n type: type,\r\n placement: { align: align, from: from },\r\n z_index: 9999\r\n } as any;\r\n if (yOffset)\r\n settings.offset = { y: yOffset };\r\n if (element)\r\n settings.element = element;\r\n\r\n ($ as any).notify({\r\n message: message\r\n }, settings);\r\n };\r\n var showYesNoMessage = function (message, callback) {\r\n bootbox.confirm({\r\n message: message,\r\n buttons: {\r\n confirm: {\r\n label: 'Yes',\r\n className: 'btn-success'\r\n },\r\n cancel: {\r\n label: 'No',\r\n className: 'btn-danger'\r\n }\r\n },\r\n callback: function (result) {\r\n callback(result);\r\n }\r\n });\r\n }\r\n\r\n var handleAlerts = function (data) {\r\n if (data.info) {\r\n showInfo(true, data.info);\r\n } else {\r\n showInfo(false);\r\n }\r\n };\r\n var getParentContext = function () {\r\n let activeTab = tabView.getActiveTab();\r\n if (activeTab) {\r\n if (activeTab.data(\"tabtype\") === TabTypeStrEnum.Dashboard) {\r\n let activeWidget = activeTab.find(\".dashboardWidget.selected\");\r\n if (activeWidget) {\r\n return activeWidget;\r\n }\r\n }\r\n\r\n return activeTab.find(\"div.reportContent\");\r\n }\r\n\r\n return null;\r\n };\r\n\r\n var getMode = function (parentContext) {\r\n var activeTab = tabView.getActiveTab();\r\n if (!activeTab || activeTab.length === 0)\r\n return \"\";\r\n\r\n if (activeTab.data(\"tabtype\") === TabTypeStrEnum.Dashboard)\r\n return TabTypeStrEnum.Dashboard;\r\n\r\n if (!parentContext)\r\n parentContext = getParentContext();\r\n\r\n return parentContext.find(\"#ReportType\").val();\r\n };\r\n\r\n var updateOutput = function (data) {\r\n\r\n var parentContext = getParentContext();\r\n //This should only happen on drilldown.\r\n if (data.fullTabResult) {\r\n parentContext.replaceWith(data.fullTabResult);\r\n reportView.setup();\r\n enableUpdateButton(false);\r\n return;\r\n }\r\n\r\n var mode = getMode(parentContext);\r\n var $results = mode === TabTypeStrEnum.Dashboard ? $(\"#DashboardContainer\") : $(\"div#Results\", parentContext);\r\n\r\n if (data.error) {\r\n notifyError(data.error);\r\n }\r\n filtersManager.handleFilterErrors(data);\r\n\r\n if (data.pivotMetrics) {\r\n $(\"#pivotMetricList\", parentContext).replaceWith(data.pivotMetrics);\r\n }\r\n\r\n //This should only happen if there's a active tab.\r\n if (mode !== \"\") {\r\n\r\n tabView.updateWorkbookReportList(data);\r\n tabView.updateWorkbookDashboardList(data);\r\n tabView.updateReportList(data);\r\n var $filterList;\r\n\r\n if (data.tabs) {\r\n let persistedElements = $(\".needsPersisted\");\r\n $.each(persistedElements, function (index, persistedElement) {\r\n let $persistedElement = $(persistedElement);\r\n let enabledMessage = $persistedElement.data(\"enabledmessage\");\r\n $persistedElement.attr(\"title\", enabledMessage);\r\n });\r\n\r\n data.tabs.forEach(tabDefinition => {\r\n var currentTab = $(\"a#Tab_\" + tabDefinition.id);\r\n if (tabDefinition.persisted) {\r\n currentTab.data(\"lastsaved\", tabDefinition.lastSaved);\r\n\r\n $(\".needsPersisted\").prop(\"disabled\", false);\r\n if (!currentTab.hasClass(\"persisted\")) {\r\n currentTab.addClass(\"persisted\");\r\n var div = $(\"div.notpersisted\", currentTab);\r\n div.removeClass(\"notpersisted\");\r\n div.addClass(\"persisted\");\r\n }\r\n }\r\n });\r\n }\r\n\r\n //So if there's actual results...\r\n if (data.partialViewResult) {\r\n switch (mode) {\r\n case \"Report\":\r\n case \"Pivot\":\r\n case \"Chart\":\r\n parentContext.replaceWith($(data.partialViewResult));\r\n\r\n $filterList = $(\".filterList\", parentContext);\r\n if (data.filterResult) {\r\n $filterList.html(data.filterResult);\r\n }\r\n reportView.setup();\r\n break;\r\n case TabTypeStrEnum.Dashboard:\r\n $results.html($(data.partialViewResult).filter(\"#DashboardContainer\")[0].outerHTML);\r\n enableUpdateButton(false);\r\n dashboard.setup();\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n } else {\r\n if (data.tabType === TabTypeStrEnum.Dashboard)\r\n dashboard.setupDefaultFilterBehaviours(undefined);\r\n else\r\n reportView.setupDefaultFilterBehaviours();\r\n }\r\n }\r\n\r\n tabView.setupTabActions();\r\n };\r\n\r\n //Replace null values by undefined\r\n var jsonReplacer = function replacer(key, value) {\r\n // Filtering out properties\r\n if (value === null) {\r\n return undefined;\r\n }\r\n return value;\r\n };\r\n\r\n //Don't serialize null properties\r\n var jsonStringfy = function (jsonInput) {\r\n return JSON.stringify(jsonInput, jsonReplacer);\r\n }\r\n\r\n //Contains all ajax requests. \r\n var requestServerAdmin = function (e: RequestServerParams) {\r\n e.isAdmin = true;\r\n requestServer(e);\r\n }\r\n var requestServer = function (e: RequestServerParams) {\r\n if (e.async === undefined || e.async === null)\r\n e.async = true;\r\n\r\n if (e.showIndicator === null || e.showIndicator === undefined)\r\n e.showIndicator = true;\r\n\r\n if (e.processData === null || e.processData === undefined)\r\n e.processData = true;\r\n\r\n //let filterValues = null;\r\n //if (!dontUpdateFilters) {\r\n // filterValues = filtersManager.getFilterValues(undefined, undefined, undefined, true);\r\n //}\r\n\r\n //Ensures \r\n if (e.evt)\r\n e.data = tabView.getTabConfig(e.data);\r\n\r\n if (($.isPlainObject(e.data) || typeof e.data === \"object\") && !e.isAdmin)\r\n e.data = jsonStringfy(e.data);\r\n\r\n let defaultErrorFunction = function (jqXHR, textStatus, errorThrown) {\r\n console.debug(\"Error \", jqXHR, textStatus, errorThrown);\r\n if (textStatus) {\r\n showError(true, textStatus);\r\n return;\r\n }\r\n if (!jqXHR) {\r\n return;\r\n }\r\n if (jqXHR.responseJSON && jqXHR.responseJSON.error) {\r\n showError(true, jqXHR.responseJSON.error);\r\n } else if (typeof jqXHR.responseText === \"string\" && jqXHR.responseText.startsWith('{\"')) {\r\n let parsed = JSON.parse(jqXHR.responseText);\r\n if (parsed.error)\r\n showError(true, parsed.error);\r\n else {\r\n showError(true, jqXHR.responseText);\r\n }\r\n } else if (typeof jqXHR.responseText === \"string\") {\r\n showError(true, jqXHR.responseText);\r\n }\r\n };\r\n\r\n let methodVerb = \"POST\";\r\n if (e.verb) {\r\n methodVerb = e.verb;\r\n }\r\n\r\n let ajaxSettings = {\r\n url: e.url,\r\n type: methodVerb,\r\n data: e.data,\r\n async: e.async,\r\n global: e.showIndicator,\r\n headers: e.headers,\r\n processData: e.processData\r\n } as any;\r\n\r\n if (e.dataType) {\r\n ajaxSettings.dataType = e.dataType;\r\n ajaxSettings.contentType = \"application/json; charset=utf-8\";\r\n }\r\n\r\n if (e.contentType !== undefined) {\r\n ajaxSettings.contentType = e.contentType;\r\n }\r\n\r\n $.ajax(ajaxSettings).done(function (data) {\r\n handleAlerts(data);\r\n\r\n if (isFunction(e.successFunction)) {\r\n e.successFunction(data, e.evt);\r\n }\r\n\r\n if (!e.dontUpdateFilters) {\r\n let updateApplyButton = false;\r\n let filterValues = filtersManager.getFilterValues(undefined, undefined, undefined, true);\r\n if (filterValues) {\r\n if (filterValues.globalFilters) {\r\n updateApplyButton = ((filterValues.globalFilters.removedfilters && filterValues.globalFilters.removedfilters.length === 0) || !filterValues.globalFilters.removedfilters) &&\r\n (filterValues.globalFilters.updatedFilters && filterValues.globalFilters.updatedFilters.length === 0);\r\n }\r\n\r\n if (updateApplyButton && filterValues.tabFilters) {\r\n updateApplyButton = ((filterValues.tabFilters.removedfilters && filterValues.tabFilters.removedfilters.length === 0) || !filterValues.tabFilters.removedfilters) &&\r\n (filterValues.tabFilters.updatedFilters && filterValues.tabFilters.updatedFilters.length === 0);\r\n }\r\n\r\n if (updateApplyButton && filterValues.widgetFilters && filterValues.widgetFilters.length > 0) {\r\n for (var i = 0; i < filterValues.widgetFilters.length; i++) {\r\n updateApplyButton = ((filterValues.widgetFilters[i].removedfilters && filterValues.widgetFilters[i].removedfilters.length === 0) || !filterValues.widgetFilters[i].removedfilters) &&\r\n (filterValues.widgetFilters[i].updatedFilters && filterValues.widgetFilters[i].updatedFilters.length === 0);\r\n\r\n if (!updateApplyButton) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (updateApplyButton || !filterValues) {\r\n enableUpdateButton(false);\r\n }\r\n }\r\n })\r\n .fail(function (jqXHR, textStatus, errorThrown) {\r\n let failureText = errorThrown;\r\n let status = parseInt(jqXHR.status as any);\r\n\r\n if (status === 401) {\r\n loginOnModal(e.evt, e.url, e.data, e.successFunction, e.failureFunction, e.dataType === \"json\" ? true : false, e.verb, e.showIndicator, e.headers, e.dontUpdateFilters, e.async);\r\n }\r\n else {\r\n if (jqXHR.responseJSON) {\r\n failureText = jqXHR.responseJSON.error;\r\n } else if (jqXHR.responseText) {\r\n failureText = jqXHR.responseText;\r\n }\r\n\r\n if (failureText && failureText.toString().startsWith(\"Workbook not found\")) {\r\n let workbookId = 0;\r\n let mt = failureText.match(/-?\\d+/i);\r\n if (mt && mt.length > 0) {\r\n workbookId = parseInt(mt[0], 10);\r\n }\r\n if (workbookId !== 0) {\r\n document.location.href = `${urlConfigs.tabs}WorkbookNotFoundError/${workbookId}`;\r\n return;\r\n }\r\n }\r\n\r\n if (isFunction(e.failureFunction)) {\r\n e.failureFunction(textStatus, failureText);\r\n } else {\r\n defaultErrorFunction(jqXHR, failureText, undefined);\r\n }\r\n }\r\n });\r\n }\r\n var updateFromServer = function (evt, url: string, jsonInput, successFunction: Function, failureFunction: Function = undefined, isJson: boolean = undefined, verb: string = undefined, showIndicator: boolean = undefined, headers = undefined, dontUpdateFilters: boolean = undefined, async: boolean = undefined) {\r\n requestServer({\r\n evt: evt,\r\n url: url,\r\n data: jsonInput,\r\n successFunction: successFunction,\r\n failureFunction: failureFunction,\r\n dataType: isJson ? \"json\" : \"html\",\r\n verb: verb,\r\n showIndicator: showIndicator,\r\n headers: headers,\r\n dontUpdateFilters: dontUpdateFilters,\r\n async: async\r\n } as RequestServerParams);\r\n };\r\n\r\n function loginOnModal(evt, url, jsonInput, successFunction, failureFunction, isJson, verb, showIndicator, headers, dontUpdateFilters, async) {\r\n var json = JSON.parse(jsonInput);\r\n\r\n if (authenticationMode == 'ADFS' || authenticationMode == 'AUTH0') {\r\n location.reload();\r\n return;\r\n }\r\n\r\n $.ajax({\r\n url: '/login/?modal=true',\r\n async: false\r\n }).done(function (htmlData) {\r\n var dialog = bootbox.dialog({\r\n title: \"Authentication Expired - Reenter with your credentials\",\r\n message: htmlData,\r\n show: false,\r\n size: 'large'\r\n });\r\n\r\n dialog.on(\"shown.bs.modal\", function () {\r\n var btn = $(\"#BtnModalLogin\", $(dialog));\r\n $(\".centre\", $(dialog)).addClass('top40p');\r\n $(this).css('z-index', 99999);\r\n\r\n $(\"#showHidePassword\").click(function (e) {\r\n if ($(\".dx-icon\", e.currentTarget).hasClass(\"dx-icon-eyeopen\")) {\r\n $(\".dx-icon\", e.currentTarget).removeClass(\"dx-icon-eyeopen\");\r\n $(\".dx-icon\", e.currentTarget).addClass(\"dx-icon-eyeclose\");\r\n $(\"#Password\").prop('type', 'text');\r\n }\r\n else {\r\n $(\".dx-icon\", e.currentTarget).addClass(\"dx-icon-eyeopen\");\r\n $(\".dx-icon\", e.currentTarget).removeClass(\"dx-icon-eyeclose\");\r\n $(\"#Password\").prop('type', 'password');\r\n }\r\n });\r\n\r\n $(btn).on('click', function (e) {\r\n e.preventDefault();\r\n var divError = $('div.alert', $(dialog));\r\n $(divError).addClass('hidden');\r\n\r\n $(btn).attr(\"disabled\", \"disabled\");\r\n\r\n let divCompany = $(\"#drawer .workbook-menu-group.company\");\r\n let companyId = null;\r\n if (divCompany.length > 0) {\r\n companyId = parseInt(divCompany.data(\"id\"), 10);\r\n }\r\n else {\r\n divCompany = $(\".homeContent span#companySelected\");\r\n if (divCompany.length > 0) {\r\n companyId = parseInt(divCompany.data(\"id\"), 10);\r\n }\r\n }\r\n\r\n $.ajax({\r\n url: '/login',\r\n type: 'POST',\r\n async: false,\r\n data: {\r\n UserName: $('#UserName', $(dialog)).val(),\r\n Password: $('#Password', $(dialog)).val(),\r\n CompanyId: companyId,\r\n Ismodal: true,\r\n __RequestVerificationToken: $('input[name=\"__RequestVerificationToken\"]', $(dialog)).val(),\r\n }\r\n }).done(function (data) {\r\n if (data.response == 'OK') {\r\n updateFromServer(evt, url, json, successFunction, failureFunction, isJson, verb, showIndicator, headers, dontUpdateFilters, async);\r\n dialog.modal(\"hide\");\r\n }\r\n else {\r\n $(divError).html(data.response);\r\n $(divError).removeClass('hidden');\r\n $(btn).removeAttr(\"disabled\");\r\n return false;\r\n }\r\n }).fail(function (jqXHR, textStatus, errorThrown) {\r\n $(btn).removeAttr(\"disabled\");\r\n });\r\n });\r\n });\r\n\r\n dialog.on(\"show.bs.modal\", function () {\r\n var modal = $(this);\r\n\r\n var modalBody = modal.find(\"div.modal-body\");\r\n modalBody.height(\"700px\");\r\n });\r\n\r\n dialog.modal(\"show\");\r\n });\r\n }\r\n\r\n var lut = [];\r\n for (var i = 0; i < 256; i++) {\r\n lut[i] = (i < 16 ? \"0\" : \"\") + i.toString(16);\r\n }\r\n function getGuid() {\r\n var d0 = Math.random() * 0xffffffff | 0;\r\n var d1 = Math.random() * 0xffffffff | 0;\r\n var d2 = Math.random() * 0xffffffff | 0;\r\n var d3 = Math.random() * 0xffffffff | 0;\r\n return lut[d0 & 0xff] +\r\n lut[d0 >> 8 & 0xff] +\r\n lut[d0 >> 16 & 0xff] +\r\n lut[d0 >> 24 & 0xff] +\r\n \"-\" +\r\n lut[d1 & 0xff] +\r\n lut[d1 >> 8 & 0xff] +\r\n \"-\" +\r\n lut[d1 >> 16 & 0x0f | 0x40] +\r\n lut[d1 >> 24 & 0xff] +\r\n \"-\" +\r\n lut[d2 & 0x3f | 0x80] +\r\n lut[d2 >> 8 & 0xff] +\r\n \"-\" +\r\n lut[d2 >> 16 & 0xff] +\r\n lut[d2 >> 24 & 0xff] +\r\n lut[d3 & 0xff] +\r\n lut[d3 >> 8 & 0xff] +\r\n lut[d3 >> 16 & 0xff] +\r\n lut[d3 >> 24 & 0xff];\r\n }\r\n\r\n var toggleSimpleChevron = function ($button) {\r\n //Implements a little complete function to set the chevron to the invert.\r\n $button.animateRotate(180, \"fast\", function () {\r\n if ($button.hasClass(\"glyphicon-chevron-down\")) {\r\n $button.addClass(\"glyphicon-chevron-up\");\r\n $button.removeAttr(\"style\");\r\n $button.removeClass(\"glyphicon-chevron-down\");\r\n } else {\r\n $button.addClass(\"glyphicon-chevron-down\");\r\n $button.removeAttr(\"style\");\r\n $button.removeClass(\"glyphicon-chevron-up\");\r\n }\r\n });\r\n };\r\n\r\n const emailPopup = (element) => {\r\n const emailButton = $(element);\r\n //These get replaced...\r\n let nowName = \"Instant\",\r\n /////\r\n container = null,\r\n popup = null,\r\n currentBtn = null,\r\n emailType = null,\r\n defaultSubject = null,\r\n email = null,\r\n scope = null,\r\n showInfoBodyEmailNow = false;\r\n\r\n const popupErrorEmail = $(\"#emailErrorPopup\").dxPopup({\r\n width: 500,\r\n height: 200,\r\n showTitle: true,\r\n title: 'Error sending the Email',\r\n visible: false,\r\n hideOnOutsideClick: true,\r\n showCloseButton: true,\r\n toolbarItems: [{\r\n widget: 'dxButton',\r\n toolbar: 'bottom',\r\n location: 'after',\r\n options: {\r\n text: 'Close',\r\n onClick() {\r\n popupErrorEmail.hide();\r\n },\r\n },\r\n }]\r\n }).dxPopup('instance');\r\n\r\n const saveSchedule = (e) => {\r\n const popupContent = popup.content();\r\n if (!$(\"input#EmailAddress\", popupContent).val()) {\r\n $(\"#emailAlert\", popupContent).removeClass(\"hidden\");\r\n return;\r\n }\r\n\r\n const message = \"Email Sent\";\r\n\r\n const format = $(\"input[type='radio'].formatSelector:checked\", popupContent).val(),\r\n email = $(\"input#EmailAddress\", popupContent).val(),\r\n subject = $(\"input#SubjectText\", popupContent).val(),\r\n bodyText = $(\"textarea\", popupContent).val(),\r\n showInfoBodyEmailNow = $(\"#ShowInfoBodyEmailNow\", popupContent).dxSwitch(\"instance\").option(\"value\");\r\n let requestJson = {\r\n formats: format,\r\n bodyText: bodyText,\r\n email: email,\r\n subjectText: subject,\r\n scope: scope,\r\n showInfoBodyEmailNow: showInfoBodyEmailNow\r\n };\r\n\r\n const reportObj = tabView.getTabConfig(requestJson) as any,\r\n completeFunction = (result) => {\r\n result = JSON.parse(result);\r\n let errorMessage = \"\";\r\n if (result.resultEmailSent) {\r\n if (result.resultEmailSent.reportMessage && result.resultEmailSent.reportMessage !== \"\") {\r\n errorMessage = result.resultEmailSent.reportMessage;\r\n errorMessage += \"
\";\r\n }\r\n\r\n result.resultEmailSent.emailsMessage.forEach(function (emailError) {\r\n if (!emailError.item1 && emailError.item2 && emailError.item2 !== \"\") {\r\n errorMessage += \"Error: \" + emailError.item2;\r\n errorMessage += \"
\";\r\n errorMessage += \"Recipients: \" + emailError.item3;\r\n errorMessage += \"
\";\r\n errorMessage += \"
\";\r\n }\r\n });\r\n }\r\n else {\r\n errorMessage = result.error;\r\n }\r\n\r\n if (errorMessage && errorMessage !== \"\") {\r\n popupErrorEmail.option({\r\n contentTemplate: () => {\r\n const scrollView = $('
');\r\n scrollView.append($('
').html(errorMessage));\r\n scrollView.dxScrollView({\r\n width: '100%',\r\n height: '100%',\r\n });\r\n\r\n return scrollView;\r\n },\r\n });\r\n popupErrorEmail.show();\r\n console.error(errorMessage);\r\n }\r\n else {\r\n DevExpress.ui.notify({\r\n message: message,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\"\r\n }\r\n }, \"success\", 3000);\r\n }\r\n };\r\n\r\n reportObj.pdfTemplateId = parseInt($(\".pdfTemplateEmailNow select\").val() as any, 10);\r\n $(\".pdfTemplateEmailNow select\").val(\"0\");\r\n const url = urlConfigs.email + \"SendSingle\";\r\n updateFromServer(e,\r\n url,\r\n reportObj,\r\n completeFunction);\r\n\r\n popup.hide();\r\n popup = null;\r\n };\r\n\r\n const popupOptions = {\r\n width: 500,\r\n height: 500,\r\n showTitle: true,\r\n title: \"Send Email\",\r\n dragEnabled: true,\r\n resizeEnabled: true,\r\n hideOnOutsideClick: true,\r\n deferRendering: true,\r\n toolbarItems: [{\r\n widget: \"dxButton\",\r\n toolbar: \"bottom\",\r\n location: \"after\",\r\n options: {\r\n elementAttr: { id: 'save' },\r\n icon: \"glyphicon glyphicon-floppy-disk\",\r\n stylingMode: \"contained\",\r\n type: \"success\",\r\n text: \"Save\",\r\n onClick: saveSchedule\r\n }\r\n }, {\r\n widget: \"dxButton\",\r\n toolbar: \"bottom\",\r\n location: \"before\",\r\n options: {\r\n text: \"Cancel\",\r\n icon: \"glyphicon glyphicon-remove\",\r\n stylingMode: \"contained\",\r\n type: \"danger\",\r\n onClick: function (e) {\r\n popup.hide();\r\n popup = null;\r\n }\r\n }\r\n }]\r\n };\r\n\r\n const setUpPopupContent = (el) => {\r\n let content = popup.content();\r\n\r\n var formatButtons = $(\".mailformatbuttons > label.btn\", content);\r\n var emailPopup = $(\"#EmailPopup\", content);\r\n nowName = emailPopup.data(\"nowname\");\r\n var schedule = emailPopup.data(\"schedule\") ?? \"0 8 * * *\";\r\n\r\n $(\"#ShowInfoBodyEmailNow\", content).dxSwitch();\r\n\r\n var checkedLabel = $(\":checked\", formatButtons).parents(\"label.btn\");\r\n formatButtons.removeClass(\"btn-info\");\r\n checkedLabel.addClass(\"btn-info\");\r\n\r\n if (emailType === nowName) {\r\n $(\"#save .dx-button-text\").html(\"Send\")\r\n }\r\n\r\n formatButtons.off(\"click\").on(\"click\",\r\n (btne) => {\r\n // flips the radios.\r\n var clickedButt = btne.currentTarget;\r\n var radioInput = $(\"input\", $(clickedButt));\r\n formatButtons.removeClass(\"btn-info\");\r\n $(clickedButt).addClass(\"btn-info\");\r\n $(\"input\", formatButtons).prop(\"checked\", false);\r\n radioInput.prop(\"checked\", true);\r\n if (radioInput.val() === \"HTML\") {\r\n $(\".showInfoBodyEmailNow\", content).removeClass(\"hidden\");\r\n }\r\n else {\r\n $(\".showInfoBodyEmailNow\", content).addClass(\"hidden\");\r\n }\r\n\r\n if (radioInput.val() === \"PDFLandscape\" || radioInput.val() === \"PDF\") {\r\n $(\".pdfTemplateEmailNow\", content).removeClass(\"hidden\");\r\n }\r\n else {\r\n $(\".pdfTemplateEmailNow\", content).addClass(\"hidden\");\r\n }\r\n });\r\n\r\n $(\"#EmailAddress\", emailPopup).off(\"change\").on(\"change\", function () {\r\n if (!$(\"#emailAlert\", emailPopup).hasClass(\"hidden\")) {\r\n $(\"#emailAlert\", emailPopup).addClass(\"hidden\");\r\n }\r\n });\r\n };\r\n\r\n const showPopup = (e) => {\r\n currentBtn = $(e.currentTarget);\r\n\r\n if (container == null) container = $(\"#popup\");\r\n if (popup == null) popup = container.dxPopup(popupOptions).dxPopup(\"instance\");\r\n\r\n emailType = currentBtn.data(\"type\");\r\n\r\n let width = 500,\r\n height = 400;\r\n\r\n emailType = currentBtn.data(\"type\");\r\n defaultSubject = currentBtn.data(\"defaultsubject\");\r\n email = currentBtn.data(\"email\");\r\n scope = currentBtn.data(\"scope\");\r\n const requestObj = tabView.getTabConfig({ email: email, emailType: emailType, subjectText: defaultSubject, scope: scope, bodyText: \"\" });\r\n const jsonReq = JSON.stringify(requestObj);\r\n\r\n try {\r\n let successFunction : Function = function (data) {\r\n let template = data;\r\n popup.option({\r\n contentTemplate: template,\r\n width: width,\r\n height: height,\r\n title: `Email ${currentBtn.data(\"scope\")}`\r\n });\r\n\r\n popup.show().done(setUpPopupContent);\r\n }\r\n\r\n requestServer({\r\n url: urlConfigs.email + \"popup\",\r\n data: jsonReq,\r\n successFunction: successFunction,\r\n dataType: \"html\",\r\n async: false\r\n } as RequestServerParams);\r\n } catch (error) {\r\n DevExpress.ui.notify({\r\n message: error,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\"\r\n }\r\n }, \"warning\", 3000);\r\n }\r\n };\r\n\r\n emailButton.off(\"click\").on(\"click\", showPopup);\r\n };\r\n\r\n var setupDropdownPosition = function () {\r\n $(document).off(\"shown.bs.dropdown\").on(\"shown.bs.dropdown\", \".dropdown\", function () {\r\n // calculate the required sizes, spaces\r\n var $ul = $(this).children(\".dropdown-menu\");\r\n var $button = $(this).children(\".dropdown-toggle\");\r\n if ($ul.length > 0 && $button.length > 0) {\r\n var ulOffset = $ul.offset();\r\n // how much space would be left on the top if the dropdown opened that direction\r\n var spaceUp = (ulOffset.top - $button.height() - $ul.height()) - $(window).scrollTop();\r\n // how much space is left at the bottom\r\n var spaceDown = $(window).scrollTop() + $(window).height() - (ulOffset.top + $ul.height());\r\n // switch to dropup only if there is no space at the bottom AND there is space at the top, or there isn't either but it would be still better fit\r\n if (spaceDown < 0 && (spaceUp >= 0 || spaceUp > spaceDown))\r\n $(this).addClass(\"dropup\");\r\n }\r\n }).on(\"hidden.bs.dropdown\", \".dropdown\", function () {\r\n // always reset after close\r\n $(this).removeClass(\"dropup\");\r\n });\r\n }\r\n\r\n var setup = function () {\r\n //Very simple way to resize everything when a mobile device changes the orientation. Need to be changed in the future\r\n window.onorientationchange = function () {\r\n window.location.reload();\r\n };\r\n\r\n //DO NOT REMOVE - these are used for various functions throughout the site.\r\n $(\".linkbutton\").off(\"click\")\r\n .on(\"click\",\r\n function () {\r\n window.location.href = $(this).data(\"href\") + \"?ReturnUrl=\" + window.location.href;\r\n });\r\n\r\n\r\n $(\".linkbutton.noreturn\").off(\"click\")\r\n .on(\"click\",\r\n function () {\r\n window.location.href = $(this).data(\"href\");\r\n });\r\n\r\n setupDropdownPosition();\r\n $(\".modal\").on('hidden', function (e) {\r\n $(this).remove();\r\n });\r\n ////////////////////////////////////////////////////////////////////////////////////\r\n };\r\n\r\n var changePassword = function () {\r\n let successFunction: Function = function (htmlData) {\r\n var dialog = bootbox.dialog({\r\n title: 'Change Your Password',\r\n message: htmlData,\r\n show: false,\r\n size: 'medium'\r\n });\r\n\r\n dialog.on(\"shown.bs.modal\", function (e) {\r\n var confirmButton = $('#confirmChangePasswordButton');\r\n var cancelButton = $('#cancelChangePasswordButton');\r\n var generalErrors = $('#general_errors');\r\n var modalElement = $(confirmButton).closest('.bootbox');\r\n var isRunning = false;\r\n\r\n $(confirmButton).off('click');\r\n $('#cancelChangePasswordButton').off('click');\r\n\r\n $(confirmButton).on('click', function (e) {\r\n e.preventDefault();\r\n\r\n if (isRunning) { return; }\r\n isRunning = true;\r\n\r\n $(confirmButton).attr('disabled', 'disabled');\r\n $(generalErrors).html('');\r\n\r\n var password = $('#change_password_current').val();\r\n var newPassword = $('#change_password_new').val() as any;\r\n var confirmPassword = $('#change_password_confirm').val();\r\n var isValid = true;\r\n\r\n var messageCurrent = $('span', $('#change_password_current').closest('div'));\r\n var messageNew = $('span', $('#change_password_new').closest('div'));\r\n var messageConfirm = $('span', $('#change_password_confirm').closest('div'));\r\n\r\n if (password == '') {\r\n isValid = false;\r\n\r\n $(messageCurrent).text('Field required');\r\n $(messageCurrent).removeClass('hide');\r\n }\r\n else {\r\n $(messageCurrent).addClass('hide');\r\n }\r\n\r\n if (newPassword == '') {\r\n isValid = false;\r\n $(messageNew).text('Field required');\r\n $(messageNew).removeClass('hide');\r\n } else {\r\n if (newPassword.length < 6) {\r\n isValid = false;\r\n\r\n $(messageNew).text('Minimum length of 6 characters');\r\n $(messageNew).removeClass('hide');\r\n }\r\n else {\r\n $(messageNew).addClass('hide');\r\n }\r\n }\r\n\r\n if (confirmPassword == '') {\r\n isValid = false;\r\n $(messageConfirm).text('Field required');\r\n $(messageConfirm).removeClass('hide');\r\n } else {\r\n if (newPassword != confirmPassword) {\r\n isValid = false;\r\n $(messageConfirm).text('Confirm Password is mismatching with new Password');\r\n $(messageConfirm).removeClass('hide');\r\n }\r\n else {\r\n $(messageConfirm).addClass('hide');\r\n }\r\n }\r\n\r\n if (!isValid) {\r\n $(confirmButton).removeAttr('disabled');\r\n isRunning = false;\r\n return;\r\n }\r\n\r\n irGlobal.requestServerAdmin({\r\n url: '/User/SaveChangePassword',\r\n async: false,\r\n data: {\r\n Password: password,\r\n NewPassword: newPassword,\r\n ConfirmPassword: confirmPassword\r\n },\r\n successFunction: function (data) {\r\n if (data.success) {\r\n dialog.modal(\"hide\");\r\n bootbox.alert('Password changed successfully.')\r\n }\r\n else {\r\n var htmlErrors = '';\r\n for (var i = 0; i < data.errors.length; i++) {\r\n htmlErrors += '' + data.errors[i] + '';\r\n }\r\n\r\n $(generalErrors).html(htmlErrors);\r\n }\r\n $(confirmButton).removeAttr('disabled');\r\n isRunning = false;\r\n },\r\n failureFunction: function (jqXHR, statusText, errorText) {\r\n $(generalErrors).html('Sorry, there was an unexpected error');\r\n $(confirmButton).removeAttr('disabled');\r\n isRunning = false;\r\n }\r\n } as any);\r\n });\r\n\r\n $(cancelButton).on('click', function (e) {\r\n e.preventDefault();\r\n dialog.modal(\"hide\");\r\n });\r\n\r\n let keyPress = function (e) {\r\n if (e.keyCode == 13) {\r\n $(confirmButton).trigger('click');\r\n //console.log('ENTER');\r\n }\r\n };\r\n $('#change_password_confirm').on('keypress', keyPress);\r\n $('#change_password_new').on('keypress', keyPress);\r\n $('#change_password_current').on('keypress', keyPress);\r\n\r\n $('.show-password', $('#form-change-password')).on('mouseenter', function (e) {\r\n var iconFor = $(this).data('for');\r\n var input = $('#' + iconFor);\r\n var type = $(input).attr('type');\r\n\r\n $(input).attr('type', 'text');\r\n });\r\n\r\n $('.show-password', $('#form-change-password')).on('mouseleave', function (e) {\r\n var iconFor = $(this).data('for');\r\n var input = $('#' + iconFor);\r\n var type = $(input).attr('type');\r\n\r\n $(input).attr('type', 'password');\r\n });\r\n\r\n var focusedElementId = '';\r\n var inputElements = $('input, button', modalElement);\r\n $(inputElements)\r\n .off('focus')\r\n .off('focusout')\r\n .on('focus', function (e) {\r\n focusedElementId = $(this).attr('id');\r\n }).on('focusout', function (e) {\r\n focusedElementId = '';\r\n });\r\n\r\n setTimeout(function () {\r\n $('#change_password_current').focus();\r\n }, 200);\r\n\r\n $('.bootbox').off('keypress').on(\"keypress\", function (e) {\r\n if (e.which === 13) {\r\n if (focusedElementId == 'change_password_current') {\r\n setTimeout(function () {\r\n $('#change_password_new').focus();\r\n }, 200);\r\n }\r\n\r\n if (focusedElementId == 'change_password_new') {\r\n setTimeout(function () {\r\n $('#change_password_confirm').focus();\r\n }, 200);\r\n }\r\n\r\n if (focusedElementId == 'change_password_confirm' || focusedElementId == 'confirmChangePasswordButton') {\r\n $(confirmButton).trigger('click');\r\n }\r\n\r\n if (focusedElementId == 'cancelChangePasswordButton') {\r\n $(cancelButton).trigger('click');\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n });\r\n\r\n dialog.modal(\"show\");\r\n }\r\n let failureFunction: Function = function (jqXHR, statusText, errorText) {\r\n bootbox.alert(errorText);\r\n }\r\n\r\n irGlobal.requestServerAdmin({\r\n url: '/User/ChangePassword',\r\n async: false,\r\n verb: \"GET\",\r\n successFunction: successFunction,\r\n failureFunction: failureFunction\r\n } as RequestServerParams);\r\n }\r\n\r\n var setupChangePassword = function () {\r\n $(document).ready(function () {\r\n var changePasswordElement = $('#change-password');\r\n if (changePasswordElement.length > 0) {\r\n changePasswordElement.on('click', function (e) {\r\n e.preventDefault();\r\n\r\n changePassword();\r\n });\r\n }\r\n });\r\n }\r\n\r\n var groupBy = function (array, key, isObservable) {\r\n return array.reduce(function (rv, x) {\r\n (rv[isObservable ? x[key]() : x[key]] = rv[isObservable ? x[key]() : x[key]] || []).push(x);\r\n return rv;\r\n }, {});\r\n };\r\n\r\n return {\r\n setup: setup,\r\n jsonStringfy: jsonStringfy,\r\n enableUpdateButton: enableUpdateButton,\r\n showEmailPopup: emailPopup,\r\n getUpdateButton: getUpdateButton,\r\n handleAlerts: handleAlerts,\r\n showError: showError,\r\n notifyError: notifyError,\r\n notify: notify,\r\n debounce: debounce,\r\n isFunction: isFunction,\r\n updateFromServer: updateFromServer,\r\n requestServer: requestServer,\r\n requestServerAdmin: requestServerAdmin,\r\n getGuid: getGuid,\r\n shadeColor: shadeColor,\r\n getRandomColor: getRandColor,\r\n rgbToHex: rgb2hex,\r\n\r\n getJqueryElement: getJqueryElement,\r\n changeUrl: changeUrl,\r\n showInfo: showInfo,\r\n isLocal: isLocal,\r\n updateOutput: updateOutput,\r\n getParentContext: getParentContext,\r\n getMode: getMode,\r\n toggleSimpleChevron: toggleSimpleChevron,\r\n\r\n customDate: {\r\n custom: 50,\r\n none: 51,\r\n today: 2,\r\n all: 32\r\n },\r\n\r\n splitOnUpper: splitOnUpper,\r\n showYesNoMessage: showYesNoMessage,\r\n copyTextToClipboard: copyTextToClipboard,\r\n setupChangePassword: setupChangePassword,\r\n\r\n isMobile: function () { return $(window).width() < 960; },\r\n\r\n groupBy: groupBy,\r\n changePassword: changePassword,\r\n showToast: showToast\r\n };\r\n})();\r\n\r\nvar general = irGlobal;\r\n",null,"//// \r\n\r\nvar chart = (function () {\r\n\r\n function log (chartVM: ChartVM, message: string) {\r\n if (chartVM.debug)\r\n console.log(message);\r\n }\r\n\r\n function pushStatus(chartVM: ChartVM, status: ChartStatus) {\r\n log(chartVM, `Chart Status pushing: ${status}`);\r\n chartVM.chartStatus.push(status);\r\n }\r\n\r\n function popStatus(chartVM: ChartVM) {\r\n let status = chartVM.chartStatus.pop();\r\n log(chartVM, `Chart Status poping: ${status}`);\r\n return status;\r\n }\r\n\r\n function getStatus(chartVM: ChartVM) {\r\n let status = chartVM.chartStatus[chartVM.chartStatus.length - 1];\r\n log(chartVM, `Chart Status getting: ${status}`);\r\n return status;\r\n }\r\n\r\n function createChart(chartVM: ChartVM, save: boolean = true) {\r\n if (getStatus(chartVM) !== ChartStatus.Ready) {\r\n log(chartVM, \"createChart not ready\");\r\n return;\r\n }\r\n log(chartVM, \"createChart \" + Date());\r\n pushStatus(chartVM, ChartStatus.Rendering);\r\n try {\r\n chartVM.colorPosition = -1;\r\n if (!chartVM.chartDefinition.colorTheme)\r\n chartVM.chartDefinition.colorTheme = 59;\r\n chartVM.colors = chartService.colorThemes[chartVM.chartDefinition.colorTheme - 1].colors;\r\n\r\n chartDesigner.setChartSettings(chartVM, true);\r\n\r\n if (save) {\r\n setupChart(chartVM.$context, chartVM);\r\n chartDesigner.saveChartDefinition(chartVM);\r\n }\r\n\r\n $(\".preventDefaultClick > div\", chartVM.$context).each(function (index, metricDiv) {\r\n let metric = chartVM.chartDefinition.yAxisFields.find(function (x) { return (x as any).id === metricDiv.id; });\r\n if (metric) {\r\n let enabled = metric.visible() && chartVM.allowColorPerSerie() && chartVM.chartDefinition.colorPerSerie();\r\n ($(`.chartMainOptionsContainer #${metricDiv.id} input[type=color]`, chartVM.$context) as any).spectrum(enabled ? \"enable\" : \"disable\");\r\n }\r\n });\r\n\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n popStatus(chartVM);\r\n };\r\n \r\n var basicSetup = function (jsonData, fromPDF, $context, widgetViewModel, updateChartTypeCallback) {\r\n\r\n jsonData.config.chartDefinition.yAxisFields = jsonData.metricFields;\r\n\r\n // attach the .equals method to Array's prototype to call it on any array\r\n Array.prototype.equals = function (array) {\r\n return this.length === array.length && this.every((value, index) => value === array[index]);\r\n }\r\n\r\n String.prototype.equals = function (string) {\r\n return this.toString() === string;\r\n }\r\n\r\n var chartVM = {\r\n fromPDF: fromPDF,\r\n $canvas: $context.find(\".chartdiv\"),\r\n jsonData: jsonData,\r\n $context: $context,\r\n addFilterCallback: chartService.addChartFilterDrilldown,\r\n colors: [],\r\n generateAxes: ko.observable(false),\r\n mixedChartType: ko.observable(false),\r\n allowColorPerSerie: ko.observable(true),\r\n chartDefinition: jsonData.config.chartDefinition,\r\n hasGrouping: jsonData.groupFields && jsonData.groupFields.length > 0,\r\n chartStatus: [ChartStatus.Ready, ChartStatus.Starting],\r\n debug: false,\r\n groupSerieValues: []\r\n } as ChartVM;\r\n\r\n $context.data(\"chartvm\", chartVM); //dashboardWidget\r\n\r\n chartDesigner.applyObservable(chartVM);\r\n popStatus(chartVM);\r\n createChart(chartVM, false);\r\n\r\n if (fromPDF) {\r\n let dashboardWidget = $context.closest(\".dashboardWidget\");\r\n if (dashboardWidget.length > 0) {\r\n $(\".canvasChart\", $context).css(\"height\", `${$(\".reportResult\", dashboardWidget).height()}px`);\r\n $(\".canvasChart\", $context).css(\"width\", `${$(\".reportResult\", dashboardWidget).width()}px`);\r\n }\r\n else {\r\n let infoTablePrint = $(\"table#infotable\");\r\n if (infoTablePrint.length > 0) {\r\n let chartHeight = $(\"body\").height() - ($(\"table#infotable\").outerHeight(true) * $(\"table#infotable\").length);\r\n $(\".canvasChart\", $context).css(\"height\", `${chartHeight}px`)\r\n }\r\n else {\r\n $(\".canvasChart\", $context).css(\"height\", `${$(\".body-content\").height()}px`);\r\n $(\".canvasChart\", $context).css(\"width\", `${$(\".body-content\").width()}px`);\r\n }\r\n }\r\n }\r\n else {\r\n\r\n let canvasChart = $(\".canvasChart\", chartVM.$context);\r\n let chartResize = function (e) {\r\n if (canvasChart.length > 0) {\r\n let offSet = canvasChart.offset();\r\n let windowHeight = $(window).height();\r\n let calculatedHeight = windowHeight - offSet.top - 5;\r\n\r\n let widgetResultDiv = canvasChart.closest(\"div.widget-result\");\r\n if (widgetResultDiv.length > 0) {\r\n calculatedHeight = widgetResultDiv.height() - 5;\r\n\r\n let divOptionsChart = $(\".chartMainOptionsContainer\", chartVM.$context);\r\n\r\n if (divOptionsChart.hasClass(\"show\")) {\r\n let divOptionsChartHeight = divOptionsChart.outerHeight(true);\r\n calculatedHeight -= divOptionsChartHeight;\r\n }\r\n }\r\n\r\n if (calculatedHeight > 0) {\r\n canvasChart.height(calculatedHeight);\r\n if (e) {\r\n chartService.renderChart(canvasChart);\r\n }\r\n }\r\n }\r\n }\r\n\r\n chartResize(null);\r\n chartResize = irGlobal.debounce(chartResize);\r\n new ResizeObserver(chartResize).observe(canvasChart.closest(\".chartMainContainer\")[0]);\r\n\r\n var knockoutContext = $(\".chartMainContainer\", $context)[0];\r\n var chartDesignerVM = new chartDesigner.ChartDesignerViewModel(chartVM, widgetViewModel);\r\n ko.applyBindings(chartDesignerVM, knockoutContext);\r\n\r\n ($(\"input[type=color]\", $context) as any).spectrum({\r\n type: \"color\",\r\n hideAfterPaletteSelect: \"true\",\r\n showInitial: true,\r\n showInput: true,\r\n showAlpha: false,\r\n allowEmpty: true,\r\n appendTo: \"parent\",\r\n change: function (color) {\r\n $(this).attr(\"value\", color !== null ? color.toHexString() : \"#ffffff\");\r\n $(this).val(color !== null ? color.toHexString() : \"#ffffff\");\r\n }\r\n });\r\n\r\n var showHideChartOptions = function () {\r\n if ($(\"#showChartOptions\", $context).prop('checked'))\r\n chartDesignerVM.showChartOptions();\r\n else\r\n chartDesignerVM.hideChartOptions();\r\n };\r\n\r\n var showHideChartOptionsWidget = function () {\r\n let container = $(\".chartMainOptionsContainer\", $context);\r\n if (container.hasClass(\"show\"))\r\n chartDesignerVM.hideChartOptions();\r\n else\r\n chartDesignerVM.showChartOptions();\r\n };\r\n\r\n chartVM.showHideChartOptionsWidget = showHideChartOptionsWidget;\r\n\r\n $(\"#showChartOptions\", $context).off(\"change\", showHideChartOptions).on(\"change\", showHideChartOptions);\r\n $(\"button.showChartOptionsWidget\", $context).off(\"click\").on(\"click\", showHideChartOptionsWidget);\r\n\r\n //hide collapse div when clicking outside\r\n var collapse = function (event) {\r\n if (!$(event.target).is('.collapser') &&\r\n $(event.target).closest('.collapser').length === 0 &&\r\n !$(event.target).is('.chartGeneralOptions') &&\r\n $(event.target).closest('.chartGeneralOptions').length === 0 &&\r\n $(event.target).closest(\"#designContainer\").length === 0) {\r\n chartDesigner.hideChartOptions($context);\r\n }\r\n }\r\n\r\n //Prevent dropdown for options to close\r\n $('.preventDefaultClick .dropdown-menu', $context).off('focus click blur').on('focus click blur', function (event) {\r\n $(this).parent().is(\".open\") && event.stopPropagation();\r\n collapse(event);\r\n });\r\n\r\n chartDesigner.chartButtonChange($context, updateChartTypeCallback);\r\n\r\n //hide collapse div when clicking outside\r\n $(document).off(\"click\", collapse).on(\"click\", collapse);\r\n $(\".dropdown-toggle\").off(\"click\", collapse).on(\"click\", collapse);\r\n\r\n chartDesignerVM.hideChartOptions(null, {});\r\n\r\n reportSettings.setup($context, chartDesignerVM, \"Chart\", false);\r\n }\r\n\r\n setupChart($context, chartVM);\r\n }\r\n\r\n function prepareDataSource(chartVM: ChartVM, chartDefinition, metricFields) {\r\n if (chartVM.dataSource) {\r\n return chartVM.dataSource;\r\n }\r\n\r\n let result = chartVM.jsonData.result;\r\n let jsonData = chartVM.jsonData;\r\n let hasGroup = chartVM.hasGrouping;\r\n\r\n const zeroPad = (num, places) => String(num).padStart(places, '0');\r\n const stringfy = (value, stringSize = 100) => {\r\n let type = typeof value;\r\n if (type === \"number\" || type === \"bigint\") {\r\n return zeroPad(value, 15);\r\n }\r\n else {\r\n return value?.toString().padEnd(stringSize, ' ').substring(0, stringSize);\r\n }\r\n };\r\n\r\n let newResult = [];\r\n\r\n if (result) {\r\n\r\n for (const data of result) {\r\n \r\n let obj = {} as any;\r\n //map all fields indexes to queryName\r\n for (const field of jsonData.fieldNames) {\r\n let value = data[field.index];\r\n obj[field.queryName] = value;\r\n }\r\n\r\n //map xArgument - all argument fields concatenated\r\n for (const field of chartDefinition.xAxisFields) {\r\n let value = data[field.index];\r\n if (value && typeof value === \"string\") {\r\n value = value.replace(//g, \"\");\r\n }\r\n\r\n if (!field.visible) {\r\n continue;\r\n }\r\n\r\n if (obj.xArgument === undefined) {\r\n obj.xArgument = \"\";\r\n obj.xArgumentSort = \"\";\r\n }\r\n else {\r\n obj.xArgument += `${jsonData.columnSeparator}`;\r\n obj.xArgumentSort += \"|\";\r\n }\r\n\r\n if (field.autoGrouping > 2 && field.autoGrouping !== 6) {\r\n let output = report.getAutoGroupingText(value, field.autoGrouping, jsonData.dateFormat, jsonData.dateSeparator, jsonData.weekStartDay);\r\n obj.xArgument += `${output}`;\r\n obj.xArgumentSort += stringfy(value);\r\n }\r\n else {\r\n if (field.dataType === 3 && field.autoGrouping <= 2) {\r\n if (value) {\r\n obj.xArgument += moment(value.split('T')[0], 'YYYY-MM-DD').format(jsonData.dateFormat);\r\n obj.xArgumentSort += stringfy(obj.xArgument, 10);\r\n }\r\n }\r\n else {\r\n obj.xArgument += `${value !== null && value !== undefined ? value : \"\"}`;\r\n obj.xArgumentSort += stringfy(obj.xArgument);\r\n }\r\n }\r\n }\r\n\r\n //map xGroupArgument - all argument group fields concatenated\r\n if (hasGroup) {\r\n \r\n for (const groupField of jsonData.groupFields) {\r\n let field = groupField.fieldName;\r\n if (!field.field.visible) {\r\n continue;\r\n }\r\n\r\n let value = data[field.index];\r\n if (value && typeof value === \"string\") {\r\n value = value.replace(//g, \"\");\r\n }\r\n\r\n if (obj.xGroupArgument === undefined) {\r\n obj.xGroupArgument = \"\";\r\n obj.xGroupArgumentSort = \"\";\r\n }\r\n else {\r\n obj.xGroupArgument += `${jsonData.columnSeparator}`;\r\n obj.xGroupArgumentSort += \"|\";\r\n }\r\n\r\n if (field.autoGrouping > 2 && field.autoGrouping !== 6) {\r\n let output = report.getAutoGroupingText(value, field.autoGrouping, jsonData.dateFormat, jsonData.dateSeparator, jsonData.weekStartDay);\r\n obj.xGroupArgument += `${output}`;\r\n obj.xGroupArgumentSort += stringfy(value);\r\n }\r\n else {\r\n if (field.dataType === 3 && field.autoGrouping <= 2) {\r\n if (value) {\r\n obj.xGroupArgument += moment(value.split('T')[0], 'YYYY-MM-DD').format(jsonData.dateFormat);\r\n obj.xGroupArgumentSort += stringfy(obj.xGroupArgument, 10);\r\n }\r\n }\r\n else {\r\n obj.xGroupArgument += `${value !== null && value !== undefined ? value : \"\"}`;\r\n obj.xGroupArgumentSort += stringfy(obj.xGroupArgument);\r\n }\r\n }\r\n }\r\n }\r\n\r\n newResult.push(obj);\r\n }\r\n\r\n if (hasGroup) {\r\n\r\n let valueSeries = [];\r\n let index = {};\r\n\r\n for (const data of newResult) {\r\n if (!index[data.xArgument]) {\r\n index[data.xArgument] = 1;\r\n valueSeries.push({\r\n xArgument: data.xArgument,\r\n xArgumentSort: data.xArgumentSort,\r\n });\r\n }\r\n };\r\n\r\n valueSeries.sort((a: any, b: any) => {\r\n if (a.xArgumentSort < b.xArgumentSort) {\r\n return -1;\r\n }\r\n if (a.xArgumentSort > b.xArgumentSort) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n chartVM.groupSerieValues = valueSeries;\r\n for (const data of newResult) {\r\n for (const metricField of metricFields) {\r\n for (const value of valueSeries) {\r\n try {\r\n data[`${metricField.queryName}_group_${value.xArgument}`] = data.xArgument === value.xArgument ? data[metricField.queryName] : undefined;\r\n } catch (error) {\r\n console.error(error);\r\n throw new Error(error);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n chartVM.jsonData.result = newResult;\r\n chartVM.dataSource = new DevExpress.data.DataSource({\r\n store: chartVM.jsonData.result,\r\n paginate: false,\r\n });\r\n\r\n return chartVM.dataSource;\r\n }\r\n\r\n function setupChart($context, chartVM: ChartVM) {\r\n\r\n let result = chartVM.jsonData.result;\r\n let jsonData = chartVM.jsonData;\r\n\r\n const yAxisFields = chartVM.chartDefinition.yAxisFields;\r\n const xAxisFields = chartVM.chartDefinition.xAxisFields;\r\n let chartDefinition = ko.toJS(chartVM.chartDefinition);\r\n let metricFields = ko.toJS(yAxisFields);\r\n\r\n for (const field of chartDefinition.xAxisFields) {\r\n field.index = jsonData.fieldNames.find(x => x.queryName === field.queryName).index;\r\n }\r\n\r\n let hasGroup = jsonData.groupFields?.length > 0;\r\n if (hasGroup) {\r\n for (const field of jsonData.groupFields) {\r\n let fieldName = jsonData.fieldNames.find(x => x.queryName === field.name);\r\n field.fieldName = fieldName;\r\n }\r\n }\r\n\r\n let dataSource = prepareDataSource(chartVM, chartDefinition, metricFields);\r\n\r\n let chartType = chartService.dxChartType[chartDefinition.chartType];\r\n let $canvas = $context.find(\".canvasChart\");\r\n\r\n getChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM, $canvas);\r\n }\r\n\r\n function getChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM: ChartVM, $canvas) {\r\n\r\n chartVM.mixedChartType(chartDefinition.chartType === ChartType.Mixed);\r\n //horizontal: ko.observable(false),\r\n let generateAxes = !(chartDefinition.chartType === ChartType.Donut || chartDefinition.chartType === ChartType.Pie || chartDefinition.chartType === ChartType.Polar || chartDefinition.chartType === ChartType.RadarArea);\r\n chartVM.generateAxes(generateAxes);\r\n\r\n let allowColorPerSerie = !chartVM.hasGrouping && chartType !== \"pie\" && chartType !== \"polarArea\";\r\n chartVM.allowColorPerSerie(allowColorPerSerie);\r\n\r\n if (chartDefinition.chartType === ChartType.Pie || chartDefinition.chartType === ChartType.Donut) {\r\n //let chartOptions = getPieChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM);\r\n let chartOptions = getRegularChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM);\r\n chartService.disposeChart($canvas, \"dxPieChart\");\r\n if (!$canvas.data(\"dxPieChart\")) {\r\n $canvas.dxPieChart(chartOptions);\r\n }\r\n else {\r\n $canvas.dxPieChart(\"instance\").option(chartOptions);\r\n $canvas.dxPieChart(\"instance\").option(\"commonSeriesSettings.label.backgroundColor\", chartOptions.commonSeriesSettings.label.backgroundColor);\r\n $canvas.dxPieChart(\"instance\").option(\"commonSeriesSettings.label.font.color\", chartOptions.commonSeriesSettings.label.font.color);\r\n }\r\n }\r\n else {\r\n if (chartDefinition.chartType === ChartType.Polar || chartDefinition.chartType === ChartType.Radar || chartDefinition.chartType === ChartType.RadarArea) {\r\n //let chartOptions = getPolarChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM);\r\n let chartOptions = getRegularChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM) as any;\r\n chartOptions.commonSeriesSettings = {\r\n type: chartDefinition.chartType === ChartType.Polar ? \r\n \"stackedbar\" :\r\n (\r\n chartDefinition.chartType === ChartType.Radar ? \r\n \"line\" :\r\n \"area\"\r\n ),\r\n };\r\n chartService.disposeChart($canvas, \"dxPieChart\");\r\n if (!$canvas.data(\"dxPolarChart\")) {\r\n $canvas.dxPolarChart(chartOptions);\r\n }\r\n else {\r\n $canvas.dxPolarChart(\"instance\").option(chartOptions);\r\n $canvas.dxPolarChart(\"instance\").option(\"commonSeriesSettings.label.backgroundColor\", chartOptions.commonSeriesSettings.label.backgroundColor);\r\n $canvas.dxPolarChart(\"instance\").option(\"commonSeriesSettings.label.font.color\", chartOptions.commonSeriesSettings.label.font.color);\r\n }\r\n }\r\n else {\r\n let chartOptions = getRegularChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM) as any;\r\n chartService.disposeChart($canvas, \"dxChart\");\r\n if (!$canvas.data(\"dxChart\")) {\r\n $canvas.dxChart(chartOptions);\r\n }\r\n else {\r\n $canvas.dxChart(\"instance\").option(chartOptions);\r\n $canvas.dxChart(\"instance\").option(\"commonSeriesSettings.label.backgroundColor\", chartOptions.commonSeriesSettings.label.backgroundColor);\r\n $canvas.dxChart(\"instance\").option(\"commonSeriesSettings.label.font.color\", chartOptions.commonSeriesSettings.label.font.color);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function createSerie(chartType, metricField, chartVM: ChartVM, chartDefinition, argumentField, sizeFieldName, formatType, groupSerieValue = \"\") {\r\n let currencyCode = chartVM.jsonData.currencyCode;\r\n\r\n let serieType = chartDefinition.chartType === ChartType.Mixed ? metricField.yAxisChartDefinition.chartType : chartDefinition.chartType;\r\n\r\n let serie = {\r\n type: chartDefinition.chartType === ChartType.Mixed ? chartService.dxChartType[metricField.yAxisChartDefinition.chartType] : chartType,\r\n valueField: metricField.queryName + (chartVM.hasGrouping ? `_group_${groupSerieValue}` : \"\"),\r\n stack: 'G' + metricField.yAxisChartDefinition.stackGroup,\r\n axis: metricField.yAxisChartDefinition.yAxisID === \"y-left\" ? \"left\" : \"right\",\r\n //cornerRadius: 6,\r\n name: metricField.displayName + (chartVM.hasGrouping ? \" \" + groupSerieValue : \"\"),\r\n color: chartVM.allowColorPerSerie() && chartDefinition.colorPerSerie && metricField.color.toUpperCase() !== \"#FFFFFF\" ? metricField.color : undefined,\r\n argumentField: argumentField,\r\n sizeField: sizeFieldName,\r\n label: {\r\n //alignment: \"center\", //HorizontalAlignment: center, left, right\r\n //showForZeroValues: false,\r\n //visible: true\r\n //argumentFormat:\r\n //backgroundColor:\r\n //border\r\n //connector\r\n //customizeText\r\n //displayFormat: \"{seriesName}: {valueText}\",\r\n //displayFormat: labelDisplayFormat,\r\n format: {\r\n style: formatType,\r\n currency: currencyCode,\r\n currencyDisplay: \"narrowSymbol\",\r\n precision: chartDefinition.labelDecimalPlaces === -1 ? metricField.metricFormat.decimalPlaces : chartDefinition.labelDecimalPlaces,\r\n currencySign: metricField.metricFormat.accountingStyle ? \"accounting\" : \"standard\",\r\n largerNumber: chartDefinition.labelFormat,\r\n },\r\n //horizontalOffset\r\n //verticalOffset\r\n //position: //'inside' | 'outside'\r\n //rotationAngle\r\n },\r\n point: { visible: true, },\r\n border: {\r\n visible: serieType === ChartType.Bubble || serieType === ChartType.Area || serieType === ChartType.StackedArea,\r\n width: chartDefinition.chartType === ChartType.Bubble ? 1 : 2,\r\n color: chartDefinition.chartType === ChartType.Bubble ? \"#4e4e4e\" : undefined,\r\n },\r\n //ignoreEmptyPoints: false,\r\n tag: metricField,\r\n };\r\n\r\n return serie;\r\n }\r\n\r\n function getSeries(chartType, chartDefinition, dataSource, metricFields, chartVM: ChartVM, leftAxis, rightAxis) {\r\n let series = [];\r\n let currencyCode = chartVM.jsonData.currencyCode;\r\n\r\n let argumentField = chartVM.jsonData.groupFields?.length > 0 ? \"xGroupArgument\" : \"xArgument\";\r\n\r\n if (chartDefinition.chartType === ChartType.Scatter) {\r\n let xField = metricFields.find(x => x.yAxisChartDefinition.scatterType === BubbleScatterType.XAxis);\r\n if (xField) {\r\n argumentField = xField.queryName;\r\n }\r\n }\r\n\r\n var sizeFieldName = undefined;\r\n if (chartDefinition.chartType === ChartType.Bubble) {\r\n let xField = metricFields.find(x => x.yAxisChartDefinition.bubbleType === BubbleScatterType.XAxis);\r\n if (xField) {\r\n argumentField = xField.queryName;\r\n }\r\n\r\n let sizeField = metricFields.find(x => x.yAxisChartDefinition.bubbleType === BubbleScatterType.BubbleSize);\r\n if (sizeField) {\r\n sizeFieldName = sizeField.queryName;\r\n }\r\n }\r\n\r\n for (const metricField of metricFields) {\r\n if (metricField.visible) {\r\n if (metricField.yAxisChartDefinition.yAxisID === \"y-left\") {\r\n leftAxis.visible = true;\r\n if (chartDefinition.showMetricsYAxis) {\r\n if (leftAxis.title.text !== \"\") {\r\n leftAxis.title.text += \", \";\r\n }\r\n leftAxis.title.text += metricField.displayName;\r\n }\r\n }\r\n else {\r\n rightAxis.visible = true;\r\n if (chartDefinition.showMetricsYAxis) {\r\n if (rightAxis.title.text !== \"\") {\r\n rightAxis.title.text += \", \";\r\n }\r\n rightAxis.title.text += metricField.displayName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!chartVM.hasGrouping) {\r\n for (const metricField of metricFields) {\r\n let type = metricField.metricFormat.format == FieldFormatEnum.Currency ? \"currency\" : (metricField.metricFormat.format == FieldFormatEnum.Percentage ? \"percent\" : \"decimal\");\r\n\r\n metricField.tooltipFormat = {\r\n style: type,\r\n currency: currencyCode,\r\n currencyDisplay: \"narrowSymbol\",\r\n precision: metricField.metricFormat.decimalPlaces,\r\n currencySign: metricField.metricFormat.accountingStyle ? \"accounting\" : \"standard\",\r\n };\r\n\r\n if (metricField.visible) {\r\n let serie = createSerie(chartType, metricField, chartVM, chartDefinition, argumentField, sizeFieldName, type);\r\n series.push(serie)\r\n }\r\n }\r\n }\r\n else {\r\n for (const groupSerieValue of chartVM.groupSerieValues) {\r\n for (const metricField of metricFields) {\r\n let type = metricField.metricFormat.format == FieldFormatEnum.Currency ? \"currency\" : (metricField.metricFormat.format == FieldFormatEnum.Percentage ? \"percent\" : \"decimal\");\r\n\r\n metricField.tooltipFormat = {\r\n style: type,\r\n currency: currencyCode,\r\n currencyDisplay: \"narrowSymbol\",\r\n precision: metricField.metricFormat.decimalPlaces,\r\n currencySign: metricField.metricFormat.accountingStyle ? \"accounting\" : \"standard\",\r\n };\r\n\r\n if (metricField.visible) {\r\n let serie = createSerie(chartType, metricField, chartVM, chartDefinition, argumentField, sizeFieldName, type, groupSerieValue.xArgument);\r\n series.push(serie);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return series;\r\n }\r\n\r\n function customizeTooltip(arg, chartVM: ChartVM, chartDefinition, xMetric, bubbleSizeMetric) {\r\n let argumentText = chartDefinition.chartType === ChartType.Scatter || chartDefinition.chartType === ChartType.Bubble ?\r\n (chartVM.hasGrouping ? arg.point.data.xGroupArgument : arg.point.data.xArgument) : arg.argumentText;\r\n\r\n let tooltipFormat = arg.point.series.tag.tooltipFormat;\r\n\r\n let valueText = DevExpress.localization.formatNumber(arg.value, tooltipFormat);\r\n\r\n let text = `${argumentText}
${arg.seriesName}: ${valueText}`;\r\n let backgroundColor = arg.point.getColor();\r\n text = `` + text;\r\n\r\n if (chartVM.hasGrouping) {\r\n text += `
${arg.point.data.xArgument}`;\r\n }\r\n\r\n if (chartDefinition.chartType === ChartType.StackedBar || chartDefinition.chartType === ChartType.HorizontalBarStacked || chartDefinition.chartType === ChartType.StackedArea) {\r\n text += `
Percent: ${arg.percentText}`;\r\n let totalText = DevExpress.localization.formatNumber(arg.total, tooltipFormat);\r\n text += `
Total: ${totalText}`;\r\n }\r\n if (chartDefinition.chartType === ChartType.Pie || chartDefinition.chartType === ChartType.Donut) {\r\n text += `
Percent: ${arg.percentText}`;\r\n }\r\n if (chartDefinition.chartType === ChartType.Scatter) {\r\n let xMetricValueText = DevExpress.localization.formatNumber(arg.point.data[xMetric.queryName], xMetric.tooltipFormat);\r\n text += `
${xMetric.displayName}: ${xMetricValueText}`;\r\n }\r\n if (chartDefinition.chartType === ChartType.Bubble) {\r\n if (xMetric) {\r\n let xMetricValueText = DevExpress.localization.formatNumber(arg.point.data[xMetric.queryName], xMetric.tooltipFormat);\r\n text += `
${xMetric.displayName}: ${xMetricValueText}`;\r\n }\r\n let bubbleSizeValueText = DevExpress.localization.formatNumber(arg.point.data[bubbleSizeMetric.queryName], bubbleSizeMetric.tooltipFormat);\r\n text += `
${bubbleSizeMetric.displayName}: ${bubbleSizeValueText}`;\r\n }\r\n\r\n return {\r\n html: text,\r\n };\r\n }\r\n\r\n function customizeLabelText(arg, chartVM: ChartVM, chartDefinition) {\r\n let text = \"\";\r\n\r\n if (chartDefinition.labelShowElement) {\r\n if (chartVM.hasGrouping)\r\n text = `${arg.point.data.xGroupArgument}`;\r\n else\r\n text = `${arg.point.data.xArgument}`;\r\n }\r\n\r\n if (chartVM.hasGrouping && chartDefinition.labelShowGroupingElement) {\r\n if (text !== \"\") {\r\n text += \"
\";\r\n }\r\n text += `${arg.point.data.xArgument}`;\r\n }\r\n\r\n if (chartDefinition.labelShowMetricName) {\r\n if (text !== \"\") {\r\n text += \"
\";\r\n }\r\n text += `${arg.seriesName}`;\r\n }\r\n\r\n if (chartDefinition.labelShowValue) {\r\n if (text !== \"\") {\r\n text += \"
\";\r\n }\r\n text += `${arg.valueText}`;\r\n }\r\n\r\n return text;\r\n }\r\n\r\n function getFirstYAxisField(bubbleScatterType: BubbleScatterType, chartVM: ChartVM, metricFields, typeField: string = \"bubbleType\") {\r\n let field = chartVM.chartDefinition.yAxisFields.find(x => x.yAxisChartDefinition[typeField]() === BubbleScatterType.YAxis && !x.visible());\r\n if (field) {\r\n field.yAxisChartDefinition[typeField](bubbleScatterType);\r\n }\r\n else {\r\n let fields = chartVM.chartDefinition.yAxisFields.filter(x => x.yAxisChartDefinition[typeField]() === BubbleScatterType.YAxis);\r\n if (fields.length >= 2) {\r\n field = fields[1];\r\n field.yAxisChartDefinition[typeField](bubbleScatterType);\r\n }\r\n else {\r\n field = undefined;\r\n }\r\n }\r\n\r\n let planField = undefined;\r\n if (field) {\r\n planField = metricFields.find(x => x.queryName === field.queryName);\r\n planField.yAxisChartDefinition[typeField] = bubbleScatterType;\r\n }\r\n return planField;\r\n }\r\n\r\n function getRegularChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM: ChartVM) {\r\n let series = [];\r\n\r\n let xMetric = undefined;\r\n let bubbleSizeMetric = undefined;\r\n\r\n if (chartDefinition.chartType === ChartType.Bubble) {\r\n xMetric = metricFields.find(x => x.yAxisChartDefinition.bubbleType === BubbleScatterType.XAxis);\r\n if (!xMetric) {\r\n xMetric = getFirstYAxisField(BubbleScatterType.XAxis, chartVM, metricFields);\r\n }\r\n\r\n bubbleSizeMetric = metricFields.find(x => x.yAxisChartDefinition.bubbleType === BubbleScatterType.BubbleSize);\r\n if (!bubbleSizeMetric) {\r\n bubbleSizeMetric = getFirstYAxisField(BubbleScatterType.BubbleSize, chartVM, metricFields);\r\n }\r\n }\r\n else {\r\n if (chartDefinition.chartType === ChartType.Scatter) {\r\n xMetric = metricFields.find(x => x.yAxisChartDefinition.scatterType === BubbleScatterType.XAxis);\r\n if (!xMetric) {\r\n xMetric = getFirstYAxisField(BubbleScatterType.XAxis, chartVM, metricFields, \"scatterType\");\r\n }\r\n }\r\n }\r\n\r\n let leftAxis = {\r\n visible: false,\r\n title: {\r\n text: \"\",\r\n font: {\r\n size: 12,\r\n },\r\n },\r\n };\r\n\r\n let rightAxis = {\r\n visible: false,\r\n title: {\r\n text: \"\",\r\n font: {\r\n size: 12,\r\n }\r\n },\r\n };\r\n\r\n series = getSeries(chartType, chartDefinition, dataSource, metricFields, chartVM, leftAxis, rightAxis);\r\n\r\n let valueAxis = [];\r\n\r\n if (leftAxis.visible) {\r\n valueAxis.push({\r\n name: 'left',\r\n position: 'left',\r\n //showZero: true,\r\n synchronizedValue: 0,\r\n title: leftAxis.title,\r\n maxValueMargin: chartDefinition.axisValueMargin,\r\n minValueMargin: chartDefinition.axisValueMargin,\r\n });\r\n }\r\n\r\n if (rightAxis.visible) {\r\n valueAxis.push({\r\n name: 'right',\r\n position: 'right',\r\n //showZero: true,\r\n synchronizedValue: 0,\r\n title: rightAxis.title,\r\n maxValueMargin: chartDefinition.axisValueMargin,\r\n minValueMargin: chartDefinition.axisValueMargin,\r\n });\r\n }\r\n\r\n let chartOptions = {\r\n palette: chartService.getColorsOfTheme(chartDefinition.colorTheme),\r\n rotated: chartDefinition.chartType === ChartType.HorizontalBar || chartDefinition.chartType === ChartType.HorizontalBarStacked,\r\n dataSource: dataSource,\r\n redrawOnResize: true,\r\n //title: ' ',\r\n argumentAxis: {\r\n //tickInterval: 10,\r\n label: {\r\n displayMode: chartDefinition.axisLabelDisplayMode.toLowerCase(), // \"rotate\" | \"stagger\",\r\n rotationAngle: chartDefinition.axisLabelAngle,\r\n indentFromAxis: 5,\r\n overlappingBehavior: \"rotate\",\r\n },\r\n title: {\r\n text: chartDefinition.showMetricsYAxis && (chartDefinition.chartType === ChartType.Scatter || chartDefinition.chartType === ChartType.Bubble) ? xMetric?.displayName : undefined,\r\n font: {\r\n size: 12,\r\n },\r\n },\r\n },\r\n tooltip: {\r\n enabled: true,\r\n shared: false,\r\n zIndex: 120,\r\n customizeTooltip: function(arg) {\r\n return customizeTooltip(arg, chartVM, chartDefinition, xMetric, bubbleSizeMetric);\r\n },\r\n },\r\n valueAxis: valueAxis,\r\n series: series,\r\n legend: chartService.getLegendOptions(chartDefinition.legendPosition),\r\n commonSeriesSettings: {\r\n label: {\r\n //https://js.devexpress.com/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/#maxValueMargin \r\n alignment: chartDefinition.labelAlign === \"start\" ? \"right\" : (chartDefinition.labelAlign === \"end\" ? \"left\" : chartDefinition.labelAlign), // \"center\", //HorizontalAlignment: center, left, right\r\n //argumentFormat:\r\n backgroundColor: chartDefinition.labelApplyBackgroundColor ? undefined : \"none\",\r\n font: {\r\n color: !chartDefinition.labelFontColor ? undefined : chartDefinition.labelFontColor,\r\n } as any,\r\n //border\r\n connector: {\r\n visible: chartDefinition.labelConnector,\r\n },\r\n //horizontalOffset\r\n //verticalOffset\r\n position: chartDefinition.labelPosition,\r\n customizeText: function (arg) {\r\n return customizeLabelText(arg, chartVM, chartDefinition);\r\n },\r\n rotationAngle: chartDefinition.labelRotationAngle,\r\n showForZeroValues: false,\r\n visible: chartDefinition.labelVisibility,\r\n //point: { visible: true, },\r\n //border: { visible: true, width: 2, }\r\n },\r\n },\r\n resolveLabelOverlapping: chartDefinition.labelOverlapping,\r\n useSpiderWeb: chartDefinition.chartType === ChartType.Radar || chartDefinition.chartType === ChartType.RadarArea,\r\n onPointClick: function (arg) {\r\n if (chartVM.fromPDF) {\r\n return;\r\n }\r\n\r\n chartService.onDrillDown(arg, chartVM);\r\n },\r\n animation: {\r\n enabled: !chartVM.fromPDF,\r\n },\r\n zoomAndPan: {\r\n argumentAxis: \"both\", // or \"zoom\" | \"pan\" | \"none\"\r\n //valueAxis: \"both\", // or \"zoom\" | \"pan\" | \"none\"\r\n dragToZoom: true,\r\n },\r\n onZoomEnd: function (e) {\r\n if (e.actionType === \"zoom\") {\r\n e.component.option(\"scrollBar.visible\", e.zoomFactor !== 1);\r\n }\r\n }\r\n };\r\n\r\n return chartOptions;\r\n }\r\n\r\n function getPieChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM: ChartVM) {\r\n //\"doughnut\", //dxPieChart\r\n // \"pie\", //dxPieChart\r\n\r\n let chartOptions = {\r\n };\r\n return chartOptions;\r\n }\r\n\r\n function getPolarChartOptions(chartType, chartDefinition, dataSource, metricFields, chartVM: ChartVM) {\r\n //\"\", //polar dxPolarChart\r\n // \"\", //radar dxPolarChart\r\n // \"\", //radar area dxPolarChart\r\n\r\n let chartOptions = {\r\n };\r\n return chartOptions;\r\n }\r\n\r\n var setup = function (fromPDF, $context, addFilterCallback, updateChartTypeCallback, widgetViewModel) {\r\n if ($context.length === 0)\r\n return;\r\n\r\n var $result = $context.find(\"div.chartResult\");\r\n if ($result.length === 0)\r\n return;\r\n\r\n var jsonData = $result.data(\"json\");\r\n\r\n basicSetup(jsonData, fromPDF, $context, widgetViewModel, updateChartTypeCallback);\r\n }\r\n\r\n var addChartPlot = function (chartElements, jsonData, addFilterCallback, fromPDF: boolean = false, updateChartTypeCallback: Function = null, widgetViewModel = null) {\r\n chartElements = $(chartElements);\r\n $.each(chartElements, function (index, chartElement) {\r\n setup(fromPDF, $(chartElement), addFilterCallback, updateChartTypeCallback, widgetViewModel);\r\n });\r\n };\r\n\r\n return {\r\n setup: setup,\r\n addChartPlot: addChartPlot,\r\n log,\r\n popStatus,\r\n pushStatus,\r\n getStatus,\r\n createChart,\r\n };\r\n\r\n}());\r\n","var chartDesigner = function () {\r\n\r\n //verify if it is used\r\n function chartButtonChange($context, changeCallback) {\r\n var chartButtons = $(\"div#ChartTypeProperties\", $context);\r\n var buttons = $(\"button\", chartButtons);\r\n\r\n buttons.off(\"click\").on(\"click\",\r\n function (evt) {\r\n var currentButton = $(evt.currentTarget);\r\n var parentElement = $(\"div.chartbuttongroup\", $context);\r\n\r\n if (currentButton.hasClass(\"notselected\")) {\r\n var chartTypeId = currentButton.data(\"chart\");\r\n $(\"input\", parentElement).prop(\"checked\", false);\r\n $(\"button\", parentElement).removeClass(\"selected\").addClass(\"notselected\");\r\n $(\"input[name=chartTypeRadio][value=\" + chartTypeId + \"]\").prop(\"checked\", true);\r\n currentButton.removeClass(\"notselected\").addClass(\"selected\");\r\n if (changeCallback) {\r\n changeCallback(evt, chartTypeId);\r\n }\r\n }\r\n return;\r\n });\r\n };\r\n\r\n function hideChartOptions($context) {\r\n var panel = $('.chartGeneralOptions', $context);\r\n if (panel.length > 0 && panel.css(\"display\") !== \"none\") {\r\n panel.find(\".well\").addClass([\"animate__animated\", \"animate__fadeOut\"]);\r\n panel.find(\".well\").off().on('animationend', () => {\r\n panel.css(\"display\", \"none\");\r\n panel.find(\".well\").removeClass([\"animate__animated\", \"animate__fadeOut\"]);\r\n });\r\n }\r\n }\r\n\r\n function saveChartDefinition(chartVM: ChartVM) {\r\n if (!general)\r\n return;\r\n\r\n //set AxisFields to null, to reduce serialization size. \r\n const yAxisFields = chartVM.chartDefinition.yAxisFields;\r\n const xAxisFields = chartVM.chartDefinition.xAxisFields;\r\n chartVM.chartDefinition.yAxisFields = null;\r\n chartVM.chartDefinition.xAxisFields = null;\r\n\r\n let inputModel = {\r\n chartDefinition: irGlobal.jsonStringfy(ko.toJS(chartVM.chartDefinition)),\r\n metricFields: irGlobal.jsonStringfy(ko.toJS(yAxisFields)),\r\n widgetId: chartVM.jsonData.widgetId,\r\n tabId: chartVM.jsonData.tabId,\r\n workbookId: chartVM.jsonData.workbookId,\r\n mappingId: chartVM.jsonData.mappingId,\r\n }\r\n\r\n //set back the yAxisFields and xAxisFields\r\n chartVM.chartDefinition.yAxisFields = yAxisFields;\r\n chartVM.chartDefinition.xAxisFields = xAxisFields;\r\n\r\n let baseUrl = chartVM.jsonData.widgetId ? urlConfigs.dashboard : urlConfigs.workBook;\r\n\r\n irGlobal.updateFromServer(undefined,\r\n baseUrl + \"SaveChartDefinition\",\r\n inputModel,\r\n null,\r\n null,\r\n true,\r\n \"POST\",\r\n false,\r\n undefined,\r\n true);\r\n }\r\n\r\n function setChartSettings(chartVM: ChartVM, creating: boolean = false) {\r\n let chartHeight = \"100%\";\r\n let divOptionsChart = $(\".chartMainOptionsContainer\", chartVM.$context);\r\n let canvasChart = $(\".canvasChart\", chartVM.$context);\r\n\r\n let divOptionsChartHeight = 0;\r\n let pixelHeight = 0;\r\n if (divOptionsChart.hasClass(\"show\")) {\r\n divOptionsChartHeight = Math.round(divOptionsChart.outerHeight(true));\r\n let canvasChartHeight = Math.round(canvasChart.outerHeight(true));\r\n pixelHeight = canvasChartHeight - divOptionsChartHeight;\r\n if (chartVM.$context.hasClass(\"dashboardWidget\")) {\r\n chartHeight = `calc(100% - ${divOptionsChartHeight}px)`;\r\n }\r\n else {\r\n if (creating) {\r\n chartHeight = chartVM.$canvas.closest(\".canvasChart\").height() + \"px\";\r\n }\r\n else {\r\n chartHeight = (chartVM.$canvas.closest(\".canvasChart\").height() - divOptionsChartHeight) + \"px\";\r\n chartVM.$canvas.closest(\".canvasChart\").attr(\"oldheight\", chartVM.$canvas.closest(\".canvasChart\").height() + \"px\");\r\n }\r\n }\r\n }\r\n else {\r\n if (!chartVM.$context.hasClass(\"dashboardWidget\")) {\r\n //We can not set 100% because the height(px) was not defined in any previous element\r\n chartHeight = chartVM.$canvas.closest(\".canvasChart\").attr(\"oldheight\");\r\n if (!chartHeight)\r\n chartHeight = \"100%\";\r\n }\r\n }\r\n\r\n canvasChart.css(\"height\", chartHeight);\r\n chartService.renderChart(canvasChart);\r\n }\r\n\r\n function ChartDesignerViewModel(chartVM: ChartVM, widgetViewModel: any) {\r\n var self = this;\r\n\r\n chartVM.chartDesignerVM = self;\r\n\r\n self.colorThemes = [];\r\n self.chartVM = chartVM;\r\n\r\n //For widget designer\r\n if (widgetViewModel) {\r\n self.tabsOptions = widgetViewModel.tabsOptions;\r\n self.tab = widgetViewModel.tab;\r\n }\r\n else {\r\n self.tabsOptions = undefined;\r\n self.tab = 0;\r\n }\r\n\r\n chartService.colorThemes.forEach(colorTheme => {\r\n var option = { id: colorTheme.id, content: `${colorTheme.id}
` };\r\n colorTheme.colors.forEach(color => {\r\n option.content += '
';\r\n });\r\n option.content += \"
\";\r\n self.colorThemes.push(option);\r\n });\r\n\r\n let disableBubble = chartVM.chartDefinition.yAxisFields.length < 3;\r\n let disableBubbleMessage = disableBubble ? \"Need at least three Metrics\" : \"Define the X-Axis and Bubble Size in the Metrics\";\r\n let disableScatter = chartVM.chartDefinition.yAxisFields.length < 2;\r\n let disableScatterMessage = disableBubble ? \"Need at least two Metrics\" : \"Define the X-Axis in the Metrics\";\r\n self.chartTypes = [\r\n new ChartTypeItem(\"Line\", \"Content/charts/line.svg\", \"Line\"),\r\n new ChartTypeItem(\"StackedArea\", \"Content/charts/stackedarea.svg\", \"Stacked Area\"),\r\n new ChartTypeItem(\"Area\", \"Content/charts/area.svg\", \"Area\"),\r\n new ChartTypeItem(\"Bar\", \"Content/charts/bar.svg\", \"Bar\"),\r\n new ChartTypeItem(\"StackedBar\", \"Content/charts/stackedbar.svg\", \"Stacked Bar\"),\r\n new ChartTypeItem(\"Donut\", \"Content/charts/donut.svg\", \"Donut\"),\r\n new ChartTypeItem(\"Pie\", \"Content/charts/pie.svg\", \"Pie\"),\r\n new ChartTypeItem(\"Polar\", \"Content/charts/polar.svg\", \"Polar\"),\r\n new ChartTypeItem(\"Radar\", \"Content/charts/radar.svg\", \"Radar\"),\r\n new ChartTypeItem(\"RadarArea\", \"Content/charts/radararea.svg\", \"Radar Area\"),\r\n new ChartTypeItem(\"HorizontalBar\", \"Content/charts/horizontalbar.svg\", \"Horizontal Bar\"),\r\n new ChartTypeItem(\"HorizontalBarStacked\", \"Content/charts/horizontalbarstacked.svg\", \"Horizontal Bar Stacked\"),\r\n new ChartTypeItem(\"Mixed\", \"Content/charts/mixed.svg\", \"Mixed\", false, \"Define the Chart Type in the Metrics\"),\r\n new ChartTypeItem(\"Scatter\", \"Content/charts/scatter.svg\", \"Scatter\", disableScatter, disableScatterMessage),\r\n new ChartTypeItem(\"Bubble\", \"Content/charts/bubble.svg\", \"Bubble\", disableBubble, disableBubbleMessage)\r\n ];\r\n self.chartTypeSelectBoxOptions = {\r\n itemTemplate(data) {\r\n return `
${data.title()}
`;\r\n },\r\n fieldTemplate(data, container) {\r\n const result = $(`
`);\r\n result\r\n .find('.tb')\r\n .dxTextBox({\r\n value: data && data.title(),\r\n readOnly: true,\r\n disabled: data.disabled(),\r\n hint: data.tooltip(),\r\n });\r\n container.append(result);\r\n }\r\n }\r\n\r\n self.legendPositionSelectBoxOptions = {\r\n itemTemplate(data) {\r\n return `
${data.icon}${data.text}
`;\r\n\r\n },\r\n fieldTemplate(data, container) {\r\n const result = $(`
${data.icon}
`);\r\n result\r\n .find('.tb')\r\n .dxTextBox({\r\n value: data && data.text,\r\n readOnly: true,\r\n });\r\n container.append(result);\r\n }\r\n }\r\n\r\n self.mixedChartTypes = [\r\n new ChartTypeItem(\"Line\", \"Content/charts/line.svg\", \"Line\"),\r\n new ChartTypeItem(\"Area\", \"Content/charts/area.svg\", \"Area\"),\r\n new ChartTypeItem(\"Bar\", \"Content/charts/bar.svg\", \"Bar\"),\r\n ];\r\n\r\n self.bubbleTypes = [\r\n new BubbleScatterTypeItem(BubbleScatterType.YAxis, \"Y-Axis\"),\r\n new BubbleScatterTypeItem(BubbleScatterType.XAxis, \"X-Axis\"),\r\n new BubbleScatterTypeItem(BubbleScatterType.BubbleSize, \"Bubble Size\"),\r\n ];\r\n\r\n self.scatterTypes = [\r\n new BubbleScatterTypeItem(BubbleScatterType.YAxis, \"Y-Axis\"),\r\n new BubbleScatterTypeItem(BubbleScatterType.XAxis, \"X-Axis\"),\r\n ];\r\n\r\n self.yAxisFields = chartVM.chartDefinition.yAxisFields;\r\n\r\n self.colorThemeId = ko.observable(chartVM.chartDefinition.colorTheme);\r\n self.colorTheme = ko.pureComputed({\r\n read: function () {\r\n return self.colorThemeId();\r\n },\r\n write: function (value: number) {\r\n if (typeof (value) === \"number\" && value > 0) {\r\n chartVM.chartDefinition.colorTheme = value;\r\n self.colorThemeId(value);\r\n chart.createChart(chartVM);\r\n }\r\n },\r\n owner: self\r\n });\r\n\r\n self.disableColorPerSerie = ko.pureComputed(function () {\r\n return !chartVM.allowColorPerSerie() || !chartVM.chartDefinition.colorPerSerie();\r\n }, self);\r\n\r\n self.disableColorPerSerie.subscribe(function (value) {\r\n ($(\"input[type=color]\") as any, chartVM.$context).spectrum(!value ? \"enable\" : \"disable\");\r\n });\r\n\r\n self.disableYAxisOptions = ko.computed(function () {\r\n return /*chartVM.horizontal() ||*/ !chartVM.generateAxes();\r\n }, chartVM);\r\n\r\n self.disableColorPerSerieSetting = ko.computed(function () {\r\n return !chartVM.allowColorPerSerie();\r\n }, chartVM);\r\n\r\n self.showMetricsYAxis = ko.computed(function () {\r\n return !chartVM.chartDefinition.showMetricsYAxis();\r\n }, chartVM);\r\n\r\n self.disableMixedOptions = ko.computed(function () {\r\n return !chartVM.mixedChartType();\r\n }, chartVM);\r\n\r\n self.visibleStackGroupOptions = ko.computed(function () {\r\n let stacked = false;\r\n var hasGroupFields = chartVM.jsonData.groupFields && chartVM.jsonData.groupFields.length > 0;\r\n switch (chartVM.chartDefinition.chartType()) {\r\n case \"StackedArea\":\r\n stacked = true;\r\n break;\r\n case \"StackedBar\":\r\n stacked = true;\r\n break;\r\n case \"HorizontalBarStacked\":\r\n stacked = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return !hasGroupFields && stacked;\r\n }, chartVM);\r\n\r\n self.showChartOptions = function (item, evt) {\r\n let settingsTottleButton = $(\"#showChartOptions\", chartVM.$context) as any;\r\n if (evt && settingsTottleButton.length > 0)\r\n settingsTottleButton.bootstrapToggle('on');\r\n else {\r\n //It is necessary to set first the height in pixels and then using calc in order to height and resize both work \r\n $(\".chartMainOptionsContainer\", chartVM.$context).css(\"visibility\", \"visible\");\r\n $(\".chartMainOptionsContainer\", chartVM.$context).slideDown(\"slow\", function () {\r\n $(\".chartMainOptionsContainer\", chartVM.$context).addClass(\"show\");\r\n setChartSettings(chartVM);\r\n });\r\n }\r\n };\r\n\r\n self.hideChartOptions = function (item, evt) {\r\n let settingsTottleButton = $(\"#showChartOptions\", chartVM.$context) as any;\r\n if (evt && settingsTottleButton.length > 0)\r\n settingsTottleButton.bootstrapToggle('off');\r\n else {\r\n $(\".chartMainOptionsContainer\", chartVM.$context).slideUp(\"slow\", function () {\r\n $(\".chartMainOptionsContainer\", chartVM.$context).removeClass(\"show\");\r\n setChartSettings(chartVM);\r\n });\r\n }\r\n };\r\n\r\n self.labelShowItems = [\r\n { name: \"labelShowMetricName\", dataOnOff: \"METRIC\", width: \"55px\", dataBind: chartVM.chartDefinition.labelShowMetricName },\r\n { name: \"labelShowElement\", dataOnOff: \"ELEMENT\", width: \"60px\", dataBind: chartVM.chartDefinition.labelShowElement },\r\n { name: \"labelShowValue\", dataOnOff: \"VALUE\", width: \"50px\", dataBind: chartVM.chartDefinition.labelShowValue },\r\n ];\r\n\r\n if (chartVM.hasGrouping)\r\n self.labelShowItems.push(\r\n { name: \"labelShowGroupingElement\", dataOnOff: \"Grouping Element\", width: \"120px\", dataBind: chartVM.chartDefinition.labelShowGroupingElement });\r\n self.labelAlignOptions = [\r\n { text: \"Left\", id: \"start\", },\r\n { text: \"Center\", id: \"center\", },\r\n { text: \"Right\", id: \"end\", },\r\n ];\r\n self.legendPositions = [\r\n { text: \"None\", value: \"none\", icon: \"horizontal_rule\" },\r\n { text: \"Top\", value: \"top\", icon: \"align_vertical_top\" },\r\n { text: \"Bottom\", value: \"bottom\", icon: \"align_vertical_bottom\" },\r\n { text: \"Left\", value: \"left\", icon: \"align_horizontal_left\" },\r\n { text: \"Right\", value: \"right\", icon: \"align_horizontal_right\" },\r\n ];\r\n self.yAxes = [\r\n { name: \"Left\", value: ko.observable(\"y-left\"), icon: \"glyphicon-indent-left\" },\r\n { name: \"Right\", value: ko.observable(\"y-right\"), icon: \"glyphicon-indent-right\" },\r\n ];\r\n\r\n self.decimalPlacesOptions = [\r\n { value: -1, text: \"Based on Metric\" },\r\n { value: 0, text: \"None(0)\" },\r\n { value: 1, text: \"One(0.0)\" },\r\n { value: 2, text: \"Two(0.00)\" },\r\n { value: 3, text: \"Three(0.000)\" },\r\n { value: 4, text: \"Four(0.0000)\" },\r\n { value: 5, text: \"Five(0.00000)\" }\r\n ];\r\n\r\n self.labelFormatOptions = [\r\n { value: \"Automatic\", text: \"Automatic\" },\r\n { value: \"Normal\", text: \"Normal\" },\r\n { value: \"Thousands\", text: \"Thousands\" },\r\n { value: \"Millions\", text: \"Millions\" },\r\n { value: \"Billions\", text: \"Billions\" }\r\n ];\r\n\r\n self.axisLabelDisplayModeOptions = [\r\n { value: \"Standard\", text: \"Standard\" },\r\n { value: \"Rotate\", text: \"Rotate\" },\r\n { value: \"Stagger\", text: \"Stagger\" },\r\n ];\r\n\r\n self.colorThemeSelectBoxOptions = {\r\n dataSource: chartService.colorThemes,\r\n displayExpr: \"id\",\r\n valueExpr: \"id\",\r\n width: 210,\r\n height: 22,\r\n wrapItemText: true,\r\n value: self.colorTheme,\r\n fieldTemplate: function (data, container) {\r\n var width = Math.floor(180 / data.colors.length);\r\n var content = `
${data.id}
`;\r\n data.colors.forEach(color => {\r\n content += `
`;\r\n });\r\n content += \"
\"\r\n var $content = $(content);\r\n var $colorId = $($content[0]) as any;\r\n $colorId.dxTextBox({\r\n value: data.id,\r\n width: 18,\r\n readOnly: true,\r\n visible: false,\r\n });\r\n container.append($content);\r\n },\r\n itemTemplate: function (data) {\r\n var width = Math.floor(180 / data.colors.length);\r\n var content = `${data.id}
`;\r\n data.colors.forEach(color => {\r\n content += `
`;\r\n });\r\n content += \"
\"\r\n\r\n return content;\r\n }\r\n };\r\n };\r\n\r\n function applyObservable (chartVM) {\r\n chartVM.chartDefinition.chartType = ko.observable(chartVM.jsonData.chartType);\r\n chartVM.chartDefinition.colorPerSerie = ko.observable(chartVM.chartDefinition.colorPerSerie === undefined ? false : chartVM.chartDefinition.colorPerSerie);\r\n chartVM.chartDefinition.showMetricsYAxis = ko.observable(chartVM.chartDefinition.showMetricsYAxis === undefined ? false : chartVM.chartDefinition.showMetricsYAxis);\r\n chartVM.chartDefinition.labelVisibility = ko.observable(chartVM.chartDefinition.labelVisibility ?? true);\r\n chartVM.chartDefinition.labelAlign = ko.observable(chartVM.chartDefinition.labelAlign ?? \"center\");\r\n chartVM.chartDefinition.labelPosition = ko.observable(chartVM.chartDefinition.labelPosition);\r\n chartVM.chartDefinition.labelShowValue = ko.observable(chartVM.chartDefinition.labelShowValue === undefined ? true : chartVM.chartDefinition.labelShowValue);\r\n chartVM.chartDefinition.labelShowElement = ko.observable(chartVM.chartDefinition.labelShowElement === undefined ? false : chartVM.chartDefinition.labelShowElement);\r\n chartVM.chartDefinition.labelShowMetricName = ko.observable(chartVM.chartDefinition.labelShowMetricName === undefined ? false : chartVM.chartDefinition.labelShowMetricName);\r\n chartVM.chartDefinition.labelShowGroupingElement = ko.observable(chartVM.chartDefinition.labelShowGroupingElement === undefined ? true : chartVM.chartDefinition.labelShowGroupingElement);\r\n chartVM.chartDefinition.legendPosition = ko.observable(chartVM.chartDefinition.legendPosition ?? \"bottom\");\r\n chartVM.chartDefinition.bubbleMaxSize = ko.observable(chartVM.chartDefinition.bubbleMaxSize ?? 50);\r\n chartVM.chartDefinition.bubbleMinSize = ko.observable(chartVM.chartDefinition.bubbleMinSize ?? 5);\r\n chartVM.chartDefinition.bubbleSizeMetric = ko.observable(chartVM.chartDefinition.bubbleSizeMetric ?? \"\");\r\n chartVM.chartDefinition.bubbleXMetric = ko.observable(chartVM.chartDefinition.bubbleXMetric ?? \"\");\r\n chartVM.chartDefinition.labelConnector = ko.observable(chartVM.chartDefinition.labelConnector);\r\n chartVM.chartDefinition.labelApplyBackgroundColor = ko.observable(chartVM.chartDefinition.labelApplyBackgroundColor ?? true);\r\n chartVM.chartDefinition.labelFontColor = ko.observable(chartVM.chartDefinition.labelFontColor ?? null);\r\n chartVM.chartDefinition.labelOverlapping = ko.observable(chartVM.chartDefinition.labelOverlapping ?? \"hide\");\r\n chartVM.chartDefinition.labelRotationAngle = ko.observable(chartVM.chartDefinition.labelRotationAngle ?? 0);\r\n chartVM.chartDefinition.labelFormat = ko.observable(chartVM.chartDefinition.labelFormat ?? \"Automatic\");\r\n chartVM.chartDefinition.labelDecimalPlaces = ko.observable(chartVM.chartDefinition.labelDecimalPlaces ?? 0);\r\n chartVM.chartDefinition.axisLabelDisplayMode = ko.observable(chartVM.chartDefinition.axisLabelDisplayMode);\r\n chartVM.chartDefinition.axisLabelAngle = ko.observable(chartVM.chartDefinition.axisLabelAngle);\r\n chartVM.chartDefinition.axisValueMargin = ko.observable(chartVM.chartDefinition.axisValueMargin);\r\n\r\n\r\n var updateChart = function () {\r\n chart.createChart(chartVM);\r\n };\r\n\r\n //Subscribe for changes on this properties\r\n chartVM.chartDefinition.axisLabelDisplayMode.subscribe(updateChart);\r\n chartVM.chartDefinition.axisLabelAngle.subscribe(updateChart);\r\n chartVM.chartDefinition.axisValueMargin.subscribe(updateChart);\r\n chartVM.chartDefinition.legendPosition.subscribe(updateChart);\r\n chartVM.chartDefinition.chartType.subscribe(updateChart);\r\n chartVM.chartDefinition.colorPerSerie.subscribe(updateChart);\r\n chartVM.chartDefinition.labelVisibility.subscribe(function () {\r\n updateChart();\r\n });\r\n chartVM.chartDefinition.labelAlign.subscribe(updateChart);\r\n chartVM.chartDefinition.labelPosition.subscribe(updateChart);\r\n chartVM.chartDefinition.labelShowValue.subscribe(updateChart);\r\n chartVM.chartDefinition.labelShowElement.subscribe(updateChart);\r\n chartVM.chartDefinition.labelShowMetricName.subscribe(updateChart);\r\n chartVM.chartDefinition.labelShowGroupingElement.subscribe(updateChart);\r\n chartVM.chartDefinition.labelApplyBackgroundColor.subscribe(updateChart);\r\n chartVM.chartDefinition.labelConnector.subscribe(updateChart);\r\n chartVM.chartDefinition.labelApplyBackgroundColor.subscribe(updateChart);\r\n chartVM.chartDefinition.labelFontColor.subscribe(updateChart);\r\n chartVM.chartDefinition.labelOverlapping.subscribe(updateChart);\r\n chartVM.chartDefinition.labelRotationAngle.subscribe(updateChart);\r\n chartVM.chartDefinition.labelFormat.subscribe(updateChart);\r\n chartVM.chartDefinition.labelDecimalPlaces.subscribe(updateChart);\r\n chartVM.chartDefinition.showMetricsYAxis.subscribe(updateChart);\r\n\r\n //Need to transform y axis fields in the object of class MetricField\r\n for (var i = 0; i < chartVM.chartDefinition.yAxisFields.length; i++) {\r\n let field = chartVM.chartDefinition.yAxisFields[i];\r\n field.displayName = field.displayName === undefined || field.displayName === \"\" ? field.fieldName : field.displayName;\r\n\r\n let metricField = new MetricField();\r\n Object.assign(metricField, field);\r\n chartVM.chartDefinition.yAxisFields[i] = metricField;\r\n\r\n metricField.visible = ko.observable(field.visible);\r\n metricField.color = ko.observable(field.color ?? \"#FFFFFF\");\r\n\r\n\r\n if (field.yAxisChartDefinition) {\r\n let yAxisChartDefinition = new YAxisChartDefinition(field.yAxisChartDefinition.yAxisID, field.yAxisChartDefinition.chartType, field.yAxisChartDefinition.bubbleType,\r\n field.yAxisChartDefinition.scatterType, field.yAxisChartDefinition.stackGroup);\r\n metricField.yAxisChartDefinition = yAxisChartDefinition;\r\n }\r\n else\r\n metricField.yAxisChartDefinition = new YAxisChartDefinition();\r\n\r\n metricField.yAxisChartDefinition.bubbleIcon = ko.computed(function () {\r\n return this.yAxisChartDefinition.getBubbleIcon();\r\n }, metricField);\r\n\r\n metricField.yAxisChartDefinition.scatterIcon = ko.computed(function () {\r\n return this.yAxisChartDefinition.getScatterIcon();\r\n }, metricField);\r\n\r\n //Subscribe for changes on this properties\r\n metricField.visible.subscribe(function (value) {\r\n if (!value && chartVM.chartDefinition.yAxisFields.filter(function (x) { return x !== this && x.visible(); }.bind(this)).length === 0) {\r\n this.visible(true);\r\n return;\r\n }\r\n\r\n chart.pushStatus(chartVM, ChartStatus.ChangingProperties);\r\n if (value && chartVM.chartDefinition.chartType() === \"Bubble\") {\r\n if (this.yAxisChartDefinition.bubbleType() !== BubbleScatterType.YAxis)\r\n this.yAxisChartDefinition.bubbleType(BubbleScatterType.YAxis);\r\n }\r\n if (value && chartVM.chartDefinition.chartType() === \"Scatter\") {\r\n if (this.yAxisChartDefinition.scatterType() !== BubbleScatterType.YAxis)\r\n this.yAxisChartDefinition.scatterType(BubbleScatterType.YAxis);\r\n }\r\n let enableColor = value && chartVM.allowColorPerSerie() && chartVM.chartDefinition.colorPerSerie();\r\n ($(`.chartMainOptionsContainer #${this.id} input[type=color]`, chartVM.$context) as any).spectrum(enableColor ? \"enable\" : \"disable\");\r\n\r\n chart.popStatus(chartVM);\r\n updateChart();\r\n }, metricField);\r\n metricField.color.subscribe(updateChart);\r\n metricField.yAxisChartDefinition.stackGroup.subscribe(updateChart);\r\n metricField.yAxisChartDefinition.yAxisID.subscribe(updateChart);\r\n metricField.yAxisChartDefinition.chartType.subscribe(updateChart);\r\n metricField.yAxisChartDefinition.bubbleType.subscribe(function (value) {\r\n chart.pushStatus(chartVM, ChartStatus.ChangingProperties);\r\n if (this.yAxisChartDefinition.bubbleType() !== BubbleScatterType.YAxis) {\r\n this.visible(false);\r\n\r\n let field = chartVM.chartDefinition.yAxisFields.find(x => x.yAxisChartDefinition.bubbleType() == value && x.queryName !== this.queryName);\r\n if (field)\r\n field.yAxisChartDefinition.bubbleType(BubbleScatterType.YAxis);\r\n }\r\n else {\r\n let field = chartVM.chartDefinition.yAxisFields.find(x => x.yAxisChartDefinition.bubbleType() === BubbleScatterType.YAxis && x.visible());\r\n if (!field) {\r\n field = chartVM.chartDefinition.yAxisFields.find(x => x.yAxisChartDefinition.bubbleType() === BubbleScatterType.YAxis);\r\n field.visible(true);\r\n }\r\n }\r\n chart.popStatus(chartVM);\r\n updateChart();\r\n }, metricField);\r\n\r\n var scatterTypeManualChange = false;\r\n metricField.yAxisChartDefinition.scatterType.subscribe(function (value) {\r\n if (scatterTypeManualChange) {\r\n scatterTypeManualChange = false;\r\n return;\r\n }\r\n chart.pushStatus(chartVM, ChartStatus.ChangingProperties);\r\n if (this.yAxisChartDefinition.scatterType() === BubbleScatterType.XAxis) {\r\n this.visible(false);\r\n\r\n let field = chartVM.chartDefinition.yAxisFields.find(x => x.yAxisChartDefinition.scatterType() == value && x.queryName !== this.queryName);\r\n if (field) {\r\n scatterTypeManualChange = true;\r\n field.yAxisChartDefinition.scatterType(BubbleScatterType.YAxis);\r\n field.visible(true);\r\n }\r\n }\r\n else {\r\n let field = chartVM.chartDefinition.yAxisFields.find(x => x.yAxisChartDefinition.scatterType() === BubbleScatterType.YAxis && x.visible() && x.queryName !== this.queryName);\r\n if (!field) {\r\n field = chartVM.chartDefinition.yAxisFields.find(x => x.yAxisChartDefinition.scatterType() === BubbleScatterType.YAxis && x.queryName !== this.queryName);\r\n field.visible(true);\r\n }\r\n\r\n if (field) {\r\n scatterTypeManualChange = true;\r\n field.visible(false);\r\n field.yAxisChartDefinition.scatterType(BubbleScatterType.XAxis);\r\n }\r\n\r\n this.visible(true);\r\n }\r\n chart.popStatus(chartVM);\r\n updateChart();\r\n }, metricField);\r\n }\r\n\r\n //Need to transform x axis fields in the object of class ReportField\r\n for (var i = 0; i < chartVM.chartDefinition.xAxisFields.length; i++) {\r\n let field = chartVM.chartDefinition.xAxisFields[i];\r\n let reportField = new ReportField();\r\n Object.assign(reportField, field);\r\n chartVM.chartDefinition.xAxisFields[i] = reportField;\r\n }\r\n }\r\n\r\n return {\r\n chartButtonChange,\r\n hideChartOptions,\r\n applyObservable,\r\n saveChartDefinition,\r\n ChartDesignerViewModel,\r\n setChartSettings\r\n }\r\n}();","var chartService = (function () {\r\n\r\n let colorThemes = [\r\n { id: 1, colors: ['#4E79A7', '#F28E2B', '#E15759', '#76B7B2', '#59A14F', '#EDC948', '#B07AA1', '#FF9DA7', '#9C755F', '#BAB0AC'] },\r\n { id: 2, colors: ['#4E79A7', '#A0CBE8', '#F28E2B', '#FFBE7D', '#59A14F', '#8CD17D', '#B6992D', '#F1CE63', '#499894', '#86BCB6', '#E15759', '#FF9D9A', '#79706E', '#BAB0AC', '#D37295', '#FABFD2', '#B07AA1', '#D4A6C8', '#9D7660', '#D7B5A6'] },\r\n { id: 3, colors: ['#1170aa', '#fc7d0b', '#a3acb9', '#57606c', '#5fa2ce', '#c85200', '#7b848f', '#a3cce9', '#ffbc79', '#c8d0d9'] },\r\n { id: 4, colors: ['#767f8b', '#b3b7b8', '#5c6068', '#d3d3d3', '#989ca3'] },\r\n { id: 5, colors: ['#b60a1c', '#e39802', '#309143', '#e03531', '#f0bd27', '#51b364', '#ff684c', '#ffda66', '#8ace7e'] },\r\n { id: 6, colors: ['#4f6980', '#849db1', '#a2ceaa', '#638b66', '#bfbb60', '#f47942', '#fbb04e', '#b66353', '#d7ce9f', '#b9aa97', '#7e756d'] },\r\n { id: 7, colors: ['#6388b4', '#ffae34', '#ef6f6a', '#8cc2ca', '#55ad89', '#c3bc3f', '#bb7693', '#baa094', '#a9b5ae', '#767676'] },\r\n { id: 8, colors: ['#8175aa', '#6fb899', '#31a1b3', '#ccb22b', '#a39fc9', '#94d0c0', '#959c9e', '#027b8e', '#9f8f12'] },\r\n { id: 9, colors: ['#eb1e2c', '#fd6f30', '#f9a729', '#f9d23c', '#5fbb68', '#64cdcc', '#91dcea', '#a4a4d5', '#bbc9e5'] },\r\n { id: 10, colors: ['#bfb202', '#b9ca5d', '#cf3e53', '#f1788d', '#00a2b3', '#97cfd0', '#f3a546', '#f7c480'] },\r\n { id: 11, colors: ['#90728f', '#b9a0b4', '#9d983d', '#cecb76', '#e15759', '#ff9888', '#6b6b6b', '#bab2ae', '#aa8780', '#dab6af'] },\r\n { id: 12, colors: ['#4e9f50', '#87d180', '#ef8a0c', '#fcc66d', '#3ca8bc', '#98d9e4', '#94a323', '#c3ce3d', '#a08400', '#f7d42a', '#26897e', '#8dbfa8'] },\r\n { id: 13, colors: ['#466f9d', '#91b3d7', '#ed444a', '#feb5a2', '#9d7660', '#d7b5a6', '#3896c4', '#a0d4ee', '#ba7e45', '#39b87f', '#c8133b', '#ea8783'] },\r\n { id: 14, colors: ['#8074a8', '#c6c1f0', '#c46487', '#ffbed1', '#9c9290', '#c5bfbe', '#9b93c9', '#ddb5d5', '#7c7270', '#f498b6', '#b173a0', '#c799bc'] },\r\n { id: 15, colors: ['#1ba3c6', '#2cb5c0', '#30bcad', '#21B087', '#33a65c', '#57a337', '#a2b627', '#d5bb21', '#f8b620', '#f89217', '#f06719', '#e03426', '#f64971', '#fc719e', '#eb73b3', '#ce69be', '#a26dc2', '#7873c0', '#4f7cba'] },\r\n { id: 16, colors: ['#9e3d22', '#d45b21', '#f69035', '#d9d5c9', '#77acd3', '#4f81af', '#2b5c8a'] },\r\n { id: 17, colors: ['#a3123a', '#e33f43', '#f8816b', '#ced7c3', '#73ba67', '#44914e', '#24693d'] },\r\n { id: 18, colors: ['#24693d', '#45934d', '#75bc69', '#c9dad2', '#77a9cf', '#4e7fab', '#2a5783'] },\r\n { id: 19, colors: ['#a90c38', '#e03b42', '#f87f69', '#dfd4d1', '#7eaed3', '#5383af', '#2e5a87'] },\r\n { id: 20, colors: ['#ae123a', '#e33e43', '#f8816b', '#d9d9d9', '#a0a7a8', '#707c83', '#49525e'] },\r\n { id: 21, colors: ['#ad9024', '#c1a33b', '#d4b95e', '#e3d8cf', '#d4a3c3', '#c189b0', '#ac7299'] },\r\n { id: 22, colors: ['#be2a3e', '#e25f48', '#f88f4d', '#f4d166', '#90b960', '#4b9b5f', '#22763f'] },\r\n { id: 23, colors: ['#33608c', '#9768a5', '#e7718a', '#f6ba57', '#ed7846', '#d54c45', '#b81840'] },\r\n { id: 24, colors: ['#9e3d22', '#e36621', '#fcad52', '#ffffff', '#95c5e1', '#5b8fbc', '#2b5c8a'] },\r\n { id: 25, colors: ['#ae123a', '#ee574d', '#fdac9e', '#ffffff', '#91d183', '#539e52', '#24693d'] },\r\n { id: 26, colors: ['#24693d', '#529c51', '#8fd180', '#ffffff', '#95c1dd', '#598ab5', '#2a5783'] },\r\n { id: 27, colors: ['#a90c38', '#ec534b', '#feaa9a', '#ffffff', '#9ac4e1', '#5c8db8', '#2e5a87'] },\r\n { id: 28, colors: ['#ae123a', '#ee574d', '#fdac9d', '#ffffff', '#bdc0bf', '#7d888d', '#49525e'] },\r\n { id: 29, colors: ['#ffcc9e', '#f9d4b6', '#f0dccd', '#e5e5e5', '#dae1ea', '#cfdcef', '#c4d8f3'] },\r\n { id: 30, colors: ['#529985', '#6c9e6e', '#99b059', '#dbcf47', '#ebc24b', '#e3a14f', '#c26b51'] },\r\n { id: 31, colors: ['#feffd9', '#f2fabf', '#dff3b2', '#c4eab1', '#94d6b7', '#69c5be', '#41b7c4'] },\r\n { id: 32, colors: ['#e5e5e5', '#e0e3e8', '#dbe1ea', '#d5dfec', '#d0dcef', '#cadaf1', '#c4d8f3'] },\r\n { id: 33, colors: ['#e5e5e5', '#ebe1d9', '#f0ddcd', '#f5d9c2', '#f9d4b6', '#fdd0aa', '#ffcc9e'] },\r\n { id: 34, colors: ['#b9ddf1', '#afd6ed', '#a5cfe9', '#9bc7e4', '#92c0df', '#89b8da', '#80b0d5', '#79aacf', '#72a3c9', '#6a9bc3', '#6394be', '#5b8cb8', '#5485b2', '#4e7fac', '#4878a6', '#437a9f', '#3d6a98', '#376491', '#305d8a', '#2a5783'] },\r\n { id: 35, colors: ['#ffc685', '#fcbe75', '#f9b665', '#f7ae54', '#f5a645', '#f59c3c', '#f49234', '#f2882d', '#f07e27', '#ee7422', '#e96b20', '#e36420', '#db5e20', '#d25921', '#ca5422', '#c14f22', '#b84b23', '#af4623', '#a64122', '#9e3d22'] },\r\n { id: 36, colors: ['#b3e0a6', '#a5db96', '#98d687', '#8ed07f', '#85ca77', '#7dc370', '#75bc69', '#6eb663', '#67af5c', '#61a956', '#59a253', '#519c51', '#49964f', '#428f4d', '#398949', '#308344', '#2b7c40', '#27763d', '#256f3d', '#24693d'] },\r\n { id: 37, colors: ['#ffbeb2', '#feb4a6', '#fdab9b', '#fca290', '#fb9984', '#fa8f79', '#f9856e', '#f77b66', '#f5715d', '#f36754', '#f05c4d', '#ec5049', '#e74545', '#e13b42', '#da323f', '#d3293d', '#ca223c', '#c11a3b', '#b8163a', '#ae123a'] },\r\n { id: 38, colors: ['#eec9e5', '#eac1df', '#e6b9d9', '#e0b2d2', '#daabcb', '#d5a4c4', '#cf9dbe', '#ca96b8', '#c48fb2', '#be89ac', '#b882a6', '#b27ba1', '#aa759d', '#a27099', '#9a6a96', '#926591', '#8c5f86', '#865986', '#81537f', '#7c4d79'] },\r\n { id: 39, colors: ['#eedbbd', '#ecd2ad', '#ebc994', '#eac085', '#e8b777', '#e5ae6c', '#e2a562', '#de9d5a', '#d99455', '#d38c54', '#ce8451', '#c9784d', '#c47247', '#c16941', '#bd6036', '#b85636', '#b34d34', '#ad4433', '#a63d32', '#9f3632'] },\r\n { id: 40, colors: ['#d5d5d5', '#cdcecd', '#c5c7c6', '#bcbfbe', '#b4b7b7', '#acb0b1', '#a4a9ab', '#9ca3a4', '#939c9e', '#8b9598', '#848e93', '#7c878d', '#758087', '#6e7a81', '#67737c', '#616c77', '#5b6570', '#555f6a', '#4f5864', '#49525e'] },\r\n { id: 41, colors: ['#dcd4d0', '#d4ccc8', '#cdc4c0', '#c5bdb9', '#beb6b2', '#b7afab', '#b0a7a4', '#a9a09d', '#a29996', '#9b938f', '#948c88', '#8d8481', '#867e7b', '#807774', '#79706e', '#736967', '#6c6260', '#665c51', '#5f5654', '#59504e'] },\r\n { id: 42, colors: ['#bce4d8', '#aedcd5', '#a1d5d2', '#95cecf', '#89c8cc', '#7ec1ca', '#72bac6', '#66b2c2', '#59acbe', '#4ba5ba', '#419eb6', '#3b96b2', '#358ead', '#3586a7', '#347ea1', '#32779b', '#316f96', '#2f6790', '#2d608a', '#2c5985'] },\r\n { id: 43, colors: ['#f4d166', '#f6c760', '#f8bc58', '#f8b252', '#f7a84a', '#f69e41', '#f49538', '#f38b2f', '#f28026', '#f0751e', '#eb6c1c', '#e4641e', '#de5d1f', '#d75521', '#cf4f22', '#c64a22', '#bc4623', '#b24223', '#a83e24', '#9e3a26'] },\r\n { id: 44, colors: ['#f4d166', '#e3cd62', '#d3c95f', '#c3c55d', '#b2c25b', '#a3bd5a', '#93b958', '#84b457', '#76af56', '#67a956', '#5aa355', '#4f9e53', '#479751', '#40914f', '#3a8a4d', '#34844a', '#2d7d45', '#257740', '#1c713b', '#146c36'] },\r\n { id: 45, colors: ['#f4d166', '#f5c75f', '#f6bc58', '#f7b254', '#f9a750', '#fa9d4f', '#fa9d4f', '#fb934d', '#f7894b', '#f47f4a', '#f0774a', '#eb6349', '#e66549', '#e15c48', '#dc5447', '#d64c45', '#d04344', '#ca3a42', '#c43141', '#bd273f', '#b71d3e'] },\r\n { id: 46, colors: ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'] },\r\n { id: 47, colors: ['#729ece', '#ff9e4a', '#67bf5c', '#ed665d', '#ad8bc9', '#a8786e', '#ed97ca', '#a2a2a2', '#cdcc5d', '#6dccda'] },\r\n { id: 48, colors: ['#aec7e8', '#ffbb78', '#98df8a', '#ff9896', '#c5b0d5', '#c49c94', '#f7b6d2', '#c7c7c7', '#dbdb8d', '#9edae5'] },\r\n { id: 49, colors: ['#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5', '#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f', '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5'] },\r\n { id: 50, colors: ['#60636a', '#a5acaf', '#414451', '#8f8782', '#cfcfcf'] },\r\n { id: 51, colors: ['#006ba4', '#ff800e', '#ababab', '#595959', '#5f9ed1', '#c85200', '#898989', '#a2c8ec', '#ffbc79', '#cfcfcf'] },\r\n { id: 52, colors: ['#b10318', '#dba13a', '#309343', '#d82526', '#ffc156', '#69b764', '#f26c64', '#ffdd71', '#9fcd99'] },\r\n { id: 53, colors: ['#7b66d2', '#dc5fbd', '#94917b', '#995688', '#d098ee', '#d7d5c5'] },\r\n { id: 54, colors: ['#7b66d2', '#a699e8', '#dc5fbd', '#ffc0da', '#5f5a41', '#b4b19b', '#995688', '#d898ba', '#ab6ad5', '#d098ee', '#8b7c6e', '#dbd4c5'] },\r\n { id: 55, colors: ['#32a251', '#ff7f0f', '#3cb7cc', '#ffd94a', '#39737c', '#b85a0d'] },\r\n { id: 56, colors: ['#32a251', '#acd98d', '#ff7f0f', '#ffb977', '#3cb7cc', '#98d9e4', '#b85a0d', '#ffd94a', '#39737c', '#86b4a9', '#82853b', '#ccc94d'] },\r\n { id: 57, colors: ['#2c69b0', '#f02720', '#ac613c', '#6ba3d6', '#ea6b73', '#e9c39b'] },\r\n { id: 58, colors: ['#2c69b0', '#b5c8e2', '#f02720', '#ffb6b0', '#ac613c', '#e9c39b', '#6ba3d6', '#b5dffd', '#ac8763', '#ddc9b4', '#bd0a36', '#f4737a'] },\r\n { id: 59, colors: ['#1f83b4', '#12a2a8', '#2ca030', '#78a641', '#bcbd22', '#ffbf50', '#ffaa0e', '#ff7f0e', '#d63a3a', '#c7519c', '#ba43b4', '#8a60b0', '#6f63bb'] },\r\n { id: 60, colors: ['#bccfb4', '#94bb83', '#69a761', '#339444', '#27823b', '#1a7232', '#09622a'] },\r\n { id: 61, colors: ['#c3c3c3', '#b2b2b2', '#a2a2a2', '#929292', '#838383', '#747474', '#666666', '#585858', '#4b4b4b', '#3f3f3f', '#333333', '#282828', '#1e1e1e'] },\r\n { id: 62, colors: ['#b4d4da', '#7bc8e2', '#67add4', '#3a87b7', '#1c73b1', '#1c5998', '#26456e'] },\r\n { id: 63, colors: ['#eac0bd', '#f89a90', '#f57667', '#e35745', '#d8392c', '#cf1719', '#c21417', '#b10c1d', '#9c0824'] },\r\n { id: 64, colors: ['#f0c294', '#fdab67', '#fd8938', '#f06511', '#d74401', '#a33202', '#7b3014'] },\r\n { id: 65, colors: ['#f5cac7', '#fbb3ab', '#fd9c8f', '#fe8b7a', '#fd7864', '#f46b55', '#ea5e45', '#e04e35', '#d43e25', '#c92b14', '#bd1100'] },\r\n { id: 66, colors: ['#dbe8b4', '#c3e394', '#acdc7a', '#9ad26d', '#8ac765', '#7abc5f', '#6cae59', '#60a24d', '#569735', '#4a8c1c', '#3c8200'] },\r\n { id: 67, colors: ['#f3e0c2', '#f6d29c', '#f7c577', '#f0b763', '#e4aa63', '#d89c63', '#cc8f63', '#c08262', '#bb7359', '#bb6348', '#bb5137'] },\r\n { id: 68, colors: ['#9c0824', '#bd1316', '#d11719', '#df513f', '#fc8375', '#cacaca', '#a2c18f', '#69a761', '#2f8e41', '#1e7735', '#09622a'] },\r\n { id: 69, colors: ['#9c0824', '#bd1316', '#d11719', '#df513f', '#fc8375', '#cacaca', '#67add4', '#3a87b7', '#1c73b1', '#1c5998', '#26456e'] },\r\n { id: 70, colors: ['#9c0824', '#bd1316', '#d11719', '#df513f', '#fc8375', '#cacaca', '#9b9b9b', '#777777', '#565656', '#383838', '#1e1e1e'] },\r\n { id: 71, colors: ['#bd1100', '#c82912', '#d23a21', '#dc4930', '#e6583e', '#ef654d', '#f7705b', '#fd7e6b', '#fe8e7e', '#fca294', '#e9dabe', '#c7e298', '#b1de7f', '#a0d571', '#90cb68', '#82c162', '#75b65d', '#69aa56', '#5ea049', '#559633', '#4a8c1c'] },\r\n { id: 72, colors: ['#7b3014', '#a33202', '#d74401', '#f06511', '#fd8938', '#fdab67', '#cacaca', '#7bc8e2', '#67add4', '#3a87b7', '#1c73b1', '#1c5998', '#26456e'] },\r\n { id: 73, colors: ['#09622a', '#1e7735', '#2f8e41', '#69a761', '#a2c18f', '#cacaca', '#67add4', '#3a87b7', '#1c73b1', '#1c5998', '#26456e'] },\r\n { id: 74, colors: ['#9c0824', '#b41f27', '#cc312b', '#e86753', '#fcb4a5', '#ffffff', '#b9d7b7', '#74af72', '#428f49', '#297839', '#09622a'] },\r\n { id: 75, colors: ['#9c0824', '#b41f27', '#cc312b', '#e86753', '#fcb4a5', '#ffffff', '#bfbfbf', '#838383', '#575757', '#393939', '#1e1e1e'] },\r\n { id: 76, colors: ['#7b3014', '#a84415', '#d85a13', '#fb8547', '#ffc2a1', '#ffffff', '#b7cde2', '#6a9ec5', '#3679a8', '#2e5f8a', '#26456e'] },\r\n { id: 77, colors: ['#ffc2c5', '#ffd1d3', '#ffe0e1', '#fff0f0', '#ffffff', '#f3f3f3', '#e8e8e8', '#dddddd', '#d1d1d1', '#c6c6c6'] },\r\n { id: 78, colors: ['#ffcc9e', '#ffd6b1', '#ffe0c5', '#ffead8', '#fff5eb', '#ffffff', '#f3f7fd', '#e8effa', '#dce8f8', '#d0e0f6', '#c4d8f3'] },\r\n { id: 79, colors: ['#ffb2b6', '#ffc2c5', '#ffd1d3', '#ffe0e1', '#fff0f0', '#ffffff', '#f1faed', '#e3f5db', '#d5f0ca', '#c6ebb8', '#b7e6a7'] },\r\n { id: 80, colors: ['#ffb2b6', '#fcbdc0', '#f8c7c9', '#f2d1d2', '#ecdbdc', '#e5e5e5', '#dde6d9', '#d4e6cc', '#cae6c0', '#c1e6b4', '#b7e6a7'] }\r\n ];\r\n\r\n function getColorsOfTheme(id: number) {\r\n let theme = colorThemes.find(x => x.id === id);\r\n return theme?.colors;\r\n }\r\n\r\n function getLegendOptions (legendPosition) {\r\n\r\n let options = {\r\n verticalAlignment: \"top\",\r\n horizontalAlignment: \"center\",\r\n visible: true,\r\n itemTextPosition: \"right\",\r\n };\r\n\r\n switch (legendPosition) {\r\n case LegendPositionEnum.None:\r\n options.visible = false;\r\n break;\r\n case LegendPositionEnum.Bottom:\r\n default:\r\n options.verticalAlignment = \"bottom\";\r\n break;\r\n case LegendPositionEnum.Top:\r\n break;\r\n case LegendPositionEnum.Left:\r\n options.horizontalAlignment = \"left\";\r\n break;\r\n case LegendPositionEnum.Right:\r\n options.horizontalAlignment = \"right\";\r\n break;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n function renderChart($canvas) {\r\n if ($canvas.data(\"dxChart\")) {\r\n $canvas.dxChart(\"instance\").resetVisualRange();\r\n $canvas.dxChart(\"instance\").render();\r\n }\r\n\r\n if ($canvas.data(\"dxPieChart\")) {\r\n $canvas.dxPieChart(\"instance\").render();\r\n }\r\n\r\n if ($canvas.data(\"dxPolarChart\")) {\r\n $canvas.dxPolarChart(\"instance\").resetVisualRange();\r\n $canvas.dxPolarChart(\"instance\").render();\r\n }\r\n }\r\n\r\n function disposeChart($canvas, dxChart) {\r\n if (dxChart !== \"dxChart\" && $canvas.data(\"dxChart\")) {\r\n $canvas.dxChart(\"dispose\");\r\n $canvas.data(\"dxChart\", undefined);\r\n }\r\n\r\n if (dxChart !== \"dxPieChart\" && $canvas.data(\"dxPieChart\")) {\r\n $canvas.dxPieChart(\"dispose\");\r\n $canvas.data(\"dxPieChart\", undefined);\r\n }\r\n\r\n if (dxChart !== \"dxPolarChart\" && $canvas.data(\"dxPolarChart\")) {\r\n $canvas.dxPolarChart(\"dispose\");\r\n $canvas.data(\"dxPolarChart\", undefined);\r\n }\r\n }\r\n\r\n function addChartFilterDrilldown(evt, chartPoint, xAxisFields) {\r\n let context = evt && evt.currentTarget ? $(evt.currentTarget).closest(\"div.reportContent\") : null;\r\n if (!reportView.drilldownIsPossible())\r\n return;\r\n\r\n let widget = context.closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n if (evt) {\r\n if (isWidget) {\r\n if (widget.hasClass(\"selected\")) {\r\n if (evt.stopPropagation)\r\n evt.stopPropagation();\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n let inputValues = {\r\n tabValues: [],\r\n widgetId: isWidget ? widget.data(\"widgetid\") : undefined\r\n };\r\n\r\n for (let i = 0; i < xAxisFields.length; i++) {\r\n if (xAxisFields[i].isGroupBy) {\r\n let name = xAxisFields[i].name;\r\n let value = chartPoint[name];\r\n inputValues.tabValues.push({ name: name, startCondition: value, isGroupField: xAxisFields[i].isGroupField });\r\n }\r\n }\r\n\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"NavigateToDrillDown\",\r\n inputValues,\r\n function (data) {\r\n if (reportView.updateOutputAfterDrilldown) {\r\n reportView.updateOutputAfterDrilldown(data, context);\r\n }\r\n else {\r\n irGlobal.updateOutput(data);\r\n }\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n };\r\n\r\n function onDrillDown(arg, chartVM: ChartVM) {\r\n //return if there is no callback\r\n if (!chartVM.addFilterCallback)\r\n return;\r\n\r\n var drilldownId = $(\"select.nextDrilldownSelect\").val();\r\n //return if there is no drilldown report selected\r\n if (!drilldownId)\r\n return;\r\n\r\n var xAxisFields = [...chartVM.jsonData.xAxisFields];\r\n if (chartVM.jsonData.groupFields) {\r\n\r\n chartVM.jsonData.groupFields.forEach(field => {\r\n xAxisFields.push(field);\r\n });\r\n }\r\n\r\n chartVM.addFilterCallback(arg.event, arg.target.data, xAxisFields);\r\n }\r\n\r\n let dxChartType = {\r\n Line: \"spline\",\r\n Bar: \"bar\",\r\n StackedBar: \"stackedbar\",\r\n Pie: \"pie\", //dxPieChart\r\n Donut: \"doughnut\", //dxPieChart\r\n Polar: \"\", //p,lar dxPolarChart \r\n StackedArea: \"stackedsplinearea\",\r\n Radar: \"\", //radar dxPolarChart \r\n RadarArea: \"\", //radar area dxPolarChart \r\n Area: \"splinearea\",\r\n HorizontalBar: \"bar\", //horizontal\r\n HorizontalBarStacked: \"stackedbar\", //horizontal\r\n Mixed: \"\", //mixed\r\n Bubble: \"bubble\",\r\n Scatter: \"scatter\"\r\n };\r\n\r\n return {\r\n renderChart,\r\n disposeChart,\r\n addChartFilterDrilldown,\r\n onDrillDown,\r\n getColorsOfTheme,\r\n colorThemes,\r\n getLegendOptions,\r\n dxChartType\r\n };\r\n\r\n}());","declare var urlConfigs: any;\r\ndeclare var Popper: any;\r\ndeclare var report: any;\r\ndeclare var moment: any;\r\n\r\ninterface Array {\r\n equals(array);\r\n}\r\ninterface String {\r\n equals(string);\r\n}\r\n\r\ninterface ChartVM {\r\n fromPDF: boolean,\r\n $canvas: any,\r\n jsonData: any,\r\n $context: any,\r\n addFilterCallback: (event: Event, pointValues, xAxisFields: any[]) => any,\r\n colors: Array,\r\n colorPosition: number,\r\n allowColorPerSerie: KnockoutObservable,\r\n hasYAxisLeft: boolean,\r\n YAxisLeftName: string,\r\n hasYAxisRight: boolean,\r\n YAxisRightName: string,\r\n generateAxes: KnockoutObservable,\r\n mixedChartType: KnockoutObservable,\r\n chartType: string,\r\n fillColor: boolean | number | string,\r\n applyBorderColor: boolean,\r\n stacked: boolean,\r\n chartDefinition: ChartDefinition,\r\n hasGrouping: boolean,\r\n bubbleSizeMetric: MetricField,\r\n bubbleXMetric: MetricField,\r\n scatterXMetric: MetricField,\r\n chartStatus: ChartStatus[],\r\n debug: boolean,\r\n showHideChartOptionsWidget: Function,\r\n //hideChartOptions: FunctionItemEventType,\r\n //showChartOptions: FunctionItemEventType,\r\n groupSerieValues: Array,\r\n dataSource: DevExpress.data.DataSource,\r\n chartDesignerVM: ChartDesignerVM,\r\n}\r\n\r\ninterface ChartDesignerVM {\r\n colorThemes: [],\r\n chartVM: ChartVM,\r\n tabsOptions: any,\r\n tab: number,\r\n chartTypes: ChartTypeItem[],\r\n chartTypeSelectBoxOptions: any,\r\n legendPositionSelectBoxOptions: any,\r\n mixedChartTypes: ChartTypeItem[],\r\n bubbleTypes: BubbleScatterTypeItem[],\r\n scatterTypes: BubbleScatterTypeItem[],\r\n yAxisFields: MetricField[],\r\n colorThemeId: KnockoutObservable,\r\n colorTheme: KnockoutComputed,\r\n disableColorPerSerie: KnockoutComputed,\r\n disableYAxisOptions: KnockoutComputed,\r\n disableColorPerSerieSetting: KnockoutComputed,\r\n showMetricsYAxis: KnockoutComputed,\r\n disableMixedOptions: KnockoutComputed,\r\n visibleStackGroupOptions: KnockoutComputed,\r\n showChartOptions: KnockoutComputed,\r\n hideChartOptions: KnockoutComputed,\r\n labelShowItems: [],\r\n labelAlignOptions: [],\r\n legendPositions: [],\r\n yAxes: [],\r\n decimalPlacesOptions: [],\r\n labelFormatOptions: [],\r\n axisLabelDisplayModeOptions: [],\r\n colorThemeSelectBoxOptions: any,\r\n}\r\n\r\nclass ChartDefinition {\r\n xAxisFields: Array;\r\n yAxisFields: Array;\r\n chartType: KnockoutObservable;\r\n colorTheme: number;\r\n colorPerSerie: KnockoutObservable;\r\n labelVisibility: KnockoutObservable;\r\n labelAlign: KnockoutObservable;\r\n labelPosition: KnockoutObservable;\r\n labelShowValue: KnockoutObservable;\r\n labelShowElement: KnockoutObservable;\r\n labelShowMetricName: KnockoutObservable;\r\n labelShowGroupingElement: KnockoutObservable;\r\n legendPosition: KnockoutObservable;\r\n bubbleMaxSize: KnockoutObservable;\r\n bubbleMinSize: KnockoutObservable;\r\n labelApplyBackgroundColor: KnockoutObservable;\r\n labelFontColor: KnockoutObservable;\r\n labelOverlapping: KnockoutObservable;\r\n labelRotationAngle: KnockoutObservable;\r\n labelFormat: KnockoutObservable;\r\n labelDecimalPlaces: KnockoutObservable;\r\n showMetricsYAxis: KnockoutObservable;\r\n // bubbleSizeMetric: KnockoutObservable;\r\n // bubbleXMetric: KnockoutObservable;\r\n}\r\nenum BubbleScatterType {\r\n XAxis = \"XAxis\",\r\n YAxis = \"YAxis\",\r\n //Only for Bubble\r\n BubbleSize = \"BubbleSize\",\r\n}\r\n\r\nenum ChartStatus {\r\n Ready = \"Ready\",\r\n Starting = \"Starting\",\r\n ChangingProperties = \"ChangingProperties\",\r\n Rendering = \"Rendering\",\r\n}\r\n\r\nclass BubbleScatterTypeItem {\r\n type: KnockoutObservable;\r\n image: KnockoutObservable;\r\n title: KnockoutObservable;\r\n\r\n constructor(type: BubbleScatterType, title: string) {\r\n this.type = ko.observable(type);\r\n this.image = ko.observable(BubbleScatterTypeItem.getIcon(type));\r\n this.title = ko.observable(title);\r\n }\r\n\r\n static getIcon(type: BubbleScatterType) {\r\n switch (type) {\r\n case BubbleScatterType.XAxis:\r\n return urlConfigs.siteRoot + \"Content/Charts/x-axis.svg\";\r\n case BubbleScatterType.YAxis:\r\n return urlConfigs.siteRoot + \"Content/Charts/y-axis.svg\";\r\n case BubbleScatterType.BubbleSize:\r\n return urlConfigs.siteRoot + \"Content/Charts/bubble-size.svg\";\r\n }\r\n }\r\n}\r\n\r\nclass YAxisChartDefinition {\r\n yAxisID: KnockoutObservable;\r\n chartType: KnockoutObservable;\r\n bubbleType: KnockoutObservable;\r\n bubbleIcon: KnockoutObservable;\r\n scatterType: KnockoutObservable;\r\n scatterIcon: KnockoutObservable;\r\n stackGroup: KnockoutObservable;\r\n\r\n constructor(yAxisID: string = \"y-left\", chartType: string = \"Bar\", bubbleType: BubbleScatterType = BubbleScatterType.YAxis,\r\n scatterType: BubbleScatterType = BubbleScatterType.YAxis, stackGroup: number = 0) {\r\n this.yAxisID = ko.observable(yAxisID);\r\n this.chartType = ko.observable(chartType);\r\n this.bubbleType = ko.observable(bubbleType);\r\n this.scatterType = ko.observable(scatterType ?? BubbleScatterType.YAxis);\r\n this.stackGroup = ko.observable(stackGroup);\r\n }\r\n\r\n getBubbleIcon() {\r\n return BubbleScatterTypeItem.getIcon(this.bubbleType());\r\n }\r\n\r\n getScatterIcon() {\r\n return BubbleScatterTypeItem.getIcon(this.scatterType());\r\n }\r\n}\r\n\r\nenum LegendPositionEnum {\r\n None = \"none\",\r\n Top = \"top\",\r\n Bottom = \"bottom\",\r\n Left = \"left\",\r\n Right = \"right\",\r\n}\r\n\r\nenum ChartType {\r\n Line = \"Line\",\r\n Bar = \"Bar\",\r\n StackedBar = \"StackedBar\",\r\n Pie = \"Pie\",\r\n Donut = \"Donut\",\r\n Polar = \"Polar\",\r\n StackedArea = \"StackedArea\",\r\n Radar = \"Radar\",\r\n RadarArea = \"RadarArea\",\r\n Area = \"Area\",\r\n HorizontalBar = \"HorizontalBar\",\r\n HorizontalBarStacked = \"HorizontalBarStacked\",\r\n Mixed = \"Mixed\",\r\n Bubble = \"Bubble\",\r\n Scatter = \"Scatter\"\r\n}\r\n\r\nclass ChartTypeItem {\r\n chartType: KnockoutObservable;\r\n image: KnockoutObservable;\r\n title: KnockoutObservable;\r\n disabled: KnockoutObservable;\r\n tooltip: KnockoutObservable;\r\n\r\n constructor(chartType: string, image: string, title: string, disabled: boolean = false, tooltip = \"\") {\r\n this.chartType = ko.observable(chartType);\r\n this.image = ko.observable(urlConfigs.siteRoot + image);\r\n this.title = ko.observable(title);\r\n this.disabled = ko.observable(disabled);\r\n this.tooltip = ko.observable(tooltip);\r\n }\r\n}","var widgetKPI = (function () {\r\n var updateNames = function (vm) {\r\n vm.indicatorMetricName(mappingDataSource.getMetricName(vm.config.indicatorMetric()));\r\n vm.targetMetricName(mappingDataSource.getMetricName(vm.config.targetMetric()));\r\n vm.trendAxisFieldName(mappingDataSource.getFieldName(vm.config.trendAxisField()));\r\n let field = mappingDataSource.getField(vm.config.trendAxisField());\r\n if (field) {\r\n vm.trendAxisDisplayName(field.displayName + (vm.config.trendAxisFieldAutoGrouping() !== AutoGroupingStrEnum.None ? \" \" + irGlobal.splitOnUpper(vm.config.trendAxisFieldAutoGrouping()) : \"\"));\r\n }\r\n\r\n vm.isNamesUpdated = true;\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(vm.config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n\r\n vm.indicatorMetricName = ko.observable(\"\");\r\n vm.targetMetricName = ko.observable(\"\");\r\n vm.trendAxisFieldName = ko.observable(\"\");\r\n vm.trendAxisDisplayName = ko.observable(\"\");\r\n vm.customTitle = ko.computed(function () { return vm.config.titleText() || vm.indicatorMetricName(); }, this);\r\n updateNames(vm);\r\n\r\n vm.formattingRuleName = ko.observable(vm.formattingRuleObj.name);\r\n\r\n vm.titleTextSettings = {};\r\n vm.targetTextSettings = {};\r\n setBaseTextConfig(vm.titleTextSettings, vm.config.titleTextConfig);\r\n setBaseTextConfig(vm.targetTextSettings, vm.config.targetTextConfig);\r\n\r\n vm.trendAxisHeightOptions = {\r\n format: \"#px\",\r\n value: vm.config.trendAxisHeight,\r\n step: 1,\r\n showSpinButtons: true,\r\n min: 10,\r\n max: 200,\r\n width: 80,\r\n };\r\n\r\n vm.indicatorFontSizeOptions = {\r\n format: \"#px\",\r\n value: vm.config.indicatorFontSize,\r\n step: 1,\r\n showSpinButtons: true,\r\n min: 8,\r\n max: 200,\r\n width: 80,\r\n };\r\n\r\n vm.iconSizeOptions = {\r\n format: \"0#px\",\r\n value: vm.config.iconSize,\r\n step: 1,\r\n showSpinButtons: true,\r\n min: 0,\r\n max: 200,\r\n width: 80,\r\n };\r\n\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"KPI\",\r\n icon: \"bi bi-circle-square\",\r\n content: \"KPI Settings\"\r\n },\r\n {\r\n id: 2,\r\n text: \"Visual\",\r\n icon: \"bi bi-card-checklist\",\r\n content: \"KPI Visual Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0],\r\n ];\r\n\r\n vm.indicatorPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Indicator Metric\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n if (!vm.config.titleText() || vm.config.titleText() === vm.indicatorMetricName() || vm.config.titleText() === \"Title\")\r\n vm.config.titleText(item.nodeName);\r\n\r\n //If the indicator metric is the same of target because of the comparison filter, update the target metric too\r\n if (vm.config.targetMetric() === vm.config.indicatorMetric() && vm.config.comparisonFilter.dateOption() !== ComparisonDateOptionStrEnum.Manual) {\r\n vm.config.targetMetric(item.metricId);\r\n vm.targetMetricName(item.nodeName);\r\n }\r\n vm.config.indicatorMetric(item.metricId);\r\n vm.indicatorMetricName(item.nodeName);\r\n vm.config.decimalPlaces(item.decimalPlaces);\r\n vm.config.format(item.format);\r\n vm.config.accountingStyle(item.accountingStyle);\r\n\r\n if (item.formattingRuleId > 0 && (!vm.config.formattingRule() || vm.config.formattingRule() === 0)) {\r\n vm.config.formattingRule(item.formattingRuleId);\r\n\r\n let fRule = formattingRuleService.getFormattingRuleById(item.formattingRuleId);\r\n vm.formattingRuleName(fRule ? fRule.name : \"\");\r\n }\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n\r\n vm.indicatorRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Indicator Metric\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n if (vm.config.titleText() === vm.indicatorMetricName())\r\n vm.config.titleText(null);\r\n vm.config.indicatorMetric(null);\r\n vm.indicatorMetricName(null);\r\n vm.config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n\r\n vm.targetPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Target Metric\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n vm.config.targetMetric(item.metricId);\r\n vm.targetMetricName(item.nodeName);\r\n\r\n if (item.formattingRuleId > 0 && (!vm.config.formattingRule() || vm.config.formattingRule() === 0)) {\r\n vm.config.formattingRule(item.formattingRuleId);\r\n\r\n let fRule = formattingRuleService.getFormattingRuleById(item.formattingRuleId);\r\n vm.formattingRuleName(fRule ? fRule.name : \"\");\r\n }\r\n\r\n if (vm.config.targetMetric() !== vm.config.indicatorMetric())\r\n vm.config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n\r\n vm.targetRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Target Metric\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n vm.config.targetMetric(null);\r\n vm.targetMetricName(null);\r\n vm.config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n\r\n vm.trendAxisPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Trend Axis Field\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n vm.config.trendAxisField(item.fieldId);\r\n vm.config.trendAxisFieldAutoGrouping(item.autoGrouping);\r\n vm.trendAxisFieldName(item.nodeName);\r\n vm.trendAxisDisplayName(item.displayName);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Date\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n\r\n vm.trendAxisRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Trend Axis Field\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n vm.config.trendAxisField(null);\r\n vm.config.trendAxisFieldAutoGrouping(AutoGroupingStrEnum.None);\r\n vm.trendAxisFieldName(null);\r\n vm.trendAxisDisplayName(null);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n\r\n vm.indicatorTextBoxOptions = {\r\n value: vm.indicatorMetricName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.targetTextBoxOptions = {\r\n value: vm.targetMetricName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.trendAxisTextBoxOptions = {\r\n value: vm.trendAxisDisplayName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.fontStyleOptions = [\r\n {\r\n icon: 'bold',\r\n style: 'Bold',\r\n hint: 'Bold'\r\n },\r\n {\r\n icon: 'italic',\r\n style: 'Italic',\r\n hint: 'Italic'\r\n }\r\n ];\r\n\r\n vm.filterZerosOptions = {\r\n value: vm.config.filterZeros,\r\n onValueChanged: function (e) {\r\n vm.shouldUpdateData = true;\r\n dashboard.saveWidgetConfig(vm, true);\r\n },\r\n };\r\n\r\n vm.useLastPeriodOptions = {\r\n value: vm.config.useLastPeriod,\r\n onValueChanged: function (e) {\r\n vm.shouldUpdateData = true;\r\n dashboard.saveWidgetConfig(vm, true);\r\n },\r\n };\r\n\r\n vm.config.showTrendAxis.subscribe(function (newValue) {\r\n vm.shouldUpdateData = newValue;\r\n\r\n if (vm.shouldUpdateData)\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n\r\n vm.config.format.subscribe(function (val) {\r\n vm.shouldUpdateData = true;\r\n if (val === 1) {\r\n vm.config.accountingStyle(true);\r\n }\r\n else if (val === 2) {\r\n vm.config.accountingStyle(false);\r\n }\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n vm.config.format.subscribe(function () {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n\r\n vm.formattingRuleTextBoxOptions = {\r\n value: vm.formattingRuleName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.formattingRulePopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose a Formatting Rule\",\r\n onClick: function (e) {\r\n var onSelected = function (evt) {\r\n if (evt) {\r\n formattingRule.copyProperties(evt.model, vm.formattingRuleObj);\r\n vm.config.formattingRule(evt.model.id);\r\n vm.formattingRuleName(evt.model.name);\r\n formattingRule.hide();\r\n }\r\n };\r\n formattingRule.openList($(e.element).siblings(\".dx-textbox\"), onSelected, undefined, undefined, undefined);\r\n }\r\n };\r\n\r\n vm.formattingRuleRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Formatting Rule\",\r\n onClick: function (e) {\r\n let blankRule = formattingRule.getNewFormattingRule();\r\n formattingRule.copyProperties(blankRule, vm.formattingRuleObj);\r\n vm.config.formattingRule(null);\r\n vm.formattingRuleName(null);\r\n }\r\n };\r\n\r\n vm.config.comparisonFilter.dateOption.subscribe(function (newValue) {\r\n vm.shouldUpdateData = true;\r\n if (newValue !== ComparisonDateOptionStrEnum.Manual) {\r\n if (!vm.config.indicatorMetric()) {\r\n vm.config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n }\r\n else\r\n if (vm.config.targetMetric() === 0 || vm.config.targetMetric() !== vm.config.indicatorMetric()) {\r\n vm.config.targetMetric(vm.config.indicatorMetric());\r\n vm.targetMetricName(vm.indicatorMetricName());\r\n }\r\n }\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n\r\n vm.config.comparisonFilter.dateUnit.subscribe(function (value) {\r\n if (value !== ComparisonDateUnitStrEnum.Day && this.dateUnitValue() > 12) {\r\n this.dateUnitValue(1);\r\n }\r\n }.bind(vm.config.comparisonFilter));\r\n\r\n vm.decimalPlacesOptions = {\r\n value: vm.config.decimalPlaces,\r\n step: 1,\r\n showSpinButtons: true,\r\n min: 0,\r\n max: 10,\r\n width: 80,\r\n };\r\n\r\n ko.computed(function () {\r\n vm.config.comparisonFilter.dateUnitValue();\r\n vm.config.comparisonFilter.dateUnit();\r\n vm.config.comparisonFilter.dateRange();\r\n\r\n if (vm.widgetId && !vm.isSetupWidget) {\r\n vm.shouldUpdateData = true;\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n }, this);\r\n\r\n vm.comparisonDateOptions = [\r\n { value: ComparisonDateOptionStrEnum.Manual, text: \"None\" },\r\n { value: ComparisonDateOptionStrEnum.Previous, text: \"Previous\" },\r\n { value: ComparisonDateOptionStrEnum.Predefined, text: \"Predefined\" },\r\n ];\r\n\r\n vm.dxSelectBoxComparisonDateOption = {\r\n items: vm.comparisonDateOptions,\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n value: vm.config.comparisonFilter.dateOption,\r\n width: 70,\r\n //dropDownOptions: {\r\n // maxWidth: 40,\r\n //}\r\n };\r\n\r\n vm.comparisonDateUnitOptions = [\r\n { value: ComparisonDateUnitStrEnum.Year, text: \"Year\" },\r\n { value: ComparisonDateUnitStrEnum.Quarter, text: \"Quarter\" },\r\n { value: ComparisonDateUnitStrEnum.Month, text: \"Month\" },\r\n //{ value: \"Week\", text: \"Week\" },\r\n { value: ComparisonDateUnitStrEnum.Day, text: \"Day\" },\r\n ];\r\n\r\n vm.dxSelectBoxComparisonDateUnit = {\r\n items: vm.comparisonDateUnitOptions,\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n value: vm.config.comparisonFilter.dateUnitValue,\r\n width: 50,\r\n //dropDownOptions: {\r\n // maxWidth: 40,\r\n //}\r\n };\r\n\r\n vm.comparisonDateUnitValueOptions = [\r\n { value: 1 },\r\n { value: 2 },\r\n { value: 3 },\r\n { value: 4 },\r\n { value: 5 },\r\n { value: 6 },\r\n { value: 7 },\r\n { value: 8 },\r\n { value: 9 },\r\n { value: 10 },\r\n { value: 11 },\r\n { value: 12 },\r\n ];\r\n\r\n vm.distanceOptions = {\r\n dataSource: ko.observableArray(getDistanceOptions(vm)),\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n width: 140,\r\n value: ko.observable(vm.config.distanceType()),\r\n onValueChanged: function (e) {\r\n vm.config.distanceType(e.value);\r\n },\r\n elementAttr: { class: 'dx-textbox-right' },\r\n };\r\n\r\n vm.tabDetailButtonOptios = {\r\n hint: \"Click to open the tab details\",\r\n icon: \"more\",\r\n stylingMode: \"text\",\r\n visible: vm.config.tabId,\r\n onClick: function (e) {\r\n let tab = tabView.getActiveTab();\r\n let tabId = tab.attr(\"id\");\r\n let fieldId = vm.config.trendAxisField();\r\n let fieldAutoGrouping = vm.config.trendAxisFieldAutoGrouping();\r\n let filterValue = \"\";\r\n if (vm.config.useLastPeriod() && fieldId)\r\n filterValue = vm.result.trendValues[vm.result.trendValues.length - 1].axisValue;\r\n else\r\n fieldId = null; //Set for null so the filters won't get last period when copying filters\r\n let widgetId = vm.widgetId ? vm.widgetId() : $(e.element).closest(\"div.dashboardWidget\").data(\"widgetid\");\r\n\r\n var submitObject = {\r\n fromTabDetail: tabId,\r\n fromTabDetailWidget: widgetId,\r\n filterValue: filterValue,\r\n filterFieldId: fieldId,\r\n filterFieldAutoGrouping: fieldAutoGrouping,\r\n };\r\n\r\n tabView.openTab(vm.config.tabId(), submitObject);\r\n },\r\n };\r\n\r\n return vm;\r\n };\r\n\r\n var getDistanceOptions = function (vm) {\r\n let dataSource = [\r\n { value: \"Value\", text: \"Value\" },\r\n { value: \"Percent\", text: \"Percentage (0%)\" },\r\n { value: \"Percent100\", text: \"Percentage (100%)\" },\r\n { value: \"ValuePercent\", text: \"Value and % (0%)\" },\r\n { value: \"ValuePercent100\", text: \"Value and % (100%)\" }\r\n ];\r\n\r\n return dataSource;\r\n }\r\n\r\n var setBaseTextConfig = function (vmSettings, config) {\r\n vmSettings.alignmentArray = ko.observableArray([config.alignment()]);\r\n vmSettings.alignmentArray.subscribe(function (newValue) {\r\n config.alignment(newValue[0]);\r\n });\r\n vmSettings.alignmentOptions = {\r\n items: [\r\n {\r\n icon: \"alignleft\",\r\n alignment: \"Left\",\r\n hint: \"Align left\"\r\n },\r\n {\r\n icon: \"aligncenter\",\r\n alignment: \"Center\",\r\n hint: \"Center\"\r\n },\r\n {\r\n icon: \"alignright\",\r\n alignment: \"Right\",\r\n hint: \"Align right\"\r\n },\r\n ],\r\n keyExpr: \"alignment\",\r\n stylingMode: \"outlined\",\r\n selectedItemKeys: vmSettings.alignmentArray,\r\n elementAttr: { class: 'dx-textbox-right' },\r\n };\r\n\r\n vmSettings.fontSizeOptions = {\r\n format: \"#px\",\r\n value: config.fontSize,\r\n step: 1,\r\n showSpinButtons: true,\r\n min: 8,\r\n max: 200,\r\n width: 80,\r\n };\r\n };\r\n\r\n var formatValue = function (vm, value) {\r\n if (value === null || value === undefined)\r\n return \"\";\r\n\r\n let format = vm.config.format() === 1 ? FieldFormatStrEnum.Currency : (vm.config.format() == 2 ? FieldFormatStrEnum.Numeric : FieldFormatStrEnum.Percentage);\r\n let scaleSymbol = \"\";\r\n\r\n if (vm.config.showLargeNumber() && format !== FieldFormatStrEnum.Percentage) {\r\n let absValue = Math.abs(value);\r\n if (absValue > 1000000000) {\r\n scaleSymbol = \"B\";\r\n value = value / 1000000000;\r\n }\r\n else\r\n if (absValue > 1000000) {\r\n scaleSymbol = \"M\";\r\n value = value / 1000000;\r\n }\r\n else\r\n if (absValue > 1000) {\r\n scaleSymbol = \"K\";\r\n value = value / 1000;\r\n }\r\n }\r\n\r\n const currencySign = vm.config.accountingStyle() ? \"accounting\" : \"standard\";\r\n let dx = DevExpress as any;\r\n if (format === FieldFormatStrEnum.Currency)\r\n value = `${dx.formatHelper.format(value, { style: \"currency\", currency: vm.result.currencyCode, currencyDisplay: \"narrowSymbol\", precision: vm.config.decimalPlaces(), currencySign: currencySign })}`;\r\n else if (format === FieldFormatStrEnum.Numeric)\r\n value = `${dx.formatHelper.format(value, { style: \"decimal\", precision: vm.config.decimalPlaces(), currencySign: currencySign })}`;\r\n else if (format === FieldFormatStrEnum.Percentage)\r\n value = `${dx.formatHelper.format(value / 100, { style: \"percent\", precision: vm.config.decimalPlaces(), currencySign: currencySign })}`;\r\n\r\n if (scaleSymbol !== \"\") {\r\n if (value.includes(\")\")) {\r\n value = value.replace(\")\", scaleSymbol + \")\");\r\n }\r\n else {\r\n value += scaleSymbol;\r\n }\r\n }\r\n\r\n return value;\r\n };\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n let dataBindElement = $(\".widget-data-bind-element\", dashboardWidget);\r\n if (dataBindElement.length) {\r\n var resultData = dataBindElement.data(\"json\");\r\n vm.result = resultData;\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(vm.config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n\r\n if (vm.result) {\r\n vm.result.percentageValue = ko.computed(function () {\r\n let value = 0;\r\n if (vm.result.targetValue) {\r\n switch (vm.config.distanceType()) {\r\n case \"ValuePercent100\":\r\n case \"Percent100\":\r\n value = ((vm.result.indicatorValue - vm.result.targetValue) / Math.abs(vm.result.targetValue) + 1) * 100;\r\n break;\r\n case \"ValuePercent\":\r\n case \"Percent\":\r\n value = ((vm.result.indicatorValue - vm.result.targetValue) / Math.abs(vm.result.targetValue)) * 100;\r\n break;\r\n case \"Value\":\r\n value = vm.result.indicatorValue - vm.result.targetValue;\r\n break;\r\n }\r\n }\r\n return value;\r\n });\r\n\r\n vm.result.variance = ko.computed(function () {\r\n let value = \"\";\r\n switch (vm.config.distanceType()) {\r\n case \"Percent100\":\r\n case \"Percent\":\r\n value = ` (${vm.result.percentageValue().toFixed(2).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\")}%)`;\r\n break;\r\n case \"Value\":\r\n value = ` (${formatValue(vm, vm.result.percentageValue())})`;\r\n break;\r\n case \"ValuePercent100\":\r\n case \"ValuePercent\":\r\n {\r\n let percent = vm.result.percentageValue().toFixed(2).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n let vl = formatValue(vm, vm.result.indicatorValue - vm.result.targetValue);\r\n value = ` (${vl} / ${percent}%)`;\r\n }\r\n break;\r\n }\r\n return value;\r\n });\r\n\r\n vm.result.getFormattingRuleScale = function () {\r\n let referenceValue = vm.result.percentageValue();\r\n let scales = vm.formattingRuleObj.scales;\r\n let scale = null;\r\n for (var i = 0; i < scales.length; i++) {\r\n if (referenceValue >= scales[i].minValue) {\r\n scale = scales[i];\r\n }\r\n else {\r\n if (i === 0)\r\n scale = scales[i];\r\n break;\r\n }\r\n }\r\n\r\n return scale;\r\n };\r\n\r\n vm.result.color = ko.computed(function () {\r\n let color = vm.config.indicatorFontColor() ? vm.config.indicatorFontColor() : \"#000000\";\r\n\r\n if (vm.config.formattingRule() && (vm.config.targetMetric() !== 0 || vm.config.comparisonFilter.dateOption() !== ComparisonDateOptionStrEnum.Manual)) {\r\n let scale = vm.result.getFormattingRuleScale();\r\n if (scale && scale.fontColor && scale.fontColor !== \"transparent\") {\r\n color = scale.fontColor;\r\n }\r\n }\r\n\r\n return formattingRule.getColor(color, null);\r\n });\r\n\r\n vm.result.iconColor = ko.computed(function () {\r\n let color = vm.config.indicatorFontColor() ? vm.config.indicatorFontColor() : \"#000000\";\r\n\r\n if (vm.config.formattingRule() && (vm.config.targetMetric() !== 0 || vm.config.comparisonFilter.dateOption() !== ComparisonDateOptionStrEnum.Manual)) {\r\n let scale = vm.result.getFormattingRuleScale();\r\n if (scale && scale.color && scale.color !== \"transparent\") {\r\n color = scale.color;\r\n }\r\n }\r\n\r\n return formattingRule.getColor(color, null);\r\n });\r\n\r\n vm.result.sparkLineColor = ko.computed(function () {\r\n let color = vm.config.indicatorFontColor() ? vm.config.indicatorFontColor() : \"#000000\";\r\n\r\n if (vm.config.formattingRule() && (vm.config.targetMetric() !== 0 || vm.config.comparisonFilter.dateOption() !== ComparisonDateOptionStrEnum.Manual)) {\r\n let scale = vm.result.getFormattingRuleScale();\r\n if (scale && scale.color && scale.color !== \"transparent\") {\r\n color = scale.color;\r\n }\r\n\r\n if (scale && scale.fontColor && scale.fontColor !== \"transparent\") {\r\n color = scale.fontColor;\r\n }\r\n }\r\n\r\n return formattingRule.getColor(color, null);\r\n });\r\n\r\n vm.result.icon = ko.computed(function () {\r\n let icon = null;\r\n if (vm.config.formattingRule() && (vm.config.targetMetric() !== 0 || vm.config.comparisonFilter.dateOption() !== ComparisonDateOptionStrEnum.Manual)) {\r\n let scale = vm.result.getFormattingRuleScale();\r\n if (scale) {\r\n icon = \"bi-\" + scale.icon;\r\n }\r\n }\r\n return icon;\r\n });\r\n\r\n vm.result.targetColor = ko.computed(function () {\r\n let color = vm.config.indicatorFontColor() ? vm.config.indicatorFontColor() : \"#000000\";\r\n return color;\r\n });\r\n\r\n vm.result.indicator = ko.computed(function () {\r\n return formatValue(vm, vm.result.indicatorValue || 0);\r\n }, this);\r\n\r\n\r\n vm.result.target = ko.computed(function () {\r\n return formatValue(vm, vm.result.targetValue || 0);\r\n });\r\n }\r\n\r\n ko.applyBindings(vm, dataBindElement[0]);\r\n\r\n new ResizeObserver(function (e, resizeObserver) {\r\n //if element still in DOM\r\n if ($(e[0].target).parents('html').length > 0) {\r\n let sparkLine = $(\".widget-kpi-sparkline\", dashboardWidget).dxSparkline(\"instance\");\r\n if (sparkLine)\r\n sparkLine.render();\r\n }\r\n else\r\n resizeObserver.unobserve(e[0].target)\r\n }).observe($(\".widget-result\", dashboardWidget)[0]);\r\n }\r\n };\r\n\r\n return {\r\n setup: setup,\r\n setupViewModel: setupViewModel,\r\n updateNames: updateNames,\r\n };\r\n}());\r\n","/// \r\n\r\nvar widgetChart = (function () {\r\n\r\n var updateNames = function (vm) {\r\n \r\n\r\n vm.isNamesUpdated = true;\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"Chart\",\r\n icon: \"bi bi-clipboard-data\",\r\n content: \"Chart Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0],\r\n ];\r\n\r\n return vm;\r\n };\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n \r\n };\r\n\r\n return {\r\n setup: setup,\r\n setupViewModel: setupViewModel,\r\n updateNames: updateNames,\r\n };\r\n}());","/// \r\n\r\nvar widgetReport = (function () {\r\n\r\n var updateNames = function (vm) {\r\n \r\n\r\n vm.isNamesUpdated = true;\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"Report\",\r\n icon: \"bi bi-table\",\r\n content: \"Report Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0],\r\n ];\r\n\r\n return vm;\r\n };\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n \r\n };\r\n\r\n return {\r\n setup: setup,\r\n setupViewModel: setupViewModel,\r\n updateNames: updateNames,\r\n };\r\n}());","/// \r\n\r\nvar widgetPivot = (function () {\r\n\r\n var updateNames = function (vm) {\r\n \r\n\r\n vm.isNamesUpdated = true;\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"Pivot\",\r\n icon: \"bi bi-layout-text-window-reverse\",\r\n content: \"Pivot Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0],\r\n ];\r\n\r\n return vm;\r\n };\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n \r\n };\r\n\r\n return {\r\n setup: setup,\r\n setupViewModel: setupViewModel,\r\n updateNames: updateNames,\r\n };\r\n}());","declare var urlConfigs: any;\r\n\r\nenum FilterWidgetConditionEnum {\r\n Between = \"Between\",\r\n MultipleSelection = \"MultipleSelection\",\r\n SingleSelection = \"SingleSelection\"\r\n}\r\nenum FilterWidgetConditionTypeEnum {\r\n Equals = \"Equals\",\r\n Between = \"Between\",\r\n GreaterThan = \"GreaterThan\",\r\n LessThan = \"LessThan\",\r\n In = \"In\",\r\n EqualsOrGreaterThan = \"EqualsOrGreaterThan\",\r\n EqualsOrLessThan = \"EqualsOrLessThan\",\r\n Different = \"Different\",\r\n NotBetween = \"NotBetween\",\r\n NotIn = \"NotIn\"\r\n}\r\n\r\nenum FilterWidgetEditorTypeEnum {\r\n DropDown = \"DropDown\",\r\n List = \"List\",\r\n DateRange = \"DateRange\",\r\n Date = \"Date\"\r\n}\r\nenum FilterWidgetApplyConditionEnum {\r\n Manually = \"Manually\",\r\n Automatic = \"Automatic\"\r\n}\r\n\r\nenum FilterWidgetDataTypeEnum {\r\n None = \"NONE\",\r\n String = \"STRING\",\r\n Number = \"NUMBER\",\r\n Date = \"DATE\",\r\n Bit = \"BIT\",\r\n Bool = \"BOOL\"\r\n}\r\n\r\nvar widgetFilter = (function () {\r\n var updateNames = function (vm) {\r\n\r\n vm.boundFieldName(mappingDataSource.getFieldName(vm.config.boundField()));\r\n let field = mappingDataSource.getField(vm.config.boundField());\r\n if (field) {\r\n vm.boundFieldDisplayName(field.displayName);\r\n }\r\n\r\n vm.displayFieldName(mappingDataSource.getFieldName(vm.config.displayField()));\r\n field = mappingDataSource.getField(vm.config.displayField());\r\n if (field) {\r\n vm.displayFieldDisplayName(field.displayName);\r\n }\r\n\r\n vm.metricFieldName(mappingDataSource.getMetricName(vm.config.metricField()));\r\n\r\n vm.isNamesUpdated = true;\r\n };\r\n\r\n var compareArrays = function (array1 = [], array2 = []) {\r\n return JSON.stringify(array1) === JSON.stringify(array2);\r\n }\r\n\r\n var setBaseTextConfig = function (vmSettings, config) {\r\n\r\n vmSettings.fontSizeOptions = {\r\n format: \"#px\",\r\n value: config.fontSize,\r\n step: 1,\r\n showSpinButtons: true,\r\n min: 8,\r\n max: 200,\r\n width: 80,\r\n };\r\n\r\n vmSettings.fontStyleOptions = [\r\n {\r\n icon: 'bold',\r\n style: 'Bold',\r\n hint: 'Bold'\r\n },\r\n {\r\n icon: 'italic',\r\n style: 'Italic',\r\n hint: 'Italic'\r\n }\r\n ];\r\n };\r\n\r\n var refreshEditor = function (vm, context) {\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DropDown) {\r\n let divDropDown = $(\"#filterWidgetDropDown\", context) as any;\r\n let dropDown = divDropDown.dxDropDownBox(\"instance\");\r\n if (dropDown) {\r\n dropDown.repaint();\r\n }\r\n }\r\n else if (vm.config.editorType() === FilterWidgetEditorTypeEnum.List) {\r\n let divList = $(\"#filterWidgetList\", context) as any;\r\n let list = divList.dxDataGrid(\"instance\");\r\n if (list) {\r\n list.repaint();\r\n }\r\n }\r\n };\r\n\r\n var updateValuesStyle = function (vm, context) {\r\n switch (vm.config.editorType()) {\r\n case FilterWidgetEditorTypeEnum.DropDown:\r\n case FilterWidgetEditorTypeEnum.Date:\r\n case FilterWidgetEditorTypeEnum.DateRange:\r\n $(\"input[type='text']\", $(\"#filterWidgetDropDown, .date-filter-comp, .dateRange-filter-comp\", context)).css({\r\n 'font-size': vm.config.valuesTextConfig.fontSize() + 'px',\r\n 'color': vm.config.valuesTextConfig.fontColor(),\r\n 'font-weight': vm.config.valuesTextConfig.fontBold() ? 'bold' : 'normal',\r\n 'font-style': vm.config.valuesTextConfig.fontItalic() ? 'italic' : 'normal'\r\n })\r\n break;\r\n case FilterWidgetEditorTypeEnum.List:\r\n $(\"span:not(.glyphicon, .dx-checkbox-icon)\", $(\".multiSelect-filter-comp\", context)).css({\r\n 'font-size': vm.config.valuesTextConfig.fontSize() + 'px',\r\n 'color': vm.config.valuesTextConfig.fontColor(),\r\n 'font-weight': vm.config.valuesTextConfig.fontBold() ? 'bold' : 'normal',\r\n 'font-style': vm.config.valuesTextConfig.fontItalic() ? 'italic' : 'normal'\r\n })\r\n $(\"span.glyphicon\", $(\".multiSelect-filter-comp\", context)).css({\r\n /*'font-size': vm.config.valuesTextConfig.fontSize() + 'px',*/\r\n 'color': vm.config.valuesTextConfig.fontColor(),\r\n //'font-weight': vm.config.valuesTextConfig.fontBold() ? 'bold' : 'normal',\r\n //'font-style': vm.config.valuesTextConfig.fontItalic() ? 'italic' : 'normal'\r\n })\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n var updateDataEditor = function (vm, context, updateOptions: any = null) {\r\n updateOptions = updateOptions || {};\r\n updateOptions.dataSource = updateOptions.dataSource === undefined ? true : updateOptions.dataSource;\r\n updateOptions.columns = updateOptions.columns === undefined ? true : updateOptions.columns;\r\n updateOptions.fields = updateOptions.fields === undefined ? true : updateOptions.fields;\r\n updateOptions.selectedValues = updateOptions.selectedValues === undefined ? true : updateOptions.selectedValues;\r\n updateOptions.style = updateOptions.style === undefined ? true : updateOptions.style;\r\n\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DropDown) {\r\n let divDropDown = $(\"#filterWidgetDropDown\", context) as any;\r\n let dropDown = divDropDown.dxDropDownBox(\"instance\");\r\n if (dropDown) {\r\n dropDown.beginUpdate();\r\n if (updateOptions.dataSource && vm.result) {\r\n vm.dropDownOptions.dataSource(vm.result.dataTable);\r\n }\r\n\r\n if (updateOptions.fields) {\r\n vm.dropDownOptions.valueExpr(\"0\");\r\n if (vm.displayFieldName() && vm.boundFieldName() !== vm.displayFieldName()) {\r\n vm.dropDownOptions.displayExpr(\"1\");\r\n }\r\n }\r\n\r\n if (updateOptions.selectedValues && !compareArrays(vm.config.values.listValues(), vm.dropDownOptions.value())) {\r\n let values = vm.config.values.listValues() || [];\r\n vm.dropDownOptions.value(values.slice());\r\n }\r\n dropDown.endUpdate();\r\n }\r\n }\r\n else if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange || vm.config.editorType() === FilterWidgetEditorTypeEnum.Date) {\r\n checkDateFunctions(vm, context);\r\n }\r\n\r\n if (updateOptions.style) {\r\n updateValuesStyle(vm, context);\r\n }\r\n\r\n vm.conditionOptions.dataSource(getDataSourceCondition(vm));\r\n vm.conditionTypeOptions.dataSource(getDataSourceConditionType(vm));\r\n vm.editorTypeOptions.dataSource(getDataSourceEditorType(vm));\r\n disabledEditors(vm);\r\n };\r\n\r\n var removeBoundField = function (vm, callback: Function = null, allowRemoveMapping: boolean = true) {\r\n if (vm.config.boundField()) {\r\n if (vm.config.titleText() === vm.boundFieldDisplayName()) {\r\n vm.config.titleText(null);\r\n }\r\n if (vm.config.displayField()) {\r\n vm.config.titleText(vm.displayFieldDisplayName());\r\n }\r\n\r\n if (vm.config.dynamicParameterName() === vm.boundFieldName()) {\r\n vm.config.dynamicParameterName(null);\r\n }\r\n\r\n let field = mappingDataSource.getField(vm.config.boundField());\r\n enabledAvailableFilters(field, true);\r\n\r\n vm.boundFieldName(null);\r\n vm.boundFieldDisplayName(null);\r\n vm.config.boundField(null);\r\n\r\n if (allowRemoveMapping) {\r\n removeMappingFilter(vm);\r\n }\r\n\r\n if (!vm.shouldUpdateData) {\r\n dashboard.saveWidgetConfig(vm, true, callback);\r\n }\r\n }\r\n };\r\n var removeDisplayField = function (vm, allowRemoveMapping: boolean = true) {\r\n if (vm.config.displayField()) {\r\n if (vm.config.titleText() === vm.displayFieldDisplayName()) {\r\n vm.config.titleText(null);\r\n }\r\n if (vm.config.boundField()) {\r\n vm.config.titleText(vm.boundFieldDisplayName());\r\n }\r\n\r\n vm.displayFieldName(null);\r\n vm.displayFieldDisplayName(null);\r\n vm.config.displayField(null);\r\n vm.config.boundFieldVisible(true);\r\n\r\n if (allowRemoveMapping) {\r\n removeMappingFilter(vm);\r\n }\r\n\r\n if (!vm.shouldUpdateData) {\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n }\r\n };\r\n var removeMetricField = function (vm, callback: Function = null) {\r\n if (vm.config.metricField()) {\r\n vm.metricFieldName(null);\r\n vm.config.metricField(null);\r\n\r\n if (!vm.shouldUpdateData) {\r\n dashboard.saveWidgetConfig(vm, true, callback);\r\n }\r\n }\r\n };\r\n var removeMappingFilter = function (vm, callback: Function = null) {\r\n if (vm.config.mappingFilter()) {\r\n vm.config.mappingFilterName(null);\r\n vm.config.mappingFilter(null);\r\n\r\n let field = mappingDataSource.getField(vm.config.boundField());\r\n if (field) {\r\n enabledAvailableFilters(field, true)\r\n }\r\n\r\n if (!vm.shouldUpdateData) {\r\n dashboard.saveWidgetConfig(vm, true, callback);\r\n }\r\n }\r\n }\r\n\r\n var getColumns = function (vm) {\r\n let columns = [];\r\n\r\n columns.push({ dataField: \"0\", caption: vm.boundFieldDisplayName(), visible: vm.config.boundFieldVisible() });\r\n\r\n if (vm.displayFieldName() && vm.boundFieldName() !== vm.displayFieldName()) {\r\n columns.push({ dataField: \"1\", caption: vm.displayFieldDisplayName() });\r\n }\r\n\r\n return columns;\r\n };\r\n\r\n var sortBySelectedRows = function (dataGrid, columns, dataSource = null) {\r\n dataGrid.clearSorting();\r\n let data = dataSource || dataGrid.option(\"dataSource\");\r\n let selectedRowKeys = dataGrid.option(\"selectedRowKeys\");\r\n data.sort(function (a, b) {\r\n let valA = a[columns[0].dataField];\r\n let valB = b[columns[0].dataField];\r\n let valASelected = false;\r\n let valBSelected = false;\r\n if (selectedRowKeys) {\r\n if (selectedRowKeys.includes(valA)) {\r\n valASelected = true;\r\n }\r\n\r\n if (selectedRowKeys.includes(valB)) {\r\n valBSelected = true;\r\n }\r\n }\r\n\r\n if ((valASelected && valBSelected) || (!valASelected && !valBSelected)) {\r\n if (valA < valB) {\r\n return -1;\r\n }\r\n if (valA > valB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n else if (valASelected) {\r\n return -1;\r\n }\r\n else {\r\n return 1;\r\n }\r\n });\r\n if (!dataSource) {\r\n dataGrid.option(\"dataSource\", data);\r\n }\r\n }\r\n\r\n var getDataSourceCondition = function (vm) {\r\n var dataSourceCondition = [];\r\n\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange) {\r\n dataSourceCondition.push({ value: FilterWidgetConditionEnum.Between, text: \"Between\" });\r\n }\r\n else if (vm.config.editorType() === FilterWidgetEditorTypeEnum.Date) {\r\n dataSourceCondition.push({ value: FilterWidgetConditionEnum.SingleSelection, text: \"Single Selection\" });\r\n }\r\n else {\r\n dataSourceCondition.push({ value: FilterWidgetConditionEnum.MultipleSelection, text: \"Multiple Selection\" });\r\n dataSourceCondition.push({ value: FilterWidgetConditionEnum.SingleSelection, text: \"Single Selection\" });\r\n }\r\n\r\n return dataSourceCondition;\r\n };\r\n var getDataSourceConditionType = function (vm) {\r\n var dataSourceCondition = [];\r\n\r\n if (vm.config.condition() === FilterWidgetConditionEnum.Between) {\r\n dataSourceCondition.push({ value: FilterWidgetConditionTypeEnum.Between, text: \"Between\" });\r\n }\r\n else if (vm.config.condition() === FilterWidgetConditionEnum.MultipleSelection) {\r\n dataSourceCondition.push({ value: FilterWidgetConditionTypeEnum.In, text: \"In\" });\r\n dataSourceCondition.push({ value: FilterWidgetConditionTypeEnum.NotIn, text: \"Not In\" });\r\n }\r\n else if (vm.config.condition() === FilterWidgetConditionEnum.SingleSelection) {\r\n dataSourceCondition.push({ value: FilterWidgetConditionTypeEnum.Equals, text: \"Equals\" });\r\n dataSourceCondition.push({ value: FilterWidgetConditionTypeEnum.Different, text: \"Different\" });\r\n }\r\n\r\n return dataSourceCondition;\r\n };\r\n var getDataSourceEditorType = function (vm) {\r\n var dataSourceEditorType = [];\r\n\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange || vm.config.editorType() === FilterWidgetEditorTypeEnum.Date) {\r\n dataSourceEditorType.push({ value: FilterWidgetEditorTypeEnum.DateRange, text: \"Date Range\" });\r\n dataSourceEditorType.push({ value: FilterWidgetEditorTypeEnum.Date, text: \"Date\" });\r\n }\r\n else {\r\n dataSourceEditorType.push({ value: FilterWidgetEditorTypeEnum.DropDown, text: \"Drop Down\" });\r\n dataSourceEditorType.push({ value: FilterWidgetEditorTypeEnum.List, text: \"List\" });\r\n }\r\n\r\n return dataSourceEditorType;\r\n };\r\n\r\n var disabledEditors = function (vm) {\r\n let disabled = vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange || vm.config.editorType() === FilterWidgetEditorTypeEnum.Date;\r\n vm.displayFieldTextBoxOptions.disabled(disabled);\r\n vm.displayFieldPopoverButtonOptions.disabled(disabled);\r\n vm.displayFieldRemoveButtonOptions.disabled(disabled);\r\n vm.conditionOptions.disabled(disabled);\r\n vm.conditionTypeOptions.disabled(vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange);\r\n\r\n vm.boundFieldVisibleOptions.disabled(disabled || !vm.config.displayField());\r\n\r\n vm.metricFieldTextBoxOptions.disabled(disabled);\r\n vm.metricFieldPopoverButtonOptions.disabled(disabled);\r\n vm.metricFieldRemoveButtonOptions.disabled(disabled);\r\n };\r\n\r\n var updateWidgets = function (vm) {\r\n if (vm) {\r\n let widgets = dashboard.getWidgets();\r\n let widgetsId = [];\r\n widgets.forEach(function (widget) {\r\n if (widget.id !== vm.widgetId()) {\r\n widgetsId.push(widget.id);\r\n }\r\n });\r\n dashboard.refreshWidgets(widgetsId);\r\n\r\n filtersManager.clearRemovedFilterList();\r\n }\r\n };\r\n var publishValues = function (vm, saveConfig: boolean = true, useDelayMultipleSelection: boolean = true, refreshWidget: boolean = true) {\r\n let publish = function () {\r\n let update = function () {\r\n if (vm.config.applyCondition() === FilterWidgetApplyConditionEnum.Manually) {\r\n irGlobal.enableUpdateButton(true, function () { updateWidgets(vm); });\r\n }\r\n else if (vm.config.applyCondition() === FilterWidgetApplyConditionEnum.Automatic) {\r\n updateWidgets(vm);\r\n }\r\n };\r\n if (saveConfig) {\r\n if (!refreshWidget) {\r\n vm.shouldUpdateData = false;\r\n }\r\n\r\n dashboard.saveWidgetConfig(vm, true, function () {\r\n update();\r\n }, false);\r\n }\r\n else {\r\n update();\r\n }\r\n };\r\n\r\n if (vm.config.condition() === FilterWidgetConditionEnum.MultipleSelection && useDelayMultipleSelection) {\r\n clearTimeout(vm.idTimeoutPublish);\r\n vm.idTimeoutPublish = setTimeout(function () {\r\n publish();\r\n }, 750);\r\n }\r\n else {\r\n publish();\r\n }\r\n };\r\n\r\n var enabledAvailableFilters = function (field, enabled) {\r\n let availableFilters = dashboard.getAvailableFilters();\r\n let filters = availableFilters.filter(function (x) { return x.filterFieldName === field.fieldName && x.filterFieldTableName === field.tableName; });\r\n filters.forEach(function (filter) {\r\n filter.updateVisible(enabled);\r\n });\r\n }\r\n\r\n var checkDateFunctions = function (vm, context) {\r\n if (vm.dateRanges && !vm.dateRanges().find(function (x) { return x.id() === vm.config.values.dates.typeDateRange(); })) {\r\n let oldEditingDefaultDates = vm.editingDefaultDates;\r\n vm.editingDefaultDates = true;\r\n vm.config.values.dates.typeDateRange(irGlobal.customDate.custom);\r\n vm.editingDefaultDates = oldEditingDefaultDates;\r\n }\r\n }\r\n\r\n var calculateHeightFilterList = function (context) {\r\n let div = $(\".editorType\", context);;\r\n let label = $(\".widget-container-filter-name\", context);\r\n let height = Math.max(16, label.height());\r\n div.css(\"height\", `calc(100% - ${(height + 11)}px)`);\r\n }\r\n\r\n var removedWidget = function (vm) {\r\n if (vm) {\r\n let field = mappingDataSource.getField(vm.config.boundField());\r\n if (field) {\r\n enabledAvailableFilters(field, true)\r\n }\r\n }\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n vm.idTimeoutPublish = null;\r\n\r\n vm.showMappingFilter = ko.observable(vm.config.mappingFilter() && vm.config.mappingFilter() > 0);\r\n if (!vm.showMappingFilter() && (!vm.config.boundField() || vm.config.boundField() === 0)) {\r\n vm.showMappingFilter(true);\r\n }\r\n\r\n vm.valuesSelectedTitleText = ko.observable(\"\");\r\n vm.computedValuesSelectedTitleText = ko.computed(function () {\r\n calculateHeightFilterList(widgetContainer);\r\n if (vm.config.condition() === FilterWidgetConditionEnum.MultipleSelection && vm.config.editorType() === FilterWidgetEditorTypeEnum.List) {\r\n return `${vm.valuesSelectedTitleText()}`;\r\n }\r\n\r\n return \"\";\r\n });\r\n\r\n vm.showMappingFilter.subscribe(function (show) {\r\n vm.shouldUpdateData = true;\r\n removeMappingFilter(vm);\r\n removeDisplayField(vm, false);\r\n vm.config.values.listValues([]);\r\n\r\n vm.shouldUpdateData = false;\r\n removeBoundField(vm, function () {\r\n publishValues(vm, false, false);\r\n }, false);\r\n });\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"Filter\",\r\n icon: \"bi bi-circle-square\",\r\n content: \"Filter Settings\"\r\n },\r\n {\r\n id: 2,\r\n text: \"Visual\",\r\n icon: \"bi bi-card-checklist\",\r\n content: \"KPI Visual Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0]\r\n ];\r\n\r\n vm.saveValueChanged = true;\r\n vm.boundFieldName = ko.observable(\"\");\r\n vm.boundFieldDisplayName = ko.observable(\"\");\r\n vm.displayFieldName = ko.observable(\"\");\r\n vm.displayFieldDisplayName = ko.observable(\"\");\r\n vm.metricFieldName = ko.observable(\"\");\r\n vm.defaultDateRange = null;\r\n vm.editingDefaultDates = false;\r\n\r\n vm.titleTextSettings = {};\r\n vm.valuesTextSettings = {};\r\n setBaseTextConfig(vm.titleTextSettings, vm.config.titleTextConfig);\r\n setBaseTextConfig(vm.valuesTextSettings, vm.config.valuesTextConfig);\r\n\r\n var refreshValuesStyle = function () {\r\n refreshEditor(vm, widgetContainer);\r\n updateValuesStyle(vm, widgetContainer);\r\n }\r\n\r\n vm.config.values.listValues.subscribe(function (oldValue) {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n vm.config.values.dates.startDate.subscribe(function (oldValue) {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n vm.config.values.dates.endDate.subscribe(function (oldValue) {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n\r\n var updateAndRefreshEditor = function (updateOptions: any = null) {\r\n updateDataEditor(vm, widgetContainer, updateOptions);\r\n };\r\n vm.config.valuesTextConfig.fontSize.subscribe(refreshValuesStyle);\r\n vm.config.valuesTextConfig.fontColor.subscribe(refreshValuesStyle);\r\n vm.config.valuesTextConfig.fontBold.subscribe(refreshValuesStyle);\r\n vm.config.valuesTextConfig.fontItalic.subscribe(refreshValuesStyle);\r\n\r\n vm.config.editorType.subscribe(function () {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n vm.config.editorType.subscribe(function () {\r\n if (vm.filter) {\r\n switch (vm.config.editorType()) {\r\n case FilterWidgetEditorTypeEnum.Date:\r\n vm.filter.filterEditorType(FilterEditorTypeEnum.Date);\r\n vm.config.values.dates.endDate(null);\r\n vm.filter.endCondition(null);\r\n break;\r\n case FilterWidgetEditorTypeEnum.DateRange:\r\n vm.filter.filterEditorType(FilterEditorTypeEnum.DateRange);\r\n if (!vm.config.values.dates.endDate()) {\r\n if (vm.config.values.dates.typeDateRange() !== irGlobal.customDate.custom && vm.config.values.dates.typeDateRange() !== irGlobal.customDate.none) {\r\n let functionDate = vm.dateRanges().find(function (x) { return x.id() === vm.config.values.dates.typeDateRange(); });\r\n if (functionDate) {\r\n vm.config.values.dates.endDate(`${functionDate.endDate()}T00:00:00`);\r\n }\r\n else {\r\n vm.config.values.dates.endDate(vm.config.values.dates.startDate());\r\n }\r\n }\r\n else {\r\n vm.config.values.dates.endDate(vm.config.values.dates.startDate());\r\n }\r\n\r\n vm.filter.endCondition(vm.config.values.dates.endDate());\r\n }\r\n break;\r\n case FilterWidgetEditorTypeEnum.DropDown:\r\n break;\r\n case FilterWidgetEditorTypeEnum.List:\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n });\r\n vm.config.conditionType.subscribe(function () {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n vm.config.conditionType.subscribe(function () {\r\n if (!vm.editorTypeChanging && !vm.conditionChanging) {\r\n publishValues(vm, true, false);\r\n }\r\n });\r\n vm.config.condition.subscribe(function () {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n vm.config.condition.subscribe(function (newCondition) {\r\n vm.conditionChanging = true;\r\n let values = vm.config.values.listValues();\r\n if (newCondition === FilterWidgetConditionEnum.SingleSelection) {\r\n if (Array.isArray(values)) {\r\n if (values.length > 1) {\r\n vm.config.values.listValues(values.slice(0, 1));\r\n }\r\n }\r\n else {\r\n vm.config.values.listValues(null);\r\n }\r\n\r\n if (vm.config.conditionType() !== FilterWidgetConditionTypeEnum.Equals && vm.config.conditionType() !== FilterWidgetConditionTypeEnum.Different) {\r\n if (vm.config.conditionType() === FilterWidgetConditionTypeEnum.NotIn) {\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.Different);\r\n }\r\n else {\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.Equals);\r\n }\r\n }\r\n }\r\n else if (newCondition === FilterWidgetConditionEnum.MultipleSelection) {\r\n if (!Array.isArray(values)) {\r\n vm.config.values.listValues([values]);\r\n }\r\n\r\n if (vm.config.conditionType() !== FilterWidgetConditionTypeEnum.In && vm.config.conditionType() !== FilterWidgetConditionTypeEnum.NotIn) {\r\n if (vm.config.conditionType() === FilterWidgetConditionTypeEnum.Different) {\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.NotIn);\r\n }\r\n else {\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.In);\r\n }\r\n }\r\n }\r\n else {\r\n if (vm.config.conditionType() !== FilterWidgetConditionTypeEnum.Between) {\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.Between);\r\n }\r\n }\r\n\r\n updateAndRefreshEditor({ style: false });\r\n refreshEditor(vm, widgetContainer);\r\n updateValuesStyle(vm, widgetContainer);\r\n\r\n vm.conditionChanging = false;\r\n if (!vm.editorTypeChanging) {\r\n publishValues(vm, true, false);\r\n }\r\n });\r\n vm.config.applyCondition.subscribe(updateAndRefreshEditor);\r\n vm.config.boundFieldVisible.subscribe(function () {\r\n updateDataEditor(vm, widgetContainer, { dataSource: false, fields: false, selectedValues: false, style: false, columns: true });\r\n refreshValuesStyle();\r\n });\r\n vm.config.scopeAction.subscribe(function () {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n vm.config.scopeAction.subscribe(function () {\r\n publishValues(vm, true, false);\r\n });\r\n vm.config.values.dates.typeDateRange.subscribe(function () {\r\n vm.shouldUpdateData = true;\r\n }, null, \"beforeChange\");\r\n vm.config.titleText.subscribe(function () {\r\n calculateHeightFilterList(widgetContainer);\r\n });\r\n\r\n vm.conditionOptions = {\r\n dataSource: ko.observableArray(getDataSourceCondition(vm)),\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n width: 130,\r\n value: vm.config.condition,\r\n elementAttr: { class: 'dx-textbox-right' },\r\n disabled: ko.observable(false)\r\n };\r\n\r\n vm.conditionTypeOptions = {\r\n dataSource: ko.observableArray(getDataSourceConditionType(vm)),\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n width: 120,\r\n value: vm.config.conditionType,\r\n elementAttr: { class: 'dx-textbox-right' },\r\n disabled: ko.observable(false)\r\n }\r\n\r\n vm.applyConditionOptions = {\r\n dataSource: new DevExpress.data.ArrayStore({\r\n data: [\r\n { value: FilterWidgetApplyConditionEnum.Manually, text: \"Manually\" },\r\n { value: FilterWidgetApplyConditionEnum.Automatic, text: \"Automatic\" }\r\n ],\r\n key: \"value\",\r\n }),\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n width: 110,\r\n value: vm.config.applyCondition,\r\n elementAttr: { class: 'dx-textbox-right' }\r\n };\r\n\r\n vm.editorTypeOptions = {\r\n dataSource: ko.observableArray(getDataSourceEditorType(vm)),\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n width: 130,\r\n value: vm.config.editorType,\r\n onValueChanged: function (e) {\r\n vm.editorTypeChanging = true;\r\n vm.config.editorType(e.value);\r\n disabledEditors(vm);\r\n\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange) {\r\n if (e.previousValue !== FilterWidgetEditorTypeEnum.Date && e.previousValue !== FilterWidgetEditorTypeEnum.DateRange) {\r\n removeBoundField(vm);\r\n removeDisplayField(vm);\r\n removeMetricField(vm);\r\n }\r\n vm.config.condition(FilterWidgetConditionEnum.Between);\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.Between);\r\n }\r\n else if (vm.config.editorType() === FilterWidgetEditorTypeEnum.Date) {\r\n if (e.previousValue !== FilterWidgetEditorTypeEnum.Date && e.previousValue !== FilterWidgetEditorTypeEnum.DateRange) {\r\n removeBoundField(vm);\r\n removeDisplayField(vm);\r\n removeMetricField(vm);\r\n }\r\n vm.config.condition(FilterWidgetConditionEnum.SingleSelection);\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.Equals);\r\n }\r\n else {\r\n if (vm.config.condition() === FilterWidgetConditionEnum.Between) {\r\n vm.config.condition(FilterWidgetConditionEnum.MultipleSelection);\r\n vm.config.conditionType(FilterWidgetConditionTypeEnum.In);\r\n }\r\n }\r\n\r\n vm.conditionOptions.dataSource(getDataSourceCondition(vm));\r\n vm.conditionTypeOptions.dataSource(getDataSourceConditionType(vm));\r\n vm.editorTypeChanging = false;\r\n if (!vm.boundFieldChanging) {\r\n if (e.previousValue === FilterWidgetEditorTypeEnum.DateRange && vm.config.editorType() === FilterWidgetEditorTypeEnum.Date || \r\n e.previousValue === FilterWidgetEditorTypeEnum.Date && vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange) {\r\n publishValues(vm, true, false, false);\r\n }\r\n else {\r\n dashboard.saveWidgetConfig(vm, true, function () { updateAndRefreshEditor(); });\r\n }\r\n }\r\n },\r\n elementAttr: { class: 'dx-textbox-right' },\r\n };\r\n\r\n vm.scopeActionOptions = {\r\n dataSource: new DevExpress.data.ArrayStore({\r\n data: [\r\n { value: \"Default\", text: \"Default\" },\r\n { value: \"Combine\", text: \"Combine\" },\r\n { value: \"Overwrite\", text: \"Overwrite\" }\r\n ],\r\n key: \"value\",\r\n }),\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n width: 110,\r\n value: vm.config.scopeAction,\r\n elementAttr: { class: 'dx-textbox-right' }\r\n }\r\n\r\n vm.boundFieldVisibleOptions = {\r\n value: vm.config.boundFieldVisible,\r\n disabled: ko.observable(false)\r\n }\r\n\r\n let dataGrid = null;\r\n vm.dropDownOptions = {\r\n value: ko.observableArray([]),\r\n valueExpr: ko.observable(\"\"),\r\n placeholder: \"Select a value...\",\r\n displayExpr: ko.observable(\"\"),\r\n displayValueFormatter: function () {\r\n let value = vm.dropDownOptions.value();\r\n if (Array.isArray(value) && value.length > 1 && Array.isArray(vm.dropDownOptions.dataSource()) && vm.dropDownOptions.dataSource().length > 0) {\r\n if (value.length === vm.dropDownOptions.dataSource().length) {\r\n return \"All\";\r\n }\r\n\r\n return `${value.length}/${vm.dropDownOptions.dataSource().length}`;\r\n }\r\n\r\n return value;\r\n },\r\n showClearButton: true,\r\n dropDownOptions: {\r\n minWidth: 300\r\n },\r\n dataSource: ko.observableArray([]),\r\n contentTemplate: function (e) {\r\n let selectedValues = e.component.option(\"value\");\r\n let div = $(\"
\") as any;\r\n let columns = getColumns(vm);\r\n let $dataGrid = div.dxDataGrid({\r\n dataSource: e.component.option(\"dataSource\"),\r\n keyExpr: e.component.option(\"valueExpr\"),\r\n columns: columns,\r\n hoverStateEnabled: true,\r\n searchPanel: {\r\n visible: true,\r\n placeholder: \"Search...\"\r\n },\r\n scrolling: { mode: \"virtual\" },\r\n height: 250,\r\n selection: {\r\n mode: vm.config.condition() === FilterWidgetConditionEnum.MultipleSelection ? \"multiple\" : \"single\",\r\n showCheckBoxesMode: \"always\"\r\n },\r\n selectedRowKeys: selectedValues,\r\n onInitialized: function (e) {\r\n sortBySelectedRows(e.component, columns);\r\n },\r\n onSelectionChanged: function (selectedItems) {\r\n let keys = selectedItems.selectedRowKeys;\r\n if (!compareArrays(vm.config.values.listValues(), keys)) {\r\n vm.config.values.listValues(keys.slice());\r\n if (vm.saveValueChanged) {\r\n publishValues(vm, true, true, false);\r\n\r\n if (vm.config.condition() === FilterWidgetConditionEnum.SingleSelection) {\r\n e.component.close();\r\n }\r\n }\r\n\r\n e.component.option(\"value\", keys);\r\n }\r\n },\r\n onRowClick: function (e) {\r\n if (vm.config.condition() === FilterWidgetConditionEnum.MultipleSelection) {\r\n if (e.component.isRowSelected(e.key)) {\r\n e.component.deselectRows([e.key]);\r\n }\r\n else {\r\n e.component.selectRows([e.key], true);\r\n }\r\n }\r\n },\r\n toolbar: {\r\n items: [\r\n {\r\n name: \"searchPanel\",\r\n locateInMenu: \"auto\",\r\n }/*,\r\n {\r\n location: 'after',\r\n widget: 'dxButton',\r\n options: {\r\n icon: 'sorted',\r\n text: \"Sort by selected rows\",\r\n onInitialized: function (e) {\r\n e.element.css(\"float\", \"right\").css(\"background-color\", \"white\");\r\n },\r\n onClick: function (e) {\r\n sortBySelectedRows(dataGrid, columns);\r\n },\r\n },\r\n }*/\r\n ],\r\n }\r\n });\r\n\r\n dataGrid = $dataGrid.dxDataGrid(\"instance\");\r\n e.component.option(\"onOpened\", function (e) {\r\n $(\".dx-toolbar-after\", div).css({ 'width': '100%', 'padding-left': '0px' });\r\n $(\".dx-datagrid-search-panel\", div).css({ 'width': '100%', 'margin-left': '0px' });\r\n });\r\n\r\n return $dataGrid;\r\n },\r\n onValueChanged: function (e) {\r\n var value = e.value;\r\n if (dataGrid) {\r\n dataGrid.selectRows(value, false);\r\n }\r\n else {\r\n if (vm.saveValueChanged && !compareArrays(vm.config.values.listValues(), e.value)) {\r\n if (vm.saveValueChanged) {\r\n publishValues(vm, true, true, false);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n vm.dateTypeBoundField = ko.computed(function () {\r\n if (vm.boundFieldName()) {\r\n let boundField = mappingDataSource.getField(vm.config.boundField());\r\n return boundField ? boundField.type === FilterWidgetDataTypeEnum.Date : false;\r\n }\r\n return false;\r\n });\r\n\r\n vm.boundFieldTextBoxOptions = {\r\n value: vm.boundFieldDisplayName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n let selectBoundField = function (item, searchDashboardFilter: boolean = true, allowPublishValues: boolean = true, allowRemoveMappingFilter: boolean = true) {\r\n vm.shouldUpdateData = true;\r\n vm.boundFieldChanging = true;\r\n\r\n if (item.type === FilterWidgetDataTypeEnum.Date) {\r\n if (item.editorType === FilterWidgetEditorTypeEnum.Date) {\r\n if (vm.config.editorType() !== FilterWidgetEditorTypeEnum.Date) {\r\n vm.config.editorType(FilterWidgetEditorTypeEnum.Date)\r\n }\r\n }\r\n else if (item.editorType === FilterWidgetEditorTypeEnum.DateRange || item.editorType === undefined) {\r\n if (vm.config.editorType() !== FilterWidgetEditorTypeEnum.DateRange) {\r\n vm.config.editorType(FilterWidgetEditorTypeEnum.DateRange)\r\n }\r\n }\r\n }\r\n else {\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange || vm.config.editorType() === FilterWidgetEditorTypeEnum.Date) {\r\n vm.config.editorType(FilterWidgetEditorTypeEnum.DropDown)\r\n }\r\n }\r\n\r\n if (!vm.config.titleText() || vm.config.titleText() === vm.boundFieldDisplayName()) {\r\n vm.config.titleText(item.displayName);\r\n }\r\n\r\n if (!vm.config.dynamicParameterName() || vm.config.dynamicParameterName() === vm.boundFieldName()) {\r\n vm.config.dynamicParameterName(item.nodeName);\r\n }\r\n\r\n vm.config.boundField(item.fieldId);\r\n vm.boundFieldName(item.nodeName);\r\n vm.boundFieldDisplayName(item.displayName);\r\n\r\n //Check functions date and date format\r\n if (item.type === FilterWidgetDataTypeEnum.Date) {\r\n checkDateFunctions(vm, widgetContainer);\r\n if (item.dateRangeId && vm.dateRanges) {\r\n let dateRangeId = parseInt(item.dateRangeId);\r\n if (dateRangeId > 0) {\r\n vm.editingDefaultDates = true;\r\n vm.config.values.dates.typeDateRange(dateRangeId);\r\n\r\n let functionDate = vm.dateRanges().find(function (x) { return x.id() === dateRangeId; });\r\n if (functionDate) {\r\n vm.config.values.dates.startDate(`${functionDate.startDate()}T00:00:00`);\r\n vm.config.values.dates.endDate(`${functionDate.endDate()}T00:00:00`);\r\n }\r\n\r\n vm.editingDefaultDates = false;\r\n }\r\n }\r\n }\r\n\r\n //Disable the filter from the list of available dashboard filters\r\n enabledAvailableFilters(item, false);\r\n\r\n //Get the existing dashboard filter with the same field and use its data to configure the widget\r\n let dashboardFilters = searchDashboardFilter ? dashboard.getDashboardFilters() : [];\r\n let dashboardFilter = dashboardFilters.find(function (x) { return x.filterFieldName === item.fieldName && x.filterFieldTableName === item.tableName; });\r\n if (dashboardFilter) {\r\n dashboardFilter.removeElement();\r\n vm.config.dynamicParameter(dashboardFilter.dynamicParameter);\r\n\r\n let dynamicName = dashboardFilter.dynamicParameterName;\r\n if (dynamicName && dynamicName.startsWith(\"@\")) {\r\n dynamicName = dynamicName.substring(1);\r\n }\r\n vm.config.dynamicParameterName(dynamicName);\r\n if (item.type === FilterWidgetDataTypeEnum.Date) {\r\n vm.editingDefaultDates = true;\r\n vm.saveValueChanged = false;\r\n\r\n vm.config.values.dates.typeDateRange(parseInt(dashboardFilter.dateRangeId, 10));\r\n \r\n vm.config.values.dates.startDate(`${dashboardFilter.startCondition}T00:00:00`);\r\n if (dashboardFilter.endCondition && dashboardFilter.endCondition != \"\") {\r\n vm.config.values.dates.endDate(`${dashboardFilter.endCondition}T00:00:00`);\r\n }\r\n else {\r\n vm.config.values.dates.endDate(`${dashboardFilter.startCondition}T00:00:00`);\r\n }\r\n\r\n vm.editingDefaultDates = false;\r\n vm.saveValueChanged = true;\r\n }\r\n else {\r\n\r\n let newListValues = [];\r\n if (dashboardFilter.startCondition !== \"\") {\r\n if (dashboardFilter.isMultiSelect) {\r\n let values = dashboardFilter.startCondition.split(\",\");\r\n values.forEach(function (value) {\r\n if (dashboardFilter.boundFieldDataType === FilterWidgetDataTypeEnum.Number) {\r\n value = parseFloat(value);\r\n }\r\n newListValues.push(value);\r\n });\r\n }\r\n else {\r\n let value = dashboardFilter.startCondition;\r\n if (dashboardFilter.boundFieldDataType === FilterWidgetDataTypeEnum.Number) {\r\n value = parseFloat(value);\r\n }\r\n newListValues.push(value);\r\n }\r\n }\r\n\r\n if (dashboardFilter.displayFieldName !== \"\") {\r\n let displayField = mappingDataSource.getFieldByName(dashboardFilter.displayFieldName, dashboardFilter.displayFieldTableName);\r\n if (displayField) {\r\n vm.config.displayField(displayField.fieldId)\r\n vm.displayFieldName(displayField.nodeName);\r\n vm.displayFieldDisplayName(displayField.displayName);\r\n }\r\n }\r\n\r\n if (!compareArrays(vm.config.values.listValues(), newListValues)) {\r\n vm.config.values.listValues(newListValues);\r\n }\r\n }\r\n }\r\n else {\r\n if (item.type === FilterWidgetDataTypeEnum.Date) {\r\n //If it is the first date field chosen, configure the item with the system's default date data\r\n if (!vm.defaultDateRange) {\r\n let div = $(\".editorType\", widgetContainer) as any;\r\n vm.defaultDateRange = div.data(\"defaultdate\");\r\n if (vm.defaultDateRange && !vm.config.values.dates.startDate()) {\r\n vm.saveValueChanged = false;\r\n\r\n vm.config.values.dates.typeDateRange(vm.defaultDateRange.typeDateRange);\r\n vm.editingDefaultDates = true;\r\n\r\n vm.config.values.dates.startDate(`${vm.defaultDateRange.startDate}T00:00:00`);\r\n\r\n vm.saveValueChanged = true;\r\n vm.config.values.dates.endDate(`${vm.defaultDateRange.endDate}T00:00:00`);\r\n vm.editingDefaultDates = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (allowRemoveMappingFilter) {\r\n removeMappingFilter(vm);\r\n }\r\n\r\n vm.boundFieldChanging = false;\r\n if (allowPublishValues) {\r\n publishValues(vm, true, false);\r\n }\r\n };\r\n vm.boundFieldPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Bound Field\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n selectBoundField(item);\r\n });\r\n\r\n //Remove fields already used by others filters\r\n let widgets = dashboard.getWidgets().filter(function (x) { return x.type === \"Filter\" && x.id !== vm.widgetId(); });\r\n let boundFields = widgets.map(function (x) { return x.vm.config.boundField(); });\r\n let nodes = mappingDataSource.getDataSourcePopover(\"NonMetricsNonDerivedDates\", $(e.element).siblings(\".dx-textbox\"));\r\n let newNodes = [];\r\n nodes.forEach(function (node) {\r\n let newNode = Object.assign({}, node);\r\n let fields = node.fields.filter(function (x) { return !boundFields.includes(x.fieldId); });\r\n newNode.fields = [];\r\n fields.forEach(function (field) {\r\n newNode.fields.push(field);\r\n });\r\n\r\n if (newNode.fields.length !== 0) {\r\n newNodes.push(newNode);\r\n }\r\n });\r\n\r\n mappingDataSource.showDataSourcePopover(\"NonMetricsNonDerivedDates\", null, newNodes);\r\n }\r\n };\r\n vm.boundFieldRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Bound Field\",\r\n onClick: function (e) {\r\n vm.config.values.listValues([]);\r\n removeBoundField(vm, function () {\r\n publishValues(vm, true, false);\r\n });\r\n }\r\n };\r\n\r\n vm.displayFieldTextBoxOptions = {\r\n value: vm.displayFieldDisplayName,\r\n width: 150,\r\n readOnly: true,\r\n disabled: ko.observable(false)\r\n };\r\n let selectDisplayField = function (item, allowPublishValues: boolean = true) {\r\n vm.shouldUpdateData = true;\r\n\r\n if (!vm.config.titleText() || vm.config.titleText() === vm.boundFieldDisplayName() || vm.config.titleText() === vm.displayFieldName()) {\r\n vm.config.titleText(item.displayName);\r\n }\r\n\r\n vm.config.displayField(item.fieldId);\r\n vm.displayFieldName(item.nodeName);\r\n vm.displayFieldDisplayName(item.displayName);\r\n\r\n if (allowPublishValues) {\r\n publishValues(vm, true, false);\r\n }\r\n };\r\n vm.displayFieldPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Display Field\",\r\n disabled: ko.observable(false),\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n selectDisplayField(item);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"NonMetricsNonDerivedDates\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.displayFieldRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Display Field\",\r\n disabled: ko.observable(false),\r\n onClick: function (e) {\r\n removeDisplayField(vm);\r\n }\r\n };\r\n\r\n vm.metricFieldTextBoxOptions = {\r\n value: vm.metricFieldName,\r\n width: 150,\r\n readOnly: true,\r\n disabled: ko.observable(false)\r\n };\r\n vm.metricFieldPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Metric Field\",\r\n disabled: ko.observable(false),\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n vm.config.metricField(item.metricId);\r\n vm.metricFieldName(item.nodeName);\r\n\r\n publishValues(vm, true, false);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.metricFieldRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Metric Field\",\r\n disabled: ko.observable(false),\r\n onClick: function (e) {\r\n removeMetricField(vm, function () {\r\n publishValues(vm, false, false);\r\n });\r\n }\r\n };\r\n\r\n vm.mappingFilterTextBoxOptions = {\r\n value: vm.config.mappingFilterName,\r\n width: 150,\r\n readOnly: true,\r\n disabled: ko.observable(false)\r\n };\r\n vm.mappingFilterPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Mapping Filter\",\r\n disabled: ko.observable(false),\r\n onClick: function (e) {\r\n let nodes = mappingDataSource.getDataSourcePopover(\"NonMetricsNonDerivedDates\", $(e.element).siblings(\".dx-textbox\"));\r\n\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n selectBoundField(item, true, false, false);\r\n\r\n if (!vm.dateTypeBoundField() && item.displayFieldName && item.displayFieldName !== \"\") {\r\n let tableNode = nodes.find(function (n) { return n.fields.find(function (f) { return f.nodeName === item.displayFieldName && f.tableName === item.displayFieldTableName; }) !== undefined; });\r\n if (tableNode) {\r\n let displayFieldNode = tableNode.fields.find(function (f) { return f.nodeName === item.displayFieldName && f.tableName === item.displayFieldTableName; });\r\n if (displayFieldNode) {\r\n selectDisplayField(displayFieldNode, false);\r\n }\r\n }\r\n }\r\n\r\n if (!item.displayFieldName || item.displayFieldName === \"\") {\r\n removeDisplayField(vm, false);\r\n }\r\n\r\n vm.shouldUpdateData = true;\r\n\r\n vm.config.mappingFilter(item.filterId);\r\n vm.config.mappingFilterName(item.title);\r\n\r\n vm.config.dynamicParameter(item.dynamicParameter);\r\n\r\n let dynamicName = item.dynamicParameterName;\r\n if (dynamicName && dynamicName.startsWith(\"@\")) {\r\n dynamicName = dynamicName.substring(1);\r\n }\r\n vm.config.dynamicParameterName(dynamicName);\r\n\r\n publishValues(vm, true, false);\r\n });\r\n\r\n let availableFilters = dashboard.getAvailableFilters().filter(function (f) { return f.visible; });\r\n let newNodes = [];\r\n availableFilters.forEach(function (availableFilter) {\r\n let tableNode = nodes.find(function (n) { return n.fields.find(function (f) { return f.nodeName === availableFilter.filterFieldName && f.tableName === availableFilter.filterFieldTableName; }) !== undefined; });\r\n if (tableNode) {\r\n let fieldNode = tableNode.fields.find(function (f) { return f.nodeName === availableFilter.filterFieldName && f.tableName === availableFilter.filterFieldTableName; });\r\n if (fieldNode) {\r\n newNodes.push({\r\n fieldId: fieldNode.fieldId,\r\n icon: availableFilter.icon,\r\n queryName: availableFilter.filterName,\r\n title: availableFilter.filterName,\r\n type: fieldNode.type,\r\n fieldName: availableFilter.filterFieldName,\r\n nodeName: availableFilter.filterFieldName,\r\n tableName: availableFilter.filterFieldTableName,\r\n displayFieldName: availableFilter.displayFieldName,\r\n displayFieldTableName: availableFilter.displayFieldTableName,\r\n dynamicParameter: availableFilter.dynamicParameter,\r\n dynamicParameterName: availableFilter.dynamicParameterName,\r\n filterId: availableFilter.id,\r\n editorType: availableFilter.editorType,\r\n dateRangeId: availableFilter.dateRangeId,\r\n });\r\n }\r\n }\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", null, newNodes, \"Mapping Filters\");\r\n }\r\n };\r\n vm.mappingFilterRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Mapping Filter\",\r\n disabled: ko.observable(false),\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n vm.config.values.listValues([]);\r\n removeMappingFilter(vm);\r\n removeDisplayField(vm, false);\r\n removeBoundField(vm, null, false);\r\n publishValues(vm, true, false);\r\n }\r\n };\r\n\r\n return vm;\r\n };\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n calculateHeightFilterList(dashboardWidget);\r\n\r\n let dataBindElement = $(\".widget-data-bind-element\", dashboardWidget);\r\n if (dataBindElement.length > 0) {\r\n var resultData = dataBindElement.data(\"json\");\r\n vm.result = resultData;\r\n\r\n if (vm.result && vm.result.dataTable) {\r\n let selectedValues = vm.config.values.listValues();\r\n let newSelectedValues = [];\r\n \r\n if (selectedValues.length > 0 && vm.result.dataTable.length > 0) {\r\n let fieldName = Object.keys(vm.result.dataTable[0])[0];\r\n if (fieldName) {\r\n selectedValues.forEach(function (x) {\r\n if (vm.result.dataTable.find(function (f) { return f[fieldName] == x })) {\r\n newSelectedValues.push(x);\r\n }\r\n });\r\n }\r\n\r\n if (newSelectedValues.length > 1 && vm.result.dataTable.length > 0) {\r\n if (newSelectedValues.length === vm.result.dataTable.length) {\r\n vm.valuesSelectedTitleText(\"All\");\r\n }\r\n else {\r\n vm.valuesSelectedTitleText(`${newSelectedValues.length}/${vm.result.dataTable.length}`);\r\n }\r\n }\r\n else {\r\n vm.valuesSelectedTitleText(\"\");\r\n }\r\n }\r\n else {\r\n vm.valuesSelectedTitleText(\"\");\r\n }\r\n\r\n if (!compareArrays(vm.config.values.listValues(), newSelectedValues)) {\r\n vm.config.values.listValues(newSelectedValues);\r\n dashboard.saveWidgetConfig(vm, true, null, false);\r\n }\r\n }\r\n\r\n vm.filter = null;\r\n if (vm.result) {\r\n //Copy filter properties beucase when converting an objcet to a Filter we lose the functions\r\n let filter = new Filter();\r\n Object.assign(filter, ko.mapping.fromJS(vm.result.filter.filter));\r\n\r\n vm.filter = filter;\r\n filter.dataSource = vm.result.dataTable;\r\n vm.dateRanges = ko.mapping.fromJS(vm.result.filter.dateRanges);\r\n vm.dateFormat = ko.observable(irSettings.shortDateFormat);\r\n vm.filter.customPublish = function () {\r\n if (!vm.editingDefaultDates) {\r\n let oldSaveValueChanged = vm.saveValueChanged;\r\n vm.saveValueChanged = false;\r\n\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange || vm.config.editorType() === FilterWidgetEditorTypeEnum.Date) {\r\n vm.config.values.dates.startDate(vm.filter.startCondition());\r\n\r\n if (vm.config.editorType() === FilterWidgetEditorTypeEnum.DateRange) {\r\n vm.config.values.dates.endDate(vm.filter.endCondition());\r\n }\r\n\r\n vm.config.values.dates.typeDateRange(vm.filter.dateRange());\r\n\r\n vm.config.values.dates.dateRangeConfig.userDates(vm.filter.dateRangeConfig.userDates());\r\n vm.config.values.dates.dateRangeConfig.lastDateUsed(vm.filter.dateRangeConfig.lastDateUsed());\r\n vm.config.values.dates.dateRangeConfig.startDate(vm.filter.dateRangeConfig.startDate());\r\n vm.config.values.dates.dateRangeConfig.endDate(vm.filter.dateRangeConfig.endDate());\r\n vm.config.values.dates.dateRangeConfig.multiplier(vm.filter.dateRangeConfig.multiplier());\r\n }\r\n else if (vm.config.editorType() === FilterWidgetEditorTypeEnum.List) {\r\n let multiSelectGrid = $(\".multiSelect-filter-comp\", dashboardWidget).dxDataGrid(\"instance\");\r\n let dataSource = multiSelectGrid.option(\"dataSource\") as any;\r\n let keys = multiSelectGrid.option(\"selectedRowKeys\");\r\n if (keys.length > 1 && dataSource.length > 0) {\r\n if (keys.length === dataSource.length) {\r\n vm.valuesSelectedTitleText(\"All\");\r\n }\r\n else {\r\n vm.valuesSelectedTitleText(`${keys.length}/${dataSource.length}`);\r\n }\r\n }\r\n else {\r\n vm.valuesSelectedTitleText(\"\");\r\n }\r\n\r\n vm.config.values.listValues(keys.slice());\r\n }\r\n\r\n vm.saveValueChanged = oldSaveValueChanged;\r\n }\r\n\r\n if (vm.saveValueChanged) {\r\n publishValues(vm, true, true, false);\r\n }\r\n };\r\n vm.filter.onContentReady = function (e) {\r\n updateValuesStyle(vm, dashboardWidget);\r\n }\r\n }\r\n\r\n ko.applyBindings(vm, dataBindElement[0]);\r\n\r\n updateNames(vm);\r\n updateDataEditor(vm, dashboardWidget);\r\n }\r\n else {\r\n updateDataEditor(vm, dashboardWidget);\r\n }\r\n\r\n calculateHeightFilterList(dashboardWidget);\r\n };\r\n\r\n return {\r\n setupViewModel: setupViewModel,\r\n setup: setup,\r\n updateNames: updateNames,\r\n updateWidgets: updateWidgets,\r\n removedWidget: removedWidget,\r\n calculateHeight: calculateHeightFilterList\r\n };\r\n\r\n}());","enum TreeMapColorizationEnum {\r\n Discrete = \"discrete\",\r\n Gradient = \"gradient\",\r\n Range = \"range\"\r\n}\r\n\r\ninterface TreeMapColumnInfo {\r\n index: number;\r\n queryName: string;\r\n autoGrouping: AutoGroupingEnum;\r\n groupingType: GroupingTypeEnum;\r\n dataType: DataTypeEnum;\r\n\r\n accountingStyle: boolean;\r\n decimalPlaces: number;\r\n metricFormat: FieldFormatEnum;\r\n}\r\n\r\ninterface TreeMapResultData {\r\n dataTable: [],\r\n dataSource: DevExpress.data.DataSource,\r\n sql: string,\r\n field: TreeMapColumnInfo,\r\n fieldsDrillDown: Array;\r\n groupField: TreeMapColumnInfo,\r\n metric: TreeMapColumnInfo,\r\n\r\n columnSeparator: string,\r\n currencyCode: string,\r\n dateSeparator: string,\r\n dateFormat: string,\r\n weekStartDay: string\r\n}\r\n\r\ninterface TreeMapLabel {\r\n showMetric: KnockoutObservable;\r\n unitFormat: KnockoutObservable;\r\n decimalPlaces: KnockoutObservable;\r\n format: KnockoutObservable;\r\n}\r\n\r\ninterface TreeMapConfig {\r\n metric: KnockoutObservable,\r\n\r\n field: KnockoutObservable,\r\n fieldAutoGrouping: KnockoutObservable,\r\n\r\n groupField: KnockoutObservable,\r\n groupFieldAutoGrouping: KnockoutObservable,\r\n\r\n colorization: KnockoutObservable,\r\n layout: KnockoutObservable,\r\n\r\n colorizeGroups: KnockoutObservable,\r\n startColor: KnockoutObservable,\r\n endColor: KnockoutObservable,\r\n formattingRule: KnockoutObservable\r\n\r\n label: TreeMapLabel\r\n topBottomType: KnockoutObservable,\r\n topBottomValue: KnockoutObservable,\r\n\r\n maxValue: number;\r\n}\r\n\r\nvar widgetTreeMap = (function () {\r\n var updateNames = function (vm) {\r\n vm.metricName(mappingDataSource.getMetricName(vm.config.metric()));\r\n\r\n vm.fieldName(getFeildDisplayName(vm.config.field(), vm.config.fieldAutoGrouping()));\r\n vm.groupFieldName(getFeildDisplayName(vm.config.groupField(), vm.config.groupFieldAutoGrouping()));\r\n\r\n vm.isNamesUpdated = true;\r\n };\r\n\r\n var hasDrillDown = function (result: TreeMapResultData) {\r\n return result?.fieldsDrillDown && result.fieldsDrillDown.length > 0\r\n }\r\n\r\n var resetDrillDown = function (result: TreeMapResultData, widgetContainer) {\r\n if (hasDrillDown(result)) {\r\n $(\"div#drilldownLinks a.drilldownLink\", widgetContainer).first().trigger('click');\r\n }\r\n }\r\n\r\n var getFeildDisplayName = function (fieldId: number, autoGrouping: AutoGroupingEnum): string{\r\n if (autoGrouping === AutoGroupingEnum.None) {\r\n return mappingDataSource.getFieldName(fieldId);\r\n }\r\n\r\n let field = mappingDataSource.getField(fieldId);\r\n if (field) {\r\n return `${field.displayName} ${getAutoGroupingText(autoGrouping)}`;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n var getColorizer = function (config: TreeMapConfig) {\r\n let formattingRuleObj = formattingRule.getFormattingRuleById(config.formattingRule());\r\n let range = undefined;\r\n if (config.colorization() === TreeMapColorizationEnum.Range && formattingRuleObj) {\r\n range = formattingRuleObj.scales.map((x) => x.minValue);\r\n range.push(config.maxValue);\r\n }\r\n return {\r\n type: config.colorization(),\r\n colorizeGroups: config.colorization() === TreeMapColorizationEnum.Discrete ? config.colorizeGroups() : false,\r\n palette: config.colorization() === TreeMapColorizationEnum.Gradient ? [config.startColor(), config.endColor()] : config.colorization() === TreeMapColorizationEnum.Range && formattingRuleObj ? formattingRuleObj.scales.map((x) => x.color || x.backgroundColor) : undefined,\r\n range: range\r\n };\r\n }\r\n\r\n var formatValue = function (value: number, config: TreeMapConfig, result: TreeMapResultData, isLabel: boolean = false) {\r\n let dx = DevExpress as any;\r\n let largerNumber = \"Normal\";\r\n if (isLabel) {\r\n switch (config.label.unitFormat()) {\r\n case LabelFormatEnum.Billions:\r\n largerNumber = \"Billions\";\r\n break;\r\n case LabelFormatEnum.Millions:\r\n largerNumber = \"Millions\";\r\n break;\r\n case LabelFormatEnum.Thousands:\r\n largerNumber = \"Thousands\";\r\n break;\r\n case LabelFormatEnum.Automatic:\r\n largerNumber = \"Automatic\";\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const currencySign = result.metric.accountingStyle ? \"accounting\" : \"standard\";\r\n const decimalPlaces = config.label.decimalPlaces() === -1 || !isLabel ? result.metric.decimalPlaces : config.label.decimalPlaces();\r\n const format = config.label.format() === FieldFormatEnum.None || !isLabel ? result.metric.metricFormat : config.label.format();\r\n\r\n if (format === FieldFormatEnum.Currency)\r\n return `${dx.formatHelper.format(value, { style: \"currency\", currency: result.currencyCode, currencyDisplay: \"narrowSymbol\", precision: decimalPlaces, currencySign: currencySign, largerNumber: largerNumber })}`;\r\n else if (format === FieldFormatEnum.Percentage)\r\n return `${dx.formatHelper.format(value / 100, { style: \"percent\", precision: decimalPlaces, currencySign: currencySign })}`;\r\n\r\n return `${dx.formatHelper.format(value, { style: \"decimal\", precision: decimalPlaces, largerNumber: largerNumber, currencySign: currencySign })}`;\r\n }\r\n\r\n var getDataSource = function (result: TreeMapResultData, config: TreeMapConfig): DevExpress.data.DataSource {\r\n if (!result || !result.dataTable) {\r\n return new DevExpress.data.DataSource({\r\n store: [],\r\n paginate: false,\r\n });\r\n }\r\n\r\n const drillDown = hasDrillDown(result);\r\n const hasGroup = drillDown ? false : config.groupField() !== null;\r\n let newResult = [];\r\n\r\n var createObj = function (propertName: string, obj, value, field: TreeMapColumnInfo) {\r\n if (obj[propertName] === undefined) {\r\n obj[propertName] = \"\";\r\n }\r\n else {\r\n obj[propertName] += `${result.columnSeparator}`;\r\n }\r\n\r\n if (field.autoGrouping > AutoGroupingEnum.ByDay && field.autoGrouping !== AutoGroupingEnum.ByYear) {\r\n let output = report.getAutoGroupingText(value, field.autoGrouping, result.dateFormat, result.dateSeparator, result.weekStartDay);\r\n obj[propertName] += `${output}`;\r\n }\r\n else {\r\n if (field.dataType === DataTypeEnum.DATE && field.autoGrouping <= AutoGroupingEnum.ByDay) {\r\n if (value) {\r\n obj[propertName] += moment((value as any).split('T')[0], 'YYYY-MM-DD').format(result.dateFormat);\r\n }\r\n }\r\n else {\r\n obj[propertName] += `${value !== null && value !== undefined ? value : \"\"}`;\r\n }\r\n }\r\n }\r\n\r\n for (const data of result.dataTable) {\r\n let obj = {} as any;\r\n \r\n if (drillDown) {\r\n result.fieldsDrillDown.forEach(function (field: TreeMapColumnInfo) {\r\n let value = data[field.index];\r\n obj[field.queryName] = value;\r\n createObj(\"xArgument\", obj, value, field);\r\n });\r\n }\r\n else {\r\n let value = data[result.field.index];\r\n obj[result.field.queryName] = value;\r\n createObj(\"xArgument\", obj, value, result.field);\r\n }\r\n\r\n obj.labelField = obj.xArgument;\r\n if (config.label.showMetric()) {\r\n obj.labelField = `${obj.xArgument} - ${formatValue(data[result.metric.index], config, result, true)}`;\r\n }\r\n\r\n if (hasGroup) {\r\n let value = data[result.groupField.index];\r\n obj[result.groupField.queryName] = value;\r\n createObj(\"xGroupArgument\", obj, value, result.groupField);\r\n }\r\n\r\n obj[result.metric.queryName] = data[result.metric.index];\r\n if (config.maxValue === undefined || obj[result.metric.queryName] > config.maxValue) {\r\n config.maxValue = obj[result.metric.queryName];\r\n }\r\n\r\n newResult.push(obj);\r\n }\r\n\r\n if (hasGroup) {\r\n //Add the groups as new rows in the array to behavior like parents\r\n let parentsForTreeMap = [...new Set(newResult.map((item) => item.xGroupArgument))];\r\n for (const parent of parentsForTreeMap) {\r\n newResult.push({\r\n xGroupArgument: '',\r\n xArgument: parent,\r\n labelField: parent\r\n });\r\n }\r\n }\r\n\r\n return new DevExpress.data.DataSource({\r\n store: newResult,\r\n paginate: false,\r\n });\r\n }\r\n\r\n var prepareViewModel = function (vm, config: TreeMapConfig, widgetContainer = null) {\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"Tree Map\",\r\n icon: \"bi bi-columns\",\r\n content: \"Tree Map Settings\"\r\n },\r\n {\r\n id: 2,\r\n text: \"Visual\",\r\n icon: \"bi bi-card-checklist\",\r\n content: \"Tree Map Visual Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0],\r\n ];\r\n\r\n vm.metricName = ko.observable(\"\");\r\n vm.fieldName = ko.observable(\"\");\r\n vm.groupFieldName = ko.observable(\"\");\r\n vm.formattingRuleName = ko.observable(\"\");\r\n\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n else {\r\n vm.formattingRuleName = ko.observable(vm.formattingRuleObj.name);\r\n }\r\n\r\n vm.formattingRuleTextBoxOptions = {\r\n value: vm.formattingRuleName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n vm.formattingRulePopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose a Formatting Rule\",\r\n onClick: function (e) {\r\n var onSelected = function (evt) {\r\n if (evt) {\r\n formattingRule.copyProperties(evt.model, vm.formattingRuleObj);\r\n config.formattingRule(evt.model.id);\r\n vm.formattingRuleName(evt.model.name);\r\n formattingRule.hide();\r\n }\r\n };\r\n formattingRule.openList($(e.element).siblings(\".dx-textbox\"), onSelected, undefined, undefined, undefined);\r\n }\r\n };\r\n vm.formattingRuleRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Formatting Rule\",\r\n onClick: function (e) {\r\n let blankRule = formattingRule.getNewFormattingRule();\r\n formattingRule.copyProperties(blankRule, vm.formattingRuleObj);\r\n config.formattingRule(null);\r\n vm.formattingRuleName(null);\r\n }\r\n };\r\n\r\n vm.topBottomValueOptions = {\r\n format: '0#',\r\n value: config.topBottomValue,\r\n step: 1,\r\n showSpinButtons: true,\r\n min: 1,\r\n width: 125,\r\n disabled: ko.computed(function () { return config.topBottomType() === 1; }),\r\n onValueChanged: function (e) {\r\n vm.shouldUpdateData = true;\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n }\r\n\r\n vm.topBottomTypeOptions = {\r\n displayExpr: 'text',\r\n valueExpr: 'id',\r\n value: config.topBottomType,\r\n items: [\r\n { id: 1, text: 'All' },\r\n { id: 2, text: 'Top' },\r\n { id: 3, text: 'Bottom' }\r\n ],\r\n width: 80,\r\n onValueChanged: function (e) {\r\n vm.shouldUpdateData = true;\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n }\r\n\r\n var updateColorizer = function () {\r\n let treeMap = $(\".irTreeMap\", widgetContainer).dxTreeMap(\"instance\");\r\n treeMap.option(\"colorizer\", undefined);\r\n treeMap.option(\"colorizer\", getColorizer(config) as any);\r\n };\r\n config.colorization.subscribe(updateColorizer);\r\n config.layout.subscribe(function () {\r\n let treeMap = $(\".irTreeMap\", widgetContainer).dxTreeMap(\"instance\");\r\n treeMap.option(\"layoutAlgorithm\", config.layout() as any);\r\n updateColorizer();\r\n });\r\n config.formattingRule.subscribe(updateColorizer);\r\n config.startColor.subscribe(updateColorizer);\r\n config.endColor.subscribe(updateColorizer);\r\n config.colorizeGroups.subscribe(updateColorizer);\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n prepareViewModel(vm, vm.config, widgetContainer);\r\n }\r\n\r\n var prepareSetup = function (vm, result: TreeMapResultData, config: TreeMapConfig, dashboardWidget) {\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n vm.metricName(mappingDataSource.getMetricName(config.metric()));\r\n\r\n let dataSource = getDataSource(result, config);\r\n\r\n vm.treeMapSettings = {\r\n width: \"100%\",\r\n height: \"100%\",\r\n dataSource: dataSource,\r\n labelField: 'labelField',\r\n idField: 'xArgument',\r\n layoutAlgorithm: config.layout(),\r\n parentField: hasDrillDown(result) ? undefined : config.groupField() !== null ? 'xGroupArgument' : undefined,\r\n valueField: result ? result.metric.queryName : \"\",\r\n colorizer: getColorizer(config),\r\n tooltip: {\r\n enabled: true,\r\n zIndex: 200,\r\n customizeTooltip(arg) {\r\n let argumentText = arg.node.data.xArgument || arg.node.data.xGroupArgument;\r\n let valueText = formatValue(arg.value, config, result);\r\n let text = `${argumentText}
${vm.metricName()}: ${valueText}`;\r\n\r\n return {\r\n html: text,\r\n };\r\n },\r\n },\r\n onClick: function (e) {\r\n if (vm.isPrinting && vm.isPrinting()) {\r\n return;\r\n }\r\n\r\n if (dashboardWidget.hasClass(\"selected\"))\r\n e.event.stopPropagation();\r\n else\r\n return;\r\n\r\n let getDrilldown = function () {\r\n const $currentDrilldownSelect = $(\"ul#CurrentDrillDowns select.nextDrilldownSelect\", vm.popoverDiv);\r\n //So if we have no current drilldown then it's just the first one...\r\n const drilldownId = $currentDrilldownSelect.data(\"drilldownid\");\r\n const reportId = parseInt($currentDrilldownSelect.val() as any || 0, 10);\r\n return { newDrilldownId: drilldownId, newReportId: reportId };\r\n }\r\n let nextDrilldownObj = getDrilldown();\r\n if (nextDrilldownObj.newReportId <= 0)\r\n return;\r\n\r\n let model = reportView.getTabBaseObject({\r\n tabValues: [],\r\n widgetId: vm.widgetId(),\r\n nextDrilldown: getDrilldown()\r\n });\r\n\r\n if (e.node?.data) {\r\n if (e.node.data.items) { //Group click\r\n model.tabValues.push({\r\n name: result.groupField.queryName,\r\n startCondition: e.node.data.items[0][result.groupField.queryName],\r\n isGroupField: true\r\n });\r\n }\r\n else {\r\n\r\n if (hasDrillDown(result)) {\r\n result.fieldsDrillDown.forEach(function (field: TreeMapColumnInfo) {\r\n if (field.groupingType === GroupingTypeEnum.GROUP_BY) {\r\n model.tabValues.push({\r\n name: field.queryName,\r\n startCondition: e.node.data[field.queryName]\r\n });\r\n }\r\n });\r\n }\r\n else {\r\n\r\n if (result.groupField) {\r\n model.tabValues.push({\r\n name: result.groupField.queryName,\r\n startCondition: e.node.data[result.groupField.queryName],\r\n isGroupField: true\r\n });\r\n }\r\n\r\n if (e.node.data.items === undefined) {\r\n model.tabValues.push({\r\n name: result.field.queryName,\r\n startCondition: e.node.data[result.field.queryName]\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.workBook + \"NavigateToDrillDown\",\r\n model,\r\n function (data) {\r\n reportView.updateOutputAfterDrilldown(data, dashboardWidget);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n };\r\n\r\n vm.metricPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Metric\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.metric(item.metricId);\r\n vm.metricName(item.nodeName);\r\n\r\n dashboard.saveWidgetConfig(vm, true, function () {\r\n resetDrillDown(result, dashboardWidget);\r\n });\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.metricRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Metric\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.metric(null);\r\n vm.metricName(null);\r\n\r\n dashboard.saveWidgetConfig(vm, true, function () {\r\n resetDrillDown(result, dashboardWidget);\r\n });\r\n }\r\n };\r\n vm.metricTextBoxOptions = {\r\n value: vm.metricName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.fieldPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Field\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.field(item.fieldId);\r\n config.fieldAutoGrouping(convertAutoGrouping(item.autoGrouping));\r\n vm.fieldName(getFeildDisplayName(vm.config.field(), vm.config.fieldAutoGrouping()));\r\n\r\n dashboard.saveWidgetConfig(vm, true, function () {\r\n resetDrillDown(result, dashboardWidget);\r\n });\r\n });\r\n\r\n mappingDataSource.showDataSourcePopover(\"NonMetrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.fieldRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Field\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.field(null);\r\n config.fieldAutoGrouping(AutoGroupingEnum.None);\r\n vm.fieldName(null);\r\n\r\n dashboard.saveWidgetConfig(vm, true, function () {\r\n resetDrillDown(result, dashboardWidget);\r\n });\r\n }\r\n };\r\n vm.fieldTextBoxOptions = {\r\n value: vm.fieldName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.groupFieldPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Group Field\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.groupField(item.fieldId);\r\n config.groupFieldAutoGrouping(convertAutoGrouping(item.autoGrouping));\r\n vm.groupFieldName(getFeildDisplayName(vm.config.groupField(), vm.config.groupFieldAutoGrouping()));\r\n\r\n dashboard.saveWidgetConfig(vm, true, function () {\r\n resetDrillDown(result, dashboardWidget);\r\n });\r\n });\r\n\r\n mappingDataSource.showDataSourcePopover(\"NonMetrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.groupFieldRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Group Field\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.groupField(null);\r\n config.groupFieldAutoGrouping(AutoGroupingEnum.None);\r\n vm.groupFieldName(null);\r\n\r\n dashboard.saveWidgetConfig(vm, true, function () {\r\n resetDrillDown(result, dashboardWidget);\r\n });\r\n }\r\n };\r\n vm.groupFieldTextBoxOptions = {\r\n value: vm.groupFieldName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n var updateDataSource = function () {\r\n let dataSource = getDataSource(result, config);\r\n let treeMap = $(\".irTreeMap\", dashboardWidget).dxTreeMap(\"instance\");\r\n treeMap.option(\"dataSource\", dataSource);\r\n };\r\n config.label.format.subscribe(updateDataSource);\r\n config.label.showMetric.subscribe(updateDataSource);\r\n config.label.decimalPlaces.subscribe(updateDataSource);\r\n config.label.unitFormat.subscribe(updateDataSource);\r\n }\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n let dataBindElement = $(\".widget-data-bind-element\", dashboardWidget);\r\n if (dataBindElement.length) {\r\n vm.result = dataBindElement.data(\"json\") as TreeMapResultData;\r\n prepareSetup(vm, vm.result, vm.config, dashboardWidget);\r\n ko.applyBindings(vm, dataBindElement[0]);\r\n }\r\n }\r\n\r\n return {\r\n setupViewModel: setupViewModel,\r\n setup: setup,\r\n updateNames: updateNames\r\n };\r\n\r\n}());","enum MapColorizationEnum {\r\n Gradient = \"gradient\",\r\n Range = \"range\"\r\n}\r\ninterface MapColumnInfo {\r\n index: number;\r\n queryName: string;\r\n autoGrouping: AutoGroupingEnum;\r\n groupingType: GroupingTypeEnum;\r\n dataType: DataTypeEnum;\r\n\r\n accountingStyle: boolean;\r\n decimalPlaces: number;\r\n metricFormat: FieldFormatEnum;\r\n}\r\n\r\ninterface MapResultData {\r\n dataTable: [],\r\n dataSource: DevExpress.data.DataSource,\r\n sql: string,\r\n\r\n field: MapColumnInfo,\r\n metric: MapColumnInfo,\r\n\r\n currencyCode: string,\r\n\r\n maxValue: number;\r\n minValue: number;\r\n legendLength: number;\r\n\r\n customMaps: Array;\r\n\r\n isPrinting: boolean;\r\n}\r\n\r\ninterface MapConfig {\r\n metric: KnockoutObservable,\r\n\r\n field: KnockoutObservable,\r\n fieldAutoGrouping: KnockoutObservable,\r\n\r\n formattingRule: KnockoutObservable;\r\n source: KnockoutObservable;\r\n\r\n zoomFactor: KnockoutObservable;\r\n center: KnockoutObservableArray;\r\n\r\n zoomingEnabled: KnockoutObservable;\r\n panningEnabled: KnockoutObservable;\r\n\r\n legend: MapLegend;\r\n\r\n attributeName: KnockoutObservable;\r\n colorization: KnockoutObservable;\r\n startColor: KnockoutObservable;\r\n endColor: KnockoutObservable;\r\n gradientRanges: KnockoutObservable;\r\n}\r\n\r\ninterface MapLegend {\r\n unitFormat: KnockoutObservable;\r\n decimalPlaces: KnockoutObservable;\r\n format: KnockoutObservable;\r\n showLegend: KnockoutObservable;\r\n title: KnockoutObservable;\r\n}\r\n\r\nenum MapDataSourceEnum {\r\n Africa = \"dxAfrica\",\r\n Canada = \"dxCanada\",\r\n Europe = \"dxEurope\",\r\n USA = \"dxUSA\",\r\n World = \"dxWorld\",\r\n USACities = \"USA-Cities\",\r\n IrelandCounties = \"Ireland-Counties\"\r\n}\r\n\r\nvar widgetMap = (function () {\r\n const notFoundColumn = \"notFound\";\r\n var updateNames = function (vm) {\r\n vm.metricName(mappingDataSource.getMetricName(vm.config.metric()));\r\n vm.fieldName(getFeildDisplayName(vm.config.field(), vm.config.fieldAutoGrouping()));\r\n \r\n vm.isNamesUpdated = true;\r\n };\r\n\r\n var getFeildDisplayName = function (fieldId: number, autoGrouping: AutoGroupingEnum): string {\r\n if (autoGrouping === AutoGroupingEnum.None) {\r\n return mappingDataSource.getFieldName(fieldId);\r\n }\r\n\r\n let field = mappingDataSource.getField(fieldId);\r\n if (field) {\r\n return `${field.displayName} ${getAutoGroupingText(autoGrouping)}`;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n var formatValue = function (value: number, config: MapConfig, result: MapResultData, isLegend: boolean = false) {\r\n let dx = DevExpress as any;\r\n let largerNumber = \"Normal\";\r\n if (isLegend) {\r\n switch (config.legend.unitFormat()) {\r\n case LabelFormatEnum.Billions:\r\n largerNumber = \"Billions\";\r\n break;\r\n case LabelFormatEnum.Millions:\r\n largerNumber = \"Millions\";\r\n break;\r\n case LabelFormatEnum.Thousands:\r\n largerNumber = \"Thousands\";\r\n break;\r\n case LabelFormatEnum.Automatic:\r\n largerNumber = \"Automatic\";\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const currencySign = result && result.metric.accountingStyle ? \"accounting\" : \"standard\";\r\n let decimalPlaces = result && (config.legend.decimalPlaces() === -1 || !isLegend) ? result.metric.decimalPlaces : config.legend.decimalPlaces();\r\n let format = result && (config.legend.format() === FieldFormatEnum.None || !isLegend) ? result.metric.metricFormat : config.legend.format();\r\n if (format == null)\r\n format = config.legend.format();\r\n\r\n if (decimalPlaces == null || decimalPlaces === -1)\r\n decimalPlaces = config.legend.decimalPlaces() === -1 ? 0 : config.legend.decimalPlaces();\r\n\r\n if (format === FieldFormatEnum.Currency)\r\n return `${dx.formatHelper.format(value, { style: \"currency\", currency: result ? result.currencyCode : \"\", currencyDisplay: \"narrowSymbol\", precision: decimalPlaces, currencySign: currencySign, largerNumber: largerNumber })}`;\r\n else if (format === FieldFormatEnum.Percentage)\r\n return `${dx.formatHelper.format(value, { style: \"percent\", precision: decimalPlaces, currencySign: currencySign })}`;\r\n\r\n return `${dx.formatHelper.format(value, { style: \"decimal\", precision: decimalPlaces, largerNumber: largerNumber, currencySign: currencySign })}`;\r\n }\r\n\r\n var getDataSource = function (result: MapResultData, config: MapConfig): any {\r\n if (!result || !result.dataTable) {\r\n return { };\r\n }\r\n\r\n let newResult = {} as any;\r\n\r\n for (const data of result.dataTable) {\r\n let obj = {} as any;\r\n\r\n let value = data[result.field.index];\r\n if (value !== undefined && value !== null) {\r\n obj[result.field.queryName] = value;\r\n obj[result.metric.queryName] = data[result.metric.index];\r\n obj[notFoundColumn] = true;\r\n\r\n if (typeof value === \"string\") {\r\n newResult[(value as string).toLowerCase()] = obj;\r\n }\r\n else {\r\n newResult[value] = obj;\r\n }\r\n }\r\n }\r\n\r\n return newResult;\r\n }\r\n\r\n var prepareViewModel = function (vm, config: MapConfig, widgetContainer = null) {\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"Map\",\r\n icon: \"bi bi-map\",\r\n content: \"Map Settings\"\r\n },\r\n {\r\n id: 2,\r\n text: \"Visual\",\r\n icon: \"bi bi-card-checklist\",\r\n content: \"Map Visual Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0],\r\n ];\r\n\r\n vm.metricName = ko.observable(\"\");\r\n vm.fieldName = ko.observable(\"\");\r\n vm.formattingRuleName = ko.observable(\"\");\r\n\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n else {\r\n vm.formattingRuleName = ko.observable(vm.formattingRuleObj.name);\r\n }\r\n\r\n vm.formattingRuleTextBoxOptions = {\r\n value: vm.formattingRuleName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n vm.formattingRulePopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose a Formatting Rule\",\r\n onClick: function (e) {\r\n var onSelected = function (evt) {\r\n if (evt) {\r\n formattingRule.copyProperties(evt.model, vm.formattingRuleObj);\r\n formattingRule.hide();\r\n\r\n config.formattingRule(evt.model.id);\r\n vm.formattingRuleName(evt.model.name);\r\n }\r\n };\r\n formattingRule.openList($(e.element).siblings(\".dx-textbox\"), onSelected, undefined, undefined, undefined);\r\n }\r\n };\r\n vm.formattingRuleRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Formatting Rule\",\r\n onClick: function (e) {\r\n let blankRule = formattingRule.getNewFormattingRule();\r\n formattingRule.copyProperties(blankRule, vm.formattingRuleObj);\r\n config.formattingRule(null);\r\n vm.formattingRuleName(null);\r\n }\r\n };\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n prepareViewModel(vm, vm.config, widgetContainer);\r\n }\r\n\r\n var isCustomMap = function (source: string) {\r\n switch (source) {\r\n case MapDataSourceEnum.Africa:\r\n case MapDataSourceEnum.Canada:\r\n case MapDataSourceEnum.Europe:\r\n case MapDataSourceEnum.USA:\r\n case MapDataSourceEnum.World:\r\n case MapDataSourceEnum.USACities:\r\n case MapDataSourceEnum.IrelandCounties:\r\n return false;\r\n default:\r\n return true;\r\n }\r\n }\r\n\r\n async function getDataSourceMap(vm, result: MapResultData, config: MapConfig) {\r\n let source = vm.mapSelectOptions.items.find(x => x.id === config.source());\r\n if (!source) {\r\n config.source(MapDataSourceEnum.World);\r\n return null;\r\n }\r\n\r\n function get() {\r\n return new Promise((resolve) => {\r\n switch (config.source()) {\r\n case MapDataSourceEnum.Africa:\r\n resolve((DevExpress.viz.map as any).sources.africa);\r\n\r\n vm.attributeNameItems(['name']);\r\n vm.fieldLabel(\"Country\");\r\n break;\r\n case MapDataSourceEnum.Canada:\r\n resolve((DevExpress.viz.map as any).sources.canada);\r\n\r\n vm.attributeNameItems(['name']);\r\n vm.fieldLabel(\"State\");\r\n break;\r\n case MapDataSourceEnum.Europe:\r\n resolve((DevExpress.viz.map as any).sources.europe);\r\n\r\n vm.attributeNameItems(['name']);\r\n vm.fieldLabel(\"Country\");\r\n break;\r\n case MapDataSourceEnum.USA:\r\n resolve((DevExpress.viz.map as any).sources.usa);\r\n\r\n vm.attributeNameItems(['name']);\r\n vm.fieldLabel(\"State\");\r\n break;\r\n case MapDataSourceEnum.World:\r\n resolve((DevExpress.viz.map as any).sources.world);\r\n\r\n vm.attributeNameItems(['name']);\r\n vm.fieldLabel(\"Country\");\r\n break;\r\n default:\r\n {\r\n (DevExpress.viz as any).vectormaputils.parse(`${urlConfigs.map}/${config.source() }`, { precision: 2 }, function (data) {\r\n resolve(data);\r\n\r\n if (config.source() === MapDataSourceEnum.USACities) {\r\n vm.attributeNameItems(['shapeName']);\r\n vm.fieldLabel(\"City\");\r\n }\r\n else if (config.source() === MapDataSourceEnum.IrelandCounties) {\r\n vm.attributeNameItems(['NAME_TAG']);\r\n vm.fieldLabel(\"County\");\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n let dataSource = await get() as any;\r\n if (isCustomMap(config.source()) && dataSource?.features && dataSource.features.length > 0) {\r\n if (dataSource.features[0].properties) {\r\n let attributes = [];\r\n for (var prop in dataSource.features[0].properties) {\r\n attributes.push(prop);\r\n }\r\n vm.attributeNameItems(attributes);\r\n }\r\n }\r\n\r\n if (vm.attributeNameItems().indexOf(config.attributeName()) === -1) {\r\n config.attributeName(vm.attributeNameItems()[0]);\r\n }\r\n\r\n return dataSource;\r\n }\r\n\r\n var getPaletteColorGroups = function (config: MapConfig, result: MapResultData) {\r\n let palette = [config.startColor(), config.endColor()];\r\n let colorGroups = result ? [result.minValue, result.maxValue] : [0, 0];\r\n if (result) {\r\n if (config.colorization() === MapColorizationEnum.Range && config.formattingRule()) {\r\n let formattingRuleObj = formattingRuleService.getFormattingRuleById(config.formattingRule())\r\n let frColorGroups = formattingRuleObj.scales.map((x) => x.minValue);\r\n if (frColorGroups.length > 0) {\r\n colorGroups = frColorGroups;\r\n colorGroups[0] = result.minValue;\r\n colorGroups.push(result.maxValue);\r\n }\r\n\r\n let colors = formattingRuleObj.scales.map((x) => x.color);\r\n if (colors.length > 0) {\r\n if (!colors[0]) {\r\n colors = formattingRuleObj.scales.map((x) => x.backgroundColor);\r\n }\r\n\r\n palette = colors;\r\n }\r\n\r\n result.legendLength = palette.length - 1;\r\n }\r\n else if (config.colorization() === MapColorizationEnum.Gradient) {\r\n if (config.gradientRanges() - 1 > 0) {\r\n let dif = result.maxValue - result.minValue;\r\n let stepValue = dif / (config.gradientRanges() - 1);\r\n colorGroups = [result.minValue];\r\n for (var i = 0; i < config.gradientRanges() - 1; i++) {\r\n colorGroups.push(colorGroups[i] + stepValue);\r\n }\r\n colorGroups.push(result.maxValue);\r\n }\r\n\r\n result.legendLength = colorGroups.length - 2;\r\n }\r\n }\r\n return {\r\n palette: palette,\r\n colorGroups: colorGroups\r\n }\r\n }\r\n\r\n var prepareSetup = function (vm, result: MapResultData, config: MapConfig, dashboardWidget) {\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n vm.metricName(mappingDataSource.getMetricName(config.metric()));\r\n\r\n let dataSource = getDataSource(result, config);\r\n let paletteColorGroups = getPaletteColorGroups(config, result);\r\n let centerTimeoutId = null;\r\n let zoomTimeoutId = null;\r\n\r\n vm.warningVisible = ko.observable(false);\r\n vm.warningText = ko.observable(\"\");\r\n vm.warningPopover = {\r\n target: $(\".dx-icon-warning\", dashboardWidget),\r\n showEvent: 'dxclick',\r\n position: 'top',\r\n width: 300,\r\n height: 250\r\n }\r\n vm.mapSettings = {\r\n width: \"100%\",\r\n height: \"100%\",\r\n zoomFactor: config.zoomFactor(),\r\n center: config.center(),\r\n zoomingEnabled: result && result.isPrinting ? false : config.zoomingEnabled,\r\n panningEnabled: result && result.isPrinting ? false : config.panningEnabled,\r\n tooltip: {\r\n enabled: true,\r\n border: {\r\n visible: false,\r\n },\r\n customizeTooltip(arg) {\r\n if (arg.attribute(\"apply\")) {\r\n const color = arg.attribute('backgroundColor');\r\n const fontColor = arg.attribute('fontColor');\r\n const field = arg.attribute('field');\r\n const metric = arg.attribute('metricValue');\r\n return {\r\n text: `${field}: ${formatValue(metric, config, result)}`,\r\n color: color ? color : undefined,\r\n fontColor: fontColor ? fontColor : undefined\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n layers: {\r\n name: \"areas\",\r\n dataSource: undefined,\r\n palette: paletteColorGroups.palette,\r\n colorGroups: paletteColorGroups.colorGroups,\r\n colorGroupingField: 'metricValue',\r\n customize(elements) {\r\n $.each(elements, (_, element) => {\r\n let key = element.attribute(config.attributeName());\r\n if (typeof key === \"string\" && key) {\r\n key = key.toLowerCase().trimEnd().replace(/\\0/g, '');\r\n }\r\n\r\n const row = dataSource[key];\r\n if (row) {\r\n dataSource[key][notFoundColumn] = false;\r\n\r\n let color = \"#337ab7\";\r\n let fontColor = \"white\";\r\n if (config.colorization() === MapColorizationEnum.Range && config.formattingRule()) {\r\n const scale = formattingRuleService.getFormattingRuleScale(formattingRuleService.getFormattingRuleById(config.formattingRule()), row[result.metric.queryName], result.metric.metricFormat === FieldFormatEnum.Percentage);\r\n if (scale && scale.color) {\r\n color = scale.color;\r\n }\r\n\r\n if (scale && scale.backgroundColor && !color) {\r\n color = scale.backgroundColor;\r\n }\r\n\r\n if (scale && scale.fontColor) {\r\n fontColor = scale.fontColor;\r\n }\r\n\r\n element.attribute('backgroundColor', color);\r\n element.attribute('fontColor', fontColor);\r\n }\r\n\r\n element.attribute(\"apply\", true);\r\n element.attribute('field', row[result.field.queryName]);\r\n element.attribute('metricValue', row[result.metric.queryName]);\r\n //element.applySettings({\r\n // color: color,\r\n //});\r\n }\r\n });\r\n\r\n if (dataSource) {\r\n const missingRecords = Object.values(dataSource).filter(x => x[notFoundColumn]);\r\n const fieldName = getFeildDisplayName(vm.config.field(), vm.config.fieldAutoGrouping());\r\n vm.warningVisible(result.isPrinting ? false : missingRecords.length > 0);\r\n vm.warningText(!vm.warningVisible() ? \"\" : `${fieldName} not found: ${missingRecords.map((x) => x[result.field.queryName]).join(', ')}`);\r\n }\r\n },\r\n },\r\n legends: [{\r\n title: config.legend.title(),\r\n source: { layer: 'areas', grouping: 'color' },\r\n customizeText(arg) {\r\n let text;\r\n let end = formatValue(arg.end, config, result, true);\r\n let start = formatValue(arg.start, config, result, true);\r\n if (arg.index === 0) {\r\n text = `< ${end}`;\r\n } else if (arg.index === result.legendLength) {\r\n text = `> ${start}`;\r\n } else {\r\n text = `${start} to ${end}`;\r\n }\r\n return text;\r\n },\r\n visible: result?.dataTable && ((config.colorization() === MapColorizationEnum.Range && config.formattingRule()) || config.colorization() === MapColorizationEnum.Gradient) && config.legend.showLegend()\r\n }],\r\n onCenterChanged: function (e) {\r\n if (config.zoomingEnabled()) {\r\n if (centerTimeoutId) {\r\n clearTimeout(centerTimeoutId);\r\n }\r\n\r\n centerTimeoutId = setTimeout(function () {\r\n vm.notSaveConfig = true;\r\n config.center(e.center);\r\n vm.notSaveConfig = false;\r\n dashboard.saveWidgetConfig(vm, false);\r\n }, 500);\r\n }\r\n else {\r\n vm.notSaveConfig = true;\r\n config.center(e.center);\r\n vm.notSaveConfig = false;\r\n dashboard.saveWidgetConfig(vm, false);\r\n }\r\n },\r\n \r\n onZoomFactorChanged: function (e) {\r\n if (config.panningEnabled()) {\r\n //When changing the zoom, the center is also changed\r\n vm.notSaveConfig = true;\r\n config.zoomFactor(e.zoomFactor);\r\n vm.notSaveConfig = false;\r\n }\r\n else {\r\n if (zoomTimeoutId) {\r\n clearTimeout(zoomTimeoutId);\r\n }\r\n\r\n zoomTimeoutId = setTimeout(function () {\r\n vm.notSaveConfig = true;\r\n config.zoomFactor(e.zoomFactor);\r\n vm.notSaveConfig = false;\r\n dashboard.saveWidgetConfig(vm, false);\r\n }, 500);\r\n }\r\n }\r\n };\r\n\r\n vm.metricPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Metric\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.metric(item.metricId);\r\n vm.metricName(item.nodeName);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.metricRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Metric\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.metric(null);\r\n vm.metricName(null);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n vm.metricTextBoxOptions = {\r\n value: vm.metricName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.fieldPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Field\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.field(item.fieldId);\r\n config.fieldAutoGrouping(convertAutoGrouping(item.autoGrouping));\r\n vm.fieldName(getFeildDisplayName(vm.config.field(), vm.config.fieldAutoGrouping()));\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n\r\n mappingDataSource.showDataSourcePopover(\"NonMetricsNonDates\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.fieldRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Field\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.field(null);\r\n config.fieldAutoGrouping(AutoGroupingEnum.None);\r\n vm.fieldName(null);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n vm.fieldTextBoxOptions = {\r\n value: vm.fieldName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n let dataSourceMapOptions = [\r\n { id: MapDataSourceEnum.Africa.toString(), name: \"Africa\" },\r\n { id: MapDataSourceEnum.Canada.toString(), name: \"Canada\" },\r\n { id: MapDataSourceEnum.Europe.toString(), name: \"Europe\" },\r\n { id: MapDataSourceEnum.IrelandCounties.toString(), name: \"Ireland - Counties\" },\r\n { id: MapDataSourceEnum.USA.toString(), name: \"USA\" },\r\n { id: MapDataSourceEnum.USACities.toString(), name: \"USA - Cities\" },\r\n { id: MapDataSourceEnum.World.toString(), name: \"World\" }\r\n ];\r\n if (result) {\r\n result.customMaps.forEach(function (customMap) {\r\n if (!dataSourceMapOptions.find(x => x.id === customMap)) {\r\n dataSourceMapOptions.push({ id: customMap, name: customMap });\r\n }\r\n });\r\n }\r\n\r\n vm.mapSelectOptions = {\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n value: config.source,\r\n items: dataSourceMapOptions,\r\n width: 170,\r\n }\r\n\r\n vm.attributeNameItems = ko.observableArray(['name']);\r\n vm.attributeNameOptions = {\r\n value: config.attributeName,\r\n items: vm.attributeNameItems,\r\n width: 120\r\n }\r\n vm.isCustomMap = ko.computed(function () {\r\n return isCustomMap(config.source());\r\n });\r\n\r\n let updateData = function () {\r\n const vectorMap = $(\".irMap\", dashboardWidget).dxVectorMap(\"instance\");\r\n if (dataSource) {\r\n Object.values(dataSource).forEach(function (r: any) {\r\n r[notFoundColumn] = true;\r\n });\r\n \r\n vm.warningText(\"\");\r\n vm.warningVisible(false);\r\n }\r\n\r\n getDataSourceMap(vm, result, config).then(function (dataSourceMap) { \r\n if (dataSourceMap) {\r\n vectorMap.option(\"layers.dataSource\", dataSourceMap);\r\n }\r\n })\r\n }\r\n config.source.subscribe(updateData);\r\n config.attributeName.subscribe(function () {\r\n const vectorMap = $(\".irMap\", dashboardWidget).dxVectorMap(\"instance\");\r\n vectorMap.beginUpdate();\r\n let dataSourceMap = vectorMap.option(\"layers.dataSource\");\r\n vectorMap.option(\"layers.dataSource\", undefined);\r\n vectorMap.option(\"layers.dataSource\", dataSourceMap);\r\n vectorMap.endUpdate();\r\n });\r\n\r\n let updateLegend = function () {\r\n const vectorMap = $(\".irMap\", dashboardWidget).dxVectorMap(\"instance\");\r\n\r\n //Hack to change the title\r\n let legendSettings = vectorMap.option(\"legends\");\r\n vectorMap.option(\"legends\", undefined);\r\n legendSettings[0].visible = result?.dataTable && ((config.colorization() === MapColorizationEnum.Range && config.formattingRule()) || config.colorization() === MapColorizationEnum.Gradient) && config.legend.showLegend() ? true : false;\r\n vectorMap.option(\"legends\", legendSettings);\r\n }\r\n config.legend.showLegend.subscribe(updateLegend);\r\n config.legend.format.subscribe(updateLegend);\r\n config.legend.decimalPlaces.subscribe(updateLegend);\r\n config.legend.unitFormat.subscribe(updateLegend);\r\n config.legend.title.subscribe(function () {\r\n const vectorMap = $(\".irMap\", dashboardWidget).dxVectorMap(\"instance\");\r\n\r\n //Hack to change the title\r\n let legendSettings = vectorMap.option(\"legends\");\r\n vectorMap.option(\"legends\", undefined);\r\n legendSettings[0].title = config.legend.title();\r\n vectorMap.option(\"legends\", legendSettings);\r\n });\r\n\r\n let update = function () {\r\n const vectorMap = $(\".irMap\", dashboardWidget).dxVectorMap(\"instance\");\r\n let paletteColorGroups = getPaletteColorGroups(config, result);\r\n vectorMap.beginUpdate();\r\n vectorMap.option(\"layers.palette\", paletteColorGroups.palette);\r\n vectorMap.option(\"layers.colorGroups\", paletteColorGroups.colorGroups);\r\n\r\n //Force reload data\r\n let dataSourceMap = vectorMap.option(\"layers.dataSource\");\r\n vectorMap.option(\"layers.dataSource\", undefined);\r\n vectorMap.option(\"layers.dataSource\", dataSourceMap);\r\n\r\n vectorMap.endUpdate();\r\n\r\n //Hack to change the title\r\n let legendSettings = vectorMap.option(\"legends\");\r\n vectorMap.option(\"legends\", undefined);\r\n legendSettings[0].visible = result?.dataTable && ((config.colorization() === MapColorizationEnum.Range && config.formattingRule()) || config.colorization() === MapColorizationEnum.Gradient) && config.legend.showLegend() ? true : false;\r\n vectorMap.option(\"legends\", legendSettings);\r\n };\r\n config.formattingRule.subscribe(update);\r\n config.colorization.subscribe(update);\r\n config.startColor.subscribe(update);\r\n config.endColor.subscribe(update);\r\n config.gradientRanges.subscribe(update);\r\n }\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n let dataBindElement = $(\".widget-data-bind-element\", dashboardWidget);\r\n if (dataBindElement.length) {\r\n vm.result = dataBindElement.data(\"json\") as MapResultData;\r\n vm.fieldLabel = ko.observable(\"Source\");\r\n prepareSetup(vm, vm.result, vm.config, dashboardWidget);\r\n ko.applyBindings(vm, dataBindElement[0]);\r\n\r\n const vectorMap = $(\".irMap\", dashboardWidget).dxVectorMap(\"instance\");\r\n getDataSourceMap(vm, vm.result, vm.config).then(function (dataSourceMap) {\r\n if (dataSourceMap) {\r\n vectorMap.option(\"layers.dataSource\", dataSourceMap);\r\n }\r\n })\r\n }\r\n }\r\n\r\n return {\r\n setupViewModel: setupViewModel,\r\n setup: setup,\r\n updateNames: updateNames\r\n };\r\n\r\n}());","enum GaugeTypeEnum {\r\n Circular = \"circular\",\r\n Bar = \"bar\"\r\n}\r\nenum GaugeCircularIndicatorTypeEnum {\r\n Needle = \"twoColorNeedle\",\r\n Triangle = \"triangleMarker\"\r\n}\r\nenum GaugeShowIndicatorValueEnum {\r\n None = \"none\",\r\n Middle = \"middle\"\r\n}\r\nenum GaugeTickIntervalTypeEnum {\r\n Value = \"value\",\r\n Percentual = \"percentual\"\r\n}\r\nenum GaugeScalePositionEnum {\r\n Inside = \"inside\",\r\n Outside = \"outside\"\r\n}\r\n\r\ninterface GaugeIndicatorFormat {\r\n unitFormat: KnockoutObservable;\r\n decimalPlaces: KnockoutObservable;\r\n}\r\n\r\ninterface GaugeScaleFormat {\r\n unitFormat: KnockoutObservable;\r\n decimalPlaces: KnockoutObservable;\r\n position: KnockoutObservable;\r\n labelColor: KnockoutObservable;\r\n labelFontSize: KnockoutObservable;\r\n}\r\n\r\ninterface GaugeColumnInfo {\r\n index: number;\r\n queryName: string;\r\n autoGrouping: AutoGroupingEnum;\r\n groupingType: GroupingTypeEnum;\r\n dataType: DataTypeEnum;\r\n\r\n accountingStyle: boolean;\r\n decimalPlaces: number;\r\n metricFormat: FieldFormatEnum;\r\n}\r\n\r\ninterface GaugeResultData {\r\n dataTable: [],\r\n dataSource: DevExpress.data.DataSource,\r\n sql: string,\r\n value: number\r\n targetValue: number;\r\n\r\n metric: GaugeColumnInfo,\r\n target: GaugeColumnInfo,\r\n\r\n currencyCode: string,\r\n isPrinting: boolean;\r\n}\r\n\r\ninterface GaugeConfig {\r\n metric: KnockoutObservable,\r\n target: KnockoutObservable,\r\n formattingRule: KnockoutObservable;\r\n comparisonFilter: any;\r\n\r\n type: KnockoutObservable;\r\n endValue: KnockoutObservable;\r\n showIndicatorValue: KnockoutObservable;\r\n size: KnockoutObservable;\r\n tick: KnockoutObservable;\r\n tickIntervalType: KnockoutObservable;\r\n tickIntervalValue: KnockoutObservable;\r\n\r\n indicatorFormat: GaugeIndicatorFormat,\r\n scalesFormat: GaugeScaleFormat\r\n\r\n format: KnockoutObservable;\r\n accountingStyle: KnockoutObservable;\r\n\r\n fontSize: KnockoutObservable;\r\n}\r\n\r\nvar widgetGauge = (function () {\r\n let updatingEndValue = false;\r\n function createRect(width, height, fill) {\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n\r\n rect.setAttribute('x', 0 as any);\r\n rect.setAttribute('y', 0 as any);\r\n rect.setAttribute('width', width);\r\n rect.setAttribute('height', height);\r\n rect.setAttribute('fill', fill);\r\n\r\n return rect;\r\n }\r\n function createText(x, y, fontSize, textAnchor, content, color) {\r\n const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\r\n\r\n text.setAttribute('x', x);\r\n text.setAttribute('y', y);\r\n text.setAttribute('fill', color);\r\n text.setAttribute('text-anchor', textAnchor);\r\n text.setAttribute('font-size', fontSize);\r\n\r\n text.textContent = content;\r\n\r\n return text;\r\n }\r\n\r\n function formatValue(value: number, unitFormat: LabelFormatEnum, decimalPlaces: number, format: FieldFormatEnum, accountingStyle: boolean, result: GaugeResultData) : string {\r\n let dx = DevExpress as any;\r\n let largerNumber = \"Normal\";\r\n switch (unitFormat) {\r\n case LabelFormatEnum.Billions:\r\n largerNumber = \"Billions\";\r\n break;\r\n case LabelFormatEnum.Millions:\r\n largerNumber = \"Millions\";\r\n break;\r\n case LabelFormatEnum.Thousands:\r\n largerNumber = \"Thousands\";\r\n break;\r\n case LabelFormatEnum.Automatic:\r\n largerNumber = \"Automatic\";\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n const currencySign = accountingStyle ? \"accounting\" : \"standard\";\r\n const formatValue = format === FieldFormatEnum.None ? FieldFormatEnum.Numeric : format;\r\n\r\n if (formatValue === FieldFormatEnum.Currency)\r\n return `${dx.formatHelper.format(value, { style: \"currency\", currency: result?.currencyCode || \"USD\", currencyDisplay: \"narrowSymbol\", precision: decimalPlaces, currencySign: currencySign, largerNumber: largerNumber })}`;\r\n else if (formatValue === FieldFormatEnum.Percentage)\r\n return `${dx.formatHelper.format(value / 100, { style: \"percent\", precision: decimalPlaces, currencySign: currencySign })}`;\r\n\r\n return `${dx.formatHelper.format(value, { style: \"decimal\", precision: decimalPlaces, largerNumber: largerNumber, currencySign: currencySign })}`;\r\n }\r\n\r\n function getRanges(config: GaugeConfig, result: GaugeResultData) {\r\n let ranges = [];\r\n if (config.formattingRule() && config.metric()) {\r\n if (config.type() === GaugeTypeEnum.Circular) {\r\n let formattingRuleObj = formattingRuleService.getFormattingRuleById(config.formattingRule())\r\n if (formattingRuleObj) {\r\n let frValues = formattingRuleObj.scales.map((x) => ({ minValue: x.minValue, backgroundColor: x.color || x.backgroundColor }));\r\n if (frValues.length > 0) {\r\n for (var i = 0; i < frValues.length - 1; i++) {\r\n let scale = frValues[i] as any;\r\n let nextScale = frValues[i + 1] as any;\r\n ranges.push({ startValue: scale.minValue, endValue: nextScale.minValue, color: scale.backgroundColor });\r\n }\r\n\r\n let lastScale = frValues[frValues.length - 1] as any;\r\n ranges.push({ startValue: lastScale.minValue, endValue: config.endValue() === null ? lastScale.minValue : config.endValue(), color: lastScale.backgroundColor });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ranges.length == 0) {\r\n ranges.push({ startValue: 0, endValue: config.endValue() === null ? 100 : config.endValue(), color: '#EAEAEA' });\r\n }\r\n\r\n if (ranges.length > 0 && result) {\r\n let value = getValue(config, result);\r\n let targetValue = getTargetValue(config, result);\r\n\r\n var setRange = function (value) {\r\n if (value !== null && value !== undefined) {\r\n if (ranges[0].startValue > value) {\r\n ranges[0].startValue = value;\r\n }\r\n\r\n if (ranges[ranges.length - 1].endValue < value) {\r\n ranges[ranges.length - 1].endValue = value;\r\n }\r\n }\r\n }\r\n\r\n setRange(value);\r\n setRange(targetValue);\r\n }\r\n\r\n return ranges;\r\n }\r\n\r\n function getGauge(dashboardWidget) {\r\n return $(\".irGauge\", dashboardWidget).dxCircularGauge(\"instance\");\r\n }\r\n\r\n function getTick(config: GaugeConfig, result: GaugeResultData) {\r\n switch (config.tickIntervalType()) {\r\n case GaugeTickIntervalTypeEnum.Value:\r\n return config.tickIntervalValue();\r\n case GaugeTickIntervalTypeEnum.Percentual:\r\n let ranges = getRanges(config, result);\r\n let startValue = ranges[0].startValue;\r\n let endValue = ranges[ranges.length - 1].endValue;\r\n return Math.abs((endValue - startValue) * config.tickIntervalValue() / 100);\r\n default:\r\n break;\r\n }\r\n }\r\n function getIndentFromTick(config: GaugeConfig) { return config.scalesFormat.position() === GaugeScalePositionEnum.Inside ? config.tick() ? -5 : -config.size() : 5; };\r\n function getTickLength(config: GaugeConfig) { return config.scalesFormat.position() === GaugeScalePositionEnum.Outside ? config.size() : config.size() /*+ 5*/; };\r\n function getMinorTickLength(config: GaugeConfig) { return config.scalesFormat.position() === GaugeScalePositionEnum.Outside ? config.size() : config.size() /*+ 3*/; };\r\n function getIndicatorColor(config: GaugeConfig, result: GaugeResultData, isPrincipalIndicator: boolean = false, defaultColor: string = undefined) {\r\n if (config.type() === GaugeTypeEnum.Circular && isPrincipalIndicator) {\r\n return defaultColor;\r\n }\r\n else {\r\n if (config.formattingRule() && config.metric()) {\r\n let formattingRuleObj = formattingRuleService.getFormattingRuleById(config.formattingRule())\r\n if (formattingRuleObj) {\r\n let value = getValue(config, result);\r\n let formattingScale = formattingRuleService.getFormattingRuleScale(formattingRuleObj, value, false);\r\n if (formattingScale) {\r\n return formattingScale.color || formattingScale.backgroundColor;\r\n }\r\n }\r\n }\r\n\r\n return defaultColor;\r\n }\r\n }\r\n function getIndicatorOffset(config: GaugeConfig) { return config.type() === GaugeTypeEnum.Bar ? 10 : 20; }\r\n function getValueIndicatorWidth(config: GaugeConfig) {\r\n return 5;\r\n }\r\n function getSubvalueIndicatorOffset(config: GaugeConfig) {\r\n return 15;\r\n }\r\n function getValue(config: GaugeConfig, result: GaugeResultData) {\r\n if (result && result.value !== undefined && config.metric()) {\r\n if ((result.metric.metricFormat === FieldFormatEnum.Percentage && config.format() === FieldFormatEnum.None) || config.format() === FieldFormatEnum.Percentage) {\r\n return result.value * 100;\r\n }\r\n\r\n return result.value;\r\n }\r\n return 0;\r\n }\r\n function getTargetValue(config: GaugeConfig, result: GaugeResultData) {\r\n if (result && result.targetValue !== undefined && config.target()) {\r\n if ((result.target.metricFormat === FieldFormatEnum.Percentage && config.format() === FieldFormatEnum.None) || config.format() === FieldFormatEnum.Percentage) {\r\n return result.targetValue * 100;\r\n }\r\n\r\n return result.targetValue;\r\n }\r\n return null;\r\n }\r\n\r\n function applySubscribe(vm, config: GaugeConfig, result: GaugeResultData, dashboardWidget) {\r\n let update = function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n let ranges = getRanges(config, result);\r\n gauge.option(\"value\", getValue(config, result));\r\n gauge.option(\"subvalues\", [getTargetValue(config, result)]);\r\n gauge.option(\"scale.startValue\", ranges[0].startValue);\r\n gauge.option(\"scale.endValue\", ranges[ranges.length - 1].endValue);\r\n gauge.option(\"rangeContainer.ranges\", ranges);\r\n gauge.endUpdate();\r\n };\r\n config.formattingRule.subscribe(update);\r\n config.metric.subscribe(update);\r\n\r\n config.type.subscribe(function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n gauge.option(\"valueIndicator.type\", config.type() === GaugeTypeEnum.Circular ? \"twoColorNeedle\" : \"rangeBar\");\r\n gauge.option(\"valueIndicator.offset\", getIndicatorOffset(config));\r\n gauge.option(\"rangeContainer.ranges\", getRanges(config, result));\r\n gauge.option(\"valueIndicator.color\", getIndicatorColor(config, result, true));\r\n gauge.option(\"valueIndicator.width\", getValueIndicatorWidth(config));\r\n gauge.option(\"subvalueIndicator.offset\", getSubvalueIndicatorOffset(config));\r\n gauge.endUpdate();\r\n });\r\n\r\n config.showIndicatorValue.subscribe(function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n //HACK to redraw the indicator text\r\n gauge.option(\"valueIndicator.size\", 0);\r\n gauge.option(\"valueIndicator.size\", config.size());\r\n //***\r\n gauge.endUpdate();\r\n });\r\n\r\n config.size.subscribe(function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n gauge.option(\"valueIndicator.size\", config.size());\r\n gauge.option(\"rangeContainer.width\", config.size());\r\n gauge.option(\"scale.tick.length\", getTickLength(config));\r\n gauge.option(\"scale.minorTick.length\", getMinorTickLength(config));\r\n gauge.option(\"scale.label.indentFromTick\", getIndentFromTick(config));\r\n gauge.endUpdate();\r\n gauge.render();\r\n });\r\n\r\n let updateTicks = function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n gauge.option(\"scale.tickInterval\", getTick(config, result));\r\n gauge.option(\"scale.minorTickInterval\", getTick(config, result) / 2);\r\n gauge.option(\"scale.tick.visible\", config.tick());\r\n gauge.option(\"scale.minorTick.visible\", config.tick());\r\n gauge.option(\"scale.label.indentFromTick\", getIndentFromTick(config));\r\n gauge.endUpdate();\r\n };\r\n config.tick.subscribe(updateTicks);\r\n config.tickIntervalType.subscribe(updateTicks);\r\n config.tickIntervalValue.subscribe(updateTicks);\r\n\r\n let updateFormatValue = function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n //HACK to redraw the indicator text\r\n gauge.option(\"valueIndicator.size\", 0);\r\n gauge.option(\"valueIndicator.size\", config.size());\r\n //***\r\n\r\n gauge.option(\"value\", getValue(config, result));\r\n gauge.option(\"subvalues\", [getTargetValue(config, result)]);\r\n\r\n gauge.endUpdate();\r\n };\r\n config.indicatorFormat.decimalPlaces.subscribe(updateFormatValue);\r\n config.indicatorFormat.unitFormat.subscribe(updateFormatValue);\r\n config.scalesFormat.decimalPlaces.subscribe(updateFormatValue);\r\n config.scalesFormat.unitFormat.subscribe(updateFormatValue);\r\n\r\n config.scalesFormat.position.subscribe(function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n gauge.option(\"scale.label.indentFromTick\", getIndentFromTick(config));\r\n gauge.option(\"scale.tick.length\", getTickLength(config));\r\n gauge.option(\"scale.minorTick.length\", getMinorTickLength(config));\r\n gauge.endUpdate();\r\n });\r\n\r\n config.accountingStyle.subscribe(updateFormatValue);\r\n config.format.subscribe(updateFormatValue);\r\n\r\n config.endValue.subscribe(function () {\r\n if (!updatingEndValue) {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n let ranges = getRanges(config, result);\r\n gauge.option(\"rangeContainer.ranges\", ranges);\r\n gauge.option(\"scale.startValue\", ranges[0].startValue);\r\n gauge.option(\"scale.endValue\", ranges[ranges.length - 1].endValue);\r\n gauge.option(\"scale.tickInterval\", getTick(config, result));\r\n gauge.option(\"scale.minorTickInterval\", getTick(config, result) / 2);\r\n gauge.endUpdate();\r\n }\r\n });\r\n\r\n config.fontSize.subscribe(function () {\r\n let gauge = getGauge(dashboardWidget);\r\n gauge.beginUpdate();\r\n //HACK to redraw the indicator text\r\n gauge.option(\"valueIndicator.size\", 0);\r\n gauge.option(\"valueIndicator.size\", config.size());\r\n //***\r\n gauge.endUpdate();\r\n });\r\n\r\n config.comparisonFilter.dateOption.subscribe(function (newValue) {\r\n vm.shouldUpdateData = true;\r\n if (newValue !== ComparisonDateOptionStrEnum.Manual) {\r\n if (!config.metric()) {\r\n config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n }\r\n else\r\n if (config.target() === 0 || config.target() !== config.metric()) {\r\n config.target(config.metric());\r\n vm.targetMetricName(vm.metricName());\r\n }\r\n }\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n\r\n config.comparisonFilter.dateUnit.subscribe(function (value) {\r\n if (value !== ComparisonDateUnitStrEnum.Day && this.dateUnitValue() > 12) {\r\n this.dateUnitValue(1);\r\n }\r\n }.bind(config.comparisonFilter));\r\n\r\n ko.computed(function () {\r\n config.comparisonFilter.dateUnitValue();\r\n config.comparisonFilter.dateUnit();\r\n config.comparisonFilter.dateRange();\r\n\r\n if (vm.widgetId && !vm.isSetupWidget) {\r\n vm.shouldUpdateData = true;\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n }, this);\r\n }\r\n\r\n var updateNames = function (vm) {\r\n vm.metricName(mappingDataSource.getMetricName(vm.config.metric()));\r\n if (vm.config.target()) {\r\n vm.targetMetricName(mappingDataSource.getMetricName(vm.config.target()));\r\n }\r\n\r\n vm.isNamesUpdated = true;\r\n };\r\n \r\n var prepareViewModel = function (vm, config: GaugeConfig, widgetContainer = null) {\r\n vm.tabsOptions.dataSource = [\r\n {\r\n id: 1,\r\n text: \"Gauge\",\r\n icon: \"bi bi-speedometer2\",\r\n content: \"Gauge Settings\"\r\n },\r\n {\r\n id: 2,\r\n text: \"Visual\",\r\n icon: \"bi bi-card-checklist\",\r\n content: \"Gauge Visual Settings\"\r\n },\r\n vm.tabsOptions.dataSource[0],\r\n ];\r\n\r\n vm.metricName = ko.observable(\"\");\r\n vm.targetMetricName = ko.observable(\"\");\r\n vm.formattingRuleName = ko.observable(\"\");\r\n\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n else {\r\n vm.formattingRuleName = ko.observable(vm.formattingRuleObj.name);\r\n }\r\n\r\n vm.formattingRuleTextBoxOptions = {\r\n value: vm.formattingRuleName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n vm.formattingRulePopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose a Formatting Rule\",\r\n onClick: function (e) {\r\n var onSelected = function (evt) {\r\n if (evt) {\r\n vm.shouldUpdateData = true;\r\n formattingRule.copyProperties(evt.model, vm.formattingRuleObj);\r\n formattingRule.hide();\r\n\r\n config.endValue(null);\r\n config.formattingRule(evt.model.id);\r\n vm.formattingRuleName(evt.model.name);\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n formattingRule.openList($(e.element).siblings(\".dx-textbox\"), onSelected, undefined, undefined, undefined);\r\n }\r\n };\r\n vm.formattingRuleRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Formatting Rule\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n let blankRule = formattingRule.getNewFormattingRule();\r\n formattingRule.copyProperties(blankRule, vm.formattingRuleObj);\r\n config.endValue(null);\r\n config.formattingRule(null);\r\n vm.formattingRuleName(null);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n\r\n vm.comparisonDateOptions = [\r\n { value: ComparisonDateOptionStrEnum.Manual, text: \"None\" },\r\n { value: ComparisonDateOptionStrEnum.Previous, text: \"Previous\" },\r\n { value: ComparisonDateOptionStrEnum.Predefined, text: \"Predefined\" },\r\n ];\r\n vm.comparisonDateUnitValueOptions = [\r\n { value: 1 },\r\n { value: 2 },\r\n { value: 3 },\r\n { value: 4 },\r\n { value: 5 },\r\n { value: 6 },\r\n { value: 7 },\r\n { value: 8 },\r\n { value: 9 },\r\n { value: 10 },\r\n { value: 11 },\r\n { value: 12 },\r\n ];\r\n vm.comparisonDateUnitOptions = [\r\n { value: ComparisonDateUnitStrEnum.Year, text: \"Year\" },\r\n { value: ComparisonDateUnitStrEnum.Quarter, text: \"Quarter\" },\r\n { value: ComparisonDateUnitStrEnum.Month, text: \"Month\" },\r\n //{ value: \"Week\", text: \"Week\" },\r\n { value: ComparisonDateUnitStrEnum.Day, text: \"Day\" },\r\n ];\r\n }\r\n\r\n var setupViewModel = function (vm, widgetContainer) {\r\n prepareViewModel(vm, vm.config, widgetContainer);\r\n }\r\n \r\n var prepareSetup = function (vm, result: GaugeResultData, config: GaugeConfig, dashboardWidget) {\r\n vm.formattingRuleObj = formattingRule.getFormattingRuleById(config.formattingRule());\r\n if (!vm.formattingRuleObj) {\r\n vm.formattingRuleObj = formattingRule.getNewFormattingRule();\r\n }\r\n vm.metricName(mappingDataSource.getMetricName(config.metric()));\r\n if (config.target()) {\r\n vm.targetMetricName(mappingDataSource.getMetricName(config.target()));\r\n }\r\n\r\n vm.metricPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Metric\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n //If the metric is the same of target because of the comparison filter, update the target metric too\r\n if (config.target() === config.metric() && config.comparisonFilter.dateOption() !== ComparisonDateOptionStrEnum.Manual) {\r\n config.target(item.metricId);\r\n vm.targetMetricName(item.nodeName);\r\n }\r\n\r\n config.endValue(null);\r\n config.metric(item.metricId);\r\n vm.metricName(item.nodeName);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.metricRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Metric\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.endValue(null);\r\n config.metric(null);\r\n vm.metricName(null);\r\n config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n vm.metricTextBoxOptions = {\r\n value: vm.metricName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.targetPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Target Metric\",\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.target(item.metricId);\r\n vm.targetMetricName(item.nodeName);\r\n \r\n if (vm.config.target() !== vm.config.metric())\r\n vm.config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"Metrics\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n vm.targetRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Target Metric\",\r\n onClick: function (e) {\r\n vm.shouldUpdateData = true;\r\n\r\n config.target(null);\r\n vm.targetMetricName(null);\r\n vm.config.comparisonFilter.dateOption(ComparisonDateOptionStrEnum.Manual);\r\n\r\n dashboard.saveWidgetConfig(vm, true);\r\n }\r\n };\r\n vm.targetTextBoxOptions = {\r\n value: vm.targetMetricName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n if (result && result.value !== undefined && config.formattingRule() && config.metric()) {\r\n if (config.endValue() === null) {\r\n updatingEndValue = true;\r\n let formattingRuleObj = formattingRuleService.getFormattingRuleById(config.formattingRule())\r\n if (formattingRuleObj) {\r\n let frValues = formattingRuleObj.scales.map((x) => ({ minValue: x.minValue }));\r\n if (frValues.length > 0) {\r\n config.endValue(frValues[frValues.length - 1].minValue * 1.3);\r\n }\r\n else {\r\n config.endValue(0);\r\n }\r\n }\r\n updatingEndValue = false;\r\n }\r\n }\r\n\r\n let widgetBackgroundColor = ko.computed(function () {\r\n return vm.config.appearance.backgroundColor() || \"#fff\";\r\n });\r\n\r\n let ranges = getRanges(config, result);\r\n\r\n vm.gaugeSettings = {\r\n animation: {\r\n enabled: !result ? false : !result.isPrinting\r\n },\r\n value: getValue(config, result),\r\n subvalues: [getTargetValue(config, result)],\r\n scale: {\r\n startValue: ranges[0].startValue,\r\n endValue: ranges[ranges.length - 1].endValue,\r\n tickInterval: getTick(config, result),\r\n minorTickInterval: getTick(config, result) / 2,\r\n orientation: \"inside\",\r\n label: {\r\n indentFromTick: getIndentFromTick(config),\r\n customizeText: function (e) {\r\n let accountingStyle = config.accountingStyle() === -1 ? result?.metric?.accountingStyle || false : config.accountingStyle() ? true : false;\r\n let decimalPlaces = config.scalesFormat.decimalPlaces() === -1 ? result?.metric?.decimalPlaces || 0 : config.scalesFormat.decimalPlaces();\r\n let format = config.format() === FieldFormatEnum.None ? result?.metric?.metricFormat || FieldFormatEnum.Numeric : config.format();\r\n return formatValue(e.value, config.scalesFormat.unitFormat(), decimalPlaces, format, accountingStyle, result);\r\n },\r\n font: {\r\n color: config.scalesFormat.labelColor,\r\n size: config.scalesFormat.labelFontSize\r\n }\r\n },\r\n tick: {\r\n visible: config.tick(),\r\n width: 2,\r\n length: getTickLength(config),\r\n color: widgetBackgroundColor,\r\n },\r\n minorTick: {\r\n visible: config.tick(),\r\n width: 1,\r\n length: getMinorTickLength(config),\r\n color: widgetBackgroundColor,\r\n },\r\n },\r\n rangeContainer: {\r\n width: config.size(),\r\n offset: 10,\r\n orientation: \"inside\",\r\n ranges: ranges,\r\n },\r\n\r\n valueIndicator: {\r\n type: config.type() === GaugeTypeEnum.Circular ? \"twoColorNeedle\" : \"rangeBar\",\r\n color: getIndicatorColor(config, result, true, \"#A9A9A9\"),\r\n secondColor: '#808080',\r\n size: config.size(),\r\n offset: getIndicatorOffset(config),\r\n width: getValueIndicatorWidth(config),\r\n text: {\r\n customizeText: function (e) {\r\n let accountingStyle = config.accountingStyle() === -1 ? result?.metric?.accountingStyle || false : config.accountingStyle() ? true : false;\r\n let decimalPlaces = config.indicatorFormat.decimalPlaces() === -1 ? result?.metric?.decimalPlaces || 0 : config.indicatorFormat.decimalPlaces();\r\n let format = config.format() === FieldFormatEnum.None ? result?.metric?.metricFormat || FieldFormatEnum.Numeric : config.format();\r\n return formatValue(e.value, config.indicatorFormat.unitFormat(), decimalPlaces, format, accountingStyle, result);\r\n }\r\n }\r\n },\r\n subvalueIndicator: {\r\n type: \"triangleMarker\",\r\n palette: ['#808080'],\r\n width: 15,\r\n offset: getSubvalueIndicatorOffset(config),\r\n },\r\n centerTemplate: (gauge, container) => {\r\n if (config.showIndicatorValue() === GaugeShowIndicatorValueEnum.Middle) {\r\n const rect = createRect(50, 50, 'transparent');\r\n let value = \"0\";\r\n if (result) {\r\n let accountingStyle = config.accountingStyle() === -1 ? result?.metric?.accountingStyle || false : config.accountingStyle() ? true : false;\r\n let decimalPlaces = config.indicatorFormat.decimalPlaces() === -1 ? result?.metric?.decimalPlaces || 0 : config.indicatorFormat.decimalPlaces();\r\n let format = config.format() === FieldFormatEnum.None ? result?.metric?.metricFormat || FieldFormatEnum.Numeric : config.format();\r\n value = formatValue(gauge.value() !== undefined ? gauge.value() : 0, config.indicatorFormat.unitFormat(), decimalPlaces, format, accountingStyle, result);\r\n }\r\n //Apply a proportion to the width or height of the smaller size\r\n let minSize = dashboardWidget.width() < dashboardWidget.height() ? dashboardWidget.width() : dashboardWidget.height();\r\n let fontSize = config.fontSize() / 100 * (minSize);\r\n const text = createText(20, minSize / 2, fontSize, 'middle', value, getIndicatorColor(config, result, false, '#000'));\r\n\r\n container.appendChild(rect);\r\n container.appendChild(text);\r\n }\r\n },\r\n margin: {\r\n top: 10,\r\n bottom: 10,\r\n left: 10,\r\n right: 10\r\n },\r\n tooltip: {\r\n enabled: true,\r\n zIndex: 99999,\r\n customizeTooltip(arg) {\r\n if (arg.type === \"subvalue-indicator\") {\r\n let value = formatValue(arg.value, LabelFormatEnum.Normal, result.target.decimalPlaces, result.target.metricFormat, result.target.accountingStyle, result);\r\n return {\r\n text: `Target: ${value}`\r\n } \r\n }\r\n\r\n let value = formatValue(arg.value, LabelFormatEnum.Normal, result.metric.decimalPlaces, result.metric.metricFormat, result.metric.accountingStyle, result);\r\n return {\r\n text: `${vm.metricName()}: ${value}`\r\n }\r\n },\r\n }\r\n }\r\n\r\n applySubscribe(vm, config, result, dashboardWidget);\r\n }\r\n\r\n var setup = function (dashboardWidget, vm) {\r\n let dataBindElement = $(\".widget-data-bind-element\", dashboardWidget);\r\n if (dataBindElement.length) {\r\n vm.result = dataBindElement.data(\"json\") as GaugeResultData;\r\n vm.fieldLabel = ko.observable(\"Source\");\r\n prepareSetup(vm, vm.result, vm.config, dashboardWidget);\r\n ko.applyBindings(vm, dataBindElement[0]);\r\n }\r\n }\r\n\r\n return {\r\n setupViewModel: setupViewModel,\r\n setup: setup,\r\n updateNames: updateNames\r\n };\r\n\r\n}());","declare var widgetChart: any;\r\n\r\nenum WidgetTypeEnum {\r\n Report = \"Report\",\r\n RichText = \"RichText\",\r\n Chart = \"Chart\",\r\n Pivot = \"Pivot\",\r\n KPI = \"KPI\",\r\n None = \"None\",\r\n Filter = \"Filter\",\r\n TreeMap = \"TreeMap\",\r\n Map = \"Map\",\r\n Gauge = \"Gauge\"\r\n}\r\n\r\nvar dashboard = (function () {\r\n\r\n var tabContext = function () {\r\n\r\n return tabView.getActiveTab();\r\n };\r\n\r\n var getDashboardDesigner = function () { return $(\"div#DashboardDesignerResizer\", tabContext()); };\r\n\r\n var getDashboardContainer = function () { return $(\"div#DashboardContainer\", tabContext()); };\r\n\r\n var getWidgetContainer = function () { return $(\"div.widgetContainer\", getDashboardDesigner()); };\r\n\r\n var getBaseSubmitObject = function (inputObject) {\r\n return tabView.getBaseSubmitObject(inputObject);\r\n };\r\n\r\n var getWidget = function (widgetId: number) {\r\n return $(\"div.dashboardWidget[data-widgetid='\" + widgetId + \"']\", getWidgetContainer());\r\n };\r\n\r\n var addWidget = function (evt) {\r\n var button = $(evt.currentTarget);\r\n var widgetLayout = button.data(\"widgetlayout\");\r\n if (!button.is(\"button\")) {\r\n button = button.closest(\"div.btn-group\").find(\"button.addbutton\");\r\n }\r\n var widgettype = button.data(\"widgettype\");\r\n var widgetId = irGlobal.getGuid();\r\n var canvasWidth = getDashboardDesigner().width();\r\n var widgetWidth = canvasWidth;\r\n if (widgetLayout === \"HalfWidth\") {\r\n widgetWidth = canvasWidth / 2 - 6;\r\n\r\n } else if (widgetLayout === \"QuarterWidth\") {\r\n widgetWidth = canvasWidth / 4;\r\n }\r\n\r\n var widgetHeight = 300;\r\n\r\n switch (widgettype) {\r\n case WidgetTypeEnum.KPI:\r\n case WidgetTypeEnum.Filter:\r\n widgetWidth = 320;\r\n widgetHeight = 200;\r\n break;\r\n case WidgetTypeEnum.Map:\r\n widgetHeight = 350;\r\n break;\r\n case WidgetTypeEnum.Gauge:\r\n widgetWidth = 450;\r\n widgetHeight = 450;\r\n break;\r\n default:\r\n }\r\n\r\n var addObject = {\r\n newWidgetType: widgettype,\r\n newWidgetId: widgetId,\r\n width: parseInt(widgetWidth as any, 10),\r\n height: parseInt(widgetHeight as any, 10),\r\n };\r\n\r\n var successFunction = function (data) {\r\n var partial = data.widgetPartial;\r\n var dashboardDesigner = getDashboardDesigner();\r\n var widgetObj = $(partial);\r\n $(\"div.widgetContainer\", dashboardDesigner).css(\"z-index\", \"1\");\r\n widgetObj.css(\"top\", \"2px\");\r\n widgetObj.css(\"left\", \"3px\");\r\n dashboardDesigner.prepend(widgetObj);\r\n widgetObj.css(\"z-index\", \"100\");\r\n addWidgetActions(dashboardDesigner, widgetObj);\r\n let widgetVM = setupWidget(widgetObj);\r\n if (widgetVM) {\r\n if (widgetVM.widgetType() === WidgetTypeEnum.Report) {\r\n let newDashboardWidget = $(\".dashboardWidget\", widgetObj);\r\n refreshWidgetData({}, newDashboardWidget, true);\r\n }\r\n else {\r\n widgetObj.trigger(\"click\");\r\n clickWidget({ target: $(\".dashboardWidget>:first-child\", widgetObj) });\r\n }\r\n }\r\n };\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.dashboard + \"AddWidget\",\r\n addObject,\r\n successFunction,\r\n null,\r\n true);\r\n };\r\n\r\n var fixeReportTableHeader = function (widget) {\r\n let setWidgetAnalysis = function (container) {\r\n report.setup(container);\r\n };\r\n let setWidgetPivot = function (container) {\r\n report.setup(container);\r\n }\r\n\r\n if (widget) {\r\n widget = $(widget);\r\n var reportType = $(\".reportResult\", widget).data(\"reporttype\");\r\n if (reportType === ReportTypeStrEnum.Analysis) {\r\n setWidgetAnalysis(widget);\r\n }\r\n else if (reportType === ReportTypeStrEnum.Pivot) {\r\n setWidgetPivot(widget);\r\n }\r\n }\r\n else {\r\n getWidgetContainer().each(function (index, widgetElement) {\r\n let element = $(\".reportResult\", widgetElement);\r\n let reportType = element.data(\"reporttype\");\r\n if (reportType === ReportTypeStrEnum.Analysis) {\r\n setWidgetAnalysis(element);\r\n }\r\n else if (reportType === ReportTypeStrEnum.Pivot) {\r\n setWidgetPivot(element);\r\n }\r\n });\r\n }\r\n };\r\n\r\n var expandWidget = function (evt) {\r\n evt = $(evt);\r\n const widgetContainer = evt.hasClass(\".widgetContainer\") ? evt : evt.closest(\".widgetContainer\");\r\n const dashboardWidget = $(\".dashboardWidget\", widgetContainer);\r\n\r\n if (!widgetContainer.data(\"expand\")) {\r\n if (!dashboardWidget.hasClass(\"selected\")) {\r\n clickWidget(dashboardWidget);\r\n }\r\n resizeExpandedWidget(widgetContainer, dashboardWidget);\r\n widgetContainer.data(\"expand\", \"expanded\");\r\n widgetContainer.addClass(\"expanded\");\r\n }\r\n else {\r\n widgetContainer.css(\"z-index\", \"\");\r\n dashboardWidget.css(\"z-index\", \"\");\r\n dashboardWidget.css(\"width\", \"\");\r\n dashboardWidget.css(\"height\", \"\");\r\n dashboardWidget.css(\"top\", \"\");\r\n dashboardWidget.css(\"left\", \"\");\r\n dashboardWidget.css(\"position\", \"\");\r\n widgetContainer.data(\"expand\", \"\");\r\n widgetContainer.removeClass(\"expanded\");\r\n }\r\n\r\n if (widgetContainer.data(\"widgettype\") === WidgetTypeEnum.Pivot) {\r\n const pivot = pivotGrid.getPivotGridInstance(dashboardWidget);\r\n pivot.repaint();\r\n }\r\n else if (widgetContainer.data(\"widgettype\") === WidgetTypeEnum.Report) {\r\n const grid = report.getGridInstance(dashboardWidget);\r\n grid.repaint();\r\n }\r\n }\r\n\r\n var getExpandedWidgets = function () {\r\n let widgets = [];\r\n getWidgets().forEach(function (widget) {\r\n let widgetContainer = widget.element.closest(\".widgetContainer\");\r\n if (widgetContainer.data(\"expand\")) {\r\n widgets.push(widget);\r\n }\r\n });\r\n\r\n return widgets;\r\n }\r\n\r\n var resizeExpandedWidgets = function () {\r\n getExpandedWidgets().forEach(function (widget) {\r\n const widgetContainer = widget.element.closest(\".widgetContainer\");\r\n const dashboardWidget = widget.element.closest(\".dashboardWidget\");\r\n resizeExpandedWidget(widgetContainer, dashboardWidget);\r\n });\r\n }\r\n var resizeExpandedWidget = function (widgetContainer, dashboardWidget) {\r\n var dashboardDesigner = $(\"#DashboardDesignerResizer\");\r\n var designerWidth = dashboardDesigner.outerWidth() - 6;\r\n var designerHeight = dashboardDesigner.outerHeight();\r\n var designerOffset = dashboardDesigner.offset();\r\n\r\n widgetContainer.css(\"z-index\", 9999);\r\n dashboardWidget.css(\"z-index\", 9999);\r\n dashboardWidget.css(\"width\", designerWidth);\r\n dashboardWidget.css(\"height\", designerHeight);\r\n if (_zoom === 1) {\r\n dashboardWidget.css(\"top\", designerOffset.top);\r\n dashboardWidget.css(\"left\", designerOffset.left);\r\n }\r\n else {\r\n dashboardWidget.css(\"top\", 0);\r\n dashboardWidget.css(\"left\", 0);\r\n }\r\n dashboardWidget.css(\"position\", \"fixed\");\r\n }\r\n\r\n var editMode = ko.observable(false);\r\n\r\n var setEditMode = function () {\r\n let newEditMode = !editMode();\r\n if (!workbookViewModel.editing() && newEditMode) {\r\n return;\r\n }\r\n\r\n getExpandedWidgets().forEach(function (widget) {\r\n expandWidget(widget.element);\r\n });\r\n settingsVM.hideAllPopupDetails();\r\n\r\n editMode(newEditMode);\r\n applyEditMode();\r\n\r\n getWidgets().forEach(function (widget) {\r\n const widgetContainer = widget.element.closest(\".widgetContainer\");\r\n\r\n if (editMode()) {\r\n addResize(widgetContainer);\r\n addDraggable(widgetContainer);\r\n }\r\n else {\r\n removeResize(widgetContainer);\r\n removeDraggable(widgetContainer);\r\n }\r\n });\r\n };\r\n\r\n //update for zero in setup later\r\n var designerWidthTotal = 0;\r\n var designerHeightTotal = 0;\r\n var designerWidth = 0;\r\n var designerHeight = 0;\r\n var scaleForView = 0;\r\n var scaleForEdit = 0;\r\n\r\n var recalculateDashboardZoom = function () {\r\n designerWidthTotal = 0;\r\n\r\n let dashboardDesigner = $(\"#DashboardDesigner\");\r\n let dashboardDesignerResizer = $(\"#DashboardDesignerResizer\");\r\n\r\n dashboardDesigner.css(\"height\", \"\");\r\n dashboardDesigner.css(\"overflow\", \"auto\");\r\n\r\n dashboardDesignerResizer.css(\"transition\", \"\");\r\n\r\n dashboardDesignerResizer.css(\"transform\", \"\");\r\n dashboardDesignerResizer.css(\"width\", \"\");\r\n dashboardDesignerResizer.css(\"height\", \"100%\");\r\n\r\n applyEditMode(true);\r\n };\r\n\r\n var applyEditMode = function (dontAnimate: boolean = false) {\r\n\r\n let dashboardContainer = $(\"#DashboardContainer\");\r\n let dashboardDesigner = $(\"#DashboardDesigner\");\r\n let dashboardDesignerResizer = $(\"#DashboardDesignerResizer\");\r\n let dashboardSettingsPanel = $(\"#DashboardSettingsPanel\");\r\n\r\n if (designerWidthTotal === 0) {\r\n designerWidthTotal = document.getElementById(\"DashboardDesigner\").scrollWidth;\r\n designerHeightTotal = document.getElementById(\"DashboardDesigner\").scrollHeight;\r\n designerWidth = dashboardDesigner.width();\r\n designerHeight = dashboardDesigner.outerHeight();\r\n\r\n let paddingWidth = parseInt(dashboardDesigner.css(\"padding-left\")) + parseInt(dashboardDesigner.css(\"padding-right\"));\r\n let paddingHeight = + parseInt(dashboardDesigner.css(\"padding-top\")) + parseInt(dashboardDesigner.css(\"padding-bottom\"));\r\n\r\n designerWidthTotal = designerWidthTotal + paddingWidth;\r\n designerHeightTotal = designerHeightTotal + paddingHeight;\r\n\r\n let scaleWidth = designerWidth / designerWidthTotal;\r\n let scaleHeight = designerHeight / designerHeightTotal;\r\n scaleForView = scaleWidth < scaleHeight ? scaleWidth : scaleHeight;\r\n\r\n scaleWidth = (designerWidth - 220) / designerWidthTotal;\r\n scaleForEdit = scaleWidth < scaleHeight ? scaleWidth : scaleHeight;\r\n\r\n dashboardDesigner.css(\"overflow\", \"\");\r\n dashboardDesigner.css(\"height\", designerHeight);\r\n }\r\n\r\n let button = $(\"#SetEditMode\", dashboardContainer);\r\n let span = $(\"span\", button);\r\n let cssDisplay = \"none\";\r\n if (!dontAnimate)\r\n dashboardDesignerResizer.css(\"transition\", \"all .2s ease-in-out\");\r\n dashboardSettingsPanel.on(\"animationend\", function () {\r\n dashboardSettingsPanel.removeClass(\"animate__animated animate__slideInRight animate__slideOutRight\");\r\n dashboardSettingsPanel.css(\"display\", cssDisplay);\r\n });\r\n if (editMode()) {\r\n dashboardContainer.addClass(\"edit-mode\");\r\n span.addClass(\"glyphicon-eye-open\");\r\n span.removeClass(\"glyphicon-edit\");\r\n button.attr(\"title\", \"Set as View Mode\");\r\n\r\n _zoom = scaleForEdit;\r\n\r\n dashboardSettingsPanel.css(\"display\", \"inline-block\");\r\n cssDisplay = \"inline-block\";\r\n if (!dontAnimate)\r\n dashboardSettingsPanel.addClass(\"animate__animated animate__slideInRight\");\r\n\r\n dashboardDesignerResizer.css(\"transform-origin\", \"left top\");\r\n dashboardDesignerResizer.css(\"transform\", `scale(${_zoom})`);\r\n dashboardDesignerResizer.css(\"width\", `${designerWidthTotal}px`);\r\n dashboardDesignerResizer.css(\"height\", `${designerHeightTotal}px`);\r\n\r\n }\r\n else {\r\n dashboardContainer.removeClass(\"edit-mode\");\r\n span.removeClass(\"glyphicon-eye-open\");\r\n span.addClass(\"glyphicon-edit\");\r\n button.attr(\"title\", \"Set as Edit Mode\");\r\n\r\n if (dashboardSettingsPanel.css(\"display\") !== \"none\") {\r\n cssDisplay = \"none\";\r\n dashboardSettingsPanel.addClass(\"animate__animated animate__slideOutRight\");\r\n }\r\n\r\n dashboardDesignerResizer.css(\"transform-origin\", \"\");\r\n dashboardDesignerResizer.css(\"transform\", \"\");\r\n dashboardDesignerResizer.css(\"width\", \"\");\r\n dashboardDesignerResizer.css(\"height\", \"100%\");\r\n\r\n _zoom = scaleForView;\r\n\r\n if (_zoom < 1) {\r\n dashboardDesignerResizer.css(\"transform-origin\", \"left top\");\r\n dashboardDesignerResizer.css(\"transform\", `scale(${_zoom})`);\r\n dashboardDesignerResizer.css(\"width\", `${designerWidthTotal}px`);\r\n dashboardDesignerResizer.css(\"height\", `${designerHeightTotal}px`);\r\n }\r\n }\r\n\r\n $(\"span.zoom-info\").text(`${parseInt((_zoom * 100) as any)}%`);\r\n }\r\n\r\n var settingsVM = {\r\n vm: ko.observable(),\r\n widgetSelected: false,\r\n self: this,\r\n dashboardVM: undefined,\r\n applySettings: function (settings) {\r\n saveWidgetConfig(settings);\r\n },\r\n editWidget: function (settings) {\r\n let widgetId = settings.widgetId();\r\n let dashboardWidget = getWidget(widgetId);\r\n if (settings.widgetType() === \"RichText\")\r\n openHtmlEditor(\" \", dashboardWidget, settings);\r\n else\r\n openReportDesigner(\" \", dashboardWidget);\r\n },\r\n showHideChartOptionsWidget: function (settings, event) {\r\n let widgetId = settings.widgetId();\r\n let dashboardWidget = getWidget(widgetId);\r\n ko.contextFor($(\".chartMainContainer\", dashboardWidget)[0]).$data.chartVM.showHideChartOptionsWidget(event);\r\n },\r\n changeReportType: function (settings, element) {\r\n let widgetId = settings.widgetId();\r\n let dashboardWidget = getWidget(widgetId);\r\n\r\n changeReportType($(element.currentTarget), dashboardWidget);\r\n\r\n if (settings.reportType() === ReportTypeStrEnum.Chart) {\r\n settings.reportType(ReportTypeStrEnum.Analysis);\r\n settings.widgetType(WidgetTypeEnum.Report);\r\n }\r\n else {\r\n settings.reportType(ReportTypeStrEnum.Chart);\r\n settings.widgetType(WidgetTypeEnum.Chart);\r\n }\r\n\r\n var widgetContainer = dashboardWidget.closest(\".widgetContainer\");\r\n widgetContainer.data(\"widgettype\", settings.widgetType());\r\n widgetContainer.data(\"reporttype\", settings.reportType());\r\n\r\n },\r\n showPopupDetails: function (context, open: boolean = true) {\r\n this.hideAllPopupDetails();\r\n\r\n let popoverSettings = ko.dataFor($(\".widget-popover-content\", context)[0]);\r\n\r\n let reportType = $(\"div.reportResult\", popoverSettings.widget).data(\"reporttype\");\r\n let hasResult = $(\"div.reportResult div.chartResult\", popoverSettings.widget).length !== 0 || $(\"div.reportResult div.resultsTableContainer\", popoverSettings.widget).length !== 0;\r\n let chartOption = false;// $button.hasClass(\"chartOption\");\r\n let disabled = !hasResult || chartOption && reportType !== ReportTypeStrEnum.Chart;\r\n\r\n popoverSettings.changeReportTypeVisible(!disabled);\r\n popoverSettings.excelDownloadVisible(!disabled);\r\n\r\n if (open) {\r\n popoverSettings.showPopover();\r\n }\r\n },\r\n hidePopupDetails: function (context) {\r\n let popoverSettings = ko.dataFor($(\".widget-popover-content\", context)[0]);\r\n if (popoverSettings)\r\n popoverSettings.hidePopover();\r\n },\r\n hideAllPopupDetails: function () {\r\n $(\".widget-popover-content\").each(function () {\r\n let popoverSettings = ko.dataFor($(this)[0]);\r\n if (popoverSettings)\r\n popoverSettings.hidePopover();\r\n });\r\n }\r\n };\r\n\r\n var doNotClickWidget = false;\r\n var settingsVMApplied = false;\r\n let clicksWidgetCount = 0, timer = null;\r\n var clickWidget = function (evt, forceClick: boolean = false) {\r\n if (!evt.target)\r\n evt = { target: evt };\r\n\r\n if (doNotClickWidget || $(evt.target).hasClass(\"preventWidgetSettingsClose\") || $(evt.target).closest(\".preventWidgetSettingsClose\").length > 0) {\r\n doNotClickWidget = false;\r\n return;\r\n }\r\n\r\n let widgetContainer = $(evt.target).closest(\".widgetContainer\");\r\n //if the widget is expanded, return\r\n if (widgetContainer.data(\"expand\") && !forceClick)\r\n return;\r\n\r\n let dashboardWidget = $(\".dashboardWidget\", widgetContainer);\r\n let dashboardSettingsPanel = $(\"#DashboardSettingsPanel\");\r\n let widgetSelected = dashboardWidget.hasClass(\"selected\");\r\n let settings = null;\r\n if (!widgetSelected) {\r\n let oldSelectedWidget = $(\".dashboardWidget.selected\", getDashboardDesigner());\r\n if (oldSelectedWidget.length > 0) {\r\n var oldWidgetContainer = oldSelectedWidget.closest(\".widgetContainer\");\r\n unselectWidget(oldWidgetContainer, oldSelectedWidget, dashboardSettingsPanel);\r\n }\r\n\r\n $(\"#selected-widget-filters\").removeClass(\"hidden\");\r\n settings = getWidgetSettings(widgetContainer);\r\n\r\n dashboardWidget.addClass(\"selected\");\r\n widgetContainer.addClass(\"selected\");\r\n }\r\n\r\n if (widgetSelected) {\r\n clicksWidgetCount++;\r\n\r\n if (clicksWidgetCount === 1) {\r\n if (forceClick) {\r\n clicksWidgetCount = 0;\r\n unselectWidget(widgetContainer, dashboardWidget, dashboardSettingsPanel);\r\n filtersManager.addEventAvaliableFilters();\r\n }\r\n else {\r\n timer = setTimeout(function () {\r\n clicksWidgetCount = 0;\r\n unselectWidget(widgetContainer, dashboardWidget, dashboardSettingsPanel);\r\n filtersManager.addEventAvaliableFilters();\r\n }, 200);\r\n }\r\n }\r\n else {\r\n clearTimeout(timer);\r\n clicksWidgetCount = 0;\r\n }\r\n }\r\n else {\r\n clearTimeout(timer);\r\n clicksWidgetCount = 1;\r\n timer = setTimeout(function () {\r\n clicksWidgetCount = 0;\r\n }, 200);\r\n\r\n let widgetFilters = dashboardWidget.find(\".widgetHiddenFilters > ul > li\");\r\n widgetFilters.appendTo(\"#widgetFilterNav\");\r\n\r\n if (!settingsVMApplied) {\r\n settingsVM.vm = ko.observable(settings);\r\n ko.applyBindings(settingsVM, dashboardSettingsPanel[0]);\r\n settingsVMApplied = true;\r\n }\r\n else {\r\n settingsVM.vm(settings);\r\n }\r\n\r\n let generalOptions = dashboardWidget.find(\".widget-general-options\");\r\n generalOptions.appendTo(dashboardSettingsPanel.find(\".specific-settings\"));\r\n //Find later a better to deal with it -- too much specific\r\n dashboardWidget.find(\".chartMainOptionsContainer button.collapser\").addClass(\"hidden\");\r\n widgetDesigner.setupWidget(dashboardWidget, settings);\r\n\r\n settingsVM.widgetSelected = true;\r\n filtersManager.addEventAvaliableFilters();\r\n\r\n if (!editMode()) {\r\n settingsVM.showPopupDetails(widgetContainer, settingsVM.vm().openPopupDrillDown());\r\n }\r\n }\r\n };\r\n\r\n var unselectWidget = function (widgetContainer, dashboardWidget, dashboardSettingsPanel) {\r\n dashboardWidget.removeClass(\"selected\");\r\n widgetContainer.removeClass(\"selected\");\r\n $(\"#widgetFilterNav > li\").appendTo(dashboardWidget.find(\".widgetHiddenFilters > ul\"));\r\n\r\n var generalOptions = dashboardSettingsPanel.find(\".specific-settings .widget-general-options\");\r\n generalOptions.appendTo(dashboardWidget.find(\".widget-general-options-parent\"));\r\n\r\n settingsVM.vm(null);\r\n settingsVM.widgetSelected = false;\r\n $(\"#selected-widget-filters\").addClass(\"hidden\");\r\n settingsVM.hidePopupDetails(widgetContainer);\r\n };\r\n\r\n var addWidgetActions = function (dashboardDesigner, widgetContainer, htmlOutput: boolean = false) {\r\n if (!widgetContainer) {\r\n $(\".widgetContainer\", dashboardDesigner).each(function (index, element) {\r\n addWidgetActions(dashboardDesigner, $(element), htmlOutput);\r\n });\r\n } else {\r\n $('.mainWidgetNav', widgetContainer).off(\"dblclick\", widgetNameDoubleClick).on(\"dblclick\", widgetNameDoubleClick);\r\n addResize(widgetContainer);\r\n addDraggable(widgetContainer);\r\n\r\n var jsonData = $(\".widget-config\", widgetContainer).data(\"jsonconfig\");\r\n let widgetType = widgetContainer.data(\"widgettype\");\r\n switch (widgetType) {\r\n case WidgetTypeEnum.Chart:\r\n chart.addChartPlot(widgetContainer, null, reportView.addChartFilterDrilldown);\r\n break;\r\n case WidgetTypeEnum.Report:\r\n fixeReportTableHeader(widgetContainer);\r\n break;\r\n case WidgetTypeEnum.KPI:\r\n if (jsonData && jsonData.config.comparisonFilter.dateRange) {\r\n jsonData.config.comparisonFilter.dateRange = jsonData.config.comparisonFilter.dateRange.toString();\r\n }\r\n break;\r\n default:\r\n }\r\n\r\n addFilterPopover(widgetContainer);\r\n widgetContainer.off(\"click\", \"> *\", clickWidget).on(\"click\", \"> *\", clickWidget);\r\n\r\n if (jsonData) {\r\n let applyingBinding = true;\r\n // no tabs exist when outputing to HTML for PDF / Email\r\n if (htmlOutput) {\r\n jsonData.config.tabId = null;\r\n }\r\n\r\n var getInitialMetrics = function () {\r\n let metrics = [];\r\n if (jsonData.reportType === ReportTypeStrEnum.Analysis)\r\n metrics = jsonData.config.fields.filter(x => x.metricContainer);\r\n else if (jsonData.reportType === ReportTypeStrEnum.Chart)\r\n metrics = jsonData.config.metricFields;\r\n else\r\n return [];\r\n\r\n if (jsonData.config.includeAllMetrics) {\r\n metrics = mappingDataSource.getAllMetrics();\r\n }\r\n\r\n return metrics;\r\n }\r\n \r\n var vm = {\r\n config: ko.mapping.fromJS(jsonData.config || {}) as any,\r\n layout: ko.mapping.fromJS(jsonData.layout),\r\n widgetId: ko.observable(jsonData.widgetId),\r\n widgetType: ko.observable(jsonData.widgetType),\r\n reportType: ko.observable(jsonData.reportType),\r\n name: ko.observable(jsonData.name),\r\n openPopupDrillDown: ko.observable(jsonData.openPopupDrillDown),\r\n allowShowPopover: undefined,\r\n tracker: undefined,\r\n layoutTracker: undefined,\r\n notSaveLayout: false,\r\n isPrinting: ko.observable(jsonData.isPrinting || false),\r\n\r\n updatingDrilldown: ko.observable(false),\r\n topBottom: ko.observable(jsonData.config.topBottom === TopBottomEnum.None || jsonData.config.topBottom === TopBottomEnum.All || !jsonData.config.topBottom ? \"-1\" : jsonData.config.topBottom === TopBottomEnum.Top ? `T${jsonData.config.resultCount}` : `B${jsonData.config.resultCount}`),\r\n topBottomError: undefined,\r\n topBottomQueryName: ko.observable(jsonData.config.topBottomFieldName?.queryName),\r\n topBottomFields: ko.observableArray(getInitialMetrics()),\r\n\r\n editMode: ko.computed(function () { return editMode(); }),\r\n widget: $(\"div.dashboardWidget\", widgetContainer),\r\n popoverDiv: null,\r\n popoverOptions: {\r\n title: undefined,\r\n target: widgetContainer,\r\n container: \"#DashboardDesigner\",\r\n shading: false,\r\n position: { my: 'top center', at: 'bottom center', collision: 'flipfit' },\r\n width: 365,\r\n minHeight: jsonData.reportType === ReportTypeStrEnum.Analysis || jsonData.reportType === ReportTypeStrEnum.Pivot || jsonData.reportType === ReportTypeStrEnum.Chart ? 130 : undefined,\r\n showTitle: true,\r\n showCloseButton: false,\r\n hideOnOutsideClick: function () { return false; },\r\n toolbarItems: [{\r\n widget: 'dxButton',\r\n toolbar: 'top',\r\n location: 'after',\r\n cssClass: 'popover-button-noborder',\r\n options: {\r\n icon: \"close\",\r\n onClick() {\r\n let instance = $(\".widget-popover-content\", vm.widget).data(\"dxPopover\");\r\n if (instance) {\r\n if (vm.openPopupDrillDown) {\r\n let submitObject = tabView.getBaseSubmitObject({\r\n widgetId: vm.widgetId()\r\n });\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.dashboard + \"ChangePopUpOpening\",\r\n submitObject,\r\n function () {\r\n vm.openPopupDrillDown(false);\r\n },\r\n null,\r\n true);\r\n }\r\n\r\n instance.hide();\r\n }\r\n },\r\n },\r\n }],\r\n onShowing: function (e) {\r\n $(\"#DrilldownReportsList\", e.element).parent().remove();\r\n let html = $(\"#widget-drilldownlist\", vm.widget).html();\r\n $(\".dx-popup-content\", e.element).append(html);\r\n reportView.addDrilldownActions();\r\n\r\n let convertReportBtn = $(\"button.SelectChart\", e.element);\r\n if (vm.widgetType() === WidgetTypeEnum.Report || vm.widgetType() === WidgetTypeEnum.Pivot) {\r\n convertReportBtn.attr(\"title\", \"Change To Chart\");\r\n convertReportBtn.html(``);\r\n }\r\n else if (vm.widgetType() === WidgetTypeEnum.Chart) {\r\n convertReportBtn.attr(\"title\", \"Change To Table Report/Pivot\");\r\n convertReportBtn.html(``);\r\n }\r\n\r\n let popup = e.component.content().closest(\"div.dx-overlay-content.dx-popup-normal\");\r\n popup.addClass(\"invisible\");\r\n },\r\n onShown: function (e) {\r\n reportView.addDrilldownActions();\r\n\r\n //eg.: translate(width, height)\r\n let popup = $(\"div.dx-overlay-content.dx-popup-normal.dx-popup-flex-height:not(.dx-state-invisible)\").last();\r\n vm.popoverDiv = popup;\r\n if (popup.length > 0) {\r\n let transform = popup[0].style.transform;\r\n if (transform) {\r\n const regexp = /-?\\d+/g;\r\n const matches = transform.match(regexp);\r\n let width = parseInt(matches[0], 10);\r\n let height = parseInt(matches[1], 10);\r\n\r\n let widgetTopPosition = vm.widget[0].getBoundingClientRect().top + vm.widget[0].getBoundingClientRect().height;\r\n let widgetLeftPosition = vm.widget[0].getBoundingClientRect().left + vm.widget[0].getBoundingClientRect().width;\r\n\r\n if (height > widgetTopPosition) {\r\n height = widgetTopPosition + 7;\r\n popup.css(\"transform\", `translate(${width}px, ${height}px)`);\r\n }\r\n else if (width > widgetLeftPosition) {\r\n width = widgetLeftPosition + 7;\r\n popup.css(\"transform\", `translate(${width}px, ${height}px)`);\r\n }\r\n\r\n if (height < 0) {\r\n height = 0;\r\n popup.css(\"transform\", `translate(${width}px, ${height}px)`);\r\n }\r\n\r\n if (width < 0) {\r\n width = 0;\r\n popup.css(\"transform\", `translate(${width}px, ${height}px)`);\r\n }\r\n\r\n popup.removeClass(\"invisible\");\r\n }\r\n }\r\n\r\n if (vm.reportType() === ReportTypeStrEnum.Analysis || vm.reportType() === ReportTypeStrEnum.Chart) {\r\n const reportVM = reportSettings.getSettings(vm.widget);\r\n if (reportVM) {\r\n ///let metrics = getInitialMetrics();\r\n let metrics = [];\r\n if (vm.reportType() === ReportTypeStrEnum.Analysis) {\r\n metrics = ko.toJS(reportVM.fields().filter(x => x.metricContainer));\r\n }\r\n else if (vm.reportType() === ReportTypeStrEnum.Chart) {\r\n metrics = ko.toJS(reportVM.metricFields());\r\n }\r\n\r\n if (metrics.length === 0 && reportVM.includeAllMetrics()) {\r\n metrics = mappingDataSource.getAllMetrics();\r\n }\r\n\r\n //Force to set the value after updating the options\r\n updatingTopBottom = true;\r\n let x = vm.topBottomQueryName();\r\n vm.topBottomQueryName(\"-1\");\r\n vm.topBottomFields(metrics);\r\n vm.topBottomQueryName(x);\r\n updatingTopBottom = false;\r\n }\r\n else {\r\n vm.topBottomFields([]);\r\n }\r\n }\r\n }\r\n },\r\n showHideSearchBox: function () {\r\n dashboard.showHideSearchBox(this.widget);\r\n },\r\n showHideFilterPanel: function () {\r\n let dashboardWidget = this.widget.hasClass(\".dashboardWidget\") ? this.widget : this.widget.closest(\"div.dashboardWidget\");\r\n let settings = reportSettings.getSettings(dashboardWidget);\r\n if (settings) {\r\n settings.enableFilterPanel(!settings.enableFilterPanel());\r\n }\r\n },\r\n openTabDetail: function () {\r\n dashboard.openTabDetail(this.widget);\r\n },\r\n copyWidget: function () {\r\n dashboard.copyWidget(this.widget);\r\n },\r\n expandWidget: function () {\r\n settingsVM.hidePopupDetails(this.widget);\r\n expandWidget(this.widget);\r\n },\r\n showSql: function () {\r\n tabView.showDebugSql(this.widget.closest('.widgetContainer'));\r\n },\r\n changeReportType: function (evt) {\r\n changeReportType($(evt.currentTarget), this.widget);\r\n },\r\n excelDownload: function () {\r\n addDownloadExcelClick({ currentTarget: this.widget });\r\n },\r\n editWidget: function () {\r\n settingsVM.editWidget(this);\r\n },\r\n showHideChartOptionsWidget: function (event) {\r\n settingsVM.showHideChartOptionsWidget(this, event);\r\n },\r\n selectionRowClick: function (evt) {\r\n let settings = reportSettings.getSettings(this.widget);\r\n settings.enableRowSelection(!settings.enableRowSelection());\r\n },\r\n openOrderByFields: function (evt) {\r\n reportView.popupAdditionalOrderSelect();\r\n },\r\n changeReportTypeVisible: ko.observable(false),\r\n excelDownloadVisible: ko.observable(true),\r\n showPopoverClick: function () {\r\n if (!this.widget.hasClass(\"selected\")) {\r\n clickWidget(this.widget);\r\n }\r\n\r\n settingsVM.showPopupDetails(this.widget);\r\n },\r\n showPopover: function () {\r\n if (this.allowShowPopover()) {\r\n let instance = $(\".widget-popover-content\", this.widget).data(\"dxPopover\");\r\n if (!instance) {\r\n $(\".widget-popover-content\", this.widget).dxPopover(this.popoverOptions);\r\n instance = $(\".widget-popover-content\", this.widget).data(\"dxPopover\");\r\n }\r\n\r\n reportView.populateOrderSelect();\r\n\r\n instance.show();\r\n }\r\n },\r\n hidePopover: function () {\r\n let instance = $(\".widget-popover-content\", this.widget).data(\"dxPopover\");\r\n if (instance) {\r\n instance.hide();\r\n }\r\n }\r\n };\r\n\r\n let applyTopBottom = function () {\r\n if (vm.updatingDrilldown() || applyingBinding) {\r\n return;\r\n }\r\n\r\n if (vm.config.topBottom() && (vm.topBottom() === \"-1\" ||\r\n (vm.topBottom() !== \"-1\" && vm.topBottomQueryName() && vm.topBottomQueryName() !== \"-1\"))) {\r\n var submitObject = tabView.getBaseSubmitObject({\r\n orderField: vm.topBottom() === \"-1\" ? \"\" : vm.topBottomQueryName(),\r\n resultCount: parseInt(vm.topBottom().replace(\"T\", \"\").replace(\"B\", \"\")),\r\n topBottom: vm.topBottom().startsWith(\"T\") ? \"Top\" : vm.topBottom().startsWith(\"B\") ? \"Bottom\" : \"All\",\r\n widgetId: vm.widgetId()\r\n });\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.workBook + \"ChangeTopBottom\",\r\n submitObject,\r\n function (data) {\r\n afterUpdatedWidgetData(data, vm.widget);\r\n },\r\n null,\r\n true);\r\n }\r\n }\r\n vm.topBottomError = ko.computed(function () {\r\n return vm.topBottom() !== \"-1\" && (!vm.topBottomQueryName() || vm.topBottomQueryName() === \"-1\");\r\n });\r\n let updatingTopBottom = false;\r\n vm.topBottom.subscribe(function () {\r\n updatingTopBottom = true;\r\n if (vm.topBottom() === \"-1\") {\r\n vm.topBottomQueryName(\"-1\");\r\n }\r\n updatingTopBottom = false;\r\n\r\n applyTopBottom();\r\n });\r\n vm.topBottomQueryName.subscribe(function () {\r\n if (!updatingTopBottom) {\r\n applyTopBottom();\r\n }\r\n });\r\n\r\n vm.allowShowPopover = ko.computed(function () {\r\n return (editMode() || !editMode()) && (this.reportType() === ReportTypeStrEnum.Analysis || this.reportType() === ReportTypeStrEnum.Pivot || this.reportType() === ReportTypeStrEnum.Chart || this.widgetType() === WidgetTypeEnum.TreeMap);\r\n }.bind(vm));\r\n vm.popoverOptions.title = `${vm.widgetType()}: ${vm.name()}`;\r\n const updatePopoverTitle = function () {\r\n vm.popoverOptions.title = `${vm.widgetType()}: ${vm.name()}`;\r\n let instance = $(\".widget-popover-content\", vm.widget).data(\"dxPopover\");\r\n if (instance) {\r\n instance.option(\"title\", vm.popoverOptions.title);\r\n }\r\n }\r\n vm.widgetType.subscribe(updatePopoverTitle);\r\n vm.name.subscribe(updatePopoverTitle);\r\n\r\n vm.config.appearance = ko.mapping.fromJS(jsonData.appearance);\r\n vm.config.tabDetailId = ko.mapping.fromJS(jsonData.tabDetailId);\r\n vm.config.copyMetricsToTab = ko.mapping.fromJS(jsonData.copyMetricsToTab);\r\n vm.config.copyDimensionsToTab = ko.mapping.fromJS(jsonData.copyDimensionsToTab);\r\n\r\n let oldJsonConfig = \"\";\r\n vm.tracker = ko.computed(function () {\r\n let jsonConfig = ko.toJSON(vm.config);\r\n if (settingsVM.vm && settingsVM.vm() !== null && settingsVM.widgetSelected && oldJsonConfig !== jsonConfig && oldJsonConfig !== \"\") {\r\n settingsVM.applySettings(vm);\r\n }\r\n oldJsonConfig = jsonConfig;\r\n }, vm.config);\r\n\r\n let oldJsonLayout = \"\";\r\n vm.layoutTracker = ko.computed(function () {\r\n let jsonLayout = ko.toJSON(vm.layout);\r\n if (!vm.notSaveLayout && oldJsonLayout !== \"\" && oldJsonLayout !== jsonLayout) {\r\n saveWidgetLayout(vm);\r\n }\r\n oldJsonLayout = jsonLayout;\r\n }, vm.config);\r\n\r\n widgetDesigner.setupViewModel(widgetContainer, vm, htmlOutput);\r\n ko.applyBindings(vm, $(\".widget-config\", widgetContainer)[0]);\r\n ko.applyBindings(vm, $(\".widget-popover-content\", widgetContainer)[0]);\r\n if ($(\".widget-top-container .widgetbuttons\", widgetContainer).length > 0) {\r\n ko.applyBindings(vm, $(\".widget-top-container .widgetbuttons\", widgetContainer)[0]);\r\n }\r\n\r\n applyingBinding = false;\r\n }\r\n }\r\n };\r\n\r\n var addDownloadExcelClick = function (evt) {\r\n let $widget = $(evt.currentTarget).closest(\".dashboardWidget\");\r\n let reportObj = getBaseSubmitObject({ widgetId: $widget.data(\"widgetid\") });\r\n window.location.href = urlConfigs.dashboard +\r\n \"DownloadToExcel?\" +\r\n $.param(reportObj);\r\n };\r\n\r\n var showError = function (showError, data, widget) {\r\n var errorContainer = $(\"div.errorDisplay\", widget);\r\n $(\"div.result-error\", widget).remove();\r\n if (errorContainer.length === 0) return;\r\n if (showError) {\r\n errorContainer.removeClass(\"hidden\");\r\n errorContainer.addClass(\"in\");\r\n $(\"p.message\", errorContainer).html(data.error);\r\n if (data.errorInfo && data.errorType)\r\n widget.append(`
`);\r\n\r\n } else {\r\n errorContainer.addClass(\"hidden\");\r\n errorContainer.removeClass(\"in\");\r\n $(\"p.message\", errorContainer).html(\"\");\r\n\r\n }\r\n };\r\n\r\n var changeButton = function ($button, newWidgetType, oldReportType, $widget) {\r\n var $glyphSpan = $(\"span\", $button);\r\n\r\n if (newWidgetType == 'Chart') {\r\n $glyphSpan.data(\"icon\", \"list_alt\");\r\n $button.prop('title', oldReportType == 'Pivot' ? 'Change to Pivot' : 'Change to Table Report');\r\n $(\".showChartOptionsWidget \", $widget).prop(\"disabled\", false);\r\n } else if (newWidgetType == 'Analysis' || newWidgetType == 'Pivot') {\r\n $glyphSpan.data(\"icon\", \"equalizer\");\r\n $button.prop('title', \"Change to Chart\");\r\n $(\".showChartOptionsWidget \", $widget).prop(\"disabled\", true);\r\n }\r\n }\r\n\r\n var renderChart = function (dashboardWidget, vm) {\r\n var canvas = $(\".chartdiv\", dashboardWidget);\r\n if (canvas.length === 0) return;\r\n chart.addChartPlot(dashboardWidget, null, reportView.addChartFilterDrilldown, false, null, vm);\r\n };\r\n\r\n var updateWidgetContents = function (dashboardWidget, data) {\r\n if (data.error) {\r\n showError(true, data, dashboardWidget);\r\n filtersManager.handleFilterErrors(data, true);\r\n return;\r\n } else {\r\n showError(false, null, dashboardWidget);\r\n }\r\n\r\n if (data.workbookDashboardList) {\r\n tabView.updateWorkbookDashboardList(data);\r\n }\r\n if (data.workbookReportList) {\r\n tabView.updateWorkbookReportList(data);\r\n tabView.setupTabActions();\r\n }\r\n\r\n var $filterList = $(\".filterList\", dashboardWidget);\r\n if (data.filterResults) {\r\n $filterList.html(data.filterResults);\r\n addFilterPopover(dashboardWidget);\r\n }\r\n\r\n var $dashboardFilterList = $(\"#navContainer .tabFilterNav .filterList\", getDashboardContainer());\r\n if (data.dashboardFilterResults) {\r\n $dashboardFilterList.html(data.dashboardFilterResults);\r\n filtersManager.addDefaultFilterEvents($dashboardFilterList);\r\n }\r\n\r\n //Other type widgets\r\n if (data.partialViewResult) {\r\n var $currentResult = $(\"div.reportResult\", dashboardWidget);\r\n if ($currentResult.length === 0) {\r\n $currentResult = $(\".widget-result\", dashboardWidget);\r\n $currentResult.replaceWith(data.partialViewResult);\r\n }\r\n else {\r\n $currentResult.html(data.partialViewResult);\r\n }\r\n\r\n //alert(' data.widgetType : ' + data.widgetType);\r\n //console.log(' data.reportType : ' + data.reportType);\r\n\r\n $currentResult.data(\"widgettype\", data.widgetType);\r\n $currentResult.data(\"reporttype\", data.reportType);\r\n\r\n var widgetContainer = dashboardWidget.closest(\".widgetContainer\");\r\n widgetContainer.data(\"widgettype\", data.widgetType);\r\n widgetContainer.data(\"reporttype\", data.reportType);\r\n\r\n var vm = setupWidget(dashboardWidget);\r\n if (vm) {\r\n vm.widgetType(data.widgetType);\r\n if (data.widgetType === WidgetTypeEnum.Chart) {\r\n renderChart(dashboardWidget, vm);\r\n } else {\r\n fixeReportTableHeader(dashboardWidget);\r\n }\r\n }\r\n }\r\n\r\n filtersManager.checkFiltersErrors(getDashboardContainer());\r\n };\r\n\r\n var setupWidget = function (dashboardWidget) {\r\n let widgetType = $(dashboardWidget).closest(\".widgetContainer\").data(\"widgettype\");\r\n let context = ko.contextFor($(\".widget-config\", dashboardWidget)[0]);\r\n if (!context) {\r\n return null;\r\n }\r\n\r\n var vm = context.$data;\r\n vm.isSetupWidget = true;\r\n switch (widgetType) {\r\n case WidgetTypeEnum.KPI:\r\n widgetKPI.setup(dashboardWidget, vm);\r\n break;\r\n case WidgetTypeEnum.Chart:\r\n widgetChart.setup(dashboardWidget, vm);\r\n break;\r\n case WidgetTypeEnum.Filter:\r\n widgetFilter.setup(dashboardWidget, vm);\r\n break;\r\n case WidgetTypeEnum.TreeMap:\r\n widgetTreeMap.setup(dashboardWidget, vm);\r\n break;\r\n case WidgetTypeEnum.Map:\r\n widgetMap.setup(dashboardWidget, vm);\r\n break;\r\n case WidgetTypeEnum.Gauge:\r\n widgetGauge.setup(dashboardWidget, vm);\r\n break;\r\n default:\r\n break;\r\n }\r\n vm.isSetupWidget = false;\r\n return vm;\r\n };\r\n\r\n var updateWidgetNameClick = function (evt, element, popover, widgetId) {\r\n var updateNameObj = {\r\n name: element.val(),\r\n widgetId: widgetId\r\n };\r\n\r\n var successFunction = function (data) {\r\n let widgetLabel = $(\".widgetName\", `div[data-widgetid=${widgetId}]`);\r\n widgetLabel.text(element.val());\r\n popover.hide();\r\n\r\n tabView.updateWorkbookDashboardList(data);\r\n tabView.updateWorkbookReportList(data);\r\n\r\n let vm = ko.contextFor($(\".widget-config\", $(`.dashboardWidget[data-widgetid=${widgetId}]`))[0]).$data;\r\n vm.name(element.val());\r\n };\r\n\r\n var url = urlConfigs.dashboard + \"UpdateWidgetName\";\r\n irGlobal.updateFromServer(evt,\r\n url,\r\n updateNameObj,\r\n successFunction,\r\n null,\r\n true,\r\n \"POST\");\r\n\r\n };\r\n\r\n var loadWidgets = function () {\r\n refreshWidgets();\r\n };\r\n\r\n var getWidgets = function () {\r\n var widgets = [];\r\n getDashboardDesigner().find(\"div.dashboardWidget\").each(function (index, element) {\r\n let dashboardWidget = $(element);\r\n let widget = dashboardWidget.closest(\".widgetContainer\");\r\n widgets.push({\r\n id: dashboardWidget.data(\"widgetid\"),\r\n type: widget.data(\"widgettype\"),\r\n vm: getWidgetSettings(widget),\r\n element: $(dashboardWidget)\r\n });\r\n });\r\n\r\n return widgets;\r\n };\r\n var refreshWidgets = function (widgetsIdRefresh = []) {\r\n let widgets = getWidgets();\r\n widgets.forEach(function (widget) {\r\n if (widgetsIdRefresh.length === 0 || widgetsIdRefresh.includes(widget.id)) {\r\n refreshWidgetData(\" \", widget.element);\r\n }\r\n });\r\n };\r\n\r\n var addLoaderWidget = function (dashboardWidget) {\r\n let widgetResult = $(\".reportResult.widget-result\", dashboardWidget);\r\n let divLoader = $(\".widget-loader\", widgetResult);\r\n if (divLoader.length === 0) {\r\n divLoader = $(\"
\");\r\n widgetResult.append(divLoader);\r\n }\r\n }\r\n var removeLoaderWidget = function (dashboardWidget) {\r\n let widgetResult = $(\".reportResult.widget-result\", dashboardWidget);\r\n let divLoader = $(\".widget-loader\", widgetResult);\r\n divLoader.remove();\r\n }\r\n var afterUpdatedWidgetData = function (data, dashboardWidget, selectAfterUpdate: boolean = false, callback: Function = null) {\r\n var isSelected = $(dashboardWidget).is(\".selected\");\r\n\r\n if (isSelected) {\r\n clickWidget(dashboardWidget, true);\r\n }\r\n\r\n updateWidgetContents(dashboardWidget, data);\r\n\r\n if (isSelected || selectAfterUpdate)\r\n clickWidget(dashboardWidget, true);\r\n\r\n if (callback && typeof callback === \"function\") {\r\n callback();\r\n }\r\n\r\n removeLoaderWidget(dashboardWidget);\r\n reportView.addDrilldownActions();\r\n reportView.enableDisabledDrilldown();\r\n }\r\n var refreshWidgetData = function (evt, dashboardWidget, selectAfterUpdate: boolean = false, callback: Function = null) {\r\n if (!dashboardWidget) {\r\n dashboardWidget = $(evt.currentTarget).closest(\"div.dashboardWidget\");\r\n if (dashboardWidget.length === 0)\r\n dashboardWidget = $(\"div.dashboardWidget.selected\");\r\n }\r\n\r\n addLoaderWidget(dashboardWidget);\r\n\r\n var successFunction = function (data) {\r\n afterUpdatedWidgetData(data, dashboardWidget, selectAfterUpdate, callback);\r\n };\r\n var errorFunction = function () {\r\n removeLoaderWidget(dashboardWidget);\r\n };\r\n\r\n var reporttype = $(\"div.reportResult\", dashboardWidget).data(\"reporttype\");\r\n\r\n var updateObj = {\r\n widgetIdForUpdate: dashboardWidget.data(\"widgetid\"),\r\n reportType: reporttype\r\n };\r\n\r\n var url = urlConfigs.dashboard + \"UpdateWidgetReportData\";\r\n irGlobal.updateFromServer({},\r\n url,\r\n updateObj,\r\n successFunction,\r\n errorFunction,\r\n true,\r\n \"POST\",\r\n false);\r\n };\r\n\r\n var widgetNameDoubleClick = function (e) {\r\n e.stopPropagation();\r\n\r\n if (!editMode()) {\r\n return;\r\n }\r\n\r\n let link = irGlobal.getJqueryElement(e.currentTarget) as any;\r\n link.popover(\r\n {\r\n html: true,\r\n placement: function (a, b) {\r\n const popupWidth = 450;\r\n let widget = this.$element.closest(\"div.widgetContainer\");\r\n let left = parseInt(widget.css(\"left\").replace(\"px\", \"\"));\r\n if (left <= (popupWidth - widget.width()) / 2) {\r\n return \"right\";\r\n }\r\n\r\n let dashboardResizer = $(\"#DashboardDesignerResizer\");\r\n if (dashboardResizer.width() - (left + widget.width()) < (popupWidth - widget.width()) / 2) {\r\n return \"left\";\r\n }\r\n\r\n return \"bottom\";\r\n },\r\n trigger: \"manual\",\r\n container: $(\"#DashboardDesigner\"),\r\n content: \"
\"\r\n });\r\n\r\n link.off(\"shown.bs.popover\").on(\"shown.bs.popover\",\r\n function () {\r\n let po = $(this).data(\"bs.popover\");\r\n let content = po.$tip;\r\n let currentWidgetLink = $(this);\r\n let currentWidgetName = currentWidgetLink.text().trim();\r\n let widgetId = currentWidgetLink.closest(\"div.dashboardWidget\").data(\"widgetid\");\r\n let $widgetNameElement = $(\"input.widgetName\", content);\r\n let oldName = currentWidgetName;\r\n $widgetNameElement.val(currentWidgetName);\r\n\r\n $(\"input.widgetName\", content).off(\"keyup\").on(\"keyup\", function (event) {\r\n if (event.keyCode === 13) {\r\n event.preventDefault();\r\n\r\n if (($widgetNameElement.val() as any).trim() === \"\") {\r\n $widgetNameElement.val(oldName);\r\n }\r\n\r\n updateWidgetNameClick(event, $widgetNameElement, po, widgetId)\r\n }\r\n else if (event.keyCode === 27) {\r\n event.preventDefault();\r\n $widgetNameElement.val(oldName);\r\n po.hide();\r\n }\r\n });\r\n $widgetNameElement.focus();\r\n $widgetNameElement.off(\"blur\").on(\"blur\", function (e) {\r\n if (($widgetNameElement.val() as any).trim() === \"\") {\r\n $widgetNameElement.val(oldName);\r\n }\r\n\r\n updateWidgetNameClick(e, $widgetNameElement, po, widgetId)\r\n });\r\n });\r\n\r\n link.popover(\"show\");\r\n };\r\n\r\n var openReportDesigner = function (evt, dashboardWidget) {\r\n if (!dashboardWidget)\r\n dashboardWidget = $(evt.currentTarget).closest(\"div.dashboardWidget\");\r\n let widgetId = dashboardWidget.data(\"widgetid\");\r\n\r\n let url = urlConfigs.designer + \"Edit\";\r\n let $resultContainer = $(\"div.reportResult\", dashboardWidget);\r\n let designer = $resultContainer.data(\"widgettype\");\r\n let baseObject = getBaseSubmitObject({ widgetId: widgetId, designerMode: designer });\r\n\r\n var callbackFunction = function (tempId, reportType) {\r\n $(\"#DesignModel\").dxPopup(\"instance\").hide();\r\n var widgetType = dashboardWidget.data(\"widgetType\");\r\n var successFunction = function (data) {\r\n updateWidgetPartial(dashboardWidget, data.widgetPartial, data.workbookReportList, data.workbookDashboardList);\r\n };\r\n\r\n var widgetUpdateObj = {\r\n widgetId: widgetId,\r\n widgetType: widgetType\r\n };\r\n widgetUpdateObj = getBaseSubmitObject(widgetUpdateObj);\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.dashboard + \"GetWidgetPartial\",\r\n widgetUpdateObj,\r\n successFunction,\r\n null,\r\n true);\r\n };\r\n var complete = function (data) {\r\n $(\"#DesignModel\").dxPopup({\r\n //prevent esc to close\r\n focusStateEnabled: false,\r\n title: \"Report Designer\",\r\n height: function () { return $(window).height() * 0.9 },\r\n width: \"max(80vw, 1280px)\",\r\n visible: true,\r\n contentTemplate: data.view,\r\n dragOutsideBoundary: true,\r\n onShowing: function (e) {\r\n reportDesigner.settingsReportButtonClick();\r\n reportDesigner.setup(callbackFunction, data.designer, data.schema, true);\r\n },\r\n onShown: function (e) {\r\n if (this._$wrapper) {\r\n this._$wrapper.css(\"z-index\", \"\");\r\n }\r\n reportDesigner.resize();\r\n },\r\n onHidden: function (e) {\r\n $(\"#DesignModel\").dxPopup(\"dispose\");\r\n },\r\n });\r\n };\r\n irGlobal.updateFromServer(evt, url, baseObject, complete, null, true, \"POST\");\r\n };\r\n\r\n var updateWidgetPartial = function (dashboardWidget, widgetPartial, workbookReportList, workbookDashboardList) {\r\n let isWidgetSelected = dashboardWidget.hasClass(\"selected\");\r\n if (isWidgetSelected) {\r\n clickWidget(dashboardWidget, true);\r\n }\r\n\r\n let partial = widgetPartial;\r\n let widgetContainer = dashboardWidget.closest(\".widgetContainer\");\r\n\r\n\r\n let newDashboardContainer = $(partial);\r\n widgetContainer.replaceWith(newDashboardContainer);\r\n addWidgetActions(null, newDashboardContainer);\r\n setupWidget(newDashboardContainer);\r\n let newDashboardWidget = $(\".dashboardWidget\", newDashboardContainer);\r\n refreshWidgetData({}, newDashboardWidget, isWidgetSelected);\r\n\r\n if (tabView) {\r\n if (workbookReportList) {\r\n tabView.updateWorkbookReportList({ workbookReportList: workbookReportList });\r\n }\r\n\r\n if (workbookDashboardList) {\r\n tabView.updateWorkbookDashboardList({ workbookDashboardList: workbookDashboardList });\r\n }\r\n }\r\n }\r\n\r\n var widgetReportSelectPopup = function (element) {\r\n element = $(element);\r\n let getReportList = function (callback) {\r\n let widget = element.closest(\"div.dashboardWidget\");\r\n if (widget.length === 0) {\r\n let id = ko.contextFor($(\"#DashboardSettingsPanel\")[0]).$data.vm().widgetId();\r\n widget = getWidget(id);\r\n }\r\n let widgetId = widget.data(\"widgetid\");\r\n\r\n irGlobal.updateFromServer({}, urlConfigs.dashboard + \"GetReportList\", { widgetId: widgetId }, callback, null, false, \"POST\");\r\n };\r\n let onReportClick = function (e) {\r\n let dashboardWidget = element.closest(\"div.dashboardWidget\");\r\n if (dashboardWidget.length === 0) {\r\n let id = ko.contextFor($(\"#DashboardSettingsPanel\")[0]).$data.vm().widgetId();\r\n dashboardWidget = getWidget(id);\r\n }\r\n\r\n let templateSelectObj = {\r\n widgetId: dashboardWidget.data(\"widgetid\"),\r\n reportId: e.data.id,\r\n autoGrouping: e.data.autoGrouping,\r\n reportSource: e.data.source,\r\n reportType: e.data.reportType\r\n };\r\n\r\n irGlobal.updateFromServer(e,\r\n urlConfigs.dashboard + \"SetWidgetTemplateId\",\r\n templateSelectObj,\r\n function (data) {\r\n updateWidgetPartial(dashboardWidget, data.widgetPartial, data.workbookReportList, data.workbookDashboardList);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n\r\n $(\"#widgetReportSelectPopup\", element).dxPopup(\"instance\").hide();\r\n };\r\n\r\n getReportList(function (data) {\r\n data = JSON.parse(data);\r\n\r\n let popupSettings = {\r\n width: 400,\r\n height: 300,\r\n showTitle: true,\r\n title: \"Select Report Template\",\r\n visible: true,\r\n hideOnOutsideClick: true,\r\n showCloseButton: true\r\n };\r\n let tabSettings = {\r\n activeStateEnabled: true,\r\n dataSource: [\r\n {\r\n name: \"Reports\",\r\n dataSource: data.templates,\r\n columns: [{ dataField: \"fullDisplayName\" }]\r\n },\r\n {\r\n name: \"Tabs\",\r\n dataSource: data.tabs,\r\n columns: [{ dataField: \"fullDisplayName\" }],\r\n visible: data.tabs.length > 0\r\n },\r\n {\r\n name: \"Widgets\",\r\n dataSource: data.widgets,\r\n columns: [{ dataField: \"fullDisplayName\" }],\r\n visible: data.widgets.length > 0\r\n }],\r\n itemTitleTemplate: function (data, index, element) {\r\n return `${data.name} (${data.dataSource.length})`;\r\n },\r\n itemTemplate: function (data, index, element) {\r\n element.dxDataGrid({\r\n height: 220,\r\n rowAlternationEnabled: true,\r\n showColumnHeaders: false,\r\n dataSource: data.dataSource,\r\n columns: data.columns,\r\n searchPanel: {\r\n visible: true\r\n },\r\n paging: {\r\n enabled: false\r\n },\r\n selection: {\r\n mode: \"single\"\r\n },\r\n dataRowTemplate: function (container, item) {\r\n const { data } = item;\r\n let icon = \"list_alt\";\r\n switch (data.reportType) {\r\n case 1:\r\n icon = \"pivot_table_chart\";\r\n break;\r\n case 2:\r\n icon = \"equalizer\";\r\n break;\r\n default:\r\n }\r\n const row = `${icon}${data.fullDisplayName}`;\r\n container.append(row).css(\"cursor\", \"pointer\");\r\n },\r\n onRowClick: function (e) {\r\n onReportClick(e);\r\n }\r\n });\r\n }\r\n }\r\n\r\n $(\"#widgetReportSelectTab\", element).dxTabPanel(tabSettings);\r\n $(\"#widgetReportSelectPopup\", element).dxPopup(popupSettings);\r\n });\r\n };\r\n\r\n var hideChartOptions = function (element) {\r\n let $context = $(\".dashboardWidget\", element);\r\n let chartVM = $context.data(\"chartvm\");\r\n if (chartVM && chartVM.chartDesignerVM)\r\n chartVM.chartDesignerVM.hideChartOptions();\r\n }\r\n\r\n var addResize = function (element) {\r\n if (!element)\r\n element = getWidgetContainer();\r\n if (!element || element.length === 0 || !editMode())\r\n return;\r\n\r\n element = irGlobal.getJqueryElement(element);\r\n\r\n //var $container = $('div#DashboardDesigner');\r\n\r\n const minSize = 20;\r\n element.resizable({\r\n minHeight: minSize,\r\n minWidth: minSize,\r\n handles: 'all',\r\n autoHide: true,\r\n start: function (event, ui) {\r\n hideChartOptions(element);\r\n\r\n containmentW = designerWidthTotal;// - parseInt($container.css(\"padding-right\"));\r\n //reduce the width because of widget shadow, may need to check if there is shadow\r\n containmentW = containmentW - 6 * _zoom;\r\n\r\n containmentH = designerHeightTotal;// - parseInt($container.css(\"padding-bottom\"));\r\n objW = $(this).outerWidth() * _zoom;\r\n objH = $(this).outerHeight() * _zoom;\r\n },\r\n resize: function (event, ui) {\r\n let changeLeft = ui.position.left - ui.originalPosition.left;\r\n let newLeft = ui.originalPosition.left + changeLeft / _zoom;\r\n\r\n let changeTop = ui.position.top - ui.originalPosition.top;\r\n let newTop = ui.originalPosition.top + changeTop / _zoom;\r\n\r\n // fix position\r\n ui.position.left = Math.max(0, newLeft);\r\n ui.position.top = Math.max(0, newTop);\r\n\r\n let changeWidth = ui.size.width - ui.originalSize.width; // find change in width\r\n let newWidth = ui.originalSize.width + changeWidth / _zoom; // adjust new width by our zoomScale\r\n\r\n if (newWidth != ui.size.width) {\r\n if (containmentW - newWidth - newLeft > 0)\r\n ui.size.width = Math.max(minSize, newWidth);\r\n else\r\n ui.size.width = Math.max(minSize, containmentW - newLeft);\r\n }\r\n\r\n let changeHeight = ui.size.height - ui.originalSize.height; // find change in height\r\n let newHeight = ui.originalSize.height + changeHeight / _zoom; // adjust new height by our zoomScale\r\n\r\n if (newHeight !== ui.size.height) {\r\n if (containmentH - newHeight - newTop > 0)\r\n ui.size.height = Math.max(minSize, newHeight);\r\n else\r\n ui.size.height = Math.max(minSize, containmentH - newTop);\r\n }\r\n },\r\n containment: \"div#DashboardDesignerResizer\",\r\n stop: function (event, ui) {\r\n doNotClickWidget = true;\r\n\r\n let size = ui.size;\r\n let position = ui.position;\r\n\r\n let vm = ko.contextFor(ui.element.find(\".widget-config\")[0]).$data;\r\n vm.notSaveLayout = true;\r\n vm.layout.width(Math.max(minSize, parseInt(size.width)));\r\n vm.layout.height(Math.max(minSize, parseInt(size.height)));\r\n vm.layout.left(Math.max(0, parseInt(position.left)));\r\n vm.layout.top(Math.max(0, parseInt(position.top)));\r\n saveWidgetLayout(vm);\r\n vm.notSaveLayout = false;\r\n\r\n const widgetType = $(this).data(\"widgettype\");\r\n if (widgetType === WidgetTypeEnum.Pivot || widgetType === WidgetTypeEnum.Report) {\r\n report.resize($(this));\r\n }\r\n }\r\n });\r\n };\r\n var removeResize = function (element) {\r\n if (element.data(\"uiResizable\")) {\r\n element.resizable('destroy');\r\n }\r\n }\r\n\r\n var removeWidget = function (evt) {\r\n let widget = $(\"div.dashboardWidget.selected\", getDashboardDesigner());\r\n if (widget.length === 0)\r\n return;\r\n\r\n let widgetName = $(\"span.widgetName\", widget).text();\r\n let widgetId = widget.data(\"widgetid\");\r\n\r\n bootbox.confirm(`Are you sure you want to remove the Widget \"${widgetName}\" ?`,\r\n function (result) {\r\n if (!result)\r\n return;\r\n\r\n let completeFunction = function (data) {\r\n if (data.value === \"OK\") {\r\n clickWidget({ target: $(\">:first-child\", widget) });\r\n let widgetContainer = widget.closest(\".widgetContainer\");\r\n let widgetType = widgetContainer.data(\"widgettype\");\r\n let settings = getWidgetSettings(widgetContainer);\r\n\r\n widgetContainer.remove();\r\n updateWidgetContents(widgetContainer, data);\r\n\r\n if (widgetType === WidgetTypeEnum.Filter) {\r\n widgetFilter.updateWidgets(settings);\r\n widgetFilter.removedWidget(settings);\r\n }\r\n }\r\n };\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.dashboard + \"RemoveWidget\",\r\n { widgetId: widgetId },\r\n completeFunction,\r\n null,\r\n true,\r\n \"POST\");\r\n\r\n }\r\n );\r\n };\r\n\r\n var _zoom = 1;\r\n var containmentW,\r\n containmentH,\r\n objW,\r\n objH;\r\n\r\n var addDraggable = function (element) {\r\n if (!element)\r\n element = getWidgetContainer();\r\n\r\n if (!element || element.length === 0 || !editMode())\r\n return;\r\n\r\n let container = document.getElementById('DashboardDesignerResizer');\r\n element.draggable({\r\n handle: \"div.dashboardWidget .draggable-element\",\r\n cursor: \"move\",\r\n start: function (event, ui) {\r\n let dashboardWidget = $(\".dashboardWidget\", element);\r\n let widgetSelected = dashboardWidget.hasClass(\"selected\");\r\n if (!widgetSelected) {\r\n clickWidget(dashboardWidget);\r\n }\r\n\r\n settingsVM.hidePopupDetails(element);\r\n hideChartOptions(element);\r\n\r\n ui.position.left = 0;\r\n ui.position.top = 0;\r\n\r\n containmentW = container.scrollWidth * _zoom; // - parseInt($('div#DashboardDesigner').css(\"padding-right\"));\r\n //reduce the width because of widget shadow\r\n containmentW = containmentW - 6 * _zoom;\r\n containmentH = container.scrollHeight * _zoom;\r\n objW = $(this).outerWidth() * _zoom;\r\n objH = $(this).outerHeight() * _zoom;\r\n },\r\n drag: function (event, ui) {\r\n let boundReached = false;\r\n\r\n let changeLeft = ui.position.left - ui.originalPosition.left;\r\n let newLeft = ui.originalPosition.left + changeLeft / _zoom;\r\n\r\n let changeTop = ui.position.top - ui.originalPosition.top;\r\n let newTop = ui.originalPosition.top + changeTop / _zoom;\r\n\r\n // right bound check\r\n if (ui.position.left > containmentW - objW) {\r\n newLeft = (containmentW - objW) / _zoom;\r\n boundReached = true;\r\n }\r\n\r\n // left bound check\r\n if (newLeft < 0) {\r\n newLeft = 0;\r\n boundReached = true;\r\n }\r\n\r\n // bottom bound check\r\n if (ui.position.top > containmentH - objH) {\r\n newTop = (containmentH - objH) / _zoom;\r\n boundReached = true;\r\n }\r\n\r\n // top bound check\r\n if (newTop < 0) {\r\n newTop = 0;\r\n boundReached = true;\r\n }\r\n\r\n // fix position\r\n ui.position.left = newLeft;\r\n ui.position.top = newTop;\r\n\r\n // inside bounds\r\n if (!boundReached) {\r\n\r\n // do stuff when element is dragged inside bounds\r\n\r\n }\r\n\r\n },\r\n containment: \"div#DashboardDesignerResizer\",\r\n stop: function (event, ui) {\r\n let position = ui.position;\r\n\r\n let vm = ko.contextFor(ui.helper.find(\".widget-config\")[0]).$data;\r\n vm.notSaveLayout = true;\r\n vm.layout.left(parseInt(position.left));\r\n vm.layout.top(parseInt(position.top));\r\n vm.notSaveLayout = false;\r\n saveWidgetLayout(vm);\r\n\r\n doNotClickWidget = true;\r\n }\r\n });\r\n\r\n $(\"div.dashboardWidget\").off(\"mousedown\").on(\"mousedown\",\r\n function (event) {\r\n $(\"div.widgetContainer\").css(\"z-index\", \"1\");\r\n $(this).closest(\"div.widgetContainer\").css(\"z-index\", \"100\");\r\n });\r\n };\r\n var removeDraggable = function (element) {\r\n if (element.data(\"uiDraggable\")) {\r\n element.draggable(\"destroy\");\r\n }\r\n }\r\n\r\n var openHtmlEditor = function (clickEvt, dashboardWidget, settings) {\r\n if (!dashboardWidget)\r\n dashboardWidget = $(clickEvt.currentTarget).closest(\"div.dashboardWidget\");\r\n\r\n let contentArea = dashboardWidget.find(\"div.htmlTextContent div.rawText\");\r\n let htmlcontent = contentArea.html();\r\n let widgetId = dashboardWidget.data(\"widgetid\");\r\n let $mceModal = $(\"div#mceModal\");\r\n let richEditConfig = ko.contextFor($(\".widget-config\", dashboardWidget)[0]).$data.config;\r\n\r\n irGlobal.updateFromServer(clickEvt,\r\n urlConfigs.dashboard + \"GetRichTextEditDetail\",\r\n {\r\n widgetId: widgetId\r\n },\r\n function (result) {\r\n\r\n let completeFunction = function (data) {\r\n richEditConfig.htmlText(data.richTextResult.originalHtml);\r\n updateWidgetContents(dashboardWidget, data);\r\n };\r\n let save = false;\r\n $mceModal.find(\".modal-footer button.btn-primary\").off(\"click\").on(\"click\", function (e) {\r\n save = true;\r\n ($mceModal as any).modal(\"hide\");\r\n });\r\n $mceModal.off(\"hidden.bs.modal\").on(\"hidden.bs.modal\",\r\n function (modalEvt) {\r\n if (save) {\r\n let content = tinymce.activeEditor.getContent();\r\n contentArea.html(content);\r\n irGlobal.updateFromServer(clickEvt,\r\n urlConfigs.dashboard + \"UpdateWidgetHtml\",\r\n {\r\n widgetId: widgetId,\r\n htmlContent: content\r\n },\r\n completeFunction,\r\n null,\r\n true,\r\n \"POST\");\r\n }\r\n tinymce.activeEditor.setContent(\"\");\r\n tinymce.activeEditor.destroy();\r\n //If the \"More...\" button was clicked, force a click to close it because it stay opened \r\n let moreToolbarButton = $(\"div.tox-toolbar__group button.tox-tbtn[title='More...']\");\r\n if (moreToolbarButton.length > 0 && moreToolbarButton.hasClass(\"tox-tbtn--enabled\")) {\r\n moreToolbarButton.trigger(\"click\");\r\n }\r\n });\r\n tinymce.baseURL = urlConfigs.tinyMceBase;\r\n\r\n tinymce.init({\r\n selector: \"div#mceModal textarea\",\r\n width: \"100%\",\r\n height: 270,\r\n content_style: `.mce-content-body {background-color: ${settings.config.appearance.backgroundColor()};}`,\r\n setup: function (editor) {\r\n editor.ui.registry.addMenuButton('Metrics', {\r\n text: 'Metrics',\r\n fetch: function (callback) {\r\n let items = [];\r\n $.each(result.metrics,\r\n function (index, metricName) {\r\n items.push({\r\n type: 'menuitem',\r\n text: metricName,\r\n onAction: function () {\r\n let name = metricName.replace(/ /g, ' ');\r\n editor.insertContent(`[${name}]`);\r\n }\r\n });\r\n }\r\n );\r\n callback(items);\r\n }\r\n });\r\n editor.ui.registry.addMenuButton('Filters', {\r\n text: 'Filters',\r\n fetch: function (callback) {\r\n let items = [];\r\n let getItem = function (filter, displayName, fieldName) {\r\n return {\r\n type: 'menuitem',\r\n text: displayName,\r\n onAction: function () {\r\n let name = fieldName.replace(/ /g, ' ');\r\n if (filter.isMetric) {\r\n editor.insertContent(`[Metric Filter ${name}]`);\r\n }\r\n else if (filter.isWidgetFilter) {\r\n editor.insertContent(`[Widget Filter ${name}]`);\r\n }\r\n else {\r\n editor.insertContent(`[Filter ${name}]`);\r\n }\r\n }\r\n }\r\n }\r\n let filterVariables = getFilterVariables();\r\n result.filters.forEach(function (filter) {\r\n if (filter.isDateFilter) {\r\n items.push({\r\n type: 'nestedmenuitem',\r\n text: filter.name,\r\n getSubmenuItems: function () {\r\n let subMenuItems = [];\r\n let isDateRange = filter.filterEditorType === FilterEditorTypeEnum.DateRange;\r\n filterVariables.forEach(function (variable) {\r\n if (variable.range === isDateRange || variable.range === undefined) {\r\n subMenuItems.push(getItem(filter, variable.text, `${filter.name}|${variable.id}`));\r\n }\r\n });\r\n return subMenuItems;\r\n }\r\n });\r\n }\r\n else {\r\n items.push(getItem(filter, filter.name, filter.name));\r\n }\r\n });\r\n\r\n callback(items);\r\n }\r\n });\r\n editor.on('init', function (e) {\r\n editor.setContent(htmlcontent);\r\n });\r\n },\r\n content_css: urlConfigs.tinyMceTheme,\r\n skin_url: urlConfigs.tinyMceSkin,\r\n plugins: [\r\n \"advlist autolink lists link image charmap anchor\",\r\n \"insertdatetime media table code emoticons insertdatetime hr code quickbars\"\r\n ],\r\n statusbar: false,\r\n menubar: false,\r\n toolbar:\r\n `Metrics Filters | undo redo copy cut paste|\r\n quickimage quicktable |\r\n fontselect fontsizeselect forecolor backcolor styleselect |\r\n bold italic underline |\r\n alignleft aligncenter alignright alignjustify | \r\n indent outdent |\r\n charmap | checklist | hr |\r\n image editimage fliph flipv imageoptions rotateleft rotateright |\r\n link openlink unlink |\r\n bullist numlist | \r\n media | \r\n table`,\r\n rel_list: [{ title: \"Lightbox\", value: \"lightbox\" }],\r\n insertdatetime_formats: [\"%H:%M:%S\", tinyMceDateFmt1, \"%I:%M:%S %p\", tinyMceDateFmt2],\r\n });\r\n tinymce.activeEditor.setContent(htmlcontent);\r\n // Prevent Bootstrap dialog from blocking focusin\r\n $(document).off('focusin').on('focusin', function (e) {\r\n if ($(e.target).closest(\".tox-tinymce, .tox-tinymce-aux, .moxman-window, .tam-assetmanager-root\").length) {\r\n e.stopImmediatePropagation();\r\n }\r\n });\r\n ($mceModal as any).modal({ backdrop: 'static' });\r\n\r\n\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n undefined,\r\n undefined,\r\n undefined,\r\n false);\r\n };\r\n\r\n var changeReportType = function ($button, $widget) {\r\n let widgetId = $widget.data(\"widgetid\");\r\n let widgetType = $(\"div.reportResult\", $widget).data(\"widgettype\");\r\n let reportType = $(\"div.reportResult\", $widget).data(\"reporttype\");\r\n let isChangingToChart = widgetType != WidgetTypeEnum.Chart && (reportType === ReportTypeStrEnum.Analysis || reportType === ReportTypeStrEnum.Pivot);\r\n let newWidgetType = isChangingToChart ? 'Chart' : 'Analysis';\r\n\r\n changeButton($button, newWidgetType, reportType, $widget);\r\n\r\n irGlobal.updateFromServer($button,\r\n urlConfigs.dashboard + \"ChangeReportType\",\r\n {\r\n widgetId: widgetId,\r\n newWidgetType: newWidgetType,\r\n },\r\n function (data) {\r\n updateWidgetPartial($widget, data.widgetPartial, data.workbookReportList, data.workbookDashboardList);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n false);\r\n };\r\n\r\n var openTabDetail = function (e) {\r\n let dashboardWidget = $(e).hasClass(\".dashboardWidget\") ? $(e) : $(e).closest(\"div.dashboardWidget\");\r\n let vm = ko.contextFor($(\".widget-config\", dashboardWidget)[0]).$data;\r\n\r\n let tab = tabView.getActiveTab();\r\n let tabId = parseInt(tab.attr(\"id\"), 10);\r\n let fieldId = null;\r\n let fieldAutoGrouping = null;\r\n let filterValue = \"\";\r\n\r\n //For KPI\r\n if (vm.config.trendAxisFieldId) {\r\n fieldId = vm.config.trendAxisFieldId();\r\n fieldAutoGrouping = vm.config.trendAxisFieldAutoGrouping();\r\n if (vm.config.useLastPeriod() && fieldId)\r\n filterValue = vm.result.trendValues[vm.result.trendValues.length - 1].axisValue;\r\n else\r\n fieldId = null; //Set for null so the filters won't get last period when copying filters\r\n }\r\n\r\n let widgetId = vm.widgetId ? vm.widgetId() : dashboardWidget.data(\"widgetid\");\r\n\r\n let submitObject = {\r\n fromTabDetail: tabId,\r\n fromTabDetailWidget: widgetId,\r\n filterValue: filterValue,\r\n filterFieldId: fieldId || 0,\r\n filterFieldAutoGrouping: fieldAutoGrouping || 0,\r\n };\r\n\r\n tabView.openTab(vm.config.tabDetailId(), submitObject, true);\r\n };\r\n\r\n var copyWidget = function (e) {\r\n let dashboardWidget = $(e).closest(\"div.dashboardWidget\")\r\n let vm = ko.contextFor($(\".widget-config\", dashboardWidget)[0]).$data;\r\n let tab = tabView.getActiveTab();\r\n\r\n let widgetId = vm.widgetId ? vm.widgetId() : dashboardWidget.data(\"widgetid\");\r\n let tabId = tab.attr(\"id\");\r\n\r\n let completeFunction = function (data) {\r\n let partial = data.widgetPartial;\r\n let dashboardDesigner = getDashboardDesigner();\r\n let widgetObj = $(partial);\r\n\r\n let top = parseInt(widgetObj.css(\"top\").replace(\"px\", \"\"), 10);\r\n let left = parseInt(widgetObj.css(\"left\").replace(\"left\", \"\"), 10);\r\n if (top > 15) {\r\n top -= 10;\r\n }\r\n else {\r\n top += 10;\r\n }\r\n\r\n if (left > 15) {\r\n left -= 10;\r\n }\r\n else {\r\n left += 10;\r\n }\r\n\r\n widgetObj.css(\"top\", `${top}px`);\r\n widgetObj.css(\"left\", `${left}px`);\r\n\r\n dashboardDesigner.prepend(widgetObj);\r\n\r\n addWidgetActions(dashboardDesigner, widgetObj);\r\n setupWidget(widgetObj);\r\n\r\n refreshWidgetData(\" \", getWidget(data.widgetId), true, function () {\r\n tabView.updateWorkbookDashboardList(data);\r\n tabView.updateWorkbookReportList(data);\r\n });\r\n }\r\n\r\n irGlobal.updateFromServer(e,\r\n urlConfigs.dashboard + \"CopyWidget\",\r\n {\r\n tabId: tabId,\r\n widgetId: widgetId\r\n },\r\n completeFunction,\r\n null,\r\n true,\r\n \"POST\");\r\n }\r\n var showHideSearchBox = function (e) {\r\n let dashboardWidget = $(e).hasClass(\".dashboardWidget\") ? $(e) : $(e).closest(\"div.dashboardWidget\");\r\n let settings = reportSettings.getSettings(dashboardWidget);\r\n if (settings) {\r\n settings.enableSearchBox(!settings.enableSearchBox());\r\n }\r\n };\r\n\r\n var saveWidgetConfig = function (vm, updateData: boolean = false, callback: Function = null, showDefaultIndicator: boolean = false) {\r\n\r\n if (vm.shouldUpdateData && !updateData || vm.notSaveConfig)\r\n return;\r\n\r\n let config = ko.toJS(vm.config);\r\n let appearance = config.appearance;\r\n let widgetId = vm.widgetId();\r\n let dashboardWidget = getWidget(widgetId);\r\n\r\n let submitObject = {\r\n config: irGlobal.jsonStringfy(config),\r\n appearance: config.appearance,\r\n widgetId: widgetId,\r\n tabDetailId: config.tabDetailId,\r\n copyDimensionsToTab: config.copyDimensionsToTab,\r\n copyMetricsToTab: config.copyMetricsToTab\r\n }\r\n\r\n if (!showDefaultIndicator) {\r\n addLoaderWidget(dashboardWidget);\r\n }\r\n\r\n let completeFunction = function (data) {\r\n let dashboardAppearance = getDashboardSettings()?.dashboardAppearance;\r\n\r\n if (appearance.border.visible)\r\n dashboardWidget.removeClass(\"noBorderWidget\");\r\n else\r\n dashboardWidget.addClass(\"noBorderWidget\");\r\n\r\n if (appearance.border.shadow)\r\n dashboardWidget.removeClass(\"noShadowWidget\");\r\n else\r\n dashboardWidget.addClass(\"noShadowWidget\");\r\n\r\n if (appearance.header.visible)\r\n dashboardWidget.removeClass(\"noHeaderWidget\");\r\n else\r\n dashboardWidget.addClass(\"noHeaderWidget\");\r\n\r\n if (appearance.backgroundColor)\r\n dashboardWidget.css(\"background-color\", appearance.backgroundColor);\r\n else if (dashboardAppearance) {\r\n if (dashboardAppearance.widgetDefaultBackgroundColor) {\r\n dashboardWidget.css(\"background-color\", dashboardAppearance.widgetDefaultBackgroundColor);\r\n }\r\n else {\r\n dashboardWidget.css(\"background-color\", \"unset\");\r\n }\r\n }\r\n\r\n let mainWidgetNav = $(\".mainWidgetNav\", dashboardWidget);\r\n mainWidgetNav.css(\"background-color\", appearance.header.backColor).css(\"color\", appearance.header.fontColor);\r\n mainWidgetNav.css(\"font-size\", `${appearance.header.fontSize}px`).css(\"font-weight\", `${(appearance.header.fontBold ? \"bold\" : \"normal\")}`);\r\n mainWidgetNav.css(\"font-style\", `${(appearance.header.fontItalic ? \"italic\" : \"normal\")}`);\r\n mainWidgetNav.css(\"border-bottom\", `${(appearance.header.border ? \"1px solid\" : \"none\")}`);\r\n mainWidgetNav.css(\"border-bottom-color\", appearance.header.borderColor);\r\n\r\n let titleWidget = $(\".widget-title\", dashboardWidget);\r\n titleWidget.css(\"text-align\", appearance.header.fontAlignment);\r\n\r\n if (!showDefaultIndicator) {\r\n removeLoaderWidget(dashboardWidget);\r\n }\r\n\r\n if (vm.shouldUpdateData) {\r\n vm.shouldUpdateData = false;\r\n refreshWidgetData({}, dashboardWidget, undefined, callback);\r\n }\r\n else {\r\n if (callback && typeof callback === \"function\") {\r\n callback();\r\n }\r\n }\r\n };\r\n let errorFunction = function () {\r\n if (!showDefaultIndicator) {\r\n removeLoaderWidget(dashboardWidget);\r\n }\r\n };\r\n\r\n irGlobal.updateFromServer(\" \",\r\n urlConfigs.dashboard + \"SaveConfig\",\r\n submitObject,\r\n completeFunction,\r\n errorFunction,\r\n true,\r\n \"POST\",\r\n showDefaultIndicator,\r\n undefined,\r\n true\r\n );\r\n\r\n };\r\n\r\n var saveWidgetLayout = function (vm) {\r\n\r\n let layout = ko.toJS(vm.layout);\r\n let widgetId = vm.widgetId();\r\n let dashboardWidget = getWidget(widgetId);\r\n let widgetContainer = dashboardWidget.closest(\"div.widgetContainer\");\r\n\r\n let submitObject = {\r\n config: \"\",\r\n layout: ko.toJSON(layout),\r\n widgetId: widgetId,\r\n }\r\n\r\n addLoaderWidget(dashboardWidget);\r\n\r\n let completeFunction = function (data) {\r\n widgetContainer.css(\"width\", layout.width);\r\n widgetContainer.css(\"height\", layout.height);\r\n widgetContainer.css(\"left\", layout.left);\r\n widgetContainer.css(\"top\", layout.top);\r\n\r\n if (vm.widgetType() === WidgetTypeEnum.Report) {\r\n report.resize(dashboardWidget);\r\n }\r\n\r\n if (vm.widgetType() === WidgetTypeEnum.Filter) {\r\n widgetFilter.calculateHeight(dashboardWidget);\r\n }\r\n\r\n removeLoaderWidget(dashboardWidget);\r\n };\r\n let errorFunction = function () {\r\n removeLoaderWidget(dashboardWidget);\r\n };\r\n\r\n irGlobal.updateFromServer(\" \",\r\n urlConfigs.dashboard + \"SaveConfig\",\r\n submitObject,\r\n completeFunction,\r\n errorFunction,\r\n true,\r\n \"POST\",\r\n false\r\n );\r\n };\r\n\r\n var getWidgetSettings = function (widgetContainer) {\r\n let dashboardWidget = $(\".dashboardWidget\", widgetContainer);\r\n let context = ko.contextFor($(\".widget-config\", dashboardWidget)[0]);\r\n let vm = context?.$data;\r\n return vm;\r\n };\r\n\r\n var getDashboardSettings = function () {\r\n let vm = ko.toJS(ko.dataFor($(\".dashboard-config-json\", getDashboardContainer())[0]));\r\n return vm;\r\n }\r\n\r\n var setupDefaultFilterBehaviours = function (context) {\r\n filtersManager.setup(context,\r\n \"li.filterList\",\r\n \"li.filterContextContainer\",\r\n undefined, undefined\r\n );\r\n };\r\n\r\n var addFilterPopover = function (widget) {\r\n $.each(widget, function (index, element) {\r\n filtersManager.setup(element, \"li.filterList\", \"li.filterContextContainer\", undefined, undefined);\r\n });\r\n };\r\n\r\n var getAvailableFilters = function () {\r\n let filtersLi = $(\".tabFilterNav .filterContextContainer .dropdown-menu> li.filter-item-add\", tabContext());\r\n let filters = [];\r\n filtersLi.each(function (index, element) {\r\n let id = $(\"a\", element).data(\"filterid\");\r\n filters.push({\r\n id: id,\r\n filterName: element.dataset.filtername,\r\n filterFieldName: element.dataset.filterfieldname,\r\n filterFieldTableName: element.dataset.filterfieldtablename,\r\n displayFieldName: element.dataset.filterdisplayfieldname,\r\n displayFieldTableName: element.dataset.filterdisplayfieldtablename,\r\n dynamicParameter: element.dataset.filterdynamicparameter === \"True\" ? true : false,\r\n dynamicParameterName: element.dataset.filterdynamicparametername,\r\n editorType: element.dataset.editortype,\r\n dateRangeId: element.dataset.daterangeid || 0,\r\n icon: element.dataset.filtericon,\r\n visible: !$(element).hasClass(\"disabled\"),\r\n element: element,\r\n updateVisible: function (enabled) {\r\n filtersManager.updateVisibleFilterAvaliable(enabled, undefined, undefined, $(this.element));\r\n }\r\n });\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n var getDashboardFilters = function () {\r\n let filtersLi = $(\".tabFilterNav li[data-filtercontext='Dashboard'] ul> li.filter\", tabContext());\r\n let filters = [];\r\n\r\n filtersLi.each(function (index, element) {\r\n let filterFieldName = \"\";\r\n let filterFieldTableName = \"\";\r\n if (element.dataset.boundfield) {\r\n let names = element.dataset.boundfield.split(\"__\");\r\n if (names.length >= 2) {\r\n filterFieldName = names[1];\r\n filterFieldTableName = names[0];\r\n }\r\n }\r\n\r\n let displayFieldName = \"\";\r\n let displayFieldTableName = \"\";\r\n if (element.dataset.displayfield) {\r\n let names = element.dataset.displayfield.split(\"__\");\r\n if (names.length >= 2) {\r\n displayFieldName = names[1];\r\n displayFieldTableName = names[0];\r\n }\r\n }\r\n\r\n filters.push({\r\n id: element.dataset.id,\r\n filterName: element.dataset.filtername,\r\n boundField: element.dataset.boundfield,\r\n boundFieldDataType: element.dataset.boundfielddatatype,\r\n filterFieldName: filterFieldName,\r\n filterFieldTableName: filterFieldTableName,\r\n displayFieldName: displayFieldName,\r\n displayFieldTableName: displayFieldTableName,\r\n dateFormat: element.dataset.dateformat,\r\n isMetric: element.dataset.ismetric,\r\n metricId: element.dataset.metricid,\r\n dynamicParameter: element.dataset.dynamicparameter === \"True\" ? true : false,\r\n dynamicParameterName: element.dataset.dynamicparametername,\r\n startCondition: element.dataset.startcondition,\r\n endCondition: element.dataset.endcondition,\r\n dateRange: element.dataset.daterange,\r\n dateRangeId: element.dataset.daterangeid,\r\n isMultiSelect: element.dataset.ismultiselect === \"True\" ? true : false,\r\n element: element,\r\n removeElement: function () {\r\n $(this.element).remove();\r\n }\r\n });\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n var setup = function () {\r\n //editMode(false);\r\n var $context = getDashboardContainer();\r\n tabView.applyWorkbookBinding($(\"#DashboardContainerActions\", $context)[0]);\r\n\r\n irGlobal.showEmailPopup(\"a.emailButton\");\r\n $(document).on(\"focusin\",\r\n function (e) {\r\n if ($(e.target).closest(\".mce-window\").length) {\r\n e.stopImmediatePropagation();\r\n }\r\n });\r\n\r\n $(\"#DashboardSettingsPanel .addWidgetButton\", $context).off(\"click\").on(\"click\", addWidget);\r\n\r\n widgetDesigner.setup(function () {\r\n addWidgetActions($context, undefined);\r\n\r\n settingsVMApplied = true;\r\n settingsVM.vm = ko.observable(null);\r\n settingsVM.dashboardVM = ko.observable(null);\r\n settingsVM.widgetSelected = false;\r\n dashboardDesigner.setup(settingsVM);\r\n ko.applyBindings(settingsVM, $(\"#DashboardSettingsPanel\")[0]);\r\n\r\n doNotClickWidget = false;\r\n designerWidthTotal = 0;\r\n applyEditMode();\r\n if (!editMode()) {\r\n if (getDashboardDesigner().find(\".dashboardWidget\").length === 0)\r\n setEditMode();\r\n }\r\n\r\n //irGlobal.showEmailPopup(\"a.emailButton\", $context);\r\n irGlobal.showEmailPopup(\"a.emailButton\");\r\n\r\n $(\"button#PlainHtmlButton\", $context).off(\"click\");\r\n\r\n irGlobal.setup();\r\n\r\n filtersManager.setup($context,\r\n \"ul.tabFilterNav li.filterList\",\r\n \"ul.tabFilterNav li.filterContextContainer\",\r\n null,\r\n null\r\n );\r\n filtersManager.checkFiltersErrors($context);\r\n\r\n loadWidgets();\r\n });\r\n };\r\n\r\n // Used for printing dashboard to HTML / PDF\r\n var htmlOutputSetup = function () {\r\n irGlobal.setup();\r\n let $context = getDashboardContainer();\r\n widgetDesigner.setup(function () {\r\n addWidgetActions($context, undefined, true);\r\n loadWidgets();\r\n });\r\n };\r\n\r\n var htmlWidgetOutputSetup = function () {\r\n let $context = getDashboardContainer();\r\n formattingRule.setup(function () {\r\n mappingDataSource.prepareDataSourcePopover(function () {\r\n let widgets = getWidgets();\r\n widgets.forEach(function (widget) {\r\n addWidgetActions($context, widget.element, true);\r\n let widgetContainer = widget.element.closest(\".widgetContainer\");\r\n let data = ko.contextFor($(\".widget-config\", widget.element)[0]).$data;\r\n switch (widget.type) {\r\n case WidgetTypeEnum.KPI:\r\n widgetKPI.setup(widget.element, data);\r\n break;\r\n case WidgetTypeEnum.Filter:\r\n widgetFilter.setup(widget.element, data);\r\n break;\r\n case WidgetTypeEnum.TreeMap:\r\n widgetTreeMap.setup(widget.element, data);\r\n break;\r\n case WidgetTypeEnum.Map:\r\n widgetMap.setup(widget.element, data);\r\n break;\r\n case WidgetTypeEnum.Gauge:\r\n widgetGauge.setup(widget.element, data);\r\n break;\r\n case WidgetTypeEnum.Report:\r\n case WidgetTypeEnum.Pivot:\r\n reportView.htmlOutputSetup(widget.element, false);\r\n break;\r\n case WidgetTypeEnum.Chart: \r\n chart.addChartPlot($(\".chartMainContainer\", widget.element), null, null, true)\r\n break;\r\n default:\r\n //addResize(widgetContainer);\r\n //addDraggable(widgetContainer);\r\n //widgetContainer.resizable(\"disable\");\r\n //widgetContainer.draggable('disable');\r\n break;\r\n }\r\n });\r\n });\r\n });\r\n };\r\n\r\n return {\r\n setup: setup,\r\n htmlOutputSetup: htmlOutputSetup,\r\n htmlWidgetOutputSetup: htmlWidgetOutputSetup,\r\n saveWidgetConfig: saveWidgetConfig,\r\n openTabDetail: openTabDetail,\r\n copyWidget: copyWidget,\r\n showHideSearchBox: showHideSearchBox,\r\n getAvailableFilters: getAvailableFilters,\r\n getDashboardFilters: getDashboardFilters,\r\n getWidget: getWidget,\r\n getWidgets: getWidgets,\r\n refreshWidgetData: refreshWidgetData,\r\n updateWidgetContents: updateWidgetContents,\r\n setupDefaultFilterBehaviours: setupDefaultFilterBehaviours,\r\n expandWidget: expandWidget,\r\n refreshWidgets: refreshWidgets,\r\n removeWidget: removeWidget,\r\n widgetReportSelectPopup: widgetReportSelectPopup,\r\n recalculateDashboardZoom: recalculateDashboardZoom,\r\n resizeExpandedWidgets: resizeExpandedWidgets,\r\n setEditMode: setEditMode,\r\n disableEditMode: function () {\r\n if (editMode()) {\r\n setEditMode();\r\n }\r\n },\r\n afterUpdatedWidgetData: afterUpdatedWidgetData,\r\n getWidgetSettings: getWidgetSettings,\r\n _zoom: function (value) {\r\n if (value)\r\n _zoom = value;\r\n return _zoom;\r\n },\r\n };\r\n}());\r\n","declare var urlConfigs: any;\r\n\r\nvar dashboardDesigner = (function () {\r\n\r\n var vm;\r\n\r\n var createVM = function (databindElment) {\r\n let jsonData = $(\".dashboard-config-json\", databindElment).data(\"jsonconfig\");\r\n let popupElement = $(\".dashboard-config-popup\", databindElment);\r\n \r\n vm = {\r\n dashboardAppearance: ko.mapping.fromJS(jsonData),\r\n popupOptions: {\r\n width: 300,\r\n height: 150,\r\n //container: \".dx-viewport\",\r\n container: \"#DashboardContainer\",\r\n showTitle: true,\r\n title: \"Dashboard Settings\",\r\n visible: false,\r\n dragEnabled: true,\r\n hideOnOutsideClick: false,\r\n shading: true,\r\n shadingColor: \"rgba(255,255,255,0.3)\",\r\n showCloseButton: false,\r\n //position: \"right top\",\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n //of: popupElement,\r\n },\r\n toolbarItems: [{\r\n widget: \"dxButton\",\r\n toolbar: \"bottom\",\r\n location: \"after\",\r\n options: {\r\n text: \"Close\",\r\n onClick: function (e) {\r\n vm.popupVisible = false;\r\n (popupElement as any).dxPopup(\"instance\").hide();\r\n }\r\n }\r\n }],\r\n //closeOnOutsideClick: function (e) {\r\n // return e.target === $(\"#someElement\").get()[0];\r\n //},\r\n },\r\n openPopup: function (e, x, y) {\r\n vm.popupVisible = true;\r\n (popupElement as any).dxPopup(\"instance\").show();\r\n },\r\n tracker: Function,\r\n popupVisible: false,\r\n };\r\n\r\n let oldJsonConfig = \"\";\r\n vm.tracker = ko.computed(function () {\r\n let jsonConfig = ko.toJSON(vm.dashboardAppearance);\r\n if (oldJsonConfig !== jsonConfig && vm.popupVisible) {\r\n var submitObject = {\r\n appearance: ko.toJS(vm.dashboardAppearance),\r\n }\r\n var completeFunction = function (data) {\r\n };\r\n irGlobal.updateFromServer(\" \",\r\n urlConfigs.dashboard + \"SaveDashboardAppearance\",\r\n submitObject,\r\n completeFunction,\r\n null,\r\n true,\r\n \"POST\");\r\n $(\"#DashboardDesignerResizer\").css(\"background-color\", vm.dashboardAppearance.backgroundColor());\r\n let widgets = $(\"#DashboardDesigner .dashboardWidget\");\r\n for (var i = 0; i < widgets.length; i++) {\r\n let widget = widgets[i];\r\n let widgetConfigElement = $(\".widget-config\", widget);\r\n let widgetConfig = ko.contextFor(widgetConfigElement[0]).$data.config;\r\n if (!widgetConfig.appearance.backgroundColor())\r\n $(widget).css(\"background-color\", vm.dashboardAppearance.widgetDefaultBackgroundColor());\r\n }\r\n }\r\n oldJsonConfig = jsonConfig;\r\n }, vm.config);\r\n };\r\n\r\n var setup = function (designerVM) {\r\n let databindElment = $(\"#DashboardSettingsPanel .dashboard-config-databind\")[0];\r\n createVM(databindElment);\r\n designerVM.dashboardVM(vm);\r\n };\r\n\r\n return {\r\n setup: setup,\r\n };\r\n\r\n}());","/// \r\n\r\ndeclare var urlConfigs: any;\r\n\r\nclass FieldNameInputModel {\r\n id: string;\r\n metric: boolean;\r\n mapField: boolean;\r\n all: boolean;\r\n metricName: string;\r\n autoGrouping: string; //AutoGrouping;\r\n color: string;\r\n tableName: string;\r\n fieldName: string;\r\n nodeName: string;\r\n order: number;\r\n groupingType: string; //GroupingType;\r\n isReportMetric: boolean;\r\n displayName: string;\r\n format: string; //FieldFormat | null;\r\n decimalPlaces: number | null;\r\n foreColor: string;\r\n backgroundColor: string;\r\n thresholdValue: number | null;\r\n thresholdColor: string;\r\n formattingRuleId: string;\r\n formattingRuleName: string;\r\n type: string; //Datatype;\r\n comparisonType: string; //ComparisonMetricType;\r\n comparisonFilterId: string;\r\n comparisonMetricId: string;\r\n metricId: string;\r\n queryName: string;\r\n visualizationMode: string; //VisualizationModeEnum;\r\n barChartText: string; //BarChartTextEnum;\r\n barChartTextPosition: string; //BarChartTextPositionEnum;\r\n colorBar: string;\r\n columnWidth: number;\r\n fields: Array;\r\n\r\n constructor(data: any = null) {\r\n if (data)\r\n this.copyProperties(data, this);\r\n }\r\n\r\n duplicate(name: string) {\r\n let copy = this.clone();\r\n copy.nodeName = name;\r\n copy.displayName = name;\r\n return copy;\r\n }\r\n\r\n clone(): FieldNameInputModel {\r\n let fromObject = this;\r\n let toObject: FieldNameInputModel = new FieldNameInputModel();\r\n this.copyProperties(fromObject, toObject);\r\n return toObject;\r\n }\r\n\r\n copyProperties(fromObject, toObject) {\r\n for (let property in fromObject) {\r\n if (fromObject[property] !== undefined) {\r\n let fromValue = fromObject[property];\r\n if (Array.isArray(fromValue)) {\r\n toObject[property] = [];\r\n for (var i = 0; i < fromValue.length; i++) {\r\n let itemArray = fromValue[i];\r\n let newItemArray = {};\r\n this.copyProperties(itemArray, newItemArray);\r\n toObject[property].push(newItemArray);\r\n }\r\n }\r\n else if (typeof fromValue === \"object\") {\r\n this.copyProperties(fromValue, toObject[property] || {});\r\n }\r\n else {\r\n toObject[property] = fromValue;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nvar mappingDataSource = (function () {\r\n\r\n var onDblClickDataSource = null;\r\n var setDblClickDataSource = function (callback) {\r\n onDblClickDataSource = callback;\r\n }\r\n\r\n var getDataSourcePopover = function (type, target = null, title = null) {\r\n if (target) {\r\n let popover = $(\"#popover-datasource\").dxPopover(\"instance\");\r\n let titlePopover = \"Mapping Fields\";\r\n if (title) {\r\n titlePopover = title;\r\n }\r\n popover.option(\"title\", titlePopover);\r\n popover.show(target);\r\n }\r\n var treeView = $(\"#treeview-datasource\").dxTreeView(\"instance\");\r\n var options = treeView.option();\r\n var items = [];\r\n\r\n switch (type) {\r\n case \"Metrics\":\r\n items = metrics.filter(x => x.visibility === VisibilityEnum.Normal);\r\n break;\r\n case \"NonMetrics\":\r\n items = tables.filter(x => x.visibility === VisibilityEnum.Normal);\r\n break;\r\n //Show only tables with date fields\r\n case \"Date\":\r\n case \"DateNonDerivedDates\":\r\n for (var i = 0; i < tables.filter(x => x.visibility === VisibilityEnum.Normal).length; i++) {\r\n let table = tables[i];\r\n if (table.fields.find(x => x.type === \"DATE\")) {\r\n let newTable = Object.assign({}, table);\r\n newTable.fields = [];\r\n items.push(newTable);\r\n for (var j = 0; j < table.fields.length; j++) {\r\n let field = table.fields[j];\r\n if (field.type === \"DATE\" && field.visibility === VisibilityEnum.Normal) {\r\n let newField = Object.assign({}, field);\r\n if (type === \"DateNonDerivedDates\") {\r\n newField.fields = undefined;\r\n }\r\n\r\n newTable.fields.push(newField);\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case \"NonMetricsNonDerivedDates\":\r\n for (var i = 0; i < tables.filter(x => x.visibility === VisibilityEnum.Normal).length; i++) {\r\n let table = tables[i];\r\n let newTable = Object.assign({}, table);\r\n newTable.fields = [];\r\n\r\n let fields = table.fields.filter(x => x.visibility === VisibilityEnum.Normal);\r\n for (var j = 0; j < fields.length; j++) {\r\n let field = fields[j];\r\n let newField = Object.assign({}, field);\r\n\r\n if (field.type === \"DATE\") {\r\n newField.fields = null;\r\n }\r\n\r\n newTable.fields.push(newField);\r\n }\r\n\r\n if (newTable.fields.length > 0) {\r\n items.push(newTable);\r\n }\r\n }\r\n break;\r\n case \"NonMetricsNonDates\":\r\n for (var i = 0; i < tables.filter(x => x.visibility === VisibilityEnum.Normal).length; i++) {\r\n let table = tables[i];\r\n if (table.fields.find(x => x.type !== \"DATE\")) {\r\n let newTable = Object.assign({}, table);\r\n newTable.fields = [];\r\n items.push(newTable);\r\n for (var j = 0; j < table.fields.length; j++) {\r\n let field = table.fields[j];\r\n if (field.type !== \"DATE\" && field.visibility === VisibilityEnum.Normal) {\r\n newTable.fields.push(field);\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n items = metrics.filter(x => x.visibility === VisibilityEnum.Normal).concat(tables);\r\n break;\r\n }\r\n\r\n return items;\r\n }\r\n\r\n var showDataSourcePopover = function (type, target, items = null, title = null) {\r\n let popover = $(\"#popover-datasource\").dxPopover(\"instance\");\r\n let titlePopover = \"Mapping Fields\";\r\n if (title) {\r\n titlePopover = title;\r\n }\r\n popover.option(\"title\", titlePopover);\r\n\r\n if (target) {\r\n popover.show(target);\r\n }\r\n\r\n var treeView = $(\"#treeview-datasource\").dxTreeView(\"instance\");\r\n var options = treeView.option();\r\n var dataSource = items || getDataSourcePopover(type);\r\n treeView.option(\"items\", dataSource);\r\n\r\n if (type === \"Metrics\")\r\n treeView.expandItem(metrics[0]);\r\n };\r\n\r\n var tables = [];\r\n var metrics = [];\r\n\r\n var prepareDataSourcePopover = function (callback) {\r\n var successFunction = function (data) {\r\n\r\n var tableMetrics = [data.schema.tables.shift()];\r\n\r\n tables = data.schema.tables;\r\n let metricsData = tableMetrics[0].fields;\r\n metrics = [];\r\n let timeout: any = null;\r\n\r\n for (var i = 0; i < metricsData.length; i++) {\r\n let metricData = metricsData[i];\r\n let metric = new FieldNameInputModel(metricData);\r\n metric.fields = [];\r\n //let percentageOfTotal = metric.duplicate(\"% of Total\");\r\n //let accumulated = metric.duplicate(\"Accumulated\");\r\n //metric.fields.push(percentageOfTotal);\r\n //metric.fields.push(accumulated);\r\n metrics.push(metric);\r\n }\r\n\r\n let treeViewOptions: DevExpress.ui.dxTreeView.Properties = {\r\n width: \"100%\",\r\n height: 440,\r\n keyExpr: \"nodeId\",\r\n displayExpr: function (item) {\r\n if (item) {\r\n return item.title || item.displayName || item.nodeName;\r\n }\r\n\r\n return undefined;\r\n },\r\n itemsExpr: \"fields\",\r\n searchEnabled: true,\r\n searchMode: \"contains\",\r\n scrollDirection: \"vertical\",\r\n selectedItem: ko.observable({}),\r\n onItemClick: function (e) {\r\n var options = treeViewOptions;\r\n var item = e.itemData;\r\n\r\n if (!timeout) {\r\n timeout = setTimeout(function () {\r\n timeout = null;\r\n }, 300);\r\n }\r\n //only for fields (table doesn't have queryName)\r\n else if (item === options.selectedItem && item.queryName) {\r\n if (onDblClickDataSource)\r\n onDblClickDataSource(options.selectedItem);\r\n\r\n hide();\r\n }\r\n\r\n options.selectedItem = item;\r\n },\r\n };\r\n\r\n let sortableOptions: DevExpress.ui.dxSortable.Properties = {\r\n group: \"shared\",\r\n filter: \".dx-treeview-item\",\r\n dropFeedbackMode: \"indicate\",\r\n moveItemOnDrop: false,\r\n allowDropInsideItem: false,\r\n allowReordering: false,\r\n };\r\n\r\n let popoverOptions: DevExpress.ui.dxPopover.Properties = {\r\n title: \"Mapping Fields\",\r\n showTitle: true,\r\n target: \"#popoverTarget\",\r\n position: \"left\",\r\n height: 500,\r\n width: 300,\r\n onInitialized: function (e) {\r\n popoverInstance = e.component;\r\n }\r\n };\r\n\r\n var popoverInstance = null;\r\n\r\n $(\"#treeview-datasource\").dxTreeView(treeViewOptions);\r\n $(\"#treeview-datasource-sort\").dxSortable(sortableOptions);\r\n $(\"#popover-datasource\").dxPopover(popoverOptions);\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n };\r\n\r\n var failureFunction = function () {\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n\r\n var jsonTablesConfigHtml = $(\"body\").data(\"tablesconfightml\");\r\n if (jsonTablesConfigHtml) {\r\n successFunction({ schema: { tables: jsonTablesConfigHtml }});\r\n }\r\n else {\r\n irGlobal.updateFromServer({},\r\n urlConfigs.designer + \"GetDataSource\",\r\n {},\r\n successFunction,\r\n failureFunction,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n };\r\n\r\n var getField = function (fieldId) {\r\n if (!fieldId)\r\n return null;\r\n let table = tables.find(t => t.fields.find(f => f.fieldId === fieldId));\r\n var field = table ? table.fields.find(f => f.fieldId === fieldId) : null;\r\n return field;\r\n }\r\n\r\n var getFieldByName = function (fieldName, fieldTableName) {\r\n if (!fieldName || !fieldTableName)\r\n return null;\r\n let table = tables.find(t => t.fields.find(f => f.fieldName === fieldName && f.tableName === fieldTableName));\r\n var field = table ? table.fields.find(f => f.fieldName === fieldName && f.tableName === fieldTableName) : null;\r\n return field;\r\n }\r\n\r\n var getFieldName = function (fieldId) {\r\n var field = getField(fieldId);\r\n return field ? field.nodeName : \"\";\r\n }\r\n\r\n var getMetricName = function (metricId) {\r\n if (!metricId)\r\n return \"\";\r\n var metric = metrics.find(m => m.id === metricId || m.metricId === metricId);\r\n return metric ? metric.nodeName : \"\";\r\n }\r\n\r\n var getAllMetrics = function () {\r\n return metrics.filter(x => x.visibility === VisibilityEnum.Normal);\r\n }\r\n\r\n var hide = function () {\r\n let popover = $(\"#popover-datasource\").dxPopover(\"instance\");\r\n if (popover) {\r\n popover.hide();\r\n }\r\n }\r\n\r\n return {\r\n getDataSourcePopover: getDataSourcePopover,\r\n showDataSourcePopover: showDataSourcePopover,\r\n prepareDataSourcePopover: prepareDataSourcePopover,\r\n setDblClickDataSource: setDblClickDataSource,\r\n getMetricName: getMetricName,\r\n getField: getField,\r\n getFieldByName: getFieldByName,\r\n getFieldName: getFieldName,\r\n hide: hide,\r\n getAllMetrics: getAllMetrics\r\n };\r\n\r\n}());\r\n","declare var customGroupFieldsId: any;\r\ndeclare var exportToExcel: any;\r\ndeclare var exportPivotToExcel: any;\r\n\r\nclass WorkbookViewModel {\r\n\r\n editing: KnockoutObservable;\r\n hasDashboardTab: KnockoutComputed;\r\n tabs: KnockoutObservableArray;\r\n\r\n constructor() {\r\n this.editing = ko.observable(false);\r\n this.tabs = ko.observableArray([]);\r\n\r\n this.hasDashboardTab = ko.computed(function () {\r\n return this.tabs().filter(x => x.tabType === TabTypeEnum.Dashboard).length > 0;\r\n }.bind(this));\r\n }\r\n\r\n setup() {\r\n this.editing = ko.observable(loggedUser.workbookOpeningMode() === WorkbookOpeningModeEnum.Edit);\r\n }\r\n\r\n getActiveTab() {\r\n let tabElement = $(\"div[role='tabpanel'].active\", \"div#TabContainer\");\r\n if (tabElement.length === 0) {\r\n return null;\r\n }\r\n let tabId = parseInt(tabElement.attr(\"id\"));\r\n\r\n return this.tabs().find(x => x.id === tabId);\r\n }\r\n}\r\n\r\nvar workbookViewModel = new WorkbookViewModel();\r\nvar tabView = (function ($) {\r\n\r\n var parentContext = function (): JQuery {\r\n return $(\"div#TabContainer\");\r\n };\r\n\r\n var getActiveTab = function (context: JQuery = null) {\r\n if (!context) {\r\n context = parentContext();\r\n }\r\n\r\n return $(\"div[role='tabpanel'].active\", context);\r\n };\r\n\r\n var getBaseSubmitObject = function (objectToExtend, context: JQuery = null) {\r\n if (!context) {\r\n context = parentContext();\r\n }\r\n\r\n var workbookId = context.data(\"workbookid\");\r\n var mappingId = context.data(\"mappingid\");\r\n var baseObject = { workbookId: workbookId, mappingId: mappingId };\r\n var activeTab = getActiveTab(context);\r\n\r\n if (activeTab.length > 0 && (!objectToExtend || !objectToExtend[\"tabId\"])) {\r\n var tabId = parseInt(activeTab.attr(\"id\"), 10);\r\n baseObject[\"tabId\"] = tabId;\r\n\r\n let tabType = activeTab.data(\"tabtype\");\r\n if (tabType === TabTypeStrEnum.Report || tabType === TabTypeStrEnum.Chart) {\r\n baseObject[\"drilldownId\"] = reportView.getDrilldownId();\r\n }\r\n }\r\n\r\n return $.extend(\r\n baseObject,\r\n objectToExtend);\r\n };\r\n \r\n var getTabConfig = function (objectToExtend) {\r\n let tabType = getActiveTab().data(\"tabtype\");\r\n let config = { };\r\n let filterValues;\r\n switch (tabType) {\r\n case TabTypeStrEnum.Report:\r\n case TabTypeStrEnum.Chart:\r\n config = reportView.getReportConfig(true);\r\n break;\r\n case TabTypeStrEnum.Dashboard:\r\n if (objectToExtend && objectToExtend.widgetId !== undefined) {\r\n let widgetType = $(`.dashboardWidget[data-widgetid=${objectToExtend.widgetId}]`, getActiveTab()).closest(\".widgetContainer\").data(\"widgettype\");\r\n if (widgetType === WidgetTypeEnum.Pivot || widgetType === WidgetTypeEnum.Chart || widgetType === WidgetTypeEnum.Report) {\r\n config = reportView.getReportConfig(true);\r\n }\r\n else {\r\n filterValues = filtersManager.getFilterValues();\r\n config = getBaseSubmitObject(filterValues);\r\n }\r\n }\r\n else {\r\n //**** Obsolete\r\n //Report|Chart|Pivot\r\n if ($(\".dashboardWidget.selected .reportContent\", getActiveTab()).length > 0) {\r\n config = reportView.getReportConfig(true);\r\n }\r\n else {\r\n filterValues = filtersManager.getFilterValues();\r\n config = getBaseSubmitObject(filterValues);\r\n }\r\n //****\r\n }\r\n break;\r\n case TabTypeStrEnum.ReportDesigner:\r\n case TabTypeStrEnum.ChartDesigner:\r\n config = getBaseSubmitObject(objectToExtend);\r\n break;\r\n //Sidebar menu calls GetWorkbooks but the workbook/tab is not fully loaded yet and tabType is not defined \r\n default:\r\n filterValues = filtersManager.getFilterValues();\r\n config = getBaseSubmitObject(filterValues);\r\n break;\r\n }\r\n\r\n const context = parentContext();\r\n const tabDetailDrilldown = $(\".tab-detail-drilldown-back\", context);\r\n if (tabDetailDrilldown.length === 1) {\r\n (config as any).fromTabDetail = tabDetailDrilldown.data(\"tab-id\");\r\n (config as any).fromTabDetailWidget = tabDetailDrilldown.data(\"widget-id\");\r\n }\r\n\r\n if (!objectToExtend) {\r\n objectToExtend = {};\r\n }\r\n\r\n $.extend(config, objectToExtend);\r\n return config;\r\n };\r\n\r\n var workbookHasPendingChanges = function () {\r\n let hasPendingChanges = false;\r\n let workbookId = parentContext().data(\"workbookid\");\r\n if (workbookId) {\r\n irGlobal.updateFromServer(null,\r\n urlConfigs.tabs + \"HasPedingChanges\",\r\n { workbookId: workbookId },\r\n function (data) {\r\n hasPendingChanges = data.pendingChanges;\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true,\r\n undefined,\r\n undefined,\r\n false);\r\n }\r\n return hasPendingChanges;\r\n }\r\n\r\n var setId = function (id) {\r\n //Bail out if we're trying to set null/\r\n if (!id) {\r\n return;\r\n }\r\n\r\n parentContext().data(\"workbookid\", id);\r\n };\r\n\r\n var setUrl = function (data) {\r\n if (data.id) {\r\n if (!data.forceSet && getBaseSubmitObject(null).workbookId === data.id) return;\r\n setId(data.id);\r\n history.pushState({}, null, urlConfigs.tabs + \"edit/\" + data.id);\r\n showOptionsButton(true);\r\n }\r\n };\r\n\r\n var addSubMenuEvent = function () {\r\n let context = parentContext();\r\n $('.dropdown-submenu > a', context).off(\"click\").on(\"click\", function (e) {\r\n let a = this;\r\n $('.dropdown-submenu > a', context).each(function () {\r\n if (a !== this) {\r\n $(this).next('ul').css(\"display\", \"none\");\r\n }\r\n });\r\n\r\n let li = $(this).closest(\"li\");\r\n let ul = $(this).next('ul');\r\n let widthReport = $(\"#ReportSelector\", context).outerWidth();\r\n\r\n ul.css(\"left\", `${(li.offset().left + widthReport - 2)}px`);\r\n ul.css(\"top\", `${(li.offset().top + 4)}px`);\r\n\r\n ul.toggle();\r\n e.stopPropagation();\r\n e.preventDefault();\r\n });\r\n }\r\n\r\n var updateWorkbookReportList = function (data) {\r\n if (!data.workbookReportList) return;\r\n let reportSelector = $(\"ul#ReportSelector \");\r\n reportSelector.replaceWith(data.workbookReportList);\r\n $(\"#ReportSelector > li:not(.dropdown-submenu) > a, #ReportSelector li.dropdown-submenu > ul.dropdown-menu > li > a\", parentContext()).off(\"click\", newReportClick).on(\"click\", newReportClick);\r\n addSubMenuEvent();\r\n };\r\n\r\n var updateWorkbookDashboardList = function (data) {\r\n if (!data.workbookDashboardList) return;\r\n let dashboardSelector = $(\"ul#CreateDashboardSelector\");\r\n dashboardSelector.replaceWith(data.workbookDashboardList);\r\n let context = parentContext();\r\n $(\"#CreateDashboardSelector > li > a\", context).off(\"click\", addNewDashboardTab).on(\"click\", addNewDashboardTab);\r\n\r\n if ($(\"#CreateDashboardSelector > li\", context).length > 1) {\r\n $(\"#CreateDashboardSelector\", context).closest(\"li\").css(\"display\", \"unset\");\r\n $(\"div#WorkbookButtons button.addbutton\", context).closest(\"li\").css(\"display\", \"none\");\r\n }\r\n else {\r\n $(\"#CreateDashboardSelector\", context).closest(\"li\").css(\"display\", \"none\");\r\n $(\"div#WorkbookButtons button.addbutton\", context).closest(\"li\").css(\"display\", \"unset\");\r\n }\r\n };\r\n\r\n var updateReportList = function (data) {\r\n if (!data.reportReportsList) {\r\n return;\r\n }\r\n\r\n $(\"select.reportList\").each(function () {\r\n let thisSelector = $(this);\r\n let selectedOption = $(\"option:selected\", thisSelector);\r\n let selectedReport = selectedOption.val();\r\n thisSelector.html(data.reportReportsList);\r\n let customSelection = $(\"option[value='\" + customGroupFieldsId + \"']\", thisSelector);\r\n if (selectedReport === customGroupFieldsId && thisSelector.attr(\"id\") !== \"AnalyzeByReports\") {\r\n customSelection.removeAttr(\"hidden\").prop(\"selected\", true);\r\n }\r\n else {\r\n if (selectedReport === customGroupFieldsId)\r\n selectedReport = data.reportId;\r\n\r\n customSelection.attr(\"hidden\");\r\n $(thisSelector.find(\"option[value='\" + selectedReport + \"']\")[0]).prop(\"selected\", true);\r\n }\r\n\r\n });\r\n reportView.addReportSelectorEvents();\r\n };\r\n\r\n var updateTabView = function (data) {\r\n setUrl(data);\r\n irGlobal.handleAlerts(data);\r\n\r\n if (data.view) {\r\n let tabPageContainer = $(\"div#TabPageContainer\", parentContext());\r\n tabPageContainer.html(data.view);\r\n\r\n createTab();\r\n }\r\n else {\r\n updateIconDefaultTab();\r\n }\r\n\r\n if (data.tabType) {\r\n switch (data.tabType) {\r\n case TabTypeStrEnum.Dashboard:\r\n dashboard.setup();\r\n break;\r\n case TabTypeStrEnum.Report:\r\n case TabTypeStrEnum.Chart:\r\n reportView.setup();\r\n break;\r\n case TabTypeStrEnum.ReportDesigner:\r\n case TabTypeStrEnum.ChartDesigner:\r\n setupDesigner();\r\n break;\r\n }\r\n }\r\n\r\n updateWorkbookReportList(data);\r\n updateWorkbookDashboardList(data);\r\n updateReportList(data);\r\n setupTabActions();\r\n };\r\n\r\n var addNewDashboardTab = function (e) {\r\n e.preventDefault();\r\n let link = irGlobal.getJqueryElement(e.currentTarget);\r\n let dashboardId = (link as any).data(\"dashboardid\");\r\n\r\n addNewTab(e, TabTypeStrEnum.Dashboard, dashboardId, null);\r\n };\r\n\r\n var addNewTab = function (evt, tabType, reportId, reportType) {\r\n let context = parentContext();\r\n context.attr(\"scrollTab\", null);\r\n\r\n let submitObject = { newReportId: reportId, tabType: tabType };\r\n if (reportType)\r\n submitObject[\"newReportType\"] = reportType;\r\n\r\n updateFromServer(evt,\r\n urlConfigs.tabs + \"AddTab\",\r\n submitObject,\r\n updateTabView,\r\n null);\r\n };\r\n\r\n var removeTab = function (e) {\r\n let tabDiv = $(e.currentTarget).parent().parent();\r\n let tabName = tabDiv.find(\"span.tabName input\").val();\r\n bootbox.confirm(`Are you sure you want to remove \"${tabName}\" tab?`,\r\n function (result) {\r\n if (!result) return;\r\n\r\n let link = tabDiv.find(\"a\");\r\n let tabId = link.data(\"tabid\");\r\n let submitObject = getTabConfig({ tabId: tabId });\r\n updateFromServer(e,\r\n urlConfigs.tabs + \"RemoveTab\",\r\n submitObject,\r\n function (data) {\r\n let context = parentContext();\r\n context.attr(\"scrollTab\", null);\r\n\r\n updateTabView(data);\r\n },\r\n null);\r\n });\r\n };\r\n\r\n var changeActiveTab = function (e) {\r\n e.preventDefault();\r\n if (renamingTab)\r\n return;\r\n\r\n let link = irGlobal.getJqueryElement(e.currentTarget);\r\n let tabId = (link as any).data(\"tabid\");\r\n if (jsonResult.activeTabId !== tabId) {\r\n openTab(tabId);\r\n }\r\n };\r\n\r\n var openTab = function (tabId, objectParameter = null, isTabDetail: boolean = false) {\r\n let submitObject = objectParameter ?? {};\r\n submitObject.newActiveTabId = tabId;\r\n\r\n let context = parentContext();\r\n let tabPageHeader = getTabPageHeader();\r\n let scrollableContainer = $(\".dx-scrollable-container\", tabPageHeader).get(0);\r\n let scrollLeft = null;\r\n\r\n if (scrollableContainer) {\r\n if (isTabDetail) {//If opened by another item\r\n scrollLeft = $(`#Tab_${tabId}`).get(0).getBoundingClientRect().left;\r\n }\r\n else {\r\n scrollLeft = scrollableContainer.scrollLeft;\r\n }\r\n }\r\n\r\n if (isTabDetail) {\r\n let marginLeft = parseInt($('.dx-drawer-panel-content').css('margin-left').replace('px', ''));\r\n if (marginLeft == 0) {\r\n scrollLeft = scrollLeft - 205;\r\n }\r\n }\r\n else {\r\n $(\".tab-detail-drilldown-back\", context).remove();\r\n }\r\n\r\n context.attr(\"scrollTab\", scrollLeft);\r\n\r\n updateFromServer({},\r\n urlConfigs.tabs + \"SetActiveTab\",\r\n submitObject,\r\n function (data) {\r\n dashboard.disableEditMode();\r\n\r\n workbookViewModel.tabs().forEach(function (tab) {\r\n tab.detailingTab = false;\r\n });\r\n if (isTabDetail) {\r\n const tab = workbookViewModel.tabs().find(function (x) { return x.id === tabId; });\r\n if (tab) {\r\n tab.detailingTab = true;\r\n }\r\n }\r\n\r\n updateTabView(data);\r\n\r\n if (isTabDetail) {\r\n $(\".dx-item.dx-tab.dx-tab-selected\", \"#TabPageHeader\").css(\"display\", \"\");\r\n }\r\n },\r\n null);\r\n };\r\n\r\n var getTabList = function () {\r\n let tabs = [];\r\n $(\"#TabPageContainer .dx-tabpanel-tabs a[role=tab]\").each(function (index, tabElement) {\r\n const tabId = $(tabElement).data(\"tabid\");\r\n let tab = {\r\n id: tabId,\r\n name: $(tabElement).find(\"input\").val(),\r\n icon: $(tabElement).find(\"span.tab-icon\").text(),\r\n tabType: $(`.tab-pane[id=${tabId}]`).data(\"tabtype\")\r\n };\r\n tabs.push(tab);\r\n });\r\n return tabs;\r\n }\r\n\r\n var getTabName = function (tabId) {\r\n if (!tabId)\r\n return \"\";\r\n let tabs = getTabList();\r\n let tab = tabs.find(x => x.id === tabId);\r\n return tab ? tab.name : \"\";\r\n };\r\n\r\n var renamingTab = false;\r\n var renameTab = function (evt) {\r\n if (!workbookViewModel.editing()) {\r\n return;\r\n }\r\n\r\n let link = irGlobal.getJqueryElement(evt) as any;\r\n let tabId = link.closest(\"a\").data(\"tabid\");\r\n let tab = workbookViewModel.tabs().find(function (x) { return x.id === tabId; });\r\n let $tabNameElement = null;\r\n let updateTabName = function (element, value) {\r\n let tabNameObj = getTabConfig({ tabId: tabId, name: value });\r\n updateFromServer(null,\r\n urlConfigs.tabs + \"ChangeTabName\",\r\n tabNameObj,\r\n function (data) {\r\n if (tab) {\r\n tab.name = data.name;\r\n tab.variable = data.variable;\r\n\r\n $tabNameElement.val(data.name);\r\n onInputRenameTab($tabNameElement.get(0));\r\n link.closest(\"a\").data(\"variable\", data.variable);\r\n }\r\n\r\n updateWorkbookReportList(data);\r\n updateWorkbookDashboardList(data);\r\n },\r\n null);\r\n };\r\n let updateTabColors = function (backgroundColor, fontColor, hiddenTab) {\r\n let tabNameObj = getTabConfig({ tabId: tabId, backgroundColor: backgroundColor, fontColor: fontColor, hiddenTab: hiddenTab });\r\n updateFromServer(null,\r\n urlConfigs.tabs + \"UpdateTabSettings\",\r\n tabNameObj,\r\n function () {\r\n if (tab) {\r\n if (!$(`#TabPageHeader .dx-tabs a[data-tabid='${tabId}'] span.defaulttabstar`).hasClass(\"hidden\") && hiddenTab) {\r\n $(\"#TabPageHeader .dx-tabs span.defaulttabstar\").addClass(\"hidden\");\r\n\r\n jsonResult.defaultTabId = 0;\r\n updateIconDefaultTab();\r\n }\r\n\r\n if (tab.tag) {\r\n tab.tag.backgroundColor = backgroundColor;\r\n tab.tag.fontColor = fontColor;\r\n tab.tag.hiddenTab = hiddenTab;\r\n }\r\n tab.backgroundColor = backgroundColor;\r\n tab.fontColor = fontColor;\r\n tab.hiddenTab = hiddenTab;\r\n }\r\n },\r\n null);\r\n };\r\n let hidePopover = function (e) {\r\n let pop = e.target.closest(\"div.tabNameEdit\");\r\n if (!pop) {\r\n link.popover(\"hide\");\r\n }\r\n }\r\n\r\n let popoverCreated = link.data(\"popovercreated\");\r\n if (popoverCreated) {\r\n link.popover('show');\r\n return;\r\n }\r\n link.attr(\"data-popovercreated\", true);\r\n\r\n link.popover(\r\n {\r\n html: true,\r\n placement: function (a, b) {\r\n const popupWidth = 450;\r\n let widget = this.$element.closest(\".dx-tab\");\r\n let left = widget.get(0).getBoundingClientRect().left;\r\n if (left <= (popupWidth - widget.width()) / 2) {\r\n return \"right\";\r\n }\r\n\r\n let dashboard = $(\"#drawer\");\r\n if (dashboard.width() - (left + widget.width()) < (popupWidth - widget.width()) / 2) {\r\n return \"left\";\r\n }\r\n\r\n return \"bottom\";\r\n },\r\n trigger: \"manual\",\r\n container: $(\"#drawer\"),\r\n content: `
\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n ${(workbookViewModel.editing() && tab.tabType !== 1 ? `
\r\n
` : ``)}`\r\n });\r\n link.on(\"shown.bs.popover\",\r\n function () {\r\n let tabPageHeader = getTabPageHeader();\r\n tabPageHeader.dxSortable(\"instance\").option(\"allowReordering\", false);\r\n\r\n let po = $(this).data(\"bs.popover\");\r\n let content = po.$tip;\r\n\r\n $(\"#TabContainer\").off(\"click\", hidePopover).on(\"click\", hidePopover);\r\n let tabElement = $(this).closest(\".dx-item.dx-tab\");\r\n let link = $(this).closest(\"a\");\r\n let backgroundColor = ko.observable(link.data(\"backgroundcolor\"));\r\n let fontColor = ko.observable(link.data(\"fontcolor\"));\r\n let hiddenTab = ko.observable(link.data(\"hiddentab\"));\r\n let variable = link.data(\"variable\");\r\n\r\n hiddenTab.subscribe(function (value) {\r\n link.data(\"hiddentab\", value);\r\n updateTabColors(backgroundColor(), fontColor(), hiddenTab());\r\n });\r\n\r\n backgroundColor.subscribe(function (value) {\r\n link.data(\"backgroundcolor\", value);\r\n tabElement.css(\"background-color\", value);\r\n updateTabColors(value, fontColor(), hiddenTab());\r\n });\r\n\r\n fontColor.subscribe(function (value) {\r\n link.data(\"fontcolor\", value);\r\n link.css(\"color\", value);\r\n $(\".tab-icon\", link).css(\"color\", value);\r\n updateTabColors(backgroundColor(), value, hiddenTab());\r\n });\r\n let model = { backgroundColor: backgroundColor, fontColor: fontColor, hiddenTab: hiddenTab };\r\n ko.cleanNode(content.get(0));\r\n ko.applyBindings(model, content.get(0))\r\n\r\n let currentLink = $(this);\r\n //let $spanName = $(\"span.tabName\", currentLink);\r\n let $popNameElement = $(\"input.inputTabName\", content);\r\n $tabNameElement = $(\".input-tabName\", currentLink);\r\n let currentName = variable || $tabNameElement.val();\r\n\r\n let oldName = currentName;\r\n $popNameElement.val(currentName);\r\n\r\n var confirmNameChange = function () {\r\n if (($popNameElement.val() as any).trim() === \"\") {\r\n $popNameElement.val(oldName);\r\n }\r\n else if ($popNameElement.val() !== oldName) {\r\n updateTabName($tabNameElement, $popNameElement.val());\r\n }\r\n }\r\n $popNameElement.off(\"keydown\").on(\"keydown\", function (event) {\r\n var keyCode = event.keyCode || event.which;\r\n\r\n if (keyCode == 9) { //TAB\r\n confirmNameChange();\r\n }\r\n });\r\n $popNameElement.off(\"keyup\").on(\"keyup\", function (event) {\r\n if (event.keyCode === 13) {//ENTER\r\n event.preventDefault();\r\n confirmNameChange();\r\n $popNameElement.off(\"blur\");\r\n po.hide();\r\n }\r\n else if (event.keyCode === 27) { //ESC\r\n event.preventDefault();\r\n $popNameElement.off(\"blur\");\r\n po.hide();\r\n }\r\n });\r\n $popNameElement.focus();\r\n $popNameElement.off(\"blur\").on(\"blur\", function (e) {\r\n confirmNameChange();\r\n });\r\n });\r\n link.on(\"hide.bs.popover\", function () {\r\n $(\"#TabContainer\").off(\"click\", hidePopover);\r\n\r\n let tabPageHeader = getTabPageHeader();\r\n tabPageHeader.dxSortable(\"instance\").option(\"allowReordering\", true);\r\n });\r\n\r\n link.popover(\"show\");\r\n }\r\n\r\n var onInputRenameTab = function (evt) {\r\n evt.parentNode.parentNode.parentNode.parentNode.firstChild.textContent = evt.value;\r\n evt.parentNode.dataset.value = evt.value;\r\n }\r\n\r\n var setupTabActions = function (context: JQuery = null) {\r\n if (!context) context = parentContext();\r\n\r\n updateTimeStamp();\r\n\r\n createTabEvents();\r\n\r\n var hidePopoverOnOffClick = function (e) {\r\n context.find('[data-toggle=\"popover\"],[data-original-title]').each(function () {\r\n if (!$(this).is(e.target) &&\r\n $(this).has(e.target).length === 0 &&\r\n $(\".popover\").has(e.target).length === 0) {\r\n\r\n if ($(this).has(\".tabName\").length > 0) {\r\n return;\r\n }\r\n\r\n ((($(this) as any).popover(\"hide\").data(\"bs.popover\") || {}).inState || {}).click = false;\r\n }\r\n });\r\n };\r\n $(document).off(\"click\", hidePopoverOnOffClick).on(\"click\",\r\n hidePopoverOnOffClick\r\n );\r\n\r\n $(\"#ReportSelector > li:not(.dropdown-submenu) > a, #ReportSelector li.dropdown-submenu > ul.dropdown-menu > li > a \", context).off(\"click\", newReportClick).on(\"click\", newReportClick);\r\n $(\"#CreateDashboardSelector > li > a\", parentContext()).off(\"click\", addNewDashboardTab).on(\"click\", addNewDashboardTab);\r\n $(\"div#WorkbookButtons button.addbutton\", context).off(\"click\", addNewDashboardTab).on(\"click\", addNewDashboardTab);\r\n addSubMenuEvent();\r\n };\r\n\r\n var workbookNameClick = function (e) {\r\n if (!workbookViewModel.editing()) {\r\n return;\r\n }\r\n\r\n let input = irGlobal.getJqueryElement(e.currentTarget) as any;\r\n input.width(\"auto\");\r\n input.removeClass(\"labelText\");\r\n let context = parentContext();\r\n\r\n let resetNameEdit = function () {\r\n input.width(\"\");\r\n input.css(\"border-color\", \"\");\r\n input.addClass(\"labelText\");\r\n };\r\n\r\n let cancelNameEdit = function () {\r\n var savedName = context.data(\"name\");\r\n input.val(savedName);\r\n resetNameEdit();\r\n }\r\n\r\n let isSaving = false;\r\n let saveWorkbookName = function () {\r\n if (!workbookViewModel.editing()) {\r\n return;\r\n }\r\n\r\n if (isSaving) {\r\n return;\r\n }\r\n\r\n let name = input.val().trim();\r\n let savedName = context.data(\"name\");\r\n\r\n if (homeButtonClicked) {\r\n return;\r\n }\r\n\r\n //Insanely basic validation check.\r\n if (!name || name === savedName) {\r\n cancelNameEdit();\r\n return;\r\n }\r\n\r\n isSaving = true;\r\n\r\n let submitObj = getBaseSubmitObject({ name: name });\r\n\r\n let completeFunction = function (data) {\r\n isSaving = false;\r\n\r\n if (data.duplicatedName) {\r\n input.css(\"border-color\", \"indianred\");\r\n\r\n irGlobal.notifyError(\"Duplicated name, please choose another name.\");\r\n //input.focus();\r\n input.removeClass(\"labelText\");\r\n }\r\n else {\r\n resetNameEdit();\r\n updateTabView(data);\r\n context.data(\"name\", data.name);\r\n $(\"#drawer .workbook-menu-group[data-id=WorkbookName]\").html(data.name);\r\n $(`#drawer .workbook-menu[data-id=${data.id}]`).html(data.name);\r\n }\r\n };\r\n\r\n let errorFunction = function (data) { isSaving = false; };\r\n\r\n updateFromServer(e,\r\n urlConfigs.tabs + \"ChangeWorkbookName\",\r\n submitObj,\r\n completeFunction,\r\n errorFunction);\r\n\r\n };\r\n\r\n input.off(\"keyup\").on(\"keyup\", function (event) {\r\n if (event.keyCode === 13) {\r\n event.preventDefault();\r\n saveWorkbookName();\r\n //input.blur();\r\n }\r\n else if (event.keyCode === 27) {\r\n event.preventDefault();\r\n cancelNameEdit();\r\n //input.blur();\r\n }\r\n });\r\n\r\n input.off(\"blur\").on(\"blur\", function (event) {\r\n saveWorkbookName();\r\n });\r\n };\r\n\r\n var newReportClick = function (e) {\r\n e.preventDefault();\r\n let link = irGlobal.getJqueryElement(e.currentTarget) as any;\r\n let reportType = link.data(\"reporttype\");\r\n let tabType = link.data(\"tabtype\");\r\n let reportid = 0;\r\n if (tabType === TabTypeStrEnum.Report || tabType === TabTypeStrEnum.Chart) {\r\n reportid = link.data(\"reportid\");\r\n }\r\n addNewTab(e, tabType, reportid, reportType);\r\n };\r\n\r\n var setAsDefaultWorkbook = function () {\r\n let workbookId = parentContext().data(\"workbookid\");\r\n let submitObject = { workbookId: workbookId };\r\n let onComplete = function (data) {\r\n jsonResult.defaultWorkbook = data;\r\n updateIconDefaultWorkbook(data);\r\n\r\n let name = parentContext().data(\"name\");\r\n showToast(data ? `'${name}' workbook set as default` : `'${name}' workbook unset as default`);\r\n }\r\n\r\n updateFromServer({},\r\n urlConfigs.tabs + \"UpdateDefaultWorkbook\",\r\n submitObject,\r\n onComplete,\r\n null);\r\n };\r\n\r\n var setAsDefaultTab = function (evt) {\r\n const tabId = parseInt(getActiveTab().attr(\"id\"), 10);\r\n const activeTab = workbookViewModel.tabs().find(function (x) { return x.id === tabId; });\r\n if (activeTab && activeTab.hiddenTab) {\r\n bootbox.alert(\"Setting the default tab to a hidden tab is not allowed.\");\r\n return;\r\n }\r\n\r\n const workbookId = parentContext().data(\"workbookid\");\r\n let submitObject = { tabId: tabId, workbookId: workbookId };\r\n\r\n var onComplete = function (data) {\r\n $(\"#TabPageHeader .dx-tabs span.defaulttabstar\").addClass(\"hidden\");\r\n $(`#TabPageHeader .dx-tabs a[data-tabid='${tabId}'] span.defaulttabstar`).removeClass(\"hidden\");\r\n\r\n jsonResult.defaultTabId = tabId;\r\n updateIconDefaultTab();\r\n refreshTabs();\r\n\r\n const name = getTabName(tabId);\r\n showToast(data ? `'${name}' tab set as default` : `'${name}' tab unset as default`);\r\n }\r\n\r\n updateFromServer(evt,\r\n urlConfigs.tabs + \"SetDefaultTab\",\r\n submitObject,\r\n onComplete,\r\n null);\r\n };\r\n\r\n var afterFilterAdded = function (data) {\r\n setUrl(data);\r\n let refreshFilterButton = $(\"button#RefreshWorkbookFilters\", parentContext());\r\n refreshFilterButton.prop(\"disabled\", false);\r\n };\r\n\r\n var showOptionsButton = function (showOptions) {\r\n let li = parentContext().find(\"button#OptionsButton\").closest(\"li\");\r\n if (showOptions) {\r\n li.removeClass(\"hidden\");\r\n } else {\r\n li.addClass(\"hidden\");\r\n }\r\n };\r\n\r\n var downloadHardcopy = function (data) {\r\n\r\n let openPopupEmailTemplate = function () {\r\n pdfTemplatesService.getPdfTemplates(function (resultTemplates) {\r\n let pdfTemplateLookup = null;\r\n let landscapeCheckBox = null;\r\n let popup = $('#EmailPdfTemplate', parentContext()).dxPopup({\r\n contentTemplate: function () {\r\n let template = $(\"
\");\r\n let templates = [{ id: 0, name: ' ' }];\r\n if (resultTemplates.templates) {\r\n resultTemplates.templates.forEach(function (tmp) {\r\n templates.push(tmp);\r\n });\r\n }\r\n\r\n let divPdfTemplate = $('
').dxSelectBox({\r\n dataSource: templates,\r\n displayExpr: 'name',\r\n valueExpr: 'id'\r\n });\r\n pdfTemplateLookup = divPdfTemplate.dxSelectBox(\"instance\");\r\n\r\n let divLandscape = $('
').css(\"margin-top\", \"5px\").dxCheckBox({\r\n value: false,\r\n text: 'Landscape',\r\n });\r\n landscapeCheckBox = divLandscape.dxCheckBox(\"instance\");\r\n\r\n template.append(\"\");\r\n template.append(divPdfTemplate);\r\n template.append(divLandscape);\r\n\r\n return template;\r\n },\r\n width: 400,\r\n height: 180,\r\n showTitle: true,\r\n title: 'PDF',\r\n visible: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: false,\r\n onShown: function () {\r\n $(\".dx-overlay-wrapper\").css(\"z-index\", \"1049\");\r\n },\r\n toolbarItems: [{\r\n widget: 'dxButton',\r\n toolbar: 'bottom',\r\n location: 'after',\r\n options: {\r\n text: 'Confirm',\r\n onClick() {\r\n let pdfTemplateId = pdfTemplateLookup.option(\"value\");\r\n let landscape = landscapeCheckBox.option(\"value\");\r\n let href = $(data).data(\"href\");\r\n if (landscape) {\r\n href += `&landscape=${landscape}`;\r\n }\r\n\r\n if (pdfTemplateId && pdfTemplateId > 0) {\r\n href += `&pdfTemplateId=${pdfTemplateId}`;\r\n }\r\n\r\n window.open(href, '_blank').focus();\r\n popup.hide();\r\n },\r\n },\r\n }, {\r\n widget: 'dxButton',\r\n toolbar: 'bottom',\r\n location: 'after',\r\n options: {\r\n text: 'Close',\r\n onClick() {\r\n popup.hide();\r\n },\r\n },\r\n }]\r\n }).dxPopup('instance');\r\n\r\n popup.show();\r\n }, false);\r\n }\r\n\r\n const activeTab = getActiveTab();\r\n if (activeTab && activeTab.data(\"tabtype\") === TabTypeStrEnum.Report) {\r\n const reportType = $(\".reportContent\", activeTab).attr(\"data-mode\");\r\n const tabId = parseInt(activeTab.attr(\"id\"), 0);\r\n const tabName = getTabName(tabId);\r\n if ((reportType !== ReportTypeStrEnum.Analysis && reportType !== ReportTypeStrEnum.Pivot) || (!$(data).hasClass(\"downloadExcel\") && !$(data).hasClass(\"downloadCSV\"))) {\r\n if ($(data).hasClass(\"template\")) {\r\n openPopupEmailTemplate();\r\n return;\r\n }\r\n\r\n window.open($(data).data(\"href\"), '_blank').focus();\r\n return;\r\n }\r\n\r\n let reportObj = getBaseSubmitObject(null);\r\n irGlobal.updateFromServer({},\r\n urlConfigs.email + \"GetExportDetails\",\r\n reportObj,\r\n function (result) {\r\n let settings = {\r\n isCSV: false,\r\n printMessage: result.printMessage,\r\n mappingName: result.mappingName,\r\n reportName: result.reportName,\r\n groupBy: result.groupingName,\r\n orderBy: result.orderBy,\r\n filters: result.filters,\r\n companyName: result.companyName,\r\n fontSize: result.fontSize,\r\n glReport: result.glReport,\r\n subtotalsPosition: result.subtotalsPosition,\r\n formattingRules: result.formattingRules,\r\n currencyCode: result.currencyCode,\r\n subTotalText: result.subTotalText,\r\n save: true,\r\n fileName: tabName\r\n };\r\n\r\n if ($(data).hasClass(\"downloadExcel\")) {\r\n if (reportType === ReportTypeStrEnum.Analysis)\r\n exportToExcel(settings);\r\n else\r\n exportPivotToExcel(settings);\r\n\r\n return;\r\n }\r\n else if ($(data).hasClass(\"downloadCSV\")) {\r\n settings.isCSV = true;\r\n if (reportType === ReportTypeStrEnum.Analysis)\r\n exportToExcel(settings);\r\n else\r\n exportPivotToExcel(settings);\r\n\r\n return;\r\n }\r\n\r\n window.open($(data).data(\"href\"), '_blank').focus();\r\n },\r\n function () {\r\n window.open($(data).data(\"href\"), '_blank').focus();\r\n },\r\n true,\r\n \"POST\",\r\n true, undefined, undefined, false);\r\n }\r\n else {\r\n\r\n if ($(data).hasClass(\"template\")) {\r\n openPopupEmailTemplate();\r\n return;\r\n }\r\n\r\n window.open($(data).data(\"href\"), '_blank').focus();\r\n }\r\n };\r\n\r\n var showOptionsPopup = function (workbookId) {\r\n let sucessCallback = function (result) {\r\n let message = $(result.html).clone(true);\r\n\r\n let dialog = bootbox.dialog({\r\n title: \"Workbook Access\",\r\n message: message,\r\n show: false,\r\n buttons: {\r\n cancel: {\r\n label: \"Cancel\",\r\n className: \"btn-danger\",\r\n callback: function () {\r\n }\r\n\r\n },\r\n ok: {\r\n label: \"Save\",\r\n className: \"btn-success\",\r\n callback: function (evt) {\r\n let selectedDiv = $(\"div#selectedShareUsers\", $(this));\r\n let selectedDataGrid = selectedDiv.dxDataGrid(\"instance\");\r\n\r\n let selectedEntities = [];\r\n let selectedVals = selectedDataGrid.option(\"dataSource\") as [];\r\n\r\n if (selectedVals.length > 0) {\r\n selectedVals.forEach(function (data: any) {\r\n selectedEntities.push({\r\n id: data.Id,\r\n entityType: data.EntityType,\r\n shareType: data.ShareType\r\n });\r\n });\r\n }\r\n\r\n updateFromServer(evt, urlConfigs.user + \"UpdateUserAccess\",\r\n {\r\n userIds: selectedEntities,\r\n workbookId: workbookId,\r\n mappingId: 0\r\n },\r\n function () { },\r\n null);\r\n }\r\n }\r\n }\r\n });\r\n dialog.on(\"shown.bs.modal\",\r\n function () {\r\n let modal = $(this);\r\n modal.find(\"div.bootbox-body\").css(\"height\", \"100%\");\r\n\r\n let availableDiv = $(\"div#availableShareUsers\", modal);\r\n let selectedDiv = $(\"div#selectedShareUsers\", modal);\r\n let available = availableDiv.data(\"json\");\r\n let selected = selectedDiv.data(\"json\");\r\n\r\n let availableDataGrid = availableDiv.dxDataGrid({\r\n height: \"calc(100% - 29px)\",\r\n showBorders: true,\r\n showColumnHeaders: false,\r\n noDataText: \"\",\r\n selection: {\r\n mode: \"multiple\",\r\n showCheckBoxesMode: \"always\"\r\n },\r\n paging: {\r\n enabled: false\r\n },\r\n searchPanel: {\r\n visible: true,\r\n width: 279\r\n },\r\n dataSource: available,\r\n columns: [\r\n {\r\n dataField: \"FullName\",\r\n calculateDisplayValue: function (rowData) {\r\n return rowData.FullName && rowData.FullName !== \"\" ? `${rowData.FullName} (${rowData.Name})` : `${rowData.Name}`;\r\n }\r\n }\r\n ],\r\n onRowPrepared: function (e) {\r\n if (e.rowType === \"data\") {\r\n e.rowElement.addClass(e.data.EntityType === 1 ? \"userOption\" : \"groupOption\");\r\n }\r\n }\r\n }).dxDataGrid(\"instance\");\r\n\r\n let selectedDataGrid = selectedDiv.dxDataGrid({\r\n height: \"calc(100% - 29px)\",\r\n showBorders: true,\r\n showColumnHeaders: false,\r\n noDataText: \"\",\r\n selection: {\r\n mode: \"multiple\",\r\n showCheckBoxesMode: \"always\"\r\n },\r\n editing: {\r\n mode: 'cell',\r\n allowUpdating: true,\r\n allowAdding: false,\r\n allowDeleting: false,\r\n },\r\n paging: {\r\n enabled: false\r\n },\r\n searchPanel: {\r\n visible: true,\r\n width: 279\r\n },\r\n dataSource: selected,\r\n columns: [\r\n {\r\n allowEditing: false,\r\n dataField: \"FullName\",\r\n calculateDisplayValue: function (rowData) {\r\n return rowData.FullName && rowData.FullName !== \"\" ? `${rowData.FullName} (${rowData.Name})` : `${rowData.Name}`;\r\n }\r\n },\r\n {\r\n dataField: \"ShareType\",\r\n lookup: {\r\n dataSource: [{ id: 0, name: \"Viewer\" }, { id: 1, name: \"Editor\" }],\r\n displayExpr: 'name',\r\n valueExpr: 'id'\r\n },\r\n showEditorAlways: true\r\n }\r\n ],\r\n onRowPrepared: function (e) {\r\n if (e.rowType === \"data\") {\r\n e.rowElement.addClass(e.data.EntityType === 1 ? \"userOption\" : \"groupOption\");\r\n }\r\n },\r\n onSelectionChanged: function (e) {\r\n var keys = [];\r\n if (e.currentSelectedRowKeys.length && e.currentSelectedRowKeys.some(notOkToSelect)) {\r\n e.currentSelectedRowKeys.splice(0, e.currentSelectedRowKeys.length);\r\n e.component.deselectRows(keys);\r\n }\r\n function notOkToSelect(key) {\r\n var result = false;\r\n if (key < 6) {\r\n keys.push(key);\r\n result = true;\r\n }\r\n return result;\r\n }\r\n }\r\n }).dxDataGrid(\"instance\");\r\n\r\n let add = function (rows) {\r\n available = available.filter(x => rows.find(r => r.Id === x.Id) === undefined);\r\n availableDataGrid.option(\"dataSource\", available);\r\n\r\n rows.forEach(function (row) {\r\n selected.push(row);\r\n });\r\n selectedDataGrid.option(\"dataSource\", selected);\r\n }\r\n let remove = function (rows) {\r\n selected = selected.filter(x => rows.find(r => r.Id === x.Id) === undefined);\r\n selectedDataGrid.option(\"dataSource\", selected);\r\n\r\n rows.forEach(function (row) {\r\n row.ShareType = 0;\r\n available.push(row);\r\n });\r\n availableDataGrid.option(\"dataSource\", available);\r\n }\r\n\r\n $(\"button#addAllUsers\", modal).off(\"click\").on(\"click\", function () {\r\n add(availableDataGrid.getDataSource().items());\r\n });\r\n $(\"button#addUser\", modal).off(\"click\").on(\"click\", function () {\r\n add(availableDataGrid.getSelectedRowsData());\r\n });\r\n $(\"button#removeAllUsers\", modal).off(\"click\").on(\"click\", function () {\r\n remove(selectedDataGrid.getDataSource().items());\r\n });\r\n $(\"button#removeUser\", modal).off(\"click\").on(\"click\", function () {\r\n remove(selectedDataGrid.getSelectedRowsData());\r\n });\r\n\r\n modal.find(\"div.OptionsPopup\").css(\"visibility\", \"visible\");\r\n });\r\n dialog.on(\"show.bs.modal\",\r\n function () {\r\n let modal = $(this);\r\n let modalBody = modal.find(\"div.modal-body\");\r\n modalBody.height(\"500px\");\r\n });\r\n\r\n dialog.modal(\"show\");\r\n };\r\n\r\n irGlobal.updateFromServer({}, '/wb/GetWorkbookAccess/' + workbookId, null, sucessCallback, null, true, \"GET\", true);\r\n };\r\n\r\n var saveCopyButton = function () {\r\n let updateModel = getBaseSubmitObject(null);\r\n updateFromServer({},\r\n urlConfigs.tabs + \"copyWorkbookName\",\r\n updateModel,\r\n function (data) {\r\n let worbookNameTextBox = null;\r\n let copyEmailsCheckBox = null;\r\n let saveCheckBox = null;\r\n let tabGrid = null;\r\n let popup = $('#CopyWorkbookPopup', parentContext()).dxPopup({\r\n contentTemplate: function () {\r\n let template = $(\"
\").css(\"display\", \"grid\");\r\n\r\n let divWorkbookName = $('
').dxTextBox({\r\n value: data.name\r\n });\r\n worbookNameTextBox = divWorkbookName.dxTextBox(\"instance\");\r\n\r\n let divCopyEmails = $('
').css(\"margin-top\", \"5px\").dxCheckBox({\r\n value: false,\r\n text: 'Copy Scheduled Emails',\r\n onValueChanged: function (e) {\r\n if (e.value) {\r\n saveCheckBox.option(\"value\", true);\r\n }\r\n\r\n saveCheckBox.option(\"disabled\", e.value);\r\n }\r\n });\r\n copyEmailsCheckBox = divCopyEmails.dxCheckBox(\"instance\");\r\n\r\n let divSave = $('
').css(\"margin-top\", \"5px\").dxCheckBox({\r\n value: false,\r\n text: 'Save Workbook',\r\n });\r\n saveCheckBox = divSave.dxCheckBox(\"instance\");\r\n\r\n let divTabs = $(\"
\").dxDataGrid({\r\n keyExpr: \"id\",\r\n dataSource: workbookViewModel.tabs(),\r\n columns: [\r\n { dataField: \"id\", visible: false },\r\n { dataField: \"name\", caption: \"Tab Name\" },\r\n ],\r\n height: 165,\r\n selection: {\r\n mode: 'multiple',\r\n showCheckBoxesMode: 'always'\r\n },\r\n selectedRowKeys: workbookViewModel.tabs().map(x => x.id),\r\n showBorders: true,\r\n paging: {\r\n enabled: false\r\n },\r\n onSelectionChanged: function (e) {\r\n if (workbookViewModel.tabs().length > 0 && e.selectedRowKeys.length !== workbookViewModel.tabs().length) {\r\n copyEmailsCheckBox.option(\"value\", false);\r\n copyEmailsCheckBox.option(\"disabled\", true);\r\n }\r\n else {\r\n copyEmailsCheckBox.option(\"disabled\", false);\r\n }\r\n\r\n if (e.currentSelectedRowKeys.length > 0) {\r\n var selectRows = [];\r\n e.currentSelectedRowKeys.forEach(function (key) {\r\n if (data.tabWidgetDependencies[key]) {\r\n data.tabWidgetDependencies[key].forEach(function (tabId) {\r\n if (selectRows.indexOf(tabId) === -1 && e.selectedRowKeys.indexOf(tabId) === -1) {\r\n selectRows.push(tabId);\r\n }\r\n });\r\n }\r\n });\r\n\r\n if (selectRows.length > 0) {\r\n e.component.selectRows(selectRows, true);\r\n }\r\n }\r\n }\r\n });\r\n tabGrid = divTabs.dxDataGrid(\"instance\");\r\n\r\n template.append(\"\");\r\n template.append(divWorkbookName);\r\n template.append(divSave);\r\n template.append(divCopyEmails);\r\n template.append(\"\");\r\n template.append(divTabs);\r\n\r\n return template;\r\n },\r\n width: 400,\r\n height: 385,\r\n showTitle: true,\r\n title: 'Copy Workbook',\r\n visible: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: false,\r\n onShown: function () {\r\n $(\".dx-overlay-wrapper\").css(\"z-index\", \"1049\");\r\n },\r\n toolbarItems: [{\r\n widget: 'dxButton',\r\n toolbar: 'bottom',\r\n location: 'after',\r\n options: {\r\n text: 'Confirm',\r\n onClick() {\r\n let saveNewCopy = function () {\r\n let updatePage = function (data) {\r\n popup.hide();\r\n document.location.href = data;\r\n };\r\n\r\n updateModel.workbookName = worbookNameTextBox.option(\"value\");\r\n updateModel.copyScheduledEmails = copyEmailsCheckBox.option(\"value\");\r\n updateModel.save = saveCheckBox.option(\"value\");\r\n updateModel.tabs = tabGrid.getSelectedRowKeys();\r\n updateFromServer({},\r\n urlConfigs.tabs + \"copy\",\r\n updateModel,\r\n updatePage,\r\n null);\r\n }\r\n\r\n updateModel.workbookName = worbookNameTextBox.option(\"value\");\r\n if (!updateModel.workbookName || updateModel.workbookName.trim() === \"\") {\r\n bootbox.alert(\"Workbook Name is required\");\r\n return;\r\n }\r\n\r\n updateFromServer({},\r\n urlConfigs.tabs + \"workbookNameUnique\",\r\n updateModel,\r\n function (result) {\r\n if (result) {\r\n saveNewCopy();\r\n }\r\n else {\r\n bootbox.alert(\"Duplicated name, please choose another name\");\r\n }\r\n },\r\n function () { });\r\n },\r\n },\r\n }, {\r\n widget: 'dxButton',\r\n toolbar: 'bottom',\r\n location: 'after',\r\n options: {\r\n text: 'Close',\r\n onClick() {\r\n popup.hide();\r\n },\r\n },\r\n }]\r\n }).dxPopup('instance');\r\n\r\n popup.show();\r\n },\r\n null);\r\n };\r\n\r\n var showDebugSql = function (context: JQuery = undefined) {\r\n if (workbookViewModel.editing() && loggedUser.permissions.viewSQL()) {\r\n let $debugSql = $(\"div.diagnosticSql\", context);\r\n bootbox.dialog({\r\n title: \"Diagnostic SQL\",\r\n message: $debugSql.clone(true).removeClass(\"hidden\"),\r\n show: true,\r\n className: \"dialogWide\",\r\n size: \"xl\"\r\n });\r\n }\r\n };\r\n\r\n var saveWorkbook = function (reloadPage: boolean, callback: Function = null) {\r\n let complete = function (data) {\r\n if (reloadPage || data.reload) {\r\n if (callback) {\r\n callback();\r\n }\r\n\r\n window.location.replace(`${urlConfigs.tabs}Edit/${data.id}?nsl=${(data.isNew ? 'false' : 'true')}`);\r\n return;\r\n }\r\n\r\n irGlobal.updateOutput(data);\r\n if (data.id) {\r\n setUrl(data);\r\n }\r\n if (data.lastSaved) {\r\n var $lastSaved = $(\"#LastSaved\");\r\n $lastSaved.text();\r\n $lastSaved.attr(\"datetime\", data.lastSaved);\r\n updateTimeStamp();\r\n $(\"#TabContainer\").data(\"saved\", \"true\");\r\n }\r\n\r\n //To be applied on the new menu\r\n //$(\"#RevertButton\").removeAttr(\"disabled\").removeClass(\"hidden\");\r\n\r\n if (data.tabs) {\r\n data.tabs.forEach(function (updatedTab) {\r\n let tab = workbookViewModel.tabs().find(function (x) { return x.order === updatedTab.order; });\r\n if (tab) {\r\n tab.id = updatedTab.id;\r\n tab.created = updatedTab.created;\r\n tab.descriptionLastSaved = updatedTab.descriptionLastSaved;\r\n tab.lastSaved = updatedTab.lastSaved;\r\n tab.backgroundColor = updatedTab.backgroundColor;\r\n tab.fontColor = updatedTab.fontColor;\r\n tab.hiddenTab = updatedTab.hiddenTab;\r\n }\r\n });\r\n\r\n refreshTabs();\r\n }\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n updateFromServer({},\r\n urlConfigs.tabs + \"save\",\r\n null,\r\n complete,\r\n null);\r\n };\r\n\r\n function updateTimeStamp() {\r\n var $lastSaved = $(\"#LastSaved\");\r\n // Update the text with the elapsed time:\r\n var lastDate = $lastSaved.attr(\"datetime\");\r\n if (lastDate) {\r\n var timeAgo = ($ as any).timeago(lastDate);\r\n $lastSaved.text(timeAgo);\r\n }\r\n }\r\n\r\n var setupDesigner = function () {\r\n let callback = function (data) {\r\n reportDesigner.setup(null, data.designer, data.schema, false);\r\n };\r\n updateFromServer({},\r\n urlConfigs.designer + \"EditTab\",\r\n {},\r\n callback,\r\n null);\r\n };\r\n\r\n var jsonResult = null;\r\n var getTabPageHeader = function () {\r\n let context = parentContext();\r\n let tabPageHeader = $(\"div#TabPageHeader\", context);\r\n return tabPageHeader;\r\n }\r\n var getDxTabPanel = function () {\r\n let tabPageHeader = getTabPageHeader();\r\n return tabPageHeader.dxTabPanel(\"instance\");\r\n };\r\n var createTab = function () {\r\n let context = parentContext();\r\n let tabPageHeader = getTabPageHeader();\r\n let selectedIndex = 0;\r\n let tabPanelItems = [];\r\n let detailingTab = null;\r\n if (jsonResult) {\r\n detailingTab = jsonResult.tabs.find(function (x) { return x.detailingTab; });\r\n }\r\n\r\n jsonResult = tabPageHeader.data(\"json\");\r\n if (detailingTab) {\r\n let tab = jsonResult.tabs.find(function (x) { return x.id === detailingTab.id; })\r\n if (tab) {\r\n tab.detailingTab = true;\r\n }\r\n }\r\n\r\n jsonResult.tabs.sort(function (a, b) {\r\n return a.order - b.order;\r\n });\r\n\r\n jsonResult.tabs.forEach(function (x) {\r\n if (x.id === jsonResult.activeTabId) {\r\n selectedIndex = jsonResult.tabs.indexOf(x);\r\n }\r\n\r\n tabPanelItems.push({\r\n //id: x.id,\r\n tag: x,\r\n get id() {\r\n return this.tag.id;\r\n },\r\n });\r\n });\r\n\r\n workbookViewModel.tabs(jsonResult.tabs);\r\n\r\n let edit = context.data(\"edit\") === \"True\" ? true : false;\r\n let tabPanel = tabPageHeader.dxTabPanel({\r\n height: workbookViewModel.tabs().length > 0 ? 26 : 0,\r\n width: \"100%\",\r\n dataSource: tabPanelItems,\r\n selectedIndex: selectedIndex,\r\n scrollByContent: false,\r\n showNavButtons: true,\r\n loop: false,\r\n animationEnabled: false,\r\n swipeEnabled: false,\r\n keyExpr: \"id\",\r\n noDataText: \" \",\r\n\r\n itemTitleTemplate: function (itemData, itemIndex, itemElement) {\r\n let tabElement = itemElement.closest(\".dx-item.dx-tab\");\r\n let defaultTabId = jsonResult.defaultTabId === itemData.id ? '' : 'hidden';\r\n let activeTab = jsonResult.activeTabId === itemData.id;\r\n let persisted = itemData.tag.lastSaved === null || itemData.tag.lastSaved === undefined ? \"notpersisted\" : \"persisted\";\r\n $(\"\").text(itemData.tag.name).css(\"visibility\", \"hidden\").css(\"margin-left\", \"25px\").css(\"margin-right\", defaultTabId === '' ? \"40px\" : \"25px\").appendTo(itemElement);\r\n\r\n let link = $(`\r\n\r\n
\r\n\r\n ${itemData.tag.icon}\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n star\r\n\r\n
\r\n\r\n
`).appendTo(itemElement);\r\n\r\n link.attr(\"data-backgroundcolor\", itemData.tag.backgroundColor);\r\n link.attr(\"data-fontcolor\", itemData.tag.fontColor);\r\n link.attr(\"data-hiddentab\", itemData.tag.hiddenTab);\r\n link.attr(\"data-variable\", itemData.tag.variable);\r\n if (itemData.tag.backgroundColor) {\r\n tabElement.css(\"background-color\", itemData.tag.backgroundColor);\r\n }\r\n if (itemData.tag.fontColor) {\r\n link.css(\"color\", itemData.tag.fontColor);\r\n $(\".tab-icon\", link).css(\"color\", itemData.tag.fontColor);\r\n }\r\n\r\n if (workbookViewModel.editing() && (!jsonResult.viewOnly || loggedUser.permissions.workbooks()))\r\n $(\"
\" +\r\n \"\" +\r\n \"\" +\r\n \"\" +\r\n \"
\").appendTo(itemElement);\r\n\r\n if (!workbookViewModel.editing() && itemData.tag.hiddenTab && !itemData.tag.detailingTab) {\r\n itemElement.parent().css(\"display\", \"none\");\r\n }\r\n }\r\n }).dxTabPanel(\"instance\");\r\n\r\n tabPageHeader.dxSortable({\r\n moveItemOnDrop: true,\r\n filter: \".dx-tab\",\r\n itemOrientation: \"horizontal\",\r\n dragDirection: \"horizontal\",\r\n onReorder: function (e) {\r\n var tabPanelItems = tabPanel.option(\"dataSource\") as [];\r\n var itemData = tabPanelItems.splice(e.fromIndex, 1)[0];\r\n\r\n tabPanelItems.splice(e.toIndex, 0, itemData);\r\n\r\n if (e.fromIndex === tabPanel.option(\"selectedIndex\")) {\r\n tabPanel.option(\"onContentReady\", function () {\r\n tabPanel.beginUpdate();\r\n tabPanel.option(\"selectedIndex\", undefined);\r\n tabPanel.option(\"selectedIndex\", e.toIndex);\r\n tabPanel.option(\"onContentReady\", null);\r\n tabPanel.endUpdate();\r\n });\r\n }\r\n tabPanel.option(\"dataSource\", tabPanelItems);\r\n\r\n let tabs = [];\r\n let newOrder = 1;\r\n tabPanelItems.forEach(function (item: any) {\r\n tabs.push(item.id);\r\n let tabOrder = workbookViewModel.tabs().find(function (x) { return x.id === item.id; });\r\n if (tabOrder) {\r\n tabOrder.order = newOrder;\r\n }\r\n newOrder++;\r\n });\r\n\r\n workbookViewModel.tabs().sort(function (a, b) {\r\n return a.order - b.order;\r\n });\r\n\r\n let onComplete = function (data) {\r\n refreshTabs();\r\n updateWorkbookReportList(data);\r\n updateWorkbookDashboardList(data);\r\n }\r\n\r\n updateFromServer(null,\r\n urlConfigs.tabs + \"SaveTabsOrder\",\r\n { tabs: tabs, workbookId: parentContext().data(\"workbookid\") },\r\n onComplete,\r\n null);\r\n }\r\n });\r\n\r\n let positionScrollTab = context.attr(\"scrollTab\");\r\n let divSelectedTab = $(\".dx-item.dx-tab.dx-tab-selected\", tabPageHeader);\r\n if (positionScrollTab === undefined) {\r\n if (divSelectedTab.length > 0) {\r\n $(\".dx-item.dx-tab.dx-tab-selected\", tabPageHeader).get(0).scrollIntoView(false);\r\n }\r\n }\r\n else {\r\n let scrollableContainer = $(\".dx-scrollable-container\", tabPageHeader).get(0);\r\n if (scrollableContainer) {\r\n scrollableContainer.scrollLeft = parseInt(positionScrollTab, 10);\r\n }\r\n }\r\n\r\n /*Overwrite tab changed event to use the 'changeActiveTab' function*/\r\n var tabs = (tabPanel as any)._tabs;\r\n tabs._forcePointerDownFocus = function () { };\r\n tabs._itemClickHandler = function () { };\r\n /******/\r\n\r\n createTabEvents();\r\n updateVisibilityOptionsTabs();\r\n updateIconDefaultTab();\r\n };\r\n\r\n var createTabEvents = function () {\r\n let tabPageHeader = getTabPageHeader();\r\n $(\"span.removeTab\", tabPageHeader).off(\"click\", removeTab).on(\"click\", removeTab);\r\n $('a[data-toggle=\"tab\"]', tabPageHeader).off(\"show.bs.tab\", changeActiveTab).on(\"show.bs.tab\", changeActiveTab);\r\n };\r\n\r\n var updatePropertiesTabs = function (tabs) {\r\n let newTabs = tabs || [];\r\n newTabs.forEach(function (newTab) {\r\n let tab = workbookViewModel.tabs().find(function (x) { return x.id === newTab.id; });\r\n if (tab) {\r\n tab.icon = newTab.icon;\r\n }\r\n });\r\n\r\n refreshTabs();\r\n }\r\n\r\n var mappingViewModel = null;\r\n\r\n var setupMappingsPopup = function () {\r\n let sucessCallback = function (data) {\r\n mappingViewModel = {\r\n popoverOptions: {\r\n title: \"Mapping selection\",\r\n showTitle: true,\r\n position: \"right\",\r\n width: 300,\r\n },\r\n listOptions: {\r\n dataSource: data,\r\n height: \"100%\",\r\n itemTemplate: function (data, index) {\r\n\r\n let result = $(`\r\n
\r\n${data.displayName}\r\n
\r\n`);\r\n\r\n return result;\r\n },\r\n onItemClick: function (e) {\r\n $(\"#popover-mappings\").dxPopover(\"instance\").hide();\r\n goToURL(urlConfigs.tabs + \"new/\" + e.itemData.id, \"create a new workbook\");\r\n },\r\n },\r\n };\r\n $(\"#mappingsListSelection\").dxList(mappingViewModel.listOptions);\r\n $(\"#popover-mappings\").dxPopover(mappingViewModel.popoverOptions);\r\n showMappingPopup();\r\n };\r\n irGlobal.updateFromServer({}, urlConfigs.tabs + \"GetMappings\", {}, sucessCallback, null, true, \"POST\", true);\r\n };\r\n\r\n var openMappingsPopup = function () {\r\n if (!mappingViewModel) {\r\n setupMappingsPopup();\r\n }\r\n else {\r\n showMappingPopup();\r\n }\r\n };\r\n\r\n var showMappingPopup = function () {\r\n let target = $(\"#drawer .dx-icon-add\").parent().parent();\r\n $(\"#popover-mappings\").dxPopover(\"instance\").show(target);\r\n }\r\n\r\n var companiesViewModel = null;\r\n var setupCompaniesPopup = function (fromHome = false) {\r\n const mappingId = parentContext().data(\"mappingid\");\r\n let sucessCallback = function (data) {\r\n companiesViewModel = {\r\n popoverOptions: {\r\n title: \"Company selection\",\r\n showTitle: true,\r\n position: \"right\",\r\n width: 300,\r\n },\r\n listOptions: {\r\n dataSource: data,\r\n height: \"100%\",\r\n itemTemplate: function (data, index) {\r\n\r\n let result = $(`\r\n
\r\n${data.company_name}\r\n
\r\n`);\r\n\r\n return result;\r\n },\r\n onItemClick: function (e) {\r\n $(\"#popover-userCompanies\").dxPopover(\"instance\").hide();\r\n let workbookId = parentContext().data(\"workbookid\");\r\n\r\n homeButtonClicked = true;\r\n let url = fromHome\r\n ? `${urlConfigs.siteRoot}home/home/?companyId=${e.itemData.company_id}`\r\n : `${urlConfigs.tabs}edit/${workbookId}?companyId=${e.itemData.company_id}`;\r\n let shared = jsonResult ? jsonResult.viewOnly : false;\r\n let emptyWorkbook = workbookId < 0 ? workbookViewModel.tabs().length === 0 : false;\r\n if (loggedUser.permissions.workbooks()) {\r\n shared = false;\r\n }\r\n\r\n if (!shared && !emptyWorkbook) {\r\n let pendingChanges = workbookHasPendingChanges();\r\n if (pendingChanges && workbookViewModel.editing()) {\r\n irGlobal.showYesNoMessage(\"All your changes will be lost. Make sure you save before changing Companies. Do you want to proceed?\", function (result) {\r\n if (result) {\r\n document.location.href = url;\r\n homeButtonClicked = false;\r\n }\r\n });\r\n }\r\n else {\r\n document.location.href = url;\r\n homeButtonClicked = false;\r\n }\r\n } else {\r\n document.location.href = url;\r\n homeButtonClicked = false;\r\n }\r\n },\r\n },\r\n };\r\n $(\"#userCompaniesListSelection\").dxList(companiesViewModel.listOptions);\r\n $(\"#popover-userCompanies\").dxPopover(companiesViewModel.popoverOptions);\r\n showCompaniesPopup();\r\n };\r\n irGlobal.updateFromServer({}, urlConfigs.tabs + `GetUserCompanies/?mappingId=${mappingId}`, {}, sucessCallback, null, true, \"POST\", true);\r\n }\r\n var openCompaniesPopup = function (fromHome = false) {\r\n if (!companiesViewModel) {\r\n setupCompaniesPopup(fromHome);\r\n }\r\n else {\r\n showCompaniesPopup();\r\n }\r\n };\r\n\r\n var showCompaniesPopup = function () {\r\n let target = $(\"#drawer .changeCompanyIcon\").parent().parent();\r\n $(\"#popover-userCompanies\").dxPopover(\"instance\").show(target);\r\n }\r\n\r\n var getAndDrawMenu = function (callback: Function) {\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.tabs + \"GetWorkbooks\",\r\n {},\r\n function (data) {\r\n if (!data.editMode && !loggedUser.permissions.workbooks()) {\r\n workbookViewModel.editing(false);\r\n }\r\n\r\n drawMenu(data);\r\n if (callback) {\r\n callback();\r\n }\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n };\r\n\r\n var getMenuTabList = function (data) {\r\n let list = [\r\n {\r\n id: 1, name: \"Home\", icon: \"home\", type: \"Action\", path: \"Menu_Home\", group: \"main\",\r\n onClick: function (e) {\r\n goToURL(urlConfigs.siteRoot + \"home/home\", \"the home page\");\r\n }\r\n },\r\n {\r\n id: 5, name: \"Create New Workbook\", icon: \"add createNewWorkbook\", type: \"Action\", path: \"Menu_NewWorkbook\", group: \"main\",\r\n visible: loggedUser.permissions.createWorkbooks() || loggedUser.permissions.workbooks(),\r\n onClick: function (e) {\r\n openMappingsPopup();\r\n }\r\n },\r\n {\r\n id: 6, name: \"Formatting Rules\", icon: \"fill\", type: \"Action\", path: \"Menu_FormattingRules\",\r\n visible: (data.editMode || loggedUser.permissions.workbooks()) && (loggedUser.permissions.editFormattingRules() || loggedUser.permissions.formattingRules()),\r\n onClick: function (e) {\r\n formattingRule.openEditor(true);\r\n }\r\n },\r\n {\r\n id: 11, name: \"PDF Templates\", icon: \"verticalaligntop\", type: \"Action\", path: \"Menu_PdfTemplates\",\r\n visible: (data.editMode || loggedUser.permissions.workbooks()) && (loggedUser.permissions.editPDFTemplates() || loggedUser.permissions.pdfTemplates()),\r\n onClick: function (e) {\r\n pdfTemplatesService.openEditor();\r\n }\r\n },\r\n {\r\n id: 11, name: \"Emails Management\", icon: \"email\", type: \"Action\", path: \"Menu_EmailsManagement\",\r\n visible: loggedUser.permissions.emailsManagement(),\r\n onClick: function (e) {\r\n scheduledEmail.openEmailsManagement();\r\n }\r\n },\r\n {\r\n id: 12, name: \"Email Logs\", icon: \"description\", type: \"Action\", path: \"Menu_EmailLogs\",\r\n visible: loggedUser.permissions.emailsManagement(),\r\n onClick: function (e) {\r\n emailLogs.open();\r\n }\r\n }\r\n ];\r\n\r\n return list;\r\n };\r\n var getWorkbookTabList = function (data, workbookId) {\r\n let tabId = parseInt(getActiveTab().attr(\"id\"), 10);\r\n\r\n let list = [\r\n {\r\n id: 100, name: workbookViewModel.editing() ? \"View Mode\" : \"Edit Mode\", iconType: \"glyphicon\", icon: workbookViewModel.editing() ? \"glyphicon-eye-open\" : \"glyphicon-pencil\",\r\n type: \"Action\", path: \"Workbook_EditMode\", group: \"workbook\", visible: data.editMode || loggedUser.permissions.workbooks(), updateMenuList: true,\r\n onClick: function (e) {\r\n $(\"div.tabName.wrapper\", \"#TabContainer\").each(function () {\r\n if (($(this) as any).popover) {\r\n ($(this) as any).popover(\"hide\");\r\n }\r\n });\r\n\r\n let changeWorkbookEditMode = function () {\r\n let itemListElement = $(\"#drawer .dx-item div[data-id=100]\");\r\n const iconElement = $(\".glyphicon\", itemListElement);\r\n if (workbookViewModel.editing()) {\r\n iconElement.removeClass(\"glyphicon-eye-open\");\r\n iconElement.addClass(\"glyphicon-pencil\");\r\n iconElement.parent().html(iconElement.parent().html().replace(\"View Mode\", \"Edit Mode\"));\r\n }\r\n else {\r\n iconElement.removeClass(\"glyphicon-pencil\");\r\n iconElement.addClass(\"glyphicon-eye-open\");\r\n iconElement.parent().html(iconElement.parent().html().replace(\"Edit Mode\", \"View Mode\"));\r\n }\r\n workbookViewModel.editing(!workbookViewModel.editing());\r\n\r\n if (!workbookViewModel.editing() && getActiveTab().data(\"tabtype\") === TabTypeStrEnum.Dashboard) {\r\n dashboard.disableEditMode();\r\n }\r\n\r\n irGlobal.updateFromServer(null,\r\n urlConfigs.tabs + \"UpdateWorkbookSettings\",\r\n { workbookId: workbookId, editing: workbookViewModel.editing() },\r\n null,\r\n null,\r\n true,\r\n \"POST\",\r\n false);\r\n refreshTabs();\r\n\r\n let tabId = parseInt(getActiveTab().attr(\"id\"), 10);\r\n let activeTab = workbookViewModel.tabs().find(function (x) { return x.id === tabId; });\r\n if (!workbookViewModel.editing() && activeTab && activeTab.hiddenTab) {\r\n let tab = workbookViewModel.tabs().find(function (x) { return !x.hiddenTab; });\r\n if (tab) {\r\n openTab(tab.id);\r\n }\r\n else {\r\n //Reload page\r\n window.location.replace(urlConfigs.tabs + \"Edit/\" + workbookId);\r\n }\r\n }\r\n };\r\n\r\n if (workbookHasPendingChanges() && workbookViewModel.editing()) {\r\n let settings = {\r\n message: `You have pending changes to your workbook, do you wish to save it?`,\r\n size: 'large',\r\n buttons: {\r\n yes: {\r\n label: `Yes`,\r\n callback: function () {\r\n saveWorkbook(!data.persisted, function () { \r\n changeWorkbookEditMode();\r\n });\r\n },\r\n visible: false\r\n },\r\n no: {\r\n label: \"No\",\r\n callback: function () {\r\n changeWorkbookEditMode();\r\n }\r\n },\r\n cancel: {\r\n label: \"Cancel\",\r\n callback: function () { }\r\n }\r\n }\r\n };\r\n\r\n bootbox.dialog(settings);\r\n }\r\n else {\r\n changeWorkbookEditMode();\r\n }\r\n }\r\n },\r\n {\r\n id: 1, name: \"Save\", icon: \"save\", type: \"Action\", path: \"Workbook_Save\", group: \"workbook\",\r\n visible: data.editMode || loggedUser.permissions.workbooks(), onClick: function (e) {\r\n saveWorkbook(!data.persisted);\r\n }\r\n },\r\n {\r\n id: 3, name: \"Set as Default Workbook\", icon: jsonResult.defaultWorkbook ? \"star-fill\" : \"star\", iconType: \"bi\", type: \"Action\", path: \"Workbook_SetDefault\", group: \"workbook\",\r\n visible: data.persisted, onClick: function (e) { setAsDefaultWorkbook(); }\r\n },\r\n {\r\n id: 7, name: \"Set as Default Tab\", icon: jsonResult.defaultTabId === tabId ? \"star-fill\" : \"star\", iconType: \"bi\", type: \"Action\", path: \"Workbook_SetDefaultTab\", group: \"workbook\",\r\n visible: data.persisted && data.editMode /*&& workbookViewModel.tabs().length > 1*/, onClick: function (e) { setAsDefaultTab(getActiveTab()) }\r\n },\r\n {\r\n id: 4, name: \"Create a Copy\", icon: \"copy\", type: \"Action\", path: \"Workbook_SaveCopy\", group: \"workbook\",\r\n visible: data.persisted && (loggedUser.permissions.workbooks() || loggedUser.permissions.createWorkbooks()), onClick: function (e) { saveCopyButton(); }\r\n },\r\n {\r\n id: 2, name: \"Share\", icon: \"share\", type: \"Action\", path: \"Workbook_Share\", group: \"workbook\",\r\n visible: data.persisted && (data.editMode || loggedUser.permissions.workbooks()) && (data.owner || loggedUser.permissions.workbooks()),\r\n onClick: function (e) {\r\n showOptionsPopup(workbookId);\r\n }\r\n },\r\n {\r\n id: 5, name: \"Undo Changes\", icon: \"undo\", type: \"URL\", path: `${urlConfigs.tabs}UndoChanges/${workbookId}`, group: \"workbook\",\r\n visible: data.persisted && (data.editMode || loggedUser.permissions.workbooks())\r\n },\r\n {\r\n id: 6, name: \"SQL\", icon: \"codeblock\", type: \"Action\", path: \"Workbook_SQL\", group: \"workbook\",\r\n visible: workbookViewModel.editing() && data.enableViewSql && loggedUser.permissions.viewSQL(),\r\n onClick: function (e) {\r\n showDebugSql();\r\n }\r\n },\r\n {\r\n id: 9, name: \"Scheduled Emails\", icon: \"email\", type: \"Action\", path: \"Workbook_Emails\", group: \"workbook\",\r\n visible: data.persisted && (data.editMode || loggedUser.permissions.workbooks()) && loggedUser.permissions.scheduleEmails(),\r\n onClick: function (e) {\r\n scheduledEmail.openEmailsPopup();\r\n }\r\n },\r\n {\r\n id: 10, name: \"Information\", icon: \"info\", type: \"Action\", path: \"Workbook_Information\", group: \"workbook\",\r\n onClick: function (e) {\r\n const mappingName = $(\"#TabContainer\").data(\"mappingname\");\r\n const mappingDescription = $(\"#TabContainer\").data(\"mappingdescription\");\r\n const workbookDescription = $(\"#TabContainer\").data(\"workbookdescription\");\r\n const workbookCategory = $(\"#TabContainer\").data(\"workbookcategory\");\r\n const lastCompanySaved = $(\"#TabContainer\").data(\"lastcompanysaved\");\r\n\r\n let popup = $(\"#workbookInformation\").dxPopup({\r\n contentTemplate: `\r\n
\r\n
\r\n Workbook: \r\n
\r\n
\r\n
\r\n Workbook Description: \r\n ${workbookDescription}\r\n
\r\n
\r\n Workbook Category: \r\n ${workbookCategory}\r\n
\r\n
\r\n Mapping: \r\n ${mappingName}\r\n
\r\n
\r\n Mapping Description: \r\n ${mappingDescription}\r\n
\r\n ${(data.enableMultiTenant ? `
\r\n Last Company Sync: \r\n ${lastCompanySaved}\r\n
` : \"\")}\r\n
`,\r\n width: 700,\r\n height: 300,\r\n showTitle: true,\r\n title: \"Information\",\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: function (e) {\r\n return true;\r\n },\r\n showCloseButton: true,\r\n shadingColor: \"transparent\",\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n },\r\n onShowing: function (e) {\r\n $(\"#workbookInformationContent-save\", \"#workbookInformationContent\").html($(\"#LastSavedContainer\").closest(\"li\").html());\r\n },\r\n onHidden: function (e) {\r\n $(\"#workbookInformationContent-save\", \"#workbookInformationContent\").empty();\r\n }\r\n }).dxPopup(\"instance\");\r\n popup.show();\r\n }\r\n },\r\n {\r\n id: 10, name: \"User Stats\", icon: \"user\", type: \"Action\", path: \"Workbook_Stats\", group: \"workbook\",\r\n visible: data.persisted && (data.editMode || loggedUser.permissions.workbooks()), onClick: function (e) {\r\n irGlobal.updateFromServer({}, urlConfigs.tabs + \"GetWorkbookUserStats\", {}, function (rData) {\r\n let popup = $(\"#workbookInformation\").dxPopup({\r\n contentTemplate() {\r\n const gridView = $('
');\r\n gridView.dxDataGrid({\r\n dataSource: rData.dataSource,\r\n columns: [\r\n { dataField: \"userId\", caption: \"User Id\", width: 80 },\r\n { dataField: \"userName\", caption: \"User Name\" },\r\n { dataField: \"counter\", caption: \"Counter\", width: 80 },\r\n { dataField: \"lastAccess\", dataType: \"datetime\", caption: \"Last Access\", calculateSortValue: \"lastAccessId\", sortOrder: 'desc', width: 150 }\r\n ]\r\n });\r\n return gridView;\r\n },\r\n width: 700,\r\n height: 300,\r\n showTitle: true,\r\n title: \"User Stats\",\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: function (e) {\r\n return true;\r\n },\r\n showCloseButton: true,\r\n shadingColor: \"transparent\",\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n }\r\n }).dxPopup(\"instance\");\r\n popup.show();\r\n }, null, true, \"POST\", true, undefined, undefined, false);\r\n }\r\n },\r\n {\r\n id: 132, name: \"Workbook Copies\", icon: \"columnchooser\", type: \"Action\", path: \"Workbook_Copies\", group: \"workbook\",\r\n visible: data.persisted, onClick: function (e) {\r\n workbookCopies.show(workbookId);\r\n }\r\n }\r\n ];\r\n\r\n return list;\r\n };\r\n \r\n\r\n var drawMenu = function (data) {\r\n createTab();\r\n\r\n let workbooks = data.workbooks;\r\n let workbookId = parentContext().data(\"workbookid\");\r\n let selectedWorkbook = workbooks.find(x => x.id === workbookId);\r\n let enableMultiTenant = data.enableMultiTenant;\r\n var getAllMenuList = function (): any[] {\r\n let menuList = [];\r\n if (enableMultiTenant) {\r\n menuList.push({\r\n nogroup: true,\r\n key: data.company.name,\r\n id: data.company.id,\r\n icon: \"tags changeCompanyIcon\",\r\n type: \"Action\",\r\n path: \"Menu_Company\",\r\n click: function () {\r\n openCompaniesPopup();\r\n }\r\n });\r\n }\r\n menuList.push({\r\n key: \"Menu\",\r\n id: \"Menu\",\r\n icon: \"contentlayout\",\r\n items: getMenuTabList(data)\r\n });\r\n menuList.push({\r\n key: selectedWorkbook ? selectedWorkbook.name : \"New Workbook\",\r\n id: \"WorkbookName\",\r\n icon: \"square\",\r\n items: getWorkbookTabList(data, workbookId)\r\n });\r\n menuList.push({\r\n key: \"Workbooks\",\r\n id: \"Workbooks\",\r\n icon: \"bulletlist\",\r\n items: workbooks\r\n });\r\n return menuList;\r\n }\r\n\r\n //if it is a mobile device or small screen\r\n let mobileDevice = window.outerWidth <= 1024 && false;\r\n\r\n const drawer = $(\"#drawer\").dxDrawer({\r\n revealMode: \"slide\",\r\n //overlap if it is a mobile device or small screen\r\n openedStateMode: !mobileDevice ? \"shrink\" : \"overlap\",\r\n opened: true,\r\n template: function (e) {\r\n var $template = $(`
`);\r\n $(\".list\", $template).dxList({\r\n dataSource: getAllMenuList(),\r\n itemTemplate: function (e) {\r\n let iconName = e.iconType === \"bi\" ? `bi-${e.icon}` : e.iconType === \"glyphicon\" ? `glyphicon ${e.icon}` : `dx-icon-${e.icon}`\r\n let icon = e.icon ? ` ` : \"\";\r\n let title = \"Shared Workbook\";\r\n if (e.editMode !== undefined && e.editMode !== 1) {\r\n title = `${loggedUser.permissions.workbooks() ? \"\" : \"View Only \"}Owner: ${e.ownerUserName}`;\r\n title += ` Email: ${e.ownerEmail}`;\r\n }\r\n\r\n let sharedIcon = e.editMode !== undefined && e.editMode !== 1 ? ` ` : \"\";\r\n let workbookClass = \"\";\r\n //if workbook, type is undefined\r\n if (!e.type) {\r\n workbookClass = \"workbook-menu\";\r\n workbookClass += (selectedWorkbook && e.id === selectedWorkbook.id ? \" selected\" : \"\");\r\n if (sharedIcon && !loggedUser.permissions.workbooks()) {\r\n workbookClass += \" shared-workbook\";\r\n }\r\n\r\n if (loggedUser.permissions.workbooks() && e.editMode !== undefined && e.editMode !== 1) {\r\n workbookClass += \" other-owner-workbook\";\r\n }\r\n }\r\n return $(`
${icon}${e.name}${sharedIcon}
`);\r\n },\r\n width: 200,\r\n height: \"100%\",\r\n elementAttr: { class: \"dx-theme-accent-as-background-color\" },\r\n selectionMode: \"none\", //\"single\",\r\n //searchEnabled: true,\r\n searchExpr: [\"name\", \"items.name\"],\r\n displayExpr: \"name\",\r\n grouped: true,\r\n collapsibleGroups: true,\r\n onSelectionChanged: function (e) {\r\n },\r\n onItemClick: function (e) {\r\n if (!e.itemData.type) {\r\n if (!selectedWorkbook || selectedWorkbook.id !== e.itemData.id) {\r\n let url = urlConfigs.tabs + \"open/\" + e.itemData.id;\r\n let loadUrl = function () { document.location = url; };\r\n if (enableMultiTenant) {\r\n irGlobal.updateFromServer(null,\r\n urlConfigs.tabs + \"GetDifWorkbookCompanyFromCache\",\r\n { workbookId: e.itemData.id },\r\n function (result) {\r\n if (result.cached) {\r\n let settings = {\r\n message: `The actual company will be changed to '${result.companyName}' to open the workbook '${result.workbookName}'`,\r\n size: 'large',\r\n buttons: {\r\n save: {\r\n label: `Save the workbook and keep the '${result.currentCompanyName}' company`,\r\n callback: function () {\r\n updateFromServer(null,\r\n urlConfigs.tabs + \"SaveDifWorkbookCompanyFromCache\",\r\n { workbookId: e.itemData.id },\r\n function () { loadUrl(); },\r\n function () { });\r\n },\r\n visible: false\r\n },\r\n ok: {\r\n label: \"OK\",\r\n callback: function () {\r\n url += `?companyId=${result.companyId}`;\r\n loadUrl();\r\n }\r\n },\r\n cancel: {\r\n label: \"Cancel\",\r\n callback: function () { }\r\n }\r\n }\r\n };\r\n if (!workbookHasPendingChanges() || !workbookViewModel.editing()) {\r\n delete settings.buttons.save;\r\n }\r\n bootbox.dialog(settings);\r\n }\r\n else {\r\n goToURL(url, e.itemData.name);\r\n }\r\n },\r\n function () {\r\n goToURL(url, e.itemData.name);\r\n },\r\n true,\r\n \"POST\",\r\n true,\r\n undefined,\r\n undefined,\r\n false\r\n );\r\n }\r\n else {\r\n goToURL(url, e.itemData.name);\r\n }\r\n }\r\n }\r\n else if (e.itemData.type === \"URL\") {\r\n document.location = e.itemData.path;\r\n }\r\n\r\n if (e.itemData.updateMenuList) {\r\n e.component.option(\"dataSource\", getAllMenuList());\r\n }\r\n\r\n //auto hide if it is a mobile device or small screen\r\n if (mobileDevice)\r\n drawer.hide();\r\n },\r\n groupTemplate: function (data) {\r\n let sharedWorkbookIcon = \"\";\r\n let otherOwners = \"\";\r\n if (data.id === \"Workbooks\") {\r\n if (loggedUser.permissions.workbooks()) {\r\n let otherOwnersIcon = \"glyphicon-eye-close\";\r\n let otherOwnersTitle = \"Hide Other Owners\";\r\n if (!jsonResult.showOtherOwnersWorkbooks) {\r\n otherOwnersIcon = \"glyphicon-eye-open\";\r\n otherOwnersTitle = \"Show Other Owners\";\r\n }\r\n\r\n otherOwners = ``;\r\n }\r\n else {\r\n let sharedIcon = \"glyphicon-eye-close\";\r\n let sharedTitle = \"Hide Shared Workbooks\";\r\n if (!jsonResult.showSharedWorkbooks) {\r\n sharedIcon = \"glyphicon-eye-open\";\r\n sharedTitle = \"Show Shared Workbooks\";\r\n }\r\n\r\n sharedWorkbookIcon = ``;\r\n }\r\n }\r\n\r\n let workbookMenuGroupClass = \"workbook-menu-group\";\r\n if (data.path === \"Menu_Company\") {\r\n workbookMenuGroupClass += \" company\";\r\n }\r\n\r\n let groupElement = $(`
${data.key}${sharedWorkbookIcon}${otherOwners}
`);\r\n if (data.nogroup) {\r\n groupElement.click(data.click);\r\n }\r\n return groupElement;\r\n },\r\n onGroupRendered: function (e) {\r\n //if (e.groupData.key === \"Menu\")\r\n // e.component.collapseGroup(e.groupIndex);\r\n\r\n if (!data.editMode && !loggedUser.permissions.workbooks() && e.groupData.id === \"WorkbookName\") {\r\n e.component.collapseGroup(e.groupIndex);\r\n }\r\n },\r\n onContentReady: function (e) {\r\n let noGroups = $(\".workbook-menu-group.ir-list-nogroup\", e.element);\r\n noGroups.each(function (index, element) {\r\n $(element).css(\"width\", \"100%\");\r\n $(element).closest(\".dx-list-group-header\").addClass(\"ir-list-nogroup\");\r\n $(\".dx-list-group-header-indicator\", $(element).closest(\".dx-list-group-header\")).remove();\r\n });\r\n\r\n //***Manipulate shared workbooks\r\n let sharedWorkbooks = $(\".shared-workbook\", e.element).closest(\".dx-item.dx-list-item\");\r\n $(\".bi-eye\", sharedWorkbooks).off(\"click\").on(\"click\", function (ev) {\r\n let email = $(this).attr(\"data-email\");\r\n irGlobal.copyTextToClipboard(email, \"Email copied to clipboard\");\r\n ev.stopPropagation();\r\n });\r\n\r\n let sharedWorkbookButton = $(\".drawer-shared-workbook-button\", e.element);\r\n sharedWorkbooks.addClass(\"drawer-shared-workbook\");\r\n if (sharedWorkbookButton.attr(\"showshared\") === \"true\") {\r\n sharedWorkbooks.removeClass(\"invisible\");\r\n }\r\n else {\r\n sharedWorkbooks.addClass(\"invisible\");\r\n }\r\n sharedWorkbookButton.off(\"click\").on(\"click\", function (ev) {\r\n if ($(this).hasClass(\"glyphicon-eye-open\")) {\r\n $(this).removeClass(\"glyphicon-eye-open\");\r\n $(this).addClass(\"glyphicon-eye-close\");\r\n $(this).attr(\"title\", \"Hide Shared Workbooks\");\r\n }\r\n else {\r\n $(this).addClass(\"glyphicon-eye-open\");\r\n $(this).removeClass(\"glyphicon-eye-close\");\r\n $(this).attr(\"title\", \"Show Shared Workbooks\");\r\n }\r\n let showShared = $(this).attr(\"showshared\") === \"true\" || $(this).attr(\"showshared\") === \"True\" ? \"False\" : \"True\";\r\n $(this).attr(\"showshared\", showShared);\r\n home.saveShowHideWorkbooks(showShared, false, jsonResult.userId);\r\n\r\n if (showShared === \"True\") {\r\n sharedWorkbooks.removeClass(\"invisible\");\r\n }\r\n else {\r\n sharedWorkbooks.addClass(\"invisible\");\r\n }\r\n\r\n ev.stopPropagation();\r\n });\r\n //***\r\n\r\n //***Manipulate other owners\r\n let otherOwnerWorkbooks = $(\".other-owner-workbook\", e.element).closest(\".dx-item.dx-list-item\");\r\n $(\".bi-eye\", otherOwnerWorkbooks).off(\"click\").on(\"click\", function (ev) {\r\n let email = $(this).attr(\"data-email\");\r\n irGlobal.copyTextToClipboard(email, \"Email copied to clipboard\");\r\n ev.stopPropagation();\r\n });\r\n\r\n let otherOwnersButton = $(\".drawer-other-owners-button\", e.element);\r\n otherOwnerWorkbooks.addClass(\"drawer-other-owners-workbook\");\r\n if (otherOwnersButton.attr(\"showotherowners\") === \"true\" || otherOwnersButton.attr(\"showotherowners\") === \"True\") {\r\n otherOwnerWorkbooks.removeClass(\"invisible\");\r\n }\r\n else {\r\n otherOwnerWorkbooks.addClass(\"invisible\");\r\n }\r\n otherOwnersButton.off(\"click\").on(\"click\", function (ev) {\r\n if ($(this).hasClass(\"glyphicon-eye-open\")) {\r\n $(this).removeClass(\"glyphicon-eye-open\");\r\n $(this).addClass(\"glyphicon-eye-close\");\r\n $(this).attr(\"title\", \"Hide Other Owners\");\r\n }\r\n else {\r\n $(this).addClass(\"glyphicon-eye-open\");\r\n $(this).removeClass(\"glyphicon-eye-close\");\r\n $(this).attr(\"title\", \"Show Other Owners\");\r\n }\r\n let showOtherOwners = $(this).attr(\"showotherowners\") === \"true\" || $(this).attr(\"showotherowners\") === \"True\" ? \"False\" : \"True\";\r\n $(this).attr(\"showotherowners\", showOtherOwners);\r\n home.saveShowHideWorkbooks(true, showOtherOwners, jsonResult.userId);\r\n\r\n if (showOtherOwners === \"True\") {\r\n otherOwnerWorkbooks.removeClass(\"invisible\");\r\n }\r\n else {\r\n otherOwnerWorkbooks.addClass(\"invisible\");\r\n }\r\n\r\n ev.stopPropagation();\r\n });\r\n //***\r\n\r\n updateVisibilityOptionsTabs();\r\n }\r\n });\r\n return $template;\r\n },\r\n height: \"100%\",\r\n onOptionChanged: (e) => {\r\n if (e.name === \"opened\") {\r\n setTimeout(dashboard.resizeExpandedWidgets, 500);\r\n }\r\n }\r\n }).dxDrawer(\"instance\");;\r\n\r\n $(\"#toolbar\").dxToolbar({\r\n items: [{\r\n widget: \"dxButton\",\r\n location: \"before\",\r\n options: {\r\n icon: \"menu\",\r\n onClick: function () {\r\n drawer.toggle().then(function () {\r\n var activeTab = getActiveTab();\r\n var activeTabType = activeTab.data(\"tabtype\");\r\n if (activeTabType === TabTypeStrEnum.Dashboard && dashboard)\r\n dashboard.recalculateDashboardZoom();\r\n });\r\n }\r\n }\r\n },\r\n {\r\n location: 'after',\r\n widget: 'dxMenu',\r\n options: {\r\n cssClass: \"homeContent\",\r\n items: [{\r\n name: loggedUser.initials(),\r\n items: [\r\n {\r\n name: loggedUser.name(),\r\n html: 'person',\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Profile: ' + loggedUser.profileName(),\r\n html: 'badge',\r\n },\r\n {\r\n name: 'Organization: ' + loggedUser.organizationName(),\r\n html: 'corporate_fare',\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Interactive Reporting',\r\n html: 'equalizer',\r\n },\r\n {\r\n name: 'Version: ' + irSettings.version,\r\n html: 'info',\r\n },\r\n {\r\n name: 'Date: ' + irSettings.dateVersion,\r\n html: 'description',\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Change Password',\r\n html: 'password',\r\n visible: authenticationMode === \"IR\"\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Logout',\r\n html: 'logout',\r\n },\r\n ],\r\n },],\r\n hideSubmenuOnMouseLeave: false,\r\n displayExpr: 'name',\r\n onItemClick(data) {\r\n switch (data.itemData.name) {\r\n case \"Change Password\":\r\n irGlobal.changePassword();\r\n break;\r\n case \"Logout\":\r\n window.location.href = \"/Login/Logout\";\r\n break;\r\n }\r\n },\r\n },\r\n },],\r\n elementAttr: {\r\n style: \"display: inline; position: absolute; background-color: unset; padding-top: 3px; padding-left: 2px; padding-right: 2px;\"\r\n }\r\n });\r\n\r\n //auto hide if it is a mobile device or small screen\r\n if (mobileDevice)\r\n drawer.hide();\r\n\r\n afterDrawMenu();\r\n }\r\n\r\n var afterDrawMenu = function () {\r\n let activeTab = getActiveTab();\r\n let activeTabType = activeTab.data(\"tabtype\");\r\n\r\n switch (activeTabType) {\r\n case TabTypeStrEnum.Dashboard:\r\n dashboard.setup();\r\n break;\r\n case TabTypeStrEnum.Chart:\r\n case TabTypeStrEnum.Report:\r\n reportView.setup();\r\n break;\r\n case TabTypeStrEnum.ReportDesigner:\r\n case TabTypeStrEnum.ChartDesigner:\r\n setupDesigner();\r\n break;\r\n }\r\n\r\n let context = parentContext();\r\n setupTabActions(context);\r\n filtersManager.setup(context,\r\n \"#WorkbookButtons li.filterList\",\r\n \"#WorkbookButtons li.filterContextContainer\",\r\n afterFilterAdded,\r\n undefined\r\n );\r\n filtersManager.setupMapping(context);\r\n updateVisibilityOptionsTabs();\r\n }\r\n\r\n var goToURL = function (url: string, name: string) {\r\n homeButtonClicked = true;\r\n\r\n let pendingChanges = workbookHasPendingChanges();\r\n if (pendingChanges && workbookViewModel.editing()) {\r\n bootbox.confirm(`Are you sure you want to go to ${name}? You have pending changes to your workbook.`,\r\n function (result) {\r\n if (result) {\r\n document.location.href = url;\r\n homeButtonClicked = false;\r\n }\r\n }\r\n );\r\n } else {\r\n document.location.href = url;\r\n homeButtonClicked = false;\r\n }\r\n }\r\n\r\n var logoutClick = function () {\r\n let context = parentContext();\r\n let inputLogout = $(\"#logout\", context);\r\n let url = inputLogout.data(\"href\");\r\n goToURL(url, \"the login page\");\r\n }\r\n\r\n var updateVisibilityOptionsTabs = function () {\r\n let tabPanel = getDxTabPanel();\r\n if (tabPanel) {\r\n let count = (tabPanel.option(\"dataSource\") as []).length;\r\n let display = count > 1 ? \"block\" : \"none\";\r\n $(\".filterContextContainer\", \"#WorkbookButtons\").css(\"display\", display);\r\n $(`#drawer .dx-item .dx-item-content div[data-id=7][data-group=\"workbook\"]`).closest(\".dx-item\").css(\"display\", display);\r\n getTabPageHeader().css(\"display\", display);\r\n }\r\n }\r\n var updateIconDefaultWorkbook = function (defaultWorkbook: boolean = false) {\r\n let iconDiv = $(`#drawer .dx-item .dx-item-content div[data-id=3][data-group=\"workbook\"] i`);\r\n iconDiv.removeClass();\r\n iconDiv.addClass(defaultWorkbook ? \"bi-star-fill\" : \"bi-star\");\r\n }\r\n var updateIconDefaultTab = function () {\r\n let tabId = parseInt(getActiveTab().attr(\"id\"), 10);\r\n let defaultTab = jsonResult.defaultTabId === tabId;\r\n let iconDiv = $(`#drawer .dx-item .dx-item-content div[data-id=7][data-group=\"workbook\"] i`);\r\n iconDiv.removeClass();\r\n iconDiv.addClass(defaultTab ? \"bi-star-fill\" : \"bi-star\");\r\n }\r\n var showToast = function (message: string = undefined, width: number = 300) {\r\n if (!message || message === \"\") {\r\n return;\r\n }\r\n\r\n DevExpress.ui.notify({\r\n message: message,\r\n type: \"success\",\r\n position: { my: 'right top', at: 'right top', offset: { x: -20, y: 20 } },\r\n width: width\r\n });\r\n };\r\n\r\n var eventsToExecute = [];\r\n var updateFromServer = function (evt, url: string, submitObject, successFunction: Function, failureFunction: Function) {\r\n\r\n let updateServer = function (params) {\r\n submitObject = getBaseSubmitObject(submitObject);\r\n\r\n let newSuccessFunction = function (data) {\r\n\r\n if (params.successFunction) {\r\n params.successFunction(data);\r\n }\r\n\r\n eventsToExecute.shift();\r\n if (eventsToExecute.length > 0) {\r\n updateServer(eventsToExecute[0]);\r\n }\r\n }\r\n\r\n let newFailureFunction = function (data) {\r\n\r\n if (params.failureFunction) {\r\n params.failureFunction(data);\r\n }\r\n\r\n eventsToExecute.shift();\r\n if (eventsToExecute.length > 0) {\r\n updateServer(eventsToExecute[0]);\r\n }\r\n }\r\n\r\n irGlobal.updateFromServer(evt,\r\n params.url,\r\n params.submitObject,\r\n newSuccessFunction,\r\n newFailureFunction,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n\r\n if (eventsToExecute.length === 0) {\r\n eventsToExecute.push({ evt: evt, url: url, submitObject: submitObject, successFunction: successFunction, failureFunction: failureFunction });\r\n updateServer(eventsToExecute[0]);\r\n }\r\n else {\r\n eventsToExecute.push({ evt: evt, url: url, submitObject: submitObject, successFunction: successFunction, failureFunction: failureFunction });\r\n }\r\n }\r\n\r\n var homeButtonClicked = false;\r\n var setup = function () {\r\n workbookViewModel.setup();\r\n\r\n //Check if the workbook is being edited. When creating new tabs and saving the workbook, the page is refreshed\r\n let editing = parentContext().data(\"editing\");\r\n if (editing) {\r\n workbookViewModel.editing(true);\r\n }\r\n parentContext().data(\"editing\", null);\r\n parentContext().removeAttr(\"data-editing\");\r\n\r\n applyWorkbookBinding($(\"#WorkbookButtons ul.addReportDashboard\").get(0));\r\n\r\n irGlobal.setup();\r\n formattingRuleService.setup(function () {\r\n getAndDrawMenu(function () {\r\n let context = parentContext();\r\n let workbookId = context.data(\"workbookid\");\r\n\r\n updateTimeStamp();\r\n setInterval(updateTimeStamp, 60000);\r\n setUrl({ id: workbookId, forceSet: true });\r\n\r\n let edit = context.data(\"edit\") === \"True\" ? true : false;\r\n if (edit || loggedUser.permissions.workbooks()) {\r\n $(\"div#WorkbookNameEdit input\", context).off(\"click\", workbookNameClick).on(\"click\", workbookNameClick);\r\n }\r\n else {\r\n $(\"div#WorkbookNameEdit input\", context).prop('readonly', true);\r\n }\r\n\r\n $(\"#logout\", context).off(\"click\", logoutClick).on(\"click\", logoutClick);\r\n });\r\n });\r\n\r\n //search on top Report button\r\n $(document).ready(function () {\r\n let navbar = ('#WorkbookButtons');\r\n\r\n $(navbar).on('click', '#btnActionReports', function (e) {\r\n let ariaExpanded = $(this).attr('aria-expanded');\r\n if (ariaExpanded == 'false') {\r\n $('.search-for-action').val('');\r\n showAll();\r\n }\r\n })\r\n\r\n $(navbar).on('keyup', '.search-for-action', function (e) {\r\n let text = $(this).val().toString().toLowerCase();\r\n if (text == '') {\r\n showAll();\r\n return;\r\n }\r\n\r\n let ul = $('#ReportSelector');\r\n let type = $(this).data('type');\r\n let lis = $('li[data-type=\"' + type + '\"]', $(ul));\r\n\r\n $(lis).each(function () {\r\n var liText = $(this).data('search').toString().toLowerCase();\r\n\r\n if (liText.indexOf(text) >= 0) {\r\n $(this).show();\r\n }\r\n else {\r\n $(this).hide();\r\n }\r\n });\r\n });\r\n });\r\n\r\n irGlobal.setupChangePassword();\r\n };\r\n\r\n function applyWorkbookBinding(nodeElement) {\r\n ko.applyBindings(workbookViewModel, nodeElement);\r\n }\r\n\r\n function showAll() {\r\n let lis = $('li', $('#ReportSelector'));\r\n $(lis).show();\r\n }\r\n\r\n function refreshTabs() {\r\n let tabPanel = getDxTabPanel();\r\n tabPanel.repaint();\r\n createTabEvents();\r\n }\r\n\r\n return {\r\n applyWorkbookBinding: applyWorkbookBinding,\r\n getBaseSubmitObject: getBaseSubmitObject,\r\n getActiveTab: getActiveTab,\r\n updateTabView: updateTabView,\r\n getTabConfig: getTabConfig,\r\n setupTabActions: setupTabActions,\r\n updateWorkbookReportList: updateWorkbookReportList,\r\n updateWorkbookDashboardList: updateWorkbookDashboardList,\r\n updateReportList: updateReportList,\r\n setup: setup,\r\n renameTab: renameTab,\r\n onInputRenameTab: onInputRenameTab,\r\n setAsDefaultWorkbook: setAsDefaultWorkbook,\r\n setAsDefaultTab: setAsDefaultTab,\r\n openTab: openTab,\r\n getTabList: getTabList,\r\n getTabName: getTabName,\r\n downloadHardcopy: downloadHardcopy,\r\n updatePropertiesTabs: updatePropertiesTabs,\r\n showSharedPopup: showOptionsPopup,\r\n showDebugSql: showDebugSql,\r\n openMappingsPopup: openMappingsPopup,\r\n openCompaniesPopup: openCompaniesPopup,\r\n };\r\n}(jQuery));","//// \r\n\r\nvar filtersManager = (function () {\r\n var getUrl = function (filterContext, action) {\r\n if (!filterContext) irGlobal.showError(true, \"FilterContext Not Set!\");\r\n switch (filterContext) {\r\n case \"Workbook\":\r\n return urlConfigs.tabs + action;\r\n case \"Report\":\r\n return urlConfigs.workBook + action;\r\n case \"Dashboard\":\r\n return urlConfigs.dashboard + action;\r\n case \"Widget\":\r\n return urlConfigs.dashboard + action;\r\n }\r\n return action;\r\n };\r\n var getUrlByTabType = function (action, tabType = undefined) {\r\n if (!tabType) tabType = $(\"div[role='tabpanel'].active\").data(\"tabtype\");\r\n switch (tabType) {\r\n case \"Report\":\r\n case \"ReportDesigner\":\r\n case \"ChartDesigner\":\r\n return urlConfigs.workBook + action;\r\n case \"Dashboard\":\r\n return urlConfigs.dashboard + action;\r\n //needed to handle the 'no tab' condition.\r\n default:\r\n return urlConfigs.workBook + action;\r\n\r\n }\r\n };\r\n\r\n var getFilterContextObject = function (currentFilter) {\r\n var $currentFilter = $(currentFilter);\r\n\r\n return $currentFilter.closest(\"[data-filtercontext]\");\r\n };\r\n\r\n var getFilterContext = function (currentTarget) {\r\n return $(currentTarget).closest(\"[data-filtercontext]\").data(\"filtercontext\");\r\n };\r\n\r\n var clearRemovedFilterList = function () {\r\n\r\n var clear = function (container) {\r\n var filters = $(\"> filter-list > ul > li.filter\", container);\r\n if (!filters)\r\n return;\r\n\r\n $.each(filters,\r\n function (index, filter) {\r\n let vm = ko.dataFor($(\"filter\", filter).get(0));\r\n if (vm) {\r\n if (vm.filter.isDirty()) {\r\n vm.filter.isDirty(false);\r\n }\r\n }\r\n });\r\n }\r\n\r\n let globalFiltersElement = $(\".filterList[data-filtercontext=Workbook]\");\r\n if (globalFiltersElement.length > 0) {\r\n getFilterContextObject(globalFiltersElement).data(\"removedfilters\", null);\r\n clear(globalFiltersElement);\r\n }\r\n\r\n let tabFiltersElement = $(\".filterList[data-filtercontext=Report]\");\r\n if (!tabFiltersElement || tabFiltersElement.length === 0) {\r\n tabFiltersElement = $(\".filterList[data-filtercontext=Dashboard]\");\r\n }\r\n\r\n if (tabFiltersElement.length > 0) {\r\n getFilterContextObject(tabFiltersElement).data(\"removedfilters\", null);\r\n clear(tabFiltersElement);\r\n }\r\n\r\n let widgetFiltersElement = $(\".filterList[data-filtercontext=Widget]\");\r\n if (widgetFiltersElement.length > 0) {\r\n getFilterContextObject(widgetFiltersElement).data(\"removedfilters\", null);\r\n clear(tabFiltersElement);\r\n }\r\n }\r\n\r\n var removeComponentFilter = function (evt, filter) {\r\n evt.stopPropagation();\r\n\r\n let context = getFilterContext(evt.currentTarget);\r\n let filterSelect = $(\"li.filterContextContainer[data-filtercontext=\" + context + \"]\");\r\n let filterElement = $(evt.currentTarget).closest(\".filter\");\r\n var filterContextObj = getFilterContextObject(filterElement);\r\n\r\n let id = filter.id();\r\n let filterName = filter.filterName();\r\n\r\n let fieldId = filter.boundField();\r\n $(`li[data-fieldid='${fieldId}']`, filterSelect).each(function (idx, element) {\r\n $(element).removeClass(\"disabled\");\r\n $(element).removeClass(\"hidden\");\r\n $(element).removeAttr(\"title\");\r\n });\r\n\r\n var removedFilters = filterContextObj.data(\"removedfilters\");\r\n if (!removedFilters) {\r\n removedFilters = [];\r\n }\r\n\r\n removedFilters.push(id);\r\n\r\n filterContextObj.data(\"removedfilters\", removedFilters);\r\n if (filterElement.length > 0) {\r\n filterElement.remove();\r\n }\r\n\r\n updateVisibleFilterAvaliable(true, filterName, filterSelect);\r\n irGlobal.enableUpdateButton(true, updateFiltersChanged);\r\n };\r\n\r\n var openFilterSettings = function (evt) {\r\n evt.stopPropagation();\r\n let currentTarget = $(evt.currentTarget);\r\n let filter = currentTarget.closest(\".filter\");\r\n filter.find(\"div.filter\").addClass(\"hidden\");\r\n\r\n let divPopover = $(\".popover-filter-settings\", filter);\r\n divPopover.toggleClass(\"hidden\");\r\n\r\n divPopover.css(\"right\", \"unset\");\r\n divPopover.css(\"left\", `${currentTarget.offset().left}px`);\r\n\r\n if (!divPopover.hasClass(\"hidden\")) {\r\n if (divPopover.position().left + divPopover.outerWidth() > $(window).width()) {\r\n divPopover.css(\"right\", \"0px\").css(\"left\", \"unset\");\r\n }\r\n }\r\n\r\n hideFiltersClick(evt);\r\n }\r\n\r\n var updateVisibleFilterAvaliable = function (enabled, filterName, context, filterElement = undefined) {\r\n var item = filterElement || $(`li.filter-item-add[data-filtername='${filterName}']`, context);\r\n\r\n if (enabled) {\r\n item.removeClass(\"disabled\");\r\n item.removeClass(\"hidden\");\r\n item.removeAttr(\"title\");\r\n }\r\n else {\r\n item.attr(\"title\", \"Filter already added to current scope\");\r\n item.addClass(\"disabled\");\r\n item.addClass(\"hidden\");\r\n }\r\n }\r\n\r\n var getFilterValues = function (globalFiltersElement = null, tabFiltersElement = null, widgetFiltersElement = null, onlyGetDirtyFilters: boolean = false) {\r\n\r\n if (!globalFiltersElement) {\r\n globalFiltersElement = $(\".filterList[data-filtercontext=Workbook]\");\r\n }\r\n\r\n if (!tabFiltersElement) {\r\n tabFiltersElement = $(\".filterList[data-filtercontext=Report]\");\r\n if (!tabFiltersElement || tabFiltersElement.length === 0) {\r\n tabFiltersElement = $(\".filterList[data-filtercontext=Dashboard]\");\r\n }\r\n }\r\n\r\n if (!widgetFiltersElement) {\r\n widgetFiltersElement = $(\".filterList[data-filtercontext=Widget]\");\r\n }\r\n\r\n /*we need to update the lower level filters to get the new datasource when any higher level filter is changed*/\r\n\r\n let globalFilters = getFilterContainerValues(globalFiltersElement, false, onlyGetDirtyFilters);\r\n let tabFilters = getFilterContainerValues(tabFiltersElement, globalFilters.updatedFilters.length > 0, onlyGetDirtyFilters);\r\n let widgetFilters = getWidgetFilterContainerValues(widgetFiltersElement, tabFilters.updatedFilters.length > 0 || globalFilters.updatedFilters.length > 0, onlyGetDirtyFilters)\r\n\r\n var filterReturn = {\r\n globalFilters: globalFilters,\r\n tabFilters: tabFilters,\r\n widgetFilters: widgetFilters\r\n };\r\n\r\n return filterReturn;\r\n };\r\n\r\n var getWidgetFilterContainerValues = function (widgets, forceUpdateMultiSelectFilter: boolean = false, onlyGetDirtyFilters: boolean = false) {\r\n\r\n var widgetFiltersArr = [];\r\n\r\n $.each(widgets,\r\n function (index, obj) {\r\n var $obj = $(obj);\r\n var widgetFilters = getFilterContainerValues($obj, forceUpdateMultiSelectFilter, onlyGetDirtyFilters);\r\n var currentWidgetId = $obj.closest(\"div.dashboardWidget\").data(\"widgetid\");\r\n if (!currentWidgetId)\r\n currentWidgetId = $(\"div#DashboardDesigner div.dashboardWidget.selected\").data(\"widgetid\");\r\n widgetFilters[\"widgetId\"] = currentWidgetId;\r\n widgetFiltersArr.push(widgetFilters);\r\n\r\n });\r\n return widgetFiltersArr;\r\n\r\n };\r\n\r\n var getFilterContainerValues = function (parentContainer, forceUpdateMultiSelectFilter: boolean = false, onlyGetDirtyFilters: boolean = false) {\r\n\r\n var outJson = { updatedFilters: [], removedfilters: [] };\r\n outJson.removedfilters = parentContainer.data(\"removedfilters\");\r\n\r\n var filters = $(\"> filter-list > ul > li.filter\", parentContainer);\r\n if (!filters)\r\n return outJson;\r\n $.each(filters,\r\n function (index, filter) {\r\n let vm = ko.dataFor($(\"filter\", filter).get(0));\r\n if (vm) {\r\n let filterVM = ko.mapping.toJS(vm);\r\n let isMultiSelect = filterVM.filter.filterEditorType === FilterEditorTypeEnum.AutoComplete ||\r\n filterVM.filter.filterEditorType === FilterEditorTypeEnum.ValuesCombo ||\r\n filterVM.filter.filterEditorType === FilterEditorTypeEnum.MultiSelect;\r\n\r\n if (filterVM.filter.isDirty || (forceUpdateMultiSelectFilter && isMultiSelect)) {\r\n delete filterVM.filter.dataSource;\r\n outJson.updatedFilters.push(filterVM.filter);\r\n\r\n //if (!onlyGetDirtyFilters)\r\n // vm.filter.isDirty(false);\r\n }\r\n }\r\n });\r\n return outJson;\r\n };\r\n\r\n var showComplexFilter = function (evt) {\r\n if ($(evt.target).closest(\"div.filter\").length !== 0) {\r\n return;\r\n }\r\n\r\n if ($(evt.target).closest(\".popover-filter-settings\").length !== 0) {\r\n return;\r\n }\r\n\r\n $(\".popover-filter-settings\", evt.currentTarget).addClass(\"hidden\");\r\n\r\n hideFiltersClick(evt);\r\n adjustOpenFilterPosition(evt);\r\n }\r\n\r\n var adjustOpenFilterPosition = function (evt, changeVisibility = true) {\r\n let currentTarget = $(evt.currentTarget);\r\n if (!currentTarget.hasClass(\"filterEditor\")) {\r\n let divFilterEditor = currentTarget.closest(\"div.filterEditor\");\r\n if (divFilterEditor) {\r\n currentTarget = divFilterEditor;\r\n }\r\n }\r\n\r\n let divFilter = $(evt.currentTarget).closest(\"li.filter\").find(\"div.filter\");\r\n if (divFilter.length === 0) {\r\n return;\r\n }\r\n\r\n if (changeVisibility) {\r\n divFilter.toggleClass(\"hidden\");\r\n }\r\n divFilter.css(\"right\", \"unset\");\r\n\r\n let containerWidth = $(document).width();\r\n let leftAdjustment = 0;\r\n if (currentTarget.closest(\"#tComparisonFilters\").length > 0 && $(\"#designContainer\").data(\"widgetid\") !== undefined) {\r\n containerWidth = $(\"#designContainer\").width();\r\n leftAdjustment = (($(document).width() - containerWidth) / 2 - 50);\r\n }\r\n\r\n let left = currentTarget.offset().left - leftAdjustment;\r\n if (left + divFilter.outerWidth() > containerWidth) {\r\n left -= (left + divFilter.outerWidth() - containerWidth)\r\n }\r\n divFilter.css(\"left\", `${left}px`);\r\n\r\n if (divFilter.closest(\".comparisonFilter-Filters-Item\").length > 0) {\r\n divFilter.css(\"top\", `${(currentTarget.offset().top - divFilter.height())}px`);\r\n }\r\n }\r\n\r\n var addDefaultFilterEvents = function (filterList) {\r\n let filterListJson = $(\"filter-list\", filterList).data(\"json\");\r\n let filterListElement = $(\"filter-list\", filterList).get(0);\r\n if (filterListElement && filterListJson && filterListJson.length > 0) {\r\n let filtersVM = ko.mapping.fromJS(filterListJson);\r\n ko.applyBindings(filtersVM, filterListElement);\r\n $(\"filter-list\", filterList).data(\"json\", null);\r\n }\r\n };\r\n\r\n var filterAddedComplete = function (completeFunction, data, filterList) {\r\n //set Url\r\n if (data.id) {\r\n if ($(\"#TabView\").data(\"workbookid\") !== data.id) {\r\n $(\"#TabView\").data(\"workbookid\", data.id);\r\n history.pushState({}, null, urlConfigs.tabs + \"edit/\" + data.id);\r\n }\r\n }\r\n\r\n if (data.partialViewResult) {\r\n irGlobal.updateOutput(data);\r\n }\r\n\r\n filterList.html(data.filter);\r\n addDefaultFilterEvents(filterList);\r\n\r\n if (data.enableUpdateButton) {\r\n irGlobal.enableUpdateButton(true, updateFiltersChanged);\r\n }\r\n\r\n if (irGlobal.isFunction(completeFunction)) {\r\n completeFunction(data, filterList);\r\n }\r\n };\r\n\r\n var addFilterAction = function (evt, filterSelect, completeFunction, filterList) {\r\n let link = $(evt.currentTarget);\r\n let ul = link.closest(\"ul\");\r\n let item = link.closest(\"li\");\r\n\r\n if (item.hasClass(\"disabled\"))\r\n return;\r\n\r\n let context = getFilterContext(link);\r\n\r\n let selectedFilter = link.data(\"filterid\");\r\n let isMetric = link.data(\"filtermetric\") === true;\r\n\r\n let addCompleteStub = function (data) {\r\n filterAddedComplete(completeFunction, data, filterList);\r\n };\r\n let url = getUrl(context, \"AddFilter\");\r\n let inputJson = { scope: context, addedFilter: isMetric ? 0 : selectedFilter, isMetric: isMetric, addedMetricFilter: isMetric ? selectedFilter : \"\" };\r\n\r\n if (context === \"Widget\") {\r\n inputJson[\"widgetId\"] = $(\"div#DashboardDesigner div.dashboardWidget.selected\").data(\"widgetid\");\r\n }\r\n\r\n item.attr(\"title\", \"Filter already added to current scope\");\r\n item.addClass(\"disabled\");\r\n item.addClass(\"hidden\");\r\n\r\n let fieldId = item.data(\"fieldid\");\r\n $(`li[data-fieldid='${fieldId}']`, ul).each(function (idx, element) {\r\n $(element).addClass(\"hidden\");\r\n $(element).addClass(\"disabled\");\r\n });\r\n\r\n irGlobal.updateFromServer(evt,\r\n url,\r\n inputJson,\r\n addCompleteStub,\r\n null,\r\n true,\r\n \"POST\",\r\n undefined,\r\n undefined,\r\n true);\r\n };\r\n\r\n var updateFiltersChanged = function (evt) {\r\n var url = getUrlByTabType(\"UpdateFilters\");\r\n irGlobal.updateFromServer(evt,\r\n url,\r\n null,\r\n function (data) {\r\n clearRemovedFilterList();\r\n\r\n irGlobal.updateOutput(data);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n };\r\n\r\n var removeFilterErrors = function () {\r\n var filtersWithError = $(\"li.filterList li.filter.filtersNotCombinedRemove\");\r\n (filtersWithError as any).tooltip(\"destroy\");\r\n filtersWithError.removeClass(\"filtersNotCombined\");\r\n filtersWithError.removeClass(\"filtersNotCombinedRemove\");\r\n }\r\n\r\n var handleFilterErrors = function (data = undefined, isWidget = undefined) {\r\n if (!isWidget) {\r\n $(\"li.filterList li.filter.filtersNotCombined\").addClass(\"filtersNotCombinedRemove\");\r\n }\r\n\r\n if (data) {\r\n if (data.errorType == \"FiltersNotCombined\") {\r\n\r\n var idArray = data.errorInfo.split(',');\r\n\r\n for (var i = 0; i < idArray.length; i++) {\r\n var filter = $(`li.filterList li.filter[data-id='${idArray[i]}']`);\r\n if (!filter.hasClass(\"filtersNotCombined\")) {\r\n filter.addClass(\"filtersNotCombined\");\r\n (filter as any).tooltip({ title: \"Filter could not be combined. Change the filter and update.\", placement: \"bottom\" });\r\n }\r\n filter.removeClass(\"filtersNotCombinedRemove\");\r\n }\r\n }\r\n else if (data.errorType == \"Dashboard\") {\r\n var widgets = $(\"div#TabPageContainer div#DashboardContainer div.dashboardWidget\");\r\n for (var i = 0; i < widgets.length; i++) {\r\n checkFiltersErrors($(widgets[i]), true);\r\n }\r\n }\r\n }\r\n\r\n if (!isWidget)\r\n removeFilterErrors();\r\n }\r\n\r\n var checkFiltersErrors = function (context, isWidget: boolean = false) {\r\n var isDashboard = context.attr('id') === \"DashboardContainer\";\r\n if (isDashboard) {\r\n handleFilterErrors({ errorType: \"Dashboard\" });\r\n }\r\n else {\r\n var errors = $(\"div.result-error\", context);\r\n for (var i = 0; i < errors.length; i++) {\r\n var error = $(errors[i]);\r\n handleFilterErrors({ errorType: error.data(\"error-type\"), errorInfo: error.data(\"error-info\") }, isWidget);\r\n }\r\n if (errors.length === 0 && !isWidget) {\r\n handleFilterErrors();\r\n }\r\n }\r\n }\r\n\r\n var hideFiltersClick = function (e) {\r\n var actualFilter = e.target.closest(\"li.filter\");\r\n\r\n var filters = $(\".filterList div.filter:not(.hidden)\");\r\n $.each(filters, function (index, filter) {\r\n if (filter.closest(\"li.filter\") !== actualFilter)\r\n $(filter).addClass(\"hidden\");\r\n });\r\n\r\n var filtersSettings = $(\".popover-filter-settings:not(.hidden)\");\r\n $.each(filtersSettings, function (index, filter) {\r\n if (filter.closest(\"li.filter\") !== actualFilter)\r\n $(filter).addClass(\"hidden\");\r\n });\r\n }\r\n\r\n var addEventAvaliableFilters = function () {\r\n let addFilterButton = $(\".reportContent[data-mode=Pivot] .tabFilterNav .dropdown.dropdown-avaliablefilters, .reportContent[data-mode=Analysis] .tabFilterNav .dropdown.dropdown-avaliablefilters, .reportContent[data-mode=Chart] .tabFilterNav .dropdown.dropdown-avaliablefilters, #DashboardContainer .tabFilterNav .dropdown.dropdown-avaliablefilters, #DashboardContainer #selected-widget-filters .dropdown.dropdown-avaliablefilters\");\r\n addFilterButton.off('show.bs.dropdown').on('show.bs.dropdown', function () {\r\n let dropDownAddFilter = $('.dropdown-menu', $(this));\r\n let addButtonPosition = $(\"[data-type=add]\", this).get(0).getBoundingClientRect();\r\n dropDownAddFilter.css({ \"position\": \"fixed\", \"left\": `${addButtonPosition.left}px`, \"top\": `${addButtonPosition.bottom}px` });\r\n });\r\n\r\n let clearFilters = function () {\r\n let divFilters = $(this).closest(\".nav-workbook-filters-group, .tabFilterNav, #widgetFilterNav\");\r\n let filterList = $(\".filterList\", divFilters);\r\n\r\n let filterListElement = $(\"filter-list\", filterList).get(0);\r\n if (filterListElement) {\r\n let filtersVM = ko.dataFor(filterListElement);\r\n if (filtersVM) {\r\n filtersVM.forEach(function (filterVM) {\r\n if (filterVM.filter.clearFilter) {\r\n filterVM.filter.clearFilter();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n $(\".filterContextContainer .btn-clear-filter\").off(\"click\").on(\"click\", clearFilters);\r\n }\r\n\r\n var setup = function (context, filterContainer, filterControlsContainer, addFilterComplete, saveFilterValuesCompleteEvent) {\r\n filterContainer = $(filterContainer, context);\r\n //This is the container for the add + select controls.\r\n filterControlsContainer = $(filterControlsContainer, context);\r\n var filterSelect = $(\"select.addFilterSelect\", filterControlsContainer);\r\n addDefaultFilterEvents(filterContainer);\r\n\r\n let searchBox = $(\"#dropdown-avaliablefilters-search\", filterControlsContainer);\r\n let clearSearchBox = function () {\r\n if (searchBox.val() !== \"\") {\r\n searchBox.val(\"\").trigger(\"input\");\r\n }\r\n };\r\n $(\"li.filter-item-add > a\", filterControlsContainer).off(\"click\").on(\"click\",\r\n function (evt) {\r\n clearSearchBox();\r\n addFilterAction(evt, filterSelect, addFilterComplete, filterContainer);\r\n }\r\n );\r\n $(\"div.dropdown-avaliablefilters\", filterControlsContainer).on(\"hide.bs.dropdown\", function () {\r\n clearSearchBox();\r\n $(\".dropdown-menu\", filterControlsContainer).scrollTop();\r\n });\r\n\r\n let filters = $(\"li.filter-item-add\", filterControlsContainer);\r\n searchBox.on('input', function (e) {\r\n let input = $(this);\r\n let val = input.val() as any;\r\n if (val) {\r\n val = val.trim().toLowerCase();\r\n }\r\n\r\n let length = filters.length\r\n let filterName = \"\";\r\n let filterElement = null\r\n for (let i = 0; i < length; i++) {\r\n filterElement = $(filters[i]);\r\n if (!filterElement.hasClass(\"hidden\")) {\r\n filterName = filterElement.data(\"filtername\").toString().toLowerCase();\r\n if (filterName.includes(val)) {\r\n filterElement.show()\r\n }\r\n else {\r\n filterElement.hide()\r\n }\r\n }\r\n }\r\n });\r\n\r\n $(\"#TabContainer\").off(\"click\", hideFiltersClick).on(\"click\", hideFiltersClick);\r\n\r\n addEventAvaliableFilters();\r\n };\r\n var setupMapping = function (context) {\r\n let filterContainer = $(\"#WorkbookButtons li.mappingFilterList\", context);\r\n addDefaultFilterEvents(filterContainer);\r\n }\r\n\r\n return {\r\n setup: setup,\r\n setupMapping: setupMapping,\r\n getFilterValues: getFilterValues,\r\n updateFiltersChanged: updateFiltersChanged,\r\n handleFilterErrors: handleFilterErrors,\r\n checkFiltersErrors: checkFiltersErrors,\r\n addDefaultFilterEvents: addDefaultFilterEvents,\r\n addEventAvaliableFilters: addEventAvaliableFilters,\r\n updateVisibleFilterAvaliable: updateVisibleFilterAvaliable,\r\n\r\n showComplexFilter: showComplexFilter,\r\n openFilterSettings: openFilterSettings,\r\n removeComponentFilter: removeComponentFilter,\r\n hideFiltersClick: hideFiltersClick,\r\n clearRemovedFilterList: clearRemovedFilterList\r\n };\r\n}());","declare var moment: any;\r\ndeclare var urlConfigs: any;\r\n\r\nvar report = (function () {\r\n const fakeColumnName = \"fake\";\r\n let tagLinkDrilldown = \"#icondrilldown#\";\r\n let linkDrilldown = `more_horiz`;\r\n var getParentContext = function () {\r\n return irGlobal.getParentContext();\r\n };\r\n\r\n var getGridDiv = function (context) {\r\n if (!context)\r\n context = getParentContext();\r\n\r\n return $('.gridContainer', context);\r\n }\r\n var getGridInstance = function (context) {\r\n if (!context)\r\n context = getParentContext();\r\n\r\n return getGridDiv(context)?.data(\"dxDataGrid\");\r\n }\r\n\r\n var resize = function (context) {\r\n if (context && context.length > 1) {\r\n return;\r\n }\r\n\r\n let grid = null;\r\n const isWidget = context.hasClass(\"widgetContainer\") || context.hasClass(\"dashboardWidget\") || context.closest(\".dashboardWidget\").length > 0;\r\n if (isWidget) {\r\n if (!context.hasClass(\"widgetContainer\") && context.closest(\".widgetContainer\").length > 0) {\r\n context = context.closest(\".widgetContainer\");\r\n }\r\n }\r\n const type = isWidget ? context.data(\"widgettype\") : reportView.reportType(context);\r\n\r\n if (type === ReportTypeStrEnum.Analysis || type === \"Report\") {\r\n grid = getGridInstance(context);\r\n if (grid)\r\n grid._$element.css(\"overflow\", \"auto\");\r\n }\r\n else if (type === \"Pivot\") {\r\n grid = pivotGrid.getPivotGridInstance(context);\r\n if (grid)\r\n grid._$element.css(\"overflow\", \"hidden\");\r\n }\r\n\r\n if (!grid)\r\n return;\r\n\r\n let gridContainer = grid._$element;\r\n\r\n if (type === ReportTypeStrEnum.Analysis || type === \"Report\" || type === ReportTypeStrEnum.Pivot) {\r\n if (isWidget) {\r\n //gridContainer.height(gridContainer.closest(\".widget-result\").height());\r\n }\r\n else {\r\n let offSet = gridContainer.offset();\r\n let windowHeight = $(window).height();\r\n //gridContainer.css(\"overflow\", \"auto\");\r\n ////-40 so we can avoid unecessary vertical scrollbars.\r\n let calculatedHeight = windowHeight - offSet.top - 5;\r\n if (calculatedHeight > 0) {\r\n gridContainer.height(calculatedHeight);\r\n }\r\n }\r\n\r\n grid.repaint();\r\n }\r\n };\r\n\r\n var addDrilldownClick = function (context) {\r\n if (!context)\r\n context = getParentContext();\r\n\r\n if (reportView.reportType() === \"Analysis\" || reportView.reportType() === \"Pivot\") {\r\n let aggregateReport = context.find(\".resultsTableContainer\").data(\"aggregatereport\");\r\n let drilldownSelect = context.find(\"li#DrilldownReportsList select.nextDrilldownSelect\");\r\n let nextDrilldown = parseInt(drilldownSelect.val() ?? 0, 10);\r\n let grid = reportView.reportType() === \"Analysis\" ? getGridDiv(context) : pivotGrid.getPivotDiv(context);\r\n if (aggregateReport === \"True\" && nextDrilldown !== undefined && nextDrilldown !== null && nextDrilldown != 0) {\r\n grid.addClass(\"drilldown-enable\");\r\n }\r\n else {\r\n grid.removeClass(\"drilldown-enable\");\r\n }\r\n }\r\n };\r\n\r\n var changeDirectionOrder = function (evt) {\r\n let grid = getGridInstance(null);\r\n if (grid) {\r\n let columns = grid.getVisibleColumns().filter(x => x.sortOrder !== null && x.sortOrder !== undefined);\r\n if (columns && columns.length > 0) {\r\n if (columns.length === 1) {\r\n let column = columns[0];\r\n let sortOrder = column.sortOrder === \"desc\" ? \"asc\" : \"desc\";\r\n grid.columnOption(column.dataField, \"sortOrder\", sortOrder);\r\n\r\n let directionIndicator = $(\".directionIndicator\", \".selectList.orderConfig\");\r\n directionIndicator.removeClass(\"glyphicon-chevron-down\");\r\n directionIndicator.removeClass(\"glyphicon-chevron-up\");\r\n directionIndicator.removeClass(\"glyphicon-minus\");\r\n if (sortOrder === \"desc\") {\r\n directionIndicator.addClass(\"glyphicon-chevron-down\");\r\n }\r\n else {\r\n directionIndicator.addClass(\"glyphicon-chevron-up\");\r\n }\r\n\r\n reportView.persistOrderChange(evt, [{ fieldName: column.queryName, order: sortOrder, orderIndex: 0 }], false, true);\r\n }\r\n else {\r\n reportView.popupAdditionalOrderSelect();\r\n }\r\n }\r\n }\r\n };\r\n\r\n var getAutoGroupingText = function (value, autoGrouping, dateFormat, dateSeparator, weekStartDay) {\r\n if (weekStartDay === undefined) {\r\n weekStartDay = 1;\r\n }\r\n\r\n let output = \"\";\r\n switch (autoGrouping) {\r\n //Week\r\n case AutoGroupingEnum.ByWeek:\r\n {\r\n let today = new Date();\r\n let day = today.getDate();\r\n let month = (today.getMonth() + 9) % 12 + 4 + 1; //Add one more in JS than C#\r\n let year = today.getFullYear() - 1 + parseInt(((today.getMonth() + 9) / 12).toString());\r\n let todaysZeller = year * 365 + year / 4 - year / 100 + year / 400 + parseInt((month * 30.6001).toString()) + day;\r\n moment()._locale._week.dow = weekStartDay - 1;\r\n let weekStartDayJS = weekStartDay + 1; //get from SystemSettings plus 1\r\n let weekNo = value;\r\n let dateNo = weekNo * 7;\r\n today.setDate(today.getDate() + dateNo - todaysZeller + weekStartDayJS + 1);\r\n\r\n let momentDate = moment(today);\r\n let weekOfYear = momentDate.isoWeek();\r\n\r\n let displayDateWithDay = true;\r\n if (displayDateWithDay) {\r\n let mIdx = dateFormat.indexOf(\"M\");\r\n let dIdx = dateFormat.indexOf(\"D\");\r\n let format = mIdx > dIdx ? `DD${dateSeparator}MM` : `MM${dateSeparator}DD`;\r\n if (dateFormat.indexOf(\"MM\") === -1) {\r\n format = format.replace(\"DD\", \"D\").replace(\"MM\", \"M\");\r\n }\r\n\r\n output = `Week ${weekOfYear}, ${momentDate.startOf('week').format(`YYYY ${format}`)} - ${momentDate.endOf('week').format(format)}`;\r\n }\r\n else {\r\n output = `Week ${weekOfYear}, ${today.getFullYear()}`;\r\n }\r\n break;\r\n }\r\n //Month\r\n case AutoGroupingEnum.ByMonth:\r\n {\r\n let year = parseInt((value / 12).toString());\r\n let month = parseInt((value - year * 12).toString());\r\n output = `${moment(new Date(year, month, 1)).format('MMM')} ${year}`;\r\n //output = `${new Date(year, month, 1).toLocaleString('default', { month: 'long' })} ${year}`;\r\n break;\r\n }\r\n //Quarter\r\n case AutoGroupingEnum.ByQuarter:\r\n {\r\n let year = parseInt((value / 4).toString());\r\n let quarter = value - year * 4 + 1;\r\n output = `Q${quarter} ${year}`;\r\n break;\r\n }\r\n //MonthOnly\r\n case AutoGroupingEnum.ByMonthOnly:\r\n //output = `${new Date(2000, value - 1, 1).toLocaleString('default', { month: 'long' })}`;\r\n output = `${moment(new Date(2000, value - 1, 1)).format('MMMM')}`;\r\n break;\r\n //QuarterOnly\r\n case AutoGroupingEnum.ByQuarterOnly:\r\n output = `Q${value}`;\r\n break;\r\n //None\r\n case AutoGroupingEnum.None:\r\n //ByDay\r\n case AutoGroupingEnum.ByDay:\r\n output = moment(value).format(dateFormat);\r\n break;\r\n }\r\n\r\n return output;\r\n };\r\n\r\n var drawBarColumn = function (container, options, formattingRule, result) {\r\n container.css(\"font-size\", result.fontSize);\r\n let minRowHeight = container.height();\r\n container.empty();\r\n container.addClass(\"cell-bar\");\r\n\r\n if (container.height() < 0) {\r\n //https://intrep.atlassian.net/browse/IRNG-1986\r\n container.height(minRowHeight);\r\n }\r\n\r\n let padding = 8;\r\n let maxValue = options.component.getTotalSummaryValue(options.column.dataField + \"_maxChart\");\r\n let minValue = options.component.getTotalSummaryValue(options.column.dataField + \"_minChart\");\r\n let totalColumn = Math.max(Math.abs(maxValue), Math.abs(minValue));\r\n let hasNegativeValues = minValue < 0;\r\n let isNegative = options.value < 0;\r\n\r\n let widthBar = totalColumn == 0 ? 0 : Math.abs(options.value) / totalColumn * 100;\r\n\r\n let barColor = options.column.visualizationMode.color;\r\n let negativeColor = options.column.visualizationMode.negativeColor;\r\n let color = options.column.foreColor;\r\n\r\n if (options.column.visualizationMode.barChartText === \"Percentage\" && options.column.format.style !== \"percent\") {\r\n let percentValue = options.value / totalColumn;\r\n if (formattingRule) {\r\n let formattingScale = formattingRuleService.getFormattingRuleScale(formattingRule, percentValue, false);\r\n let colors = getFormattingScaleColor(formattingScale);\r\n if (colors.iconColor) {\r\n barColor = colors.iconColor;\r\n negativeColor = colors.iconColor;\r\n }\r\n if (colors.color) {\r\n color = colors.color;\r\n }\r\n }\r\n\r\n options.text = DevExpress.localization.formatNumber(percentValue, { type: \"percent\", precision: options.column.format.precision });\r\n }\r\n else {\r\n if (formattingRule) {\r\n let formattingScale = formattingRuleService.getFormattingRuleScale(formattingRule, options.value, false);\r\n let colors = getFormattingScaleColor(formattingScale);\r\n if (colors.iconColor) {\r\n barColor = colors.iconColor;\r\n negativeColor = colors.iconColor;\r\n }\r\n if (colors.color) {\r\n color = colors.color;\r\n }\r\n }\r\n\r\n if (options.column.format.style !== \"percent\") {\r\n let divider = 1;\r\n let formatStr = \"\";\r\n if (Math.abs(options.value) >= 1000000000) {\r\n formatStr = \"B\";\r\n divider = 1000000000;\r\n }\r\n else if (Math.abs(options.value) >= 1000000) {\r\n formatStr = \"M\";\r\n divider = 1000000;\r\n }\r\n else if (Math.abs(options.value) >= 1000) {\r\n formatStr = \"K\";\r\n divider = 1000;\r\n }\r\n\r\n options.value = options.value / divider;\r\n\r\n var dx = DevExpress as any;\r\n if (options.column.format.style && options.column.format.style !== \"currency\") {\r\n options.text = `${dx.formatHelper.format(options.value, { style: \"decimal\", precision: options.column.format.precision, currencySign: options.column.format.currencySign })}`;\r\n }\r\n else {\r\n options.text = `${dx.formatHelper.format(options.value, { style: `currency`, currency: result.currencyCode, currencyDisplay: `narrowSymbol`, precision: options.column.format.precision, currencySign: options.column.format.currencySign })}`;\r\n }\r\n\r\n if (options.text.includes(\")\"))\r\n options.text = options.text.replace(\")\", formatStr + \")\");\r\n else\r\n options.text += formatStr;\r\n }\r\n }\r\n\r\n if (!formattingRule && options.column.thresholdValue !== undefined && options.column.thresholdValue !== null && options.value < options.column.thresholdValue) {\r\n color = options.column.thresholdColor;\r\n }\r\n\r\n let span = null;\r\n let spanWidth = 0;\r\n if (options.column.visualizationMode.barChartText !== \"None\") {\r\n span = $(`${options.text}`).css(\"color\", color).addClass(\"report-bar-span\").appendTo(container);\r\n if (options.column.visualizationMode.barChartTextPosition === \"End\") {\r\n if (hasNegativeValues && !isNegative) {\r\n spanWidth = span.width() + padding;\r\n }\r\n else {\r\n spanWidth = span.width() + (padding * 2);\r\n }\r\n }\r\n }\r\n\r\n if (hasNegativeValues) {\r\n let halfNegativeBar = $('
').appendTo(container).addClass(\"report-bar-half-negative\").css(\"height\", container.height());\r\n $(\"
\").addClass(\"report-bar-negative\").css(\"width\", isNegative ? `max(1px, calc(${widthBar}% - ${padding}px - ${spanWidth}px))` : \"0px\").css(\"background-color\", negativeColor)\r\n .appendTo(halfNegativeBar);\r\n\r\n $('
').appendTo(container).addClass(\"report-bar-half-positive\").css(\"height\", container.height())\r\n .css(\"width\", isNegative ? \"0px\" : `max(1px, calc(${(widthBar / 2)}% - ${padding}px - ${spanWidth}px))`).css(\"background-color\", barColor);\r\n\r\n if (span && hasNegativeValues && isNegative) {\r\n span.appendTo(halfNegativeBar);\r\n }\r\n }\r\n else {\r\n $('
').appendTo(container).attr(\"title\", options.text).addClass(\"report-bar\").css(\"background-color\", barColor).css(\"width\", `max(1px, calc(${widthBar}% - ${(spanWidth)}px))`).css(\"height\", container.height());\r\n }\r\n\r\n if (options.column.visualizationMode.barChartText !== \"None\") {\r\n if (options.column.visualizationMode.barChartTextPosition === \"Begin\") {\r\n if (hasNegativeValues) {\r\n if (isNegative) {\r\n span.css(\"right\", `${padding}px`);\r\n }\r\n else {\r\n span.css(\"left\", `calc(50% + ${padding}px)`);\r\n }\r\n }\r\n else {\r\n span.css(\"left\", `${padding}px`);\r\n }\r\n }\r\n else if (options.column.visualizationMode.barChartTextPosition === \"Center\") {\r\n if (hasNegativeValues) {\r\n span.css(\"left\", `calc(${(isNegative ? 50 : 75)}% - ${(span.width() / 2)}px)`);\r\n }\r\n else {\r\n span.css(\"left\", `calc(50% - ${(span.width() / 2)}px)`);\r\n }\r\n }\r\n else {\r\n if (hasNegativeValues) {\r\n if (isNegative) {\r\n span.css(\"right\", `max(1px, calc(${widthBar}% - ${(spanWidth - padding)}px))`);\r\n }\r\n else {\r\n span.css(\"left\", `max(calc(50% + 1px), calc(50% + ${(widthBar / 2)}% - ${(spanWidth)}px))`);\r\n }\r\n }\r\n else {\r\n span.css(\"left\", `max(${padding}px, calc(${widthBar}% - ${(spanWidth - padding)}px))`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n var getFormattingScaleColor = function (formattingScale) {\r\n let backgroundColor = null;\r\n let color = null;\r\n let iconColor = null;\r\n if (formattingScale !== null) {\r\n if (formattingScale.backgroundColor) {\r\n backgroundColor = formattingScale.backgroundColor;\r\n }\r\n\r\n if (formattingScale.fontColor) {\r\n color = formattingScale.fontColor;\r\n }\r\n\r\n if (formattingScale.color) {\r\n iconColor = formattingScale.color;\r\n }\r\n }\r\n\r\n return {\r\n backgroundColor: backgroundColor,\r\n color: color,\r\n iconColor: iconColor\r\n }\r\n }\r\n\r\n var applyFormattingRuleCell = function (result, container, options, rowType) {\r\n let isTotal = rowType !== \"data\";\r\n let backgroundColor = options.column.backgroundColor;\r\n let color = options.column.foreColor;\r\n\r\n let formattingRule = result.formattingRules.find(function (x) { return x.id === options.column.formattingRuleId; });\r\n let isPercent = options.column.format && options.column.format.style === \"percent\";\r\n let formattingScale = formattingRuleService.getFormattingRuleScale(formattingRule, options.value, isPercent);\r\n let colors = getFormattingScaleColor(formattingScale);\r\n if (colors.backgroundColor && colors.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n backgroundColor = colors.backgroundColor;\r\n }\r\n if (colors.color) {\r\n color = colors.color;\r\n }\r\n\r\n if (formattingScale !== null && formattingScale.icon !== \"none\") {\r\n let fontSize = result.fontSize < 15 ? 15 : result.fontSize;\r\n if (result.reportType === ReportTypeEnum.Pivot && result.isPrinting) {\r\n fontSize = result.fontSize;\r\n }\r\n\r\n if (isTotal) {\r\n $(\".dx-datagrid-summary-item\", container)\r\n .append($(``));\r\n }\r\n else {\r\n $('
')\r\n .html(options.text)\r\n .append($(``))\r\n .appendTo(container);\r\n }\r\n }\r\n else {\r\n if (!isTotal) {\r\n container.html(options.text);\r\n }\r\n }\r\n\r\n let applyColors = function (elements, bColor, fColor) {\r\n elements.forEach(function (cell) {\r\n let style = cell.attr(\"style\") || \"\";\r\n if (style.length > 0 && !style.endsWith(\";\")) {\r\n style += \";\";\r\n }\r\n\r\n if (fColor) {\r\n style += `color: ${fColor} !important;`\r\n }\r\n\r\n if (bColor && bColor.toLowerCase() !== \"#ffffff\") {\r\n style += `background-color: ${bColor};`\r\n }\r\n\r\n if (isTotal) {\r\n let totalCell = $(\".dx-datagrid-summary-item\", cell);\r\n let totalStyle = totalCell.attr(\"style\") || \"\";\r\n if (totalStyle.length > 0 && !totalStyle.endsWith(\";\")) {\r\n totalStyle += \";\";\r\n }\r\n\r\n if (bColor && bColor.toLowerCase() !== \"#ffffff\") {\r\n totalStyle += `background-color: ${bColor};`\r\n }\r\n\r\n if (fColor) {\r\n totalStyle += `color: ${fColor} !important;`\r\n }\r\n\r\n totalCell.attr(\"style\", totalStyle);\r\n }\r\n\r\n cell.attr(\"style\", style);\r\n });\r\n }\r\n\r\n let cells = [container];\r\n\r\n if (formattingRule.config.applyRow && formattingScale) {\r\n applyColors(cells, backgroundColor, color);\r\n if (colors.backgroundColor && colors.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n container.addClass(\"fr-backgroundColor-applied\");\r\n }\r\n if (colors.color) {\r\n container.addClass(\"fr-fontColor-applied\");\r\n }\r\n\r\n let tds = $(\"td:not(.fr-applied)\", container.closest(\"tr\"));\r\n if (tds.length > 0) {\r\n cells = [];\r\n tds.each(function () {\r\n if (container.get(0) !== this) {\r\n cells.push($(this));\r\n }\r\n });\r\n container.addClass(\"fr-applied\");\r\n\r\n if (colors.backgroundColor && colors.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n tds.addClass(\"fr-row-backgroundColor-applied\");\r\n }\r\n if (colors.color) {\r\n tds.addClass(\"fr-row-fontColor-applied\");\r\n }\r\n\r\n applyColors(cells, colors.backgroundColor, colors.color);\r\n }\r\n }\r\n else {\r\n container.addClass(\"fr-applied\");\r\n if (colors.backgroundColor && colors.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n container.addClass(\"fr-backgroundColor-applied\");\r\n }\r\n if (colors.color) {\r\n container.addClass(\"fr-fontColor-applied\");\r\n }\r\n applyColors(cells, backgroundColor, color);\r\n }\r\n\r\n return {\r\n formattingRule: formattingRule,\r\n formattingScale: formattingScale\r\n };\r\n }\r\n\r\n var setupGridColumns = function (result, totalItems, groupItems) {\r\n if (result.baseColumns) {\r\n result.columns = result.baseColumns.slice();\r\n }\r\n\r\n let deubgLog = false;\r\n\r\n let gridColumns = [];\r\n let groupColumns = [];\r\n\r\n if (deubgLog) { console.log(\"result.columns\"); console.log(result.columns); }\r\n\r\n for (var index = 0; index < result.columns.length; index++) {\r\n\r\n let column = result.columns[index];\r\n\r\n column.indexBase = column.index;\r\n column.encodeHtml = false; //Need to use because of html code in the data. Example: Links \r\n column.cssClass = \"column-text-style\";\r\n column.headerCellTemplate = function (header, info) {\r\n header.closest(\"td\").css(\"text-align\", info.column.titleAlignment);\r\n //Need to use because of
in the column title, column.encodeHtml = false doesn't work for column title\r\n header.html(info.column.caption);\r\n }\r\n if (column.width === null)\r\n column.width = undefined; //Set width to undefined for column resize to work\r\n\r\n if (column.isMetric) {\r\n\r\n if (column.functionType === FunctionTypeEnum.Rank) {\r\n column.showTotalValue = false;\r\n column.showSubtotalValue = false;\r\n column.groupingType = GroupingTypeEnum.SUM;\r\n }\r\n\r\n const isCustomMetric = column.groupingType === GroupingTypeEnum.WSUM ||\r\n column.groupingType === GroupingTypeEnum.DSUM ||\r\n column.groupingType === GroupingTypeEnum.WDSUM ||\r\n (column.comparisonType >= ComparisonTypeEnum.Variation && column.groupingType !== GroupingTypeEnum.TSUM) ||\r\n column.functionType === FunctionTypeEnum.AccumulatedAll ||\r\n column.functionType === FunctionTypeEnum.PercentOfTotal ||\r\n (column.functionType === FunctionTypeEnum.Accumulated && result.reportType === ReportTypeEnum.Analysis);\r\n let summaryType = isCustomMetric ?\r\n 'custom' :\r\n column.groupingType === GroupingTypeEnum.MIN ?\r\n 'min' :\r\n column.groupingType === GroupingTypeEnum.MAX ? 'max' : 'sum';\r\n\r\n if (column.groupingType === GroupingTypeEnum.TSUM) {\r\n summaryType = 'max';\r\n }\r\n\r\n if (result.totalsPosition !== TotalsPositionEnum.None && column.showTotalValue) {\r\n totalItems.push({\r\n name: column.dataField,\r\n showInColumn: isCustomMetric ? column.dataField : null,\r\n column: isCustomMetric ? null : column.dataField,\r\n displayFormat: '{0}',\r\n valueFormat: column.format,\r\n summaryType: summaryType,\r\n });\r\n }\r\n\r\n if (result.hasGrouping) {\r\n if (result.subtotalsPosition !== TotalsPositionEnum.None && column.showSubtotalValue) {\r\n groupItems.push({\r\n name: column.dataField,\r\n showInColumn: isCustomMetric ? column.dataField : null,\r\n column: isCustomMetric ? null : column.dataField,\r\n summaryType: summaryType,\r\n valueFormat: column.format,\r\n displayFormat: '{0}',\r\n showInGroupFooter: false,\r\n alignByColumn: true,\r\n });\r\n\r\n if (result.subtotalsPosition === TotalsPositionEnum.Bottom) {\r\n groupItems.push({\r\n name: column.dataField,\r\n showInColumn: isCustomMetric ? column.dataField : null,\r\n column: isCustomMetric ? null : column.dataField,\r\n summaryType: summaryType,\r\n valueFormat: column.format,\r\n displayFormat: '{0}',\r\n showInGroupFooter: true,\r\n alignByColumn: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n //WSUM and Comparison Variation Value and Percentage\r\n if (column.groupingType === GroupingTypeEnum.WSUM || column.comparisonType >= ComparisonTypeEnum.Variation) {\r\n column.calculateCellValue = function (rowData) {\r\n let calculateColumn = this;\r\n let returnValue = 0;\r\n if (calculateColumn.groupingType === GroupingTypeEnum.WSUM) {\r\n if (calculateColumn.functionType === FunctionTypeEnum.PercentOfTotal && calculateColumn.comparisonType < ComparisonTypeEnum.Variation) {\r\n const valueTop = rowData[calculateColumn.indexBase];\r\n const valueBottom = rowData[calculateColumn.indexBottom];\r\n const valueGrandTotal = rowData[calculateColumn.indexBase + 3];\r\n returnValue = valueBottom === 0 || valueGrandTotal === 0 ? 0 : (valueTop / valueBottom) / valueGrandTotal;\r\n }\r\n else if (calculateColumn.comparisonType < ComparisonTypeEnum.Variation) {\r\n let valueTop = rowData[calculateColumn.dataField];\r\n let valueBottom = rowData[calculateColumn.indexBottom];\r\n let value = valueBottom === 0 ? 0 : valueTop / valueBottom;\r\n returnValue = value;\r\n }\r\n else {\r\n let valueTop = rowData[calculateColumn.indexBase];\r\n let valueTopComparison = rowData[calculateColumn.indexComparison];\r\n let valueBottom = rowData[calculateColumn.indexBottom];\r\n let valueBottomComparison = rowData[calculateColumn.indexBottomComparison];\r\n\r\n let value = valueBottom === 0 ? 0 : valueTop / valueBottom;\r\n let valueComparison = valueBottomComparison === 0 ? 0 : valueTopComparison / valueBottomComparison;\r\n\r\n if (calculateColumn.functionType === FunctionTypeEnum.PercentOfTotal) {\r\n const valueGrandTotal = rowData[calculateColumn.indexBase + 3];\r\n const valueGrandTotalComparison = rowData[calculateColumn.indexComparison + 3];\r\n value = valueGrandTotal === 0 ? 0 : value / valueGrandTotal;\r\n valueComparison = valueGrandTotalComparison === 0 ? 0 : valueComparison / valueGrandTotalComparison;\r\n }\r\n\r\n let valueVariation = value - valueComparison;\r\n\r\n if (calculateColumn.comparisonType === ComparisonTypeEnum.PercentageVariation) {\r\n valueVariation = valueComparison === 0 ? 0 : valueVariation / valueComparison;\r\n }\r\n returnValue = valueVariation;\r\n }\r\n }\r\n else if (calculateColumn.comparisonType >= ComparisonTypeEnum.Variation) {\r\n let value = rowData[calculateColumn.indexBase];\r\n let valueComparison = rowData[calculateColumn.indexComparison];\r\n value = value - valueComparison;\r\n if (calculateColumn.comparisonType === ComparisonTypeEnum.PercentageVariation) {\r\n value = valueComparison === 0 ? 0 : value / valueComparison;\r\n }\r\n returnValue = value;\r\n }\r\n\r\n //Need to round the value before the interface, so the search for numeric columns works\r\n let precision = this.format.precision + (this.format.style === \"percent\" ? 2 : 0);\r\n returnValue = Math.round(returnValue * (Math.pow(10, precision))) / (Math.pow(10, precision));\r\n return returnValue;\r\n }\r\n }\r\n else {\r\n column.calculateCellValue = function (rowData) {\r\n //Need to round the value before the interface, so the search for numeric columns works\r\n let precision = this.format.precision + (this.format.style === \"percent\" ? 2 : 0);\r\n let value = Math.round(rowData[this.dataField] * (Math.pow(10, precision))) / (Math.pow(10, precision));;\r\n return value;\r\n }\r\n }\r\n\r\n column.cellTemplate = function (container, options) {\r\n let formattingRule = null;\r\n\r\n if (options.column.hasFormattingRule) {\r\n let formattingOptioins = applyFormattingRuleCell(result, container, options, \"data\");\r\n formattingRule = formattingOptioins.formattingRule;\r\n }\r\n else {\r\n let color = options.column.foreColor;\r\n let backgroundColor = options.column.backgroundColor;\r\n\r\n container.html(options.text);\r\n\r\n if (!container.hasClass(\"fr-row-fontColor-applied\")) {\r\n container.css(\"color\", color);\r\n }\r\n\r\n if (backgroundColor && backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n if (!container.hasClass(\"fr-row-backgroundColor-applied\")) {\r\n container.css(\"backgroundColor\", backgroundColor);\r\n }\r\n }\r\n }\r\n\r\n if (options.column.hasBarChart) {\r\n drawBarColumn(container, options, formattingRule, result);\r\n }\r\n\r\n if (options.column.thresholdColor && options.column.thresholdValue !== undefined && options.column.thresholdValue !== null && options.value < options.column.thresholdValue) {\r\n if (!container.hasClass(\"fr-row-fontColor-applied\") && !container.hasClass(\"fr-fontColor-applied\")) {\r\n container.css(\"color\", options.column.thresholdColor);\r\n }\r\n }\r\n }\r\n\r\n if (column.hasBarChart) {\r\n if (column.visualizationMode.columnWidth > 0) {\r\n column.width = column.visualizationMode.columnWidth;\r\n }\r\n\r\n totalItems.push({\r\n name: column.dataField + \"_maxChart\",\r\n column: column.dataField,\r\n cssClass: \"hidden-total-summaries\",\r\n summaryType: 'max',\r\n hasBarChart: true\r\n });\r\n\r\n totalItems.push({\r\n name: column.dataField + \"_minChart\",\r\n column: column.dataField,\r\n cssClass: \"hidden-total-summaries\",\r\n summaryType: 'min',\r\n hasBarChart: true\r\n });\r\n }\r\n\r\n //For Pivot\r\n column.area = \"data\";\r\n summaryType =\r\n column.groupingType === GroupingTypeEnum.WSUM ||\r\n column.comparisonType >= ComparisonTypeEnum.Variation /*|| column.functionType === 3*/ ?\r\n 'custom' :\r\n column.groupingType === GroupingTypeEnum.MIN ?\r\n 'min' :\r\n column.groupingType === GroupingTypeEnum.MAX ? 'max' : 'sum';\r\n if (column.groupingType === GroupingTypeEnum.TSUM) {\r\n summaryType = 'max';\r\n }\r\n\r\n column.summaryType = summaryType;\r\n\r\n gridColumns.push(column);\r\n if (deubgLog) { console.log(\"Adding GridColumn Metric\"); console.log(column); }\r\n }\r\n else {\r\n\r\n if (column.isGrouping || result.reportType === ReportTypeEnum.Pivot) {\r\n column.visible = false;\r\n\r\n if (result.reportType === ReportTypeEnum.Analysis) {\r\n column.groupIndex = column.groupId;\r\n }\r\n else {\r\n column.groupIndex = column.groupOrder;\r\n }\r\n\r\n let groupColumn = groupColumns.find(function (x) { return x.groupId === column.groupId && x.isGrouping === column.isGrouping; });\r\n if (groupColumn === undefined) {\r\n groupColumn = {\r\n isGrouping: column.isGrouping,\r\n groupId: column.groupId,\r\n columns: []\r\n };\r\n groupColumns.push(groupColumn);\r\n }\r\n\r\n column.groupCellTemplate = function (element, options) {\r\n element.html(options.displayValue);\r\n };\r\n\r\n groupColumn.columns.push(column);\r\n if (deubgLog) { console.log(\"Adding Group\"); console.log(column); console.log(groupColumn); }\r\n\r\n //For Pivot \r\n if (result.reportType === ReportTypeEnum.Pivot) {\r\n column.area = column.isGrouping ? 'column' : 'row';\r\n }\r\n }\r\n else {\r\n column.groupIndex = undefined;\r\n column.groupName = undefined;\r\n gridColumns.push(column);\r\n\r\n //Disabled but maybe it is necessary for Pivot\r\n //proccessColumn(result, column);\r\n\r\n //Added to generate the text for date fields - because processColumn() was disabled\r\n if (column.autoGrouping > AutoGroupingEnum.ByDay && column.autoGrouping !== AutoGroupingEnum.ByYear || column.dataType === \"date\" && column.autoGrouping <= AutoGroupingEnum.ByDay) {\r\n //Set the calculateCellValue this way for the search panel to work and to show the correct value\r\n column.calculateCellValue = function (rowData) {\r\n let value = rowData[this.dataField];\r\n if (value) {\r\n return getAutoGroupingText(value, this.autoGrouping, result.dateFormat, result.dateSeparator, result.weekStartDay);\r\n }\r\n\r\n return value;\r\n };\r\n column.calculateSortValue = column.dataField;\r\n }\r\n\r\n //For Pivot \r\n if (result.reportType === ReportTypeEnum.Pivot) {\r\n column.area = 'row';\r\n column.allowExpandAll = true;\r\n column.expanded = true;\r\n }\r\n\r\n if (deubgLog) { console.log(\"Adding GridColumn Field\"); console.log(column); }\r\n }\r\n }\r\n\r\n }\r\n if (result.result) {\r\n groupColumns.forEach(function (groupColumn) {\r\n let gridGroupColumn = setupGroup(result, groupColumn.columns, groupColumn.groupId, groupColumn.isGrouping, deubgLog);\r\n if (deubgLog) { console.log(\"Adding Grouping Columns\"); console.log(gridGroupColumn); }\r\n gridColumns.push(gridGroupColumn);\r\n });\r\n }\r\n\r\n if (!result.formulasResolved) {\r\n let re = /\\[[a-zA-Z_0-9]*\\]/g;\r\n for (var index = 0; index < result.columns.length; index++) {\r\n\r\n let column = result.columns[index];\r\n //DSUM or DWSUM\r\n if (column.groupingType === GroupingTypeEnum.DSUM || column.groupingType === GroupingTypeEnum.WDSUM) {\r\n column.dependentColumns = [];\r\n let variables;\r\n let formula = column.formulaTop.replaceAll(\"=\", \"==\");\r\n while (variables = re.exec(column.formulaTop)) {\r\n let variable = variables[0];\r\n let queryName = variable.replace('[', '').replace(']', '');\r\n let dColumn = result.columns.find(x => x.queryName === queryName);\r\n formula = formula.replaceAll(variable, `[${dColumn.index}]`);\r\n if (column.dependentColumns.find(x => x.queryName === queryName) === undefined) {\r\n column.dependentColumns.push(dColumn);\r\n }\r\n }\r\n column.formulaTop = formula;\r\n }\r\n }\r\n result.formulasResolved = true;\r\n }\r\n\r\n if (deubgLog) { console.log(\"Result\"); console.log(result.result); }\r\n\r\n if (result.reportType === ReportTypeEnum.Pivot) {\r\n for (var index = 0; index < result.groupColumns.length; index++) {\r\n let column = result.groupColumns[index];\r\n result.columns.unshift({\r\n caption: `G${column}`,\r\n area: 'row',\r\n groupName: `G${column}`,\r\n allowExpandAll: true,\r\n expanded: true,\r\n });\r\n }\r\n }\r\n\r\n return gridColumns;\r\n }\r\n\r\n var setupGroup = function (result, groupColumns, groupId, isGrouping, debugLog) {\r\n\r\n let groupColumnIndex = result.result[0] ? result.result[0].length : 0;\r\n let caption = `Grouping-${groupId}-${(isGrouping ? 'C' : 'R')}`;\r\n if (groupColumns) {\r\n caption = \"\";\r\n groupColumns.forEach(function (col) {\r\n if (caption != \"\") {\r\n caption += result.columnSeparator;\r\n }\r\n caption += col.caption;\r\n });\r\n\r\n caption = (caption as any).replaceAll(\" \", \" \").replaceAll(\"
\", \" \");\r\n }\r\n\r\n var groupingColumn = {\r\n groupColumns: groupColumns,\r\n encodeHtml: false,\r\n dataField: `${groupColumnIndex}`,\r\n index: groupColumnIndex,\r\n caption: caption,\r\n isGrouping: true,\r\n isMetric: false,\r\n groupIndex: result.reportType === ReportTypeEnum.Pivot ? undefined : groupId,\r\n groupId: groupId,\r\n groupCellTemplate: function (element, options) {\r\n let text = options.value + \"\";\r\n if (result.subtotalsPosition === TotalsPositionEnum.Top && result.showReportRowCount) {\r\n let summary = options.summaryItems.find(function (x) { return x.name === \"ForSubTotal\"; });\r\n let countText = summary ? summary.value : \"\";\r\n text = `${text}${countText}`;\r\n }\r\n\r\n //IRNG-1709\r\n if (result.designer.enableRowSelection()) {\r\n element.html(`${linkDrilldown} ${text}`);\r\n\r\n $(\"a.drilldowrow\", element).click(function (e) {\r\n reportRowClick(options.row, result, element, e);\r\n });\r\n }\r\n else {\r\n element.html(text);\r\n }\r\n //---\r\n\r\n if (result.reportType === ReportTypeEnum.Analysis && groupColumns.length) {\r\n element.css(\"text-align\", groupColumns[0].alignment);\r\n }\r\n },\r\n\r\n //calculateCellValue and calculateDisplayValue are set this way for the search panel to work\r\n calculateCellValue: function (rowData) {\r\n return rowData[this.dataField].toString();\r\n },\r\n calculateDisplayValue: function (rowData) {\r\n return rowData[this.dataField];\r\n },\r\n //-----\r\n sortingMethod: function (value1, value2) {\r\n if (result.reportType === ReportTypeEnum.Pivot && groupColumns.filter((x) => { return !x.isMetric && x.sortOrder; }).length > 0) {\r\n const sortColumn = groupColumns.find((x) => { return !x.isMetric && x.sortOrder; });\r\n const index = groupColumns.indexOf(sortColumn)\r\n\r\n let val1 = value1.value === undefined ? value1.values[index] : value1.value.values !== undefined ? value1.value.values[index] : value1.value;\r\n let val2 = value2.value === undefined ? value2.values[index] : value2.value.values !== undefined ? value2.value.values[index] : value2.value;\r\n\r\n if (val1 > val2)\r\n return 1;\r\n else if (val1 < val2)\r\n return -1;\r\n }\r\n\r\n for (var j = 0; j < groupColumns.length; j++) {\r\n let val1 = value1.value === undefined ? value1.values[j] : value1.value.values !== undefined ? value1.value.values[j] : value1.value;\r\n let val2 = value2.value === undefined ? value2.values[j] : value2.value.values !== undefined ? value2.value.values[j] : value2.value;\r\n\r\n if (val1 > val2)\r\n return 1;\r\n else if (val1 < val2)\r\n return -1;\r\n }\r\n\r\n return 0;\r\n },\r\n area: isGrouping ? 'column' : 'row', //for Pivot\r\n };\r\n\r\n let groupValues = [];\r\n\r\n for (var i = 0; i < result.result.length; i++) {\r\n let resultRow = result.result[i];\r\n\r\n let groupValue = {\r\n text: \"\",\r\n values: [],\r\n toString: function () {\r\n return this.text;\r\n },\r\n valueOf: function () {\r\n return this.text;\r\n },\r\n };\r\n\r\n /*\r\n Added comments tag only in Pivot when the field is invisible because it groups by text, \r\n so we need to differentiate the values for it to create the rows;\r\n Example: two different ids (invisible field) with two identical names (visible field), Pivot needs to create two row for this\r\n */\r\n\r\n for (var j = 0; j < groupColumns.length; j++) {\r\n let column = groupColumns[j];\r\n let value = resultRow[parseInt(column.dataField)];\r\n\r\n groupValue.values.push(value);\r\n\r\n if (!column.visibleField && result.reportType !== ReportTypeEnum.Pivot) {\r\n continue;\r\n }\r\n\r\n if (groupValue.text.replace(//, \"\") !== \"\" && column.visibleField)\r\n groupValue.text += `${result.columnSeparator}`;\r\n\r\n if (!column.visibleField) {\r\n groupValue.text += \"\";\r\n }\r\n }\r\n\r\n if (groupValues.filter(function (x) { return x.toString() === groupValue.toString(); }).length > 0) {\r\n groupValue = groupValues.find(function (x) { return x.toString() === groupValue.toString(); });\r\n }\r\n else {\r\n groupValues.push(groupValue);\r\n }\r\n\r\n resultRow[groupColumnIndex] = groupValue;\r\n }\r\n\r\n return groupingColumn;\r\n }\r\n\r\n var reportRowClick = function (e, result, element, event) {\r\n let context = element ? element.closest(\"div.reportContent\") : null;\r\n \r\n //e.handled indicates that it treated by another function, ex. to expand a group\r\n if (e.handled)\r\n return;\r\n\r\n let widget = element.closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n if (event) {\r\n if (isWidget) {\r\n if (widget.hasClass(\"selected\"))\r\n event.stopPropagation();\r\n else\r\n return;\r\n }\r\n }\r\n\r\n if (!reportView.drilldownIsPossible(context))\r\n return;\r\n\r\n if (e.rowType === \"groupFooter\") {\r\n return;\r\n }\r\n\r\n let model = reportView.getTabBaseObject({\r\n tabValues: [],\r\n widgetId: isWidget ? widget.data(\"widgetid\") : undefined\r\n });\r\n\r\n if (e.rowType === \"data\") {\r\n for (let i = 0; i < result.columns.length; i++) {\r\n let column = result.columns[i];\r\n\r\n if (!column.isMetric && column.groupingType === GroupingTypeEnum.GROUP_BY && !column.isGrouping) {\r\n let value = e.data[column.index];\r\n if (value !== null && value !== undefined) {\r\n if (typeof value === 'object') {\r\n value = value.value;\r\n }\r\n\r\n if (column.dataType === \"date\") {\r\n value = value.slice(0, 10);\r\n }\r\n }\r\n\r\n model.tabValues.push({\r\n name: column.queryName,\r\n startCondition: value,\r\n isGroupField: column.isGrouping,\r\n });\r\n }\r\n else if (column.isGrouping) {\r\n for (var gc = 0; gc < column.groupColumns.length; gc++) {\r\n let columnGroup = column.groupColumns[gc];\r\n if (!columnGroup.isMetric && columnGroup.groupingType === GroupingTypeEnum.GROUP_BY) {\r\n model.tabValues.push({\r\n name: columnGroup.queryName,\r\n startCondition: e.data[column.index].values[gc],\r\n isGroupField: columnGroup.isGrouping,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else if (e.rowType === \"group\") {\r\n for (let i = 0; i < result.columns.length; i++) {\r\n let column = result.columns[i];\r\n\r\n if (column.isGrouping && column.groupIndex <= e.groupIndex) {\r\n for (var gc = 0; gc < column.groupColumns.length; gc++) {\r\n let columnGroup = column.groupColumns[gc];\r\n if (!columnGroup.isMetric && columnGroup.groupingType === GroupingTypeEnum.GROUP_BY) {\r\n model.tabValues.push({\r\n name: columnGroup.queryName,\r\n startCondition: e.key[column.groupIndex].values[gc],\r\n isGroupField: columnGroup.isGrouping,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.workBook + \"NavigateToDrillDown\",\r\n model,\r\n function (data) {\r\n reportView.updateOutputAfterDrilldown(data, element);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n\r\n var calculateCustomSummary = function (options, result) {\r\n if (options.summaryProcess === 'start') {\r\n if (options.name === \"ForSubTotal\") {\r\n options.count = 0;\r\n return;\r\n }\r\n\r\n options.valueTop = 0;\r\n options.valueBottom = 0;\r\n options.valueGrandTotal = 0;\r\n options.valueSubTotal = 0;\r\n\r\n options.valueTopComparison = 0;\r\n options.valueBottomComparison = 0;\r\n options.valueGrandTotalComparison = 0;\r\n\r\n if (result.reportType === ReportTypeEnum.Analysis) {\r\n options.column = result.columns.find(x => x.dataField === options.name);\r\n }\r\n\r\n if (options.column.groupingType === GroupingTypeEnum.DSUM || options.column.groupingType === GroupingTypeEnum.WDSUM) {\r\n options.metricValues = [];\r\n options.column.dependentColumns.forEach((dColumn, index) => {\r\n options.metricValues[index] = {\r\n topValue: dColumn.groupingType === GroupingTypeEnum.MIN || dColumn.groupingType === GroupingTypeEnum.MAX ? undefined : 0,\r\n bottomValue: 0,\r\n };\r\n });\r\n }\r\n }\r\n\r\n if (options.summaryProcess === 'calculate') {\r\n if (options.name === \"ForSubTotal\") {\r\n if (!options.totalValue)\r\n options.totalValue = options.value[result.columns.find(x => x.groupId === options.groupIndex).index];\r\n\r\n options.count++;\r\n }\r\n else {\r\n if (options.column.functionType === FunctionTypeEnum.Rank)\r\n return;\r\n\r\n if (options.column.comparisonType === ComparisonTypeEnum.None || options.column.comparisonType === ComparisonTypeEnum.Value) {\r\n\r\n if (options.column.functionType === FunctionTypeEnum.AccumulatedAll) {\r\n options.valueTop = options.value[options.column.indexBase];\r\n\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM)\r\n options.valueBottom = options.value[options.column.indexBottom];\r\n\r\n return;\r\n }\r\n\r\n if (options.column.functionType === FunctionTypeEnum.PercentOfTotal) {\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM)\r\n options.valueGrandTotal = options.value[options.column.indexBase + 3];\r\n else\r\n options.valueGrandTotal = options.value[options.column.indexBase + 1];\r\n }\r\n\r\n if (result.reportType === ReportTypeEnum.Analysis && options.column.functionType === FunctionTypeEnum.Accumulated) {\r\n options.valueSubTotal = options.value[options.column.groupingType === GroupingTypeEnum.WSUM ? options.column.indexBottom + 2 : options.column.indexBase + 1];\r\n }\r\n\r\n options.valueTop += options.value[options.column.indexBase];\r\n\r\n //WSUM\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM)\r\n options.valueBottom += options.value[options.column.indexBottom];\r\n\r\n //DSUM - WDSUM\r\n if (options.column.groupingType === GroupingTypeEnum.DSUM || options.column.groupingType === GroupingTypeEnum.WDSUM) {\r\n options.column.dependentColumns.forEach((dColumn, index) => {\r\n switch (dColumn.groupingType) {\r\n case GroupingTypeEnum.MIN:\r\n if (options.metricValues[index].topValue === undefined) {\r\n options.metricValues[index].topValue = options.value[dColumn.indexBase];\r\n }\r\n else {\r\n options.metricValues[index].topValue = Math.min(options.metricValues[index].topValue, options.value[dColumn.indexBase]);\r\n }\r\n break;\r\n case GroupingTypeEnum.MAX:\r\n case GroupingTypeEnum.TSUM:\r\n if (options.metricValues[index].topValue === undefined) {\r\n options.metricValues[index].topValue = options.value[dColumn.indexBase];\r\n }\r\n else {\r\n options.metricValues[index].topValue = Math.max(options.metricValues[index].topValue, options.value[dColumn.indexBase]);\r\n }\r\n break;\r\n //case 6:\r\n // options.metricValues[index].topValue += 1;\r\n // break;\r\n default:\r\n options.metricValues[index].topValue += options.value[dColumn.indexBase];\r\n if (dColumn.groupingType === GroupingTypeEnum.WSUM)\r\n options.metricValues[index].bottomValue += options.value[dColumn.indexBottom];\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n if (options.column.functionType === FunctionTypeEnum.AccumulatedAll) {\r\n options.valueTop = options.value[options.column.indexBase];\r\n options.valueTopComparison = options.value[options.column.indexComparison];\r\n\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM) {\r\n options.valueBottom = options.value[options.column.indexBottom];\r\n options.valueBottomComparison = options.value[options.column.indexBottomComparison];\r\n }\r\n\r\n return;\r\n }\r\n\r\n options.valueTop += options.value[options.column.indexBase];\r\n options.valueTopComparison += options.value[options.column.indexComparison];\r\n\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM) {\r\n options.valueBottom += options.value[options.column.indexBottom];\r\n options.valueBottomComparison += options.value[options.column.indexBottomComparison];\r\n }\r\n\r\n if (options.column.functionType === FunctionTypeEnum.PercentOfTotal) {\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM) {\r\n options.valueGrandTotal = options.value[options.column.indexBase + 3];\r\n options.valueGrandTotalComparison = options.value[options.column.indexComparison + 3];\r\n }\r\n else {\r\n options.valueGrandTotal = options.value[options.column.indexBase + 1];\r\n options.valueGrandTotalComparison = options.value[options.column.indexComparison + 1];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.summaryProcess === 'finalize') {\r\n if (options.name === \"ForSubTotal\") {\r\n let subTotalText = options.totalValue;\r\n if (typeof options.totalValue === \"object\") {\r\n subTotalText = options.totalValue.toString();\r\n }\r\n\r\n if (subTotalText && typeof subTotalText === \"string\") {\r\n options.totalValue = (subTotalText as any).replaceAll(\" \", \" \").replaceAll(\"
\", \" \");\r\n }\r\n\r\n if (result.subtotalsPosition === TotalsPositionEnum.Top) {\r\n options.totalValue = result.showReportRowCount ? ` (${options.count})` : \"\";\r\n }\r\n else {\r\n options.totalValue = `${result.subTotalText} ${(options.totalValue !== null ? options.totalValue : \"\")}${(result.showReportRowCount ? ` (${options.count})` : \"\")}`\r\n }\r\n return;\r\n }\r\n\r\n if (options.column.functionType === FunctionTypeEnum.Rank) {\r\n options.totalValue = 0;\r\n return;\r\n }\r\n\r\n if (options.column.comparisonType === ComparisonTypeEnum.None || options.column.comparisonType === ComparisonTypeEnum.Value) {\r\n\r\n options.totalValue = options?.valueTop;\r\n\r\n if (result.reportType === ReportTypeEnum.Analysis && options.column.functionType === FunctionTypeEnum.Accumulated) {\r\n options.totalValue = options.valueSubTotal;\r\n return;\r\n }\r\n\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM) {\r\n if (options.column.functionType === FunctionTypeEnum.PercentOfTotal) {\r\n options.totalValue = options.valueBottom === 0 || options.valueGrandTotal === 0 ? 0 : (options.valueTop / options.valueBottom) / options.valueGrandTotal;\r\n return;\r\n }\r\n\r\n options.totalValue = options.valueBottom === 0 ? 0 : options.valueTop / options.valueBottom;\r\n }\r\n else if (options.column.groupingType === GroupingTypeEnum.DSUM || options.column.groupingType === GroupingTypeEnum.WDSUM) {\r\n if (options.column.functionType === FunctionTypeEnum.AccumulatedAll)\r\n return;\r\n\r\n if (options.column.calculateTotals === CalculateTotalsEnum.UseFormula) {\r\n options.totalValue = 0;\r\n let formula = options.column.formulaTop;\r\n\r\n options.column.dependentColumns.forEach((dColumn, index) => {\r\n let dColumnValue = 0;\r\n\r\n if (dColumn.groupingType === GroupingTypeEnum.WSUM) {\r\n if (options.metricValues[index].bottomValue !== 0)\r\n dColumnValue = options.metricValues[index].topValue / options.metricValues[index].bottomValue;\r\n }\r\n else {\r\n dColumnValue = options.metricValues[index].topValue;\r\n }\r\n formula = formula.replaceAll(`[${dColumn.indexBase}]`, dColumnValue);\r\n });\r\n\r\n if (options.column.functionType === FunctionTypeEnum.PercentOfTotal) {\r\n formula = `IIF(${options.valueGrandTotal} == 0, 0, (${formula}) / ${options.valueGrandTotal})`;\r\n }\r\n\r\n options.totalValue = eval(formula);\r\n }\r\n }\r\n }\r\n else {\r\n if (options.column.groupingType === GroupingTypeEnum.WSUM) {\r\n let valueTop = options.valueTop;\r\n let valueTopComparison = options.valueTopComparison;\r\n let valueBottom = options.valueBottom;\r\n let valueBottomComparison = options.valueBottomComparison;\r\n\r\n let value = valueBottom === 0 ? 0 : valueTop / valueBottom;\r\n let valueComparison = valueBottomComparison === 0 ? 0 : valueTopComparison / valueBottomComparison;\r\n\r\n if (options.column.functionType === FunctionTypeEnum.PercentOfTotal) {\r\n value = options.valueGrandTotal === 0 ? 0 : value / options.valueGrandTotal;\r\n valueComparison = options.valueGrandTotalComparison === 0 ? 0 : valueComparison / options.valueGrandTotalComparison;\r\n }\r\n\r\n let valueVariation = value - valueComparison;\r\n\r\n if (options.column.comparisonType === ComparisonTypeEnum.PercentageVariation) {\r\n valueVariation = valueComparison === 0 ? 0 : valueVariation / valueComparison;\r\n }\r\n options.totalValue = valueVariation;\r\n }\r\n else {\r\n let value = options.valueTop;\r\n let valueComparison = options.valueTopComparison;\r\n value = value - valueComparison;\r\n if (options.column.comparisonType === ComparisonTypeEnum.PercentageVariation) {\r\n value = valueComparison === 0 ? 0 : value / valueComparison;\r\n }\r\n\r\n options.totalValue = value;\r\n }\r\n }\r\n\r\n }\r\n };\r\n\r\n var resizeColumns = function (result, gridContainer, ignoreColumn) {\r\n let visibleColumns = result.grid.getVisibleColumns();\r\n let gridWidth = gridContainer.width() - visibleColumns.length - 1;\r\n let borderWidth = 0;// result.grid.option(\"showColumnLines\") ? 1 : 0;\r\n result.grid.beginUpdate();\r\n visibleColumns.forEach(function (gridColumn) {\r\n if (!gridColumn.isGrouping && (!ignoreColumn || gridColumn.queryName != ignoreColumn.queryName)) {\r\n let gridField = result.designer.fields().find(function (x) { return x.queryName() === gridColumn.queryName; });\r\n if (gridField) {\r\n if (result.designer.columnsWidthType() == ColumnsWidthTypeEnum.Automatic) {\r\n gridField.width(null);\r\n result.grid.columnOption(gridColumn.dataField, \"width\", undefined);\r\n }\r\n else if (result.designer.columnsWidthType() == ColumnsWidthTypeEnum.Percentage) {\r\n gridField.width(($(`#${gridColumn.headerId}`, gridContainer).outerWidth() + borderWidth) * 100 / gridWidth);\r\n result.grid.columnOption(gridColumn.dataField, \"width\", `${gridField.width()}%`);\r\n }\r\n else if (result.designer.columnsWidthType() == ColumnsWidthTypeEnum.Pixel) {\r\n gridField.width($(`#${gridColumn.headerId}`, gridContainer).outerWidth());\r\n result.grid.columnOption(gridColumn.dataField, \"width\", gridField.width());\r\n }\r\n\r\n //columnWidth property is obsolete, we need to set it to 0 for the column width to work\r\n if (gridField.visualizationModeDefinition) {\r\n gridField.visualizationModeDefinition.columnWidth(0);\r\n }\r\n }\r\n }\r\n });\r\n result.grid.endUpdate();\r\n }\r\n\r\n var addReportEvents = function (result, context) {\r\n let gridContainer = getGridDiv(context);\r\n $(\"#enableSelectionRow\", context).off(\"click\").on(\"click\", function () {\r\n let settings = reportSettings.getSettings(context);\r\n settings.enableRowSelection(!settings.enableRowSelection());\r\n gridContainer.attr(\"enablerowselection\", settings.enableRowSelection());\r\n });\r\n\r\n $(\"button#SearchBoxButton\", context).off(\"click\").on(\"click\", function (evt) {\r\n let settings = reportSettings.getSettings(context);\r\n settings.enableSearchBox(!settings.enableSearchBox());\r\n });\r\n\r\n $(\"button#FilterPivotButton\", context).off(\"click\").on(\"click\", function (evt) {\r\n let settings = reportSettings.getSettings(context);\r\n settings.enableFilterPanel(!settings.enableFilterPanel());\r\n });\r\n }\r\n function addSeachBoxEvent() {\r\n $(document).off(\"keydown\", showSearchBox).on(\"keydown\", showSearchBox);\r\n }\r\n function showSearchBox(e) {\r\n //114 - F3\r\n //70 - F\r\n if (e.keyCode === 114 || ((e.ctrlKey || e.metaKey) && e.keyCode === 70)) {\r\n e.preventDefault();\r\n\r\n let context = irGlobal.getParentContext();\r\n let settings = reportSettings.getSettings(context);\r\n if (settings) {\r\n settings.enableSearchBox(!settings.enableSearchBox());\r\n }\r\n }\r\n }\r\n\r\n var setup = function (context, isPrinting, isExcelPrinting, gridResult) {\r\n if (!context)\r\n context = getParentContext();\r\n\r\n var gridContainer = getGridDiv(context);\r\n\r\n if (gridContainer.length === 0)\r\n return;\r\n\r\n var result = gridResult || gridContainer.data(\"result\");\r\n if (!result.baseColumns) {\r\n result.baseColumns = result.columns.slice();\r\n }\r\n\r\n const isWidget = gridContainer.closest(\".widgetContainer\").length > 0;\r\n if (!isPrinting) {\r\n $(\"span.directionIndicator\").off(\"click\").on(\"click\", changeDirectionOrder);\r\n\r\n let offSet = gridContainer.offset();\r\n let windowHeight = $(window).height();\r\n //gridContainer.css(\"overflow\", \"auto\");\r\n ////-40 so we can avoid unecessary vertical scrollbars.\r\n let calculatedHeight = windowHeight - offSet.top - 5;\r\n \r\n\r\n let widget = gridContainer.closest(\".widgetContainer\");\r\n if (widget.length > 0) {\r\n if (result.reportType === ReportTypeEnum.Pivot) {\r\n if (!isPrinting && result.enableSearchBox) {\r\n gridContainer.css(\"height\", `calc(100% - ${pivotGrid.searchBoxHeight}px)`);\r\n }\r\n }\r\n }\r\n else {\r\n if (result.reportType === ReportTypeEnum.Pivot) {\r\n if (!isPrinting && result.enableSearchBox) {\r\n //31px is the total height of the search box\r\n calculatedHeight -= pivotGrid.searchBoxHeight;\r\n }\r\n }\r\n\r\n if (calculatedHeight > 0) {\r\n if (gridContainer.height() > calculatedHeight) {\r\n gridContainer.height(calculatedHeight);\r\n }\r\n else if (gridContainer.height() === 0) {\r\n gridContainer.height(calculatedHeight);\r\n //gridContainer.height(50);//min-height\r\n }\r\n }\r\n }\r\n\r\n $(window).off(\"resize\", reportView.dobounceReflow).on(\"resize\", reportView.dobounceReflow);\r\n }\r\n\r\n result.isPrinting = isPrinting;\r\n let isGlReport = result.glReport;\r\n gridContainer.attr(\"glreport\", isGlReport);\r\n gridContainer.attr(\"subtotalsposition\", result.subtotalsPosition);//Used to show/hide the summaries when grouping is collapsed\r\n gridContainer.attr(\"enablerowselection\", result.enableRowSelection);\r\n\r\n if (!isPrinting) {\r\n //remove the json content, it is not necessary anymore\r\n gridContainer.data(\"result\", \"\");\r\n gridContainer.attr(\"data-result\", null);\r\n }\r\n\r\n let totalItems = [];\r\n let groupItems = [];\r\n\r\n result.columns = setupGridColumns(result, totalItems, groupItems);\r\n\r\n let countColumns = result.columns.filter(x => !x.isGrouping && !x.isMetric && x.visible);\r\n if (countColumns.length > 0 && result.totalsPosition !== TotalsPositionEnum.None) {\r\n totalItems.push({\r\n column: countColumns[0].dataField,\r\n summaryType: 'count',\r\n displayFormat: `${tagLinkDrilldown}${result.grandTotalText}${(result.showReportRowCount ? \" ({0})\" : \"\")}`\r\n });\r\n }\r\n\r\n if (result.result === null) {\r\n result.hasGrouping = false;\r\n }\r\n\r\n if (countColumns.length > 0 && result.subtotalsPosition !== TotalsPositionEnum.None) {\r\n groupItems.push({\r\n showInColumn: countColumns[0].dataField,\r\n showInGroupFooter: result.subtotalsPosition === TotalsPositionEnum.Bottom,\r\n summaryType: 'custom',\r\n alignByColumn: true,\r\n customizeText: function (e) {\r\n let valueText = e.valueText;\r\n if (valueText) {\r\n valueText = valueText.replace(//g, \"\");\r\n }\r\n\r\n return valueText;\r\n },\r\n name: \"ForSubTotal\",\r\n });\r\n }\r\n\r\n DevExpress.config({ defaultCurrency: result.currencyCode });\r\n\r\n reportSettings.setup(context, result, undefined, isPrinting);\r\n addReportEvents(result, context);\r\n\r\n if (result.reportType === ReportTypeEnum.Analysis) {\r\n let collapseRows = [];\r\n let gridColumns = result.columns.slice();\r\n if (result.numberFixedColumns > 0) {\r\n if (!gridContainer.hasClass(\"fixingColumns\")) {\r\n gridContainer.addClass(\"fixingColumns\");\r\n }\r\n\r\n //**IRNG-1679\r\n gridColumns.push({\r\n name: fakeColumnName, fixed: true, width: 1\r\n })\r\n\r\n if (countColumns.length > 0 && result.subtotalsPosition !== TotalsPositionEnum.None) {\r\n groupItems.push({\r\n column: fakeColumnName,\r\n alignByColumn: true\r\n });\r\n }\r\n //***********\r\n }\r\n else {\r\n gridContainer.removeClass(\"fixingColumns\");\r\n }\r\n\r\n //IRNG-1709\r\n let firstColumn = gridColumns.find(function (x) { return (x.groupIndex === undefined || x.groupIndex === null) && !x.isGrouping && x.visible; })\r\n if (firstColumn) {\r\n firstColumn.cellTemplate = function (container, options) {\r\n if (result.designer.enableRowSelection()) {\r\n container.html(`${linkDrilldown} ${options.text}`);\r\n\r\n $(\"a.drilldowrow\", container).click(function (e) {\r\n reportRowClick(options.row, result, container, e);\r\n });\r\n }\r\n else {\r\n container.html(options.text);\r\n }\r\n }\r\n }\r\n //---\r\n\r\n //IRNG-925\r\n var resizeColumnsCfg = { inProgress: false, column: null, width: null, optionName: \"\" };\r\n gridContainer.on(\"mouseup\", function () {\r\n if (resizeColumnsCfg.inProgress) {\r\n let field = result.designer.fields().find(function (x) { return x.queryName() === resizeColumnsCfg.column.queryName; });\r\n if (field) {\r\n if (result.designer.columnsWidthType() === ColumnsWidthTypeEnum.Automatic) {\r\n //Has scrollbar\r\n if (result.grid.getScrollable().scrollWidth() > result.grid.getScrollable().clientWidth()) {\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Pixel);\r\n }\r\n else {\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Percentage);\r\n //let gridWidth = gridContainer.width() - visibleColumns.length - 1;\r\n let borderWidth = 0;// result.grid.option(\"showColumnLines\") ? 1 : 0;\r\n resizeColumnsCfg.width = `${((resizeColumnsCfg.width + borderWidth) * 100 / gridContainer.width())}%`;\r\n result.grid.columnOption(resizeColumnsCfg.column.dataField, \"width\", resizeColumnsCfg.width);\r\n }\r\n }\r\n\r\n let width = resizeColumnsCfg.width;\r\n if (width && typeof width === \"string\" && (width.includes(\"%\") || width.includes(\"px\"))) {\r\n width = parseFloat(width.replace(\"%\", \"\").replace(\"px\", \"\"));\r\n }\r\n\r\n resizeColumns(result, gridContainer, resizeColumnsCfg.column);\r\n\r\n field.width(width);\r\n\r\n //columnWidth property is obsolete, we need to set it to 0 for the column width to work\r\n if (field.visualizationModeDefinition) {\r\n field.visualizationModeDefinition.columnWidth(0);\r\n }\r\n\r\n reportSettings.saveSettings(result.designer);\r\n }\r\n\r\n resizeColumnsCfg.inProgress = false;\r\n }\r\n });\r\n //---\r\n\r\n if (isExcelPrinting) {\r\n //Set column widths to fit content when exporting to Excel\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Automatic)\r\n gridColumns.forEach(function (column) {\r\n column.width = undefined;\r\n });\r\n }\r\n\r\n result.grid = gridContainer.dxDataGrid({\r\n focusedRowKey: undefined,\r\n focusedRowEnabled: false,\r\n\r\n allowColumnResizing: result.designer.columnResizingMode() === ColumnResizingModeEnum.Widget ? true : !result.designer.includeAllMetrics(),\r\n columnResizingMode: result.designer.columnResizingMode() === ColumnResizingModeEnum.NextColumn ? \"nextColumn\" : \"widget\",\r\n //columnMinWidth: 50,\r\n columnAutoWidth: true,\r\n columnWidth: isPrinting && !isWidget ? \"auto\" : undefined,\r\n\r\n dataSource: result.result,\r\n showRowLines: true,\r\n rowAlternationEnabled: !isGlReport,\r\n showBorders: !isGlReport,\r\n showColumnLines: !isGlReport,\r\n columns: gridColumns,\r\n searchPanel: {\r\n visible: !isPrinting && result.enableSearchBox,\r\n placeholder: 'Search...',\r\n searchVisibleColumnsOnly: true\r\n },\r\n height: isExcelPrinting ? 200 : undefined, //When sending the report as excel by email, we need to set the height for the scrolling.mode works\r\n width: isExcelPrinting ? 200 : undefined, //When sending the report as excel by email, we need to set the width for the scrolling.mode works\r\n scrolling: {\r\n mode: isPrinting && !isExcelPrinting ? 'standard' : 'virtual'\r\n },\r\n paging: {\r\n enabled: false\r\n },\r\n sorting: {\r\n mode: 'none'\r\n },\r\n //columnChooser: {\r\n // enabled: true,\r\n // height: 400,\r\n //},\r\n grouping: {\r\n allowCollapsing: !isGlReport,\r\n autoExpandAll: isGlReport || isPrinting ? true : result.expandAllRows\r\n },\r\n summary: {\r\n totalItems: totalItems,\r\n groupItems: groupItems,\r\n calculateCustomSummary(options) {\r\n calculateCustomSummary.call(this, options, result);\r\n }\r\n },\r\n onEditorPreparing: function (e) {\r\n if ((e as any).isMetric) {//IRNG-1846\r\n e.editorName = \"dxNumberBox\";\r\n }\r\n },\r\n onContextMenuPreparing: function (e) {\r\n let hasGroupColumn = result.columns.filter(x => x.isGrouping).length > 0;\r\n if (e.target === \"content\" && !isGlReport && hasGroupColumn) {\r\n if (!e.items) {\r\n e.items = [];\r\n }\r\n\r\n e.items.push({\r\n text: \"Expand All\",\r\n onItemClick: function () {\r\n e.component.expandAll();\r\n }\r\n });\r\n e.items.push({\r\n text: \"Collapse All\",\r\n onItemClick: function () {\r\n e.component.collapseAll();\r\n }\r\n });\r\n }\r\n\r\n if (e.target === \"header\" && e.column) {\r\n if (result.grid.option(\"allowColumnResizing\")) {\r\n if (!e.items) {\r\n e.items = [];\r\n }\r\n e.items.push({\r\n text: \"Column Resizing Mode\",\r\n items: [\r\n {\r\n text: \"Next Column\",\r\n selectable: true,\r\n onItemClick: function () {\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Automatic);\r\n result.designer.columnResizingMode(ColumnResizingModeEnum.NextColumn);\r\n reportSettings.saveSettings(result.designer);\r\n result.grid.option(\"columnResizingMode\", \"nextColumn\");\r\n },\r\n template: function (itemData) {\r\n return `${itemData.text}${(itemData.items ? `
` : ``)}`\r\n }\r\n },\r\n {\r\n text: \"Widget\",\r\n selectable: true,\r\n onItemClick: function () {\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Pixel);\r\n result.designer.columnResizingMode(ColumnResizingModeEnum.Widget);\r\n resizeColumns(result, gridContainer, null);\r\n reportSettings.saveSettings(result.designer);\r\n resizeColumnsCfg.inProgress = false;\r\n result.grid.option(\"columnResizingMode\", \"widget\");\r\n },\r\n template: function (itemData) {\r\n return `${itemData.text}${(itemData.items ? `
` : ``)}`\r\n }\r\n }\r\n ]\r\n });\r\n }\r\n\r\n if (!result.designer.includeAllMetrics()) {\r\n let column = e.column as any;\r\n let field = result.designer.fields().find(function (x) { return x.queryName() === column.queryName; });\r\n if (field) {\r\n if (!e.items) {\r\n e.items = [];\r\n }\r\n e.items.push({\r\n text: \"Columns Width Type\",\r\n items: [\r\n {\r\n text: \"Automatic\",\r\n selectable: true,\r\n onItemClick: function () {\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Automatic);\r\n resizeColumns(result, gridContainer, null);\r\n reportSettings.saveSettings(result.designer);\r\n resizeColumnsCfg.inProgress = false;\r\n result.grid.repaint();\r\n },\r\n template: function (itemData) {\r\n return `${itemData.text}${(itemData.items ? `
` : ``)}`\r\n }\r\n },\r\n {\r\n text: \"Percentage\",\r\n selectable: true,\r\n onItemClick: function () {\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Percentage);\r\n resizeColumns(result, gridContainer, null);\r\n reportSettings.saveSettings(result.designer);\r\n resizeColumnsCfg.inProgress = false;\r\n },\r\n template: function (itemData) {\r\n return `${itemData.text}${(itemData.items ? `
` : ``)}`\r\n }\r\n },\r\n {\r\n text: \"Pixels\",\r\n selectable: true,\r\n onItemClick: function () {\r\n result.designer.columnsWidthType(ColumnsWidthTypeEnum.Pixel);\r\n resizeColumns(result, gridContainer, null);\r\n reportSettings.saveSettings(result.designer);\r\n resizeColumnsCfg.inProgress = false;\r\n },\r\n template: function (itemData) {\r\n return `${itemData.text}${(itemData.items ? `
` : ``)}`\r\n }\r\n }\r\n ]\r\n });\r\n }\r\n }\r\n }\r\n },\r\n //To apply white background\r\n onCellPrepared: function (e) {\r\n let column = e.column as any;\r\n e.cellElement.css({\r\n \"font-size\": result.fontSize,\r\n \"vertical-align\": \"middle\"\r\n });\r\n \r\n if (e.rowType === \"data\") {\r\n if (!column.isMetric) {\r\n if (column.backgroundColor && column.backgroundColor !== \"\" && column.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n e.cellElement.css(\"background-color\", column.backgroundColor);\r\n }\r\n\r\n if (column.foreColor && column.foreColor !== \"\") {\r\n e.cellElement.css(\"color\", column.foreColor);\r\n }\r\n }\r\n }\r\n\r\n if (e.rowType == 'header' && !column.isGrouping) {\r\n e.cellElement.on('click', function (evt) {\r\n let orderFields = [];\r\n\r\n let sortOrder = !e.column.sortOrder ? \"desc\" : e.column.sortOrder === \"desc\" ? \"asc\" : null;\r\n e.component.beginUpdate();\r\n e.component.clearSorting();\r\n if (sortOrder !== null) {\r\n e.component.columnOption(column.dataField, \"sortOrder\", sortOrder);\r\n orderFields.push({ fieldName: column.queryName, order: sortOrder, orderIndex: 0 })\r\n }\r\n e.component.endUpdate();\r\n\r\n let moreSortFields = $(\"#MoreSortFields\", \".selectList.orderConfig\");\r\n moreSortFields.removeClass(\"active\");\r\n\r\n let directionIndicator = $(\".directionIndicator\", \".selectList.orderConfig\");\r\n directionIndicator.removeClass(\"glyphicon-chevron-down\");\r\n directionIndicator.removeClass(\"glyphicon-chevron-up\");\r\n directionIndicator.removeClass(\"glyphicon-minus\");\r\n if (orderFields.length > 0) {\r\n let firstOrder = orderFields[0];\r\n $(\"select#columnSelect\").val(firstOrder.fieldName);\r\n if (firstOrder.sortOrder === \"desc\") {\r\n directionIndicator.addClass(\"glyphicon-chevron-down\");\r\n }\r\n else {\r\n directionIndicator.addClass(\"glyphicon-chevron-up\");\r\n }\r\n }\r\n else {\r\n $(\"select#columnSelect\").val(\"-1\");\r\n }\r\n\r\n reportView.persistOrderChange(evt, orderFields, false, true);\r\n });\r\n }\r\n\r\n if ((e.rowType === \"totalFooter\" || e.rowType === \"groupFooter\" || e.rowType === \"group\") && column.isMetric) {\r\n let elements = [e.cellElement];\r\n e.cellElement.children().each(function () {\r\n elements.push($(this));\r\n });\r\n\r\n const applyingFormattingRules = (e as any).summaryItems.length > 0 && column.hasFormattingRule;\r\n if (applyingFormattingRules) {\r\n let value = (e as any).summaryItems[0].value;\r\n applyFormattingRuleCell(result, e.cellElement, { column: e.column, value: value, text: null }, e.rowType);\r\n }\r\n else {\r\n elements.forEach(function (element) {\r\n element.css(\"font-size\", result.fontSize);\r\n\r\n if (column.foreColor !== \"#000000\") {\r\n if (!e.cellElement.hasClass(\"fr-row-fontColor-applied\")) {\r\n element.css(\"color\", column.foreColor);\r\n }\r\n }\r\n\r\n if (column.backgroundColor && column.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n if (!e.cellElement.hasClass(\"fr-row-backgroundColor-applied\")) {\r\n element.css(\"backgroundColor\", column.backgroundColor);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if ((e as any).summaryItems.length > 0) {\r\n let value = (e as any).summaryItems[0].value;\r\n //if (column.hasFormattingRule) {\r\n // applyFormattingRuleCell(result, e.cellElement, { column: e.column, value: value, text: null }, e.rowType);\r\n //}\r\n \r\n if (column.thresholdColor && column.thresholdValue !== undefined && column.thresholdValue !== null && value < column.thresholdValue) {\r\n \r\n if (!e.cellElement.hasClass(\"fr-row-fontColor-applied\") && !e.cellElement.hasClass(\"fr-fontColor-applied\")) {\r\n elements.forEach(function (element) {\r\n element.css(\"color\", column.thresholdColor);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (e.rowType === \"totalFooter\") {\r\n let text = e.cellElement.html();\r\n if (text && text.includes(tagLinkDrilldown)) {\r\n let lkDrillDown = linkDrilldown.toString();\r\n if (!result.designer.enableRowSelection()) {\r\n lkDrillDown = \"\";\r\n }\r\n\r\n text = (text as any).replaceAll(tagLinkDrilldown, lkDrillDown);\r\n e.cellElement.html(text);\r\n $(\"a.drilldowrow\", e.cellElement).off(\"click\").on(\"click\", function (ev) {\r\n reportRowClick({}, result, e.cellElement, e);\r\n });\r\n }\r\n }\r\n },\r\n onRowClick: function (e) {\r\n if (isPrinting) {\r\n return;\r\n }\r\n\r\n if (result.designer.enableRowSelection()) {\r\n e.event.stopPropagation();\r\n e.component.beginUpdate();\r\n e.component.option(\"focusedRowEnabled\", true);\r\n e.component.option(\"focusedRowKey\", e.key);\r\n e.component.endUpdate();\r\n }\r\n else {\r\n reportRowClick(e, result, e.element, e.event);\r\n }\r\n },\r\n onInitialized: function (e) {\r\n if (gridColumns.filter(x => x.isGrouping).length > 0 && result.designer.columnsWidthType() == ColumnsWidthTypeEnum.Pixel) {\r\n try {\r\n //Need to force width expand column\r\n //https://intrep.atlassian.net/browse/IRNG-2072\r\n //https://supportcenter.devexpress.com/ticket/details/t494138/dxdatagrid-it-is-impossible-to-set-width-for-the-expand-column-via-code\r\n e.component.columnOption(\"command:expand\", \"width\", 30);\r\n } catch (ex) {\r\n\r\n }\r\n }\r\n },\r\n onKeyDown: function (e) {\r\n showSearchBox(e.event);\r\n },\r\n onContentReady: function (e) {\r\n if (result.totalsPosition === TotalsPositionEnum.Top) {\r\n $(\".dx-datagrid-total-footer\", e.element).css(\"border-bottom\", \"none\").insertBefore($(\".dx-datagrid-rowsview\", e.element));\r\n }\r\n\r\n //Move the header grid row from the header table to the data table, so, the header is printed on each page\r\n if (isPrinting && !isExcelPrinting && !isWidget) {\r\n var headerTable = $(\".dx-datagrid-headers\", e.element);\r\n var headerRow = $(\"table tbody tr\", headerTable);\r\n headerRow.addClass(\"dx-header-row\");\r\n var tableBody = $(\".dx-datagrid-rowsview table tbody\", e.element);\r\n var thead = $(\"\");\r\n thead.prepend(headerRow.clone());\r\n thead.insertBefore(tableBody);\r\n headerTable.addClass(\"hidden\");\r\n }\r\n\r\n if (isGlReport) {\r\n e.component.beginUpdate();\r\n collapseRows.forEach(function (rowKey) {\r\n e.component.collapseRow(rowKey);\r\n });\r\n collapseRows = [];\r\n e.component.endUpdate();\r\n }\r\n\r\n addSeachBoxEvent();\r\n\r\n if (result.subtotalsPosition === TotalsPositionEnum.Bottom) {\r\n const groupCount = gridColumns.filter(x => x.isGrouping).length;\r\n const footerTDSelectors = [\".dx-row.dx-column-lines.dx-datagrid-group-footer > td\", \".dx-datagrid-total-footer .dx-row.dx-footer-row > td\"];\r\n const visColumns = e.component.getVisibleColumns().filter(c => c.groupIndex === undefined && !(c as any).isMetric && c.name !== fakeColumnName);\r\n const groupTotals = (e.component.option(\"summary.groupItems\") as any).filter(g => g.showInGroupFooter);\r\n\r\n if (visColumns.length > 0 && groupTotals.length > 0) {\r\n for (var c = 0; c < footerTDSelectors.length; c++) {\r\n const footerTDSelector = footerTDSelectors[c];\r\n e.element.find(`${footerTDSelector}[aria-colindex='${1 + groupCount}']`).attr(\"colspan\", visColumns.length);\r\n for (let i = 0; i < visColumns.length - 1; i++) {\r\n e.element.find(`${footerTDSelector}[aria-colindex='${2 + groupCount + i}']`).css(\"display\", \"none\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (irngCustom.enableCustomization && irngCustom.onContentReadyReport) {\r\n try {\r\n irngCustom.onContentReadyReport(e, isGlReport, result);\r\n }\r\n catch (err) {\r\n console.log(`Error on irngCustom.onContentReadyReport: ${err.message}`);\r\n }\r\n }\r\n },\r\n onRowPrepared: function (e) {\r\n if (isGlReport) {\r\n\r\n if (e.rowType === \"group\" || e.rowType === \"groupFooter\") {\r\n \r\n e.rowElement.addClass(\"border-top-glreport\");\r\n if (e.rowType === \"groupFooter\") {\r\n //e.rowElement.css(\"border-bottom\", \"2px solid black\")\r\n e.rowElement.addClass(\"border-bottom-glreport\");\r\n e.rowElement.prev().addClass(\"border-bottom-glreport\");\r\n }\r\n\r\n if (e.rowType === \"group\" && e.groupIndex !== undefined) {\r\n for (var i = 0; i < e.key.length; i++) {\r\n let text = e.key[i];\r\n if (e.key[i] && e.key[i].toString) {\r\n text = e.key[i].toString();\r\n }\r\n if ((typeof text === 'string' || text instanceof String) && text.includes(\"\")) {\r\n collapseRows.push(e.key);\r\n //e.rowElement.css(\"border-bottom\", \"2px solid black\")\r\n e.rowElement.addClass(\"border-bottom-glreport\");\r\n e.rowElement.addClass(\"gl-row-collapsed\");\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n onOptionChanged(e) {\r\n //IRNG-925\r\n if (e.fullName.startsWith(\"columns[\") && e.fullName.includes(\"].width\")) {\r\n resizeColumnsCfg.inProgress = true;\r\n resizeColumnsCfg.column = result.grid.option(e.fullName.replace(\"].width\", \"]\"));\r\n resizeColumnsCfg.width = e.value;\r\n resizeColumnsCfg.optionName = e.fullName;\r\n }\r\n //---\r\n }\r\n }).dxDataGrid('instance');\r\n }\r\n else {\r\n pivotGrid.setup({ result, isGlReport, gridContainer, isPrinting, isExcelPrinting });\r\n }\r\n };\r\n\r\n return {\r\n setup: setup,\r\n resize: resize,\r\n addDrilldownClick: addDrilldownClick,\r\n getGridDiv: getGridDiv,\r\n getGridInstance: getGridInstance,\r\n getAutoGroupingText: getAutoGroupingText,\r\n getTagLinkDrilldown: function () { return tagLinkDrilldown; },\r\n getLinkDrilldown: function () { return linkDrilldown; },\r\n getFormattingScaleColor: getFormattingScaleColor,\r\n applyFormattingRuleCell: applyFormattingRuleCell,\r\n drawBarColumn: drawBarColumn,\r\n calculateCustomSummary: calculateCustomSummary\r\n };\r\n}()) as any;","class ReportField {\r\n isAutoGroupField: boolean;\r\n autoGrouping: string;\r\n groupingType: GroupingTypeEnum;\r\n isReportMetric: boolean;\r\n Index: number;\r\n displayName: string;\r\n queryName: string;\r\n color: KnockoutObservable;\r\n visible: KnockoutObservable;\r\n label: string;\r\n serieName: string;\r\n\r\n //from Field class\r\n tableName: string;\r\n //property is renamed in JsonProperty attribute\r\n get table(): string {\r\n return this.tableName;\r\n }\r\n set table(value: string) {\r\n this.tableName = value;\r\n }\r\n fieldName: string;\r\n restrictBy: boolean;\r\n type: any;\r\n\r\n constructor() {\r\n this._isMetric = null;\r\n //Start with empty, but it will be updated later again\r\n this.serieName = \"\";\r\n }\r\n\r\n private _isMetric: boolean = null;\r\n get isMetric(): boolean {\r\n if (this._isMetric === null)\r\n this._isMetric = this.isReportMetric || this.table !== undefined && this.table === \"metrics\";\r\n return this._isMetric;\r\n }\r\n set isMetric(value: boolean) {\r\n this._isMetric = value;\r\n }\r\n}\r\n\r\nclass MetricField extends ReportField {\r\n metricContainer: MetricContainer;\r\n mappingMetricId: string;\r\n yAxisChartDefinition: YAxisChartDefinition;\r\n\r\n //Only in JS class to format tooltip(initial for bubble)\r\n format: MetricFormat;\r\n\r\n constructor() {\r\n super(); //call base class constructor\r\n this.yAxisChartDefinition = new YAxisChartDefinition();\r\n }\r\n}\r\n\r\nclass MetricContainer {\r\n metric: any;\r\n comparisonType: any;\r\n comparisonFilterId: string;\r\n groupingType: any;\r\n functionType: any;\r\n //queryName: string;\r\n}\r\n\r\nclass MetricFormat {\r\n decimalPlaces: number;\r\n currencySymbol: string;\r\n currencySymbolPosition: number;\r\n isPercent: boolean;\r\n}\r\n\r\nenum ColumnResizingModeEnum {\r\n NextColumn = 0,\r\n Widget = 1\r\n}\r\n\r\nenum GroupingTypeEnum {\r\n SUM = 0,\r\n MIN = 1,\r\n MAX = 2,\r\n WSUM = 3,\r\n GROUP_BY = 4,\r\n NONE = 5,\r\n COUNT = 6,\r\n DSUM = 7,\r\n WDSUM = 8,\r\n TSUM = 9\r\n}\r\n\r\nenum FunctionTypeEnum {\r\n Normal = 0,\r\n PercentOfTotal = 1,\r\n Accumulated = 2,\r\n AccumulatedAll = 3,\r\n PercentOfRowTotal = 4,\r\n PercentOfRowGrandTotal = 5,\r\n PercentOfColumnTotal = 6,\r\n PercentOfColumnGrandTotal = 7,\r\n AbsoluteVariation = 8,\r\n PercentVariation = 9,\r\n Rank = 10,\r\n}\r\n\r\nenum TotalsPositionEnum {\r\n None = 0,\r\n Bottom = 1,\r\n Top = 2\r\n}\r\n\r\nenum ComparisonTypeEnum {\r\n None = 0,\r\n Value = 1,\r\n Variation = 2,\r\n PercentageVariation = 3\r\n}\r\n\r\nenum ReportTypeEnum {\r\n Analysis = 0,\r\n Pivot = 1,\r\n Chart = 2,\r\n None = 3\r\n}\r\n\r\nenum AutoGroupingEnum {\r\n None = 0,\r\n ByDay = 2,\r\n ByWeek = 3,\r\n ByMonth = 4,\r\n ByQuarter = 5,\r\n ByYear = 6,\r\n ByMonthOnly = 7,\r\n ByQuarterOnly = 8\r\n}\r\nenum AutoGroupingStrEnum {\r\n None = \"None\",\r\n ByDay = \"ByDay\",\r\n ByWeek = \"ByWeek\",\r\n ByMonth = \"ByMonth\",\r\n ByQuarter = \"ByQuarter\",\r\n ByYear = \"ByYear\",\r\n ByMonthOnly = \"ByMonthOnly\",\r\n ByQuarterOnly = \"ByQuarterOnly\"\r\n}\r\n\r\nenum ColumnsWidthTypeEnum {\r\n Automatic = 0,\r\n Percentage = 1,\r\n Pixel = 2\r\n}\r\n\r\nenum CalculateTotalsEnum {\r\n UseFormula = 0,\r\n SumRows = 1\r\n}\r\n\r\nenum FieldFormatEnum {\r\n None = 0,\r\n Currency = 1,\r\n Numeric = 2,\r\n Percentage = 3,\r\n String = 4,\r\n Date = 5\r\n}\r\n\r\nenum TopBottomEnum {\r\n None = \"None\",\r\n All = \"All\",\r\n Top = \"Top\",\r\n Bottom = \"Bottom\"\r\n}\r\n\r\nenum FieldFormatStrEnum {\r\n None = \"None\",\r\n Currency = \"Currency\",\r\n Numeric = \"Numeric\",\r\n Percentage = \"Percentage\",\r\n String = \"String\",\r\n Date = \"Date\"\r\n}\r\n\r\nenum ComparisonDateOptionStrEnum {\r\n Manual = \"Manual\",\r\n Previous = \"Previous\",\r\n Predefined = \"Predefined\"\r\n}\r\n\r\nenum ComparisonDateUnitStrEnum {\r\n Year = \"Year\",\r\n Quarter = \"Quarter\",\r\n Month = \"Month\",\r\n //Week = \"Week\",\r\n Day = \"Day\"\r\n}","declare var _: any;\r\nvar reportView = (function () {\r\n var pivotSelected = function (parentContext = undefined) {\r\n if (!parentContext)\r\n parentContext = getParentContext();\r\n return parentContext.find(\"#ReportType\").val() === ReportTypeStrEnum.Pivot;\r\n };\r\n\r\n var getMode = function (parentContext: JQuery = null) : string {\r\n return irGlobal.getMode(parentContext);\r\n };\r\n\r\n var updateOutput = function (data) {\r\n irGlobal.updateOutput(data);\r\n\r\n if (data && tabView) {\r\n tabView.updatePropertiesTabs(data.tabs);\r\n }\r\n\r\n let selectGroupBy = $(\"select#GroupByReports\", getParentContext());\r\n let noReportSelectedOption = $(\"option[value='0']\", selectGroupBy);\r\n if (noReportSelectedOption) {\r\n noReportSelectedOption.attr(\"hidden\", pivotSelected() as any);\r\n }\r\n let selectAnalyzeBy = $(\"select#AnalyzeByReports\", getParentContext());\r\n noReportSelectedOption = $(\"option[value='0']\", selectAnalyzeBy);\r\n if (noReportSelectedOption) {\r\n noReportSelectedOption.attr(\"hidden\", true as any);\r\n }\r\n };\r\n var getTabBaseObject = function (objectToExtend) {\r\n return tabView.getBaseSubmitObject(objectToExtend);\r\n };\r\n\r\n var getPivotMetrics = function () {\r\n var context = getParentContext();\r\n var metrics = [];\r\n if (!pivotSelected()) return metrics;\r\n\r\n var metricsChecked = $(\".pivotMetrics input[type='checkbox']\", context);\r\n\r\n metricsChecked.each(function () {\r\n var metricName = $(this).val() as any;\r\n var colorContainer = $(this).closest(\"li.pivotMetricContainer\");\r\n\r\n var isChecked = $(this).prop(\"checked\");\r\n var foreColor = $(colorContainer).data(\"forecolor\");\r\n var backColor = $(colorContainer).data(\"backcolor\");\r\n var isReportMetric = $(colorContainer).data(\"isreportmetric\");\r\n\r\n //IRNG-1300: need to test this implementation, probably metric will be a problem\r\n var metricContainerValues = metricName.split(\"_\");\r\n\r\n metrics.push({\r\n metricName: metricName,\r\n metricContainer: {\r\n metric: parseInt(metricContainerValues[0].substring(1)),\r\n comparisonType: parseInt(metricContainerValues[2].substring(1)),\r\n comparisonFilterId: metricContainerValues[3].substring(1),\r\n functionType: parseInt(metricContainerValues[1].substring(1)),\r\n },\r\n isChecked: isChecked,\r\n foreColor: foreColor,\r\n backgroundColor: backColor,\r\n isReportMetric: isReportMetric,\r\n });\r\n\r\n });\r\n return metrics;\r\n };\r\n\r\n var getDrilldownId = function (parentContext = undefined, nextDrilldownId = undefined) {\r\n if (!parentContext) {\r\n parentContext = getParentContext();\r\n }\r\n\r\n let drilldownId = parentContext.data(\"drilldownid\");\r\n let reportId = parseInt($(\"select#AnalyzeByReports\").val() as any, 10);\r\n if (nextDrilldownId) {\r\n let widget = parentContext.closest(\"div.dashboardWidget\");\r\n if (widget && widget.length > 0) {\r\n let vm = ko.contextFor(widget.find(\".widget-config\")[0]).$data;\r\n parentContext = vm.popoverDiv;\r\n }\r\n\r\n let $currentDrilldownSelect = $(\"ul#CurrentDrillDowns select.nextDrilldownSelect\", parentContext);\r\n //So if we have no current drilldown then it's just the first one...\r\n drilldownId = $currentDrilldownSelect.data(\"drilldownid\");\r\n reportId = parseInt($currentDrilldownSelect.val() as any || 0, 10);\r\n return { newDrilldownId: drilldownId, newReportId: reportId };\r\n }\r\n\r\n return drilldownId;\r\n\r\n };\r\n\r\n var drilldownIsPossible = function (context = undefined) {\r\n if (!context)\r\n context = getParentContext();\r\n\r\n let nextDrilldown = getDrilldownId(context, true);\r\n let aggregateReport = context.find(\".resultsTableContainer\").data(\"aggregatereport\");\r\n return nextDrilldown.newReportId !== 0 && aggregateReport === \"True\";\r\n };\r\n\r\n var analyzeByChanged = function (evt) {\r\n if (pivotSelected()) {\r\n var pivotGroup = $(\"select#GroupByReports\", getParentContext()).val();\r\n if (pivotGroup === \"0\") {\r\n return;\r\n }\r\n } else {\r\n //Reset these values.\r\n //$(\"#TopBottomSelect\").val(\"-1\");\r\n //$(\"select#topOrderSelect\").val(\"-1\");\r\n //columnOpts.clone().prop(\"selected\", \"\")\r\n }\r\n\r\n let config = getReportConfig(true);\r\n let newReportId = 0;\r\n if (!vm.switching) {\r\n newReportId = $(evt.target).val() as any;\r\n config[\"newReportId\"] = newReportId;\r\n }\r\n\r\n let url = urlConfigs.workBook + (vm.switching ? \"SwitchAnalyzeByAndGroupBy\" : \"ChangeReport\");\r\n\r\n irGlobal.updateFromServer(evt,\r\n url,\r\n config,\r\n function (data) {\r\n if (vm.switching) {\r\n newReportId = data.analyzeById;\r\n groupBy(data.groupById.toString());\r\n analyzeBy(data.analyzeById.toString());\r\n vm.switching = false;\r\n }\r\n\r\n updateOutput(data.results || data);\r\n if (data.analyzeBy) {\r\n let context = getParentContext();\r\n $(\"#AnalyzeByReportList\", context).replaceWith(data.analyzeBy);\r\n addReportSelectorEvents(context);\r\n }\r\n\r\n let parentContext = getParentContext();\r\n var drillDownId = parentContext.data(\"drilldownid\");\r\n\r\n if (drillDownId >= 0) {\r\n parentContext.data(\"drilldownid\", parseInt(newReportId as any, 10));\r\n }\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true\r\n );\r\n\r\n };\r\n var setTotalsVisibility = function (show) {\r\n var context = getParentContext();\r\n var isPivotSelected = pivotSelected();\r\n var groupConfig = context.find(\"div.groupConfig\");\r\n if (!show) {\r\n if (!groupConfig.hasClass(\"hidden\")) groupConfig.addClass(\"hidden\");\r\n return;\r\n\r\n }\r\n if (groupConfig.hasClass(\"hidden\") && !isPivotSelected) groupConfig.removeClass(\"hidden\");\r\n };\r\n var groupByChanged = function (evt) {\r\n if (vm.switching)\r\n return;\r\n\r\n var select = $(evt.currentTarget);\r\n var selectedGroupId = select.val();\r\n if (vm.reportType() === ReportTypeStrEnum.Pivot && vm.groupBy() === \"0\" && selectedGroupId != \"0\") {\r\n changePivotVisibility(false);\r\n }\r\n\r\n vm.groupBy(selectedGroupId);\r\n\r\n if (selectedGroupId === \"0\") {\r\n removeGroupBy(evt);\r\n return;\r\n }\r\n var config = getReportConfig(true);\r\n\r\n if (config.reportId === selectedGroupId) {\r\n irGlobal.showError(true, \"Group and Analysis reports cannot match\");\r\n setTotalsVisibility(false);\r\n $(select).closest(\"div.form-group\").addClass(\"has-error\");\r\n return;\r\n }\r\n\r\n setTotalsVisibility(true);\r\n select.closest(\"div.form-group\").removeClass(\"has-error\");\r\n irGlobal.updateFromServer(evt, urlConfigs.workBook + \"ChangeGroupBy\", config, updateOutput, null, true);\r\n };\r\n\r\n var showDrilldownPopup = function () {\r\n var getDrilldownData = function () {\r\n let data = $(\"#DrilldownJson\", getParentContext()).text();\r\n return JSON.parse(data);\r\n };\r\n var drilldownListElementClass = \"drilldownListElement\";\r\n var drillDialog = bootbox.dialog({\r\n title: \"Drilldown Reports\",\r\n message: \"

    \",\r\n show: false,\r\n buttons: {\r\n cancel: {\r\n label: \"Cancel\",\r\n className: \"btn-danger\",\r\n callback: function () {\r\n }\r\n },\r\n ok: {\r\n label: \"Save\",\r\n className: \"btn-success\",\r\n callback: function (evt) {\r\n var currDialog = $(this);\r\n\r\n var listElements = $(\"li.\" + drilldownListElementClass, \"ul.drilldownpopuplist\");\r\n var drilldownReports = [];\r\n var drilldownIndex = 1;\r\n\r\n $.each(listElements,\r\n function (index, element) {\r\n var currentSelect = $(\"select.drilldownReportsSelect\", element);\r\n var selectedReport = $(\"option:selected\", currentSelect);\r\n var reportId = parseInt(selectedReport.val() as any, 10);\r\n var drilldownId = currentSelect.data(\"drilldownid\");\r\n var isAggregative = $(selectedReport).attr('data-aggregative');\r\n\r\n var checkDuplicateInArray = function (element) { return element.reportId === reportId; }\r\n if (reportId !== 0 && !drilldownReports.some(checkDuplicateInArray)) {\r\n drilldownReports.push({\r\n reportId: reportId,\r\n drilldownId: drilldownId,\r\n order: drilldownIndex,\r\n isAggregative: isAggregative == 'true'\r\n });\r\n drilldownIndex = drilldownIndex + 1;\r\n }\r\n });\r\n\r\n var requestJson = { reports: drilldownReports } as any;\r\n let widget = getParentContext().closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n if (isWidget) {\r\n requestJson.widgetId = widget.data(\"widgetid\");\r\n }\r\n\r\n var hasChanged = false;\r\n var notAggregatives = _.filter(drilldownReports, function (x) { return !x.isAggregative; });\r\n\r\n if (notAggregatives.length > 0) {\r\n var minOrder = _.min(_.map(notAggregatives, 'order'));\r\n hasChanged = drilldownReports[drilldownReports.length - 1].order > minOrder;\r\n }\r\n\r\n var confirmDrillDialog = null;\r\n var completeFunction = function (data) {\r\n if (data.fullTabResult) {\r\n getParentContext().replaceWith(data.fullTabResult);\r\n reportView.setup();\r\n irGlobal.enableUpdateButton(false);\r\n addDrilldownActions();\r\n return;\r\n }\r\n\r\n let widget = getParentContext().closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n\r\n if (isWidget) {\r\n updateOutputAfterDrilldown(data, getParentContext());\r\n }\r\n else {\r\n $(\"#DrilldownReportsList\").replaceWith(data.drilldownList);\r\n addDrilldownActions();\r\n }\r\n\r\n if (confirmDrillDialog != null) {\r\n confirmDrillDialog.modal(\"hide\");\r\n drillDialog.modal(\"hide\");\r\n }\r\n };\r\n\r\n if (hasChanged) {\r\n confirmDrillDialog = bootbox.dialog({\r\n title: \"Attention\",\r\n message: \"

    The remaining reports cannot be drilled into. Proceed with this change?

    \",\r\n show: false,\r\n buttons: {\r\n no: {\r\n label: \"No\",\r\n className: \"btn-danger\",\r\n callback: function () {\r\n }\r\n },\r\n yes: {\r\n label: \"Yes\",\r\n className: \"btn-success\",\r\n callback: function (evt) {\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"UpdateDrilldownReport\",\r\n requestJson,\r\n completeFunction, null, true);\r\n }\r\n }\r\n }\r\n });\r\n\r\n confirmDrillDialog.modal(\"show\");\r\n return false;\r\n }\r\n else {\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"UpdateDrilldownReport\",\r\n requestJson,\r\n completeFunction, null, true);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n var addDrilldownElement = function (evt) {\r\n var currentElement = $(evt.currentTarget).closest(\"li\");\r\n\r\n var newElement = $(currentElement.clone());\r\n var newSelect = $(\"select\", newElement);\r\n newSelect.val(0);\r\n\r\n currentElement.after(newElement);\r\n changeOrderVisibility();\r\n };\r\n\r\n var checkDuplicate = function () {\r\n\r\n var items = $(\".drilldownpopuplist select.drilldownReportsSelect\");\r\n $.each(items,\r\n function (index, element) {\r\n var value = $(element).val();\r\n var sameValueElements = $(\".drilldownpopuplist select.drilldownReportsSelect\").filter(function () { return (this as any).value == value });\r\n if (sameValueElements.length > 1) {\r\n $(element).addClass(\"duplicated\");\r\n }\r\n else {\r\n $(element).removeClass(\"duplicated\");\r\n }\r\n });\r\n }\r\n\r\n var moveField = function (evt) {\r\n\r\n var field = $(evt.currentTarget);\r\n var orderDown = true;\r\n if (field.hasClass(\"changeOrderUp\")) {\r\n orderDown = false;\r\n }\r\n\r\n var listElement = field.closest(\"li.\" + drilldownListElementClass);\r\n\r\n if (!orderDown) {\r\n var previousElement = listElement.prev(\"li.\" + drilldownListElementClass);\r\n var prevOrderIndex = previousElement.data(\"orderindex\");\r\n var currOrderIndex = listElement.data(\"orderindex\");\r\n\r\n listElement.data(\"orderindex\", prevOrderIndex);\r\n previousElement.data(\"orderindex\", currOrderIndex);\r\n\r\n previousElement.before(listElement);\r\n } else {\r\n var nextElement = listElement.next(\"li.\" + drilldownListElementClass);\r\n nextElement.after(listElement);\r\n }\r\n changeOrderVisibility();\r\n };\r\n\r\n var changeOrderVisibility = function () {\r\n var listElements = $(\"li.\" + drilldownListElementClass, \"ul.drilldownpopuplist\");\r\n\r\n var changeField = $(\"span.changeOrder span.glyphicon\", listElements);\r\n if (listElements.length === 1) {\r\n changeField.addClass(\"hidden\");\r\n }\r\n var elementCount = listElements.length;\r\n $.each(listElements,\r\n function (index, element) {\r\n\r\n var addDrilldown = $(\"span.addDrilldown\", element);\r\n var removeDrilldown = $(\"button.removedrilldown\", element);\r\n var selectElement = $(\"select.drilldownReportsSelect\", element);\r\n var changeOrderUp = $(\"span.changeOrderUp\", element);\r\n var changeOrderDown = $(\"span.changeOrderDown \", element);\r\n var orderElement = $(\"span.changeOrder\", element);\r\n\r\n addDrilldown.off();\r\n removeDrilldown.off();\r\n selectElement.off();\r\n changeOrderUp.off();\r\n changeOrderDown.off();\r\n if (elementCount > 1) {\r\n orderElement.removeClass(\"hidden\");\r\n if (index === 0) {\r\n changeOrderDown.removeClass(\"hidden\");\r\n }\r\n }\r\n\r\n if (index === 0) {\r\n changeOrderUp.addClass(\"hidden\");\r\n } else if (index > 0 && index < elementCount - 1) {\r\n changeOrderUp.removeClass(\"hidden\");\r\n changeOrderDown.removeClass(\"hidden\");\r\n } else if (index === elementCount - 1) {\r\n changeOrderDown.addClass(\"hidden\");\r\n }\r\n\r\n if (index === 0 && selectElement.val() === \"0\" && elementCount === 1)\r\n removeDrilldown.addClass(\"hidden\");\r\n else\r\n removeDrilldown.removeClass(\"hidden\");\r\n\r\n selectElement.off(\"change\").on(\"change\", checkDuplicate);\r\n\r\n addDrilldown.on(\"click\", addDrilldownElement);\r\n changeOrderUp.on(\"click\", moveField);\r\n changeOrderDown.on(\"click\", moveField);\r\n removeDrilldown.on(\"click\", removeField);\r\n\r\n });\r\n };\r\n drillDialog.on(\"show.bs.modal\",\r\n function () {\r\n let widget = getParentContext().closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n\r\n let reportList = isWidget ? $(\"#DrilldownReportsList\", widget) : $(\"#DrilldownReportsList\");\r\n let drilldownElements = $(\"div.drilldownElements\", reportList).clone();\r\n drilldownElements = $(\"
  • \" + drilldownElements.html() + \"
  • )\");\r\n\r\n let dialog = $(this);\r\n $(\"span.addDrilldown\", drilldownElements).removeClass(\"hidden\");\r\n $(\"span.remove\", drilldownElements).removeClass(\"hidden\");\r\n let $popuplList = $(\"ul.drilldownpopuplist\", dialog);\r\n let drilldownData = getDrilldownData();\r\n\r\n let nextDrilldownSelect = $(\"ul#CurrentDrillDowns select.nextDrilldownSelect\", reportList);\r\n if (nextDrilldownSelect.data(\"drilldownid\")) {\r\n /*We have an existing entry for this drilldown in the JSON so we now \r\n replace the reportId to the currently selected one.*/\r\n\r\n let existingDrilldown = drilldownData.find(element => element.id === nextDrilldownSelect.data(\"drilldownid\"));\r\n if (existingDrilldown) {\r\n let existingIndex = drilldownData.indexOf(existingDrilldown);\r\n\r\n existingDrilldown.id = parseInt(nextDrilldownSelect.val() as any, 10);\r\n drilldownData[existingIndex] = existingDrilldown;\r\n }\r\n } else {\r\n //So if it's one of the 'new next drilldown' items selectors.\r\n let selectedNextReportId = parseInt(nextDrilldownSelect.val() as any, 10);\r\n if (selectedNextReportId !== 0) {\r\n let maxOrder = 0;\r\n if (drilldownData) maxOrder = Math.max(...drilldownData.map(d => d.order));\r\n let newOrder = maxOrder + 1;\r\n let newElement = { id: selectedNextReportId, order: newOrder };\r\n drilldownData.push(newElement);\r\n }\r\n }\r\n\r\n if (!drilldownData || drilldownData.length === 0)\r\n $popuplList.append(drilldownElements);\r\n\r\n $.each(drilldownData,\r\n function (index, element) {\r\n let $newElement = drilldownElements.clone();\r\n let reportId = element.id;\r\n\r\n let currentSelect = $(\"select\", $newElement);\r\n\r\n $(\"option[value='\" + reportId + \"']\", currentSelect).prop(\"selected\", true);\r\n\r\n $popuplList.append($newElement);\r\n\r\n });\r\n\r\n changeOrderVisibility();\r\n checkDuplicate();\r\n\r\n //Save the original position of data\r\n var liItems = $('li', $($popuplList));\r\n $.each(liItems,\r\n function (index, element) {\r\n $(element).attr('data-index', index);\r\n }\r\n );\r\n\r\n });\r\n drillDialog.modal(\"show\");\r\n\r\n var removeField = function (evt) {\r\n var $listElement = $(evt.currentTarget).parents(\"li.drilldownListElement\");\r\n var list = $(evt.currentTarget).closest(\"ul.drilldownpopuplist\").find(\"li.drilldownListElement\");\r\n if (list.length === 1)\r\n addDrilldownElement(evt);\r\n $listElement.remove();\r\n changeOrderVisibility();\r\n }\r\n\r\n $(\"button.removedrilldown\", drillDialog).off(\"click\").on(\"click\", removeField);\r\n };\r\n\r\n var enableDisabledDrilldown = function () {\r\n if (reportType() === ReportTypeStrEnum.Analysis || reportType() === ReportTypeStrEnum.Pivot) {\r\n let context = getParentContext();\r\n let widget = context.closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n let aggregateReport = context.find(\".resultsTableContainer\").data(\"aggregatereport\");\r\n let drilldownSelect = isWidget ? $(\"li#DrilldownReportsList select.nextDrilldownSelect\", widget) : $(\"li#DrilldownReportsList select.nextDrilldownSelect\");\r\n let nextDrilldown = parseInt(drilldownSelect.val() as any ?? 0, 10);\r\n let grid = reportType() === ReportTypeStrEnum.Analysis ? report.getGridDiv(context) : pivotGrid.getPivotDiv(context);\r\n if (aggregateReport === \"True\" && nextDrilldown !== undefined && nextDrilldown !== null && nextDrilldown != 0) {\r\n grid.addClass(\"drilldown-enable\");\r\n }\r\n else {\r\n grid.removeClass(\"drilldown-enable\");\r\n }\r\n }\r\n }\r\n\r\n var addDrilldownActions = function () {\r\n let successFunction = function (data) {\r\n updateOutputAfterDrilldown(data, getParentContext());\r\n };\r\n let onDrillBack = function (evt, isWidget, data) {\r\n updateOutputAfterDrilldown(data, getParentContext(), function () {\r\n if (isWidget) {\r\n //Fix the popup html. Always need to update the popup html after updating the widget\r\n let popup = $(evt.currentTarget).closest(\".dx-popup-normal\");\r\n $(\"#DrilldownReportsList\", popup).parent().remove();\r\n let html = $(\"#widget-drilldownlist\", getParentContext().closest(\"div.dashboardWidget\")).html();\r\n $(\".dx-popup-content\", popup).append(html);\r\n reportView.addDrilldownActions();\r\n }\r\n });\r\n }\r\n\r\n $(\"li#DrilldownReportsList button.adddrilldown\").off(\"click\").on(\"click\", showDrilldownPopup);\r\n\r\n $(\".nextDrilldownSelect\").off(\"change\").on(\"change\", function () {\r\n\r\n if ($(this).closest(\".widgetDrilldown\").length > 0) {\r\n const widgetId = $(this).closest(\".widgetDrilldown\").data(\"widgetid\");\r\n let hiddenDropDown = $(\".nextDrilldownSelect\", `.dashboardWidget[data-widgetid=${widgetId}]`);\r\n $(\"option\", hiddenDropDown).removeAttr(\"selected\");\r\n $(`option[value=${(this as any).value}]`, hiddenDropDown).attr(\"selected\", \"selected\");\r\n }\r\n\r\n let button = $(\"button.removedrilldown\", $(this).closest(\"#DrilldownReportsList\"));\r\n if ((this as any).value === \"0\")\r\n button.attr(\"disabled\", true as any);\r\n else\r\n button.removeAttr(\"disabled\");\r\n\r\n enableDisabledDrilldown();\r\n })\r\n\r\n let $drillbackButton = $(\"button.drillback\");\r\n\r\n let drillBack = function (evt) {\r\n let links = $(\"div#drilldownLinks a.drilldownLink\", $(evt.currentTarget).closest(\"#DrilldownReportsList\"));\r\n let previousLink = links[links.length - 2];\r\n let previousDrilldown = $(previousLink).data(\"drilldownid\");\r\n\r\n let reportObj = getTabBaseObject({ newDrilldownId: previousDrilldown });\r\n let widget = getParentContext().closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n if (isWidget) {\r\n reportObj.widgetId = widget.data(\"widgetid\");\r\n }\r\n\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"NavigateToDrilldownLink\",\r\n reportObj,\r\n function (data) { onDrillBack(evt, isWidget, data); },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n\r\n $drillbackButton.off(\"click\").on(\"click\", drillBack);\r\n $drillbackButton.each(function () {\r\n let context = $(this).closest(\"#DrilldownReportsList\");\r\n let links = $(\"div#drilldownLinks a.drilldownLink\", context);\r\n\r\n if (links.length > 0)\r\n $(this).removeClass(\"hidden\");\r\n else\r\n $(this).addClass(\"hidden\");\r\n });\r\n\r\n let $links = $(\"div#drilldownLinks a.drilldownLink\");\r\n $links.off(\"mouseover\").on(\"mouseover\",\r\n function () {\r\n $(this).css(\"cursor\", \"pointer\");\r\n }\r\n );\r\n $links.off(\"click\").on(\"click\",\r\n function (evt) {\r\n evt.preventDefault();\r\n var newDrilldownId = $(this).data(\"drilldownid\");\r\n var reportObj = getTabBaseObject({ newDrilldownId: newDrilldownId });\r\n\r\n let widget = getParentContext().closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n if (isWidget) {\r\n reportObj.widgetId = widget.data(\"widgetid\");\r\n }\r\n\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"NavigateToDrilldownLink\",\r\n reportObj,\r\n function (data) { onDrillBack(evt, isWidget, data); },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n });\r\n\r\n enableDisabledDrilldown();\r\n };\r\n\r\n var reportType = function (context = undefined) {\r\n return chartSelected(context) ? ReportTypeStrEnum.Chart : pivotSelected(context) ? ReportTypeStrEnum.Pivot : ReportTypeStrEnum.Analysis;\r\n };\r\n\r\n var groupBy = function (value = undefined) {\r\n var context = getParentContext();\r\n var select = context.find(\"select#GroupByReports\");\r\n if (value !== undefined) {\r\n select.find(\"option:selected\").removeAttr(\"selected\");\r\n select.find(`option[value='${value}']`).attr(\"selected\", \"selected\");\r\n select.val(value);\r\n\r\n if (!vm.switching) {\r\n select.trigger('change');\r\n }\r\n }\r\n else\r\n return $(\"option:selected\", select).val();\r\n };\r\n\r\n var analyzeBy = function (value = undefined) {\r\n var context = getParentContext();\r\n var select = context.find(\"select#AnalyzeByReports\");\r\n if (value !== undefined) {\r\n select.find(\"option:selected\").removeAttr(\"selected\");\r\n select.find(`option[value='${value}']`).attr(\"selected\", \"selected\");\r\n select.val(value);\r\n\r\n if (!vm.switching) {\r\n select.trigger('change');\r\n }\r\n }\r\n else\r\n return $(\"option:selected\", select).val();\r\n };\r\n\r\n var getReportConfig = function (updateResult = undefined) {\r\n var context = getParentContext();\r\n var selectedGroupBy = groupBy();\r\n var selectedAnalyzeBy = analyzeBy();\r\n\r\n var configObject = {\r\n updateResults: updateResult,\r\n reportType: reportType(),\r\n pivotMetrics: getPivotMetrics(),\r\n reportId: selectedAnalyzeBy,\r\n AnalysisGroupReportId: selectedGroupBy,\r\n pivotGroupId: selectedGroupBy,\r\n nextDrilldown: getDrilldownId(context, true)\r\n };\r\n $.extend(configObject,\r\n filtersManager.getFilterValues()\r\n );\r\n var reportObj = getTabBaseObject(configObject);\r\n\r\n return reportObj;\r\n };\r\n\r\n var updateConfig = function (updateResult, evt, orderConfig, useJson, postUpdateFunction = undefined) {\r\n\r\n if (reportType() === ReportTypeStrEnum.Pivot) {\r\n if (groupBy() === \"0\") {\r\n var context = getParentContext();\r\n var groupByElement = $(\"#GroupByReports\", context).siblings(\"span.select2\")\r\n groupByElement.addClass([\"animate__animated\", \"animate__headShake\"]);\r\n groupByElement.off().on('animationend', () => {\r\n groupByElement.removeClass([\"animate__animated\", \"animate__headShake\"]);\r\n });\r\n return false;\r\n }\r\n\r\n $(\"#TopBottomSelect\").val(\"-1\");\r\n $(\"select#topOrderSelect\").val(\"-1\");\r\n }\r\n\r\n if (updateResult === undefined || typeof updateResult !== \"boolean\") {\r\n updateResult = true;\r\n }\r\n var config = getReportConfig(updateResult);\r\n var successFunction = function (data) {\r\n if (updateResult) {\r\n updateOutput(data);\r\n }\r\n if (irGlobal.isFunction(postUpdateFunction)) {\r\n postUpdateFunction(data);\r\n }\r\n\r\n adjustReportTypeTitle();\r\n };\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"ChangeConfig\",\r\n config,\r\n successFunction,\r\n null,\r\n useJson,\r\n \"POST\",\r\n updateResult);\r\n\r\n return true;\r\n };\r\n\r\n //To be removed??\r\n var dobounceReflow =\r\n irGlobal.debounce(function () {\r\n let context = getParentContext();\r\n report.resize(context);\r\n resizeReportSettings();\r\n },\r\n 250,\r\n false);\r\n\r\n var updatePivotMetricColor = function (evt, colorModal, metricName) {\r\n var context = getParentContext();\r\n\r\n var popupControl =\r\n $(\".pivotMetricContainer[data-metricname='\" + metricName + \"']\", context);\r\n var $foreColorSelector = $(\"input#foreColorSelector\", colorModal);\r\n var $backColorSelector = $(\"input#backColorSelector\", colorModal);\r\n\r\n\r\n if ($backColorSelector.attr(\"set\") === \"true\") {\r\n var backColor = $backColorSelector.val() as any;\r\n popupControl.data(\"backcolor\", backColor);\r\n popupControl.css(\"background-color\", backColor);\r\n\r\n global.enableUpdateButton(enablePivotPost, function () { updateConfig(true, evt, null, true); }, evt);\r\n\r\n }\r\n if ($foreColorSelector.attr(\"set\") === \"true\") {\r\n var foreColor = $foreColorSelector.val() as any;\r\n popupControl.data(\"forecolor\", foreColor);\r\n popupControl.css(\"color\", foreColor);\r\n global.enableUpdateButton(enablePivotPost, function () { updateConfig(true, evt, null, true); }, evt);\r\n }\r\n\r\n //updateConfig(true, evt, null, true);\r\n };\r\n\r\n\r\n var pivotColorClick = function (e) {\r\n e.stopPropagation();\r\n $(\".pivotMetricContainer .popover\").remove();\r\n //We don't show the colour picker for all.\r\n var popLi = $(this).closest(\"li\");\r\n var foreColor = popLi.data(\"forecolor\") as any;\r\n var backColor = popLi.data(\"backcolor\") as any;\r\n var metricName = popLi.data(\"metricname\");\r\n var link = global.getJqueryElement(e.currentTarget);\r\n\r\n link.popover(\r\n {\r\n container: $(\".reportContent[data-mode=Pivot]\"),\r\n html: true,\r\n placement: \"auto bottom\",\r\n trigger: \"manual\",\r\n content:\r\n \"
    \" +\r\n \"
    \" +\r\n \"
    \"\r\n\r\n });\r\n link.off(\"shown.bs.popover\").on(\"shown.bs.popover\",\r\n function () {\r\n var po = $(this).data(\"bs.popover\");\r\n var content = po.$tip;\r\n var $foreColorSelector = $(\"input#foreColorSelector\", content);\r\n $foreColorSelector.attr(\"set\", (foreColor !== \"#000000\") as any);\r\n $foreColorSelector.val(foreColor);\r\n var $backColorSelector = $(\"input#backColorSelector\", content);\r\n $backColorSelector.attr(\"set\", (backColor !== \"#FFFFFF\") as any);\r\n $backColorSelector.val(backColor);\r\n $backColorSelector.on(\"change\",\r\n function () {\r\n $(this).attr(\"set\", \"true\");\r\n });\r\n $foreColorSelector.on(\"change\",\r\n function () {\r\n $(this).attr(\"set\", \"true\");\r\n });\r\n $(\"button.colorEditButton\", content).off(\"click\").on(\"click\",\r\n function (e) {\r\n\r\n var content = po.$tip;\r\n updatePivotMetricColor(e, content, metricName);\r\n po.hide();\r\n }\r\n );\r\n $(\"button.colorCancelButton\", content).off(\"click\").on(\"click\",\r\n function (e) {\r\n po.hide();\r\n });\r\n });\r\n\r\n link.popover(\"show\");\r\n };\r\n\r\n var enablePivotPost = function () {\r\n var context = getParentContext();\r\n var analyzeByReport = $(\"select#AnalyzeByReports\").val();\r\n var groupByReport = context.find(\"select#GroupByReports option:selected\").val();\r\n return groupByReport !== \"0\" && analyzeByReport !== \"0\" && pivotSelected();\r\n };\r\n\r\n var reportTypeChanged = function (evt = undefined) {\r\n var context = getParentContext();\r\n populateTopBottomSelect();\r\n var analyzeByReport = $(\"select#AnalyzeByReports\", context).val();\r\n\r\n var groupBy = context.find(\"select#GroupByReports option:selected\").val();\r\n var groupByDiv = context.find(\"div#GroupContainer\");\r\n\r\n controlElementVisibility(context);\r\n if (!pivotSelected()) {\r\n groupByDiv.removeClass(\"has-error\");\r\n updateConfig(true, evt, null, true);\r\n } else\r\n //So it's a pivot report....\r\n {\r\n //So if either group report or analyzeByReport isn't selected don't update the config server side...\r\n if (groupBy === \"0\" || analyzeByReport === \"0\") {\r\n groupByDiv.addClass(\"has-error\");\r\n changePivotVisibility(true);\r\n } else {\r\n changePivotVisibility(false);\r\n groupByDiv.removeClass(\"has-error\");\r\n updateConfig(true, evt, null, true);\r\n }\r\n }\r\n };\r\n\r\n var setupPivotMetrics = function () {\r\n var context = getParentContext();\r\n $(\".checkbox label \", context).off(\"dblclick\").on(\"dblclick\", pivotColorClick);\r\n };\r\n\r\n var addChartFilterDrilldown = function (evt, chartPoint, xAxisFields) {\r\n let context = evt && evt.currentTarget ? $(evt.currentTarget).closest(\"div.reportContent\") : null;\r\n\r\n if (!drilldownIsPossible(context)) return;\r\n\r\n let widget = context.closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n if (evt) {\r\n if (isWidget) {\r\n if (widget.hasClass(\"selected\")) {\r\n if (evt.stopPropagation)\r\n evt.stopPropagation();\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n var inputValues = reportView.getTabBaseObject({\r\n tabValues: [],\r\n widgetId: isWidget ? widget.data(\"widgetid\") : undefined\r\n });\r\n\r\n for (var i = 0; i < xAxisFields.length; i++) {\r\n var name = xAxisFields[i].name;\r\n var value = chartPoint[i];\r\n if (value === null || value === undefined) continue;\r\n if (xAxisFields[i].isGroupBy)\r\n inputValues.tabValues.push({ name: name, startCondition: value, isGroupField: xAxisFields[i].isGroupField });\r\n }\r\n\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"NavigateToDrillDown\",\r\n inputValues,\r\n function (data) {\r\n updateOutputAfterDrilldown(data, context);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n };\r\n\r\n var updateOutputAfterDrilldown = function (data, context, callback: Function = undefined) {\r\n let widget = context.closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n\r\n if (isWidget) {\r\n if (data.drilldownReportConfig) {\r\n let widgetVM = dashboard.getWidgetSettings(widget.closest(\".widgetContainer\"));\r\n if (widgetVM) {\r\n widgetVM.updatingDrilldown(true);\r\n let config = JSON.parse(data.drilldownReportConfig);\r\n widgetVM.topBottom(config.topBottom === \"None\" || config.topBottom === \"All\" || !config.topBottom ? \"-1\" : config.topBottom === \"Top\" ? `T${config.resultCount}` : `B${config.resultCount}`);\r\n widgetVM.topBottomQueryName(config.topBottomFieldName?.queryName);\r\n widgetVM.updatingDrilldown(false);\r\n }\r\n }\r\n\r\n $(\"li#DrilldownReportsList\", widget).replaceWith(data.drilldownList);\r\n $(\".filterContextContainer\", \"#selected-widget-filters\").replaceWith(data.filterAddList);\r\n \r\n dashboard.refreshWidgetData(null, widget, true, callback);\r\n }\r\n else {\r\n irGlobal.updateOutput(data);\r\n }\r\n };\r\n\r\n var renderChart = function () {\r\n var context = getParentContext();\r\n controlElementVisibility(context);\r\n var canvas = context.find(\".chartdiv\");\r\n if (canvas.length === 0) return;\r\n var visibleHeight = $(window).height() - canvas.offset().top;\r\n canvas.height(visibleHeight + \"px\");\r\n chart.addChartPlot(context, null, addChartFilterDrilldown, false, updateChartType);\r\n };\r\n\r\n var updateChartType = function (evt, chartType) {\r\n var valueChanged = function (data) {\r\n updateOutput(data);\r\n };\r\n let jsonObject = getTabBaseObject({ chartType: chartType });\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"ChangeChartType\",\r\n jsonObject,\r\n valueChanged,\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n };\r\n\r\n var chartSelected = function (parentContext) {\r\n return getMode(parentContext) === ReportTypeStrEnum.Chart;\r\n };\r\n\r\n var setupDisplayTypeChanged = function () {\r\n var parentContext = getParentContext();\r\n var selectReportType = parentContext.find(\"#ReportType\") as any;\r\n var selectedChanged = function (evt) {\r\n adjustReportTypeTitle();\r\n\r\n var mode = getMode(parentContext);\r\n parentContext.data(\"mode\", mode);\r\n\r\n let searchBoxButton = $(\"button#SearchBoxButton\", parentContext);\r\n if (mode === ReportTypeStrEnum.Analysis || mode === \"Report\" ||\r\n mode === ReportTypeStrEnum.Pivot) {\r\n searchBoxButton.removeClass(\"hidden\");\r\n }\r\n else {\r\n if (!searchBoxButton.hasClass(\"hidden\")) {\r\n searchBoxButton.addClass(\"hidden\");\r\n }\r\n }\r\n\r\n let filterPivotButton = $(\"button#FilterPivotButton\", parentContext);\r\n if (mode === ReportTypeStrEnum.Pivot) {\r\n filterPivotButton.removeClass(\"hidden\");\r\n }\r\n else {\r\n if (!filterPivotButton.hasClass(\"hidden\")) {\r\n filterPivotButton.addClass(\"hidden\");\r\n }\r\n }\r\n\r\n if (mode === ReportTypeStrEnum.Pivot) {\r\n vm.reportType(ReportTypeStrEnum.Pivot);\r\n reportTypeChanged();\r\n }\r\n else {\r\n controlElementVisibility(parentContext);\r\n //Remove error warning in group by because it is not necessary for charts\r\n var groupByDiv = parentContext.find(\"div#GroupContainer\");\r\n groupByDiv.removeClass(\"has-error\");\r\n if (vm.reportType() === ReportTypeStrEnum.Pivot) {\r\n changePivotVisibility(false);\r\n }\r\n\r\n if (chartSelected(parentContext)) {\r\n var settingsToggleButton = $(\"#showChartOptions\", parentContext) as any;\r\n settingsToggleButton.bootstrapToggle('off');\r\n vm.reportType(ReportTypeStrEnum.Chart);\r\n }\r\n else {\r\n vm.reportType(ReportTypeStrEnum.Analysis);\r\n }\r\n\r\n updateConfig(true,\r\n evt,\r\n null,\r\n true);\r\n }\r\n\r\n const tabPanel = parentContext.closest(\".tab-pane\");\r\n if (tabPanel && tabPanel.data(\"tabtype\")) {\r\n tabPanel.data(\"tabtype\", vm.reportType() === ReportTypeStrEnum.Analysis || vm.reportType() === ReportTypeStrEnum.Pivot ? \"Report\" : vm.reportType())\r\n }\r\n\r\n selectReportType.selectpicker('render');\r\n };\r\n selectReportType.off(\"change\").on(\"change\", function (evt) { selectedChanged(evt); });\r\n selectReportType.selectpicker('render');\r\n\r\n if (vm.reportType() === ReportTypeStrEnum.Analysis) {\r\n let fields = $(\"option\", $(\"div#FieldSelect select\", parentContext));\r\n selectReportType.prop('disabled', fields.length <= 1);\r\n selectReportType.selectpicker('refresh');\r\n $(\"#GroupByReports\", parentContext).prop('disabled', fields.length <= 1);\r\n }\r\n else {\r\n selectReportType.prop('disabled', false);\r\n selectReportType.selectpicker('refresh');\r\n $(\"#GroupByReports\", parentContext).prop('disabled', false);\r\n }\r\n };\r\n var removeGroupBy = function (evt) {\r\n var jsonString = getReportConfig();\r\n var completeFunction = function (data, evt) {\r\n setTotalsVisibility(false);\r\n var groupBySelect = $(\"select#GroupByReports\", getParentContext());\r\n var currentVal = groupBySelect.val();\r\n if (currentVal !== \"0\") {\r\n groupBySelect.off(\"change\", groupByChanged);\r\n groupBySelect.val(0);\r\n groupBySelect.on(\"change\",\r\n groupByChanged);\r\n }\r\n updateOutput(data);\r\n };\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"RemoveGroupBy\",\r\n jsonString,\r\n completeFunction,\r\n null,\r\n true,\r\n \"POST\");\r\n }\r\n\r\n var changeTopBottom = function (evt) {\r\n let context = getParentContext();\r\n let select = context.find(\"#TopBottomSelect\");\r\n let liTopOrderList = $(\"li.topOrderList\", context);\r\n\r\n let selected = $(\"option:selected\", select);\r\n\r\n let count = selected.data(\"count\");\r\n let topBottom = selected.data(\"topbottom\");\r\n let selectedValue = selected.val();\r\n\r\n let orderField = context.find(\"select#topOrderSelect\");\r\n let orderFieldGroup = orderField.closest(\"div.form-group\");\r\n\r\n let selectedField = orderField.val();\r\n\r\n if (selectedValue === \"-1\") {\r\n if (!liTopOrderList.hasClass(\"hidden\")) {\r\n liTopOrderList.addClass(\"hidden\");\r\n }\r\n select.removeClass(\"noBorderRight\");\r\n orderField.attr(\"disabled\", true as any);\r\n orderFieldGroup.removeClass(\"has-error\");\r\n orderField.val(\"-1\");\r\n selectedField = \"-1\";\r\n }\r\n else {\r\n liTopOrderList.removeClass(\"hidden\");\r\n if (!select.hasClass(\"noBorderRight\")) {\r\n select.addClass(\"noBorderRight\");\r\n }\r\n orderField.attr(\"disabled\", false as any);\r\n if (orderField.val() === \"-1\") {\r\n orderFieldGroup.addClass(\"has-error\");\r\n return;\r\n }\r\n else {\r\n orderFieldGroup.removeClass(\"has-error\");\r\n }\r\n }\r\n\r\n var submitObject =\r\n tabView.getBaseSubmitObject({ orderField: selectedField, resultCount: count, topBottom: topBottom });\r\n\r\n var complete = function (data) {\r\n updateOutput(data);\r\n };\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"ChangeTopBottom\",\r\n submitObject,\r\n complete,\r\n null,\r\n true);\r\n };\r\n\r\n var populateTopBottomSelect = function () {\r\n var context = getParentContext();\r\n if (pivotSelected()) return;\r\n\r\n var columnFields = $(\"div#FieldSelect select\", context);\r\n var selectList = context.find(\"li.topOrderList\");\r\n\r\n var colSelect = $(\"select#topOrderSelect\", selectList);\r\n\r\n var topBottomSelect = $(\"select#TopBottomSelect\", context);\r\n\r\n colSelect.off(\"change\", changeTopBottom);\r\n topBottomSelect.off(\"change\", changeTopBottom);\r\n\r\n colSelect.empty();\r\n\r\n var columnOpts = $(\"option[data-ismetric='True'], option[value='-1']\", columnFields);\r\n colSelect.append(columnOpts.clone());\r\n var orderFieldGroup = colSelect.closest(\"div.form-group\");\r\n\r\n if (topBottomSelect.val() === \"-1\") {\r\n colSelect.attr(\"disabled\", true as any);\r\n }\r\n else {\r\n colSelect.attr(\"disabled\", false as any);\r\n if (columnFields.val() === \"-1\") {\r\n orderFieldGroup.addClass(\"has-error\");\r\n }\r\n else {\r\n orderFieldGroup.removeClass(\"has-error\");\r\n }\r\n }\r\n\r\n colSelect.on(\"change\", changeTopBottom);\r\n topBottomSelect.on(\"change\", changeTopBottom);\r\n\r\n };\r\n\r\n var getOrderFieldData = function () {\r\n var orderFieldData = $(\"p#OrderFieldData\", getParentContext()).text();\r\n if (!orderFieldData) return null;\r\n var returnOject = JSON.parse(orderFieldData);\r\n if (returnOject)\r\n for (var index = 0; index < returnOject.length; ++index) {\r\n returnOject[index].isMetric = returnOject[index].tableName === \"metrics\";\r\n }\r\n return returnOject;\r\n };\r\n\r\n var popupAdditionalOrderSelect = function () {\r\n var dialog = bootbox.dialog({\r\n title: \"Order Fields\",\r\n message: \"

    \",\r\n show: false,\r\n\r\n buttons: {\r\n cancel: {\r\n label: \"Cancel\",\r\n className: \"btn-danger\",\r\n callback: function () {\r\n\r\n }\r\n },\r\n ok: {\r\n label: \"Save\",\r\n className: \"btn-success\",\r\n callback: function (evt) {\r\n let currDialog = $(this);\r\n let listElementClass = \"li.orderListElement\";\r\n let orderElements = $(listElementClass, currDialog);\r\n let orderData = [];\r\n let currIndex = 0;\r\n let duplicateFields = false;\r\n $.each(orderElements,\r\n function (index, element: any) {\r\n element = $(element);\r\n let currSelect = $(\"select\", element);\r\n let order = element.data(\"order\");\r\n let selected = $(\"option:selected\", currSelect);\r\n let currField = selected.val();\r\n if (currField !== \"0\") {\r\n if (orderData.filter(function (x) { return x.fieldName === currField; }).length > 0) {\r\n duplicateFields = true;\r\n }\r\n\r\n orderData.push({ fieldName: currField, order: order, orderIndex: currIndex });\r\n currIndex = currIndex + 1;\r\n }\r\n });\r\n\r\n if (duplicateFields) {\r\n bootbox.alert(\"Duplicate fields are not allowed.\");\r\n return false;\r\n }\r\n\r\n if (orderData.filter(function (x) { return x.fieldName === \"-1\"; }).length > 0) {\r\n bootbox.alert(\"Blank order field is not allowed.\");\r\n return false;\r\n }\r\n\r\n if (reportType() === ReportTypeStrEnum.Pivot && orderData.length > 1) {\r\n bootbox.alert(\"Two or more fields are not allowed on Pivot report.\");\r\n return false;\r\n }\r\n\r\n let updateModel = tabView.getBaseSubmitObject({ orderFields: orderData });\r\n let context = getParentContext();\r\n let isDashboard = false;\r\n if (context.hasClass(\"dashboardWidget\")) {\r\n isDashboard = true;\r\n updateModel.widgetId = context.data(\"widgetid\");\r\n }\r\n\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"ChangeOrder\",\r\n updateModel,\r\n function (data) {\r\n if (isDashboard) {\r\n dashboard.afterUpdatedWidgetData(data, context);\r\n }\r\n else {\r\n updateOutput(data);\r\n }\r\n },\r\n null,\r\n true,\r\n \"POST\");\r\n }\r\n }\r\n }\r\n });\r\n\r\n dialog.on(\"show.bs.modal\",\r\n function () {\r\n let parentContext = getParentContext();\r\n let listElementClass = \"li.orderListElement\";\r\n let removeOrderField = function (evt) {\r\n let removeIcon = $(evt.currentTarget);\r\n let selectItem = removeIcon.closest(listElementClass);\r\n let listElements = selectItem.siblings(listElementClass);\r\n let listElement = undefined;\r\n if (listElements.length > 1) {\r\n listElement = $(listElements[0]);\r\n }\r\n selectItem.remove();\r\n if (listElement) {\r\n changeOrderVisibility(listElement);\r\n }\r\n };\r\n let changeDirection = function (evt) {\r\n let $field = $($(evt.currentTarget).closest(\"li\"));\r\n let order = $field.data(\"order\");\r\n if (!order) return;\r\n\r\n let directionIndicator = $(\"span.directionIndicator\", $field);\r\n directionIndicator.removeClass(directionIndicator.data(\"none\"));\r\n if (order === \"ASC\") {\r\n $field.data(\"order\", \"DESC\");\r\n directionIndicator.removeClass(directionIndicator.data(\"asc\"));\r\n directionIndicator.addClass(directionIndicator.data(\"desc\"));\r\n } else if (order === \"DESC\") {\r\n $field.data(\"order\", \"ASC\");\r\n directionIndicator.removeClass(directionIndicator.data(\"desc\"));\r\n directionIndicator.addClass(directionIndicator.data(\"asc\"));\r\n }\r\n directionIndicator.off(\"click\", changeDirection).on(\"click\", changeDirection);\r\n };\r\n let moveField = function (evt) {\r\n let field = $(evt.currentTarget);\r\n let orderDown = true;\r\n if (field.hasClass(\"changeOrderUp\")) {\r\n orderDown = false;\r\n }\r\n\r\n let listElement = field.closest(listElementClass);\r\n if (!orderDown) {\r\n let previousElement = listElement.prev(listElementClass);\r\n let prevOrder = previousElement.data(\"order\");\r\n let currOrder = listElement.data(\"order\");\r\n\r\n listElement.data(\"order\", prevOrder);\r\n previousElement.data(\"order\", currOrder);\r\n\r\n previousElement.before(listElement);\r\n } else {\r\n let nextElement = listElement.next(listElementClass);\r\n nextElement.after(listElement);\r\n }\r\n changeOrderVisibility(listElement);\r\n };\r\n let addNewSelect = function (evt) {\r\n let plusIcon = $(evt.currentTarget);\r\n let selectItem = plusIcon.closest(listElementClass);\r\n\r\n let directionIndicator = $(\"span.directionIndicator\", selectItem);\r\n directionIndicator.addClass(directionIndicator.data(\"none\"));\r\n\r\n let ul = plusIcon.closest(\"ul\");\r\n let changeField = $(\"span.changeOrder span.glyphicon\", ul);\r\n changeField.removeClass(\"hidden\");\r\n\r\n let newSelect = selectItem.clone().attr(\"id\", \"\");\r\n let selectedOption = $(\"option[value='\" + 0 + \"']\", newSelect);\r\n selectedOption.prop(\"selected\", \"selected\");\r\n\r\n selectItem.after(newSelect);\r\n changeOrderVisibility(newSelect);\r\n };\r\n let changeSelected = function (evt) {\r\n let $selectElement = $(evt.currentTarget);\r\n let $element = $selectElement.closest(\"li.orderListElement\");\r\n let order = $element.data(\"order\");\r\n if (!order) {\r\n let $directionIndicator = $(\"span.directionIndicator\", $element);\r\n let $selectedOption = $(\"option:selected\", $selectElement);\r\n let isMetric = $selectedOption.data(\"ismetric\") === \"True\";\r\n\r\n order = isMetric ? \"DESC\" : \"ASC\";\r\n $element.data(\"order\", order);\r\n\r\n let ascClass = $directionIndicator.data(\"asc\");\r\n let descClass = $directionIndicator.data(\"desc\");\r\n let noneClass = $directionIndicator.data(\"none\");\r\n\r\n $directionIndicator.removeClass(ascClass);\r\n $directionIndicator.removeClass(descClass);\r\n $directionIndicator.removeClass(noneClass);\r\n\r\n if (order === \"ASC\") {\r\n $directionIndicator.addClass(ascClass);\r\n } else if (order === \"DESC\") {\r\n $directionIndicator.addClass(descClass);\r\n }\r\n }\r\n };\r\n let changeOrderVisibility = function (listElement) {\r\n let listElements = $(listElementClass, listElement.closest(\"ul\"));\r\n let changeField = $(\"span.changeOrder span.glyphicon\", listElements);\r\n if (listElements.length === 1) {\r\n changeField.addClass(\"hidden\");\r\n }\r\n\r\n $.each(listElements,\r\n function (index, element) {\r\n let $element = $(element);\r\n let upField = $(\"span.glyphicon.changeOrderUp\", $element);\r\n let downField = $(\"span.glyphicon.changeOrderDown\", $element);\r\n let removeField = $(\"span.remove\", $element);\r\n let order = $element.data(\"order\");\r\n let directionIndicator = $(\"span.directionIndicator\", $element);\r\n let selectElement = $(\"select\", $element);\r\n let plusIcon = $(\"span.glyphicon-plus \", $element);\r\n\r\n plusIcon.attr(\"id\", \"\");\r\n plusIcon.off();\r\n directionIndicator.off();\r\n upField.off();\r\n downField.off();\r\n removeField.off();\r\n selectElement.off();\r\n\r\n let ascClass = directionIndicator.data(\"asc\");\r\n let descClass = directionIndicator.data(\"desc\");\r\n let noneClass = directionIndicator.data(\"none\");\r\n\r\n directionIndicator.removeClass(ascClass);\r\n directionIndicator.removeClass(descClass);\r\n directionIndicator.removeClass(noneClass);\r\n\r\n if (order === \"ASC\") {\r\n directionIndicator.addClass(directionIndicator.data(\"asc\"));\r\n } else if (order === \"DESC\") {\r\n directionIndicator.addClass(directionIndicator.data(\"desc\"));\r\n } else {\r\n directionIndicator.addClass(noneClass);\r\n }\r\n\r\n //Remove ALL events from direction indicator;\r\n\r\n let label = $(\"label span.labelText\", element);\r\n let lastIndex = listElements.length - 1;\r\n\r\n if (index === 0) {\r\n label.text(\"Order By \");\r\n\r\n downField.css(\"visibility\", \"\");\r\n downField.on(\"click\", moveField);\r\n\r\n upField.css(\"visibility\", \"hidden\");\r\n } else if (index === lastIndex) {\r\n label.text(\"Then By \");\r\n upField.css(\"visibility\", \"\");\r\n upField.on(\"click\", moveField);\r\n downField.css(\"visibility\", \"hidden\");\r\n } else {\r\n label.text(\"Then By \");\r\n upField.css(\"visibility\", \"\");\r\n downField.css(\"visibility\", \"\");\r\n upField.on(\"click\", moveField);\r\n downField.on(\"click\", moveField);\r\n }\r\n\r\n downField.removeClass(\"hidden\");\r\n upField.removeClass(\"hidden\");\r\n directionIndicator.on(\"click\", changeDirection);\r\n removeField.on(\"click\", removeOrderField);\r\n plusIcon.on(\"click\", addNewSelect);\r\n selectElement.on(\"change\", changeSelected);\r\n });\r\n };\r\n\r\n let modal = $(this);\r\n let modalBody = modal.find(\"div.modal-body\");\r\n\r\n let newSortFieldBtn = $(``);\r\n newSortFieldBtn.on(\"click\", function () {\r\n let index = $(\"select#columnSelect\", parentContext).closest(\"li.selectList\").length;\r\n if (index !== 0) {\r\n index++;\r\n }\r\n\r\n let listElement = $(\"select#columnSelect\", parentContext).closest(\"li.selectList\").clone();\r\n listElement.data(\"orderindex\", index);\r\n listElement.removeClass(\"hidden\");\r\n let upDown = $(\".changeOrder\", listElement);\r\n upDown.removeClass(\"hidden\");\r\n listElement.removeClass(\"selectList reportConfig\");\r\n listElement.addClass(\"orderListElement\");\r\n\r\n let removeSign = $(\"span.remove\", listElement);\r\n\r\n removeSign.removeClass(\"hidden\");\r\n if (index > 0) {\r\n let label = $(\"label span.labelText\", listElement);\r\n label.text(\"Then By \");\r\n }\r\n let select = $(\"select\", listElement).attr(\"id\", \"\");\r\n let selectedOption = $(\"option[value='\" + 0 + \"']\", select);\r\n selectedOption.prop(\"selected\", \"selected\");\r\n\r\n list.append(listElement);\r\n changeOrderVisibility(listElement);\r\n });\r\n\r\n let list = $(\"
      \");\r\n modalBody.append(newSortFieldBtn);\r\n modalBody.append(list);\r\n list.addClass(\"list-unstyled\");\r\n\r\n let orderFieldData = getOrderFieldData();\r\n $.each(orderFieldData,\r\n function (index: any, element) {\r\n let listElement = $(\"select#columnSelect\", parentContext).closest(\"li.selectList\").clone();\r\n listElement.data(\"orderindex\", index);\r\n let upDown = $(\".changeOrder\", listElement);\r\n upDown.removeClass(\"hidden\");\r\n listElement.removeClass(\"selectList reportConfig\");\r\n listElement.addClass(\"orderListElement\");\r\n\r\n let removeSign = $(\"span.remove\", listElement);\r\n\r\n removeSign.removeClass(\"hidden\");\r\n if (index > 0) {\r\n var label = $(\"label span.labelText\", listElement);\r\n label.text(\"Then By \");\r\n }\r\n let select = $(\"select\", listElement).attr(\"id\", \"\");\r\n let selectedFieldName = element.isMetric ? element.reportMetricId || element.fieldName : element.queryName || element.fieldName;\r\n\r\n listElement.data(\"order\", element.order);\r\n listElement.data(\"orderindex\", index);\r\n listElement.data(\"ismetric\", element.isMetric);\r\n let selectedOption = $(\"option[value='\" + selectedFieldName + \"']\", select);\r\n if (selectedOption.length === 0) {\r\n selectedOption = $(\"option[data-fieldid='\" + element.id + \"']\", select);\r\n }\r\n\r\n selectedOption.prop(\"selected\", \"selected\");\r\n list.append(listElement);\r\n changeOrderVisibility(listElement);\r\n });\r\n });\r\n\r\n dialog.modal(\"show\");\r\n };\r\n\r\n var showOrderCursor = function () {\r\n var orderFieldData = getOrderFieldData();\r\n\r\n if (orderFieldData !== null && orderFieldData.length >= 1) {\r\n $(this).css({ \"cursor\": \"pointer\" });\r\n } else {\r\n $(this).css({ \"cursor\": \"default\" });\r\n }\r\n };\r\n\r\n var populateOrderSelect = function () {\r\n var context = getParentContext();\r\n var divField = context.find(\"div#FieldSelect\");\r\n\r\n var orderFieldData = getOrderFieldData();\r\n var selectList = context.find(\"li.selectList\");\r\n var colSelect = selectList.find(\"select#columnSelect\");\r\n var directionIndicator = $(\"span.directionIndicator\");\r\n directionIndicator.removeClass(directionIndicator.data(\"asc\")).removeClass(directionIndicator.data(\"desc\"));\r\n var additional = $(\"#MoreSortFields\", context);\r\n if (orderFieldData && orderFieldData.length > 1) {\r\n additional.addClass(\"active\");\r\n }\r\n\r\n additional.off(\"click\", popupAdditionalOrderSelect).off(\"mouseover\", showOrderCursor)\r\n .on(\"click\", popupAdditionalOrderSelect).on(\"mouseover\", showOrderCursor);\r\n $(\"#MoreSortFieldsBtn\", context).off(\"click\", popupAdditionalOrderSelect).on(\"click\", popupAdditionalOrderSelect);\r\n colSelect.empty();\r\n colSelect.off(\"change\");\r\n var columnFields = divField.find(\"select\");\r\n if (columnFields.length === 0) {\r\n selectList.addClass(\"hidden\");\r\n return;\r\n }\r\n var columnOpts = $(\"option\", columnFields);\r\n colSelect.off();\r\n colSelect.append(columnOpts.clone());\r\n if (orderFieldData.length > 0) {\r\n var element = orderFieldData[0];\r\n var fieldOrder = element.order;\r\n\r\n if (fieldOrder === \"ASC\") {\r\n directionIndicator.addClass(directionIndicator.data(\"asc\"));\r\n } else if (fieldOrder === \"DESC\") {\r\n directionIndicator.addClass(directionIndicator.data(\"desc\"));\r\n }\r\n selectList.data(\"order\", fieldOrder);\r\n\r\n var orderFieldName = element.isMetric ? element.reportMetricId || element.fieldName : element.queryName || element.fieldName;\r\n var selectedOption = $(\"option[value='\" + orderFieldName + \"']\", colSelect);\r\n if (selectedOption.length === 0) {\r\n selectedOption = $(\"option[data-fieldid='\" + element.id + \"']\", colSelect);\r\n }\r\n\r\n if (selectedOption.length === 0) {\r\n colSelect.val(\"0\");\r\n } else {\r\n selectedOption.prop(\"selected\", \"selected\");\r\n }\r\n }\r\n selectList.removeClass(\"hidden\");\r\n colSelect.on(\"change\", changeReportSelectOrder);\r\n };\r\n\r\n //Disabled - Only for old report??\r\n var setupOrderHeaders = function () {\r\n //var context = getParentContext();\r\n //var table = context.find(\"table.floatThead-table\");\r\n\r\n //if (table.length === 0)\r\n // table = context.find(\"table.resultsTable\");\r\n //var orderSpans = $(\"th\", table).has(\".colOrder\");\r\n //var orderFieldData = getOrderFieldData();\r\n //if (orderFieldData && orderFieldData.length > 0) {\r\n // $(orderFieldData).each(function (index, element) {\r\n // let name = element.isMetric ? element.reportMetricId || element.fieldName : element.queryName || element.fieldName;\r\n // let matchingElement = orderSpans.find(\".colOrder[data-name='\" + name + \"']\");\r\n // let order = element.order;\r\n // if (order === \"ASC\") {\r\n // matchingElement.addClass(\"glyphicon-chevron-up\");\r\n // } else {\r\n // matchingElement.addClass(\"glyphicon-chevron-down\");\r\n // }\r\n // });\r\n //}\r\n //orderSpans.on(\"mouseover\", function () { $(this).css(\"cursor\", \"pointer\"); });\r\n //orderSpans.off(\"click\", changeHeaderOrder).on(\"click\", changeHeaderOrder);\r\n };\r\n\r\n //Handler for the main report selector dropdown to change order.\r\n var changeReportSelectOrder = function (evt) {\r\n let $current = $(\"option:selected\", $(evt.currentTarget));\r\n let colIsMetric = $current.data(\"ismetric\") === \"True\";\r\n let fieldName = $current.val();\r\n if (fieldName === \"-1\") {\r\n let context = getParentContext();\r\n let selectTopBottom = context.find(\"#TopBottomSelect\");\r\n let optionSelectedTopBottom = $(\"option:selected\", selectTopBottom);\r\n let selectedValueTopBottom = optionSelectedTopBottom.val();\r\n\r\n let message = \"Are you sure you want to clear all order fields?\";\r\n if (selectedValueTopBottom !== \"-1\") {\r\n message += \" Only the first sort field will be kept because the top is applied.\"\r\n }\r\n\r\n bootbox.confirm(message,\r\n function (result) {\r\n if (!result) {\r\n return;\r\n }\r\n var indicator = $(\"span.directionIndicator\");\r\n $(\"p#OrderFieldData\").empty();\r\n indicator.removeClass(indicator.data(\"asc\"))\r\n .removeClass(indicator.data(\"desc\"));\r\n\r\n let newOrderFields = [];\r\n\r\n if (selectedValueTopBottom !== \"-1\") {\r\n let existingOrderFields = getOrderFieldData();\r\n if (existingOrderFields && existingOrderFields.length > 0) {\r\n newOrderFields.push(existingOrderFields[0]);\r\n }\r\n }\r\n\r\n let keepScrollLeftPosition = false;\r\n if (reportType() === ReportTypeStrEnum.Analysis) {\r\n keepScrollLeftPosition = true;\r\n }\r\n persistOrderChange(evt, newOrderFields, keepScrollLeftPosition);\r\n });\r\n return;\r\n }\r\n var orderFields = [];\r\n if (fieldName) {\r\n let order = colIsMetric ? \"DESC\" : \"ASC\";\r\n orderFields.push({ fieldName: fieldName, order: order, orderIndex: 0, isMetric: colIsMetric });\r\n\r\n let existingOrderFields = getOrderFieldData();\r\n\r\n if (existingOrderFields && existingOrderFields.length > 0) {\r\n existingOrderFields.splice(0, 1);\r\n\r\n existingOrderFields.forEach(function (element, index) {\r\n let fieldName = element.isMetric ? element.reportMetricId || element.fieldName : element.queryName || element.fieldName;\r\n orderFields.push({ fieldName: fieldName, order: element.order, orderIndex: index + 1 });\r\n });\r\n }\r\n }\r\n\r\n let keepScrollLeftPosition = false;\r\n if (reportType() === ReportTypeStrEnum.Analysis) {\r\n keepScrollLeftPosition = true;\r\n }\r\n\r\n persistOrderChange(evt, orderFields, keepScrollLeftPosition);\r\n };\r\n\r\n var persistOrderChange = function (evt, orderFields, keepScrollLeftPosition = false, updateOnlySortFields = false) {\r\n if (reportType() === ReportTypeStrEnum.Analysis && updateOnlySortFields) {\r\n const grid = report.getGridInstance();\r\n if (grid) {\r\n const columns = grid.option(\"columns\");\r\n if (columns.filter(function (x) { return x.isMetric && (x.functionType === 2 || x.functionType === 3); }).length > 0) {\r\n updateOnlySortFields = false;\r\n }\r\n }\r\n }\r\n\r\n var config = { orderFields: orderFields, updateOnlySortFields: updateOnlySortFields } as any;\r\n let context = evt && evt.currentTarget ? $(evt.currentTarget).closest(\".reportContent\") : getParentContext();\r\n let widget = $(context).closest(\".dashboardWidget\");\r\n if (widget.length > 0) {\r\n config.widgetId = widget.data(\"widgetid\");\r\n }\r\n\r\n let scrollLeftPosition = 0;\r\n\r\n if (keepScrollLeftPosition) {\r\n if (reportType() === ReportTypeStrEnum.Analysis) {\r\n let dataTables_scrollBody = $(\".dataTables_scrollBody\", context);\r\n if (dataTables_scrollBody.length > 0) {\r\n scrollLeftPosition = dataTables_scrollBody.get(0).scrollLeft;\r\n $(\".dataTables_scrollBody\", context).get(0).scrollLeft = 0;\r\n }\r\n }\r\n }\r\n\r\n var complete = function (data) {\r\n if (updateOnlySortFields) {\r\n $(\"#FieldSelect\", context).remove();\r\n $(\"#Results\", context).append(data.sortFields);\r\n }\r\n else {\r\n updateOutput(data);\r\n\r\n if (keepScrollLeftPosition) {\r\n if (reportType() === ReportTypeStrEnum.Analysis) {\r\n $(\".dataTables_scrollBody\", context).animate({\r\n scrollLeft: scrollLeftPosition\r\n }, 500);\r\n }\r\n }\r\n }\r\n };\r\n \r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.workBook + \"ChangeOrder\",\r\n config,\r\n complete,\r\n null,\r\n true);\r\n };\r\n\r\n var controlElementVisibility = function (context) {\r\n if (!context) context = getParentContext();\r\n\r\n var chartConfig = $(\".chartConfig\", context);\r\n var reportConfig = $(\".reportConfig\", context);\r\n var pivotConfig = $(\".pivotConfig\", context);\r\n var analysisConfig = $(\".analysisConfig\", context);\r\n var orderConfig = $(\".orderConfig\", context);\r\n var isChart = chartSelected(context);\r\n var isPivot = pivotSelected(context);\r\n\r\n var tabIcon = $(\"div#TabPageContainer ul.nav-tabs li.active span.tab-icon\");\r\n var tabIconText = \"list_alt\";\r\n if (isChart) {\r\n tabIconText = \"equalizer\";\r\n }\r\n else if (isPivot) {\r\n tabIconText = \"pivot_table_chart\";\r\n }\r\n tabIcon.text(tabIconText);\r\n\r\n if (isChart) {\r\n reportConfig.addClass(\"hidden\");\r\n chartConfig.removeClass(\"hidden\");\r\n return;\r\n }\r\n //So not a chart!\r\n chartConfig.addClass(\"hidden\");\r\n reportConfig.removeClass(\"hidden\");\r\n\r\n if (isPivot) {\r\n pivotConfig.removeClass(\"hidden\");\r\n analysisConfig.addClass(\"hidden\");\r\n } else {\r\n pivotConfig.addClass(\"hidden\");\r\n analysisConfig.removeClass(\"hidden\");\r\n }\r\n };\r\n\r\n var setupDefaultFilterBehaviours = function (context: JQuery = undefined) {\r\n if (!context)\r\n context = getParentContext();\r\n filtersManager.setup(context,\r\n \"ul.tabFilterNav li.filterList\",\r\n \"ul.tabFilterNav li.filterContextContainer\",\r\n null, undefined\r\n );\r\n\r\n };\r\n\r\n var getParentContext = function () {\r\n return irGlobal.getParentContext();\r\n };\r\n\r\n var addReportSelectorEvents = function (context = undefined) {\r\n let formatState = function (state) {\r\n var $currentElement = $(state.element);\r\n if ($currentElement.attr(\"hidden\")) return null;\r\n var content = $currentElement.data(\"content\");\r\n if (!content) {\r\n return state.text;\r\n }\r\n\r\n return $(content);\r\n }\r\n\r\n if (!context) context = getParentContext();\r\n $(\"select#AnalyzeByReports\", context)\r\n .off(\"change\", analyzeByChanged).on(\"change\", analyzeByChanged);\r\n $(\"select#GroupByReports\", context)\r\n .off(\"change\", groupByChanged).on(\"change\",\r\n groupByChanged);\r\n ($(\"select.select2\") as any).select2({\r\n theme: \"bootstrap\",\r\n templateResult: formatState,\r\n templateSelection: formatState,\r\n width: '200px',\r\n dropdownCssClass: \"reportSelectorDrop\"\r\n }).maximizeSelect2Height();\r\n $(\"select.select2\").on('keydown', function (evt) {\r\n evt.preventDefault();\r\n });\r\n };\r\n\r\n var changeToDesigner = function (evt) {\r\n const url = urlConfigs.tabs + \"ShowDesignForResults\";\r\n let hideSettingsReportDesigner = false;\r\n if ($(window).width() < 1600) {\r\n if ($(\"#drawer\").dxDrawer(\"instance\").option(\"opened\")) {\r\n $(\"#drawer\").dxDrawer(\"instance\").option(\"opened\", false);\r\n $(\"#drawer\").attr(\"needToOpen\", true as any);\r\n }\r\n hideSettingsReportDesigner = true;\r\n }\r\n irGlobal.updateFromServer(evt,\r\n url,\r\n null,\r\n function (data) {\r\n tabView.updateTabView(data);\r\n if (hideSettingsReportDesigner) {\r\n reportDesigner.settingsReportButtonClick();\r\n }\r\n },\r\n null,\r\n true);\r\n };\r\n\r\n var openReportSettings = function (evt) {\r\n let settingsDiv = $(\"div.tab-report-settings\");\r\n let resultsDiv = $(\"div#Results div.resultsTableContainer\");\r\n if (settingsDiv.hasClass(\"hidden\")) {\r\n settingsDiv.height(resultsDiv.height() - 2);\r\n settingsDiv.removeClass(\"hidden\");\r\n resultsDiv.addClass(\"tab-report-settings-opened\");\r\n }\r\n else {\r\n settingsDiv.addClass(\"hidden\");\r\n resultsDiv.removeClass(\"tab-report-settings-opened\");\r\n }\r\n\r\n if (reportType() === ReportTypeStrEnum.Pivot) {\r\n pivotGrid.getPivotGridInstance().repaint()\r\n }\r\n };\r\n var resizeReportSettings = function () {\r\n let settingsDiv = $(\"div.tab-report-settings\");\r\n let resultsDiv = $(\"div#Results div.resultsTableContainer\");\r\n if (!settingsDiv.hasClass(\"hidden\")) {\r\n settingsDiv.height(resultsDiv.height() - 2);\r\n }\r\n }\r\n\r\n var changePivotVisibility = function (disable) {\r\n if (disable) {\r\n $(\"select#TopBottomSelect, select#AnalyzeByReports\").attr(\"disabled\", \"disabled\");\r\n }\r\n else {\r\n $(\"select#TopBottomSelect, select#AnalyzeByReports\").removeAttr(\"disabled\");\r\n }\r\n }\r\n\r\n var adjustReportTypeTitle = function () {\r\n let title = $(\"select#ReportType\").val() as any;\r\n $(\"select#ReportType\").siblings(\"button\").attr(\"title\", title);\r\n }\r\n\r\n function ViewModel() {\r\n var self = this;\r\n self.switching = false;\r\n self.reportType = ko.observable(reportType());\r\n self.groupBy = ko.observable(groupBy());\r\n self.workbookEditingMode = ko.computed(function () { return workbookViewModel.editing(); });\r\n self.updateValues = function () {\r\n self.reportType(reportType());\r\n self.groupBy(groupBy());\r\n };\r\n self.switchAnalyzeByAndGroupBy = function () {\r\n self.switching = true;\r\n analyzeByChanged({});\r\n };\r\n self.switchAnalyzeByAndGroupByToolTip = ko.computed(function () {\r\n return this.reportType() === ReportTypeStrEnum.Pivot ? \"Switch Analyze By and Columns\" : \"Switch Analyze By and Group By\";\r\n }, self);\r\n self.switchAnalyzeByAndGroupByEnable = ko.computed(function () {\r\n return this.groupBy() !== \"0\";\r\n }, self);\r\n\r\n self.groupByText = ko.computed(function () {\r\n return this.reportType() === ReportTypeStrEnum.Pivot ? \"Vs\" : \"Group By\";\r\n }, self);\r\n };\r\n\r\n var vm;\r\n\r\n var setup = function () {\r\n var context = getParentContext();\r\n if (context.attr(\"data-mode\") !== undefined) {\r\n context.attr(\"data-mode\", reportType());\r\n }\r\n\r\n irGlobal.showEmailPopup(\"a.emailButton\");\r\n var mainOptions = $(\"div.reportContent div.main-options #ReportOptions\")[0];\r\n var koData = ko.dataFor(mainOptions);\r\n if (!!koData)\r\n koData.updateValues();\r\n else {\r\n vm = new ViewModel();\r\n ko.applyBindings(vm, mainOptions);\r\n }\r\n\r\n let toolButtons = $(\"div.reportContent div.main-options #ToolButtons\")[0];\r\n let toolButtonsData = ko.dataFor(toolButtons);\r\n if (!toolButtonsData) {\r\n tabView.applyWorkbookBinding(toolButtons);\r\n }\r\n\r\n let advancedOptions = $(\"div.reportContent #AdvancedOptions #DrilldownReportsList\")[0];\r\n let advancedOptionsData = ko.dataFor(advancedOptions);\r\n if (!advancedOptionsData) {\r\n tabView.applyWorkbookBinding(advancedOptions);\r\n }\r\n\r\n var notToggleToggles = $(\"[data-toggle='toggle']\", context).parent().not(\"div.toggle-group\")\r\n .find(\"input[data-toggle='toggle']\") as any;\r\n //so if we have and toggles in this tab NOT setup.\r\n if (notToggleToggles.length > 0) {\r\n notToggleToggles.bootstrapToggle();\r\n }\r\n irGlobal.setup();\r\n\r\n $(\"button#DesignButton\", context).off(\"click\", changeToDesigner).on(\"click\", changeToDesigner);\r\n $(\"button#EditReportButton\", context).off(\"click\", openReportSettings).on(\"click\", openReportSettings);\r\n\r\n populateOrderSelect();\r\n\r\n var mediaQueryList = window.matchMedia(\"print\");\r\n mediaQueryList.addListener(function (mql) {\r\n if (mql.matches) {\r\n $(\"#Results > div > table\").width(0);\r\n } else {\r\n //report.addDrilldownClick(context);\r\n setupOrderHeaders();\r\n setupPivotMetrics();\r\n populateOrderSelect();\r\n }\r\n });\r\n setupDisplayTypeChanged();\r\n\r\n addDrilldownActions();\r\n\r\n setupPivotMetrics();\r\n\r\n setupDefaultFilterBehaviours(context);\r\n filtersManager.checkFiltersErrors(context);\r\n $(\"div#GroupContainer span.remove\", context).off(\"click\", removeGroupBy).on(\"click\", removeGroupBy);\r\n\r\n renderChart();\r\n setupOrderHeaders();\r\n populateTopBottomSelect();\r\n\r\n addReportSelectorEvents(context);\r\n $(\"button#HideTools\").off(\"click\").on(\"click\", function () {\r\n var $toolButtons = $(\"li#ToolButtons\") as any;\r\n var right = -260;\r\n var isSlid = false;\r\n if ($toolButtons.hasClass(\"slid\")) {\r\n isSlid = true;\r\n right = 0;\r\n }\r\n $toolButtons.animate({\r\n\r\n right: right //some unimportant CSS to animate so we get some values\r\n },\r\n {\r\n step: function (now, fx) {\r\n var clip = 300 + now;\r\n //now is the animated value from initial css value\r\n $(\"li#ToolButtons\").css('clip', 'rect(0px,' + clip + 'px,50px,0px)');\r\n },\r\n complete: function () {\r\n irGlobal.toggleSimpleChevron($(\"button#HideTools\"));\r\n $toolButtons.toggleClass(\"slid\");\r\n }\r\n }, 200\r\n );\r\n });\r\n\r\n report.setup(context);\r\n adjustReportTypeTitle();\r\n };\r\n\r\n // Used for printing to HTML / PDF\r\n var htmlOutputSetup = function (context, isExcelPrinting) {\r\n if (!context) {\r\n context = $(\"body\");\r\n }\r\n $(\"div.reportContent\", context).each(function () {\r\n report.setup($(this), true, isExcelPrinting);\r\n });\r\n };\r\n\r\n return {\r\n updateOutput: updateOutput,\r\n updateConfig: updateConfig,\r\n addReportSelectorEvents: addReportSelectorEvents,\r\n getReportConfig: getReportConfig,\r\n setup: setup,\r\n getDrilldownId: getDrilldownId,\r\n updateChartType: updateChartType,\r\n setupDefaultFilterBehaviours: setupDefaultFilterBehaviours,\r\n renderChart: renderChart,\r\n htmlOutputSetup: htmlOutputSetup,\r\n\r\n persistOrderChange: persistOrderChange,\r\n popupAdditionalOrderSelect: popupAdditionalOrderSelect,\r\n dobounceReflow: dobounceReflow,\r\n drilldownIsPossible: drilldownIsPossible,\r\n getTabBaseObject: getTabBaseObject,\r\n reportType: reportType,\r\n\r\n\r\n openReportSettings: openReportSettings,\r\n addDrilldownActions: addDrilldownActions,\r\n enableDisabledDrilldown: enableDisabledDrilldown,\r\n addChartFilterDrilldown: addChartFilterDrilldown,\r\n updateOutputAfterDrilldown: updateOutputAfterDrilldown,\r\n\r\n populateOrderSelect: populateOrderSelect,\r\n populateTopBottomSelect: populateTopBottomSelect\r\n };\r\n}\r\n)();\r\n","declare var widgetReport: any;\r\ndeclare var widgetPivot: any;\r\n\r\nvar widgetDesigner = (function () {\r\n\r\n var onTabSelection = null;\r\n var setTabSelection = function (callback) {\r\n onTabSelection = callback;\r\n }\r\n\r\n var updateNames = function (widgetType, vm) {\r\n\r\n if (vm.isNamesUpdated)\r\n return;\r\n\r\n switch (widgetType) {\r\n case WidgetTypeEnum.KPI:\r\n widgetKPI.updateNames(vm);\r\n break;\r\n case WidgetTypeEnum.Chart:\r\n widgetChart.updateNames(vm);\r\n break;\r\n case WidgetTypeEnum.Filter:\r\n widgetFilter.updateNames(vm);\r\n break;\r\n case WidgetTypeEnum.TreeMap:\r\n widgetTreeMap.updateNames(vm);\r\n break;\r\n case WidgetTypeEnum.Map:\r\n widgetMap.updateNames(vm);\r\n break;\r\n case WidgetTypeEnum.Gauge:\r\n widgetGauge.updateNames(vm);\r\n break;\r\n default:\r\n }\r\n\r\n vm.isNamesUpdated = true;\r\n };\r\n\r\n var setupWidget = function (dashboardWidget, vm, htmlOutput: boolean = false) {\r\n let widgetContainer = $(dashboardWidget).closest(\".widgetContainer\");\r\n let widgetType = widgetContainer.data(\"widgettype\");\r\n\r\n let tabs = $(\".widget-designer-tabs\", \"#DashboardSettingsPanel\").dxTabs(\"instance\");\r\n if (tabs)\r\n tabs.repaint();\r\n\r\n\r\n if (widgetType === WidgetTypeEnum.KPI) {\r\n let select = $(\"select.predefiniedDateRange.ir-selectpicker\", \"#DashboardSettingsPanel\")\r\n select.off(\"shown.bs.select\").on(\"shown.bs.select\", function (evt) {\r\n let divPopover = $(\".dropdown-menu.open\", select.parent());\r\n let parent = select.parent().get(0).getBoundingClientRect();\r\n divPopover.css({ \"position\": \"fixed\", \"left\": `${parent.left}px`, \"top\": `${parent.bottom}px` });\r\n if (divPopover.position().left + divPopover.outerWidth() > $(window).width()) {\r\n divPopover.css(\"right\", \"0px\").css(\"left\", \"unset\");\r\n }\r\n });\r\n }\r\n\r\n updateNames(widgetType, vm);\r\n };\r\n\r\n var setupViewModel = function (widgetContainer, vm, htmlOutput) {\r\n if (!htmlOutput) {\r\n htmlOutput = false;\r\n }\r\n\r\n vm.isSetupWidget = true;\r\n\r\n let widgetType = vm.widgetType();\r\n\r\n if (!vm.config.appearance.backgroundColor)\r\n vm.config.appearance.backgroundColor = ko.observable(\"\");\r\n\r\n if (vm.config.allowDetailTab && vm.config.allowDetailTab())\r\n vm.tabName = ko.observable(tabView.getTabName(vm.config.tabDetailId()));\r\n else\r\n vm.tabName = ko.observable(\"\");\r\n\r\n vm.tabNameTextBoxOptions = {\r\n value: vm.tabName,\r\n width: 150,\r\n readOnly: true,\r\n };\r\n\r\n vm.tabNamePopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose a Tab for details\",\r\n onClick: function (e) {\r\n widgetDesigner.setTabSelection(function (selectedTab) {\r\n vm.config.tabDetailId(selectedTab.id);\r\n vm.tabName(selectedTab.name);\r\n let tabDetailButton = $(`.dashboardWidget[data-widgetid=\"${e.model.widgetId()}\"]`).closest(\".widgetContainer\").find(\".tab-detail-button\");\r\n tabDetailButton.removeClass(\"hidden\");\r\n $(\"#popover-tabs\").dxPopover(\"instance\").hide();\r\n });\r\n widgetDesigner.showTabsPopover($(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n\r\n vm.tabNameRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Tab\",\r\n onClick: function (e) {\r\n vm.config.tabDetailId(0);\r\n vm.tabName(null);\r\n let tabDetailButton = $(`.dashboardWidget[data-widgetid=\"${e.model.widgetId()}\"]`).closest(\".widgetContainer\").find(\".tab-detail-button\");\r\n tabDetailButton.addClass(\"hidden\");\r\n }\r\n };\r\n\r\n vm.config.onWidgetChangedWidth = function (e) {\r\n const dashboardWidth = $(\"div#DashboardDesignerResizer\").width();\r\n if (e.value + e.model.layout.left() > dashboardWidth) {\r\n e.component.option(\"value\", e.value - (e.value + e.model.layout.left() - dashboardWidth));\r\n }\r\n };\r\n vm.config.onWidgetChangedLeft = function (e) {\r\n const dashboardWidth = $(\"div#DashboardDesignerResizer\").width();\r\n if (e.value + e.model.layout.width() > dashboardWidth) {\r\n e.component.option(\"value\", e.value - (e.value + e.model.layout.width() - dashboardWidth));\r\n }\r\n };\r\n\r\n vm.config.onWidgetChangedHeight = function (e) {\r\n const dashboardHeight = $(\"div#DashboardDesignerResizer\").height();\r\n if (e.value + e.model.layout.top() > dashboardHeight) {\r\n e.component.option(\"value\", e.value - (e.value + e.model.layout.top() - dashboardHeight));\r\n }\r\n };\r\n vm.config.onWidgetChangedTop = function (e) {\r\n const dashboardHeight = $(\"div#DashboardDesignerResizer\").height();\r\n if (e.value + e.model.layout.height() > dashboardHeight) {\r\n e.component.option(\"value\", e.value - (e.value + e.model.layout.height() - dashboardHeight));\r\n }\r\n };\r\n\r\n vm.tab = ko.observable(0);\r\n vm.tabsOptions = {\r\n selectedIndex: vm.tab,\r\n showNavButtons: false,\r\n dataSource: [\r\n {\r\n id: 99,\r\n text: \"General\",\r\n icon: \"bi bi-sliders\",\r\n content: \"General Widget Settings\"\r\n },\r\n ],\r\n }\r\n\r\n switch (widgetType) {\r\n case WidgetTypeEnum.KPI:\r\n widgetKPI.setupViewModel(vm, widgetContainer);\r\n break;\r\n case WidgetTypeEnum.Chart:\r\n widgetChart.setupViewModel(vm, widgetContainer);\r\n break;\r\n case WidgetTypeEnum.Filter:\r\n widgetFilter.setupViewModel(vm, widgetContainer);\r\n break;\r\n case WidgetTypeEnum.Report:\r\n widgetReport.setupViewModel(vm, widgetContainer);\r\n break;\r\n case WidgetTypeEnum.Pivot:\r\n widgetPivot.setupViewModel(vm, widgetContainer);\r\n break;\r\n case WidgetTypeEnum.TreeMap:\r\n widgetTreeMap.setupViewModel(vm, widgetContainer);\r\n break;\r\n case WidgetTypeEnum.Map:\r\n widgetMap.setupViewModel(vm, widgetContainer);\r\n break;\r\n case WidgetTypeEnum.Gauge:\r\n widgetGauge.setupViewModel(vm, widgetContainer);\r\n break;\r\n default:\r\n }\r\n\r\n vm.isSetupWidget = false;\r\n };\r\n\r\n var showTabsPopover = function (target) {\r\n $(\"#popover-tabs\").dxPopover(\"instance\").show(target);\r\n };\r\n\r\n var prepareTabPopover = function () {\r\n let tabsListOptions = {\r\n dataSource: [],\r\n height: \"100%\",\r\n itemTemplate: function (data, index) {\r\n let result = $(`\r\n
      \r\n ${data.icon}\r\n ${data.name}\r\n
      \r\n`);\r\n\r\n return result;\r\n },\r\n onItemClick: function (e) {\r\n if (onTabSelection)\r\n onTabSelection(e.itemData);\r\n },\r\n };\r\n\r\n let tabPopoverOptions = {\r\n title: \"Tab selection\",\r\n showTitle: true,\r\n target: \"#tabsPopoverTarget\",\r\n position: \"left\",\r\n height: 500,\r\n width: 300,\r\n onShown: function (e) {\r\n const tabs = tabView.getTabList().filter(function (x) { return x.tabType !== \"Dashboard\"; });\r\n tabsListOptions.dataSource = tabs;\r\n $(\"#tabListSelection\").dxList(tabsListOptions);\r\n },\r\n };\r\n\r\n $(\"#popover-tabs\").dxPopover(tabPopoverOptions as any);\r\n };\r\n\r\n var setup = function (callback) {\r\n let countCallback = 0;\r\n let whenFinished = function () {\r\n countCallback++;\r\n if (countCallback === 2) {\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n };\r\n mappingDataSource.prepareDataSourcePopover(whenFinished);\r\n prepareTabPopover();\r\n formattingRule.setup(whenFinished);\r\n };\r\n\r\n return {\r\n setup: setup,\r\n setupWidget: setupWidget,\r\n setupViewModel: setupViewModel,\r\n updateNames: updateNames,\r\n showTabsPopover: showTabsPopover,\r\n setTabSelection: setTabSelection,\r\n };\r\n}());","declare var urlConfigs: any;\r\n\r\nclass FormattingRule {\r\n id: number;\r\n name: string;\r\n scales: Array;\r\n startValue: number; //just to show the gauge properly\r\n endValue: number; //just to show the gauge properly\r\n config: FormattingRuleConfig;\r\n externalId: number;\r\n dxLinearGaugeOptions: any;\r\n organisationId: number;\r\n companyId: number;\r\n\r\n constructor(createDefault: boolean, name: string = \"New Formatting Rule\", object: any = null, createNewIdForObject: boolean = false) {\r\n this.id = 0;\r\n this.name = name;\r\n this.startValue = 0;\r\n this.endValue = 100;\r\n this.externalId = 0;\r\n this.config = new FormattingRuleConfig();\r\n this.scales = [];\r\n this.organisationId = null;\r\n this.companyId = null;\r\n\r\n if (createDefault) {\r\n this.scales.push(new FormattingRuleScales(this, \"Bad\", \"#D64554\", 0));\r\n this.scales.push(new FormattingRuleScales(this, \"Neutral\", \"#D9B300\", 50));\r\n this.scales.push(new FormattingRuleScales(this, \"Good\", \"#1AAB40\", 100));\r\n }\r\n\r\n if (object) {\r\n this.copyProperties(object, this);\r\n if (createNewIdForObject)\r\n this.id = 0;\r\n }\r\n else\r\n this.id = 0;\r\n\r\n this.calculateMaxMinValues();\r\n }\r\n\r\n copyProperties(fromObject, toObject) {\r\n formattingRule.copyProperties(fromObject, toObject);\r\n }\r\n\r\n save(newFormattingRule: boolean = false, sucessCallback: Function = null, failureCallback: Function = null) {\r\n var model = {\r\n newFormattingRule: newFormattingRule,\r\n formattingRule: this,\r\n };\r\n this.scales = this.scales.sort(this.sortScalesByMinValue);\r\n var url = urlConfigs.formattingRules + \"Save\";\r\n irGlobal.updateFromServer({}, url, model, function (data) {\r\n if (model.newFormattingRule) {\r\n model.formattingRule.id = data.id;\r\n }\r\n\r\n if (sucessCallback) {\r\n sucessCallback(data);\r\n }\r\n }.bind(this), failureCallback, true, \"POST\", true, undefined, undefined, false);\r\n this.calculateMaxMinValues();\r\n }\r\n\r\n delete(sucessCallback: Function = null, failureCallback: Function = null) {\r\n var model = { id: this.id };\r\n var url = urlConfigs.formattingRules + \"Delete\";\r\n irGlobal.updateFromServer({}, url, model, sucessCallback, failureCallback, true, \"POST\", true, undefined, undefined, false);\r\n }\r\n\r\n sortScalesByMinValue(firstEl, secondEl) {\r\n if (firstEl.minValue > secondEl.minValue)\r\n return 1;\r\n else\r\n return firstEl.minValue < secondEl.minValue ? - 1 : 0;\r\n };\r\n\r\n calculateMaxMinValues() {\r\n let self = this;\r\n self.scales.forEach(function (scale: FormattingRuleScales, index: number) {\r\n if (index === 0)\r\n self.startValue = scale.minValue;\r\n scale.startValue = scale.minValue;\r\n scale.endValue = index === self.scales.length - 1\r\n ? scale.minValue + (scale.minValue - self.startValue) / index\r\n : self.scales[index + 1].minValue;\r\n self.endValue = scale.endValue;\r\n });\r\n\r\n self.dxLinearGaugeOptions = {\r\n size: {\r\n width: 249,\r\n },\r\n title: {\r\n font: {\r\n size: 14,\r\n },\r\n text: self.name,\r\n },\r\n scale: {\r\n startValue: self.startValue,\r\n endValue: self.endValue,\r\n tickInterval: 10,\r\n tick: {\r\n color: \"#536878\"\r\n },\r\n label: {\r\n indentFromTick: -3\r\n }\r\n },\r\n rangeContainer: {\r\n offset: 10,\r\n ranges: self.scales,\r\n },\r\n };\r\n }\r\n}\r\n\r\nclass FormattingRuleScales {\r\n id: number;\r\n name: string;\r\n color: string;\r\n minValue: number;\r\n startValue: number;\r\n endValue: number;\r\n icon: string;\r\n backgroundColor: string;\r\n fontColor: string;\r\n\r\n constructor(formattingRule: FormattingRule = null, name: string = \"\", color: string = \"\", minValue: number = 0, icon: string = \"square-fill\", backgroundColor: string = \"\", fontColor: string = \"\") {\r\n let self = this;\r\n\r\n this.id = 0;\r\n this.name = name;\r\n this.color = color;\r\n this.minValue = minValue;\r\n this.startValue = 0;\r\n this.endValue = 0;\r\n this.icon = icon;\r\n this.backgroundColor = backgroundColor;\r\n this.fontColor = fontColor;\r\n if (formattingRule) {\r\n formattingRule.scales.forEach(function (scale) {\r\n if (self.id < scale.id)\r\n self.id = scale.id;\r\n });\r\n self.id = self.id + 1;\r\n }\r\n }\r\n}\r\n\r\nclass FormattingRuleConfig {\r\n applyRow: boolean;\r\n\r\n constructor(applyRow: boolean = false) {\r\n this.applyRow = applyRow;\r\n }\r\n}\r\n\r\nclass FormattingRuleViewModel {\r\n dataGridOptions: any;\r\n scalesDataGridOptions: any;\r\n view: string;\r\n formattingRules: Array;\r\n buttonOptions: any;\r\n organisations: Array;\r\n companies: Array;\r\n multiTenant: boolean;\r\n organisationId: number;\r\n}\r\n\r\nvar formattingRule = (function () {\r\n\r\n var getFormattingRules = function (allFormattingRules: boolean, callback: Function) {\r\n let createFormattingRules = function (formattingRules, data) {\r\n let newRules: Array = [];\r\n formattingRules.forEach(function (rule) {\r\n let newRule = new FormattingRule(false, null, rule);\r\n newRules.push(newRule);\r\n });\r\n\r\n formattingRuleViewModel.formattingRules = newRules;\r\n if (data) {\r\n formattingRuleViewModel.view = data.view;\r\n\r\n data.organisations.splice(0, 0, { id: 0, name: \" \" });\r\n data.companies.splice(0, 0, { id: 0, name: \" \", organisationId: 0 });\r\n\r\n formattingRuleViewModel.organisations = data.organisations;\r\n formattingRuleViewModel.companies = data.companies;\r\n formattingRuleViewModel.multiTenant = data.multiTenant;\r\n formattingRuleViewModel.organisationId = data.organisationId;\r\n }\r\n\r\n callback();\r\n }\r\n\r\n let formattingRulesConfig = $(\"body\").data(\"formattingrulesconfightml\");\r\n if (formattingRulesConfig) {\r\n createFormattingRules(formattingRulesConfig, null);\r\n }\r\n else {\r\n let url = urlConfigs.formattingRules + \"GetList\";\r\n let sucessCallback = function (data) {\r\n createFormattingRules(data.formattingRules, data)\r\n };\r\n irGlobal.updateFromServer({}, url, { allFormattingRules: allFormattingRules }, sucessCallback, null, true, \"POST\", true);\r\n }\r\n }\r\n\r\n var copyProperties = function (fromObject, toObject) {\r\n for (let property in fromObject) {\r\n if (toObject.hasOwnProperty(property) && fromObject[property] !== undefined) {\r\n let fromValue = typeof fromObject[property] === \"function\" ? fromObject[property]() : fromObject[property];\r\n if (Array.isArray(fromValue))\r\n fromValue = [];\r\n else if (typeof fromValue === \"object\")\r\n fromValue = {};\r\n\r\n if (typeof toObject[property] === \"function\")\r\n toObject[property](fromValue);\r\n else\r\n toObject[property] = fromValue;\r\n }\r\n }\r\n if (fromObject.scales) {\r\n fromObject.scales.sort(toObject.sortScalesByMinValue).forEach(function (fromScale) {\r\n let toScale = new FormattingRuleScales();\r\n copyProperties(fromScale, toScale);\r\n toObject.scales.push(toScale);\r\n });\r\n }\r\n if (fromObject.config) {\r\n let config = new FormattingRuleConfig();\r\n copyProperties(fromObject.config, config);\r\n toObject.config = config;\r\n }\r\n }\r\n\r\n var colorEditorTemplate = function (cellElement, cellInfo) {\r\n let div = $(\"
      \") as any;\r\n return div.dxColorBox({\r\n value: cellInfo.value,\r\n editAlphaChannel: true,\r\n onValueChanged: function (e) {\r\n if (e.previousValue !== e.value)\r\n cellInfo.setValue(e.value);\r\n }\r\n });\r\n };\r\n\r\n var colorCellTemplate = function (container, options) {\r\n let div = $(`
      `);\r\n div.appendTo(container);\r\n };\r\n\r\n var getColor = function (color: string, defaultColor: string = \"unset\") {\r\n if (!color || color.toLowerCase() === \"transparent\") {\r\n return defaultColor;\r\n }\r\n\r\n return color;\r\n }\r\n\r\n var formattingRuleViewModel: FormattingRuleViewModel = null;\r\n\r\n var getFormattingRuleViewModel = function () {\r\n return formattingRuleViewModel;\r\n }\r\n\r\n var onFormattingRuleSelected = null;\r\n var onFormattingRulePopoverHidding = null;\r\n\r\n var loadFormattingRuleViewModel = function (allFormattingRules: boolean, callback: Function) {\r\n let data = ko.observableArray([]);\r\n let scalesData = ko.observableArray([]);\r\n let currentFormattingRule: KnockoutObservable = ko.observable({});\r\n let allowEditingScale = ko.observable(true);\r\n formattingRuleViewModel = new FormattingRuleViewModel();\r\n \r\n getFormattingRules(allFormattingRules, function () {\r\n data(formattingRuleViewModel.formattingRules);\r\n if (formattingRuleViewModel.formattingRules.length > 0)\r\n scalesData(formattingRuleViewModel.formattingRules[0].scales);\r\n\r\n formattingRuleViewModel.dataGridOptions = {\r\n height: 300,\r\n dataSource: data,\r\n columns: [/*\"id\",*/\r\n {\r\n dataField: \"name\",\r\n caption: \"Name\",\r\n allowSorting: false,\r\n sortOrder: \"asc\",\r\n validationRules: [{\r\n message: \"Name is not unique\",\r\n type: 'custom',\r\n validationCallback: function (e) {\r\n let valid = formattingRuleViewModel.formattingRules.filter(function (x) { return x.name == e.value && x.id !== e.data.id; }).length == 0;\r\n return valid;\r\n }\r\n }, {\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (v.value === undefined || v.value === null) {\r\n return false;\r\n }\r\n\r\n if (v.value.trim() === \"\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message: \"Name is required\"\r\n }]\r\n },\r\n {\r\n dataField: \"organisationId\",\r\n caption: \"Organisation\",\r\n visible: formattingRuleViewModel.multiTenant,\r\n setCellValue(rowData, value) {\r\n this.defaultSetCellValue(rowData, value);\r\n rowData.companyId = null;\r\n },\r\n lookup: {\r\n dataSource: formattingRuleViewModel.organisations || [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n }\r\n },\r\n {\r\n dataField: \"companyId\",\r\n caption: \"Company\",\r\n visible: formattingRuleViewModel.multiTenant,\r\n lookup: {\r\n dataSource(options) {\r\n return {\r\n store: formattingRuleViewModel.companies || [],\r\n filter: options.data ? [['organisationId', '=', options.data.organisationId], 'or', ['organisationId', '=', 0]] : null,\r\n };\r\n },\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n }\r\n },\r\n {\r\n dataField: \"config.applyRow\",\r\n caption: \"Apply on Row\",\r\n width: 100,\r\n dataType: \"boolean\"\r\n },\r\n {\r\n dataField: \"externalId\",\r\n visible: false,\r\n },\r\n {\r\n type: \"buttons\",\r\n buttons: [{\r\n name: \"edit\",\r\n visible: function (e) {\r\n if (formattingRuleViewModel.multiTenant && (!e.row.data.organisationId || e.row.data.organisationId === 0) && !loggedUser.permissions.pdfTemplates()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n }, {\r\n name: \"delete\",\r\n visible: function (e) {\r\n if (formattingRuleViewModel.multiTenant && (!e.row.data.organisationId || e.row.data.organisationId === 0) && !loggedUser.permissions.pdfTemplates()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n }, {\r\n hint: \"Clone\",\r\n icon: \"copy\",\r\n visible: function (e) {\r\n return !e.row.isEditing;\r\n },\r\n onClick: function (e) {\r\n let clonedItem = new FormattingRule(false, \"\", e.row.data, true);\r\n clonedItem.name += \"- Copy\";\r\n clonedItem.externalId = 0;\r\n\r\n let newName = clonedItem.name;\r\n let countName = 1;\r\n while (formattingRuleViewModel.formattingRules.filter(function (x) { return x.name == newName; }).length > 0) {\r\n newName = `${clonedItem.name} ${countName}`;\r\n countName++;\r\n }\r\n clonedItem.name = newName;\r\n\r\n if (formattingRuleViewModel.multiTenant && (!clonedItem.organisationId || clonedItem.organisationId === 0) && !loggedUser.permissions.pdfTemplates()) {\r\n clonedItem.organisationId = formattingRuleViewModel.organisationId;\r\n }\r\n\r\n data.push(clonedItem);\r\n clonedItem.save(true, function () {\r\n e.component.option(\"focusedRowKey\", clonedItem.id);\r\n });\r\n }\r\n }\r\n ]\r\n }\r\n ],\r\n showBorders: true,\r\n editing: {\r\n mode: \"row\",\r\n allowUpdating: true,\r\n allowDeleting: true,\r\n allowAdding: true,\r\n useIcons: true,\r\n },\r\n focusedRowEnabled: true,\r\n keyExpr: \"id\",\r\n focusedRowIndex: 0,\r\n onFocusedRowChanged: function (e) {\r\n currentFormattingRule(e.row.data);\r\n scalesData(e.row.data.scales);\r\n\r\n if (formattingRuleViewModel.multiTenant) {\r\n if ((!e.row.data.organisationId || e.row.data.organisationId === 0) && !loggedUser.permissions.pdfTemplates()) {\r\n allowEditingScale(false);\r\n }\r\n else {\r\n allowEditingScale(true);\r\n }\r\n }\r\n else {\r\n allowEditingScale(true);\r\n }\r\n },\r\n onInitNewRow: function (e) {\r\n e.data = new FormattingRule(true);\r\n let newName = e.data.name;\r\n let countName = 1;\r\n while (formattingRuleViewModel.formattingRules.filter(function (x) { return x.name == newName; }).length > 0) {\r\n newName = `${e.data.name} ${countName}`;\r\n countName++;\r\n }\r\n\r\n if (formattingRuleViewModel.multiTenant && !loggedUser.permissions.pdfTemplates()) {\r\n e.data.organisationId = formattingRuleViewModel.organisationId;\r\n }\r\n\r\n e.data.name = newName;\r\n },\r\n onRowInserted: function (e) {\r\n e.data.save(true, function () {\r\n e.component.option(\"focusedRowKey\", e.data.id);\r\n });\r\n },\r\n onRowUpdated: function (e) {\r\n e.data.save();\r\n },\r\n onRowRemoving: function (e) {\r\n var deferred = $.Deferred();\r\n e.data.delete(function () {\r\n deferred.resolve();\r\n }, function (textStatus, failureText) {\r\n deferred.reject(failureText);\r\n });\r\n e.cancel = deferred.promise();\r\n },\r\n onRowRemoved: function (e) {\r\n data.remove(e.data);\r\n },\r\n onEditorPrepared: function (options) {\r\n if (formattingRuleViewModel.multiTenant && options.dataField == 'organisationId') {\r\n if (!loggedUser.permissions.pdfTemplates()) {\r\n options.editorElement.dxSelectBox('instance').option(\"disabled\", true);\r\n }\r\n else {\r\n options.editorElement.dxSelectBox('instance').option(\"disabled\", false);\r\n }\r\n }\r\n }\r\n };\r\n formattingRuleViewModel.scalesDataGridOptions = {\r\n height: 230,\r\n dataSource: scalesData,\r\n columns: [\r\n {\r\n dataField: \"name\",\r\n caption: \"Name\",\r\n allowSorting: false,\r\n },\r\n {\r\n dataField: \"fontColor\",\r\n caption: \"Font Color\",\r\n allowSorting: false,\r\n //validationRules: [{ type: \"required\" }],\r\n spectrum: true,\r\n //editCellTemplate: colorEditorTemplate,\r\n cellTemplate: colorCellTemplate,\r\n },\r\n {\r\n dataField: \"backgroundColor\",\r\n caption: \"Background\",\r\n allowSorting: false,\r\n spectrum: true,\r\n //editCellTemplate: colorPickerTemplate,\r\n cellTemplate: colorCellTemplate,\r\n },\r\n {\r\n dataField: \"icon\",\r\n caption: \"Icon\",\r\n allowSorting: false,\r\n validationRules: [{ type: \"required\" }],\r\n editCellTemplate: function (cellElement, cellInfo) {\r\n let div = $(\"
      \") as any;\r\n return div.dxLookup({\r\n dataSource: iconOptions,\r\n displayExpr: \"text\",\r\n valueExpr: \"value\",\r\n value: cellInfo.value,\r\n searchEnabled: false,\r\n dropDownOptions: {\r\n height: 200,\r\n closeOnOutsideClick: true,\r\n showCloseButton: false,\r\n showTitle: false\r\n },\r\n itemTemplate: function (data) {\r\n if (data.value === \"none\") {\r\n return `
      No icon
      `\r\n }\r\n\r\n return `
      `;\r\n },\r\n fieldTemplate: function (data) {\r\n if (data.value === \"none\") {\r\n return `
      No icon
      `\r\n }\r\n\r\n return `
      `;\r\n },\r\n onValueChanged: function (e) {\r\n if (e.previousValue !== e.value)\r\n cellInfo.setValue(e.value);\r\n }\r\n });\r\n },\r\n cellTemplate: function (container, options) {\r\n let div = $(`
      `);\r\n div.appendTo(container);\r\n }\r\n },\r\n {\r\n dataField: \"color\",\r\n caption: \"Icon Color\",\r\n allowSorting: false,\r\n //validationRules: [{ type: \"required\" }],\r\n spectrum: true,\r\n //editCellTemplate: colorEditorTemplate,\r\n cellTemplate: colorCellTemplate,\r\n setCellValue: function (rowData, value, currentRowData) {\r\n rowData.color = value;\r\n rowData.icon = rowData.icon || currentRowData.icon;\r\n },\r\n },\r\n {\r\n dataField: \"minValue\",\r\n caption: \"Min. Value\",\r\n allowSorting: false,\r\n sortOrder: \"asc\",\r\n validationRules: [{ type: \"required\" }],\r\n }\r\n ],\r\n showBorders: true,\r\n editing: {\r\n mode: \"row\",\r\n allowUpdating: allowEditingScale,\r\n allowDeleting: allowEditingScale,\r\n allowAdding: allowEditingScale,\r\n useIcons: true,\r\n },\r\n focusedRowEnabled: true,\r\n keyExpr: \"id\",\r\n onInitNewRow: function (e) {\r\n e.data = new FormattingRuleScales(currentFormattingRule());\r\n },\r\n onRowInserting: function (e) {\r\n if (currentFormattingRule() && currentFormattingRule().id <= 0) {\r\n e.cancel = true;\r\n DevExpress.ui.dialog.alert(\"Save the formatting rule first\", \"Formatting Rules\");\r\n }\r\n },\r\n onRowRemoving: function (e) {\r\n if (currentFormattingRule() && currentFormattingRule().id <= 0) {\r\n e.cancel = true;\r\n DevExpress.ui.dialog.alert(\"Save the formatting rule first\", \"Formatting Rules\");\r\n }\r\n },\r\n onRowUpdating: function (e) {\r\n if (currentFormattingRule() && currentFormattingRule().id <= 0) {\r\n e.cancel = true;\r\n DevExpress.ui.dialog.alert(\"Save the formatting rule first\", \"Formatting Rules\");\r\n }\r\n },\r\n onRowInserted: function (e) {\r\n currentFormattingRule().save();\r\n e.component.option(\"focusedRowKey\", e.data.id);\r\n },\r\n onRowUpdated: function (e) {\r\n currentFormattingRule().save();\r\n },\r\n onRowRemoved: function (e) {\r\n currentFormattingRule().save();\r\n },\r\n onEditorPreparing: function (e) {\r\n if (e.parentType === 'dataRow' && e.spectrum) {\r\n let input = $(``) as any;\r\n input.appendTo(e.editorElement);\r\n input.spectrum({\r\n type: \"color\",\r\n color: e.value,\r\n hideAfterPaletteSelect: \"true\",\r\n showInitial: true,\r\n showAlpha: false,\r\n allowEmpty: true,\r\n showInput: true,\r\n appendTo: \"body\",\r\n change: function (color) {\r\n if (color)\r\n e.setValue(color.toHexString());\r\n else\r\n e.setValue(\"\");\r\n }\r\n });\r\n e.editorElement.css(\"text-align\", \"center\");\r\n $(\".sp-replacer.sp-light\", e.editorElement).css(\"width\", \"40px\").css(\"height\", \"25px\");\r\n $(\".sp-dd\", e.editorElement).css(\"line-height\", \"25px\");\r\n\r\n e.cancel = true;\r\n }\r\n }\r\n };\r\n formattingRuleViewModel.buttonOptions = {\r\n onClick: function (model) {\r\n if (onFormattingRuleSelected)\r\n onFormattingRuleSelected({ model: model });\r\n },\r\n };\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n };\r\n\r\n var prepareList = function () {\r\n let listVM = {\r\n formattingRules: ko.observableArray(),\r\n gaugeClick: formattingRuleViewModel.buttonOptions.onClick\r\n };\r\n\r\n let viewModel = {\r\n popoverOptions: {\r\n target: \"#popoverListTarget\",\r\n position: \"left\",\r\n height: 500,\r\n width: 300,\r\n title: \"Formatting Rules List\",\r\n onShowing: function (e) {\r\n listVM.formattingRules([]);\r\n listVM.formattingRules(formattingRuleViewModel.formattingRules.sort(function (a, b) {\r\n return a.name.localeCompare(b.name);\r\n }));\r\n },\r\n onShown: function (e) {\r\n let element = $(\"#formattingRule-list-bind-element\");\r\n if (!ko.contextFor(element[0]))\r\n ko.applyBindings(listVM, element[0]);\r\n },\r\n onHiding: function (e) {\r\n if (onFormattingRulePopoverHidding)\r\n onFormattingRulePopoverHidding(e);\r\n },\r\n contentTemplate: `\r\n
      \r\n \r\n \r\n \r\n
      `,\r\n },\r\n };\r\n ($(\"#popover-formattingRule\") as any).dxPopover(viewModel.popoverOptions);\r\n };\r\n\r\n var openList = function (target, onFormattingRuleSelectedCallback, onFormattingRulePopoverHiddingCallback, container, position) {\r\n onFormattingRuleSelected = onFormattingRuleSelectedCallback;\r\n onFormattingRulePopoverHidding = onFormattingRulePopoverHiddingCallback;\r\n let popup = ($(\"#popover-formattingRule\") as any).dxPopover(\"instance\");\r\n if (container) {\r\n popup.option(\"container\", container);\r\n }\r\n if (position) {\r\n popup.option(\"position\", position);\r\n }\r\n popup.show(target);\r\n };\r\n\r\n var prepareEditor = function () {\r\n let popup = ($(\"#FRPopup\") as any).dxPopup({\r\n contentTemplate: `
      `,\r\n width: 620,\r\n height: 590,\r\n showTitle: true,\r\n title: \"Formatting Rules\",\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: true,\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n },\r\n container: undefined,\r\n onShown: function (e) {\r\n $(\"#FRPopupContent\").html(formattingRuleViewModel.view);\r\n ko.applyBindings(formattingRuleViewModel, document.getElementById(\"formattingRulesContext\"));\r\n },\r\n onHiding: function (e) {\r\n if (tabView.getActiveTab()) {\r\n const tabId = parseInt(tabView.getActiveTab().attr(\"id\"), 10);\r\n tabView.openTab(tabId);\r\n }\r\n }\r\n }).dxPopup(\"instance\");\r\n };\r\n\r\n var hide = function () {\r\n let popup = ($(\"#popover-formattingRule\") as any).dxPopover(\"instance\");\r\n if (popup)\r\n popup.hide();\r\n }\r\n\r\n var openEditor = function (allFormattingRules: boolean = false) {\r\n if (!formattingRuleViewModel) {\r\n loadFormattingRuleViewModel(allFormattingRules, function () {\r\n prepareEditor();\r\n openEditor();\r\n });\r\n }\r\n else {\r\n let popup = ($(\"#FRPopup\") as any).dxPopup(\"instance\");\r\n popup.show();\r\n }\r\n };\r\n\r\n var getNewFormattingRule = function () {\r\n return new FormattingRule(false, \"\");\r\n };\r\n\r\n var getFormattingRuleById = function (id: number) {\r\n let fr = formattingRuleViewModel.formattingRules.find(x => x.id === id);\r\n if (fr) {\r\n let copy = getNewFormattingRule();\r\n copyProperties(fr, copy);\r\n return copy;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n var isBlankFormattingRule = function (formattingRule) {\r\n return !formattingRule || (formattingRule.id === \"\" || formattingRule.id === 0 || formattingRule.id === null || formattingRule.id === undefined);\r\n }\r\n\r\n var getFormattingRuleScale = function (formattingRule, value: number, isPercent: boolean = false) {\r\n if (value === null || value === undefined || formattingRule.scales.length === 0) {\r\n return null;\r\n }\r\n\r\n let outputScale = formattingRule.scales[0];\r\n for (var i = 0; i < formattingRule.scales.length; i++) {\r\n let scale = formattingRule.scales[i];\r\n if (scale.minValue > value * (isPercent ? 100 : 1)) {\r\n break;\r\n }\r\n\r\n outputScale = scale;\r\n }\r\n\r\n return outputScale;\r\n }\r\n\r\n var iconOptions = [\r\n { value: \"none\", text: \"none\" },\r\n { value: \"square-fill\", text: \"square-fill\" },\r\n { value: \"arrow-down\", text: \"arrow-down\" },\r\n { value: \"arrow-down-right\", text: \"arrow-down-right\" },\r\n { value: \"arrow-right\", text: \"arrow-right\" },\r\n { value: \"arrow-up-right\", text: \"arrow-up-right\" },\r\n { value: \"arrow-up\", text: \"arrow-up\" },\r\n { value: \"arrow-down-circle-fill\", text: \"arrow-down-circle-fill\" },\r\n { value: \"arrow-down-right-circle-fill\", text: \"arrow-down-right-circle-fill\" },\r\n { value: \"arrow-right-circle-fill\", text: \"arrow-right-circle-fill\" },\r\n { value: \"arrow-up-right-circle-fill\", text: \"arrow-up-right-circle-fill\" },\r\n { value: \"arrow-up-circle-fill\", text: \"arrow-up-circle-fill\" },\r\n { value: \"arrow-down-square-fill\", text: \"arrow-down-square-fill\" },\r\n { value: \"arrow-down-right-square-fill\", text: \"arrow-down-right-square-fill\" },\r\n { value: \"arrow-right-square-fill\", text: \"arrow-right-square-fill\" },\r\n { value: \"arrow-up-right-square-fill\", text: \"arrow-up-right-square-fill\" },\r\n { value: \"arrow-up-square-fill\", text: \"arrow-up-square-fill\" },\r\n { value: \"caret-down-fill\", text: \"caret-down-fill\" },\r\n { value: \"caret-right-fill\", text: \"caret-right-fill\" },\r\n { value: \"caret-up-fill\", text: \"caret-up-fill\" },\r\n { value: \"circle\", text: \"circle\" },\r\n { value: \"circle-half\", text: \"circle-half\" },\r\n { value: \"circle-fill\", text: \"circle-fill\" },\r\n ];\r\n\r\n var bindSelectButton = function (element, onClick) {\r\n element.dxButton({\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose a Formatting Rule\",\r\n onClick: onClick\r\n });\r\n }\r\n var bindRemoveButton = function (element, onClick) {\r\n element.dxButton({\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Formatting Rule\",\r\n onClick: onClick\r\n });\r\n }\r\n\r\n var setup = function (callback: Function, allFormattingRules: boolean = false) {\r\n loadFormattingRuleViewModel(allFormattingRules, function () {\r\n prepareEditor();\r\n prepareList();\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n };\r\n\r\n return {\r\n setup: setup,\r\n openEditor: openEditor,\r\n getFormattingRuleViewModel: getFormattingRuleViewModel,\r\n openList: openList,\r\n getNewFormattingRule: getNewFormattingRule,\r\n copyProperties: copyProperties,\r\n getFormattingRuleById: getFormattingRuleById,\r\n getColor: getColor,\r\n isBlankFormattingRule: isBlankFormattingRule,\r\n bindSelectButton: bindSelectButton,\r\n bindRemoveButton: bindRemoveButton,\r\n getFormattingRuleScale: getFormattingRuleScale,\r\n hide: hide\r\n };\r\n\r\n}());\r\nvar formattingRuleService = formattingRule;","var pivotGrid = (function () {\r\n const functionTypeOptions = [\"none\", \"none\", \"none\", \"none\", \"percentOfRowTotal\", \"percentOfRowGrandTotal\", \"percentOfColumnTotal\", \"percentOfColumnGrandTotal\", \"absoluteVariation\", \"percentVariation\", \"none\"];\r\n const searchBoxHeight = 31;\r\n function getParentContext() {\r\n return irGlobal.getParentContext();\r\n };\r\n\r\n function getPivotDiv(context: JQuery = null) {\r\n if (!context)\r\n context = getParentContext();\r\n\r\n return $('.gridContainer', context);\r\n }\r\n function getPivotGridInstance (context: JQuery = null) {\r\n if (!context)\r\n context = getParentContext();\r\n\r\n return getPivotDiv(context)?.data(\"dxPivotGrid\");\r\n }\r\n\r\n function isDataCell(cell) {\r\n return (cell.area === 'data' && cell.rowType === 'D' && cell.columnType === 'D');\r\n }\r\n\r\n function isTotalCell(cell) {\r\n return (cell.type === 'T' || cell.type === 'GT' || cell.rowType === 'T' || cell.rowType === 'GT' || cell.columnType === 'T' || cell.columnType === 'GT');\r\n }\r\n\r\n function getField(component, cell) {\r\n let field = component.getDataSource().getAreaFields(\"data\")[cell.dataIndex];\r\n return field;\r\n }\r\n\r\n function clickDrillDown(e, result, element, event) {\r\n if (e.area === 'data') {//Drilldown\r\n let context = element ? element.closest(\"div.reportContent\") : null;\r\n\r\n //e.handled indicates that it treated by another function, ex. to expand a group\r\n if (e.handled)\r\n return;\r\n\r\n let widget = element.closest(\"div.dashboardWidget\");\r\n let isWidget = widget && widget.length > 0;\r\n if (event) {\r\n if (isWidget) {\r\n if (widget.hasClass(\"selected\"))\r\n event.stopPropagation();\r\n else\r\n return;\r\n }\r\n }\r\n\r\n if (!reportView.drilldownIsPossible(context))\r\n return;\r\n\r\n const pivotGridDataSource = e.component.getDataSource();\r\n const drillDownDataSource = pivotGridDataSource.createDrillDownDataSource(e.cell);\r\n drillDownDataSource.load()\r\n .done(function (data) {\r\n let model = reportView.getTabBaseObject({\r\n tabValues: [],\r\n widgetId: isWidget ? widget.data(\"widgetid\") : undefined\r\n });\r\n\r\n if (data.length === 0) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < result.columns.length; i++) {\r\n let column = result.columns[i];\r\n if (e.cell.rowType === \"GT\" && column.area === \"row\") {\r\n continue;\r\n }\r\n else if (e.cell.columnType === \"GT\" && column.area === \"column\") {\r\n continue;\r\n }\r\n\r\n if (!column.isMetric && column.isGrouping) {\r\n for (let gc = 0; gc < column.groupColumns.length; gc++) {\r\n let columnGroup = column.groupColumns[gc];\r\n if (!columnGroup.isMetric && columnGroup.groupingType === 4) {\r\n let addFilter = true;\r\n let startCondition = undefined;\r\n for (let di = 0; di < data.length; di++) {\r\n if (startCondition === undefined) {\r\n startCondition = data[di][column.dataField].values[gc]\r\n }\r\n else if (startCondition !== data[di][column.dataField].values[gc]) {\r\n addFilter = false;\r\n break;\r\n }\r\n }\r\n\r\n if (addFilter) {\r\n model.tabValues.push({\r\n name: columnGroup.queryName,\r\n startCondition: startCondition,\r\n isGroupField: columnGroup.isGrouping,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.workBook + \"NavigateToDrillDown\",\r\n model,\r\n function (data) {\r\n reportView.updateOutputAfterDrilldown(data, element);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n })\r\n .fail(function (error) {\r\n \r\n });\r\n }\r\n }\r\n\r\n function setup(params) {\r\n const { gridContainer, result, isGlReport, isPrinting, isExcelPrinting } = params\r\n let context = gridContainer.closest(\"div.reportContent\");\r\n if (!context || context.length === 0) {\r\n context = getParentContext();\r\n }\r\n \r\n let sortMetric = result.columns.find((x) => { return x.isMetric && x.sortOrder; });\r\n let sortMetricIdx = undefined;\r\n if (sortMetric) {\r\n sortMetricIdx = result.columns.indexOf(sortMetric);\r\n }\r\n\r\n let dependentColumns = [];\r\n\r\n for (const field of result.columns) {\r\n field.sortBy = undefined;\r\n if (field.isGrouping) {\r\n field.visible = true;\r\n field.groupColumns.forEach(function (groupColumn) {\r\n if (groupColumn.sortOrder) {\r\n field.sortBy = \"value\";\r\n field.sortOrder = groupColumn.sortOrder;\r\n }\r\n });\r\n\r\n if (sortMetric && field.area === \"row\") {\r\n field.sortBySummaryField = sortMetricIdx;\r\n field.sortBySummaryPath = [];\r\n field.sortOrder = sortMetric.sortOrder;\r\n }\r\n }\r\n else if (field.isMetric) {\r\n \r\n if (field.groupingType === GroupingTypeEnum.WSUM ||\r\n ((field.groupingType === GroupingTypeEnum.DSUM || field.groupingType === GroupingTypeEnum.WDSUM) && field.calculateTotals === CalculateTotalsEnum.UseFormula) ||\r\n field.comparisonType >= ComparisonTypeEnum.Variation || field.functionType === FunctionTypeEnum.AccumulatedAll) {\r\n field.summaryType = \"custom\";\r\n delete field.dataField;\r\n if (field.functionType === FunctionTypeEnum.AccumulatedAll || field.comparisonType >= ComparisonTypeEnum.Variation) {\r\n field.calculateCustomSummary = function (options) {\r\n options.column = this;\r\n report.calculateCustomSummary.call(this, options, result);\r\n }\r\n }\r\n }\r\n\r\n if (field.functionType === FunctionTypeEnum.Rank) {\r\n field.showGrandTotals = false;\r\n field.calculateSummaryValue = function (cell) {\r\n if (cell.parent(\"row\") == null)\r\n return;\r\n\r\n let topValue = cell.value(`${field.indexBase}`, true);\r\n if (topValue == 25 || true) {\r\n let children = cell.children(\"row\");\r\n if (children.length != 0)\r\n return;\r\n }\r\n return topValue;\r\n };\r\n }\r\n\r\n if (field.groupingType === GroupingTypeEnum.TSUM) {\r\n let groupColumnCount = result.columns.filter(x => x.isGrouping && x.area === \"column\").length;\r\n field.calculateSummaryValue = function (cell) {\r\n let isTotal = false;\r\n let parent = cell.parent(\"column\");\r\n for (var i = 0; i < groupColumnCount - 1; i++) {\r\n if (parent) {\r\n parent = parent.parent(\"column\");\r\n }\r\n }\r\n isTotal = !parent;\r\n\r\n if (isTotal) { // grand total | total\r\n return cell.children().map(c => c.value(true)).reduce(\r\n (acc, curr) => acc + (curr || 0) , 0\r\n );\r\n } else\r\n return cell.value();\r\n }\r\n }\r\n\r\n if (field.groupingType === GroupingTypeEnum.WSUM && field.functionType !== FunctionTypeEnum.AccumulatedAll) {\r\n\r\n let colTop = {\r\n caption: `${field.indexBase} TOP`,\r\n dataField: `${field.indexBase}`,\r\n dataType: 'number',\r\n summaryType: 'sum',\r\n area: 'data',\r\n visible: false,\r\n runningTotal: field.functionType === FunctionTypeEnum.Accumulated ? 'column' : '',\r\n };\r\n dependentColumns.push(colTop);\r\n\r\n let colBottom = {\r\n caption: `${field.indexBottom} BOTTOM`,\r\n dataField: `${field.indexBottom}`,\r\n dataType: 'number',\r\n summaryType: 'sum',\r\n area: 'data',\r\n visible: false,\r\n runningTotal: field.functionType === FunctionTypeEnum.Accumulated ? 'column' : '',\r\n };\r\n dependentColumns.push(colBottom);\r\n\r\n field.calculateSummaryValue = function (cell) {\r\n let topValue = cell.value(`${field.indexBase}`, true);\r\n let bottomValue = cell.value(`${field.indexBottom}`, true);\r\n\r\n if (field.functionType === FunctionTypeEnum.Accumulated) {\r\n let stackTopValue = topValue || 0;\r\n let stackBottomValue = bottomValue || 0;\r\n let prevCell = cell.prev(\"row\");\r\n while (prevCell) {\r\n stackTopValue += prevCell.value(`${field.indexBase}`, true) || 0;\r\n stackBottomValue += prevCell.value(`${field.indexBottom}`, true) || 0;\r\n prevCell = prevCell.prev(\"row\");\r\n }\r\n \r\n return stackBottomValue === 0 ? 0 : stackTopValue / stackBottomValue;\r\n }\r\n\r\n let wsumValue = bottomValue === 0 ? 0 : topValue / bottomValue;\r\n return wsumValue;\r\n };\r\n }\r\n\r\n if ((field.groupingType === GroupingTypeEnum.DSUM || field.groupingType == GroupingTypeEnum.WDSUM) && field.calculateTotals === CalculateTotalsEnum.UseFormula) {\r\n field.calculateSummaryValue = function (cell) {\r\n let formula = field.formulaTop;\r\n for (const dColumn of field.dependentColumns) {\r\n let dColumnValue = 0;\r\n\r\n if (dColumn.dataField === undefined && field.summaryType === \"custom\") {\r\n if (dColumn.calculateSummaryValue) {\r\n dColumnValue = dColumn.calculateSummaryValue(cell)\r\n }\r\n else {\r\n dColumnValue = cell.value(`${dColumn.caption}`, true);\r\n }\r\n }\r\n else {\r\n if (dColumn.groupingType === GroupingTypeEnum.WSUM) {\r\n let topValue = cell.value(`${dColumn.indexBase}`, true);\r\n let bottomValue = cell.value(`${dColumn.indexBottom}`, true);\r\n dColumnValue = bottomValue === 0 ? 0 : topValue / bottomValue;\r\n }\r\n else {\r\n dColumnValue = cell.value(`${dColumn.indexBase}`, true);\r\n }\r\n }\r\n\r\n if (dColumnValue === undefined)\r\n dColumnValue = 0;\r\n\r\n formula = formula.replaceAll(`[${dColumn.indexBase}]`, dColumnValue);\r\n }\r\n\r\n //Precisa verificar \r\n //if (options.column.functionType === FunctionTypeEnum.PercentOfTotal) {\r\n // formula = `IIF(${options.valueGrandTotal} == 0, 0, (${formula}) / ${options.valueGrandTotal})`;\r\n //}\r\n\r\n let totalValue = eval(formula);\r\n return totalValue;\r\n };\r\n }\r\n\r\n if (field.functionType > FunctionTypeEnum.AccumulatedAll) {\r\n field.summaryDisplayMode = functionTypeOptions[field.functionType];\r\n }\r\n }\r\n\r\n if (field.area === \"row\") {\r\n field.expanded = result.isPrinting ? true : result.expandAllRows;\r\n field.wordWrapEnabled = false;\r\n }\r\n else if (field.area === \"column\") {\r\n field.expanded = result.isPrinting ? true : result.expandAllColumns;\r\n }\r\n }\r\n\r\n for (const depColumn of dependentColumns) {\r\n result.columns.push(depColumn);\r\n }\r\n\r\n $(\".pivotGridSearchBox\", context).css({\r\n \"margin-left\": \"auto\",\r\n \"margin-right\": 0,\r\n \"margin-bottom\": \"5px\"\r\n }).dxTextBox({\r\n valueChangeEvent: \"keyup\",\r\n mode: 'search',\r\n width: 160,\r\n placeholder: \"Search...\",\r\n visible: !isPrinting && result.enableSearchBox,\r\n onValueChanged: function (e) {\r\n let pivotSource = gridContainer.dxPivotGrid(\"instance\").getDataSource();\r\n let filters = [];\r\n result.columns.forEach(function (c) {\r\n if (c.dataField && !c.isMetric) {\r\n if (filters.length > 0) {\r\n filters.push(\"or\");\r\n }\r\n filters.push([c.dataField, \"contains\", e.value]);\r\n }\r\n });\r\n\r\n pivotSource.filter(filters);\r\n pivotSource.reload();\r\n }\r\n });\r\n\r\n let collapseRows = [];\r\n gridContainer.dxPivotGrid({\r\n allowExpandAll: true,\r\n allowSortingBySummary: true,\r\n\r\n allowFiltering: true,\r\n headerFilter: {\r\n search: {\r\n enabled: true,\r\n },\r\n },\r\n fieldPanel: {\r\n allowFieldDragging: false,\r\n showFilterFields: false,\r\n showDataFields: false,\r\n visible: !isPrinting && result.enableFilterPanel,\r\n },\r\n\r\n wordWrapEnabled: false,\r\n showBorders: result.isPrinting || isGlReport ? false : true,\r\n\r\n showColumnGrandTotals: result.showColumnGrandTotals,\r\n showColumnTotals: result.showColumnTotals,\r\n showRowGrandTotals: result.showRowGrandTotals,\r\n showRowTotals: result.showRowTotals,\r\n\r\n allowSorting: true,\r\n dataFieldArea: result.pivotLayout === 0 ? \"column\" : \"row\",\r\n fieldChooser: {\r\n enabled: false,\r\n height: 400,\r\n },\r\n texts: {\r\n grandTotal: result.grandTotalText,\r\n total: `${result.subTotalText} {0}`\r\n },\r\n encodeHtml: false,\r\n rowHeaderLayout: isGlReport ? 'standard' : result.rowHeaderLayoutPivot === 0 ? 'tree' : 'standard',\r\n dataSource: {\r\n fields: result.columns,\r\n store: result.result,\r\n },\r\n height: isExcelPrinting ? 200 : undefined, //When sending the report as excel by email, we need to set the height for the scrolling.mode works\r\n width: isExcelPrinting ? 200 : undefined, //When sending the report as excel by email, we need to set the width for the scrolling.mode works\r\n scrolling: {\r\n mode: result.isPrinting && !isExcelPrinting ? 'standard' : 'virtual',\r\n },\r\n onCellPrepared: function (e) {\r\n const enableDrawIconSelectRow = result.designer.enableRowSelection();\r\n const { cell } = e;\r\n cell.area = e.area;\r\n e.cellElement.css(\"font-size\", result.fontSize);\r\n\r\n if (isGlReport) {\r\n e.cellElement.css(\"background-color\", \"#FFFFFF !important\").css(\"color\", \"#000000\");\r\n //e.cellElement.children().each(function () {\r\n // $(this).css(\"background-color\", \"#FFFFFF !important\").css(\"color\", \"#000000\");\r\n //});\r\n }\r\n\r\n if (isDataCell(cell) || isTotalCell(cell)) {\r\n let field = getField(e.component, cell);\r\n if (field && field.isMetric && e.area !== \"column\") {\r\n e.cellElement.css(\"text-align\", field.alignment).css(\"vertical-align\", \"middle\");\r\n if (field.hasFormattingRule) {\r\n if (cell.value !== undefined) {\r\n e.cellElement.empty();\r\n report.applyFormattingRuleCell(result, e.cellElement, { column: field, value: cell.value, text: cell.text }, \"data\");\r\n if (enableDrawIconSelectRow) {\r\n $(\"div\", e.cellElement).prepend(report.getLinkDrilldown());\r\n }\r\n }\r\n }\r\n else {\r\n if (enableDrawIconSelectRow) {\r\n e.cellElement.prepend(report.getLinkDrilldown());\r\n }\r\n\r\n let color = field.foreColor;\r\n let backgroundColor = field.backgroundColor;\r\n\r\n if (!e.cellElement.hasClass(\"fr-row-fontColor-applied\")) {\r\n e.cellElement.css(\"color\", color);\r\n }\r\n if (!e.cellElement.hasClass(\"fr-row-backgroundColor-applied\") && backgroundColor && backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n e.cellElement.css(\"backgroundColor\", backgroundColor);\r\n }\r\n }\r\n\r\n //if (field.hasBarChart) {\r\n // report.drawBarColumn(container, options, formattingRule);\r\n //}\r\n\r\n if (field.thresholdColor && field.thresholdValue !== undefined && field.thresholdValue !== null && cell.value !== undefined && cell.value < field.thresholdValue) {\r\n let color = field.thresholdColor;\r\n if (!e.cellElement.hasClass(\"fr-row-fontColor-applied\") && !e.cellElement.hasClass(\"fr-fontColor-applied\")) {\r\n e.cellElement.css(\"color\", color);\r\n }\r\n }\r\n\r\n if (enableDrawIconSelectRow) {\r\n $(\"a.drilldowrow\", e.cellElement).click(function (ev) {\r\n if (isPrinting) {\r\n return;\r\n }\r\n clickDrillDown(e, result, e.cellElement, ev);\r\n });\r\n }\r\n\r\n let collapseText = cell.rowPath && cell.rowPath.length > 0 ? cell.rowPath[0].toString() : \"\";\r\n if (collapseText && (typeof collapseText === 'string' || collapseText instanceof String) && collapseText.includes(\"\")) {\r\n e.cellElement.addClass(\"hideExpandIcon\");\r\n }\r\n }\r\n }\r\n else {\r\n if (cell.text && (typeof cell.text === 'string' || cell.text instanceof String) && cell.text.includes(\"\")){\r\n if (cell.expanded) {\r\n collapseRows.push(cell.path);\r\n }\r\n e.cellElement.addClass(\"hideExpandIcon\");\r\n }\r\n }\r\n\r\n //Metric header\r\n if (e.area === \"column\" && cell.dataIndex !== undefined) {\r\n let field = getField(e.component, cell)\r\n if (field && field.isMetric) {\r\n e.cellElement.css(\"text-align\", field.alignment);\r\n }\r\n }\r\n\r\n //Rows and Columns, without the Metrics\r\n if (e.area === \"row\" || (e.area === \"column\" && cell.dataIndex === undefined)) {\r\n let fields = e.component.getDataSource().getAreaFields(e.area);\r\n if (cell.path && fields.length >= cell.path.length) {\r\n let field = fields[cell.path.length - 1];\r\n if (field) {\r\n e.cellElement.css(\"text-align\", field.groupColumns[0].alignment);\r\n }\r\n }\r\n }\r\n },\r\n onCellClick(e) {\r\n if (isPrinting) {\r\n return;\r\n }\r\n\r\n if (!result.designer.enableRowSelection()) {\r\n clickDrillDown(e, result, e.element, e.event);\r\n }\r\n else if (e.area === 'data') {\r\n e.event.stopPropagation();\r\n const table = e.cellElement.closest(\"table\");\r\n $(\"tr\", table).removeClass(\"highlight\");\r\n e.cellElement.closest(\"tr\").addClass(\"highlight\");\r\n }\r\n },\r\n onInitialized: function (e) {\r\n },\r\n onContentReady: function (e) {\r\n //Create a thead and move the header row, so, the header is printed on each page\r\n if (result.isPrinting) {\r\n var mainTable = $(\".dx-pivotgrid-container > table\", e.element);\r\n var headerRow = $(\"> tr:has(.dx-pivotgrid-horizontal-headers)\", mainTable);\r\n var thead = $(\"\");\r\n thead.prepend(headerRow);\r\n mainTable.prepend(thead);\r\n }\r\n\r\n if (isGlReport) {\r\n if (collapseRows.length > 0) {\r\n e.component.collapsedRows = collapseRows.length;\r\n e.component.beginUpdate();\r\n let dataSource = e.component.getDataSource();\r\n collapseRows.forEach(function (rowKey) {\r\n dataSource.collapseHeaderItem(\"row\", rowKey);\r\n });\r\n collapseRows = [];\r\n e.component.endUpdate();\r\n }\r\n else {\r\n if (result.isPrinting) {\r\n //The number of rows we collapse is the number of times onContentReady executes\r\n if (e.component.collapsedRows !== undefined && e.component.collapsedRows !== null) {\r\n e.component.collapsedRows--;\r\n\r\n if (e.component.collapsedRows <= 0) {\r\n e.component.isReadyIR = true;\r\n }\r\n }\r\n else {\r\n e.component.isReadyIR = true;\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n if (result.isPrinting) {\r\n e.component.isReadyIR = true;\r\n }\r\n }\r\n\r\n if (e.component.isReadyIR || !result.isPrinting) {\r\n if (irngCustom.enableCustomization && irngCustom.onContentReadyPivot) {\r\n try {\r\n irngCustom.onContentReadyPivot(e, isGlReport, result);\r\n }\r\n catch (err) {\r\n console.log(`Error on irngCustom.onContentReadyPivot: ${err.message}`);\r\n }\r\n }\r\n }\r\n },\r\n onContextMenuPreparing: function (e) {\r\n for (var i = 0; i < e.items.length; i++) {\r\n if (e.items[i].text && e.items[i].text.startsWith(\"Sort\")) {\r\n e.items[i].visible = false;\r\n }\r\n }\r\n\r\n if (e.items.filter(function (x) { return !x.visible; }).length === e.items.length) {\r\n e.items = [];\r\n }\r\n }\r\n });\r\n }\r\n\r\n return {\r\n isDataCell: isDataCell,\r\n isTotalCell: isTotalCell,\r\n getField: getField,\r\n getPivotDiv: getPivotDiv,\r\n getPivotGridInstance: getPivotGridInstance,\r\n setup: setup,\r\n\r\n searchBoxHeight: searchBoxHeight\r\n };\r\n}());\r\n","function maxWidth() {\r\n var width = 0;\r\n $('.gridContainer') !== null && $('.gridContainer').each(function () {\r\n if (this.scrollWidth > width) {\r\n width = this.scrollWidth;\r\n }\r\n\r\n $('.dx-datagrid-headers .dx-datagrid-scroll-container', this).each(function () {\r\n if (this.scrollWidth > width) {\r\n width = this.scrollWidth;\r\n }\r\n });\r\n\r\n $('.dx-pivotgrid-container tr.dx-bottom-row', this).each(function () {\r\n let rowCell = $(\".dx-area-row-cell\", this).get(0).scrollWidth;\r\n let areaCell = $(\".dx-area-data-cell .dx-scrollable-content\", this).get(0).scrollWidth;\r\n let pivotWidth = rowCell + areaCell + 20;//20 padding + margin\r\n if (pivotWidth > width) {\r\n width = pivotWidth;\r\n }\r\n });\r\n });\r\n\r\n $('.chartMainContainer') !== null && $('.chartMainContainer').each(function () {\r\n if (this.scrollWidth > width) {\r\n width = this.scrollWidth;\r\n }\r\n });\r\n\r\n $('.page') != null && $('.page').each(function () {\r\n if (this.scrollWidth > width) {\r\n width = this.scrollWidth;\r\n }\r\n });\r\n\r\n if (width === 0 && $(\"#warningEditMode\").length > 0) {\r\n width = $(\"#warningEditMode\").width();\r\n }\r\n\r\n return width;\r\n}\r\n\r\nfunction setWorkbookWidth() {\r\n let width = maxWidth();\r\n if (width === 0) {\r\n width = \"100%\";\r\n }\r\n else {\r\n width += \"px\";\r\n }\r\n $(\"html\").css(\"width\", width);\r\n}\r\n\r\nfunction widgetWidth() {\r\n var width = 0;\r\n $(\".widgetContainer\").each(function () {\r\n if (this.scrollWidth > width) {\r\n width = this.scrollWidth;\r\n }\r\n });\r\n\r\n return width;\r\n}\r\n\r\nfunction widgetHeight() {\r\n var height = 0;\r\n $(\".widgetContainer\").each(function () {\r\n if (this.scrollHeight > height) {\r\n height = this.scrollHeight;\r\n }\r\n });\r\n\r\n return height;\r\n}\r\n\r\n//drawnGrids\r\nfunction reportsReady() {\r\n let grids = $(\".gridContainer\");\r\n let charts = $(\".canvasChart\");\r\n let items = grids.length + charts.length;\r\n let readyItems = 0;\r\n\r\n grids.each(function () {\r\n let ready = true;\r\n let grid = $(this).data(\"dxDataGrid\");\r\n if (grid) {\r\n ready = grid.isReady();\r\n }\r\n\r\n let pivot = $(this).data(\"dxPivotGrid\");\r\n if (pivot && ready) {\r\n ready = pivot.isReadyIR;\r\n }\r\n\r\n if (ready) {\r\n readyItems++;\r\n }\r\n });\r\n\r\n charts.each(function () {\r\n let ready = true;\r\n let pie = $(this).data(\"dxPieChart\");\r\n if (pie) {\r\n ready = pie.isReady();\r\n }\r\n\r\n let polar = $(this).data(\"dxPolarChart\");\r\n if (polar && ready) {\r\n ready = polar.isReady();\r\n }\r\n\r\n let chart = $(this).data(\"dxChart\");\r\n if (chart && ready) {\r\n ready = chart.isReady();\r\n }\r\n\r\n if (ready) {\r\n readyItems++;\r\n }\r\n });\r\n\r\n return readyItems === items;\r\n}\r\n\r\nfunction repaintGrids() {\r\n let grids = $('.gridContainer');\r\n grids.each(function () {\r\n let grid = $(this).data(\"dxDataGrid\");\r\n if (grid) {\r\n grid.refresh();\r\n }\r\n\r\n let pivot = $(this).data(\"dxPivotGrid\");\r\n if (pivot) {\r\n pivot.repaint();\r\n }\r\n });\r\n}\r\n\r\nfunction setExcelColumnFormat(columns, currencyCode) {\r\n if (columns) {\r\n var currencySymbol = DevExpress.formatHelper.format(0, {\r\n style: \"currency\",\r\n currency: currencyCode,\r\n currencyDisplay: \"narrowSymbol\",\r\n precision: 0\r\n }).replace(\"0\", \"\");\r\n\r\n columns.forEach(function (column) {\r\n if (column.isMetric) {\r\n let format = \"#,##0\";\r\n if (column.format.precision > 0) {\r\n format += \".\";\r\n for (var i = 0; i < column.format.precision; i++) {\r\n format += \"0\";\r\n }\r\n }\r\n\r\n switch (column.format.style) {\r\n case \"currency\":\r\n format = `${currencySymbol}${format}`;\r\n break\r\n case \"percent\":\r\n format = `${format}%`;\r\n break\r\n default:\r\n break\r\n }\r\n\r\n if (column.format.currencySign === \"accounting\") {\r\n format = `${format};(${format})`;\r\n }\r\n\r\n column.excelNumberFormat = format;\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction exportToExcel(e) {\r\n let settings = {\r\n isCSV: false,\r\n printMessage: \"\",\r\n mappingName: \"\",\r\n reportName: \"\",\r\n groupBy: \"\",\r\n orderBy: \"\",\r\n filters: \"\",\r\n companyName: \"\",\r\n fontSize: 0,\r\n glReport: false,\r\n subtotalsPosition: 0,\r\n save: false,\r\n fileName: \"\",\r\n currencyCode: \"\",\r\n subTotalText: \"\"\r\n };\r\n $.extend(settings, e);\r\n\r\n //file name has a limit of 31 characteres\r\n const fileName = settings.reportName?.length > 30 ? settings.reportName.substring(0, 29) : settings.reportName;\r\n\r\n const workbook = new ExcelJS.Workbook();\r\n const worksheet = workbook.addWorksheet(fileName);\r\n const component = $('.gridContainer').data(\"dxDataGrid\");\r\n if (component === null || component === undefined) {\r\n return;\r\n }\r\n\r\n let def = $.Deferred();\r\n let skip = 4;\r\n if (settings.groupBy) {\r\n skip++;\r\n }\r\n if (settings.orderBy) {\r\n skip++;\r\n }\r\n if (settings.companyName && settings.companyName !== \"\") {\r\n skip++;\r\n }\r\n\r\n if (typeof settings.filters === \"string\" && settings.filters !== \"\") {\r\n settings.filters = JSON.parse(settings.filters);\r\n skip += settings.filters.length;\r\n }\r\n else {\r\n if (settings.filters === \"\" || settings.filters === undefined || settings.filters === null)\r\n settings.filters = [];\r\n\r\n skip += settings.filters.length;\r\n }\r\n\r\n let result = $('.gridContainer').data(\"result\") || {};\r\n let formattingRules = result.formattingRules || settings.formattingRules;\r\n let subtotalsPosition = result.subtotalsPosition || settings.subtotalsPosition;\r\n let isGlReport = result.glReport || settings.glReport;\r\n let currencyCode = result.currencyCode || settings.currencyCode;\r\n let subTotalText = result.subTotalText || settings.subTotalText;\r\n\r\n let rowIndex = 0;\r\n let rowNumber = -1;\r\n\r\n let default_report_colour = $(\"html\").css(\"--default_report_colour\").replace(\"#\", \"\").trimStart();\r\n let default_report_odd_colour = $(\"html\").css(\"--default_report_odd_colour\").replace(\"#\", \"\").trimStart();\r\n let default_headfoot_font_colour = $(\"html\").css(\"--default_headfoot_font_colour\").replace(\"#\", \"\").trimStart();\r\n let default_headfoot_colour = $(\"html\").css(\"--default_headfoot_colour\").replace(\"#\", \"\").trimStart();\r\n\r\n let totalItems = component.option(\"summary.totalItems\");\r\n let totalItemsUpdated = false;\r\n let rowsToRemove = [];\r\n let rowsCollapsed = [];\r\n let rowsToReplaceSubtotalText = [];\r\n\r\n let columns = component.option(\"columns\");\r\n setExcelColumnFormat(columns, currencyCode);\r\n\r\n const borderStyle = { style: 'thin', color: { argb: 'black' } };\r\n\r\n let groupIndex = 0;\r\n const addIdentation = function (val, spaces) {\r\n for (var i = 0; i < spaces; i++) {\r\n val = ` ${val}`;\r\n }\r\n\r\n return val;\r\n }\r\n\r\n let applyFormattingRule = function (formattingScale, excelCell) {\r\n if (formattingScale) {\r\n let colors = report.getFormattingScaleColor(formattingScale);\r\n if (colors.backgroundColor && colors.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: colors.backgroundColor.replace(\"#\", \"\") } };\r\n }\r\n if (colors.color) {\r\n excelCell.font.color = { argb: colors.color.replace(\"#\", \"\") };\r\n }\r\n }\r\n }\r\n let cellsToApplyFormattingRule = {};\r\n let customExport = function () {\r\n DevExpress.excelExporter.exportDataGrid({\r\n component: component,\r\n worksheet,\r\n topLeftCell: { row: skip, column: 1 },\r\n customizeCell(options) {\r\n const { gridCell } = options;\r\n const { excelCell } = options;\r\n excelCell.font = excelCell.font || {};\r\n excelCell.font.size = settings.fontSize;\r\n\r\n if (!settings.isCSV && (/*gridCell.rowType === \"totalFooter\" || */gridCell.rowType === \"groupFooter\" || gridCell.rowType === \"group\" || gridCell.rowType === 'data')) {\r\n if (!cellsToApplyFormattingRule[excelCell.row]) {\r\n cellsToApplyFormattingRule[excelCell.row] = {\r\n formattingRuleScale: null,\r\n cells: []\r\n };\r\n }\r\n\r\n cellsToApplyFormattingRule[excelCell.row].cells.push({ gridCell, excelCell });\r\n }\r\n\r\n if (gridCell.column.name === \"fake\") {\r\n excelCell.value = \"\";\r\n }\r\n\r\n //Hack to remove currency format\r\n if (settings.isCSV && gridCell.column.isMetric &&\r\n (gridCell.rowType === \"totalFooter\" || gridCell.rowType === \"groupFooter\" || gridCell.rowType === \"group\")) {\r\n if (gridCell.value !== undefined) {\r\n excelCell.value = gridCell.value.toString();\r\n }\r\n else if (gridCell.groupSummaryItems !== undefined && gridCell.groupSummaryItems.length > 0) {\r\n excelCell.value = gridCell.groupSummaryItems[0].value?.toString();\r\n }\r\n }\r\n\r\n if (gridCell.rowType === 'header' || gridCell.rowType === 'group' || gridCell.rowType === 'groupFooter' || gridCell.rowType === 'totalFooter') {\r\n excelCell.font.bold = true;\r\n excelCell.font.color = { argb: default_headfoot_font_colour };\r\n\r\n if (isGlReport) {\r\n if (gridCell.rowType === 'header') {\r\n excelCell.border = { bottom: { style: 'medium', color: { argb: 'black' } } };\r\n }\r\n }\r\n else {\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: default_headfoot_colour } };\r\n }\r\n }\r\n\r\n if (gridCell.rowType === 'header') {\r\n excelCell.alignment = { horizontal: gridCell.column.titleAlignment };\r\n }\r\n\r\n if (gridCell.rowType === 'data') {\r\n if (rowNumber === -1 || rowNumber !== excelCell.row) {\r\n rowIndex++;\r\n rowNumber = excelCell.row;\r\n }\r\n\r\n if (!isGlReport) {\r\n if (rowIndex % 2 == 0) {\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: default_report_colour } };\r\n }\r\n else {\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: default_report_odd_colour } };\r\n }\r\n }\r\n\r\n if (isGlReport) {\r\n if (gridCell.data && gridCell.data.length > 0) {\r\n let collapsed = false;\r\n for (var i = 0; i < gridCell.data.length; i++) {\r\n let val = gridCell.data[i];\r\n if (val && val.text !== undefined) {\r\n val = `${val.toString()}`;\r\n }\r\n\r\n if (val && typeof val === \"string\") {\r\n if (val.includes(\"\")) {\r\n collapsed = true;\r\n if (typeof excelCell.row === \"number\") {\r\n //Remove group header when subtotal is bottom\r\n //if (subtotalsPosition === 1) {\r\n\r\n if (rowsToReplaceSubtotalText.indexOf(`${subTotalText} ${val}`) === -1) {\r\n rowsToReplaceSubtotalText.push(`${subTotalText} ${val}`);\r\n }\r\n\r\n \r\n if (rowsToRemove.indexOf(excelCell.row - 1) === -1) {\r\n rowsToRemove.push(excelCell.row - 1);\r\n }\r\n //}\r\n\r\n if (rowsToRemove.indexOf(excelCell.row) === -1) {\r\n rowsToRemove.push(excelCell.row);\r\n }\r\n }\r\n }\r\n else if (collapsed) {\r\n\r\n if (rowsCollapsed.indexOf(val) === -1) {\r\n //Need to remove subgroups\r\n rowsCollapsed.push(val);\r\n rowsCollapsed.push(`${subTotalText} ${val}`);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else if (gridCell.rowType === 'group') {\r\n groupIndex = gridCell.groupIndex;\r\n\r\n if (gridCell.value) {\r\n let groupValue = \"\";\r\n\r\n groupValue = gridCell.value[0];\r\n if (gridCell.value.text !== undefined) {\r\n groupValue = `${gridCell.value.toString()}`;\r\n }\r\n\r\n excelCell.value = groupValue;\r\n }\r\n else if (gridCell.column.isMetric && subtotalsPosition !== 2) {\r\n excelCell.value = \"\";\r\n }\r\n }\r\n else if (gridCell.rowType === 'totalFooter' && excelCell.value) {\r\n excelCell.value = excelCell.value.replace(report.getTagLinkDrilldown(), \"\");\r\n }\r\n\r\n if (gridCell.rowType === 'data' || gridCell.rowType === 'group' || gridCell.rowType === 'groupFooter' || gridCell.rowType === 'totalFooter') {\r\n if (gridCell.column.backgroundColor && gridCell.column.backgroundColor !== \"\" && gridCell.column.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: gridCell.column.backgroundColor.replace(\"#\", \"\") } };\r\n }\r\n\r\n if (gridCell.column.foreColor && gridCell.column.foreColor !== \"\") {\r\n excelCell.font.color = { argb: gridCell.column.foreColor.replace(\"#\", \"\") };\r\n }\r\n\r\n if (gridCell.column.isMetric) {\r\n let value = gridCell.value;\r\n if (!value && gridCell.groupSummaryItems && gridCell.groupSummaryItems.length > 0) {\r\n value = gridCell.groupSummaryItems[0].value;\r\n }\r\n\r\n if (gridCell.rowType !== 'data' && excelCell.value !== \"\" && excelCell.value !== undefined) {\r\n excelCell.value = value;\r\n }\r\n\r\n if (gridCell.column.thresholdColor && gridCell.column.thresholdValue !== undefined &&\r\n gridCell.column.thresholdValue !== null && value < gridCell.column.thresholdValue) {\r\n excelCell.font.color = { argb: gridCell.column.thresholdColor.replace(\"#\", \"\") };\r\n }\r\n\r\n let formattingRule = formattingRules.find(function (x) { return x.id === gridCell.column.formattingRuleId; });\r\n if (formattingRule) {\r\n let isPercent = gridCell.column.format && gridCell.column.format.style === \"percent\";\r\n let formattingScale = formattingRuleService.getFormattingRuleScale(formattingRule, value, isPercent);\r\n if (cellsToApplyFormattingRule[excelCell.row]) {\r\n if (formattingRule.config.applyRow) {\r\n cellsToApplyFormattingRule[excelCell.row].formattingRuleScale = formattingScale;\r\n }\r\n else {\r\n cellsToApplyFormattingRule[excelCell.row].cells[cellsToApplyFormattingRule[excelCell.row].cells.length - 1].formattingRuleScale = formattingScale;\r\n }\r\n }\r\n\r\n applyFormattingRule(formattingScale, excelCell);\r\n }\r\n\r\n let column = gridCell.column;\r\n if (columns) {\r\n column = columns.find(x => x.queryName === gridCell.column.queryName) || gridCell.column;\r\n }\r\n excelCell.style.numFmt = column.excelNumberFormat;\r\n }\r\n }\r\n\r\n if (isGlReport) {\r\n if (gridCell.rowType === 'group' || gridCell.rowType === 'groupFooter') {\r\n if (typeof excelCell.row === \"number\" && rowsCollapsed.indexOf(gridCell.value) !== -1 && rowsToRemove.indexOf(excelCell.row) === -1) {\r\n rowsToRemove.push(excelCell.row);\r\n }\r\n\r\n if (subtotalsPosition === 1 && gridCell.rowType === 'group' && excelCell.value && excelCell.value != \"\" && typeof excelCell.value === \"string\" &&\r\n excelCell.value.includes(\"\") && rowsToRemove.indexOf(excelCell.row) === -1) {\r\n rowsToRemove.push(excelCell.row);\r\n }\r\n\r\n if (gridCell.rowType === 'groupFooter') {\r\n excelCell.border = { top: borderStyle, bottom: borderStyle };\r\n\r\n if (gridCell.totalSummaryItemName === \"ForSubTotal\" && rowsToReplaceSubtotalText.indexOf(gridCell.value) !== -1 &&\r\n excelCell.value && excelCell.value != \"\" && typeof excelCell.value === \"string\") {\r\n excelCell.value = excelCell.value.replace(`${subTotalText} `, \"\");\r\n\r\n groupIndex--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (excelCell.value && excelCell.value != \"\" && typeof excelCell.value === \"string\") {\r\n excelCell.value = excelCell.value.replaceAll(\" \", \" \").replace(//g, \"\").replaceAll(\"
      \", \" \");\r\n excelCell.value = addIdentation(excelCell.value, groupIndex);\r\n }\r\n }\r\n }).then((cellRange) => {\r\n for (var rowIdx in cellsToApplyFormattingRule) {\r\n if (cellsToApplyFormattingRule[rowIdx].formattingRuleScale) {\r\n for (var i = 0; i < cellsToApplyFormattingRule[rowIdx].cells.length; i++) {\r\n applyFormattingRule(cellsToApplyFormattingRule[rowIdx].formattingRuleScale, cellsToApplyFormattingRule[rowIdx].cells[i].excelCell);\r\n\r\n if (cellsToApplyFormattingRule[rowIdx].cells[i].formattingRuleScale) {\r\n applyFormattingRule(cellsToApplyFormattingRule[rowIdx].cells[i].formattingRuleScale, cellsToApplyFormattingRule[rowIdx].cells[i].excelCell);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //sort and distinct\r\n rowsToRemove = [...new Set(rowsToRemove)]\r\n for (var i = rowsToRemove.length - 1; i >= 0; i--) {\r\n worksheet.spliceRows(rowsToRemove[i], 1);\r\n }\r\n\r\n for (var i = 1; i < worksheet.columnCount + 1; i++) {\r\n var c = worksheet.getRow(1);\r\n c.getCell(i).value = '';\r\n }\r\n\r\n const printedRow = worksheet.getRow(1);\r\n printedRow.getCell(1).value = `Printed On:`;\r\n printedRow.getCell(1).font = { bold: true };\r\n printedRow.getCell(2).value = settings.printMessage;\r\n\r\n let rowIndex = 2;\r\n if (settings.companyName && settings.companyName !== \"\") {\r\n const companyRow = worksheet.getRow(rowIndex);\r\n companyRow.getCell(1).value = `Company Name:`;\r\n companyRow.getCell(1).font = { bold: true };\r\n companyRow.getCell(2).value = settings.companyName;\r\n rowIndex++;\r\n }\r\n\r\n const mappingRow = worksheet.getRow(rowIndex);\r\n mappingRow.getCell(1).value = `Mapping Name:`;\r\n mappingRow.getCell(1).font = { bold: true };\r\n mappingRow.getCell(2).value = settings.mappingName;\r\n rowIndex++\r\n\r\n const reportRow = worksheet.getRow(rowIndex);\r\n reportRow.getCell(1).value = `Analyze By:`;\r\n reportRow.getCell(1).font = { bold: true };\r\n reportRow.getCell(2).value = settings.reportName;\r\n rowIndex++;\r\n\r\n if (settings.groupBy) {\r\n const groupByRow = worksheet.getRow(rowIndex);\r\n groupByRow.getCell(1).value = `Group By:`\r\n groupByRow.getCell(1).font = { bold: true };\r\n groupByRow.getCell(2).value = settings.groupBy\r\n rowIndex++;\r\n }\r\n\r\n if (settings.orderBy) {\r\n const orderByRow = worksheet.getRow(rowIndex);\r\n orderByRow.getCell(1).value = `Order By:`;\r\n orderByRow.getCell(1).font = { bold: true };\r\n orderByRow.getCell(2).value = settings.orderBy;\r\n rowIndex++;\r\n }\r\n\r\n settings.filters.forEach(function (f) {\r\n const filterRow = worksheet.getRow(rowIndex);\r\n filterRow.getCell(1).value = `${f.name}:`;\r\n filterRow.getCell(1).font = { bold: true };\r\n filterRow.getCell(2).value = `${f.value}`;\r\n rowIndex++;\r\n });\r\n }).then(() => {\r\n if (totalItemsUpdated) {\r\n component.option(\"summary.totalItems\", totalItems);\r\n }\r\n\r\n if (settings.isCSV) {\r\n workbook.csv.writeBuffer().then((buffer) => {\r\n if (settings.save) {\r\n saveAs(new Blob([buffer], { type: 'application/octet-stream' }), `${settings.fileName}.csv`);\r\n }\r\n else {\r\n def.resolve(buffer.toString('base64'));\r\n }\r\n });\r\n }\r\n else {\r\n workbook.xlsx.writeBuffer().then((buffer) => {\r\n if (settings.save) {\r\n saveAs(new Blob([buffer], { type: 'application/octet-stream' }), `${settings.fileName}.xlsx`);\r\n }\r\n else {\r\n def.resolve(buffer.toString('base64'));\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n if (totalItems !== null && totalItems !== undefined && totalItems.length > 0 && totalItems.filter(function (x) { return !x.hasBarChart; }).length > 0) {\r\n totalItemsUpdated = true;\r\n let totalItemsWhitoutBarChart = totalItems.filter(function (x) { return !x.hasBarChart; }).slice();\r\n component.option(\"summary.totalItems\", totalItemsWhitoutBarChart);\r\n\r\n let looping = setInterval(function () {\r\n if (component.isReady()) {\r\n clearInterval(looping);\r\n customExport();\r\n }\r\n }, 100);\r\n }\r\n else {\r\n customExport();\r\n }\r\n\r\n return def;\r\n}\r\n\r\nfunction exportPivotToExcel(e) {\r\n let settings = {\r\n isCSV: false,\r\n printMessage: \"\",\r\n mappingName: \"\",\r\n reportName: \"\",\r\n groupBy: \"\",\r\n orderBy: \"\",\r\n filters: \"\",\r\n companyName: \"\",\r\n fontSize: 0,\r\n glReport: false,\r\n subtotalsPosition: 0,\r\n save: false,\r\n fileName: \"\",\r\n currencyCode: \"\"\r\n };\r\n $.extend(settings, e);\r\n\r\n //file name has a limit of 31 characteres\r\n const fileName = settings.reportName?.length > 30 ? settings.reportName.substring(0, 29) : settings.reportName;\r\n\r\n const workbook = new ExcelJS.Workbook();\r\n const worksheet = workbook.addWorksheet(fileName);\r\n const component = $('.gridContainer').data(\"dxPivotGrid\");\r\n let def = $.Deferred();\r\n let skip = 4;\r\n if (settings.groupBy) {\r\n skip++;\r\n }\r\n if (settings.orderBy) {\r\n skip++;\r\n }\r\n if (settings.companyName && settings.companyName !== \"\") {\r\n skip++;\r\n }\r\n\r\n if (typeof settings.filters === \"string\" && settings.filters !== \"\") {\r\n settings.filters = JSON.parse(settings.filters);\r\n skip += settings.filters.length;\r\n }\r\n else {\r\n if (settings.filters === \"\" || settings.filters === undefined || settings.filters === null)\r\n settings.filters = [];\r\n\r\n skip += settings.filters.length;\r\n }\r\n\r\n let result = $('.gridContainer').data(\"result\") || {};\r\n let formattingRules = result.formattingRules || settings.formattingRules;\r\n let isGlReport = result.glReport || settings.glReport;\r\n let currencyCode = result.currencyCode || settings.currencyCode;\r\n let columns = component.option(\"dataSource.fields\");\r\n setExcelColumnFormat(columns, currencyCode);\r\n\r\n let default_headfoot_font_colour = $(\"html\").css(\"--default_headfoot_font_colour\").replace(\"#\", \"\").trimStart();\r\n let default_headfoot_colour = $(\"html\").css(\"--default_headfoot_colour\").replace(\"#\", \"\").trimStart();\r\n let addBorderToRow = [];\r\n const borderStyle = { style: 'thin', color: { argb: 'black' } };\r\n const borderStyleThin = { style: 'thin', color: { argb: 'E0E0E0' } };\r\n\r\n let cellsToApplyFormattingRule = {};\r\n let applyFormattingRule = function (formattingScale, excelCell) {\r\n let colors = report.getFormattingScaleColor(formattingScale);\r\n if (colors.backgroundColor && colors.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: colors.backgroundColor.replace(\"#\", \"\") } };\r\n }\r\n if (colors.color) {\r\n excelCell.font.color = { argb: colors.color.replace(\"#\", \"\") };\r\n }\r\n }\r\n DevExpress.excelExporter.exportPivotGrid({\r\n component: component,\r\n worksheet,\r\n topLeftCell: { row: skip, column: 1 },\r\n customizeCell(options) {\r\n const { pivotCell } = options;\r\n const { excelCell } = options;\r\n excelCell.font = excelCell.font || {};\r\n excelCell.font.size = settings.fontSize;\r\n\r\n if (pivotGrid.isDataCell(pivotCell) || pivotGrid.isTotalCell(pivotCell)) {\r\n const field = pivotGrid.getField(component, pivotCell);\r\n if (field && field.isMetric) {\r\n if (!settings.isCSV) {\r\n if (!cellsToApplyFormattingRule[excelCell.row]) {\r\n cellsToApplyFormattingRule[excelCell.row] = {\r\n formattingRuleScale: null,\r\n cells: []\r\n };\r\n }\r\n\r\n cellsToApplyFormattingRule[excelCell.row].cells.push({ pivotCell, excelCell });\r\n }\r\n\r\n if (pivotCell.value !== undefined && isNaN(pivotCell.value)) {\r\n pivotCell.value = null;\r\n excelCell.value = null;\r\n }\r\n }\r\n\r\n if (field && field.isMetric && pivotCell.value !== null && pivotCell.value !== undefined) {\r\n if (pivotGrid.isTotalCell(pivotCell)) {\r\n excelCell.font.color = { argb: default_headfoot_font_colour };\r\n excelCell.font.bold = true;\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: isGlReport ? \"FFFFFF\" : default_headfoot_colour } };\r\n }\r\n\r\n if (field.backgroundColor && field.backgroundColor !== \"\" && field.backgroundColor.toLowerCase() !== \"#ffffff\") {\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: field.backgroundColor.replace(\"#\", \"\") } };\r\n }\r\n\r\n if (field.foreColor && field.foreColor !== \"\") {\r\n excelCell.font.color = { argb: field.foreColor.replace(\"#\", \"\") };\r\n }\r\n\r\n if (field.thresholdColor && field.thresholdValue !== undefined &&\r\n field.thresholdValue !== null && pivotCell.value < field.thresholdValue) {\r\n excelCell.font.color = { argb: field.thresholdColor.replace(\"#\", \"\") };\r\n }\r\n\r\n let formattingRule = formattingRules.find(function (x) { return x.id === field.formattingRuleId; });\r\n if (formattingRule) {\r\n let isPercent = field.format && field.format.style === \"percent\";\r\n let formattingScale = formattingRuleService.getFormattingRuleScale(formattingRule, pivotCell.value, isPercent);\r\n if (cellsToApplyFormattingRule[excelCell.row]) {\r\n if (formattingRule.config.applyRow) {\r\n cellsToApplyFormattingRule[excelCell.row].formattingRuleScale = formattingScale;\r\n }\r\n else {\r\n cellsToApplyFormattingRule[excelCell.row].cells[cellsToApplyFormattingRule[excelCell.row].cells.length - 1].formattingRuleScale = formattingScale;\r\n }\r\n }\r\n\r\n applyFormattingRule(formattingScale, excelCell);\r\n }\r\n\r\n let column = field;\r\n if (columns) {\r\n column = columns.find(x => x.queryName === field.queryName) || field;\r\n }\r\n excelCell.style.numFmt = column.excelNumberFormat;\r\n }\r\n else {\r\n excelCell.font.color = { argb: default_headfoot_font_colour };\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: isGlReport ? \"FFFFFF\" : default_headfoot_colour } };\r\n\r\n if (pivotCell.type === \"T\" || pivotCell.type === \"GT\")\r\n excelCell.font.bold = true;\r\n }\r\n }\r\n else {\r\n excelCell.font.color = { argb: default_headfoot_font_colour };\r\n excelCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: isGlReport ? \"FFFFFF\" : default_headfoot_colour } };\r\n if (!pivotCell.isLast || pivotCell.type === \"T\" || pivotCell.type === \"GT\" || pivotCell.expanded === false || pivotCell.area === \"column\")\r\n excelCell.font.bold = true;\r\n }\r\n\r\n if (!excelCell.border) {\r\n excelCell.border = {\r\n bottom: borderStyleThin,\r\n left: borderStyleThin,\r\n right: borderStyleThin,\r\n top: borderStyleThin,\r\n };\r\n }\r\n\r\n if (isGlReport && (pivotCell.type === \"T\" || pivotCell.type === \"GT\" || pivotCell.rowType === \"T\" || pivotCell.rowType === \"GT\" || pivotCell.expanded === false)) {\r\n addBorderToRow.push(excelCell.row);\r\n }\r\n\r\n if (excelCell.value && excelCell.value != \"\" && typeof excelCell.value === \"string\") {\r\n excelCell.value = excelCell.value.replaceAll(\" \", \" \").replace(//g, \"\").replaceAll(\"
      \", \" \");\r\n }\r\n }\r\n }).then((cellRange) => {\r\n for (var rowIdx in cellsToApplyFormattingRule) {\r\n if (cellsToApplyFormattingRule[rowIdx].formattingRuleScale) {\r\n for (var i = 0; i < cellsToApplyFormattingRule[rowIdx].cells.length; i++) {\r\n applyFormattingRule(cellsToApplyFormattingRule[rowIdx].formattingRuleScale, cellsToApplyFormattingRule[rowIdx].cells[i].excelCell);\r\n\r\n if (cellsToApplyFormattingRule[rowIdx].cells[i].formattingRuleScale) {\r\n applyFormattingRule(cellsToApplyFormattingRule[rowIdx].cells[i].formattingRuleScale, cellsToApplyFormattingRule[rowIdx].cells[i].excelCell);\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (var i = 0; i < addBorderToRow.length; i++) {\r\n let row = worksheet.getRow(addBorderToRow[i]);\r\n for (var c = 1; c <= row.cellCount; c++) {\r\n row.getCell(c).border = {\r\n bottom: borderStyle,\r\n top: borderStyle,\r\n right: borderStyleThin,\r\n left: borderStyleThin\r\n };\r\n }\r\n }\r\n\r\n for (var i = 1; i < worksheet.columnCount + 1; i++) {\r\n var c = worksheet.getRow(1);\r\n c.getCell(i).value = '';\r\n }\r\n\r\n const printedRow = worksheet.getRow(1);\r\n printedRow.getCell(1).value = `Printed On:`;\r\n printedRow.getCell(1).font = { bold: true };\r\n printedRow.getCell(2).value = settings.printMessage;\r\n\r\n let rowIndex = 2;\r\n if (settings.companyName && settings.companyName !== \"\") {\r\n const companyRow = worksheet.getRow(rowIndex);\r\n companyRow.getCell(1).value = `Company Name:`;\r\n companyRow.getCell(1).font = { bold: true };\r\n companyRow.getCell(2).value = settings.companyName;\r\n rowIndex++;\r\n }\r\n\r\n const mappingRow = worksheet.getRow(rowIndex);\r\n mappingRow.getCell(1).value = `Mapping Name:`;\r\n mappingRow.getCell(1).font = { bold: true };\r\n mappingRow.getCell(2).value = settings.mappingName;\r\n rowIndex++;\r\n\r\n const reportRow = worksheet.getRow(rowIndex);\r\n reportRow.getCell(1).value = `Analyze By:`;\r\n reportRow.getCell(1).font = { bold: true };\r\n reportRow.getCell(2).value = settings.reportName;\r\n rowIndex++;\r\n \r\n if (settings.groupBy) {\r\n const groupByRow = worksheet.getRow(rowIndex);\r\n groupByRow.getCell(1).value = `Pivot On:`\r\n groupByRow.getCell(1).font = { bold: true };\r\n groupByRow.getCell(2).value = settings.groupBy\r\n rowIndex++;\r\n }\r\n\r\n if (settings.orderBy) {\r\n const orderByRow = worksheet.getRow(rowIndex);\r\n orderByRow.getCell(1).value = `Order By:`;\r\n orderByRow.getCell(1).font = { bold: true };\r\n orderByRow.getCell(2).value = settings.orderBy;\r\n rowIndex++;\r\n }\r\n\r\n settings.filters.forEach(function (f) {\r\n const filterRow = worksheet.getRow(rowIndex);\r\n filterRow.getCell(1).value = `${f.name}`;\r\n filterRow.getCell(1).font = { bold: true };\r\n filterRow.getCell(2).value = `${f.value}`;\r\n rowIndex++;\r\n });\r\n }).then(() => {\r\n if (settings.isCSV) {\r\n workbook.csv.writeBuffer().then((buffer) => {\r\n if (settings.save) {\r\n saveAs(new Blob([buffer], { type: 'application/octet-stream' }), `${settings.fileName}.csv`);\r\n }\r\n else {\r\n def.resolve(buffer.toString('base64'));\r\n }\r\n });\r\n }\r\n else {\r\n workbook.xlsx.writeBuffer().then((buffer) => {\r\n if (settings.save) {\r\n saveAs(new Blob([buffer], { type: 'application/octet-stream' }), `${settings.fileName}.xlsx`);\r\n }\r\n else {\r\n def.resolve(buffer.toString('base64'));\r\n }\r\n });\r\n }\r\n });\r\n\r\n return def;\r\n}","declare var urlConfigs: any;\r\ndeclare var tinymce: any;\r\ndeclare var tinyMceDateFmt1: any;\r\ndeclare var tinyMceDateFmt2: any;\r\ndeclare var loggedUser: any;\r\n\r\nclass PdfTemplate {\r\n id: number;\r\n name: string;\r\n organisationId: number;\r\n companyId: number;\r\n config: PdfTemplateConfig;\r\n\r\n constructor(name: string = \"New Template\", object: any = null, createNewIdForObject: boolean = false) {\r\n this.id = 0;\r\n this.name = name;\r\n this.organisationId = null;\r\n this.companyId = null;\r\n this.config = new PdfTemplateConfig();\r\n if (object) {\r\n this.copyProperties(object, this);\r\n\r\n if (this.organisationId == 0) {\r\n this.organisationId = null;\r\n }\r\n if (this.companyId == 0) {\r\n this.companyId = null;\r\n }\r\n\r\n if (createNewIdForObject)\r\n this.id = 0;\r\n }\r\n else\r\n this.id = 0;\r\n }\r\n\r\n copyProperties(fromObject, toObject) {\r\n pdfTemplatesService.copyProperties(fromObject, toObject);\r\n }\r\n\r\n save(newPdfTemplate: boolean = false, sucessCallback: Function = null, failureCallback: Function = null) {\r\n let model = {\r\n newPdfTemplate: newPdfTemplate,\r\n pdfTemplate: this,\r\n };\r\n \r\n irGlobal.updateFromServer({}, urlConfigs.pdfTemplate + \"Save\", model, function (data) {\r\n if (model.newPdfTemplate) {\r\n model.pdfTemplate.id = data.id;\r\n }\r\n\r\n if (sucessCallback) {\r\n sucessCallback(data);\r\n }\r\n }.bind(this), failureCallback, true, \"POST\", true, undefined, undefined, false);\r\n \r\n }\r\n\r\n delete(sucessCallback: Function = null, failureCallback: Function = null) {\r\n irGlobal.updateFromServer({}, urlConfigs.pdfTemplate + \"Delete\", { id: this.id }, sucessCallback, failureCallback, true, \"POST\", true, undefined, undefined, false);\r\n }\r\n}\r\n\r\nclass PdfTemplateConfig {\r\n header: string;\r\n footer: string;\r\n headerHeight: number;\r\n footerHeight: number;\r\n\r\n constructor(header: string = \"\", footer: string = \"\") {\r\n this.header = header;\r\n this.footer = footer;\r\n this.headerHeight = 20;\r\n this.footerHeight = 20;\r\n }\r\n}\r\n\r\nclass PdfTemplateViewModel {\r\n dataGridOptions: any;\r\n templates: Array;\r\n variables: Array;\r\n organisations: Array;\r\n companies: Array;\r\n multiTenant: boolean;\r\n organisationId: number;\r\n}\r\n\r\nvar pdfTemplatesService = (function () {\r\n var copyProperties = function (fromObject, toObject) {\r\n for (let property in fromObject) {\r\n if (toObject.hasOwnProperty(property) && fromObject[property] !== undefined) {\r\n let fromValue = typeof fromObject[property] === \"function\" ? fromObject[property]() : fromObject[property];\r\n if (fromValue === null)\r\n fromValue = null;\r\n else if (fromValue === undefined)\r\n fromValue = undefined;\r\n else if (Array.isArray(fromValue))\r\n fromValue = [];\r\n else if (typeof fromValue === \"object\")\r\n fromValue = {};\r\n\r\n if (typeof toObject[property] === \"function\")\r\n toObject[property](fromValue);\r\n else\r\n toObject[property] = fromValue;\r\n }\r\n }\r\n\r\n if (fromObject.config) {\r\n let config = new PdfTemplateConfig();\r\n copyProperties(fromObject.config, config);\r\n toObject.config = config;\r\n }\r\n }\r\n\r\n var openHtmlEditor = function (html: string, saveFunction: Function) {\r\n let $mceModal = $(\"div#pdfTemplateHFModal\");\r\n let save = false;\r\n let heightContent = 0;\r\n $mceModal.find(\".modal-footer button.btn-primary\").off(\"click\").on(\"click\", function (e) {\r\n save = true;\r\n heightContent = $(($(\"iframe\", $mceModal).get(0) as any).contentDocument.body).height() * 0.264583;\r\n ($mceModal as any).modal(\"hide\");\r\n });\r\n $mceModal.off(\"hidden.bs.modal\").on(\"hidden.bs.modal\",\r\n function (modalEvt) {\r\n if (save) {\r\n const content = tinymce.activeEditor.getContent();\r\n saveFunction(content, parseInt(heightContent as any, 10));\r\n }\r\n tinymce.activeEditor.setContent(\"\");\r\n tinymce.activeEditor.destroy();\r\n //If the \"More...\" button was clicked, force a click to close it because it stay opened \r\n const moreToolbarButton = $(\"div.tox-toolbar__group button.tox-tbtn[title='More...']\");\r\n if (moreToolbarButton.length > 0 && moreToolbarButton.hasClass(\"tox-tbtn--enabled\")) {\r\n moreToolbarButton.trigger(\"click\");\r\n }\r\n });\r\n tinymce.baseURL = urlConfigs.tinyMceBase;\r\n\r\n tinymce.init({\r\n selector: \"div#pdfTemplateHFModal textarea\",\r\n width: \"100%\",\r\n height: 270,\r\n content_style: `.mce-content-body {background-color: white;}`,\r\n setup: function (editor) {\r\n const getMenu = function () {\r\n let menuItems = [];\r\n $.each(pdfTemplatesViewModel.variables,\r\n function (index, variableName) {\r\n menuItems.push({\r\n type: 'menuitem',\r\n text: (variableName.replace(\"[\",\"\").replace(\"]\",\"\") as any).replaceAll(\"_\", \" \"),\r\n onAction: function () {\r\n editor.insertContent(variableName);\r\n }\r\n });\r\n }\r\n );\r\n return menuItems;\r\n };\r\n editor.ui.registry.addMenuButton('Variables', {\r\n text: 'Variables',\r\n fetch: function (callback) {\r\n callback(getMenu());\r\n }\r\n });\r\n editor.on('init', function (e) {\r\n editor.setContent(html);\r\n });\r\n },\r\n content_css: urlConfigs.tinyMceTheme,\r\n skin_url: urlConfigs.tinyMceSkin,\r\n plugins: [\r\n \"advlist autolink lists link image charmap anchor\",\r\n \"insertdatetime media table code emoticons insertdatetime hr code quickbars\"\r\n ],\r\n statusbar: false,\r\n menubar: false,\r\n toolbar:\r\n `Variables | undo redo copy cut paste|\r\n quickimage quicktable |\r\n fontselect fontsizeselect forecolor backcolor styleselect |\r\n bold italic underline |\r\n alignleft aligncenter alignright alignjustify | \r\n indent outdent |\r\n charmap | checklist | hr |\r\n image editimage fliph flipv imageoptions rotateleft rotateright |\r\n link openlink unlink |\r\n bullist numlist | \r\n media | \r\n table`,\r\n rel_list: [{ title: \"Lightbox\", value: \"lightbox\" }],\r\n insertdatetime_formats: [\"%H:%M:%S\", tinyMceDateFmt1, \"%I:%M:%S %p\", tinyMceDateFmt2],\r\n fontsize_formats: \"8px 9px 10px 11px 12px 14px 16px 18px 20px 22px 24px 26px 28px 30px 32px 34px 36px\"\r\n });\r\n tinymce.activeEditor.setContent(html);\r\n\r\n // Prevent Bootstrap dialog from blocking focusin\r\n $(document).on('focusin', function (e) {\r\n if ($(e.target).closest(\".tox-tinymce, .tox-tinymce-aux, .moxman-window, .tam-assetmanager-root\").length) {\r\n e.stopImmediatePropagation();\r\n }\r\n });\r\n ($mceModal as any).modal({ backdrop: 'static' });\r\n };\r\n\r\n var pdfTemplatesViewModel: PdfTemplateViewModel = null;\r\n\r\n var loadPdfTemplateViewModel = function (callback: Function) {\r\n getPdfTemplates(function (data) {\r\n data.organisations.splice(0, 0, { id: 0, name: \" \" });\r\n data.companies.splice(0, 0, { id: 0, name: \" \", organisationId: 0 });\r\n\r\n pdfTemplatesViewModel = {\r\n dataGridOptions: {\r\n height: 330,\r\n width: \"100%\",\r\n paging: {\r\n enabled: false\r\n },\r\n dataSource: data.templates,\r\n columns: [\r\n {\r\n dataField: \"name\",\r\n caption: \"Name\",\r\n allowSorting: false,\r\n sortOrder: \"asc\",\r\n validationRules: [{\r\n message: \"Name is not unique\",\r\n type: 'custom',\r\n validationCallback: function (e) {\r\n let valid = pdfTemplatesViewModel.templates.filter(function (x) { return x.name == e.value && x.id !== e.data.id; }).length == 0;\r\n return valid;\r\n }\r\n }, {\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (v.value === undefined || v.value === null) {\r\n return false;\r\n }\r\n\r\n if (v.value.trim() === \"\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message: \"Name is required\"\r\n }]\r\n },\r\n {\r\n dataField: \"organisationId\",\r\n caption: \"Organisation\",\r\n visible: data.multiTenant,\r\n setCellValue(rowData, value) {\r\n this.defaultSetCellValue(rowData, value);\r\n rowData.companyId = null;\r\n },\r\n lookup: {\r\n dataSource: data.organisations || [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n }\r\n },\r\n {\r\n dataField: \"companyId\",\r\n caption: \"Company\",\r\n visible: data.multiTenant,\r\n lookup: {\r\n dataSource(options) {\r\n return {\r\n store: data.companies || [],\r\n filter: options.data ? [['organisationId', '=', options.data.organisationId], 'or', ['organisationId', '=', 0] ] : null,\r\n };\r\n },\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n }\r\n },\r\n {\r\n dataField: \"config.header\",\r\n visible: false\r\n },\r\n {\r\n dataField: \"config.footer\",\r\n visible: false\r\n },\r\n {\r\n type: \"buttons\",\r\n caption: \"Header\",\r\n width: 80,\r\n buttons: [{\r\n hint: \"Edit Header\",\r\n icon: \"edittableheader\",\r\n disabled: function (e) {\r\n return !e.row.isEditing;\r\n },\r\n onClick: function (e) {\r\n openHtmlEditor(e.row.data.config.header, function (html, height) {\r\n let rowIndex = e.component.getRowIndexByKey(e.row.data.id);\r\n if (rowIndex === -1) {\r\n rowIndex = 0;\r\n }\r\n\r\n if (height > 0 && e.component.cellValue(rowIndex, \"config.headerHeight\") < height) {\r\n e.component.cellValue(rowIndex, \"config.headerHeight\", height);\r\n }\r\n\r\n e.component.cellValue(rowIndex, \"config.header\", html);\r\n });\r\n }\r\n }]\r\n },\r\n {\r\n type: \"buttons\",\r\n caption: \"Footer\",\r\n width: 80,\r\n buttons: [{\r\n hint: \"Edit Footer\",\r\n icon: \"rowproperties\",\r\n disabled: function (e) {\r\n return !e.row.isEditing;\r\n },\r\n onClick: function (e) {\r\n openHtmlEditor(e.row.data.config.footer, function (html, height) {\r\n let rowIndex = e.component.getRowIndexByKey(e.row.data.id);\r\n if (rowIndex === -1) {\r\n rowIndex = 0;\r\n }\r\n\r\n if (height > 0 && e.component.cellValue(rowIndex, \"config.footerHeight\") < height) {\r\n e.component.cellValue(rowIndex, \"config.footerHeight\", height);\r\n }\r\n\r\n e.component.cellValue(rowIndex, \"config.footer\", html);\r\n });\r\n }\r\n }]\r\n },\r\n {\r\n dataField: \"config.headerHeight\",\r\n caption: \"Header Height\",\r\n format: function (value) { return `${value}mm`; },\r\n width: 95,\r\n editorOptions: {\r\n min: 0,\r\n showSpinButtons: true,\r\n format: '0#mm'\r\n }\r\n },\r\n {\r\n dataField: \"config.footerHeight\",\r\n caption: \"Footer Height\",\r\n width: 95,\r\n format: function (value) { return `${value}mm`; },\r\n editorOptions: {\r\n min: 0,\r\n showSpinButtons: true,\r\n format: '0#mm'\r\n }\r\n },\r\n {\r\n type: \"buttons\",\r\n buttons: [{\r\n name: \"edit\",\r\n visible: function (e) {\r\n if (pdfTemplatesViewModel.multiTenant && (!e.row.data.organisationId || e.row.data.organisationId === 0) && !loggedUser.permissions.pdfTemplates()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n }, {\r\n name: \"delete\",\r\n visible: function (e) {\r\n if (pdfTemplatesViewModel.multiTenant && (!e.row.data.organisationId || e.row.data.organisationId === 0) && !loggedUser.permissions.pdfTemplates()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n } , {\r\n hint: \"Clone\",\r\n icon: \"copy\",\r\n visible: function (e) {\r\n return !e.row.isEditing;\r\n },\r\n onClick: function (e) {\r\n let clonedItem = new PdfTemplate(\"\", e.row.data, true);\r\n clonedItem.name += \"- Copy\";\r\n\r\n let newName = clonedItem.name;\r\n let countName = 1;\r\n while (pdfTemplatesViewModel.templates.filter(function (x) { return x.name == newName; }).length > 0) {\r\n newName = `${clonedItem.name} ${countName}`;\r\n countName++;\r\n }\r\n clonedItem.name = newName;\r\n\r\n if (pdfTemplatesViewModel.multiTenant && (!clonedItem.organisationId || clonedItem.organisationId === 0) && !loggedUser.permissions.pdfTemplates()) {\r\n clonedItem.organisationId = pdfTemplatesViewModel.organisationId;\r\n }\r\n\r\n e.component.getDataSource().store().push([{ type: \"insert\", data: clonedItem }]);\r\n clonedItem.save(true, function () {\r\n e.component.option(\"focusedRowKey\", clonedItem.id);\r\n });\r\n }\r\n }]\r\n }\r\n ],\r\n showBorders: true,\r\n editing: {\r\n mode: \"row\",\r\n allowUpdating: true,\r\n allowDeleting: true,\r\n allowAdding: true,\r\n useIcons: true,\r\n },\r\n focusedRowEnabled: true,\r\n keyExpr: \"id\",\r\n focusedRowIndex: 0,\r\n onInitNewRow: function (e) {\r\n e.data = new PdfTemplate();\r\n let newName = e.data.name;\r\n let countName = 1;\r\n while (pdfTemplatesViewModel.templates.filter(function (x) { return x.name == newName; }).length > 0) {\r\n newName = `${e.data.name} ${countName}`;\r\n countName++;\r\n }\r\n if (pdfTemplatesViewModel.multiTenant && !loggedUser.permissions.pdfTemplates()) {\r\n e.data.organisationId = pdfTemplatesViewModel.organisationId;\r\n }\r\n\r\n e.data.name = newName;\r\n },\r\n onRowInserted: function (e) {\r\n e.data.save(true, function () {\r\n e.component.option(\"focusedRowKey\", e.data.id);\r\n });\r\n },\r\n onRowUpdated: function (e) {\r\n e.data.save();\r\n },\r\n onRowRemoving: function (e) {\r\n let deferred = $.Deferred();\r\n e.data.delete(function () {\r\n deferred.resolve();\r\n }, function (textStatus, failureText) {\r\n deferred.reject(failureText);\r\n });\r\n e.cancel = deferred.promise();\r\n },\r\n onEditorPrepared: function (options) {\r\n if (pdfTemplatesViewModel.multiTenant && options.dataField == 'organisationId') {\r\n if (!loggedUser.permissions.pdfTemplates()) {\r\n options.editorElement.dxSelectBox('instance').option(\"disabled\", true);\r\n }\r\n else {\r\n options.editorElement.dxSelectBox('instance').option(\"disabled\", false);\r\n }\r\n }\r\n },\r\n },\r\n templates: data.templates,\r\n variables: data.variables,\r\n organisations: data.organisations,\r\n companies: data.companies,\r\n multiTenant: data.multiTenant,\r\n organisationId: data.organisationId\r\n }\r\n\r\n callback();\r\n });\r\n };\r\n\r\n var getPdfTemplates = function (callback: Function = null, allPdfs: boolean = true) {\r\n let sucessCallback = function (data) {\r\n let newTemplates: Array = [];\r\n data.templates.forEach(function (tmp) {\r\n let newTemplate = new PdfTemplate(null, tmp);\r\n newTemplates.push(newTemplate);\r\n });\r\n\r\n data.templates = newTemplates;\r\n callback(data);\r\n };\r\n\r\n irGlobal.updateFromServer({}, urlConfigs.pdfTemplate + \"GetPdfTemplates\", { allPdfs: allPdfs }, sucessCallback, null, true, \"POST\", true);\r\n }\r\n\r\n var prepareEditor = function () {\r\n let popup = ($(\"#pdfTemplatePopup\") as any).dxPopup({\r\n contentTemplate: `
      `,\r\n width: pdfTemplatesViewModel.multiTenant ? 1000 : 800,\r\n height: 390,\r\n showTitle: true,\r\n title: \"PDF Templates\",\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: true,\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n },\r\n onShown: function (e) {\r\n $(\"#pdfTemplatePopupContent\").html(`
      \r\n
      \r\n
      `);\r\n ko.applyBindings(pdfTemplatesViewModel, document.getElementById(\"pdfTemplateContext\"));\r\n }\r\n }).dxPopup(\"instance\");\r\n };\r\n\r\n var openEditor = function () {\r\n if (!pdfTemplatesViewModel) {\r\n loadPdfTemplateViewModel(function () {\r\n prepareEditor();\r\n openEditor();\r\n });\r\n }\r\n else {\r\n let popup = ($(\"#pdfTemplatePopup\") as any).dxPopup(\"instance\");\r\n popup.show();\r\n }\r\n };\r\n\r\n return {\r\n openEditor: openEditor,\r\n copyProperties: copyProperties,\r\n getPdfTemplates: getPdfTemplates\r\n };\r\n\r\n}());","var reportSettings = (function () {\r\n\r\n function setup(context, result, componentType = undefined, isPrinting: boolean = false) {\r\n let div = $(\".tab-report-settings\", context);\r\n if (result.designer) {\r\n return;\r\n }\r\n\r\n result.designer = ko.mapping.fromJS(componentType === \"Chart\" ? result.chartVM.jsonData.config : result.itemConfig);\r\n result.designer.isWidget = ko.observable(context.hasClass(\"dashboardWidget\"));\r\n result.designer.widgetId = context.closest(\".dashboardWidget\").data(\"widgetid\");\r\n\r\n //disable some properties when printing\r\n if (isPrinting) {\r\n if (result.designer.enableRowSelection()) {\r\n result.designer.enableRowSelection(false);\r\n }\r\n }\r\n\r\n defaultSettings(result);\r\n analysisSettings(result, context);\r\n pivotSettings(result, context);\r\n\r\n result.designer.redrawComponent = function () {\r\n if (result.designer.reportTypeStr() === ReportTypeStrEnum.Analysis) {\r\n report.getGridInstance(context).repaint();\r\n }\r\n else if (result.designer.reportTypeStr() === ReportTypeStrEnum.Pivot) {\r\n pivotGrid.getPivotGridInstance(context).repaint();\r\n }\r\n\r\n saveSettings(result.designer);\r\n };\r\n result.designer.runSetup = function () {\r\n if (result.designer.reportTypeStr() === ReportTypeStrEnum.Analysis || result.designer.reportTypeStr() === ReportTypeStrEnum.Pivot) {\r\n report.setup(context, false, false, result);\r\n }\r\n\r\n saveSettings(result.designer);\r\n };\r\n result.designer.reload = function () {\r\n saveSettings(result.designer, function () {\r\n if (result.designer.isWidget()) {\r\n const top = $(\".widget-general-options\", \"#DashboardSettingsPanel\").children(\".dx-scrollable\").dxScrollView(\"instance\").scrollTop();\r\n dashboard.refreshWidgetData(\" \", dashboard.getWidget(result.designer.widgetId), true, function () {\r\n if (top > 0) {\r\n $(\".widget-general-options\", \"#DashboardSettingsPanel\").children(\".dx-scrollable\").dxScrollView(\"instance\").scrollTo({ top: top });\r\n }\r\n });\r\n }\r\n else {\r\n let jsonInput = tabView.getBaseSubmitObject(null);\r\n irGlobal.updateFromServer({},\r\n urlConfigs.workBook + \"GetContentTabView\",\r\n jsonInput,\r\n function (data) {\r\n const top = $(\".tab-report-settings\").children(\".dx-scrollable\").dxScrollView(\"instance\").scrollTop();\r\n\r\n irGlobal.updateOutput(data);\r\n\r\n reportView.openReportSettings({});\r\n if (top > 0) {\r\n $(\".tab-report-settings\").children(\".dx-scrollable\").dxScrollView(\"instance\").scrollTo({ top: top });\r\n }\r\n },\r\n null,\r\n true, \"POST\", undefined, undefined, undefined, false);\r\n }\r\n });\r\n };\r\n\r\n if (div.length > 0) {\r\n ko.applyBindings(result, div.get(0));\r\n }\r\n }\r\n\r\n function getSettings(context) {\r\n let div = $(\".tab-report-settings\", context);\r\n if (div.length > 0) {\r\n return ko.dataFor(div[0]).designer;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function defaultSettings(result) {\r\n result.designer.reportTypeStr = ko.computed(function () {\r\n if (this.reportType() === ReportTypeEnum.Pivot) {\r\n return ReportTypeStrEnum.Pivot;\r\n }\r\n else if (this.reportType() === ReportTypeEnum.Chart) {\r\n return ReportTypeStrEnum.Chart;\r\n }\r\n\r\n return ReportTypeStrEnum.Analysis;\r\n }, result.designer);\r\n result.designer.aggregateReport = ko.observable(result.designer.isAggregative ? result.designer.isAggregative() : false);\r\n\r\n result.designer.aggregateReport?.subscribe(function (newValue) {\r\n if (result.designer.isAggregative) {\r\n result.designer.isAggregative(newValue);\r\n }\r\n result.designer.reload();\r\n });\r\n result.designer.filterZeros?.subscribe(function (newValue) {\r\n result.designer.reload();\r\n });\r\n result.designer.keepMetricsDrillDown?.subscribe(function (newValue) {\r\n result.designer.reload();\r\n });\r\n result.designer.grandTotalText?.subscribe(function (newValue) {\r\n result.grandTotalText = newValue;\r\n result.designer.runSetup();\r\n });\r\n result.designer.subTotalText?.subscribe(function (newValue) {\r\n result.subTotalText = newValue;\r\n result.designer.runSetup();\r\n });\r\n result.designer.fontSize?.subscribe(function (newValue) {\r\n result.fontSize = newValue;\r\n result.designer.redrawComponent();\r\n });\r\n result.designer.glReport?.subscribe(function (newValue) {\r\n result.glReport = newValue;\r\n result.designer.reload();\r\n });\r\n result.designer.enableRowSelection?.subscribe(function (newValue) {\r\n result.enableRowSelection = newValue;\r\n result.designer.runSetup();\r\n });\r\n }\r\n\r\n function analysisSettings(result, context) {\r\n if (result.designer.reportTypeStr() !== ReportTypeStrEnum.Analysis) {\r\n return;\r\n }\r\n\r\n result.designer.numberFixedColumns?.subscribe(function (newValue) {\r\n result.designer.reload();\r\n });\r\n result.designer.totalsPosition?.subscribe(function (newValue) {\r\n result.totalsPosition = newValue;\r\n result.designer.reload();\r\n });\r\n result.designer.subtotalsPosition?.subscribe(function (newValue) {\r\n result.subtotalsPosition = newValue;\r\n result.designer.runSetup();\r\n });\r\n result.designer.showReportRowCount?.subscribe(function (newValue) {\r\n result.showReportRowCount = newValue;\r\n result.designer.runSetup();\r\n });\r\n result.designer.enableSearchBox?.subscribe(function (newValue) {\r\n result.enableSearchBox = newValue;\r\n report.getGridInstance(context).option(\"searchPanel.visible\", newValue);\r\n let searchBox = $('.dx-datagrid-search-panel.dx-textbox.dx-texteditor.dx-searchbox', $(\".gridContainer\", context)).data('dxTextBox');\r\n if (searchBox) {\r\n searchBox.focus();\r\n }\r\n saveSettings(result.designer);\r\n });\r\n result.designer.expandAllRows?.subscribe(function (newValue) {\r\n result.expandAllRows = newValue;\r\n result.designer.runSetup();\r\n });\r\n }\r\n\r\n function pivotSettings(result, context) {\r\n if (result.designer.reportTypeStr() !== ReportTypeStrEnum.Pivot) {\r\n return;\r\n }\r\n result.designer.pivotConfig?.rowHeaderLayoutPivot?.subscribe(function (newValue) {\r\n result.rowHeaderLayoutPivot = newValue;\r\n pivotGrid.getPivotGridInstance(context).option(\"rowHeaderLayout\", result.glReport ? 'standard' : newValue === 0 ? 'tree' : 'standard');\r\n saveSettings(result.designer);\r\n });\r\n result.designer.pivotConfig?.showColumnGrandTotals?.subscribe(function (newValue) {\r\n result.showColumnGrandTotals = newValue;\r\n pivotGrid.getPivotGridInstance(context).option(\"showColumnGrandTotals\", newValue);\r\n saveSettings(result.designer);\r\n });\r\n result.designer.pivotConfig?.showColumnTotals?.subscribe(function (newValue) {\r\n result.showColumnTotals = newValue;\r\n pivotGrid.getPivotGridInstance(context).option(\"showColumnTotals\", newValue);\r\n saveSettings(result.designer);\r\n });\r\n result.designer.pivotConfig?.showRowGrandTotals?.subscribe(function (newValue) {\r\n result.showRowGrandTotals = newValue;\r\n pivotGrid.getPivotGridInstance(context).option(\"showRowGrandTotals\", newValue);\r\n saveSettings(result.designer);\r\n });\r\n result.designer.pivotConfig?.showRowTotals?.subscribe(function (newValue) {\r\n result.showRowTotals = newValue;\r\n pivotGrid.getPivotGridInstance(context).option(\"showRowTotals\", newValue);\r\n saveSettings(result.designer);\r\n });\r\n result.designer.expandAllRows?.subscribe(function (newValue) {\r\n result.expandAllRows = newValue;\r\n result.designer.runSetup();\r\n });\r\n result.designer.pivotConfig?.expandAllColumns?.subscribe(function (newValue) {\r\n result.expandAllColumns = newValue;\r\n result.designer.runSetup();\r\n });\r\n result.designer.pivotLayout.subscribe(function () {\r\n result.designer.reload();\r\n });\r\n\r\n result.designer.enableSearchBox?.subscribe(function (newValue) {\r\n result.enableSearchBox = newValue;\r\n $(\".pivotGridSearchBox\", context).dxTextBox(\"instance\").option(\"visible\", newValue);\r\n\r\n let widget = context.closest(\".widgetContainer\");\r\n if (widget.length > 0) {\r\n $(\".gridContainer\", context).css(\"height\", newValue ? `calc(100% - ${pivotGrid.searchBoxHeight}px)` : \"100%\");\r\n }\r\n\r\n saveSettings(result.designer);\r\n report.resize(context);\r\n });\r\n result.designer.enableFilterPanel?.subscribe(function (newValue) {\r\n result.enableFilterPanel = newValue;\r\n pivotGrid.getPivotGridInstance(context).option(\"fieldPanel.visible\", newValue);\r\n saveSettings(result.designer);\r\n });\r\n }\r\n\r\n function saveSettings(designer, successFunction: Function = null) {\r\n var obj = irGlobal.jsonStringfy(ko.toJS(designer));\r\n let jsonInput = tabView.getBaseSubmitObject({ reportConfig: obj, widgetId: designer.widgetId });\r\n irGlobal.updateFromServer({},\r\n urlConfigs.workBook + \"SaveReportSettings\",\r\n jsonInput,\r\n successFunction ? successFunction : function () { },\r\n null,\r\n true, \"POST\", undefined, undefined, undefined, false);\r\n }\r\n\r\n return {\r\n setup: setup,\r\n saveSettings: saveSettings,\r\n getSettings: getSettings\r\n };\r\n}());\r\n","/*AUTOGENERATED*/var oRevision = {\"Components/Filters/ConditionTypeFilter/ConditionTypeFilterStyles.css\":\"ab3bed4520\",\"Components/Filters/ConditionTypeFilter/ConditionTypeFilterView.html\":\"af4cad6995\",\"Components/Filters/ConditionTypeFilter/ConditionTypeFilterViewModel.js\":\"e62c03951c\",\"Components/Filters/DateFilter/DateFilterStyles.css\":\"c4a0bdb19e\",\"Components/Filters/DateFilter/DateFilterView.html\":\"5857dc6869\",\"Components/Filters/DateFilter/DateFilterViewModel.js\":\"0988422929\",\"Components/Filters/DateRangeFilter/DateRangeFilterStyles.css\":\"93d2d06bd0\",\"Components/Filters/DateRangeFilter/DateRangeFilterView.html\":\"fe50057ef8\",\"Components/Filters/DateRangeFilter/DateRangeFilterViewModel.js\":\"04c516da4d\",\"Components/Filters/DateRangeTypes/DateRangeTypesStyles.css\":\"d41d8cd98f\",\"Components/Filters/DateRangeTypes/DateRangeTypesView.html\":\"7d40d1bc48\",\"Components/Filters/DateRangeTypes/DateRangeTypesViewModel.js\":\"267d13be85\",\"Components/Filters/Filter/FilterStyles.css\":\"4c5b9bccec\",\"Components/Filters/Filter/FilterView.html\":\"3a46d6a49c\",\"Components/Filters/Filter/FilterViewModel.js\":\"617816b227\",\"Components/Filters/FilterList/FilterListStyles.css\":\"d41d8cd98f\",\"Components/Filters/FilterList/FilterListView.html\":\"3160d1118c\",\"Components/Filters/FilterList/FilterListViewModel.js\":\"19432a8f2b\",\"Components/Filters/MetricFilter/MetricFilterStyles.css\":\"e111fb53ab\",\"Components/Filters/MetricFilter/MetricFilterView.html\":\"acb338cde0\",\"Components/Filters/MetricFilter/MetricFilterViewModel.js\":\"c7267d09b4\",\"Components/Filters/MonthFilter/MonthFilterStyles.css\":\"d41d8cd98f\",\"Components/Filters/MonthFilter/MonthFilterView.html\":\"7d40d1bc48\",\"Components/Filters/MonthFilter/MonthFilterViewModel.js\":\"c61faea35c\",\"Components/Filters/MultiSelectFilter/MultiSelectFilterStyles.css\":\"80f4e5ea1f\",\"Components/Filters/MultiSelectFilter/MultiSelectFilterView.html\":\"786c8700f0\",\"Components/Filters/MultiSelectFilter/MultiSelectFilterViewModel.js\":\"4e423ca012\",\"Components/Filters/NumericFilter/NumericFilterStyles.css\":\"d41d8cd98f\",\"Components/Filters/NumericFilter/NumericFilterView.html\":\"5d84b0e52c\",\"Components/Filters/NumericFilter/NumericFilterViewModel.js\":\"186fd3952d\",\"Components/Filters/PreviousNextDate/PreviousNextDateStyles.css\":\"d41d8cd98f\",\"Components/Filters/PreviousNextDate/PreviousNextDateView.html\":\"7d77963b11\",\"Components/Filters/PreviousNextDate/PreviousNextDateViewModel.js\":\"2a54bdb60f\",\"Components/Filters/QuarterFilter/QuarterFilterStyles.css\":\"d41d8cd98f\",\"Components/Filters/QuarterFilter/QuarterFilterView.html\":\"7d40d1bc48\",\"Components/Filters/QuarterFilter/QuarterFilterViewModel.js\":\"8a69908594\",\"Components/Filters/ScopeActionFilter/ScopeActionFilterStyles.css\":\"10892e0743\",\"Components/Filters/ScopeActionFilter/ScopeActionFilterView.html\":\"e66d8eee4a\",\"Components/Filters/ScopeActionFilter/ScopeActionFilterViewModel.js\":\"b61c7659c1\",\"Components/Filters/SwitchFilter/SwitchFilterStyles.css\":\"d41d8cd98f\",\"Components/Filters/SwitchFilter/SwitchFilterView.html\":\"7cdcbfa30c\",\"Components/Filters/SwitchFilter/SwitchFilterViewModel.js\":\"bf4a98e829\",\"Components/Filters/TextBoxFilter/TextBoxFilterStyles.css\":\"d41d8cd98f\",\"Components/Filters/TextBoxFilter/TextBoxFilterView.html\":\"16d4c9865d\",\"Components/Filters/TextBoxFilter/TextBoxFilterViewModel.js\":\"cd3aa7ec1d\",\"Components/components.js\":\"f9c33a50c4\",\"Components/require-css.js\":\"a8cdda9597\",\"Components/require-css.min.js\":\"a235785853\"};","enum FilterEditorTypeEnum {\r\n TextBox = 0,\r\n Date = 1,\r\n DateRange = 2,\r\n Numeric = 3,\r\n ValuesCombo = 4,\r\n MultiSelect = 5,\r\n AutoComplete = 6,\r\n None = 7,\r\n Month = 8,\r\n Quarter = 9,\r\n Switch = 10\r\n}\r\n\r\ninterface IFilterParameterVM {\r\n filter: Filter;\r\n element: JQuery;\r\n dateRanges: KnockoutObservableArray;\r\n dateFormat: KnockoutObservable;\r\n isWidgetFilter: boolean;\r\n}\r\n\r\nenum DataTypeEnum {\r\n NONE = 0,\r\n STRING = 1,\r\n NUMBER = 2,\r\n DATE = 3,\r\n BIT = 4,\r\n BOOL = 5\r\n}\r\n\r\nenum DefinedFieldEnum {\r\n Bound = 0,\r\n Display = 1\r\n}\r\n\r\nenum ContainerScopeEnum {\r\n Mapping = 3,\r\n Workbook = 0,\r\n Report = 1,\r\n Dashboard = 2,\r\n Widget = 4,\r\n ComparisonFilter = 5\r\n}\r\n\r\nenum ScopeActionEnum {\r\n Default,\r\n Combine,\r\n Overwrite\r\n}\r\n\r\nenum FilterConditionTypeEnum {\r\n Equals,\r\n Between,\r\n GreaterThan,\r\n LessThan,\r\n In,\r\n EqualsOrGreaterThan,\r\n EqualsOrLessThan,\r\n Different,\r\n NotBetween,\r\n NotIn\r\n}\r\n\r\nenum FilterTypeEnum {\r\n Field,\r\n AdHoc,\r\n DynamicParameter,\r\n InlineDynamicParameter\r\n}\r\n\r\nenum FilterModifiersEnum {\r\n ValuesCanBeChanged = 0b0000001,\r\n Removable = 0b0000010,\r\n None = 0b0000100,\r\n SettingsCanBeChanged = 0b0001000, //Scope Action\r\n AllowChangeWhenNotOwner = ValuesCanBeChanged | Removable | SettingsCanBeChanged, //Allow to change/remove the filter when the user is not the owner\r\n Default = ValuesCanBeChanged | Removable | SettingsCanBeChanged,\r\n UserFilter = None,\r\n DynamicFilter = ValuesCanBeChanged | SettingsCanBeChanged\r\n}\r\n\r\nclass FilterVM {\r\n filter: Filter;\r\n workbookViewOnly: KnockoutObservable;\r\n dateRanges: KnockoutObservableArray;\r\n dateFormat: KnockoutObservable;\r\n\r\n //Used in the Comparison Filter\r\n removeFilter: Function;\r\n\r\n constructor() {\r\n this.filter = new Filter();\r\n }\r\n}\r\n\r\nclass Filter {\r\n id: KnockoutObservable;\r\n animate: KnockoutObservable;\r\n boundField: KnockoutObservable;\r\n boundFieldType: KnockoutObservable;\r\n conditionType: KnockoutObservable;\r\n dataSource: Array>;\r\n dataSourceLength: KnockoutObservable;\r\n dateRange: KnockoutObservable;\r\n dateRangeConfig: DateRangeConfigFilter;\r\n displayField: KnockoutObservable;\r\n displayFieldType: KnockoutObservable;\r\n displayBoundFieldName: KnockoutObservable;\r\n displayDisplayFieldName: KnockoutObservable;\r\n //dynamicParameterName: KnockoutObservable;\r\n endCondition: KnockoutObservable;\r\n filterEditorType: KnockoutObservable;\r\n filterName: KnockoutObservable;\r\n filterTemplate: KnockoutObservable;\r\n filterType: KnockoutObservable;\r\n isMetric: KnockoutComputed;\r\n //metricContainer: KnockoutObservable;\r\n //metricDecimalPlaces: KnockoutObservable;\r\n metricFilterAbsolute: KnockoutObservable;\r\n //metricFormat: KnockoutObservable;\r\n metricId: KnockoutObservable;\r\n modifiers: KnockoutObservable;\r\n multipleCondition: KnockoutObservable>;\r\n preserveDrillDownFromWidget: KnockoutObservable;\r\n readOnly: KnockoutObservable;\r\n scope: KnockoutObservable;\r\n scopeAction: KnockoutObservable;\r\n showFilter: KnockoutObservable;\r\n //sortField: KnockoutObservable;\r\n startCondition: KnockoutObservable;\r\n startDisplayCondition: KnockoutObservable;\r\n switchChecked: KnockoutObservable;\r\n switchFalseLabel: KnockoutObservable;\r\n //switchFalseValues: KnockoutObservable;\r\n switchTrueLabel: KnockoutObservable;\r\n //switchTrueValues: KnockoutObservable;\r\n visibleFields: KnockoutObservable>;\r\n\r\n isComparisonFilter: KnockoutObservable;\r\n previousDateClick: Function;\r\n nextDateClick: Function;\r\n clearFilter: Function;\r\n updateDataSource: Function;\r\n isDirty: KnockoutObservable;\r\n customPublish: Function;\r\n onContentReady: Function;\r\n\r\n constructor() {\r\n this.isDirty = ko.observable(false);\r\n this.dataSource = null;\r\n }\r\n\r\n getConditionTypeOptions(): Array {\r\n return [\r\n {\r\n id: FilterConditionTypeEnum.Equals, text: \"Equals\", icon: \"=\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return editorType === FilterEditorTypeEnum.Date || editorType === FilterEditorTypeEnum.TextBox ||\r\n editorType === FilterEditorTypeEnum.Quarter || editorType === FilterEditorTypeEnum.Numeric ||\r\n editorType === FilterEditorTypeEnum.Month || editorType === FilterEditorTypeEnum.ValuesCombo;\r\n }\r\n },\r\n {\r\n id: FilterConditionTypeEnum.Different, text: \"Different\", icon: \"≠\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return editorType === FilterEditorTypeEnum.Date || editorType === FilterEditorTypeEnum.TextBox ||\r\n editorType === FilterEditorTypeEnum.Quarter || editorType === FilterEditorTypeEnum.Numeric ||\r\n editorType === FilterEditorTypeEnum.Month || editorType === FilterEditorTypeEnum.ValuesCombo;\r\n }\r\n },\r\n {\r\n id: FilterConditionTypeEnum.In, text: \"In\", icon: \"In\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return editorType === FilterEditorTypeEnum.AutoComplete || editorType === FilterEditorTypeEnum.MultiSelect;\r\n }.bind(this)\r\n },\r\n {\r\n id: FilterConditionTypeEnum.NotIn, text: \"Not In\", icon: \"Not In\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return editorType === FilterEditorTypeEnum.AutoComplete || editorType === FilterEditorTypeEnum.MultiSelect;\r\n }.bind(this)\r\n },\r\n {\r\n id: FilterConditionTypeEnum.Between, text: \"Between\", icon: \"≥ ≤\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return editorType === FilterEditorTypeEnum.DateRange ||\r\n isMetric;\r\n }.bind(this)\r\n },\r\n {\r\n id: FilterConditionTypeEnum.NotBetween, text: \"Not Between\", icon: \"≤ ≥\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return editorType === FilterEditorTypeEnum.DateRange ||\r\n isMetric;\r\n }.bind(this)\r\n },\r\n {\r\n id: FilterConditionTypeEnum.GreaterThan, text: \"Greater Than\", icon: \">\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return isMetric;\r\n }.bind(this)\r\n },\r\n {\r\n id: FilterConditionTypeEnum.LessThan, text: \"Less Than\", icon: \"<\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return isMetric;\r\n }.bind(this)\r\n },\r\n {\r\n id: FilterConditionTypeEnum.EqualsOrGreaterThan, text: \"Greater Than or Equals\", icon: \"≥\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return isMetric;\r\n }.bind(this)\r\n },\r\n {\r\n id: FilterConditionTypeEnum.EqualsOrLessThan, text: \"Less Than or Equals\", icon: \"≤\",\r\n visible: function (editorType: FilterEditorTypeEnum, isMetric: boolean) {\r\n return isMetric;\r\n }.bind(this)\r\n },\r\n ];\r\n }\r\n\r\n publish() {\r\n if (this.customPublish) {\r\n this.customPublish();\r\n return;\r\n }\r\n\r\n if (this.isComparisonFilter && this.isComparisonFilter()) {\r\n return;\r\n }\r\n\r\n this.isDirty(true);\r\n irGlobal.enableUpdateButton(true, filtersManager.updateFiltersChanged);\r\n }\r\n\r\n nextPreviousDateChange(isNextDate: boolean, dateRanges: Array, element: JQuery, isWidgetFilter: boolean) {\r\n let type = isNextDate ? \"nextdate\" : \"previousdate\";\r\n \r\n let dateRange = dateRanges.find(function (x) { return x.id() === this.dateRange(); }.bind(this));\r\n let newDateRangeId = 0;\r\n if (isNextDate) {\r\n newDateRangeId = dateRange.nextDate();\r\n }\r\n else {\r\n newDateRangeId = dateRange.previousDate();\r\n }\r\n\r\n if (newDateRangeId !== 0) {\r\n let hasNewDateRange = dateRanges.find(function (x) { return x.id() === newDateRangeId; }) !== undefined;\r\n if (!hasNewDateRange) {\r\n newDateRangeId = 0;\r\n }\r\n }\r\n\r\n let lastDateRangeUsed;\r\n if (this.dateRangeConfig.userDates()) {\r\n lastDateRangeUsed = null;\r\n }\r\n else if (this.dateRangeConfig.multiplier() == 0) {\r\n lastDateRangeUsed = this.dateRange();\r\n }\r\n else {\r\n lastDateRangeUsed = this.dateRangeConfig.lastDateUsed();\r\n }\r\n\r\n if (newDateRangeId === 0) {\r\n if (isNextDate) {\r\n this.dateRangeConfig.multiplier(this.dateRangeConfig.multiplier() + 1);\r\n }\r\n else {\r\n this.dateRangeConfig.multiplier(this.dateRangeConfig.multiplier() - 1);\r\n }\r\n\r\n if (this.dateRangeConfig.multiplier() === 0) {\r\n newDateRangeId = this.dateRangeConfig.lastDateUsed() || 0;\r\n this.dateRangeConfig.lastDateUsed(null);\r\n }\r\n }\r\n\r\n if (newDateRangeId !== 0) {\r\n this.dateRange(newDateRangeId);\r\n\r\n if (!isWidgetFilter) {\r\n filtersManager.updateFiltersChanged({});\r\n }\r\n }\r\n else {\r\n if (this.dateRangeConfig.startDate() !== null) {\r\n this.dateRangeConfig.startDate(this.dateRangeConfig.startDate());\r\n }\r\n else {\r\n this.dateRangeConfig.startDate(this.startCondition());\r\n }\r\n\r\n if (this.dateRangeConfig.endDate() !== null) {\r\n this.dateRangeConfig.endDate(this.dateRangeConfig.endDate());\r\n }\r\n else {\r\n this.dateRangeConfig.endDate(this.endCondition());\r\n }\r\n\r\n this.dateRangeConfig.lastDateUsed(lastDateRangeUsed);\r\n\r\n let dateRangeConfig = ko.mapping.toJS(this.dateRangeConfig);\r\n irGlobal.updateFromServer({},\r\n urlConfigs.tabs + \"GetNewDateRage\",\r\n dateRangeConfig,\r\n function (data) {\r\n this.dateRange(irGlobal.customDate.custom);\r\n\r\n let usersDate = this.dateRangeConfig.userDates();\r\n let multiplier = this.dateRangeConfig.multiplier();\r\n let lastDateUsed = this.dateRangeConfig.lastDateUsed();\r\n let startDate = this.dateRangeConfig.startDate();\r\n let endDate = this.dateRangeConfig.endDate();\r\n if (this.filterEditorType() == FilterEditorTypeEnum.Date) {\r\n let dateBox = $(\"div.dx-datebox\", element).dxDateBox(\"instance\");\r\n dateBox.option(\"value\", data.startDate);\r\n }\r\n else {\r\n let dateRangeBox = $(\"div.dx-daterangebox\", element).dxDateRangeBox(\"instance\");\r\n dateRangeBox.option(\"value\", [data.startDate, data.endDate]);\r\n }\r\n this.dateRangeConfig.userDates(usersDate);\r\n this.dateRangeConfig.multiplier(multiplier);\r\n this.dateRangeConfig.lastDateUsed(lastDateUsed);\r\n this.dateRangeConfig.startDate(startDate);\r\n this.dateRangeConfig.endDate(endDate)\r\n\r\n if (!isWidgetFilter) {\r\n filtersManager.updateFiltersChanged({});\r\n }\r\n }.bind(this),\r\n null,\r\n true,\r\n \"POST\",\r\n undefined,\r\n undefined,\r\n true,\r\n false);\r\n }\r\n }\r\n\r\n isCombinedDate(): boolean {\r\n return this.scopeAction() === ScopeActionEnum.Combine && (this.filterEditorType() === FilterEditorTypeEnum.Date || this.filterEditorType() === FilterEditorTypeEnum.DateRange);\r\n }\r\n}\r\n\r\n//class Field {\r\n// id: KnockoutObservable;\r\n// fieldName: KnockoutObservable;\r\n// displayName: KnockoutObservable;\r\n// tableName: KnockoutObservable;\r\n// type: KnockoutObservable;\r\n//}\r\n\r\nclass DateRange {\r\n id: KnockoutObservable;\r\n name: KnockoutObservable;\r\n nextDate: KnockoutObservable;\r\n previousDate: KnockoutObservable;\r\n\r\n initials: KnockoutObservable;\r\n startDate: KnockoutObservable;\r\n endDate: KnockoutObservable;\r\n}\r\n\r\nclass DateRangeConfigFilter {\r\n multiplier: KnockoutObservable;\r\n startDate: KnockoutObservable;\r\n lastDateUsed: KnockoutObservable;\r\n endDate: KnockoutObservable;\r\n userDates: KnockoutObservable;\r\n}","enum VisibilityEnum {\r\n Normal = 0,\r\n Deprecated = 1\r\n}\r\n\r\nenum LabelFormatEnum {\r\n Automatic,\r\n Normal,\r\n Thousands,\r\n Millions,\r\n Billions,\r\n}\r\n\r\nvar convertAutoGrouping = function (autoGrouping: string): AutoGroupingEnum {\r\n switch (autoGrouping) {\r\n case \"ByDay\":\r\n return AutoGroupingEnum.ByDay;\r\n case \"ByMonth\":\r\n return AutoGroupingEnum.ByMonth;\r\n case \"ByMonthOnly\":\r\n return AutoGroupingEnum.ByMonthOnly;\r\n case \"ByQuarter\":\r\n return AutoGroupingEnum.ByQuarter;\r\n case \"ByQuarterOnly\":\r\n return AutoGroupingEnum.ByQuarterOnly;\r\n case \"ByWeek\":\r\n return AutoGroupingEnum.ByWeek;\r\n case \"ByYear\":\r\n return AutoGroupingEnum.ByYear;\r\n default:\r\n AutoGroupingEnum.None;\r\n }\r\n}\r\n\r\nvar getAutoGroupingText = function (autoGrouping: AutoGroupingEnum): string {\r\n switch (autoGrouping) {\r\n case AutoGroupingEnum.ByDay:\r\n return \"By Day\";\r\n case AutoGroupingEnum.ByMonth:\r\n return \"By Month\";\r\n case AutoGroupingEnum.ByMonthOnly:\r\n return \"By MonthOnly\";\r\n case AutoGroupingEnum.ByQuarter:\r\n return \"By Quarter\";\r\n case AutoGroupingEnum.ByQuarterOnly:\r\n return \"By QuarterOnly\";\r\n case AutoGroupingEnum.ByWeek:\r\n return \"By Week\";\r\n case AutoGroupingEnum.ByYear:\r\n return \"By Year\";\r\n default:\r\n return \"\";\r\n }\r\n}\r\n\r\nvar getFilterVariables = function(){\r\n return [\r\n { id: \"DATE\", text: \"Date\", range: false },\r\n { id: \"MONTH\", text: \"Month\", range: false },\r\n { id: \"YEAR\", text: \"Year\", range: false },\r\n { id: \"STARTYEAR\", text: \"Start Year\", range: true },\r\n { id: \"STARTMONTH\", text: \"Start Month\", range: true },\r\n { id: \"STARTDATE\", text: \"Start Date\", range: true },\r\n { id: \"ENDYEAR\", text: \"End Year\", range: true },\r\n { id: \"ENDMONTH\", text: \"End Month\", range: true },\r\n { id: \"ENDDATE\", text: \"End Date\", range: true },\r\n { id: \"DATERANGE\", text: \"Date Range\", range: undefined},\r\n { id: \"DATERANGESHORT\", text: \"Short Date Range\", range: undefined },\r\n { id: \"MTH\", text: \"Short Month\", range: undefined },\r\n { id: \"WEEK\", text: \"Week\", range: undefined },\r\n { id: \"WEEKRANGE\", text: \"Week Range\", range: true }\r\n ];\r\n}\r\n\r\nclass IRSettings {\r\n dateFormat: string;\r\n shortDateFormat: string;\r\n version: string;\r\n dateVersion: string;\r\n}\r\nvar irSettings: IRSettings;\r\n\r\nenum TabTypeStrEnum {\r\n Report = \"Report\",\r\n Dashboard = \"Dashboard\",\r\n ReportDesigner = \"ReportDesigner\",\r\n ChartDesigner = \"ChartDesigner\",\r\n None = \"None\",\r\n Chart = \"Chart\"\r\n}\r\nenum TabTypeEnum {\r\n Report = 0,\r\n Dashboard = 1,\r\n ReportDesigner = 2,\r\n ChartDesigner = 3,\r\n None = 4,\r\n Chart = 5\r\n}\r\nenum ReportTypeStrEnum {\r\n Analysis = \"Analysis\",\r\n Pivot = \"Pivot\",\r\n Chart = \"Chart\",\r\n None = \"None\"\r\n}\r\n\r\nenum WorkbookOpeningModeEnum {\r\n View = 0,\r\n Edit = 1\r\n}","var requirejs: any;\r\n\r\nlet componentRoot = urlConfigs.siteRoot + 'Components/';\r\n\r\n//set the path for text and require-css, so require can load from the Components folder\r\nrequirejs.config({\r\n map: {\r\n '*': {\r\n 'css': `${componentRoot}require-css.min.js`\r\n }\r\n },\r\n //Added a timeout zero to avoid errors when opening big dashboards\r\n //Uncaught Error: Load timeout for modules: text!\r\n waitSeconds: 0,\r\n});\r\n\r\n//Override the load method of require to include a file version\r\n//Same is done for text and require-css\r\n//oRevision is located in the revision.ts file generated by a gulp task that watch the file modifications\r\nvar load = requirejs.load;\r\nrequirejs.load = function (context, moduleId, url) {\r\n let moduleIdTemp = moduleId;\r\n if (moduleIdTemp.startsWith(componentRoot)) {\r\n moduleIdTemp = moduleIdTemp.substring(urlConfigs.siteRoot.length);\r\n }\r\n let version = oRevision[moduleIdTemp];\r\n //console.log(moduleId + \" | \" + moduleIdTemp + \" | \" + version);\r\n if (version) {\r\n url += \"?v=\" + version;\r\n }\r\n load(context, moduleId, url);\r\n};\r\n\r\n\r\nvar templateFromUrlLoader = {\r\n loadTemplate: function (name, templateConfig, callback) {\r\n if (templateConfig.fromUrl) {\r\n // Uses jQuery's ajax facility to load the markup from a file\r\n let fullUrl = templateConfig.fromUrl;\r\n let moduleIdTemp = fullUrl;\r\n if (fullUrl.startsWith(componentRoot)) {\r\n moduleIdTemp = moduleIdTemp.substring(urlConfigs.siteRoot.length);\r\n }\r\n\r\n let version = oRevision[moduleIdTemp];\r\n if (version) {\r\n fullUrl += \"?v=\" + version;\r\n }\r\n $.get(fullUrl, function (markupString) {\r\n // We need an array of DOM nodes, not a string.\r\n // We can use the default loader to convert to the\r\n // required format.\r\n ko.components.defaultLoader.loadTemplate(name, markupString, callback);\r\n });\r\n } else {\r\n // Unrecognized config format. Let another loader handle it.\r\n callback(null);\r\n }\r\n }\r\n};\r\n\r\n// Register it\r\nko.components.loaders.unshift(templateFromUrlLoader);\r\n\r\n\r\n//Register the components here\r\n//The viewModel file name doesn't include the extension, only the same\r\n//The template needs to have the .html extension and the \"text!\" in the beggining\r\n\r\nko.components.register('filter-list', {\r\n viewModel: { require: `${componentRoot}Filters/FilterList/FilterListViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/FilterList/FilterListView.html` }\r\n});\r\n\r\nko.components.register('filter', {\r\n viewModel: { require: `${componentRoot}Filters/Filter/FilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/Filter/FilterView.html` }\r\n});\r\n\r\nko.components.register('scope-action-filter', {\r\n viewModel: { require: `${componentRoot}Filters/ScopeActionFilter/ScopeActionFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/ScopeActionFilter/ScopeActionFilterView.html` }\r\n});\r\n\r\nko.components.register('condition-type-filter', {\r\n viewModel: { require: `${componentRoot}Filters/ConditionTypeFilter/ConditionTypeFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/ConditionTypeFilter/ConditionTypeFilterView.html` }\r\n});\r\n\r\nko.components.register('date-range-types', {\r\n viewModel: { require: `${componentRoot}Filters/DateRangeTypes/DateRangeTypesViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/DateRangeTypes/DateRangeTypesView.html` }\r\n});\r\n\r\nko.components.register('month-filter', {\r\n viewModel: { require: `${componentRoot}Filters/MonthFilter/MonthFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/MonthFilter/MonthFilterView.html` }\r\n});\r\n\r\nko.components.register('quarter-filter', {\r\n viewModel: { require: `${componentRoot}Filters/QuarterFilter/QuarterFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/QuarterFilter/QuarterFilterView.html` }\r\n});\r\n\r\nko.components.register('switch-filter', {\r\n viewModel: { require: `${componentRoot}Filters/SwitchFilter/SwitchFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/SwitchFilter/SwitchFilterView.html` }\r\n});\r\n\r\nko.components.register('textBox-filter', {\r\n viewModel: { require: `${componentRoot}Filters/TextBoxFilter/TextBoxFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/TextBoxFilter/TextBoxFilterView.html` }\r\n});\r\n\r\nko.components.register('multiSelect-filter', {\r\n viewModel: { require: `${componentRoot}Filters/MultiSelectFilter/MultiSelectFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/MultiSelectFilter/MultiSelectFilterView.html` }\r\n});\r\n\r\nko.components.register('metric-filter', {\r\n viewModel: { require: `${componentRoot}Filters/MetricFilter/MetricFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/MetricFilter/MetricFilterView.html` }\r\n});\r\n\r\nko.components.register('dateRange-filter', {\r\n viewModel: { require: `${componentRoot}Filters/DateRangeFilter/DateRangeFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/DateRangeFilter/DateRangeFilterView.html` }\r\n});\r\n\r\nko.components.register('date-filter', {\r\n viewModel: { require: `${componentRoot}Filters/DateFilter/DateFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/DateFilter/DateFilterView.html` }\r\n});\r\n\r\nko.components.register('numeric-filter', {\r\n viewModel: { require: `${componentRoot}Filters/NumericFilter/NumericFilterViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/NumericFilter/NumericFilterView.html` }\r\n});\r\n\r\nko.components.register('previous-next-date', {\r\n viewModel: { require: `${componentRoot}Filters/PreviousNextDate/PreviousNextDateViewModel.js` },\r\n template: { fromUrl: `${componentRoot}Filters/PreviousNextDate/PreviousNextDateView.html` }\r\n});","declare var urlConfigs: any;\r\ndeclare var bootbox: any;\r\nclass WorkbookCopy {\r\n originalWorkbookId: number;\r\n originalWorkbookName: string;\r\n\r\n workbookCopyId: number;\r\n workbookCopyName: string;\r\n\r\n copyDate: Date;\r\n dateModification: Date;\r\n\r\n ownerId: number;\r\n ownerName: string;\r\n\r\n constructor() {\r\n\r\n }\r\n}\r\n\r\nclass WorkbookCopyViewModel {\r\n workbookCopies: Array;\r\n originalWorkbook: Array;\r\n tabSettings: any;\r\n\r\n constructor() {\r\n this.workbookCopies = [];\r\n this.originalWorkbook = [];\r\n }\r\n}\r\n\r\nvar workbookCopies = (function () {\r\n function show(workbookId: boolean) {\r\n let url = \"GetWorkbookCopies\";\r\n \r\n irGlobal.updateFromServer({},\r\n urlConfigs.tabs + \"GetWorkbookCopies\",\r\n {\r\n workbookId: workbookId\r\n },\r\n function (result) {\r\n setup(result);\r\n }.bind(this),\r\n null,\r\n true,\r\n \"POST\");\r\n }\r\n\r\n function setup(data) {\r\n let vm = new WorkbookCopyViewModel();\r\n data.workbookCopies.forEach(function (wb) {\r\n let workbookCopy = new WorkbookCopy();\r\n Object.assign(workbookCopy, wb);\r\n vm.workbookCopies.push(workbookCopy);\r\n });\r\n data.originalWorkbook.forEach(function (wb) {\r\n let originalWb = new WorkbookCopy();\r\n Object.assign(originalWb, wb);\r\n vm.originalWorkbook.push(originalWb);\r\n });\r\n\r\n vm.tabSettings = {\r\n activeStateEnabled: true,\r\n selectedIndex: vm.originalWorkbook.length > 0 && vm.workbookCopies.length > 0 ? 0 : vm.originalWorkbook.length > 0 ? 1 : 0,\r\n dataSource: [{\r\n name: \"Workbook Copies\",\r\n visible: vm.workbookCopies.length > 0 || vm.originalWorkbook.length === 0,\r\n dataSource: vm.workbookCopies\r\n },\r\n {\r\n name: \"Original Workbook\",\r\n visible: vm.originalWorkbook.length > 0,\r\n dataSource: vm.originalWorkbook\r\n }],\r\n itemTitleTemplate: function (data, index, element) {\r\n return data.name;\r\n },\r\n itemTemplate: function (data, index, element) {\r\n element.dxDataGrid({\r\n height: 320,\r\n dataSource: data.dataSource,\r\n columns: [\r\n { dataField: \"ownerName\", caption: \"Owner\" },\r\n { dataField: \"workbookName\", caption: \"Workbook\" },\r\n { dataField: \"dateModification\", caption: \"Date Modification\", dataType: \"datetime\", width: 130 },\r\n { dataField: \"copyDate\", caption: \"Copy Date\", dataType: \"datetime\", width: 130 },\r\n {\r\n type: 'buttons',\r\n width: 50,\r\n buttons: [{\r\n hint: 'Open workbook',\r\n icon: 'link',\r\n onClick(e) {\r\n if (e.row.data.hasAccess || loggedUser.permissions.workbooks()) {\r\n window.open(`${window.location.origin}/wb/open/${e.row.data.workbookId}`, '_blank').focus();\r\n }\r\n else {\r\n DevExpress.ui.dialog.alert(\"No access to workbook\", \"\");\r\n }\r\n }\r\n }],\r\n }\r\n ]\r\n });\r\n }\r\n }\r\n\r\n let popup = ($(\"#WorkbookCopiesPopup\") as any).dxPopup({\r\n contentTemplate: `
      `,\r\n width: 800,\r\n height: 400,\r\n showTitle: true,\r\n title: \"Workbook Copies\",\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: true,\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n },\r\n onShown: function (e) {\r\n ko.applyBindings(vm, document.getElementById(\"WorkbookCopiesPopupContent\"));\r\n }\r\n }).dxPopup(\"instance\");\r\n\r\n popup.show();\r\n }\r\n\r\n return {\r\n show: show\r\n };\r\n}());"]}