{"version":3,"sources":["Scripts/AppKitchen/AppKitchen.ChangeManager.ts","Scripts/AppKitchen/AppKitchen.Data.ts","Scripts/AppKitchen/AppKitchen.LoginManager.ts","Scripts/AppKitchen/AppKitchen.Base.ts","Scripts/AppKitchen/AppKitchen.Apps.Credits.ts","Scripts/AppKitchen/AppKitchen.Controls.Charts.Highcharts.ts","Scripts/AppKitchen/general/general.ts","Scripts/AppKitchen/general/tschart/general.tschart.transformations.ts","Scripts/AppKitchen/general/tschart/general.tschart.ts","Scripts/AppKitchen/AppKitchen.Portal.Defaults.ts","Scripts/AppKitchen/AppKitchen.Portal.InteractiveGraphic.ts","Scripts/AppKitchen/AppKitchen.Controls.Wrappers.MaximizeWrapper.ts","Scripts/AppKitchen/AppKitchen.Controls.LayoutGrid.ts","Scripts/AppKitchen/AppKitchen.Controls.Popups.Notification.ts","Scripts/AppKitchen/AppKitchen.Data.Export.ts","Scripts/AppKitchen/AppKitchen.Helpers.ts","Scripts/AppKitchen/AppKitchen.Controls.InteractiveImage.ts","Scripts/AppKitchen/AppKitchen.Controls.FileDisplay.ts","Scripts/AppKitchen/AppKitchen.Apps.GenericConfigFileStarters.ts","Scripts/AppKitchen/AppKitchen.Controls.Forms.Fields.ts","Scripts/AppKitchen/AppKitchen.Controls.Forms.ts","Scripts/AppKitchen/AppKitchen.Apps.UserManagement.ts","Scripts/AppKitchen/AppKitchen.Controls.Charts.CombinedChart.ts","Scripts/AppKitchen/AppKitchen.Controls.Charts.PieChart.ts","Scripts/AppKitchen/AppKitchen.Controls.Charts.StackedColumnChart.ts","Scripts/AppKitchen/AppKitchen.Controls.Data.ImportExportPicker.ts","Scripts/AppKitchen/AppKitchen.Controls.DateRangePicker.ts","Scripts/AppKitchen/AppKitchen.Controls.Forms.EventForm.ts","Scripts/AppKitchen/AppKitchen.Controls.Grids.ts","Scripts/AppKitchen/AppKitchen.Controls.Grids.EventGrid.ts","Scripts/AppKitchen/AppKitchen.Controls.Grids.JobLogGrid.ts","Scripts/AppKitchen/AppKitchen.Controls.Grids.TimeseriesDataGrid.ts","Scripts/AppKitchen/AppKitchen.Controls.Grids.TimeseriesGrid.ts","Scripts/AppKitchen/AppKitchen.Controls.InteractiveItem.ts","Scripts/AppKitchen/AppKitchen.Controls.Job.ts","Scripts/AppKitchen/AppKitchen.Controls.Map.ts","Scripts/AppKitchen/AppKitchen.Controls.Menus.VerticalMenu.ts","Scripts/AppKitchen/AppKitchen.Controls.Menus.CombinedVerticalMenu.ts","Scripts/AppKitchen/AppKitchen.Controls.Menus.SearchMenu.ts","Scripts/AppKitchen/AppKitchen.Controls.Panel.Accordion.ts","Scripts/AppKitchen/AppKitchen.Controls.SearchBox.ts","Scripts/AppKitchen/AppKitchen.Controls.Tile.ts","Scripts/AppKitchen/AppKitchen.Controls.Timeline.ts","Scripts/AppKitchen/AppKitchen.Controls.TimeseriesDataViews.Chart.ts","Scripts/AppKitchen/AppKitchen.Controls.TimeseriesDataViews.Spreadsheet.ts","Scripts/AppKitchen/AppKitchen.Controls.TimeseriesDataViews.ts","Scripts/AppKitchen/AppKitchen.Controls.TimeseriesDataViews.View.ts","Scripts/AppKitchen/AppKitchen.Controls.TimeseriesStatus.ts","Scripts/AppKitchen/AppKitchen.Data.Descriptors.ts","Scripts/AppKitchen/AppKitchen.Data.EventDataLoader.ts","Scripts/AppKitchen/AppKitchen.Data.Import.ts","Scripts/AppKitchen/AppKitchen.Data.JobLogLoaders.ts","Scripts/AppKitchen/AppKitchen.Data.TimeseriesDataLoader.ts","Scripts/AppKitchen/AppKitchen.Data.TimeseriesLoader.ts","Scripts/AppKitchen/AppKitchen.FrameManager.ts","Scripts/AppKitchen/AppKitchen.Starter.ts","Scripts/AppKitchen/AppKitchen.Timezone.ts","Scripts/AppKitchen/general/general.services.cache.ts","Scripts/AppKitchen/general/tschart/general.tschart.preloadtransformations.ts"],"names":["AppKitchen","General","Portal","updateColors","$","length","AsLinq","ForEach","color","dummy","append","c","UIHelper","Colors","parseColor","css","rgb2Hex","remove","compareSortNr","nr1","nr2","a","Number","POSITIVE_INFINITY","b","parseInt","ObjIdentifier","databaseId","this","LastTimeUpdated","Date","now","toISOString","DatabaseId","TimeseriesIdentifier","_super","timeseriesId","_this","call","TimeseriesId","type","__extends","InventoryIdentifier","inventoryId","InventoryId","ActionHolder","inventoryIdentifier","action","identifier","ChangeManager","onInventoryChanged","trackNumber2action","trackNumber","onTimeseriesChanged","removeChangeListener","getAllInventoryIdentifiers","getAllIIdentifiers","getAllTimeseriesIdentifiers","allInventories","i","actionHolder","push","inventoryHasChanged","timeseriesHasChanged","timeseriesIdentifier","processResult","result","window","setTimeout","checkForUpdates","bind","pollIntervalMs","InventoryIdentifiers","forEach","HasChanged","TimeseriesIdentifiers","allTimeseries","Data","getDataApi","startCheckForUpdates","checkingForUpdates","ChangeManagerWithWebSockets","webSocket","send","JSON","stringify","Id","ObjectType","SessionToken","getToken","WebSocket","location","hostname","onmessage","evt","changeMessage","parse","data","apiUrl","appKitchenApiUrl","documentMap","setAPIs","url","appKitchenUrl","init","UrlHelper","Api","reDate","parseDateString","dateString","moment","toDate","getDataInternal","method","apiNameWithUrl","requestData","callback","errorCallback","ajax","dataType","success","error","xhr","textStatus","errorThrown","handleError","cache","ajaxSetup","beforeSend","request","setRequestHeader","converters","text json","json","convertJsonDates","value","index","parent","test","Array","Object","p","hasOwnProperty","parseJSON","Cookies","get","GlobalSettings","sessionTokenCookieName","ping","timeout","e","status","logInfo","getDataApiUrl","apiName","getDataByGetRequestApi","getData","getDataByGetRequest","getDocument","documentName","documentType","filename","getDocumentCached","documentId","documentData","getEventBinaryUrl","itemId","eventId","inventoryPart","encodeURIComponent","fieldIdPart","idPart","databaseIdPart","getIconUrl","iconId","getTextPoolItems","getGlobalSettings","getEventInventories","getEventItemInfos","getEventData","getTimeseries","getTimeseriesInfo","getTimeseriesData","updateTimeseriesData","getJobLog","startJob","getTaskLog","getJobLogFilters","getJobs","getHypotheses","updateEventData","updateEventMultiData","deleteEventData","getDimensions","getDescriptors","getTrees","getUserInfo","updateUserInfo","changePassword","passwordChangeRequest","getAboutInfo","getUserRoles","getIconBase64","id","LoginManager","loginEnsured","intervalId","getParameterFromQueryString","key","queryString","queries","split","indexOf","substr","redirectToOAuth","logout","tokenUrl","getOAuthUrl","currentUserCookieName","BrowserHelper","setUrl","refresh","tokenserviceUrl","securityTokenServiceOAuthUrl","welcomeMessage","loginTheme","document","href","ensureLogin","start","claim","UrlQuery","getParameter","claimString","atob","sessionToken","username","decodeURIComponent","escape","set","removeParameter","pingTimeout","setInterval","pingInterval","renderTemplateTo","Templates","OAuthLink","ensureLoginAndStart","redirect","clearInterval","getCurrentUser","user","router","getRouter","Backbone","Router","AppBase","targetContainer","options","OptionsHelper","merge","requiresLogin","defaultOptions","el","$el","prototype","suspend","continue","dispose","ModelBase","attributes","attribute","event","context","on","getPrevious","previousAttributes","Model","CollectionBase","Collection","ViewBase","model","loadingOverlay","renderTemplate","LoadingConcentricSpinner","size","loading","refreshLoadingOverlay","has","appendTo","addClass","removeClass","setTemplate","template","_","html","View","CollectionViewBase","collection","logError","message","console","statusText","errorText","hideErrorPopup","responseText","DialogBoxes","alert","Strings","Messages_ErrorOccured","log","info","logWarning","warn","Apps","CreditsApp","AboutWindow","applicationName","applicationVersion","copyrightInfo","applicationCopyright","aboutInfo","find","AboutWindow_Info","Scrolling","customScroller","each","licenseFile","attr","licence","kendoTooltip","position","content","show","hideTooltips","sender","Controls","Charts","HighchartsHelper","highchartsInitialized","initializeHighcharts","Highcharts","setOptions","global","useUTC","lang","decimalPoint","kendo","culture","numberFormat","thousandsSep","months","calendar","names","shortMonths","namesAbbr","weekdays","days","shortWeekdays","Chart_Loading","numericSymbols","printChart","Chart_PrintChart","rangeSelectorFrom","Chart_Button_From","rangeSelectorTo","Chart_Button_To","rangeSelectorZoom","Chart_Button_Zoom","resetZoom","Chart_Button_ResetZoom","resetZoomTitle","Chart_Button_ResetZoomTooltip","noData","Chart_NoData","HighchartsData","seriesData","createHighchartSeriesModels","seriesConfigs","highchartSeriesModels","sd","config","seriesConfig","styles","HighchartsSeriesModel","getConfig","getSeries","extend","HighchartsSeriesCollectionModel","seriesCollection","undefined","defaultConfig","getAllSeries","retList","s","HighchartsView","render","initializedSeriesModels","initNewSeriesModels","seriesModels","sm","inArray","seriesDataChanged","seriesModel","existingSeries","chart","setData","setExtremesX","extremes","xAxis","setExtremes","min","max","setExtremesY","yAxis","getExtremesX","getExtremes","getExtremesY","Highchart","container","chartConfig","tooltip","positioner","boxWidth","boxHeight","point","xPos","plotX","x","y","series","highcharts","resize","reflow","startsWith","funcStr","prefix","convertToFunction","procedureString","eval","GeneralLogger","GeneralRenderer","renderFunc","containerSelector","renderCallback","debugLog","errorLog","logDebug","msg","TsChart","Transformations","FormatSeriesName","formatString","parentSeriesLabel","procedure","dateFormat","FormatSeriesNameUseOnlyParentSeriesLabel","ChangeTimestampToGroupingFormat","groupingFormat","hour","getHours","UTC","LatestDatapointTransformation","serie","transformationData","latestDataPoints","newSerie","name","groupingIndex","xAxisIndex","yAxisIndex","maxIndex","Math","dataBin","xAxisValues","xValue","yValue","groupingValue","j","sort","xAxisValue","possibleTuples","tupleWithLatestGroupingDate","yAxisValue","groupingDate","StackDataTransformation","groupingType","toUpperCase","_stackDataByYear","groupingArr","hash","currentDate","currentYear","getUTCFullYear","getMonth","getDate","getSeconds","k","TimeaxisToSeriesTransformation","groupedValue","parseFloat","labelFormat","OHLCTransformation","dataList","getTs","list","datasourceId","targetList","timestamp","retData","dataTmp","openTs","o","highTs","h","lowTs","l","closeTs","CombineSeries","tData","series1","series2","currData","seriesid1","seriesid2","dataDictionary","date","val","Chart","getSmallestDateFromDataList","addAxisFormatter","axisObj","addFormatter","labels","formatter","formatterFunc","toString","findMatchingPoint","points","searchX","minIndex","pointsLength","startPoint","endPoint","midIndex","midIndexPoint","nextPoint","applyPreloadTransformation","interactiveDefinition","setTitle","reloadAfterTransformation","preloadtransformation","title","fixDataList","dataLists","smallestDateOfAllLists","relevantIndex","smallestDateOfCurrentList","chartdefinition","navigator","baseSeries","setChartControlsDependingOnSize","chartOptions","highstockchartSelector","initialChartConfig","height","width","navigatorEnabled","scrollbar","enabled","buttonsEnabled","rangeSelector","optionsChanged","getSeriesPointsForXValue","len","transformDataIfRequired","datatransformation","getSeriesLabel","timeseriesName","preprocessInteractiveDefinition","defaultChartConfig","defaults","positionerProcedure","tooltipFormatter","evalChartFunctions","chartseries","chartserie","chartData","seriesLabel","d","datasource","datasourceid","seriesStyles","seriesstyles","style","seriesstyleid","label","transformation","newSeriesList","seriestransformation","seriesProcedure","timeGrouping","Defaults","interactiveGraphic","backgroundColor","borderColor","animation","marginLeft","zoomType","borderRadius","plotOptions","events","exporting","buttons","contextButton","credits","maskFill","fillOpacity","lineColor","outlineColor","maskInside","barBackgroundColor","barBorderColor","barBorderRadius","buttonArrowColor","buttonBackgroundColor","buttonBorderColor","trackBackgroundColor","trackBorderColor","buttonBorderRadius","fontFamily","fontWeight","display","subtitle","borderWidth","valueDecimals","hideDelay","crosshairs","shared","shadow","inputDateFormat","ChartInputDateFormat","buttonTheme","fill","stroke","states","hover","select","InteractiveGraphic","text","titleText","onReloadAfterTransformation","loadChart","WindowResize","currentUpdateSizeTimer","clearTimeout","updateSize","syncTooltip","chartsDomSelectors","hide","domSelector","mInitialChartConfig","destroy","chartTitleHeight","outerHeight","setSize","jsonString","","getDefaults","me","mouseOver","jQuery","chartTarget","empty","removeAttr","Wrappers","MaximizeWrapper","target","undockUrl","renderedContent","renderContent","click","maximize","undock","openInWindow","sourceElement","detach","close","windowOptions","closed","onWindowClosed","opened","onWindowOpened","top","left","animate","modal","easyClose","center","Windows","openWindow","maximized","parentElement","restored","LayoutGridModel","layoutgridConfig","layoutGridConfig","LayoutGridView","layoutGridModel","getUndockUrl","layoutGridItemRoot","rootConfig","minWidth","minHeight","renderGridItem","item","LayoutGrid_BasicTable","size1","size2","orientation","LayoutGrid_Horizontal","LayoutGrid_Vertical","newTargets","processItem","pane1","pane2","loadApps","configFile","startApp","app","redraw","ConfigFileStarterApp","LayoutGrid_Cell","Popups","NotificationIcon","Notification","icon","Loading","Ok","Error","Info","closable","hideable","keepOnNavigate","stack","autoClose","closeAfter","implicitStack","DefaultNotificationStack","NotificationBox","prependTo","getHighestZIndex","closeAfterTimeout","children","setClosable","closeable","toggleClass","setHideable","setContent","setType","setError","setOk","setIcon","LoadingNotification","loadingMsg","successMsg","errorMsg","ok","Export","saveAsExcel","columns","sheetTitle","sheetColumns","rows","cells","column","autoWidth","header","background","headerBackground","headerForeground","fontSize","bold","borderBottom","headerBorder","row","field","format","textAlign","align","foreground","workbook","ooxml","Workbook","sheets","saveAs","dataURI","toDataURL","fileName","saveAsCsv","showHeader","columnDelimiter","rowDelimiter","useSaveFileProxy","mimeType","charset","lines","values","join","stringValue","dataUri","btoa","proxyUrl","proxyURL","forceProxy","StringHelper","Transitions","Notifications","defaultNotificationStack","ExportHelper","checkBrowser","isIE","ieVersion","IEVersion","userFriendlyMessage","debugMessage","errorInfo","createElement","className","innerHTML","body","appendChild","throwStartupError","triggerWindowResizeEvent","createEvent","initUIEvent","dispatchEvent","getUserAgent","userAgent","match","substring","minimal","features","addressbar","menubar","toolbar","statusbar","resizable","openedWindow","open","focus","history","replaceState","pushState","path","reload","replace","getUrl","getParameters","queryParams","vars","pair","arr","parameters","setParameter","baseUrl","keyFound","newUrl","splice","clear","counter","actions","off","handle","trigger","lostActions","keys","element","closest","getString","resources","string","generateRandom","str","possible","charAt","floor","random","isValidIdentifier","exec","customOptions","deep","GuidHelper","newGuid","r","updateFullHeightGrids","clearSelection","selection","getSelection","removeAllRanges","grid","availableHeight","not","is","actualNewHeight","renderLoader","opt","LoadingCircleSpinner","LoadingMesapSpinner","fadeIn","complete","removeLoader","animationContainer","fadeOut","renderLoadingAnimation","loaderType","removeLoadingAnimation","except","addTooltip","maxZ","z","hex2Rgb","extendShortHex","parser","g","validateRgbComponent","componentToHex","lightenRgb","amount","darkenRgb","component","hex","beginsWith","trim","parseRgbString","rgb2rgba","lightenHex","darkenHex","targetElement","hasClass","nanoScroller","disableResize","synchronizeScrolling","scroller1","scroller2","$scroller1","$scroller2","scrolling1Timeout","scrolling2Timeout","scrollTo","scrollTop","offsetToViewport","scroller","included","viewport","elementBounds","offsetTop","scrollIntoViewport","duration","distance","axis","introduce","opacity","swap","fadeOutDuration","fadeInDuration","after","modalOverlay","maxWidth","maxHeight","draggable","resized","overflow","highestZ","hasTitleBar","popupWindow","kendoWindow","scrollable","deactivate","visible","activate","wrapper","windowCssClass","keydown","which","Responsive","update","buttonsContainer","button","$btn","WindowButton","minimize","restore","dialogOptions","DialogBoxAlert","box","cssClass","confirm","strings","cancel","Cancel","DialogBoxConfirm","yesNo","yes","no","Yes","No","notify","closeAll","targets","lostTargets","registerTarget","LocalStorageHelper","read","storedString","localStorage","getItem","storedObject","cleanUp","expired","expires","expirationDate","parseDate","exception","removeItem","store","addDays","setItem","listeners","registerListener","addEventListener","storageEventHandler","exportChartDataToExcel","chartsData","definitions","exportChartsData","def","FirstOrDefault","cd","excelData","firstChartData","dataIndex","tsData","rowData","timepoint","#1","tsIndex","columnDefinitions","ExcelExport_DateTimeColumnHeader","LightGray","Gray","exportChartDataToCsv","csvData","String","oldDate","valueOf","newDate","getTimezoneOffset","addHours","hours","addMinutes","minutes","onlyDate","setHours","toLocalISOString","slice","arguments","reg","RegExp","endsWith","searchString","subjectString","truncate","nl2br","escapeHTML","replaceAll","searchValue","replaceValue","InteractiveImageModel","imageUrl","InteractiveImage","interactiveImageModel","addDevModeIfNeeded","devBox","InteractiveImage_DevBox","xContainer","yContainer","imageBox","mousemove","parentOffset","offset","relativeXPosition","pageX","relativeYPosition","pageY","mouseleave","mouseenter","InteractiveImage_Frame","img","Image","onload","imgWidth","imgHeight","src","imageWidth","imageHeight","widthFac","heightFac","fac","createElementForPoint","font-size","createElementForText","fontSizeInPercent","createElementForRectangle","FileDisplayModel","fileUrl","FileDisplay","fileDisplayModel","FileDisplay_Frame","audio","setAttribute","video","obj","ConfigApp","ConfigTsChartApp","tsChartView","urlParameter","urlQuery","FrameManager","hideHeader","jsonConfig","processConfig","handleRequestError","getFileUrl","view","documenttype","toLowerCase","image","file","mime","Forms","FieldType","FieldPatterns","OnlyDigits","Alphanumeric","Phone","Email","UserId","FieldModel","displayValue","getDefaultOptions","updateDisplayValue","default","description","placeholder","order","fieldGroup","disabled","hidden","readOnly","mandatory","pool","pattern","getDefaultFormat","textMode","allow24","suggest","multiline","precision","getDefaultPrecision","password","kendoOptions","Text","getDefaultNumberFormat","patterns","Time","t","DateTime","Year","NaN","getTextFieldDisplayValue","Checkbox","Switch","getSwitchTapDisplayValue","switchTaps","onValue","onLabel","offLabel","multi","separator","getDisplayValueFromPool","textField","valueField","FieldCollection","FieldViewBase","editable","editOnDemand","tagName","FormField","viewContainerSelector","inputContainerSelector","editModeAllowed","editAllowed","inputTemplate","toJSON","flash","startEdit","editMode","endEdit","TextInputFieldViewBase","FormFieldTextInput","rendered","clearMessage","showMessage","Form_Required","validate","getInputValue","delegateInteractionEvents","postRender","applyInputOptions","startEditAndFocus","first","keypress","stopPropagation","updateOnEnter","revertOnEscape","blur","updateOnBlur","updateAndClose","updateAndRefocus","tryUpdate","preview","backToEdit","textValue","validatedValue","valid","Form_ErrorMessage_Required","validateFormat","Form_ErrorMessage_Format","errorClass","validateMin","validateMax","TextFieldView","inputSelector","currentValue","restrict","inputWidget","kendoMultiSelect","filter","dataTextField","dataValueField","dataSource","change","input","keyCode","preventDefault","safariClosedBeforeValueChangedFix","search","kendoDropDownList","widgetKeyDown","openInputPopup","kendoComboBox","kendoAutoComplete","textAreaInput","FormFieldTextAreaInput","replaceWith","ul","sep","regex","Form_ErrorMessage_PatternMismatch","Form_ErrorMessage_StringTooLong","Form_ErrorMessage_StringTooShort","NumberFieldView","numericbox","kendoNumericTextBox","spinners","step","decimals","newValue","Form_ErrorMessage_NumberTooBig","Form_ErrorMessage_NumberTooSmall","DateTimeFieldView","picker","kendoDatePicker","depth","Month","kendoTimePicker","kendoDateTimePicker","pickerKeyDown","openPicker","dateAsNumber","Form_ErrorMessage_TimeInvalid","getErrorMessage","date2Number","fieldType","Form_ErrorMessage_DateTimeInvalid","Form_ErrorMessage_YearInvalid","Form_ErrorMessage_DateInvalid","getFullYear","CheckboxFieldView","hideCheckboxLabel","FormFieldCheckbox","FieldCheckbox","isChecked","prop","SwitchFieldView","FormFieldSwitch","onTapIndex","isLeftOn","offTapIndex","containers","switchLabelOn","switchLabelOff","getValue","offValue","DescriptorToTextPoolConverter","convert","descriptors","FormModel","fields","hasData","keyPrefix","updateFieldDict","dict","fieldDict","setFieldsData","clearFieldsData","getFieldsData","skipEmpty","submit","submitOptions","submitCallback","getProperty","property","getField","setProperty","onPropertyChange","fieldModel","onAnyPropertyChange","onSubmit","fieldKey","tryGetField","setValue","onValueChange","onAnyValueChange","disableField","enableField","triggerValueChange","triggerPropertyChange","FormViewBase","delegateEvents","click .a-btn-preview","click .a-btn-back","click .a-btn-submit","createFields","fieldViews","fieldViewDict","renderField","fieldView","getFieldViewClass","getFieldView","tryGetFieldView","validateFields","switchToPreview","disableButtons","enableButtons","TemplatedFormView","inputIndex","useExistingContent","renderOnlyInputs","labelAttr","FormFieldInfo","inputAttr","TabularFormView","showFieldNumber","showGroupRow","showButtons","TabularForm","getGroupName","groupId","table","models","groupHeaderTemplate","TabularFormGroupRow","currentGroupId","showGroups","groupName","rowNumber","rowspan","number","rowSpan","TabularFormRow","numberrowspan","HorizontalTabularFormView","submitIcon","submitTooltip","showTooltips","showLabels","HorizontalTabularForm","getFieldModelData","fieldData","_i","fields_1","fieldModels_1","ExtendedUserMenuApp","ExtendedUserMenu","userInfo","ExtendedUserMenuUserInfo","Name","email","MailAddress","AppHolder","ChangePasswordApp","startInWindow","extendedUserInfo","UserInfoApp","UserInfoFormModel","UserInfo_Nr","UserInfo_Id","UserInfo_Name","UserInfo_MailAddress","UserInfo_Phone","UserInfo_WindowsId","UserInfo_Description","UserInfo_Division","UserInfo_DefaultDatabaseId","UserInfo_IsAdmin","UserInfo_IsSysAdmin","UserInfo_IsUserManager","UserInfo_IsUserApprover","UserInfo_IsUserAuthenticator","UserInfo_IsServerCertApplier","UserInfo_IsServerCertApprover","UserInfoExtendedTile","UserInfo_LastLogin","LogonDate","save","cancelEdit","edit","elements","adminBox","sysadminBox","formModel","formView","UserInfoForm","setButtonAction","IsAdmin","IsSysAdmin","enableEdit","canselEdit","closeWindow","phone","UserInfo","response","SuccessfullyUpdated","UserInfo_OldPassword","UserInfo_NewPassword","UserInfo_ConfirmNewPassword","templatedFormView","ChangePassword","password1","OldPassword","NewPassword","SuccessfullyChanged","successfullyChangedPassword","raiseError","ErrorMessage","translatedMessage","ChangePassword_Message_PasswordChangedSuccessfully","plainMessage","CombinedChartView","CombinedChardApp","legendItems","dataStock","sum","reduce","category","CombinedChard","legendContainer","chartLeftContainer","chartRightContainer","pieChardModel","PieChartModel","pieChartView","PieChartView","noDataMessage","onSeriesClick","onClickPieChart","legend","initPieChartLookupTable","stackedColumnChartView","StackedColumnChartView","onClickStackedColumnChart","legendItem","this_1","onLegendItemClick","legendItems_1","pieChartData","pieChart","columnChart","PieChart_NoData","seriesDefaults","PieChart","configureWrapper","chartSize","margin-top","margin-left","removeEmptyData","kendoChart","offsetX","offsetY","chartArea","startAngle","overlay","gradient","transitions","legendItemClick","seriesClick","highlight","output","StackedColumnChartModel","categories","defaultStack","valueAxis","minMax","itemStyle","border","categoryAxis","majorGridLines","line","setValueAxisMax","getAxis","range","InportExportModel","InportExportView","importEnable","importExcelCallback","importCsvCallback","exportEnable","exportExcelCallback","exportCsvCallback","ImportExport","importMenu","exportMenu","configureButtons","configureExportMenu","configureImportMenu","mainList","createMenuExport","kendoMenu","openOnClick","xlsList","ImportExportView_ExportToXls","csvList","ImportExportView_ExportToCsv","createMenuImport","FileInputMenu","labelText","ImportExportView_ImportFromXls","allowedExtentions","ImportExportView_ImportFromCsv","files","DateRangePickerFormat","DateRangeModel","startDate","endDate","startFilter","endFilter","setStartDate","setEndDate","setRange","DateRangePickerModel","route","routingParameters","setPropertyFromRoute","updateRoute","getPropertyRoute","query","setDatePropertyFromRoute","setFilterValue","getDatePropertyRoute","dateFromQuery","routeStart","parameter","defaultStart","filterParameter","defaultFilter","routeEnd","defaultEnd","routeRange","parameterPrefix","onStartChange","changed","onEndChange","onRangeChange","DateRangePickerView","pickerFormat","hideEndPicker","dayPickers","minDate","maxDate","maxRange","from","TimeSpanPanel_From","to","TimeSpanPanel_To","DateRangePicker","keypress .a-startContainer","keypress .a-endContainer","blur .a-startContainer","blur .a-endContainer","click .a-tspanel-daychooser","createForm","setNumberOfDays","numberOfDays","currentTarget","disable","enable","getFieldType","pickerFields","isArray","fromLabels","toLabels","endDateField","formTemplate","labelFrom","labelTo","singlePicker","highlightSelectedDayPicker","today","dateFrom","round","dateRangePickerFormat","EventFormHelper","createEventTextField","eventItem","getCommonFieldOptions","Type","TypeSpecification","MultiSelect","TextPool","UseId","unshift","createEventDateField","DateFormat","createGenericField","UserFormat","Description","DefaultValue","IsRequired","EventItemTypeConverter","Memo","Boolean","Descriptor","Binary","Calculated","MasterDataCopy","User","Group","MultiDescriptor","EventKeyField","PeriodNr","getFieldLabel","metadata","generateFormFields","eventItems","eventItemSpecs","EventItemSpecs","fieldConfig","ItemId","Metadata","FieldOptions","fieldLabel","eventItemType","TimeResolution","SortNr","binary","field1","field2","EventFormModel","dataLoader","observeLoader","formfields","getItemsDict","loader","setBinaryUrls","triggerDataLoaded","getEventWriteData","devMode","getSaveRequestData","EventValues","fieldsData","saveData","api","onDataLoaded","oldData","restoreData","Grids","ColumnType","GridHelper","kendoFieldType","0","1","2","3","4","5","columnFilterUI","gridColumnTemplate","fieldName","columnOptions","GridModel","schema","selectedData","setGridData","dataItem","clonedData","selectedRowData","GridView","fillHeight","groupable","filterable","extendedFilter","sortable","sortMultiple","selectable","reorderable","headerTooltip","noRecordsMessage","initialSort","dblclick","lazyShow","uidField","gridSelector","updateGridData","renderGrid","suspendDataBinding","unbind","uids","setDataSource","pageSize","initial","updateLazyShow","datas","u","dataRow","uid","updateModelData","$gridContainer","gridFilter","extra","operators","contains","ui","FilterMenu","doesnotcontain","startswith","eq","sortMode","onSelectionChange","mode","allowUnsort","allowCopy","navigatable","convertToKendoGridToolbarItems","getColumns","noRecords","messages","dataBound","onSave","beforeCreateGrid","kendoGrid","startLazyShow","items","updateErrorSummaryDelayed","updateFullHeight","items_1","checkLazyShow","totalPages","allowGroupCollapse","showAll","showingMore","showMore","selectedIndex","scrollPosition","total","more","selectRow","allow","rowIndex","tbody","setErrorMessage","selectedRows","inputErrorTemplate","GridInputErrors","ErrorInfo16x16","numberOfFilters","filters","noRecordsText","Grid_ActiveFilters","command","editor","getDefaultGroupHeaderTemplate","templates","_a","hideColumn","showColumn","validateInput","columnTitles","requiredFields","validation","required","gridData","missedFields","updatingErrorSummary","updateErrorSummary","clearGrid","errors","ErrorInfo24x24","GridErrorSummary","scroll","focusElement","insertRow","insertedRow","insert","focusGrid","current","_current","_updateCurrentAttr","_scrollCurrent","EventGridHelper","h24","validateKey","getDefaultFieldOptions","getColumnType","getColumnHeader","isColumnEditable","getColumnsConfig","gridConfig","col1","col2","columnConfig","columnKey","columnType","GridOptions","multiFilter","fieldOptions","Width","Visibility","textPool","i_1","getMultiSelectEditor","getDropDownEditor","getAutoCompleteEditor","getDateEditor","getDateTimeEditor","getTimeEditor","timeColumnTextModeTemplate","compare","timeColumnTextModeCompare","getNumericEditor","defaultValue","emptyEntry","autoBind","concat","highlightFirst","args","timeValue","dateValue","data1","data2","time1","time2","EventGridModel","columnsConfig","JobLogGridHelper","TaskLogGridHelper","resultLevelTemplate","JobLogGrid_ResultLevelCell","resultLevel","resultLevelLabel","gridOptions","runningPseudoState","JobLogGrid_PlannedSchedule","columnWidthes","plannedSchedule","JobLogGrid_ResultLevel","JobLogGrid_ResultLevel_Running","JobLogGrid_ResultLevel_Unknown","JobLogGrid_ResultLevel_Ok","JobLogGrid_ResultLevel_Warning","JobLogGrid_ResultLevel_Error","JobLogGrid_RunBegin","runBegin","JobLogGrid_RunEnd","runEnd","JobLogGrid_Job","job","JobLogGrid_RunUser","runUser","JobLogGrid_RunComputer","runComputer","JobLogGrid_TechnicalError","technicalError","excecStateTemplate","TaskLogGrid_ExcecStateCell","execState","execStateLabel","TaskLogGrid_RunBegin","TaskLogGrid_RunEnd","TaskLogGrid_Task","task","TaskLogGrid_Module","module","TaskLogGrid_Responsible","responsible","TaskLogGrid_TaskState","taskState","TaskLogGrid_TaskState_Unknown","TaskLogGrid_TaskState_Due","TaskLogGrid_TaskState_Started","TaskLogGrid_TaskState_Completed","TaskLogGrid_RunAgent","runAgent","TaskLogGrid_RunUser","TaskLogGrid_ExecState","TaskLogGrid_ExecState_Aborted","TaskLogGrid_ExecState_ErrAddinInit","TaskLogGrid_ExecState_ErrAppRestart","TaskLogGrid_ExecState_ErrCodeExecError","TaskLogGrid_ExecState_ErrHolidayRead","TaskLogGrid_ExecState_ErrLogin","TaskLogGrid_ExecState_ErrNoExecuteRight","TaskLogGrid_ExecState_ErrNoLicence","TaskLogGrid_ExecState_ErrNoReadRight","TaskLogGrid_ExecState_ErrOpenDb","TaskLogGrid_ExecState_ErrTaskLogWrite","TaskLogGrid_ExecState_ModuleResultDelayedReSchedule","TaskLogGrid_ExecState_ModuleResultErr","TaskLogGrid_ExecState_ModuleResultOk","TaskLogGrid_ExecState_ModuleResultUnspecified","TaskLogGrid_ExecState_ModuleResultWarning","TaskLogGrid_ExecState_NotExecutedOnHoliday","TaskLogGrid_ExecState_NotExecutedOnNoHoliday","TaskLogGrid_ExecState_Provided","TaskLogGrid_ExecState_Unknown","JobLogGridModel","runningTimeout","TaskLogGridModel","JobLogFilterPicker","filterSettings","filterSettingsDict","TimeseriesDataGridModel","dateRangePickerModel","refreshData","force","dateChangedLoadDataHandler","StartDate","EndDate","TimeseriesDataGridView","dateChangedHandler","renderFinished","validateData","sheetRows","getRowData","getColumnConfig","spreadsheetOptions","sheetsbar","frozenRows","numberOfHeaderRows","frozenColumns","valueChanged","TimeseriesDataGrid","spreadsheet","kendoSpreadsheet","setCellEditability","validator","comparerType","messageTemplate","TimeseriesDataGrid_OnlyNumbers","activeSheet","arg","changedCellsBackground","getChangedCellsBackgroundColor","rgbColor","CiColor","timeResolution","Select","timezone","Distinct","Count","isDirty","TimeseriesDataGrid_SaveDialog","saveChangedData","saveRequest","getChangedData","notification","TimeseriesDataGrid_Notification_SaveData","TimeseriesDataGrid_Notification_SaveDataOK","TimeseriesDataGrid_Notification_SaveDataError","maxRows","headerRows","Timeseries","Any","tw","saveRequestData","fillChangedData","rowOffset","sheet","Hypothesis","hypothesis","rowIdx","rowDataIndex","colDataIndex","oldValue","cellIdentifier","getHeaderRows","cellBackgroundColor","defaultHeaderStyle","createHeaderRow","spreadsheetRow","unit","retArray","cellHighlightBackgroundColor","valueFormats","getValueFormats","Timezone","getFormatedDateForTimeResolution","n","retArr","places","decimalsPlaces","ToArray","TimeseriesGridHelper","dimensions","dim","TimeseriesGrid_Id","TimeseriesGrid_Name","TimeseriesGrid_AxisType","axisType","TimeseriesGrid_TimeAxisType_Vector","TimeseriesGrid_TimeAxisType_MatrixTimeTime","TimeseriesGrid_TimeAxisType_MatrixTimeTimeNumber","TimeseriesGrid_TimeAxisType_MatrixTimeTimeTime","ts","Keys","DimensionId","DescriptorId","TimeseriesGridModel","timeseriesLoader","timeseries","InteractiveItem","InteractiveItemController","configName","configPath","modify","renderInteractiveItems","itemsContainer","renderInteractionItemsContainer","interactiveItemModelOptions","interactiveItems","interactiveItemModelOptions_1","interactiveItemModelOption","configName_1","configPath_1","readConfig","interactiveItem","itemContainer","appendInteractiveItemContainer","InteractiveItemModel","createInteractiveItemInstance","LineInteractiveItemView","CircleInteractiveItemView","SpeedometerInteractiveItemView","changeSelectedRange","targetTimeResolution","interactiveitem","configValue","getDefaultDateForDay","tsValues","tsValue","loadData","loads","funcs","i_2","loadingProperty","valueProperty","tsValues_1","AggregationRule","aggregationRule","Key","convertKey","SourceTimeResolution","sourceTimeResolution","TargetTimeResolution","Unit","Absolute","absolute","baseKey","Value","getDefaultDateForMonth","InteractiveItemView","handleLoadingAnimation","setLoadingAnimation","setTemplateFromConfig","addClickAction","ConfigLauncherApp","getConfigFile","getStartDate","getEndDate","convertValue","InteractiveItemLine","InteractiveItemCircle","InteractiveItemSpeedometer","prozent","calculatingSpeedometerProzent","cutValue","beautifyUrl","configLoaded","timeaxis","begin","end","CustomConfigTsChartApp","ConfigurationErrorOverlay","CustomTimeseriesChartView","Job","JobStarterModel","jobId","jobNr","jobName","latestRunBegin","latestRunEnd","latestRunSchedule","latestRunResult","latestRunLogNr","configError","startStatus","loadJobInfo","updateLatestRun","onEnd","jobLogRequest","LatestRun","LatestRunByBegin","LatestRunIncludeRunning","FilterSettings","JobNrs","jobLogs","latestRun","resetStartStatus","Ids","jobs","PrimaryKey","JobId","JobStarterView","showTaskLog","tooltipPosition","Tile","activateLatestRunUpdate","lastRun","statusIcon","getStatusIconFromStatus","lastJobRunIcon","getLastJobRunStatus","tileModel","StatusTileModel","JobLogGrid_LastRun","tileView","StatusTileView","tile","jobStart","icons","getJobStatusTooltip","JobStarterConfigurationErrorOverlay","JobStarterLatestRunTooltip","planned","jobStatus","lastJobRunStatus","MiniProcessMonitoringApp","handleJobStartError","handler","JobStarterProcessMonitoringApp","datePickerContainer","processMonitoringGridContainer","datePickerModel","processMonitoringGrid","ProcessMonitoringGrid","dir","updateJobLog","RunBeginDynFrom","RunBeginDynTo","JobStarterProcessMonitoringGrid","jobLogGridContainer","taskLogGridContainer","jobLogLoader","JobLogLoader","jobLogGridModel","jobLogGridView","taskLogLoader","TaskLogLoader","taskLogGridModel","kendoSplitter","panes","collapsible","layoutChange","updateTaskLog","loadLogs","jobLogNr","JobLogNr","abortRequest","MapModel","MapView","mapModel","bingMapsKey","backgroundLayerType","minZoom","showResetZoomButton","showMapTypeButton","maxZoom","zoom","extent","markerCounter","ol","proj","transformExtent","transform","currentZoomLevel","resetZoomHandlers","layers","addBackgroundLayer","projection","attribution","control","Attribution","map","Map","controls","addCustomControl","resetZoomAndCenter","changeMapType","createTooltips","showChangeMapTypeMenu","dropdownMenu","layer","currentBackgroundLayerType","source","BingMaps","imagerySet","OSM","getLayers","setAt","createTooltip","getCoordinateWithOffset","xPixelOffset","yPixelOffset","coordinate","coord","pixelCoord","getPixelFromCoordinate","newPixelCoord","newCoord","getCoordinateFromPixel","beforeRender","resolution","getView","getResolution","pan","getCenter","setZoom","setCenter","onClick","titleArg","refreshAll","easing","inAndOut","transformedCoordinate","setZoomLevel","setCenterAndZoomAnimated","zoomOuter","newCenter","addOverlay","olOverlay","Overlay","positioning","addMarker","detail","marker","MapMarker","iconDetailLeft","iconDetailRight","tooltipDetailLeft","tooltipDetailRight","onClickMarker","onClickDetailLeft","onClickDetailRight","requestedType","Stamen","MapQuest","Menus","VerticalMenu","menuItems","selectedItem","routingParameter","routingHistory","documentTitleBase","autoSelect","updateMenuItemsDict","updateScroller","tooltipContent","highlightSelected","trySetSelectedItemFromUrlQuery","firstItem","menuItemsDict","selectedId","selectedLabel","onSelected","selected","getSelectedItem","filterOptions","operator","noResultsMessage","Where","q","$items","hit","VerticalMenuWrapper","CombinedVerticalMenuModel","CombinedVerticalMenuView","CombinedVerticalMenu","menuItem","_b","_c","setTarget","SearchMenuModel","SearchMenuView","SearchMenu","actionIcon","searchBox","navigationMenu","searchBoxModel","SearchBoxModel","SearchBoxView","facilitiesMenu","onChange","Panel","AccordionModel","AccordionView","Accordion","fieldTitles","kendoPanelBar","expandMode","getFields","accordionFields","fieldTitle","SearchBox_Search","SearchBox","clearButton","toggle","clearInput","timeOutHandler","keyup","TileStyle","TileSize","TileBaseModel","TileBaseView","TileListModel","tileAttributes","TileListView","createModel","createView","div","tileAttributes_1","tileAttribute","SimpleTileModel","SimpleTileView","SimpleTile","el_1","StatusTile","el_2","TimelineModel","TimelineView","timeline","kendoScheduler","startTime","majorTick","views","batch","transport","create","parameterMap","operation","meetingID","startTimezone","endTimezone","recurrenceId","recurrenceRule","recurrenceException","roomId","nullable","attendees","isAllDay","group","multiple","TimeseriesDataViews","TimeseriesDataChartViewHelper","getDefaultConfig","ordinal","opposite","CoalGray","followPointer","dateTimeLabelFormats","day","minute","WhiteSmoke","lineWidth","handles","area","stacking","verticalAlign","resetZoomButton","theme","TimeseriesDataChartView","chartMode","chartContainer","resetAxisExtrema","highchartsModel","highchartsView","updateChartData","timeseriesData","First","getTimeseriesSettings","currentTimestamp","getTime","lastValue","LastOrDefault","newData","getTimepointsExtrema","getDataExtrema","minTotal","MAX_VALUE","maxTotal","timeseries_1","multiply","MIN_VALUE","buffer","TimeseriesDataSpreadsheetView","onEdit","updatesSuspended","spreadsheetContainer","headerRow","synchronizeTimeseries","sheetRowCount","columnWidth","spreadSheet","sheetByIndex","dateValues","dateRange","valuesRange","fromCharCode","charCodeAt","addValidator","dirty","numberOfDataRows","numberOfDataColumns","suspendUpdates","backup","updateModel","forEachCell","cell","areTimeseriesFilled","areTimeseriesSynchroniezed","getSynchronizedTimeseriesData","getTimesereisDataForIndex","resultData","currentIndex","increment","timesseriesData","running","timeseries_2","timeserie","firstTimeserieDate","timeseries_3","TimeseriesDataViewModel","bindToLoader","convertChartData","getDataSaveEntities","TimeseriesDataView","exportFilename","enableDateSelection","defaultStartDate","defaultEndDate","maxDateRangeDays","datePicker","TimeseriesDataView_DatePicker_From","TimeseriesDataView_DatePicker_To","chartView","gridView","configureExcelMenu","all","switchToChart","switchToGrid","excel","TimeseriesDataView_Excel_EportToXls","TimeseriesDataView_Excel_EportToCsv","ulXls","createSubMenu","exportToExcel","ulCsv","exportToCsv","exportMethod","singleExportItem","TimeseriesDataView_Excel_Export","exportAllItem","TimeseriesDataView_Excel_ExportAll","allExportDefinitions","convertToChartData","buildFileName","Error_ExcelExport_MissingData","Error_ExcelExport_MissingData_Title","defs","viewData","TimeseriesStatusModel","valueDate","timespan","dynamic","NowTimeResolution","Offset","OffsetTimeResolution","ExcludeEndDate","timeresolution","datasourcetype","timeaxisids","TimeseriesStatusView","showTooltip","noValue","Silver","valueInterpretation","Green","OrangeRed","Red","TimeseriesStatus_Text","TimeseriesStatus_Circle","getStatus","getDisplayValue","getUnit","statusCss","setTooltipIfNeeded","TimeseriesStatus_Tooltip","popup","timeseriesValue","interpretations","Descriptors","DescriptorProvider","load","onLoadComplete","dimensionLoaded","dimensionId","this_2","EventDataLoader","onReady","ready","eventDataApi","eventDataSaveApi","updateItemsDict","loadItems","itemRequest","startupFailed","silent","abortDataRequest","dataRequest","processLoadedData","abortDataSaveRequest","dataSaveRequest","getMultiSaveRequestData","saveResult","EventDataSaveRequests","itemsDict","abortRequests","abort","parseData","Import","tryParseExcelDateTime","formats","Import_InvalidDateAt","localTimestamp","utcTimetamp","tryParseTime","time","Import_InvalidTimeAt","strTime","tryParseNumber","Import_InvalidNumberAt","tryParseDate","tryParseBoolean","Import_InvalidBooleanAt","readExcelFile","loaded","reader","FileReader","fileData","XLSX","w","byteLength","apply","Uint8Array","fix","Import_InvalidFile","SheetNames","Sheets","columnName","Import_MissingColumn","rawData","utils","sheet_to_row_object_array","parsedRow","cellName","cellValue","Import_MissingValueAt","readAsArrayBuffer","readCsvFile","firstDataRowIndex","encoding","readAsText","jobLog","PlannedSchedule","RunBegin","RunEnd","taskLogs","taskLog","TimeseriesDataLoaderBase","TimeseriesDataLoader","timeResolution2","startDate2","endDate2","requestApi","fillUpWithNullValues","abortLoadRequest","loadRequest","TimeseriesSimpleDefinitions","TimeResolution2","StartDate2","EndDate2","FillUpWithNullValues","abortSaveRequest","TimeseriesLoader","includeKeys","timeseriesApi","timeseriesInfoApi","loadDimensions","loadAll","IncludeKeys","loadByDescriptors","exactMatch","ExactMatch","abortTimeseriesRequest","timeseriesRequest","loadInfo","abortTimeseriesInfoRequest","timeseriesInfo","getAdditionalInfo","tsIds","anyMissing","timeseriesInfoCache","timeseriesInfoRequest","mainHeader","MainApp","apps","mainMenu","userMenu","simpleMenu","customItems","helpMenu","aboutAppName","About","DefaultHeader","started","setMenu","createMainMenu","mainMenuContainer","menuContainer","menu","getMenuDefinition","direction","handleMenuCloseEvent","handleMenuSelectEvent","handleMenuOpenEvent","updateTabindex","navigate","highlightMenuItemForRoute","appContainer","createBurgerMenu","getHelpMenuDefinition","getUserMenuDefinition","getBurgerMenuDefinition","dropDownContainer","burgerMenuContainer","createBurgerMenuList","screenHight","createUserMenuIcon","configureUserMenu","configureHelpMenu","highlightBurgerMenuItemForRoute","child","li","renderBurgerMenuItem","subUl","subChild","subLi","subSubUl","_d","_e","subSubChild","menuLayerUl","menuItemLi","urlAnchor","newWindow","removeAttribute","updateSubmenuOpenedFlag","updatePageTilte","pageTitleContainer","innerText","hrefParser","parents","registerRoutedApp","appRoute","startRoutedApp","userMenuContainer","stop","getUserName","onpopstate","menuDefinition","MenuItem","Logout","Help","Close","menuLabel","showAfter","RoutedAppHolder","forceNavigate","keepOpenOnSelected","highlightOnNavigate","visitChildren","visitor","includeSelf","definition","param","activeApp","RoutedApp","appClass","isSingleton","containerEmpty","backupPreviousApp","disposePreviousApp","tryRestoreApp","runningApp","startAppInternal","wOptions","min-width","min-height","singletonBackup","SingeltonRoutedApp","startInContainer","Starter","loadScript","main","fallback","fail","getScript","startup","ressourcesLocations","appStarted","startupError","globalSettingsLoaded","loadedRessourcesCount","nav","userLang","language","userLanguage","languages","cultureMap","de-DE","de","en-US","en","shortLanguage","getBrowserCulture","tryToStartApp","Preloadtransformations","preloadTransformationCombobox","PreloadTransformation_Combobox","currentFolder","serverSettings","PingInterval","PingTimeout","SecurityTokenServiceOAuthUrl","WelcomeMessage","LoginTheme","SessionTokenCookieName","CurrentUserCookieName","ApplicationName","ApplicationVersion","ApplicationCopyright","customConfig","CustomConfig","timezoneDefinitionMap","timezoneMapping","getMomentForTimezone","mesapTimezoneId","momentTimezone","tz","add","getFormatedDate","ticks","MomentDateFormat_DayWithHour","MomentDateFormat_OnlyDay","MomentDateFormat_OnlyMonth","MomentDateFormat_OnlyYear","Services","Cache","getSet","createFunction","getSetVolatile","isVolatile","ignoreOverflow","localCache","totalBytes","bytes","failed","webkitTemporaryStorage","requestQuota","storage_overflow_size","storageInfo","webkitStorageInfo","TEMPORARY","ex","getInteractiveDefinition","selectedComboboxId","chosenEntry","getTransformationDataEntry","retDefinition","entry","relevantSeriesIds","chartseriesids","relevantChartSeries","chartSerie","getFilterChartSeries","titlereplacer","entries","ComboboxTransformation","comboboxDomId","combobox","cacheId","selector","retInteractiveDefinition","PreloadTransformations"],"mappings":"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","file":"AppKitchen.UI.min.js","sourcesContent":["module AppKitchen {\r\n\r\n // ReSharper disable InconsistentNaming\r\n export class ObjIdentifier {\r\n DatabaseId: string;\r\n LastTimeUpdated: string;\r\n type: \"Inventory\" | \"Timeseries\";\r\n\r\n constructor(databaseId: string) {\r\n this.LastTimeUpdated = new Date(Date.now()).toISOString();\r\n this.DatabaseId = databaseId;\r\n }\r\n }\r\n\r\n export class TimeseriesIdentifier extends ObjIdentifier {\r\n TimeseriesId: string;\r\n\r\n constructor(databaseId: string, timeseriesId: string) {\r\n super(databaseId);\r\n this.TimeseriesId = timeseriesId;\r\n this.type = \"Timeseries\";\r\n }\r\n }\r\n\r\n export class InventoryIdentifier extends ObjIdentifier {\r\n InventoryId: string;\r\n\r\n constructor(databaseId: string, inventoryId: string)\r\n {\r\n super(databaseId);\r\n this.InventoryId = inventoryId;\r\n this.type = \"Inventory\";\r\n }\r\n }\r\n\r\n export class ActionHolder {\r\n identifier: InventoryIdentifier | TimeseriesIdentifier;\r\n action: () => void;\r\n\r\n constructor(inventoryIdentifier: InventoryIdentifier | TimeseriesIdentifier, action: () => void) {\r\n this.identifier = inventoryIdentifier;\r\n this.action = action;\r\n }\r\n }\r\n // ReSharper enable InconsistentNaming\r\n\r\n\r\n export class ChangeManager {\r\n\r\n static pollIntervalMs = 5000;\r\n static trackNumber = 0;\r\n static trackNumber2action: { [trackNumber: number]: ActionHolder; } = {};\r\n\r\n public static onInventoryChanged(databaseId: string, inventoryId: string, action: () => void) {\r\n this.trackNumber2action[this.trackNumber] = new ActionHolder(new InventoryIdentifier(databaseId, inventoryId), action);\r\n return this.trackNumber++;\r\n }\r\n\r\n public static onTimeseriesChanged(databaseId: string, timeseriesId: string, action: () => void) {\r\n this.trackNumber2action[this.trackNumber] = new ActionHolder(new TimeseriesIdentifier(databaseId, timeseriesId), action);\r\n return this.trackNumber++;\r\n }\r\n\r\n static removeChangeListener(trackNumber: number) {\r\n delete this.trackNumber2action[trackNumber];\r\n }\r\n\r\n static getAllInventoryIdentifiers() {\r\n return this.getAllIIdentifiers(\"Inventory\");\r\n }\r\n\r\n static getAllTimeseriesIdentifiers() {\r\n return this.getAllIIdentifiers(\"Timeseries\");\r\n }\r\n\r\n static getAllIIdentifiers(type: string) {\r\n var allInventories: ObjIdentifier[] = [];\r\n for (var i = 0; i < this.trackNumber; i++) {\r\n var actionHolder = this.trackNumber2action[i];\r\n if (actionHolder && actionHolder.identifier.type === type) {\r\n allInventories.push(actionHolder.identifier);\r\n }\r\n }\r\n return allInventories;\r\n }\r\n\r\n static inventoryHasChanged(inventoryIdentifier: InventoryIdentifier) {\r\n for (var i = 0; i < this.trackNumber; i++) {\r\n var actionHolder = this.trackNumber2action[i];\r\n\r\n\r\n if (actionHolder && actionHolder.identifier.type === \"Inventory\") {\r\n var identifier = actionHolder.identifier;\r\n\r\n if ((identifier.DatabaseId === inventoryIdentifier.DatabaseId || identifier.DatabaseId == null)\r\n && identifier.InventoryId === inventoryIdentifier.InventoryId) {\r\n identifier.LastTimeUpdated = new Date(Date.now()).toISOString();\r\n actionHolder.action();\r\n }\r\n }\r\n }\r\n }\r\n\r\n static timeseriesHasChanged(timeseriesIdentifier: TimeseriesIdentifier) {\r\n for (var i = 0; i < this.trackNumber; i++) {\r\n var actionHolder = this.trackNumber2action[i];\r\n\r\n\r\n if (actionHolder && actionHolder.identifier.type === \"Timeseries\") {\r\n var identifier = actionHolder.identifier;\r\n\r\n if ((identifier.DatabaseId === timeseriesIdentifier.DatabaseId || identifier.DatabaseId == null)\r\n && identifier.TimeseriesId === timeseriesIdentifier.TimeseriesId) {\r\n identifier.LastTimeUpdated = new Date(Date.now()).toISOString();\r\n actionHolder.action();\r\n }\r\n }\r\n }\r\n }\r\n\r\n static processResult(result: any) {\r\n window.setTimeout(this.checkForUpdates.bind(this), this.pollIntervalMs);\r\n\r\n if (result.InventoryIdentifiers) {\r\n result.InventoryIdentifiers.forEach(i => {\r\n if (i.HasChanged) {\r\n this.inventoryHasChanged(i);\r\n }\r\n });\r\n }\r\n\r\n if (result.TimeseriesIdentifiers) {\r\n result.TimeseriesIdentifiers.forEach(i => {\r\n if (i.HasChanged) {\r\n this.timeseriesHasChanged(i);\r\n }\r\n });\r\n }\r\n }\r\n\r\n static checkForUpdates() {\r\n var allInventories = this.getAllInventoryIdentifiers();\r\n var allTimeseries = this.getAllTimeseriesIdentifiers();\r\n if (allInventories.length > 0 || allTimeseries.length > 0) {\r\n AppKitchen.Data.getDataApi(\"HasChange\", { InventoryIdentifiers: allInventories, TimeseriesIdentifiers: allTimeseries }, this.processResult.bind(this));\r\n } else {\r\n window.setTimeout(this.checkForUpdates.bind(this), this.pollIntervalMs);\r\n }\r\n }\r\n\r\n static checkingForUpdates: boolean = false;\r\n public static startCheckForUpdates() {\r\n if (this.checkingForUpdates)\r\n {\r\n return;\r\n }\r\n this.checkForUpdates();\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n export class ChangeManagerWithWebSockets extends ChangeManager {\r\n static webSocket: WebSocket;\r\n\r\n public static onInventoryChanged(databaseId: string, inventoryId: string, action: () => void) {\r\n this.trackNumber2action[this.trackNumber] = new ActionHolder(new InventoryIdentifier(databaseId, inventoryId), action);\r\n this.webSocket.send(JSON.stringify({ DatabaseId: databaseId, Id: inventoryId, ObjectType: 0, SessionToken: Data.getToken() }));\r\n return this.trackNumber++;\r\n }\r\n\r\n static checkForUpdates() {\r\n this.webSocket = new WebSocket(\"ws://\" + window.location.hostname + \"/Appkitchen.UI/api/Notification\");\r\n\r\n this.webSocket.onmessage = evt => {\r\n var changeMessage = JSON.parse(evt.data);\r\n if (changeMessage.ObjectType === 0) {\r\n this.inventoryHasChanged(new InventoryIdentifier(changeMessage.DatabaseId, changeMessage.Id));\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n}","/// \r\n/// \r\n/// \r\n/// \r\n\r\nmodule AppKitchen {\r\n export module Data {\r\n var documentMap: { [documentId: string]: any } = [];\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface LoadOptionsBase {\r\n api?: string;\r\n silent?: boolean;\r\n success?: Function;\r\n error?: Function;\r\n }\r\n\r\n var apiUrl: string;\r\n var appKitchenApiUrl: string;\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export function setAPIs(url: string, appKitchenUrl: string) {\r\n apiUrl = url;\r\n appKitchenApiUrl = appKitchenUrl;\r\n AppKitchen.Data.init();\r\n }\r\n\r\n //For the strict, full datetime, including milliseconds, per the W3C's take on the spec.:\r\n // and additional variations allowed by the actual ISO 8601:2004(E) doc\r\n // https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime\r\n var reDate = /^((\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+)|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d)|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d))$/;\r\n\r\n function convertJsonDates(value, index, parent) {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (typeof value === \"string\" && reDate.test(value)) {\r\n if (parent)\r\n parent[index] = parseDateString(value);\r\n else\r\n return parseDateString(value);\r\n } else if (value instanceof Array) {\r\n for (var i = 0; i < value.length; i++)\r\n convertJsonDates(value[i], i, value);\r\n } else if (value instanceof Object) {\r\n for (var p in value)\r\n if (value.hasOwnProperty(p))\r\n convertJsonDates(value[p], p, value);\r\n }\r\n return parent || value;\r\n }\r\n\r\n function parseDateString(dateString: string): Date {\r\n const parsedWithMoment = moment(dateString);\r\n return parsedWithMoment.toDate();\r\n }\r\n\r\n export function init() {\r\n $.ajaxSetup({\r\n beforeSend: request => request.setRequestHeader(\"MesapAuthorization\", AppKitchen.Data.getToken()),\r\n converters: {\r\n \"text json\"(json) {\r\n return convertJsonDates($.parseJSON(json), null, null);\r\n }\r\n }\r\n });\r\n }\r\n\r\n export function getToken(): string {\r\n return Cookies.get(AppKitchen.GlobalSettings.sessionTokenCookieName);\r\n }\r\n\r\n export function ping(timeout: number, success: (result: boolean) => void, error: () => void): void {\r\n AppKitchen.Data.init();\r\n $.ajax({\r\n type: \"GET\",\r\n url: appKitchenApiUrl + \"/ping\",\r\n success: success,\r\n error: (e) => {\r\n if (e.status !== 200) {\r\n AppKitchen.logInfo(\"SessionToken '\" + AppKitchen.Data.getToken() + \"' is invalid\");\r\n error();\r\n }\r\n },\r\n cache: false,\r\n timeout: timeout\r\n });\r\n }\r\n\r\n export function getDataInternal(method: string, apiNameWithUrl: string, requestData: any, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return $.ajax({\r\n dataType: \"json\",\r\n type: method,\r\n url: apiNameWithUrl,\r\n data: requestData,\r\n success: callback,\r\n error: (xhr: JQueryXHR, textStatus: string, errorThrown: string) => {\r\n if (textStatus === \"abort\")\r\n return; // do not callback on abort\r\n AppKitchen.handleError(xhr, textStatus, textStatus, errorCallback != null);\r\n if (errorCallback) {\r\n errorCallback(requestData, xhr, textStatus, errorThrown);\r\n }\r\n },\r\n cache: false\r\n });\r\n }\r\n\r\n export function getDataApiUrl(apiName: string) {\r\n return appKitchenApiUrl + \"/\" + apiName;\r\n }\r\n\r\n export function getDataApi(apiName: string, requestData: any, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return getDataInternal(\"POST\",appKitchenApiUrl + \"/\" + apiName, requestData, callback, errorCallback);\r\n }\r\n\r\n export function getDataByGetRequestApi(apiName: string, requestData: any, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return getDataInternal(\"GET\", appKitchenApiUrl + \"/\" + apiName, requestData, callback, errorCallback);\r\n }\r\n\r\n export function getData(apiName: string, requestData: any, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return getDataInternal(\"POST\", apiUrl + \"/\" + apiName, requestData, callback, errorCallback);\r\n }\r\n\r\n export function getDataByGetRequest(apiName: string, requestData: any, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return getDataInternal(\"GET\", apiUrl + \"/\" + apiName, requestData, callback, errorCallback);\r\n }\r\n\r\n export function getDocument(documentName: string, documentType: string, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return getDataInternal(\"GET\", apiUrl + \"/Document\", { filename: documentName, type: documentType }, callback, errorCallback);\r\n }\r\n\r\n export function getDocumentCached(documentName: string, documentType: string, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n var documentId = documentType + \"__\" + documentName;\r\n\r\n if (documentMap[documentId]) {\r\n window.setTimeout(() => callback(documentMap[documentId]), 1);\r\n } else {\r\n return this.getDataInternal(\"GET\",apiUrl + \"/Document\",{ filename: documentName, type: documentType },documentData => {\r\n documentMap[documentId] = documentData;\r\n callback(documentData);\r\n },\r\n errorCallback);\r\n } \r\n }\r\n\r\n\r\n export module UrlHelper {\r\n export function getEventBinaryUrl(inventoryId: string, itemId: string, eventId: string, databaseId?: string) {\r\n var inventoryPart = \"inventoryId=\" + encodeURIComponent(inventoryId);\r\n var fieldIdPart = \"itemId=\" + encodeURIComponent(itemId);\r\n var idPart = \"eventId=\" + encodeURIComponent(eventId);\r\n var databaseIdPart = \"\";\r\n if (databaseId) {\r\n databaseIdPart = \"&databaseId=\" + encodeURIComponent(databaseId);\r\n }\r\n return appKitchenApiUrl + \"/EventBinary?\" + inventoryPart + \"&\" + fieldIdPart + \"&\" + idPart + databaseIdPart + \"&token=\" + AppKitchen.Data.getToken();\r\n }\r\n\r\n export function getIconUrl(iconId: string, databaseId?: string) {\r\n return appKitchenApiUrl + \"/IconFile?\" + \"id=\" + encodeURIComponent(iconId) + (databaseId ? \"&databaseId=\" + encodeURIComponent(databaseId) : \"\") + \"&token=\" + AppKitchen.Data.getToken();\r\n }\r\n }\r\n\r\n export module Api {\r\n import EventDataRequest = AppKitchen.Api.Models.EventDataRequest;\r\n import EventDataSaveRequest = AppKitchen.Api.Models.EventDataSaveRequest;\r\n import EventItemInfo = AppKitchen.Api.Models.EventItemInfo\r\n import EventDeleteRequest = AppKitchen.Api.Models.EventDeleteRequest;\r\n import UserInfo = AppKitchen.Api.Models.UserInfo;\r\n import PasswordChangeRequest = AppKitchen.Api.Models.PasswordChangeRequest;\r\n import PasswordChangeResult = AppKitchen.Api.Models.PasswordChangeResult;\r\n import JobLogRequest = AppKitchen.Api.Models.JobLogRequest;\r\n import TaskLogRequest = AppKitchen.Api.Models.TaskLogRequest;\r\n import JobLogFilterRequest = AppKitchen.Api.Models.JobLogFilterRequest;\r\n import JobRequest = AppKitchen.Api.Models.JobRequest;\r\n import Job = AppKitchen.Api.Models.Job;\r\n import HypothesisRequest = AppKitchen.Api.Models.HypothesisRequest;\r\n import Hypothesis = AppKitchen.Api.Models.Hypothesis;\r\n import AboutInfo = AppKitchen.Api.Models.AboutInfo;\r\n import JobStartRequest = AppKitchen.Api.Models.JobStartRequest;\r\n import DescriptorRequest = AppKitchen.Api.Models.DescriptorRequest;\r\n import DimensionRequest = AppKitchen.Api.Models.DimensionRequest;\r\n import Descriptor = AppKitchen.Api.Models.Descriptor;\r\n import Dimension = AppKitchen.Api.Models.Dimension;\r\n import EventInventoryRequest = AppKitchen.Api.Models.EventInventoryRequest;\r\n import EventInventory = AppKitchen.Api.Models.EventInventory;\r\n import GlobalSettings = AppKitchen.Api.Models.GlobalSettings;\r\n import JobLogFilter = AppKitchen.Api.Models.JobLogFilter;\r\n import JobLog = AppKitchen.Api.Models.JobLog;\r\n import TaskLog = AppKitchen.Api.Models.TaskLog;\r\n import EventDataMultiSaveRequest = AppKitchen.Api.Models.EventDataMultiSaveRequest;\r\n import TimeseriesRequest = AppKitchen.Api.Models.TimeseriesRequest;\r\n import Timeseries = AppKitchen.Api.Models.Timeseries;\r\n import TimeseriesInfoRequest = AppKitchen.Api.Models.TimeseriesInfoRequest;\r\n import TimeseriesDataSimpleRequest = AppKitchen.Api.Models.TimeseriesSimpleDataRequest;\r\n import TimeseriesDataSaveRequest = AppKitchen.Api.Models.TimeseriesDataSaveRequest;\r\n \r\n import TimeseriesInfo = AppKitchen.Api.Models.TimeseriesInfo;\r\n import ChartData = AppKitchen.Data.TimeSeries.Model.ChartData;\r\n import TextPoolItemRequest = AppKitchen.Api.Models.TextPoolItemRequest;\r\n import TextPoolItem = AppKitchen.Api.Models.TextPoolItem;\r\n import TreeRequest = AppKitchen.Api.Models.TreeRequest;\r\n import Tree = AppKitchen.Api.Models.Tree;\r\n import UserInfoUpdateRequest = AppKitchen.Api.Models.UserInfoUpdateRequest;\r\n import UserInfoUpdateResult = AppKitchen.Api.Models.UserInfoUpdateResult;\r\n\r\n export function getTextPoolItems(request: TextPoolItemRequest, callback: (result: TextPoolItem[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"TextPoolItems\", request, callback, errorCallback);\r\n }\r\n\r\n export function getGlobalSettings(callback: (result: GlobalSettings) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataByGetRequest(\"globalsettings\", null, callback, errorCallback);\r\n }\r\n\r\n export function getEventInventories(request: EventInventoryRequest, callback: (result: EventInventory[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"EventInventories\", request, callback, errorCallback);\r\n }\r\n\r\n export function getEventItemInfos(request: EventDataRequest, callback: (result: EventItemInfo[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"EventItems\", request, callback, errorCallback);\r\n }\r\n\r\n export function getEventData(request: EventDataRequest, callback: (result: { [key: string]: any }[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"EventData\", request, callback, errorCallback);\r\n }\r\n\r\n export function getTimeseries(request: TimeseriesRequest, callback: (result: Timeseries[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"Timeseries\", request, callback, errorCallback);\r\n }\r\n\r\n export function getTimeseriesInfo(request: TimeseriesInfoRequest, callback: (result: TimeseriesInfo[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"TimeseriesInfo\", request, callback, errorCallback);\r\n }\r\n\r\n export function getTimeseriesData(request: TimeseriesDataSimpleRequest, callback: (result: ChartData[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"TimeseriesDataSimple\", request, callback, errorCallback);\r\n }\r\n\r\n export function updateTimeseriesData(request: TimeseriesDataSaveRequest, callback: (result: boolean) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"TimeseriesDataSave\", request, callback, errorCallback);\r\n }\r\n\r\n export function getJobLog(request: JobLogRequest, callback: (result: JobLog[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"JobLog\", request, callback, errorCallback);\r\n }\r\n\r\n export function startJob(request: JobStartRequest, callback: (result: boolean) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"JobStart\", request, callback, errorCallback);\r\n }\r\n\r\n export function getTaskLog(request: TaskLogRequest, callback: (result: TaskLog[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"TaskLog\", request, callback, errorCallback);\r\n }\r\n\r\n export function getJobLogFilters(request: JobLogFilterRequest, callback: (result: JobLogFilter[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"JobLogFilter\", request, callback, errorCallback);\r\n }\r\n\r\n export function getJobs(request: JobRequest, callback: (result: Job[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"Job\", request, callback, errorCallback);\r\n }\r\n\r\n export function getHypotheses(request: HypothesisRequest, callback: (result: Hypothesis[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"Hypotheses\", request, callback, errorCallback);\r\n }\r\n\r\n export function updateEventData(request: EventDataSaveRequest, callback: (result?: string) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"EventDataSave\", request, callback, errorCallback);\r\n }\r\n\r\n export function updateEventMultiData(request: { EventDataSaveRequests: EventDataSaveRequest[]}, callback: (result?: string) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"EventDataMultiSave\", request, callback, errorCallback);\r\n }\r\n\r\n export function deleteEventData(request: EventDeleteRequest, callback: (result: boolean) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getData(\"EventDelete\", request, callback, errorCallback);\r\n }\r\n\r\n export function getDimensions(request: DimensionRequest, callback: (result: Dimension[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"Dimensions\", request, callback, errorCallback);\r\n }\r\n\r\n export function getDescriptors(request: DescriptorRequest, callback: (result: Descriptor[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"Descriptors\", request, callback, errorCallback);\r\n }\r\n\r\n export function getTrees(request: TreeRequest, callback: (result: Tree[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"Trees\", request, callback, errorCallback);\r\n }\r\n\r\n export function getUserInfo(callback: (result: UserInfo) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"UserInfo\", {}, callback, errorCallback);\r\n }\r\n\r\n export function updateUserInfo(request: UserInfoUpdateRequest, callback: (result: UserInfoUpdateResult) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"UserInfoUpdate\", request, callback, errorCallback);\r\n }\r\n\r\n export function changePassword(passwordChangeRequest: PasswordChangeRequest, callback: (result: PasswordChangeResult) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"PasswordChange\", passwordChangeRequest, callback, errorCallback);\r\n }\r\n\r\n export function getAboutInfo(callback: (result: AboutInfo) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataByGetRequestApi(\"About\", {}, callback, errorCallback);\r\n }\r\n\r\n export function getUserRoles(callback: (result: string[]) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataApi(\"UserRole\", {}, callback, errorCallback);\r\n }\r\n\r\n export function getIconBase64(iconId: string, callback: (iconBase64: string) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return AppKitchen.Data.getDataByGetRequestApi(\"IconBase64\", { id: iconId }, callback, errorCallback);\r\n }\r\n\r\n }\r\n\r\n }\r\n}\r\n","declare function escape(s: string): string;\r\n\r\nmodule AppKitchen {\r\n export module LoginManager {\r\n\r\n var loginEnsured = false;\r\n var intervalId = -1;\r\n\r\n function getParameterFromQueryString(key: string, queryString: string): string {\r\n var queries = queryString.split(\"&\");\r\n for (var i = 0; i < queries.length; i++) {\r\n if (queries[i].indexOf(key) === 0 && queries[i][key.length] === \"=\") {\r\n return queries[i].substr(key.length + 1);\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n function redirectToOAuth(logout: boolean): void {\r\n var tokenUrl = getOAuthUrl(logout);\r\n Cookies.remove(AppKitchen.GlobalSettings.sessionTokenCookieName);\r\n Cookies.remove(AppKitchen.GlobalSettings.currentUserCookieName);\r\n AppKitchen.BrowserHelper.setUrl(tokenUrl, {refresh: true, push: false});\r\n }\r\n\r\n function getOAuthUrl(logout: boolean) {\r\n var tokenserviceUrl = AppKitchen.GlobalSettings.securityTokenServiceOAuthUrl;\r\n var welcomeMessage = AppKitchen.GlobalSettings.welcomeMessage;\r\n var loginTheme = AppKitchen.GlobalSettings.loginTheme;\r\n var tokenUrl = tokenserviceUrl + \"?returnurl=\" + encodeURIComponent(document.location.href) + (loginTheme ? \"&theme=\" + loginTheme : \"\") + (logout ? \"&donotlogin=true\" : \"\") + (welcomeMessage ? \"&message=\"+welcomeMessage : \"\");\r\n return tokenUrl;\r\n }\r\n\r\n function ensureLoginAndStart(start: () => void) {\r\n var claim = AppKitchen.BrowserHelper.UrlQuery.getParameter(\"claim\");\r\n if (claim) {\r\n var claimString = window.atob(claim);\r\n var sessionToken = getParameterFromQueryString(\"token\", claimString);\r\n var username = decodeURIComponent(escape(getParameterFromQueryString(\"username\", claimString)));\r\n if (sessionToken && username) {\r\n Cookies.set(AppKitchen.GlobalSettings.sessionTokenCookieName, sessionToken);\r\n Cookies.set(AppKitchen.GlobalSettings.currentUserCookieName, username);\r\n }\r\n\r\n // remove claim from url and redirect\r\n AppKitchen.BrowserHelper.UrlQuery.removeParameter(\"claim\", { refresh: true, push: false });\r\n } else {\r\n\r\n if (!AppKitchen.Data.getToken()) {\r\n redirectToOAuth(false);\r\n return;\r\n }\r\n\r\n AppKitchen.Data.ping(AppKitchen.GlobalSettings.pingTimeout * 1000, (result) => {\r\n if (result) {\r\n intervalId = window.setInterval(() => AppKitchen.Data.ping(AppKitchen.GlobalSettings.pingTimeout * 1000,() => {},() => { redirectToOAuth(false); }),AppKitchen.GlobalSettings.pingInterval * 1000);\r\n loginEnsured = true;\r\n start();\r\n } else {\r\n redirectToOAuth(false);\r\n }\r\n }, () => {\r\n AppKitchen.UIHelper.renderTemplateTo($(\"body\")[0],AppKitchen.Templates.OAuthLink,{ href: getOAuthUrl(false) });\r\n //redirectToOAuth(false);\r\n });\r\n\r\n }\r\n }\r\n\r\n export function ensureLogin(start: () => void) {\r\n if (loginEnsured) {\r\n start();\r\n } else {\r\n ensureLoginAndStart(start);\r\n }\r\n }\r\n\r\n export function logout(redirect: boolean) {\r\n // clear cookies\r\n Cookies.remove(AppKitchen.GlobalSettings.sessionTokenCookieName);\r\n Cookies.remove(AppKitchen.GlobalSettings.currentUserCookieName);\r\n\r\n // stop interval checker\r\n if (intervalId !== -1) {\r\n window.clearInterval(intervalId);\r\n }\r\n\r\n loginEnsured = false;\r\n\r\n if (redirect) {\r\n redirectToOAuth(true);\r\n }\r\n }\r\n\r\n export function getCurrentUser(): string {\r\n if (loginEnsured) {\r\n var user = Cookies.get(AppKitchen.GlobalSettings.currentUserCookieName);\r\n if (user) {\r\n return user;\r\n }\r\n }\r\n return \"-\";\r\n }\r\n }\r\n}","/// \r\n/// \r\n/// \r\n/// \r\n/// \r\n\r\nmodule AppKitchen {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export var NotificationHelper: ChangeManager;\r\n\r\n export module GlobalSettings {\r\n export var currentUserCookieName: string;\r\n export var sessionTokenCookieName: string;\r\n export var securityTokenServiceOAuthUrl: string;\r\n export var pingInterval: number;\r\n export var pingTimeout: number;\r\n export var culture: string;\r\n export var loginTheme: string;\r\n export var welcomeMessage: string;\r\n export var applicationName: string;\r\n export var applicationVersion: string;\r\n export var applicationCopyright: string;\r\n export var customConfig: any;\r\n export var devMode: boolean;\r\n }\r\n\r\n export module Templates {\r\n \r\n }\r\n\r\n export module Data {\r\n\r\n }\r\n\r\n export module Controls {\r\n\r\n }\r\n\r\n var router: Backbone.Router;\r\n export function getRouter() {\r\n if (!router) {\r\n router = new Backbone.Router();\r\n }\r\n return router;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface AppBaseOptions {\r\n title?: string;\r\n requiresLogin?: boolean;\r\n parent?: AppBase;\r\n }\r\n\r\n export interface IAppBase {\r\n new (targetContainer: HTMLElement, options: TAppOptions): AppBase;\r\n }\r\n\r\n /**\r\n * The base class for creating Apps. Optionally ensures Mesap login\r\n */\r\n export abstract class AppBase {\r\n $el: JQuery;\r\n el: HTMLElement;\r\n options: TAppOptions;\r\n\r\n /**\r\n * @param {HTMLElement} targetContainer - Target HTML container for the App\r\n * @param {TAppOptions} options - App options\r\n */\r\n constructor(targetContainer: HTMLElement, options: TAppOptions) {\r\n this.options = AppKitchen.OptionsHelper.merge(options as TAppOptions, {\r\n requiresLogin: true\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(this.options, this.defaultOptions());\r\n\r\n this.el = targetContainer;\r\n this.$el = $(targetContainer);\r\n\r\n AppKitchen.Data.init();\r\n\r\n if (this.options.requiresLogin) {\r\n AppKitchen.LoginManager.ensureLogin(() => this.start());\r\n } else {\r\n this.start();\r\n }\r\n }\r\n\r\n /**\r\n * Starts the App\r\n */\r\n abstract start(): void;\r\n\r\n /**\r\n * Defines the default App options. To be overridden in derivates\r\n * @returns Default App options\r\n */\r\n defaultOptions(): TAppOptions {\r\n return {};\r\n }\r\n\r\n /**\r\n * Suspends the App. Is called e.g. for singleton Apps. To be overridden in derivates\r\n */\r\n suspend(): void {\r\n \r\n }\r\n\r\n /**\r\n * Contiunes the App. Is called e.g. for singleton Apps. To be overridden in derivates\r\n */\r\n continue(): void {\r\n\r\n }\r\n\r\n /**\r\n * Disposes the App. Is called e.g. when navigating away from routed Apps. To be overridden in derivates\r\n */\r\n dispose(): void {\r\n\r\n }\r\n\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface SetAttributeOptions {\r\n silent?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ModelBaseAttributes {\r\n loading?: boolean;\r\n }\r\n\r\n /**\r\n * The base class for Models, should be extended using an Interface describing the Model attribues\r\n */\r\n export class ModelBase extends Backbone.Model {\r\n\r\n /**\r\n * @param {TAttributes} attributes? - Initial Model attribute values\r\n */\r\n constructor(attributes?: TAttributes) {\r\n super(attributes);\r\n }\r\n\r\n /**\r\n * Sets model attribute values\r\n * @param {TAttributes} attributes - Attribute values to be set\r\n * @param {SetAttributeOptions} options? - Set attribute options\r\n */\r\n set(attributes: TAttributes | any, options?: SetAttributeOptions) {\r\n super.set(attributes, options);\r\n }\r\n\r\n /**\r\n * Gets model attributes\r\n * @param {string} attribute? - [Only for compatibility with Backbone] Attribute name\r\n * @return Model attribute values\r\n */\r\n get(attribute?: string): TAttributes {\r\n if (attribute) {\r\n return super.get(attribute);\r\n }\r\n return (this).attributes;\r\n }\r\n\r\n bind(event: string, callback: (model: ModelBase) => void, context?: any) {\r\n super.bind(event, callback, context);\r\n }\r\n\r\n on(event: string, callback: (model: ModelBase) => void, context?: any) {\r\n super.on(event, callback, context);\r\n }\r\n\r\n getPrevious(): TAttributes {\r\n return (this).previousAttributes();\r\n }\r\n }\r\n\r\n export class CollectionBase> extends Backbone.Collection {\r\n \r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ViewBaseOptions {\r\n loadingOverlay?: string;\r\n }\r\n\r\n /**\r\n * The base class for Views, should be extended using an Class Type extending ModelBase\r\n */\r\n export class ViewBase> extends Backbone.View {\r\n model: TModel;\r\n template: (data: any) => string;\r\n loadingOverlay: JQuery;\r\n\r\n options: ViewBaseOptions;\r\n /**\r\n * @param {TModel} model - Model for the View or ViewModel\r\n * @param {HTMLElement} targetContainer - Target HTML container for the View\r\n * @param {ViewBaseOptions} options - View options\r\n */\r\n constructor(model: TModel, targetContainer: HTMLElement, options?: ViewBaseOptions) {\r\n super({\r\n model: model,\r\n el: targetContainer\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n loadingOverlay: AppKitchen.UIHelper.renderTemplate(`
${AppKitchen.Templates.LoadingConcentricSpinner}
`, { size: \"M\" })\r\n });\r\n\r\n this.loadingOverlay = $([]);\r\n\r\n if (this.model.get().loading) {\r\n this.refreshLoadingOverlay();\r\n }\r\n this.model.bind(\"change:loading\", () => this.refreshLoadingOverlay());\r\n }\r\n\r\n private refreshLoadingOverlay() {\r\n if (this.model.get().loading) {\r\n\r\n if (this.$el.css(\"position\") === \"static\") {\r\n this.$el.css(\"position\", \"relative\");\r\n }\r\n if (this.$el.has(this.loadingOverlay[0]).length === 0) {\r\n this.loadingOverlay = $(this.options.loadingOverlay).appendTo(this.$el);\r\n }\r\n this.loadingOverlay.css(\"display\", \"block\");\r\n this.loadingOverlay.css(\"opacity\");\r\n this.loadingOverlay.addClass(\"a-visible\");\r\n\r\n } else {\r\n\r\n if (this.loadingOverlay.length === 0)\r\n return;\r\n\r\n this.loadingOverlay.css(\"opacity\");\r\n this.loadingOverlay.removeClass(\"a-visible\");\r\n setTimeout(() => {\r\n if (this.loadingOverlay.css(\"opacity\") === \"0\") {\r\n this.loadingOverlay.css(\"display\", \"none\");\r\n }\r\n }, 500);\r\n\r\n }\r\n }\r\n\r\n protected setTemplate(template: string) {\r\n this.template = _.template(template);\r\n }\r\n\r\n protected renderTemplate(data: any) {\r\n this.$el.html(this.template(data));\r\n this.refreshLoadingOverlay();\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CollectionViewBaseOptions {\r\n\r\n }\r\n\r\n export class CollectionViewBase>> extends Backbone.View {\r\n collection: TCollection;\r\n options: CollectionViewBaseOptions;\r\n\r\n constructor(collection: TCollection, targetContainer: HTMLElement, options?: CollectionViewBaseOptions) {\r\n super({\r\n collection: collection,\r\n el: targetContainer\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n // default options here\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ConfigDocumentBase {\r\n documenttype: string;\r\n minHeight?: number;\r\n minWidth?: number;\r\n content: any;\r\n }\r\n\r\n export function handleError(xhr: JQueryXHR, statusText: string, errorText: string, hideErrorPopup?: boolean) {\r\n if (xhr.statusText === \"APPKITCHEN_ERROR\") {\r\n logError(\"AppKitchen Error: \" + xhr.responseText);\r\n } else {\r\n logError(\"Error (\" + status + \") occured:\\n\" + errorText + \"\\n\\nDetails:\\n\" + xhr.responseText);\r\n if (!hideErrorPopup) {\r\n AppKitchen.UIHelper.DialogBoxes.alert(AppKitchen.Strings.Messages_ErrorOccured);\r\n }\r\n }\r\n }\r\n\r\n export function log(message: string) {\r\n if (console) {\r\n console.log(message);\r\n }\r\n }\r\n\r\n export function logError(message: string) {\r\n if (console) {\r\n console.error(message);\r\n }\r\n }\r\n\r\n export function logInfo(message: string) {\r\n if (console) {\r\n console.info(message);\r\n }\r\n }\r\n\r\n export function logWarning(message: string) {\r\n if (console) {\r\n console.warn(message);\r\n }\r\n }\r\n\r\n}\r\n\r\n","///\r\n\r\nmodule AppKitchen {\r\n\r\n export module Apps {\r\n\r\n export class CreditsApp extends AppKitchen.AppBase {\r\n start() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.AboutWindow,\r\n {\r\n applicationName: AppKitchen.GlobalSettings.applicationName,\r\n applicationVersion: AppKitchen.GlobalSettings.applicationVersion,\r\n copyrightInfo: AppKitchen.GlobalSettings.applicationCopyright\r\n });\r\n\r\n AppKitchen.Data.Api.getAboutInfo(aboutInfo => {\r\n AppKitchen.UIHelper.renderTemplateTo(this.$el.find(\".a-about-window-infos\")[0], AppKitchen.Templates.AboutWindow_Info, aboutInfo);\r\n AppKitchen.UIHelper.Scrolling.customScroller(this.$el.find(\".a-about-window-infos > .content-scroll\")[0]);\r\n this.$el.find(\"a[data-license]\").each((i, e) => {\r\n var licenseFile = \"Licenses/\" + $(e).attr(\"data-license\") + \".html\";\r\n $.ajax({\r\n url: licenseFile,\r\n success: licence => {\r\n $(e).kendoTooltip({\r\n position: \"left\",\r\n content: `
${licence}
`,\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n }\r\n}","/// \r\n/// \r\n\r\nmodule AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Charts {\r\n\r\n export module HighchartsHelper {\r\n\r\n var highchartsInitialized = false;\r\n\r\n export function initializeHighcharts() {\r\n if (!highchartsInitialized) {\r\n highchartsInitialized = true;\r\n\r\n Highcharts.setOptions({\r\n global: {\r\n useUTC: false\r\n },\r\n lang: {\r\n decimalPoint: kendo.culture().numberFormat[\".\"],\r\n thousandsSep: kendo.culture().numberFormat[\",\"],\r\n months: kendo.culture().calendar.months.names,\r\n shortMonths: kendo.culture().calendar.months.namesAbbr,\r\n weekdays: kendo.culture().calendar.days.names,\r\n shortWeekdays: kendo.culture().calendar.days.namesAbbr,\r\n loading: AppKitchen.Strings.Chart_Loading,\r\n numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'],\r\n printChart: AppKitchen.Strings.Chart_PrintChart,\r\n rangeSelectorFrom: AppKitchen.Strings.Chart_Button_From,\r\n rangeSelectorTo: AppKitchen.Strings.Chart_Button_To,\r\n rangeSelectorZoom: AppKitchen.Strings.Chart_Button_Zoom,\r\n resetZoom: AppKitchen.Strings.Chart_Button_ResetZoom,\r\n resetZoomTitle: AppKitchen.Strings.Chart_Button_ResetZoomTooltip,\r\n noData: AppKitchen.Strings.Chart_NoData\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export class HighchartsData {\r\n seriesData: number[] | [number, number][] | [string, number][] | Highcharts.DataPoint[];\r\n id: string;\r\n constructor(seriesData: number[] | [number, number][] | [string, number][] | Highcharts.DataPoint[], id: string) {\r\n this.seriesData = seriesData;\r\n this.id = id;\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface HighchartsSeriesConfig {\r\n id: string;\r\n styles: Highcharts.SeriesOptions[];\r\n }\r\n\r\n export function createHighchartSeriesModels(seriesData: HighchartsData[], seriesConfigs: any[]) {\r\n\r\n var doLookup = id => {\r\n var config = null;\r\n seriesConfigs.forEach(seriesConfig => {\r\n if (seriesConfig.id === id) {\r\n config = seriesConfig.styles[0];\r\n config.id = id;\r\n }\r\n });\r\n return config;\r\n }\r\n\r\n var highchartSeriesModels: HighchartsSeriesModel[] = [];\r\n seriesData.forEach(sd => {\r\n var seriesConfig = doLookup(sd.id);\r\n if (seriesConfig) {\r\n highchartSeriesModels.push(new HighchartsSeriesModel(sd.seriesData, seriesConfig));\r\n } else {\r\n AppKitchen.logWarning(\"The series with id \" + sd.id + \" has no config.\");\r\n }\r\n });\r\n \r\n\r\n return highchartSeriesModels;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface HighchartsSeriesAttributes extends AppKitchen.ModelBaseAttributes {\r\n data?: number[] | number[][] | [number, number][] | [string, number][] | Highcharts.DataPoint[];\r\n config?: Highcharts.SeriesOptions;\r\n }\r\n\r\n export class HighchartsSeriesModel extends AppKitchen.ModelBase {\r\n constructor(seriesData: number[] | number[][] | [number, number][] | [string, number][] | Highcharts.DataPoint[], config: Highcharts.SeriesOptions) {\r\n super({\r\n data: seriesData,\r\n config: config\r\n });\r\n }\r\n\r\n getConfig(): Highcharts.SeriesOptions {\r\n return this.get().config;\r\n }\r\n\r\n getData() {\r\n //TODO: Verify other possible data types.\r\n return >this.get().data;\r\n }\r\n\r\n getSeries() {\r\n\r\n var config = $.extend({},this.getConfig());\r\n config.data = this.getData();\r\n return config;\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface HighchartsSeriesCollectionAttributes extends AppKitchen.ModelBaseAttributes {\r\n seriesCollection?: HighchartsSeriesModel[];\r\n config?: Highstock.Options;\r\n defaultConfig?: Highstock.Options;\r\n }\r\n \r\n export class HighchartsSeriesCollectionModel extends AppKitchen.ModelBase {\r\n\r\n constructor(seriesCollection: HighchartsSeriesModel[]) {\r\n super({\r\n seriesCollection: seriesCollection,\r\n config: undefined,\r\n defaultConfig: undefined\r\n });\r\n }\r\n\r\n getAllSeries() {\r\n var seriesCollection = this.get().seriesCollection;\r\n var retList: Highcharts.SeriesOptions[] = [];\r\n seriesCollection.forEach(s => retList.push(s.getSeries()));\r\n return retList;\r\n }\r\n }\r\n\r\n export class HighchartsView extends AppKitchen.ViewBase {\r\n model: HighchartsSeriesCollectionModel;\r\n initializedSeriesModels: HighchartsSeriesModel[];\r\n chart: Highcharts.ChartObject;\r\n\r\n constructor(model: HighchartsSeriesCollectionModel, targetContainer: HTMLElement, options?: AppKitchen.ViewBaseOptions) {\r\n HighchartsHelper.initializeHighcharts();\r\n super(model, targetContainer, options);\r\n\r\n this.model.bind(\"change:seriesCollection change:config\", () => this.render());\r\n this.initializedSeriesModels = [];\r\n this.render();\r\n }\r\n\r\n initNewSeriesModels() {\r\n var seriesModels = this.model.get().seriesCollection;\r\n\r\n for (var i = 0; i < seriesModels.length; i++) {\r\n var sm = seriesModels[i];\r\n if ($.inArray(sm, this.initializedSeriesModels) < 1) {\r\n this.initializedSeriesModels.push(sm);\r\n sm.bind(\"change:data\", this.seriesDataChanged.bind(this, sm));\r\n }\r\n }\r\n\r\n }\r\n\r\n seriesDataChanged(seriesModel: HighchartsSeriesModel) {\r\n var existingSeries = this.chart.get(seriesModel.getConfig().id);\r\n \r\n if (existingSeries) {\r\n existingSeries.setData(seriesModel.getData());\r\n }\r\n }\r\n\r\n setExtremesX(extremes: {min?: number, max?: number}) {\r\n this.chart.xAxis[0].setExtremes(extremes.min, extremes.max);\r\n }\r\n\r\n setExtremesY(extremes: { min?: number, max?: number }) {\r\n this.chart.yAxis[0].setExtremes(extremes.min, extremes.max);\r\n }\r\n\r\n\r\n getExtremesX(): Highcharts.Extremes {\r\n return this.chart.xAxis[0].getExtremes();\r\n }\r\n\r\n getExtremesY(): Highcharts.Extremes {\r\n return this.chart.yAxis[0].getExtremes();\r\n }\r\n\r\n render() {\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, Templates.Highchart);\r\n\r\n if (!this.model.get().seriesCollection || !this.model.get().config) {\r\n return;\r\n }\r\n\r\n this.initNewSeriesModels();\r\n\r\n var container = this.$el.find(\".a-highcharts-container\");\r\n\r\n var chartConfig = AppKitchen.OptionsHelper.merge(this.model.get().config, this.model.get().defaultConfig, true);\r\n\r\n if (!chartConfig.tooltip) {\r\n chartConfig.tooltip = {};\r\n }\r\n if (!chartConfig.tooltip.positioner) {\r\n chartConfig.tooltip.positioner = function(boxWidth, boxHeight, point) {\r\n var xPos = point.plotX - boxWidth - 5;\r\n xPos = xPos < 0 ? point.plotX + 70 : xPos;\r\n return { x: xPos, y: 32 };\r\n };\r\n }\r\n\r\n chartConfig.series = this.model.getAllSeries();\r\n container.highcharts(\"StockChart\", chartConfig);\r\n this.chart = container.highcharts();\r\n }\r\n\r\n resize() {\r\n this.chart.reflow();\r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n\r\n\r\n","\r\n\r\nmodule General {\r\n \r\n function startsWith(funcStr: string, prefix: string) {\r\n return funcStr.substr(0, prefix.length) === prefix;\r\n }\r\n\r\n export function convertToFunction(funcStr: string) {\r\n var result = null;\r\n\r\n if (funcStr && startsWith(funcStr, \"###js###\")) {\r\n var procedureString = funcStr.substr(\"###js###\".length);\r\n if (startsWith(procedureString, \"function\")) {\r\n procedureString = \"(\" + procedureString + \")\";\r\n }\r\n try {\r\n result = eval(procedureString);\r\n }\r\n catch (e) {\r\n GeneralLogger.logError(e);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n export class GeneralRenderer {\r\n static renderFunc: (template: string, data, containerSelector, renderCallback?) => void;\r\n static init(renderFunc: (template: string, data, containerSelector, renderCallback) => void) {\r\n this.renderFunc = renderFunc;\r\n }\r\n\r\n static renderTemplate(template: string, data, containerSelector, renderCallback) {\r\n this.renderFunc(template, data, containerSelector, renderCallback);\r\n }\r\n }\r\n\r\n export class GeneralLogger {\r\n static debugLog: (msg: string) => void;\r\n static errorLog: (msg: string) => void;\r\n\r\n static init(debugLog: (msg: string) => void, errorLog: (msg: string) => void) {\r\n this.debugLog = debugLog;\r\n this.errorLog = errorLog;\r\n }\r\n\r\n static logDebug(msg: string) {\r\n if (this.debugLog) {\r\n this.debugLog(msg);\r\n }\r\n }\r\n\r\n static logError(msg: string) {\r\n if (GeneralLogger.logError) {\r\n this.errorLog(msg);\r\n }\r\n }\r\n }\r\n}","\r\n\r\n\r\nmodule General {\r\n export module TsChart {\r\n\r\n export module Transformations {\r\n\r\n export function FormatSeriesName(formatString, value, parentSeriesLabel) {\r\n var result = parentSeriesLabel + \" (\" + value + \")\";\r\n\r\n if (formatString) {\r\n if (formatString.startsWith('###js###')) {\r\n var procedure = General.convertToFunction(formatString);\r\n if (procedure) {\r\n result = procedure(value, parentSeriesLabel);\r\n } else {\r\n GeneralLogger.logError(\"Failed to format series label, using fallback. (failed procedure: '\" + formatString + \"')\");\r\n }\r\n } else {\r\n try {\r\n result = Highcharts.dateFormat(formatString, value);\r\n } catch (e) {\r\n GeneralLogger.logError(\"Failed to format series label, using fallback. (failed to parse format string: '\" + formatString + \"' or date value: '\" + value + \"')\");\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n export function FormatSeriesNameUseOnlyParentSeriesLabel(value, parentSeriesLabel) {\r\n return parentSeriesLabel;\r\n }\r\n\r\n export function ChangeTimestampToGroupingFormat(data, groupingFormat) {\r\n if (groupingFormat === \"Hour\") {\r\n for (var i in data) {\r\n var hour = new Date(data[i][0]).getHours();\r\n data[i][0] = Date.UTC(1970, 0, 1, hour, 0, 0);\r\n }\r\n }\r\n }\r\n\r\n\r\n export function LatestDatapointTransformation(serie, transformationData) {\r\n var result = [];\r\n var latestDataPoints = [];\r\n\r\n var newSerie = {\r\n name: serie.name,\r\n data: latestDataPoints\r\n };\r\n\r\n result.push(newSerie);\r\n\r\n if (serie.data && serie.data.length > 0) {\r\n\r\n var groupingIndex = transformationData.groupingIndex;\r\n var xAxisIndex = transformationData.xAxisIndex;\r\n var yAxisIndex = transformationData.yAxisIndex;\r\n\r\n var maxIndex = Math.max(groupingIndex, Math.max(xAxisIndex, yAxisIndex));\r\n\r\n if (serie.data[0].length > maxIndex) {\r\n\r\n var dataBin = {};\r\n var xAxisValues = [];\r\n\r\n for (var i in serie.data) {\r\n if (!serie.data.hasOwnProperty(i)) {\r\n continue;\r\n }\r\n var xValue = serie.data[i][xAxisIndex];\r\n var yValue = serie.data[i][yAxisIndex];\r\n var groupingValue = serie.data[i][groupingIndex];\r\n\r\n\r\n if (!dataBin[xValue]) {\r\n dataBin[xValue] = [];\r\n xAxisValues.push(xValue);\r\n }\r\n\r\n dataBin[xValue].push([groupingValue, yValue]);\r\n }\r\n\r\n xAxisValues.sort();\r\n\r\n for (var j in xAxisValues) {\r\n if (!xAxisValues.hasOwnProperty(j)) {\r\n continue;\r\n }\r\n var xAxisValue = xAxisValues[j];\r\n var possibleTuples = dataBin[xAxisValue];\r\n possibleTuples.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return 1;\r\n }\r\n if (a[0] > b[0]) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n\r\n var tupleWithLatestGroupingDate = possibleTuples[0];\r\n var yAxisValue = tupleWithLatestGroupingDate[1];\r\n var groupingDate = tupleWithLatestGroupingDate[0];\r\n\r\n latestDataPoints.push([xAxisValue, yAxisValue, groupingDate]);\r\n }\r\n latestDataPoints = latestDataPoints.sort(function(a, b) {\r\n return a[0]- b[0];\r\n });\r\n\r\n\r\n } else {\r\n GeneralLogger.logDebug(\"data tuples contain not enough dimensions, aborting transformation: \"+ serie);\r\n }\r\n\r\n } else {\r\n GeneralLogger.logDebug(\"no data found, aborting transformation:\"+ serie);\r\n }\r\n return result;\r\n }\r\n\r\n export function StackDataTransformation(serie, transformationData) {\r\n\r\n if (serie.data.length > 0) {\r\n var groupingType = transformationData.groupingType;\r\n\r\n if (groupingType.toUpperCase() === \"YEAR\") {\r\n return General.TsChart.Transformations._stackDataByYear(serie, transformationData);\r\n }\r\n\r\n }\r\n return null;\r\n }\r\n\r\n export function _stackDataByYear(serie, transformationData) {\r\n\r\n var groupingArr = [];\r\n var hash = [];\r\n for (var i in serie.data) {\r\n var data = serie.data[i];\r\n var currentDate = new Date(data[0]);\r\n var currentYear = currentDate.getUTCFullYear();\r\n\r\n\r\n if (!groupingArr[currentYear]) {\r\n groupingArr[currentYear] = {\r\n name: serie.name + currentYear,\r\n data: []\r\n };\r\n hash = [];\r\n }\r\n\r\n //var x = currentDate.setFullYear(2006);\r\n var x = Date.UTC(1970,\r\n currentDate.getMonth(),\r\n currentDate.getDate(),\r\n currentDate.getHours(),\r\n currentDate.getSeconds());\r\n var y = data[1];\r\n\r\n if (hash[x]) {\r\n continue;\r\n } else if (hash.length > 0 && hash[hash.length - 1] > x) {\r\n continue;\r\n }\r\n hash[x] = 1;\r\n\r\n /*if (x != data[0]) {\r\n var a = 0;\r\n }*/\r\n\r\n groupingArr[currentYear].data.push([x, y]);\r\n }\r\n\r\n var result = [];\r\n for (var k in groupingArr) {\r\n result.push(groupingArr[k]);\r\n }\r\n return result;\r\n }\r\n\r\n export function TimeaxisToSeriesTransformation(serie, transformationData) {\r\n var result = [];\r\n\r\n if (serie.data.length > 0) {\r\n\r\n var groupingIndex = transformationData.groupingIndex;\r\n var xAxisIndex = transformationData.xAxisIndex;\r\n var yAxisIndex = transformationData.yAxisIndex;\r\n\r\n var maxIndex = Math.max(groupingIndex, Math.max(xAxisIndex, yAxisIndex));\r\n\r\n if (serie.data[0].length > maxIndex) {\r\n\r\n var dataBin = {};\r\n\r\n for (var i in serie.data) {\r\n if (!serie.data.hasOwnProperty(i))\r\n continue;\r\n var data = serie.data[i];\r\n var x = data[xAxisIndex];\r\n var key = data[groupingIndex];\r\n var y = data[yAxisIndex];\r\n\r\n if (!dataBin[key]) {\r\n dataBin[key] = [];\r\n }\r\n\r\n dataBin[key].push([x, y]);\r\n }\r\n\r\n for (var j in dataBin) {\r\n var groupedValue = parseFloat(j);\r\n\r\n var newSerie = {\r\n name: General.TsChart.Transformations.FormatSeriesName(transformationData.labelFormat, groupedValue, serie.name),\r\n data: dataBin[j]\r\n };\r\n\r\n result.push(newSerie);\r\n }\r\n\r\n } else {\r\n result = [serie];\r\n GeneralLogger.logDebug(\"data tuples contain not enough dimensions, aborting transformation: \" + serie);\r\n }\r\n } else {\r\n result = [serie];\r\n GeneralLogger.logDebug(\"no data found, aborting transformation: \"+ serie);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /*\r\n * Use this prase in chart configuration:\r\n * \r\n * \"datatransformation\": {\r\n *\t\"procedure\": \"###js###Portal.Chart.Transformations.OHLCTransformation\",\r\n *\t\"data\": {\r\n *\t\t\"o\": \"NEU_A_IW\",\r\n *\t\t\"h\": \"NEU_C_IW\",\r\n *\t\t\"l\": \"NEU_D_IW\",\r\n *\t\t\"c\": \"NEU_B_IW\"\r\n *\t}\r\n * },\r\n * \r\n * - \"o\" \"h\" \"l\" and \"c\" are datasourceids! \r\n * - Style will be used from series \"o\". \r\n * - All other series should be disabled via \"enabled\": false in the chartseries object!\r\n */\r\n export function OHLCTransformation(dataList, options) {\r\n\r\n var getTs = function(id, list) {\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i].datasourceId == id) {\r\n return list[i];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n var setData = function(list, targetList, index) {\r\n for (var i = 0; i < list.length; i++) {\r\n var timestamp = list[i][0];\r\n var value = list[i][1];\r\n if (targetList[timestamp]) {\r\n targetList[timestamp][index] = value;\r\n }\r\n }\r\n }\r\n\r\n var retData = [];\r\n var dataTmp = {};\r\n\r\n var openTs = getTs(options.o, dataList);\r\n var highTs = getTs(options.h, dataList).data;\r\n var lowTs = getTs(options.l, dataList).data;\r\n var closeTs = getTs(options.c, dataList).data;\r\n\r\n for (var i = 0; i < openTs.data.length; i++) {\r\n var timestamp = openTs.data[i][0];\r\n var value = openTs.data[i][1];\r\n var data = [timestamp, value, null, null, null];\r\n retData.push(data);\r\n dataTmp[timestamp] = data;\r\n }\r\n\r\n setData(highTs, dataTmp, 2);\r\n setData(lowTs, dataTmp, 3);\r\n setData(closeTs, dataTmp, 4);\r\n\r\n\r\n openTs.data = retData;\r\n\r\n return [openTs];\r\n }\r\n\r\n export function CombineSeries(dataList, transformationData) {\r\n\r\n for (var k = 0; k < transformationData.length; k++) {\r\n var tData = transformationData[k];\r\n var series1 = null;\r\n var series2 = null;\r\n\r\n for (var i = 0; i < dataList.length; i++) {\r\n var currData = dataList[i];\r\n if (tData.seriesid1 == currData.datasourceId) {\r\n series1 = currData;\r\n }\r\n if (tData.seriesid2 == currData.datasourceId) {\r\n series2 = currData;\r\n }\r\n }\r\n\r\n if (series1 && series2) {\r\n var dataDictionary = {};\r\n var size = series2.data.length;\r\n\r\n for (i = 0; i < size; i++) {\r\n var date = series2.data[i];\r\n dataDictionary[date[0]] = date[1];\r\n }\r\n\r\n size = series1.data.length;\r\n for (i = 0; i < size; i++) {\r\n date = series1.data[i];\r\n var val = dataDictionary[date[0]];\r\n date.push(val);\r\n }\r\n }\r\n }\r\n\r\n return dataList;\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n/**\r\n * This is for legacy purposes only.\r\n */\r\nmodule Portal {\r\n export module Chart {\r\n export class Transformations {\r\n static FormatSeriesName(formatString, value, parentSeriesLabel) {\r\n return General.TsChart.Transformations.FormatSeriesName(formatString, value, parentSeriesLabel);\r\n }\r\n static FormatSeriesNameUseOnlyParentSeriesLabel(value, parentSeriesLabel) {\r\n return parentSeriesLabel;\r\n }\r\n static LatestDatapointTransformation(serie, transformationData) {\r\n return General.TsChart.Transformations.LatestDatapointTransformation(serie, transformationData);\r\n }\r\n static StackDataTransformation(serie, transformationData) {\r\n return General.TsChart.Transformations.StackDataTransformation(serie, transformationData);\r\n }\r\n static TimeaxisToSeriesTransformation(serie, transformationData) {\r\n return General.TsChart.Transformations.TimeaxisToSeriesTransformation(serie, transformationData);\r\n }\r\n static OHLCTransformation(dataList, options) {\r\n return General.TsChart.Transformations.OHLCTransformation(dataList, options);\r\n }\r\n static CombineSeries(dataList, options) {\r\n return General.TsChart.Transformations.CombineSeries(dataList, options);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n","/// \r\n/// \r\n\r\nmodule General {\r\n export module TsChart {\r\n\r\n export interface LoggerImpl {\r\n debug: (string) => void;\r\n error: (string) => void;\r\n }\r\n\r\n export function applyPreloadTransformation(interactiveDefinition: any,\r\n targetContainer: HTMLElement,\r\n setTitle: (title: string) => void,\r\n reloadAfterTransformation: (interactiveDefinition:any) => void) {\r\n\r\n\r\n if (interactiveDefinition.preloadtransformation && interactiveDefinition.preloadtransformation.procedure) {\r\n var procedure = General.convertToFunction(interactiveDefinition.preloadtransformation.procedure);\r\n if (procedure) {\r\n var transformationTarget = $(targetContainer).find(\".mp-interactive-transformation\");\r\n interactiveDefinition = procedure(transformationTarget, interactiveDefinition, interactiveDefinition.preloadtransformation.data, reloadAfterTransformation);\r\n\r\n if (interactiveDefinition.title) {\r\n //var title = $(targetContainer).find(\".mp-interactive-title\");\r\n //title.html(interactiveDefinition.title);\r\n setTitle(interactiveDefinition.title);\r\n }\r\n } else {\r\n GeneralLogger.logError(\"Edoc Transformation Procedure not defined \" + interactiveDefinition.preloadtransformation.procedure);\r\n }\r\n }\r\n return interactiveDefinition;\r\n }\r\n\r\n /* This is a fix for the highchart library. When the navigators baseSeries is refering to a series that does not exist*/\r\n export function fixDataList(dataLists, interactiveDefinition) {\r\n if (dataLists.length < 2) {\r\n return;\r\n }\r\n\r\n var smallestDateOfAllLists = null;\r\n var relevantIndex = 0;\r\n\r\n for (var i = 0; i < dataLists.length; i++) {\r\n var list = dataLists[i];\r\n var smallestDateOfCurrentList = getSmallestDateFromDataList(list);\r\n if (smallestDateOfAllLists == null || (smallestDateOfCurrentList != null && smallestDateOfCurrentList < smallestDateOfAllLists)) {\r\n smallestDateOfAllLists = smallestDateOfCurrentList;\r\n relevantIndex = i;\r\n }\r\n }\r\n\r\n if (interactiveDefinition.chartdefinition.navigator.baseSeries == null) {\r\n interactiveDefinition.chartdefinition.navigator.baseSeries = relevantIndex;\r\n }\r\n\r\n }\r\n\r\n export function setChartControlsDependingOnSize (chartOptions, highstockchartSelector, initialChartConfig) {\r\n\r\n var height = $(highstockchartSelector).height();\r\n var width = $(highstockchartSelector).width();\r\n\r\n var navigatorEnabled = height > 300 && initialChartConfig.scrollbar.enabled;\r\n var buttonsEnabled = width > 400 && initialChartConfig.rangeSelector.enabled;\r\n\r\n var optionsChanged = false;\r\n\r\n if (chartOptions.navigator.enabled !== navigatorEnabled) {\r\n chartOptions.navigator.enabled = navigatorEnabled;\r\n chartOptions.scrollbar.enabled = navigatorEnabled;\r\n optionsChanged = true;\r\n }\r\n if (chartOptions.rangeSelector.enabled !== buttonsEnabled) {\r\n chartOptions.rangeSelector.enabled = buttonsEnabled;\r\n optionsChanged = true;\r\n }\r\n\r\n return optionsChanged;\r\n }\r\n\r\n function getSmallestDateFromDataList(dataList) {\r\n if (dataList.data && dataList.data.length > 0 && dataList.data[0].length > 0) {\r\n return dataList.data[0][0];\r\n }\r\n return null;\r\n }\r\n\r\n function addAxisFormatter (axisObj) {\r\n\r\n var addFormatter = function (a) {\r\n if (a.labels && a.labels.formatter) {\r\n var formatterFunc = convertToFunction(a.labels.formatter);\r\n a.labels.formatter = formatterFunc;\r\n }\r\n };\r\n\r\n if (axisObj) {\r\n if (Object.prototype.toString.call(axisObj) === '[object Array]') {\r\n for (var i in axisObj) {\r\n var axis = axisObj[i];\r\n addFormatter(axis);\r\n }\r\n } else {\r\n addFormatter(axisObj);\r\n }\r\n\r\n }\r\n }\r\n\r\n function evalChartFunctions(chartOptions) {\r\n\r\n if (chartOptions.tooltip && chartOptions.tooltip.positioner) {\r\n var positionerProcedure = convertToFunction(chartOptions.tooltip.positioner);\r\n chartOptions.tooltip.positioner = positionerProcedure;\r\n }\r\n\r\n if (chartOptions.tooltip && chartOptions.tooltip.formatter) {\r\n var tooltipFormatter = convertToFunction(chartOptions.tooltip.formatter);\r\n chartOptions.tooltip.formatter = tooltipFormatter;\r\n } \r\n\r\n addAxisFormatter(chartOptions.xAxis);\r\n addAxisFormatter(chartOptions.yAxis);\r\n if (chartOptions.navigator)\r\n addAxisFormatter(chartOptions.navigator.xAxis);\r\n }\r\n\r\n export function getSeriesPointsForXValue(series, xValue) {\r\n var points = [];\r\n for (var s in series) {\r\n if (!series.hasOwnProperty(s)) {\r\n continue;\r\n }\r\n var serie = series[s];\r\n var len = serie.points.length;\r\n var point = findMatchingPoint(serie.points, xValue, 0, len - 1, len - 1);\r\n if (point) {\r\n points.push(point);\r\n }\r\n\r\n }\r\n return points;\r\n }\r\n\r\n function findMatchingPoint(points, searchX, minIndex, maxIndex, pointsLength) {\r\n\r\n var startPoint = points[minIndex];\r\n var endPoint = points[maxIndex];\r\n\r\n if (!startPoint || !endPoint || startPoint.x > searchX || endPoint.x < searchX) {\r\n return null;\r\n }\r\n\r\n var midIndex = ~~((maxIndex - minIndex) / 2 + minIndex);\r\n var midIndexPoint = points[midIndex];\r\n\r\n if (midIndexPoint.x == searchX) {\r\n return midIndexPoint;\r\n }\r\n if (midIndex + 5 < maxIndex && midIndex <= pointsLength - 1) {\r\n var nextPoint = points[midIndex + 1];\r\n if (searchX > midIndexPoint.x && searchX < nextPoint.x) {\r\n return midIndexPoint;\r\n }\r\n }\r\n\r\n\r\n\r\n if (midIndexPoint.x < searchX) {\r\n return findMatchingPoint(points, searchX, midIndex + 1, maxIndex, pointsLength);\r\n }\r\n else if (midIndexPoint.x > searchX) {\r\n return findMatchingPoint(points, searchX, minIndex, midIndex - 1, pointsLength);\r\n }\r\n }\r\n\r\n export function transformDataIfRequired(interactiveDefinition, dataList) {\r\n if (interactiveDefinition.datatransformation && interactiveDefinition.datatransformation.procedure) {\r\n var procedure = General.convertToFunction(interactiveDefinition.datatransformation.procedure);\r\n if (procedure) {\r\n return procedure(dataList, interactiveDefinition.datatransformation.data);\r\n }\r\n }\r\n return dataList;\r\n }\r\n\r\n export function getSeriesLabel(timeseriesId: string, timeseriesName: string) {\r\n if (!timeseriesName || timeseriesId === timeseriesName) {\r\n return timeseriesId;\r\n }\r\n return timeseriesName + \"(\" + timeseriesId + \")\";\r\n }\r\n\r\n export function preprocessInteractiveDefinition(interactiveDefinition, dataList, defaultChartConfig: any) {\r\n var result = interactiveDefinition.chartdefinition;\r\n\r\n var defaults = $.extend(true, {}, defaultChartConfig);\r\n result = $.extend(true, defaults, result);\r\n\r\n evalChartFunctions(result);\r\n\r\n var series = [];\r\n for (var i in interactiveDefinition.chartseries) {\r\n if (!interactiveDefinition.chartseries.hasOwnProperty(i)) {\r\n continue;\r\n }\r\n\r\n var chartserie = interactiveDefinition.chartseries[i];\r\n\r\n if (chartserie.enabled === false || chartserie.enabled === \"false\") {\r\n continue;\r\n }\r\n\r\n var chartData = null;\r\n var seriesLabel = null;\r\n\r\n for (var d in dataList) {\r\n var data = dataList[d];\r\n if (data.datasourceId === chartserie.datasource.datasourceid) {\r\n chartData = data.data;\r\n seriesLabel = this.getSeriesLabel(data.timeseriesId, data.timeseriesName);\r\n break;\r\n }\r\n }\r\n\r\n var seriesStyles = null;\r\n for (var s in interactiveDefinition.seriesstyles) {\r\n var style = interactiveDefinition.seriesstyles[s];\r\n if (chartserie.seriesstyleid === style.id) {\r\n seriesStyles = style.styles;\r\n break;\r\n }\r\n }\r\n\r\n var newSerie = {\r\n name: chartserie.label ? chartserie.label : seriesLabel,\r\n data: chartData\r\n };\r\n\r\n newSerie = $.extend(newSerie || {}, seriesStyles[0]);\r\n\r\n if (chartserie.transformation) {\r\n var procedure = General.convertToFunction(chartserie.transformation.procedure);\r\n\r\n if (procedure) {\r\n var newSeriesList = procedure(newSerie, chartserie.transformation.data);\r\n\r\n var len = newSeriesList.length;\r\n for (var j = 0; j < len; j++) {\r\n\r\n var serie = newSeriesList[j];\r\n\r\n if (seriesStyles.length > j) {\r\n serie = $.extend(serie || {}, seriesStyles[j]);\r\n } else {\r\n serie = $.extend(serie || {}, seriesStyles[0]);\r\n }\r\n\r\n series.push(serie);\r\n }\r\n } else {\r\n GeneralLogger.logError(\"Failed to convert procedure: '\" +\r\n chartserie.transformation.procedure +\r\n \"'\");\r\n }\r\n } else {\r\n series.push(newSerie);\r\n }\r\n\r\n }\r\n\r\n if (interactiveDefinition.seriestransformation) {\r\n var seriesProcedure = General.convertToFunction(interactiveDefinition.seriestransformation.procedure);\r\n\r\n if (seriesProcedure) {\r\n series = seriesProcedure(series, interactiveDefinition.seriestransformation.data);\r\n } else {\r\n GeneralLogger.logError(\"Failed to convert procedure: '\" + interactiveDefinition.seriestransformation.procedure + \"'\");\r\n }\r\n }\r\n\r\n result.series = series;\r\n\r\n if (interactiveDefinition.chartdefinition.timeGrouping) {\r\n for (var k in result.series) {\r\n General.TsChart.Transformations.ChangeTimestampToGroupingFormat(result.series[k].data, interactiveDefinition.chartdefinition.timeGrouping);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n }\r\n} \r\n","module AppKitchen {\r\n export module Portal {\r\n export module Defaults {\r\n export function interactiveGraphic() \r\n {\r\n return {\r\n chart: {\r\n backgroundColor: \"#F9F9F9\",\r\n borderColor: \"#F00\",\r\n animation: false,\r\n marginLeft: 70,\r\n zoomType: \"xy\",\r\n borderRadius: 0\r\n },\r\n plotOptions: {\r\n series: {\r\n point: {\r\n events: {\r\n \r\n }\r\n }\r\n }\r\n },\r\n exporting: {\r\n buttons: {\r\n contextButton: {\r\n enabled: false\r\n }\r\n }\r\n },\r\n credits: {\r\n enabled: false\r\n },\r\n navigator: {\r\n maskFill: \"rgba(255, 255, 255, 0.5)\",\r\n series: {\r\n color: 'rgba(125, 125, 125, 0.4)',\r\n fillOpacity: 0.1,\r\n lineColor: 'rgba(125, 125, 125, 0.6)'\r\n },\r\n outlineColor: '#CCC',\r\n enabled: true,\r\n maskInside: false\r\n },\r\n scrollbar: {\r\n barBackgroundColor: '#F3F3F3',\r\n barBorderColor: '#CCC',\r\n barBorderRadius: 0,\r\n buttonArrowColor: '#999',\r\n buttonBackgroundColor: '#FFF',\r\n buttonBorderColor: '#CCC',\r\n trackBackgroundColor: '#FFF',\r\n trackBorderColor: '#CCC',\r\n buttonBorderRadius: 0,\r\n enabled: false\r\n },\r\n xAxis: {\r\n title: {\r\n style: {\r\n color: '#555',\r\n fontFamily: 'OpenSansSemiBold',\r\n fontWeight: 'normal'\r\n }\r\n }\r\n },\r\n yAxis: {\r\n title: {\r\n style: {\r\n color: '#555'\r\n }\r\n }\r\n },\r\n title: {\r\n style: {\r\n display: 'none'\r\n }\r\n },\r\n subtitle: {\r\n style: {\r\n display: 'none'\r\n }\r\n },\r\n tooltip: {\r\n borderColor: '#B7B7B7',\r\n backgroundColor: 'rgba(255, 255, 255, 0.93)',\r\n borderRadius: 0,\r\n borderWidth: 1,\r\n valueDecimals: 2,\r\n hideDelay: 10,\r\n crosshairs: true,\r\n shared: true,\r\n shadow: false,\r\n positioner:\r\n \"###js###function (boxWidth, boxHeight, point){ var xPos = point.plotX-boxWidth-5; xPos=xPos<0?point.plotX+70:xPos; return { x: xPos, y: 32 }; }\"\r\n },\r\n rangeSelector: {\r\n inputDateFormat: AppKitchen.Strings.ChartInputDateFormat,\r\n enabled: false,\r\n buttonTheme: {\r\n fill: 'none',\r\n stroke: 'none',\r\n states: {\r\n hover: {\r\n stroke: '#EEE',\r\n fill: 'none'\r\n },\r\n select: {\r\n fill: 'none',\r\n stroke: '#444'\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/// \r\n/// \r\n/// \r\n/// \r\n\r\nmodule AppKitchen {\r\n export module Portal {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InteractiveGraphicConfig extends AppKitchen.ConfigDocumentBase {\r\n documentType: \"timeseriesChart\";\r\n databaseId: string;\r\n timeseries: any[];\r\n timeaxis: any[];\r\n chartseries: any[];\r\n transformation: any;\r\n chartdefinition: any;\r\n }\r\n\r\n export class InteractiveGraphic extends AppKitchen.ViewBase> {\r\n interactiveDefinition: InteractiveGraphicConfig;\r\n mInitialChartConfig: InteractiveGraphicConfig;\r\n chartContainer: HTMLElement;\r\n currentUpdateSizeTimer: any;\r\n\r\n constructor(interactiveDefinition: InteractiveGraphicConfig, targetContainer: HTMLElement) {\r\n AppKitchen.Controls.Charts.HighchartsHelper.initializeHighcharts();\r\n super(new AppKitchen.ModelBase(), targetContainer);\r\n this.interactiveDefinition = interactiveDefinition;\r\n this.setTemplate(Templates.TsChart);\r\n this.render();\r\n }\r\n\r\n render() {\r\n this.renderTemplate({\r\n title: this.interactiveDefinition.chartdefinition.title.text,\r\n subtitle: this.interactiveDefinition.chartdefinition.subtitle.text\r\n });\r\n\r\n this.interactiveDefinition = General.TsChart.applyPreloadTransformation(this.interactiveDefinition, this.el, (titleText) => {\r\n var title = this.$el.find(\".mp-interactive-title\");\r\n title.html(titleText);\r\n }, this.onReloadAfterTransformation.bind(this));\r\n\r\n this.loadChart(this.interactiveDefinition);\r\n\r\n AppKitchen.BrowserHelper.WindowResize.on(() => {\r\n if (this.currentUpdateSizeTimer) {\r\n clearTimeout(this.currentUpdateSizeTimer);\r\n }\r\n this.currentUpdateSizeTimer = setTimeout(this.updateSize.bind(this), 100);\r\n }, this.el);\r\n }\r\n\r\n syncTooltip(container, xValue) {\r\n var i = 0;\r\n var chartsDomSelectors = $(\"body\").find(\".mp-interactive-target-container\");\r\n\r\n for (; i < chartsDomSelectors.length; i++) {\r\n var chart = $(chartsDomSelectors[i]).highcharts();\r\n if (container.id !== chart.container.id) {\r\n var points = General.TsChart.getSeriesPointsForXValue(chart.series, xValue);\r\n if (points && points.length > 0) {\r\n chart.tooltip.refresh(points);\r\n } else {\r\n chart.tooltip.hide();\r\n }\r\n }\r\n }\r\n }\r\n\r\n updateSize() {\r\n var domSelector = this.$el.find(\".mp-interactive-target-container\");\r\n var chart = domSelector.highcharts();\r\n if (!chart) {\r\n return;\r\n }\r\n\r\n var chartOptions = chart.options;\r\n if (General.TsChart.setChartControlsDependingOnSize(chartOptions, this.$el, this.mInitialChartConfig)) {\r\n \r\n chart.destroy();\r\n domSelector.highcharts('StockChart', chartOptions);\r\n chart = domSelector.highcharts();\r\n }\r\n\r\n var chartTitleHeight = this.$el.find(\".mp-interactive-header\").outerHeight(true);\r\n chart.setSize(this.$el.width()-20, this.$el.height() - chartTitleHeight, false);\r\n }\r\n\r\n onReloadAfterTransformation(interactiveDefinition) {\r\n this.loadChart(interactiveDefinition);\r\n\r\n if (interactiveDefinition.title) {\r\n var title = this.$el.find(\".mp-interactive-title\");\r\n title.html(interactiveDefinition.title);\r\n }\r\n\r\n }\r\n\r\n loadChart(interactiveDefinition: InteractiveGraphicConfig) {\r\n var jsonString = JSON.stringify(interactiveDefinition);\r\n AppKitchen.Data.getDataApi(\"TimeseriesData\", { '': jsonString }, (dataList) => {\r\n if (dataList && dataList.length > 0) {\r\n\r\n General.TsChart.fixDataList(dataList, interactiveDefinition);\r\n dataList = General.TsChart.transformDataIfRequired(interactiveDefinition, dataList);\r\n var chartOptions = General.TsChart.preprocessInteractiveDefinition(interactiveDefinition, dataList, this.getDefaults());\r\n var me = this;\r\n chartOptions.plotOptions.series.point.events.mouseOver = function () {\r\n me.syncTooltip(this.series.chart.container, this.x);\r\n }\r\n\r\n this.mInitialChartConfig = jQuery.extend(true, {}, chartOptions);\r\n General.TsChart.setChartControlsDependingOnSize(chartOptions, this.el, this.mInitialChartConfig);\r\n\r\n var chartTarget = this.$el.find(\".mp-interactive-target-container\");\r\n chartTarget.empty();\r\n chartTarget.removeAttr('data-highcharts-chart');\r\n chartTarget.highcharts('StockChart', chartOptions);\r\n\r\n\r\n this.updateSize();\r\n }\r\n });\r\n }\r\n\r\n getDefaults() {\r\n return Defaults.interactiveGraphic();\r\n }\r\n }\r\n\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Wrappers {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface MaximizeWrapperOptions {\r\n renderContent: (targetContainer: HTMLElement) => T;\r\n maximized?: (T) => void;\r\n restored?: (T) => void;\r\n undockUrl?: string;\r\n title?: string;\r\n }\r\n\r\n export class MaximizeWrapper {\r\n container: JQuery;\r\n el: HTMLElement;\r\n $el: JQuery;\r\n options: MaximizeWrapperOptions;\r\n renderedContent: T;\r\n\r\n constructor(targetContainer: HTMLElement, options: MaximizeWrapperOptions) {\r\n this.el = targetContainer;\r\n this.$el = $(targetContainer);\r\n this.options = options;\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.MaximizeWrapper);\r\n var target = $(this.el).find(\".a-app-wrap-content-container\")[0];\r\n\r\n if (!this.options.undockUrl) {\r\n this.$el.find(\".a-app-wrap-button-undock\").hide();\r\n }\r\n\r\n this.renderedContent = this.options.renderContent(target);\r\n\r\n this.$el.find(\".a-app-wrap-button-zoom\").click(this.maximize.bind(this));\r\n this.$el.find(\".a-app-wrap-button-undock\").click(this.undock.bind(this));\r\n }\r\n\r\n undock() {\r\n var url = this.options.undockUrl.indexOf(\"?\") !== -1\r\n ? this.options.undockUrl + \"&undocked\"\r\n : this.options.undockUrl + \"?undocked\";\r\n\r\n AppKitchen.BrowserHelper.openInWindow(url, true);\r\n }\r\n\r\n maximize() {\r\n var sourceElement = $(this.el).find(\".a-app-wrap-content-container\");\r\n var parent = sourceElement.parent();\r\n\r\n sourceElement.detach();\r\n var buttons = [\r\n {\r\n name: \"close\",\r\n action: (window) => window.close()\r\n }\r\n ];\r\n\r\n if (this.options.undockUrl) {\r\n buttons.push(\r\n {\r\n name: \"undock\",\r\n action: (window) => {\r\n this.undock();\r\n window.close();\r\n }\r\n });\r\n }\r\n\r\n var windowOptions: AppKitchen.UIHelper.Windows.WindowOptions = {\r\n closed: () => {\r\n this.onWindowClosed(sourceElement, parent);\r\n },\r\n opened: () => {\r\n this.onWindowOpened();\r\n },\r\n width: \"94%\",\r\n height: \"85%\",\r\n position: { top: \"5%\", left: \"3%\" },\r\n animate: false,\r\n buttons: buttons,\r\n modal: true,\r\n easyClose: true,\r\n center: false,\r\n title: this.options.title\r\n }\r\n AppKitchen.UIHelper.Windows.openWindow(sourceElement[0], windowOptions);\r\n }\r\n\r\n onWindowOpened() {\r\n if (this.options.maximized) {\r\n this.options.maximized(this.renderedContent);\r\n }\r\n }\r\n\r\n onWindowClosed(sourceElement: JQuery, parentElement: JQuery) {\r\n sourceElement.detach();\r\n sourceElement.removeClass(\"k-window-content\");\r\n sourceElement.removeClass(\"k-content\");\r\n sourceElement.removeAttr(\"data-role\");\r\n parentElement.append(sourceElement);\r\n\r\n if (this.options.restored) {\r\n this.options.restored(this.renderedContent);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","///\r\n\r\nmodule AppKitchen {\r\n\r\n export module Controls {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface LayoutGridConfig extends ConfigDocumentBase {\r\n content: LayoutGridPaneWithDomElement,\r\n minWidth: number,\r\n minHeight: number,\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface LayoutGridPane {\r\n configFile?: string;\r\n split?: {\r\n orientation: \"horizontal\" | \"vertical\";\r\n size: number;\r\n pane1: LayoutGridPane;\r\n pane2: LayoutGridPane;\r\n };\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface LayoutGridPaneWithDomElement extends LayoutGridPane {\r\n el?: HTMLElement;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface LayoutGridAttributes extends ModelBaseAttributes {\r\n layoutGridConfig?: LayoutGridConfig;\r\n }\r\n\r\n export class LayoutGridModel extends AppKitchen.ModelBase {\r\n constructor(layoutgridConfig: LayoutGridConfig) {\r\n super({\r\n layoutGridConfig: layoutgridConfig\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface LayoutGridViewOptions extends AppKitchen.ViewBaseOptions{\r\n getUndockUrl?: (configFile: string) => string;\r\n }\r\n\r\n export class LayoutGridView extends AppKitchen.ViewBase {\r\n options: LayoutGridViewOptions;\r\n\r\n constructor(layoutGridModel: LayoutGridModel, targetContainer: HTMLElement, options?: LayoutGridViewOptions) {\r\n super(layoutGridModel, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n getUndockUrl: null\r\n }));\r\n this.render();\r\n }\r\n\r\n render() {\r\n var layoutGridItemRoot = this.model.get().layoutGridConfig;\r\n var rootConfig = layoutGridItemRoot.content;\r\n\r\n rootConfig.minWidth = layoutGridItemRoot.minWidth;\r\n rootConfig.minHeight = layoutGridItemRoot.minHeight;\r\n\r\n this.renderGridItem(rootConfig, this.el);\r\n }\r\n\r\n renderGridItem(item: LayoutGridPane, target: HTMLElement) {\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(target, AppKitchen.Templates.LayoutGrid_BasicTable, item);\r\n target = $(target).find(\".a-layout-grid\")[0];\r\n\r\n if (item.split) {\r\n var data = {\r\n size1: item.split.size,\r\n size2: 100-item.split.size\r\n }\r\n\r\n if (item.split.orientation === \"horizontal\") {\r\n AppKitchen.UIHelper.renderTemplateTo(target, AppKitchen.Templates.LayoutGrid_Horizontal, data);\r\n } else {\r\n AppKitchen.UIHelper.renderTemplateTo(target, AppKitchen.Templates.LayoutGrid_Vertical, data);\r\n }\r\n\r\n var newTargets = $(target).find(\".a-layout-grid-cell\");\r\n\r\n this.processItem(item.split.pane1, newTargets[0]);\r\n this.processItem(item.split.pane2, newTargets[1]);\r\n }\r\n this.loadApps(item);\r\n }\r\n\r\n loadApps(item: LayoutGridPaneWithDomElement) {\r\n if (item.split) {\r\n if (item.split.pane1) {\r\n this.loadApps(item.split.pane1);\r\n }\r\n if (item.split.pane2) {\r\n this.loadApps(item.split.pane2);\r\n }\r\n }\r\n if (item.configFile) {\r\n this.startApp(item);\r\n }\r\n \r\n }\r\n\r\n startApp(item: LayoutGridPaneWithDomElement) {\r\n var appWrapper = new AppKitchen.Controls.Wrappers.MaximizeWrapper(item.el, {\r\n renderContent: container => this.renderContent(container, item),\r\n maximized: (app: AppKitchen.Apps.ConfigFileStarterApp) => app.redraw(),\r\n restored: (app: AppKitchen.Apps.ConfigFileStarterApp) => app.redraw(),\r\n undockUrl: this.options.getUndockUrl? this.options.getUndockUrl(item.configFile) : null\r\n });\r\n }\r\n\r\n protected renderContent(target, item: LayoutGridPaneWithDomElement) {\r\n return new AppKitchen.Apps.ConfigFileStarterApp(target, { configFile: item.configFile });\r\n }\r\n\r\n\r\n processItem(item: LayoutGridPaneWithDomElement, target: HTMLElement) {\r\n if (!item.configFile) {\r\n if (item.split && item.split.pane1 && item.split.pane2) {\r\n this.renderGridItem(item, target);\r\n } else {\r\n AppKitchen.logError(\"Configuration error: If config file is not set, split.pane1 AND split.pane2 must be defined!\");\r\n }\r\n } else {\r\n UIHelper.renderTemplateTo(target, AppKitchen.Templates.LayoutGrid_Cell);\r\n item.el = $(target).find(\".a-layout-grid-cell-content\")[0];\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Popups {\r\n\r\n export enum NotificationIcon {\r\n Loading,\r\n Ok,\r\n Error,\r\n Info\r\n }\r\n\r\n export type NotificationType = \"info\" | \"warning\" | \"success\" | \"loading\";\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface NotificationOptions {\r\n title?: string;\r\n type?: NotificationType;\r\n icon?: NotificationIcon;\r\n closable?: boolean;\r\n hideable?: boolean;\r\n keepOnNavigate?: boolean;\r\n stack?: HTMLElement;\r\n autoClose?: boolean;\r\n closeAfter?: number;\r\n }\r\n\r\n export class Notification {\r\n $el: JQuery;\r\n el: HTMLElement;\r\n options: NotificationOptions;\r\n private implicitStack: boolean;\r\n\r\n constructor(content: string, options?: NotificationOptions) {\r\n\r\n // compatibility with old notification\r\n if (options && options.icon >= 0 && !options.type) {\r\n switch (options.icon) {\r\n case NotificationIcon.Loading:\r\n options.type = \"loading\";\r\n break;\r\n case NotificationIcon.Ok:\r\n options.type = \"success\";\r\n break;\r\n case NotificationIcon.Error:\r\n options.type = \"warning\";\r\n break;\r\n case NotificationIcon.Info:\r\n options.type = \"info\";\r\n break;\r\n }\r\n }\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n type: \"info\",\r\n closable: options? !options.hideable : true,\r\n hideable: false,\r\n keepOnNavigate: false,\r\n stack: undefined,\r\n autoClose: options? !!options.closeAfter : false,\r\n closeAfter: 5000\r\n });\r\n\r\n this.implicitStack = !this.options.stack;\r\n if (this.implicitStack) {\r\n this.options.stack = $(AppKitchen.Templates.DefaultNotificationStack).appendTo(\"body\")[0];\r\n }\r\n\r\n this.$el = $(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.NotificationBox, {\r\n type: this.options.type,\r\n title: this.options.title,\r\n content: content,\r\n closable: this.options.closable,\r\n hideable: this.options.hideable\r\n })).prependTo(this.options.stack);\r\n\r\n AppKitchen.UIHelper.Scrolling.customScroller(this.$el.find(\".a-notification-content\")[0]);\r\n\r\n\r\n this.el = this.$el[0];\r\n this.$el.css(\"z-index\", AppKitchen.UIHelper.getHighestZIndex() + 1);\r\n\r\n \r\n this.$el.find(\".a-notification-close\").click(() => {\r\n this.close();\r\n });\r\n\r\n this.$el.find(\".a-notification-hide\").click(() => {\r\n this.hide();\r\n });\r\n\r\n this.$el.find(\".a-notification-show\").click(() => {\r\n this.show();\r\n });\r\n \r\n if (!this.options.keepOnNavigate) {\r\n $(\"body\").on(\"navigate\", () => this.close());\r\n }\r\n\r\n if (this.options.autoClose) {\r\n this.closeAfterTimeout(this.options.closeAfter);\r\n }\r\n }\r\n\r\n close() {\r\n // set automatic height to current computed height in order to activate CSS transition animation\r\n this.$el.height(this.$el.height());\r\n\r\n this.$el.addClass(\"a-notification-closed\");\r\n this.$el.height(0);\r\n\r\n setTimeout(() => {\r\n if (this.implicitStack && $(this.options.stack).children().length === 1) {\r\n $(this.options.stack).remove();\r\n } else {\r\n this.$el.remove();\r\n }\r\n }, 500);\r\n }\r\n\r\n hide() {\r\n this.$el.addClass(\"a-notification-hidden\");\r\n }\r\n \r\n show() {\r\n this.$el.removeClass(\"a-notification-hidden\");\r\n }\r\n\r\n setClosable(closeable: boolean) {\r\n this.$el.toggleClass(\"a-notification-closable\", closeable);\r\n }\r\n\r\n setHideable(hideable: boolean) {\r\n this.$el.toggleClass(\"a-notification-hideable\", hideable);\r\n }\r\n\r\n setContent(content: string, title?: string) {\r\n if (title != null) {\r\n this.$el.find(\".a-notification-title\").html(title);\r\n }\r\n this.$el.find(\".a-notification-text\").html(content);\r\n\r\n this.show();\r\n }\r\n\r\n setType(type: NotificationType) {\r\n this.$el.attr(\"data-notification-type\", type);\r\n this.show();\r\n }\r\n\r\n /**\r\n * Sets icon to 'error', shows the manual closing button and displays the given content\r\n * @param content the content to display\r\n */\r\n setError(content: string, title?: string) {\r\n this.setType(\"warning\");\r\n this.setContent(content, title);\r\n this.setClosable(true);\r\n }\r\n\r\n /**\r\n * Sets icon to 'ok', displays the given content and sets the closing interval to 5s -> The\r\n * notification will disapear in 5s\r\n * @param content the content to display\r\n */\r\n setOk(content: string, title?: string) {\r\n this.setType(\"success\");\r\n this.setContent(content, title);\r\n this.closeAfterTimeout(5000);\r\n }\r\n\r\n setIcon(icon: NotificationIcon) {\r\n // compatibility with old notification\r\n switch (icon) {\r\n case NotificationIcon.Loading:\r\n this.setType(\"loading\");\r\n break;\r\n case NotificationIcon.Ok:\r\n this.setType(\"success\");\r\n break;\r\n case NotificationIcon.Error:\r\n this.setType(\"warning\");\r\n break;\r\n case NotificationIcon.Info:\r\n this.setType(\"info\");\r\n break;\r\n }\r\n }\r\n\r\n closeAfterTimeout(timeout?: number) {\r\n window.setTimeout(() => {\r\n this.close();\r\n }, timeout || this.options.closeAfter);\r\n }\r\n }\r\n\r\n export class LoadingNotification extends Notification {\r\n errorMsg: string;\r\n successMsg: string;\r\n\r\n constructor(loadingMsg: string, successMsg: string, errorMsg: string) {\r\n super(loadingMsg, { closable: false, icon: NotificationIcon.Loading });\r\n this.errorMsg = errorMsg;\r\n this.successMsg = successMsg;\r\n }\r\n\r\n ok() {\r\n this.setOk(this.successMsg);\r\n }\r\n\r\n error() {\r\n this.setError(this.errorMsg);\r\n }\r\n }\r\n\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Data {\r\n export module Export {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ExcelExportColumnDefinition {\r\n field: string;\r\n header: string;\r\n width?: number;\r\n format?: string;\r\n align?: string;\r\n styles?: {\r\n background?: string;\r\n foreground?: string;\r\n headerForeground?: string;\r\n headerBackground?: string;\r\n headerBorder?: kendo.ui.SpreadsheetSheetRowCellBorderBottom;\r\n };\r\n parse?: (value: any) => any;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CsvExportColumnDefinition {\r\n field: string;\r\n header?: string;\r\n format?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CsvExportOptions {\r\n showHeader?: boolean;\r\n columnDelimiter?: string;\r\n rowDelimiter?: string;\r\n culture?: string;\r\n useSaveFileProxy?: boolean;\r\n mimeType?: string;\r\n charset?: string;\r\n }\r\n\r\n export function saveAsExcel(data: any[],\r\n columns: ExcelExportColumnDefinition[],\r\n sheetTitle: string,\r\n filename: string) {\r\n if (!data || data.length === 0) {\r\n return;\r\n }\r\n\r\n if (!columns || columns.length === 0) {\r\n throw \"No fields for excel export defined!\";\r\n }\r\n\r\n var sheetColumns = [];\r\n var rows = [{ cells: [] }];\r\n\r\n columns.forEach(column => {\r\n sheetColumns.push({\r\n autoWidth: column.width ? false : true,\r\n width: column.width\r\n });\r\n rows[0].cells.push({\r\n value: column.header,\r\n background: (column.styles ? column.styles.headerBackground : undefined) || \"#3E3E3E\",\r\n color: (column.styles ? column.styles.headerForeground : undefined) || \"#FFFFFF\",\r\n fontSize: 12,\r\n bold: true,\r\n borderBottom: (column.styles ? column.styles.headerBorder : undefined) ||\r\n { color: \"#EF8200\", size: 3 }\r\n });\r\n });\r\n\r\n data.forEach(data => {\r\n var row = { cells: [] };\r\n\r\n columns.forEach(field => row.cells.push({\r\n value: field.parse ? field.parse(data[field.field]) : data[field.field],\r\n format: field.format,\r\n textAlign: field.align || \"left\",\r\n background: field.styles ? field.styles.background : undefined,\r\n color: field.styles ? field.styles.foreground : undefined\r\n }));\r\n\r\n rows.push(row);\r\n });\r\n\r\n var workbook = new kendo.ooxml.Workbook({\r\n sheets: [\r\n {\r\n columns: sheetColumns,\r\n title: sheetTitle,\r\n rows: rows\r\n }\r\n ]\r\n });\r\n\r\n kendo.saveAs({ dataURI: workbook.toDataURL(), fileName: filename + \".xlsx\" });\r\n }\r\n\r\n export function saveAsCsv(data: any[],\r\n columns: CsvExportColumnDefinition[],\r\n filename: string,\r\n options?: CsvExportOptions) {\r\n if (!data || data.length === 0) {\r\n return;\r\n }\r\n options = AppKitchen.OptionsHelper.merge(options,\r\n {\r\n showHeader: true,\r\n columnDelimiter: \";\",\r\n rowDelimiter: \"\\r\\n\",\r\n culture: AppKitchen.GlobalSettings.culture,\r\n useSaveFileProxy: true,\r\n mimeType: \"text/plain\",\r\n charset: null\r\n });\r\n\r\n var lines: string[] = [];\r\n\r\n if (options.showHeader) {\r\n var values: string[] = [];\r\n columns.forEach(column => {\r\n values.push(column.header || column.field);\r\n });\r\n lines.push(values.join(options.columnDelimiter));\r\n }\r\n\r\n data.forEach(row => {\r\n var values: string[] = [];\r\n columns.forEach(column => {\r\n var value = row[column.field];\r\n var stringValue: string;\r\n if (value instanceof Date) {\r\n stringValue = kendo.toString(value, column.format || \"g\", options.culture);\r\n } else if (typeof value === \"number\") {\r\n stringValue = kendo.toString(value, \"0.################\", options.culture);\r\n } else {\r\n stringValue = value;\r\n }\r\n values.push(stringValue);\r\n });\r\n lines.push(values.join(options.columnDelimiter));\r\n });\r\n\r\n var text = lines.join(options.rowDelimiter);\r\n\r\n let dataUri = \"data:\" + options.mimeType;\r\n if (options.charset != null) {\r\n dataUri += \";charset=\" + options.charset;\r\n }\r\n dataUri += \";base64,\" + btoa(text);\r\n\r\n if (dataUri.length > 1000000 && !options.useSaveFileProxy) {\r\n console.log(\"please use a proxy for large files, otherwise errors may occur\");\r\n }\r\n\r\n var proxyUrl = options.useSaveFileProxy ? Data.getDataApiUrl(\"SaveFile\") : null;\r\n kendo.saveAs({ dataURI: dataUri, fileName: filename + \".csv\", proxyURL: proxyUrl, forceProxy: options.useSaveFileProxy });\r\n }\r\n }\r\n }\r\n}\r\n","/// \r\n/// \r\n/// \r\n\r\nmodule AppKitchen {\r\n\r\n // BrowserHelper must be always on Top\r\n export module BrowserHelper {\r\n\r\n export function triggerWindowResizeEvent() {\r\n var evt = window.document.createEvent('UIEvents');\r\n evt.initUIEvent('resize', true, false, window, 0);\r\n window.dispatchEvent(evt);\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export function isIE(): boolean {\r\n var userAgent = AppKitchen.BrowserHelper.getUserAgent().toUpperCase();\r\n return userAgent.indexOf(\"MSIE\") !== -1 || !!navigator.userAgent.match(/TRIDENT\\/7\\./);\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export function IEVersion(): number {\r\n var userAgent = AppKitchen.BrowserHelper.getUserAgent().toUpperCase();\r\n var index = userAgent.indexOf(\"MSIE\");\r\n if (index !== -1) {\r\n return parseInt(userAgent.substring(index + 5, Math.max(2, userAgent.indexOf(\".\", index))));\r\n } else if (!!userAgent.match(/TRIDENT\\/7\\./)) {\r\n return 11;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n export function getUserAgent() {\r\n return window.navigator.userAgent;\r\n }\r\n\r\n function throwStartupError(userFriendlyMessage: string, debugMessage: string) {\r\n // do not user jQuery! intended to work with old browsers\r\n var errorInfo = document.createElement('div');\r\n errorInfo.className = \"a-startup-error\";\r\n errorInfo.innerHTML = 'App can not be started due to the following reason:
' + userFriendlyMessage;\r\n document.body.appendChild(errorInfo);\r\n throw debugMessage;\r\n }\r\n\r\n export function checkBrowser() {\r\n if (AppKitchen.BrowserHelper.isIE()) {\r\n var ieVersion = AppKitchen.BrowserHelper.IEVersion();\r\n if (ieVersion && ieVersion < 10) {\r\n throwStartupError(\"Incompatible browser! App requires Internet Explorer 10 or newer.\", \"Incompatible IE version detected \" + ieVersion + \", minimum required version is 10.\");\r\n }\r\n }\r\n }\r\n\r\n // check browser version immediately and throw error if incompatible\r\n checkBrowser();\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface BrowserWindowOptions {\r\n addressbar?: boolean;\r\n toolbar?: boolean;\r\n menubar?: boolean;\r\n statusbar?: boolean;\r\n resizable?: boolean;\r\n width?: number;\r\n height?: number;\r\n position?: { top: number, left: number };\r\n }\r\n\r\n export function openInWindow(url: string, minimal?: boolean, options?: BrowserWindowOptions): Window {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n addressbar: true,\r\n menubar: !minimal,\r\n toolbar: !minimal,\r\n statusbar: !minimal,\r\n resizable: true,\r\n width: undefined,\r\n height: undefined,\r\n position: undefined\r\n });\r\n\r\n var features = [];\r\n if (options.addressbar != null) features.push(\"location=\" + (options.addressbar ? \"yes\" : \"no\"));\r\n if (options.menubar != null) features.push(\"menubar=\" + (options.menubar ? \"yes\" : \"no\"));\r\n if (options.toolbar != null) features.push(\"toolbar=\" + (options.toolbar ? \"yes\" : \"no\"));\r\n if (options.statusbar != null) features.push(\"status=\" + (options.statusbar ? \"yes\" : \"no\"));\r\n if (options.resizable != null) features.push(\"resizable=\" + (options.resizable ? \"yes\" : \"no\"));\r\n if (options.width != null) features.push(\"width=\" + options.width);\r\n if (options.height != null) features.push(\"height=\" + options.height);\r\n if (options.position != null) {\r\n features.push(\"left=\" + options.position.left);\r\n features.push(\"top=\" + options.position.top);\r\n }\r\n\r\n var openedWindow = window.open(url, \"_blank\", features.join(\",\"));\r\n openedWindow.focus();\r\n\r\n return openedWindow;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface RedirectOptions {\r\n refresh?: boolean;\r\n push?: boolean;\r\n }\r\n\r\n export function setUrl(url: string, options?: RedirectOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n refresh: true,\r\n push: true\r\n });\r\n\r\n if (!options.refresh && history.replaceState && history.pushState) {\r\n if (options.push) {\r\n window.history.pushState({ path: url }, null, url);\r\n } else {\r\n window.history.replaceState({ path: url }, null, url);\r\n }\r\n } else {\r\n if (window.location.href === url) {\r\n window.location.reload(true);\r\n }\r\n if (options.push) {\r\n window.location.href = url;\r\n } else {\r\n window.location.replace(url);\r\n window.setTimeout(() => window.location.reload(true), 1000); // reloads if replace did not (when using #route)\r\n }\r\n }\r\n }\r\n\r\n export function getUrl(): string {\r\n return window.location.href;\r\n }\r\n\r\n export module UrlQuery {\r\n export function getParameters(): { [key: string]: any } {\r\n var queryParams = {};\r\n var url = AppKitchen.BrowserHelper.getUrl() || \"\";\r\n var queryString = (url.indexOf(\"?\") !== -1) ? url.split(\"?\")[1] : null;\r\n if (queryString) {\r\n var vars = queryString.split(\"&\");\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split(\"=\");\r\n if (typeof queryParams[pair[0]] === \"undefined\") {\r\n queryParams[pair[0]] = decodeURIComponent(pair[1]);\r\n } else if (typeof queryParams[pair[0]] === \"string\") {\r\n var arr = [queryParams[pair[0]], decodeURIComponent(pair[1])];\r\n queryParams[pair[0]] = arr;\r\n } else {\r\n queryParams[pair[0]].push(decodeURIComponent(pair[1]));\r\n }\r\n }\r\n }\r\n\r\n return queryParams;\r\n }\r\n\r\n export function getParameter(key: string): string {\r\n var parameters = UrlQuery.getParameters();\r\n if (parameters) {\r\n return parameters[key];\r\n }\r\n return undefined;\r\n }\r\n\r\n export function setParameter(key: string, value: string, options?: RedirectOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n push: false,\r\n refresh: false\r\n });\r\n\r\n var url = AppKitchen.BrowserHelper.getUrl();\r\n var baseUrl = url.split(\"?\")[0];\r\n\r\n var keyFound = false;\r\n var parameters = [];\r\n\r\n var queryString = (url.indexOf(\"?\") !== -1) ? url.split(\"?\")[1] : null;\r\n if (queryString) {\r\n parameters = queryString.split(\"&\");\r\n for (var i = parameters.length - 1; i >= 0; i--) {\r\n var parameterKey = parameters[i].split(\"=\")[0];\r\n if (parameterKey === key) {\r\n parameters[i] = key + \"=\" + encodeURIComponent(value);\r\n keyFound = true;\r\n }\r\n }\r\n }\r\n\r\n if (!keyFound) {\r\n parameters.push(key + \"=\" + value);\r\n }\r\n\r\n var newUrl = baseUrl + \"?\" + parameters.join(\"&\");\r\n\r\n AppKitchen.BrowserHelper.setUrl(newUrl, options);\r\n }\r\n\r\n export function removeParameter(key: string, options?: RedirectOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n push: false,\r\n refresh: false\r\n });\r\n\r\n var url = AppKitchen.BrowserHelper.getUrl();\r\n var newUrl = url.split(\"?\")[0];\r\n var queryString = (url.indexOf(\"?\") !== -1) ? url.split(\"?\")[1] : \"\";\r\n if (queryString !== \"\") {\r\n var parameters = queryString.split(\"&\");\r\n for (var i = parameters.length - 1; i >= 0; i--) {\r\n var parameterKey = parameters[i].split(\"=\")[0];\r\n if (parameterKey === key) {\r\n parameters.splice(i, 1);\r\n }\r\n }\r\n if (parameters.length > 0) {\r\n newUrl = newUrl + \"?\" + parameters.join(\"&\");\r\n }\r\n }\r\n\r\n AppKitchen.BrowserHelper.setUrl(newUrl, options);\r\n }\r\n\r\n export function clear(options?: RedirectOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n push: false,\r\n refresh: false\r\n });\r\n\r\n var url = AppKitchen.BrowserHelper.getUrl();\r\n AppKitchen.BrowserHelper.setUrl(url.split(\"?\")[0], options);\r\n }\r\n }\r\n\r\n export module WindowResize {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n interface WindowResizeAction {\r\n action: () => void;\r\n element?: HTMLElement;\r\n }\r\n\r\n var counter = 0;\r\n var actions: { [handle: string]: WindowResizeAction } = {};\r\n\r\n export function on(action: () => void, element?: HTMLElement): number {\r\n var handle = ++counter;\r\n\r\n actions[handle] = {\r\n action: action,\r\n element: element\r\n };\r\n\r\n trigger();\r\n return handle;\r\n }\r\n\r\n export function off(handle: number) {\r\n delete actions[handle];\r\n }\r\n\r\n export function trigger() {\r\n if (actions) {\r\n var lostActions = [];\r\n Object.keys(actions).forEach(key => {\r\n var action = actions[key];\r\n if (action.element && $(action.element).closest(\"body\").length === 0) {\r\n lostActions.push(key);\r\n } else {\r\n if (action.action) {\r\n action.action();\r\n }\r\n }\r\n });\r\n\r\n // cleanup lost actions\r\n if (lostActions.length > 0) {\r\n lostActions.forEach(handle => off(handle));\r\n }\r\n }\r\n }\r\n\r\n $(window).resize(() => AppKitchen.BrowserHelper.WindowResize.trigger());\r\n }\r\n\r\n }\r\n\r\n export module StringHelper {\r\n\r\n export function getString(key: string, resources: any) {\r\n if (resources) {\r\n var string = resources[key];\r\n if (string) {\r\n return string;\r\n }\r\n }\r\n return key;\r\n }\r\n\r\n export function generateRandom(length: number): string {\r\n var str = \"\";\r\n var possible = \"abcdefghijklmnopqrstuvwxyz0123456789\";\r\n\r\n for (var i = 0; i < length; i++) {\r\n str += possible.charAt(Math.floor(Math.random() * possible.length));\r\n }\r\n\r\n return str;\r\n }\r\n\r\n export function isValidIdentifier(key: string): boolean {\r\n // reserved keywords ECMA6\r\n if ([\"do\", \"if\", \"in\", \"for\", \"let\", \"new\", \"try\", \"var\", \"case\", \"else\",\r\n \"enum\", \"eval\", \"null\", \"this\", \"true\", \"void\", \"with\", \"break\", \"catch\",\r\n \"class\", \"const\", \"false\", \"super\", \"throw\", \"while\", \"yield\", \"delete\",\r\n \"export\", \"import\", \"public\", \"return\", \"static\", \"switch\", \"typeof\",\r\n \"default\", \"extends\", \"finally\", \"package\", \"private\", \"continue\",\r\n \"debugger\", \"function\", \"arguments\", \"interface\", \"protected\",\r\n \"implements\", \"instanceof\"].indexOf(key) !== -1) {\r\n return false;\r\n }\r\n\r\n // illegal special characters\r\n if (/[\\|&;\\s\\$%@\"'<>\\(\\)\\+,\\-\\\\/]/.exec(key) != null) {\r\n return false;\r\n }\r\n\r\n // beginning with number\r\n if (/^[0-9]/.exec(key) != null) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n }\r\n\r\n export module OptionsHelper {\r\n export function merge(customOptions: TOptions, defaultOptions: TOptions, deep?: boolean): TOptions {\r\n if (customOptions == null && defaultOptions == null) {\r\n return {};\r\n }\r\n if (deep == null) {\r\n deep = false;\r\n }\r\n if (customOptions) {\r\n return $.extend(deep, {}, defaultOptions, customOptions);\r\n }\r\n return defaultOptions;\r\n }\r\n }\r\n\r\n export module GuidHelper {\r\n export function newGuid() {\r\n return 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, function (c) {\r\n const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export module UIHelper {\r\n export function renderTemplateTo(container: HTMLElement, template: string, content?: any): JQuery {\r\n if (content) {\r\n $(container).html(_.template(template)(content));\r\n } else {\r\n $(container).html(template);\r\n }\r\n\r\n AppKitchen.UIHelper.updateFullHeightGrids(container);\r\n\r\n return $(container);\r\n }\r\n\r\n export function renderTemplate(template: string, content: any): string {\r\n return _.template(template)(content);\r\n }\r\n\r\n export function clearSelection() {\r\n if ((document).selection) {\r\n (document).selection.empty();\r\n } else if (window.getSelection) {\r\n window.getSelection().removeAllRanges();\r\n }\r\n }\r\n\r\n export function updateFullHeightGrids(container?: HTMLElement) {\r\n var target = $(\"body\");\r\n if (container) {\r\n target = $(container).parent();\r\n }\r\n target.find(\".full-height-grid\").each((i, grid) => {\r\n // set grid height to available height inside parent (excluding padding)\r\n $(grid).css(\"height\", \"\");\r\n var availableHeight = $(grid).parent().height();\r\n $(grid).outerHeight(availableHeight);\r\n $(grid).trigger(\"fill-height\");\r\n\r\n // get available height inside grid (exclude padding)\r\n availableHeight = $(grid).height();\r\n // substract heights of all other children (include margins)\r\n $(grid).children().not(\".fill-height\").each((j, row) => {\r\n if ($(row).is(\":visible\") && $(row).css(\"position\") !== \"absolute\") {\r\n availableHeight -= $(row).outerHeight(true);\r\n }\r\n });\r\n\r\n // set heights of \"fill-height\" children to the remaining available height\r\n $(grid).find(\"> .fill-height\").each((j, row) => {\r\n $(row).outerHeight(availableHeight);\r\n var actualNewHeight = $(row).outerHeight(true);\r\n // hack to set element height including margin\r\n if (actualNewHeight > availableHeight) {\r\n $(row).outerHeight(availableHeight - (actualNewHeight - availableHeight));\r\n }\r\n $(row).trigger(\"fill-height\");\r\n });\r\n });\r\n }\r\n\r\n AppKitchen.BrowserHelper.WindowResize.on(() => AppKitchen.UIHelper.updateFullHeightGrids());\r\n\r\n export type LoaderType = \"mesap\" | \"circle\" | \"concentric\";\r\n\r\n export type LoaderSize = \"S\" | \"M\" | \"L\" | \"XL\";\r\n\r\n export interface LoaderRenderOptions {\r\n size?: LoaderSize,\r\n fadeIn?: number,\r\n complete?: () => void,\r\n type?: LoaderType,\r\n }\r\n\r\n export interface LoaderRemoveOptions {\r\n fadeOut?: number,\r\n complete?: () => void,\r\n }\r\n\r\n export function renderLoader(target: HTMLElement, options?: LoaderRenderOptions) {\r\n var opt = AppKitchen.OptionsHelper.merge(options, { size: \"M\", type: \"concentric\" });\r\n \r\n var template = AppKitchen.Templates.LoadingConcentricSpinner;\r\n if (opt.type) {\r\n if (opt.type === \"concentric\") {\r\n template = AppKitchen.Templates.LoadingConcentricSpinner;\r\n } else if (opt.type === \"circle\") {\r\n template = AppKitchen.Templates.LoadingCircleSpinner;\r\n } else if (opt.type === \"mesap\") {\r\n template = AppKitchen.Templates.LoadingMesapSpinner;\r\n }\r\n }\r\n\r\n $(target).find(\"> .a-loading\").remove();\r\n $(target).append(AppKitchen.UIHelper.renderTemplate(template, { size: opt.size }));\r\n\r\n if (opt.fadeIn) {\r\n $(target).find(\"> .a-loading\").fadeIn(opt.fadeIn, opt.complete);\r\n } else if (opt.complete) {\r\n opt.complete();\r\n }\r\n }\r\n\r\n export function removeLoader(target: HTMLElement, options?: LoaderRemoveOptions) {\r\n var opt = AppKitchen.OptionsHelper.merge(options, {});\r\n var animationContainer = $(target).find(\"> .a-loading-base\");\r\n if (animationContainer.length > 0) {\r\n animationContainer.fadeOut(opt.fadeOut || 150, () => {\r\n animationContainer.remove();\r\n if (opt.complete) {\r\n opt.complete();\r\n }\r\n });\r\n } else if (opt.complete) {\r\n opt.complete();\r\n }\r\n }\r\n\r\n export function renderLoadingAnimation(container: HTMLElement, size: string, fadeIn?: number, complete?: () => void, loaderType?: LoaderType) {\r\n if ([\"S\", \"M\", \"L\", \"XL\"].indexOf(size) === -1) {\r\n size = \"M\";\r\n }\r\n\r\n $(container).find(\"> .a-loading\").remove();\r\n if (loaderType && loaderType === \"concentric\") {\r\n $(container).append(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.LoadingConcentricSpinner, { size: size }));\r\n } else if (loaderType && loaderType === \"circle\") {\r\n $(container).append(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.LoadingCircleSpinner, { size: size }));\r\n } else {\r\n $(container).append(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.LoadingMesapSpinner, { size: size }));\r\n }\r\n\r\n if (fadeIn) {\r\n $(container).find(\"> .a-loading\").fadeIn(fadeIn, complete);\r\n } else if (complete) {\r\n complete();\r\n }\r\n }\r\n\r\n export function removeLoadingAnimation(container: HTMLElement, fadeOut?: number, complete?: () => void) {\r\n var animationContainer = $(container).find(\"> .a-loading-base\");\r\n if (animationContainer.length > 0) {\r\n animationContainer.fadeOut(fadeOut || 150, () => {\r\n animationContainer.remove();\r\n if (complete) {\r\n complete();\r\n }\r\n });\r\n } else if (complete) {\r\n complete();\r\n }\r\n }\r\n\r\n export function hideTooltips(except?: kendo.ui.Tooltip) {\r\n $(\"[data-role=tooltip]\").each((i, el) => {\r\n var tooltip = $(el).data(\"kendoTooltip\");\r\n if (tooltip && tooltip !== except) {\r\n tooltip.hide();\r\n }\r\n });\r\n }\r\n\r\n export function addTooltip(el: JQuery, position: string) {\r\n el.kendoTooltip({\r\n position: position,\r\n show: e => UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n\r\n export function getHighestZIndex(): number {\r\n var maxZ = -1;\r\n $(\"*\").each((i, e) => {\r\n var z = parseInt($(e).css(\"z-index\"), 10);\r\n if (z && z > maxZ) {\r\n maxZ = z;\r\n }\r\n });\r\n return maxZ;\r\n }\r\n\r\n export module Colors {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface RgbColor {\r\n r: number;\r\n g: number;\r\n b: number;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface HslColor {\r\n h: number;\r\n s: number;\r\n l: number;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface HsvColor {\r\n h: number;\r\n s: number;\r\n v: number;\r\n }\r\n\r\n export function parseColor(color: string): RgbColor {\r\n if (color && color.beginsWith(\"#\")) {\r\n return hex2Rgb(color);\r\n }\r\n\r\n if (color && color.beginsWith(\"rgb\")) {\r\n return parseRgbString(color);\r\n }\r\n\r\n throw \"Invalid color string\";\r\n }\r\n\r\n export function hex2Rgb(color: string): RgbColor {\r\n if (color.substr(0, 1) !== \"#\" || (color.length !== 7 && color.length !== 4))\r\n throw \"Invalid HEX color code\";\r\n\r\n if (color.length === 4) {\r\n color = extendShortHex(color);\r\n }\r\n\r\n var parser = /^#([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(color);\r\n\r\n if (!parser || parser.length !== 4)\r\n throw \"Invalid HEX color code\";\r\n\r\n return {\r\n r: parseInt(parser[1], 16),\r\n g: parseInt(parser[2], 16),\r\n b: parseInt(parser[3], 16)\r\n }\r\n }\r\n\r\n export function rgb2Hex(color: RgbColor): string {\r\n validateRgbComponent(\"R\", color.r);\r\n validateRgbComponent(\"G\", color.g);\r\n validateRgbComponent(\"B\", color.b);\r\n return \"#\" + componentToHex(color.r) + componentToHex(color.g) + componentToHex(color.b);\r\n }\r\n\r\n export function extendShortHex(color: string): string {\r\n var parser = /^#([a-f\\d])([a-f\\d])([a-f\\d])$/i.exec(color);\r\n if (!parser || parser.length !== 4) {\r\n throw \"Invalid short HEX color code\";\r\n }\r\n return \"#\" + parser[1] + parser[1] + parser[2] + parser[2] + parser[3] + parser[3];\r\n }\r\n\r\n export function lightenRgb(color: RgbColor, amount: number): RgbColor {\r\n return {\r\n r: Math.floor(color.r + (255 - color.r) * amount),\r\n g: Math.floor(color.g + (255 - color.g) * amount),\r\n b: Math.floor(color.b + (255 - color.b) * amount)\r\n }\r\n }\r\n\r\n export function darkenRgb(color: RgbColor, amount: number): RgbColor {\r\n return {\r\n r: Math.floor(color.r * (1 - amount)),\r\n g: Math.floor(color.g * (1 - amount)),\r\n b: Math.floor(color.b * (1 - amount))\r\n }\r\n }\r\n\r\n export function rgb2rgba(color: RgbColor, a: number): string {\r\n return \"rgba(\" + color.r + \",\" + color.g + \",\" + color.b + \",\" + a + \")\";\r\n }\r\n\r\n export function lightenHex(color: string, amount: number): string {\r\n return rgb2Hex(lightenRgb(hex2Rgb(color), amount));\r\n }\r\n\r\n export function darkenHex(color: string, amount: number): string {\r\n return rgb2Hex(darkenRgb(hex2Rgb(color), amount));\r\n }\r\n\r\n function validateRgbComponent(component: string, value: number): number {\r\n if (value == null || value < 0 || value > 255) {\r\n throw \"Invalid \" + component + \" component\";\r\n }\r\n\r\n return value;\r\n }\r\n\r\n function parseRgbString(color: string): RgbColor {\r\n color = color.trim();\r\n var parser = /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/.exec(color);\r\n if (!parser || parser.length !== 4) {\r\n throw \"Invalid RGB string\";\r\n }\r\n return {\r\n r: validateRgbComponent(\"R\", parseInt(parser[1])),\r\n g: validateRgbComponent(\"G\", parseInt(parser[2])),\r\n b: validateRgbComponent(\"B\", parseInt(parser[3]))\r\n }\r\n }\r\n\r\n function componentToHex(c) {\r\n var hex = c.toString(16);\r\n return hex.length === 1 ? \"0\" + hex : hex;\r\n }\r\n\r\n }\r\n\r\n export module Scrolling {\r\n\r\n export function customScroller(targetElement: HTMLElement) {\r\n if ($(targetElement).hasClass(\"nano\")) {\r\n $(targetElement).nanoScroller({ destroy: true });\r\n $(targetElement).removeClass(\"nano\");\r\n $(targetElement).children().removeClass(\"nano-content\");\r\n }\r\n\r\n $(targetElement).addClass(\"nano\");\r\n if ($(targetElement).children().length === 1) {\r\n $(targetElement).children().addClass(\"nano-content\");\r\n } else {\r\n $('
').appendTo(targetElement).append($(targetElement).children());\r\n }\r\n\r\n $(targetElement).nanoScroller({ disableResize: false });\r\n\r\n if ($(targetElement).hasClass(\"full-height-grid\") || $(targetElement).hasClass(\"fill-height\")) {\r\n $(targetElement).on(\"fill-height\", () => {\r\n $(targetElement).nanoScroller({ disableResize: true });\r\n });\r\n }\r\n }\r\n\r\n export function synchronizeScrolling(scroller1: HTMLElement, scroller2: HTMLElement) {\r\n var $scroller1 = $(scroller1);\r\n var $scroller2 = $(scroller2);\r\n\r\n var scrolling1Timeout = null;\r\n var scrolling2Timeout = null;\r\n\r\n $scroller1.on('scroll', () => {\r\n if (!$scroller2.hasClass(\"scrolling\")) {\r\n $scroller1.addClass(\"scrolling\");\r\n $scroller2.scrollTo($scroller1.scrollTop());\r\n clearTimeout(scrolling1Timeout);\r\n scrolling1Timeout = setTimeout(() => $scroller1.removeClass(\"scrolling\"), 300);\r\n }\r\n });\r\n\r\n $scroller2.on('scroll', () => {\r\n if ($scroller2.scrollTop() !== $scroller1.scrollTop()) {\r\n if (!$scroller1.hasClass(\"scrolling\")) {\r\n $scroller2.addClass(\"scrolling\");\r\n $scroller1.scrollTo($scroller2.scrollTop());\r\n clearTimeout(scrolling2Timeout);\r\n scrolling2Timeout = setTimeout(() => $scroller2.removeClass(\"scrolling\"), 300);\r\n }\r\n }\r\n });\r\n }\r\n\r\n export function offsetToViewport(element: HTMLElement, scroller: HTMLElement, included?: boolean): number {\r\n var viewport = {\r\n top: $(scroller).scrollTop(),\r\n bottom: $(scroller).scrollTop() + $(scroller).height()\r\n };\r\n\r\n var elementBounds = {\r\n top: element.offsetTop,\r\n // ReSharper disable once DoubleNegationOfBoolean\r\n bottom: element.offsetTop + $(element).outerHeight(!!included)\r\n }\r\n\r\n if (included) {\r\n if (elementBounds.top >= viewport.top && elementBounds.bottom <= viewport.bottom) {\r\n return 0;\r\n }\r\n if (elementBounds.top < viewport.top) {\r\n return elementBounds.top - viewport.top;\r\n }\r\n return elementBounds.bottom - viewport.bottom;\r\n }\r\n\r\n if (elementBounds.top <= viewport.bottom && elementBounds.bottom >= viewport.top) {\r\n return 0;\r\n }\r\n if (elementBounds.top > viewport.bottom) {\r\n return elementBounds.top - viewport.bottom;\r\n }\r\n return elementBounds.bottom - viewport.top;\r\n }\r\n\r\n export function scrollIntoViewport(element: HTMLElement, scroller: HTMLElement, duration?: number) {\r\n var distance = Scrolling.offsetToViewport(element, scroller, true);\r\n if (distance !== 0) {\r\n //$(scroller).animate({\r\n // scrollTop: $(scroller).scrollTop() + distance\r\n //}, duration | 300);\r\n\r\n $(scroller).scrollTo($(scroller).scrollTop() + distance, {\r\n axis: \"y\",\r\n duration: duration | 300\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n export module Transitions {\r\n export function introduce(container: HTMLElement, duration: number, action: () => void) {\r\n $(container).css(\"opacity\", 0);\r\n action();\r\n $(container).animate({ opacity: 1 }, duration);\r\n }\r\n\r\n export function swap(container: HTMLElement, fadeOutDuration: number, fadeInDuration: number, action: () => void, after?: () => void) {\r\n $(container).animate({ opacity: 0 }, fadeOutDuration, () => {\r\n action();\r\n $(container).animate({ opacity: 1 }, fadeInDuration, () => {\r\n if (after) {\r\n after();\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n export module Windows {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface WindowButton {\r\n name: string;\r\n icon?: string;\r\n action?: (window: kendo.ui.Window) => void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface WindowOptions {\r\n title?: string;\r\n buttons?: WindowButton[];\r\n width?: string;\r\n height?: string;\r\n minWidth?: string;\r\n maxWidth?: string;\r\n minHeight?: string;\r\n maxHeight?: string;\r\n position?: { top: string, left: string };\r\n easyClose?: boolean;\r\n modal?: boolean;\r\n resizable?: boolean;\r\n draggable?: boolean;\r\n center?: boolean;\r\n opened?: (window: kendo.ui.Window) => void;\r\n closed?: () => void;\r\n resized?: () => void;\r\n animate?: boolean;\r\n keepOnNavigate?: boolean;\r\n overflow?: boolean;\r\n windowCssClass?: string;\r\n }\r\n\r\n export function openWindow(content: HTMLElement, options?: WindowOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n title: undefined,\r\n buttons: options && options.title != null ? [{ name: \"close\" }] : [],\r\n width: \"80%\",\r\n height: \"80%\",\r\n maxWidth: \"auto\",\r\n maxHeight: \"auto\",\r\n minHeight: \"auto\",\r\n minWidth: \"auto\",\r\n position: undefined,\r\n easyClose: false,\r\n modal: false,\r\n resizable: false,\r\n draggable: options ? !options.modal : false,\r\n center: false,\r\n animate: true,\r\n keepOnNavigate: false,\r\n opened: () => { },\r\n closed: () => { },\r\n resized: () => { },\r\n overflow: false\r\n });\r\n\r\n var modalOverlay;\r\n var highestZ = AppKitchen.UIHelper.getHighestZIndex();\r\n if (options.modal) {\r\n modalOverlay = $('
').appendTo($(\"body\"));\r\n modalOverlay.css(\"position\", \"absolute\");\r\n modalOverlay.css(\"z-index\", highestZ + 1);\r\n modalOverlay.fadeIn(options.animate ? 400 : 0);\r\n }\r\n\r\n var hasTitleBar = options.title || (options.buttons && options.buttons.length > 0);\r\n\r\n var popupWindow: kendo.ui.Window = $(content).kendoWindow({\r\n title: hasTitleBar ? options.title || \"\" : false,\r\n draggable: options.draggable,\r\n modal: false,\r\n scrollable: true,\r\n resizable: options.resizable,\r\n actions: [],\r\n deactivate: () => {\r\n if (options.closed) options.closed();\r\n popupWindow.destroy();\r\n },\r\n close: () => {\r\n if (options.modal) {\r\n modalOverlay.fadeOut(options.animate ? 300 : 0, () => modalOverlay.remove());\r\n }\r\n },\r\n visible: false,\r\n animation: {\r\n open: options.animate === false ? false : undefined,\r\n close: options.animate === false ? false : undefined\r\n },\r\n activate: e => {\r\n if (options.opened) {\r\n options.opened(popupWindow);\r\n }\r\n AppKitchen.UIHelper.updateFullHeightGrids(e.sender.wrapper[0]);\r\n // easyClose on overlay click (register after animation end)\r\n if (options.easyClose) {\r\n if (options.modal) {\r\n modalOverlay.click(() => e.sender.close());\r\n }\r\n }\r\n }\r\n }).data(\"kendoWindow\");\r\n popupWindow.bind(\"close\",\r\n () => {\r\n $(\"body\").find(\".a-main\").removeClass(\"is-background\");\r\n });\r\n $(\"body\").find(\".a-main\").addClass(\"is-background\");\r\n\r\n // css properties\r\n popupWindow.wrapper.css(\"position\", \"absolute\");\r\n popupWindow.wrapper.css(\"z-index\", highestZ + 2);\r\n popupWindow.wrapper.css(\"width\", options.width);\r\n popupWindow.wrapper.css(\"height\", options.height);\r\n popupWindow.wrapper.css(\"min-width\", options.minWidth);\r\n popupWindow.wrapper.css(\"max-width\", options.maxWidth);\r\n popupWindow.wrapper.css(\"min-height\", options.minHeight);\r\n popupWindow.wrapper.css(\"max-height\", options.maxHeight);\r\n if (options.overflow) {\r\n popupWindow.wrapper.find(\".k-window-content\").addClass(\"overflow\");\r\n }\r\n if (options.position) {\r\n popupWindow.wrapper.css(\"top\", options.position.top);\r\n popupWindow.wrapper.css(\"left\", options.position.left);\r\n } else {\r\n popupWindow.center();\r\n }\r\n\r\n // center\r\n if (options.center || (options.modal && !options.position)) {\r\n popupWindow.center();\r\n AppKitchen.BrowserHelper.WindowResize.on(() => popupWindow.center(), popupWindow.wrapper[0]);\r\n }\r\n\r\n if (options.windowCssClass) {\r\n popupWindow.wrapper.addClass(options.windowCssClass);\r\n }\r\n\r\n\r\n popupWindow.open();\r\n\r\n // easy close on ESC\r\n if (options.easyClose) {\r\n popupWindow.wrapper.keydown((e) => {\r\n if (e.which === 27) {\r\n popupWindow.close();\r\n }\r\n });\r\n }\r\n\r\n // update full height grids & responsive on resize\r\n if (options.resizable) {\r\n popupWindow.bind(\"resize\", () => {\r\n AppKitchen.UIHelper.Responsive.update();\r\n AppKitchen.UIHelper.updateFullHeightGrids(popupWindow.wrapper[0]);\r\n if (options.resized) {\r\n options.resized();\r\n }\r\n });\r\n }\r\n\r\n // close window on navigate\r\n if (!options.keepOnNavigate) {\r\n $(\"body\").on(\"navigate\", () => popupWindow.close());\r\n }\r\n\r\n // add buttons\r\n if (options.buttons) {\r\n var buttonsContainer = popupWindow.wrapper.find(\".k-window-actions\");\r\n options.buttons.forEach(button => {\r\n\r\n var $btn = $(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.WindowButton, {\r\n name: button.name,\r\n icon: button.icon || button.name\r\n })).prependTo(buttonsContainer);\r\n\r\n if (button.action) {\r\n $btn.click(button.action.bind(this, popupWindow));\r\n } else {\r\n // default actions\r\n switch (button.name) {\r\n case \"close\":\r\n $btn.click(() => popupWindow.close());\r\n break;\r\n case \"maximize\":\r\n $btn.click(() => popupWindow.maximize());\r\n break;\r\n case \"minimize\":\r\n $btn.click(() => popupWindow.minimize());\r\n break;\r\n case \"restore\":\r\n $btn.click(() => popupWindow.restore());\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return popupWindow;\r\n }\r\n }\r\n\r\n export module DialogBoxes {\r\n\r\n export type DialogBoxIcon = \"ok\" | \"warning\" | \"fail\" | \"unknown\";\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface DialogBoxOptions {\r\n title?: string | boolean;\r\n icon?: DialogBoxIcon;\r\n cssClass?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface AlertDialogOptions extends DialogBoxOptions {\r\n label?: string;\r\n close?: () => void;\r\n }\r\n\r\n export function alert(content: string, dialogOptions?: AlertDialogOptions) {\r\n var options = AppKitchen.OptionsHelper.merge(dialogOptions, {\r\n title: false,\r\n label: AppKitchen.Strings.Ok,\r\n close: () => { },\r\n icon: null\r\n });\r\n\r\n $(\"body > .a-dialog-box\").remove();\r\n $(\"body\").append('
');\r\n var container = $(\"body > .a-dialog-box\")[0];\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(container, AppKitchen.Templates.DialogBoxAlert, {\r\n icon: options.icon,\r\n title: options.title,\r\n content: content,\r\n ok: options.label\r\n });\r\n\r\n var box = AppKitchen.UIHelper.Windows.openWindow(container, {\r\n width: \"30em\",\r\n height: \"auto\",\r\n center: true,\r\n easyClose: false,\r\n modal: true,\r\n animate: false,\r\n buttons: [],\r\n windowCssClass: options.cssClass\r\n });\r\n\r\n $(container).find(\".a-alert-btn-ok\").click(() => {\r\n box.close();\r\n options.close();\r\n });\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ConfirmDialogOptions extends DialogBoxOptions {\r\n strings?: { ok: string, cancel: string };\r\n cancel?: () => void;\r\n }\r\n\r\n export function confirm(content: string, confirm: () => void, dialogOptions?: ConfirmDialogOptions) {\r\n var options = AppKitchen.OptionsHelper.merge(dialogOptions, {\r\n title: false,\r\n strings: { ok: AppKitchen.Strings.Ok, cancel: AppKitchen.Strings.Cancel },\r\n cancel: () => { },\r\n icon: null\r\n });\r\n\r\n $(\"body > .a-dialog-box\").remove();\r\n $(\"body\").append('
');\r\n var container = $(\"body > .a-dialog-box\")[0];\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(container, AppKitchen.Templates.DialogBoxConfirm, {\r\n icon: options.icon,\r\n title: options.title,\r\n content: content,\r\n ok: options.strings.ok,\r\n cancel: options.strings.cancel\r\n });\r\n\r\n var box = AppKitchen.UIHelper.Windows.openWindow(container, {\r\n width: \"30em\",\r\n height: \"auto\",\r\n center: true,\r\n easyClose: false,\r\n modal: true,\r\n animate: false,\r\n buttons: [],\r\n windowCssClass: options.cssClass\r\n });\r\n\r\n $(container).find(\".a-confirm-btn-ok\").click(() => {\r\n box.close();\r\n confirm();\r\n });\r\n\r\n $(container).find(\".a-confirm-btn-cancel\").click(() => {\r\n box.close();\r\n options.cancel();\r\n });\r\n }\r\n\r\n export function yesNo(content: string, yes: () => void, no?: () => void, title?: string) {\r\n return AppKitchen.UIHelper.DialogBoxes.confirm(content, yes, {\r\n title: title || \"\",\r\n strings: { ok: AppKitchen.Strings.Yes, cancel: AppKitchen.Strings.No },\r\n cancel: () => { if (no) no(); }\r\n });\r\n }\r\n\r\n }\r\n\r\n export module Notifications {\r\n var defaultNotificationStack: HTMLElement;\r\n\r\n export function notify(content: string, type: AppKitchen.Controls.Popups.NotificationType, options?: AppKitchen.Controls.Popups.NotificationOptions): AppKitchen.Controls.Popups.Notification {\r\n return new AppKitchen.Controls.Popups.Notification(content, AppKitchen.OptionsHelper.merge(options, {\r\n type: type,\r\n stack: getNotificationStack()\r\n }));\r\n }\r\n\r\n export function closeAll() {\r\n if (defaultNotificationStack) {\r\n $(defaultNotificationStack).children().fadeOut(150, () => {\r\n $(defaultNotificationStack).empty();\r\n });\r\n }\r\n }\r\n\r\n function getNotificationStack(): HTMLElement {\r\n // reuse existing notification stack\r\n if (!defaultNotificationStack) {\r\n defaultNotificationStack = $(AppKitchen.Templates.DefaultNotificationStack).appendTo(\"body\")[0];\r\n }\r\n\r\n // bring notification stack to front\r\n $(defaultNotificationStack).css(\"z-index\", AppKitchen.UIHelper.getHighestZIndex() + 1);\r\n\r\n return defaultNotificationStack;\r\n }\r\n }\r\n\r\n export module Responsive {\r\n var targets: { container: HTMLElement; minWidth: number; cssClass: string }[] = [];\r\n\r\n export function update() {\r\n if (targets) {\r\n var lostTargets = [];\r\n targets.forEach(target => {\r\n if ($(target.container).closest(\"body\").length === 0) {\r\n lostTargets.push(target);\r\n } else if ($(target.container).width() <= target.minWidth) {\r\n $(target.container).addClass(target.cssClass);\r\n } else {\r\n $(target.container).removeClass(target.cssClass);\r\n }\r\n });\r\n\r\n // cleanup targets\r\n if (lostTargets.length > 0) {\r\n lostTargets.forEach(target => {\r\n var i = targets.indexOf(target);\r\n targets.splice(i, 1);\r\n });\r\n }\r\n }\r\n }\r\n\r\n export function registerTarget(container: HTMLElement, minWidth: number, cssClass: string) {\r\n targets.push({\r\n container: container,\r\n minWidth: minWidth,\r\n cssClass: cssClass\r\n });\r\n\r\n update();\r\n }\r\n\r\n AppKitchen.BrowserHelper.WindowResize.on(() => AppKitchen.UIHelper.Responsive.update());\r\n }\r\n\r\n }\r\n\r\n export module Colors {\r\n export var CoalGray: string;\r\n export var DarkGray: string;\r\n export var Gray: string;\r\n export var MediumGray: string;\r\n export var Silver: string;\r\n export var LightGray: string;\r\n export var Gainsboro: string;\r\n export var WhiteSmoke: string;\r\n export var Orange: string;\r\n export var DarkOrange: string;\r\n export var OrangeRed: string;\r\n export var Red: string;\r\n export var Green: string;\r\n export var LightBlue: string;\r\n export var DarkBlue: string;\r\n export var CiColor: string;\r\n export var CiColorForeground: string;\r\n export var CiColor2: string;\r\n export var CiColor2Foreground: string;\r\n }\r\n\r\n export module LocalStorageHelper {\r\n export function store(key: string, value: any, options?: any) {\r\n if (options && options.expires) {\r\n var storedObject = {\r\n value: value,\r\n expires: kendo.toString(new Date().addDays(options.expires), \"yyyyMMdd HH:mm\")\r\n }\r\n localStorage.setItem(key, JSON.stringify(storedObject));\r\n } else {\r\n localStorage.setItem(key, value.toString());\r\n }\r\n }\r\n\r\n export function read(key: string) {\r\n var storedString = localStorage.getItem(key);\r\n var storedObject = JSON.parse(storedString);\r\n if (storedObject && storedObject.value) {\r\n return storedObject.value;\r\n }\r\n return storedString;\r\n }\r\n\r\n export function cleanUp() {\r\n // collect expired items\r\n var expired: string[] = [];\r\n $.each(localStorage, (key, storedString) => {\r\n try {\r\n var storedObject = JSON.parse(storedString);\r\n if (storedObject && storedObject.expires) {\r\n var expirationDate = kendo.parseDate(storedObject.expires, \"yyyyMMdd HH:mm\");\r\n if (new Date() >= expirationDate) {\r\n expired.push(key);\r\n }\r\n }\r\n } catch (exception) {\r\n\r\n }\r\n });\r\n // remove them\r\n for (let i = 0; i < expired.length; i++) {\r\n localStorage.removeItem(expired[i]);\r\n }\r\n }\r\n\r\n interface LocalStorageListener {\r\n key: string;\r\n callback: (value: string) => void;\r\n }\r\n\r\n var listeners: LocalStorageListener[] = [];\r\n\r\n function storageEventHandler(e) {\r\n for (let i = 0; i < listeners.length; i++) {\r\n if (e.key === listeners[i].key) {\r\n listeners[i].callback(read(listeners[i].key));\r\n }\r\n }\r\n }\r\n\r\n export function registerListener(key: string, callback: (value: string) => void) {\r\n listeners.push({\r\n key: key,\r\n callback: callback\r\n });\r\n }\r\n\r\n cleanUp();\r\n // ReSharper disable once Html.EventNotResolved\r\n window.addEventListener(\"storage\", (e) => storageEventHandler(e), false);\r\n }\r\n\r\n export module ExportHelper {\r\n // ReSharper disable once InconsistentNaming\r\n export interface ExportChartDataToExcelDefinition {\r\n timeseriesId: string;\r\n header: string;\r\n color: string;\r\n }\r\n\r\n export function exportChartDataToExcel(chartsData: AppKitchen.Data.TimeSeries.Model.ChartData[],\r\n definitions: ExportChartDataToExcelDefinition[],\r\n sheetTitle: string,\r\n filename: string) {\r\n var exportChartsData = [];\r\n definitions.forEach(def => {\r\n var chartData = chartsData.AsLinq()\r\n .FirstOrDefault(cd => cd.timeseriesId === def.timeseriesId);\r\n if (chartsData) {\r\n exportChartsData.push({\r\n data: chartData.data,\r\n header: def.header,\r\n color: def.color\r\n });\r\n }\r\n });\r\n\r\n var excelData = [];\r\n var firstChartData = exportChartsData[0];\r\n for (let dataIndex = 0; dataIndex < firstChartData.data.length; dataIndex++) {\r\n var tsData = firstChartData.data[dataIndex];\r\n var rowData = {\r\n timepoint: new Date(tsData[0]),\r\n \"#1\": tsData[1]\r\n }\r\n\r\n if (exportChartsData.length > 1) {\r\n for (let tsIndex = 1; tsIndex < exportChartsData.length; tsIndex++) {\r\n rowData[\"#\" + (tsIndex + 1)] = exportChartsData[tsIndex].data[dataIndex][1];\r\n }\r\n }\r\n\r\n excelData.push(rowData);\r\n }\r\n\r\n var columnDefinitions: Data.Export.ExcelExportColumnDefinition[] = [\r\n {\r\n header: AppKitchen.Strings.ExcelExport_DateTimeColumnHeader,\r\n field: \"timepoint\",\r\n format: \"dd.mm.yyyy hh:mm\",\r\n width: 150,\r\n styles: {\r\n headerBorder: { color: Colors.LightGray, size: 3 },\r\n headerBackground: \"#FFFFFF\",\r\n headerForeground: Colors.Gray\r\n }\r\n }\r\n ];\r\n\r\n for (let tsIndex = 0; tsIndex < exportChartsData.length; tsIndex++) {\r\n columnDefinitions.push({\r\n header: exportChartsData[tsIndex].header.toUpperCase(),\r\n field: \"#\" + (tsIndex + 1),\r\n width: 150,\r\n styles: {\r\n headerBorder: { color: exportChartsData[tsIndex].color, size: 3 },\r\n headerBackground: \"#FFFFFF\",\r\n headerForeground: exportChartsData[tsIndex].color,\r\n background: exportChartsData[tsIndex].color ? UIHelper.Colors.lightenHex(exportChartsData[tsIndex].color, .9) : undefined\r\n }\r\n });\r\n }\r\n\r\n Data.Export.saveAsExcel(excelData, columnDefinitions, sheetTitle, filename);\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ExportChartDataToCsvDefinition {\r\n timeseriesId: string;\r\n header: string;\r\n }\r\n\r\n export function exportChartDataToCsv(chartsData: AppKitchen.Data.TimeSeries.Model.ChartData[],\r\n definitions: ExportChartDataToCsvDefinition[],\r\n filename: string,\r\n dateFormat?: string,\r\n options?: Data.Export.CsvExportOptions) {\r\n var exportChartsData = [];\r\n definitions.forEach(def => {\r\n var chartData = chartsData.AsLinq()\r\n .FirstOrDefault(cd => cd.timeseriesId === def.timeseriesId);\r\n if (chartsData) {\r\n exportChartsData.push({\r\n data: chartData.data,\r\n header: def.header\r\n });\r\n }\r\n });\r\n\r\n var csvData = [];\r\n var firstChartData = exportChartsData[0];\r\n for (let dataIndex = 0; dataIndex < firstChartData.data.length; dataIndex++) {\r\n var tsData = firstChartData.data[dataIndex];\r\n var rowData = {\r\n timepoint: new Date(tsData[0]),\r\n \"#1\": tsData[1]\r\n }\r\n\r\n if (exportChartsData.length > 1) {\r\n for (let tsIndex = 1; tsIndex < exportChartsData.length; tsIndex++) {\r\n rowData[\"#\" + (tsIndex + 1)] = exportChartsData[tsIndex].data[dataIndex][1];\r\n }\r\n }\r\n\r\n csvData.push(rowData);\r\n }\r\n\r\n var columnDefinitions: Data.Export.CsvExportColumnDefinition[] = [\r\n {\r\n header: AppKitchen.Strings.ExcelExport_DateTimeColumnHeader,\r\n field: \"timepoint\",\r\n format: dateFormat || \"g\"\r\n }\r\n ];\r\n\r\n for (let tsIndex = 0; tsIndex < exportChartsData.length; tsIndex++) {\r\n columnDefinitions.push({\r\n header: exportChartsData[tsIndex].header.toUpperCase(),\r\n field: \"#\" + (tsIndex + 1)\r\n });\r\n }\r\n\r\n Data.Export.saveAsCsv(csvData, columnDefinitions, filename, options);\r\n }\r\n }\r\n\r\n // Moved to AppKitchen.Controls.Tile\r\n //export module Tile {\r\n\r\n // export enum TileStyle {\r\n // Dark,\r\n // Bright\r\n // }\r\n\r\n // export enum TileSize {\r\n // L,\r\n // M\r\n // }\r\n\r\n // // ReSharper disable once InconsistentNaming\r\n // export interface TileOptions {\r\n // style?: TileStyle,\r\n // size?: TileSize;\r\n // id: string,\r\n // icon?: string,\r\n // image?: string,\r\n // title: string,\r\n // subtitle?: string,\r\n // status?: string,\r\n // statusIcon?: string,\r\n // click?: (id: string) => void,\r\n // }\r\n\r\n // export function create(target: HTMLElement, options: TileOptions) {\r\n // UIHelper.renderTemplateTo(target,\r\n // AppKitchen.Templates.Tile,\r\n // {\r\n // style: TileStyle[options.style],\r\n // size: TileSize[options.size],\r\n // id: options.id,\r\n // icon: options.icon,\r\n // image: options.image,\r\n // title: options.title,\r\n // subtitle: options.subtitle,\r\n // status: options.status,\r\n // statusIcon: options.statusIcon\r\n // });\r\n // $(target).find(`a-tile[data-id=${options.id}]`).bind(\"click\", () => options.click(options.id));\r\n // }\r\n\r\n // export function append(target: HTMLElement, options: TileOptions) {\r\n // options = AppKitchen.OptionsHelper.merge(options,\r\n // {\r\n // id: options.id ? options.id : GuidHelper.newGuid(),\r\n // title: null,\r\n // style: TileStyle.Bright,\r\n // size: TileSize.M\r\n // });\r\n // var rendertedTemplate = UIHelper.renderTemplate(AppKitchen.Templates.Tile,\r\n // {\r\n // style: TileStyle[options.style],\r\n // size: TileSize[options.size],\r\n // id: options.id,\r\n // icon: options.icon,\r\n // image: options.image,\r\n // title: options.title,\r\n // subtitle: options.subtitle,\r\n // status: options.status,\r\n // statusIcon: options.statusIcon\r\n // });\r\n // $(rendertedTemplate).appendTo(target);\r\n // $(target).find(`a-tile[data-id=${options.id}]`).bind(\"click\", () => options.click(options.id));\r\n // }\r\n //}\r\n\r\n}\r\n\r\ninterface Date {\r\n addDays(days: number): Date;\r\n addHours(hours: number): Date;\r\n addMinutes(minutes: number): Date;\r\n onlyDate(): Date;\r\n toLocalISOString(): string;\r\n}\r\n\r\ninterface String {\r\n truncate(length: number): string;\r\n nl2br(): string;\r\n endsWith(searchString: string): boolean;\r\n beginsWith(searchString: string): boolean;\r\n escapeHTML(): string;\r\n toDate(): Date;\r\n replaceAll(searchValue: string, replaceValue: string): string;\r\n}\r\n\r\nString.prototype.toDate = function () {\r\n return kendo.parseDate(this, \"yyyy-MM-ddTHH:mm:ss\");\r\n}\r\n\r\nDate.prototype.addDays = function (days: number): Date {\r\n var oldDate = new Date(this.valueOf());\r\n var newDate = new Date(this.valueOf() + days * 86400000);\r\n return new Date(newDate.valueOf() + (newDate.getTimezoneOffset() - oldDate.getTimezoneOffset()) * 60000);\r\n};\r\n\r\nDate.prototype.addHours = function (hours: number): Date {\r\n return new Date(this.valueOf() + hours * 3600000);\r\n};\r\n\r\nDate.prototype.addMinutes = function (minutes: number): Date {\r\n return new Date(this.valueOf() + minutes * 60000);\r\n};\r\n\r\nDate.prototype.onlyDate = function (): Date {\r\n var date = new Date(this.valueOf());\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nDate.prototype.toLocalISOString = function (): string {\r\n return new Date(this.valueOf() - this.getTimezoneOffset() * 60000).toISOString().slice(0, -1);\r\n};\r\n\r\nDate.prototype.toString = function (): string {\r\n return this.toISOString();\r\n};\r\n\r\n\r\n// do not change signature! This is used in Portal as well!\r\n(String).format = function () {\r\n var s = arguments[0];\r\n for (var i = 0; i < arguments.length - 1; i++) {\r\n var reg = new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\");\r\n s = s.replace(reg, arguments[i + 1]);\r\n }\r\n\r\n return s;\r\n};\r\n\r\nString.prototype.endsWith = function (searchString) {\r\n var subjectString = this.toString();\r\n var position = subjectString.length - searchString.length;\r\n var lastIndex = subjectString.indexOf(searchString, position);\r\n return lastIndex === position;\r\n};\r\n\r\nString.prototype.beginsWith = function (searchString) {\r\n var subjectString = this.toString();\r\n return subjectString.substr(0, searchString.length) === searchString;\r\n};\r\n\r\nString.prototype.truncate = function (length): string {\r\n if (length === 0) return \"...\";\r\n if (this.length > length) {\r\n return this.substr(0, length).trim() + \" ...\";\r\n }\r\n return this;\r\n}\r\n\r\nString.prototype.nl2br = function (): string {\r\n return this.replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + '
');\r\n}\r\n\r\nString.prototype.escapeHTML = function (): string {\r\n return this.replace(/&/g, '&').replace(//g, '>');\r\n}\r\n\r\nString.prototype.replaceAll = function (searchValue, replaceValue): string {\r\n var str = this;\r\n return str.replace(new RegExp(searchValue, \"g\"), replaceValue);\r\n}\r\n\r\nfunction updateColors() {\r\n if ($(\"body\").length === 0)\r\n return;\r\n\r\n var allColors: string[] = [\r\n \"CoalGray\",\r\n \"DarkGray\",\r\n \"Gray\",\r\n \"MediumGray\",\r\n \"Silver\",\r\n \"LightGray\",\r\n \"Gainsboro\",\r\n \"WhiteSmoke\",\r\n \"Orange\",\r\n \"DarkOrange\",\r\n \"OrangeRed\",\r\n \"Red\",\r\n \"Green\",\r\n \"LightBlue\",\r\n \"DarkBlue\",\r\n \"CiColor\",\r\n \"CiColorForeground\",\r\n \"CiColor2\",\r\n \"CiColor2Foreground\"\r\n ];\r\n allColors.AsLinq().ForEach(color => {\r\n var dummy = $(\"
\");\r\n $(\"body\").append(dummy);\r\n var c = AppKitchen.UIHelper.Colors.parseColor(dummy.css(\"color\"));\r\n AppKitchen.Colors[color] = AppKitchen.UIHelper.Colors.rgb2Hex(c);\r\n dummy.remove();\r\n });\r\n}\r\n\r\nupdateColors();\r\n\r\nfunction compareSortNr(nr1: any, nr2: any) {\r\n var a = Number.POSITIVE_INFINITY;\r\n var b = Number.POSITIVE_INFINITY;\r\n if (nr1) {\r\n a = parseInt(nr1);\r\n }\r\n if (nr2) {\r\n b = parseInt(nr2);\r\n }\r\n return a > b ? 1 : -1;\r\n}\r\n","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InteractiveImageAttributes extends AppKitchen.ModelBaseAttributes {\r\n imageUrl?: string;\r\n minWidth?: number;\r\n minHeight?: number;\r\n }\r\n\r\n export class InteractiveImageModel extends AppKitchen.ModelBase {\r\n constructor(imageUrl: string, minWidth?: number, minHeight?: number) {\r\n super({\r\n imageUrl: imageUrl,\r\n minWidth: minWidth,\r\n minHeight: minHeight\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InteractiveImageOptions extends AppKitchen.ViewBaseOptions {\r\n title?: string\r\n }\r\n\r\n export class InteractiveImage extends AppKitchen.ViewBase {\r\n imgWidth: number;\r\n imgHeight: number;\r\n options: InteractiveImageOptions;\r\n\r\n constructor(interactiveImageModel: InteractiveImageModel, targetContainer: HTMLElement, options?: InteractiveImageOptions) {\r\n super(interactiveImageModel, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n title: \"\"\r\n }));\r\n\r\n this.render();\r\n this.addDevModeIfNeeded();\r\n }\r\n\r\n addDevModeIfNeeded() {\r\n if (!AppKitchen.BrowserHelper.UrlQuery.getParameter(\"dev\")) {\r\n return;\r\n }\r\n\r\n var devBox = $(AppKitchen.Templates.InteractiveImage_DevBox);\r\n $(\"body\").append(devBox);\r\n var xContainer = devBox.find(\".percentage-label-x\");\r\n var yContainer = devBox.find(\".percentage-label-y\");\r\n\r\n var imageBox = this.$el.find(\".a-interactive-image-content\");\r\n\r\n imageBox.mousemove(e => {\r\n var parentOffset = imageBox.offset();\r\n var relativeXPosition = (e.pageX - parentOffset.left);\r\n var relativeYPosition = (e.pageY - parentOffset.top);\r\n\r\n\r\n var x = relativeXPosition / (imageBox.width() / 100);\r\n var y = relativeYPosition / (imageBox.height() / 100);\r\n\r\n xContainer.html(kendo.toString(x, \"n1\") + \" %\");\r\n yContainer.html(kendo.toString(y, \"n1\") + \" %\");\r\n });\r\n\r\n imageBox.mouseleave(() => {\r\n devBox.addClass(\"hide\");\r\n });\r\n\r\n imageBox.mouseenter(() => {\r\n devBox.removeClass(\"hide\");\r\n });\r\n\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.InteractiveImage_Frame, { title: this.options.title });\r\n var img = new Image();\r\n var me = this;\r\n img.onload = function () {\r\n me.imgWidth = (this).width;\r\n me.imgHeight = (this).height;\r\n me.$el.find(\".a-interactive-image-box\").append(img);\r\n me.updateSize();\r\n }\r\n\r\n img.src = this.model.get().imageUrl;\r\n\r\n AppKitchen.BrowserHelper.WindowResize.on(() => this.updateSize(), this.el);\r\n }\r\n\r\n updateSize() {\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n\r\n var imageWidth = this.imgWidth;\r\n var imageHeight = this.imgHeight;\r\n var maxWidth = this.$el.find(\".a-interactive-image-box-wrapper\").width();\r\n var maxHeight = this.$el.find(\".a-interactive-image-box-wrapper\").height();\r\n\r\n if (this.model.get().minWidth && this.model.get().minWidth > maxWidth) {\r\n maxWidth = this.model.get().minWidth;\r\n }\r\n\r\n if (this.model.get().minHeight && this.model.get().minHeight > maxHeight) {\r\n maxHeight = this.model.get().minHeight;\r\n }\r\n\r\n var widthFac = maxWidth / imageWidth;\r\n var heightFac = maxHeight / imageHeight;\r\n\r\n var fac = heightFac;\r\n if (widthFac < heightFac) {\r\n fac = widthFac;\r\n }\r\n\r\n this.$el.find(\".a-interactive-image-box\").width(imageWidth * fac);\r\n this.$el.find(\".a-interactive-image-box\").height(imageHeight * fac);\r\n this.$el.find(\".a-interactive-image-box\").css(\"font-size\", imageHeight * fac + \"px\");\r\n this.$el.find(\".a-interactive-image-point-wrapper\").each((i, e) => $(e).width($(e).height()));\r\n }\r\n\r\n createElementForPoint(x: number, y: number, size: number) {\r\n var element = $('
');\r\n element.css({\r\n \"position\": \"absolute\",\r\n \"top\": y + \"%\",\r\n \"left\": x + \"%\",\r\n \"height\": size + \"%\",\r\n \"font-size\": size + \"%\"\r\n });\r\n this.$el.find(\".a-interactive-image-content\").append(element);\r\n return element[0];\r\n }\r\n\r\n createElementForText(x: number, y: number, fontSizeInPercent: number) {\r\n var element = $(\"
\");\r\n element.css({\r\n \"position\": \"absolute\",\r\n \"top\": y + \"%\",\r\n \"left\": x + \"%\",\r\n \"font-size\": fontSizeInPercent + \"%\"\r\n });\r\n this.$el.find(\".a-interactive-image-content\").append(element);\r\n return element[0];\r\n }\r\n\r\n createElementForRectangle(x: number, y: number, width: number, height: number, fontSizeInPercent: number) {\r\n var element = $(\"
\");\r\n element.css({\r\n \"position\": \"absolute\",\r\n \"top\": y + \"%\",\r\n \"left\": x + \"%\",\r\n \"width\": width + \"%\",\r\n \"height\": height + \"%\",\r\n \"font-size\": fontSizeInPercent + \"%\"\r\n });\r\n this.$el.find(\".a-interactive-image-content\").append(element);\r\n return element[0];\r\n }\r\n\r\n\r\n }\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface FileDisplayAttributes extends AppKitchen.ModelBaseAttributes {\r\n fileUrl?: string;\r\n mimeType?: string;\r\n minWidth?: number;\r\n minHeight?: number;\r\n }\r\n\r\n export class FileDisplayModel extends AppKitchen.ModelBase {\r\n constructor(fileUrl: string, mimeType: string, minWidth?: number, minHeight?: number) {\r\n super({\r\n fileUrl: fileUrl,\r\n mimeType: mimeType,\r\n minWidth: minWidth,\r\n minHeight: minHeight\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface FileDisplayOptions extends AppKitchen.ViewBaseOptions {\r\n title?: string\r\n }\r\n\r\n export class FileDisplay extends AppKitchen.ViewBase {\r\n imgWidth: number;\r\n imgHeight: number;\r\n options: FileDisplayOptions;\r\n\r\n constructor(fileDisplayModel: FileDisplayModel,\r\n targetContainer: HTMLElement,\r\n options?: FileDisplayOptions) {\r\n super(fileDisplayModel,\r\n targetContainer,\r\n AppKitchen.OptionsHelper.merge(options,\r\n {\r\n title: \"\"\r\n }));\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.FileDisplay_Frame, { title: this.options.title });\r\n var me = this;\r\n var mainType = this.model.get().mimeType.split(\"/\")[0];\r\n switch (mainType) {\r\n case \"image\":\r\n {\r\n var img = new Image();\r\n img.onload = function () {\r\n me.imgWidth = (this).width;\r\n me.imgHeight = (this).height;\r\n me.$el.find(\".a-interactive-image-box\").append(img);\r\n me.updateSize();\r\n }\r\n img.src = this.model.get().fileUrl;\r\n break;\r\n }\r\n case \"audio\":\r\n {\r\n var audio = document.createElement(\"audio\");\r\n audio.setAttribute(\"autoplay\", \"autoplay\");\r\n //audio.setAttribute(\"loop\", \"loop\");\r\n audio.setAttribute(\"controls\", \"controls\");\r\n audio.src = this.model.get().fileUrl;\r\n $(this.$el.find(\".a-interactive-image-box\")[0]).addClass(\"file-container\");\r\n this.$el.find(\".a-interactive-image-box\").append(audio);\r\n break;\r\n }\r\n case \"video\":\r\n {\r\n var video = document.createElement(\"video\");\r\n //video.setAttribute(\"autoplay\", \"autoplay\");\r\n //video.setAttribute(\"loop\", \"loop\");\r\n video.setAttribute(\"controls\", \"controls\");\r\n video.src = this.model.get().fileUrl;\r\n $(this.$el.find(\".a-interactive-image-box\")[0]).addClass(\"file-container\");\r\n this.$el.find(\".a-interactive-image-box\").append(video);\r\n break;\r\n }\r\n //case \"application\":\r\n //case \"text\":\r\n default:\r\n {\r\n var obj = document.createElement(\"embed\");\r\n obj.src = this.model.get().fileUrl;\r\n $(this.$el.find(\".a-interactive-image-box\")[0]).addClass(\"file-container\");\r\n this.$el.find(\".a-interactive-image-box\").append(obj);\r\n \r\n break;\r\n }\r\n }\r\n\r\n AppKitchen.BrowserHelper.WindowResize.on(() => this.updateSize(), this.el);\r\n }\r\n\r\n updateSize() {\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n\r\n var imageWidth = this.imgWidth;\r\n var imageHeight = this.imgHeight;\r\n var maxWidth = this.$el.find(\".a-interactive-image-box-wrapper\").width();\r\n var maxHeight = this.$el.find(\".a-interactive-image-box-wrapper\").height();\r\n\r\n if (this.model.get().minWidth && this.model.get().minWidth > maxWidth) {\r\n maxWidth = this.model.get().minWidth;\r\n }\r\n\r\n if (this.model.get().minHeight && this.model.get().minHeight > maxHeight) {\r\n maxHeight = this.model.get().minHeight;\r\n }\r\n\r\n var widthFac = maxWidth / imageWidth;\r\n var heightFac = maxHeight / imageHeight;\r\n\r\n var fac = heightFac;\r\n if (widthFac < heightFac) {\r\n fac = widthFac;\r\n }\r\n\r\n this.$el.find(\".a-interactive-image-box\").width(imageWidth * fac);\r\n this.$el.find(\".a-interactive-image-box\").height(imageHeight * fac);\r\n this.$el.find(\".a-interactive-image-box\").css(\"font-size\", imageHeight * fac + \"px\");\r\n this.$el.find(\".a-interactive-image-point-wrapper\").each((i, e) => $(e).width($(e).height()));\r\n }\r\n\r\n }\r\n }\r\n}","/// \r\n/// \r\n/// \r\n/// \r\n/// \r\n\r\nmodule AppKitchen {\r\n\r\n export module Apps {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ConfigAppOptions extends AppKitchen.AppBaseOptions {\r\n config: any;\r\n }\r\n\r\n export abstract class ConfigApp extends AppKitchen.AppBase {\r\n abstract redraw();\r\n }\r\n\r\n export class ConfigTsChartApp extends ConfigApp {\r\n tsChartView: AppKitchen.Portal.InteractiveGraphic;\r\n\r\n start() {\r\n this.tsChartView = new AppKitchen.Portal.InteractiveGraphic(this.options.config, this.el);\r\n }\r\n\r\n redraw() {\r\n this.tsChartView.updateSize();\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ConfigFileStarterAppOptions extends AppKitchen.AppBaseOptions {\r\n urlParameter?: string;\r\n configFile?: string;\r\n baseUrl?: string;\r\n }\r\n\r\n export class ConfigFileStarterApp extends AppKitchen.AppBase {\r\n app: ConfigTsChartApp;\r\n view: AppKitchen.ViewBase;\r\n\r\n start() {\r\n if (!this.options.configFile && this.options.urlParameter) {\r\n var urlQuery = AppKitchen.BrowserHelper.UrlQuery.getParameters();\r\n this.options.configFile = urlQuery[this.options.urlParameter];\r\n if (urlQuery[\"undocked\"]) {\r\n AppKitchen.FrameManager.hideHeader();\r\n }\r\n }\r\n\r\n if (!this.options.configFile) {\r\n throw \"undefined config file\";\r\n }\r\n\r\n $.ajax({\r\n dataType: 'json',\r\n success: jsonConfig => {\r\n this.processConfig(jsonConfig);\r\n },\r\n error: this.handleRequestError.bind(this),\r\n cache: false,\r\n url: this.getFileUrl()\r\n });\r\n }\r\n\r\n protected getFileUrl() {\r\n var url = this.options.configFile;\r\n if (this.options.baseUrl) {\r\n url = this.options.baseUrl + url;\r\n }\r\n return encodeURIComponent(url);\r\n }\r\n\r\n protected handleRequestError(xhr: JQueryXHR, statusText: string, errorText: string) {\r\n\r\n }\r\n\r\n redraw() {\r\n if (this.app) {\r\n this.app.redraw();\r\n }\r\n if (this.view && typeof (this.view).render === \"function\") {\r\n // updateSize not enough for pdf on Internet Explorer\r\n (this.view).render();\r\n }\r\n }\r\n\r\n protected processConfig(config) {\r\n var documenttype = config.documenttype.toLowerCase();\r\n if (documenttype === \"tschart\" || config.chartdefinition) {\r\n this.app = new ConfigTsChartApp(this.el, { config: config });\r\n } else if (documenttype === \"layoutgrid\") {\r\n this.view = new AppKitchen.Controls.LayoutGridView(new AppKitchen.Controls.LayoutGridModel(config), this.el);\r\n } else if (documenttype === \"interactiveimage\") {\r\n this.view = new AppKitchen.Controls.InteractiveImage(new AppKitchen.Controls.InteractiveImageModel(config.content.image, config.minWidth, config.minHeight), this.el, {title: config.title});\r\n } else if (documenttype === \"filedisplay\") {\r\n this.view = new AppKitchen.Controls.FileDisplay(new AppKitchen.Controls.FileDisplayModel(config.content.file, config.content.mime, config.minWidth, config.minHeight), this.el, { title: config.title });\r\n }\r\n }\r\n }\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Forms {\r\n \r\n // ReSharper disable once InconsistentNaming\r\n export interface TextPool {\r\n values: any[]; // values pool (as string array or Value/Text pairs)\r\n valueField?: string; // Value member name (if using Value/Text pairs)\r\n textField?: string; // Text member name (if using Value/Text pairs)\r\n restrict?: boolean; // restrict on given pool (dropdown) or free text allowed (combobox)\r\n multi?: boolean; // multi values selection (in restricted mode)\r\n separator?: string; // separator for multi values: default ','\r\n search?: boolean; // activate search box\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TextSuggestion {\r\n values: string[]; // suggested values\r\n multi?: boolean; // resuggest after separator\r\n separator?: string; // separator for resuggestion: default ', '\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface SwitchTaps {\r\n onValue: string;\r\n onLabel: string;\r\n offValue: string;\r\n offLabel: string;\r\n isLeftOn?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface FieldOptions extends AppKitchen.ModelBaseAttributes {\r\n description?: string; // field description \r\n default?: any; // default value\r\n placeholder?: string; // input placeholder\r\n order?: number; // field tabulation order (displayed number in TablularFormView)\r\n fieldGroup?: string; // field group (in TabularFormView)\r\n disabled?: boolean; // input field in disabled state\r\n hidden?: boolean; // hide field (in TabularFormView)\r\n readOnly?: boolean; // no input field, display mode\r\n password?: boolean; // password input\r\n pool?: TextPool; // values pool (for combobox or dropdown)\r\n suggest?: TextSuggestion; // suggestions\r\n mandatory?: boolean; // field is required\r\n pattern?: string; // validation regex pattern\r\n format?: string; // display/input format (for DATE/TIME and NUMBER)\r\n textMode?: boolean; // forces returned TIME values to be string\r\n allow24?: boolean; // allows 24:00 (and disallow 00:00) in TIME fields\r\n multiline?: number; // multiline TEXT (number of lines)\r\n min?: number; // min value for NUMBER, DATE/TIME (milliseconds), TEXT (length)\r\n max?: number; // max value for NUMBER, DATE/TIME (milliseconds), TEXT (length)\r\n precision?: number; // input precision for NUMBER\r\n url?: string; // render text representation as URL (in view mode)\r\n kendoOptions?: any; // custom options for kendo UI components\r\n switchTaps?: SwitchTaps; // tap definition for switch\r\n hideCheckboxLabel?: boolean; // hide the checkbox label\r\n }\r\n\r\n export enum FieldType {\r\n Text,\r\n Number,\r\n Month,\r\n Date,\r\n Time,\r\n DateTime,\r\n Checkbox,\r\n Switch,\r\n Year\r\n }\r\n\r\n export module FieldPatterns {\r\n // ReSharper disable InconsistentNaming\r\n export var OnlyDigits = \"\\\\d*\";\r\n export var Alphanumeric = \"[a-zA-Z0-9]*\";\r\n export var Phone = \"\\\\+?\\\\d*\";\r\n export var Email = \"[-a-z0-9~!$%^&*_=+}{\\\\'?]+(\\\\.[-a-z0-9~!$%^&*_=+}{\\\\'?]+)*@([a-z0-9_][-a-z0-9_]*(\\\\.[-a-z0-9_]+)*\\\\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|energy|[a-z][a-z])|([0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}))(:[0-9]{1,5})?\";\r\n export var UserId = \"[a-zA-Z0-9@\\\\-_\\\\.]*\";\r\n // ReSharper restore InconsistentNaming\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface FieldAttributes extends FieldOptions {\r\n key?: string;\r\n label?: string;\r\n type?: FieldType;\r\n value?: any;\r\n error?: string;\r\n displayValue?: string;\r\n }\r\n\r\n export class FieldModel extends AppKitchen.ModelBase {\r\n\r\n constructor(key: string, type: FieldType, label: string, options?: FieldOptions) {\r\n super({\r\n key: key,\r\n label: label,\r\n type: type,\r\n value: undefined,\r\n error: undefined,\r\n displayValue: \"\"\r\n });\r\n\r\n // options\r\n this.set(FieldModel.getDefaultOptions(type, options));\r\n this.set(options);\r\n\r\n this.bind(\"change:value change:format change:pool\", () => this.updateDisplayValue());\r\n\r\n // default value\r\n if (this.get().default != null) {\r\n this.set({ value: this.get().default });\r\n }\r\n }\r\n\r\n static getDefaultOptions(type: FieldType, customOptions: FieldOptions): FieldOptions {\r\n return {\r\n description: undefined,\r\n default: undefined,\r\n placeholder: undefined,\r\n order: undefined,\r\n fieldGroup: undefined,\r\n disabled: false,\r\n hidden: false,\r\n readOnly: false,\r\n mandatory: false,\r\n pool: undefined,\r\n pattern: undefined,\r\n format: this.getDefaultFormat(type, customOptions),\r\n textMode: false,\r\n allow24: false,\r\n suggest: undefined,\r\n multiline: undefined,\r\n min: undefined,\r\n max: undefined,\r\n precision: this.getDefaultPrecision(customOptions),\r\n password: false,\r\n url: undefined,\r\n kendoOptions: undefined\r\n };\r\n }\r\n\r\n static getDefaultFormat(type: FieldType, customOptions: FieldOptions): string {\r\n switch (type) {\r\n case FieldType.Text:\r\n return undefined;\r\n case FieldType.Number:\r\n return this.getDefaultNumberFormat(customOptions);\r\n case FieldType.Date:\r\n return kendo.culture().calendar.patterns.d;\r\n case FieldType.Time:\r\n return kendo.culture().calendar.patterns.t;\r\n case FieldType.DateTime:\r\n return kendo.culture().calendar.patterns.g;\r\n case FieldType.Year:\r\n return 'yyyy';\r\n }\r\n return undefined;\r\n }\r\n\r\n static getDefaultNumberFormat(customOptions: FieldOptions): string {\r\n if (customOptions && customOptions.precision != null) {\r\n return \",#.\" + Array(customOptions.precision + 1).join(\"#\");\r\n }\r\n\r\n return \"n\";\r\n }\r\n\r\n static getDefaultPrecision(customOptions: FieldOptions): number {\r\n var format = customOptions ? customOptions.format : undefined;\r\n if (format) {\r\n // match standard formats: e.g. n4, c2, p2, e0\r\n if (/^[ncpe]\\d+$/g.test(format)) {\r\n var precision = parseInt(format.substr(1));\r\n if (precision !== NaN) {\r\n return precision;\r\n }\r\n }\r\n\r\n // match custom formats: e.g. #.####, 0.00, 0.000###\r\n if (/[#0]/g.test(format)) {\r\n var customFormatRegex = /[#0]\\.([#0]*)/g;\r\n var result = customFormatRegex.exec(format);\r\n if (result && result.length > 1) {\r\n return result[1].length;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n updateDisplayValue() {\r\n var value = this.get().value;\r\n var displayValue = \"\";\r\n if (value != null) {\r\n switch (this.get().type) {\r\n case FieldType.Text:\r\n displayValue = this.getTextFieldDisplayValue();\r\n break;\r\n case FieldType.Number:\r\n displayValue = kendo.toString(value, this.get().format);\r\n break;\r\n case FieldType.Year:\r\n case FieldType.Date:\r\n case FieldType.Time:\r\n case FieldType.DateTime:\r\n displayValue = kendo.toString(new Date(value), this.get().format);\r\n break;\r\n case FieldType.Checkbox:\r\n displayValue = value ? AppKitchen.Strings.Yes : AppKitchen.Strings.No;\r\n break;\r\n case FieldType.Switch:\r\n displayValue = this.getSwitchTapDisplayValue();\r\n break;\r\n }\r\n }\r\n this.set({ displayValue: (displayValue + \"\").escapeHTML() });\r\n }\r\n\r\n private getSwitchTapDisplayValue(): string {\r\n var value = this.get().value;\r\n var switchTaps = this.get().switchTaps;\r\n if (!switchTaps) {\r\n return value ? AppKitchen.Strings.Yes : AppKitchen.Strings.No;\r\n }\r\n if (value === switchTaps.onValue) {\r\n return switchTaps.onLabel;\r\n } else {\r\n return switchTaps.offLabel;\r\n }\r\n }\r\n\r\n private getTextFieldDisplayValue(): string {\r\n var value = this.get().value;\r\n var pool = this.get().pool;\r\n if (pool && pool.values && pool.values.length > 0) {\r\n if (pool.multi) {\r\n var values: string[] = value ? value.split(pool.separator || \",\") : [];\r\n var displayValue = values.length > 0 ? this.getDisplayValueFromPool(pool, values[0]) : \"\";\r\n for (let i = 1; i < values.length; i++) {\r\n displayValue += \", \" + this.getDisplayValueFromPool(pool, values[i]);\r\n }\r\n return displayValue;\r\n } else {\r\n return this.getDisplayValueFromPool(pool, value);\r\n }\r\n }\r\n\r\n return value || \"\";\r\n }\r\n\r\n private getDisplayValueFromPool(pool: TextPool, value: any): string {\r\n if (pool.textField && pool.valueField) {\r\n for (let i = 0; i < pool.values.length; i++) {\r\n if (pool.values[i][pool.valueField] === value) {\r\n return pool.values[i][pool.textField];\r\n }\r\n }\r\n }\r\n return value;\r\n }\r\n }\r\n\r\n export class FieldCollection extends AppKitchen.CollectionBase {\r\n\r\n }\r\n \r\n // ReSharper disable once InconsistentNaming\r\n export interface FieldViewBaseOptions extends AppKitchen.ViewBaseOptions {\r\n editable?: boolean;\r\n editOnDemand?: boolean;\r\n }\r\n\r\n export abstract class FieldViewBase extends AppKitchen.ViewBase {\r\n options: FieldViewBaseOptions;\r\n\r\n inputTemplate: (data: any) => string;\r\n viewContainerSelector: string;\r\n inputContainerSelector: string;\r\n editMode: boolean;\r\n postRender: (fieldView: FieldViewBase) => void;\r\n\r\n constructor(model: FieldModel, options?: FieldViewBaseOptions) {\r\n super(model, undefined, AppKitchen.OptionsHelper.merge(options,\r\n {\r\n editable: false,\r\n editOnDemand: false\r\n }));\r\n\r\n this.tagName = 'div';\r\n\r\n this.setTemplate(Templates.FormField);\r\n this.viewContainerSelector = \".a-form-field-view\";\r\n this.inputContainerSelector = \".a-form-field-input\";\r\n\r\n this.model.bind(\"change\", this.render, this);\r\n }\r\n\r\n editModeAllowed(): boolean {\r\n return this.options.editable && !this.model.get().readOnly;\r\n }\r\n\r\n editAllowed(): boolean {\r\n return this.options.editable && !this.model.get().readOnly && !this.model.get().disabled;\r\n }\r\n\r\n render() {\r\n kendo.destroy(this.el);\r\n\r\n this.renderTemplate({\r\n displayValue: (this.model.get().displayValue + \"\").nl2br(),\r\n url: this.model.get().url ? this.model.get().url.trim() : \"\",\r\n editOnDemand: this.editAllowed() && this.options.editOnDemand\r\n });\r\n\r\n if (this.model.get().disabled) {\r\n this.$el.addClass(\"disabled\");\r\n } else {\r\n this.$el.removeClass(\"disabled\");\r\n }\r\n\r\n if (this.editModeAllowed()) {\r\n this.$el.find(this.inputContainerSelector).html(this.inputTemplate(this.model.toJSON()));\r\n } else {\r\n this.$el.find(this.inputContainerSelector).remove();\r\n }\r\n if (this.model.get().hidden) {\r\n this.$el.hide();\r\n }\r\n return this.el;\r\n }\r\n\r\n flash() {\r\n this.$el.find(this.inputContainerSelector).addClass(\"a-field-flash\");\r\n window.setTimeout(() => {\r\n this.$el.find(this.inputContainerSelector).removeClass(\"a-field-flash\");\r\n }, 1000);\r\n }\r\n\r\n protected startEdit() {\r\n this.$el.find(this.viewContainerSelector).css(\"display\", \"none\");\r\n this.$el.find(this.inputContainerSelector).css(\"display\", \"block\");\r\n this.editMode = true;\r\n }\r\n\r\n protected endEdit() {\r\n this.$el.find(this.inputContainerSelector).css(\"display\", \"none\");\r\n this.$el.find(this.viewContainerSelector).css(\"display\", \"block\");\r\n this.editMode = false;\r\n }\r\n\r\n abstract tryUpdate(): boolean;\r\n abstract preview(): boolean;\r\n abstract backToEdit();\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ValidatedValue {\r\n valid: boolean;\r\n value?: any;\r\n message?: string;\r\n }\r\n\r\n export abstract class TextInputFieldViewBase extends FieldViewBase {\r\n rendered: boolean;\r\n postRender: (fieldView: TextInputFieldViewBase) => void;\r\n\r\n constructor(model: FieldModel, options?: FieldViewBaseOptions) {\r\n super(model, options);\r\n\r\n this.inputTemplate = _.template(Templates.FormFieldTextInput);\r\n this.rendered = false;\r\n }\r\n\r\n render() {\r\n super.render();\r\n\r\n this.clearMessage();\r\n\r\n if (this.editModeAllowed()) {\r\n if (this.model.get().mandatory && !this.model.get().value) {\r\n this.showMessage(AppKitchen.Strings.Form_Required, \"mandatory\");\r\n }\r\n\r\n if (!this.options.editOnDemand) {\r\n this.startEdit();\r\n if (this.rendered && this.editAllowed()) {\r\n this.validate(this.getInputValue());\r\n }\r\n } else {\r\n this.endEdit();\r\n }\r\n\r\n if (this.model.get().error) {\r\n this.showMessage(this.model.get().error, \"invalid\");\r\n }\r\n\r\n if (this.editAllowed()) {\r\n this.delegateInteractionEvents();\r\n }\r\n\r\n if (this.postRender) {\r\n this.postRender(this);\r\n }\r\n } else {\r\n this.endEdit();\r\n }\r\n\r\n this.rendered = true;\r\n return this.el;\r\n }\r\n\r\n startEdit() {\r\n super.startEdit();\r\n this.applyInputOptions(this.inputContainerSelector + \" input\");\r\n }\r\n\r\n startEditAndFocus() {\r\n this.startEdit();\r\n this.$el.find(this.inputContainerSelector + \" input, \" + this.inputContainerSelector + \" textarea\").first().focus();\r\n }\r\n\r\n protected delegateInteractionEvents() {\r\n this.$el.find(\".editor\").keypress((e: KeyboardEvent) => {\r\n if (e.which === 13) {\r\n e.stopPropagation();\r\n this.updateOnEnter();\r\n }\r\n });\r\n\r\n this.$el.find(\".editor\").keydown((e: KeyboardEvent) => {\r\n if (e.which === 27) {\r\n e.stopPropagation();\r\n this.revertOnEscape();\r\n }\r\n });\r\n\r\n this.$el.find(\"input.editor, textarea.editor\").blur(() => {\r\n this.updateOnBlur();\r\n });\r\n\r\n if (this.options.editOnDemand) {\r\n this.$el.find(this.viewContainerSelector).click(() => this.startEditAndFocus());\r\n }\r\n }\r\n\r\n // type dependent input options (e.g. date/time pickers...), implemented in derivates\r\n protected abstract applyInputOptions(inputSelector: string): void;\r\n\r\n protected updateOnEnter() {\r\n if (this.model.get().multiline)\r\n return;\r\n\r\n if (this.options.editOnDemand) {\r\n this.updateAndClose();\r\n } else {\r\n this.updateAndRefocus();\r\n }\r\n this.trigger(\"keypress-enter\");\r\n }\r\n\r\n protected updateOnBlur() {\r\n if (this.options.editOnDemand) {\r\n this.updateAndClose();\r\n } else {\r\n this.update();\r\n }\r\n }\r\n\r\n protected revertOnEscape() {\r\n if (this.model.get().multiline)\r\n return;\r\n\r\n this.$el.find(\"input\").val(this.model.get().displayValue);\r\n this.render();\r\n\r\n this.updateAndRefocus();\r\n }\r\n\r\n tryUpdate(): boolean {\r\n if (this.editMode) {\r\n return this.update();\r\n }\r\n return true;\r\n }\r\n\r\n preview(): boolean {\r\n if (this.editMode) {\r\n return this.updateAndClose();\r\n }\r\n return true;\r\n }\r\n\r\n backToEdit() {\r\n this.render();\r\n }\r\n\r\n protected updateAndClose() {\r\n if (this.update()) {\r\n this.endEdit();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n protected updateAndRefocus() {\r\n this.update();\r\n this.$el.find(\"input\").focus();\r\n }\r\n \r\n // tries to update the model input is valid\r\n // returns false if validation failed\r\n protected update(): boolean {\r\n if (this.editAllowed()) {\r\n var textValue = this.getInputValue();\r\n var validatedValue = this.validate(textValue);\r\n\r\n // value is valid => save value\r\n if (validatedValue !== false) {\r\n this.model.set({\r\n value: validatedValue,\r\n error: this.model.get().value === validatedValue ? this.model.get().error : undefined\r\n });\r\n if (validatedValue == null) {\r\n this.model.updateDisplayValue();\r\n }\r\n return true;\r\n }\r\n\r\n // value is invalid => set value to undefined\r\n if (!this.options.editOnDemand) {\r\n if (textValue) {\r\n this.model.set({ value: undefined, displayValue: textValue });\r\n } else {\r\n this.model.set({\r\n value: undefined,\r\n error: undefined,\r\n displayValue: \"\"\r\n });\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n protected getInputValue(): string {\r\n return this.$el.find(\"input\").val();\r\n }\r\n\r\n // validates the string input (required, format) and \r\n // returns the value in the corresponding type (e.g. Date)\r\n protected validate(value: string): any {\r\n var valid = true;\r\n this.clearMessage();\r\n\r\n if (this.model.get().mandatory) {\r\n if (!value) {\r\n valid = false;\r\n this.showMessage(AppKitchen.Strings.Form_ErrorMessage_Required, \"warning\");\r\n }\r\n }\r\n\r\n if (this.model.get().error) {\r\n this.showMessage(this.model.get().error, \"invalid\");\r\n }\r\n\r\n var validatedValue = this.validateFormat(value);\r\n if (!validatedValue.valid) {\r\n valid = false;\r\n this.model.set({ error: validatedValue.message || AppKitchen.Strings.Form_ErrorMessage_Format });\r\n }\r\n\r\n if (valid) {\r\n return validatedValue.value;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n clearMessage() {\r\n this.$el.removeClass(\"mandatory\");\r\n this.$el.removeClass(\"warning\");\r\n this.$el.removeClass(\"invalid\");\r\n this.$el.find(\".a-input-error-message .a-message\").html(\"\");\r\n }\r\n\r\n showMessage(message: string, errorClass: \"mandatory\" | \"warning\" | \"invalid\") {\r\n this.clearMessage();\r\n this.$el.addClass(errorClass);\r\n this.$el.find(\".a-input-error-message .a-message\").html(message);\r\n }\r\n\r\n // type dependent validation, implemented in derivates\r\n protected abstract validateFormat(value: string): ValidatedValue;\r\n\r\n protected validateMin(value: number) {\r\n var min = this.model.get().min;\r\n if (min !== undefined && value < min)\r\n return false;\r\n return true;\r\n }\r\n\r\n protected validateMax(value: number) {\r\n var max = this.model.get().max;\r\n if (max !== undefined && value > max)\r\n return false;\r\n return true;\r\n }\r\n }\r\n\r\n export class TextFieldView extends TextInputFieldViewBase {\r\n\r\n inputWidget: any;\r\n\r\n protected applyInputOptions(inputSelector: string): void {\r\n if (this.model.get().type !== FieldType.Text) {\r\n throw \"incompatible field type!\";\r\n }\r\n\r\n var currentValue: string = this.model.get().value;\r\n var pool = this.model.get().pool;\r\n var multiline = this.model.get().multiline;\r\n var suggest = this.model.get().suggest;\r\n\r\n if (pool) {\r\n if (pool.multi) {\r\n if (pool.restrict) {\r\n this.inputWidget = this.$el.find(inputSelector).kendoMultiSelect(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n filter: null,\r\n dataTextField: pool.textField,\r\n dataValueField: pool.valueField,\r\n dataSource: pool.values,\r\n value: currentValue ? currentValue.split(pool.separator || \",\") : undefined,\r\n placeholder: this.model.get().placeholder,\r\n change: () => this.updateAndRefocus()\r\n })).data(\"kendoMultiSelect\");\r\n // allow only TAB, ARROW UP and ARROW DOWN\r\n this.inputWidget.input.on(\"keydown\", e => { if ([9, 38, 40].indexOf(e.keyCode) === -1) e.preventDefault(); });\r\n this.inputWidget.wrapper.find(\"input\").css(\"color\", \"transparent\");\r\n this.inputWidget.wrapper.find(\"input\").css(\"cursor\", \"default\");\r\n } else {\r\n throw \"non restricted multi select not implemented\";\r\n }\r\n } else {\r\n if (pool.restrict) {\r\n var safariClosedBeforeValueChangedFix: boolean = false;\r\n var search = pool.search != null ? pool.search : pool.values && pool.values.length > 20;\r\n this.inputWidget = this.$el.find(inputSelector).kendoDropDownList(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n filter: search? \"contains\" : undefined,\r\n dataTextField: pool.textField,\r\n dataValueField: pool.valueField,\r\n dataSource: pool.values,\r\n value: currentValue,\r\n open: () => {\r\n },\r\n close: () => {\r\n safariClosedBeforeValueChangedFix = true;\r\n this.updateAndRefocus();\r\n },\r\n change: () => {\r\n if (safariClosedBeforeValueChangedFix) {\r\n this.updateAndRefocus();\r\n safariClosedBeforeValueChangedFix = false;\r\n }\r\n }\r\n })).data(\"kendoDropDownList\");\r\n this.inputWidget.wrapper.on(\"keydown\", e => this.widgetKeyDown(e));\r\n if (this.options.editOnDemand) {\r\n this.openInputPopup();\r\n }\r\n } else {\r\n this.inputWidget = this.$el.find(inputSelector).kendoComboBox(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n dataTextField: pool.textField,\r\n dataValueField: pool.valueField,\r\n dataSource: pool.values,\r\n value: currentValue,\r\n placeholder: this.model.get().placeholder\r\n })).data(\"kendoComboBox\");\r\n this.inputWidget.input.keydown(\"keydown\", e => this.widgetKeyDown(e));\r\n }\r\n }\r\n } else if (suggest && suggest.values && suggest.values.length > 0) {\r\n this.inputWidget = this.$el.find(inputSelector).kendoAutoComplete(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n dataSource: suggest.values,\r\n separator: suggest.multi ? suggest.separator || \", \" : undefined\r\n })).data(\"kendoAutoComplete\");\r\n } else if (multiline) {\r\n var textAreaInput = AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.FormFieldTextAreaInput, this.model.toJSON());\r\n this.$el.find(inputSelector).replaceWith(textAreaInput);\r\n this.$el.find(\"textarea.editor\").blur(() => {\r\n this.updateOnBlur();\r\n });\r\n }\r\n }\r\n\r\n private widgetKeyDown(e) {\r\n if (e.keyCode === 40 || e.keyCode === 38) {\r\n this.openInputPopup();\r\n }\r\n }\r\n\r\n private openInputPopup() {\r\n if (!this.inputWidget.ul.is(\":visible\")) {\r\n this.inputWidget.open();\r\n }\r\n }\r\n\r\n protected updateAndRefocus() {\r\n super.updateAndRefocus();\r\n if (this.inputWidget) {\r\n this.inputWidget.wrapper.focus();\r\n }\r\n }\r\n\r\n protected getInputValue(): string {\r\n var value: any;\r\n\r\n if (this.inputWidget) {\r\n value = this.inputWidget.value();\r\n if (value) {\r\n if (value instanceof Array) {\r\n var separator = (this.model.get().pool ? this.model.get().pool.separator : \",\") || \",\";\r\n return value.join(separator);\r\n }\r\n\r\n // remove last separator if in multi suggest mode\r\n if (this.model.get().suggest && this.model.get().suggest.multi) {\r\n var sep = this.model.get().suggest.separator || \", \";\r\n if (value.substr(value.length - sep.length, sep.length) === sep) {\r\n value = value.substr(0, value.length - sep.length);\r\n }\r\n }\r\n\r\n return value.toString();\r\n }\r\n return undefined;\r\n }\r\n\r\n value = this.$el.find(\"input, textarea\").val() || \"\";\r\n\r\n return value;\r\n }\r\n\r\n protected validateFormat(value: string): ValidatedValue {\r\n\r\n if (this.model.get().type !== FieldType.Text) {\r\n throw \"incompatible field type!\";\r\n }\r\n\r\n if (!value) value = \"\";\r\n\r\n // text validation\r\n var pattern = this.model.get().pattern;\r\n if (pattern) {\r\n var regex = new RegExp(\"^\" + pattern + \"$\");\r\n if (value && !regex.test(value)) {\r\n return {\r\n valid: false,\r\n message: AppKitchen.Strings.Form_ErrorMessage_PatternMismatch\r\n };\r\n }\r\n }\r\n\r\n if (!this.validateMin(value.length))\r\n return {\r\n valid: false,\r\n message: AppKitchen.Strings.Form_ErrorMessage_StringTooShort\r\n };\r\n\r\n if (!this.validateMax(value.length))\r\n return {\r\n valid: false,\r\n message: AppKitchen.Strings.Form_ErrorMessage_StringTooLong\r\n };\r\n\r\n return {\r\n valid: true,\r\n value: value\r\n };\r\n }\r\n }\r\n\r\n export class NumberFieldView extends TextInputFieldViewBase {\r\n numericbox: kendo.ui.NumericTextBox;\r\n\r\n protected applyInputOptions(inputSelector: string): void {\r\n if (this.model.get().type !== FieldType.Number) {\r\n throw \"incompatible field type!\";\r\n }\r\n\r\n this.numericbox = this.$el.find(inputSelector).kendoNumericTextBox(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n value: this.model.get().value,\r\n spinners: false,\r\n format: this.model.get().format,\r\n step: 0,\r\n decimals: this.model.get().precision,\r\n min: this.model.get().min,\r\n max: this.model.get().max\r\n })).data(\"kendoNumericTextBox\");\r\n }\r\n\r\n protected validateFormat(value: string): ValidatedValue {\r\n\r\n if (this.model.get().type !== FieldType.Number) {\r\n throw \"incompatible field type!\";\r\n }\r\n\r\n // ignore string and get number value from numeric textbox\r\n var newValue = this.numericbox.value();\r\n\r\n if (newValue == null || newValue === NaN)\r\n return {\r\n valid: true,\r\n value: null\r\n };\r\n\r\n if (!this.validateMin(newValue))\r\n return {\r\n valid: false,\r\n message: AppKitchen.Strings.Form_ErrorMessage_NumberTooSmall\r\n };\r\n\r\n if (!this.validateMax(newValue))\r\n return {\r\n valid: false,\r\n message: AppKitchen.Strings.Form_ErrorMessage_NumberTooBig\r\n };\r\n\r\n return {\r\n valid: true,\r\n value: newValue\r\n };\r\n }\r\n\r\n protected delegateInteractionEvents() {\r\n this.$el.find(\".editor\").keypress((e: KeyboardEvent) => {\r\n if (e.which === 13) {\r\n e.stopPropagation();\r\n this.updateOnEnter();\r\n }\r\n });\r\n\r\n this.$el.find(\".editor\").keydown((e: KeyboardEvent) => {\r\n if (e.which === 27) {\r\n e.stopPropagation();\r\n this.revertOnEscape();\r\n }\r\n });\r\n\r\n if (this.options.editOnDemand) {\r\n this.$el.find(this.viewContainerSelector).click(() => this.startEditAndFocus());\r\n this.$el.find(\"input.editor:first-child\").blur(() => this.updateOnBlur());\r\n } else {\r\n this.$el.find(\"input.editor:nth-child(2)\").blur(() => this.updateOnBlur());\r\n }\r\n }\r\n }\r\n\r\n export class DateTimeFieldView extends TextInputFieldViewBase {\r\n picker: any;\r\n\r\n constructor(model: FieldModel, options?: FieldViewBaseOptions) {\r\n super(model, options);\r\n }\r\n\r\n protected applyInputOptions(inputSelector: string): void {\r\n switch (this.model.get().type) {\r\n case FieldType.Year:\r\n this.picker = this.$el.find(inputSelector).kendoDatePicker(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n format: \"yyyy\",\r\n start: \"decade\",\r\n depth: \"decade\",\r\n value: this.model.get().value,\r\n min: this.model.get().min != null ? new Date(this.model.get().min) : undefined,\r\n max: this.model.get().max != null ? new Date(this.model.get().max) : undefined,\r\n change: () => this.updateAndRefocus()\r\n })).data(\"kendoDatePicker\");\r\n break;\r\n case FieldType.Month:\r\n this.picker = this.$el.find(inputSelector).kendoDatePicker(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n format: \"MMMM yyyy\",\r\n start: \"year\",\r\n depth: \"year\",\r\n value: this.model.get().value,\r\n min: this.model.get().min != null ? new Date(this.model.get().min) : undefined,\r\n max: this.model.get().max != null ? new Date(this.model.get().max) : undefined,\r\n change: () => this.updateAndRefocus()\r\n })).data(\"kendoDatePicker\");\r\n break;\r\n case FieldType.Date:\r\n this.picker = this.$el.find(inputSelector).kendoDatePicker(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n format: this.model.get().format,\r\n value: this.model.get().value,\r\n min: this.model.get().min != null ? new Date(this.model.get().min) : undefined,\r\n max: this.model.get().max != null ? new Date(this.model.get().max) : undefined,\r\n change: () => this.updateAndRefocus()\r\n })).data(\"kendoDatePicker\");\r\n break;\r\n case FieldType.Time:\r\n this.picker = this.$el.find(inputSelector).kendoTimePicker(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n format: this.model.get().format,\r\n value: this.model.get().value,\r\n min: this.model.get().min != null ? new Date(this.model.get().min) : undefined,\r\n max: this.model.get().max != null ? new Date(this.model.get().max) : undefined,\r\n change: () => this.updateAndRefocus()\r\n })).data(\"kendoTimePicker\");\r\n break;\r\n case FieldType.DateTime:\r\n this.picker = this.$el.find(inputSelector).kendoDateTimePicker(AppKitchen.OptionsHelper.merge(this.model.get().kendoOptions, {\r\n format: this.model.get().format,\r\n value: this.model.get().value,\r\n min: this.model.get().min != null ? new Date(this.model.get().min) : undefined,\r\n max: this.model.get().max != null ? new Date(this.model.get().max) : undefined,\r\n change: () => this.updateAndRefocus()\r\n })).data(\"kendoDateTimePicker\");\r\n break;\r\n default:\r\n throw \"incompatible field type!\";\r\n }\r\n\r\n // picker keydown action\r\n this.picker.wrapper.find(\"input\").on(\"keydown\", e => this.pickerKeyDown(e));\r\n\r\n // update format in model\r\n if (this.picker) {\r\n this.model.set({ format: this.picker.options.format });\r\n }\r\n }\r\n\r\n private pickerKeyDown(e) {\r\n if (e.keyCode === 40) {\r\n this.openPicker();\r\n }\r\n }\r\n\r\n private openPicker() {\r\n if (!this.picker.wrapper.find(\".k-popup\").is(\":visible\")) {\r\n this.picker.open();\r\n }\r\n }\r\n\r\n protected validateFormat(value: string): ValidatedValue {\r\n var type = this.model.get().type;\r\n if (type !== FieldType.Month && type !== FieldType.Date && type !== FieldType.Time && type !== FieldType.DateTime && type !== FieldType.Year) {\r\n throw \"incompatible field type!\";\r\n }\r\n\r\n if (!value)\r\n return {\r\n valid: true,\r\n value: null\r\n }\r\n\r\n var textMode = this.model.get().textMode || false;\r\n var allow24 = this.model.get().allow24 || false;\r\n var date = kendo.parseDate(value, this.model.get().format);\r\n var dateAsNumber = 0;\r\n\r\n // 24:00\r\n if (textMode && allow24 && type === FieldType.Time && this.model.get().format === \"HH:mm\") {\r\n if (value === \"24:00\") {\r\n dateAsNumber = 24 * 3600000;\r\n }\r\n if (value === \"00:00\") {\r\n return {\r\n valid: false,\r\n message: AppKitchen.Strings.Form_ErrorMessage_TimeInvalid \r\n };\r\n }\r\n } else {\r\n if (!date || !date.valueOf()) {\r\n return {\r\n valid: false,\r\n message: this.getErrorMessage(type)\r\n };\r\n }\r\n dateAsNumber = this.date2Number(date);\r\n }\r\n\r\n if (!this.validateMin(dateAsNumber))\r\n return {\r\n valid: false,\r\n // TODO: sinnvollere Fehlermeldung (datum zu klein) \r\n message: this.getErrorMessage(type)\r\n };\r\n\r\n if (!this.validateMax(dateAsNumber))\r\n return {\r\n valid: false,\r\n // TODO: sinnvollere Fehlermeldung (datum zu groß)\r\n message: this.getErrorMessage(type)\r\n };\r\n\r\n return {\r\n valid: true,\r\n value: textMode? value : date\r\n }\r\n }\r\n\r\n private getErrorMessage(fieldType: FieldType): string {\r\n switch (fieldType) {\r\n case FieldType.Time:\r\n return AppKitchen.Strings.Form_ErrorMessage_TimeInvalid;\r\n case FieldType.DateTime:\r\n return AppKitchen.Strings.Form_ErrorMessage_DateTimeInvalid;\r\n case FieldType.Year:\r\n return AppKitchen.Strings.Form_ErrorMessage_YearInvalid;\r\n default:\r\n return AppKitchen.Strings.Form_ErrorMessage_DateInvalid;\r\n }\r\n }\r\n\r\n private date2Number(date: Date): number {\r\n switch (this.model.get().type) {\r\n case FieldType.Time:\r\n return date.valueOf() - date.onlyDate().valueOf();\r\n case FieldType.Date:\r\n return date.onlyDate().valueOf();\r\n case FieldType.Month:\r\n return new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0).valueOf();\r\n case FieldType.Year:\r\n return new Date(date.getFullYear(), 1, 1, 0, 0, 0, 0).valueOf();\r\n case FieldType.DateTime:\r\n return date.valueOf();\r\n }\r\n\r\n throw \"invalid Field type\";\r\n }\r\n }\r\n\r\n export class CheckboxFieldView extends FieldViewBase {\r\n\r\n constructor(model: FieldModel, options?: FieldViewBaseOptions) {\r\n super(model, options);\r\n if (model.get().hideCheckboxLabel) {\r\n this.inputTemplate = _.template(Templates.FormFieldCheckbox);\r\n } else {\r\n this.inputTemplate = _.template(Templates.FieldCheckbox);\r\n }\r\n }\r\n\r\n render() {\r\n super.render();\r\n\r\n if (this.editAllowed()) {\r\n this.$el.find(\"input\").on(\"change\", () => this.updateAndRefocus());\r\n }\r\n\r\n if (this.editModeAllowed()) {\r\n this.startEdit();\r\n } else {\r\n this.endEdit();\r\n }\r\n\r\n return this.el;\r\n }\r\n\r\n updateAndRefocus() {\r\n var isChecked = this.$el.find('input[type=\"checkbox\"]').prop(\"checked\");\r\n this.model.set({ value: isChecked });\r\n this.$el.find('input[type=\"checkbox\"]').focus();\r\n }\r\n\r\n tryUpdate(): boolean {\r\n return true;\r\n }\r\n\r\n preview(): boolean {\r\n this.endEdit();\r\n return true;\r\n }\r\n\r\n backToEdit() {\r\n if (this.editModeAllowed()) {\r\n this.startEdit();\r\n }\r\n }\r\n }\r\n\r\n export class SwitchFieldView extends FieldViewBase {\r\n\r\n containers: {\r\n switchLabelOn: JQuery,\r\n switchLabelOff: JQuery,\r\n }\r\n\r\n constructor(model: FieldModel, options?: FieldViewBaseOptions) {\r\n super(model, options);\r\n this.inputTemplate = _.template(Templates.FormFieldSwitch);\r\n }\r\n\r\n render() {\r\n super.render();\r\n\r\n let switchTaps = this.model.get().switchTaps;\r\n\r\n let onTapIndex = switchTaps.isLeftOn ? 1 : 2;\r\n let offTapIndex = switchTaps.isLeftOn ? 2 : 1;\r\n\r\n this.containers = {\r\n switchLabelOn: this.$el.find(\".k-switch-tap:nth-child(\" + onTapIndex + \")\"),\r\n switchLabelOff: this.$el.find(\".k-switch-tap:nth-child(\" + offTapIndex + \")\")\r\n }\r\n\r\n this.containers.switchLabelOn.text(switchTaps.onLabel);\r\n this.containers.switchLabelOff.text(switchTaps.offLabel);\r\n\r\n if (this.editAllowed()) {\r\n this.$el.find(\"input\").on(\"change\", () => this.updateAndRefocus());\r\n }\r\n\r\n if (this.editModeAllowed()) {\r\n this.startEdit();\r\n } else {\r\n this.endEdit();\r\n }\r\n\r\n this.containers.switchLabelOn.removeClass(\"k-switch-tap-selected\");\r\n this.containers.switchLabelOff.addClass(\"k-switch-tap-selected\");\r\n\r\n return this.el;\r\n }\r\n\r\n updateAndRefocus() {\r\n var isChecked = this.$el.find('input[type=\"checkbox\"]').prop(\"checked\");\r\n this.model.set({ value: this.getValue(isChecked) });\r\n this.$el.find('input[type=\"checkbox\"]').focus();\r\n\r\n if (isChecked) {\r\n this.containers.switchLabelOn.addClass(\"k-switch-tap-selected\");\r\n this.containers.switchLabelOff.removeClass(\"k-switch-tap-selected\");\r\n } else {\r\n this.containers.switchLabelOn.removeClass(\"k-switch-tap-selected\");\r\n this.containers.switchLabelOff.addClass(\"k-switch-tap-selected\");\r\n }\r\n }\r\n\r\n getValue(isChecked: boolean): any {\r\n let switchTaps = this.model.get().switchTaps;\r\n if (!switchTaps) {\r\n return isChecked;\r\n }\r\n if (isChecked) {\r\n return switchTaps.onValue;\r\n } else {\r\n return switchTaps.offValue;\r\n }\r\n }\r\n\r\n tryUpdate(): boolean {\r\n return true;\r\n }\r\n\r\n preview(): boolean {\r\n this.endEdit();\r\n return true;\r\n }\r\n\r\n backToEdit() {\r\n this.startEdit();\r\n }\r\n }\r\n\r\n export class DescriptorToTextPoolConverter {\r\n static convert(descriptors: AppKitchen.Api.Models.Descriptor[]): TextPool {\r\n return {\r\n values: descriptors,\r\n valueField: \"Id\",\r\n textField: \"Name\"\r\n };\r\n }\r\n }\r\n\r\n }\r\n }\r\n}","///\r\n\r\nmodule AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Forms {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface FormOptions {\r\n keyPrefix?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface FormAttributes extends AppKitchen.ModelBaseAttributes {\r\n fields?: FieldCollection;\r\n hasData?: boolean;\r\n }\r\n\r\n export class FormModel extends AppKitchen.ModelBase {\r\n fieldDict: {[key: string]: FieldModel};\r\n options: FormOptions;\r\n submitCallback: (submitOptions: FormSubmitOptions) => void;\r\n /**\r\n * @param {FieldModel[]} fields - List of FieldModels representing the Form Fields\r\n * @param {FormOptions} options? - Form options\r\n */\r\n constructor(fields: FieldModel[], options?: FormOptions) {\r\n super({\r\n fields: new FieldCollection(fields),\r\n hasData: false,\r\n loading: false\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n keyPrefix: \"\"\r\n });\r\n\r\n this.bind(\"change:fields\", () => this.updateFieldDict());\r\n this.get().fields.bind(\"add remove\", () => this.updateFieldDict());\r\n this.updateFieldDict();\r\n }\r\n\r\n private updateFieldDict() {\r\n var dict: { [key: string]: FieldModel } = {};\r\n this.get().fields.each(field => dict[field.get().key] = field);\r\n this.fieldDict = dict;\r\n }\r\n\r\n /**\r\n * Fills the Fields with data and sets 'hasData' attribute to true\r\n * @param {{ [key: string]: any }} data - New Fields data as Object/Dictionary\r\n * @param {boolean} merge? - Merge input data with the existing Fields data. If set to false, old data will be overridden or emptied\r\n */\r\n setFieldsData(data: { [key: string]: any }, merge?: boolean) {\r\n if (!data)\r\n return;\r\n\r\n this.get().fields.each(field => {\r\n if (data.hasOwnProperty(field.get().key) || !merge) {\r\n field.set({ value: data[field.get().key] });\r\n }\r\n });\r\n\r\n this.set({ hasData: true });\r\n }\r\n\r\n /**\r\n * Clear the Fields data and sets 'hasData' to false\r\n */\r\n clearFieldsData() {\r\n this.set({ hasData: false });\r\n\r\n this.get().fields.each(field => {\r\n field.set({ value: undefined});\r\n });\r\n }\r\n\r\n /**\r\n * Gets the Fields data as Object/Dictionary\r\n * @param {boolean} skipEmpty? - Skip empty Fields or return them with actual undefined/null values\r\n */\r\n getFieldsData(skipEmpty?: boolean): { [key: string]: any } {\r\n var data = {};\r\n this.get().fields.each(field => {\r\n if (field.get().value != null || !skipEmpty) {\r\n data[field.get().key] = field.get().value;\r\n }\r\n });\r\n return data;\r\n }\r\n\r\n /**\r\n * Submits the Form. To be overridden in derivates\r\n * @param {FormSubmitOptions} submitOptions - Form submit options\r\n */\r\n submit(submitOptions: FormSubmitOptions) {\r\n if (this.submitCallback) {\r\n this.submitCallback(submitOptions);\r\n }\r\n }\r\n\r\n /**\r\n * Gets single Field property\r\n * @param {string} field - Field key\r\n * @param {string} property - Property name\r\n * @returns\r\n */\r\n getProperty(field: string, property: string): any {\r\n return this.getField(field).get()[property];\r\n }\r\n\r\n /**\r\n * Sets single Field property\r\n * @param {string} field - Field key\r\n * @param {string} property - Property name\r\n * @param {any} value - Property value\r\n */\r\n setProperty(field: string, property: string, value: any): void {\r\n this.getField(field).set(property, value);\r\n }\r\n\r\n /**\r\n * Binds to single Field property change\r\n * @param {string} field - Field key\r\n * @param {string} property - Property name\r\n * @param {Function} callback - Callback action\r\n */\r\n onPropertyChange(field: string, property: string, callback: (value: any, previous?: any) => void, trigger?: boolean) {\r\n var fieldModel = this.getField(field);\r\n if (trigger) {\r\n callback(fieldModel.get()[property], fieldModel.get()[property]);\r\n }\r\n fieldModel.bind(\"change:\" + property, field => {\r\n callback(field.get()[property], field.getPrevious()[property]);\r\n });\r\n }\r\n\r\n /**\r\n * Binds to property change on all Fields\r\n * @param {string} property - Property name\r\n * @param {Function} callback - Callback action\r\n */\r\n onAnyPropertyChange(property: string, callback: (field: FieldModel, value?: any, previous?: any) => void) {\r\n this.get().fields.bind(\"change:\" + property, field => {\r\n callback(field, field.get()[property], field.getPrevious()[property]);\r\n });\r\n }\r\n\r\n onSubmit(callback: (submitOptions: FormSubmitOptions) => void) {\r\n this.submitCallback = callback;\r\n }\r\n\r\n /**\r\n * Gets a Field Model by its key\r\n * @param {string} key - Field key\r\n * @returns\r\n */\r\n getField(key: string): FieldModel {\r\n var fieldKey = this.options.keyPrefix + key;\r\n if (this.fieldDict[fieldKey]) {\r\n return this.fieldDict[fieldKey];\r\n } else {\r\n throw \"Unknown field: \" + fieldKey;\r\n }\r\n }\r\n\r\n /**\r\n * Safe method to get Field Model. Returns the Field Model if exists, otherwise undefined\r\n * @param {string} key - Field key\r\n * @returns \r\n */\r\n tryGetField(key: string): FieldModel{\r\n var fieldKey = this.options.keyPrefix + key;\r\n return this.fieldDict[fieldKey];\r\n }\r\n\r\n /**\r\n * Gets single Field value/data\r\n * @param {string} field - Field key\r\n * @returns\r\n */\r\n getValue(field: string) {\r\n return this.getProperty(field, \"value\");\r\n }\r\n\r\n /**\r\n * Sets single Field value/data\r\n * @param {string} field - Field key\r\n * @param {any} value - New value\r\n */\r\n setValue(field: string, value: any) {\r\n this.setProperty(field, \"value\", value);\r\n }\r\n\r\n /**\r\n * Binds to single Field value change\r\n * @param {string} field - Field key\r\n * @param {Function} callback - Callback action\r\n */\r\n onValueChange(field: string, callback: (value: any, previous?: any) => void, trigger?: boolean) {\r\n this.onPropertyChange(field, \"value\", callback, trigger);\r\n }\r\n\r\n /**\r\n * Binds to value change on all Fields\r\n * @param {string} field - Field key\r\n * @param {Function} callback - Callback action\r\n */\r\n onAnyValueChange(callback: (field: FieldModel, value?: any, previous?: any) => void) {\r\n this.onAnyPropertyChange(\"value\", callback);\r\n }\r\n\r\n /**\r\n * Disables single Field (sets property 'disabled' to true)\r\n * @param {string} field - Field key\r\n */\r\n disableField(field: string) {\r\n this.setProperty(field, \"disabled\", true);\r\n }\r\n\r\n /**\r\n * Enables single Field (sets property 'disabled' to false)\r\n * @param {string} field - Field key\r\n */\r\n enableField(field: string) {\r\n this.setProperty(field, \"disabled\", false);\r\n }\r\n\r\n /**\r\n * Triggers value change event on single Field or all Fields\r\n * @param {string} field? - Optional single Field key\r\n */\r\n triggerValueChange(field?: string) {\r\n this.triggerPropertyChange(\"value\", field);\r\n }\r\n\r\n /**\r\n * Triggers property change on single Field or all Fields\r\n * @param {string} property - Property name\r\n * @param {string} field? - Optional single Field key\r\n */\r\n triggerPropertyChange(property: string, field?: string) {\r\n if (field) {\r\n var fieldModel = this.getField(field);\r\n fieldModel.trigger(\"change:\" + property, fieldModel);\r\n } else {\r\n this.get().fields.each(field => field.trigger(\"change:\" + property, field) );\r\n }\r\n }\r\n }\r\n \r\n // ReSharper disable once InconsistentNaming\r\n export interface FormSubmitOptions {\r\n api?: string;\r\n parse?: (data: { [key: string]: any }) => void;\r\n success?: () => void;\r\n error?: (errorText: string) => void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface FormViewBaseOptions extends AppKitchen.ViewBaseOptions {\r\n editable: boolean;\r\n editOnDemand?: boolean;\r\n submit?: FormSubmitOptions;\r\n }\r\n\r\n export abstract class FormViewBase extends AppKitchen.ViewBase {\r\n options: FormViewBaseOptions;\r\n\r\n fieldViews: FieldViewBase[];\r\n fieldViewDict: { [id: string]: FieldViewBase };\r\n\r\n constructor(model: FormModel, targetContainer: HTMLElement, options?: FormViewBaseOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n editable: false,\r\n editOnDemand: false\r\n }));\r\n\r\n this.setTemplate('
');\r\n\r\n this.delegateEvents({\r\n 'click .a-btn-preview': 'preview',\r\n 'click .a-btn-back': 'backToEdit',\r\n 'click .a-btn-submit': 'submit'\r\n });\r\n\r\n this.$el.addClass(\"a-form\");\r\n\r\n this.$el.toggleClass(\"a-form-loading\", this.model.get().loading);\r\n this.model.bind(\"change:loading\", () => {\r\n this.$el.toggleClass(\"a-form-loading\", this.model.get().loading);\r\n });\r\n\r\n this.$el.toggleClass(\"a-form-has-data\", this.model.get().hasData);\r\n this.model.bind(\"change:hasData\", () => {\r\n this.$el.toggleClass(\"a-form-has-data\", this.model.get().hasData);\r\n });\r\n\r\n this.model.bind(\"change:fields\", () => this.render());\r\n }\r\n\r\n /**\r\n * Renders the Form View\r\n */\r\n render() {\r\n this.createFields();\r\n\r\n this.$el.removeClass(\"a-form-ondemand\");\r\n this.$el.removeClass(\"a-form-edit\");\r\n this.$el.removeClass(\"a-form-view\");\r\n this.$el.removeClass(\"a-form-preview\");\r\n\r\n if (this.options.editable) {\r\n if (this.options.editOnDemand) {\r\n this.$el.addClass(\"a-form-ondemand\");\r\n } else {\r\n this.$el.addClass(\"a-form-edit\");\r\n }\r\n } else {\r\n this.$el.addClass(\"a-form-view\");\r\n }\r\n }\r\n\r\n private createFields() {\r\n this.fieldViews = [];\r\n this.fieldViewDict = {};\r\n this.model.get().fields.each(field => this.renderField(field));\r\n }\r\n\r\n private renderField(field: FieldModel) {\r\n var viewClass = this.getFieldViewClass(field.get().type);\r\n // ReSharper disable once InconsistentNaming\r\n var fieldView = new viewClass(field, { editable: this.options.editable, editOnDemand: this.options.editOnDemand });\r\n this.fieldViews.push(fieldView);\r\n this.fieldViewDict[fieldView.model.get().key] = fieldView;\r\n return fieldView.render();\r\n }\r\n\r\n private getFieldViewClass(type: FieldType): any {\r\n switch (type) {\r\n case FieldType.Text:\r\n return TextFieldView;\r\n case FieldType.Number:\r\n return NumberFieldView;\r\n case FieldType.Month:\r\n case FieldType.Year:\r\n case FieldType.Date:\r\n case FieldType.Time:\r\n case FieldType.DateTime:\r\n return DateTimeFieldView;\r\n case FieldType.Checkbox:\r\n return CheckboxFieldView;\r\n default:\r\n throw `unknown field type '${type}'!`;\r\n }\r\n }\r\n\r\n /**\r\n * Gets a single Field View by key\r\n * @param {string} key - Field key\r\n * @returns\r\n */\r\n getFieldView(key: string): FieldViewBase {\r\n var fieldKey = this.model.options.keyPrefix + key;\r\n if (this.fieldViewDict[fieldKey]) {\r\n return this.fieldViewDict[fieldKey];\r\n } else {\r\n throw \"Unknown field: \" + fieldKey;\r\n }\r\n }\r\n\r\n /**\r\n * Safe method to get Field View. Returns the Field View if exists, otherwise undefined\r\n * @param {string} key - Field key\r\n * @returns\r\n */\r\n tryGetFieldView(key: string): FieldViewBase {\r\n var fieldKey = this.model.options.keyPrefix + key;\r\n return this.fieldViewDict[fieldKey];\r\n }\r\n\r\n /**\r\n * Validates the input on all Fields and returns true if validation succeeded\r\n * @returns\r\n */\r\n validateFields(): boolean {\r\n var valid = true;\r\n this.fieldViews.forEach(view => {\r\n if (!view.tryUpdate()) {\r\n valid = false;\r\n console.log(\"Field validation failed for: \" + view.model.get().key);\r\n }\r\n });\r\n return valid;\r\n }\r\n\r\n /**\r\n * Switches an editable Form to preview mode\r\n */\r\n preview() {\r\n if (this.validateFields()) {\r\n this.switchToPreview();\r\n }\r\n }\r\n\r\n protected switchToPreview() {\r\n this.fieldViews.forEach(view => view.preview());\r\n\r\n this.$el.removeClass(\"a-form-edit\");\r\n this.$el.addClass(\"a-form-preview\");\r\n }\r\n\r\n /**\r\n * Switches an editable Form back to edit mode\r\n */\r\n backToEdit() {\r\n this.fieldViews.forEach(view => view.backToEdit());\r\n\r\n this.$el.removeClass(\"a-form-preview\");\r\n this.$el.addClass(\"a-form-edit\");\r\n }\r\n\r\n /**\r\n * Disables the Form Buttons\r\n */\r\n disableButtons() {\r\n this.$el.find(\".a-form-btn\").prop(\"disabled\", true);\r\n }\r\n\r\n /**\r\n * Enables the Form Buttons\r\n */\r\n enableButtons() {\r\n this.$el.find(\".a-form-btn\").prop(\"disabled\", false);\r\n }\r\n\r\n /**\r\n * Validates the input and submits the Form Model\r\n */\r\n submit() {\r\n if (this.options.submit !== false && this.validateFields()) {\r\n this.model.submit(this.options.submit);\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TemplatedFormViewOptions extends FormViewBaseOptions {\r\n inputIndex?: number;\r\n useExistingContent?: boolean;\r\n renderOnlyInputs?: boolean;\r\n }\r\n\r\n /**\r\n * Creates a Form View using a custom HTML template\r\n */\r\n export class TemplatedFormView extends FormViewBase {\r\n options: TemplatedFormViewOptions;\r\n\r\n /**\r\n * @param {FormModel} model - Form Model\r\n * @param {HTMLElement} targetContainer - Target HTML container\r\n * @param {string} template - Form HTML template\r\n * @param {TemplatedFormViewOptions} options? - Form View options\r\n */\r\n constructor(model: FormModel, targetContainer: HTMLElement, template: string, options?: TemplatedFormViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n editable: false,\r\n inputIndex: null,\r\n useExistingContent: false,\r\n renderOnlyInputs: false\r\n }));\r\n\r\n if (!this.options.useExistingContent) {\r\n this.setTemplate(template);\r\n }\r\n\r\n this.render();\r\n }\r\n\r\n /**\r\n * Renders the Form View\r\n */\r\n render() {\r\n super.render();\r\n\r\n // render form template\r\n if (!this.options.useExistingContent) {\r\n this.renderTemplate({});\r\n }\r\n\r\n var me = this;\r\n\r\n if (!this.options.renderOnlyInputs) {\r\n // render labels & descriptions\r\n var labelAttr = \"data-field-label\" + (this.options.inputIndex != null ? (\"-\" + this.options.inputIndex) : \"\");\r\n this.$el.find(\"[\" + labelAttr + \"]\").each((index, element) => {\r\n var key = $(element).attr(labelAttr);\r\n if (me.fieldViewDict[key]) {\r\n $(element).empty();\r\n\r\n $(element).append(AppKitchen.UIHelper.renderTemplateTo($(\"
\")[0], AppKitchen.Templates.FormFieldInfo, {\r\n info: me.fieldViewDict[key].model.get().description\r\n }).html());\r\n\r\n var label = me.fieldViewDict[key].model.get().label || \"\";\r\n $(element).append(label.trim());\r\n }\r\n });\r\n }\r\n\r\n // render inputs\r\n var inputAttr = \"data-field-input\" + (this.options.inputIndex != null ? (\"-\" + this.options.inputIndex) : \"\");\r\n this.$el.find(\"[\" + inputAttr + \"]\").each((index, element) => {\r\n var key = $(element).attr(inputAttr);\r\n if (me.fieldViewDict[key]) {\r\n $(element).empty();\r\n $(element).append(me.fieldViewDict[key].$el);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TabularFormViewOptions extends FormViewBaseOptions {\r\n showFieldNumber?: boolean;\r\n showGroupRow?: boolean;\r\n showButtons?: boolean;\r\n }\r\n\r\n /**\r\n * Creates a simple tabular Form View\r\n */\r\n export class TabularFormView extends FormViewBase {\r\n options: TabularFormViewOptions;\r\n\r\n /**\r\n * @param {FormModel} model - Form Model\r\n * @param {HTMLElement} targetContainer - Target HTML container\r\n * @param {TabularFormViewOptions} options? - Form View options\r\n */\r\n constructor(model: FormModel, targetContainer: HTMLElement, options?: TabularFormViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options,{\r\n editable: false,\r\n showFieldNumber: false,\r\n showGroupRow: true,\r\n showButtons: true\r\n }));\r\n this.setTemplate(AppKitchen.Templates.TabularForm);\r\n this.render();\r\n }\r\n\r\n protected getGroupName(groupId: string) {\r\n return groupId;\r\n }\r\n\r\n /**\r\n * Renders the Form View\r\n */\r\n render() {\r\n super.render();\r\n\r\n this.renderTemplate({\r\n showFieldNumber: this.options.showFieldNumber,\r\n showButtons: this.options.showButtons\r\n });\r\n\r\n var table = this.$el.find(\"table\");\r\n\r\n var fields = this.model.get().fields.models;\r\n\r\n if (!fields || fields.length === 0) {\r\n return;\r\n }\r\n\r\n var groupHeaderTemplate = _.template(AppKitchen.Templates.TabularFormGroupRow);\r\n var currentGroupId = fields[0].get().fieldGroup;\r\n\r\n var showGroups = this.options.showGroupRow && currentGroupId ? true : false;\r\n\r\n if (showGroups) {\r\n table.append(groupHeaderTemplate({ groupName: this.getGroupName(currentGroupId), showFieldNumber: this.options.showFieldNumber}));\r\n }\r\n\r\n for (let i = 0; i < fields.length; i++) {\r\n if (fields[i].get().hidden) {\r\n continue;\r\n }\r\n\r\n // render grouping row\r\n if (showGroups && currentGroupId !== fields[i].get().fieldGroup) {\r\n currentGroupId = fields[i].get().fieldGroup;\r\n table.append(groupHeaderTemplate({ groupName: this.getGroupName(currentGroupId) || \" \", showFieldNumber: this.options.showFieldNumber }));\r\n }\r\n\r\n // prepare row number\r\n var rowNumber = { rowspan: 0, number: fields[i].get().order };\r\n if (this.options.showFieldNumber) {\r\n if (i <= 0 || fields[i].get().order !== fields[i - 1].get().order) {\r\n let rowSpan = 1;\r\n while (i + rowSpan < fields.length && fields[i].get().order === fields[i + rowSpan].get().order) {\r\n rowSpan++;\r\n }\r\n rowNumber.rowspan = rowSpan;\r\n }\r\n }\r\n\r\n // render field row\r\n var row = AppKitchen.UIHelper.renderTemplateTo($(\"\")[0], AppKitchen.Templates.TabularFormRow, {\r\n label: fields[i].get().label,\r\n description: fields[i].get().description,\r\n numberrowspan: rowNumber.rowspan,\r\n number: rowNumber.number\r\n });\r\n row.find(\".a-form-field-value\").append(this.fieldViewDict[fields[i].get().key].el);\r\n\r\n // append to table\r\n table.append(row);\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface HorizontalTabularFormViewOptions extends FormViewBaseOptions {\r\n submitIcon?: string;\r\n submitTooltip?: string;\r\n showButtons?: boolean;\r\n showTooltips?: boolean;\r\n showLabels?: boolean;\r\n }\r\n\r\n export class HorizontalTabularFormView extends FormViewBase {\r\n options: HorizontalTabularFormViewOptions;\r\n\r\n constructor(model: FormModel, targetContainer: HTMLElement, options?: HorizontalTabularFormViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n editable: false,\r\n submitIcon: \"icon-search\",\r\n submitTooltip: \"Search\",\r\n showButtons: false,\r\n showTooltips: false,\r\n showLabels: true\r\n }));\r\n\r\n this.setTemplate(AppKitchen.Templates.HorizontalTabularForm);\r\n\r\n this.render();\r\n }\r\n\r\n private getFieldModelData(): { id: string, label: string }[] {\r\n var fields = this.model.get().fields.models;\r\n\r\n var fieldData: { id: string, label: string }[] = [];\r\n\r\n for (let field of fields) {\r\n fieldData.push({ id: field.get().key, label: field.get().label });\r\n }\r\n\r\n return fieldData;\r\n }\r\n\r\n render() {\r\n super.render();\r\n\r\n this.renderTemplate(\r\n {\r\n fieldData: this.getFieldModelData(),\r\n showButtons: this.options.showButtons,\r\n showLabels: this.options.showLabels,\r\n showTooltips: this.options.showTooltips,\r\n submitIcon: this.options.submitIcon,\r\n submitTooltip: this.options.submitTooltip\r\n });\r\n\r\n var fieldModels = this.model.get().fields.models;\r\n\r\n for (let fieldModel of fieldModels) {\r\n $(this.el).find(\"#\" + fieldModel.get().key).append(this.fieldViewDict[fieldModel.get().key].el);\r\n\r\n if (this.options.showTooltips && fieldModel.get().label !== null && fieldModel.get().label !== \"\") {\r\n $(this.el).find(\"#\" + fieldModel.get().key).kendoTooltip({\r\n position: \"top\",\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n }\r\n\r\n if (this.options.showButtons && this.options.showTooltips) {\r\n this.$el.find(\".a-btn-submit\").kendoTooltip({\r\n position: \"top\",\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","///\r\n///\r\n\r\nmodule AppKitchen {\r\n\r\n export module Apps {\r\n import Forms = Controls.Forms;\r\n import UserInfo = Api.Models.UserInfo;\r\n import TextInputFieldViewBase = Controls.Forms.TextInputFieldViewBase;\r\n\r\n export class ExtendedUserMenuApp extends AppKitchen.AppBase {\r\n start() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.ExtendedUserMenu);\r\n AppKitchen.UIHelper.renderLoader(this.$el.find(\".a-user-info\")[0], { size: \"S\" });\r\n AppKitchen.Data.Api.getUserInfo(userInfo => {\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.$el.find(\".a-user-info\")[0], AppKitchen.Templates.ExtendedUserMenuUserInfo, {\r\n name: userInfo.Name,\r\n email: userInfo.MailAddress\r\n });\r\n\r\n this.$el.find(\".a-user-btn-logout\").click((e) => this.logout(e));\r\n\r\n if (this.options.changePassword) {\r\n this.$el.find(\".a-user-btn-changepwd\").click(() => startChangePasswordWindow());\r\n } else {\r\n this.$el.find(\".a-user-btn-changepwd\").remove();\r\n }\r\n\r\n if (this.options.extendedUserInfo) {\r\n this.$el.find(\".a-user-btn-profile\").click(() => startUserInformationWindow());\r\n } else {\r\n this.$el.find(\".a-user-btn-profile\").remove();\r\n }\r\n });\r\n }\r\n\r\n private logout(e: any) {\r\n e.preventDefault();\r\n this.$el.fadeOut(400, () => {\r\n setTimeout(() => AppKitchen.LoginManager.logout(true), 300);\r\n });\r\n }\r\n }\r\n\r\n class UserInfoFormModel extends AppKitchen.Controls.Forms.FormModel {\r\n constructor(userInfo: AppKitchen.Api.Models.UserInfo) {\r\n var fields = [\r\n new AppKitchen.Controls.Forms.FieldModel(\"Nr\", AppKitchen.Controls.Forms.FieldType.Number, AppKitchen.Strings.UserInfo_Nr, { format: \"n0\" }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"Id\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_Id, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"Name\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_Name, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"MailAddress\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_MailAddress,{ pattern: Forms.FieldPatterns.Email }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"Phone\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_Phone, { pattern: Forms.FieldPatterns.Phone }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"WindowsId\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_WindowsId, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"Description\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_Description, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"Division\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_Division, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"DefaultDatabaseId\", AppKitchen.Controls.Forms.FieldType.Text, AppKitchen.Strings.UserInfo_DefaultDatabaseId, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"IsAdmin\", AppKitchen.Controls.Forms.FieldType.Checkbox, AppKitchen.Strings.UserInfo_IsAdmin, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"IsSysAdmin\", AppKitchen.Controls.Forms.FieldType.Checkbox, AppKitchen.Strings.UserInfo_IsSysAdmin, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"IsUserManager\", AppKitchen.Controls.Forms.FieldType.Checkbox, AppKitchen.Strings.UserInfo_IsUserManager, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"IsUserApprover\", AppKitchen.Controls.Forms.FieldType.Checkbox, AppKitchen.Strings.UserInfo_IsUserApprover, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"IsUserAuthenticator\", AppKitchen.Controls.Forms.FieldType.Checkbox, AppKitchen.Strings.UserInfo_IsUserAuthenticator, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"IsServerCertApplier\", AppKitchen.Controls.Forms.FieldType.Checkbox, AppKitchen.Strings.UserInfo_IsServerCertApplier, { readOnly: true }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"IsServerCertApprover\", AppKitchen.Controls.Forms.FieldType.Checkbox, AppKitchen.Strings.UserInfo_IsServerCertApprover, { readOnly: true })\r\n\r\n ];\r\n super(fields);\r\n this.setFieldsData(userInfo);\r\n }\r\n }\r\n\r\n export class UserInfoApp extends AppKitchen.AppBase {\r\n\r\n private formModel: UserInfoFormModel;\r\n private formView: AppKitchen.Controls.Forms.TemplatedFormView;\r\n\r\n private containers: {\r\n content: HTMLElement,\r\n }\r\n\r\n private buttons: {\r\n save: JQuery,\r\n cancel: JQuery,\r\n cancelEdit: JQuery,\r\n edit: JQuery,\r\n }\r\n\r\n private elements: {\r\n adminBox: JQuery,\r\n sysadminBox: JQuery,\r\n }\r\n\r\n start() {\r\n AppKitchen.Data.Api.getUserInfo(userInfo => {\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el,\r\n AppKitchen.Templates.UserInfoExtendedTile,\r\n {\r\n name: userInfo.Name,\r\n info: `${AppKitchen.Strings.UserInfo_LastLogin}: ${kendo.toString(userInfo.LogonDate, \"F\")}`\r\n });\r\n\r\n this.containers = {\r\n content: this.$el.find(\".a-userinfo-extended-tile-content\")[0]\r\n };\r\n\r\n this.buttons = {\r\n save: this.$el.find(\".a-userinfo-extended-save\"),\r\n cancel: this.$el.find(\".a-userinfo-extended-cancel\"),\r\n cancelEdit: this.$el.find(\".a-userinfo-extended-cancel-edit\"),\r\n edit: this.$el.find(\".a-userinfo-extended-edit\")\r\n }\r\n\r\n this.elements = {\r\n adminBox: this.$el.find(\".is-admin-box\"),\r\n sysadminBox: this.$el.find(\".is-sysadmin-box\"),\r\n }\r\n\r\n this.formModel = new UserInfoFormModel(userInfo);\r\n\r\n // ReSharper disable once WrongExpressionStatement\r\n this.formView = new AppKitchen.Controls.Forms.TemplatedFormView(this.formModel, this.containers.content, AppKitchen.Templates.UserInfoForm,\r\n { editable: true });\r\n\r\n this.setButtonAction(userInfo);\r\n\r\n if (userInfo.IsAdmin) {\r\n this.elements.adminBox.removeClass(\"hide\");\r\n }\r\n\r\n if (userInfo.IsSysAdmin) {\r\n this.elements.sysadminBox.removeClass(\"hide\");\r\n }\r\n });\r\n }\r\n\r\n private setButtonAction(userInfo: UserInfo) {\r\n\r\n this.buttons.edit.click(() => {\r\n this.enableEdit();\r\n });\r\n\r\n this.buttons.save.click(() => {\r\n this.updateUserInfo(userInfo);\r\n });\r\n this.buttons.cancel.click(() => {\r\n this.canselEdit(userInfo);\r\n });\r\n this.buttons.cancelEdit.click(() => {\r\n this.closeWindow();\r\n });\r\n\r\n this.formView.preview();\r\n\r\n this.buttons.save.hide();\r\n this.buttons.cancel.hide();\r\n }\r\n\r\n private enableEdit() {\r\n this.formView.backToEdit();\r\n\r\n this.buttons.edit.hide();\r\n this.buttons.cancelEdit.hide();\r\n this.buttons.save.show();\r\n this.buttons.cancel.show();\r\n }\r\n\r\n private canselEdit(userInfo: UserInfo) {\r\n this.formModel.setValue(\"MailAddress\", userInfo.MailAddress);\r\n this.formModel.setValue(\"Phone\", userInfo.Phone);\r\n\r\n this.formModel.getField(\"MailAddress\").set({ error: null });\r\n this.formModel.getField(\"Phone\").set({ error: null });\r\n\r\n this.formView.preview();\r\n\r\n\r\n this.buttons.edit.show();\r\n this.buttons.cancelEdit.show();\r\n this.buttons.save.hide();\r\n this.buttons.cancel.hide();\r\n }\r\n\r\n private updateUserInfo(userInfo: UserInfo) {\r\n if (this.formView.validateFields()) {\r\n let email = this.formModel.getValue(\"MailAddress\");\r\n let phone = this.formModel.getValue(\"Phone\");\r\n\r\n userInfo.MailAddress = email;\r\n userInfo.Phone = phone;\r\n\r\n this.formModel.set({ loading: true });\r\n AppKitchen.Data.Api.updateUserInfo({\r\n UserInfo: userInfo\r\n }, (response) => {\r\n this.formModel.set({ loading: false });\r\n if (response.SuccessfullyUpdated) {\r\n this.canselEdit(userInfo);\r\n //this.closeWindow();\r\n }\r\n });\r\n }\r\n }\r\n\r\n closeWindow() {\r\n this.$el.closest(\".a-app-window\").data(\"kendoWindow\").close();\r\n }\r\n }\r\n\r\n export class ChangePasswordApp extends AppBase {\r\n formModel: AppKitchen.Controls.Forms.FormModel;\r\n templatedFormView: AppKitchen.Controls.Forms.TemplatedFormView;\r\n\r\n start() {\r\n var fields = [\r\n new AppKitchen.Controls.Forms.FieldModel(\"OldPassword\", AppKitchen.Controls.Forms.FieldType.Text, \"OldPassword\", {\r\n password: true,\r\n placeholder: AppKitchen.Strings.UserInfo_OldPassword,\r\n order: 10001\r\n }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"NewPassword1\", AppKitchen.Controls.Forms.FieldType.Text, \"NewPassword1\", {\r\n password: true,\r\n placeholder: AppKitchen.Strings.UserInfo_NewPassword,\r\n order: 10002\r\n }),\r\n new AppKitchen.Controls.Forms.FieldModel(\"NewPassword2\", AppKitchen.Controls.Forms.FieldType.Text, \"NewPassword2\", {\r\n password: true,\r\n placeholder: AppKitchen.Strings.UserInfo_ConfirmNewPassword,\r\n order: 10003\r\n })\r\n ];\r\n\r\n this.formModel = new AppKitchen.Controls.Forms.FormModel(fields);\r\n this.templatedFormView = new AppKitchen.Controls.Forms.TemplatedFormView(this.formModel, this.el, AppKitchen.Templates.ChangePassword, { editable: true });\r\n\r\n // submit on enter\r\n this.templatedFormView.fieldViewDict[\"OldPassword\"].on(\"keypress-enter\", () => this.changePassword());\r\n this.templatedFormView.fieldViewDict[\"NewPassword1\"].on(\"keypress-enter\", () => this.changePassword());\r\n this.templatedFormView.fieldViewDict[\"NewPassword2\"].on(\"keypress-enter\", () => this.changePassword());\r\n\r\n // submit on button click\r\n this.$el.find(\".a-btn-change-pwd\").click(this.changePassword.bind(this));\r\n // cancel on button click\r\n this.$el.find(\".a-btn-cancel\").click(() => this.closeWindow());\r\n\r\n }\r\n\r\n changePassword() {\r\n var password1 = this.formModel.getValue(\"NewPassword1\");\r\n var password2 = this.formModel.getValue(\"NewPassword2\");\r\n\r\n if (password1 !== password2) {\r\n this.raiseError(\"PasswordsAreNotIdentical\");\r\n return;\r\n }\r\n\r\n this.formModel.set({ loading: true });\r\n AppKitchen.Data.Api.changePassword({\r\n UserId: \"\",\r\n OldPassword: this.formModel.getValue(\"OldPassword\"),\r\n NewPassword: password1\r\n }, (response) => {\r\n if (response.SuccessfullyChanged) {\r\n this.successfullyChangedPassword();\r\n } else {\r\n this.formModel.set({ loading: false });\r\n this.raiseError(response.ErrorMessage);\r\n }\r\n });\r\n }\r\n\r\n raiseError(message: string) {\r\n var translatedMessage = this.getErrorMessage(message);\r\n switch (message) {\r\n case \"WrongUsernameOrPassword\":\r\n case \"OldPasswordIncorrect\":\r\n case \"WrongPassword\":\r\n this.formModel.setProperty(\"OldPassword\", \"error\", translatedMessage);\r\n break;\r\n case \"InsufficientComplexity\":\r\n case \"TooShort\":\r\n case \"TooLong\":\r\n case \"InHistory\":\r\n this.formModel.setProperty(\"NewPassword1\", \"error\", translatedMessage);\r\n break;\r\n case \"PasswordsAreNotIdentical\":\r\n this.formModel.setProperty(\"NewPassword2\", \"error\", translatedMessage);\r\n break;\r\n default:\r\n AppKitchen.UIHelper.DialogBoxes.alert(translatedMessage);\r\n break;\r\n }\r\n }\r\n\r\n successfullyChangedPassword() {\r\n this.closeWindow();\r\n\r\n AppKitchen.UIHelper.DialogBoxes.alert(AppKitchen.Strings.ChangePassword_Message_PasswordChangedSuccessfully);\r\n }\r\n\r\n getErrorMessage(plainMessage: string) {\r\n var translatedMessage = AppKitchen.Strings[\"PasswordError_\" + plainMessage];\r\n if (!translatedMessage) {\r\n return plainMessage;\r\n }\r\n return translatedMessage;\r\n }\r\n\r\n closeWindow() {\r\n this.$el.closest(\".a-app-window\").data(\"kendoWindow\").close();\r\n }\r\n }\r\n\r\n function startChangePasswordWindow() {\r\n new AppKitchen.FrameManager.AppHolder(ChangePasswordApp).startInWindow({\r\n width: \"25em\",\r\n height: \"auto\",\r\n modal: true,\r\n easyClose: false,\r\n opened: (window) => window.wrapper.find(\"input\").first().focus(),\r\n overflow: true,\r\n center: true\r\n });\r\n }\r\n\r\n function startUserInformationWindow() {\r\n new AppKitchen.FrameManager.AppHolder(UserInfoApp).startInWindow({\r\n width: \"35em\",\r\n height: \"37em\",\r\n modal: true,\r\n easyClose: false,\r\n overflow: true,\r\n center: true\r\n });\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Controls {\r\n export module Charts {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CombinedChartOptions extends AppKitchen.ViewBaseOptions {\r\n title: string;\r\n subtitle?: string;\r\n onClickStackedColumnChart?: (e: any) => void;\r\n onClickPieChart?: (e: any) => void;\r\n noDataMessage?: string;\r\n }\r\n\r\n export class CombinedChartView extends AppKitchen.ViewBase {\r\n options: CombinedChartOptions;\r\n\r\n container: {\r\n legendContainer: HTMLElement,\r\n chartLeftContainer: HTMLElement,\r\n chartRightContainer: HTMLElement,\r\n }\r\n\r\n pieChardModel: PieChartModel;\r\n pieChartView: PieChartView;\r\n\r\n pieChartData: { category: string, value: number, color: string, visible: boolean}[];\r\n\r\n stackedColumnChartView: StackedColumnChartView;\r\n\r\n constructor(model: StackedColumnChartModel, target: HTMLElement, options?: CombinedChartOptions) {\r\n super(model, target, options);\r\n this.options = options;\r\n\r\n this.setTemplate(AppKitchen.Templates.CombinedChardApp);\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n var data = [];\r\n var legendItems = [];\r\n var dataStock = this.model.get().data;\r\n\r\n for (let i = 0; i < dataStock.series.length; i++) {\r\n var serie = dataStock.series[i];\r\n\r\n var sum = dataStock.series[i].data.reduce((a, b) => a + b, 0);\r\n data.push({ category: serie.name, value: sum, color: serie.color });\r\n legendItems.push({ id: `legendItem_${i}`, name: serie.name, color: serie.color });\r\n }\r\n\r\n this.renderTemplate({ title: this.options.title, subtitle: this.options.subtitle, legendItems: legendItems });\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.$el.find(\".a-combined-chart-container\")[0],\r\n AppKitchen.Templates.CombinedChard);\r\n\r\n this.container = {\r\n legendContainer: this.$el.find(\".a-combined-chart-legend-container\")[0],\r\n chartLeftContainer: this.$el.find(\".a-combined-chart-left-container\")[0],\r\n chartRightContainer: this.$el.find(\".a-combined-chart-right-container\")[0]\r\n };\r\n\r\n this.pieChardModel = new PieChartModel();\r\n this.pieChartView = new PieChartView(this.pieChardModel, this.container.chartLeftContainer, {\r\n noDataMessage: this.options.noDataMessage,\r\n onSeriesClick: this.options.onClickPieChart,\r\n legend: { visible: false }\r\n });\r\n this.pieChardModel.data(data);\r\n this.initPieChartLookupTable();\r\n\r\n this.stackedColumnChartView = new StackedColumnChartView(this.model, this.container.chartRightContainer, {\r\n legend: { visible: false },\r\n onSeriesClick: this.options.onClickStackedColumnChart\r\n });\r\n\r\n for (let legendItem of legendItems) {\r\n var legendButton = this.$el.find(\"#\" + legendItem.id);\r\n legendButton.bind(\"click\", (e) => {\r\n if ($(e.target).hasClass(\"a-legend-item-label\")) {\r\n $(e.target).toggleClass(\"a-legend-item-selected\");\r\n this.onLegendItemClick(legendItem.name);\r\n }\r\n });\r\n }\r\n }\r\n\r\n initPieChartLookupTable() {\r\n this.pieChartData = [];\r\n\r\n var pieChart = this.pieChartView.chart;\r\n\r\n for (let i = 0; i < pieChart.options.series[0].data.length; i++) {\r\n var d = pieChart.options.series[0].data[i];\r\n this.pieChartData.push({ category: d.category, value: d.value, color: d.color, visible: true });\r\n }\r\n }\r\n\r\n onLegendItemClick(category: string) {\r\n var columnChart = this.stackedColumnChartView.chart;\r\n for (let i = 0; i < columnChart.options.series.length; i++) {\r\n if (columnChart.options.series[i].name === category) {\r\n columnChart.options.series[i].visible = !columnChart.options.series[i].visible;\r\n break;\r\n }\r\n }\r\n columnChart.redraw();\r\n\r\n for (let i = 0; i < this.pieChartData.length; i++) {\r\n if (this.pieChartData[i].category === category) {\r\n this.pieChartData[i].visible = !this.pieChartData[i].visible;\r\n break;\r\n }\r\n }\r\n var pieChart = this.pieChartView.chart;\r\n\r\n var data: any[] = [];\r\n\r\n for (let i = 0; i < this.pieChartData.length; i++) {\r\n if (this.pieChartData[i].visible) {\r\n data.push(this.pieChartData[i]);\r\n }\r\n }\r\n\r\n pieChart.options.series[0].data = data;\r\n\r\n pieChart.redraw();\r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Controls {\r\n export module Charts {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface PieChartDataItem {\r\n category: string;\r\n value: number;\r\n color: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface PieChartAttributes extends AppKitchen.ModelBaseAttributes {\r\n data?: PieChartDataItem[];\r\n }\r\n\r\n export class PieChartModel extends AppKitchen.ModelBase {\r\n\r\n constructor(data?: PieChartDataItem[]) {\r\n super({\r\n data: data || []\r\n });\r\n }\r\n\r\n data(data: PieChartDataItem[]) {\r\n this.set({ data: data });\r\n }\r\n }\r\n\r\n export type LegendLabel = {\r\n color?: string;\r\n font?: string;\r\n template?: string | Function;\r\n }\r\n\r\n export type SeriesLabel = {\r\n visible?: boolean,\r\n background?: string,\r\n template?: string\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface PieChartOptions extends AppKitchen.ViewBaseOptions {\r\n size?: number;\r\n noDataMessage?: string;\r\n //position: \"top\" | \"bottom\" | \"left\" | \"right\" | \"custom\"\r\n //align: \"start\" | \"center\" | \"end\"\r\n legend?: {\r\n visible?: boolean,\r\n position?: string,\r\n align?: string,\r\n offsetX?: number,\r\n offsetY?: number,\r\n labels?: LegendLabel\r\n },\r\n onLegendItemClick?: any;\r\n onSeriesClick?: any;\r\n seriesDefaults?: {\r\n labels?: SeriesLabel\r\n };\r\n }\r\n\r\n export class PieChartView extends AppKitchen.ViewBase {\r\n options: PieChartOptions;\r\n chart: kendo.dataviz.ui.Chart;\r\n\r\n rendered: boolean;\r\n\r\n constructor(model: PieChartModel, targetContainer: HTMLElement, options?: PieChartOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n size: undefined,\r\n noDataMessage: AppKitchen.Strings.PieChart_NoData,\r\n legend: AppKitchen.OptionsHelper.merge(options ? options.legend : {},\r\n {\r\n visible: true,\r\n position: \"top\",\r\n align: \"end\",\r\n labels: {},\r\n }),\r\n seriesDefaults: AppKitchen.OptionsHelper.merge(options ? options.seriesDefaults : {}, { labels: { visible: false } }, true)\r\n }));\r\n\r\n this.setTemplate(Templates.PieChart);\r\n\r\n this.rendered = false;\r\n\r\n this.model.bind(\"change:data\", this.render, this);\r\n this.render();\r\n }\r\n\r\n private configureWrapper(size?: number) {\r\n var wrapper = this.$el.find(\".a-piechart-wrapper\");\r\n var container = this.$el.find(\".a-piechart-container\");\r\n\r\n var chartSize = size || this.options.size || Math.min(this.$el.height(), this.$el.width()) || 300;\r\n\r\n $(wrapper).css({\r\n \"height\": chartSize,\r\n \"width\": chartSize\r\n });\r\n $(container).css({\r\n \"height\": chartSize * 1.4,\r\n \"width\": chartSize * 1.4,\r\n \"margin-top\": - chartSize * 0.2,\r\n \"margin-left\": - chartSize * 0.2,\r\n \"font-size\": chartSize / 17\r\n });\r\n }\r\n\r\n resize(size?: number) {\r\n this.configureWrapper(size);\r\n if (this.chart) {\r\n this.chart.resize();\r\n }\r\n }\r\n\r\n render() {\r\n this.renderTemplate({});\r\n\r\n this.configureWrapper();\r\n\r\n var container = this.$el.find(\".a-piechart-container\");\r\n \r\n var chartData = this.removeEmptyData(this.model.get().data);\r\n\r\n if (chartData.length > 0) {\r\n this.chart = container.kendoChart({\r\n legend: {\r\n visible: this.options.legend.visible,\r\n position: this.options.legend.position,\r\n align: this.options.legend.align,\r\n offsetX: this.options.legend.offsetX,\r\n offsetY: this.options.legend.offsetY,\r\n labels: this.options.legend.labels\r\n },\r\n chartArea: {\r\n background: \"\"\r\n },\r\n seriesDefaults: {\r\n labels: this.options.seriesDefaults.labels\r\n },\r\n series: [\r\n {\r\n type: \"pie\",\r\n startAngle: 90,\r\n data: chartData,\r\n overlay: {\r\n gradient: null\r\n }\r\n }\r\n ],\r\n tooltip: {\r\n visible: true,\r\n template: \"#= category #: #= value #\"\r\n },\r\n transitions: !this.rendered,\r\n legendItemClick: this.options.onLegendItemClick,\r\n seriesClick: this.options.onSeriesClick\r\n }).data(\"kendoChart\");\r\n\r\n this.rendered = true;\r\n } else {\r\n this.rendered = false;\r\n if (this.options.noDataMessage) {\r\n this.chart = container.kendoChart({\r\n legend: {\r\n visible: false\r\n },\r\n chartArea: {\r\n background: \"\"\r\n },\r\n seriesDefaults: {\r\n labels: {\r\n visible: false\r\n }\r\n },\r\n series: [\r\n {\r\n type: \"pie\",\r\n startAngle: 90,\r\n data: [{\r\n category: \"\",\r\n value: 100,\r\n color: AppKitchen.Colors.LightGray\r\n }],\r\n overlay: {\r\n gradient: null\r\n },\r\n highlight: {\r\n visible: false\r\n }\r\n }\r\n ],\r\n tooltip: false,\r\n transitions: !this.rendered\r\n }).data(\"kendoChart\");\r\n container.find(\"> svg\").css(\"opacity\", 0.5);\r\n container.append('
' + this.options.noDataMessage + '
');\r\n }\r\n }\r\n\r\n }\r\n\r\n private removeEmptyData(input: PieChartDataItem[]): any {\r\n var output = [];\r\n if (input) {\r\n for (var i = 0; i < input.length; i++) {\r\n if (input[i].value > 0) {\r\n output.push(input[i]);\r\n }\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n }\r\n \r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Controls {\r\n export module Charts {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface StackedColumnSeries {\r\n name: string;\r\n data: number[];\r\n color: string;\r\n stack?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface StackedColumnChartAttributes extends AppKitchen.ModelBaseAttributes {\r\n data?: {\r\n categories: string[];\r\n series: StackedColumnSeries[];\r\n }\r\n }\r\n \r\n export class StackedColumnChartModel extends AppKitchen.ModelBase {\r\n constructor() {\r\n super({\r\n data: {\r\n categories: [],\r\n series: []\r\n }\r\n });\r\n }\r\n\r\n data(data: { categories: string[], series: StackedColumnSeries[] }) {\r\n var defaultStack = AppKitchen.StringHelper.generateRandom(5);\r\n if (data && data.series && data.series.length > 0) {\r\n data.series.forEach(series => series.stack = series.stack || defaultStack);\r\n }\r\n\r\n this.set({\r\n data: data\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface StackedColumnChartOptions extends AppKitchen.ViewBaseOptions {\r\n height?: number;\r\n valueAxis?: { visible?: boolean, minMax?: number }\r\n //position: \"top\" | \"bottom\" | \"left\" | \"right\" | \"custom\"\r\n //align: \"start\" | \"center\" | \"end\"\r\n legend?: { visible?: boolean, position?: string, align?: string, offsetX?: number, offsetY?: number},\r\n onLegendItemClick?: any;\r\n onSeriesClick?: any;\r\n }\r\n\r\n export class StackedColumnChartView extends AppKitchen.ViewBase {\r\n options: StackedColumnChartOptions;\r\n\r\n chartSelector: string;\r\n rendered: boolean;\r\n\r\n chart: kendo.dataviz.ui.Chart;\r\n\r\n constructor(model: StackedColumnChartModel, targetContainer: HTMLElement, options?: StackedColumnChartOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n height: undefined,\r\n valueAxis: AppKitchen.OptionsHelper.merge(options ? options.valueAxis : {}, { visible: true, minMax: undefined }),\r\n legend: AppKitchen.OptionsHelper.merge(options ? options.legend : {}, { visible: true, position: \"top\", align: \"end\" })\r\n }));\r\n\r\n this.setTemplate('
');\r\n\r\n this.rendered = false;\r\n\r\n this.model.bind('change:data', this.render, this);\r\n this.render();\r\n }\r\n\r\n render() {\r\n this.renderTemplate({});\r\n\r\n var container = this.$el.find(\".a-stacked-column-chart-container\");\r\n\r\n var chartData = this.model.get().data;\r\n if (chartData) {\r\n this.chart = $(container).kendoChart({\r\n legend: {\r\n visible: this.options.legend.visible,\r\n position: this.options.legend.position,\r\n align: this.options.legend.align,\r\n offsetX: this.options.legend.offsetX,\r\n offsetY: this.options.legend.offsetY,\r\n itemStyle: {\r\n color: \"#808080\"\r\n }\r\n },\r\n chartArea: {\r\n background: \"\",\r\n height: this.options.height || this.$el.height()\r\n },\r\n seriesDefaults: {\r\n type: \"column\",\r\n overlay: {\r\n gradient: null\r\n },\r\n border: {\r\n width: 0\r\n }\r\n },\r\n series: chartData.series,\r\n categoryAxis: {\r\n categories: chartData.categories,\r\n majorGridLines: {\r\n visible: false\r\n },\r\n line: false\r\n },\r\n valueAxis: {\r\n name: \"value\",\r\n visible: this.options.valueAxis.visible,\r\n line: false\r\n },\r\n tooltip: {\r\n visible: true,\r\n template: \"#= series.name #: #= value #\"\r\n },\r\n transitions: !this.rendered,\r\n legendItemClick: this.options.onLegendItemClick,\r\n seriesClick: this.options.onSeriesClick\r\n }).data(\"kendoChart\");\r\n\r\n this.setValueAxisMax();\r\n\r\n this.rendered = chartData.series.length > 0 && chartData.series[0].data.length > 0;\r\n } else {\r\n this.rendered = false;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n resize(height?: number) {\r\n if (this.chart) {\r\n this.chart.setOptions({\r\n chartArea: {\r\n height: height || this.options.height || this.$el.height()\r\n }\r\n });\r\n this.setValueAxisMax();\r\n this.chart.resize();\r\n }\r\n }\r\n\r\n private setValueAxisMax() {\r\n if (this.options.valueAxis.minMax) {\r\n var xAxis = this.chart.getAxis(\"value\");\r\n if (xAxis.range().max < this.options.valueAxis.minMax) {\r\n (this.chart.options.valueAxis).max = this.options.valueAxis.minMax;\r\n this.chart.resize();\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Controls {\r\n export module Data {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ImportExportAttributes extends AppKitchen.ModelBaseAttributes {\r\n }\r\n\r\n export class InportExportModel extends AppKitchen.ModelBase {\r\n\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InportExportViewOptions extends AppKitchen.ViewBaseOptions {\r\n importExcelCallback?: (file: File) => void;\r\n importCsvCallback?: (file: File) => void;\r\n exportExcelCallback?: () => void;\r\n exportCsvCallback?: () => void;\r\n }\r\n\r\n export class InportExportView extends AppKitchen.ViewBase {\r\n options: InportExportViewOptions;\r\n\r\n buttons: {\r\n exportMenu: JQuery;\r\n importMenu: JQuery;\r\n };\r\n\r\n exportMenu: kendo.ui.Menu;\r\n importMenu: kendo.ui.Menu;\r\n\r\n constructor(model: InportExportModel, target: HTMLElement, options?: InportExportViewOptions) {\r\n super(model, target, options);\r\n this.options = options;\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n var importEnable = this.options.importExcelCallback || this.options.importCsvCallback;\r\n var exportEnable = this.options.exportExcelCallback || this.options.exportCsvCallback;\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el,\r\n AppKitchen.Templates.ImportExport,\r\n { importMenu: importEnable, exportMenu: exportEnable });\r\n\r\n this.configureButtons();\r\n\r\n this.configureExportMenu();\r\n\r\n this.configureImportMenu();\r\n }\r\n\r\n configureButtons() {\r\n this.buttons = {\r\n exportMenu: this.$el.find(\".a-file-export\"),\r\n importMenu: this.$el.find(\".a-file-import\")\r\n }\r\n\r\n this.buttons.exportMenu.kendoTooltip({\r\n position: \"top\",\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n this.buttons.importMenu.kendoTooltip({\r\n position: \"top\",\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n\r\n configureExportMenu() {\r\n var mainList = $('
    ');\r\n\r\n this.createMenuExport(mainList);\r\n\r\n this.buttons.exportMenu.find(\" > li\").append(mainList);\r\n this.buttons.exportMenu.show(0);\r\n this.exportMenu = this.buttons.exportMenu.kendoMenu({ openOnClick: true }).data(\"kendoMenu\");\r\n }\r\n\r\n createMenuExport(mainList: JQuery) {\r\n var xlsList = $(\"
  • \" + Strings.ImportExportView_ExportToXls + \"
  • \");\r\n var csvList = $(\"
  • \" + Strings.ImportExportView_ExportToCsv + \"
  • \");\r\n\r\n xlsList.click(() => { this.options.exportExcelCallback()});\r\n csvList.click(() => { this.options.exportCsvCallback()});\r\n\r\n mainList.append(xlsList);\r\n mainList.append(csvList);\r\n }\r\n\r\n configureImportMenu() {\r\n var mainList = $('
      ');\r\n\r\n this.createMenuImport(mainList);\r\n\r\n this.buttons.importMenu.find(\" > li\").append(mainList);\r\n this.buttons.importMenu.show(0);\r\n this.importMenu = this.buttons.importMenu.kendoMenu({ openOnClick: true }).data(\"kendoMenu\");\r\n }\r\n\r\n createMenuImport(mainList: JQuery) {\r\n let xlsList = $(AppKitchen.UIHelper.renderTemplate(Templates.FileInputMenu,\r\n {\r\n labelText: Strings.ImportExportView_ImportFromXls,\r\n allowedExtentions: \".xlsx\"\r\n }));\r\n let csvList = $(AppKitchen.UIHelper.renderTemplate(Templates.FileInputMenu,\r\n {\r\n labelText: Strings.ImportExportView_ImportFromCsv,\r\n allowedExtentions: \".csv\"\r\n }));\r\n\r\n xlsList.find(\"input[type=file]\").on(\"change\", e => {\r\n if (e.target && (e.target).files && (e.target).files.length > 0) {\r\n var file = (e.target).files[0];\r\n this.options.importExcelCallback(file);\r\n }\r\n xlsList.find(\"input[type=file]\").val('');\r\n });\r\n csvList.find(\"input[type=file]\").on(\"change\", e => {\r\n if (e.target && (e.target).files && (e.target).files.length > 0) {\r\n var file = (e.target).files[0];\r\n this.options.importCsvCallback(file);\r\n }\r\n // TODO: verbessern\r\n csvList.find(\"input[type=file]\").val('');\r\n });\r\n\r\n mainList.append(xlsList);\r\n mainList.append(csvList);\r\n }\r\n }\r\n }\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface DateRangePickerRoutingParameters {\r\n startDate?: string;\r\n endDate?: string;\r\n startFilter?: string;\r\n endFilter?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface DateRangeAttributes extends AppKitchen.ModelBaseAttributes {\r\n startDate?: Date;\r\n endDate?: Date;\r\n startFilter?: string;\r\n endFilter?: string;\r\n }\r\n\r\n export class DateRangeModel extends AppKitchen.ModelBase {\r\n constructor(startDate?: Date, endDate?: Date) {\r\n super({\r\n startFilter: \"\",\r\n endFilter: \"\",\r\n startDate: startDate,\r\n endDate: endDate\r\n });\r\n }\r\n\r\n setStartDate(startDate: Date) {\r\n this.set({ startDate: startDate });\r\n }\r\n\r\n setEndDate(endDate: Date) {\r\n this.set({ endDate: endDate });\r\n }\r\n\r\n setRange(startDate: Date, endDate: Date) {\r\n this.set({startDate: startDate, endDate: endDate });\r\n }\r\n }\r\n\r\n export class DateRangePickerModel extends DateRangeModel {\r\n routingParameters: DateRangePickerRoutingParameters;\r\n\r\n constructor(startDate?: Date, endDate?: Date) {\r\n super(startDate, endDate);\r\n }\r\n\r\n\r\n route(parameters: DateRangePickerRoutingParameters, defaults: DateRangeAttributes) {\r\n this.routingParameters = parameters;\r\n\r\n var urlQuery = AppKitchen.BrowserHelper.UrlQuery.getParameters();\r\n Object.keys(parameters).forEach(property => {\r\n if (urlQuery[parameters[property]]) {\r\n this.setPropertyFromRoute(property, urlQuery[parameters[property]]);\r\n } else {\r\n if (defaults[property]) {\r\n this.set(property, defaults[property]);\r\n }\r\n }\r\n });\r\n\r\n this.updateRoute();\r\n this.bind(\"change\", () => this.updateRoute());\r\n }\r\n\r\n updateRoute() {\r\n if (this.routingParameters) {\r\n Object.keys(this.routingParameters).forEach(property => {\r\n AppKitchen.BrowserHelper.UrlQuery.setParameter(this.routingParameters[property], this.getPropertyRoute(property), { refresh: false, push: false });\r\n });\r\n }\r\n }\r\n\r\n private setPropertyFromRoute(property: string, query: string) {\r\n switch (property) {\r\n case \"startDate\":\r\n case \"endDate\":\r\n this.setDatePropertyFromRoute(property, query);\r\n break;\r\n case \"startFilter\":\r\n case \"endFilter\":\r\n let setFilterValue = {};\r\n setFilterValue[property] = query;\r\n this.set(setFilterValue);\r\n break;\r\n default:\r\n throw \"unknown property\";\r\n }\r\n }\r\n\r\n private getPropertyRoute(property: string): string {\r\n switch (property) {\r\n case \"startDate\":\r\n case \"endDate\":\r\n return this.getDatePropertyRoute(property);\r\n case \"startFilter\":\r\n case \"endFilter\":\r\n return this.get()[property];\r\n default:\r\n throw \"unknown property\";\r\n }\r\n }\r\n\r\n private setDatePropertyFromRoute(property: string, dateFromQuery: string) {\r\n if (dateFromQuery.length === 8) {\r\n var date = kendo.parseDate(dateFromQuery, \"yyyyMMdd\");\r\n if (date.valueOf()) {\r\n var setValue = {};\r\n setValue[property] = date;\r\n this.set(setValue);\r\n }\r\n }\r\n }\r\n\r\n private getDatePropertyRoute(property: string) {\r\n return kendo.toString(this.get()[property], \"yyyyMMdd\");\r\n }\r\n\r\n routeStart(parameter: string, defaultStart: Date, filterParameter?: string, defaultFilter?: string) {\r\n this.route({ startDate: parameter }, { startDate: defaultStart });\r\n }\r\n\r\n routeEnd(parameter: string, defaultEnd: Date, filterParameter?: string, defaultFilter?: string) {\r\n this.route({ startDate: parameter }, { startDate: defaultEnd });\r\n }\r\n\r\n routeRange(parameterPrefix: string, defaultStart: Date, defaultEnd: Date) {\r\n this.route({ startDate: parameterPrefix + \"from\", endDate: parameterPrefix + \"to\"}, { startDate: defaultStart, endDate: defaultEnd });\r\n }\r\n\r\n onStartChange(changed: (startDate: Date) => void) {\r\n if (this.get().startDate) {\r\n changed(this.get().startDate);\r\n }\r\n this.on(\"change:startDate\", () => {\r\n if (this.get().startDate) {\r\n changed(this.get().startDate);\r\n }\r\n });\r\n }\r\n\r\n onEndChange(changed: (endDate: Date) => void) {\r\n if (this.get().endDate) {\r\n changed(this.get().endDate);\r\n }\r\n this.on(\"change:endDate\", () => {\r\n if (this.get().endDate) {\r\n changed(this.get().endDate);\r\n }\r\n });\r\n }\r\n\r\n onRangeChange(changed: (startDate: Date, endDate: Date) => void) {\r\n if (this.get().startDate && this.get().endDate) {\r\n changed(this.get().startDate, this.get().endDate);\r\n }\r\n this.on(\"change:startDate change:endDate\", () => {\r\n if (this.get().startDate && this.get().endDate) {\r\n changed(this.get().startDate, this.get().endDate);\r\n }\r\n });\r\n }\r\n }\r\n\r\n export enum DateRangePickerFormat {\r\n Month,\r\n Date,\r\n Year\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface DateRangePickerOptions extends AppKitchen.ViewBaseOptions {\r\n format?: string;\r\n pickerFormat?: DateRangePickerFormat;\r\n hideEndPicker?: boolean;\r\n dayPickers?: { label: string, days: number }[];\r\n minDate?: Date;\r\n maxDate?: Date;\r\n maxRange?: number;\r\n labels?: { from?: string | { label: string, filter: string }[], to?: string | { label: string, filter: string }[]};\r\n }\r\n\r\n export class DateRangePickerView extends AppKitchen.ViewBase {\r\n options: DateRangePickerOptions;\r\n formView: Forms.TemplatedFormView;\r\n\r\n constructor(model: DateRangePickerModel, targetContainer: HTMLElement, options?: DateRangePickerOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n format: kendo.culture().calendar.patterns.d,\r\n pickerFormat: DateRangePickerFormat.Date,\r\n hideEndPicker: false,\r\n dayPickers: undefined,\r\n minDate: undefined,\r\n maxDate: undefined,\r\n maxRange: undefined,\r\n labels: { from: AppKitchen.Strings.TimeSpanPanel_From, to: AppKitchen.Strings.TimeSpanPanel_To }\r\n }, true));\r\n\r\n this.setTemplate(AppKitchen.Templates.DateRangePicker);\r\n\r\n this.delegateEvents({\r\n \"keypress .a-startContainer\": \"updateStartOnEnter\",\r\n \"keypress .a-endContainer\": \"updateEndOnEnter\",\r\n \"blur .a-startContainer\": \"updateStart\",\r\n \"blur .a-endContainer\": \"updateEnd\",\r\n \"click .a-tspanel-daychooser\": \"setNumberOfDays\"\r\n });\r\n\r\n this.createForm();\r\n }\r\n\r\n private setNumberOfDays(e) {\r\n var numberOfDays = parseInt($(e.currentTarget).attr(\"data-numberofdays\"));\r\n if (numberOfDays !== undefined && numberOfDays !== NaN) {\r\n this.model.set({ startDate: new Date().onlyDate().addDays(numberOfDays) });\r\n this.model.set({ endDate: new Date().onlyDate() });\r\n }\r\n }\r\n\r\n disable() {\r\n if (this.formView) {\r\n this.formView.model.disableField(\"startDate\");\r\n this.formView.model.disableField(\"endDate\");\r\n }\r\n }\r\n\r\n enable() {\r\n if (this.formView) {\r\n this.formView.model.enableField(\"startDate\");\r\n this.formView.model.enableField(\"endDate\");\r\n }\r\n }\r\n\r\n createForm() {\r\n var pickerFormat = this.getFieldType(this.options.pickerFormat);\r\n var pickerFields = [\r\n new Forms.FieldModel(\"startDate\", pickerFormat , \"\", {\r\n format: this.options.format,\r\n min: this.options.minDate ? this.options.minDate.valueOf() : undefined,\r\n max: this.options.hideEndPicker && this.options.maxDate ? this.options.maxDate.valueOf() : undefined\r\n }),\r\n new Forms.FieldModel(\"endDate\", pickerFormat, \"\", {\r\n format: this.options.format,\r\n min: this.options.minDate ? this.options.minDate.valueOf() : undefined,\r\n max: this.options.maxDate ? this.options.maxDate.valueOf() : undefined\r\n })\r\n ];\r\n\r\n if (Array.isArray(this.options.labels.from)) {\r\n var fromLabels = <{ filter: string, label: string }[]>this.options.labels.from;\r\n pickerFields.push(new Forms.FieldModel(\"startDateLabel\", Forms.FieldType.Text, \"\", {\r\n pool: { values: fromLabels, restrict: true, textField: \"label\", valueField: \"filter\" }\r\n }));\r\n }\r\n\r\n if (Array.isArray(this.options.labels.to)) {\r\n var toLabels = <{ filter: string, label: string }[]>this.options.labels.from;\r\n pickerFields.push(new Forms.FieldModel(\"endDateLabel\", Forms.FieldType.Text, \"\", {\r\n pool: { values: toLabels, restrict: true, textField: \"label\", valueField: \"filter\" }\r\n }));\r\n }\r\n\r\n var formModel = new Forms.FormModel(pickerFields);\r\n\r\n // min endDate / max range\r\n this.model.onStartChange(startDate => {\r\n if (startDate && !this.options.hideEndPicker) {\r\n var endDateField = formModel.getField(\"endDate\");\r\n\r\n var endDate = endDateField.get().value;\r\n\r\n if (endDateField.get().value) {\r\n if (endDateField.get().value < startDate) {\r\n endDate = startDate;\r\n }\r\n if (this.options.maxRange && endDateField.get().value > startDate.addDays(this.options.maxRange)) {\r\n endDate = startDate.addDays(this.options.maxRange);\r\n }\r\n }\r\n\r\n endDateField.set({\r\n min: startDate.valueOf(),\r\n max: this.options.maxRange ? startDate.addDays(this.options.maxRange).valueOf() : endDateField.get().max,\r\n value: endDate\r\n });\r\n }\r\n });\r\n\r\n formModel.setFieldsData({\r\n startDate: this.model.get().startDate,\r\n endDate: this.model.get().endDate\r\n });\r\n\r\n var formTemplate = AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.DateRangePicker, {\r\n labelFrom: this.options.labels.from,\r\n labelTo: this.options.labels.to,\r\n singlePicker: this.options.hideEndPicker,\r\n dayPickers: this.options.dayPickers\r\n });\r\n\r\n // ReSharper disable once WrongExpressionStatement\r\n this.formView = new Forms.TemplatedFormView(formModel, this.el, formTemplate, { editable: true });\r\n \r\n if (this.options.dayPickers) {\r\n this.highlightSelectedDayPicker();\r\n this.model.bind(\"change:startDate change:endDate\", () => this.highlightSelectedDayPicker());\r\n }\r\n\r\n // two way bindings\r\n formModel.fieldDict[\"startDate\"].bind(\"change:value\", field => this.model.set({ startDate: field.get().value }));\r\n formModel.fieldDict[\"endDate\"].bind(\"change:value\", field => this.model.set({ endDate: field.get().value }));\r\n this.model.bind(\"change:startDate\", model => formModel.setValue(\"startDate\", model.get().startDate));\r\n this.model.bind(\"change:endDate\", model => formModel.setValue(\"endDate\", model.get().endDate));\r\n\r\n if (Array.isArray(this.options.labels.from)) {\r\n formModel.fieldDict[\"startDateLabel\"].bind(\"change:value\", field => this.model.set({ startFilter: field.get().value }));\r\n this.model.bind(\"change:startFilter\", model => formModel.setValue(\"startDateLabel\", model.get().startFilter));\r\n }\r\n if (Array.isArray(this.options.labels.to)) {\r\n formModel.fieldDict[\"endDateLabel\"].bind(\"change:value\", field => this.model.set({ endFilter: field.get().value }));\r\n this.model.bind(\"change:endFilter\", model => formModel.setValue(\"endDateLabel\", model.get().endFilter));\r\n }\r\n }\r\n\r\n private highlightSelectedDayPicker() {\r\n this.$el.find(\".a-tspanel-daychooser\").removeClass(\"selected\");\r\n if (this.model.get().startDate) {\r\n if (this.options.hideEndPicker || (this.model.get().endDate && this.model.get().endDate.valueOf() === new Date().onlyDate().valueOf())) {\r\n var today = new Date().onlyDate();\r\n var dateFrom = this.model.get().startDate;\r\n var numberOfDays = Math.round((dateFrom.valueOf() - today.valueOf() - (dateFrom.getTimezoneOffset() - today.getTimezoneOffset()) * 60000) / 86400000);\r\n this.$el.find(\".a-tspanel-daychooser[data-numberofdays=\" + numberOfDays + \"]\").addClass(\"selected\");\r\n }\r\n }\r\n }\r\n\r\n private getFieldType(dateRangePickerFormat: DateRangePickerFormat)\r\n {\r\n switch (dateRangePickerFormat) {\r\n case DateRangePickerFormat.Date:\r\n return Forms.FieldType.Date;\r\n case DateRangePickerFormat.Month:\r\n return Forms.FieldType.Month;\r\n case DateRangePickerFormat.Year:\r\n return Forms.FieldType.Year;\r\n default:\r\n AppKitchen.logWarning(\"DateRangePickerFormat \" + dateRangePickerFormat + \" unknown!\");\r\n return Forms.FieldType.Date;\r\n }\r\n }\r\n }\r\n }\r\n}","///\r\n\r\nmodule AppKitchen {\r\n export module Controls {\r\n export module Forms {\r\n\r\n export module EventFormHelper {\r\n // ReSharper disable once InconsistentNaming\r\n export var EventItemTypeConverter = {\r\n String: Forms.FieldType.Text,\r\n Memo: Forms.FieldType.Text,\r\n TextPool: Forms.FieldType.Text,\r\n Date: Forms.FieldType.Date,\r\n Boolean: Forms.FieldType.Checkbox,\r\n Descriptor: Forms.FieldType.Text,\r\n Binary: Forms.FieldType.Text,\r\n Number: Forms.FieldType.Number,\r\n Calculated: Forms.FieldType.Number,\r\n MasterDataCopy: Forms.FieldType.Text,\r\n User: Forms.FieldType.Text,\r\n Group: Forms.FieldType.Text,\r\n MultiDescriptor: Forms.FieldType.Text,\r\n EventKeyField: Forms.FieldType.Text,\r\n PeriodNr: Forms.FieldType.DateTime,\r\n\r\n // manual Types in config (not from mesap)\r\n DateTime: Forms.FieldType.DateTime,\r\n Time: Forms.FieldType.Time\r\n }\r\n\r\n export function getFieldLabel(inventoryId: string, itemId: string, metadata?: string, eventItem?: any): string {\r\n if (eventItem) {\r\n return eventItem.Name;\r\n }\r\n var label = inventoryId ? inventoryId + \"_\" + itemId : itemId;\r\n if (metadata) {\r\n label += \"_\" + metadata;\r\n }\r\n return label;\r\n }\r\n\r\n export function generateFormFields(config: any, eventItems: any, getFieldLabel: (inventoryId: string, itemId: string, metadata?: string, eventItem?: any) => string) {\r\n var fields = [];\r\n\r\n var eventItemSpecs = config.EventItemSpecs;\r\n\r\n // create form field objects\r\n for (let i = 0; i < eventItemSpecs.length; i++) {\r\n var fieldConfig = eventItemSpecs[i];\r\n\r\n var fieldKey = fieldConfig.InventoryId ? (fieldConfig.InventoryId + \"_\" + fieldConfig.ItemId) : fieldConfig.ItemId;\r\n if (fieldConfig.Metadata) {\r\n fieldKey += \"_\" + fieldConfig.Metadata;\r\n //enforce readonly on metadata field\r\n if (!fieldConfig.FieldOptions) {\r\n fieldConfig.FieldOptions = {};\r\n }\r\n fieldConfig.FieldOptions.readOnly = true;\r\n }\r\n var eventItem = eventItems[fieldKey];\r\n var fieldLabel = getFieldLabel(fieldConfig.InventoryId, fieldConfig.ItemId, fieldConfig.Metadata, eventItem);\r\n\r\n var eventItemType = fieldConfig.Type\r\n ? fieldConfig.Type\r\n : (fieldConfig.InventoryId && eventItems[fieldKey] ? eventItems[fieldKey].Type : undefined);\r\n\r\n if (!eventItemType)\r\n throw \"undefined field type\";\r\n\r\n var fieldType: Forms.FieldType = EventFormHelper.EventItemTypeConverter[eventItemType];\r\n if (eventItem.TypeSpecification &&\r\n eventItem.TypeSpecification.TimeResolution &&\r\n eventItem.TypeSpecification.TimeResolution >= Mesap.Framework.Common.TimeResolution.Day) {\r\n fieldType = EventFormHelper.EventItemTypeConverter.Date;\r\n }\r\n\r\n // create form field\r\n var field: Forms.FieldModel;\r\n\r\n if (fieldConfig.Type) {\r\n //custom field type from config\r\n field = createGenericField(fieldKey, fieldLabel, fieldType, eventItems[fieldKey], fieldConfig.FieldOptions);\r\n } else if (fieldConfig.InventoryId && eventItems[fieldKey]) {\r\n switch (fieldType) {\r\n case Forms.FieldType.Text:\r\n field = createEventTextField(fieldKey, fieldLabel, eventItems[fieldKey], fieldConfig.FieldOptions);\r\n break;\r\n case Forms.FieldType.Date:\r\n field = createEventDateField(fieldKey, fieldLabel, eventItems[fieldKey], fieldConfig.FieldOptions);\r\n break;\r\n default:\r\n field = createGenericField(fieldKey, fieldLabel, fieldType, eventItems[fieldKey], fieldConfig.FieldOptions);\r\n }\r\n } else {\r\n throw \"undefined field type\";\r\n }\r\n\r\n // set order from sortNr (if not set)\r\n if (fieldConfig.SortNr && !field.get().order) {\r\n field.set({ order: parseInt(fieldConfig.SortNr) });\r\n }\r\n\r\n // mark binary fields\r\n if (eventItemType === \"Binary\") {\r\n field.set({ binary: true });\r\n }\r\n\r\n fields.push(field);\r\n }\r\n\r\n // sort fields\r\n fields = fields.sort((field1: Forms.FieldModel, field2: Forms.FieldModel) => compareSortNr(field1.get().order, field2.get().order));\r\n\r\n return fields;\r\n }\r\n\r\n export function createEventTextField(key, label, eventItem, customOptions): Forms.FieldModel {\r\n var options = getCommonFieldOptions(eventItem, customOptions);\r\n\r\n if ([\"TextPool\", \"Descriptor\", \"MultiDescriptor\", \"User\", \"Group\"].indexOf(eventItem.Type) > -1) {\r\n // default pool from mesap\r\n options.pool = {\r\n multi: eventItem.Type === \"MultiDescriptor\" || eventItem.TypeSpecification.MultiSelect,\r\n restrict: true,\r\n values: eventItem.TextPool,\r\n valueField: \"Id\",\r\n textField: eventItem.TypeSpecification.UseId ? \"Id\" : \"Text\"\r\n };\r\n if (!options.pool.multi) options.pool.values.unshift({ \"Id\": \"\", \"Text\": \"\" });\r\n\r\n // merge with custom pool from config\r\n if (customOptions && customOptions.pool) {\r\n options.pool = AppKitchen.OptionsHelper.merge(customOptions.pool, options.pool);\r\n }\r\n }\r\n\r\n return new Forms.FieldModel(key, Forms.FieldType.Text, label, options);\r\n }\r\n\r\n export function createEventDateField(key, label, eventItem, customOptions): Forms.FieldModel {\r\n if (!eventItem.TypeSpecification || !eventItem.TypeSpecification.DateFormat)\r\n return createGenericField(key, label, FieldType.Date, eventItem, customOptions);\r\n\r\n var options = getCommonFieldOptions(eventItem, customOptions);\r\n\r\n switch (eventItem.TypeSpecification.DateFormat) {\r\n case 1: // Date\r\n return new Forms.FieldModel(key, Forms.FieldType.Date, label, options);\r\n case 2: // Time\r\n return new Forms.FieldModel(key, Forms.FieldType.Time, label, options);\r\n case 3: // DateTime\r\n return new Forms.FieldModel(key, Forms.FieldType.DateTime, label, options);\r\n case 4: // UserDefined\r\n options.format = eventItem.TypeSpecification.UserFormat;\r\n return new Forms.FieldModel(key, Forms.FieldType.Date, label, options);\r\n default:\r\n throw \"invalid date item\";\r\n }\r\n }\r\n\r\n export function createGenericField(key, label, type, eventItem, customOptions): Forms.FieldModel {\r\n return new Forms.FieldModel(key, type, label, getCommonFieldOptions(eventItem, customOptions));\r\n }\r\n\r\n export function getCommonFieldOptions(eventItem, customOptions): Forms.FieldOptions {\r\n if (eventItem) {\r\n var options = AppKitchen.OptionsHelper.merge(customOptions, {\r\n description: eventItem.Description,\r\n default: eventItem.DefaultValue,\r\n mandatory: eventItem.IsRequired\r\n });\r\n return options;\r\n } else {\r\n return customOptions || {};\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface EventFormOptions extends FormOptions {\r\n dataIndex?: number;\r\n observeLoader?: boolean;\r\n getFieldLabel?: (inventoryId: string, itemId: string, metadata?: string, eventItem?: any) => string;\r\n }\r\n\r\n export class EventFormModel extends FormModel {\r\n dataLoader: AppKitchen.Data.EventDataLoader;\r\n options: EventFormOptions;\r\n\r\n constructor(dataLoader: AppKitchen.Data.EventDataLoader, options?: EventFormOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n dataIndex: 0,\r\n observeLoader: true,\r\n getFieldLabel: EventFormHelper.getFieldLabel\r\n });\r\n\r\n var formfields = EventFormHelper.generateFormFields(dataLoader.config, dataLoader.getItemsDict(), options.getFieldLabel);\r\n\r\n super(formfields, options);\r\n\r\n this.dataLoader = dataLoader;\r\n\r\n if (this.options.observeLoader) {\r\n // bind loading property\r\n this.dataLoader.bind(\"change:loading\", () => this.set({ loading: this.dataLoader.get().loading }));\r\n this.set({ loading: dataLoader.get().loading });\r\n\r\n // bind data property\r\n this.dataLoader.bind(\"change:data\", loader => {\r\n this.setFieldsData(this.dataLoader.get().data[this.options.dataIndex]);\r\n this.setBinaryUrls(this.dataLoader.get().data[this.options.dataIndex]);\r\n this.triggerDataLoaded(loader.getPrevious());\r\n });\r\n if (this.dataLoader.get().data && this.dataLoader.get().data.length > 0) {\r\n this.setFieldsData(this.dataLoader.get().data[this.options.dataIndex]);\r\n this.setBinaryUrls(this.dataLoader.get().data[this.options.dataIndex]);\r\n this.triggerDataLoaded();\r\n }\r\n }\r\n }\r\n\r\n private setBinaryUrls(data: any) {\r\n if (!data)\r\n return;\r\n\r\n this.get().fields.each(field => {\r\n if (field.get(\"binary\") && data.hasOwnProperty(field.get().key)) {\r\n var inventoryId = field.get().key.substr(0, field.get().key.indexOf(\"_\"));\r\n var itemId = field.get().key.substr(field.get().key.indexOf(\"_\") + 1);\r\n var eventId = data[inventoryId + \"_Id\"];\r\n\r\n if (inventoryId && itemId && eventId) {\r\n field.set({ url: AppKitchen.Data.UrlHelper.getEventBinaryUrl(inventoryId, itemId, eventId) });\r\n } else {\r\n field.set({ url: undefined });\r\n }\r\n }\r\n });\r\n }\r\n\r\n getEventWriteData(): AppKitchen.Api.Models.DataObject[] {\r\n if (AppKitchen.GlobalSettings.devMode) {\r\n AppKitchen.logWarning(\"EventForm.getEventWriteData() is deprecated! User EventDataLoader.getSaveRequestData() instead.\");\r\n }\r\n return this.dataLoader.getSaveRequestData(this.getFieldsData()).EventValues;\r\n }\r\n\r\n submit(submitOptions: FormSubmitOptions) {\r\n var fieldsData = this.getFieldsData();\r\n\r\n if (submitOptions.parse) {\r\n submitOptions.parse(fieldsData);\r\n }\r\n\r\n this.dataLoader.saveData([fieldsData],\r\n {\r\n api: submitOptions.api,\r\n success: submitOptions.success,\r\n error: (request) => submitOptions.error(request.statusText)\r\n });\r\n }\r\n\r\n onDataLoaded(callback: (newData: any, oldData: any) => void) {\r\n this.bind(\"dataLoaded\", (loader: AppKitchen.Data.EventDataLoader) => {\r\n callback(loader.get().data ? loader.get().data[this.options.dataIndex] : undefined, loader.getPrevious().data? loader.getPrevious().data[this.options.dataIndex] : undefined);\r\n });\r\n\r\n if (this.dataLoader.get().data && this.dataLoader.get().data.length > 0) {\r\n callback(this.dataLoader.get().data, this.dataLoader.get().data);\r\n }\r\n }\r\n\r\n triggerDataLoaded(oldData?: any) {\r\n this.trigger(\"dataLoaded\", this.dataLoader, oldData || this.dataLoader.get(\"data\"));\r\n }\r\n\r\n restoreData() {\r\n this.dataLoader.trigger(\"change:data\", this);\r\n }\r\n }\r\n\r\n }\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Grids {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export enum ColumnType {\r\n Text,\r\n Number,\r\n Date,\r\n Time,\r\n DateTime,\r\n Boolean\r\n }\r\n\r\n export module GridHelper {\r\n export var kendoFieldType = {\r\n 0: \"string\", // ColumnType.Text,\r\n 1: \"number\", // ColumnType.Number,\r\n 2: \"date\", // ColumnType.Date,\r\n 3: \"date\", // ColumnType.Time,\r\n 4: \"date\", // ColumnType.DateTime\r\n 5: \"boolean\" // ColumnType.Boolean\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export var columnFilterUI = {\r\n 0: undefined, // ColumnType.Text,\r\n 1: undefined, // ColumnType.Number,\r\n 2: \"datepicker\", // ColumnType.Date,\r\n 3: \"timepicker\", // ColumnType.Time,\r\n 4: \"datetimepicker\", // ColumnType.DateTime\r\n 5: undefined // ColumnType.Boolean\r\n }\r\n\r\n export function gridColumnTemplate(type: ColumnType, fieldName: string, columnOptions: GridColumnOptions): any {\r\n switch (type) {\r\n case ColumnType.Text:\r\n return columnOptions.multiline? rowData => (rowData[fieldName] || \"\").nl2br() : undefined;\r\n case ColumnType.Number:\r\n case ColumnType.Date:\r\n case ColumnType.Time:\r\n case ColumnType.DateTime:\r\n return undefined;\r\n case ColumnType.Boolean:\r\n return rowData => rowData[fieldName] === true ? AppKitchen.Strings.Yes : (rowData[fieldName] === false ? AppKitchen.Strings.No : \"\");\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface GridAttributes {\r\n data?: {[key: string]: any}[];\r\n selectedData?: { [key: string]: any };\r\n columns?: kendo.ui.GridColumn[];\r\n schema?: kendo.data.DataSourceSchemaModelField[];\r\n loading?: boolean;\r\n }\r\n\r\n export class GridModel extends AppKitchen.ModelBase {\r\n options: any;\r\n\r\n constructor(columns: kendo.ui.GridColumn[], schema: kendo.data.DataSourceSchemaModelField[], options?: any) {\r\n super({\r\n data: [],\r\n selectedData: undefined,\r\n columns: columns,\r\n schema: schema,\r\n loading: false\r\n });\r\n\r\n this.options = options;\r\n }\r\n\r\n setGridData(data: { [field: string]: any }[], action?: (dataItem: any) => void) {\r\n action = action || (dataItem => dataItem);\r\n var clonedData = [];\r\n data.forEach(dataItem => clonedData.push(action(jQuery.extend(true, {}, dataItem))));\r\n this.set({ data: clonedData });\r\n }\r\n\r\n selectedRowData(rowData: any) {\r\n this.set({ selectedData: rowData });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface GridOptions extends AppKitchen.ViewBaseOptions {\r\n fillHeight?: boolean;\r\n groupable?: boolean;\r\n editable?: boolean;\r\n filterable?: boolean;\r\n extendedFilter?: boolean;\r\n sortable?: boolean;\r\n sortMultiple?: boolean;\r\n selectable?: string,\r\n toolbar?: string[];\r\n reorderable?: boolean;\r\n headerTooltip?: boolean;\r\n noRecordsMessage?: string;\r\n initialSort?: { field: string, dir: string } | { field: string, dir: \"desc\" | \"asc\" }[];\r\n dblclick?: (rowData: any) => void;\r\n lazyShow?: { initial: number, more: number };\r\n templates?: { field: string, template: any }[];\r\n uidField?: string;\r\n scrollable?: boolean | Object;\r\n beforeCreateGrid?: (options: kendo.ui.GridOptions) => kendo.ui.GridOptions;\r\n }\r\n\r\n export class GridView extends AppKitchen.ViewBase {\r\n options: GridOptions;\r\n\r\n gridSelector: string;\r\n grid: kendo.ui.Grid;\r\n\r\n showingMore: boolean;\r\n updatingErrorSummary: boolean;\r\n\r\n constructor(model: GridModel, targetContainer: HTMLElement, options?: GridOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n fillHeight: false,\r\n groupable: false,\r\n editable: false,\r\n filterable: false,\r\n extendedFilter: false,\r\n sortable: false,\r\n sortMultiple: false,\r\n selectable: \"row\",\r\n toolbar: undefined,\r\n reorderable: false,\r\n headerTooltip: false,\r\n noRecordsMessage: undefined,\r\n initialSort: undefined,\r\n dblclick: undefined,\r\n lazyShow: undefined,\r\n uidField: undefined \r\n }));\r\n\r\n if (this.options.fillHeight) {\r\n this.setTemplate('
      ');\r\n } else {\r\n this.setTemplate('
      ');\r\n }\r\n\r\n this.gridSelector = '.a-grid';\r\n\r\n this.model.bind(\"change:data\", this.updateGridData, this);\r\n this.renderGrid();\r\n }\r\n\r\n private updateGridData() {\r\n this.setGridData(this.model.get().data);\r\n }\r\n\r\n private suspendDataBinding(action: () => void) {\r\n var preventDefault = e => e.preventDefault();\r\n this.grid.bind(\"dataBinding\", preventDefault);\r\n action();\r\n this.grid.unbind(\"dataBinding\", preventDefault);\r\n }\r\n\r\n private setGridData(data: any[]) {\r\n if (this.grid) {\r\n // remember current selection\r\n var uids: string[] = [];\r\n var scrollTop = this.grid.content[0].scrollTop;\r\n if (this.options.uidField) {\r\n var selection = this.grid.select();\r\n for (let j = 0; j < selection.length; j++) {\r\n uids.push(this.grid.dataItem(selection[j]).get(this.options.uidField));\r\n }\r\n //maybe hash code would be better but a) throws exception 'o.Plain() is not a function' and b) member uid would have to be omitted\r\n //var hash: number = Object.GetHashCode(this.grid.dataItem(selection[0])); //-> o.Plain() is not a function\r\n }\r\n\r\n if (this.options.filterable) {\r\n // must call setDataSource to update kendo column filters\r\n\r\n // set data without updating the grid\r\n this.suspendDataBinding(() => {\r\n this.grid.dataSource.data(data);\r\n });\r\n // call setDataSource on same data source\r\n this.grid.setDataSource(this.grid.dataSource); \r\n\r\n } else {\r\n // faster update if no setDataSource() call needed\r\n this.grid.dataSource.data(data);\r\n }\r\n\r\n // reset page size\r\n if (this.options.lazyShow) {\r\n this.grid.dataSource.pageSize(this.options.lazyShow.initial);\r\n this.updateLazyShow();\r\n }\r\n\r\n // restore selection\r\n if (uids.length > 0) {\r\n var rows = [];\r\n var datas = this.grid.dataSource.data();\r\n for (let u = 0; u < uids.length; u++) {\r\n for (let d = 0; d < datas.length; d++) {\r\n var dataRow = datas[d];\r\n if (dataRow.get(this.options.uidField) === uids[u]) {\r\n rows.push(\"tr[data-uid='\" + dataRow.uid + \"']\");\r\n }\r\n }\r\n }\r\n for (let i = 0; i < rows.length; i++) {\r\n this.grid.select(rows[i]);\r\n }\r\n this.grid.content.scrollTop(scrollTop);\r\n }\r\n }\r\n }\r\n\r\n updateModelData() {\r\n this.model.unbind(\"change:data\", this.updateGridData);\r\n this.model.set({ data: this.grid.dataSource.data().toJSON() });\r\n this.model.bind(\"change:data\", this.updateGridData, this);\r\n }\r\n\r\n renderGrid() {\r\n this.renderTemplate({});\r\n var $gridContainer = this.$el.find(this.gridSelector);\r\n var schema = this.model.get().schema;\r\n\r\n var gridFilter: kendo.ui.GridFilterable | boolean = false;\r\n if (this.options.filterable) {\r\n gridFilter = this.options.extendedFilter ? true : {\r\n extra: false, // simple filter\r\n operators: { // filter string operators\r\n string: {\r\n contains: (kendo.ui).FilterMenu.prototype.options.operators.string.contains,\r\n doesnotcontain: (kendo.ui).FilterMenu.prototype.options.operators.string.doesnotcontain,\r\n startswith: (kendo.ui).FilterMenu.prototype.options.operators.string.startswith,\r\n eq: (kendo.ui).FilterMenu.prototype.options.operators.string.eq\r\n }\r\n }\r\n };\r\n }\r\n\r\n var sortMode = this.options.sortMultiple ? \"multiple\" : \"single\";\r\n\r\n let options: kendo.ui.GridOptions = {\r\n //theme: \"metro\",\r\n dataSource: {\r\n data: this.model.get().data,\r\n pageSize: this.options.lazyShow ? this.options.lazyShow.initial : undefined,\r\n schema: {\r\n model: {\r\n fields: schema\r\n }\r\n },\r\n sort: this.options.initialSort\r\n },\r\n filterable: gridFilter,\r\n editable: this.options.editable,\r\n change: e => this.onSelectionChange(e),\r\n sortable: this.options.sortable ? { mode: sortMode, allowUnsort: false} : false,\r\n allowCopy: true,\r\n selectable: this.options.selectable,\r\n navigatable: true,\r\n resizable: true,\r\n groupable: this.options.groupable,\r\n reorderable: this.options.reorderable,\r\n toolbar: this.options.toolbar ? GridView.convertToKendoGridToolbarItems(this.options.toolbar) : undefined,\r\n columns: this.getColumns(),\r\n noRecords: true,\r\n messages: {\r\n noRecords: this.options.noRecordsMessage\r\n },\r\n dataBound: e => this.dataBound(e),\r\n save: e => this.onSave(e),\r\n scrollable: this.options.scrollable\r\n };\r\n\r\n if (this.options.beforeCreateGrid) {\r\n options = this.options.beforeCreateGrid(options);\r\n }\r\n\r\n this.grid = $gridContainer.kendoGrid(options).data(\"kendoGrid\");\r\n\r\n\r\n if (this.options.headerTooltip) {\r\n this.grid.wrapper.find(\"th\")\r\n .each((i, e) => {\r\n if ($(e).find(\".k-link\").length > 0) {\r\n $(e).attr(\"title\", $(e).find(\".k-link\").text());\r\n } else {\r\n $(e).attr(\"title\", $(e).text());\r\n }\r\n $(e).kendoTooltip({ position: \"top\" });\r\n\r\n $(e).bind(\"mouseleave\", () => {\r\n $(e).data(\"kendoTooltip\").hide();\r\n });\r\n });\r\n }\r\n\r\n if (this.options.lazyShow) {\r\n this.startLazyShow();\r\n }\r\n\r\n if (this.options.editable) {\r\n this.grid.dataSource.bind(\"change\", e => {\r\n if (e.action === \"remove\") {\r\n if (e.items.length > 1 || e.items[0][\"GridInputErrors\"]) {\r\n this.updateErrorSummaryDelayed();\r\n }\r\n }\r\n });\r\n }\r\n\r\n var grid = this.grid;\r\n\r\n // keyboard navigation\r\n this.grid.table.keydown((e) => {\r\n // arrow up/down\r\n if ([38, 40].indexOf(e.keyCode) >= 0) {\r\n setTimeout(() => grid.select($(\"td#aria_active_cell\").closest(\"tr\")), 10);\r\n }\r\n // page up/down\r\n if ([33, 34].indexOf(e.keyCode) >= 0) {\r\n // TODO: page up/down navigation in grid (not only scrolling)\r\n //e.preventDefault();\r\n }\r\n // home\r\n if (e.keyCode === 36) {\r\n // TODO: HOME navigation (row selected AND cell active)\r\n }\r\n // home\r\n if (e.keyCode === 35) {\r\n // TODO: END navigation (row selected AND cell active)\r\n }\r\n });\r\n\r\n if (this.options.dblclick) {\r\n this.grid.table.dblclick((e) => {\r\n if (!$(e.target).closest(\"tr\").hasClass(\"k-grouping-row\")) {\r\n var rowData = this.model.get().selectedData;\r\n if (rowData) this.options.dblclick(rowData);\r\n }\r\n });\r\n }\r\n\r\n this.updateFullHeight();\r\n }\r\n\r\n private static convertToKendoGridToolbarItems(items: string[]): kendo.ui.GridToolbarItem[] {\r\n let result: kendo.ui.GridToolbarItem[] = [];\r\n for (var item of items) {\r\n //TODO: Check string[] compatibility: https://docs.telerik.com/kendo-ui/api/javascript/ui/grid/configuration/toolbar\r\n result.push({ name: item });\r\n }\r\n return result;\r\n }\r\n\r\n private updateFullHeight() {\r\n if (this.options.fillHeight) {\r\n var $gridContainer = this.$el.find(this.gridSelector);\r\n $gridContainer.addClass(\"full-height-grid\");\r\n $gridContainer.find(\".k-grid-content\").addClass(\"fill-height\");\r\n $gridContainer.find(\".k-grid-content\").css(\"overflow-y\", \"scroll\");\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n }\r\n }\r\n\r\n private startLazyShow() {\r\n if (this.grid) {\r\n var scroller = this.grid.wrapper.find(\".k-grid-content\");\r\n scroller.on(\"scroll\", () => this.checkLazyShow(scroller));\r\n }\r\n }\r\n\r\n private updateLazyShow() {\r\n if (this.grid && this.options.lazyShow) {\r\n var container = this.grid.wrapper.find(\".k-grid-content\");\r\n container.find(\".a-lazyloader-wrapper\").remove();\r\n \r\n if (this.grid.dataSource.totalPages() > 1) {\r\n this.allowGroupCollapse(false);\r\n this.checkLazyShow(container);\r\n } else {\r\n this.allowGroupCollapse(true);\r\n }\r\n }\r\n }\r\n\r\n private checkLazyShow(container: JQuery, showAll?: boolean) {\r\n if (!this.showingMore &&\r\n this.grid &&\r\n this.grid.dataSource.totalPages() > 1 &&\r\n container.find(\"> table\").height() - container.height() - container.scrollTop() < 1) {\r\n\r\n container.append('
      ');\r\n\r\n AppKitchen.UIHelper.renderLoader(container.find(\".a-lazyloader\")[0], { type: \"concentric\" });\r\n\r\n this.showingMore = true;\r\n setTimeout(() => this.showMore(showAll), 300);\r\n }\r\n }\r\n\r\n private showMore(showAll?: boolean) {\r\n if (this.grid && this.options.lazyShow) {\r\n // backup grid selection and scroll position\r\n var selectedIndex = this.grid.select().index();\r\n var scrollPosition = this.grid.wrapper.find(\".k-grid-content\").scrollTop();\r\n\r\n // increase page size\r\n this.grid.dataSource.pageSize(showAll ? this.grid.dataSource.total() : this.grid.dataSource.pageSize() + this.options.lazyShow.more);\r\n\r\n // restore grid selection and scroll position\r\n this.selectRow(selectedIndex);\r\n this.grid.wrapper.find(\".k-grid-content\").scrollTop(scrollPosition);\r\n }\r\n\r\n this.showingMore = false;\r\n }\r\n\r\n private allowGroupCollapse(allow: boolean) {\r\n if (this.grid) {\r\n (this.grid.options).allowGroupCollapse = allow;\r\n if (allow) {\r\n this.grid.wrapper.removeClass(\"no-collapse\");\r\n } else {\r\n this.grid.wrapper.addClass(\"no-collapse\");\r\n }\r\n }\r\n }\r\n\r\n private onSave(e) {\r\n if (this.options.editable) {\r\n var rowIndex = $(\"tr\", this.grid.tbody).index($(e.container).closest(\"tr\"));\r\n setTimeout(() => {\r\n this.setErrorMessage(rowIndex, undefined);\r\n }, 100);\r\n }\r\n }\r\n\r\n private onSelectionChange(e) {\r\n var selectedRows = this.grid.select();\r\n if (selectedRows.length > 0) {\r\n this.model.selectedRowData(this.grid.dataItem(selectedRows[0]));\r\n } else {\r\n this.model.selectedRowData(null);\r\n }\r\n }\r\n\r\n private inputErrorTemplate(rowData) {\r\n if (rowData.GridInputErrors) {\r\n return AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.ErrorInfo16x16, { info: rowData.GridInputErrors });\r\n }\r\n return \"\";\r\n }\r\n\r\n protected dataBound(e) {\r\n this.updateLazyShow();\r\n if (this.grid && this.options.filterable && this.grid.dataSource.filter()) {\r\n var numberOfFilters = this.grid.dataSource.filter().filters.length;\r\n if (numberOfFilters > 0) {\r\n var noRecordsText = this.grid.wrapper.find(\".k-grid-norecords-template\").text();\r\n this.grid.wrapper.find(\".k-grid-norecords-template\").text(noRecordsText + \" (\" + numberOfFilters + \" \" + AppKitchen.Strings.Grid_ActiveFilters + \")\");\r\n }\r\n }\r\n }\r\n\r\n private getColumns() {\r\n var columns: kendo.ui.GridColumn[] = (this.model.get().columns || []).slice();\r\n\r\n if (this.options.editable) {\r\n columns.push({ command: \"destroy\", title: \" \", width: 31 });\r\n columns.unshift({ field: \"GridInputErrors\", title: \" \", width: 24, template: this.inputErrorTemplate, editor: () => { } });\r\n\r\n this.$el.kendoTooltip({\r\n position: \"right\",\r\n filter: \".a-error-info-16x16\",\r\n content: e => '
      ' + $(e.target).find(\".a-tooltip-content\").html() + '
      '\r\n });\r\n\r\n this.$el.kendoTooltip({\r\n position: \"bottom\",\r\n filter: \".a-error-info-24x24\",\r\n content: e => '
      ' + $(e.target).find(\".a-tooltip-content\").html() + '
      '\r\n });\r\n }\r\n\r\n columns.forEach(column => {\r\n if (!column.groupHeaderTemplate) {\r\n column.groupHeaderTemplate = this.getDefaultGroupHeaderTemplate(column);\r\n }\r\n });\r\n\r\n if (this.options.templates) {\r\n columns.forEach(column => {\r\n for (let t of this.options.templates) {\r\n if (column.field === t.field) {\r\n column.template = t.template;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return columns;\r\n }\r\n\r\n getDefaultGroupHeaderTemplate(column: kendo.ui.GridColumn): string {\r\n return column.title + \": \" + \"#= value #\" + '';\r\n }\r\n\r\n switchToPreview() {\r\n this.grid.setOptions({ editable: false });\r\n this.grid.wrapper.find(\".k-grid-footer\").remove();\r\n\r\n if (this.options.editable) {\r\n // hide toolbar\r\n this.$el.find(\".k-grid-toolbar\").hide();\r\n // hide errors and delete column (first and last)\r\n this.grid.hideColumn(0);\r\n this.grid.hideColumn(this.grid.columns.length - 1);\r\n }\r\n\r\n this.updateFullHeight();\r\n this.startLazyShow();\r\n }\r\n\r\n backToEdit() {\r\n if (this.options.editable) {\r\n this.grid.setOptions({ editable: true });\r\n this.grid.wrapper.find(\".k-grid-footer\").remove();\r\n\r\n // show toolbar\r\n this.$el.find(\".k-grid-toolbar\").show();\r\n // show errors and delete column (first and last)\r\n this.grid.showColumn(0);\r\n this.grid.showColumn(this.grid.columns.length - 1);\r\n\r\n this.updateFullHeight();\r\n this.startLazyShow();\r\n }\r\n }\r\n\r\n validateInput(): boolean {\r\n var valid = true;\r\n\r\n if (this.options.editable) {\r\n var columnTitles = {};\r\n var columns = this.model.get().columns;\r\n for (let i = 0; i < columns.length; i++) {\r\n columnTitles[columns[i].field] = columns[i].title;\r\n }\r\n\r\n // required fields validation\r\n var requiredFields = [];\r\n var fields = this.model.get().schema;\r\n for (let i = 0; i < fields.length; i++) {\r\n if (fields[i].validation && fields[i].validation.required) {\r\n requiredFields.push(fields[i].field);\r\n }\r\n }\r\n\r\n var gridData = this.grid.dataSource.data().toJSON();\r\n for (let i = 0; i < gridData.length; i++) {\r\n var missedFields = [];\r\n for (let j = 0; j < requiredFields.length; j++) {\r\n if (gridData[i][requiredFields[j]] === undefined ||\r\n gridData[i][requiredFields[j]] === null ||\r\n gridData[i][requiredFields[j]] === \"\") {\r\n missedFields.push(columnTitles[requiredFields[j]]);\r\n }\r\n }\r\n\r\n if (missedFields.length > 0) {\r\n this.setErrorMessage(i, \"Pflichtfelder nicht ausgefüllt: \" + missedFields.join(\", \"));\r\n valid = false;\r\n }\r\n }\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n setErrorMessage(index: number, message: string) {\r\n var dataItem = this.grid.dataItem(\"tr:eq(\" + (index + 1) + \")\");\r\n if (dataItem) {\r\n dataItem.set(\"GridInputErrors\", message);\r\n this.updateErrorSummaryDelayed();\r\n }\r\n }\r\n\r\n private updateErrorSummaryDelayed() {\r\n if (!this.updatingErrorSummary) {\r\n this.updatingErrorSummary = true;\r\n setTimeout(() => {\r\n this.updateErrorSummary();\r\n this.updatingErrorSummary = false;\r\n }, 100);\r\n }\r\n }\r\n\r\n clearGrid() {\r\n if (this.grid && this.options.editable) {\r\n this.setGridData([]);\r\n this.updateErrorSummary();\r\n }\r\n }\r\n\r\n private updateErrorSummary() {\r\n if (this.grid) {\r\n var errors = [];\r\n var gridData = this.grid.dataSource.data();\r\n for (let i = 0; i < gridData.length; i++) {\r\n if (gridData[i][\"GridInputErrors\"]) {\r\n errors.push({\r\n row: i + 1,\r\n message: gridData[i][\"GridInputErrors\"]\r\n });\r\n }\r\n }\r\n\r\n this.grid.wrapper.find(\".k-grid-toolbar .a-grid-error-summary\").remove();\r\n\r\n if (errors.length > 0) {\r\n this.grid.wrapper.find(\".k-grid-toolbar\").append('
      ');\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.grid.wrapper.find(\".k-grid-toolbar .a-grid-error-summary\")[0], AppKitchen.Templates.ErrorInfo24x24, {\r\n info: AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.GridErrorSummary, { errors: errors })\r\n });\r\n }\r\n }\r\n }\r\n\r\n selectRow(index: number, scroll?: boolean) {\r\n index = Math.max(0, Math.round(index));\r\n if (this.grid) {\r\n this.focusElement(this.grid.wrapper.find(\"tr:eq(\" + (index + 1) + \") td:visible\").first(), scroll, true);\r\n this.grid.select(\"tr:eq(\" + index + \")\");\r\n }\r\n }\r\n\r\n /// inserts row at current selection\r\n insertRow(data: any) {\r\n if (this.grid && this.options.editable) {\r\n var selectedIndex = this.grid.select().index() || 0;\r\n var scrollPosition = this.grid.wrapper.find(\".k-grid-content\").scrollTop();\r\n\r\n var insertedRow = this.grid.dataSource.insert(selectedIndex + 1, data);\r\n\r\n this.grid.select('tr[data-uid=\"' + insertedRow.uid + '\"]');\r\n\r\n this.grid.wrapper.find(\".k-grid-content\").scrollTop(scrollPosition);\r\n this.selectRow(this.grid.select().index(), true);\r\n }\r\n }\r\n\r\n focusGrid() {\r\n var scrollPosition = this.grid.wrapper.find(\".k-grid-content\").scrollTop();\r\n this.grid.wrapper.find(\"table\").focus();\r\n this.grid.wrapper.find(\".k-grid-content\").scrollTop(scrollPosition);\r\n }\r\n\r\n private focusElement(element: JQuery, scroll?: boolean, trigger?: boolean) {\r\n // this method is a modified version of the internal kendo method _setCurrent() in kendo.grid.js\r\n // the functionionalty is not guaranteed after kendo update\r\n if (this.grid) {\r\n var grid: any = this.grid;\r\n var current = grid._current;\r\n element = $(element);\r\n if (element.length) {\r\n if (!current || current[0] !== element[0]) {\r\n grid._updateCurrentAttr(current, element);\r\n if (scroll) {\r\n grid._scrollCurrent();\r\n }\r\n if (trigger) {\r\n grid.trigger(\"navigate\", { element: element });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n}\r\n","///\r\n\r\nmodule AppKitchen {\r\n export module Controls {\r\n\r\n export module Grids {\r\n\r\n module EventGridHelper {\r\n // ReSharper disable once InconsistentNaming\r\n export var EventItemTypeConverter = {\r\n String: ColumnType.Text,\r\n Memo: ColumnType.Text,\r\n TextPool: ColumnType.Text,\r\n Date: ColumnType.Date,\r\n Boolean: ColumnType.Boolean,\r\n Descriptor: ColumnType.Text,\r\n Binary: ColumnType.Text,\r\n Number: ColumnType.Number,\r\n Calculated: ColumnType.Number,\r\n MasterDataCopy: ColumnType.Text,\r\n User: ColumnType.Text,\r\n Group: ColumnType.Text,\r\n MultiDescriptor: ColumnType.Text,\r\n EventKeyField: ColumnType.Text,\r\n PeriodNr: ColumnType.DateTime,\r\n\r\n // additional types for virtual fields\r\n DateTime: ColumnType.DateTime,\r\n Time: ColumnType.Time\r\n }\r\n\r\n var h24 = new Date(kendo.parseDate(\"23:00\", \"HH:mm\").valueOf() + 3600000);\r\n\r\n export function getColumnHeader(inventoryId: string, itemId: string, eventItem?: any): string {\r\n if (eventItem) {\r\n return eventItem.Name;\r\n }\r\n return itemId;\r\n }\r\n\r\n export function isColumnEditable(inventoryId: string, itemId: string) {\r\n return true;\r\n }\r\n function validateKey(key: string): string {\r\n if (!AppKitchen.StringHelper.isValidIdentifier(key)) {\r\n throw \"'\" + key + \"' is an invalid string for grid column keys. Only valid JavaScript identifiers allowed.\";\r\n }\r\n return key;\r\n }\r\n\r\n function getDefaultFieldOptions(type: ColumnType, customOptions: Controls.Forms.FieldOptions): Controls.Forms.FieldOptions {\r\n var fieldType: Controls.Forms.FieldType;\r\n switch (type) {\r\n case ColumnType.Date:\r\n fieldType = Controls.Forms.FieldType.Date;\r\n break;\r\n case ColumnType.Boolean:\r\n fieldType = Controls.Forms.FieldType.Checkbox;\r\n break;\r\n case ColumnType.DateTime:\r\n fieldType = Controls.Forms.FieldType.DateTime;\r\n break;\r\n case ColumnType.Text:\r\n fieldType = Controls.Forms.FieldType.Text;\r\n break;\r\n case ColumnType.Number:\r\n fieldType = Controls.Forms.FieldType.Number;\r\n break;\r\n case ColumnType.Time:\r\n fieldType = Controls.Forms.FieldType.Time;\r\n break;\r\n\r\n default:\r\n fieldType = null;\r\n AppKitchen.logError(\"Unable to map ColumnType \"+type+\" to FieldType\");\r\n }\r\n\r\n return Forms.FieldModel.getDefaultOptions(fieldType, customOptions);\r\n }\r\n\r\n export function getColumnsConfig(gridConfig: any, eventItems: any, getColumnHeader: (inventoryId: string, itemId: string, eventItem?: any) => string) {\r\n var columns: kendo.ui.GridColumn[] = [];\r\n var schema: kendo.data.DataSourceSchemaModelField[] = [];\r\n\r\n // sort columns by SortNr\r\n var eventItemSpecs = gridConfig.EventItemSpecs.sort((col1, col2) => compareSortNr(col1.SortNr, col2.SortNr));\r\n\r\n // create column objects for grid\r\n for (let i = 0; i < eventItemSpecs.length; i++) {\r\n var columnConfig = eventItemSpecs[i];\r\n var columnKey = columnConfig.InventoryId\r\n ? (validateKey(columnConfig.InventoryId) + \"_\" + validateKey(columnConfig.ItemId))\r\n : validateKey(columnConfig.ItemId);\r\n if (columnConfig.Metadata) {\r\n columnKey += \"_\" + validateKey(columnConfig.Metadata);\r\n }\r\n var columnType = eventItems[columnKey]\r\n ? getColumnType(eventItems[columnKey])\r\n : EventGridHelper.EventItemTypeConverter[columnConfig.Type];\r\n if (columnType === undefined)\r\n throw \"unknown column type\";\r\n\r\n // column options\r\n var columnOptions = AppKitchen.OptionsHelper.merge(columnConfig.GridOptions, {\r\n multiFilter: [ColumnType.Text, ColumnType.Date, ColumnType.Boolean].indexOf(columnType) > -1 ? { search: false } : null,\r\n align: columnType === ColumnType.Number ? \"right\" : \"left\",\r\n multiline: false\r\n });\r\n\r\n // input fields options\r\n var fieldOptions = AppKitchen.OptionsHelper.merge(columnConfig.FieldOptions, getDefaultFieldOptions(columnType, columnConfig.FieldOptions));\r\n if (fieldOptions.hidden === true) {\r\n continue;\r\n }\r\n\r\n var column: kendo.ui.GridColumn = {\r\n field: columnKey,\r\n title: getColumnHeader(columnConfig.InventoryId, columnConfig.ItemId, eventItems[columnKey]),\r\n width: columnOptions.width || columnConfig.Width,\r\n hidden: columnConfig.Visibility === false,\r\n filterable: {\r\n multi: columnOptions.multiFilter ? true : false,\r\n search: columnOptions.multiFilter && columnOptions.multiFilter.search,\r\n ui: GridHelper.columnFilterUI[columnType]\r\n },\r\n format: fieldOptions.format ? \"{0:\" + fieldOptions.format + \"}\" : undefined,\r\n attributes: {\r\n style: ([\"right\", \"left\", \"center\"].indexOf(columnOptions.align) !== -1 ? \"text-align: \" + columnOptions.align + \";\" : \"\") +\r\n (columnOptions.multiline ? \"white-space: normal;\" : \"\")\r\n },\r\n template: GridHelper.gridColumnTemplate(columnType, columnKey, columnOptions)\r\n };\r\n\r\n // fill pool FieldOption\r\n if (eventItems[columnKey] && [\"TextPool\", \"Descriptor\", \"MultiDescriptor\", \"User\", \"Group\"].indexOf(eventItems[columnKey].Type) > -1) {\r\n var textPool = eventItems[columnKey].TextPool;\r\n if (textPool && textPool.length > 0) {\r\n fieldOptions.pool = {\r\n multi: eventItems[columnKey].Type === \"MultiDescriptor\" || eventItems[columnKey].TypeSpecification.MultiSelect,\r\n restrict: true,\r\n values: eventItems[columnKey].TextPool,\r\n valueField: \"Id\",\r\n textField: eventItems[columnKey].TypeSpecification.UseId ? \"Id\" : \"Text\"\r\n }\r\n\r\n if (eventItems[columnKey].Type !== \"MultiDescriptor\" && !eventItems[columnKey].TypeSpecification.MultiSelect) {\r\n column.values = [];\r\n for (let i = 0; i < textPool.length; i++) {\r\n column.values.push({\r\n text: eventItems[columnKey].TypeSpecification.UseId ? textPool[i].Id : textPool[i].Text,\r\n value: textPool[i].Id\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // DropDown/MultiSelect editor\r\n if (fieldOptions.pool) {\r\n if (fieldOptions.pool.multi) {\r\n column.editor = EventGridHelper.getMultiSelectEditor.bind(fieldOptions);\r\n } else {\r\n column.editor = EventGridHelper.getDropDownEditor.bind(fieldOptions);\r\n }\r\n }\r\n\r\n // autoComplete editor\r\n if (fieldOptions.suggest) {\r\n column.editor = EventGridHelper.getAutoCompleteEditor.bind(fieldOptions);\r\n }\r\n\r\n // Date editor\r\n if (columnType === ColumnType.Date) {\r\n column.editor = EventGridHelper.getDateEditor.bind(fieldOptions);\r\n fieldOptions.default = fieldOptions.default || new Date().onlyDate();\r\n }\r\n\r\n // DateTime editor\r\n if (columnType === ColumnType.DateTime) {\r\n column.editor = EventGridHelper.getDateTimeEditor.bind(fieldOptions);\r\n }\r\n\r\n // Time editor\r\n if (columnType === ColumnType.Time) {\r\n column.editor = EventGridHelper.getTimeEditor.bind(fieldOptions);\r\n if (fieldOptions.textMode) {\r\n column.template = EventGridHelper.timeColumnTextModeTemplate.bind(column, [fieldOptions.allow24]);\r\n column.sortable = { compare: EventGridHelper.timeColumnTextModeCompare.bind(column) }\r\n }\r\n }\r\n\r\n // numeric editor\r\n if (columnType === ColumnType.Number) {\r\n column.editor = EventGridHelper.getNumericEditor.bind(fieldOptions);\r\n }\r\n\r\n columns.push(column);\r\n\r\n schema.push({\r\n field: columnKey,\r\n type: fieldOptions.textMode ? \"string\" : GridHelper.kendoFieldType[columnType],\r\n validation: {\r\n required: fieldOptions.mandatory === true\r\n },\r\n editable: !(fieldOptions.readOnly === true),\r\n defaultValue: fieldOptions.default\r\n });\r\n }\r\n\r\n return { columns: columns, schema: schema };\r\n }\r\n\r\n // bind to fieldOptions\r\n export function getDropDownEditor(container, options) {\r\n var fieldOptions = this;\r\n var emptyEntry = {};\r\n emptyEntry[fieldOptions.pool.textField] = \"\";\r\n emptyEntry[fieldOptions.pool.valueField] = \"\";\r\n if (fieldOptions.pool.values && fieldOptions.pool.values.length > 0) {\r\n $('')\r\n .appendTo(container)\r\n .kendoDropDownList({\r\n autoBind: false,\r\n dataSource: [emptyEntry].concat(fieldOptions.pool.values),\r\n dataTextField: fieldOptions.pool.textField,\r\n dataValueField: fieldOptions.pool.valueField\r\n });\r\n }\r\n }\r\n\r\n // bind to fieldOptions\r\n export function getMultiSelectEditor(container, options) {\r\n var fieldOptions = this;\r\n if (fieldOptions.pool.values && fieldOptions.pool.values.length > 0) {\r\n $('')\r\n .appendTo(container)\r\n .kendoMultiSelect({\r\n autoBind: false,\r\n dataSource: fieldOptions.pool.values,\r\n dataTextField: fieldOptions.pool.textField,\r\n dataValueField: fieldOptions.pool.valueField\r\n });\r\n }\r\n }\r\n\r\n // bind to fieldOptions\r\n export function getAutoCompleteEditor(container, options) {\r\n var fieldOptions = this;\r\n $('')\r\n .appendTo(container)\r\n .kendoAutoComplete({\r\n dataSource: fieldOptions.suggest.values,\r\n separator: fieldOptions.suggest.multi ? fieldOptions.suggest.separator || \", \" : undefined\r\n });\r\n }\r\n\r\n // bind to fieldOptions\r\n export function getDateEditor(container, options) {\r\n var fieldOptions = this;\r\n $('').appendTo(container).kendoDatePicker({\r\n format: fieldOptions.format,\r\n min: fieldOptions.min != null ? new Date(fieldOptions.min) : undefined,\r\n max: fieldOptions.max != null ? new Date(fieldOptions.max) : undefined\r\n });\r\n }\r\n\r\n // bind to fieldOptions\r\n export function getDateTimeEditor(container, options) {\r\n var fieldOptions = this;\r\n $('').appendTo(container).kendoDateTimePicker({\r\n format: fieldOptions.format,\r\n min: fieldOptions.min != null ? new Date(fieldOptions.min) : undefined,\r\n max: fieldOptions.max != null ? new Date(fieldOptions.max) : undefined\r\n });\r\n }\r\n\r\n // bind to fieldOptions\r\n export function getTimeEditor(container, options) {\r\n var fieldOptions = this;\r\n if (fieldOptions.textMode && fieldOptions.allow24) {\r\n var picker = $('').appendTo(container).kendoComboBox({\r\n dataSource: [\r\n \"00:30\", \"01:00\", \"01:30\", \"02:00\", \"02:30\", \"03:00\", \"03:30\", \"04:00\",\r\n \"04:30\", \"05:00\", \"05:30\", \"06:00\", \"06:30\", \"07:00\", \"07:30\", \"08:00\",\r\n \"08:30\", \"09:00\", \"09:30\", \"10:00\", \"10:30\", \"11:00\", \"11:30\", \"12:00\",\r\n \"12:30\", \"13:00\", \"13:30\", \"14:00\", \"14:30\", \"15:00\", \"15:30\", \"16:00\",\r\n \"16:30\", \"17:00\", \"17:30\", \"18:00\", \"18:30\", \"19:00\", \"19:30\", \"20:00\",\r\n \"20:30\", \"21:00\", \"21:30\", \"22:00\", \"22:30\", \"23:00\", \"23:30\", \"24:00\"\r\n ],\r\n suggest: false,\r\n highlightFirst: false\r\n }).data(\"kendoComboBox\");\r\n picker.wrapper.find(\".k-icon.k-i-arrow-s\").removeClass(\"k-i-arrow-s\").addClass(\"k-i-clock\");\r\n } else {\r\n $('').appendTo(container).kendoTimePicker({\r\n format: fieldOptions.format,\r\n min: fieldOptions.min != null ? new Date(fieldOptions.min) : undefined,\r\n max: fieldOptions.max != null ? new Date(fieldOptions.max) : undefined\r\n });\r\n }\r\n }\r\n\r\n // bind to fieldOptions\r\n export function getNumericEditor(container, options) {\r\n var fieldOptions = this;\r\n $('').appendTo(container).kendoNumericTextBox({\r\n format: fieldOptions.format,\r\n decimals: fieldOptions.precision,\r\n min: fieldOptions.min,\r\n max: fieldOptions.max,\r\n spinners: false,\r\n step: 0\r\n });\r\n }\r\n\r\n // bind to column\r\n export function timeColumnTextModeTemplate(args, dataItem) {\r\n var column = this;\r\n var value = dataItem[column.field];\r\n if (value) {\r\n if (args[0]) { //allow24\r\n if (value === \"24:00\") {\r\n return value;\r\n }\r\n if (value === \"00:00\") {\r\n dataItem[column.field] = \"\";\r\n return \"\";\r\n }\r\n }\r\n var timeValue = kendo.parseDate(value, \"HH:mm\");\r\n if (timeValue && timeValue.valueOf()) {\r\n dataItem[column.field] = kendo.toString(timeValue, \"HH:mm\");\r\n return dataItem[column.field];\r\n }\r\n var dateValue = kendo.parseDate(value);\r\n if (dateValue && dateValue.valueOf()) {\r\n dataItem[column.field] = kendo.toString(dateValue, \"HH:mm\");\r\n return dataItem[column.field];\r\n }\r\n }\r\n\r\n dataItem[column.field] = \"\";\r\n return \"\";\r\n }\r\n\r\n // bind to column\r\n export function timeColumnTextModeCompare(data1, data2) {\r\n var column = this;\r\n var time1 = kendo.parseDate(data1[column.field], \"HH:mm\") || new Date(0);\r\n var time2 = kendo.parseDate(data2[column.field], \"HH:mm\") || new Date(0);\r\n\r\n if (data1[column.field] === \"24:00\") {\r\n time1 = h24;\r\n }\r\n\r\n if (data2[column.field] === \"24:00\") {\r\n time2 = h24;\r\n }\r\n\r\n return time1.valueOf() - time2.valueOf();\r\n }\r\n\r\n export function getColumnType(eventItem): ColumnType {\r\n var type: ColumnType = EventGridHelper.EventItemTypeConverter[eventItem.Type];\r\n if (type === ColumnType.Date) {\r\n switch (eventItem.TypeSpecification.DateFormat) {\r\n case 1: // Date\r\n return ColumnType.Date;\r\n case 2: // Time\r\n return ColumnType.Time;\r\n case 3: // DateTime\r\n return ColumnType.DateTime;\r\n case 4: // UserDefined\r\n AppKitchen.logWarning(\"User defined date format for Events not supported! Using DateTime instead!\");\r\n return ColumnType.DateTime;\r\n default:\r\n throw \"invalid date item\";\r\n }\r\n }\r\n\r\n return type;\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface GridColumnOptions extends GridOptions {\r\n multiFilter?: { search: boolean };\r\n align?: string;\r\n width?: string;\r\n multiline?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface EventGridOptions {\r\n getColumnHeader?: (inventoryId: string, itemId: string, eventItem?: any) => string;\r\n }\r\n\r\n export class EventGridModel extends GridModel {\r\n options: EventGridOptions;\r\n dataLoader: AppKitchen.Data.EventDataLoader;\r\n\r\n constructor(dataLoader: AppKitchen.Data.EventDataLoader, options?: EventGridOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options,\r\n {\r\n getColumnHeader: EventGridHelper.getColumnHeader\r\n });\r\n\r\n var columnsConfig = EventGridHelper.getColumnsConfig(dataLoader.config, dataLoader.getItemsDict(), options.getColumnHeader);\r\n\r\n super(columnsConfig.columns, columnsConfig.schema, options);\r\n\r\n this.dataLoader = dataLoader;\r\n\r\n if (this.dataLoader.get().data) {\r\n this.setGridData(this.dataLoader.get().data);\r\n }\r\n this.dataLoader.bind(\"change:data\", () => this.setGridData(this.dataLoader.get().data));\r\n\r\n this.set({ loading: this.dataLoader.get().loading });\r\n this.dataLoader.bind(\"change:loading\", () => this.set({ loading: this.dataLoader.get().loading }));\r\n }\r\n }\r\n\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Controls {\r\n\r\n export module Grids {\r\n\r\n module JobLogGridHelper {\r\n \r\n export function getColumnsConfig(gridOptions: JobLogGridOptions, runningPseudoState: boolean) {\r\n var schema: kendo.data.DataSourceSchemaModelField[] = [\r\n {\r\n field: \"PlannedSchedule\",\r\n type: \"date\"\r\n },\r\n {\r\n field: \"ResultLevel\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"RunBegin\",\r\n type: \"date\"\r\n },\r\n {\r\n field: \"RunEnd\",\r\n type: \"date\"\r\n },\r\n {\r\n field: \"JobId\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"RunUserId\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"RunComputer\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"TechnicalError\",\r\n type: \"string\"\r\n }\r\n ];\r\n\r\n var columns: kendo.ui.GridColumn[] = [\r\n {\r\n field: \"PrimaryKey\",\r\n hidden: true\r\n },\r\n {\r\n field: \"PlannedSchedule\",\r\n title: AppKitchen.Strings.JobLogGrid_PlannedSchedule,\r\n width: gridOptions.columnWidthes.plannedSchedule,\r\n filterable: { multi: false },\r\n format: \"{0:\" + kendo.culture().calendar.patterns.g + \"}\"\r\n },\r\n {\r\n field: \"ResultLevel\",\r\n title: AppKitchen.Strings.JobLogGrid_ResultLevel,\r\n width: gridOptions.columnWidthes.resultLevel,\r\n filterable: { multi: true },\r\n template: resultLevelTemplate,\r\n values: $.merge(\r\n runningPseudoState ? [{ value: \"Running\", text: AppKitchen.Strings.JobLogGrid_ResultLevel_Running }] : [],\r\n [\r\n { value: \"Unknown\", text: AppKitchen.Strings.JobLogGrid_ResultLevel_Unknown},\r\n { value: \"OK\", text: AppKitchen.Strings.JobLogGrid_ResultLevel_Ok},\r\n { value: \"Warning\", text: AppKitchen.Strings.JobLogGrid_ResultLevel_Warning},\r\n { value: \"Error\", text: AppKitchen.Strings.JobLogGrid_ResultLevel_Error}\r\n ]\r\n )\r\n },\r\n {\r\n field: \"RunBegin\",\r\n title: AppKitchen.Strings.JobLogGrid_RunBegin,\r\n width: gridOptions.columnWidthes.runBegin,\r\n filterable: { multi: false },\r\n format: \"{0:\" + kendo.culture().calendar.patterns.g + \"}\"\r\n },\r\n {\r\n field: \"RunEnd\",\r\n title: AppKitchen.Strings.JobLogGrid_RunEnd,\r\n width: gridOptions.columnWidthes.runEnd,\r\n filterable: { multi: false },\r\n format: \"{0:\" + kendo.culture().calendar.patterns.g + \"}\"\r\n },\r\n {\r\n field: \"JobId\",\r\n title: AppKitchen.Strings.JobLogGrid_Job,\r\n width: gridOptions.columnWidthes.job,\r\n filterable: {\r\n multi: true,\r\n search: true\r\n }\r\n },\r\n {\r\n field: \"RunUserId\",\r\n title: AppKitchen.Strings.JobLogGrid_RunUser,\r\n width: gridOptions.columnWidthes.runUser,\r\n filterable: {\r\n multi: true,\r\n search: true\r\n }\r\n },\r\n {\r\n field: \"RunComputer\",\r\n title: AppKitchen.Strings.JobLogGrid_RunComputer,\r\n width: gridOptions.columnWidthes.runComputer,\r\n filterable: {\r\n multi: true,\r\n search: true\r\n }\r\n },\r\n {\r\n field: \"TechnicalError\",\r\n title: AppKitchen.Strings.JobLogGrid_TechnicalError,\r\n width: gridOptions.columnWidthes.technicalError,\r\n filterable: { multi: false }\r\n }\r\n ];\r\n \r\n return {\r\n columns: columns,\r\n schema: schema\r\n };\r\n }\r\n\r\n function resultLevelTemplate(data): string {\r\n return AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.JobLogGrid_ResultLevelCell,\r\n {\r\n resultLevel: data[\"ResultLevel\"],\r\n resultLevelLabel: AppKitchen.Strings[\"JobLogGrid_ResultLevel_\" + data[\"ResultLevel\"]]\r\n });\r\n }\r\n }\r\n\r\n module TaskLogGridHelper {\r\n\r\n export function getColumnsConfig(gridOptions: TaskLogGridOptions) {\r\n var schema: kendo.data.DataSourceSchemaModelField[] = [\r\n {\r\n field: \"RunBegin\",\r\n type: \"date\"\r\n },\r\n {\r\n field: \"RunEnd\",\r\n type: \"date\"\r\n },\r\n {\r\n field: \"TaskId\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"Module\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"ResponsibleId\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"TaskState\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"RunAgent\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"RunUserId\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"ExecState\",\r\n type: \"string\"\r\n }\r\n ];\r\n\r\n var columns: kendo.ui.GridColumn[] = [\r\n {\r\n field: \"RunBegin\",\r\n title: AppKitchen.Strings.TaskLogGrid_RunBegin,\r\n width: gridOptions.columnWidthes.runBegin,\r\n filterable: { multi: false },\r\n format: \"{0:\" + kendo.culture().calendar.patterns.g + \"}\"\r\n },\r\n {\r\n field: \"RunEnd\",\r\n title: AppKitchen.Strings.TaskLogGrid_RunEnd,\r\n width: gridOptions.columnWidthes.runEnd,\r\n filterable: { multi: false },\r\n format: \"{0:\" + kendo.culture().calendar.patterns.g + \"}\"\r\n },\r\n {\r\n field: \"TaskId\",\r\n title: AppKitchen.Strings.TaskLogGrid_Task,\r\n width: gridOptions.columnWidthes.task,\r\n filterable: { multi: true }\r\n },\r\n {\r\n field: \"Module\",\r\n title: AppKitchen.Strings.TaskLogGrid_Module,\r\n width: gridOptions.columnWidthes.module,\r\n filterable: { multi: true }\r\n },\r\n {\r\n field: \"ResponsibleId\",\r\n title: AppKitchen.Strings.TaskLogGrid_Responsible,\r\n width: gridOptions.columnWidthes.responsible,\r\n filterable: { multi: true }\r\n },\r\n {\r\n field: \"TaskState\",\r\n title: AppKitchen.Strings.TaskLogGrid_TaskState,\r\n width: gridOptions.columnWidthes.taskState,\r\n filterable: { multi: true },\r\n values: [\r\n { value: \"Unknown\", text: AppKitchen.Strings.TaskLogGrid_TaskState_Unknown },\r\n { value: \"Due\", text: AppKitchen.Strings.TaskLogGrid_TaskState_Due },\r\n { value: \"Started\", text: AppKitchen.Strings.TaskLogGrid_TaskState_Started },\r\n { value: \"Completed\", text: AppKitchen.Strings.TaskLogGrid_TaskState_Completed }\r\n ]\r\n },\r\n {\r\n field: \"RunAgent\",\r\n title: AppKitchen.Strings.TaskLogGrid_RunAgent,\r\n width: gridOptions.columnWidthes.runAgent,\r\n filterable: { multi: true, search: true }\r\n },\r\n {\r\n field: \"RunUserId\",\r\n title: AppKitchen.Strings.TaskLogGrid_RunUser,\r\n width: gridOptions.columnWidthes.runUser,\r\n filterable: { multi: true, search: true }\r\n },\r\n {\r\n field: \"ExecState\",\r\n title: AppKitchen.Strings.TaskLogGrid_ExecState,\r\n width: gridOptions.columnWidthes.execState,\r\n filterable: { multi: true },\r\n template: excecStateTemplate,\r\n values: [\r\n { value: \"Aborted\", text: AppKitchen.Strings.TaskLogGrid_ExecState_Aborted },\r\n { value: \"ErrAddinInit\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrAddinInit },\r\n { value: \"ErrAppRestart\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrAppRestart },\r\n { value: \"ErrCodeExecError\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrCodeExecError },\r\n { value: \"ErrHolidayRead\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrHolidayRead },\r\n { value: \"ErrLogin\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrLogin },\r\n { value: \"ErrNoExecuteRight\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrNoExecuteRight },\r\n { value: \"ErrNoLicence\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrNoLicence },\r\n { value: \"ErrNoReadRight\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrNoReadRight },\r\n { value: \"ErrOpenDb\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrOpenDb },\r\n { value: \"ErrTaskLogWrite\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ErrTaskLogWrite },\r\n { value: \"ModuleResultDelayedReSchedule\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ModuleResultDelayedReSchedule },\r\n { value: \"ModuleResultErr\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ModuleResultErr },\r\n { value: \"ModuleResultOk\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ModuleResultOk },\r\n { value: \"ModuleResultUnspecified\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ModuleResultUnspecified },\r\n { value: \"ModuleResultWarning\", text: AppKitchen.Strings.TaskLogGrid_ExecState_ModuleResultWarning },\r\n { value: \"NotExecutedOnHoliday\", text: AppKitchen.Strings.TaskLogGrid_ExecState_NotExecutedOnHoliday },\r\n { value: \"NotExecutedOnNoHoliday\", text: AppKitchen.Strings.TaskLogGrid_ExecState_NotExecutedOnNoHoliday },\r\n { value: \"Provided\", text: AppKitchen.Strings.TaskLogGrid_ExecState_Provided },\r\n { value: \"Unknown\", text: AppKitchen.Strings.TaskLogGrid_ExecState_Unknown }\r\n ]\r\n }\r\n ];\r\n\r\n return {\r\n columns: columns,\r\n schema: schema\r\n };\r\n }\r\n\r\n function excecStateTemplate(data): string {\r\n return AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.TaskLogGrid_ExcecStateCell,\r\n {\r\n execState: data[\"ExecState\"],\r\n execStateLabel: AppKitchen.Strings[\"TaskLogGrid_ExecState_\" + data[\"ExecState\"]]\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobLogGridOptions {\r\n runningTimeout?: number;\r\n columnWidthes?: {\r\n plannedSchedule?: string;\r\n resultLevel?: string;\r\n runBegin?: string;\r\n runEnd?: string;\r\n job?: string;\r\n runUser?: string;\r\n runComputer?: string;\r\n technicalError?: string;\r\n }\r\n }\r\n\r\n export class JobLogGridModel extends GridModel {\r\n options: JobLogGridOptions;\r\n dataLoader: AppKitchen.Data.JobLogLoader;\r\n\r\n constructor(dataLoader: AppKitchen.Data.JobLogLoader, options?: JobLogGridOptions) {\r\n\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n runningTimeout: 24 * 60, // 1 Day\r\n columnWidthes: {\r\n plannedSchedule: \"120px\",\r\n runBegin: \"120px\",\r\n runEnd: \"120px\",\r\n resultLevel: \"150px\"\r\n }\r\n }, true);\r\n\r\n var columnsConfig = JobLogGridHelper.getColumnsConfig(options, options.runningTimeout > 0);\r\n\r\n super(columnsConfig.columns, columnsConfig.schema, options);\r\n\r\n this.dataLoader = dataLoader;\r\n\r\n if (this.dataLoader.get().data) {\r\n this.setGridData(this.dataLoader.get().data);\r\n }\r\n this.dataLoader.bind(\"change:data\", () => this.setGridData(this.dataLoader.get().data));\r\n\r\n this.set({ loading: this.dataLoader.get().loading });\r\n this.dataLoader.bind(\"change:loading\", () => this.set({ loading: this.dataLoader.get().loading }));\r\n }\r\n\r\n setGridData(data: any[]) {\r\n if (this.options.runningTimeout > 0) {\r\n super.setGridData(data, dataItem => {\r\n if (!dataItem[\"RunEnd\"] &&\r\n dataItem[\"RunBegin\"] &&\r\n dataItem[\"ResultLevel\"] === \"Unknown\" &&\r\n new Date().valueOf() - dataItem[\"RunBegin\"].valueOf() < this.options.runningTimeout * 60000) {\r\n dataItem[\"ResultLevel\"] = \"Running\";\r\n }\r\n return dataItem;\r\n });\r\n } else {\r\n super.setGridData(data);\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TaskLogGridOptions {\r\n columnWidthes?: {\r\n runBegin?: string;\r\n runEnd?: string;\r\n task?: string;\r\n module?: string;\r\n responsible?: string;\r\n taskState?: string;\r\n runAgent?: string;\r\n runUser?: string;\r\n execState?: string;\r\n }\r\n }\r\n\r\n export class TaskLogGridModel extends GridModel {\r\n options: TaskLogGridOptions;\r\n dataLoader: AppKitchen.Data.TaskLogLoader;\r\n\r\n constructor(dataLoader: AppKitchen.Data.TaskLogLoader, options?: TaskLogGridOptions) {\r\n\r\n options = AppKitchen.OptionsHelper.merge(options,\r\n {\r\n columnWidthes: {}\r\n });\r\n\r\n var columnsConfig = TaskLogGridHelper.getColumnsConfig(options);\r\n\r\n super(columnsConfig.columns, columnsConfig.schema, options);\r\n\r\n this.dataLoader = dataLoader;\r\n\r\n if (this.dataLoader.get().data) {\r\n this.setGridData(this.dataLoader.get().data);\r\n }\r\n this.dataLoader.bind(\"change:data\", () => this.setGridData(this.dataLoader.get().data));\r\n\r\n this.set({ loading: this.dataLoader.get().loading });\r\n this.dataLoader.bind(\"change:loading\", () => this.set({ loading: this.dataLoader.get().loading }));\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobLogFilterPickerAttributes extends AppKitchen.ModelBaseAttributes {\r\n filter?: string;\r\n filterSettings?: AppKitchen.Api.Models.JobLogFilterSettings;\r\n }\r\n\r\n export class JobLogFilterPicker extends AppKitchen.ModelBase {\r\n el: HTMLElement;\r\n $el: JQuery;\r\n filterSettingsDict: { [filterId: string]: AppKitchen.Api.Models.JobLogFilterSettings };\r\n\r\n constructor(targetContainer: HTMLElement, initial?: string) {\r\n super({\r\n filter: initial,\r\n filterSettings: {}\r\n });\r\n\r\n this.el = targetContainer;\r\n this.$el = $(targetContainer);\r\n\r\n var fieldModel = new AppKitchen.Controls.Forms.FieldModel(\"JobLogFilter\", AppKitchen.Controls.Forms.FieldType.Text, \"\", {\r\n pool: {\r\n values: [],\r\n multi: false,\r\n restrict: true,\r\n search: false,\r\n textField: \"Name\",\r\n valueField: \"Id\"\r\n }\r\n });\r\n\r\n fieldModel.set({ value: initial });\r\n fieldModel.on(\"change:value\", () => {\r\n this.set({\r\n filter: fieldModel.get().value,\r\n filterSettings: this.filterSettingsDict[fieldModel.get().value]\r\n });\r\n });\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, '
      ');\r\n var fieldView = new AppKitchen.Controls.Forms.TextFieldView(fieldModel, { editable: true });\r\n this.$el.find(\".a-picker-container\").append(fieldView.render());\r\n\r\n AppKitchen.Data.Api.getJobLogFilters({}, filters => {\r\n fieldModel.get().pool.values = filters;\r\n this.filterSettingsDict = {};\r\n filters.forEach(filter => this.filterSettingsDict[filter[\"Id\"]] = filter[\"Settings\"]);\r\n if (filters.length > 0) {\r\n if (fieldModel.get().value) {\r\n this.set({ filterSettings: this.filterSettingsDict[fieldModel.get().value] });\r\n } else {\r\n fieldModel.set({ value: filters[0][\"Id\"] });\r\n }\r\n fieldView.render();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Controls {\r\n\r\n export module Grids {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataGridModelAttributes extends ModelBaseAttributes {\r\n data?: AppKitchen.Data.TimeSeries.Model.ChartData[];\r\n }\r\n\r\n export class TimeseriesDataGridModel extends AppKitchen.ModelBase {\r\n dateRangePickerModel: Controls.DateRangePickerModel;\r\n requestData: AppKitchen.Api.Models.TimeseriesSimpleDataRequest;\r\n dateChangedLoadDataHandler: () => boolean;\r\n\r\n constructor(model: Controls.DateRangePickerModel, requestData: AppKitchen.Api.Models.TimeseriesSimpleDataRequest) {\r\n super({ loading: false });\r\n this.dateRangePickerModel = model;\r\n this.requestData = requestData;\r\n this.dateRangePickerModel.bind(\"change\", this.refreshData.bind(this, false));\r\n this.refreshData(false);\r\n }\r\n\r\n refreshData(force?: boolean) {\r\n if (this.dateRangePickerModel.get().startDate && this.dateRangePickerModel.get().endDate) {\r\n\r\n if (!force && this.get().data && this.dateChangedLoadDataHandler) {\r\n if (!this.dateChangedLoadDataHandler()) {\r\n return;\r\n }\r\n }\r\n\r\n var request = $.extend({}, this.requestData);\r\n\r\n request.StartDate = this.dateRangePickerModel.get().startDate;\r\n request.EndDate = this.dateRangePickerModel.get().endDate;\r\n this.set({ loading: true });\r\n AppKitchen.Data.Api.getTimeseriesData(request, data => {\r\n this.set({ data: data });\r\n this.set({ loading: false });\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataGridViewOptions extends AppKitchen.ViewBaseOptions {\r\n /** Data cells editability - default is TRUE */\r\n editable?: boolean;\r\n }\r\n\r\n export class TimeseriesDataGridView extends AppKitchen.ViewBase {\r\n spreadsheet: kendo.ui.Spreadsheet;\r\n numberOfHeaderRows: number;\r\n options: TimeseriesDataGridViewOptions;\r\n renderFinished: boolean;\r\n\r\n constructor(model: TimeseriesDataGridModel, targetContainer: HTMLElement, options?: TimeseriesDataGridViewOptions) {\r\n super(model, targetContainer, options);\r\n this.model.dateChangedLoadDataHandler = this.dateChangedHandler.bind(this);\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, { editable: true });\r\n this.renderFinished = false;\r\n model.bind(\"change:data\", this.render.bind(this));\r\n this.render();\r\n }\r\n\r\n render() {\r\n if (this.model.get().data) {\r\n this.renderFinished = false;\r\n this.validateData(this.model.get().data, this.model.requestData.TimeResolution);\r\n\r\n var sheetRows = this.getRowData(this.model.get().data, this.model.requestData.TimeResolution);\r\n var columnConfig = this.getColumnConfig(this.model.get().data);\r\n\r\n var spreadsheetOptions = {\r\n columns: sheetRows[0].cells.length,\r\n rows: sheetRows.length,\r\n toolbar: false,\r\n sheetsbar: false,\r\n sheets: [\r\n {\r\n frozenRows: this.numberOfHeaderRows,\r\n frozenColumns: 1,\r\n name: \"Food Order\",\r\n rows: sheetRows,\r\n columns: columnConfig\r\n }\r\n ]\r\n };\r\n\r\n (spreadsheetOptions).change = this.valueChanged.bind(this);\r\n\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.TimeseriesDataGrid);\r\n this.spreadsheet = this.$el.find(\".a-timeseriesdata-grid\").kendoSpreadsheet(spreadsheetOptions).data(\"kendoSpreadsheet\");\r\n\r\n this.setCellEditability(this.spreadsheet, sheetRows.length + 1, this.numberOfHeaderRows);\r\n\r\n\r\n // add 'only numbers' validator\r\n var validator = {\r\n from: \"-999999999999\",\r\n to: \"99999999999\",\r\n comparerType: \"between\",\r\n type: \"reject\",\r\n dataType: \"number\",\r\n messageTemplate: AppKitchen.Strings.TimeseriesDataGrid_OnlyNumbers\r\n };\r\n\r\n (this.spreadsheet.activeSheet().range(\"R\" + (this.numberOfHeaderRows + 1) + \"C2:R\" + sheetRows.length + \"C\" + sheetRows[0].cells.length)).validation(validator);\r\n\r\n // hide spreadsheet bars\r\n this.$el.find(\".k-spreadsheet-formula-bar\").remove();\r\n this.$el.find(\".k-spreadsheet-sheets-bar\").remove();\r\n this.spreadsheet.resize();\r\n this.renderFinished = true;\r\n \r\n }\r\n }\r\n\r\n /**\r\n * This fixes style and format problems when pasting negative values from excel. Without that\r\n * fix pasting e.g. -5,56 from excel will not work\r\n * @param arg\r\n */\r\n private valueChanged(arg) {\r\n if (this.renderFinished) {\r\n var changedCellsBackground = this.getChangedCellsBackgroundColor();\r\n var range = arg.range;\r\n range.background(changedCellsBackground);\r\n }\r\n }\r\n\r\n private getChangedCellsBackgroundColor():string {\r\n var rgbColor = AppKitchen.UIHelper.Colors.parseColor(AppKitchen.Colors.CiColor);\r\n return AppKitchen.UIHelper.Colors.rgb2rgba(rgbColor,0.07);\r\n }\r\n\r\n validateData(data: AppKitchen.Data.TimeSeries.Model.ChartData[], timeResolution: Mesap.Framework.Common.TimeResolution) {\r\n if (data && data.length > 1 && timeResolution >= Mesap.Framework.Common.TimeResolution.Day && timeResolution !== Mesap.Framework.Common.TimeResolution.ThirtyMinutes) {\r\n var numberOfDifferentTimezones = data.AsLinq()\r\n .Select(cd => cd.timezone)\r\n .Distinct()\r\n .Count();\r\n\r\n if (numberOfDifferentTimezones > 1) {\r\n AppKitchen.logError(\"More than one timezone is not supported by the grid for time resolutions >= DAY\");\r\n throw \"Too many timezones in grid\";\r\n }\r\n }\r\n }\r\n\r\n dateChangedHandler() {\r\n if (this.isDirty()) {\r\n var template = $(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.TimeseriesDataGrid_SaveDialog, {}));\r\n template.appendTo(\"body\");\r\n var window = AppKitchen.UIHelper.Windows.openWindow(template[0], {\r\n height: \"130px\", width: \"500px\", modal: true\r\n });\r\n\r\n template.find(\".a-timeseriesdata-grid-savedialog-button-refuse\").click(() => {\r\n window.close();\r\n this.model.refreshData(true);\r\n });\r\n\r\n template.find(\".a-timeseriesdata-grid-savedialog-button-save\").click(() => {\r\n window.close();\r\n this.saveChangedData();\r\n });\r\n\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n saveChangedData() {\r\n if (!this.isDirty()) {\r\n return;\r\n }\r\n var saveRequest = this.getChangedData();\r\n var notification = new AppKitchen.Controls.Popups.Notification(AppKitchen.Strings.TimeseriesDataGrid_Notification_SaveData,\r\n {\r\n type: \"loading\",\r\n closable: false\r\n });\r\n AppKitchen.Data.Api.updateTimeseriesData(saveRequest, response => {\r\n if (!response) {\r\n notification.setContent(AppKitchen.Strings.TimeseriesDataGrid_Notification_SaveDataError);\r\n notification.setIcon(AppKitchen.Controls.Popups.NotificationIcon.Error);\r\n notification.setClosable(true);\r\n } else {\r\n notification.setContent(AppKitchen.Strings.TimeseriesDataGrid_Notification_SaveDataOK);\r\n notification.setIcon(AppKitchen.Controls.Popups.NotificationIcon.Ok);\r\n notification.closeAfterTimeout(3000);\r\n this.model.refreshData(true);\r\n }\r\n }, error => {\r\n notification.setContent(AppKitchen.Strings.TimeseriesDataGrid_Notification_SaveDataError);\r\n notification.setIcon(AppKitchen.Controls.Popups.NotificationIcon.Error);\r\n notification.setClosable(true);\r\n });\r\n }\r\n\r\n setCellEditability(spreadsheet: kendo.ui.Spreadsheet, maxRows: number, headerRows: number) {\r\n if (!this.options.editable) {\r\n // disable all\r\n (this.spreadsheet.activeSheet().range(\"A1:AX\" + maxRows)).enable(false);\r\n } else {\r\n // disable destriptive cells\r\n (this.spreadsheet.activeSheet().range(\"A1:A\" + maxRows)).enable(false);\r\n (this.spreadsheet.activeSheet().range(\"A1:AX\" + headerRows)).enable(false);\r\n }\r\n }\r\n\r\n isDirty() {\r\n var changedData = this.getChangedData();\r\n return changedData.Timeseries.AsLinq()\r\n .Any(tw => tw.Data != null && tw.Data.length > 0);\r\n }\r\n\r\n getChangedData(): AppKitchen.Api.Models.TimeseriesDataSaveRequest {\r\n var saveRequestData = {\r\n Timeseries: [],\r\n DatabaseId: this.model.requestData.DatabaseId,\r\n TimeResolution: this.model.requestData.TimeResolution\r\n };\r\n\r\n this.fillChangedData(saveRequestData.Timeseries);\r\n return saveRequestData;\r\n }\r\n\r\n fillChangedData(chartData: AppKitchen.Api.Models.TimeseriesDataSaveEntity[]) {\r\n var rowOffset = this.numberOfHeaderRows;\r\n var colOffset = 1;\r\n\r\n var sheet = (this.spreadsheet.activeSheet().toJSON());\r\n \r\n\r\n for (var i = 0; i < this.model.get().data.length; i++) {\r\n chartData.push({\r\n Data: [],\r\n Hypothesis: this.model.get().data[i].hypothesis,\r\n TimeseriesId: this.model.get().data[i].timeseriesId\r\n });\r\n\r\n\r\n for (var rowIdx = rowOffset; rowIdx < sheet.rows.length; rowIdx++) {\r\n var rowDataIndex = rowIdx - rowOffset;\r\n var colDataIndex = i;\r\n\r\n var oldValue = this.model.get().data[colDataIndex].data[rowDataIndex][1];\r\n var cellIdentifier = \"R\" + (rowIdx + 1) + \"C\" + (i + colOffset + 1);\r\n var newValue = this.spreadsheet.activeSheet().range(cellIdentifier).value();\r\n\r\n if (newValue === undefined) {\r\n newValue = null;\r\n }\r\n\r\n if (oldValue !== newValue) {\r\n var date = this.model.get().data[colDataIndex].data[rowDataIndex][0];\r\n chartData[i].Data.push([date, newValue]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n getHeaderRows(data: AppKitchen.Data.TimeSeries.Model.ChartData[], cellBackgroundColor: string): kendo.ui.SpreadsheetSheetRow[] {\r\n var retData: kendo.ui.SpreadsheetSheetRow[] = [];\r\n var defaultHeaderStyle = { textAlign: \"center\", bold: true, background: cellBackgroundColor }\r\n var i = 0;\r\n\r\n var createHeaderRow = (data: AppKitchen.Data.TimeSeries.Model.ChartData[], style: any, getField: (chartData: AppKitchen.Data.TimeSeries.Model.ChartData) => void) => {\r\n var spreadsheetRow: kendo.ui.SpreadsheetSheetRow = {\r\n cells: []\r\n }\r\n spreadsheetRow.cells.push($.extend({}, defaultHeaderStyle));\r\n\r\n for (i = 0; i < data.length; i++) {\r\n spreadsheetRow.cells.push($.extend({ value: getField(data[i]) }, defaultHeaderStyle));\r\n }\r\n return spreadsheetRow;\r\n }\r\n\r\n retData.push(createHeaderRow(data, defaultHeaderStyle, (chartData) => chartData.timeseriesId));\r\n retData.push(createHeaderRow(data, defaultHeaderStyle, (chartData) => chartData.timeseriesName));\r\n retData.push(createHeaderRow(data, defaultHeaderStyle, (chartData) => chartData.unit));\r\n retData[retData.length - 1].cells[0].value = AppKitchen.Strings.Date;\r\n retData[0].cells[0].value = data[0].timezone;\r\n retData[0].cells[0].bold = false;\r\n //retData[0].cells[0].fontSize = 10;\r\n return retData;\r\n }\r\n\r\n getRowData(data: AppKitchen.Data.TimeSeries.Model.ChartData[], timeResolution: Mesap.Framework.Common.TimeResolution): kendo.ui.SpreadsheetSheetRow[] {\r\n var retArray: kendo.ui.SpreadsheetSheetRow[] = [];\r\n var cellHighlightBackgroundColor = \"#f3f3f3\";\r\n\r\n var headerRows = this.getHeaderRows(data, cellHighlightBackgroundColor);\r\n headerRows.AsLinq().ForEach(row => retArray.push(row));\r\n this.numberOfHeaderRows = headerRows.length;\r\n\r\n var valueFormats = this.getValueFormats(data);\r\n\r\n for (let i = 0; i < data[0].data.length; i++) {\r\n var row = {\r\n cells: []\r\n }\r\n retArray.push(row);\r\n\r\n\r\n var tsData = data[0].data[i];\r\n\r\n // add Date \r\n var dateString = AppKitchen.Timezone.getFormatedDateForTimeResolution(tsData[0], data[0].timezone,timeResolution);\r\n row.cells.push({ value: dateString, background: cellHighlightBackgroundColor, textAlign: \"right\" });\r\n\r\n // add Values\r\n for (let j = 0; j < data.length; j++) {\r\n var n: number = data[j].data[i][1];\r\n //evil hack because of wrong display of negative values -1 < x < 0 (e.g. -0.203 => -.203) inspite of correct format string\r\n var format = \"[>=0]\" + valueFormats[j] + \";[<0]-\" + valueFormats[j];\r\n row.cells.push({ value: n, format: format });\r\n }\r\n }\r\n\r\n return retArray;\r\n }\r\n\r\n\r\n getColumnConfig(data: AppKitchen.Data.TimeSeries.Model.ChartData[]): kendo.ui.SpreadsheetSheetColumn[] {\r\n var retArr: kendo.ui.SpreadsheetSheetColumn[] = [];\r\n retArr.push({ width: 150 });\r\n for (var i = 0; i < data.length; i++) {\r\n retArr.push({ width: 150 });\r\n }\r\n\r\n return retArr;\r\n }\r\n\r\n getValueFormats(data: AppKitchen.Data.TimeSeries.Model.ChartData[]) {\r\n var defaultDecimalPlaces = 2;\r\n return data.AsLinq()\r\n .Select(d => {\r\n var places = d.decimalsPlaces != null ? d.decimalsPlaces : defaultDecimalPlaces;\r\n var format = \"0\";\r\n for (var i = 0; i < places; i++) {\r\n if (i === 0) {\r\n format += \".\";\r\n }\r\n format += \"0\";\r\n }\r\n return format;\r\n }).ToArray();\r\n }\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nmodule AppKitchen {\r\n export module Controls {\r\n\r\n export module Grids {\r\n\r\n module TimeseriesGridHelper {\r\n \r\n export function getColumnsConfig(gridOptions: TimeseriesGridOptions, dimensions: AppKitchen.Api.Models.Dimension[]) {\r\n\r\n var schema: kendo.data.DataSourceSchemaModelField[] = [\r\n {\r\n field: \"Id\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"Name\",\r\n type: \"string\"\r\n },\r\n {\r\n field: \"TimeAxisType\",\r\n type: \"string\"\r\n }\r\n ];\r\n\r\n if (dimensions) {\r\n dimensions.forEach(dim => schema.push({\r\n field: dim.Id,\r\n type: \"string\"\r\n }));\r\n }\r\n \r\n var columns: kendo.ui.GridColumn[] = [\r\n {\r\n field: \"Id\",\r\n title: AppKitchen.Strings.TimeseriesGrid_Id,\r\n width: gridOptions.columnWidthes.id,\r\n filterable: { multi: true, search: true }\r\n },\r\n {\r\n field: \"Name\",\r\n title: AppKitchen.Strings.TimeseriesGrid_Name,\r\n width: gridOptions.columnWidthes.name,\r\n filterable: { multi: true, search: true }\r\n },\r\n {\r\n field: \"TimeAxisType\",\r\n title: AppKitchen.Strings.TimeseriesGrid_AxisType,\r\n width: gridOptions.columnWidthes.axisType,\r\n filterable: { multi: true },\r\n values: [\r\n { value: \"Vector\", text: AppKitchen.Strings.TimeseriesGrid_TimeAxisType_Vector },\r\n { value: \"MatrixTimeTime\", text: AppKitchen.Strings.TimeseriesGrid_TimeAxisType_MatrixTimeTime },\r\n { value: \"MatrixTimeTimeNumber\", text: AppKitchen.Strings.TimeseriesGrid_TimeAxisType_MatrixTimeTimeNumber },\r\n { value: \"MatrixTimeTimeTime\", text: AppKitchen.Strings.TimeseriesGrid_TimeAxisType_MatrixTimeTimeTime }\r\n ]\r\n }\r\n ];\r\n\r\n if (dimensions) {\r\n dimensions.forEach(dim => columns.push({\r\n field: dim.Id,\r\n title: dim.Name,\r\n filterable: { multi: true, search: true },\r\n template: (ts: any) => {\r\n if (ts.Keys) {\r\n var keys: AppKitchen.Api.Models.DescriptorKey[] = ts.Keys.toJSON();\r\n var key = keys.AsLinq()\r\n .FirstOrDefault(k => k.DimensionId === dim.Id);\r\n if (key) {\r\n return key.DescriptorId;\r\n }\r\n }\r\n return \"\";\r\n }\r\n }));\r\n }\r\n\r\n return {\r\n columns: columns,\r\n schema: schema\r\n };\r\n }\r\n\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesGridOptions {\r\n columnWidthes?: {\r\n id?: string;\r\n name?: string;\r\n axisType?: string;\r\n }\r\n }\r\n\r\n export class TimeseriesGridModel extends GridModel {\r\n options: TimeseriesGridOptions;\r\n timeseriesLoader: AppKitchen.Data.TimeseriesLoader;\r\n\r\n constructor(timeseriesLoader: AppKitchen.Data.TimeseriesLoader, options?: TimeseriesGridOptions) {\r\n\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n columnWidthes: {\r\n id: \"200px\",\r\n name: \"200px\",\r\n axisType: \"120px\"\r\n }\r\n }, true);\r\n\r\n var columnsConfig = TimeseriesGridHelper.getColumnsConfig(options, timeseriesLoader.get().dimensions);\r\n\r\n super(columnsConfig.columns, columnsConfig.schema, options);\r\n\r\n this.timeseriesLoader = timeseriesLoader;\r\n\r\n this.setGridData(this.timeseriesLoader.get().timeseries || []);\r\n this.timeseriesLoader.bind(\"change:timeseries\", () => this.setGridData(this.timeseriesLoader.get().timeseries));\r\n\r\n this.set({ loading: this.timeseriesLoader.get().loading });\r\n this.timeseriesLoader.bind(\"change:loading\", () => this.set({ loading: this.timeseriesLoader.get().loading }));\r\n }\r\n }\r\n \r\n }\r\n }\r\n}","///\r\n\r\nmodule AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module InteractiveItem {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TsValue {\r\n key: { [dim: string]: string };\r\n hypothesis: string;\r\n aggregationRule?: string;\r\n date: Date;\r\n sourceTimeResolution: number;\r\n targetTimeResolution: number;\r\n format?: string;\r\n label?: string;\r\n unit?: string;\r\n absolute?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InteractiveItem {\r\n x: number;\r\n y: number;\r\n color: string;\r\n title: string;\r\n type?: \"circle\" | \"line\" | \"speedometer\";\r\n icon?: string;\r\n tsValues: TsValue[];\r\n showLabels: boolean;\r\n showTooltips: boolean;\r\n action?: {\r\n type: \"navigate\" | \"popup\" | \"custom\";\r\n configName: string;\r\n configPath: string;\r\n callback: () => void;\r\n };\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InteractiveItemModelOptions {\r\n configName: string;\r\n configPath: string;\r\n }\r\n\r\n export class InteractiveItemController {\r\n private models: InteractiveItemModel[];\r\n\r\n constructor(target: HTMLElement, configName: string, configPath: string, modify?: (interactiveitem: InteractiveItem) => InteractiveItem) {\r\n this.models = [];\r\n\r\n this.renderInteractiveItems(target, configName, configPath, modify);\r\n }\r\n\r\n private renderInteractiveItems(target: HTMLElement, configName: string, configPath: string, modify?: (interactiveitem: InteractiveItem) => InteractiveItem) {\r\n\r\n var itemsContainer = this.renderInteractionItemsContainer(target);\r\n\r\n AppKitchen.Data.getDocument(configName,\r\n configPath,\r\n json => {\r\n var j = JSON.parse(json);\r\n let interactiveItemModelOptions = j.interactiveItems;\r\n if (!interactiveItemModelOptions) {\r\n throw \"Could not found config \" + configPath + \"\\\\\" + configName + \".\";\r\n }\r\n for (let interactiveItemModelOption of interactiveItemModelOptions) {\r\n\r\n let configName = interactiveItemModelOption.configName;\r\n let configPath = interactiveItemModelOption.configPath;\r\n\r\n this.readConfig(configName,\r\n configPath,\r\n (interactiveItem) => {\r\n let itemContainer = this.appendInteractiveItemContainer(itemsContainer);\r\n\r\n let model = new InteractiveItemModel(interactiveItem);\r\n\r\n this.createInteractiveItemInstance(interactiveItem, model, itemContainer);\r\n\r\n this.models.push(model);\r\n }, modify); \r\n }\r\n });\r\n }\r\n\r\n private appendInteractiveItemContainer(target: JQuery): HTMLElement {\r\n return $('
      ')\r\n .appendTo(target)[0];\r\n }\r\n\r\n private renderInteractionItemsContainer(target: HTMLElement): JQuery {\r\n return AppKitchen.UIHelper\r\n .renderTemplateTo(target, '
      ');\r\n }\r\n\r\n private createInteractiveItemInstance(interactiveItem: InteractiveItem, model: InteractiveItemModel, target: HTMLElement): InteractiveItemView {\r\n if (interactiveItem.type === \"line\") {\r\n return new LineInteractiveItemView(model, target);\r\n }\r\n if (interactiveItem.type === \"circle\") {\r\n return new CircleInteractiveItemView(model, target);\r\n }\r\n if (interactiveItem.type === \"speedometer\") {\r\n return new SpeedometerInteractiveItemView(model, target);\r\n }\r\n throw `${interactiveItem.type} not supported!`;\r\n }\r\n\r\n changeSelectedRange(date, targetTimeResolution) {\r\n for (let model of this.models) {\r\n model.changeSelectedRange(date, targetTimeResolution);\r\n }\r\n }\r\n\r\n readConfig(configName: string, configPath: string, callback: (interativeItem: InteractiveItem) => void, modify?: (interactiveitem: InteractiveItem) => InteractiveItem) {\r\n AppKitchen.Data.getDocument(configName, configPath,\r\n json => {\r\n let config = JSON.parse(json);\r\n if (config) {\r\n let interactiveitem = config.interactiveItem;\r\n if (interactiveitem) {\r\n if (modify) {\r\n interactiveitem = modify(interactiveitem);\r\n }\r\n callback(interactiveitem);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InteractiveItemAttributes extends AppKitchen.ModelBaseAttributes {\r\n value1?: any[];\r\n value2?: any[];\r\n value3?: any[];\r\n config?: InteractiveItem;\r\n startDate: Date;\r\n endDate: Date;\r\n }\r\n\r\n export class InteractiveItemModel extends AppKitchen.ModelBase {\r\n interactiveItem: InteractiveItem;\r\n\r\n constructor(interactiveItem: InteractiveItem) {\r\n super();\r\n\r\n this.interactiveItem = interactiveItem;\r\n\r\n let configValue = {};\r\n configValue[\"config\"] = this.interactiveItem;\r\n this.set(configValue);\r\n\r\n this.changeSelectedRange(this.getDefaultDateForDay(), 5);\r\n }\r\n\r\n changeSelectedRange(date: any, targetTimeResolution: number) {\r\n for (let tsValue of this.interactiveItem.tsValues) {\r\n tsValue.targetTimeResolution = targetTimeResolution;\r\n tsValue.date = date;\r\n }\r\n this.loadData();\r\n }\r\n\r\n private loadData() {\r\n \r\n let tsValues = this.interactiveItem.tsValues;\r\n\r\n var loads = [];\r\n var funcs = [];\r\n\r\n for (let i = 0; i <= 3; i++) {\r\n loads[i] = () => {\r\n let loadingProperty = {};\r\n loadingProperty[\"loading\" + (i + 1)] = true;\r\n this.set(loadingProperty);\r\n };\r\n funcs[i] = data => {\r\n let valueProperty = {};\r\n valueProperty[\"value\" + (i + 1)] = data;\r\n\r\n let loadingProperty = {}\r\n loadingProperty[\"loading\" + (i + 1)] = false;\r\n\r\n this.set(valueProperty);\r\n this.set(loadingProperty);\r\n };\r\n }\r\n\r\n let i = 0;\r\n for (let tsValue of tsValues) {\r\n let loadingProperty = {}\r\n loadingProperty[\"loading\" + (i + 1)] = true;\r\n this.set(loadingProperty);\r\n AppKitchen.Data.getData(\"TsValue\",\r\n {\r\n AggregationRule: tsValue.aggregationRule,\r\n Hypothesis: tsValue.hypothesis,\r\n Key: this.convertKey(tsValue.key),\r\n SourceTimeResolution: tsValue.sourceTimeResolution,\r\n TargetTimeResolution: tsValue.targetTimeResolution,\r\n Date: tsValue.date,\r\n Unit: tsValue.unit,\r\n Absolute: tsValue.absolute\r\n },\r\n funcs[i],\r\n (requestData, xhr) => {\r\n AppKitchen.UIHelper.Notifications.notify(xhr.responseText, \"warning\");\r\n });\r\n i++;\r\n }\r\n }\r\n\r\n convertKey(baseKey: { [dim: string]: string }): System.Collections.Generic.KeyValuePair[\r\n ] {\r\n var key: System.Collections.Generic.KeyValuePair[] = [];\r\n for (let dim in baseKey) {\r\n key.push({ Key: dim, Value: baseKey[dim] });\r\n }\r\n return key;\r\n }\r\n\r\n getDefaultDateForDay() {\r\n return new Date().addDays(-1);\r\n }\r\n\r\n getDefaultDateForMonth() {\r\n var today = new Date();\r\n return today.addDays(-today.getDate() + 1);\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface InteractiveItemOptions extends AppKitchen.ViewBaseOptions {\r\n }\r\n\r\n export abstract class InteractiveItemView extends AppKitchen.ViewBase {\r\n options: InteractiveItemOptions;\r\n\r\n containers: {\r\n item: JQuery;\r\n title: JQuery;\r\n content: JQuery;\r\n }\r\n\r\n constructor(model: InteractiveItemModel, target: HTMLElement, options?: InteractiveItemOptions) {\r\n super(model,\r\n target,\r\n AppKitchen.OptionsHelper.merge(options,\r\n {\r\n \r\n }));\r\n\r\n this.render();\r\n\r\n for (let i = 0; i <= 3; i++) {\r\n this.model.bind(\"change:value\" + (i + 1), this.update, this);\r\n this.model.bind(\"change:loading\" + (i + 1), this.handleLoadingAnimation, this);\r\n }\r\n }\r\n\r\n protected abstract update();\r\n\r\n protected abstract setTemplateFromConfig();\r\n\r\n protected abstract handleLoadingAnimation();\r\n\r\n protected setLoadingAnimation(i: number) {\r\n var element = this.containers.content\r\n .find(\".a-interactive-item-value-text\")\r\n .get(i);\r\n element.innerHTML = \"-\";\r\n AppKitchen.UIHelper.renderLoader(element, { size: \"S\", type: \"concentric\" });\r\n }\r\n\r\n private render() {\r\n let config = this.model.get().config;\r\n let labels: string[] = [];\r\n for (let tsValue of config.tsValues) {\r\n labels.push(tsValue.label);\r\n }\r\n this.setTemplateFromConfig();\r\n\r\n this.renderTemplate({ title: config.title, labels: labels, defaultValue: \"-\", icon: config.icon, showLabels: config.showLabels, showTooltips: config.showTooltips });\r\n\r\n this.containers = {\r\n item: this.$el.find(\".a-interactive-item\"),\r\n title: this.$el.find(\".a-interactive-item-title\"),\r\n content: this.$el.find(\".a-interactive-item-content\")\r\n }\r\n\r\n if (config.showTooltips) {\r\n let values = this.containers.content.find(\".a-interactive-item-value\");\r\n for (let i = 0; i <= values.length; i++) {\r\n if (labels[i] && labels[i] !== \"\") {\r\n $(values[i])\r\n .kendoTooltip({\r\n position: \"top\",\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.containers.item.css(\"left\", `${config.x}vw`);\r\n this.containers.item.css(\"top\", `${config.y}vh`);\r\n\r\n this.containers.title.css(\"background-color\", config.color);\r\n this.containers.content.css(\"background-color\", config.color);\r\n\r\n if (config.tsValues.length > 2) {\r\n this.containers.content.css(\"font-size\", \"1.25vw\");\r\n } else {\r\n this.containers.content.css(\"font-size\", \"1.5vw\");\r\n }\r\n\r\n if (config.action) {\r\n this.addClickAction(this.containers.item, config);\r\n }\r\n }\r\n\r\n addClickAction(button: JQuery, interactiveItem: InteractiveItem) {\r\n button.unbind(\"click\");\r\n\r\n button\r\n .click(() => {\r\n if (interactiveItem.action.type === \"popup\") {\r\n\r\n var buttons = [\r\n {\r\n name: \"close\",\r\n action: (window) => window.close()\r\n }\r\n ];\r\n\r\n var windowOptions: AppKitchen.UIHelper.Windows.WindowOptions = {\r\n width: \"90%\",\r\n height: \"83%\",\r\n position: { top: \"5%\", left: \"3%\" },\r\n animate: true,\r\n buttons: buttons,\r\n modal: true,\r\n easyClose: true,\r\n center: true\r\n }\r\n\r\n new AppKitchen.FrameManager\r\n .AppHolder(ConfigLauncherApp)\r\n .startInWindow(windowOptions,\r\n {\r\n configFile: this.getConfigFile(interactiveItem),\r\n startDate: this.getStartDate(),\r\n endDate: this.getEndDate()\r\n });\r\n } else if (interactiveItem.action.type === \"navigate\") {\r\n var route = \"#/View/?f=\" + encodeURIComponent(this.getConfigFile(interactiveItem));\r\n\r\n AppKitchen.BrowserHelper.setUrl(route);\r\n } else if (interactiveItem.action.type === \"custom\") {\r\n interactiveItem.action.callback();\r\n }\r\n });\r\n }\r\n\r\n private getConfigFile(interactiveItem: InteractiveItem): string {\r\n let configFile = `Config\\\\`;\r\n if (interactiveItem.action.configPath && interactiveItem.action.configPath !== \"\") {\r\n configFile += `${interactiveItem.action.configPath}`;\r\n }\r\n configFile += `\\\\${interactiveItem.action.configName}.json`;\r\n return configFile;\r\n }\r\n\r\n private getStartDate(): Date {\r\n return this.model.get().startDate;\r\n }\r\n\r\n private getEndDate(): Date {\r\n return this.model.get().endDate;\r\n }\r\n\r\n protected convertValue(data: any, format?: string): string {\r\n let value = kendo.parseFloat(data);\r\n if (!value) {\r\n return data;\r\n }\r\n return kendo.toString(value, format);\r\n }\r\n\r\n }\r\n\r\n export class LineInteractiveItemView extends InteractiveItemView {\r\n\r\n constructor(model: InteractiveItemModel, target: HTMLElement, options?: InteractiveItemOptions) {\r\n super(model,\r\n target,\r\n AppKitchen.OptionsHelper.merge(options, {}));\r\n }\r\n\r\n protected setTemplateFromConfig() {\r\n this.setTemplate(AppKitchen.Templates.InteractiveItemLine);\r\n }\r\n\r\n protected update() {\r\n for (let i = 0; i <= 3; i++) {\r\n let data = this.model.get(\"value\" + (i + 1));\r\n let element = this.containers.content\r\n .find(\".a-interactive-item-value-text\")\r\n .get(i);\r\n if (data) {\r\n AppKitchen.UIHelper.removeLoader(element);\r\n element.innerHTML = `${this.convertValue(data.Value, \"n0\")} ${data.Unit}`;\r\n }\r\n }\r\n }\r\n\r\n protected handleLoadingAnimation() {\r\n for (let i = 0; i <= 3; i++) {\r\n let loading = this.model.get(\"loading\" + (i + 1));\r\n if (loading === true) {\r\n super.setLoadingAnimation(i);\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class CircleInteractiveItemView extends InteractiveItemView {\r\n\r\n constructor(model: InteractiveItemModel, target: HTMLElement, options?: InteractiveItemOptions) {\r\n super(model,\r\n target,\r\n AppKitchen.OptionsHelper.merge(options, {}));\r\n }\r\n\r\n protected setTemplateFromConfig() {\r\n this.setTemplate(AppKitchen.Templates.InteractiveItemCircle);\r\n }\r\n\r\n protected update() {\r\n for (let i = 0; i <= 3; i++) {\r\n let data = this.model.get(\"value\" + (i + 1));\r\n let element = this.containers.content\r\n .find(\".a-interactive-item-value-text\")\r\n .get(i);\r\n if (data) {\r\n AppKitchen.UIHelper.removeLoader(element);\r\n element.innerHTML = `${this.convertValue(data.Value, \"n0\")} ${data.Unit}`;\r\n }\r\n }\r\n }\r\n\r\n protected handleLoadingAnimation() {\r\n for (let i = 0; i <= 3; i++) {\r\n let loading = this.model.get(\"loading\" + (i + 1));\r\n if (loading === true) {\r\n super.setLoadingAnimation(i);\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class SpeedometerInteractiveItemView extends InteractiveItemView {\r\n\r\n constructor(model: InteractiveItemModel, target: HTMLElement, options?: InteractiveItemOptions) {\r\n super(model,\r\n target,\r\n AppKitchen.OptionsHelper.merge(options, {}));\r\n }\r\n\r\n protected setTemplateFromConfig() {\r\n this.setTemplate(AppKitchen.Templates.InteractiveItemSpeedometer);\r\n }\r\n\r\n protected update() {\r\n let data = this.model.get(\"value1\");\r\n let element = this.containers.content\r\n .find(\".a-interactive-item-value-text\")\r\n .get(0);\r\n if (data) {\r\n AppKitchen.UIHelper.removeLoader(element);\r\n element.innerHTML = `${this.convertValue(data.Value, \"n0\")} ${data.Unit}`;\r\n\r\n let prozent = this.calculatingSpeedometerProzent(data.Value);\r\n this.containers.content.find(\".a-speedometer-needle\")\r\n .css(\"transform\", `rotate(${prozent}deg)`);\r\n }\r\n }\r\n\r\n protected handleLoadingAnimation() {\r\n let loading = this.model.get(\"loading1\");\r\n if (loading === true) {\r\n super.setLoadingAnimation(0);\r\n }\r\n }\r\n\r\n private calculatingSpeedometerProzent(value: any): number {\r\n let cutValue = kendo.parseFloat(value);\r\n if (cutValue > 100) {\r\n cutValue = 100;\r\n }\r\n if (cutValue < 0) {\r\n cutValue = 0;\r\n }\r\n let prozent = cutValue * 1.8;\r\n \r\n return prozent;\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ConfigLauncherAppOptions extends AppKitchen.Apps.ConfigFileStarterAppOptions {\r\n configLoaded?: (config: any) => void;\r\n integrated?: boolean;\r\n startDate?: Date;\r\n endDate?: Date;\r\n }\r\n\r\n export class ConfigLauncherApp extends AppKitchen.Apps.ConfigFileStarterApp {\r\n options: ConfigLauncherAppOptions;\r\n\r\n start() {\r\n if (this.options.urlParameter) {\r\n this.beautifyUrl();\r\n }\r\n super.start();\r\n }\r\n\r\n processConfig(config) {\r\n if (this.options.configLoaded) {\r\n this.options.configLoaded(config);\r\n }\r\n\r\n if (this.options.startDate) {\r\n config.timeaxis[0].begin.date = kendo.toString(this.options.startDate, \"s\");\r\n }\r\n if (this.options.endDate) {\r\n config.timeaxis[0].end.date = kendo.toString(this.options.endDate, \"s\");\r\n }\r\n\r\n this.app = new CustomConfigTsChartApp(this.el, { config: config });\r\n\r\n }\r\n\r\n protected getFileUrl() {\r\n var url = this.options.configFile;\r\n\r\n if (!url) {\r\n throw \"undefined config file\";\r\n }\r\n\r\n if (this.options.baseUrl && !url.beginsWith(this.options.baseUrl)) {\r\n url = this.options.baseUrl + url;\r\n }\r\n\r\n if (!url.endsWith(\".json\")) {\r\n url += \".json\";\r\n }\r\n\r\n return encodeURIComponent(url);\r\n }\r\n\r\n beautifyUrl() {\r\n var url: string = AppKitchen.BrowserHelper.UrlQuery.getParameters()[this.options.urlParameter];\r\n if (url) {\r\n if (url.endsWith(\".json\")) {\r\n url = url.substr(0, url.length - \".json\".length);\r\n }\r\n if (url.beginsWith(this.options.baseUrl)) {\r\n url = url.substr(this.options.baseUrl.length);\r\n }\r\n AppKitchen.BrowserHelper.UrlQuery\r\n .setParameter(this.options.urlParameter, url, { push: false, refresh: false });\r\n }\r\n }\r\n\r\n protected handleRequestError(xhr: JQueryXHR, statusText: string, errorText: string) {\r\n if (xhr.status === 404) {\r\n this.$el.append(AppKitchen.UIHelper\r\n .renderTemplate(AppKitchen.Templates.ConfigurationErrorOverlay,\r\n {\r\n error: \"Die Datei \" +\r\n decodeURIComponent(this.getFileUrl()) +\r\n \" wurde nicht gefunden\"\r\n }));\r\n\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n }\r\n }\r\n }\r\n\r\n export class CustomConfigTsChartApp extends AppKitchen.Apps.ConfigTsChartApp {\r\n start() {\r\n this.tsChartView = new CustomTimeseriesChartView(this.options.config, this.el);\r\n }\r\n }\r\n\r\n export class CustomTimeseriesChartView extends AppKitchen.Portal.InteractiveGraphic {\r\n getDefaults() {\r\n return Charts.Defaults.get();\r\n }\r\n }\r\n\r\n export module Charts {\r\n export class Defaults {\r\n static get() {\r\n return {\r\n chart: {\r\n backgroundColor: \"#FFFFFF\",\r\n borderColor: \"#F00\",\r\n animation: false,\r\n marginLeft: 70,\r\n zoomType: \"xy\",\r\n borderRadius: 0\r\n },\r\n plotOptions: {\r\n series: {\r\n point: {\r\n events: {\r\n \r\n }\r\n }\r\n }\r\n },\r\n exporting: {\r\n buttons: {\r\n contextButton: {\r\n enabled: false\r\n }\r\n }\r\n },\r\n credits: {\r\n enabled: false\r\n },\r\n navigator: {\r\n maskFill: \"rgba(255, 255, 255, 0.5)\",\r\n series: {\r\n color: 'rgba(125, 125, 125, 0.4)',\r\n fillOpacity: 0.1,\r\n lineColor: 'rgba(125, 125, 125, 0.6)'\r\n },\r\n outlineColor: '#CCC',\r\n enabled: true,\r\n maskInside: false\r\n },\r\n scrollbar: {\r\n barBackgroundColor: '#F3F3F3',\r\n barBorderColor: '#CCC',\r\n barBorderRadius: 0,\r\n buttonArrowColor: '#999',\r\n buttonBackgroundColor: '#FFF',\r\n buttonBorderColor: '#CCC',\r\n trackBackgroundColor: '#FFF',\r\n trackBorderColor: '#CCC',\r\n buttonBorderRadius: 0,\r\n enabled: false\r\n },\r\n xAxis: {\r\n title: {\r\n style: {\r\n color: '#555',\r\n fontFamily: 'OpenSansProLight',\r\n fontWeight: 'normal'\r\n }\r\n }\r\n },\r\n yAxis: {\r\n title: {\r\n style: {\r\n color: '#555'\r\n }\r\n }\r\n },\r\n title: {\r\n style: {\r\n display: 'none'\r\n }\r\n },\r\n subtitle: {\r\n style: {\r\n display: 'none'\r\n }\r\n },\r\n tooltip: {\r\n borderColor: '#B7B7B7',\r\n backgroundColor: 'rgba(255, 255, 255, 0.93)',\r\n borderRadius: 0,\r\n borderWidth: 1,\r\n valueDecimals: 2,\r\n hideDelay: 10,\r\n crosshairs: true,\r\n shared: true,\r\n shadow: false,\r\n positioner:\r\n \"###js###function (boxWidth, boxHeight, point){ var xPos = point.plotX-boxWidth-5; xPos=xPos<0?point.plotX+70:xPos; return { x: xPos, y: 32 }; }\"\r\n },\r\n rangeSelector: {\r\n inputDateFormat: \"%e. %b, %Y\",\r\n enabled: false,\r\n buttonTheme: {\r\n fill: 'none',\r\n stroke: 'none',\r\n states: {\r\n hover: {\r\n stroke: '#EEE',\r\n fill: 'none'\r\n },\r\n select: {\r\n fill: 'none',\r\n stroke: '#444'\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Job {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobTile {\r\n title?: string;\r\n jobId: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobStarterOptions {\r\n title?: string;\r\n }\r\n\r\n export type JobStartStatuses = \"initial\" | \"starting\" | \"started\" | \"failed\";\r\n\r\n export type LastJobRunStatuses = \"Ok\" | \"Warning\" | \"Error\" | \"Running\";\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobStarterAttributes extends AppKitchen.ModelBaseAttributes {\r\n title?: string;\r\n jobId?: string;\r\n jobNr?: number;\r\n jobName?: string;\r\n latestRunBegin?: Date;\r\n latestRunEnd?: Date;\r\n latestRunSchedule?: Date;\r\n latestRunResult?: LastJobRunStatuses;\r\n latestRunLogNr?: number;\r\n configError?: string;\r\n startStatus?: JobStartStatuses;\r\n }\r\n\r\n export class JobStarterModel extends AppKitchen.ModelBase{\r\n constructor(jobId: string, options?: JobStarterOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n title: \"\"\r\n });\r\n\r\n super({\r\n title: options.title,\r\n jobId: jobId,\r\n jobNr: 0,\r\n jobName: jobId,\r\n latestRunBegin: null,\r\n latestRunEnd: null,\r\n latestRunSchedule: null,\r\n latestRunResult: null,\r\n latestRunLogNr: null,\r\n configError: null,\r\n startStatus: \"initial\"\r\n });\r\n\r\n this.loadJobInfo();\r\n }\r\n\r\n updateLatestRun(onEnd?: () => void) {\r\n\r\n var jobLogRequest = {\r\n LatestRun: true,\r\n LatestRunByBegin: true,\r\n LatestRunIncludeRunning: true,\r\n FilterSettings: {\r\n JobNrs: [this.get().jobNr]\r\n }\r\n };\r\n\r\n AppKitchen.Data.Api.getJobLog(jobLogRequest, jobLogs => {\r\n if (jobLogs && jobLogs.length > 0) {\r\n var latestRun = jobLogs[0];\r\n\r\n var latestRunEnd = kendo.parseDate(latestRun[\"RunEnd\"], \"yyyy-MM-ddTHH:mm:ss\");\r\n if (latestRunEnd < new Date(1900, 1)) {\r\n latestRunEnd = null;\r\n if (latestRun[\"ResultLevel\"] === \"Unknown\") {\r\n latestRun[\"ResultLevel\"] = \"Running\";\r\n }\r\n }\r\n\r\n var resetStartStatus = this.get().latestRunResult === \"Running\" && latestRun[\"ResultLevel\"] !== \"Running\";\r\n\r\n this.set({\r\n latestRunBegin: kendo.parseDate(latestRun[\"RunBegin\"], \"yyyy-MM-ddTHH:mm:ss\"),\r\n latestRunEnd: latestRunEnd,\r\n latestRunSchedule: kendo.parseDate(latestRun[\"PlannedSchedule\"], \"yyyy-MM-ddTHH:mm:ss\"),\r\n latestRunResult: latestRun[\"ResultLevel\"],\r\n latestRunLogNr: latestRun[\"PrimaryKey\"],\r\n startStatus: resetStartStatus ? \"initial\" : this.get().startStatus\r\n });\r\n } else {\r\n this.set({\r\n latestRunBegin: null,\r\n latestRunEnd: null,\r\n latestRunSchedule: null,\r\n latestRunResult: null,\r\n latestRunLogNr: null\r\n });\r\n }\r\n this.set({ loading: false });\r\n if (onEnd) {\r\n onEnd();\r\n }\r\n });\r\n }\r\n\r\n loadJobInfo() {\r\n this.set({ loading: true });\r\n\r\n var jobId = this.get().jobId;\r\n AppKitchen.Data.Api.getJobs({ Ids: [jobId] }, jobs => {\r\n if (!jobs || jobs.length === 0) {\r\n this.set({\r\n configError: \"Der Job mit ID \" + jobId + \" wurde nicht gefunden\",\r\n loading: false\r\n });\r\n throw \"Job with ID '\" + jobId + \"' not found\";\r\n }\r\n\r\n this.set({\r\n jobName: jobs[0].Name,\r\n jobNr: jobs[0].PrimaryKey\r\n });\r\n\r\n this.updateLatestRun();\r\n this.set({ loading: false });\r\n });\r\n }\r\n\r\n startJob(error: (requestData, xhr, statusText) => void) {\r\n AppKitchen.Data.Api.startJob({ JobId: this.get().jobId },\r\n result => {\r\n AppKitchen.UIHelper.hideTooltips();\r\n if (result) {\r\n this.set({ startStatus: \"started\" });\r\n this.updateLatestRun();\r\n } else {\r\n this.set({ startStatus: \"failed\" });\r\n }\r\n },\r\n (requestData, xhr, statusText) => {\r\n AppKitchen.UIHelper.hideTooltips();\r\n this.set({ startStatus: \"failed\" });\r\n error(requestData, xhr, statusText);\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobStarterViewOptions extends AppKitchen.ViewBaseOptions {\r\n tooltipPosition?: \"top\" | \"right\";\r\n showTaskLog?: boolean;\r\n }\r\n\r\n export class JobStarterView extends AppKitchen.ViewBase {\r\n model: JobStarterModel;\r\n options: JobStarterViewOptions;\r\n\r\n containers: {\r\n tile: JQuery,\r\n content: JQuery,\r\n }\r\n\r\n buttons: {\r\n jobStart: JQuery,\r\n }\r\n\r\n icons: {\r\n jobStart: JQuery,\r\n lastRun: JQuery,\r\n }\r\n\r\n private tileModel: AppKitchen.Controls.Tile.StatusTileModel;\r\n private tileView: AppKitchen.Controls.Tile.StatusTileView;\r\n\r\n constructor(model: JobStarterModel, targetContainer: HTMLElement, options?: JobStarterViewOptions) {\r\n super(model, targetContainer);\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options,\r\n {\r\n showTaskLog: false,\r\n tooltipPosition: \"top\"\r\n });\r\n this.setTemplate(AppKitchen.Templates.Tile);\r\n\r\n this.render();\r\n this.model.bind(\"change\", () => this.render());\r\n\r\n this.activateLatestRunUpdate();\r\n\r\n }\r\n\r\n render() {\r\n var lastRun = kendo.toString(this.model.get().latestRunBegin, \"g\");\r\n var status = AppKitchen.Strings[\"JobLogGrid_ResultLevel_\" + this.model.get().latestRunResult];\r\n var statusIcon = this.getStatusIconFromStatus(this.model.get().startStatus);\r\n var lastJobRunIcon = this.getLastJobRunStatus(this.model.get().latestRunResult);\r\n\r\n this.tileModel = new Controls.Tile.StatusTileModel({\r\n icon: statusIcon,\r\n title: \"Job Starter\",\r\n description: \"Id: \" + this.model.get().jobId,\r\n status: `${AppKitchen.Strings.JobLogGrid_LastRun} ${lastRun} ${status}`,\r\n statusIcon: lastJobRunIcon,\r\n options: {\r\n click: this.startJob\r\n }\r\n });\r\n\r\n this.tileView = new Controls.Tile.StatusTileView(this.tileModel, this.el);\r\n\r\n this.containers = {\r\n tile: this.$el.find(\".a-tile\"),\r\n content: this.$el.find(\".a-tile-content\")\r\n }\r\n\r\n this.buttons = {\r\n jobStart: this.$el.find(\".a-tile-icon\")\r\n }\r\n\r\n this.icons = {\r\n jobStart: this.$el.find(\".a-tile-icon > .mesap-icon\"),\r\n lastRun: this.$el.find(\".a-tile-status > .mesap-icon\")\r\n }\r\n\r\n this.containers.tile.addClass(\"a-job-starter\");\r\n\r\n this.icons.jobStart.addClass(this.model.get().startStatus);\r\n this.icons.lastRun.addClass(this.model.get().latestRunResult);\r\n\r\n if (this.model.get().startStatus !== \"failed\") {\r\n this.buttons.jobStart.attr(\"title\", this.getJobStatusTooltip(this.model.get().startStatus));\r\n\r\n this.buttons.jobStart.kendoTooltip({\r\n position: \"top\",\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n\r\n if (this.model.get().configError) {\r\n this.$el.append(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.JobStarterConfigurationErrorOverlay, {\r\n error: this.model.get().configError\r\n }));\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n return;\r\n }\r\n\r\n if (this.model.get().latestRunBegin) {\r\n this.containers.content.kendoTooltip({\r\n position: this.options.tooltipPosition,\r\n content: AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.JobStarterLatestRunTooltip,\r\n {\r\n planned: kendo.toString(this.model.get().latestRunSchedule, \"g\"),\r\n begin: kendo.toString(this.model.get().latestRunBegin, \"g\"),\r\n end: kendo.toString(this.model.get().latestRunEnd, \"g\")\r\n })\r\n });\r\n\r\n if (this.options.showTaskLog) {\r\n var jobNr = this.model.get().jobNr;\r\n var latestRun = this.model.get().latestRunBegin;\r\n if (jobNr != null && latestRun != null) {\r\n this.containers.content.css(\"cursor\", \"pointer\");\r\n this.containers.content.click(() => this.showTaskLog(jobNr, latestRun));\r\n }\r\n }\r\n }\r\n }\r\n\r\n getJobStatusTooltip(jobStatus: JobStartStatuses) {\r\n switch (this.model.get().startStatus) {\r\n case \"starting\":\r\n return \"Job wird gestartet\";\r\n case \"started\":\r\n return \"Job wird gestartet\";\r\n case \"failed\":\r\n return \"Job fehlgeschlagen\";\r\n case \"initial\":\r\n default:\r\n return \"Job starten\";\r\n }\r\n }\r\n\r\n getStatusIconFromStatus(jobStatus: JobStartStatuses) {\r\n switch (jobStatus) {\r\n case \"starting\":\r\n return \"icon-status-in-progress\";\r\n case \"started\":\r\n return \"icon-status-ok\";\r\n case \"failed\":\r\n return \"icon-status-fail\";\r\n case \"initial\":\r\n default:\r\n return \"icon-playback-circled-play\";\r\n }\r\n }\r\n\r\n getLastJobRunStatus(lastJobRunStatus: LastJobRunStatuses) {\r\n switch (lastJobRunStatus) {\r\n case \"Ok\":\r\n return \"icon-status-ok\";\r\n case \"Warning\":\r\n return \"icon-status-warning\";\r\n case \"Error\":\r\n return \"icon-status-fail\";\r\n case \"Running\":\r\n return \"icon-playback-circled-play\";\r\n default:\r\n return \"icon-status-unknown\";\r\n }\r\n }\r\n\r\n showTaskLog(jobNr: number, latestRun: Date) {\r\n new AppKitchen.FrameManager.AppHolder(MiniProcessMonitoringApp)\r\n .startInWindow({\r\n width: \"80%\",\r\n height: \"80%\",\r\n easyClose: true,\r\n modal: true\r\n }, {\r\n jobName: this.model.get().jobName,\r\n jobNr: jobNr,\r\n latestRun: latestRun\r\n });\r\n }\r\n\r\n startJob() {\r\n AppKitchen.UIHelper.hideTooltips();\r\n\r\n if (this.model.get().startStatus !== \"initial\") {\r\n return;\r\n }\r\n\r\n this.model.set({ startStatus: \"starting\" });\r\n\r\n this.model.updateLatestRun(() => {\r\n if (this.model.get().latestRunResult === \"Running\") {\r\n AppKitchen.UIHelper.DialogBoxes.confirm(\"Der Job \" + this.model.get().jobName + \" ist gerade in Arbeit. Wollen Sie trotzdem eine neue Instanz starten?\", () => {\r\n this.model.startJob(this.handleJobStartError.bind(this));\r\n },\r\n {\r\n cancel: () => this.model.set({ startStatus: \"initial\" })\r\n });\r\n } else {\r\n this.model.startJob(this.handleJobStartError.bind(this));\r\n }\r\n });\r\n }\r\n\r\n handleJobStartError(requestData?: any, xhr?: JQueryXHR, statusText?: string) {\r\n this.buttons.jobStart\r\n .kendoTooltip({\r\n position: \"top\",\r\n content: xhr && xhr.statusText === \"APPKITCHEN_ERROR\"\r\n ? xhr.responseText\r\n : \"Ein technischer Fehler ist aufgetreten. Weitere Informationen in der Konsole des Browsers (F12).\"\r\n });\r\n }\r\n\r\n activateLatestRunUpdate() {\r\n var uid = AppKitchen.StringHelper.generateRandom(40);\r\n this.$el.attr(\"data-uid\", uid);\r\n var handler = setInterval(() => {\r\n if (this.$el.closest(\"body\").length === 0 || this.$el.attr(\"data-uid\") !== uid) {\r\n clearInterval(handler);\r\n } else {\r\n this.model.updateLatestRun();\r\n }\r\n }, 5000);\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface MiniProcessMonitoringAppOptions extends AppKitchen.AppBaseOptions {\r\n jobNr: number;\r\n jobName: string;\r\n latestRun: Date;\r\n }\r\n\r\n export class MiniProcessMonitoringApp extends AppKitchen.AppBase {\r\n processMonitoringGrid: ProcessMonitoringGrid;\r\n datePickerModel: AppKitchen.Controls.DateRangePickerModel;\r\n\r\n start() {\r\n AppKitchen.UIHelper.renderLoader(this.el);\r\n\r\n setTimeout(() => {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el,\r\n AppKitchen.Templates.JobStarterProcessMonitoringApp,\r\n {\r\n title: this.options.jobName\r\n });\r\n var datePickerContainer = this.$el.find(\".a-job-starter-pm-date-picker\")[0];\r\n var processMonitoringGridContainer = this.$el.find(\".a-job-starter-pm-grids-container\")[0];\r\n this.$el.find(\".a-job-starter-pm-filter-picker\").remove();\r\n $(processMonitoringGridContainer).css(\"margin\", \"0 25px 25px 25px\");\r\n\r\n this.datePickerModel = new AppKitchen.Controls.DateRangePickerModel();\r\n // ReSharper disable once UnusedLocals\r\n var datePickerView = new AppKitchen.Controls.DateRangePickerView(this.datePickerModel,\r\n datePickerContainer,\r\n {\r\n dayPickers: [],\r\n labels: {\r\n from: \"Begonnen zwischen:\",\r\n to: \"und:\"\r\n }\r\n });\r\n\r\n this.processMonitoringGrid = new ProcessMonitoringGrid(processMonitoringGridContainer,\r\n {\r\n field: \"RunBegin\",\r\n dir: \"desc\"\r\n });\r\n\r\n this.datePickerModel.bind(\"change:startDate change:endDate\", () => this.updateJobLog());\r\n this.datePickerModel.set({\r\n startDate: this.options.latestRun.onlyDate().addDays(-6),\r\n endDate: new Date().onlyDate()\r\n });\r\n\r\n AppKitchen.BrowserHelper.triggerWindowResizeEvent();\r\n },\r\n 500);\r\n }\r\n\r\n updateJobLog() {\r\n\r\n var filterSettings: AppKitchen.Api.Models.JobLogFilterSettings = {\r\n JobNrs: [this.options.jobNr]\r\n }\r\n\r\n var startDate = this.datePickerModel.get().startDate;\r\n var endDate = this.datePickerModel.get().endDate;\r\n\r\n if (startDate && endDate) {\r\n endDate = endDate.addDays(2).addMinutes(-1); // addDays(2) as Workaround for Framework bug\r\n\r\n filterSettings.RunBeginDynFrom = kendo.toString(startDate, \"yyyy-MM-ddTHH:mm:ss\");\r\n filterSettings.RunBeginDynTo = kendo.toString(endDate, \"yyyy-MM-ddTHH:mm:ss\");\r\n\r\n this.processMonitoringGrid.updateJobLog(filterSettings);\r\n }\r\n }\r\n\r\n dispose() {\r\n if (this.processMonitoringGrid) {\r\n this.processMonitoringGrid.dispose();\r\n }\r\n }\r\n }\r\n\r\n export class ProcessMonitoringGrid {\r\n $el: JQuery;\r\n el: HTMLElement;\r\n jobLogLoader: AppKitchen.Data.JobLogLoader;\r\n taskLogLoader: AppKitchen.Data.TaskLogLoader;\r\n jobLogGridModel: AppKitchen.Controls.Grids.JobLogGridModel;\r\n jobLogGridView: AppKitchen.Controls.Grids.GridView;\r\n taskLogGridModel: AppKitchen.Controls.Grids.TaskLogGridModel;\r\n\r\n constructor(targetContainer: HTMLElement, initialSort?: { field: string; dir: string; }) {\r\n this.el = targetContainer;\r\n this.$el = $(targetContainer);\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.JobStarterProcessMonitoringGrid);\r\n\r\n var jobLogGridContainer = this.$el.find(\".a-job-starter-pm-joblog-grid\")[0];\r\n var taskLogGridContainer = this.$el.find(\".a-job-starter-pm-tasklog-grid\")[0];\r\n\r\n this.jobLogLoader = new AppKitchen.Data.JobLogLoader();\r\n this.jobLogGridModel = new AppKitchen.Controls.Grids.JobLogGridModel(this.jobLogLoader);\r\n this.jobLogGridView = new AppKitchen.Controls.Grids.GridView(this.jobLogGridModel, jobLogGridContainer,\r\n {\r\n filterable: true,\r\n fillHeight: true,\r\n sortable: true,\r\n lazyShow: {\r\n initial: 100,\r\n more: 100\r\n },\r\n initialSort: initialSort || {\r\n field: \"PlannedSchedule\",\r\n dir: \"desc\"\r\n },\r\n noRecordsMessage: \"Keine Jobs in der aktuellen Ansicht\"\r\n });\r\n\r\n this.taskLogLoader = new AppKitchen.Data.TaskLogLoader();\r\n this.taskLogGridModel = new AppKitchen.Controls.Grids.TaskLogGridModel(this.taskLogLoader);\r\n // ReSharper disable once UnusedLocals\r\n var taskLogGridView = new AppKitchen.Controls.Grids.GridView(this.taskLogGridModel, taskLogGridContainer,\r\n {\r\n fillHeight: true,\r\n initialSort: {\r\n field: \"RunBegin\",\r\n dir: \"asc\"\r\n },\r\n noRecordsMessage: \"Keine Tasks für den ausgewählten Job\"\r\n });\r\n\r\n var splitter = this.$el.find(\".a-job-starter-pm-grids-wrapper\").kendoSplitter({\r\n orientation: \"vertical\",\r\n panes: [\r\n { collapsible: false, min: \"30%\" },\r\n { collapsible: false, min: \"20%\" }\r\n ],\r\n layoutChange: () => AppKitchen.UIHelper.updateFullHeightGrids()\r\n }).data(\"kendoSplitter\");\r\n\r\n splitter.size(\".k-pane:first\", \"70%\");\r\n\r\n this.jobLogGridView.grid.bind(\"change\", () => this.updateTaskLog());\r\n }\r\n\r\n updateJobLog(filterSettings: AppKitchen.Api.Models.JobLogFilterSettings) {\r\n if (filterSettings) {\r\n this.taskLogGridModel.set({ loading: true });\r\n this.jobLogLoader.loadLogs({\r\n FilterSettings: filterSettings\r\n },\r\n {\r\n success: data => {\r\n if (!data || data.length === 0) {\r\n this.taskLogGridModel.set({ loading: false });\r\n this.taskLogGridModel.setGridData([]);\r\n }\r\n this.jobLogGridView.selectRow(0, true);\r\n }\r\n });\r\n }\r\n }\r\n\r\n updateTaskLog() {\r\n var selectedData = this.jobLogGridView.grid.dataItem(this.jobLogGridView.grid.select());\r\n if (selectedData) {\r\n var jobLogNr = selectedData[\"PrimaryKey\"];\r\n if (jobLogNr) {\r\n this.taskLogLoader.loadLogs({ JobLogNr: jobLogNr });\r\n }\r\n }\r\n }\r\n\r\n dispose() {\r\n if (this.jobLogLoader) {\r\n this.jobLogLoader.abortRequest();\r\n }\r\n if (this.taskLogLoader) {\r\n this.taskLogLoader.abortRequest();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export class MapModel extends AppKitchen.ModelBase {\r\n constructor() {\r\n super();\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface MapViewOptions extends AppKitchen.ViewBaseOptions {\r\n extent?: ol.Extent,\r\n center?: ol.Coordinate,\r\n\r\n /** For bing always use your own API Key !! */\r\n backgroundLayerType?: \"osm\" | \"bing\" | \"bingAerial\" | \"stamenWatercolor\" | \"stamenWatercolorAndLabels\" | \"stamenToner\" | \"mapQuestRoad\" | \"localosm\";\r\n\r\n minZoom?: number;\r\n maxZoom?: number;\r\n\r\n /** Api Key for bing maps. Can be generated here: www.bingmapsportal.com. !!!DO NOT use bing maps without a key in production!!! */\r\n bingMapsKey?: string;\r\n /** The higher the number, the more detail you will see */\r\n zoom?: number;\r\n /** The reset zoom button will zoom back to the initial zoom level and center */\r\n showResetZoomButton?: boolean;\r\n\r\n showMapTypeButton?:boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface MarkerOptions {\r\n icon?: string,\r\n image?: string,\r\n iconDetailLeft?: string,\r\n iconDetailRight?: string,\r\n tooltipDetailLeft?: string,\r\n tooltipDetailRight?: string,\r\n label?: string,\r\n onClickMarker?: (e: any) => void,\r\n onClickDetailLeft?: (e: any) => void,\r\n onClickDetailRight?: (e: any) => void,\r\n }\r\n\r\n export class MapView extends AppKitchen.ViewBase {\r\n options: MapViewOptions;\r\n map: ol.Map;\r\n resetZoomHandlers: (() => void)[];\r\n markerCounter: number = 0;\r\n currentBackgroundLayerType: string;\r\n\r\n constructor(mapModel: MapModel, targetContainer: HTMLElement, options?: MapViewOptions) {\r\n super(mapModel, targetContainer, OptionsHelper.merge(options,\r\n {\r\n bingMapsKey: \"ApNj3yaTwQ6MeX9xd1s_MK50-tf8lDPDB5oMGyCTPwmFFxRWkgDzlAYT2dRi_PuK\", // Development Key created by Matthias Schallenmüller\r\n backgroundLayerType: \"osm\",\r\n minZoom: 7,\r\n showResetZoomButton: false,\r\n showMapTypeButton: false,\r\n maxZoom: 17,\r\n zoom: 12,\r\n center: [8.404537, 49.014010], //Karlsruhe\r\n extent: [-15.357039, 58.913061, 54.249133, 36.793348] //Europa\r\n }));\r\n\r\n this.options.extent = ol.proj.transformExtent(this.options.extent, 'EPSG:4326', 'EPSG:3857');\r\n this.options.center = ol.proj.transform(this.options.center, 'EPSG:4326', 'EPSG:3857');\r\n this.currentZoomLevel = -1;\r\n this.resetZoomHandlers = [];\r\n this.render();\r\n }\r\n\r\n currentZoomLevel: number;\r\n render() {\r\n var layers: ol.layer.Layer[] = [];\r\n\r\n this.addBackgroundLayer(layers);\r\n\r\n var view = new ol.View({\r\n projection: 'EPSG:3857',\r\n extent: this.options.extent,\r\n maxZoom: this.options.maxZoom,\r\n minZoom: this.options.minZoom,\r\n center: this.options.center,\r\n zoom: this.options.zoom\r\n });\r\n\r\n var attribution = new ol.control.Attribution({\r\n collapsible: false\r\n });\r\n this.map = new ol.Map({\r\n layers: layers,\r\n target: this.el,\r\n controls: ol.control.defaults({ attribution: false }).extend([attribution]),\r\n view: view\r\n });\r\n\r\n\r\n if (this.options.showResetZoomButton) {\r\n this.addCustomControl(\"
      \", \"Reset View\", () => {\r\n this.resetZoomAndCenter();\r\n this.resetZoomHandlers.AsLinq<()=>void>().ForEach(handler => handler());\r\n });\r\n }\r\n\r\n if (this.options.showMapTypeButton) {\r\n this.addCustomControl(\"
      \", \"Switch Map\", () => {\r\n this.changeMapType();\r\n });\r\n }\r\n\r\n this.createTooltips();\r\n }\r\n\r\n showChangeMapTypeMenu() {\r\n var dropdownMenu = this.$el.find(\".ol-map-type-change-dropdown\");\r\n if (dropdownMenu.is(\":visible\")) {\r\n dropdownMenu.hide();\r\n } else {\r\n dropdownMenu.show();\r\n }\r\n }\r\n\r\n changeMapType() {\r\n if (this.currentBackgroundLayerType === \"osm\" || !this.currentBackgroundLayerType) {\r\n this.currentBackgroundLayerType = \"bingAerial\";\r\n } else if (this.currentBackgroundLayerType === \"bingAerial\") {\r\n this.currentBackgroundLayerType = \"osm\";\r\n }\r\n\r\n var layer;\r\n if (this.currentBackgroundLayerType === \"bingAerial\") {\r\n layer = new ol.layer.Tile({ source: new ol.source.BingMaps({ key: this.options.bingMapsKey, imagerySet: 'AerialWithLabels', projection: \"EPSG:3857\" }) });\r\n } else {\r\n layer = new ol.layer.Tile({ source: new ol.source.OSM({ projection: \"EPSG:3857\" }) });\r\n }\r\n this.map.getLayers().setAt(0, layer);\r\n }\r\n\r\n createTooltips() {\r\n this.$el.find(\".ol-zoom\").find(\":button\").each((i, e) => this.createTooltip($(e), \"right\"));\r\n }\r\n\r\n createTooltip(e: JQuery, position: string) {\r\n if (e.attr(\"title\")) {\r\n e.kendoTooltip({ position: position });\r\n\r\n e.bind(\"mouseleave\", () => {\r\n AppKitchen.UIHelper.hideTooltips();\r\n });\r\n }\r\n }\r\n\r\n \r\n resetZoom(handler: () => void) {\r\n this.resetZoomHandlers.push(handler);\r\n }\r\n\r\n /**\r\n * Calculates the coordinate based on the given [coordinate] and the x and y offset in pixels.\r\n * THIS ONLY WORKS IF THE MAP IS RENDERED. DO NOT SET THE ZOOM LEVEL AND THEN CALL THIS METHOD. WAIT UNTILL THE MAP IS RENDERED!!!\r\n * @param xPixelOffset offset in pixels\r\n * @param yPixelOffset offset in pixels\r\n * @param coordinate The coordinate in EPSG:4326 \r\n */\r\n getCoordinateWithOffset(xPixelOffset: number, yPixelOffset: number, coordinate: ol.Coordinate) {\r\n var coord = ol.proj.transform(coordinate, 'EPSG:4326', 'EPSG:3857');\r\n var pixelCoord = this.map.getPixelFromCoordinate(coord);\r\n var newPixelCoord = [pixelCoord[0] - xPixelOffset, pixelCoord[1] - yPixelOffset];\r\n var newCoord = this.map.getCoordinateFromPixel(newPixelCoord);\r\n return ol.proj.transform(newCoord, 'EPSG:3857', 'EPSG:4326');\r\n }\r\n\r\n\r\n /**\r\n * Sets the maps center and zoom level to initial values\r\n */\r\n resetZoomAndCenter(duration?: number) {\r\n duration = duration && duration >= 0? duration : 2000;\r\n\r\n if (duration > 0) {\r\n this.map.beforeRender(ol.animation.zoom({ duration: duration, resolution: this.map.getView().getResolution() }));\r\n this.map.beforeRender(ol.animation.pan({ duration: duration, source: this.map.getView().getCenter() }));\r\n }\r\n \r\n this.map.getView().setZoom(this.options.zoom);\r\n this.map.getView().setCenter(this.options.center);\r\n }\r\n\r\n /**\r\n * Adds a custom control to the map the control will have the same style as the zoom-in/zoom-out buttons of openlayers\r\n * @param html the html rendered within the button\r\n * @param title the title that will be used to create the tooltip\r\n * @param onClick the handler for the click event\r\n */\r\n addCustomControl(html: string, title: string, onClick: () => void) {\r\n var titleArg = \"\";\r\n if (title) {\r\n titleArg = ` title = '${title}'`;\r\n }\r\n var button = $(``);\r\n button.html(html);\r\n button.click(onClick);\r\n this.$el.find(\".ol-zoom\").append(button);\r\n }\r\n\r\n refreshAll() {\r\n this.map.updateSize();\r\n }\r\n\r\n /**\r\n * Centers the map\r\n * @param coordinate The coordinate in EPSG:4326 (google projection)\r\n * @param animate animate the zoom action (the action will need 250ms to finish)\r\n */\r\n setCenter(coordinate: ol.Coordinate, animate?: boolean) {\r\n if (animate) {\r\n this.map.beforeRender(ol.animation.pan({ duration: 250, source: this.map.getView().getCenter(), easing: ol.easing.inAndOut }));\r\n }\r\n var transformedCoordinate = ol.proj.transform(coordinate, 'EPSG:4326', 'EPSG:3857');\r\n this.map.getView().setCenter(transformedCoordinate);\r\n }\r\n\r\n /**\r\n * Sets the zoom level\r\n * @param zoom number between 1 and 19 .. the higher the number the more details will be shown\r\n * @param animate animate the zoom action (the action will need 250ms to finish)\r\n */\r\n setZoomLevel(zoom: number, animate?: boolean) {\r\n if (animate) {\r\n this.map.beforeRender(ol.animation.zoom({ duration: 250, resolution: this.map.getView().getResolution(), easing: ol.easing.inAndOut }));\r\n }\r\n\r\n this.map.getView().setZoom(zoom);\r\n }\r\n\r\n /**\r\n * Zooms out to [zoomOuter] then moves to [newCenter] and zooms in to [zoom]\r\n * @param zoom the new zoom level, number between 1 and 19 .. the higher the number the more details will be shown\r\n * @param zoomOuter first the map will zoom to this zoom level, number between 1 and 19 .. the higher the number the more details will be shown\r\n * @param newCenter the new center point in EPSG:4326 (google projection)\r\n */\r\n setCenterAndZoomAnimated(zoom: number, zoomOuter: number, newCenter: ol.Coordinate) {\r\n\r\n\r\n this.map.beforeRender(ol.animation.zoom({ duration: 700, resolution: this.map.getView().getResolution(), easing: ol.easing.inAndOut }));\r\n this.map.getView().setZoom(zoomOuter);\r\n\r\n\r\n\r\n this.map.beforeRender(ol.animation.pan({ duration: 1400, source: this.map.getView().getCenter(), easing: ol.easing.inAndOut }));\r\n var transformedCoordinate = ol.proj.transform(newCenter, 'EPSG:4326', 'EPSG:3857');\r\n this.map.getView().setCenter(transformedCoordinate);\r\n\r\n\r\n window.setTimeout(() => {\r\n this.map.beforeRender(ol.animation.zoom({ duration: 700, resolution: this.map.getView().getResolution(), easing: ol.easing.inAndOut }));\r\n this.map.getView().setZoom(zoom);\r\n },\r\n 700);\r\n }\r\n\r\n\r\n /**\r\n * Adds an Overlay to the map. The Overlay will stay in its dimensions and will not\r\n * shrink or grow when zoomlevel is changing\r\n * \r\n * @param overlay The html element that should be placed on the map\r\n * @param coordinate The coordinate in EPSG:4326 (google projection)\r\n * @param offset Offsets in pixels used when positioning the overlay. The fist element in the array is the horizontal offset. A positive value shifts the overlay right. The second element in the array is the vertical offset. A positive value shifts the overlay down. Default is [0, 0].\r\n */\r\n addOverlay(overlay: HTMLElement, coordinate: ol.Coordinate, offset?: Array) {\r\n var olOverlay = new ol.Overlay({\r\n position: ol.proj.transform(coordinate,'EPSG:4326','EPSG:3857'),\r\n offset: offset,\r\n positioning: \"top-left\",\r\n element: overlay\r\n });\r\n\r\n this.map.addOverlay(olOverlay);\r\n }\r\n\r\n addMarker(coordinate: ol.Coordinate, options: MarkerOptions) {\r\n var marker = $(AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.MapMarker,\r\n {\r\n id: `Marker_${this.markerCounter++}`,\r\n icon: options.icon,\r\n image: options.image,\r\n label: options.label,\r\n iconDetailLeft: options.iconDetailLeft,\r\n iconDetailRight: options.iconDetailRight,\r\n tooltipDetailLeft: options.tooltipDetailLeft,\r\n tooltipDetailRight: options.tooltipDetailRight\r\n }));\r\n this.addOverlay(marker[0], coordinate);\r\n\r\n if (options && options.onClickMarker) {\r\n marker.find(\".a-map-marker\").click((e) => options.onClickMarker(e));\r\n }\r\n if (options && options.onClickDetailLeft) {\r\n let detail = marker.find(\".a-marker-detail-left\");\r\n detail.click((e) => options.onClickDetailLeft(e));\r\n if (options.tooltipDetailLeft) {\r\n this.createTooltip(detail, \"top\");\r\n }\r\n }\r\n if (options && options.onClickDetailRight) {\r\n let detail = marker.find(\".a-marker-detail-right\"); \r\n detail.click((e) => options.onClickDetailRight(e));\r\n if (options.tooltipDetailRight) {\r\n this.createTooltip(detail, \"top\");\r\n }\r\n }\r\n }\r\n\r\n addBackgroundLayer(layers: ol.layer.Layer[]) {\r\n var requestedType = this.options.backgroundLayerType;\r\n\r\n\r\n // bing \r\n if (requestedType === \"bing\") {\r\n layers.push(new ol.layer.Tile({ source: new ol.source.BingMaps({ key: this.options.bingMapsKey, imagerySet: 'Road', projection: \"EPSG:3857\" }) }));\r\n }\r\n\r\n // bing with sattelite imagery\r\n else if (requestedType === \"bingAerial\") {\r\n layers.push(new ol.layer.Tile({ source: new ol.source.BingMaps({ key: this.options.bingMapsKey, imagerySet: 'AerialWithLabels', projection: \"EPSG:3857\" }) }));\r\n }\r\n\r\n // whatercolor \r\n else if (requestedType === \"stamenWatercolor\" || requestedType === \"stamenWatercolorAndLabels\") {\r\n layers.push(new ol.layer.Tile({ source: new ol.source.Stamen({ layer: 'watercolor', projection: \"EPSG:3857\" }) }));\r\n if (requestedType === \"stamenWatercolorAndLabels\") {\r\n layers.push(new ol.layer.Tile({ source: new ol.source.Stamen({ layer: 'terrain-labels', projection: \"EPSG:3857\" }) }));\r\n }\r\n }\r\n\r\n // toner\r\n else if (requestedType === \"stamenToner\") {\r\n layers.push(new ol.layer.Tile({ source: new ol.source.Stamen({ layer: 'toner', projection: \"EPSG:3857\" }) }));\r\n }\r\n\r\n // highlighted road\r\n else if (requestedType === \"mapQuestRoad\") {\r\n layers.push(new ol.layer.Tile({ source: new ol.source.MapQuest({ layer: 'osm', projection: \"EPSG:3857\" }) }));\r\n }\r\n\r\n // local osm tiles\r\n else if (requestedType === \"localosm\") {\r\n layers.push(new ol.layer.Tile({source: new ol.source.OSM({url: 'osmtiles/{z}/{x}/{y}.png'})}));\r\n }\r\n\r\n // default osm tiles\r\n else{\r\n layers.push(new ol.layer.Tile({ source: new ol.source.OSM({ projection: \"EPSG:3857\"}) }));\r\n }\r\n\r\n \r\n }\r\n\r\n }\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Menus {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface MenuItem {\r\n id: string;\r\n label: string;\r\n reference?: any;\r\n description?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface VerticalMenuOptions {\r\n sort?: boolean;\r\n routingParameter?: string;\r\n routingHistory?: boolean;\r\n tooltip?: boolean | ((menuItem: MenuItem) => string);\r\n documentTitleBase?: string;\r\n customScroller?: boolean;\r\n autoSelect?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface VerticalMenuAttributes extends AppKitchen.ModelBaseAttributes {\r\n selectedItem?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface VerticalMenuFilterOptions {\r\n operator?: \"AND\" | \"OR\";\r\n noResultsMessage?: string;\r\n }\r\n\r\n export class VerticalMenu extends AppKitchen.ModelBase {\r\n menuItems: MenuItem[];\r\n menuItemsDict: {[id: string]: MenuItem};\r\n el: HTMLElement;\r\n $el: JQuery;\r\n options: VerticalMenuOptions;\r\n scroller: HTMLElement;\r\n\r\n constructor(targetContainer: HTMLElement, menuItems: MenuItem[], options?: VerticalMenuOptions) {\r\n super({\r\n selectedItem: \"\"\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n sort: false,\r\n customScroller: true,\r\n tooltip: null,\r\n routingParameter: null,\r\n routingHistory: options && !!options.routingParameter,\r\n documentTitleBase: null,\r\n autoSelect: true\r\n });\r\n\r\n if (this.options.sort) {\r\n menuItems.sort((a, b) => a.label.toUpperCase() < b.label.toUpperCase() ? -1 : 1);\r\n }\r\n\r\n if (!menuItems || menuItems.length === 0) {\r\n console.log(\"Menu items not defined or empty\");\r\n return;\r\n }\r\n\r\n this.menuItems = menuItems;\r\n this.updateMenuItemsDict();\r\n this.el = targetContainer;\r\n this.$el = $(targetContainer);\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.VerticalMenu, { items: this.menuItems });\r\n\r\n this.updateScroller();\r\n\r\n if (this.options.tooltip) {\r\n this.$el.find(\"li\").each((i, e) => {\r\n if (typeof this.options.tooltip === \"function\") {\r\n var tooltipContent = (<(menuItem: MenuItem) => string>this.options.tooltip)(this.menuItems[i]);\r\n if (tooltipContent) {\r\n $(e).kendoTooltip({\r\n position: \"right\",\r\n content: tooltipContent,\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n } else if (this.options.tooltip === true && this.menuItems[i].description) {\r\n $(e).kendoTooltip({\r\n position: \"right\",\r\n content: this.menuItems[i].description,\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n });\r\n }\r\n\r\n this.bind(\"change:selectedItem\", () => this.highlightSelected());\r\n\r\n if (this.options.autoSelect) {\r\n if (!this.trySetSelectedItemFromUrlQuery()) {\r\n var firstItem = this.$el.find(\"li[data-id]\").first();\r\n if (firstItem) {\r\n this.set({ selectedItem: firstItem.attr(\"data-id\") });\r\n this.updateRoute(firstItem.attr(\"data-id\"), false);\r\n }\r\n }\r\n }\r\n\r\n this.$el.find(\"li[data-id]\").click(e => this.onClick(e));\r\n }\r\n\r\n clearSelection(options?: AppKitchen.BrowserHelper.RedirectOptions) {\r\n this.set({ selectedItem: null });\r\n if (this.options.routingParameter) {\r\n AppKitchen.BrowserHelper.UrlQuery.removeParameter(this.options.routingParameter, AppKitchen.OptionsHelper.merge(options, {\r\n push: false,\r\n refresh: false\r\n }));\r\n }\r\n }\r\n\r\n protected updateMenuItemsDict() {\r\n this.menuItemsDict = {};\r\n if (this.menuItems) {\r\n this.menuItems.forEach(item => {\r\n this.menuItemsDict[item.id] = item;\r\n });\r\n }\r\n }\r\n\r\n protected updateScroller() {\r\n if (this.options.customScroller) {\r\n AppKitchen.UIHelper.Scrolling.customScroller(this.$el.find(\".a-vertical-menu-wrapper\")[0]);\r\n this.scroller = this.$el.find(\".a-vertical-menu\")[0];\r\n } else {\r\n this.scroller = this.$el.find(\".a-vertical-menu-wrapper\")[0];\r\n }\r\n }\r\n\r\n onClick(e: JQueryEventObject) {\r\n var selectedId = $(e.target).attr(\"data-id\");\r\n if (selectedId) {\r\n this.set({ selectedItem: selectedId });\r\n this.updateRoute(selectedId, true);\r\n }\r\n }\r\n\r\n protected updateRoute(selectedId: string, history: boolean) {\r\n\r\n if (this.options.routingParameter && AppKitchen.BrowserHelper.UrlQuery.getParameters()[this.options.routingParameter] !== selectedId) {\r\n AppKitchen.BrowserHelper.UrlQuery.setParameter(this.options.routingParameter, selectedId, { push: history && this.options.routingHistory });\r\n }\r\n\r\n if (this.options.documentTitleBase) {\r\n var selectedLabel = this.$el.find(\"li.a-selected\").text();\r\n document.title = selectedLabel + \" - \" + this.options.documentTitleBase;\r\n }\r\n }\r\n\r\n protected trySetSelectedItemFromUrlQuery() {\r\n var urlQuery = AppKitchen.BrowserHelper.UrlQuery.getParameters();\r\n var parameter = urlQuery[this.options.routingParameter];\r\n if (this.options.routingParameter && parameter) {\r\n if (this.menuItemsDict[parameter]) {\r\n this.set({ selectedItem: parameter });\r\n this.updateRoute(parameter, false);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected highlightSelected() {\r\n this.$el.find(\"li\").removeClass(\"a-selected\");\r\n var selectedId = this.get().selectedItem;\r\n if (selectedId) {\r\n var el = this.$el.find('li[data-id=\"' + selectedId + '\"]');\r\n if (el.length === 1) {\r\n el.addClass(\"a-selected\");\r\n setTimeout(() => AppKitchen.UIHelper.Scrolling.scrollIntoViewport(el[0], this.scroller), 100);\r\n }\r\n }\r\n }\r\n\r\n onSelected(selected: (menuItem: MenuItem) => void) {\r\n if (this.get().selectedItem) {\r\n selected(this.getSelectedItem());\r\n }\r\n this.on(\"change:selectedItem\", () => {\r\n selected(this.getSelectedItem());\r\n });\r\n }\r\n\r\n getSelectedItem(): MenuItem {\r\n if (this.get().selectedItem) {\r\n return this.menuItemsDict[this.get().selectedItem];\r\n }\r\n return null;\r\n }\r\n\r\n filter(query: string, options?: VerticalMenuFilterOptions) {\r\n\r\n var filterOptions = AppKitchen.OptionsHelper.merge(options, {\r\n operator: \"AND\",\r\n noResultsMessage: undefined\r\n });\r\n\r\n if (filterOptions.noResultsMessage) {\r\n this.$el.find(\".a-verticalmenu-noresults-message\").html(filterOptions.noResultsMessage);\r\n }\r\n\r\n query = query || \"\";\r\n var queries = query.split(\" \").AsLinq().Where(q => !!q).Select(q => q.toUpperCase()).ToArray();\r\n var $items = this.$el.find(\"ul.a-vertical-menu > li\");\r\n\r\n if (queries.length === 0) {\r\n $items.removeClass(\"a-hidden\");\r\n } else {\r\n $items.each((i, e) => {\r\n var label = $(e).text().toUpperCase();\r\n var hit = true;\r\n if (filterOptions.operator === \"AND\") {\r\n queries.forEach(query => { if (label.indexOf(query) === -1) { hit = false; } });\r\n $(e).toggleClass(\"a-hidden\", !hit);\r\n } else {\r\n hit = false;\r\n queries.forEach(query => { if (label.indexOf(query) !== -1) { hit = true; } });\r\n }\r\n\r\n $(e).toggleClass(\"a-hidden\", !hit);\r\n });\r\n }\r\n\r\n if (filterOptions.noResultsMessage) {\r\n this.$el.find(\"ul.a-vertical-menu\").toggleClass(\"a-filter-noresults\", $items.filter(\":not(.a-hidden)\").length === 0);\r\n }\r\n\r\n this.updateScroller();\r\n this.highlightSelected();\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n }\r\n}\r\n","///\r\n\r\nmodule AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Menus {\r\n\r\n export class VerticalMenuWrapper extends VerticalMenu {\r\n \r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CombinedVerticalMenuItem {\r\n id: string;\r\n\r\n setTarget(el: HTMLElement);\r\n render();\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CombinedVerticalAttributes extends AppKitchen.ModelBaseAttributes {\r\n selectedItem?: string;\r\n }\r\n\r\n export class CombinedVerticalMenuModel extends AppKitchen.ModelBase {\r\n \r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CombinedVerticalMenuViewOptions extends AppKitchen.ViewBaseOptions {\r\n menuItems: CombinedVerticalMenuItem[],\r\n }\r\n\r\n export class CombinedVerticalMenuView extends AppKitchen.ViewBase {\r\n options: CombinedVerticalMenuViewOptions;\r\n\r\n constructor(model: SearchMenuModel, target: HTMLElement, options?: CombinedVerticalMenuViewOptions) {\r\n super(model, target, options);\r\n this.options = options;\r\n\r\n this.setTemplate(AppKitchen.Templates.CombinedVerticalMenu);\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n var index = 0;\r\n for (let menuItem of this.options.menuItems) {\r\n menuItem.id = `MenuItem_${index++}`;\r\n }\r\n\r\n this.renderTemplate({ items: this.options.menuItems });\r\n\r\n index = 0;\r\n for (let menuItem of this.options.menuItems) {\r\n var e = this.$el.find(`#${index++}`)[0];\r\n menuItem.setTarget(e);\r\n menuItem.render();\r\n }\r\n }\r\n }\r\n/*\r\n // ReSharper disable once InconsistentNaming\r\n export interface MenuItem {\r\n id: string;\r\n label: string;\r\n reference?: any;\r\n description?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface VerticalMenuOptions {\r\n sort?: boolean;\r\n routingParameter?: string;\r\n routingHistory?: boolean;\r\n tooltip?: boolean | ((menuItem: MenuItem) => string);\r\n documentTitleBase?: string;\r\n customScroller?: boolean;\r\n autoSelect?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface VerticalMenuAttributes {\r\n selectedItem?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface VerticalMenuFilterOptions {\r\n operator?: \"AND\" | \"OR\";\r\n noResultsMessage?: string;\r\n }\r\n\r\n export class VerticalMenu extends AppKitchen.ModelBase {\r\n menuItems: MenuItem[];\r\n menuItemsDict: {[id: string]: MenuItem};\r\n el: HTMLElement;\r\n $el: JQuery;\r\n options: VerticalMenuOptions;\r\n scroller: HTMLElement;\r\n\r\n constructor(targetContainer: HTMLElement, menuItems: MenuItem[], options?: VerticalMenuOptions) {\r\n super({\r\n selectedItem: \"\"\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n sort: false,\r\n customScroller: true,\r\n tooltip: null,\r\n routingParameter: null,\r\n routingHistory: options && !!options.routingParameter,\r\n documentTitleBase: null,\r\n autoSelect: true\r\n });\r\n\r\n if (this.options.sort) {\r\n menuItems.sort((a, b) => a.label.toUpperCase() < b.label.toUpperCase() ? -1 : 1);\r\n }\r\n\r\n if (!menuItems || menuItems.length === 0) {\r\n console.log(\"Menu items not defined or empty\");\r\n return;\r\n }\r\n\r\n this.menuItems = menuItems;\r\n this.updateMenuItemsDict();\r\n this.el = targetContainer;\r\n this.$el = $(targetContainer);\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.VerticalMenu, { items: this.menuItems });\r\n\r\n this.updateScroller();\r\n\r\n if (this.options.tooltip) {\r\n this.$el.find(\"li\").each((i, e) => {\r\n if (typeof this.options.tooltip === \"function\") {\r\n var tooltipContent = (<(menuItem: MenuItem) => string>this.options.tooltip)(menuItems[i]);\r\n if (tooltipContent) {\r\n $(e).kendoTooltip({\r\n position: \"right\",\r\n content: tooltipContent,\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n } else if (this.options.tooltip === true && menuItems[i].description) {\r\n $(e).kendoTooltip({\r\n position: \"right\",\r\n content: menuItems[i].description,\r\n show: e => AppKitchen.UIHelper.hideTooltips(e.sender)\r\n });\r\n }\r\n });\r\n }\r\n\r\n this.bind(\"change:selectedItem\", () => this.highlightSelected());\r\n\r\n if (this.options.autoSelect) {\r\n if (!this.trySetSelectedItemFromUrlQuery()) {\r\n var firstItem = this.$el.find(\"li[data-id]\").first();\r\n if (firstItem) {\r\n this.set({ selectedItem: firstItem.attr(\"data-id\") });\r\n this.updateRoute(firstItem.attr(\"data-id\"), false);\r\n }\r\n }\r\n }\r\n\r\n this.$el.find(\"li[data-id]\").click(e => this.onClick(e));\r\n }\r\n\r\n clearSelection(options?: AppKitchen.BrowserHelper.RedirectOptions) {\r\n this.set({ selectedItem: null });\r\n if (this.options.routingParameter) {\r\n AppKitchen.BrowserHelper.UrlQuery.removeParameter(this.options.routingParameter, AppKitchen.OptionsHelper.merge(options, {\r\n push: false,\r\n refresh: false\r\n }));\r\n }\r\n }\r\n\r\n protected updateMenuItemsDict() {\r\n this.menuItemsDict = {};\r\n if (this.menuItems) {\r\n this.menuItems.forEach(item => {\r\n this.menuItemsDict[item.id] = item;\r\n });\r\n }\r\n }\r\n\r\n protected updateScroller() {\r\n if (this.options.customScroller) {\r\n AppKitchen.UIHelper.Scrolling.customScroller(this.$el.find(\".a-vertical-menu-wrapper\")[0]);\r\n this.scroller = this.$el.find(\".a-vertical-menu\")[0];\r\n } else {\r\n this.scroller = this.$el.find(\".a-vertical-menu-wrapper\")[0];\r\n }\r\n }\r\n\r\n onClick(e: JQueryEventObject) {\r\n var selectedId = $(e.target).attr(\"data-id\");\r\n if (selectedId) {\r\n this.set({ selectedItem: selectedId });\r\n this.updateRoute(selectedId, true);\r\n }\r\n }\r\n\r\n protected updateRoute(selectedId: string, history: boolean) {\r\n\r\n if (this.options.routingParameter && AppKitchen.BrowserHelper.UrlQuery.getParameters()[this.options.routingParameter] !== selectedId) {\r\n AppKitchen.BrowserHelper.UrlQuery.setParameter(this.options.routingParameter, selectedId, { push: history && this.options.routingHistory });\r\n }\r\n\r\n if (this.options.documentTitleBase) {\r\n var selectedLabel = this.$el.find(\"li.a-selected\").text();\r\n document.title = selectedLabel + \" - \" + this.options.documentTitleBase;\r\n }\r\n }\r\n\r\n protected trySetSelectedItemFromUrlQuery() {\r\n var urlQuery = AppKitchen.BrowserHelper.UrlQuery.getParameters();\r\n var parameter = urlQuery[this.options.routingParameter];\r\n if (this.options.routingParameter && parameter) {\r\n if (this.menuItemsDict[parameter]) {\r\n this.set({ selectedItem: parameter });\r\n this.updateRoute(parameter, false);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected highlightSelected() {\r\n this.$el.find(\"li\").removeClass(\"a-selected\");\r\n var selectedId = this.get().selectedItem;\r\n if (selectedId) {\r\n var el = this.$el.find('li[data-id=\"' + selectedId + '\"]');\r\n if (el.length === 1) {\r\n el.addClass(\"a-selected\");\r\n setTimeout(() => AppKitchen.UIHelper.Scrolling.scrollIntoViewport(el[0], this.scroller), 100);\r\n }\r\n }\r\n }\r\n\r\n onSelected(selected: (menuItem: MenuItem) => void) {\r\n if (this.get().selectedItem) {\r\n selected(this.getSelectedItem());\r\n }\r\n this.on(\"change:selectedItem\", () => {\r\n selected(this.getSelectedItem());\r\n });\r\n }\r\n\r\n getSelectedItem(): MenuItem {\r\n if (this.get().selectedItem) {\r\n return this.menuItemsDict[this.get().selectedItem];\r\n }\r\n return null;\r\n }\r\n\r\n filter(query: string, options?: VerticalMenuFilterOptions) {\r\n\r\n var filterOptions = AppKitchen.OptionsHelper.merge(options, {\r\n operator: \"AND\",\r\n noResultsMessage: undefined\r\n });\r\n\r\n if (filterOptions.noResultsMessage) {\r\n this.$el.find(\".a-verticalmenu-noresults-message\").html(filterOptions.noResultsMessage);\r\n }\r\n\r\n query = query || \"\";\r\n var queries = query.split(\" \").AsLinq().Where(q => !!q).Select(q => q.toUpperCase()).ToArray();\r\n var $items = this.$el.find(\"ul.a-vertical-menu > li\");\r\n\r\n if (queries.length === 0) {\r\n $items.removeClass(\"a-hidden\");\r\n } else {\r\n $items.each((i, e) => {\r\n var label = $(e).text().toUpperCase();\r\n var hit = true;\r\n if (filterOptions.operator === \"AND\") {\r\n queries.forEach(query => { if (label.indexOf(query) === -1) { hit = false; } });\r\n $(e).toggleClass(\"a-hidden\", !hit);\r\n } else {\r\n hit = false;\r\n queries.forEach(query => { if (label.indexOf(query) !== -1) { hit = true; } });\r\n }\r\n\r\n $(e).toggleClass(\"a-hidden\", !hit);\r\n });\r\n }\r\n\r\n if (filterOptions.noResultsMessage) {\r\n this.$el.find(\"ul.a-vertical-menu\").toggleClass(\"a-filter-noresults\", $items.filter(\":not(.a-hidden)\").length === 0);\r\n }\r\n\r\n this.updateScroller();\r\n this.highlightSelected();\r\n }\r\n }*/\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Menus {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface SearchMenuAttributes extends AppKitchen.ModelBaseAttributes {\r\n\r\n }\r\n\r\n export class SearchMenuModel extends AppKitchen.ModelBase {\r\n \r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface SearchMenuViewOptions extends AppKitchen.ViewBaseOptions {\r\n menuItems: MenuItem[]\r\n }\r\n\r\n export class SearchMenuView extends AppKitchen.ViewBase {\r\n options: SearchMenuViewOptions;\r\n\r\n containers: {\r\n searchBox: HTMLElement,\r\n navigationMenu: HTMLElement,\r\n }\r\n\r\n constructor(model: SearchMenuModel, target: HTMLElement, options?: SearchMenuViewOptions) {\r\n super(model, target, options);\r\n this.options = options;\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el,\r\n AppKitchen.Templates.SearchMenu,\r\n { actionIcon: \"icon-info\" });\r\n\r\n this.containers = {\r\n searchBox: this.$el.find(\".a-searchbox-container\")[0],\r\n navigationMenu: this.$el.find(\".a-navigation-menu-container\")[0]\r\n }\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n var searchBoxModel = new AppKitchen.Controls.SearchBoxModel({ query: \"\" });\r\n // ReSharper disable once WrongExpressionStatement\r\n new AppKitchen.Controls.SearchBoxView(searchBoxModel, this.containers.searchBox, {\r\n placeholder: \"Suchen\"\r\n });\r\n\r\n var facilitiesMenu = new AppKitchen.Controls.Menus.VerticalMenu(this.containers.navigationMenu, this.options.menuItems, {\r\n customScroller: true,\r\n routingParameter: \"facility\",\r\n routingHistory: false,\r\n sort: true,\r\n autoSelect: false\r\n });\r\n\r\n searchBoxModel.onChange(query => {\r\n facilitiesMenu.filter(query);\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Controls {\r\n export module Panel {\r\n\r\n export class AccordionModel extends AppKitchen.ModelBase {\r\n\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface AccordionViewOptions extends AppKitchen.ViewBaseOptions {\r\n expandMode?: string,\r\n fieldTitles: string[],\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface Field {\r\n id: string,\r\n title: string,\r\n }\r\n\r\n export class AccordionView extends AppKitchen.ViewBase {\r\n options: AccordionViewOptions;\r\n\r\n fields: Field[];\r\n\r\n constructor(model: AccordionModel, target: HTMLElement, options?: AccordionViewOptions) {\r\n super(model, target, options);\r\n this.options = options;\r\n\r\n this.setTemplate(AppKitchen.Templates.Accordion);\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n this.renderTemplate({ fieldTitles: this.options.fieldTitles });\r\n\r\n this.fields = [];\r\n\r\n for (let i=0; i a.title === fieldTitle)[0].id)[0];\r\n }\r\n\r\n }\r\n\r\n }\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface SearchBoxAttributes extends AppKitchen.ModelBaseAttributes {\r\n query?: string;\r\n }\r\n\r\n export class SearchBoxModel extends AppKitchen.ModelBase {\r\n onChange(changed: (query: string) => void) {\r\n changed(this.get().query);\r\n this.bind(\"change:query\", () => {\r\n changed(this.get().query);\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface SearchBoxViewOptions extends AppKitchen.ViewBaseOptions{\r\n placeholder?: string;\r\n }\r\n\r\n export class SearchBoxView extends AppKitchen.ViewBase {\r\n input: JQuery;\r\n options: SearchBoxViewOptions;\r\n\r\n constructor(model: SearchBoxModel, targetContainer: HTMLElement, options?: SearchBoxViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n placeholder: Strings.SearchBox_Search\r\n }));\r\n this.render();\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, Templates.SearchBox, {\r\n placeholder: this.options.placeholder,\r\n query: this.model.get().query\r\n });\r\n\r\n var clearButton = this.$el.find(\".a-searchbox-clear\");\r\n this.input = this.$el.find(\"input.a-searchbox-input\");\r\n\r\n this.model.onChange(query => clearButton.toggle(!!query));\r\n\r\n clearButton.click(() => this.clearInput());\r\n\r\n var timeOutHandler: number = null;\r\n this.input.keyup(e => {\r\n if (timeOutHandler != null) {\r\n clearTimeout(timeOutHandler);\r\n }\r\n timeOutHandler = setTimeout(() => {\r\n this.model.set({ query: this.input.val() });\r\n timeOutHandler = null;\r\n }, 300);\r\n });\r\n }\r\n\r\n clearInput() {\r\n this.model.set({ query: \"\" });\r\n this.input.val(\"\");\r\n }\r\n }\r\n\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Tile {\r\n\r\n export enum TileStyle {\r\n Dark,\r\n Bright\r\n }\r\n\r\n export enum TileSize {\r\n M,\r\n L,\r\n S\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TileOptions extends AppKitchen.ViewBaseOptions {\r\n style?: TileStyle,\r\n size?: TileSize;\r\n click?: (e?: JQuery, route?: string) => void\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TileBaseAttributes extends AppKitchen.ModelBaseAttributes {\r\n id?: string;\r\n route?: string;\r\n icon?: string,\r\n image?: string,\r\n title: string,\r\n description?: string,\r\n options?: TileOptions,\r\n }\r\n\r\n export abstract class TileBaseModel extends AppKitchen.ModelBase {\r\n constructor(attributes: TTileAttributes) {\r\n super(attributes);\r\n }\r\n }\r\n\r\n export abstract class TileBaseView extends AppKitchen.ViewBase> {\r\n options: TileOptions;\r\n\r\n constructor(model: TileBaseModel, target: HTMLElement, template: string) {\r\n super(model, target, model.get().options);\r\n\r\n this.setTemplate(template);\r\n this.model.bind(\"change\", () => this.render());\r\n this.render();\r\n }\r\n\r\n public abstract render();\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TileListAttributes extends AppKitchen.ModelBaseAttributes {\r\n tileAttributes: TTileAttributes[],\r\n }\r\n\r\n export class TileListModel extends AppKitchen.ModelBase> {\r\n constructor(tileAttributes: TTileAttributes[]) {\r\n super({ tileAttributes: tileAttributes });\r\n }\r\n }\r\n\r\n export class TileListView extends AppKitchen.ViewBase> {\r\n\r\n constructor(model: TileListModel, target: HTMLElement,\r\n private createModel: (t: TTileAttributes) => TileBaseModel,\r\n private createView: (model: TileBaseModel, target: HTMLElement) => TileBaseView) {\r\n super(model, target, {});\r\n\r\n this.model.bind(\"change\", () => this.render());\r\n\r\n this.render(); \r\n }\r\n\r\n public render() {\r\n let tileAttributes = this.model.get().tileAttributes;\r\n\r\n let div = $('
      ');\r\n for (let tileAttribute of tileAttributes) {\r\n let tile = $('
      ');\r\n tile.appendTo(div);\r\n let model = this.createModel(tileAttribute);\r\n this.createView(model, tile[0]);\r\n }\r\n div.appendTo(this.$el);\r\n }\r\n }\r\n\r\n export class SimpleTileModel extends TileBaseModel {\r\n constructor(attributes: TileBaseAttributes) {\r\n super(attributes);\r\n }\r\n }\r\n\r\n export class SimpleTileView extends TileBaseView {\r\n constructor(model: SimpleTileModel, target: HTMLElement) {\r\n super(model, target, AppKitchen.Templates.SimpleTile);\r\n }\r\n\r\n public render() {\r\n let id = this.model.get().id ? this.model.get().id : GuidHelper.newGuid();\r\n let route = this.model.get().route;\r\n let title = this.model.get().title;\r\n let description = this.model.get().description;\r\n let image = this.model.get().image;\r\n let icon = this.model.get().icon;\r\n if (title && (image || icon)) {\r\n\r\n this.renderTemplate({\r\n id: id,\r\n icon: icon,\r\n image: image,\r\n title: title,\r\n description: description,\r\n style: TileStyle[this.options.style],\r\n size: TileSize[this.options.size],\r\n });\r\n\r\n if (this.options.click && route) {\r\n let el = this.$el.find(`.a-tile[data-id=${id}]`);\r\n el.bind(\"click\", () => this.options.click(el, route));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface StatusTileAttributes extends TileBaseAttributes {\r\n status?: string,\r\n statusIcon?: string,\r\n }\r\n\r\n export class StatusTileModel extends TileBaseModel {\r\n constructor(attributes: StatusTileAttributes) {\r\n super(attributes);\r\n }\r\n }\r\n\r\n export class StatusTileView extends TileBaseView {\r\n constructor(model: StatusTileModel, target: HTMLElement) {\r\n super(model, target, AppKitchen.Templates.StatusTile);\r\n }\r\n\r\n public render() {\r\n let id = this.model.get().id ? this.model.get().id : GuidHelper.newGuid();\r\n let route = this.model.get().route;\r\n let title = this.model.get().title;\r\n let description = this.model.get().description;\r\n let image = this.model.get().image;\r\n let icon = this.model.get().icon;\r\n let status = this.model.get().status;\r\n let statusIcon = this.model.get().statusIcon;\r\n if (title && (image || icon)) {\r\n\r\n this.renderTemplate({\r\n id: id,\r\n icon: icon,\r\n image: image,\r\n title: title,\r\n description: description,\r\n status: status,\r\n statusIcon: statusIcon,\r\n style: TileStyle[this.options.style],\r\n size: TileSize[this.options.size],\r\n });\r\n\r\n if (this.options.click && route) {\r\n let el = this.$el.find(`.a-tile[data-id=${id}]`);\r\n el.bind(\"click\", () => this.options.click(el, route));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimelineAttributes extends AppKitchen.ModelBaseAttributes {\r\n }\r\n\r\n export class TimelineModel extends AppKitchen.ModelBase {\r\n \r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimelineOptions extends AppKitchen.ViewBaseOptions {\r\n fillHeight?: boolean;\r\n }\r\n\r\n export class TimelineView extends AppKitchen.ViewBase {\r\n options: TimelineOptions;\r\n\r\n containers: {\r\n timeline: JQuery;\r\n }\r\n\r\n constructor(model: TimelineModel, target: HTMLElement, options?: TimelineOptions) {\r\n super(model,\r\n target,\r\n AppKitchen.OptionsHelper.merge(options,\r\n {\r\n fillHeight: false\r\n }));\r\n\r\n if (this.options.fillHeight) {\r\n this.setTemplate('
      ');\r\n } else {\r\n this.setTemplate('
      ');\r\n }\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n this.renderTemplate({});\r\n\r\n this.containers = {\r\n timeline: this.$el.find(\".a-timeline\")\r\n }\r\n\r\n\r\n this.containers.timeline.kendoScheduler({\r\n date: new Date(\"2013/6/13\"),\r\n startTime: new Date(\"2013/6/13 07:00 AM\"),\r\n majorTick: 60,\r\n views: [\r\n \"timeline\",\r\n \"timelineWeek\",\r\n \"timelineWorkWeek\",\r\n {\r\n type: \"timelineMonth\",\r\n startTime: new Date(\"2013/6/13 00:00 AM\"),\r\n majorTick: 1440\r\n }\r\n ],\r\n timezone: \"Etc/UTC\",\r\n dataSource: {\r\n batch: true,\r\n transport: {\r\n read: {\r\n url: \"https://demos.telerik.com/kendo-ui/service/meetings\",\r\n dataType: \"jsonp\"\r\n },\r\n update: {\r\n url: \"https://demos.telerik.com/kendo-ui/service/meetings/update\",\r\n dataType: \"jsonp\"\r\n },\r\n create: {\r\n url: \"https://demos.telerik.com/kendo-ui/service/meetings/create\",\r\n dataType: \"jsonp\"\r\n },\r\n destroy: {\r\n url: \"https://demos.telerik.com/kendo-ui/service/meetings/destroy\",\r\n dataType: \"jsonp\"\r\n },\r\n parameterMap: function (options, operation) {\r\n if (operation !== \"read\" && options.models) {\r\n return { models: kendo.stringify(options.models) };\r\n }\r\n }\r\n },\r\n schema: {\r\n model: {\r\n id: \"meetingID\",\r\n fields: {\r\n meetingID: { from: \"MeetingID\", type: \"number\" },\r\n title: { from: \"Title\", defaultValue: \"No title\", validation: { required: true } },\r\n start: { type: \"date\", from: \"Start\" },\r\n end: { type: \"date\", from: \"End\" },\r\n startTimezone: { from: \"StartTimezone\" },\r\n endTimezone: { from: \"EndTimezone\" },\r\n description: { from: \"Description\" },\r\n recurrenceId: { from: \"RecurrenceID\" },\r\n recurrenceRule: { from: \"RecurrenceRule\" },\r\n recurrenceException: { from: \"RecurrenceException\" },\r\n roomId: { from: \"RoomID\", nullable: true },\r\n attendees: { from: \"Attendees\", nullable: true },\r\n isAllDay: { type: \"boolean\", from: \"IsAllDay\" }\r\n }\r\n }\r\n }\r\n },\r\n group: {\r\n resources: [\"Rooms\", \"Attendees\"],\r\n orientation: \"vertical\"\r\n },\r\n resources: [\r\n {\r\n field: \"roomId\",\r\n name: \"Rooms\",\r\n dataSource: [\r\n { text: \"Meeting Room 101\", value: 1, color: \"#6eb3fa\" },\r\n { text: \"Meeting Room 201\", value: 2, color: \"#f58a8a\" }\r\n ],\r\n title: \"Room\"\r\n },\r\n {\r\n field: \"attendees\",\r\n name: \"Attendees\",\r\n dataSource: [\r\n { text: \"Alex\", value: 1, color: \"#f8a398\" },\r\n { text: \"Bob\", value: 2, color: \"#51a0ed\" },\r\n { text: \"Charlie\", value: 3, color: \"#56ca85\" }\r\n ],\r\n multiple: true,\r\n title: \"Attendees\"\r\n }\r\n ]\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n\r\n export module TimeseriesDataChartViewHelper {\r\n export function getDefaultConfig(): Highstock.Options {\r\n return {\r\n \"exporting\": {\r\n \"enabled\": false\r\n },\r\n \"credits\": {\r\n \"enabled\": false\r\n },\r\n \"xAxis\": {\r\n \"title\": {\r\n \"style\": {\r\n \"color\": AppKitchen.Colors.Gray,\r\n \"fontFamily\": \"OpenSansSemiBold\",\r\n \"fontWeight\": \"normal\"\r\n }\r\n },\r\n \"ordinal\": false\r\n },\r\n \"yAxis\": {\r\n \"opposite\": false,\r\n \"min\": 0,\r\n \"title\": {\r\n \"text\": \"\",\r\n \"style\": {\r\n \"color\": AppKitchen.Colors.Gray,\r\n \"fontFamily\": \"OpenSansSemiBold\",\r\n \"fontWeight\": \"normal\"\r\n }\r\n }\r\n },\r\n \"subtitle\": {\r\n \"style\": {\r\n \"display\": \"none\"\r\n }\r\n },\r\n \"tooltip\": {\r\n \"borderColor\": \"transparent\",\r\n \"backgroundColor\": AppKitchen.Colors.CoalGray,\r\n \"borderRadius\": 0,\r\n \"borderWidth\": 0,\r\n \"valueDecimals\": 2,\r\n \"hideDelay\": 10,\r\n \"crosshairs\": true,\r\n \"shared\": true,\r\n \"shadow\": false,\r\n \"followPointer\": false,\r\n \"dateTimeLabelFormats\": {\r\n \"hour\": \"%A, %b %e, %Y, %H:%M\",\r\n \"day\": \"%A, %b %e, %Y, %H:%M\",\r\n \"minute\": \"%A, %b %e, %Y, %H:%M\"\r\n },\r\n \"style\": {\r\n \"color\": AppKitchen.Colors.WhiteSmoke\r\n }\r\n },\r\n \"navigator\": {\r\n \"enabled\": true,\r\n \"maskFill\": \"rgba(125,125,125,0.15)\",\r\n \"baseSeries\": 1,\r\n \"height\": 50,\r\n \"series\": {\r\n \"step\": false,\r\n \"type\": \"area\",\r\n \"color\": \"#b5b5b5\",\r\n \"fillOpacity\": 0.15,\r\n \"lineWidth\": 1,\r\n \"lineColor\": \"#b5b5b5\"\r\n },\r\n \"xAxis\": {\r\n \"labels\": {\r\n \"y\": 14\r\n }\r\n },\r\n \"outlineColor\": \"rgba(125,125,125,0.1)\",\r\n \"handles\": {\r\n \"backgroundColor\": \"#F6F6F6\",\r\n \"borderColor\": \"rgba(125,125,125,0.5)\"\r\n }\r\n },\r\n \"scrollbar\": {\r\n \"enabled\": false\r\n },\r\n \"rangeSelector\": {\r\n \"enabled\": false\r\n },\r\n \"title\": {\r\n \"enabled\": false\r\n },\r\n \"plotOptions\": {\r\n \"area\": {\r\n \"stacking\": \"normal\"\r\n },\r\n \"series\": {\r\n \"animation\": false\r\n },\r\n \"column\": {\r\n \"animation\": false\r\n }\r\n },\r\n \"legend\": {\r\n \"enabled\": true,\r\n \"verticalAlign\": \"top\",\r\n \"align\": \"right\",\r\n \"itemStyle\": {\r\n \"color\": \"#808080\"\r\n }\r\n },\r\n \"chart\": {\r\n \"zoomType\": \"xy\",\r\n \"resetZoomButton\": {\r\n \"theme\": {\r\n \"display\": \"none\"\r\n }\r\n },\r\n \"animation\": false,\r\n \"borderRadius\": 0,\r\n \"backgroundColor\": \"transparent\"\r\n }\r\n };\r\n }\r\n }\r\n\r\n export type ChartMode = 'default' | 'step';\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataChartViewOptions extends AppKitchen.ViewBaseOptions {\r\n seriesConfig?: { [tsId: string]: Highcharts.SeriesOptions };\r\n chartConfig?: Highstock.Options;\r\n chartMode?: ChartMode; \r\n }\r\n\r\n export class TimeseriesDataChartView extends AppKitchen.ViewBase {\r\n options: TimeseriesDataChartViewOptions;\r\n highchartsModel: Controls.Charts.HighchartsSeriesCollectionModel;\r\n highchartsView: Controls.Charts.HighchartsView;\r\n resetZoomButton: JQuery;\r\n chartContainer: HTMLElement;\r\n\r\n constructor(model: TimeseriesDataViewModel, targetContainer: HTMLElement, options?: TimeseriesDataChartViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n seriesConfig: {},\r\n chartConfig: TimeseriesDataChartViewHelper.getDefaultConfig(),\r\n chartMode: 'default'\r\n }, true));\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, Templates.TimeseriesDataChartView);\r\n this.resetZoomButton = this.$el.find(\".a-tcv-reset-zoom-btn\");\r\n this.chartContainer = this.$el.find(\".a-tcv-chart-container\")[0];\r\n\r\n this.resetZoomButton.click(() => this.resetAxisExtrema());\r\n\r\n this.highchartsModel = new Controls.Charts.HighchartsSeriesCollectionModel([]);\r\n this.highchartsModel.set({ config: this.options.chartConfig });\r\n this.highchartsView = new Controls.Charts.HighchartsView(this.highchartsModel, this.chartContainer);\r\n\r\n this.updateChartData();\r\n this.resize();\r\n\r\n this.model.on(\"change:timeseries\", () => this.updateChartData());\r\n }\r\n\r\n updateChartData() {\r\n var timeseriesData = this.model.get().timeseries.AsLinq();\r\n if (timeseriesData.Count() > 0) {\r\n\r\n (this.highchartsModel.get().config.yAxis).title.text = timeseriesData.First().unit;\r\n\r\n this.highchartsModel.set({\r\n seriesCollection: timeseriesData.Select(tsData =>\r\n new Controls.Charts.HighchartsSeriesModel(this.getTimeseriesData(tsData.data), this.getTimeseriesSettings(tsData)))\r\n .ToArray()\r\n });\r\n\r\n this.resetAxisExtrema();\r\n } else {\r\n this.highchartsModel.set({ seriesCollection: [] });\r\n }\r\n }\r\n\r\n getTimeseriesData(data: number[][]): number[][]{\r\n if (this.options.chartMode === \"step\" && data && data.length > 0) {\r\n var currentTimestamp = new Date().getTime();\r\n var lastValue = data.AsLinq().LastOrDefault(d => d[1] != null);\r\n\r\n if (lastValue && lastValue[0] < currentTimestamp) {\r\n var newData = data.slice();\r\n newData.push([currentTimestamp, lastValue[1]]);\r\n return newData;\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n private resetAxisExtrema() {\r\n this.highchartsView.setExtremesX(this.getTimepointsExtrema());\r\n this.highchartsView.setExtremesY(this.getDataExtrema(1.1));\r\n }\r\n\r\n private getTimeseriesSettings(tsData: TimeseriesDataViewData): Highcharts.SeriesOptions {\r\n \r\n return AppKitchen.OptionsHelper.merge(this.options.seriesConfig[tsData.timeseriesId], {\r\n color: tsData.color,\r\n name: tsData.label,\r\n yAxis: 0\r\n });\r\n }\r\n\r\n private getTimepointsExtrema() {\r\n var timeseries = this.model.get().timeseries;\r\n\r\n let minTotal = Number.MAX_VALUE;\r\n let maxTotal = 0;\r\n\r\n if (timeseries.length > 0) {\r\n for (let timeserie of timeseries) {\r\n let tsData = timeserie.data;\r\n if (tsData && tsData.length) {\r\n let min = tsData[0][0];\r\n let max = tsData[tsData.length - 1][0];\r\n\r\n if (min < minTotal) {\r\n minTotal = min;\r\n }\r\n if (max > maxTotal) {\r\n maxTotal = max;\r\n }\r\n }\r\n }\r\n } else {\r\n minTotal = this.model.get().startDate.valueOf();\r\n maxTotal = this.model.get().endDate.valueOf();\r\n }\r\n\r\n return { min: minTotal, max: maxTotal }\r\n }\r\n\r\n private getDataExtrema(multiply: number = 1) {\r\n var timeseries = this.model.get().timeseries;\r\n\r\n var min = Number.MAX_VALUE;\r\n var max = Number.MIN_VALUE;\r\n var hasData = false;\r\n\r\n timeseries.forEach(cd => {\r\n cd.data.forEach(d => {\r\n if (d[1] != null) {\r\n if (d[1] < min) min = d[1];\r\n if (d[1] > max) max = d[1];\r\n hasData = true;\r\n }\r\n\r\n });\r\n });\r\n\r\n var buffer = multiply - 1;\r\n return {\r\n min: hasData ? min - min * buffer : undefined,\r\n max: hasData ? max + max * buffer : undefined\r\n }\r\n }\r\n\r\n resize() {\r\n this.highchartsView.resize();\r\n }\r\n\r\n }\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataSpreadsheetViewOptions extends AppKitchen.ViewBaseOptions {\r\n dateFormat?: string;\r\n editable?: boolean;\r\n onEdit?: () => void;\r\n }\r\n\r\n export class TimeseriesDataSpreadsheetView extends AppKitchen.ViewBase {\r\n options: TimeseriesDataSpreadsheetViewOptions;\r\n spreadSheet: kendo.ui.Spreadsheet;\r\n dirty: boolean;\r\n private updatesSuspended: boolean;\r\n\r\n constructor(model: TimeseriesDataViewModel, targetContainer: HTMLElement, options?: TimeseriesDataSpreadsheetViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n editable: false,\r\n onEdit: () => {}\r\n }));\r\n\r\n this.render();\r\n this.updatesSuspended = false;\r\n this.model.on(\"change:timeseries\", () => {\r\n if (!this.updatesSuspended) {\r\n this.render();\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, Templates.TimeseriesDataSpreadsheetView);\r\n var spreadsheetContainer = this.$el.find(\".a-tssv-spreadsheet-container\");\r\n\r\n // header Row\r\n var headerRow: kendo.ui.SpreadsheetSheetRow = {\r\n cells: [\r\n {\r\n value: \"Zeitpunkt\",\r\n align: \"right\",\r\n fontSize: 12.8,\r\n fontFamily: \"OpenSans\",\r\n color: AppKitchen.Colors.Gray,\r\n borderBottom: { color: AppKitchen.Colors.LightGray, size: \"2\" },\r\n enable: false\r\n }]\r\n }\r\n\r\n this.model.get().timeseries.forEach(ts => {\r\n headerRow.cells.push({\r\n value: ts.label + \" (\" + ts.unit + \")\",\r\n color: ts.color,\r\n borderBottom: { color: ts.color, size: \"2\" },\r\n fontSize: 12.8,\r\n fontFamily: \"OpenSansSemiBold\", enable: false\r\n });\r\n });\r\n\r\n // data\r\n var timeseries = this.model.get().timeseries;\r\n\r\n if (timeseries.length > 1) {\r\n this.synchronizeTimeseries(timeseries);\r\n }\r\n\r\n var sheetRowCount = !timeseries || timeseries.length === 0 || timeseries[0].data.length === 0 ? 1 : timeseries[0].data.length + 1;\r\n\r\n var sheetColumns = [\r\n { width: 150 }\r\n ];\r\n\r\n if (timeseries && timeseries.length > 0) {\r\n for (let i = 0; i < timeseries.length; i++) {\r\n sheetColumns.push({\r\n width: timeseries[i].columnWidth || 150\r\n });\r\n }\r\n }\r\n\r\n\r\n this.spreadSheet = spreadsheetContainer.kendoSpreadsheet({\r\n sheets: [\r\n {\r\n rows: [headerRow],\r\n columns: sheetColumns,\r\n frozenRows: !timeseries || timeseries.length === 0 || timeseries[0].data.length === 0 ? 0 : 1\r\n }\r\n ],\r\n toolbar: false,\r\n sheetsbar: false,\r\n columns: sheetColumns.length,\r\n rows: sheetRowCount\r\n }).data(\"kendoSpreadsheet\");\r\n\r\n if (!timeseries || timeseries.length === 0 || timeseries[0].data.length === 0) {\r\n return;\r\n }\r\n\r\n var sheet = this.spreadSheet.sheetByIndex(0);\r\n\r\n var dateValues = timeseries[0].data.AsLinq().Select(tsData => [new Date(tsData[0])]).ToArray();\r\n var dateRange = sheet.range(\"A2:A\" + timeseries[0].data.length + 1);\r\n dateRange.values(dateValues);\r\n\r\n var dateFormat = kendo.culture().calendar.patterns.g;\r\n if (this.options.dateFormat) {\r\n if (kendo.culture().calendar.patterns[this.options.dateFormat]) {\r\n dateFormat = kendo.culture().calendar.patterns[this.options.dateFormat];\r\n } else {\r\n dateFormat = this.options.dateFormat;\r\n }\r\n }\r\n\r\n dateRange.format(dateFormat);\r\n dateRange.enable(false);\r\n\r\n var rowIndex = \"B\";\r\n timeseries.forEach(ts => {\r\n var values = ts.data.AsLinq().Select(tsData => [tsData[1]]).ToArray();\r\n var valuesRange = sheet.range(rowIndex + \"2:\" + rowIndex + ts.data.length + 1);\r\n valuesRange.values(values);\r\n valuesRange.enable(this.options.editable);\r\n if (ts.color) {\r\n valuesRange.background(AppKitchen.UIHelper.Colors.lightenHex(ts.color, .9));\r\n }\r\n rowIndex = String.fromCharCode(rowIndex.charCodeAt(0) + 1);\r\n });\r\n\r\n this.addValidator(1, sheetRowCount - 1, sheetColumns.length - 1);\r\n\r\n if (this.options.editable) {\r\n this.spreadSheet.bind(\"change\", () => {\r\n this.dirty = true;\r\n this.options.onEdit();\r\n });\r\n }\r\n\r\n this.dirty = false;\r\n }\r\n\r\n private addValidator(numberOfHeaderRows: number, numberOfDataRows: number, numberOfDataColumns: number) {\r\n var validator = {\r\n from: \"-999999999999\",\r\n to: \"99999999999\",\r\n comparerType: \"between\",\r\n type: \"reject\",\r\n dataType: \"number\",\r\n messageTemplate: AppKitchen.Strings.TimeseriesDataGrid_OnlyNumbers\r\n };\r\n\r\n (this.spreadSheet.activeSheet().range(\"R\" + (numberOfHeaderRows + 1) + \"C2:R\" + numberOfDataRows + numberOfHeaderRows + \"C\" + numberOfDataColumns+1)).validation(validator);\r\n }\r\n\r\n private suspendUpdates(action: () => void) {\r\n var backup = this.updatesSuspended;\r\n this.updatesSuspended = true;\r\n action();\r\n this.updatesSuspended = backup;\r\n }\r\n\r\n updateModel() {\r\n if (this.options.editable) {\r\n this.suspendUpdates(() => {\r\n var data = this.model.get().timeseries;\r\n if (!data || data.length === 0 || data[0].data.length === 0) {\r\n return;\r\n }\r\n\r\n var sheet = this.spreadSheet.sheetByIndex(0);\r\n var rowIndex = \"B\";\r\n\r\n data.forEach(ts => {\r\n var range = sheet.range(rowIndex + \"2:\" + rowIndex + ts.data.length + 1);\r\n\r\n //TODO check if something changed at behavior\r\n\r\n range.forEachCell((row: number, column: number, cell: any) => {\r\n let value = cell.value;\r\n ts.data[row][1] = typeof value == \"number\" ? value : null;\r\n });\r\n\r\n //var inputValues: number[][] = valuesRange.values();\r\n\r\n //for (let i = 0; i < ts.data.length; i++) {\r\n // var value = inputValues[i][0];\r\n // if (typeof value == \"number\") {\r\n // ts.data[i][1] = value;\r\n // } else {\r\n // ts.data[i][1] = null;\r\n // }\r\n //}\r\n rowIndex = String.fromCharCode(rowIndex.charCodeAt(0) + 1);\r\n });\r\n\r\n this.model.trigger(\"change:timeseries\", this.model);\r\n this.dirty = false;\r\n });\r\n }\r\n }\r\n\r\n resize() {\r\n this.spreadSheet.resize();\r\n }\r\n\r\n private synchronizeTimeseries(timeseries: TimeseriesDataViewData[]) {\r\n if (timeseries.length > 1\r\n && this.areTimeseriesFilled(timeseries)\r\n && !this.areTimeseriesSynchroniezed(timeseries)) {\r\n let timeseriesData = this.getSynchronizedTimeseriesData(timeseries);\r\n this.updateTimeseriesData(timeseries, timeseriesData);\r\n }\r\n }\r\n\r\n private updateTimeseriesData(timeseries: TimeseriesDataViewData[], data: number[][]) {\r\n timeseries.forEach((t, i) => t.data = this.getTimesereisDataForIndex(data, i));\r\n }\r\n\r\n private getTimesereisDataForIndex(data: number[][], index: number): number[][] {\r\n let resultData: number[][] = [];\r\n data.forEach((d) => resultData.push([d[0], d[index + 1]]));\r\n return resultData;\r\n }\r\n\r\n private getSynchronizedTimeseriesData(timeseries: TimeseriesDataViewData[]) : number[][] {\r\n let currentIndex: number[] = [];\r\n let minDate: number = Number.MAX_VALUE;\r\n let increment: number = timeseries[0].data[1][0] - timeseries[0].data[0][0];\r\n timeseries.forEach(() => currentIndex.push(0));\r\n timeseries.forEach((t) => { if (t.data[0][0] < minDate) minDate = t.data[0][0]; });\r\n let timesseriesData: number[][] = [];\r\n let currentDate = minDate;\r\n let running: boolean = true;\r\n while (running) {\r\n running = false;\r\n let values: number[] = [];\r\n values.push(currentDate);\r\n timeseries.forEach((t, i) => {\r\n if (currentIndex[i] < t.data.length) {\r\n let date = t.data[currentIndex[i]][0];\r\n let value = t.data[currentIndex[i]][1];\r\n if (date === currentDate) {\r\n values.push(value);\r\n currentIndex[i]++;\r\n } else {\r\n values.push(null);\r\n }\r\n running = true;\r\n } else {\r\n values.push(null);\r\n }\r\n });\r\n timesseriesData.push(values);\r\n currentDate += increment;\r\n }\r\n return timesseriesData;\r\n }\r\n\r\n private areTimeseriesFilled(timeseries: TimeseriesDataViewData[]): boolean {\r\n if (!timeseries || !timeseries.length) {\r\n return false;\r\n }\r\n for (let timeserie of timeseries) {\r\n if (!timeserie.data || !timeserie.data.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n private areTimeseriesSynchroniezed(timeseries: TimeseriesDataViewData[]) {\r\n let firstTimeserieDate = timeseries[0].data[0][0];\r\n for (let timeserie of timeseries) {\r\n let timeserieDate = timeserie.data[0][0];\r\n if (firstTimeserieDate !== timeserieDate) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataViewStyles {\r\n label?: string;\r\n color?: string;\r\n columnWidth?: number;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataViewData extends TimeseriesDataViewStyles {\r\n timeseriesId: string;\r\n hypothesis: string;\r\n unit: string;\r\n data: number[][];\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataViewModelAttributes extends AppKitchen.ModelBaseAttributes {\r\n timeseries?: TimeseriesDataViewData[];\r\n startDate?: Date;\r\n endDate?: Date;\r\n }\r\n\r\n export class TimeseriesDataViewModel extends AppKitchen.ModelBase {\r\n loader: AppKitchen.Data.TimeseriesDataLoaderBase;\r\n\r\n constructor(loader?: AppKitchen.Data.TimeseriesDataLoaderBase, styles?: { [tsId: string]: TimeseriesDataViewStyles }) {\r\n super({\r\n timeseries: [],\r\n startDate: null,\r\n endDate: null\r\n });\r\n\r\n if (loader) {\r\n this.bindToLoader(loader, styles);\r\n this.loader = loader;\r\n }\r\n }\r\n\r\n protected bindToLoader(loader: AppKitchen.Data.TimeseriesDataLoaderBase, styles?: { [tsId: string]: TimeseriesDataViewStyles }) {\r\n\r\n this.set({\r\n timeseries: this.convertChartData(loader.get().data, styles),\r\n startDate: loader.get().startDate,\r\n endDate: loader.get().endDate\r\n });\r\n\r\n loader.on(\"change:startDate change:endDate\", () => this.set({\r\n startDate: loader.get().startDate,\r\n endDate: loader.get().endDate\r\n }));\r\n\r\n loader.on(\"change:loading\", () => this.set({\r\n loading: loader.get().loading\r\n }));\r\n\r\n loader.on(\"change:data\", () => this.set({\r\n timeseries: this.convertChartData(loader.get().data, styles),\r\n startDate: loader.get().startDate,\r\n endDate: loader.get().endDate\r\n }));\r\n }\r\n\r\n protected convertChartData(chartData: AppKitchen.Data.TimeSeries.Model.ChartData[], styles?: { [tsId: string]: TimeseriesDataViewStyles }): TimeseriesDataViewData[] {\r\n return chartData.AsLinq().Select(cd => {\r\n\r\n var chartData = {\r\n timeseriesId: cd.timeseriesId,\r\n label: (styles && styles[cd.timeseriesId]) ? styles[cd.timeseriesId].label : cd.timeseriesName,\r\n color: (styles && styles[cd.timeseriesId]) ? styles[cd.timeseriesId].color : undefined,\r\n hypothesis: cd.hypothesis,\r\n unit: cd.unit,\r\n data: cd.data\r\n }\r\n\r\n if (styles && styles[cd.timeseriesId]) {\r\n $.extend(true, chartData, styles[cd.timeseriesId]);\r\n }\r\n return chartData;\r\n }).ToArray();\r\n }\r\n\r\n getDataSaveEntities(): AppKitchen.Api.Models.TimeseriesDataSaveEntity[] {\r\n return this.get().timeseries.AsLinq().Select(ts => {\r\n return {\r\n TimeseriesId: ts.timeseriesId,\r\n Hypothesis: ts.hypothesis,\r\n Data: ts.data\r\n };\r\n }).ToArray();\r\n }\r\n }\r\n\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n import ExportChartDataToExcelDefinition = AppKitchen.ExportHelper.ExportChartDataToExcelDefinition;\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataViewOptions extends AppKitchen.ViewBaseOptions {\r\n chartOptions?: TimeseriesDataChartViewOptions;\r\n gridOptions?: TimeseriesDataSpreadsheetViewOptions;\r\n exportFilename?: string; //placeholders in {}: header, from, to\r\n enableDateSelection?: boolean;\r\n defaultStartDate?: Date;\r\n defaultEndDate?: Date;\r\n maxDateRangeDays?: number;\r\n title?: string;\r\n }\r\n\r\n export class TimeseriesDataView extends AppKitchen.ViewBase {\r\n options: TimeseriesDataViewOptions;\r\n\r\n exportFilename: string;\r\n containers: {\r\n datePicker: HTMLElement,\r\n title: HTMLElement,\r\n chart: HTMLElement,\r\n grid: HTMLElement,\r\n };\r\n buttons: {\r\n all: JQuery,\r\n switchToChart: JQuery,\r\n switchToGrid: JQuery,\r\n excel: JQuery,\r\n };\r\n chartView: TimeseriesDataChartView;\r\n gridView: TimeseriesDataSpreadsheetView;\r\n\r\n constructor(model: TimeseriesDataViewModel, targetContainer: HTMLElement, options?: TimeseriesDataViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, { \r\n exportFilename: \"export\",\r\n enableDateSelection: true,\r\n defaultStartDate: new Date().onlyDate().addDays(-30),\r\n defaultEndDate: new Date().onlyDate().addDays(3),\r\n maxDateRangeDays: 730\r\n }, true));\r\n\r\n this.render();\r\n this.configureButtons();\r\n\r\n if ((this.options).enableDateSelection) {\r\n var datePickerModel = new Controls.DateRangePickerModel();\r\n var datePickerView = new Controls.DateRangePickerView(datePickerModel, this.containers.datePicker, {\r\n labels: { from: Strings.TimeseriesDataView_DatePicker_From, to: Strings.TimeseriesDataView_DatePicker_To },\r\n maxRange: (this.options).maxDateRangeDays\r\n });\r\n\r\n datePickerModel.onRangeChange((start: Date, end: Date) => this.model.loader.loadData(start, end));\r\n datePickerModel.routeRange(\"\", (this.options).defaultStartDate, (this.options).defaultEndDate);\r\n }\r\n\r\n this.chartView = new TimeseriesDataChartView(this.model, this.containers.chart, (this.options).chartOptions);\r\n this.gridView = new TimeseriesDataSpreadsheetView(this.model, this.containers.grid, (this.options).gridOptions);\r\n\r\n this.model.on(\"change:timeseries\", ( ) => this.configureExcelMenu());\r\n }\r\n\r\n render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, Templates.TimeseriesDataView, { title: this.options.title});\r\n this.containers = {\r\n datePicker: this.$el.find(\".a-tdv-datepicker-container\")[0],\r\n title: this.$el.find(\".a-tdv-title-container\")[0],\r\n chart: this.$el.find(\".a-tdv-chart-container\")[0],\r\n grid: this.$el.find(\".a-tdv-grid-container\")[0]\r\n }\r\n\r\n this.buttons = {\r\n all: this.$el.find(\".a-tdv-switcher\"),\r\n switchToChart: this.$el.find(\".a-tdv-switcher.tdv-chart\"),\r\n switchToGrid: this.$el.find(\".a-tdv-switcher.tdv-grid\"),\r\n excel: this.$el.find(\".a-tdv-excel-export\")\r\n }\r\n\r\n this.buttons.excel.kendoTooltip({ position: \"top\" });\r\n }\r\n\r\n configureButtons() {\r\n this.buttons.switchToChart.click(() => {\r\n this.buttons.all.removeClass(\"a-selected\");\r\n this.buttons.switchToChart.addClass(\"a-selected\");\r\n $(this.containers.chart).show(0);\r\n $(this.containers.grid).hide(0);\r\n if (this.chartView) {\r\n this.chartView.resize();\r\n }\r\n AppKitchen.BrowserHelper.UrlQuery.setParameter(\"view\", \"chart\");\r\n });\r\n\r\n this.buttons.switchToGrid.click(() => {\r\n this.buttons.all.removeClass(\"a-selected\");\r\n this.buttons.switchToGrid.addClass(\"a-selected\");\r\n $(this.containers.grid).show(0);\r\n $(this.containers.chart).hide(0);\r\n if (this.gridView) {\r\n this.gridView.resize();\r\n }\r\n AppKitchen.BrowserHelper.UrlQuery.setParameter(\"view\", \"grid\");\r\n });\r\n\r\n if (AppKitchen.BrowserHelper.UrlQuery.getParameter(\"view\") === \"grid\") {\r\n this.buttons.switchToGrid.click();\r\n } else {\r\n this.buttons.switchToChart.click();\r\n }\r\n }\r\n\r\n configureExcelMenu() {\r\n\r\n var mainList = $('
        ');\r\n var xlsList = $(\"
      • \" + Strings.TimeseriesDataView_Excel_EportToXls + \"
      • \");\r\n var csvList = $(\"
      • \" + Strings.TimeseriesDataView_Excel_EportToCsv + \"
      • \");\r\n if (this.model.get().timeseries.length > 1) {\r\n var ulXls = this.createSubMenu(this.exportToExcel.bind(this));\r\n var ulCsv = this.createSubMenu(this.exportToCsv.bind(this));\r\n xlsList.append(ulXls);\r\n csvList.append(ulCsv);\r\n mainList.append(xlsList);\r\n mainList.append(csvList);\r\n\r\n this.buttons.excel.find(\" > li\").append(mainList);\r\n this.buttons.excel.kendoMenu({ openOnClick: true });\r\n } else {\r\n this.buttons.excel.click(() => this.exportToExcel([\r\n {\r\n timeseriesId: this.model.get().timeseries[0].timeseriesId,\r\n header: this.model.get().timeseries[0].label,\r\n color: this.model.get().timeseries[0].color\r\n }\r\n ]));\r\n }\r\n }\r\n\r\n createSubMenu(exportMethod: (definitions: ExportChartDataToExcelDefinition[]) => void): JQuery {\r\n var ul = $('
          ');\r\n\r\n this.model.get().timeseries.forEach(ts => {\r\n var singleExportItem = $(\"
        • \" + ts.label + \" \" + Strings.TimeseriesDataView_Excel_Export + \"
        • \");\r\n singleExportItem.click(() => exportMethod([\r\n {\r\n timeseriesId: ts.timeseriesId,\r\n header: ts.label,\r\n color: ts.color\r\n }\r\n ]));\r\n ul.append(singleExportItem);\r\n });\r\n\r\n var exportAllItem = $(\"
        • \" + Strings.TimeseriesDataView_Excel_ExportAll + \"
        • \");\r\n exportAllItem.click(() => {\r\n var allExportDefinitions: ExportChartDataToExcelDefinition[] = this.model.get().timeseries\r\n .AsLinq()\r\n .Select(ts => {\r\n return {\r\n timeseriesId: ts.timeseriesId,\r\n header: ts.label,\r\n color: ts.color\r\n }\r\n })\r\n .ToArray();\r\n exportMethod(allExportDefinitions);\r\n });\r\n ul.append(exportAllItem);\r\n return ul;\r\n }\r\n\r\n exportToExcel(definitions: ExportChartDataToExcelDefinition[]) {\r\n var chartsData = this.convertToChartData(this.model.get().timeseries);\r\n\r\n if (chartsData == null || chartsData.length === 0) {\r\n AppKitchen.UIHelper.DialogBoxes.alert(Strings.Error_ExcelExport_MissingData, { title: Strings.Error_ExcelExport_MissingData_Title, icon: \"fail\" });\r\n return;\r\n }\r\n\r\n var filename = this.buildFileName(definitions);\r\n\r\n AppKitchen.ExportHelper.exportChartDataToExcel(chartsData, definitions, \"\", filename);\r\n }\r\n\r\n exportToCsv(definitions: ExportChartDataToExcelDefinition[]) {\r\n var chartsData = this.convertToChartData(this.model.get().timeseries);\r\n\r\n if (chartsData == null || chartsData.length === 0) {\r\n AppKitchen.UIHelper.DialogBoxes.alert(Strings.Error_ExcelExport_MissingData, { title: Strings.Error_ExcelExport_MissingData_Title, icon: \"fail\" });\r\n return;\r\n }\r\n\r\n var defs: AppKitchen.ExportHelper.ExportChartDataToCsvDefinition[] = [];\r\n definitions.forEach(d => defs.push({ timeseriesId: d.timeseriesId, header: d.header }));\r\n var filename = this.buildFileName(definitions);\r\n\r\n AppKitchen.ExportHelper.exportChartDataToCsv(chartsData, defs, filename);\r\n }\r\n\r\n buildFileName(definitions: ExportChartDataToExcelDefinition[]) {\r\n var filename = (this.options).exportFilename;\r\n if (definitions.length === 1) {\r\n filename = filename.replace(\"{header}\", definitions[0].header);\r\n }\r\n filename = filename.replace(\"{header}\", \"\")\r\n .replace(\"{from}\", kendo.toString(this.model.get().startDate, \"d\"))\r\n .replace(\"{to}\", kendo.toString(this.model.get().endDate, \"d\"));\r\n return filename;\r\n }\r\n\r\n convertToChartData(viewData: TimeseriesDataViewData[]) {\r\n var data: AppKitchen.Data.TimeSeries.Model.ChartData[] = [];\r\n viewData.forEach(d => data.push({\r\n timeseriesId: d.timeseriesId,\r\n data: d.data,\r\n hypothesis: d.hypothesis,\r\n timeseriesName: d.label,\r\n unit: d.unit,\r\n //decimalsPlaces: //no effect\r\n //timezone: ??\r\n }));\r\n return data;\r\n }\r\n\r\n setTitle(title: string) {\r\n if (this.containers.title) {\r\n this.containers.title.innerHTML = title;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Controls {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesStatusOptions {\r\n unit?: string;\r\n timespan?: number;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesStatusValue {\r\n value: number;\r\n unit: string;\r\n timestamp: Date;\r\n timeseriesName: string;\r\n timeseriesId: string;\r\n decimals: number;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesStatusAttributes {\r\n value?: TimeseriesStatusValue;\r\n unit?: string;\r\n valueDate?: Date;\r\n errorMsg?: string;\r\n loading?: boolean;\r\n }\r\n\r\n export class TimeseriesStatusModel extends AppKitchen.ModelBase {\r\n options: TimeseriesStatusOptions;\r\n databaseId: string;\r\n timeseriesId: string;\r\n timeResolution: string;\r\n hypothesis: string;\r\n\r\n constructor(databaseId: string, timeseriesId: string, timeResolution: string, hypothesis: string, options?: TimeseriesStatusOptions) {\r\n super({\r\n value: null,\r\n unit: options ? options.unit : \"\",\r\n valueDate: null,\r\n errorMsg: null\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options,\r\n {\r\n timespan: 24 // default: last 24 hours\r\n });\r\n\r\n this.databaseId = databaseId;\r\n this.timeseriesId = timeseriesId;\r\n this.timeResolution = timeResolution;\r\n this.hypothesis = hypothesis;\r\n\r\n //ChangeManager.onTimeseriesChanged(this.databaseId,this.timeseriesId,this.update.bind(this));\r\n this.update();\r\n }\r\n\r\n update() {\r\n this.set({ loading: true });\r\n\r\n var config = {\r\n DatabaseId: this.databaseId,\r\n\r\n timeseries: [\r\n {\r\n timeseriesId: this.timeseriesId,\r\n hypothesis: this.hypothesis,\r\n unit: this.options.unit,\r\n id: \"T###\"\r\n }\r\n ],\r\n\r\n timeaxis: [\r\n {\r\n id: \"A###\",\r\n begin: {\r\n dynamic: {\r\n NowTimeResolution: \"Hour\",\r\n Offset: -this.options.timespan,\r\n OffsetTimeResolution: \"Hour\",\r\n ExcludeEndDate: false\r\n }\r\n },\r\n end: {\r\n dynamic: {\r\n NowTimeResolution: this.timeResolution,\r\n Offset: 0,\r\n OffsetTimeResolution: this.timeResolution,\r\n ExcludeEndDate: false\r\n }\r\n },\r\n timeresolution: this.timeResolution,\r\n timezone: \"Central European Time\"\r\n }\r\n ],\r\n\r\n chartseries: [\r\n {\r\n id: \"NEU_A_IW\",\r\n datasource: {\r\n datasourcetype: \"timeseries\",\r\n datasourceid: \"T###\",\r\n timeaxisids: [\"A###\"]\r\n }\r\n }\r\n ]\r\n }\r\n\r\n var jsonString = JSON.stringify(config);\r\n AppKitchen.Data.getDataApi(\"TimeseriesData\", { '': jsonString }, dataList => {\r\n if (!dataList || dataList.length === 0 || !dataList[0].data || dataList[0].data.length === 0) {\r\n AppKitchen.log(\"No data for timeseries '\" + this.timeseriesId + \"'\");\r\n this.set({\r\n errorMsg: null,\r\n value: null\r\n });\r\n } else {\r\n this.set({\r\n value: {\r\n value: dataList[0].data[dataList[0].data.length - 1][1],\r\n unit: dataList[0].unit,\r\n timestamp: new Date(dataList[0].data[dataList[0].data.length - 1][0]),\r\n timeseriesName: dataList[0].timeseriesName,\r\n timeseriesId: dataList[0].timeseriesId,\r\n decimals: dataList[0].decimalsPlaces\r\n }\r\n });\r\n }\r\n this.set({ loading: false });\r\n }, (requestData: any, xhr: JQueryXHR) => {\r\n if (xhr.statusText === \"APPKITCHEN_ERROR\") {\r\n this.set({\r\n errorMsg: xhr.responseText,\r\n value: null\r\n });\r\n }\r\n this.set({ loading: false });\r\n });\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesValueInterpretationRule {\r\n value: number;\r\n color: string;\r\n status?: string;\r\n icon?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesValueInterpretation {\r\n [index: number]: TimeseriesValueInterpretationRule\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesStatusViewOptions extends AppKitchen.ViewBaseOptions {\r\n display: \"text\" | \"status\" | \"icon\" | \"circle\";\r\n label?: string;\r\n format?: string;\r\n size?: number;\r\n showTooltip?: boolean;\r\n noValue?: {\r\n text?: string;\r\n color?: string;\r\n icon?: string;\r\n }\r\n valueInterpretation?: TimeseriesValueInterpretation;\r\n }\r\n\r\n export class TimeseriesStatusView extends AppKitchen.ViewBase {\r\n options: TimeseriesStatusViewOptions;\r\n\r\n constructor(model: TimeseriesStatusModel, targetContainer: HTMLElement, options?: TimeseriesStatusViewOptions) {\r\n super(model, targetContainer, AppKitchen.OptionsHelper.merge(options, {\r\n loadingOverlay: '
          ',\r\n display: \"status\",\r\n label: \"\",\r\n format: undefined,\r\n showTooltip: false,\r\n size: options && options.display === \"circle\"? 5 : 100,\r\n noValue: {\r\n text: \"-\",\r\n color: AppKitchen.Colors.Silver\r\n },\r\n valueInterpretation: [\r\n { value: 0, color: AppKitchen.Colors.Green, status: \"ok\" },\r\n { value: 1, color: AppKitchen.Colors.OrangeRed, status: \"warning\" },\r\n { value: 2, color: AppKitchen.Colors.Red, status: \"error\" }\r\n ]\r\n }));\r\n\r\n // TODO sort this.options.valueInterpretation\r\n \r\n // TODO: write parametrized templates\r\n switch (this.options.display) {\r\n case \"text\":\r\n this.setTemplate(AppKitchen.Templates.TimeseriesStatus_Text);\r\n break;\r\n case \"status\":\r\n this.setTemplate(AppKitchen.Templates.TimeseriesStatus_Circle);\r\n break;\r\n case \"icon\":\r\n //this.setTemplate(Templates.TimeseriesStatusIcon);\r\n break;\r\n default:\r\n throw \"unknown timeseries status display type: '\" + this.options.display + \"'\";\r\n }\r\n\r\n this.model.bind(\"change\", () => this.render());\r\n this.model.bind(\"errorMsg\", () => this.render());\r\n this.render();\r\n }\r\n\r\n render() {\r\n var status = this.getStatus();\r\n\r\n this.renderTemplate({\r\n displayValue: this.getDisplayValue(),\r\n unit: this.getUnit(),\r\n color: status.color,\r\n label: this.options.label,\r\n size: this.options.size,\r\n statusCss: status.status,\r\n icon: status.icon\r\n });\r\n\r\n this.setTooltipIfNeeded();\r\n }\r\n\r\n setTooltipIfNeeded() {\r\n if (this.model.get().errorMsg) {\r\n this.$el.find(\".a-timeseries-status-item\")\r\n .kendoTooltip({\r\n content: \"
          \" + this.model.get().errorMsg + \"
          \"\r\n });\r\n }\r\n else if (this.options.showTooltip) {\r\n\r\n var data = {\r\n title: this.options.label,\r\n timeseriesId: this.model.timeseriesId,\r\n timeseriesName: \"-\",\r\n date: \"-\"\r\n }\r\n if (this.model.get().value) {\r\n data.timeseriesId = this.model.get().value.timeseriesId;\r\n data.timeseriesName = this.model.get().value.timeseriesName;\r\n data.date = kendo.toString(this.model.get().value.timestamp, \"F\");\r\n }\r\n\r\n var html = AppKitchen.UIHelper.renderTemplate(AppKitchen.Templates.TimeseriesStatus_Tooltip,data);\r\n\r\n this.$el.find(\".a-timeseries-status-item\").kendoTooltip({\r\n content: html,\r\n position: \"top\",\r\n show: e => {\r\n (e.sender).popup.element.css('margin-bottom', '7px');\r\n AppKitchen.UIHelper.hideTooltips(e.sender);\r\n }\r\n });\r\n }\r\n }\r\n\r\n getStatus(): TimeseriesValueInterpretationRule {\r\n var timeseriesValue = this.model.get().value;\r\n var interpretations = this.options.valueInterpretation;\r\n \r\n if (timeseriesValue != null) {\r\n if (timeseriesValue.value <= interpretations[0].value) {\r\n return interpretations[0];\r\n }\r\n\r\n for (let i = 0; i < (>interpretations).length - 1; i++) {\r\n if (timeseriesValue.value >= interpretations[i].value && timeseriesValue.value < interpretations[i + 1].value) {\r\n return interpretations[i];\r\n }\r\n }\r\n\r\n return interpretations[(>interpretations).length - 1];\r\n }\r\n\r\n\r\n return {\r\n value: null,\r\n color: this.options.noValue.color,\r\n status: \"no-value\",\r\n icon: this.options.noValue.icon\r\n };\r\n }\r\n\r\n getUnit(): string {\r\n var timeseriesValue = this.model.get().value;\r\n if (timeseriesValue != null) {\r\n return timeseriesValue.unit;\r\n }\r\n return this.model.get().unit;\r\n }\r\n\r\n getDisplayValue(): string {\r\n var timeseriesValue = this.model.get().value;\r\n if (timeseriesValue != null) {\r\n if (this.options.format) {\r\n return kendo.toString(timeseriesValue.value, this.options.format);\r\n }\r\n if (timeseriesValue.decimals != null) {\r\n return kendo.toString(timeseriesValue.value, \"n\" + timeseriesValue.decimals);\r\n }\r\n return kendo.toString(timeseriesValue.value, \"#,#.####################\");\r\n }\r\n return this.options.noValue.text;\r\n }\r\n \r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Data {\r\n export module Descriptors {\r\n\r\n export interface IDescriptorProvider {\r\n load(dimensions: string[], onLoadComplete: () => void);\r\n getDescriptors(dimensionId: string): AppKitchen.Api.Models.Descriptor[];\r\n }\r\n\r\n export class DescriptorProvider implements IDescriptorProvider {\r\n private dimensions: string[];\r\n private descriptors: {} = {};\r\n\r\n load(dimensions: string[], onLoadComplete: () => void) {\r\n this.dimensions = dimensions || [];\r\n\r\n const length = this.dimensions.length;\r\n if (length === 0) {\r\n onLoadComplete();\r\n }\r\n\r\n var dimensionLoaded: number = 0;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const dimensionId = this.dimensions[i];\r\n\r\n Data.Api.getDescriptors({ DimensionId: dimensionId },\r\n (result => {\r\n this.descriptors[dimensionId] = result;\r\n\r\n if (++dimensionLoaded === this.dimensions.length) {\r\n onLoadComplete();\r\n }\r\n }));\r\n }\r\n }\r\n\r\n getDescriptors(dimensionId: string): AppKitchen.Api.Models.Descriptor[] {\r\n return this.descriptors[dimensionId];\r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Data {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface EventDataLoadOptions extends LoadOptionsBase {\r\n success?: (data: { [key: string]: any }[]) => void;\r\n error?: (request: JQueryXHR) => void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface EventDataSaveOptions extends LoadOptionsBase {\r\n success?: (result: boolean | Object) => void;\r\n error?: (request: JQueryXHR) => void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface EventDataLoaderOptions {\r\n eventDataApi?: string;\r\n eventDataSaveApi?: string;\r\n startupFailed?: (request: JQueryXHR) => void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface EventDataLoaderAttributes {\r\n data?: {[key: string]: any}[];\r\n items?: AppKitchen.Api.Models.EventItemInfo[];\r\n ready?: boolean;\r\n loading?: boolean;\r\n }\r\n\r\n export class EventDataLoader extends AppKitchen.ModelBase {\r\n config: AppKitchen.Api.Models.EventDataRequest;\r\n itemRequest: JQueryXHR;\r\n dataRequest: JQueryXHR;\r\n dataSaveRequest: JQueryXHR;\r\n options: EventDataLoaderOptions;\r\n private itemsDict: { [key: string]: AppKitchen.Api.Models.EventItemInfo };\r\n\r\n constructor(config: AppKitchen.Api.Models.EventDataRequest, onReady: (loader: EventDataLoader) => void, options?: EventDataLoaderOptions) {\r\n super({\r\n data: [],\r\n items: [],\r\n loading: false,\r\n ready: false\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n eventDataApi: \"EventData\",\r\n eventDataSaveApi: \"EventDataMultiSave\"\r\n });\r\n\r\n this.config = config;\r\n\r\n this.bind(\"change:ready\", loader => {\r\n if (loader.get().ready) {\r\n onReady(this);\r\n }\r\n });\r\n\r\n this.bind(\"change:items\", () => this.updateItemsDict());\r\n this.loadItems();\r\n }\r\n\r\n loadItems() {\r\n this.itemRequest = Api.getEventItemInfos(this.config, items =>\r\n {\r\n this.set({\r\n items: items,\r\n ready: true\r\n });\r\n }, request => {\r\n if (this.options.startupFailed) {\r\n this.options.startupFailed(request);\r\n }\r\n });\r\n }\r\n\r\n loadData(options?: EventDataLoadOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n silent: false,\r\n success: () => {},\r\n error: () => {}\r\n });\r\n\r\n // abort previous request\r\n this.abortDataRequest();\r\n\r\n if (!options.silent) {\r\n this.set({ loading: true });\r\n }\r\n\r\n // start new request\r\n var api = options.api || this.options.eventDataApi;\r\n if (api === \"EventData\") {\r\n this.dataRequest = Api.getEventData(this.config, (data) => {\r\n this.processLoadedData(data);\r\n this.set({ loading: false });\r\n options.success(data);\r\n }, (request) => {\r\n this.set({ loading: false });\r\n options.error(request);\r\n });\r\n } else {\r\n this.dataRequest = Data.getData(api, this.config, (data) => {\r\n this.processLoadedData(data);\r\n this.set({ loading: false });\r\n options.success(data);\r\n }, (request) => {\r\n this.set({ loading: false });\r\n options.error(request);\r\n });\r\n }\r\n }\r\n\r\n saveData(data: { [key: string]: any }[], options?: EventDataSaveOptions) {\r\n if (!data || data.length === 0) {\r\n throw \"no data to save\";\r\n }\r\n\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n silent: false,\r\n success: () => { },\r\n error: () => { }\r\n });\r\n\r\n // abort previous request\r\n this.abortDataSaveRequest();\r\n\r\n if (!options.silent) {\r\n this.set({ loading: true });\r\n }\r\n\r\n // start new request\r\n var api = options.api || this.options.eventDataSaveApi;\r\n if (api === \"EventDataMultiSave\") {\r\n this.dataSaveRequest = Api.updateEventMultiData(this.getMultiSaveRequestData(data),\r\n (saveResult: boolean | Object) => {\r\n this.set({ loading: false });\r\n options.success(saveResult);\r\n },\r\n (request) => {\r\n this.set({ loading: false });\r\n options.error(request);\r\n });\r\n } else {\r\n this.dataSaveRequest = Data.getData(api,\r\n this.getMultiSaveRequestData(data),\r\n (saveResult: boolean | Object) => {\r\n this.set({ loading: false });\r\n options.success(saveResult);\r\n },\r\n (request) => {\r\n this.set({ loading: false });\r\n options.error(request);\r\n });\r\n }\r\n }\r\n\r\n getMultiSaveRequestData(data: { [key: string]: any }[]): AppKitchen.Api.Models.EventDataMultiSaveRequest {\r\n return {\r\n EventDataSaveRequests: data.AsLinq().Select(d => this.getSaveRequestData(d)).ToArray()\r\n }\r\n }\r\n\r\n getSaveRequestData(data: { [key: string]: any }): AppKitchen.Api.Models.EventDataSaveRequest {\r\n var saveData = [];\r\n Object.keys(data).forEach(key => {\r\n if (!this.itemsDict[key] && AppKitchen.GlobalSettings.devMode) {\r\n AppKitchen.logWarning(\"Unknown event item key: \" + key);\r\n }\r\n var value = data[key];\r\n if (value == null) {\r\n value = \"\";\r\n } else if (value instanceof Date) {\r\n value = value.toLocalISOString();\r\n }\r\n else if (typeof value === \"boolean\") {\r\n value = value ? \"true\" : \"false\";\r\n } else if (typeof value === \"number\") {\r\n value = value.toString();\r\n } else if (typeof value !== \"string\"){\r\n throw \"Event value with key '\" + key + \"' has invalid type\";\r\n }\r\n saveData.push({ Key: key, Value: value });\r\n });\r\n\r\n return {\r\n EventItemSpecs: this.config.EventItemSpecs,\r\n EventValues: saveData\r\n }\r\n }\r\n\r\n abortRequests() {\r\n if (this.itemRequest) {\r\n this.itemRequest.abort();\r\n }\r\n\r\n this.abortDataRequest();\r\n this.abortDataSaveRequest();\r\n }\r\n\r\n protected abortDataRequest() {\r\n if (this.dataRequest) {\r\n this.dataRequest.abort();\r\n this.set({ loading: false });\r\n }\r\n }\r\n\r\n protected abortDataSaveRequest() {\r\n if (this.dataSaveRequest) {\r\n this.dataSaveRequest.abort();\r\n this.set({ loading: false });\r\n }\r\n }\r\n\r\n protected processLoadedData(data: { [key: string]: any }[]) {\r\n // convert strings to corresponding types (date, number)\r\n if (data) {\r\n var eventItems = this.getItemsDict();\r\n for (let i = 0; i < data.length; i++) {\r\n // iterate properties\r\n for (let key in data[i]) {\r\n if (data[i].hasOwnProperty(key) && eventItems.hasOwnProperty(key)) {\r\n // convert types (e.g. date)\r\n switch (eventItems[key].Type) {\r\n case \"Date\":\r\n case \"PeriodNr\":\r\n data[i][key] = kendo.parseDate(data[i][key], \"yyyy-MM-ddTHH:mm:ss\");\r\n break;\r\n case \"Number\":\r\n case \"Calculated\":\r\n data[i][key] = kendo.parseFloat(data[i][key], \"de-DE\"); // REST API has fixed \"de-DE\" culture\r\n break;\r\n case \"Boolean\":\r\n if (data[i][key] != null && typeof data[i][key] !== \"boolean\")\r\n data[i][key] = data[i][key] === \"true\";\r\n break;\r\n default:\r\n data[i][key] = data[i][key] || \"\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.parseData(data);\r\n this.set({ data: data });\r\n }\r\n\r\n protected parseData(data: { [key: string]: any }[]): void {\r\n\r\n }\r\n\r\n private updateItemsDict() {\r\n this.itemsDict = this.getItemsDict();\r\n }\r\n\r\n getItemsDict(): { [key: string]: AppKitchen.Api.Models.EventItemInfo } {\r\n var dict: { [key: string]: AppKitchen.Api.Models.EventItemInfo } = {};\r\n var eventItems: AppKitchen.Api.Models.EventItemInfo[] = this.get().items;\r\n\r\n for (let i = 0; i < eventItems.length; i++) {\r\n var key = eventItems[i].InventoryId + \"_\" + eventItems[i].Id;\r\n dict[key] = eventItems[i];\r\n }\r\n\r\n return dict;\r\n }\r\n }\r\n\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Data {\r\n export module Import {\r\n\r\n export type CsvDataType = \"string\" | \"number\" | \"date\" | \"boolean\";\r\n export type ExcelDataType = \"string\" | \"number\" | \"date\" | \"time\" | \"time24\" | \"dateTime\";\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CsvImportOptions {\r\n firstDataRowIndex?: number;\r\n columnDelimiter?: string;\r\n rowDelimiter?: string;\r\n culture?: string;\r\n encoding?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface CsvImportColumnDefinition {\r\n field: string;\r\n type: CsvDataType;\r\n format?: string;\r\n required?: boolean;\r\n } \r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface ExcelImportColumnDefinition {\r\n field: string;\r\n type?: ExcelDataType;\r\n required?: boolean;\r\n } \r\n\r\n export function readExcelFile(file: File,\r\n columns: ExcelImportColumnDefinition[],\r\n loaded: (data: any[]) => void,\r\n error: (message: string) => void) {\r\n\r\n if (!columns || columns.length === 0) {\r\n throw \"No fields for excel import defined!\";\r\n }\r\n\r\n var reader = new FileReader();\r\n reader.onload = e => {\r\n try {\r\n var fileData = (e.target).result;\r\n var workbook = XLSX.read(btoa(fix(fileData)), { type: 'base64' });\r\n\r\n if (!workbook)\r\n throw AppKitchen.Strings.Import_InvalidFile;\r\n\r\n if (workbook.SheetNames.length === 0)\r\n throw AppKitchen.Strings.Import_InvalidFile;\r\n\r\n var sheet = workbook.Sheets[workbook.SheetNames[0]];\r\n\r\n // set sheet headers to field names\r\n for (let i = 0; i < columns.length; i++) {\r\n var columnName = String.fromCharCode(65 + i);\r\n if (sheet[columnName + \"1\"]) {\r\n sheet[columnName + \"1\"].w = columns[i].field;\r\n } else {\r\n throw AppKitchen.Strings.Import_MissingColumn + \" \" + columnName;\r\n }\r\n };\r\n\r\n // create object array\r\n var rawData = XLSX.utils.sheet_to_row_object_array(sheet);\r\n\r\n // parse object array and convert data\r\n var data = [];\r\n for (let row = 0; row < rawData.length; row++) {\r\n var parsedRow = {};\r\n for (let column = 0; column < columns.length; column++) {\r\n var cellName = String.fromCharCode(65 + column) + (row + 2);\r\n var cellValue = rawData[row][columns[column].field];\r\n\r\n if (columns[column].required && !cellValue) {\r\n throw AppKitchen.Strings.Import_MissingValueAt + \" \" + cellName;\r\n }\r\n\r\n switch (columns[column].type) {\r\n case \"number\":\r\n parsedRow[columns[column].field] = tryParseNumber(cellValue, \"en-US\", cellName);\r\n break;\r\n case \"date\":\r\n parsedRow[columns[column].field] = tryParseDate(cellValue, cellName, [\"M/d/yy\", \"d\"]);\r\n break;\r\n case \"time\":\r\n parsedRow[columns[column].field] = tryParseTime(cellValue, cellName, false);\r\n break;\r\n case \"time24\":\r\n parsedRow[columns[column].field] = tryParseTime(cellValue, cellName, true);\r\n break;\r\n case \"dateTime\":\r\n parsedRow[columns[column].field] = tryParseExcelDateTime(cellValue, cellName, [\"d/M/yy HH:mm\", \"g\"]);\r\n break;\r\n default:\r\n parsedRow[columns[column].field] = cellValue;\r\n break;\r\n }\r\n }\r\n data.push(parsedRow);\r\n }\r\n\r\n loaded(data);\r\n } catch (exception) {\r\n error(exception);\r\n }\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n export function readCsvFile(file: File,\r\n columns: CsvImportColumnDefinition[],\r\n loaded: (data: any[]) => void,\r\n error: (message: string) => void,\r\n options?: CsvImportOptions) {\r\n\r\n if (!columns || columns.length === 0) {\r\n throw \"No columns for csv import defined!\";\r\n }\r\n\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n firstDataRowIndex: 1, //assuming header\r\n columnDelimiter: \";\",\r\n rowDelimiter: \"\\r\\n\",\r\n culture: AppKitchen.GlobalSettings.culture,\r\n encoding: \"utf-8\"\r\n });\r\n\r\n var reader = new FileReader();\r\n reader.onload = e => {\r\n try {\r\n var fileData: string = (e.target).result;\r\n var lines = fileData.split(options.rowDelimiter);\r\n if (lines.length < options.firstDataRowIndex + 1) {\r\n return;\r\n }\r\n var data = [];\r\n for (let row = options.firstDataRowIndex; row < lines.length; row++) {\r\n if (!lines[row]) {\r\n continue;\r\n }\r\n var fields = lines[row].split(options.columnDelimiter);\r\n var parsedRow = {};\r\n for (let column = 0; column < columns.length; column++) {\r\n var cellName = \"row: \" + (row + 1) + \", column: \" + (column + 1);\r\n var value = fields[column];\r\n if (!value) {\r\n if (columns[column].required) {\r\n throw AppKitchen.Strings.Import_MissingValueAt + \" \" + cellName; //todo: correct string\r\n } else {\r\n parsedRow[columns[column].field] = value;\r\n continue;\r\n }\r\n }\r\n switch (columns[column].type) {\r\n case \"number\":\r\n parsedRow[columns[column].field] = tryParseNumber(value, options.culture, cellName);\r\n break;\r\n case \"date\":\r\n parsedRow[columns[column].field] = tryParseDate(value, cellName, [columns[column].format || \"g\"], options.culture);\r\n break;\r\n case \"boolean\":\r\n parsedRow[columns[column].field] = tryParseBoolean(value, cellName);\r\n break;\r\n default:\r\n parsedRow[columns[column].field] = value;\r\n break;\r\n }\r\n }\r\n data.push(parsedRow);\r\n }\r\n loaded(data);\r\n } catch (exception) {\r\n error(exception);\r\n }\r\n }\r\n reader.readAsText(file, options.encoding);\r\n }\r\n\r\n function fix(data) {\r\n var o = \"\", l = 0, w = 10240;\r\n for (; l < data.byteLength / w; ++l)\r\n o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));\r\n o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));\r\n return o;\r\n }\r\n\r\n function tryParseExcelDateTime(value: string, cell: string, formats?: string[], culture?: string): Date {\r\n var date;\r\n try {\r\n date = kendo.parseDate(value, formats, culture);\r\n if (date) {\r\n return date;\r\n }\r\n } catch (e) {}\r\n \r\n var number = parseFloat(value);\r\n if (!value || !number) {\r\n throw AppKitchen.Strings.Import_InvalidDateAt + \" \" + cell;\r\n }\r\n\r\n var localTimestamp = (number - (25567 + 2)) * 86400 * 1000;\r\n var roundCoeff = 1000 * 60;\r\n localTimestamp = Math.round(localTimestamp / roundCoeff) * roundCoeff;\r\n\r\n var utcTimetamp = localTimestamp + new Date().getTimezoneOffset() * 60000;\r\n\r\n date = new Date(utcTimetamp);\r\n\r\n return date;\r\n }\r\n\r\n function tryParseTime(value: string, cell: string, allow24: boolean): string {\r\n if (allow24) {\r\n if (value === \"24:00\") {\r\n return \"24:00\";\r\n }\r\n }\r\n\r\n var time = kendo.parseDate(value, \"HH:mm\");\r\n if (!time) {\r\n throw AppKitchen.Strings.Import_InvalidTimeAt + \" \" + cell;\r\n }\r\n\r\n var strTime = kendo.toString(time, \"HH:mm\");\r\n\r\n if (allow24 && strTime === \"00:00\") {\r\n throw AppKitchen.Strings.Import_InvalidTimeAt + \" \" + cell;\r\n }\r\n\r\n return strTime;\r\n }\r\n\r\n function tryParseNumber(value: string, culture: string, cell: string): number {\r\n if (value == null) {\r\n return null;\r\n }\r\n\r\n var number = kendo.parseFloat(value, culture);\r\n if (number == null) {\r\n throw AppKitchen.Strings.Import_InvalidNumberAt + \" \" + cell;\r\n }\r\n\r\n return number;\r\n }\r\n\r\n function tryParseDate(value: string, cell: string, formats?: string[], culture?: string): Date {\r\n var date = kendo.parseDate(value, formats, culture);\r\n if (!date) {\r\n throw AppKitchen.Strings.Import_InvalidDateAt + \" \" + cell;\r\n }\r\n\r\n return date;\r\n }\r\n\r\n function tryParseBoolean(value: string, cell: string): boolean {\r\n if (value) {\r\n if (value.toLowerCase() === \"true\") {\r\n return true;\r\n } else if (value.toLowerCase() === \"false\") {\r\n return false;\r\n } else {\r\n throw AppKitchen.Strings.Import_InvalidBooleanAt + \" \" + cell; //todo: correct string\r\n }\r\n } else {\r\n return null; //or undefined?\r\n }\r\n }\r\n }\r\n }\r\n}","module AppKitchen {\r\n export module Data {\r\n\r\n // ReSharper disable InconsistentNaming\r\n export interface JobLog {\r\n PrimaryKey: number;\r\n PlannedSchedule: Date;\r\n ResultLevel: string;\r\n RunBegin: Date;\r\n RunEnd: Date;\r\n JobId: string;\r\n JobNr: number;\r\n RunUserId: string;\r\n RunComputer: string;\r\n TechnicalError: string;\r\n }\r\n // ReSharper restore InconsistentNaming\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobLogLoaderAttributes {\r\n data?: JobLog[];\r\n loading?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface JobLogLoadOptions extends LoadOptionsBase {\r\n success?: (data: JobLog[]) => void;\r\n }\r\n\r\n export class JobLogLoader extends AppKitchen.ModelBase {\r\n request: JQueryXHR;\r\n\r\n constructor() {\r\n super({\r\n data: [],\r\n loading: false\r\n });\r\n }\r\n\r\n loadLogs(request: AppKitchen.Api.Models.JobLogRequest, options?: JobLogLoadOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n silent: false,\r\n success: () => {}\r\n });\r\n\r\n // abort previous request\r\n this.abortRequest();\r\n\r\n if (!options.silent) {\r\n this.set({ loading: true });\r\n }\r\n\r\n // start new request\r\n this.request = AppKitchen.Data.Api.getJobLog(request, data => {\r\n this.processLoadedData(data);\r\n options.success(this.get().data);\r\n }, (request) => {\r\n options.error(request);\r\n });\r\n }\r\n \r\n abortRequest() {\r\n if (this.request) {\r\n this.request.abort();\r\n this.set({ loading: false });\r\n }\r\n }\r\n\r\n private processLoadedData(data: AppKitchen.Api.Models.JobLog[]) {\r\n var jobLogs: JobLog[] = [];\r\n if (data) {\r\n for (let i = 0; i < data.length; i++) {\r\n var jobLog: JobLog = data[i];\r\n jobLog.PlannedSchedule = kendo.parseDate(data[i].PlannedSchedule, \"yyyy-MM-ddTHH:mm:ss\");\r\n jobLog.RunBegin = kendo.parseDate(data[i].RunBegin, \"yyyy-MM-ddTHH:mm:ss\");\r\n jobLog.RunEnd = kendo.parseDate(data[i].RunEnd, \"yyyy-MM-ddTHH:mm:ss\");\r\n if (jobLog.RunEnd <= new Date(1900, 0, 1)) {\r\n jobLog.RunEnd = null;\r\n }\r\n jobLogs.push(jobLog);\r\n }\r\n }\r\n\r\n this.setData(jobLogs);\r\n }\r\n\r\n private setData(data: JobLog[]) {\r\n this.set({ data: data });\r\n this.set({ loading: false });\r\n }\r\n\r\n }\r\n\r\n\r\n // ReSharper disable InconsistentNaming\r\n export interface TaskLog {\r\n PrimaryKey: number;\r\n PlannedSchedule: Date;\r\n ResultLevel: string;\r\n RunBegin: Date;\r\n RunEnd: Date;\r\n JobId: string;\r\n JobNr: number;\r\n RunUserId: string;\r\n RunComputer: string;\r\n TechnicalError: string;\r\n }\r\n // ReSharper restore InconsistentNaming\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TaskLogLoaderAttributes {\r\n data?: JobLog[];\r\n loading?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TaskLogLoadOptions extends LoadOptionsBase {\r\n success?: (data: JobLog[]) => void;\r\n }\r\n\r\n export class TaskLogLoader extends AppKitchen.ModelBase {\r\n request: JQueryXHR;\r\n\r\n constructor() {\r\n super({\r\n data: [],\r\n loading: false\r\n });\r\n }\r\n\r\n loadLogs(request: AppKitchen.Api.Models.TaskLogRequest, options?: TaskLogLoadOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n silent: false,\r\n success: () => { }\r\n });\r\n\r\n // abort previous request\r\n this.abortRequest();\r\n\r\n if (!options.silent) {\r\n this.set({ loading: true });\r\n }\r\n\r\n // start new request\r\n this.request = AppKitchen.Data.Api.getTaskLog(request, data => {\r\n this.processLoadedData(data);\r\n options.success(this.get().data);\r\n }, (request) => {\r\n options.error(request);\r\n });\r\n }\r\n\r\n abortRequest() {\r\n if (this.request) {\r\n this.request.abort();\r\n this.set({ loading: false });\r\n }\r\n }\r\n\r\n private processLoadedData(data: AppKitchen.Api.Models.TaskLog[]) {\r\n var taskLogs: TaskLog[] = [];\r\n if (data) {\r\n for (let i = 0; i < data.length; i++) {\r\n var taskLog: TaskLog = data[i];\r\n taskLog.RunBegin = kendo.parseDate(data[i][\"RunBegin\"], \"yyyy-MM-ddTHH:mm:ss\");\r\n taskLog.RunEnd = kendo.parseDate(data[i][\"RunEnd\"], \"yyyy-MM-ddTHH:mm:ss\");\r\n if (taskLog.RunEnd <= new Date(1900, 0, 1)) {\r\n taskLog.RunEnd = null;\r\n }\r\n taskLogs.push(taskLog);\r\n }\r\n }\r\n\r\n this.setData(taskLogs);\r\n }\r\n\r\n private setData(data: TaskLog[]) {\r\n this.set({ data: data });\r\n this.set({ loading: false });\r\n }\r\n\r\n }\r\n\r\n }\r\n}\r\n","module AppKitchen {\r\n\r\n export module Data {\r\n import TimeseriesDataSaveRequest = AppKitchen.Api.Models.TimeseriesDataSaveRequest;\r\n\r\n export abstract class TimeseriesDataLoaderBase extends AppKitchen.ModelBase {\r\n abstract loadData(startDate: Date, endDate: Date, timeResolution2?: Mesap.Framework.Common.TimeResolution, startDate2?: Date, endDate2?: Date, options?: TimeseriesDataLoadOptions): void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataLoaderAttributes extends AppKitchen.ModelBaseAttributes {\r\n data?: AppKitchen.Data.TimeSeries.Model.ChartData[];\r\n startDate?: Date;\r\n endDate?: Date;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataLoadOptions extends LoadOptionsBase {\r\n success?: (data: AppKitchen.Data.TimeSeries.Model.ChartData[]) => void;\r\n fillUpWithNullValues?: boolean;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataSaveOptions extends LoadOptionsBase {\r\n success?: () => void;\r\n }\r\n\r\n export class TimeseriesDataLoader extends TimeseriesDataLoaderBase {\r\n loadRequest: JQueryXHR;\r\n saveRequest: JQueryXHR;\r\n timeseries: AppKitchen.Api.Models.TimeseriesSimpleDefinition[];\r\n timeResolution: Mesap.Framework.Common.TimeResolution;\r\n\r\n constructor(timeseries: AppKitchen.Api.Models.TimeseriesSimpleDefinition[], timeResolution: Mesap.Framework.Common.TimeResolution) {\r\n super({\r\n data: [],\r\n loading: false\r\n });\r\n\r\n this.timeseries = timeseries;\r\n this.timeResolution = timeResolution;\r\n }\r\n\r\n loadData(startDate: Date, endDate: Date,\r\n timeResolution2?: Mesap.Framework.Common.TimeResolution, startDate2?: Date, endDate2?: Date,\r\n options?: TimeseriesDataLoadOptions) {\r\n\r\n options = AppKitchen.OptionsHelper.merge(options,\r\n {\r\n silent: false,\r\n success: () => { },\r\n error: () => { },\r\n fillUpWithNullValues: true\r\n });\r\n\r\n // abort previous request\r\n this.abortLoadRequest();\r\n\r\n if (!options.silent) {\r\n this.set({ loading: true });\r\n }\r\n\r\n var requestApi: (request: any,callback: any, errorCallback: any) => JQueryXHR;\r\n\r\n // start new request\r\n if (options.api) {\r\n requestApi = AppKitchen.Data.getData.bind(this, options.api);\r\n } else {\r\n requestApi = AppKitchen.Data.Api.getTimeseriesData;\r\n }\r\n\r\n this.loadRequest = requestApi({\r\n TimeseriesSimpleDefinitions: this.timeseries,\r\n TimeResolution: this.timeResolution,\r\n StartDate: startDate,\r\n EndDate: endDate,\r\n TimeResolution2: timeResolution2,\r\n StartDate2: startDate2,\r\n EndDate2: endDate2,\r\n FillUpWithNullValues: options.fillUpWithNullValues\r\n },\r\n data => {\r\n this.processLoadedData(data, startDate, endDate);\r\n options.success(this.get().data);\r\n },\r\n (request) => {\r\n options.error(request);\r\n });\r\n }\r\n\r\n saveData(timeseries: AppKitchen.Api.Models.TimeseriesDataSaveEntity[], options?: TimeseriesDataSaveOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n silent: false,\r\n success: () => { },\r\n error: () => { }\r\n });\r\n\r\n // abort previous request\r\n this.abortSaveRequest();\r\n\r\n if (!options.silent) {\r\n this.set({ loading: true });\r\n }\r\n\r\n var requestApi: (request: TimeseriesDataSaveRequest, callback: any, errorCallback: any) => JQueryXHR;\r\n\r\n // start new request\r\n if (options.api) {\r\n requestApi = AppKitchen.Data.getData.bind(this, options.api);\r\n } else {\r\n requestApi = AppKitchen.Data.Api.updateTimeseriesData;\r\n }\r\n\r\n this.saveRequest = requestApi({\r\n TimeResolution: this.timeResolution,\r\n Timeseries: timeseries\r\n },\r\n response => {\r\n if (response) {\r\n options.success();\r\n } else {\r\n options.error();\r\n }\r\n },\r\n error => {\r\n options.error(error);\r\n });\r\n }\r\n\r\n abortRequests() {\r\n this.abortLoadRequest();\r\n this.abortSaveRequest();\r\n }\r\n\r\n private abortLoadRequest() {\r\n if (this.loadRequest) {\r\n this.loadRequest.abort();\r\n this.set({ loading: false });\r\n }\r\n }\r\n\r\n private abortSaveRequest() {\r\n if (this.saveRequest) {\r\n this.saveRequest.abort();\r\n this.set({ loading: false });\r\n }\r\n }\r\n\r\n private processLoadedData(data: AppKitchen.Data.TimeSeries.Model.ChartData[], startDate: Date, endDate: Date) {\r\n this.setData(data, startDate, endDate);\r\n }\r\n\r\n private setData(data: AppKitchen.Data.TimeSeries.Model.ChartData[], startDate: Date, endDate: Date) {\r\n this.set({\r\n data: data,\r\n startDate: startDate,\r\n endDate: endDate\r\n });\r\n this.set({ loading: false });\r\n }\r\n\r\n }\r\n\r\n }\r\n}\r\n","module AppKitchen {\r\n export module Data {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesLoadOptions extends LoadOptionsBase {\r\n success?: (timeseries: AppKitchen.Api.Models.Timeseries[]) => void;\r\n error?: (request: JQueryXHR) => void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesInfoLoadOptions extends LoadOptionsBase {\r\n success?: (timeseriesInfo: AppKitchen.Api.Models.TimeseriesInfo[]) => void;\r\n error?: (request: JQueryXHR) => void;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataLoaderOptions {\r\n includeKeys?: boolean;\r\n timeseriesApi?: string;\r\n timeseriesInfoApi?: string;\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesLoaderAttributes {\r\n timeseries?: AppKitchen.Api.Models.Timeseries[];\r\n dimensions?: AppKitchen.Api.Models.Dimension[];\r\n loading?: boolean;\r\n }\r\n\r\n export class TimeseriesLoader extends AppKitchen.ModelBase {\r\n timeseriesRequest: JQueryXHR;\r\n timeseriesInfoRequest: JQueryXHR;\r\n options: TimeseriesDataLoaderOptions;\r\n\r\n protected timeseriesInfoCache: { [tsIds: string]: AppKitchen.Api.Models.TimeseriesInfo };\r\n\r\n constructor(ready: (loader: TimeseriesLoader) => void, options?: TimeseriesDataLoaderOptions) {\r\n super({\r\n timeseries: [],\r\n dimensions: [],\r\n loading: false\r\n });\r\n\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n includeKeys: false,\r\n timeseriesApi: \"Timeseries\",\r\n timeseriesInfoApi: \"TimeseriesInfo\"\r\n });\r\n\r\n if (this.options.includeKeys) {\r\n this.loadDimensions(() => ready(this));\r\n } else {\r\n ready(this);\r\n }\r\n }\r\n\r\n private loadDimensions(ready: () => void) {\r\n AppKitchen.Data.Api.getDimensions({}, dimensions => {\r\n this.set({ dimensions: dimensions });\r\n ready();\r\n });\r\n }\r\n\r\n loadAll(options?: TimeseriesLoadOptions) {\r\n this.load({\r\n IncludeKeys: this.options.includeKeys\r\n }, options);\r\n }\r\n\r\n loadByDescriptors(descriptors: AppKitchen.Api.Models.DescriptorKey[], exactMatch?: boolean, options?: TimeseriesLoadOptions) {\r\n this.load({\r\n IncludeKeys: this.options.includeKeys,\r\n Keys: descriptors,\r\n ExactMatch: exactMatch\r\n }, options);\r\n }\r\n\r\n load(requestData: AppKitchen.Api.Models.TimeseriesRequest, options?: TimeseriesLoadOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n silent: false,\r\n success: () => {},\r\n error: () => {}\r\n });\r\n\r\n // abort previous request\r\n this.abortTimeseriesRequest();\r\n\r\n if (!options.silent) {\r\n this.set({ loading: true });\r\n }\r\n\r\n // start new request\r\n var api = options.api || this.options.timeseriesApi;\r\n if (api === \"Timeseries\") {\r\n this.timeseriesRequest = AppKitchen.Data.Api.getTimeseries(requestData, timeseries => {\r\n this.set({ timeseries: timeseries });\r\n this.set({ loading: false });\r\n options.success(timeseries);\r\n }, (request) => {\r\n this.set({ loading: false });\r\n options.error(request);\r\n });\r\n } else {\r\n this.timeseriesRequest = AppKitchen.Data.getData(api, requestData, timeseries => {\r\n this.set({ timeseries: timeseries });\r\n this.set({ loading: false });\r\n options.success(timeseries);\r\n }, (request) => {\r\n this.set({ loading: false });\r\n options.error(request);\r\n });\r\n }\r\n }\r\n\r\n loadInfo(requestData: AppKitchen.Api.Models.TimeseriesInfoRequest, options?: TimeseriesInfoLoadOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n success: () => { },\r\n error: () => { }\r\n });\r\n\r\n // abort previous request\r\n this.abortTimeseriesInfoRequest();\r\n\r\n\r\n // start new request\r\n var api = options.api || this.options.timeseriesInfoApi;\r\n if (api === \"TimeseriesInfo\") {\r\n this.timeseriesRequest = AppKitchen.Data.Api.getTimeseriesInfo(requestData, timeseriesInfo => {\r\n this.set({ timeseries: timeseriesInfo });\r\n options.success(timeseriesInfo);\r\n }, (request) => {\r\n options.error(request);\r\n });\r\n } else {\r\n this.timeseriesRequest = AppKitchen.Data.getData(api, requestData, timeseries => {\r\n this.set({ timeseries: timeseries });\r\n options.success(timeseries);\r\n }, (request) => {\r\n options.error(request);\r\n });\r\n }\r\n }\r\n\r\n getAdditionalInfo(tsIds: string[], loaded: (timeseriesInfo: { [tsIds: string]: AppKitchen.Api.Models.TimeseriesInfo }) => void, error?: (message: string) => void) {\r\n var anyMissing = this.timeseriesInfoCache == null;\r\n\r\n this.timeseriesInfoCache = this.timeseriesInfoCache || {};\r\n\r\n for (let i = 0; i < tsIds.length; i++) {\r\n if (!this.timeseriesInfoCache[tsIds[i]]) {\r\n anyMissing = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!anyMissing) {\r\n loaded(this.timeseriesInfoCache);\r\n } else {\r\n this.loadInfo({\r\n Ids: tsIds\r\n },\r\n {\r\n success: timeseriesInfo => {\r\n timeseriesInfo.forEach(info => {\r\n this.timeseriesInfoCache[info.Id] = info;\r\n });\r\n loaded(this.timeseriesInfoCache);\r\n },\r\n error: request => {\r\n if (error) {\r\n error(request.responseText);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n abortRequests() {\r\n this.abortTimeseriesRequest();\r\n this.abortTimeseriesInfoRequest();\r\n }\r\n\r\n protected abortTimeseriesRequest() {\r\n if (this.timeseriesRequest) {\r\n this.timeseriesRequest.abort();\r\n this.set({ loading: false });\r\n }\r\n }\r\n\r\n protected abortTimeseriesInfoRequest() {\r\n if (this.timeseriesInfoRequest) {\r\n this.timeseriesInfoRequest.abort();\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n}\r\n","/// \r\n/// \r\n\r\nmodule AppKitchen {\r\n\r\n export module FrameManager {\r\n\r\n var mainHeader: HTMLElement;\r\n export function hideHeader() {\r\n $(mainHeader).hide(0);\r\n $(\"body\").css(\"min-width\", \"auto\");\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface UserMenuOptions extends AppKitchen.AppBaseOptions {\r\n simpleMenu?: boolean;\r\n changePassword?: boolean;\r\n extendedUserInfo?: boolean;\r\n customItems?: MenuItem[];\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface HelpMenuOptions {\r\n hide?: boolean;\r\n aboutAppName?: string;\r\n customItems?: MenuItem[];\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface MainAppOptions extends AppBaseOptions {\r\n apps: RoutedApp[];\r\n mainMenu?: MenuItem;\r\n userMenu?: UserMenuOptions;\r\n helpMenu?: HelpMenuOptions;\r\n template?: string;\r\n started?: () => void;\r\n }\r\n\r\n export class MainApp extends AppKitchen.AppBase{\r\n appContainer: HTMLElement;\r\n mainMenuContainer: HTMLElement;\r\n burgerMenuContainer: HTMLElement;\r\n pageTitleContainer: HTMLElement;\r\n\r\n constructor(targetContainer: HTMLElement, options?: MainAppOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, {\r\n apps: [],\r\n mainMenu: undefined,\r\n userMenu: {\r\n simpleMenu: false,\r\n changePassword: true,\r\n extendedUserInfo: false,\r\n customItems: []\r\n },\r\n helpMenu: {\r\n hide: false,\r\n aboutAppName: AppKitchen.Strings.About + \" \" + (options ? (options.title || options.mainMenu ? options.mainMenu.label : \"\") : \"\"),\r\n customItems: []\r\n },\r\n template: AppKitchen.Templates.DefaultHeader,\r\n title: options && options.mainMenu ? options.mainMenu.label : \"\",\r\n started: undefined\r\n }, true);\r\n\r\n super(targetContainer, options);\r\n }\r\n\r\n start() {\r\n AppKitchen.UIHelper.Transitions.introduce(this.$el[0], 300, () => {\r\n this.render();\r\n if (this.options.started) {\r\n this.options.started();\r\n }\r\n });\r\n }\r\n\r\n setMenu(mainMenu: MenuItem) {\r\n this.createMainMenu(mainMenu, this.mainMenuContainer);\r\n }\r\n\r\n private createMainMenu(mainMenu: MenuItem, menuContainer:HTMLElement) {\r\n var menu: kendo.ui.Menu = $(menuContainer).kendoMenu({\r\n dataSource: mainMenu.getMenuDefinition().items,\r\n direction: $(menuContainer).attr(\"data-direction\") || undefined,\r\n close: this.handleMenuCloseEvent.bind(this),\r\n select: this.handleMenuSelectEvent.bind(this),\r\n open: this.handleMenuOpenEvent.bind(this)\r\n }).data(\"kendoMenu\");\r\n\r\n this.updateTabindex(menuContainer, 1);\r\n\r\n // open in new window links\r\n $(menuContainer).find(\".a-menu-new-window > a\").attr(\"target\", \"_blank\");\r\n\r\n // force navigate links\r\n $(menuContainer).find(\".a-menu-force-navigate a\").click((e) => {\r\n var href = $(e.target).attr(\"href\") || \"\";\r\n if (href.beginsWith(\"#\")) {\r\n e.preventDefault();\r\n AppKitchen.getRouter().navigate(href, true);\r\n }\r\n });\r\n\r\n // highlight selected items with highlightOnNavigate option\r\n this.highlightMenuItemForRoute($(this.appContainer).attr(\"app-route\"), menuContainer);\r\n\r\n // open selected items with keepOpenOnSelected option\r\n if (menu) {\r\n menu.open($(menuContainer).find(\".a-menu-selected.a-menu-keep-on-selected\"));\r\n\r\n $(this.appContainer).on(\"app-starting\", () => {\r\n this.highlightMenuItemForRoute($(this.appContainer).attr(\"app-route\"), menuContainer);\r\n menu.close($(menuContainer).find(\".a-menu-keep-on-selected\"));\r\n menu.open($(menuContainer).find(\".a-menu-selected.a-menu-keep-on-selected\"));\r\n });\r\n }\r\n\r\n AppKitchen.UIHelper.updateFullHeightGrids();\r\n }\r\n\r\n private createBurgerMenu(mainMenu: MenuItem, menuContainer: HTMLElement) {\r\n $(menuContainer).kendoMenu({\r\n dataSource: [\r\n this.getHelpMenuDefinition(),\r\n this.getUserMenuDefinition(),\r\n this.getBurgerMenuDefinition(mainMenu)\r\n ],\r\n direction: $(menuContainer).attr(\"data-direction\") || undefined,\r\n openOnClick: true\r\n });\r\n\r\n let dropDownContainer = $(menuContainer).find(\"ul.k-menu-group\")[2];\r\n let burgerMenuContainer = $('
          ').addClass('a-burger-menu-container').appendTo(dropDownContainer);\r\n\r\n this.createBurgerMenuList(burgerMenuContainer, mainMenu, menuContainer);\r\n\r\n AppKitchen.UIHelper.updateFullHeightGrids();\r\n\r\n $(window).on(\"resize load\", () => {\r\n let height = $(dropDownContainer).height();\r\n let screenHight = $(window).height() - 60;\r\n// console.log(\"resize, load... :\" + height + \", \" + screenHight);\r\n if (height > screenHight) {\r\n $(burgerMenuContainer).height(screenHight);\r\n }\r\n }).resize();\r\n\r\n\r\n\r\n this.createUserMenuIcon($(menuContainer).find(\".a-burger-menu\"), \"menu-32px\");\r\n\r\n this.configureUserMenu($(menuContainer).find(\".a-user-menu\"));\r\n if (!this.options.helpMenu.hide) {\r\n this.configureHelpMenu($(menuContainer).find(\".a-help-menu\"));\r\n }\r\n\r\n this.highlightBurgerMenuItemForRoute($(this.appContainer).attr(\"app-route\"), menuContainer);\r\n }\r\n\r\n private createBurgerMenuList(burgerMenuContainer: JQuery, mainMenu: MenuItem, menuContainer: HTMLElement) {\r\n let ul = $('
            ').addClass('a-menu-list').appendTo(burgerMenuContainer);\r\n for (let child of mainMenu.children) {\r\n let li = this.renderBurgerMenuItem(ul, child, \"a-menu-first-items\", menuContainer);\r\n\r\n if (child.children) {\r\n let subUl = $('
              ').appendTo(li);\r\n for (let subChild of child.children) {\r\n let subLi = this.renderBurgerMenuItem(subUl, subChild, \"a-menu-second-items\", menuContainer);\r\n\r\n if (subChild.children) {\r\n let subSubUl = $('
                ').appendTo(subLi);\r\n for (let subSubChild of subChild.children) {\r\n this.renderBurgerMenuItem(subSubUl, subSubChild, \"a-menu-third-items\", menuContainer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private renderBurgerMenuItem(menuLayerUl: JQuery, menuItem: MenuItem, cssClass: string, menuContainer: HTMLElement): JQuery {\r\n let menuItemLi = $('
              • ').addClass(`${cssClass} a-menu-highlight-on-navigate`).appendTo(menuLayerUl);\r\n if (menuItem.options.route) {\r\n $(`${menuItem.label}`).appendTo(menuItemLi);\r\n menuItemLi.click(() => this.highlightBurgerMenuItemForRoute(menuItem.options.route, menuContainer));\r\n } else if (menuItem.options.url) {\r\n let urlAnchor = $(`${menuItem.label}`);\r\n if (menuItem.options.newWindow) {\r\n urlAnchor.attr(\"target\", \"_blank\");\r\n }\r\n urlAnchor.appendTo(menuItemLi);\r\n } else {\r\n $(`

                ${menuItem.label}

                `).appendTo(menuItemLi);\r\n }\r\n return menuItemLi;\r\n }\r\n\r\n private updateTabindex(menuContainer: HTMLElement, offset: number) {\r\n if (menuContainer == null) {\r\n return;\r\n }\r\n menuContainer.removeAttribute(\"tabindex\");\r\n $(menuContainer).find(\"> .k-item\").each((i, e) => {\r\n $(e).prop(\"tabindex\", i + offset);\r\n });\r\n }\r\n \r\n private handleMenuCloseEvent(event: kendo.ui.MenuCloseEvent) {\r\n var $el = $(event.item);\r\n if ($el.hasClass(\"a-menu-keep-on-selected\") && $el.hasClass(\"a-menu-selected\")) {\r\n event.preventDefault();\r\n }\r\n this.updateSubmenuOpenedFlag(event.sender.element[0]);\r\n }\r\n\r\n private handleMenuOpenEvent(event: kendo.ui.MenuCloseEvent) {\r\n this.updateSubmenuOpenedFlag(event.sender.element[0]);\r\n }\r\n\r\n private updateSubmenuOpenedFlag(menuContainer: HTMLElement) {\r\n if ($(menuContainer).find(\".a-menu-keep-on-selected.a-menu-selected\").length > 0) {\r\n $(mainHeader).addClass(\"a-submenu-open\");\r\n } else {\r\n $(mainHeader).removeClass(\"a-submenu-open\");\r\n }\r\n }\r\n\r\n private updatePageTilte(name: string) {\r\n if (this.pageTitleContainer) {\r\n this.pageTitleContainer.innerText = name;\r\n }\r\n }\r\n\r\n private handleMenuSelectEvent(event: kendo.ui.MenuSelectEvent) {\r\n // highlight on navigate\r\n var hrefParser = /#\\/(.+)\\//.exec($(event.item).find(\"> a\").attr(\"href\"));\r\n if (hrefParser && hrefParser.length > 1) {\r\n var route = hrefParser[1];\r\n this.highlightMenuItemForRoute(route, event.sender.element[0]);\r\n\r\n // close other items with keepOpenOnSelected option\r\n event.sender.close($(event.sender.element).find(\".a-menu-keep-on-selected\"));\r\n }\r\n }\r\n\r\n highlightBurgerMenuItemForRoute(route: string, menuContainer: HTMLElement) {\r\n $(menuContainer).find(\".a-menu-selected\").removeClass(\"a-menu-selected\");\r\n $(menuContainer).find(\".a-menu-highlight-on-navigate\").each((i, e) => {\r\n var href = $(e).find(\"> a\").attr(\"href\") || \"\";\r\n if (href.beginsWith(\"#/\" + route + \"/\")) {\r\n $(e).addClass(\"a-menu-selected\");\r\n\r\n this.updatePageTilte($(e).find(\"> a\").text());\r\n }\r\n });\r\n if (route === \"\") {\r\n this.updatePageTilte(\"\");\r\n }\r\n }\r\n\r\n highlightMenuItemForRoute(route: string, menuContainer: HTMLElement) {\r\n $(menuContainer).find(\".a-menu-selected\").removeClass(\"a-menu-selected\");\r\n $(menuContainer).find(\".a-menu-highlight-on-navigate\").each((i, e) => {\r\n var href = $(e).find(\"> a\").attr(\"href\") || \"\";\r\n if (href.beginsWith(\"#/\" + route + \"/\")) {\r\n $(e).addClass(\"a-menu-selected\");\r\n $(e).parents(\".k-item[role=menuitem]\").addClass(\"a-menu-selected\");\r\n }\r\n });\r\n\r\n this.highlightBurgerMenuItemForRoute(route, this.burgerMenuContainer);\r\n }\r\n\r\n registerRoutedApp(app: RoutedApp, targetContainer: HTMLElement) {\r\n var router = AppKitchen.getRouter();\r\n var appRoute = (app.route === \"\") ? \"*path\" : app.route + \"/*path\";\r\n router.route(appRoute, app.route, () => {\r\n AppKitchen.UIHelper.hideTooltips();\r\n document.title = (app.defaultOptions.title ? app.defaultOptions.title + \" - \" : \"\") + this.options.title;\r\n app.startRoutedApp(targetContainer, { parent: this });\r\n });\r\n }\r\n\r\n private render() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.$el[0], this.options.template, {\r\n title: this.options.title\r\n });\r\n\r\n document.title = this.options.title;\r\n\r\n mainHeader = this.$el.find(\".a-main > .a-header\")[0];\r\n this.appContainer = this.$el.find(\".a-main > .a-content\")[0];\r\n this.mainMenuContainer = this.$el.find(\".a-main > .a-header .a-header-menu\")[0];\r\n var userMenuContainer = this.$el.find(\".a-main > .a-header .a-header-usermenu\")[0];\r\n this.burgerMenuContainer = this.$el.find(\".a-main > .a-header .a-header-burger-menu\")[0];\r\n this.pageTitleContainer = this.$el.find(\".a-main > .a-header .a-header-page-title\")[0];\r\n\r\n\r\n // Routing\r\n this.options.apps.forEach(app => {\r\n this.registerRoutedApp(app, this.appContainer);\r\n });\r\n\r\n Backbone.history.stop();\r\n Backbone.history.start();\r\n\r\n // Menus\r\n if (this.options.mainMenu) {\r\n this.createMainMenu(this.options.mainMenu, this.mainMenuContainer);\r\n\r\n this.createBurgerMenu(this.options.mainMenu, this.burgerMenuContainer);\r\n }\r\n\r\n if (this.getUserName()) {\r\n $(userMenuContainer).kendoMenu({\r\n dataSource: this.options.helpMenu.hide ?\r\n [\r\n this.getUserMenuDefinition()\r\n ]\r\n : [\r\n this.getHelpMenuDefinition(),\r\n this.getUserMenuDefinition()\r\n ],\r\n direction: $(userMenuContainer).attr(\"data-direction\") || undefined,\r\n openOnClick: true\r\n });\r\n\r\n this.updateTabindex(userMenuContainer, 8);\r\n\r\n // open in new window links\r\n $(userMenuContainer).find(\".a-menu-new-window > a\").attr(\"target\", \"_blank\");\r\n\r\n this.configureUserMenu($(userMenuContainer).find(\".a-user-menu\"));\r\n if (!this.options.helpMenu.hide) {\r\n this.configureHelpMenu($(userMenuContainer).find(\".a-help-menu\"));\r\n }\r\n }\r\n\r\n // update full height grids\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n\r\n // navigate event on browser navigation\r\n window.onpopstate = () => {\r\n $(\"body\").trigger(\"navigate\");\r\n }\r\n }\r\n\r\n private getBurgerMenuDefinition(menuItem: MenuItem) {\r\n var burgerMenu = new MenuItem(\"Menu\", {}, []);\r\n var menuDefinition = burgerMenu.getMenuDefinition();\r\n\r\n menuDefinition.cssClass = \"a-burger-menu\";\r\n\r\n return menuDefinition;\r\n }\r\n\r\n private getUserMenuDefinition() {\r\n var userMenu = new MenuItem(this.getUserName(), {}, this.options.userMenu.customItems || []);\r\n var menuDefinition = userMenu.getMenuDefinition();\r\n\r\n menuDefinition.cssClass = \"a-user-menu\";\r\n\r\n // add logout item\r\n menuDefinition[\"items\"].push({ text: AppKitchen.Strings.Logout, cssClass: \"a-logout-link\" });\r\n\r\n return menuDefinition;\r\n }\r\n\r\n private getHelpMenuDefinition() {\r\n var helpMenu = new MenuItem(AppKitchen.Strings.Help, {}, this.options.helpMenu.customItems || []);\r\n var menuDefinition = helpMenu.getMenuDefinition();\r\n\r\n menuDefinition.cssClass = \"a-help-menu\";\r\n\r\n // add logout item\r\n menuDefinition[\"items\"].push({ text: this.options.helpMenu.aboutAppName, cssClass: \"a-about-link\" });\r\n\r\n return menuDefinition;\r\n }\r\n\r\n private configureUserMenu(menuContainer: JQuery) {\r\n // user icon with tooltip\r\n this.createUserMenuIcon(menuContainer, \"user\");\r\n \r\n // menu app\r\n if (!this.options.userMenu.simpleMenu) {\r\n // ReSharper disable once WrongExpressionStatement\r\n new AppKitchen.Apps.ExtendedUserMenuApp(menuContainer.find(\"ul.k-menu-group\")[0], this.options.userMenu);\r\n menuContainer.find(\"ul.k-menu-group\").addClass(\"a-extended-menu-wrapper\");\r\n }\r\n\r\n // logout action\r\n menuContainer.find(\".a-logout-link\").click(e => {\r\n e.preventDefault();\r\n this.$el.fadeOut(400, () => {\r\n setTimeout(() => this.logout(), 300);\r\n });\r\n });\r\n }\r\n\r\n private configureHelpMenu(menuContainer: JQuery) {\r\n // icon with tooltip\r\n this.createUserMenuIcon(menuContainer, \"help\");\r\n\r\n // about action\r\n menuContainer.find(\".a-about-link\").click(e => {\r\n e.preventDefault();\r\n new AppKitchen.FrameManager.AppHolder(AppKitchen.Apps.CreditsApp).startInWindow({\r\n maxWidth: \"53em\",\r\n width: \"100%\",\r\n maxHeight: \"30em\",\r\n height: \"calc(100% - 48px)\",\r\n buttons: [\r\n {\r\n name: Strings.Close,\r\n icon: \"close\",\r\n action: (window: kendo.ui.Window) => { window.close() }\r\n }],\r\n modal: true,\r\n easyClose: true,\r\n center: true,\r\n windowCssClass: \"a-about-window\"\r\n });\r\n });\r\n }\r\n\r\n private createUserMenuIcon(menuContainer: JQuery, icon: string) {\r\n var menu: kendo.ui.Menu = menuContainer.closest(\".k-menu\").data(\"kendoMenu\");\r\n\r\n var menuLabel = menuContainer.find(\" > span.k-link\").text();\r\n menuContainer.find(\"> span.k-link\").html('');\r\n \r\n var tooltip: kendo.ui.Tooltip = menuContainer.find(\"> span.k-link\").css(\"padding-left\", \"2.4em\").kendoTooltip({\r\n content: menuLabel,\r\n position: \"bottom\",\r\n show: e => {\r\n if (menuContainer.find(\".k-animation-container\").is(\":visible\")) {\r\n e.sender.hide();\r\n }\r\n AppKitchen.UIHelper.hideTooltips(e.sender);\r\n },\r\n showAfter: 300\r\n }).data(\"kendoTooltip\");\r\n\r\n if (menu) {\r\n // hack: do not show tooltip when menu is open\r\n menu.bind(\"open\",\r\n () => {\r\n if (tooltip && tooltip.popup) {\r\n tooltip.hide();\r\n tooltip.popup.wrapper.css(\"opacity\", 0);\r\n }\r\n });\r\n\r\n menu.bind(\"close\",\r\n () => {\r\n if (tooltip && tooltip.popup) {\r\n tooltip.popup.wrapper.css(\"opacity\", \"\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n getUserName(): string {\r\n return LoginManager.getCurrentUser();\r\n }\r\n\r\n logout() {\r\n LoginManager.logout(true);\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface MenuItemOptions {\r\n route?: string;\r\n parameters?: { [parameter: string]: string };\r\n url?: string;\r\n newWindow?: boolean;\r\n forceNavigate?: boolean;\r\n highlightOnNavigate?: boolean;\r\n keepOpenOnSelected?: boolean;\r\n cssClass?: string;\r\n }\r\n\r\n export class MenuItem {\r\n label: string;\r\n children: MenuItem[];\r\n options: MenuItemOptions;\r\n\r\n constructor(label: string, options?: MenuItemOptions, children?: MenuItem[]) {\r\n this.label = label;\r\n this.children = children;\r\n this.options = AppKitchen.OptionsHelper.merge(options, {\r\n route: undefined,\r\n parameters: undefined,\r\n url: undefined,\r\n forceNavigate: false,\r\n newWindow: false,\r\n keepOpenOnSelected: false,\r\n highlightOnNavigate: false,\r\n cssClass: \"\"\r\n });\r\n }\r\n\r\n visitChildren(visitor: (item: MenuItem) => void, includeSelf: boolean): void {\r\n if (includeSelf) {\r\n visitor(this);\r\n }\r\n\r\n if (!this.children) {\r\n return;\r\n }\r\n\r\n this.children.forEach(child => {\r\n visitor(child);\r\n child.visitChildren(visitor, false);\r\n });\r\n }\r\n\r\n getMenuDefinition() {\r\n var definition: any = {\r\n text: this.label\r\n }\r\n\r\n if (this.options.url) {\r\n definition[\"url\"] = this.options.url;\r\n } else {\r\n if (this.options.route != null) {\r\n definition[\"url\"] = this.options.route? \"#/\" + this.options.route + \"/\" : \"#\";\r\n if (this.options.parameters) {\r\n definition[\"url\"] += \"?\" + $.param(this.options.parameters);\r\n }\r\n }\r\n }\r\n\r\n if (this.children) {\r\n var items = [];\r\n this.children.forEach((item) => items.push(item.getMenuDefinition()));\r\n definition[\"items\"] = items;\r\n }\r\n\r\n definition[\"cssClass\"] = this.options.cssClass || \"\";\r\n\r\n if (this.options.newWindow) {\r\n definition[\"cssClass\"] += \" a-menu-new-window\";\r\n } else if (this.options.forceNavigate) {\r\n definition[\"cssClass\"] += \" a-menu-force-navigate\";\r\n }\r\n\r\n if (this.options.highlightOnNavigate) {\r\n definition[\"cssClass\"] += \" a-menu-highlight-on-navigate\";\r\n }\r\n\r\n if (this.options.keepOpenOnSelected) {\r\n definition[\"cssClass\"] += \" a-menu-keep-on-selected\";\r\n }\r\n\r\n return definition;\r\n }\r\n }\r\n\r\n module RoutedAppHolder {\r\n export var activeApp: RoutedApp = null; \r\n }\r\n \r\n export class RoutedApp {\r\n appClass: IAppBase;\r\n route: string;\r\n defaultOptions: TAppOptions;\r\n\r\n protected isSingleton;\r\n singletonBackup: { app: AppBase, container: JQuery };\r\n runningApp: AppBase;\r\n\r\n constructor(appClass: IAppBase, route: string, defaultOptions?: TAppOptions) {\r\n this.appClass = appClass;\r\n this.route = route;\r\n this.defaultOptions = defaultOptions || {} as TAppOptions;\r\n this.isSingleton = false;\r\n }\r\n\r\n startRoutedApp(container: HTMLElement, customOptions?: TAppOptions) {\r\n var containerEmpty = $(container).children().length === 0;\r\n AppKitchen.UIHelper.Transitions.swap(container, containerEmpty? 0 : 150, 300, () => {\r\n \r\n if (RoutedAppHolder.activeApp && RoutedAppHolder.activeApp.isSingleton) {\r\n this.backupPreviousApp(container);\r\n } else {\r\n this.disposePreviousApp();\r\n }\r\n\r\n $(container).empty();\r\n $(container).attr(\"app-route\", this.route);\r\n $(container).trigger(\"app-starting\");\r\n $(\"body\").trigger(\"navigate\");\r\n\r\n if (!this.tryRestoreApp(container)) {\r\n this.runningApp = this.startAppInternal(container, customOptions);\r\n }\r\n\r\n RoutedAppHolder.activeApp = this;\r\n\r\n AppKitchen.UIHelper.updateFullHeightGrids(container.parentElement);\r\n AppKitchen.UIHelper.clearSelection();\r\n });\r\n }\r\n\r\n startInWindow(windowOptions?: AppKitchen.UIHelper.Windows.WindowOptions, customOptions?: TAppOptions): kendo.ui.Window {\r\n var appContainer = $('
                ').appendTo(\"body\");\r\n\r\n // hack to start app in correct window height\r\n var wOptions = AppKitchen.OptionsHelper.merge(windowOptions, {\r\n height: \"80%\",\r\n minHeight: \"auto\"\r\n });\r\n\r\n appContainer.css({\r\n \"width\": wOptions.width,\r\n \"height\": wOptions.height,\r\n \"min-width\": wOptions.minWidth,\r\n \"min-height\": wOptions.minHeight\r\n });\r\n\r\n this.runningApp = this.startAppInternal(appContainer[0], customOptions);\r\n\r\n appContainer.css({\r\n \"width\": \"\",\r\n \"height\": \"\",\r\n \"min-width\": \"\",\r\n \"min-height\": \"\"\r\n });\r\n \r\n var popupWindow = AppKitchen.UIHelper.Windows.openWindow(appContainer[0], windowOptions);\r\n appContainer.parent().append(\"
                \");\r\n \r\n popupWindow.bind(\"deactivate\", () => this.runningApp.dispose());\r\n\r\n appContainer.focus();\r\n \r\n\r\n return popupWindow;\r\n }\r\n\r\n private startAppInternal(targetContainer: HTMLElement, customOptions?: TAppOptions): AppBase {\r\n // ReSharper disable once InconsistentNaming\r\n return new this.appClass(targetContainer, AppKitchen.OptionsHelper.merge(customOptions, this.defaultOptions));\r\n }\r\n\r\n private backupPreviousApp(appContainer: HTMLElement) {\r\n if ($(appContainer).attr(\"app-route\") === RoutedAppHolder.activeApp.route && $(appContainer).children().length > 0) {\r\n RoutedAppHolder.activeApp.runningApp.suspend();\r\n RoutedAppHolder.activeApp.singletonBackup = {\r\n app: RoutedAppHolder.activeApp.runningApp,\r\n container: $(appContainer).children()\r\n };\r\n $(appContainer).children().detach();\r\n }\r\n }\r\n\r\n private disposePreviousApp() {\r\n if (RoutedAppHolder.activeApp && RoutedAppHolder.activeApp.runningApp) {\r\n RoutedAppHolder.activeApp.runningApp.dispose();\r\n }\r\n }\r\n\r\n private tryRestoreApp(targetContainer: HTMLElement) {\r\n if (this.isSingleton && this.singletonBackup && this.singletonBackup.container.length > 0) {\r\n $(targetContainer).append(this.singletonBackup.container);\r\n this.singletonBackup.app.continue();\r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n export class SingeltonRoutedApp extends RoutedApp {\r\n constructor(app: IAppBase, route: string, defaultOptions?: TAppOptions) {\r\n super(app, route, defaultOptions);\r\n this.isSingleton = true;\r\n }\r\n }\r\n\r\n export class AppHolder {\r\n appClass: IAppBase;\r\n defaultOptions: TAppOptions;\r\n runningApp: AppBase;\r\n\r\n constructor(appClass: IAppBase, defaultOptions?: TAppOptions) {\r\n this.appClass = appClass;\r\n this.defaultOptions = defaultOptions || {} as TAppOptions;\r\n }\r\n\r\n startInContainer(container: HTMLElement, customOptions?: TAppOptions) {\r\n var containerEmpty = $(container).children().length === 0;\r\n AppKitchen.UIHelper.Transitions.swap(container, containerEmpty ? 0 : 150, 300, () => {\r\n $(container).empty();\r\n // ReSharper disable once InconsistentNaming\r\n this.startAppInternal(container, customOptions);\r\n AppKitchen.UIHelper.updateFullHeightGrids(container);\r\n });\r\n }\r\n\r\n startInWindow(windowOptions?: AppKitchen.UIHelper.Windows.WindowOptions, customOptions?: TAppOptions): kendo.ui.Window {\r\n var appContainer = $('
                ').appendTo(\"body\");\r\n\r\n // hack to start app in correct window height\r\n var wOptions = AppKitchen.OptionsHelper.merge(windowOptions, {\r\n height: \"80%\",\r\n minHeight: \"auto\"\r\n });\r\n\r\n appContainer.css({\r\n \"width\": wOptions.width,\r\n \"height\": wOptions.height,\r\n \"min-width\": wOptions.minWidth,\r\n \"min-height\": wOptions.minHeight\r\n });\r\n\r\n this.startAppInternal(appContainer[0], customOptions);\r\n\r\n appContainer.css({\r\n \"width\": \"\",\r\n \"height\": \"\",\r\n \"min-width\": \"\",\r\n \"min-height\": \"\"\r\n });\r\n\r\n var popupWindow = AppKitchen.UIHelper.Windows.openWindow(appContainer[0], windowOptions);\r\n appContainer.parent().append(\"
                \");\r\n\r\n popupWindow.bind(\"deactivate\", () => this.runningApp.dispose());\r\n\r\n appContainer.focus();\r\n\r\n return popupWindow;\r\n }\r\n\r\n private startAppInternal(targetContainer: HTMLElement, customOptions?: TAppOptions): void {\r\n if (this.runningApp) {\r\n this.runningApp.dispose();\r\n }\r\n // ReSharper disable once InconsistentNaming\r\n this.runningApp = new this.appClass(targetContainer, AppKitchen.OptionsHelper.merge(customOptions, this.defaultOptions));\r\n\r\n }\r\n\r\n \r\n }\r\n\r\n }\r\n}","module AppKitchen {\r\n\r\n export module Starter {\r\n\r\n function getBrowserCulture() {\r\n var nav = navigator;\r\n var userLang = nav.language || nav.userLanguage || (nav.languages ? nav.languages[0] : null);\r\n\r\n var cultureMap = {\r\n \"de-DE\": \"de-DE\",\r\n \"de\": \"de-DE\",\r\n \"en-US\": \"en-US\",\r\n \"en\": \"en-US\"\r\n }\r\n\r\n var culture = \"en-US\"; // default language\r\n\r\n if (userLang && cultureMap[userLang]) {\r\n culture = cultureMap[userLang];\r\n } else {\r\n var shortLanguage = userLang.slice(0, 2);\r\n if (cultureMap[shortLanguage]) {\r\n culture = cultureMap[shortLanguage.toLowerCase()];\r\n }\r\n }\r\n\r\n return culture;\r\n }\r\n\r\n function loadScript(main: string, fallback: string, success: () => any, fail: (error) => any) {\r\n $.getScript(main + \".min.js\", success).fail(() => {\r\n $.getScript(main + \".js\", success).fail(() => {\r\n $.getScript(fallback + \".min.js\", success).fail(() => {\r\n $.getScript(fallback + \".js\", success).fail(fail);\r\n });\r\n });\r\n });\r\n }\r\n\r\n export function startup(targetContainer: HTMLElement, ressourcesLocations: string[], apiUrl: string, appKitchenApiUrl: string, startApp: (container: HTMLElement) => any) {\r\n // start delayed loading animation (if startup enough quick do not show animation at all)\r\n\r\n var appStarted = false;\r\n var startupError = false;\r\n setTimeout(() => {\r\n if (!appStarted && !startupError) {\r\n AppKitchen.UIHelper.renderLoader(targetContainer, {size: \"L\"});\r\n }\r\n }, 500);\r\n\r\n AppKitchen.Data.setAPIs(apiUrl, appKitchenApiUrl);\r\n\r\n var globalSettingsLoaded = false;\r\n var loadedRessourcesCount = 0;\r\n\r\n // set culture to browser culture if no culture in GlobalSettings\r\n if (!AppKitchen.GlobalSettings.culture) {\r\n AppKitchen.GlobalSettings.culture = getBrowserCulture();\r\n }\r\n\r\n // set kendo culture\r\n kendo.culture(AppKitchen.GlobalSettings.culture);\r\n\r\n var tryToStartApp = () => {\r\n if (loadedRessourcesCount === ressourcesLocations.length && globalSettingsLoaded) {\r\n appStarted = true;\r\n initGeneralCode();\r\n AppKitchen.UIHelper.removeLoader(targetContainer,\r\n { fadeOut: 300, complete: () => startApp(targetContainer) });\r\n }\r\n }\r\n\r\n var throwStartupError = (userFriendlyMessage: string, debugMessage: string) => {\r\n startupError = true;\r\n $(targetContainer).append('
                App can not be started due to the following reason:
                ' + userFriendlyMessage + '
                ');\r\n AppKitchen.UIHelper.removeLoader(targetContainer, {fadeOut: 0});\r\n throw debugMessage;\r\n }\r\n\r\n for (let i = 0; i < ressourcesLocations.length; i++) {\r\n var currentFolder = ressourcesLocations[i];\r\n var mainFile = currentFolder + \"/Resources.\" + AppKitchen.GlobalSettings.culture;\r\n var fallBack = currentFolder + \"/Resources.en-US.min.js\";\r\n loadScript(mainFile, fallBack, () => {\r\n loadedRessourcesCount++;\r\n tryToStartApp();\r\n }, error => {\r\n throwStartupError(\"Configuration error\", \"Resource scripts at following locations could not be found:\\r\\n\" + ressourcesLocations.join(\"\\r\\n\") + \"\\r\\n\" + error.message);\r\n });\r\n }\r\n\r\n AppKitchen.Data.Api.getGlobalSettings(serverSettings => {\r\n AppKitchen.GlobalSettings.pingInterval = serverSettings.PingInterval;\r\n AppKitchen.GlobalSettings.pingTimeout = serverSettings.PingTimeout;\r\n AppKitchen.GlobalSettings.securityTokenServiceOAuthUrl = serverSettings.SecurityTokenServiceOAuthUrl;\r\n AppKitchen.GlobalSettings.welcomeMessage = serverSettings.WelcomeMessage;\r\n AppKitchen.GlobalSettings.loginTheme = serverSettings.LoginTheme;\r\n AppKitchen.GlobalSettings.sessionTokenCookieName = serverSettings.SessionTokenCookieName;\r\n AppKitchen.GlobalSettings.currentUserCookieName = serverSettings.CurrentUserCookieName;\r\n AppKitchen.GlobalSettings.applicationName = serverSettings.ApplicationName;\r\n AppKitchen.GlobalSettings.applicationVersion = serverSettings.ApplicationVersion;\r\n AppKitchen.GlobalSettings.applicationCopyright = serverSettings.ApplicationCopyright;\r\n AppKitchen.GlobalSettings.customConfig = serverSettings.CustomConfig;\r\n globalSettingsLoaded = true;\r\n tryToStartApp();\r\n }, error => { throwStartupError(\"Server not reachable\", \"Failed to read global settings from server: \" + error.message); });\r\n\r\n AppKitchen.ChangeManager.startCheckForUpdates();\r\n }\r\n\r\n function initGeneralCode()\r\n {\r\n // init general part (for portal code sharing)\r\n General.GeneralLogger.init(AppKitchen.log, AppKitchen.logError);\r\n General.TsChart.Preloadtransformations.Templates.preloadTransformationCombobox = AppKitchen.Templates.PreloadTransformation_Combobox;\r\n General.GeneralRenderer.init((template, data, container) => {\r\n AppKitchen.UIHelper.renderTemplateTo(container, template, data);\r\n });\r\n }\r\n }\r\n}","\r\nmodule AppKitchen {\r\n export module Timezone {\r\n\r\n /**\r\n * This is a map between the mesap SupportedTimezoneDefinition and the moment definition of the timezone.\r\n * moment definitions are copied from here: http://momentjs.com/downloads/moment-timezone-with-data.js\r\n */\r\n var timezoneDefinitionMap = [\r\n [\"UTC\", \"UTC\", null],\r\n [\"Central European Time\", \"Europe/Berlin\", \"Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5\"],\r\n [\"Western European Time\",\"Europe/London\", \"Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6\"],\r\n [\"Eastern European Time\", \"Europe/Sofia\", \"Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5\"],\r\n [\"Eastern Standard Time\", \"America/New_York\",\"America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6\"],\r\n [\"Hawaiian Standard Time\", \"Pacific/Honolulu\", \"Pacific/Honolulu|HST HDT HST|au 9u a0|010102|-1thLu 8x0 lef0 8Pz0 46p0|37e4\"],\r\n [\"Alaskan Standard Time\",\"America/Anchorage\", \"America/Anchorage|CAT CAWT CAPT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4\"],\r\n [\"Central Standard Time\", \"America/Chicago\", \"America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5\"],\r\n [\"Mountain Standard Time\", \"America/Denver\", \"America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5\"],\r\n [\"Pacific Standard Time\", \"America/Los_Angeles\", \"America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp0 1Vb0 3dB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6\"],\r\n [\"Tokyo Standard Time\", \"Asia/Tokyo\", \"Asia/Tokyo|JCST JST JDT|-90 -90 -a0|0121212121|-1iw90 pKq0 QL0 1lB0 13X0 1zB0 NX0 1zB0 NX0|38e6\"],\r\n [\"Malay Peninsula Standard Time\", \"Asia/Kuala_Lumpur\", \"Asia/Kuala_Lumpur|SMT MALT MALST MALT MALT JST MYT|-6T.p -70 -7k -7k -7u -90 -80|01234546|-2Bg6T.p 17anT.p 7hXE dM00 17bO 8Fyu 1so1u|71e5\"]\r\n ];\r\n\r\n var timezoneMapping: { [id: string]: string } = null;\r\n\r\n function getTimezoneMapping() {\r\n if (timezoneMapping === null) {\r\n timezoneMapping = {};\r\n $.each(timezoneDefinitionMap, (index, value) => {\r\n timezoneMapping[value[0]] = value[1];\r\n if (value[2] !== null) {\r\n (moment).tz.add([value[2]]);\r\n }\r\n });\r\n }\r\n\r\n return timezoneMapping;\r\n }\r\n\r\n function getDateFormat(timeResolution: Mesap.Framework.Common.TimeResolution) {\r\n if (timeResolution < Mesap.Framework.Common.TimeResolution.Day || timeResolution === Mesap.Framework.Common.TimeResolution.ThirtyMinutes) {\r\n return AppKitchen.Strings.MomentDateFormat_DayWithHour;\r\n } else if (timeResolution < Mesap.Framework.Common.TimeResolution.Month) {\r\n return AppKitchen.Strings.MomentDateFormat_OnlyDay;\r\n } else if (timeResolution < Mesap.Framework.Common.TimeResolution.Year) {\r\n return AppKitchen.Strings.MomentDateFormat_OnlyMonth;\r\n } else {\r\n return AppKitchen.Strings.MomentDateFormat_OnlyYear;\r\n }\r\n }\r\n\r\n export function getMomentForTimezone(date: Date, mesapTimezoneId: string) {\r\n var momentTimezone = getTimezoneMapping()[mesapTimezoneId];\r\n\r\n if (!momentTimezone) {\r\n AppKitchen.logError(\"Unknown mesap timezone: '\" + mesapTimezoneId + \"' conversion not possible.\");\r\n return null;\r\n }\r\n return moment(date).tz(momentTimezone);\r\n }\r\n\r\n export function getFormatedDate(ticks: number, mesapTimezoneId: string, format: string) {\r\n return getMomentForTimezone(new Date(ticks),mesapTimezoneId).format(format);\r\n }\r\n\r\n export function getFormatedDateForTimeResolution(ticks: number, mesapTimezoneId: string, timeResolution: Mesap.Framework.Common.TimeResolution) {\r\n var format = getDateFormat(timeResolution);\r\n return getMomentForTimezone(new Date(ticks), mesapTimezoneId).format(format);\r\n }\r\n\r\n }\r\n}","\r\n/* \r\n * Example: $P.Cache.getSet($P.Cache.keys.menu_docstoreItems, function(callback) { ... }, function(data) { ... }); \r\n */\r\nmodule General {\r\n export module Services {\r\n export class Cache {\r\n\r\n static localCache= {};\r\n static storage_overflow_size= 50* 1024* 1024;\r\n\r\n\r\n\r\n static getSet(key, createFunction, callback) {\r\n var me = this;\r\n\r\n var data = Cache.get(key);\r\n if (data !== undefined) {\r\n callback(data);\r\n } else {\r\n createFunction(function(d) {\r\n Cache.set(key, d);\r\n\r\n callback(d);\r\n });\r\n }\r\n }\r\n\r\n static getSetVolatile(key, createFunction, callback) {\r\n\r\n var data = Cache.get(key, true);\r\n if (data !== undefined) {\r\n callback(data);\r\n } else {\r\n createFunction(function(d) {\r\n Cache.set(key, d, true);\r\n });\r\n }\r\n }\r\n\r\n static set(key, data, isVolatile?, ignoreOverflow?) {\r\n Cache.localCache[key] = data;\r\n if (!isVolatile) {\r\n try {\r\n localStorage[key] = data;\r\n } catch (exception) {\r\n GeneralLogger.logError(exception);\r\n\r\n if (!ignoreOverflow &&\r\n exception &&\r\n (exception.name == \"QUOTA_ERR\" ||\r\n exception.name == \"QUOTA_EXCEEDED_ERR\" ||\r\n exception.name == \"QuotaExceededError\")) {\r\n var totalBytes = 0;\r\n for (var i in localStorage) {\r\n totalBytes += localStorage[i].length;\r\n }\r\n GeneralLogger.logDebug(\"Total bytes in Storage: \"+ totalBytes);\r\n\r\n try {\r\n var success = bytes => {\r\n GeneralLogger.logDebug(\"LocalStorage Overflow was handled and the user granted \" +bytes +\" bytes of drive space.\");\r\n Cache.set(key, data, isVolatile, true);\r\n };\r\n var failed = e => {\r\n GeneralLogger.logError(\"Failed to increase storage space after overflow, no new view screenshots will be saved from now on.\");\r\n };\r\n\r\n if ((navigator).webkitTemporaryStorage) {\r\n (navigator).webkitTemporaryStorage.requestQuota(\r\n Cache.storage_overflow_size,\r\n success,\r\n failed\r\n );\r\n } else {\r\n ((window).storageInfo || (window).webkitStorageInfo).requestQuota((window).TEMPORARY,Cache.storage_overflow_size,success,failed);\r\n }\r\n } catch (ex) {\r\n GeneralLogger.logError(ex);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n static get(key, isVolatile?) {\r\n var me = this;\r\n var result = Cache.localCache[key];\r\n\r\n if (!isVolatile && !result) {\r\n result = localStorage[key];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n static remove(key) {\r\n var me = this;\r\n delete Cache.localCache[key];\r\n localStorage.removeItem(key);\r\n }\r\n\r\n }\r\n}\r\n}","module General {\r\n export module TsChart {\r\n\r\n export module Preloadtransformations {\r\n\r\n export class Templates {\r\n static preloadTransformationCombobox: string;\r\n }\r\n\r\n export function ComboboxTransformation(targetContainer, interactiveDefinition, transformationData, callback) {\r\n\r\n General.GeneralRenderer.renderFunc(Templates.preloadTransformationCombobox, null, targetContainer);\r\n\r\n var comboboxDomId = $(targetContainer).find(\" .mp-combobox\");\r\n var combobox = $(comboboxDomId);\r\n\r\n for (var i in transformationData.entries) {\r\n if (!transformationData.entries.hasOwnProperty(i)) {\r\n continue;\r\n }\r\n\r\n var entry = transformationData.entries[i];\r\n combobox.append('');\r\n }\r\n\r\n var cacheId = (targetContainer.selector || \"workaround\").replace(/ /g, \"_\");\r\n var selectedComboboxId = General.Services.Cache.get(\"CBox_\" + cacheId);\r\n\r\n var chosenEntry = getTransformationDataEntry(transformationData, selectedComboboxId);\r\n\r\n if (!selectedComboboxId || !chosenEntry) {\r\n selectedComboboxId = transformationData.entries[0].id;\r\n }\r\n combobox.val(selectedComboboxId);\r\n\r\n combobox.on('change', function () {\r\n var selectedId = this.value;\r\n var retInteractiveDefinition = getInteractiveDefinition(transformationData, interactiveDefinition, selectedId);\r\n callback(retInteractiveDefinition);\r\n\r\n General.Services.Cache.set(\"CBox_\" + cacheId, selectedId);\r\n });\r\n\r\n var retDefinition = getInteractiveDefinition(transformationData, interactiveDefinition, selectedComboboxId);\r\n return retDefinition;\r\n }\r\n \r\n function getInteractiveDefinition (transformationData, interactiveDefinition, selectedComboboxId) {\r\n var chosenEntry = getTransformationDataEntry(transformationData, selectedComboboxId);\r\n var retDefinition = getFilterChartSeries(interactiveDefinition, chosenEntry);\r\n if (chosenEntry.titlereplacer) {\r\n retDefinition.title = (String).format(retDefinition.chartdefinition.title.text, chosenEntry.titlereplacer);\r\n }\r\n return retDefinition;\r\n }\r\n \r\n function getFilterChartSeries(interactiveDefinition, entry) {\r\n\r\n var relevantSeriesIds = entry.chartseriesids;\r\n\r\n var relevantChartSeries = [];\r\n for (var i in interactiveDefinition.chartseries) {\r\n var chartSerie = interactiveDefinition.chartseries[i];\r\n if ($.inArray(chartSerie.id, relevantSeriesIds) >= 0) {\r\n relevantChartSeries.push(chartSerie);\r\n }\r\n }\r\n\r\n var retDefinition = jQuery.extend(true, {}, interactiveDefinition);\r\n retDefinition.chartseries = relevantChartSeries;\r\n\r\n return retDefinition;\r\n\r\n }\r\n \r\n function getTransformationDataEntry(transformationData, id) {\r\n for (var i in transformationData.entries) {\r\n var entry = transformationData.entries[i];\r\n if (entry.id == id)\r\n return entry;\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\nmodule Portal {\r\n export module Chart {\r\n export class PreloadTransformations {\r\n static ComboboxTransformation(targetContainer, interactiveDefinition, transformationData, callback) {\r\n return General.TsChart.Preloadtransformations.ComboboxTransformation(targetContainer, interactiveDefinition, transformationData, callback);\r\n }\r\n }\r\n }\r\n}\r\n/*\r\ndeclare module Portal {\r\n export var Chart;\r\n}\r\n\r\nif (typeof (Portal) == \"undefined\") { (window).Portal = { Chart: {} }; }\r\n\r\n$.extend(Portal.Chart.PreloadTransformations,\r\n{\r\n ComboboxTransformation: function(targetContainer, interactiveDefinition, transformationData, callback) {\r\n return General.TsChart.Preloadtransformations\r\n .ComboboxTransformation(targetContainer, interactiveDefinition, transformationData, callback);\r\n }\r\n});*/"]}