{"version":3,"sources":["Scripts/AppKitchen/Base.ts","Scripts/AppKitchen/Apps/ChangePassword/ChangePasswordApp.ts","Scripts/AppKitchen/Apps/Credits/Credits.ts","Scripts/AppKitchen/Apps/ExtendedUserMenu/ExtendedUserMenuApp.ts","Scripts/AppKitchen/Apps/GenericConfigFileStarters/GenericConfigFileStarters.ts","Scripts/AppKitchen/Controls/Forms/Fields/Fields.ts","Scripts/AppKitchen/Controls/Forms/Forms.ts","Scripts/AppKitchen/Apps/UserInfo/UserInfoApp.ts","Scripts/AppKitchen/Controls/Charts/CombinedChart/CombinedChart.ts","Scripts/AppKitchen/Controls/Charts/Highcharts/Highcharts.ts","Scripts/AppKitchen/Controls/Charts/PieChart/PieChart.ts","Scripts/AppKitchen/Controls/Charts/StackedColumnChart/StackedColumnChart.ts","Scripts/AppKitchen/Controls/ContextSensitiveHelp/ContextSensitiveHelp.ts","Scripts/AppKitchen/Controls/Data/ImportExportPicker/ImportExportPicker.ts","Scripts/AppKitchen/Controls/DateRangePicker/DateRangePicker.ts","Scripts/AppKitchen/Controls/FileDisplay/FileDisplay.ts","Scripts/AppKitchen/Controls/Forms/EventForm/EventForm.ts","Scripts/AppKitchen/Controls/Grids/Grids.ts","Scripts/AppKitchen/Controls/Grids/EventGrid/EventGridHelper.ts","Scripts/AppKitchen/Controls/Grids/EventGrid/EventGridModel.ts","Scripts/AppKitchen/Controls/Grids/EventGrid/EventGridView.ts","Scripts/AppKitchen/Controls/Grids/JobLogGrid/JobLogGrid.ts","Scripts/AppKitchen/Controls/Grids/TimeseriesDataGrid/TimeseriesDataGrid.ts","Scripts/AppKitchen/Controls/Grids/TimeseriesGrid/TimeseriesGrid.ts","Scripts/AppKitchen/Controls/InteractiveImage/InteractiveImage.ts","Scripts/AppKitchen/general/general.ts","Scripts/AppKitchen/general/tschart/general.tschart.transformations.ts","Scripts/AppKitchen/general/tschart/general.tschart.ts","Scripts/AppKitchen/Portal/Defaults/Defaults.ts","Scripts/AppKitchen/Portal/InteractiveGraphic/InteractiveGraphic.ts","Scripts/AppKitchen/Controls/InteractiveItem/InteractiveItem.ts","Scripts/AppKitchen/Controls/Job/Job.ts","Scripts/AppKitchen/Controls/LayoutGrid/LayoutGrid.ts","Scripts/AppKitchen/Controls/Map/Map.ts","Scripts/AppKitchen/Controls/Menus/VerticalMenu/VerticalMenu.ts","Scripts/AppKitchen/Controls/Panel/Accordion/Accordion.ts","Scripts/AppKitchen/Controls/Popups/Notification/Notification.ts","Scripts/AppKitchen/Controls/RangePicker/RangePicker.ts","Scripts/AppKitchen/Controls/SearchBox/SearchBox.ts","Scripts/AppKitchen/Controls/Tile/Tile.ts","Scripts/AppKitchen/Controls/Timeline/Timeline.ts","Scripts/AppKitchen/Data/TimeseriesDataLoader.ts","Scripts/AppKitchen/Controls/TimeseriesDataViews/TimeseriesDataModel.ts","Scripts/AppKitchen/Controls/TimeseriesDataViews/TimeseriesDataView.ts","Scripts/AppKitchen/Controls/TimeseriesDataViews/Chart/Chart.ts","Scripts/AppKitchen/Controls/TimeseriesDataViews/Spreadsheet/Spreadsheet.ts","Scripts/AppKitchen/Controls/TimeseriesDataViews/Spreadsheet/Spreadsheet_ColumnBased.ts","Scripts/AppKitchen/Controls/TimeseriesDataViews/Spreadsheet/Spreadsheet_RowBased.ts","Scripts/AppKitchen/Controls/TimeseriesStatus/TimeseriesStatus.ts","Scripts/AppKitchen/Controls/TreeView/TreeView.ts","Scripts/AppKitchen/Controls/Wrappers/MaximizeWrapper/MaximizeWrapper.ts","Scripts/AppKitchen/Data/Data.ts","Scripts/AppKitchen/Data/Descriptors.ts","Scripts/AppKitchen/Data/EventDataLoader.ts","Scripts/AppKitchen/Data/Export.ts","Scripts/AppKitchen/Data/Import.ts","Scripts/AppKitchen/Data/JobLogLoaders.ts","Scripts/AppKitchen/Data/TimeseriesLoader.ts","Scripts/AppKitchen/Data/Provider/ProviderBase.ts","Scripts/AppKitchen/Data/Provider/EventDataProvider.ts","Scripts/AppKitchen/Data/Provider/EventDataSaveProvider.ts","Scripts/AppKitchen/Data/Provider/ProviderMapCachedBase.ts","Scripts/AppKitchen/Data/Provider/EventItemsProvider.ts","Scripts/AppKitchen/Data/Provider/LogoutProvider.ts","Scripts/AppKitchen/Data/Provider/PasswordChangeInfoProvider.ts","Scripts/AppKitchen/Data/Provider/PasswordRestrictionInfoProvider.ts","Scripts/AppKitchen/Data/Provider/ProviderCachedBase.ts","Scripts/AppKitchen/Data/Provider/TreeViewProvider.ts","Scripts/AppKitchen/FrameManager/FrameManager.ts","Scripts/AppKitchen/Helpers/BrowserHelper.ts","Scripts/AppKitchen/Helpers/ChangeManager.ts","Scripts/AppKitchen/Helpers/Colors.ts","Scripts/AppKitchen/Helpers/ExportHelper.ts","Scripts/AppKitchen/Helpers/GuidHelper.ts","Scripts/AppKitchen/Helpers/LocalStorageHelper.ts","Scripts/AppKitchen/Helpers/Logging.ts","Scripts/AppKitchen/Helpers/OptionsHelper.ts","Scripts/AppKitchen/Helpers/PasswordHelper.ts","Scripts/AppKitchen/Helpers/RxEx.ts","Scripts/AppKitchen/Helpers/SpreadsheetHelper.ts","Scripts/AppKitchen/Helpers/StringHelper.ts","Scripts/AppKitchen/Helpers/UIHelper.ts","Scripts/AppKitchen/LoginManager/LoginManager.ts","Scripts/AppKitchen/Starter/Starter.ts","Scripts/AppKitchen/general/general.services.cache.ts","Scripts/AppKitchen/general/tschart/general.tschart.preloadtransformations.ts","Scripts/AppKitchen/Helpers/Helpers.ts","Scripts/AppKitchen/Helpers/Extensions.ts"],"names":["AppKitchen","General","Portal","checkBrowser","BrowserHelper","isIE","ieVersion","IEVersion","throwInternalStartupError","checkCookies","navigator","cookieEnabled","userFriendlyMessage","debugMessage","errorInfo","document","createElement","className","innerHTML","body","appendChild","cleanupStorage","LocalStorageHelper","cleanUp","window","addEventListener","e","storageEventHandler","getBrowserCulture","nav","userLang","language","languages","cultures","cultureMap","de-DE","de","en-US","en","fr-FR","fr","culture","shortLanguage","slice","toLowerCase","loadScript","main","fallback","success","fail","$","getScript","updateColors","length","forEach","color","dummy","append","c","UIHelper","Colors","parseColor","css","rgb2Hex","remove","initGeneralCode","GeneralLogger","init","log","logError","TsChart","Preloadtransformations","Templates","preloadTransformationCombobox","PreloadTransformation_Combobox","GeneralRenderer","template","data","container","renderTemplateTo","compareSortNr","nr1","nr2","a","Number","POSITIVE_INFINITY","b","parseInt","GlobalSettings","router","requiresLogin","pingEnabled","contextSensitiveHelpEnabled","userManualEnabled","getRouter","Backbone","Router","AppBase","prototype","defaultOptions","suspend","continue","dispose","targetContainer","options","_this","this","OptionsHelper","merge","el","$el","Data","LoginManager","ensureLogin","start","_super","ModelBase","Model","__extends","set","attributes","call","get","attribute","bind","eventName","callback","context","on","event","getPrevious","previousAttributes","CollectionBase","Collection","ViewBase","View","refreshLoadingOverlay","model","loading","has","loadingOverlay","appendTo","addClass","removeClass","setTimeout","setTemplate","_","renderTemplate","html","LoadingConcentricSpinner","size","CollectionViewBase","collection","Apps","ChangePasswordApp","loadPasswordRestrictionInfo","Provider","PasswordRestrictionInfoProvider","load","then","passwordRestrictionInfo","render","fields","Controls","Forms","FieldModel","FieldType","Text","password","placeholder","Strings","UserInfo_OldPassword","order","showPasswordComplexity","showText","showPercent","animate","minimumLength","minimumPasswordLength","requiresComplexPassword","requireComplexPassword","UserInfo_NewPassword","UserInfo_ConfirmNewPassword","formModel","FormModel","templatedFormView","TemplatedFormView","ChangePassword","editable","fieldViewDict","changePassword","find","click","closeWindow","password1","getValue","Api","UserId","OldPassword","NewPassword","response","SuccessfullyChanged","successfullyChangedPassword","raiseError","ErrorMessage","message","translatedMessage","getErrorMessage","setProperty","DialogBoxes","alert","ChangePassword_Message_PasswordChangedSuccessfully","plainMessage","closest","close","startChangePasswordWindow","FrameManager","AppHolder","startInWindow","width","height","modal","easyClose","opened","wrapper","first","focus","overflow","center","CreditsApp","AboutWindow","applicationName","applicationVersion","copyrightInfo","applicationCopyright","getAboutInfo","aboutInfo","AboutWindow_Info","Scrolling","customScroller","each","i","licenseFile","attr","ajax","url","licence","kendoTooltip","position","content","show","evt","hideTooltips","sender","ExtendedUserMenuApp","ExtendedUserMenu","renderLoader","getUserInfo","userInfo","getPasswordChangeInformation","passwordChangeInfo","ExtendedUserMenuUserInfo","name","Name","email","MailAddress","showPasswordChangeNotification","remainingDays","daysBeforeExpiring","logout","extendedUserInfo","UserInfoApp","startUserInformationWindow","preventDefault","fadeOut","ConfigApp","ConfigTsChartApp","tsChartView","InteractiveGraphic","config","redraw","updateSize","ConfigFileStarterApp","configFile","urlParameter","urlQuery","UrlQuery","getParameters","hideHeader","dataType","jsonConfig","processConfig","error","handleRequestError","cache","getFileUrl","baseUrl","encodeURIComponent","xhr","statusText","errorText","app","view","documenttype","chartdefinition","LayoutGridView","LayoutGridModel","InteractiveImage","InteractiveImageModel","image","minWidth","minHeight","title","FileDisplay","FileDisplayModel","file","mime","FieldPatterns","OnlyDigits","Alphanumeric","Phone","Email","getDefaultOptions","type","customOptions","description","undefined","default","fieldGroup","disabled","hidden","readOnly","mandatory","pool","pattern","format","getDefaultFormat","textMode","allow24","suggest","multiline","min","max","precision","getDefaultPrecision","kendoOptions","getDefaultNumberFormat","Date","kendo","calendar","patterns","d","Time","t","DateTime","g","Month","y","Year","Array","join","test","substr","NaN","result","exec","updateDisplayValue","value","displayValue","getTextFieldDisplayValue","toString","Object","Checkbox","Yes","No","Switch","getSwitchTapDisplayValue","escapeHTML","switchTaps","onValue","onLabel","offLabel","values","multi","split","separator","getDisplayValueFromPool","textField","valueField","key","label","FieldCollection","FieldViewBase","editModeAllowed","editAllowed","destroy","nl2br","trim","editOnDemand","inputContainerSelector","inputTemplate","toJSON","hide","flash","startEdit","viewContainerSelector","editMode","endEdit","tagName","FormField","TextInputFieldViewBase","clearMessage","showMessage","Form_Required","rendered","validate","getInputValue","delegateInteractionEvents","postRender","applyInputOptions","startEditAndFocus","keypress","which","stopPropagation","updateOnEnter","keydown","revertOnEscape","blur","updateOnBlur","updateAndClose","updateAndRefocus","trigger","update","val","tryUpdate","preview","backToEdit","textValue","validatedValue","valid","Form_ErrorMessage_Required","validateFormat","Form_ErrorMessage_Format","errorClass","validateMin","validateMax","FormFieldTextInput","TextFieldView","inputSelector","currentValue","restrict","inputWidget","kendoMultiSelect","__assign","filter","dataTextField","dataValueField","dataSource","change","input","indexOf","keyCode","safariClosedBeforeValueChangedFix","search","kendoDropDownList","open","widgetKeyDown","openInputPopup","kendoComboBox","kendoAutoComplete","textAreaInput","FormFieldTextAreaInput","replaceWith","ul","is","sep","regex","RegExp","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","kendoTimePicker","kendoDateTimePicker","pickerKeyDown","openPicker","date","parseDate","dateAsNumber","Form_ErrorMessage_TimeInvalid","valueOf","date2Number","fieldType","Form_ErrorMessage_DateTimeInvalid","Form_ErrorMessage_YearInvalid","Form_ErrorMessage_DateInvalid","onlyDate","getFullYear","getMonth","CheckboxFieldView","isChecked","prop","hideCheckboxLabel","FormFieldCheckbox","FieldCheckbox","SwitchFieldView","onTapIndex","isLeftOn","offTapIndex","containers","switchLabelOn","switchLabelOff","text","offValue","FormFieldSwitch","DescriptorToTextPoolConverter","convert","descriptors","updateFieldDict","dict","field","fieldDict","setFieldsData","hasOwnProperty","hasData","clearFieldsData","getFieldsData","skipEmpty","submit","submitOptions","submitCallback","getProperty","property","getField","_a","onPropertyChange","fieldModel","onAnyPropertyChange","onSubmit","fieldKey","keyPrefix","tryGetField","setValue","onValueChange","onAnyValueChange","disableField","enableField","triggerValueChange","triggerPropertyChange","FormViewBase","createFields","fieldViews","renderField","fieldView","getFieldViewClass","push","getFieldView","tryGetFieldView","validateFields","console","switchToPreview","disableButtons","enableButtons","delegateEvents","click .a-btn-preview","click .a-btn-back","click .a-btn-submit","toggleClass","useExistingContent","me","renderOnlyInputs","labelAttr","inputIndex","index","element","empty","FormFieldInfo","info","inputAttr","TabularFormView","getGroupName","groupId","showFieldNumber","showButtons","table","models","groupHeaderTemplate","TabularFormGroupRow","currentGroupId","showGroups","showGroupRow","groupName","rowNumber","rowspan","number","rowSpan","row","TabularFormRow","numberrowspan","TabularForm","HorizontalTabularFormView","getFieldModelData","fieldData","_i","fields_1","id","showLabels","showTooltips","submitIcon","submitTooltip","fieldModels_1","HorizontalTabularForm","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","buttons","save","cancel","cancelEdit","edit","elements","adminBox","sysadminBox","formView","UserInfoForm","setButtonAction","IsAdmin","IsSysAdmin","enableEdit","updateUserInfo","canselEdit","phone","UserInfo","SuccessfullyUpdated","Charts","CombinedChartView","target","CombinedChartApp","legendItems","getLegenItems","renderTemplates","setContainers","chartData","getChartData","createPieChart","createStackedColumnChart","pieChardModel","PieChartModel","pieChartView","PieChartView","chartLeftContainer","noDataMessage","onSeriesClick","onClickPieChart","legend","visible","initPieChartLookupTable","legendItem","this_1","hasClass","onLegendItemClick","stackedColumnChartView","StackedColumnChartView","chartRightContainer","onClickStackedColumnChart","legendItems_1","templateData","getTemplateDaten","updateFullHeightGrids","CombinedChart","subtitle","series","serie","sum","reduce","category","legendContainer","pieChartData","pieChart","chart","columnChart","HighchartsHelper","highchartsInitialized","initializeHighcharts","Highcharts","setOptions","global","useUTC","lang","decimalPoint","numberFormat","thousandsSep","months","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","seriesConfig","styles","doLookup","HighchartsSeriesModel","logWarning","getConfig","getData","getSeries","extend","HighchartsSeriesCollectionModel","getAllSeries","seriesCollection","retList","s","defaultConfig","HighchartsView","initNewSeriesModels","seriesModels","sm","inArray","initializedSeriesModels","seriesDataChanged","seriesModel","existingSeries","setData","setExtremesX","extremes","xAxis","setExtremes","setExtremesY","yAxis","getExtremesX","getExtremes","getExtremesY","Highchart","chartConfig","tooltip","positioner","boxWidth","boxHeight","point","xPos","plotX","x","highcharts","resize","reflow","configureWrapper","chartSize","Math","margin-top","margin-left","font-size","removeEmptyData","kendoChart","align","offsetX","offsetY","labels","chartArea","background","seriesDefaults","startAngle","overlay","gradient","transitions","legendItemClick","seriesClick","LightGray","highlight","output","PieChart_NoData","PieChart","StackedColumnChartModel","defaultStack","StringHelper","generateRandom","stack","categories","itemStyle","border","categoryAxis","majorGridLines","line","valueAxis","setValueAxisMax","minMax","getAxis","range","ContextSensitiveHelpModel","getContent","getContextSensitiveHelp","res","documents","parseContent","map","r","DOMPurify","sanitize","marked","parse","gfm","headerIds","breaks","smartLists","smartypants","xhtml","toggleContextSensitiveHelpSidebar","unbind","setCustomFunctionsKeyBinding","ContextSensitiveHelpView","ContextSensitiveHelp","slideContainer","dotsContainer","moveSlides","arrowKeysBinding","m","renderContent","docs","reset","initSlideshowContent","initSlideshowDots","showSlides","slideIndex","slides","htmlContent","appendTemplateTo","SlideshowContent","SlideshowDot","selectSlide","n","dots","style","display","classList","add","resetScrollbar","nanoScroller","scroll","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","Quarter","QuarterHelper","getQuarterFromDate","month","Q1","Q2","Q3","Q4","getMonthFromQuarter","quarter","DateRangeModel","setStartDate","startDate","setEndDate","endDate","setRange","startFilter","endFilter","DateRangePickerFormat","DateRangePickerModel","route","parameters","defaults","routingParameters","keys","setPropertyFromRoute","updateRoute","setParameter","getPropertyRoute","refresh","query","setDatePropertyFromRoute","setFilterValue","getDatePropertyRoute","dateFromQuery","routeStart","parameter","defaultStart","filterParameter","defaultFilter","routeEnd","defaultEnd","routeRange","parameterPrefix","onStartChange","changed","onEndChange","onRangeChange","DateRangePickerView","setNumberOfDays","numberOfDays","currentTarget","addDays","disable","pickerFormat","enable","createForm","getFieldType","pickerFields","minDate","hideEndPicker","maxDate","isArray","from","fromLabels","to","toLabels","endDateField","maxRange","startQuarterDate","formTemplate","DateRangePicker","labelFrom","labelTo","singlePicker","dayPickers","showQuarter","highlightSelectedDayPicker","setTwoWayBindings","startQuarterDateFieldChanged","startDateFieldChanged","startDateModelChanged","endDateModelChanged","previewQuarter","getTime","setMonth","today","dateFrom","round","getTimezoneOffset","dateRangePickerFormat","TimeSpanPanel_From","TimeSpanPanel_To","keypress .a-startContainer","keypress .a-endContainer","blur .a-startContainer","blur .a-endContainer","click .a-tspanel-daychooser","fileUrl","mimeType","FileDisplay_Frame","img","Image","onload","imgWidth","imgHeight","src","audio","setAttribute","video","obj","WindowResize","imageWidth","imageHeight","maxWidth","maxHeight","widthFac","heightFac","fac","fileDisplayModel","EventFormHelper","createEventTextField","eventItem","getCommonFieldOptions","Type","TypeSpecification","MultiSelect","TextPool","UseId","unshift","Id","createEventDateField","DateFormat","createGenericField","UserFormat","Description","DefaultValue","IsRequired","EventItemTypeConverter","String","Memo","Boolean","Descriptor","Binary","Calculated","MasterDataCopy","User","Group","MultiDescriptor","EventKeyField","PeriodNr","getFieldLabel","inventoryId","itemId","metadata","generateFormFields","eventItems","eventItemSpecs","EventItemSpecs","fieldConfig","InventoryId","ItemId","Metadata","FieldOptions","fieldLabel","eventItemType","TimeResolution","SortNr","binary","sort","field1","field2","EventFormModel","setBinaryUrls","eventId","UrlHelper","getEventBinaryUrl","getEventWriteData","devMode","dataLoader","getSaveRequestData","EventValues","fieldsData","saveData","api","request","onDataLoaded","onChangeData","subscribe","dataIndex","previous","triggerDataLoaded","oldData","restoreData","subscriptions","observeLoader","formfields","getItemsDict","onChangeLoading","getLoading","Grids","ColumnType","GridHelper","kendoFieldType","0","1","2","3","4","5","columnFilterUI","gridColumnTemplate","fieldName","columnOptions","rowData","GridModel","setGridData","action","dataItem","clonedData","jQuery","selectedRowData","selectedData","columns","schema","GridView","updateGridData","suspendDataBinding","grid","uids","scrollTop","uidField","selection","select","j","filterable","setDataSource","lazyShow","pageSize","initial","updateLazyShow","rows","datas","u","dataRow","uid","updateModelData","renderGrid","$gridContainer","gridSelector","gridFilter","extendedFilter","extra","operators","string","contains","ui","FilterMenu","doesnotcontain","startswith","eq","sortMode","sortMultiple","initialSort","onSelectionChange","sortable","mode","allowUnsort","allowCopy","selectable","navigatable","resizable","groupable","reorderable","toolbar","convertToKendoGridToolbarItems","getColumns","noRecords","messages","noRecordsMessage","dataBound","onSave","scrollable","beforeCreateGrid","kendoGrid","headerTooltip","startLazyShow","items","updateErrorSummaryDelayed","dblclick","updateFullHeight","items_1","item","fillHeight","scroller","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","column","getDefaultGroupHeaderTemplate","templates","hideColumn","showColumn","validateInput","columnTitles","requiredFields","validation","required","gridData","missedFields","updatingErrorSummary","updateErrorSummary","clearGrid","errors","ErrorInfo24x24","GridErrorSummary","focusElement","insertRow","insertedRow","insert","focusGrid","current","_current","_updateCurrentAttr","_scrollCurrent","EventGridHelper","getColumnHeader","isColumnEditable","validateKey","isValidIdentifier","getDefaultFieldOptions","getColumnsConfig","gridConfig","gridDefinition","columnConfigs_1","getColumnConfigs","columnConfig","columnKey","getColumnKey","eventItemInfo","tryGetEventItemInfo","columnType","tryGetColumnType","getColumnOptions","fieldOptions","getFieldOptions","createColumnDefinition","createSchemaDefinition","col1","col2","getColumnType","GridOptions","multiFilter","Width","Visibility","isPoolItem","textPool","textPool_1","textPoolItems","FieldOptionsBindings","getMultiSelectEditor","getDropDownEditor","getAutoCompleteEditor","getDateEditor","getDateTimeEditor","getTimeEditor","ColumnBindings","timeColumnTextModeTemplate","compare","left","right","timeColumnTextModeCompare","getNumericEditor","customBoolEditor","defaultValue","DateTimeOffset","Int32","Int64","Decimal","emptyEntry","concat","autoBind","highlightFirst","timeValue","dateValue","time1","time2","h24","EventGridModel","columnsConfig","getTextPool","AsLinq","FirstOrDefault","RestrictFilterSelection","distinctData","Select","Distinct","ToArray","textPoolItemDic","getTextPoolItemDict","distinctData_1","Label","sortNr","sortTextPoolItems","EventGridView","this_2","itemTemplate","JobLogGridHelper","TaskLogGridHelper","resultLevelTemplate","JobLogGrid_ResultLevelCell","resultLevel","resultLevelLabel","excecStateTemplate","TaskLogGrid_ExcecStateCell","execState","execStateLabel","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","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","getJobLogFilters","TimeseriesDataGridModel","refreshData","force","dateRangePickerModel","dateChangedLoadDataHandler","requestData","StartDate","EndDate","getTimeseriesData","TimeseriesDataGridView","renderFinished","validateData","sheetRows","getRowData","getColumnConfig","spreadsheetOptions","cells","sheetsbar","sheets","frozenRows","numberOfHeaderRows","frozenColumns","valueChanged","TimeseriesDataGrid","spreadsheet","kendoSpreadsheet","setCellEditability","validator","comparerType","messageTemplate","TimeseriesDataGrid_OnlyNumbers","activeSheet","arg","changedCellsBackground","getChangedCellsBackgroundColor","rgbColor","CiColor","rgb2rgba","timeResolution","cd","timezone","Count","dateChangedHandler","isDirty","TimeseriesDataGrid_SaveDialog","Windows","openWindow","saveChangedData","saveRequest","getChangedData","notification","Popups","Notification","TimeseriesDataGrid_Notification_SaveData","closable","updateTimeseriesData","setContent","TimeseriesDataGrid_Notification_SaveDataOK","setIcon","NotificationIcon","Ok","closeAfterTimeout","TimeseriesDataGrid_Notification_SaveDataError","Error","setClosable","maxRows","headerRows","Timeseries","Any","tw","saveRequestData","DatabaseId","fillChangedData","rowOffset","sheet","Hypothesis","hypothesis","TimeseriesId","timeseriesId","rowIdx","rowDataIndex","colDataIndex","oldValue","cellIdentifier","getHeaderRows","cellBackgroundColor","createHeaderRow","spreadsheetRow","defaultHeaderStyle","retData","textAlign","bold","timeseriesName","unit","retArray","cellHighlightBackgroundColor","ForEach","valueFormats","getValueFormats","tsData","dateString","getFormatDateForTimeResolution","ticks","formatStr","getDateFormat","moment","MomentDateFormat_DayWithHour","MomentDateFormat_OnlyDay","MomentDateFormat_OnlyMonth","MomentDateFormat_OnlyYear","retArr","places","decimalsPlaces","defaultDecimalPlaces","TimeseriesGridHelper","dimensions","dim","TimeseriesGrid_Id","TimeseriesGrid_Name","TimeseriesGrid_AxisType","axisType","TimeseriesGrid_TimeAxisType_Vector","TimeseriesGrid_TimeAxisType_MatrixTimeTime","TimeseriesGrid_TimeAxisType_MatrixTimeTimeNumber","TimeseriesGrid_TimeAxisType_MatrixTimeTimeTime","ts","Keys","k","DimensionId","DescriptorId","TimeseriesGridModel","timeseriesLoader","timeseries","imageUrl","addDevModeIfNeeded","getParameter","devBox","InteractiveImage_DevBox","xContainer","yContainer","imageBox","mousemove","parentOffset","offset","relativeXPosition","pageX","relativeYPosition","pageY","top","mouseleave","mouseenter","InteractiveImage_Frame","createElementForPoint","createElementForText","fontSizeInPercent","createElementForRectangle","interactiveImageModel","startsWith","funcStr","prefix","convertToFunction","procedureString","eval","renderFunc","containerSelector","renderCallback","debugLog","errorLog","logDebug","msg","Transformations","FormatSeriesName","formatString","parentSeriesLabel","procedure","dateFormat","FormatSeriesNameUseOnlyParentSeriesLabel","ChangeTimestampToGroupingFormat","groupingFormat","hour","getHours","UTC","LatestDatapointTransformation","transformationData","latestDataPoints","newSerie","groupingIndex","xAxisIndex","yAxisIndex","maxIndex","dataBin","xAxisValues","xValue","yValue","groupingValue","xAxisValue","possibleTuples","tupleWithLatestGroupingDate","yAxisValue","groupingDate","StackDataTransformation","groupingType","toUpperCase","_stackDataByYear","groupingArr","hash","currentDate","currentYear","getUTCFullYear","getDate","getSeconds","TimeaxisToSeriesTransformation","groupedValue","parseFloat","labelFormat","OHLCTransformation","dataList","getTs","list","datasourceId","targetList","timestamp","dataTmp","openTs","o","highTs","h","lowTs","l","closeTs","CombineSeries","tData","series1","series2","currData","seriesid1","seriesid2","dataDictionary","Chart","getSmallestDateFromDataList","findMatchingPoint","points","searchX","minIndex","pointsLength","startPoint","endPoint","midIndex","midIndexPoint","nextPoint","applyPreloadTransformation","interactiveDefinition","setTitle","reloadAfterTransformation","preloadtransformation","fixDataList","dataLists","smallestDateOfAllLists","relevantIndex","smallestDateOfCurrentList","baseSeries","setChartControlsDependingOnSize","chartOptions","highstockchartSelector","initialChartConfig","navigatorEnabled","scrollbar","enabled","buttonsEnabled","rangeSelector","optionsChanged","getSeriesPointsForXValue","len","transformDataIfRequired","datatransformation","getSeriesLabel","preprocessInteractiveDefinition","interactiveData","defaultChartOptions","highchartOptions","chartseries","seriesLabel","_b","dataList_1","datasource","datasourceid","seriesStyles","_c","_d","seriesstyles","seriesstyleid","transformation","_e","newSeriesList_1","seriestransformation","seriesProcedure","timeGrouping","_f","_g","Defaults","interactiveGraphic","backgroundColor","borderColor","animation","marginLeft","zoomType","borderRadius","plotOptions","events","exporting","contextButton","credits","maskFill","fillOpacity","lineColor","outlineColor","maskInside","barBackgroundColor","barBorderColor","barBorderRadius","buttonArrowColor","buttonBackgroundColor","buttonBorderColor","trackBackgroundColor","trackBorderColor","buttonBorderRadius","fontFamily","fontWeight","borderWidth","valueDecimals","hideDelay","crosshairs","shared","shadow","inputDateFormat","ChartInputDateFormat","buttonTheme","fill","stroke","states","hover","titleText","onReloadAfterTransformation","loadChart","currentUpdateSizeTimer","clearTimeout","syncTooltip","chartsDomSelectors","domSelector","mInitialChartConfig","chartTitleHeight","outerHeight","setSize","getDataApi","getDefaults","mouseOver","chartTarget","removeAttr","InteractiveItem","InteractiveItemController","renderInteractiveItems","configName","configPath","modify","itemsContainer","renderInteractionItemsContainer","getDocument","json","interactiveItemModelOptions","JSON","interactiveItems","interactiveItemModelOptions_1","interactiveItemModelOption","configName_1","configPath_1","readConfig","interactiveItem","itemContainer","appendInteractiveItemContainer","InteractiveItemModel","createInteractiveItemInstance","LineInteractiveItemView","CircleInteractiveItemView","SpeedometerInteractiveItemView","changeSelectedRange","targetTimeResolution","interactiveitem","tsValues","tsValue","loadData","i_1","loads","loadingProperty","funcs","valueProperty","tsValues_1","AggregationRule","aggregationRule","Key","convertKey","SourceTimeResolution","sourceTimeResolution","TargetTimeResolution","Unit","Absolute","absolute","Notifications","notify","responseText","baseKey","Value","getDefaultDateForDay","getDefaultDateForMonth","configValue","InteractiveItemView","setLoadingAnimation","setTemplateFromConfig","icon","addClickAction","button","windowOptions","ConfigLauncherApp","getConfigFile","getStartDate","getEndDate","setUrl","convertValue","handleLoadingAnimation","InteractiveItemLine","removeLoader","InteractiveItemCircle","InteractiveItemSpeedometer","prozent","calculatingSpeedometerProzent","cutValue","beautifyUrl","configLoaded","timeaxis","begin","end","CustomConfigTsChartApp","beginsWith","endsWith","status","ConfigurationErrorOverlay","decodeURIComponent","CustomTimeseriesChartView","Job","JobStarterModel","updateLatestRun","onEnd","jobLogRequest","LatestRun","LatestRunByBegin","LatestRunIncludeRunning","FilterSettings","JobNrs","jobNr","getJobLog","jobLogs","latestRun","latestRunEnd","resetStartStatus","latestRunResult","latestRunBegin","latestRunSchedule","latestRunLogNr","startStatus","loadJobInfo","jobId","getJobs","Ids","jobs","configError","jobName","PrimaryKey","startJob","JobId","JobStarterView","lastRun","statusIcon","getStatusIconFromStatus","lastJobRunIcon","getLastJobRunStatus","tileModel","Tile","StatusTileModel","JobLogGrid_LastRun","tileView","StatusTileView","tile","jobStart","icons","getJobStatusTooltip","JobStarterConfigurationErrorOverlay","tooltipPosition","JobStarterLatestRunTooltip","planned","showTaskLog","jobStatus","lastJobRunStatus","MiniProcessMonitoringApp","confirm","handleJobStartError","activateLatestRunUpdate","handler","setInterval","clearInterval","JobStarterProcessMonitoringApp","datePickerContainer","processMonitoringGridContainer","datePickerModel","processMonitoringGrid","ProcessMonitoringGrid","dir","updateJobLog","triggerWindowResizeEvent","addMinutes","RunBeginDynFrom","RunBeginDynTo","taskLogGridModel","jobLogLoader","loadLogs","jobLogGridView","updateTaskLog","jobLogNr","taskLogLoader","JobLogNr","abortRequest","JobStarterProcessMonitoringGrid","jobLogGridContainer","taskLogGridContainer","JobLogLoader","jobLogGridModel","TaskLogLoader","kendoSplitter","orientation","panes","collapsible","layoutChange","layoutgridConfig","layoutGridConfig","layoutGridItemRoot","rootConfig","renderGridItem","LayoutGrid_BasicTable","size1","size2","LayoutGrid_Horizontal","LayoutGrid_Vertical","newTargets","processItem","pane1","pane2","loadApps","startApp","Wrappers","MaximizeWrapper","maximized","onChangeWindowSize","restored","undockUrl","getUndockUrl","LayoutGrid_Cell","layoutGridModel","MapModel","MapView","layers","addBackgroundLayer","ol","projection","extent","maxZoom","minZoom","zoom","attribution","control","Attribution","Map","controls","showResetZoomButton","addCustomControl","resetZoomAndCenter","resetZoomHandlers","showMapTypeButton","changeMapType","createTooltips","showChangeMapTypeMenu","dropdownMenu","layer","currentBackgroundLayerType","source","BingMaps","bingMapsKey","imagerySet","OSM","getLayers","setAt","createTooltip","getCoordinateWithOffset","xPixelOffset","yPixelOffset","coordinate","coord","proj","transform","pixelCoord","getPixelFromCoordinate","newPixelCoord","newCoord","getCoordinateFromPixel","duration","getView","setZoom","setCenter","onClick","titleArg","refreshAll","transformedCoordinate","easing","inAndOut","setZoomLevel","setCenterAndZoomAnimated","zoomOuter","newCenter","addOverlay","olOverlay","Overlay","positioning","addMarker","detail","marker","MapMarker","markerCounter","iconDetailLeft","iconDetailRight","tooltipDetailLeft","tooltipDetailRight","onClickMarker","onClickDetailLeft","onClickDetailRight","requestedType","backgroundLayerType","Stamen","mapModel","transformExtent","currentZoomLevel","Menus","MenuItem","guid","menuItem","reference","VerticalMenuEvents","FilterOperator","VerticalMenuModel","convertToMenuItemsInteral","menuItems","menuItemsInteral","menuItems_1","GuidHelper","newGuid","itemItern","updateMenuItemsDict","menuItemsDict","getMenuItems","setMenuItems","visibleMenuItems","onNext","onMenuItemsChanged","asObservable","onVisibleMenuItemsChanged","getVisibleMenuItems","setVisibleMenuItems","onSelectedMenuItemChanged","selectedMenuItem","getSelectedMenuItem","setSelectedMenuItem","tryToSelectMenuItemByGuid","tryToSelectMenuItemById","tryToFindMenuItemById","filterOptions","operator","And","caseSensitive","queries","Where","q","andQuery","orQuery","queries_1","isPartOfIf","queries_2","part","RxEx","Subject","VerticalMenuView","actionEnabled","actionIcon","searchBoxEnable","searchBoxEnabled","noResultsMessage","renderSearchBox","updateScroller","updateTooltips","internalBind","initSelectedMenuItem","addEvents","searchBox","verticalMenuContent","verticalMenuList","searchBoxModel","SearchBoxModel","SearchBoxView","searchBoxPlaceholder","onChange","actionClick","onKeyDown","isKey","originalEvent","autoSelect","trySetSelectedItemFromUrlQuery","firstItem","dataId","selectedMenuItemSubscription","selectedItemChanged","visibleMenuItemsSubscription","visibleMenuItemsChanged","internalUnbind","menuItemsSubscription","unhighlightSelected","highlightSelected","clearRoute","menuItems_2","tooltipContent","updateHighlightSelected","selectedItem","scrollIntoViewport","routingParameter","removeParameter","selectedId","history","routingHistory","documentTitleBase","selectedLabel","menuItemElement","menuItemsElements","lookup","createMenuItemsLookup","isMenuItemVisibile","visibleMenuItems_1","visibleMenuItem","SearchBox_Search","VerticalMenu","Panel","AccordionModel","AccordionView","fieldTitles","kendoPanelBar","expandMode","getFields","accordionFields","fieldTitle","Accordion","implicitStack","children","closeable","setHideable","hideable","setType","setError","setOk","Loading","Info","timeout","closeAfter","keepOnNavigate","autoClose","DefaultNotificationStack","NotificationBox","prependTo","getHighestZIndex","LoadingNotification","ok","successMsg","errorMsg","loadingMsg","RangePickerOptions","TimeRange","DateRange","DateShiftDirection","DateChangedEvent","timeRange","StandardRangeCalculator","shiftQuarter","dateRange","direction","Next","Previous","shiftDay","shiftMonth","shiftYear","getDateRange","Day","RangeDay","RangeMonth","RangeYear","RangePickerModel","equals","stringify","getCurrentTimeRange","getCurrentRange","onDateChanged","dateChanged","setValues","setYear","setQuarter","setDay","newValues","dateRangeCalculator","setValuesInternal","shiftValues","dataRange","Rx","Dictionary","keyStr","dic","keyDic","allValues","allKeys","RangePickerDomDictionary","containerDictionary","datePickerDictionary","radioDictionary","allDataPickers","allRadios","getContainer","getDatePickers","getDatePicker","getRadios","getRadio","getSelectedTimeRange","RangePickerView","initDateRangePickerModelDictionary","initialStartDate","initialEndDate","availableTimeRanges","dateRangePickerModelDictionary","initialSelection","subscribeModel","this_3","modelSubscription","selectTimeRangeControl","showTimeRangeControl","internalRender","rangePickerDomDictionary","getTemplateData","initializeContainer","renderControls","subscribeEvents","showYear","lookupTimeRangeAvailable","showMonth","showDay","showRangeDay","showRangeMonth","showRangeYear","Contains","navigatePrevious","navigateNext","renderControl","getControlOptions","quickNavigation","RangePicker","initialTimeRange","SearchBox","clearButton","toggle","clearInput","timeOutHandler","keyup","TileStyle","TileSize","TileBaseModel","TileBaseView","TileListModel","tileAttributes","TileListView","div","tileAttributes_1","tileAttribute","createModel","createView","SimpleTileModel","SimpleTileView","el_1","SimpleTile","el_2","StatusTile","TimelineModel","TimelineView","timeline","kendoScheduler","startTime","majorTick","views","batch","transport","read","create","parameterMap","operation","meetingID","startTimezone","endTimezone","recurrenceId","recurrenceRule","recurrenceException","roomId","nullable","attendees","isAllDay","group","resources","multiple","TimeseriesDataLoaderBase","TimeseriesDataLoader","timeResolution2","startDate2","endDate2","requestApi","silent","fillUpWithNullValues","abortLoadRequest","loadRequest","TimeseriesSimpleDefinitions","TimeResolution2","StartDate2","EndDate2","FillUpWithNullValues","processLoadedData","abortSaveRequest","abortRequests","abort","TimeseriesDataViews","TimeseriesDataViewModel","loader","bindToLoader","convertChartData","getDataSaveEntities","TimeseriesDataView","exportFilename","enableDateSelection","defaultStartDate","defaultEndDate","maxDateRangeDays","showExportButton","showSaveButton","spreadsheetFormat","createDatePicker","createChartView","createGridView","setEvents","datePicker","TimeseriesDataView_DatePicker_From","TimeseriesDataView_DatePicker_To","chartView","TimeseriesDataChartView","gridView","RowBasedSpreadsheetView","ColumnBasedSpreadsheetView","all","switchToChart","switchToGrid","excel","isGirdViewSelected","configureExcelMenu","updateModel","TimeseriesDataView_Excel_EportToXls","TimeseriesDataView_Excel_EportToCsv","ulXls","createSubMenu","exportToExcel","ulCsv","exportToCsv","header","exportMethod","singleExportItem","TimeseriesDataView_Excel_Export","exportAllItem","TimeseriesDataView_Excel_ExportAll","allExportDefinitions","definitions","chartsData","convertToChartData","filename","buildFileName","ExportHelper","exportChartDataToExcel","Error_ExcelExport_MissingData","Error_ExcelExport_MissingData_Title","defs","exportChartDataToCsv","replace","viewData","TimeseriesDataChartViewHelper","getDefaultConfig","Gray","ordinal","opposite","CoalGray","followPointer","dateTimeLabelFormats","day","minute","WhiteSmoke","lineWidth","handles","area","stacking","verticalAlign","resetZoomButton","theme","chartContainer","resetAxisExtrema","highchartsModel","highchartsView","updateChartData","timeseriesLinq","First","getTimeseriesSettings","chartMode","currentTimestamp","lastValue","LastOrDefault","newData","getTimepointsExtrema","getDataExtrema","minTotal","MAX_VALUE","maxTotal","timeseries_1","multiply","timeseriesDataViewDataList","timeseriesDataViewDataList_1","timeseriesDataViewData","buffer","CellType","TimeseriesDataSpreadsheetBase","TimeseriesDataSpreadsheetView","spreadsheetContainer","checkTimeseriesDataViewData","timeseriesDataViewDataList_2","warn","getMaxLengthTimeseries","cols","maxLengthTs","getValidator","getRange","tsDataList","suspendUpdates","updateData","backup","updatesSuspended","spreadSheet","onEdit","headerRowsCount","maxLengthTimeseries","getSpreadsheet","dirty","sheetByIndex","rowsCount","_rows","_count","columnsCount","_columns","tsIndex","cellsList","getInitCellsList","addRangeColumn","addTimeseriesDataColumns","getRows","cellsList_1","cellType","DataEdit","DataReadOnly","addDataColumn","BorderLeft","Header","TimeseriesDataView_Spreadsheet_Timestamp_Label","Range","columnHeaders","columnWidth","cellTypes","cellHeaderTypes","columnHeaders_1","columnHeader","BorderBottom","data_1","cell","updateCellStyle","cellTypes_1","Gainsboro","borderLeft","DarkGray","ThickBorderLeft","borderBottom","headerCols","fillRowbasedSpreadsheet","headerRow","fontSize","TimeseriesGrid_Unit","sheetColumns","dateValues","dateRow","SpreadsheetHelper","getColumnName","columnIndex","valuesRow","bg","hex2Rgb","headerRange","TimeseriesStatusModel","databaseId","dynamic","NowTimeResolution","Offset","timespan","OffsetTimeResolution","ExcludeEndDate","timeresolution","dataSourceId","dataSourceType","timeaxisIds","valueDate","TimeseriesStatusView","getStatus","getDisplayValue","getUnit","statusCss","setTooltipIfNeeded","showTooltip","TimeseriesStatus_Tooltip","popup","timeseriesValue","interpretations","valueInterpretation","noValue","Silver","Green","OrangeRed","Red","TimeseriesStatus_Text","TimeseriesStatus_Circle","TreeView_1","TreeViewItem","ItemsChangedArgs","TreeViewHelper","getItemsIds","flattenItems","items_2","TreeViewModel","getFlattenItems","getItems","getSelectedItems","selectedItems","onItemsChanged","itemsChanged","onSelectedItemsChanged","selectedItemsChanged","setTreeViewDomainData","treeViewDomainData","setUpLookup","selectTreeViewItems","lookupTreeViewItem","getItemsByIds","ids","ids_1","getItemById","getSelectedItemsIds","apply","arguments","TreeView","initializeKendoTree","treeView","itemsChangedSubscription","selectedItemsChangedSubscription","updateSelection","updateItemUrlParameter","setKendoTreeSelectedNodes","routingKey","updateTreeSelectionFromUrl","treeModel","itemsParam","itemsToKendoDataSource","HierarchicalDataSource","kendoTreeControl","updateDomElement","modelLookup","visitTreeChildrenAndAddToLookup","addDataIdToTreeItemDomElements","node","nodes","hasChildren","check","onKendoTreeCheck","hasCheckboxes","checkParents","checkboxes","checkChildren","kendoTreeView","selectedNodeIds","getKendoSelectedNodeIds","getKendoSelectedNodesRecursive","checked","setKendoTreeSelectedNodesRecursive","renderedContent","maximize","undock","openInWindow","sourceElement","parent","detach","closed","onWindowClosed","onWindowOpened","parentElement","apiUrl","appKitchenApiUrl","documentMap","setAPIs","appKitchenUrl","reDate","parseDateString","toDate","getDataInternal","method","apiNameWithUrl","errorCallback","textStatus","errorThrown","handleError","getDataByGetRequest","apiName","ajaxSetup","converters","text json","convertJsonDates","p","parseJSON","setClaim","token","username","Token","Username","hasSessionToken","Cookies","currentUserCookieName","ping","logInfo","getDataApiUrl","getDataByGetRequestApi","documentName","documentType","getDocumentCached","documentId","documentData","getFile","fileName","rootFolder","getFileCached","inventoryPart","fieldIdPart","idPart","databaseIdPart","getIconUrl","iconId","getTextPoolItems","getGlobalSettings","getEventInventories","getEventItemInfos","getEventData","getTimeseries","getTimeseriesInfo","getTaskLog","getHypotheses","updateEventData","updateEventMultiData","deleteEventData","getDimensions","getDescriptors","getTrees","Division","passwordChangeRequest","ctx","getUserRoles","getIconBase64","Descriptors","DescriptorProvider","onLoadComplete","dimensionId","this_4","dimensionLoaded","DefaultEventDataLoaderDataConverter","getItemDictionary","itemDictionary","getTextPoolItemDictionary","textPoolItemDictionary","updateItemDictionary","eventItemInfos","this_5","textPoolItem","StatusColor","eventItemInfos_1","convertDataFromServer","data_2","entry","convertStringToType","convertDataToServer","eventDataSaveRequests","data_3","toLocalISOString","EventDataLoader","changeEvents","setItems","ready","onChangeItems","onChangeReady","setLoading","setConfig","onChangeConfig","loadItems","eventItemsProvider","cacheEventItemRequest","startupFailed","abortDataRequest","eventDataApi","eventDataProvider","always","abortDataSaveRequest","eventDataSaveApi","eventDataSaveProvider","getMultiSaveRequestData","saveResult","EventDataSaveRequests","dataConverter","convertedData","parseData","getEventFieldInfo","onReady","EventItemsProvider","EventDataProvider","EventDataSaveProvider","SubjectWithPrevious","Export","saveAsExcel","sheetTitle","autoWidth","headerBackground","headerForeground","headerBorder","foreground","workbook","ooxml","Workbook","saveAs","dataURI","toDataURL","saveAsCsv","showHeader","columnDelimiter","rowDelimiter","useSaveFileProxy","charset","lines","stringValue","dataUri","btoa","proxyUrl","proxyURL","forceProxy","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","fromCharCode","Uint8Array","fix","Import_InvalidFile","SheetNames","Sheets","columnName","Import_MissingColumn","rawData","utils","sheet_to_row_object_array","parsedRow","cellName","cellValue","Import_MissingValueAt","exception","readAsArrayBuffer","readCsvFile","firstDataRowIndex","encoding","readAsText","jobLog","PlannedSchedule","RunBegin","RunEnd","taskLogs","taskLog","TimeseriesLoader","includeKeys","timeseriesApi","timeseriesInfoApi","loadDimensions","loadAll","IncludeKeys","loadByDescriptors","exactMatch","ExactMatch","abortTimeseriesRequest","timeseriesRequest","loadInfo","abortTimeseriesInfoRequest","timeseriesInfo","getAdditionalInfo","tsIds","anyMissing","timeseriesInfoCache","timeseriesInfoRequest","ProviderBase","do","deferred","Deferred","resolve","err","reject","promise","ProviderMapCachedBase","reloadRequest","getKey","getHashCode","GetHashCode","LogoutProvider","PasswordChangeInfoProvider","ProviderCachedBase","TreeViewProvider","mainHeader","UserMenuStyle","MainApp","apps","mainMenu","userMenu","userMenuStyle","checkDeprecatedUserMenuStyleOptions","customItems","helpMenu","aboutAppName","About","DefaultHeader","started","simpleMenu","Simple","Extended","Transitions","introduce","setMenu","createMainMenu","mainMenuContainer","createBurgerMenu","burgerMenuContainer","menuContainer","menu","getMenuDefinition","handleMenuCloseEvent","handleMenuSelectEvent","handleMenuOpenEvent","updateTabindex","href","navigate","highlightMenuItemForRoute","appContainer","burgerMenuDataSource","getBurgerMenuDefinition","dropDownContainer","class","createBurgerMenuList","screenHight","createMenuIcon","highlightBurgerMenuItemForRoute","child","li","renderBurgerMenuItem","subUl","subChild","subLi","subSubUl","subSubChild","menuLayerUl","cssClass","menuItemLi","urlAnchor","newWindow","removeAttribute","updateSubmenuOpenedFlag","updatePageTilte","pageTitleContainer","innerText","hrefParser","parents","registerRoutedApp","appRoute","startRoutedApp","userMenuContainer","footerContainer","stop","getUserName","userMenuDataSource","getHelpMenuDefinition","Hidden","getUserMenuDefinition","configureUserMenu","configureHelpMenu","showFooter","createFooter","onpopstate","menuDefinition","Logout","Help","UserManual","Close","windowCssClass","userManualUrl","model_1","RoutedAppHolder","activeApp","menuLabel","showAfter","footerTemplate","Footer","copyright","cookieSettings","securityTokenServiceOAuthUrl","privacy","imprint","getCurrentUser","visitChildren","visitor","includeSelf","definition","param","forceNavigate","highlightOnNavigate","keepOpenOnSelected","RoutedApp","containerEmpty","swap","isSingleton","backupPreviousApp","disposePreviousApp","tryRestoreApp","runningApp","startAppInternal","clearSelection","wOptions","min-width","min-height","popupWindow","appClass","singletonBackup","SingeltonRoutedApp","startInContainer","AppClass","counter","actions","off","handle","lostActions","createEvent","initEvent","dispatchEvent","getUserAgent","userAgent","match","substring","minimal","features","addressbar","menubar","statusbar","openedWindow","replaceState","pushState","path","location","reload","getUrl","queryParams","queryString","vars","pair","arr","keyFound","newUrl","splice","clear","getLanguage","fCode","ObjIdentifier","LastTimeUpdated","now","toISOString","TimeseriesIdentifier","InventoryIdentifier","ActionHolder","inventoryIdentifier","identifier","ChangeManager","onInventoryChanged","trackNumber2action","trackNumber","onTimeseriesChanged","removeChangeListener","getAllInventoryIdentifiers","getAllIIdentifiers","getAllTimeseriesIdentifiers","allInventories","actionHolder","inventoryHasChanged","timeseriesHasChanged","timeseriesIdentifier","processResult","checkForUpdates","pollIntervalMs","InventoryIdentifiers","HasChanged","TimeseriesIdentifiers","allTimeseries","startCheckForUpdates","checkingForUpdates","ChangeManagerWithWebSockets","webSocket","send","ObjectType","WebSocket","hostname","onmessage","changeMessage","exportChartsData","def","excelData","firstChartData","timepoint","#1","columnDefinitions","ExcelExport_DateTimeColumnHeader","lightenHex","csvData","oldDate","newDate","addHours","hours","minutes","setHours","reg","searchString","subjectString","truncate","replaceAll","searchValue","replaceValue","random","listeners","storedString","localStorage","getItem","storedObject","store","expires","setItem","expired","expirationDate","removeItem","registerListener","hideErrorPopup","Messages_ErrorOccured","deep","PasswordHelper","PasswordStrength","$object","shortPass","Form_PasswordComplexity_shortPass","badPass","Form_PasswordComplexity_badPass","goodPass","Form_PasswordComplexity_goodPass","strongPass","Form_PasswordComplexity_strongPass","containsUsername","Form_PasswordComplexity_containsUsername","enterPass","Form_PasswordComplexity_enterPass","notComplex","Form_PasswordComplexity_notComplex","animateSpeed","usernamePartialMatch","scoreText","score","isComplex","calculateScore","user","checkRepetition","rLen","str","repeated","charAt","$text","$percentage","shown","$graybar","$colorbar","$insert","after","perc","slideDown","slideUp","fn","columnNumber","modulo","dividend","floor","getString","possible","defaultNotificationStack","Responsive","targets","extendShortHex","parser","validateRgbComponent","componentToHex","lightenRgb","amount","darkenRgb","component","hex","lostTargets","getSelection","removeAllRanges","availableHeight","not","actualNewHeight","opt","LoadingCircleSpinner","LoadingMesapSpinner","fadeIn","complete","animationContainer","renderLoadingAnimation","loaderType","removeLoadingAnimation","except","addTooltip","maxZ","z","parseRgbString","darkenHex","number2rgbaString","num","targetElement","disableResize","synchronizeScrolling","scroller1","scroller2","$scroller1","$scroller2","scrolling1Timeout","scrolling2Timeout","scrollTo","offsetToViewport","included","viewport","elementBounds","offsetTop","distance","axis","opacity","fadeOutDuration","fadeInDuration","modalOverlay","draggable","resized","highestZ","hasTitleBar","kendoWindow","deactivate","activate","buttonsContainer","$btn","WindowButton","minimize","restore","dialogOptions","DialogBoxAlert","box","strings","Cancel","DialogBoxConfirm","yesNo","yes","no","getNotificationStack","closeAll","registerTarget","loginEnsured","intervalId","getParameterFromQueryString","redirectToOAuth","tokenUrl","getOAuthUrl","domain","removeCookie","tokenserviceUrl","welcomeMessage","loginTheme","finishLoginProcedure","pingTimeout","pingInterval","CheckPasswordValidity_PasswordExpireInViewDays_Day","CheckPasswordValidity_PasswordExpireInViewDays_Days","daysBeforeExpiring_1","PasswordValidityNotification","CheckPasswordValidity_PasswordExpireInViewDays_Message","subMessage","CheckPasswordValidity_PasswordExpireInViewDays_Title","renderPasswordExpireNotification","claim","atob","escaped","decoded","temp","textContent","OAuthLink","ensureLoginAndStart","redirect","logoutResult","successfullyLoggedOut","errorMessage","Starter","startup","ressourcesLocations","globalSettingsLoaded","loadedRessourcesCount","tryToStartApp","throwStartupError","currentFolder","serverSettings","RequiresAuthentication","PingInterval","PingTimeout","PingEnabled","SecurityTokenServiceOAuthUrl","WelcomeMessage","LoginTheme","sessionTokenCookieName","SessionTokenCookieName","CurrentUserCookieName","ContextSensitiveHelpEnabled","UserManualEnabled","UserManualUrl","ApplicationName","ApplicationVersion","ApplicationCopyright","customConfig","CustomConfig","ShowFooter","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","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":["///\r\n\r\nnamespace 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 requiresLogin: boolean = true;\r\n export var pingInterval: number;\r\n export var pingTimeout: number;\r\n export var pingEnabled: boolean = true;\r\n export var culture: string;\r\n export var loginTheme: string;\r\n export var welcomeMessage: string;\r\n export var contextSensitiveHelpEnabled: boolean = false;\r\n export var userManualEnabled: boolean = false;\r\n export var userManualUrl: 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 export var showFooter: boolean;\r\n }\r\n\r\n export module Templates {}\r\n\r\n export module Data {}\r\n\r\n export module Controls {}\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 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 = OptionsHelper.merge(options, this.defaultOptions());\r\n\r\n this.el = targetContainer;\r\n this.$el = $(targetContainer);\r\n\r\n Data.init();\r\n\r\n if (this.options.requiresLogin) {\r\n 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 { requiresLogin: GlobalSettings.requiresLogin };\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 export interface SetAttributeOptions extends Backbone.ModelSetOptions {\r\n silent?: boolean;\r\n }\r\n\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: any, options?: SetAttributeOptions): this {\r\n super.set(attributes, options);\r\n return this;\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 as TAttributes;\r\n }\r\n\r\n bind(eventName: string | Backbone.EventMap, callback: (model: ModelBase) => void, context?: any) {\r\n super.bind(eventName, callback, context);\r\n return this;\r\n }\r\n\r\n on(event: string | Backbone.EventMap, callback: (model: ModelBase) => void, context?: any): any {\r\n super.on(event, callback, context);\r\n return this;\r\n }\r\n\r\n getPrevious(): any {\r\n return this.previousAttributes();\r\n }\r\n }\r\n\r\n export class CollectionBase> extends Backbone.Collection {}\r\n\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 = OptionsHelper.merge(options, {\r\n loadingOverlay: UIHelper.renderTemplate(`
${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 export interface CollectionViewBaseOptions {}\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 = OptionsHelper.merge(options, {\r\n // default options here\r\n });\r\n }\r\n }\r\n\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}","namespace AppKitchen {\r\n\r\n export module Apps {\r\n\r\n export class ChangePasswordApp extends AppBase {\r\n private formModel: Controls.Forms.FormModel;\r\n private templatedFormView: Controls.Forms.TemplatedFormView;\r\n\r\n start() {\r\n this.loadPasswordRestrictionInfo();\r\n }\r\n\r\n private loadPasswordRestrictionInfo() {\r\n Data.Provider.PasswordRestrictionInfoProvider.load()\r\n .then(passwordRestrictionInfo => this.render(passwordRestrictionInfo));\r\n }\r\n\r\n private render(passwordRestrictionInfo: Api.Models.PasswordRestrictionInfo) {\r\n\r\n var fields = [\r\n new Controls.Forms.FieldModel(\"OldPassword\", Controls.Forms.FieldType.Text, \"OldPassword\", {\r\n password: true,\r\n placeholder: Strings.UserInfo_OldPassword,\r\n order: 10001\r\n }),\r\n new Controls.Forms.FieldModel(\"NewPassword1\", Controls.Forms.FieldType.Text, \"NewPassword1\", {\r\n password: true,\r\n showPasswordComplexity: { showText: true, showPercent: true, animate: true, minimumLength: passwordRestrictionInfo.minimumPasswordLength, requiresComplexPassword: passwordRestrictionInfo.requireComplexPassword },\r\n placeholder: Strings.UserInfo_NewPassword,\r\n order: 10002\r\n }),\r\n new Controls.Forms.FieldModel(\"NewPassword2\", Controls.Forms.FieldType.Text, \"NewPassword2\", {\r\n password: true,\r\n placeholder: Strings.UserInfo_ConfirmNewPassword,\r\n order: 10003\r\n })\r\n ];\r\n\r\n this.formModel = new Controls.Forms.FormModel(fields);\r\n this.templatedFormView = new Controls.Forms.TemplatedFormView(this.formModel, this.el, Templates.ChangePassword, { editable: true });\r\n\r\n // submit on enter\r\n this.templatedFormView.fieldViewDict[\"OldPassword\"].on(\"keypress-enter\", () => this.changePassword(passwordRestrictionInfo));\r\n this.templatedFormView.fieldViewDict[\"NewPassword1\"].on(\"keypress-enter\", () => this.changePassword(passwordRestrictionInfo));\r\n this.templatedFormView.fieldViewDict[\"NewPassword2\"].on(\"keypress-enter\", () => this.changePassword(passwordRestrictionInfo));\r\n\r\n // submit on button click\r\n this.$el.find(\".a-btn-change-pwd\").click(() => this.changePassword(passwordRestrictionInfo));\r\n // cancel on button click\r\n this.$el.find(\".a-btn-cancel\").click(() => this.closeWindow());\r\n }\r\n\r\n private changePassword(passwordRestrictionInfo: Api.Models.PasswordRestrictionInfo) {\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 if (passwordRestrictionInfo.requireComplexPassword && !password1) {\r\n this.raiseError(\"InsufficientComplexity\");\r\n return;\r\n }\r\n\r\n this.formModel.set({ loading: true });\r\n 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 private raiseError(message: string) {\r\n var translatedMessage = this.getErrorMessage(message);\r\n switch (message) {\r\n case \"WrongPasswordOrUserName\":\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 UIHelper.DialogBoxes.alert(translatedMessage);\r\n break;\r\n }\r\n }\r\n\r\n private successfullyChangedPassword() {\r\n this.closeWindow();\r\n\r\n UIHelper.DialogBoxes.alert(Strings.ChangePassword_Message_PasswordChangedSuccessfully);\r\n }\r\n\r\n private getErrorMessage(plainMessage: string) {\r\n var translatedMessage = Strings[\"PasswordError_\" + plainMessage];\r\n if (!translatedMessage) {\r\n return plainMessage;\r\n }\r\n return translatedMessage;\r\n }\r\n\r\n private closeWindow() {\r\n this.$el.closest(\".a-app-window\").data(\"kendoWindow\").close();\r\n }\r\n\r\n static startChangePasswordWindow() {\r\n new FrameManager.AppHolder(ChangePasswordApp).startInWindow({\r\n width: \"640px\",\r\n height: \"355px\",\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 }\r\n}","namespace 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, el) => {\r\n var licenseFile = \"Licenses/\" + $(el).attr(\"data-license\") + \".html\";\r\n $.ajax({\r\n url: licenseFile,\r\n success: licence => {\r\n $(el).kendoTooltip({\r\n position: \"left\",\r\n content: `
${licence}
`,\r\n show: evt => AppKitchen.UIHelper.hideTooltips(evt.sender)\r\n });\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Apps {\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 AppKitchen.Data.Api.getPasswordChangeInformation(passwordChangeInfo => {\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 passwordChangeInfo: passwordChangeInfo.showPasswordChangeNotification,\r\n remainingDays: passwordChangeInfo.daysBeforeExpiring\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(() => ChangePasswordApp.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(() => UserInfoApp.startUserInformationWindow());\r\n } else {\r\n this.$el.find(\".a-user-btn-profile\").remove();\r\n }\r\n \r\n });\r\n\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}","\r\nnamespace 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: Backbone.View;\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}","namespace 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 showPasswordComplexity?: PasswordStrengthOptions;\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 showPasswordComplexity: undefined,\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.Month:\r\n return kendo.culture().calendar.patterns.y;\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.Month:\r\n case FieldType.Date:\r\n case FieldType.DateTime:\r\n case FieldType.Time:\r\n let d = new Date(value);\r\n displayValue = Object.prototype.toString.call(d) === '[object Date]'\r\n ? kendo.toString(d, this.get().format)\r\n : value;\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;\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;\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) => {\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) => {\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().toString();\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 (this.model.get().password && this.model.get().showPasswordComplexity !== undefined) {\r\n this.$el.find(inputSelector).password(this.model.get().showPasswordComplexity);\r\n }\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({\r\n ...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({\r\n ...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({\r\n ...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({\r\n ...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({\r\n ...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) => {\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) => {\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({\r\n ...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({\r\n ...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({\r\n ...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({\r\n ...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({\r\n ...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 && \r\n type !== FieldType.Date && \r\n type !== FieldType.Time && \r\n type !== FieldType.DateTime && \r\n 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;\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;\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\nnamespace 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 return this;\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 && 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 return this;\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 this;\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 return this;\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 return this;\r\n }\r\n }\r\n }\r\n }\r\n}","///\r\n\r\nnamespace AppKitchen {\r\n\r\n export module Apps {\r\n import Forms = Controls.Forms;\r\n import UserInfo = Api.Models.UserInfo;\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 this.formView = new AppKitchen.Controls.Forms.TemplatedFormView(this.formModel, this.containers.content, \r\n AppKitchen.Templates.UserInfoForm, { 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 private closeWindow() {\r\n this.$el.closest(\".a-app-window\").data(\"kendoWindow\").close();\r\n }\r\n\r\n public static 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 }\r\n}","namespace AppKitchen {\r\n\r\n export module Controls.Charts {\r\n \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 interface LegendItem {\r\n id: string;\r\n name: string;\r\n color: string;\r\n }\r\n\r\n interface TemplateData {\r\n title: string;\r\n subtitle: string;\r\n legendItems: LegendItem[];\r\n }\r\n\r\n interface ChartData {\r\n category: string;\r\n value: number;\r\n color: 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: Charts.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.CombinedChartApp);\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n const legendItems = this.getLegenItems();\r\n this.renderTemplates(legendItems);\r\n this.setContainers();\r\n\r\n const chartData = this.getChartData();\r\n this.createPieChart(chartData);\r\n this.createStackedColumnChart(legendItems);\r\n\r\n return this;\r\n }\r\n\r\n private createPieChart(chartData: ChartData[]) {\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(chartData);\r\n this.initPieChartLookupTable();\r\n }\r\n\r\n private createStackedColumnChart(legendItems: LegendItem[]) {\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 private renderTemplates(legendItems: LegendItem[]) {\r\n const templateData = this.getTemplateDaten(legendItems);\r\n this.renderTemplate(templateData);\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.$el.find(\".a-combined-chart-container\")[0],\r\n AppKitchen.Templates.CombinedChart);\r\n }\r\n\r\n private getTemplateDaten(legendItems: LegendItem[]): TemplateData {\r\n return { title: this.options.title, subtitle: this.options.subtitle, legendItems: legendItems };\r\n }\r\n\r\n private getLegenItems(): LegendItem[] {\r\n var legendItems: LegendItem[] = [];\r\n var dataStock = this.model.get().data;\r\n\r\n let index = 0;\r\n for (let serie of dataStock.series) {\r\n legendItems.push({ id: `legendItem_${index++}`, name: serie.name, color: serie.color });\r\n }\r\n\r\n return legendItems;\r\n }\r\n\r\n private getChartData(): ChartData[] {\r\n var data: ChartData[] = [];\r\n var dataStock = this.model.get().data;\r\n\r\n for (let serie of dataStock.series) {\r\n var sum = serie.data.reduce((a, b) => a + b, 0);\r\n data.push({ category: serie.name, value: sum, color: serie.color });\r\n }\r\n\r\n return data;\r\n }\r\n\r\n private setContainers() {\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\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\nnamespace 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 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 this;\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 = (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, (c) => {\r\n this.chart = c;\r\n });\r\n //this.chart = container.highcharts();\r\n return this;\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","namespace 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: { visible: 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 return this;\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","namespace 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","///\r\n///\r\n\r\nnamespace AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export interface IHelpAttributes extends AppKitchen.ModelBaseAttributes {\r\n category: string;\r\n show: boolean;\r\n documents?: string[];\r\n }\r\n\r\n export class ContextSensitiveHelpModel extends AppKitchen.ModelBase {\r\n constructor(c?: string) {\r\n super({\r\n category: c || '',\r\n show: false\r\n });\r\n\r\n // -> key code 112 = F1\r\n $(document).on('keydown', e => BrowserHelper.setCustomFunctionsKeyBinding(e, 112, () => this.set({ show: !this.get().show })));\r\n AppKitchen.getRouter().on(\"route\", (r) => this.set({ category: r }));\r\n\r\n this.bind('change:show', this.toggleContextSensitiveHelpSidebar);\r\n }\r\n\r\n private getContent(c: string) {\r\n AppKitchen.Data.Api.getContextSensitiveHelp(c, (res: string[]) => this.set({ documents: this.parseContent(res) }));\r\n }\r\n\r\n private parseContent(res: string[]): string[] {\r\n return res.map(r => DOMPurify.sanitize(marked.parse(r,\r\n {\r\n gfm: true,\r\n headerIds: false,\r\n breaks: false,\r\n smartLists: true,\r\n smartypants: false,\r\n xhtml: true\r\n } as Object)));\r\n }\r\n\r\n private toggleContextSensitiveHelpSidebar() {\r\n $('body').find(\".a-main\").toggleClass(\"display-help\");\r\n if (this.get().show) {\r\n this.getContent(this.get().category);\r\n this.bind('change:category', (r) => this.getContent(r.get().category));\r\n } else {\r\n this.unbind('change:category');\r\n }\r\n }\r\n }\r\n\r\n export class ContextSensitiveHelpView extends AppKitchen.ViewBase {\r\n\r\n slideIndex: number = 0;\r\n slideContainer: JQuery;\r\n dotsContainer: JQuery;\r\n\r\n constructor(model: ContextSensitiveHelpModel, targetContainer: HTMLElement, options?: AppKitchen.ViewBaseOptions) {\r\n super(model, targetContainer, options);\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, AppKitchen.Templates.ContextSensitiveHelp, {});\r\n\r\n this.slideContainer = this.$el.find(\".a-slideshow-container\");\r\n this.dotsContainer = this.$el.find(\".a-slideshow-dots\");\r\n\r\n this.$el.find('.a-close-button').on('click', () => this.model.set({ show: false }));\r\n this.$el.find(\".a-slideshow-footer > .prev\").bind(\"click\", () => this.moveSlides(-1));\r\n this.$el.find(\".a-slideshow-footer > .next\").bind(\"click\", () => this.moveSlides(1));\r\n this.arrowKeysBinding();\r\n\r\n this.model.bind('change:documents', (m) => this.renderContent(m.get().documents));\r\n\r\n return this;\r\n }\r\n\r\n renderContent(docs: string[]) {\r\n\r\n this.reset();\r\n\r\n this.initSlideshowContent(docs);\r\n this.initSlideshowDots();\r\n\r\n AppKitchen.UIHelper.Scrolling.customScroller(this.slideContainer[0]);\r\n\r\n this.showSlides(this.slideIndex);\r\n \r\n }\r\n \r\n initSlideshowContent(slides: string[]) {\r\n\r\n slides.forEach((htmlContent, i) => {\r\n\r\n AppKitchen.UIHelper.appendTemplateTo(this.slideContainer[0],\r\n AppKitchen.Templates.SlideshowContent,\r\n { content: htmlContent }\r\n );\r\n AppKitchen.UIHelper.appendTemplateTo(this.dotsContainer[0],\r\n AppKitchen.Templates.SlideshowDot,\r\n { index: i }\r\n );\r\n });\r\n }\r\n\r\n initSlideshowDots() {\r\n this.dotsContainer.find(\".dot\").each((index, el) => {\r\n $(el).bind('click', () => this.selectSlide(index));\r\n });\r\n }\r\n\r\n arrowKeysBinding() {\r\n $(document).keydown((e) => {\r\n if (e.keyCode === 37) {\r\n this.moveSlides(-1);\r\n return false;\r\n }\r\n if (e.keyCode === 39) {\r\n this.moveSlides(1);\r\n return false;\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n moveSlides(n: number) {\r\n this.showSlides(this.slideIndex += n);\r\n }\r\n\r\n selectSlide(n: number) {\r\n this.showSlides(this.slideIndex = n);\r\n }\r\n\r\n showSlides(n: number) {\r\n var slides = this.slideContainer.find(\".a-slides\");\r\n var dots = this.dotsContainer.find(\".dot\");\r\n \r\n if (slides?.length === 0) {\r\n return;\r\n }\r\n\r\n if (n > slides.length - 1) {\r\n this.slideIndex = 0;\r\n }\r\n if (n < 0) {\r\n this.slideIndex = slides.length - 1;\r\n }\r\n\r\n for (let i = 0; i < slides.length; i++) {\r\n slides[i].style.display = \"none\";\r\n dots[i].classList.remove(\"active\");\r\n }\r\n\r\n slides[this.slideIndex].style.display = \"block\";\r\n dots[this.slideIndex]?.classList.add(\"active\");\r\n\r\n this.resetScrollbar();\r\n\r\n }\r\n\r\n reset() {\r\n this.slideContainer.empty();\r\n this.dotsContainer.empty();\r\n this.slideIndex = 0;\r\n }\r\n\r\n resetScrollbar() {\r\n $(\".nano\").nanoScroller({ scroll: 'top' });\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n }\r\n }\r\n }\r\n}","namespace 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 return this;\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}","namespace 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 export enum Quarter {\r\n Q1,\r\n Q2,\r\n Q3,\r\n Q4,\r\n }\r\n\r\n export class QuarterHelper {\r\n public static getQuarterFromDate(date: Date): Quarter {\r\n if (!date) return null;\r\n const month = date.getMonth();\r\n if (month < 3) {\r\n return Quarter.Q1;\r\n } else if (month < 6) {\r\n return Quarter.Q2;\r\n } else if (month < 9) {\r\n return Quarter.Q3;\r\n }\r\n return Quarter.Q4;\r\n }\r\n\r\n public static getMonthFromQuarter(quarter: Quarter): number {\r\n switch (quarter) {\r\n case Quarter.Q1:\r\n return 0;\r\n case Quarter.Q2:\r\n return 3;\r\n case Quarter.Q3:\r\n return 6;\r\n case Quarter.Q4:\r\n default:\r\n return 9;\r\n }\r\n }\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface DateRangeAttributes extends ModelBaseAttributes {\r\n startDate?: Date;\r\n startQuarter?: Quarter;\r\n endDate?: Date;\r\n startFilter?: string;\r\n endFilter?: string;\r\n }\r\n\r\n export class DateRangeModel extends 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 = 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.hasOwnProperty(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 BrowserHelper.UrlQuery.setParameter(this.routingParameters[property],\r\n this.getPropertyRoute(property),\r\n { 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\" },\r\n { 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 () => {\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 () => {\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 () => {\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 Year,\r\n Quarter,\r\n Month,\r\n Date,\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface DateRangePickerOptions extends 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?: {\r\n from?: string | { label: string, filter: string }[];\r\n to?: string | { label: string, filter: string }[];\r\n };\r\n }\r\n\r\n export class DateRangePickerView extends ViewBase {\r\n options: DateRangePickerOptions;\r\n formView: Forms.TemplatedFormView;\r\n private formModel: Forms.FormModel;\r\n private previewQuarter: Quarter;\r\n\r\n constructor(model: DateRangePickerModel, targetContainer: HTMLElement, options?: DateRangePickerOptions) {\r\n super(model,\r\n targetContainer,\r\n OptionsHelper.merge(options,\r\n {\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: Strings.TimeSpanPanel_From, to: Strings.TimeSpanPanel_To }\r\n },\r\n true));\r\n\r\n //this.setTemplate(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 if (this.options.pickerFormat === DateRangePickerFormat.Quarter) {\r\n this.formView.model.disableField(\"startQuarterDate\");\r\n }\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 if (this.options.pickerFormat === DateRangePickerFormat.Quarter) {\r\n this.formView.model.enableField(\"startQuarterDate\");\r\n }\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\",\r\n pickerFormat,\r\n \"\",\r\n {\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\r\n ? this.options.maxDate.valueOf()\r\n : undefined\r\n }),\r\n new Forms.FieldModel(\"endDate\",\r\n pickerFormat,\r\n \"\",\r\n {\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 (this.options.pickerFormat === DateRangePickerFormat.Quarter) {\r\n pickerFields.push(new Forms.FieldModel(\"startQuarterDate\",\r\n Forms.FieldType.Text,\r\n \"\",\r\n {\r\n pool: {\r\n values: [\r\n { value: Quarter.Q1, text: Strings[`DateRangePicker_Quarter_${Quarter.Q1}`] },\r\n { value: Quarter.Q2, text: Strings[`DateRangePicker_Quarter_${Quarter.Q2}`] },\r\n { value: Quarter.Q3, text: Strings[`DateRangePicker_Quarter_${Quarter.Q3}`] },\r\n { value: Quarter.Q4, text: Strings[`DateRangePicker_Quarter_${Quarter.Q4}`] }\r\n ],\r\n valueField: \"value\",\r\n textField: \"text\",\r\n restrict: true\r\n }\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\",\r\n Forms.FieldType.Text,\r\n \"\",\r\n {\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\",\r\n Forms.FieldType.Text,\r\n \"\",\r\n {\r\n pool: { values: toLabels, restrict: true, textField: \"label\", valueField: \"filter\" }\r\n }));\r\n }\r\n\r\n this.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 = this.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 &&\r\n 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\r\n ? startDate.addDays(this.options.maxRange).valueOf()\r\n : endDateField.get().max,\r\n value: endDate\r\n });\r\n }\r\n });\r\n\r\n this.formModel.setFieldsData({\r\n startQuarterDate: QuarterHelper.getQuarterFromDate(this.model.get().startDate),\r\n startDate: this.model.get().startDate,\r\n endDate: this.model.get().endDate\r\n });\r\n\r\n var formTemplate = UIHelper.renderTemplate(Templates.DateRangePicker,\r\n {\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 showQuarter: this.options.pickerFormat === DateRangePickerFormat.Quarter\r\n });\r\n\r\n // ReSharper disable once WrongExpressionStatement\r\n this.formView = new Forms.TemplatedFormView(this.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 this.setTwoWayBindings();\r\n\r\n if (Array.isArray(this.options.labels.from)) {\r\n this.formModel.fieldDict[\"startDateLabel\"].bind(\"change:value\",\r\n field => this.model.set({ startFilter: field.get().value }));\r\n this.model.bind(\"change:startFilter\",\r\n model => this.formModel.setValue(\"startDateLabel\", model.get().startFilter));\r\n }\r\n if (Array.isArray(this.options.labels.to)) {\r\n this.formModel.fieldDict[\"endDateLabel\"].bind(\"change:value\",\r\n field => this.model.set({ endFilter: field.get().value }));\r\n this.model.bind(\"change:endFilter\",\r\n model => this.formModel.setValue(\"endDateLabel\", model.get().endFilter));\r\n }\r\n }\r\n\r\n private setTwoWayBindings() {\r\n if (this.options.pickerFormat === DateRangePickerFormat.Quarter) {\r\n this.formModel.onValueChange(\"startQuarterDate\",\r\n (value: string) => this.startQuarterDateFieldChanged(parseInt(value)));\r\n this.model.bind(\"change:startQuarterDate\",\r\n model => this.formModel.setValue(\"startQuarterDate\",\r\n QuarterHelper.getQuarterFromDate(model.get().startDate)));\r\n }\r\n this.formModel.fieldDict[\"startDate\"].bind(\"change:value\",\r\n field => this.startDateFieldChanged(field.get().value));\r\n this.formModel.fieldDict[\"endDate\"].bind(\"change:value\",\r\n field => this.model.set({ endDate: field.get().value }));\r\n this.model.bind(\"change:startDate\", model => this.startDateModelChanged(model.get().startDate));\r\n this.model.bind(\"change:endDate\", model => this.endDateModelChanged(model.get().endDate));\r\n }\r\n\r\n private endDateModelChanged(date: Date) {\r\n this.formModel.setValue(\"endDate\", date);\r\n }\r\n\r\n private startDateModelChanged(date: Date) {\r\n if (this.formModel.getValue(\"startDate\") === date) {\r\n return;\r\n }\r\n if (this.options.pickerFormat === DateRangePickerFormat.Quarter) {\r\n const quarter = QuarterHelper.getQuarterFromDate(date);\r\n this.formModel.setValue(\"startQuarterDate\", quarter);\r\n }\r\n this.formModel.setValue(\"startDate\", date);\r\n }\r\n\r\n private startQuarterDateFieldChanged(quarter: Quarter) {\r\n if (this.previewQuarter === quarter) {\r\n return;\r\n }\r\n this.previewQuarter = quarter;\r\n let date = new Date(this.model.get().startDate.getTime());\r\n let month = QuarterHelper.getMonthFromQuarter(quarter);\r\n date.setMonth(month);\r\n this.formModel.setValue(\"startDate\", date);\r\n }\r\n\r\n private startDateFieldChanged(date: Date) {\r\n if (this.model.get().startDate === date) {\r\n return;\r\n }\r\n if (this.options.pickerFormat === DateRangePickerFormat.Quarter) {\r\n const quarter = QuarterHelper.getQuarterFromDate(date);\r\n this.formModel.setValue(\"startQuarterDate\", quarter);\r\n }\r\n this.model.set({ startDate: date });\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 ||\r\n (this.model.get().endDate &&\r\n 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() -\r\n today.valueOf() -\r\n (dateFrom.getTimezoneOffset() - today.getTimezoneOffset()) * 60000) /\r\n 86400000);\r\n this.$el.find(\".a-tspanel-daychooser[data-numberofdays=\" + numberOfDays + \"]\")\r\n .addClass(\"selected\");\r\n }\r\n }\r\n }\r\n\r\n private getFieldType(dateRangePickerFormat: DateRangePickerFormat) {\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 case DateRangePickerFormat.Quarter:\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}","namespace 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 (this: HTMLImageElement) {\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 return this;\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) => {\r\n $(e).width($(e).height());\r\n });\r\n }\r\n\r\n }\r\n }\r\n}","namespace 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?: AppKitchen.Api.Models.EventItemInfo): 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: AppKitchen.Data.GridConfig, eventItems: AppKitchen.Data.FieldToEventItemInfoDictionary, getFieldLabel: (inventoryId: string, itemId: string, metadata?: string, eventItem?: AppKitchen.Api.Models.EventItemInfo) => 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: FieldOptions): 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: FieldOptions): 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: FieldOptions): 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 private subscriptions: {\r\n data: Rx.IDisposable;\r\n loading: Rx.IDisposable;\r\n }\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 var formfields = EventFormHelper.generateFormFields(dataLoader.getConfig(), 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 this.subscriptions = {\r\n loading: this.dataLoader.onChangeLoading().subscribe(event => this.set({ loading: event.data })),\r\n data: this.dataLoader.onChangeData().subscribe(event => {\r\n this.setFieldsData(event.data[this.options.dataIndex]);\r\n this.setBinaryUrls(event.data[this.options.dataIndex]);\r\n this.triggerDataLoaded(event.previous);\r\n })\r\n };\r\n this.set({ loading: dataLoader.getLoading() });\r\n\r\n const data = this.dataLoader.getData();\r\n if (data && data.length > 0) {\r\n this.setFieldsData(data[this.options.dataIndex]);\r\n this.setBinaryUrls(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.dataLoader.onChangeData().subscribe(event => {\r\n callback(event.data ? event.data[this.options.dataIndex] : undefined,\r\n event.previous ? event.previous[this.options.dataIndex] : undefined);\r\n\r\n });\r\n\r\n const data = this.dataLoader.getData();\r\n if (data && data.length > 0) {\r\n callback(data, data);\r\n }\r\n }\r\n\r\n triggerDataLoaded(oldData?: any) {\r\n this.trigger(\"dataLoaded\", this.dataLoader, oldData || this.dataLoader.getData());\r\n }\r\n\r\n restoreData() {\r\n this.dataLoader.setData(this.dataLoader.getData(), this);\r\n }\r\n\r\n dispose(): void {\r\n if (!this.subscriptions) return;\r\n for (let key in this.subscriptions) {\r\n if (this.subscriptions.hasOwnProperty(key)) {\r\n this.subscriptions[key].dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Grids {\r\n import Ui = kendo.ui;\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 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 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?: \"row\" | \"multiple\",\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 dataBound?: (e: Ui.GridDataBoundEvent) => void;\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 dataBound: 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 protected 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 protected 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\r\n ? GridView.convertToKendoGridToolbarItems(this.options.toolbar)\r\n : undefined,\r\n columns: this.getColumns(),\r\n noRecords: true,\r\n messages: {\r\n noRecords: this.options.noRecordsMessage\r\n },\r\n dataBound: this.options.dataBound !== undefined\r\n ? (e) => { this.options.dataBound(e); this.dataBound(e) }\r\n : (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 // 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(() => this.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 */\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","namespace AppKitchen {\r\n\r\n export module Controls.Grids {\r\n\r\n export type GridDefiniton = {\r\n columns: kendo.ui.GridColumn[],\r\n schema: kendo.data.DataSourceSchemaModelField[],\r\n };\r\n\r\n export type GetColumnHeader =(inventoryId: string, itemId: string, eventItem: Api.Models.EventItemInfo) => string;\r\n\r\n export class EventGridHelper {\r\n // ReSharper disable once InconsistentNaming\r\n private static EventItemTypeConverter = {\r\n String: ColumnType.Text,\r\n Memo: ColumnType.Text,\r\n TextPool: ColumnType.Text,\r\n Date: ColumnType.Date,\r\n DateTimeOffset: ColumnType.Date,\r\n Boolean: ColumnType.Boolean,\r\n Descriptor: ColumnType.Text,\r\n Binary: ColumnType.Text,\r\n Number: ColumnType.Number,\r\n Int32: ColumnType.Number,\r\n Int64: ColumnType.Number,\r\n Decimal: 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 static getColumnHeader(inventoryId: string, itemId: string, eventItem: Api.Models.EventItemInfo): string {\r\n if (eventItem) {\r\n return eventItem.Name;\r\n }\r\n return itemId;\r\n }\r\n\r\n static isColumnEditable(inventoryId: string, itemId: string) {\r\n return true;\r\n }\r\n\r\n private static validateKey(key: string): string {\r\n if (!StringHelper.isValidIdentifier(key)) {\r\n const message =\r\n `'${key}' is an invalid string for grid column keys. Only valid JavaScript identifiers allowed.`;\r\n AppKitchen.logError(message);\r\n throw message;\r\n }\r\n return key;\r\n }\r\n\r\n private static getDefaultFieldOptions(type: ColumnType, customOptions: Forms.FieldOptions):\r\n Forms.FieldOptions {\r\n var fieldType: Forms.FieldType;\r\n switch (type) {\r\n case ColumnType.Date:\r\n fieldType = Forms.FieldType.Date;\r\n break;\r\n case ColumnType.Boolean:\r\n fieldType = Forms.FieldType.Checkbox;\r\n break;\r\n case ColumnType.DateTime:\r\n fieldType = Forms.FieldType.DateTime;\r\n break;\r\n case ColumnType.Text:\r\n fieldType = Forms.FieldType.Text;\r\n break;\r\n case ColumnType.Number:\r\n fieldType = Forms.FieldType.Number;\r\n break;\r\n case ColumnType.Time:\r\n fieldType = Forms.FieldType.Time;\r\n break;\r\n\r\n default:\r\n fieldType = null;\r\n AppKitchen.logError(`Unable to map column type: '${type}' to field type.`);\r\n }\r\n\r\n return Forms.FieldModel.getDefaultOptions(fieldType, customOptions);\r\n }\r\n\r\n static getColumnsConfig(gridConfig: AppKitchen.Data.GridConfig,\r\n eventItems: AppKitchen.Data.FieldToEventItemInfoDictionary,\r\n getColumnHeader: GetColumnHeader): GridDefiniton {\r\n const gridDefinition: GridDefiniton = {\r\n columns: [],\r\n schema: [],\r\n }\r\n\r\n var columnConfigs = this.getColumnConfigs(gridConfig);\r\n\r\n for (let columnConfig of columnConfigs) {\r\n const columnKey = this.getColumnKey(columnConfig);\r\n const eventItemInfo = this.tryGetEventItemInfo(columnKey, eventItems);\r\n const columnType = this.tryGetColumnType(columnConfig, eventItemInfo);\r\n const columnOptions = this.getColumnOptions(columnConfig, columnType);\r\n const fieldOptions = this.getFieldOptions(columnConfig, columnType);\r\n\r\n if (!fieldOptions.hidden) {\r\n gridDefinition.columns.push(this.createColumnDefinition(columnKey,\r\n columnConfig,\r\n columnOptions,\r\n columnType,\r\n eventItemInfo,\r\n fieldOptions,\r\n getColumnHeader));\r\n gridDefinition.schema.push(this.createSchemaDefinition(columnKey, columnType, fieldOptions));\r\n }\r\n }\r\n\r\n return gridDefinition;\r\n }\r\n\r\n private static getColumnConfigs(gridConfig: AppKitchen.Data.GridConfig): AppKitchen.Data.ColumnConfig[] {\r\n return gridConfig.EventItemSpecs.sort((col1, col2) => compareSortNr(col1.SortNr, col2.SortNr));\r\n }\r\n\r\n private static getColumnKey(columnConfig: AppKitchen.Data.ColumnConfig) {\r\n let columnKey = columnConfig.InventoryId\r\n ? (this.validateKey(columnConfig.InventoryId) + \"_\" + this.validateKey(columnConfig.ItemId))\r\n : this.validateKey(columnConfig.ItemId);\r\n if (columnConfig.Metadata) {\r\n columnKey += \"_\" + this.validateKey(columnConfig.Metadata);\r\n }\r\n return columnKey;\r\n }\r\n\r\n private static tryGetEventItemInfo(columnKey: string,\r\n eventItems: AppKitchen.Data.FieldToEventItemInfoDictionary): Api.Models.EventItemInfo {\r\n const eventItemInfo = eventItems[columnKey];\r\n if (!eventItemInfo) {\r\n AppKitchen.logError(`No event item found for colum: '${columnKey}'.`);\r\n }\r\n return eventItemInfo;\r\n }\r\n\r\n private static tryGetColumnType(columnConfig: AppKitchen.Data.ColumnConfig,\r\n eventItemInfo: Api.Models.EventItemInfo): ColumnType {\r\n var columnType: ColumnType;\r\n if (eventItemInfo) {\r\n columnType = this.getColumnType(eventItemInfo);\r\n } else {\r\n columnType = EventGridHelper.EventItemTypeConverter[columnConfig.Type];\r\n }\r\n if (columnType === undefined) {\r\n const message =\r\n `Unsupported column type in column config: '${columnConfig.Type}' and in event item info: '${\r\n eventItemInfo.Type}' for field: '${eventItemInfo.InventoryId}.${eventItemInfo.Id}'.`;\r\n AppKitchen.logError(message);\r\n columnType = ColumnType.Text;\r\n }\r\n //else {\r\n // const message = `Supported column type in column config: '${columnConfig.Type}' and in event item info: '${\r\n // eventItemInfo.Type}' for field: '${eventItemInfo.InventoryId}.${eventItemInfo.Id}' match to: '${ColumnType[columnType]}'.`;\r\n // AppKitchen.logInfo(message);\r\n //}\r\n return columnType;\r\n }\r\n\r\n private static getColumnOptions(columnConfig: AppKitchen.Data.ColumnConfig, columnType: ColumnType): Grids.\r\n GridColumnOptions {\r\n return OptionsHelper.merge(columnConfig.GridOptions,\r\n {\r\n multiFilter: [ColumnType.Text, ColumnType.Date, ColumnType.Boolean].indexOf(columnType) > -1\r\n ? { search: false }\r\n : null,\r\n align: columnType === ColumnType.Number ? \"right\" : \"left\",\r\n multiline: false\r\n });\r\n }\r\n\r\n private static getFieldOptions(columnConfig: AppKitchen.Data.ColumnConfig, columnType: ColumnType): Forms.FieldOptions {\r\n return OptionsHelper.merge(columnConfig.FieldOptions,\r\n this.getDefaultFieldOptions(columnType, columnConfig.FieldOptions));\r\n }\r\n\r\n private static createColumnDefinition(columnKey: string,\r\n columnConfig: AppKitchen.Data.ColumnConfig,\r\n columnOptions: Grids.GridColumnOptions,\r\n columnType: ColumnType,\r\n eventItemInfo: Api.Models.EventItemInfo,\r\n fieldOptions: Forms.FieldOptions,\r\n getColumnHeader: GetColumnHeader): kendo.ui.GridColumn {\r\n const column: kendo.ui.GridColumn = {\r\n field: columnKey,\r\n title: getColumnHeader(columnConfig.InventoryId, columnConfig.ItemId, eventItemInfo),\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\r\n ? \"text-align: \" + columnOptions.align + \";\"\r\n : \"\") +\r\n (columnOptions.multiline ? \"white-space: normal;\" : \"\")\r\n },\r\n template: GridHelper.gridColumnTemplate(columnType, columnKey, columnOptions)\r\n };\r\n\r\n if (this.isPoolItem(eventItemInfo)) {\r\n var textPool = eventItemInfo.TextPool;\r\n if (textPool && textPool.length > 0) {\r\n fieldOptions.pool = {\r\n multi: eventItemInfo.Type === \"MultiDescriptor\" ||\r\n eventItemInfo.TypeSpecification.MultiSelect,\r\n restrict: true,\r\n values: eventItemInfo.TextPool,\r\n valueField: \"Id\",\r\n textField: eventItemInfo.TypeSpecification.UseId ? \"Id\" : \"Text\"\r\n }\r\n\r\n if (eventItemInfo.Type !== \"MultiDescriptor\" && !eventItemInfo.TypeSpecification.MultiSelect) {\r\n column.values = [];\r\n for (let textPoolItems of textPool) {\r\n column.values.push({\r\n text: eventItemInfo.TypeSpecification.UseId ? textPoolItems.Id : textPoolItems.Text,\r\n value: textPoolItems.Id\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (fieldOptions.pool) {\r\n if (fieldOptions.pool.multi) {\r\n column.editor =\r\n (container, options) => FieldOptionsBindings.getMultiSelectEditor(container,\r\n options,\r\n fieldOptions);\r\n } else {\r\n column.editor =\r\n (container, options) => FieldOptionsBindings.getDropDownEditor(container,\r\n options,\r\n fieldOptions);\r\n }\r\n }\r\n\r\n if (fieldOptions.suggest) {\r\n column.editor =\r\n (container, options) => FieldOptionsBindings.getAutoCompleteEditor(container,\r\n options,\r\n fieldOptions);\r\n }\r\n\r\n if (columnType === ColumnType.Date) {\r\n column.editor =\r\n (container, options) => FieldOptionsBindings.getDateEditor(container, options, fieldOptions);\r\n fieldOptions.default = fieldOptions.default || new Date().onlyDate();\r\n }\r\n\r\n if (columnType === ColumnType.DateTime) {\r\n column.editor =\r\n (container, options) =>\r\n FieldOptionsBindings.getDateTimeEditor(container, options, fieldOptions);\r\n }\r\n\r\n if (columnType === ColumnType.Time) {\r\n column.editor =\r\n (container, options) => FieldOptionsBindings.getTimeEditor(container, options, fieldOptions);\r\n if (fieldOptions.textMode) {\r\n column.template =\r\n (dataItem) => ColumnBindings.timeColumnTextModeTemplate(dataItem, fieldOptions, column);\r\n column.sortable = {\r\n compare: (left, right) => ColumnBindings.timeColumnTextModeCompare(left, right, column)\r\n }\r\n }\r\n }\r\n\r\n if (columnType === ColumnType.Number) {\r\n column.editor =\r\n (container, options) => FieldOptionsBindings.getNumericEditor(container, options, fieldOptions);\r\n }\r\n\r\n if (columnType === ColumnType.Boolean) {\r\n column.editor =\r\n (container, options) => FieldOptionsBindings.customBoolEditor(container, options, fieldOptions);\r\n }\r\n\r\n return column;\r\n }\r\n\r\n private static isPoolItem(eventItemInfo: Api.Models.EventItemInfo): boolean {\r\n return eventItemInfo &&\r\n [\"TextPool\", \"Descriptor\", \"MultiDescriptor\", \"User\", \"Group\"].indexOf(eventItemInfo.Type) > -1;\r\n }\r\n\r\n private static createSchemaDefinition(columnKey: string,\r\n columnType: ColumnType,\r\n fieldOptions: Forms.FieldOptions): kendo.data.DataSourceSchemaModelField {\r\n return {\r\n field: columnKey,\r\n type: fieldOptions.textMode ? \"string\" : GridHelper.kendoFieldType[columnType],\r\n validation: {\r\n required: fieldOptions.mandatory\r\n },\r\n editable: !(fieldOptions.readOnly),\r\n defaultValue: fieldOptions.default\r\n }\r\n }\r\n\r\n static getColumnType(eventItem: Api.Models.EventItemInfo): ColumnType {\r\n var type: ColumnType = EventGridHelper.EventItemTypeConverter[eventItem.Type];\r\n if (type === ColumnType.Date) {\r\n if (!eventItem.TypeSpecification) {\r\n AppKitchen.logWarning(\r\n `TypeSpecification not specified for type: '${eventItem.Type}' on field: '${eventItem\r\n .InventoryId}.${eventItem.Id}'.`);\r\n return ColumnType.DateTime;\r\n }\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(\r\n \"User defined date format for Events not supported! Using DateTime instead!\");\r\n return ColumnType.DateTime;\r\n default:\r\n const message = `Date format: '${eventItem.TypeSpecification.DateFormat}' not supported.`;\r\n AppKitchen.logWarning(message);\r\n throw message;\r\n }\r\n }\r\n\r\n return type;\r\n }\r\n }\r\n\r\n class FieldOptionsBindings {\r\n static getDropDownEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\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 static getMultiSelectEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\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 static getAutoCompleteEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\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 static getDateEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\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 static getDateTimeEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\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 static getTimeEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\r\n if (fieldOptions.textMode && fieldOptions.allow24) {\r\n var picker = $('').appendTo(container)\r\n .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 static getNumericEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\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 step: 1\r\n });\r\n }\r\n\r\n static customBoolEditor(container: JQuery,\r\n options: kendo.ui.GridColumnEditorOptions,\r\n fieldOptions: Forms.FieldOptions) {\r\n $('')\r\n .appendTo(container)\r\n .kendoDropDownList({\r\n dataSource: [{ value: true, text: Strings.Yes }, { value: false, text: Strings.No }],\r\n dataTextField: \"text\",\r\n dataValueField: \"value\"\r\n });\r\n }\r\n }\r\n\r\n class ColumnBindings {\r\n private static h24 = new Date(kendo.parseDate(\"23:00\", \"HH:mm\").valueOf() + 3600000);\r\n\r\n static timeColumnTextModeTemplate(dataItem: kendo.data.Model,\r\n fieldOptions: Forms.FieldOptions,\r\n column: kendo.ui.GridColumn): string {\r\n var value = dataItem[column.field];\r\n if (value) {\r\n if (fieldOptions.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 static timeColumnTextModeCompare(left: kendo.data.Model,\r\n right: kendo.data.Model,\r\n column: kendo.ui.GridColumn): number {\r\n var time1 = kendo.parseDate(left[column.field], \"HH:mm\") || new Date(0);\r\n var time2 = kendo.parseDate(right[column.field], \"HH:mm\") || new Date(0);\r\n\r\n if (left[column.field] === \"24:00\") {\r\n time1 = this.h24;\r\n }\r\n\r\n if (right[column.field] === \"24:00\") {\r\n time2 = this.h24;\r\n }\r\n\r\n return time1.valueOf() - time2.valueOf();\r\n }\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Controls.Grids {\r\n\r\n export interface EventGridOptions {\r\n getColumnHeader?: GetColumnHeader;\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 private subscriptions: {\r\n data: Rx.IDisposable;\r\n loading: Rx.IDisposable;\r\n }\r\n\r\n constructor(dataLoader: AppKitchen.Data.EventDataLoader, options?: EventGridOptions) {\r\n options = OptionsHelper.merge(options,\r\n {\r\n getColumnHeader: EventGridHelper.getColumnHeader\r\n });\r\n\r\n var columnsConfig = EventGridHelper.getColumnsConfig(dataLoader.getConfig(),\r\n dataLoader.getItemsDict(),\r\n options.getColumnHeader);\r\n\r\n super(columnsConfig.columns, columnsConfig.schema, options);\r\n\r\n this.dataLoader = dataLoader;\r\n\r\n this.subscriptions = {\r\n data: this.dataLoader.onChangeData().subscribe(event => this.setGridData(event.data)),\r\n loading: this.dataLoader.onChangeLoading().subscribe(event => this.set({ loading: event.data }))\r\n };\r\n\r\n if (this.dataLoader.getData()) {\r\n this.setGridData(this.dataLoader.getData());\r\n }\r\n this.set({ loading: this.dataLoader.getLoading() });\r\n }\r\n\r\n getTextPool(field: string, data: AppKitchen.Data.DataEntries[]): { value: string, text: string }[] {\r\n const textPool: { value: string, text: string, sortNr: number }[] = [];\r\n\r\n const columnConfig = this.dataLoader.getConfig().EventItemSpecs.AsLinq()\r\n .FirstOrDefault(g => `${g.InventoryId}_${g.ItemId}` === field);\r\n if (columnConfig && columnConfig.RestrictFilterSelection) {\r\n const distinctData = data.AsLinq().Select(d => d[field]).Distinct()\r\n .ToArray();\r\n\r\n const textPoolItemDic = this.dataLoader.getTextPoolItemDict(field);\r\n for (let d of distinctData) {\r\n const item = textPoolItemDic[d];\r\n textPool.push({ value: d, text: item.Label, sortNr: item.SortNr });\r\n }\r\n }\r\n textPool.sort(this.sortTextPoolItems);\r\n return textPool;\r\n }\r\n\r\n private sortTextPoolItems(a, b) {\r\n if (a.text > b.text) {\r\n return 1;\r\n }\r\n\r\n if (a.text < b.text) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n dispose(): void {\r\n let subscriptions = this.subscriptions;\r\n if (!subscriptions) return;\r\n for (let key in subscriptions) {\r\n if (subscriptions.hasOwnProperty(key)) {\r\n if (subscriptions[key]) {\r\n subscriptions[key].dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Controls.Grids {\r\n export class EventGridView extends GridView {\r\n model: EventGridModel;\r\n\r\n protected setGridData(data: any[]) {\r\n if (this.grid) {\r\n const gridConfig = this.model.dataLoader.getConfig();\r\n for (let column of this.grid.columns) {\r\n const columnConfig = gridConfig.EventItemSpecs.AsLinq()\r\n .FirstOrDefault(g => `${g.InventoryId}_${g.ItemId}` === column.field);\r\n if (columnConfig && columnConfig.RestrictFilterSelection) {\r\n let dataSource = this.model.getTextPool(column.field, data);\r\n (column.filterable).dataSource = dataSource;\r\n (column.filterable).itemTemplate = () => {\r\n return `
    • `;\r\n }\r\n }\r\n }\r\n }\r\n super.setGridData(data);\r\n }\r\n }\r\n }\r\n}","/// \r\nnamespace 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 Forms.FieldModel(\"JobLogFilter\", 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 Forms.TextFieldView(fieldModel, { editable: true });\r\n this.$el.find(\".a-picker-container\").append(fieldView.render().el);\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}","namespace 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?: Api.Models.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 defaultDecimalPlaces?: number;\r\n numberFormat?: string;\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,\r\n {\r\n editable: true,\r\n defaultDecimalPlaces: 2\r\n });\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 return this;\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: Api.Models.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 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(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(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(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: Api.Models.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: Api.Models.ChartData[], style: any, getField: (chartData: Api.Models.ChartData) => string) => {\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: Api.Models.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 = this.getFormatDateForTimeResolution(tsData[0], 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 private getFormatDateForTimeResolution(ticks: number, timeResolution: Mesap.Framework.Common.TimeResolution): string {\r\n const formatStr = this.getDateFormat(timeResolution);\r\n return moment(new Date(ticks)).format(formatStr);\r\n }\r\n\r\n private 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\r\n getColumnConfig(data: Api.Models.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: Api.Models.ChartData[]) {\r\n return data.AsLinq()\r\n .Select(d => {\r\n if (this.options.numberFormat && this.options.numberFormat.length>0) {\r\n return this.options.numberFormat;\r\n }\r\n\r\n var places = d.decimalsPlaces != null ? d.decimalsPlaces : this.options.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}","namespace 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}","namespace 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 return this;\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) => {\r\n $(e).width($(e).height());\r\n });\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}","namespace 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}","namespace 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 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: 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\nnamespace 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\nnamespace 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(interactiveData: AppKitchen.Api.Models.InteractiveData,\r\n dataList: AppKitchen.Api.Models.ChartData[], defaultChartOptions: Highstock.Options): Highstock.Options {\r\n let highchartOptions = AppKitchen.OptionsHelper.merge(interactiveData.chartdefinition, defaultChartOptions, true);\r\n\r\n var series: Highcharts.IndividualSeriesOptions[] = [];\r\n for (let chartseries of interactiveData.chartseries) {\r\n if (chartseries.hasOwnProperty(\"enabled\") && chartseries.enabled === false) {\r\n continue;\r\n }\r\n\r\n var chartData = null;\r\n var seriesLabel = null;\r\n\r\n for (let data of dataList) {\r\n if (data.datasourceId === chartseries.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 (let style of interactiveData.seriesstyles) {\r\n if (chartseries.seriesstyleid === style.id) {\r\n seriesStyles = style.styles;\r\n break;\r\n }\r\n }\r\n\r\n var newSerie = {\r\n name: chartseries.label ? chartseries.label : seriesLabel,\r\n data: chartData\r\n };\r\n\r\n newSerie = $.extend(newSerie || {}, seriesStyles[0]);\r\n\r\n if (chartseries.transformation) {\r\n var procedure = General.convertToFunction(chartseries.transformation.procedure);\r\n\r\n if (procedure) {\r\n var newSeriesList = procedure(newSerie, chartseries.transformation.data);\r\n\r\n let j = 0;\r\n for (let serie of newSeriesList) {\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 j++;\r\n }\r\n } else {\r\n GeneralLogger.logError(\"Failed to convert procedure: '\" +\r\n chartseries.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 (interactiveData.seriestransformation) {\r\n var seriesProcedure = General.convertToFunction(interactiveData.seriestransformation.procedure);\r\n\r\n if (seriesProcedure) {\r\n series = seriesProcedure(series, interactiveData.seriestransformation.data);\r\n } else {\r\n GeneralLogger.logError(\"Failed to convert procedure: '\" + interactiveData.seriestransformation.procedure + \"'\");\r\n }\r\n }\r\n\r\n highchartOptions.series = series;\r\n\r\n if (interactiveData.chartdefinition.timeGrouping) {\r\n for (let serie of highchartOptions.series) {\r\n Transformations.ChangeTimestampToGroupingFormat(serie.data, interactiveData.chartdefinition.timeGrouping);\r\n }\r\n }\r\n\r\n return highchartOptions;\r\n }\r\n\r\n }\r\n} \r\n","namespace AppKitchen {\r\n export module Portal {\r\n export module Defaults {\r\n export function interactiveGraphic(): Highstock.Options \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: \"###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\nnamespace 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: Api.Models.InteractiveData;\r\n mInitialChartConfig: Highcharts.Options;\r\n chartContainer: HTMLElement;\r\n currentUpdateSizeTimer: any;\r\n\r\n constructor(interactiveDefinition: Api.Models.InteractiveData, 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 return this;\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(\"StockChart\");\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: Api.Models.InteractiveData) {\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 loadChart(interactiveData: Api.Models.InteractiveData) {\r\n AppKitchen.Data.getDataApi(\"TimeseriesData\", interactiveData, (dataList: AppKitchen.Api.Models.ChartData[]) => {\r\n if (dataList && dataList.length > 0) {\r\n\r\n General.TsChart.fixDataList(dataList, interactiveData);\r\n dataList = General.TsChart.transformDataIfRequired(interactiveData, dataList);\r\n var chartOptions = General.TsChart.preprocessInteractiveDefinition(interactiveData, 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 this.updateSize();\r\n }\r\n });\r\n }\r\n\r\n getDefaults(): Highstock.Options {\r\n return Defaults.interactiveGraphic();\r\n }\r\n }\r\n }\r\n}","///\r\n\r\nnamespace 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 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 return this;\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(): Highcharts.Options {\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(): Highcharts.Options {\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","namespace 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: Controls.Tile.StatusTileModel;\r\n private tileView: 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 this;\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 return this;\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: 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 Controls.DateRangePickerModel();\r\n // ReSharper disable once UnusedLocals\r\n var datePickerView = new 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: Controls.Grids.JobLogGridModel;\r\n jobLogGridView: Controls.Grids.GridView;\r\n taskLogGridModel: 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 Controls.Grids.JobLogGridModel(this.jobLogLoader);\r\n this.jobLogGridView = new 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 Controls.Grids.TaskLogGridModel(this.taskLogLoader);\r\n // ReSharper disable once UnusedLocals\r\n var taskLogGridView = new 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","namespace 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: any = layoutGridItemRoot.content; //TODO: refactor this\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 return this;\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 Wrappers.MaximizeWrapper(item.el, {\r\n renderContent: container => this.renderContent(container, item),\r\n maximized: (app: AppKitchen.Apps.ConfigFileStarterApp) => this.onChangeWindowSize(app),\r\n restored: (app: AppKitchen.Apps.ConfigFileStarterApp) => this.onChangeWindowSize(app),\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 private onChangeWindowSize(app: AppKitchen.Apps.ConfigFileStarterApp) {\r\n app.redraw();\r\n AppKitchen.BrowserHelper.WindowResize.trigger();\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n}","/// \r\nnamespace 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\" | \"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\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 return this;\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' }) });\r\n } else {\r\n layer = new ol.layer.Tile({ source: new ol.source.OSM() });\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: any, 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: [number, number] = [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 : 1000;\r\n\r\n if (duration > 0) {\r\n this.map.getView().animate({ duration: duration, zoom: this.options.zoom });\r\n this.map.getView().animate({ duration: duration, center: this.options.center });\r\n } else {\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 /**\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 var transformedCoordinate = ol.proj.transform(coordinate, 'EPSG:4326', 'EPSG:3857');\r\n\r\n if (animate) {\r\n this.map.getView().animate({\r\n duration: 250,\r\n center: transformedCoordinate,\r\n easing: ol.easing.inAndOut\r\n });\r\n } else {\r\n this.map.getView().setCenter(transformedCoordinate);\r\n }\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.getView().animate({ duration: 250, zoom: zoom, easing: ol.easing.inAndOut });\r\n } else {\r\n this.map.getView().setZoom(zoom);\r\n }\r\n\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.getView().animate({ duration: 700, zoom: zoomOuter, easing: ol.easing.inAndOut });\r\n //this.map.getView().setZoom(zoomOuter);\r\n\r\n var transformedCoordinate = ol.proj.transform(newCenter, 'EPSG:4326', 'EPSG:3857');\r\n\r\n this.map.getView().animate({ center: transformedCoordinate, duration: 1400, easing: ol.easing.inAndOut });\r\n \r\n window.setTimeout(() => {\r\n this.map.getView().animate({ duration: 700, zoom: zoom, easing: ol.easing.inAndOut });\r\n //this.map.getView().setZoom(zoom);\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({\r\n key: this.options.bingMapsKey,\r\n imagerySet: 'Road'\r\n }) }));\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' }) }));\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' }) }));\r\n if (requestedType === \"stamenWatercolorAndLabels\") {\r\n layers.push(new ol.layer.Tile({ source: new ol.source.Stamen({ layer: 'terrain-labels' }) }));\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' }) }));\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() }));\r\n }\r\n\r\n \r\n }\r\n\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export module Menus {\r\n\r\n export interface IMenuItem {\r\n id: string;\r\n label: string;\r\n reference?: any;\r\n description?: string;\r\n }\r\n\r\n export class MenuItem implements IMenuItem {\r\n id: string;\r\n label: string;\r\n description?: string;\r\n reference?: any;\r\n\r\n constructor(public guid: string, menuItem: IMenuItem) {\r\n this.id = menuItem.id;\r\n this.label = menuItem.label;\r\n this.description = menuItem.description;\r\n this.reference = menuItem.reference;\r\n }\r\n }\r\n\r\n export interface VerticalMenuOptions extends AppKitchen.ViewBaseOptions {\r\n routingParameter?: string;\r\n routingHistory?: boolean;\r\n tooltip?: boolean | ((menuItem: IMenuItem) => string);\r\n documentTitleBase?: string;\r\n customScroller?: boolean;\r\n autoSelect?: boolean;\r\n noResultsMessage?: string;\r\n searchBoxEnabled?: boolean;\r\n searchBoxPlaceholder?: string;\r\n actionEnabled?: boolean;\r\n actionIcon?: string;\r\n actionClick?: (e) => void;\r\n }\r\n\r\n export class VerticalMenuEvents {\r\n selectedMenuItem: RxEx.Subject;\r\n menuItems: RxEx.Subject;\r\n visibleMenuItems: RxEx.Subject;\r\n }\r\n\r\n export interface VerticalMenuModelOptions {\r\n sort: boolean;\r\n menuItems: IMenuItem[];\r\n }\r\n\r\n export enum FilterOperator {\r\n And,\r\n Or\r\n }\r\n\r\n export interface VerticalMenuFilterOptions {\r\n operator?: FilterOperator;\r\n caseSensitive?: boolean;\r\n }\r\n\r\n export class VerticalMenuModel extends AppKitchen.ModelBase {\r\n\r\n private selectedMenuItem: MenuItem;\r\n private menuItems: MenuItem[];\r\n private visibleMenuItems: MenuItem[];\r\n\r\n private events: VerticalMenuEvents;\r\n\r\n private menuItemsDict: { [guid: string]: MenuItem };\r\n\r\n constructor(menuItems: IMenuItem[], sort?: boolean) {\r\n super({});\r\n\r\n this.events = {\r\n selectedMenuItem: new RxEx.Subject(),\r\n menuItems: new RxEx.Subject(),\r\n visibleMenuItems: new RxEx.Subject(),\r\n }\r\n\r\n this.menuItems = this.convertToMenuItemsInteral(menuItems, sort);\r\n this.visibleMenuItems = this.menuItems;\r\n this.updateMenuItemsDict();\r\n }\r\n\r\n private convertToMenuItemsInteral(menuItems: IMenuItem[], sort?: boolean): MenuItem[] {\r\n if (sort) {\r\n menuItems.sort((a, b) => a.label.toUpperCase() < b.label.toUpperCase() ? -1 : 1);\r\n }\r\n let menuItemsInteral: MenuItem[] = [];\r\n for (let item of menuItems) {\r\n let guid = AppKitchen.GuidHelper.newGuid();\r\n let itemItern = new MenuItem(guid, item);\r\n menuItemsInteral.push(itemItern);\r\n }\r\n return menuItemsInteral;\r\n }\r\n\r\n protected updateMenuItemsDict(): void {\r\n this.menuItemsDict = {};\r\n if (this.menuItems) {\r\n this.menuItems.forEach(item => {\r\n this.menuItemsDict[item.guid] = item;\r\n });\r\n }\r\n }\r\n\r\n getMenuItems(): MenuItem[] {\r\n return this.menuItems;\r\n }\r\n\r\n setMenuItems(m: IMenuItem[], sort: boolean, sender: any): void {\r\n let menuItems = this.convertToMenuItemsInteral(m, sort);\r\n this.menuItems = menuItems;\r\n this.visibleMenuItems = menuItems;\r\n this.updateMenuItemsDict();\r\n this.events.menuItems.onNext({ sender: sender, data: menuItems });\r\n }\r\n\r\n onMenuItemsChanged(): RxEx.Observable {\r\n return this.events.menuItems.asObservable();\r\n }\r\n\r\n onVisibleMenuItemsChanged(): RxEx.Observable {\r\n return this.events.visibleMenuItems.asObservable();\r\n }\r\n\r\n getVisibleMenuItems(): MenuItem[] {\r\n return this.visibleMenuItems;\r\n }\r\n\r\n setVisibleMenuItems(visibleMenuItems: MenuItem[], sender: any) {\r\n this.visibleMenuItems = visibleMenuItems;\r\n this.events.visibleMenuItems.onNext({ sender: sender, data: visibleMenuItems });\r\n }\r\n\r\n onSelectedMenuItemChanged(): RxEx.Observable {\r\n return this.events.selectedMenuItem.asObservable();\r\n }\r\n\r\n getSelectedMenuItem(): MenuItem {\r\n return this.selectedMenuItem;\r\n }\r\n\r\n setSelectedMenuItem(selectedMenuItem: MenuItem, sender: any) {\r\n this.selectedMenuItem = selectedMenuItem;\r\n this.events.selectedMenuItem.onNext({ sender: sender, data: selectedMenuItem });\r\n }\r\n\r\n tryToSelectMenuItemByGuid(guid: string, sender: any): boolean {\r\n let selectedMenuItem = this.menuItemsDict[guid];\r\n if (selectedMenuItem) {\r\n this.setSelectedMenuItem(selectedMenuItem, sender);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n tryToSelectMenuItemById(id: string, sender: any): boolean {\r\n let selectedMenuItem = this.tryToFindMenuItemById(id);\r\n if (selectedMenuItem) {\r\n this.setSelectedMenuItem(selectedMenuItem, sender);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private tryToFindMenuItemById(id: string): MenuItem {\r\n let menuItemsDict = this.menuItemsDict;\r\n for (let key in menuItemsDict) {\r\n if (menuItemsDict.hasOwnProperty(key)) {\r\n let menuItem = this.menuItemsDict[key];\r\n if (menuItem.id === id) {\r\n return menuItem;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n filter(query: string, options?: VerticalMenuFilterOptions): void {\r\n var filterOptions = AppKitchen.OptionsHelper.merge(options,\r\n {\r\n operator: FilterOperator.And,\r\n caseSensitive: false\r\n });\r\n\r\n var queries = query.split(\" \").AsLinq()\r\n .Where(q => !!q)\r\n .Select(q => filterOptions.caseSensitive ? q : q.toUpperCase())\r\n .ToArray();\r\n\r\n let visibleMenuItems: MenuItem[] = [];\r\n for (let menuItem of this.menuItems) {\r\n let label = filterOptions.caseSensitive ? menuItem.label : menuItem.label.toUpperCase();\r\n let check = filterOptions.operator === FilterOperator.And ? this.andQuery : this.orQuery;\r\n if (check(queries, label)) {\r\n visibleMenuItems.push(menuItem);\r\n }\r\n }\r\n this.setVisibleMenuItems(visibleMenuItems, this);\r\n }\r\n\r\n private andQuery(queries: string[], value: string): boolean {\r\n for (let query of queries) {\r\n if (!VerticalMenuModel.isPartOfIf(value, query)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n private orQuery(queries: string[], value: string): boolean {\r\n let result = false;\r\n for (let query of queries) {\r\n if (!VerticalMenuModel.isPartOfIf(value, query)) {\r\n result = true;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n static isPartOfIf(value: string, part: string) {\r\n return value.indexOf(part) !== -1;\r\n }\r\n }\r\n\r\n export class VerticalMenuView extends AppKitchen.ViewBase {\r\n options: VerticalMenuOptions;\r\n private scroller: HTMLElement;\r\n\r\n private searchBoxModel: Controls.SearchBoxModel;\r\n\r\n private selectedMenuItemSubscription: Rx.IDisposable;\r\n private visibleMenuItemsSubscription: Rx.IDisposable;\r\n private menuItemsSubscription: Rx.IDisposable;\r\n\r\n private containers: {\r\n searchBox: HTMLElement,\r\n verticalMenuContent: HTMLElement,\r\n verticalMenuList: HTMLElement,\r\n }\r\n\r\n private buttons: {\r\n action: JQuery,\r\n }\r\n\r\n private elements: {\r\n menuItems: JQuery,\r\n noResultsMessage: JQuery,\r\n }\r\n\r\n constructor(model: VerticalMenuModel, target: HTMLElement, options?: VerticalMenuOptions) {\r\n super(model, target, AppKitchen.OptionsHelper.merge(options, {\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 searchBoxEnabled: false,\r\n searchBoxPlaceholder: Strings.SearchBox_Search,\r\n actionEnabled: false,\r\n actionIcon: null,\r\n actionClick: null\r\n }));\r\n\r\n this.setTemplate(AppKitchen.Templates.VerticalMenu);\r\n this.render();\r\n this.menuItemsSubscription = this.model.onMenuItemsChanged().subscribe(r => this.render());\r\n }\r\n\r\n render() {\r\n\r\n this.renderTemplate(\r\n {\r\n menuItems: this.model.getVisibleMenuItems(),\r\n actionEnabled: this.options.actionEnabled,\r\n actionIcon: this.options.actionIcon,\r\n searchBoxEnable: this.options.searchBoxEnabled,\r\n noResultsMessage: this.options.noResultsMessage\r\n });\r\n this.setContainers();\r\n this.renderSearchBox();\r\n this.updateScroller();\r\n this.updateTooltips();\r\n this.internalBind();\r\n this.initSelectedMenuItem();\r\n this.addEvents();\r\n\r\n return this;\r\n }\r\n\r\n private setContainers() {\r\n this.containers = {\r\n searchBox: this.$el.find(\".a-vertical-menu-searchbox-container\")[0],\r\n verticalMenuContent: this.$el.find(\".a-vertical-menu-content\")[0],\r\n verticalMenuList: this.$el.find(\".a-vertical-menu-list\")[0],\r\n }\r\n this.buttons = {\r\n action: this.$el.find(\".action-btn\")\r\n }\r\n this.elements = {\r\n noResultsMessage: this.$el.find(\".a-vertical-menu-noresults-message\"),\r\n menuItems: this.$el.find(\".a-vertical-menu-entry:not(.group-item)\")\r\n }\r\n }\r\n\r\n private renderSearchBox() {\r\n this.searchBoxModel = new Controls.SearchBoxModel({ query: \"\" });\r\n // ReSharper disable once WrongExpressionStatement\r\n new Controls.SearchBoxView(this.searchBoxModel,\r\n this.containers.searchBox,\r\n {\r\n placeholder: this.options.searchBoxPlaceholder\r\n });\r\n }\r\n\r\n private addEvents(): void {\r\n this.$el.find(\"li[data-guid]\").click((e) => this.onClick(e));\r\n\r\n this.searchBoxModel.onChange(query => this.model.filter(query));\r\n\r\n if (this.options.actionEnabled) {\r\n this.buttons.action.click((e) => this.options.actionClick(e));\r\n }\r\n $(this.containers.searchBox).keydown((e) => this.onKeyDown(e));\r\n\r\n }\r\n\r\n public onKeyDown(e: JQuery.TriggeredEvent): void {\r\n if (this.isKey(e, \"Enter\")) {\r\n let visibleMenuItems = this.model.getVisibleMenuItems();\r\n if (visibleMenuItems.length === 1) {\r\n this.model.setSelectedMenuItem(visibleMenuItems[0], this);\r\n }\r\n }\r\n }\r\n\r\n private isKey(e: JQuery.TriggeredEvent, key: string): boolean {\r\n return (e.originalEvent).key.toUpperCase() === key.toUpperCase();\r\n }\r\n\r\n private initSelectedMenuItem() {\r\n if (this.options.autoSelect) {\r\n if (!this.trySetSelectedItemFromUrlQuery()) {\r\n var firstItem = this.$el.find(\"li[data-guid]\").first();\r\n if (firstItem && firstItem.length !== 0) {\r\n let dataId = firstItem.attr(\"data-guid\");\r\n if (dataId) {\r\n let guid = dataId.toString();\r\n this.model.tryToSelectMenuItemByGuid(guid, this);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private internalBind() {\r\n if (!this.selectedMenuItemSubscription) {\r\n this.selectedMenuItemSubscription = this.model.onSelectedMenuItemChanged().subscribe(e => {\r\n //if (e.sender === this) return;\r\n this.selectedItemChanged(e.data);\r\n });\r\n }\r\n if (!this.visibleMenuItemsSubscription) {\r\n this.visibleMenuItemsSubscription = this.model.onVisibleMenuItemsChanged().subscribe(e => {\r\n //if (e.sender === this) return;\r\n this.visibleMenuItemsChanged(e.data);\r\n });\r\n }\r\n }\r\n\r\n private internalUnbind() {\r\n if (!this.selectedMenuItemSubscription) {\r\n this.selectedMenuItemSubscription.dispose();\r\n this.selectedMenuItemSubscription = null;\r\n }\r\n if (!this.visibleMenuItemsSubscription) {\r\n this.visibleMenuItemsSubscription.dispose();\r\n this.visibleMenuItemsSubscription = null;\r\n }\r\n if (!this.menuItemsSubscription) {\r\n this.menuItemsSubscription.dispose();\r\n this.menuItemsSubscription = null;\r\n }\r\n }\r\n\r\n dispose() {\r\n this.internalUnbind();\r\n }\r\n\r\n private selectedItemChanged(selectedMenuItem: MenuItem): void {\r\n this.unhighlightSelected();\r\n if (!selectedMenuItem) {\r\n this.clearRoute();\r\n } else {\r\n this.updateRoute(selectedMenuItem.id, true);\r\n this.highlightSelected(selectedMenuItem.guid);\r\n }\r\n }\r\n\r\n private updateScroller(): void {\r\n if (this.options.customScroller) {\r\n this.scroller = AppKitchen.UIHelper.Scrolling.customScroller(this.containers.verticalMenuContent)[0];\r\n } else {\r\n this.scroller = this.containers.verticalMenuContent;\r\n }\r\n }\r\n\r\n private updateTooltips(): void {\r\n if (this.options.tooltip) {\r\n let menuItems = this.model.getMenuItems();\r\n this.$el.find(\"li\").each((i, e) => {\r\n if (typeof this.options.tooltip === \"function\") {\r\n var tooltipContent = (<(menuItem: IMenuItem) => 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\r\n private updateHighlightSelected(): void {\r\n let selectedItem = this.model.getSelectedMenuItem();\r\n this.unhighlightSelected();\r\n if (selectedItem) {\r\n this.highlightSelected(selectedItem.guid);\r\n }\r\n }\r\n\r\n private unhighlightSelected(): void {\r\n this.$el.find(\"li\").removeClass(\"a-selected\");\r\n }\r\n\r\n private highlightSelected(guid: string): void {\r\n if (guid) {\r\n var el = this.$el.find('li[data-guid=\"' + guid + '\"]');\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 private trySetSelectedItemFromUrlQuery(): boolean {\r\n var id = AppKitchen.BrowserHelper.UrlQuery.getParameter(this.options.routingParameter);\r\n if (id) {\r\n return this.model.tryToSelectMenuItemById(id, this);\r\n }\r\n return false;\r\n }\r\n\r\n private clearRoute(options?: AppKitchen.BrowserHelper.RedirectOptions): void {\r\n if (this.options.routingParameter) {\r\n AppKitchen.BrowserHelper.UrlQuery.removeParameter(this.options.routingParameter,\r\n AppKitchen.OptionsHelper.merge(options,\r\n {\r\n push: false,\r\n refresh: false\r\n }));\r\n }\r\n }\r\n\r\n private updateRoute(selectedId: string, history: boolean): void {\r\n if (this.options.routingParameter &&\r\n AppKitchen.BrowserHelper.UrlQuery.getParameters()[this.options.routingParameter] !==\r\n selectedId) {\r\n AppKitchen.BrowserHelper.UrlQuery.setParameter(this.options.routingParameter,\r\n selectedId,\r\n { push: history && this.options.routingHistory });\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 private onClick(e: any): void {\r\n let menuItemElement = $(e.target);\r\n if (menuItemElement && menuItemElement.length !== 0) {\r\n let dataId = menuItemElement.attr(\"data-guid\");\r\n if (dataId) {\r\n var guid = dataId.toString();\r\n this.model.tryToSelectMenuItemByGuid(guid, this);\r\n }\r\n }\r\n }\r\n\r\n private visibleMenuItemsChanged(visibleMenuItems: MenuItem[]): void {\r\n var menuItemsElements = this.elements.menuItems;\r\n\r\n let lookup = this.createMenuItemsLookup(visibleMenuItems);\r\n\r\n if (!visibleMenuItems || visibleMenuItems.length === 0) {\r\n menuItemsElements.addClass(\"a-hidden\");\r\n if (this.options.noResultsMessage) {\r\n this.elements.noResultsMessage.show();\r\n }\r\n $(this.containers.verticalMenuList).hide();\r\n } else {\r\n menuItemsElements.each((i, e) => {\r\n let menuItemElement = $(e);\r\n if (menuItemElement && menuItemElement.length !== 0) {\r\n let dataId = menuItemElement.attr(\"data-guid\");\r\n if (dataId) {\r\n var guid = dataId.toString();\r\n if (this.isMenuItemVisibile(lookup, guid)) {\r\n menuItemElement.removeClass(\"a-hidden\");\r\n } else {\r\n menuItemElement.addClass(\"a-hidden\");\r\n }\r\n }\r\n }\r\n });\r\n this.elements.noResultsMessage.hide();\r\n $(this.containers.verticalMenuList).show();\r\n }\r\n this.updateScroller();\r\n this.updateHighlightSelected();\r\n }\r\n\r\n private createMenuItemsLookup(visibleMenuItems: MenuItem[]): { [key: string]: MenuItem } {\r\n let lookup: { [key: string]: MenuItem } = {};\r\n for (var visibleMenuItem of visibleMenuItems) {\r\n lookup[visibleMenuItem.guid] = visibleMenuItem;\r\n }\r\n return lookup;\r\n }\r\n\r\n private isMenuItemVisibile(lookup: { [key: string]: MenuItem }, guid: string): boolean {\r\n if (lookup[guid]) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n}","namespace 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 // 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}","namespace 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}","namespace AppKitchen {\r\n\r\n export module Controls {\r\n\r\n export class RangePickerOptions implements ViewBaseOptions {\r\n loadingOverlay?: string;\r\n quickNavigation: boolean;\r\n availableTimeRanges?: TimeRange[];\r\n }\r\n\r\n export enum TimeRange {\r\n Year,\r\n Quarter,\r\n Month,\r\n Day,\r\n RangeDay,\r\n RangeMonth,\r\n RangeYear\r\n }\r\n\r\n export class DateRange {\r\n constructor(public startDate: Date, public endDate: Date) {}\r\n }\r\n\r\n export class DateChangedEvent extends DateRange {\r\n constructor(public timeRange: TimeRange, startDate: Date, endDate: Date) {\r\n super(startDate, endDate);\r\n }\r\n }\r\n\r\n export enum DateShiftDirection {\r\n Previous,\r\n Next\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming \r\n export interface RangeCalculator {\r\n getDateRange(timeRange: TimeRange, from: Date, to: Date): DateRange;\r\n shiftDay(dateRange: DateRange, direction: DateShiftDirection): DateRange;\r\n shiftMonth(dateRange: DateRange, direction: DateShiftDirection): DateRange;\r\n shiftQuarter(dateRange: DateRange, direction: DateShiftDirection): DateRange;\r\n shiftYear(dateRange: DateRange, direction: DateShiftDirection): DateRange;\r\n }\r\n\r\n export class StandardRangeCalculator implements RangeCalculator {\r\n\r\n shiftQuarter(dateRange: DateRange, direction: DateShiftDirection): DateRange {\r\n switch (direction) {\r\n case DateShiftDirection.Next:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth() + 3,\r\n 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0),\r\n endDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth() + 6,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 0)\r\n };\r\n case DateShiftDirection.Previous:\r\n default:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth() - 3,\r\n 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0),\r\n endDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth(),\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 0)\r\n };\r\n }\r\n }\r\n\r\n shiftDay(dateRange: DateRange, direction: DateShiftDirection): DateRange {\r\n switch (direction) {\r\n case DateShiftDirection.Next:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth(),\r\n dateRange.startDate.getDate() + 1,\r\n 1,\r\n 0,\r\n 0,\r\n 0),\r\n endDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth(),\r\n dateRange.startDate.getDate() + 2,\r\n 0,\r\n 0,\r\n 0,\r\n 0)\r\n };\r\n case DateShiftDirection.Previous:\r\n default:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth(),\r\n dateRange.startDate.getDate() - 1,\r\n 1,\r\n 0,\r\n 0,\r\n 0),\r\n endDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth(),\r\n dateRange.startDate.getDate(),\r\n 0,\r\n 0,\r\n 0,\r\n 0)\r\n };\r\n }\r\n }\r\n\r\n shiftMonth(dateRange: DateRange, direction: DateShiftDirection): DateRange {\r\n switch (direction) {\r\n case DateShiftDirection.Next:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth() + 1,\r\n 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0),\r\n endDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth() + 2,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 0)\r\n };\r\n case DateShiftDirection.Previous:\r\n default:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth() - 1,\r\n 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0),\r\n endDate: new Date(dateRange.startDate.getFullYear(),\r\n dateRange.startDate.getMonth(),\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 0)\r\n };\r\n }\r\n }\r\n\r\n shiftYear(dateRange: DateRange, direction: DateShiftDirection): DateRange {\r\n switch (direction) {\r\n case DateShiftDirection.Next:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear() + 1, 0, 1, 0, 0, 0, 0),\r\n endDate: new Date(dateRange.startDate.getFullYear() + 2, 0, 0, 0, 0, 0, 0)\r\n };\r\n case DateShiftDirection.Previous:\r\n default:\r\n return {\r\n startDate: new Date(dateRange.startDate.getFullYear() - 1, 0, 1, 0, 0, 0, 0),\r\n endDate: new Date(dateRange.startDate.getFullYear(), 0, 0, 0, 0, 0, 0)\r\n };\r\n }\r\n }\r\n\r\n getDateRange(timeRange: TimeRange, from: Date, to: Date) {\r\n switch (timeRange) {\r\n case TimeRange.Year:\r\n return {\r\n startDate: new Date(from.getFullYear(), 0, 1, 0, 0, 0, 0),\r\n endDate: new Date(from.getFullYear() + 1, 0, 0, 0, 0, 0, 0)\r\n };\r\n case TimeRange.Quarter:\r\n return {\r\n startDate: new Date(from.getFullYear(), from.getMonth(), 1, 0, 0, 0, 0),\r\n endDate: new Date(from.getFullYear(), from.getMonth() + 3, 0, 0, 0, 0, 0)\r\n };\r\n case TimeRange.Month:\r\n return {\r\n startDate: new Date(from.getFullYear(), from.getMonth(), 1, 0, 0, 0, 0),\r\n endDate: new Date(from.getFullYear(), from.getMonth() + 1, 0, 0, 0, 0, 0)\r\n };\r\n case TimeRange.Day:\r\n return {\r\n startDate: new Date(from.getFullYear(), from.getMonth(), from.getDate(), 1, 0, 0, 0),\r\n endDate: new Date(from.getFullYear(), from.getMonth(), from.getDate() + 1, 0, 0, 0, 0)\r\n };\r\n case TimeRange.RangeDay:\r\n case TimeRange.RangeMonth:\r\n return {\r\n startDate: new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0, 0),\r\n endDate: new Date(to.getFullYear(), to.getMonth(), to.getDate(), 0, 0, 0, 0)\r\n };\r\n case TimeRange.RangeYear:\r\n return {\r\n startDate: new Date(from.getFullYear(), 1, 0, 0, 0, 0, 0),\r\n endDate: new Date(to.getFullYear(), 12, 0, 0, 0, 0, 0)\r\n };\r\n default:\r\n throw `Case for TimeRange: ${timeRange} not implemented!`;\r\n }\r\n }\r\n }\r\n\r\n export interface RangePickerAttributes extends ModelBaseAttributes {\r\n dateRange: DateRange;\r\n timeRange: TimeRange;\r\n }\r\n\r\n export class RangePickerModel extends ModelBase {\r\n\r\n private dateChanged: Rx.Subject = new Rx.Subject();\r\n\r\n private dateRangeCalculator: RangeCalculator;\r\n\r\n constructor(attributes?: RangePickerAttributes, dateRangeCalculator?: RangeCalculator) {\r\n super(OptionsHelper.merge(attributes,\r\n {\r\n dateRange: new DateRange(null, null),\r\n timeRange: null\r\n }));\r\n this.dateRangeCalculator = dateRangeCalculator ? dateRangeCalculator : new StandardRangeCalculator();\r\n }\r\n\r\n private equals(a: any, b: any): boolean {\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n }\r\n\r\n getCurrentTimeRange(): TimeRange {\r\n return this.get().timeRange;\r\n }\r\n\r\n getCurrentRange(): DateRange {\r\n switch (this.get().timeRange) {\r\n case TimeRange.Year:\r\n case TimeRange.Quarter:\r\n case TimeRange.Month:\r\n case TimeRange.Day:\r\n case TimeRange.RangeDay:\r\n case TimeRange.RangeMonth:\r\n case TimeRange.RangeYear:\r\n return new DateRange(this.get().dateRange.startDate, this.get().dateRange.endDate);\r\n default:\r\n return { startDate: null, endDate: null };\r\n }\r\n }\r\n\r\n onDateChanged(): Rx.IObservable {\r\n return this.dateChanged.asObservable();\r\n }\r\n\r\n setValues(timeRange: TimeRange, start: Date, end: Date) {\r\n switch (timeRange) {\r\n case TimeRange.Year:\r\n this.setYear(start);\r\n break;\r\n case TimeRange.Quarter:\r\n this.setQuarter(start);\r\n break;\r\n case TimeRange.Month:\r\n this.setMonth(start);\r\n break;\r\n case TimeRange.Day:\r\n this.setDay(start);\r\n break;\r\n case TimeRange.RangeDay:\r\n this.setRange(start, end, TimeRange.RangeDay);\r\n break;\r\n case TimeRange.RangeMonth:\r\n this.setRange(start, end, TimeRange.RangeMonth);\r\n break;\r\n case TimeRange.RangeYear:\r\n this.setRange(start, end, TimeRange.RangeYear);\r\n break;\r\n default:\r\n throw `Case for TimeRange: ${timeRange} not implemented!`;\r\n }\r\n }\r\n\r\n private setYear(start: Date) {\r\n const date = new Date(start.getFullYear(), 1);\r\n const newValues = this.dateRangeCalculator.getDateRange(TimeRange.Year, date, date);\r\n this.setValuesInternal(TimeRange.Year, newValues);\r\n }\r\n\r\n private setQuarter(start: Date) {\r\n const quarter = QuarterHelper.getQuarterFromDate(start);\r\n const date = new Date(start.getFullYear(), QuarterHelper.getMonthFromQuarter(quarter));\r\n const newValues = this.dateRangeCalculator.getDateRange(TimeRange.Quarter, date, date);\r\n this.setValuesInternal(TimeRange.Quarter, newValues);\r\n }\r\n\r\n private setMonth(start: Date) {\r\n const date = new Date(start.getFullYear(), start.getMonth());\r\n const newValues = this.dateRangeCalculator.getDateRange(TimeRange.Month, date, date);\r\n this.setValuesInternal(TimeRange.Month, newValues);\r\n }\r\n\r\n private setDay(start: Date) {\r\n const date = new Date(start.getFullYear(), start.getMonth(), start.getDate());\r\n const newValues = this.dateRangeCalculator.getDateRange(TimeRange.Day, date, date);\r\n this.setValuesInternal(TimeRange.Day, newValues);\r\n }\r\n\r\n private setRange(start: Date, end: Date, range: TimeRange) {\r\n const newValues = this.dateRangeCalculator.getDateRange(range, start, end);\r\n this.setValuesInternal(range, newValues);\r\n }\r\n\r\n shiftValues(timeRange: TimeRange, direction: DateShiftDirection) {\r\n switch (timeRange) {\r\n case TimeRange.Year:\r\n this.shiftYear(direction);\r\n break;\r\n case TimeRange.Quarter:\r\n this.shiftQuarter(direction);\r\n break;\r\n case TimeRange.Month:\r\n this.shiftMonth(direction);\r\n break;\r\n case TimeRange.Day:\r\n this.shiftDay(direction);\r\n break;\r\n default:\r\n throw `Case for TimeRange: ${timeRange} not implemented!`;\r\n }\r\n }\r\n\r\n private shiftYear(direction: DateShiftDirection) {\r\n const newValues = this.dateRangeCalculator.shiftYear(this.get().dateRange, direction);\r\n this.setValuesInternal(TimeRange.Year, newValues);\r\n }\r\n\r\n private shiftMonth(direction: DateShiftDirection) {\r\n const newValues = this.dateRangeCalculator.shiftMonth(this.get().dateRange, direction);\r\n this.setValuesInternal(TimeRange.Month, newValues);\r\n }\r\n\r\n private shiftDay(direction: DateShiftDirection) {\r\n const newValues = this.dateRangeCalculator.shiftDay(this.get().dateRange, direction);\r\n this.setValuesInternal(TimeRange.Day, newValues);\r\n }\r\n\r\n private shiftQuarter(direction: DateShiftDirection) {\r\n const newValues = this.dateRangeCalculator.shiftQuarter(this.get().dateRange, direction);\r\n this.setValuesInternal(TimeRange.Quarter, newValues);\r\n }\r\n\r\n private setValuesInternal(timeRange: TimeRange, dataRange: DateRange) {\r\n if (this.equals(this.get().dateRange, dataRange) && this.get().timeRange === timeRange) {\r\n return;\r\n }\r\n this.set({\r\n timeRange: timeRange,\r\n dateRange: dataRange\r\n });\r\n this.dateChanged.onNext(new DateChangedEvent(timeRange, dataRange.startDate, dataRange.endDate));\r\n }\r\n }\r\n\r\n class Dictionary {\r\n private dic: { [key: string]: TData } = {};\r\n private keyDic: { [key: string]: TKey } = {};\r\n\r\n get(key: TKey) {\r\n const keyStr = key.toString();\r\n const value = this.dic[keyStr];\r\n if (!value) {\r\n console.log(`Couldn't find any entry for key: ${keyStr}.`);\r\n }\r\n return value;\r\n }\r\n\r\n add(key: TKey, value: TData) {\r\n this.dic[key.toString()] = value;\r\n this.keyDic[key.toString()] = key;\r\n }\r\n\r\n allValues(): TData[] {\r\n let values: TData[] = [];\r\n for (let key in this.dic) {\r\n if (this.dic.hasOwnProperty(key)) {\r\n values.push(this.dic[key]);\r\n }\r\n }\r\n return values;\r\n }\r\n\r\n allKeys(): TKey[] {\r\n let keys: TKey[] = [];\r\n for (let key in this.keyDic) {\r\n if (this.keyDic.hasOwnProperty(key)) {\r\n keys.push(this.keyDic[key]);\r\n }\r\n }\r\n return keys;\r\n }\r\n }\r\n\r\n class RangePickerDomDictionary {\r\n\r\n private containerDictionary: Dictionary;\r\n private datePickerDictionary: Dictionary;\r\n private radioDictionary: Dictionary;\r\n\r\n private allDataPickers: JQuery;\r\n private allRadios: JQuery;\r\n\r\n constructor($el: JQuery) {\r\n this.containerDictionary = new Dictionary();\r\n this.datePickerDictionary = new Dictionary();\r\n this.radioDictionary = new Dictionary();\r\n\r\n this.init($el);\r\n }\r\n\r\n private init($el: JQuery) {\r\n this.containerDictionary.add(TimeRange.Year, $el.find(\".a-year-picker\")[0]);\r\n this.containerDictionary.add(TimeRange.Quarter, $el.find(\".a-quarter-picker\")[0]);\r\n this.containerDictionary.add(TimeRange.Month, $el.find(\".a-month-picker\")[0]);\r\n this.containerDictionary.add(TimeRange.Day, $el.find(\".a-day-picker\")[0]);\r\n this.containerDictionary.add(TimeRange.RangeDay, $el.find(\".a-range-day-picker\")[0]);\r\n this.containerDictionary.add(TimeRange.RangeMonth, $el.find(\".a-range-month-picker\")[0]);\r\n this.containerDictionary.add(TimeRange.RangeYear, $el.find(\".a-range-year-picker\")[0]);\r\n\r\n this.datePickerDictionary.add(TimeRange.Year, $el.find(\".a-year-picker\"));\r\n this.datePickerDictionary.add(TimeRange.Quarter, $el.find(\".a-quarter-picker\"));\r\n this.datePickerDictionary.add(TimeRange.Month, $el.find(\".a-month-picker\"));\r\n this.datePickerDictionary.add(TimeRange.Day, $el.find(\".a-day-picker\"));\r\n this.datePickerDictionary.add(TimeRange.RangeDay, $el.find(\".a-range-day-picker\"));\r\n this.datePickerDictionary.add(TimeRange.RangeMonth, $el.find(\".a-range-month-picker\"));\r\n this.datePickerDictionary.add(TimeRange.RangeYear, $el.find(\".a-range-year-picker\"));\r\n\r\n this.radioDictionary.add(TimeRange.Year, $el.find(\".a-radio-year\"));\r\n this.radioDictionary.add(TimeRange.Quarter, $el.find(\".a-radio-quarter\"));\r\n this.radioDictionary.add(TimeRange.Month, $el.find(\".a-radio-month\"));\r\n this.radioDictionary.add(TimeRange.Day, $el.find(\".a-radio-day\"));\r\n this.radioDictionary.add(TimeRange.RangeDay, $el.find(\".a-radio-range-day\"));\r\n this.radioDictionary.add(TimeRange.RangeMonth, $el.find(\".a-radio-range-month\"));\r\n this.radioDictionary.add(TimeRange.RangeYear, $el.find(\".a-radio-range-year\"));\r\n\r\n this.allDataPickers = $el.find(\".a-range-picker-container\");\r\n this.allRadios = $el.find(\".a-radio-button\");\r\n }\r\n\r\n getContainer(timeRange: TimeRange): HTMLElement {\r\n return this.containerDictionary.get(timeRange);\r\n }\r\n\r\n getDatePickers(): JQuery {\r\n return this.allDataPickers;\r\n }\r\n\r\n getDatePicker(timeRange: TimeRange): JQuery {\r\n return this.datePickerDictionary.get(timeRange);\r\n }\r\n\r\n getRadios(): JQuery {\r\n return this.allRadios;\r\n }\r\n\r\n getRadio(timeRange: TimeRange): JQuery {\r\n return this.radioDictionary.get(timeRange);\r\n }\r\n\r\n getSelectedTimeRange(): TimeRange {\r\n for (let timeRange of this.radioDictionary.allKeys()) {\r\n const radio = this.radioDictionary.get(timeRange);\r\n if (radio.is(\":checked\")) {\r\n return timeRange;\r\n }\r\n }\r\n return TimeRange.Year;\r\n }\r\n }\r\n\r\n export class RangePickerView extends ViewBase {\r\n\r\n private dateRangePickerModelDictionary: Dictionary;\r\n private rangePickerDomDictionary: RangePickerDomDictionary;\r\n private modelSubscription: Rx.IDisposable;\r\n\r\n private buttons: {\r\n navigatePrevious: JQuery;\r\n navigateNext: JQuery;\r\n }\r\n\r\n options: RangePickerOptions;\r\n\r\n constructor(model: RangePickerModel, targetContainer: HTMLElement, options: RangePickerOptions) {\r\n super(model,\r\n targetContainer,\r\n OptionsHelper.merge(options, { quickNavigation: false }));\r\n\r\n this.dateRangePickerModelDictionary = new Dictionary();\r\n this.setTemplate(Templates.RangePicker);\r\n const initialStartDate = model.getCurrentRange().startDate;\r\n const initialEndDate = model.getCurrentRange().endDate;\r\n const initialTimeRange = model.getCurrentTimeRange();\r\n this.initDateRangePickerModelDictionary(initialStartDate, initialEndDate);\r\n this.subscribeModel();\r\n this.internalRender(initialTimeRange == null ? TimeRange.RangeDay : initialTimeRange);\r\n this.initialSelection(initialTimeRange, initialStartDate, initialEndDate);\r\n }\r\n\r\n private initDateRangePickerModelDictionary(initialStartDate: Date, initialEndDate: Date) {\r\n for (let timeRange of this.options.availableTimeRanges) {\r\n this.dateRangePickerModelDictionary.add(timeRange,\r\n new DateRangePickerModel(initialStartDate, initialEndDate));\r\n }\r\n }\r\n\r\n private initialSelection(timeRange: TimeRange, startDate: Date, endDate?: Date) {\r\n if (timeRange == null || startDate == null) return;\r\n\r\n this.model.setValues(timeRange, startDate, endDate);\r\n }\r\n\r\n private subscribeModel() {\r\n for (let timeRange of this.options.availableTimeRanges) {\r\n const model = this.dateRangePickerModelDictionary.get(timeRange);\r\n model.bind('change:startDate change:endDate',\r\n m => {\r\n var e = m.get();\r\n this.model.setValues(timeRange, e.startDate, e.endDate);\r\n });\r\n }\r\n\r\n this.modelSubscription = this.model.onDateChanged().subscribe(e => {\r\n this.selectTimeRangeControl(e.timeRange);\r\n this.showTimeRangeControl(e.timeRange);\r\n this.dateRangePickerModelDictionary.get(e.timeRange)\r\n .set({ startDate: e.startDate, endDate: e.endDate });\r\n });\r\n }\r\n\r\n render() {\r\n this.internalRender(this.rangePickerDomDictionary.getSelectedTimeRange());\r\n return this;\r\n }\r\n\r\n dispose() {\r\n this.modelSubscription.dispose();\r\n }\r\n\r\n private internalRender(timeRange?: TimeRange) {\r\n const templateData = this.getTemplateData();\r\n this.renderTemplate(templateData);\r\n this.initializeContainer();\r\n this.renderControls();\r\n if (timeRange != null) {\r\n this.selectTimeRangeControl(timeRange);\r\n this.showTimeRangeControl(timeRange);\r\n }\r\n this.subscribeEvents();\r\n }\r\n\r\n private getTemplateData() {\r\n return {\r\n showYear: this.lookupTimeRangeAvailable(TimeRange.Year),\r\n showQuarter: this.lookupTimeRangeAvailable(TimeRange.Quarter),\r\n showMonth: this.lookupTimeRangeAvailable(TimeRange.Month),\r\n showDay: this.lookupTimeRangeAvailable(TimeRange.Day),\r\n showRangeDay: this.lookupTimeRangeAvailable(TimeRange.RangeDay),\r\n showRangeMonth: this.lookupTimeRangeAvailable(TimeRange.RangeMonth),\r\n showRangeYear: this.lookupTimeRangeAvailable(TimeRange.RangeYear),\r\n };\r\n }\r\n\r\n private lookupTimeRangeAvailable(timeRange: TimeRange) {\r\n return !this.options.availableTimeRanges\r\n ? true\r\n : this.options.availableTimeRanges.AsLinq().Contains(timeRange);\r\n }\r\n\r\n private subscribeEvents() {\r\n this.rangePickerDomDictionary.getRadios()\r\n .change(() => {\r\n const timeRange = this.rangePickerDomDictionary.getSelectedTimeRange();\r\n this.showTimeRangeControl(timeRange);\r\n\r\n const model = this.dateRangePickerModelDictionary.get(timeRange);\r\n this.model.setValues(timeRange, model.get().startDate, model.get().endDate);\r\n });\r\n\r\n this.buttons.navigatePrevious.click(() => {\r\n const timeRange = this.rangePickerDomDictionary.getSelectedTimeRange();\r\n this.model.shiftValues(timeRange, DateShiftDirection.Previous);\r\n });\r\n\r\n this.buttons.navigateNext.click(() => {\r\n const timeRange = this.rangePickerDomDictionary.getSelectedTimeRange();\r\n this.model.shiftValues(timeRange, DateShiftDirection.Next);\r\n });\r\n }\r\n\r\n private initializeContainer() {\r\n this.buttons = {\r\n navigatePrevious: this.$el.find(\".a-navigate-left-button\"),\r\n navigateNext: this.$el.find(\".a-navigate-right-button\")\r\n }\r\n\r\n this.rangePickerDomDictionary = new RangePickerDomDictionary(this.$el);\r\n }\r\n\r\n private renderControls() {\r\n for (let timeRange of this.options.availableTimeRanges) {\r\n let model = this.dateRangePickerModelDictionary.get(timeRange);\r\n this.renderControl(timeRange, model);\r\n }\r\n }\r\n\r\n private renderControl(timeRange: TimeRange, model: DateRangePickerModel) {\r\n let container = this.rangePickerDomDictionary.getContainer(timeRange);\r\n let options = this.getControlOptions(timeRange);\r\n // ReSharper disable once WrongExpressionStatement\r\n new DateRangePickerView(model, container, options);\r\n }\r\n\r\n private getControlOptions(timeRange: TimeRange): DateRangePickerOptions {\r\n switch (timeRange) {\r\n case TimeRange.Year:\r\n return {\r\n pickerFormat: DateRangePickerFormat.Year,\r\n hideEndPicker: true,\r\n labels: { from: null, to: null }\r\n };\r\n case TimeRange.Quarter:\r\n return {\r\n pickerFormat: DateRangePickerFormat.Quarter,\r\n hideEndPicker: true,\r\n labels: { from: null, to: null }\r\n };\r\n case TimeRange.Month:\r\n return {\r\n pickerFormat: DateRangePickerFormat.Month,\r\n hideEndPicker: true,\r\n labels: { from: null, to: null }\r\n };\r\n case TimeRange.Day:\r\n return {\r\n pickerFormat: DateRangePickerFormat.Date,\r\n hideEndPicker: true,\r\n labels: { from: null, to: null }\r\n };\r\n case TimeRange.RangeDay:\r\n return {\r\n pickerFormat: DateRangePickerFormat.Date\r\n };\r\n case TimeRange.RangeMonth:\r\n return {\r\n pickerFormat: DateRangePickerFormat.Month\r\n };\r\n case TimeRange.RangeYear:\r\n return {\r\n pickerFormat: DateRangePickerFormat.Year\r\n };\r\n default:\r\n throw `Case for TimeRange: ${timeRange} not implemented!`;\r\n }\r\n }\r\n\r\n private selectTimeRangeControl(timeRange: TimeRange) {\r\n const radio = this.rangePickerDomDictionary.getRadio(timeRange);\r\n radio.prop('checked', true);\r\n }\r\n\r\n private showTimeRangeControl(timeRange: TimeRange) {\r\n this.rangePickerDomDictionary.getDatePickers().hide();\r\n this.buttons.navigatePrevious.hide();\r\n this.buttons.navigateNext.hide();\r\n const datePicker = this.rangePickerDomDictionary.getDatePicker(timeRange);\r\n datePicker.show();\r\n if (this.options.quickNavigation &&\r\n (timeRange === TimeRange.Year ||\r\n timeRange === TimeRange.Quarter ||\r\n timeRange === TimeRange.Month ||\r\n timeRange === TimeRange.Day)) {\r\n this.buttons.navigatePrevious.show();\r\n this.buttons.navigateNext.show();\r\n }\r\n }\r\n }\r\n }\r\n}","namespace 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(() => {\r\n if (timeOutHandler != null) {\r\n clearTimeout(timeOutHandler);\r\n }\r\n timeOutHandler = window.setTimeout(() => {\r\n this.model.set({ query: this.input.val() });\r\n timeOutHandler = null;\r\n }, 300);\r\n });\r\n\r\n return this;\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}","namespace 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 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 return this;\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 * old code from \"Helpers.ts\"\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 // 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","namespace 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 export class TimelineModel extends AppKitchen.ModelBase {}\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 //TODO: review this control!\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 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 {\r\n type: \"timeline\"\r\n },\r\n {\r\n type: \"timelineWeek\"\r\n },\r\n {\r\n type: \"timelineWorkWeek\"\r\n },\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: (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 return this;\r\n }\r\n }\r\n }\r\n}\r\n","namespace 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.Api.Models.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.Api.Models.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 = Data.getData.bind(this, options.api);\r\n } else {\r\n requestApi = 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 = Data.getData.bind(this, options.api);\r\n } else {\r\n requestApi = 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.Api.Models.ChartData[], startDate: Date, endDate: Date) {\r\n this.setData(data, startDate, endDate);\r\n }\r\n\r\n private setData(data: AppKitchen.Api.Models.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","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Controls.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,\r\n 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,\r\n 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\",\r\n () => this.set({\r\n startDate: loader.get().startDate,\r\n endDate: loader.get().endDate\r\n }));\r\n\r\n loader.on(\"change:loading\",\r\n () => this.set({\r\n loading: loader.get().loading\r\n }));\r\n\r\n loader.on(\"change:data\",\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\r\n protected convertChartData(chartData: Api.Models.ChartData[],\r\n styles?: { [tsId: string]: TimeseriesDataViewStyles }): TimeseriesDataViewData[] {\r\n if (!chartData) {\r\n return [];\r\n }\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}","namespace 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 showExportButton: boolean; // used in template, therefore not optional\r\n showSaveButton: boolean;// used in template, therefore not optional\r\n onSave?: () => void;\r\n }\r\n\r\n export class TimeseriesDataView extends AppKitchen.ViewBase {\r\n options: TimeseriesDataViewOptions;\r\n\r\n private exportFilename: string;\r\n private containers: {\r\n datePicker: HTMLElement,\r\n title: HTMLElement,\r\n chart: HTMLElement,\r\n grid: HTMLElement,\r\n };\r\n private buttons: {\r\n all: JQuery,\r\n switchToChart: JQuery,\r\n switchToGrid: JQuery,\r\n excel: JQuery,\r\n save: JQuery,\r\n };\r\n chartView: TimeseriesDataChartView;\r\n gridView: TimeseriesDataSpreadsheetBase;\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 showExportButton: true,\r\n showSaveButton: false,\r\n gridOptions: {\r\n spreadsheetFormat: \"asColumns\"\r\n }\r\n }, true));\r\n\r\n this.setTemplate(Templates.TimeseriesDataView);\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n this.renderTemplate({\r\n title: this.options.title,\r\n showSaveButton: this.options.showSaveButton,\r\n showExportButton: this.options.showExportButton\r\n });\r\n this.setContainers();\r\n \r\n if (this.options.enableDateSelection) {\r\n this.createDatePicker();\r\n }\r\n this.createChartView();\r\n this.createGridView();\r\n\r\n AppKitchen.UIHelper.updateFullHeightGrids(this.el);\r\n\r\n this.setEvents();\r\n\r\n return this;\r\n }\r\n\r\n private createDatePicker() {\r\n const datePickerModel = new Controls.DateRangePickerModel(this.options.defaultStartDate, this.options.defaultEndDate);\r\n // ReSharper disable once WrongExpressionStatement\r\n 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 private createChartView() {\r\n this.chartView = new TimeseriesDataChartView(this.model, this.containers.chart, this.options.chartOptions);\r\n }\r\n\r\n private createGridView() {\r\n this.gridView = this.options.gridOptions.spreadsheetFormat === \"asRows\"\r\n ? new RowBasedSpreadsheetView(this.model, this.containers.grid, this.options.gridOptions)\r\n : new ColumnBasedSpreadsheetView(this.model, this.containers.grid, this.options.gridOptions);\r\n }\r\n\r\n private setContainers() {\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 save: this.$el.find(\".a-tdv-save\")\r\n }\r\n }\r\n\r\n private setEvents() {\r\n this.buttons.excel.kendoTooltip({ position: \"top\" });\r\n this.buttons.save.kendoTooltip({ position: \"top\" });\r\n\r\n this.buttons.save.click(() => this.onSave());\r\n\r\n this.buttons.switchToChart.click(() => this.switchToChart());\r\n this.buttons.switchToGrid.click(() => this.switchToGrid());\r\n\r\n if (this.isGirdViewSelected()) {\r\n this.switchToGrid();\r\n } else {\r\n this.switchToChart();\r\n }\r\n\r\n this.model.on(\"change:timeseries\", () => this.configureExcelMenu());\r\n }\r\n\r\n private isGirdViewSelected() {\r\n return AppKitchen.BrowserHelper.UrlQuery.getParameter(\"view\") === \"grid\";\r\n }\r\n\r\n private onSave() {\r\n this.gridView.updateModel();\r\n if (this.options.onSave) {\r\n this.options.onSave();\r\n }\r\n }\r\n\r\n private switchToChart() {\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 private switchToGrid() {\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 private configureExcelMenu() {\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 hypothesis: this.model.get().timeseries[0].hypothesis,\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 private 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 hypothesis: ts.hypothesis,\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 hypothesis: ts.hypothesis,\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 private 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 private 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 private 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 private convertToChartData(viewData: TimeseriesDataViewData[]) {\r\n var data: Api.Models.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}","namespace AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n\r\n export module TimeseriesDataChartViewHelper {\r\n export function getDefaultConfig() {\r\n //TODO: remove cast to any!\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 }) as any) as Highstock.Options;\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,\r\n targetContainer: HTMLElement,\r\n options?: TimeseriesDataChartViewOptions) {\r\n super(model,\r\n targetContainer,\r\n AppKitchen.OptionsHelper.merge(options,\r\n {\r\n seriesConfig: {},\r\n chartConfig: TimeseriesDataChartViewHelper.getDefaultConfig(),\r\n chartMode: 'default'\r\n },\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 return this;\r\n }\r\n\r\n updateChartData() {\r\n var timeseries = this.model.get().timeseries;\r\n if (timeseries.length > 0) {\r\n let timeseriesLinq = timeseries.AsLinq();\r\n (this.highchartsModel.get().config.yAxis).title.text = timeseriesLinq.First().unit;\r\n this.highchartsModel.set({\r\n seriesCollection: timeseriesLinq.Select(tsData =>\r\n new Controls.Charts.HighchartsSeriesModel(this.getTimeseriesData(tsData.data),\r\n this.getTimeseriesSettings(tsData)))\r\n .ToArray()\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 {\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 if (minTotal === Number.MAX_VALUE) {\r\n minTotal = maxTotal;\r\n }\r\n\r\n return { min: minTotal, max: maxTotal }\r\n }\r\n\r\n private getDataExtrema(multiply: number = 1) {\r\n const timeseriesDataViewDataList = this.model.get().timeseries;\r\n\r\n var min = Number.MAX_VALUE;\r\n var max = - Number.MAX_VALUE;\r\n var hasData = false;\r\n\r\n for (let timeseriesDataViewData of timeseriesDataViewDataList) {\r\n if (!timeseriesDataViewData.data) {\r\n continue;\r\n }\r\n for (let data of timeseriesDataViewData.data) {\r\n if (data[1] != null) {\r\n if (data[1] < min) min = data[1];\r\n if (data[1] > max) max = data[1];\r\n hasData = true;\r\n }\r\n }\r\n }\r\n\r\n if (min === max) {\r\n max += 1;\r\n }\r\n const 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}","namespace AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n\r\n export enum CellType {\r\n Header,\r\n BorderLeft,\r\n ThickBorderLeft,\r\n BorderBottom,\r\n Range,\r\n DataReadOnly,\r\n DataEdit,\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface TimeseriesDataSpreadsheetViewOptions extends AppKitchen.ViewBaseOptions {\r\n spreadsheetFormat?: \"asColumns\" | \"asRows\";\r\n dateFormat?: string;\r\n editable?: boolean;\r\n onEdit?: () => void;\r\n }\r\n\r\n export interface MaxLengthTimeseries {\r\n timeseries: TimeseriesDataViewData;\r\n cols: number;\r\n rows: number;\r\n }\r\n\r\n export abstract class TimeseriesDataSpreadsheetBase extends AppKitchen.ViewBase {\r\n options: TimeseriesDataSpreadsheetViewOptions;\r\n protected spreadSheet: kendo.ui.Spreadsheet;\r\n protected spreadsheetContainer: JQuery;\r\n protected dirty: boolean;\r\n protected updatesSuspended: boolean;\r\n maxLengthTimeseries: MaxLengthTimeseries;\r\n\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.init();\r\n this.updatesSuspended = false;\r\n this.model.on(\"change:timeseries\", () => {\r\n if (!this.updatesSuspended) {\r\n this.spreadsheetContainer.empty();\r\n this.render();\r\n }\r\n });\r\n $(window).on(\"resize\", () => {\r\n this.resize();\r\n }).resize();\r\n }\r\n\r\n /* SPREADSHEET INITIALIZATION */\r\n\r\n init() {\r\n AppKitchen.UIHelper.renderTemplateTo(this.el, Templates.TimeseriesDataSpreadsheetView);\r\n this.spreadsheetContainer = this.$el.find(\".a-tssv-spreadsheet-container\");\r\n this.render();\r\n }\r\n\r\n abstract render(): this;\r\n\r\n protected checkTimeseriesDataViewData(timeseriesDataViewDataList: TimeseriesDataViewData[]): boolean {\r\n let length: number = null;\r\n let start: number = null;\r\n let end: number = null;\r\n for (let timeseriesDataViewData of timeseriesDataViewDataList) {\r\n if (!timeseriesDataViewData.data || timeseriesDataViewData.data.length === 0) {\r\n console.warn(`The data of the timeseries: '${timeseriesDataViewData.timeseriesId}' is empty!`);\r\n return false;\r\n } else if (!length || !start || ! end) {\r\n length = timeseriesDataViewData.data.length;\r\n start = timeseriesDataViewData.data[0][0];\r\n end = timeseriesDataViewData.data[length - 1][0];\r\n if (length > 50000) {\r\n console.log(`The timeseries data length is: '${length}'. It could take a while to reader data.`);\r\n }\r\n } else {\r\n if (timeseriesDataViewData.data.length !== length) {\r\n console.warn(`The data of the timeseries: '${timeseriesDataViewData.timeseriesId}' has a diffenret length then the others!`);\r\n return false;\r\n }\r\n if (timeseriesDataViewData.data[0][0] !== start) {\r\n console.warn(`The start of the timeseries: '${timeseriesDataViewData.timeseriesId}' is a diffenret then the others!`);\r\n return false;\r\n }\r\n if (timeseriesDataViewData.data[timeseriesDataViewData.data.length - 1][0] !== end) {\r\n console.warn(`The end of the timeseries: '${timeseriesDataViewData.timeseriesId}' is a diffenret then the others!`);\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n protected getMaxLengthTimeseries(timeseries: TimeseriesDataViewData[]): MaxLengthTimeseries {\r\n if (!timeseries || timeseries.length === 0) {\r\n return {\r\n timeseries: null,\r\n cols: 0,\r\n rows: 0\r\n }\r\n }\r\n\r\n var maxLengthTs = timeseries[0];\r\n for (var i = 0; i < timeseries.length; i++) {\r\n if (timeseries[i].data.length > maxLengthTs.data.length) {\r\n maxLengthTs = timeseries[i];\r\n }\r\n }\r\n return {\r\n timeseries: maxLengthTs,\r\n cols: maxLengthTs.data.length, // data\r\n rows: timeseries.length // timeseries\r\n };\r\n }\r\n \r\n protected getValidator(): kendo.ui.SpreadsheetSheetRowCellValidation {\r\n return {\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\r\n protected getRange(tsDataList: TimeseriesDataViewData): Date[] {\r\n if (!tsDataList) {\r\n return [];\r\n }\r\n\r\n return tsDataList.data.AsLinq().Select((e) => new Date(e[0])).ToArray();\r\n }\r\n\r\n updateModel() {\r\n if (this.options.editable) {\r\n this.suspendUpdates(this.updateData.bind(this));\r\n }\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 abstract updateData(): void;\r\n\r\n abstract getSpreadsheet(tsData: TimeseriesDataViewData[]): kendo.ui.SpreadsheetSheet;\r\n\r\n resize() {\r\n if (this.spreadSheet) {\r\n this.spreadSheet.resize();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n\r\n export class ColumnBasedSpreadsheetView extends TimeseriesDataSpreadsheetBase {\r\n \r\n private headerRowsCount: number;\r\n\r\n render() {\r\n this.headerRowsCount = 2;\r\n\r\n const isValid = this.checkTimeseriesDataViewData(this.model.get().timeseries);\r\n if (!isValid) {\r\n return null;\r\n }\r\n\r\n this.maxLengthTimeseries = this.getMaxLengthTimeseries(this.model.get().timeseries);\r\n\r\n const sheet = this.getSpreadsheet(this.model.get().timeseries);\r\n\r\n const spreadsheetOptions: kendo.ui.SpreadsheetOptions = {\r\n sheets: [sheet],\r\n toolbar: false,\r\n sheetsbar: false,\r\n columns: sheet.columns.length,\r\n rows: sheet.rows.length\r\n }; \r\n\r\n this.spreadSheet = this.spreadsheetContainer.kendoSpreadsheet(spreadsheetOptions).data(\"kendoSpreadsheet\");\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 return this;\r\n }\r\n\r\n updateData() {\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 const sheet = this.spreadSheet.sheetByIndex(0);\r\n const rowsCount = (sheet)._rows._count;\r\n const columnsCount = (sheet)._columns._count;\r\n\r\n for (var column = 1, tsIndex = 0; column < columnsCount; column++ , tsIndex++) {\r\n let ts = data[tsIndex];\r\n for (var row = sheet.frozenRows(), dataIndex = 0; row < rowsCount; row++ , dataIndex++) {\r\n let value = (sheet).range(row, column).values()[0][0];\r\n ts.data[dataIndex][1] = value;\r\n }\r\n }\r\n\r\n this.model.trigger(\"change:timeseries\", this.model);\r\n this.dirty = false;\r\n }\r\n\r\n getSpreadsheet(timeseriesDataViewDataList: TimeseriesDataViewData[]): kendo.ui.SpreadsheetSheet {\r\n const range: Date[] = this.getRange(this.maxLengthTimeseries.timeseries);\r\n \r\n let columns: kendo.ui.SpreadsheetSheetColumn[] = [];\r\n var cellsList: kendo.ui.SpreadsheetSheetRowCell[][] = this.getInitCellsList(range.length);\r\n\r\n this.addRangeColumn(range, columns, cellsList);\r\n this.addTimeseriesDataColumns(timeseriesDataViewDataList, columns, cellsList);\r\n\r\n let rows = this.getRows(cellsList);\r\n let frozenColumns = rows[0].cells.length > 1 ? 1 : 0;\r\n\r\n return {\r\n rows: rows,\r\n columns: columns,\r\n frozenRows: 2,\r\n frozenColumns: frozenColumns\r\n };\r\n }\r\n\r\n private getRows(cellsList: kendo.ui.SpreadsheetSheetRowCell[][]): kendo.ui.SpreadsheetSheetRow[] {\r\n let rows: kendo.ui.SpreadsheetSheetRow[] = [];\r\n for (let cells of cellsList) {\r\n rows.push({ cells: cells });\r\n }\r\n return rows;\r\n }\r\n\r\n private addTimeseriesDataColumns(timeseriesDataViewDataList: TimeseriesDataViewData[], columns: kendo.ui.SpreadsheetSheetColumn[],\r\n cellsList: kendo.ui.SpreadsheetSheetRowCell[][]) {\r\n timeseriesDataViewDataList.AsLinq()\r\n .ForEach(i => {\r\n const data = i.data.AsLinq().Select((e) => { return e[1] }).ToArray();\r\n const cellType = this.options.editable ? CellType.DataEdit : CellType.DataReadOnly;\r\n this.addDataColumn(columns,\r\n cellsList,\r\n [i.label, i.unit],\r\n data, 150,\r\n [cellType, CellType.BorderLeft],\r\n [CellType.Header, CellType.BorderLeft]\r\n );\r\n });\r\n }\r\n\r\n private addRangeColumn(range: Date[], columns: kendo.ui.SpreadsheetSheetColumn[], cellsList: kendo.ui.SpreadsheetSheetRowCell[][]) {\r\n this.addDataColumn(columns, cellsList, [\"\", Strings.TimeseriesDataView_Spreadsheet_Timestamp_Label], range, 150, [CellType.Range], [CellType.Header]);\r\n }\r\n\r\n private addDataColumn(columns: kendo.ui.SpreadsheetSheetColumn[], cellsList: kendo.ui.SpreadsheetSheetRowCell[][],\r\n columnHeaders: string[], data: number[] | Date[], columnWidth: number, cellTypes: CellType[], cellHeaderTypes: CellType[]) {\r\n columns.push({ width: columnWidth });\r\n let index = 0;\r\n for (let columnHeader of columnHeaders) {\r\n if (index === columnHeaders.length - 1) {\r\n cellHeaderTypes.push(CellType.BorderBottom);\r\n }\r\n this.insert(cellsList, index++, columnHeader, cellHeaderTypes);\r\n }\r\n for (let d of data) {\r\n this.insert(cellsList, index++, d, cellTypes);\r\n }\r\n }\r\n\r\n private insert(cellsList: kendo.ui.SpreadsheetSheetRowCell[][], index: number, value: string | number | boolean | Date, cellTypes: CellType[]) {\r\n let cell: kendo.ui.SpreadsheetSheetRowCell = {};\r\n cell.value = value;\r\n cell.validation = this.getValidator();\r\n this.updateCellStyle(cell, cellTypes);\r\n cellsList[index].push(cell);\r\n }\r\n\r\n private updateCellStyle(cell: kendo.ui.SpreadsheetSheetRowCell, cellTypes: CellType[]) {\r\n for (let cellType of cellTypes) {\r\n switch (cellType) {\r\n case CellType.Header:\r\n cell.color = AppKitchen.Colors.Gray;\r\n cell.background = AppKitchen.Colors.Gainsboro;\r\n cell.enable = false;\r\n break;\r\n case CellType.BorderLeft:\r\n cell.borderLeft = {\r\n color: AppKitchen.Colors.DarkGray,\r\n };\r\n break;\r\n case CellType.ThickBorderLeft:\r\n cell.borderLeft = {\r\n color: AppKitchen.Colors.DarkGray,\r\n size: \"3\"\r\n };\r\n break; \r\n case CellType.BorderBottom:\r\n cell.borderBottom = {\r\n color: AppKitchen.Colors.DarkGray,\r\n };\r\n break;\r\n case CellType.Range:\r\n cell.format = kendo.culture().calendar.patterns.g;\r\n cell.background = AppKitchen.Colors.Gainsboro;\r\n cell.color = AppKitchen.Colors.Gray;\r\n cell.enable = false;\r\n break;\r\n case CellType.DataReadOnly:\r\n cell.color = AppKitchen.Colors.Gray;\r\n cell.enable = false;\r\n break;\r\n case CellType.DataEdit:\r\n cell.enable = true;\r\n break;\r\n default:\r\n }\r\n }\r\n }\r\n\r\n private getInitCellsList(rowsCount: number): kendo.ui.SpreadsheetSheetRowCell[][] {\r\n let cellsList: kendo.ui.SpreadsheetSheetRowCell[][] = [];\r\n for (let i = 0; i < rowsCount + this.headerRowsCount; i++) {\r\n cellsList.push([]);\r\n }\r\n return cellsList;\r\n }\r\n }\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n export module Controls {\r\n export module TimeseriesDataViews {\r\n\r\n export class RowBasedSpreadsheetView extends TimeseriesDataSpreadsheetBase {\r\n \r\n private headerRows: number;\r\n private headerCols: number;\r\n\r\n render() {\r\n this.headerRows = 1;\r\n this.headerCols = 3;\r\n\r\n const isValid = this.checkTimeseriesDataViewData(this.model.get().timeseries);\r\n if (!isValid) {\r\n return null;\r\n }\r\n\r\n this.maxLengthTimeseries = this.getMaxLengthTimeseries(this.model.get().timeseries);\r\n\r\n const sheet = this.getSpreadsheet(this.model.get().timeseries);\r\n\r\n const spreadsheetOptions: kendo.ui.SpreadsheetOptions = {\r\n sheets: [sheet],\r\n toolbar: false,\r\n sheetsbar: false,\r\n columns: sheet.columns.length,\r\n rows: this.maxLengthTimeseries.rows + this.headerRows\r\n }; \r\n\r\n this.spreadSheet = this.spreadsheetContainer.kendoSpreadsheet(spreadsheetOptions).data(\"kendoSpreadsheet\");\r\n\r\n if (this.maxLengthTimeseries.timeseries !== null && this.maxLengthTimeseries.timeseries.data.length !== 0) {\r\n this.fillRowbasedSpreadsheet(this.model.get().timeseries);\r\n }\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 return this;\r\n }\r\n\r\n updateData() {\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 const sheet = this.spreadSheet.sheetByIndex(0);\r\n const rowsCount = (sheet)._rows._count;\r\n const columnsCount = (sheet)._columns._count;\r\n\r\n for (var row = sheet.frozenRows(), dataIndex = 0; row < rowsCount; row++ , dataIndex++) {\r\n\r\n let ts = data[dataIndex];\r\n\r\n for (var column = sheet.frozenColumns(), tsIndex = 0; column < columnsCount; column++ , tsIndex++) {\r\n let value = sheet.range(row, column).values()[0][0];\r\n ts.data[tsIndex][1] = value;\r\n }\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 getSpreadsheet(tsData: TimeseriesDataViewData[]): kendo.ui.SpreadsheetSheet {\r\n var headerRow: kendo.ui.SpreadsheetSheetRow = { cells: [] };\r\n\r\n // add title cells to header row\r\n headerRow.cells.push({\r\n value: Strings.TimeseriesGrid_Id,\r\n fontSize: 12.8,\r\n bold: true,\r\n enable: false\r\n }, {\r\n value: Strings.TimeseriesGrid_Name,\r\n fontSize: 12.8,\r\n bold: true,\r\n enable: false\r\n }, {\r\n value: Strings.TimeseriesGrid_Unit,\r\n fontSize: 12.8,\r\n bold: true,\r\n enable: false\r\n });\r\n\r\n // define title columns width\r\n var sheetColumns = [\r\n { width: 250 },\r\n { width: 250 },\r\n { width: 100 }\r\n ];\r\n\r\n // define value columns width\r\n if (tsData && tsData.length > 0) {\r\n for (let i = 0; i < this.maxLengthTimeseries.cols; i++) {\r\n sheetColumns.push({\r\n width: 125\r\n });\r\n }\r\n }\r\n return {\r\n rows: [headerRow],\r\n columns: sheetColumns,\r\n frozenRows: this.headerRows,\r\n frozenColumns: this.headerCols\r\n };\r\n }\r\n\r\n private fillRowbasedSpreadsheet(tsData: TimeseriesDataViewData[]) {\r\n\r\n // display date row (first row)\r\n var sheet = this.spreadSheet.sheetByIndex(0);\r\n\r\n var dateValues = this.maxLengthTimeseries.timeseries.data.AsLinq().Select(tsData => new Date(tsData[0])).ToArray();\r\n var dateRow = sheet.range(`${AppKitchen.SpreadsheetHelper.getColumnName(this.headerCols + 1)}1:${AppKitchen.SpreadsheetHelper.getColumnName(this.maxLengthTimeseries.timeseries.data.length + this.headerCols)}1`);\r\n dateRow.values([dateValues]);\r\n dateRow.bold(true);\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 dateRow.format(dateFormat);\r\n dateRow.enable(false);\r\n\r\n // display value rows\r\n var columnIndex = 2;\r\n tsData.forEach(ts => {\r\n var values = ts.data.AsLinq().Select(tsData => tsData[1] ? tsData[1] : 0).ToArray();\r\n var valuesRow = sheet.range(`A${columnIndex}:${AppKitchen.SpreadsheetHelper.getColumnName(ts.data.length + this.headerCols)}${columnIndex}`);\r\n\r\n // prepend title columns to value row\r\n values.unshift(ts.timeseriesId, ts.label, ts.unit);\r\n \r\n // set values\r\n valuesRow.values([values]);\r\n valuesRow.enable(this.options.editable);\r\n valuesRow.color(ts.color);\r\n\r\n columnIndex += 1;\r\n });\r\n\r\n //set styling of title columns\r\n let bg = AppKitchen.UIHelper.Colors.hex2Rgb(AppKitchen.Colors.CiColor);\r\n let headerRange = sheet.range(`A1:${AppKitchen.SpreadsheetHelper.getColumnName(this.headerCols)}${columnIndex}`);\r\n\r\n headerRange.background(`rgba(${bg.r},${bg.g},${bg.b},.2)`);\r\n headerRange.enable(false);\r\n }\r\n }\r\n }\r\n }\r\n}","namespace 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: Api.Models.InteractiveData = {\r\n databaseId: this.databaseId,\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 dataSourceId: \"T###\",\r\n dataSourceType: Api.Models.DataSourceType.Timeseries,\r\n timeaxisIds: [\"A###\"]\r\n },\r\n }\r\n ],\r\n }\r\n\r\n AppKitchen.Data.getDataApi(\"TimeseriesData\", config, (dataList: AppKitchen.Api.Models.ChartData[]) => {\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 return this;\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","namespace AppKitchen {\r\n\r\n export module Controls.TreeView {\r\n\r\n export interface TreeViewAttributes extends ModelBaseAttributes {}\r\n\r\n export interface TreeViewOptions extends ViewBaseOptions {\r\n loadingOverlay?: string;\r\n template?: (item: TreeViewItem) => string;\r\n hasCheckboxes?: boolean;\r\n checkParents?: boolean;\r\n routingParameter?: string;\r\n }\r\n\r\n export class TreeViewItem {\r\n id: string;\r\n text: string;\r\n imageUrl?: string;\r\n items?: TreeViewItem[];\r\n expanded?: boolean;\r\n data?: T;\r\n }\r\n\r\n export class ItemsChangedArgs {\r\n items: TreeViewItem[];\r\n sender: any;\r\n }\r\n\r\n export class TreeViewHelper {\r\n static getItemsIds(items: TreeViewItem[]): string[] {\r\n return items.map(i => i.id);\r\n }\r\n\r\n static flattenItems(items?: TreeViewItem[]): TreeViewItem[] {\r\n if (items == null) {\r\n return [];\r\n }\r\n\r\n let result: TreeViewItem[] = [];\r\n for (const item of items) {\r\n result.push(item);\r\n result = result.concat(TreeViewHelper.flattenItems(item.items));\r\n }\r\n\r\n return result;\r\n }\r\n }\r\n\r\n class Events {\r\n itemsChanged: Rx.Subject>;\r\n selectedItemsChanged: Rx.Subject>;\r\n }\r\n\r\n export class TreeViewModel extends ModelBase {\r\n\r\n private items: TreeViewItem[] = [];\r\n private flattenItems: TreeViewItem[] = [];\r\n private selectedItems: TreeViewItem[] = [];\r\n private events: Events = {\r\n itemsChanged: new Rx.Subject>(),\r\n selectedItemsChanged: new Rx.Subject>()\r\n };\r\n private lookupTreeViewItem: { [id: string]: TreeViewItem } = {};\r\n\r\n getFlattenItems(): TreeViewItem[] {\r\n return this.flattenItems;\r\n }\r\n\r\n getItems(): TreeViewItem[] {\r\n return this.items;\r\n }\r\n\r\n getSelectedItems(): TreeViewItem[] {\r\n return this.selectedItems;\r\n }\r\n\r\n onItemsChanged(): Rx.IObservable> {\r\n return this.events.itemsChanged.asObservable();\r\n }\r\n\r\n onSelectedItemsChanged(): Rx.IObservable> {\r\n return this.events.selectedItemsChanged.asObservable();\r\n }\r\n\r\n setTreeViewDomainData(treeViewDomainData: T[], convert: (t: T[]) => TreeViewItem[]): void {\r\n this.setData(convert(treeViewDomainData), this);\r\n }\r\n\r\n setData(items: TreeViewItem[], sender?: any): void {\r\n this.flattenItems = TreeViewHelper.flattenItems(items);\r\n this.items = items;\r\n this.setUpLookup();\r\n this.events.itemsChanged.onNext({ sender: sender, items: this.items });\r\n }\r\n\r\n selectTreeViewItems(items: TreeViewItem[], sender?: any): void {\r\n this.selectedItems = TreeViewHelper.flattenItems(items);\r\n this.events.selectedItemsChanged.onNext({ sender: sender, items: this.selectedItems });\r\n }\r\n\r\n private setUpLookup(): void {\r\n this.flattenItems.AsLinq>().ForEach((item => {\r\n this.lookupTreeViewItem[item.id] = item;\r\n }));\r\n }\r\n\r\n getItemsByIds(ids: string[]): TreeViewItem[] {\r\n const items: TreeViewItem[] = [];\r\n for (let id of ids) {\r\n let item = this.getItemById(id);\r\n if (item) {\r\n items.push(item);\r\n }\r\n }\r\n return items;\r\n }\r\n\r\n getItemById(id: string): TreeViewItem {\r\n return this.lookupTreeViewItem[id];\r\n }\r\n\r\n getItemsIds(): string[] {\r\n return this.items.map(i => i.id);\r\n }\r\n\r\n getSelectedItemsIds(): string[] {\r\n return this.selectedItems.map(i => i.id);\r\n }\r\n }\r\n\r\n export class TreeView extends ViewBase> {\r\n options: TreeViewOptions;\r\n $el: JQuery;\r\n\r\n private kendoTreeControl: kendo.ui.TreeView;\r\n private itemsChangedSubscription: Rx.IDisposable;\r\n private selectedItemsChangedSubscription: Rx.IDisposable;\r\n private modelLookup: { [id: string]: kendo.data.Model };\r\n\r\n private elements: {\r\n treeView: HTMLElement\r\n };\r\n\r\n constructor(model: TreeViewModel, targetContainer: HTMLElement, options?: TreeViewOptions) {\r\n super(model, targetContainer, options);\r\n this.setTemplate(Templates.TreeView);\r\n this.render();\r\n this.internalBind();\r\n this.setKendoTreeSelectedNodes(this.model.getSelectedItemsIds());\r\n }\r\n\r\n render() {\r\n this.renderTemplate({});\r\n this.setContainers();\r\n this.initializeKendoTree();\r\n return this;\r\n }\r\n\r\n private setContainers(): void {\r\n this.elements = {\r\n treeView: this.$el.find(\".a-tree-view\")[0]\r\n };\r\n }\r\n\r\n private internalBind(): void {\r\n if (!this.itemsChangedSubscription) {\r\n this.itemsChangedSubscription = this.model.onItemsChanged().subscribe(e => {\r\n if (e.sender === this) {\r\n return;\r\n }\r\n this.setDataSource(e.items);\r\n });\r\n }\r\n if (!this.selectedItemsChangedSubscription) {\r\n this.selectedItemsChangedSubscription = this.model.onSelectedItemsChanged().subscribe(\r\n e => {\r\n this.updateSelection(e.items);\r\n });\r\n }\r\n }\r\n\r\n private updateSelection(selectedItems: TreeViewItem[]): void {\r\n this.updateItemUrlParameter(selectedItems);\r\n this.setKendoTreeSelectedNodes(TreeViewHelper.getItemsIds(selectedItems));\r\n }\r\n\r\n private internalUnbind(): void {\r\n if (this.itemsChangedSubscription) {\r\n this.itemsChangedSubscription.dispose();\r\n this.itemsChangedSubscription = null;\r\n }\r\n if (this.selectedItemsChangedSubscription) {\r\n this.selectedItemsChangedSubscription.dispose();\r\n this.selectedItemsChangedSubscription = null;\r\n }\r\n }\r\n\r\n private updateItemUrlParameter(items: TreeViewItem[]): void {\r\n const routingKey = this.options.routingParameter;\r\n if (routingKey && items.length > 0) {\r\n const url = TreeViewHelper.getItemsIds(items).join(\";\");\r\n BrowserHelper.UrlQuery.setParameter(routingKey, url);\r\n return;\r\n } else {\r\n BrowserHelper.UrlQuery.removeParameter(routingKey);\r\n }\r\n }\r\n\r\n private updateTreeSelectionFromUrl(treeModel: TreeViewModel): void {\r\n const routingKey = this.options.routingParameter;\r\n if (!routingKey) {\r\n return;\r\n }\r\n let itemsParam = BrowserHelper.UrlQuery.getParameter(routingKey);\r\n if (!itemsParam) {\r\n BrowserHelper.UrlQuery.removeParameter(routingKey);\r\n return;\r\n }\r\n let ids = itemsParam.split(\";\");\r\n let items = treeModel.getItemsByIds(ids);\r\n treeModel.selectTreeViewItems(items, this);\r\n }\r\n\r\n dispose(): void {\r\n this.internalUnbind();\r\n }\r\n\r\n private itemsToKendoDataSource(items: TreeViewItem[]): kendo.data.HierarchicalDataSource {\r\n const result = new kendo.data.HierarchicalDataSource({\r\n data: items\r\n });\r\n return result;\r\n }\r\n\r\n setDataSource(items: TreeViewItem[]): void {\r\n let dataSource = this.itemsToKendoDataSource(items);\r\n this.kendoTreeControl.setDataSource(dataSource);\r\n this.updateTreeSelectionFromUrl(this.model);\r\n\r\n this.updateDomElement();\r\n }\r\n\r\n private updateDomElement() {\r\n this.modelLookup = {}\r\n\r\n this.visitTreeChildrenAndAddToLookup(this.kendoTreeControl.dataSource.view());\r\n this.addDataIdToTreeItemDomElements();\r\n }\r\n\r\n private addDataIdToTreeItemDomElements() {\r\n let lookup = this.modelLookup;\r\n for (let key in lookup) {\r\n if (lookup.hasOwnProperty(key)) {\r\n const node = this.modelLookup[key];\r\n const uid = node.uid;\r\n const id = node.id;\r\n this.$el.find(`li[data-uid=${uid}]`).attr(\"data-id\", id);\r\n }\r\n }\r\n }\r\n\r\n private visitTreeChildrenAndAddToLookup(nodes: kendo.data.ObservableArray) {\r\n for (var i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n this.modelLookup[node.id] = node;\r\n if (node.hasChildren) {\r\n this.visitTreeChildrenAndAddToLookup(node.children.view());\r\n }\r\n }\r\n }\r\n\r\n initializeKendoTree() {\r\n const options: kendo.ui.TreeViewOptions = {\r\n check: () => { this.onKendoTreeCheck(); },\r\n select: e => { e.preventDefault(); },\r\n dataSource: [],\r\n template: this.options.template\r\n ? (data) => {\r\n return this.options.template(data.item);\r\n }\r\n : (data) => {\r\n return data.item.text;\r\n }\r\n };\r\n if (this.options.hasCheckboxes && ! this.options.checkParents) {\r\n options.checkboxes = true;\r\n }\r\n if (this.options.hasCheckboxes && this.options.checkParents) {\r\n options.checkboxes = {\r\n checkChildren: this.options.checkParents\r\n }\r\n }\r\n this.kendoTreeControl = $(this.elements.treeView).kendoTreeView(options).data(\"kendoTreeView\");\r\n }\r\n\r\n private onKendoTreeCheck(): void {\r\n const selectedNodeIds = this.getKendoSelectedNodeIds();\r\n const selectedItems = this.model.getItemsByIds(selectedNodeIds);\r\n this.model.selectTreeViewItems(selectedItems, this);\r\n }\r\n\r\n private getKendoSelectedNodeIds(): string[] {\r\n let selectedNodeIds: string[] = [];\r\n this.getKendoSelectedNodesRecursive(this.kendoTreeControl.dataSource.view(), selectedNodeIds);\r\n return selectedNodeIds;\r\n }\r\n\r\n private getKendoSelectedNodesRecursive(nodes: kendo.data.ObservableArray, selectedNodeIds: string[]): void {\r\n for (let i = 0; i < nodes.length; i++) {\r\n if (nodes[i].hasChildren) {\r\n this.getKendoSelectedNodesRecursive(nodes[i].children.view(), selectedNodeIds);\r\n } else if (nodes[i].checked) {\r\n selectedNodeIds.push(nodes[i].id);\r\n }\r\n }\r\n }\r\n\r\n private setKendoTreeSelectedNodes(ids: string[]): void {\r\n const nodes = this.kendoTreeControl.dataSource.view();\r\n this.setKendoTreeSelectedNodesRecursive(nodes, ids);\r\n }\r\n\r\n private setKendoTreeSelectedNodesRecursive(nodes: kendo.data.ObservableArray, ids: string[]): void {\r\n if (nodes == null) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n let node = nodes[i];\r\n if (ids.indexOf(node.id) > -1) {\r\n node.set(\"checked\", true);\r\n } else {\r\n node.set(\"checked\", false);\r\n }\r\n\r\n if (node.hasChildren) {\r\n this.setKendoTreeSelectedNodesRecursive(node.children.view(), ids);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","namespace 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}","namespace 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 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 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 setClaim(token: string, username: string, success: (result: any) => void, error: (err: any) => void): void {\r\n \r\n $.ajax({\r\n type: \"POST\",\r\n url: appKitchenApiUrl + \"/claim\",\r\n data: {\r\n Token: token,\r\n Username: username\r\n },\r\n success: success,\r\n error: (xhr: JQueryXHR) => error(xhr.responseText),\r\n cache: false\r\n });\r\n }\r\n\r\n export function hasSessionToken(): boolean {\r\n return Cookies.get(AppKitchen.GlobalSettings.currentUserCookieName) != null;\r\n }\r\n\r\n export function ping(timeout: number, success: (result: boolean) => void, error: (err: any) => 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 is invalid\");\r\n error(e);\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 export function getFile(fileName: string, rootFolder: string, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return getDataByGetRequest(\"File\", { fileName: fileName, rootFolder: rootFolder }, callback, errorCallback);\r\n }\r\n\r\n export function getFileCached(fileName: string, rootFolder: string, callback: any, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n var documentId = rootFolder + \"__\" + fileName;\r\n\r\n if (documentMap[documentId]) {\r\n window.setTimeout(() => callback(documentMap[documentId]), 1);\r\n } else {\r\n return getDataByGetRequest(\"File\", { fileName: fileName, rootFolder: rootFolder }, callback, errorCallback);\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;\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) : \"\");\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.GlobalSettingsResponse;\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.Api.Models.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 import PasswordChangeInfo = AppKitchen.Api.Models.PasswordChangeInfo;\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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Data.getDataApi(\"Trees\", request, callback, errorCallback);\r\n }\r\n\r\n export function getPasswordChangeInformation(callback: (result: PasswordChangeInfo) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return Data.getDataApi(\"PasswordChangeInfo\", {}, (result: PasswordChangeInfo) => callback(result), 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 Data.getDataApi(\"UserInfo\", {}, (result: UserInfo) => {\r\n result.MailAddress = DOMPurify.sanitize(result.MailAddress);\r\n result.Description = DOMPurify.sanitize(result.Description);\r\n result.Division = DOMPurify.sanitize(result.Division);\r\n result.Name = DOMPurify.sanitize(result.Name);\r\n result.Phone = DOMPurify.sanitize(result.Phone);\r\n callback(result);\r\n }, 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 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 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 Data.getDataByGetRequestApi(\"About\", {}, callback, errorCallback);\r\n }\r\n\r\n export function getContextSensitiveHelp(ctx: string, callback: (result: any) => void, errorCallback?: (requestData?: any, xhr?: JQueryXHR, statusText?: string, errorText?: string) => void): JQueryXHR {\r\n return Data.getDataByGetRequestApi(\"ContextSensitiveHelp\", { context: ctx }, 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 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 Data.getDataByGetRequestApi(\"IconBase64\", { id: iconId }, callback, errorCallback);\r\n }\r\n\r\n }\r\n\r\n }\r\n}\r\n","namespace 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","namespace AppKitchen {\r\n export module Data {\r\n\r\n export interface TextPoolItemWithLabel extends AppKitchen.Api.Models.EventTextPoolItem {\r\n Label: string;\r\n }\r\n\r\n export type FieldToEventItemInfoDictionary = { [field: string]: AppKitchen.Api.Models.EventItemInfo };\r\n export type IdToTextPoolItemDictionary = { [id: string]: TextPoolItemWithLabel };\r\n export type FieldToTestPoolDictionary = { [field: string]: IdToTextPoolItemDictionary};\r\n export type DataEntries = { [property: string]: any };\r\n\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 export interface EventDataSaveOptions extends LoadOptionsBase {\r\n success?: (result: boolean | Object) => void;\r\n error?: (request: JQueryXHR) => void;\r\n }\r\n\r\n export interface EventDataLoaderOptions {\r\n eventDataApi?: string;\r\n eventDataSaveApi?: string;\r\n startupFailed?: (request: JQueryXHR) => void;\r\n cacheEventItemRequest?: boolean;\r\n }\r\n\r\n class ChangeEvents {\r\n data: RxEx.SubjectWithPrevious;\r\n items: RxEx.Subject;\r\n config: RxEx.Subject;\r\n ready: RxEx.Subject;\r\n loading: RxEx.Subject;\r\n }\r\n\r\n export interface EventDataLoaderAttributes {\r\n data?: DataEntries[];\r\n items?: AppKitchen.Api.Models.EventItemInfo[];\r\n ready?: boolean;\r\n loading?: boolean;\r\n }\r\n\r\n export interface ColumnConfig extends AppKitchen.Api.Models.EventItemSpecification {\r\n SortNr?: number,\r\n Metadata?: string,\r\n Type?: any,\r\n Width?: number,\r\n Visibility?: boolean,\r\n RestrictFilterSelection?: boolean,\r\n GridOptions?: Controls.Grids.GridColumnOptions,\r\n FieldOptions?: Controls.Forms.FieldOptions,\r\n }\r\n\r\n export interface GridConfig extends AppKitchen.Api.Models.EventDataRequest {\r\n EventItemSpecs: ColumnConfig[];\r\n }\r\n\r\n export interface IEventDataLoaderDataConverter {\r\n updateItemDictionary(items: AppKitchen.Api.Models.EventItemInfo[]): void;\r\n getItemDictionary(): FieldToEventItemInfoDictionary;\r\n getTextPoolItemDictionary(field: string): IdToTextPoolItemDictionary;\r\n convertDataFromServer(data: DataEntries[]): DataEntries[];\r\n convertDataToServer(data: DataEntries[]): AppKitchen.Api.Models.EventDataSaveRequest[];\r\n }\r\n\r\n export class DefaultEventDataLoaderDataConverter implements IEventDataLoaderDataConverter {\r\n\r\n private itemDictionary: FieldToEventItemInfoDictionary;\r\n private textPoolItemDictionary: FieldToTestPoolDictionary;\r\n private config: GridConfig;\r\n\r\n constructor(config: GridConfig) {\r\n this.config = config;\r\n }\r\n\r\n getItemDictionary(): FieldToEventItemInfoDictionary {\r\n return this.itemDictionary;\r\n }\r\n\r\n getTextPoolItemDictionary(field: string): IdToTextPoolItemDictionary {\r\n return this.textPoolItemDictionary[field];\r\n }\r\n\r\n updateItemDictionary(eventItemInfos: AppKitchen.Api.Models.EventItemInfo[]): void {\r\n this.itemDictionary = {};\r\n this.textPoolItemDictionary = {};\r\n if (!eventItemInfos) {\r\n return;\r\n }\r\n if (!this.config) {\r\n console.log(\"No grid config was set!\");\r\n return;\r\n }\r\n\r\n for (let eventItemInfo of eventItemInfos) {\r\n const field = eventItemInfo.InventoryId + \"_\" + eventItemInfo.Id;\r\n this.itemDictionary[field] = eventItemInfo;\r\n\r\n const columnConfig = this.config.EventItemSpecs.AsLinq().FirstOrDefault(g => `${g.InventoryId}_${g.ItemId}` === field);\r\n if (columnConfig && columnConfig.RestrictFilterSelection) {\r\n const textPoolItemDictionary: IdToTextPoolItemDictionary = {};\r\n for (let textPoolItem of eventItemInfo.TextPool) {\r\n textPoolItemDictionary[textPoolItem.Id] = {\r\n Id: textPoolItem.Id,\r\n Text: textPoolItem.Text,\r\n SortNr: textPoolItem.SortNr,\r\n StatusColor: textPoolItem.StatusColor,\r\n Label: eventItemInfo.TypeSpecification.UseId ? textPoolItem.Id : textPoolItem.Text,\r\n };\r\n }\r\n this.textPoolItemDictionary[field] = textPoolItemDictionary;\r\n }\r\n }\r\n }\r\n\r\n convertDataFromServer(data: DataEntries[]): DataEntries[] {\r\n if (!data) {\r\n console.log(\"No data!\");\r\n return [];\r\n }\r\n if (!this.itemDictionary) {\r\n console.log(\"No item dictionary was set!\");\r\n return [];\r\n }\r\n\r\n for (let entry of data) {\r\n for (let property in entry) {\r\n if (entry.hasOwnProperty(property)) {\r\n if (this.itemDictionary.hasOwnProperty(property)) {\r\n const type = this.itemDictionary[property].Type;\r\n entry[property] = this.convertStringToType(type, entry[property]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n private convertStringToType(type: string, value: string): string | number | boolean | Date {\r\n switch (type) {\r\n case \"String\":\r\n case \"Memo\":\r\n case \"TextPool\":\r\n case \"Descriptor\":\r\n case \"Binary\":\r\n case \"MasterDataCopy\":\r\n case \"User\":\r\n case \"Group\":\r\n case \"MultiDescriptor\":\r\n case \"EventKeyField\":\r\n return value || \"\";\r\n case \"Date\":\r\n case \"DateTimeOffset\":\r\n case \"PeriodNr\":\r\n return kendo.parseDate(value, \"yyyy-MM-ddTHH:mm:ss\");\r\n case \"Time\":\r\n return kendo.parseDate(value, \"HH:mm:ss\");\r\n case \"Number\":\r\n case \"Calculated\":\r\n case \"Decimal\":\r\n return kendo.parseFloat(value, \"de-DE\"); // REST API has fixed \"de-DE\" culture\r\n case \"Int32\":\r\n case \"Int64\":\r\n return kendo.parseInt(value, \"de-DE\"); // REST API has fixed \"de-DE\" culture\r\n case \"Boolean\":\r\n if (value != null && !(typeof value == \"boolean\"))\r\n return value === \"true\";\r\n default:\r\n AppKitchen.logWarning(`Not supported type: '${type}'. Value: '${value}' will not converted.`);\r\n return value || \"\";\r\n }\r\n }\r\n\r\n convertDataToServer(data: DataEntries[]): AppKitchen.Api.Models.EventDataSaveRequest[] {\r\n if (!data) {\r\n console.log(\"No data!\");\r\n return [];\r\n }\r\n\r\n let eventDataSaveRequests: AppKitchen.Api.Models.EventDataSaveRequest[] = [];\r\n\r\n for (let entry of data) {\r\n var saveData = [];\r\n for (let property in entry) {\r\n if (entry.hasOwnProperty(property)) {\r\n saveData.push(this.getSaveRequestData(property, entry[property]));\r\n }\r\n }\r\n eventDataSaveRequests.push({\r\n EventItemSpecs: this.config ? this.config.EventItemSpecs : null,\r\n EventValues: saveData\r\n });\r\n }\r\n\r\n return eventDataSaveRequests;\r\n }\r\n\r\n private getSaveRequestData(property: string, value: any): { Key: string, Value: any } {\r\n if (value == null) {\r\n value = \"\";\r\n } else if (value instanceof Date) {\r\n value = value.toLocalISOString();\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 '\" + property + \"' has invalid type\";\r\n }\r\n return { Key: property, Value: value };\r\n }\r\n }\r\n\r\n export class EventDataLoader {\r\n private config: GridConfig;\r\n private options: EventDataLoaderOptions;\r\n private attributes: EventDataLoaderAttributes;\r\n private changeEvents: ChangeEvents;\r\n private dataConverter: IEventDataLoaderDataConverter;\r\n\r\n private eventItemsProvider: Provider.EventItemsProvider;\r\n private eventDataProvider: Provider.EventDataProvider;\r\n private eventDataSaveProvider: Provider.EventDataSaveProvider;\r\n\r\n private subscriptions: {\r\n items: Rx.IDisposable;\r\n ready: Rx.IDisposable;\r\n }\r\n\r\n constructor(config: GridConfig, onReady: (loader: EventDataLoader) => void, options?: EventDataLoaderOptions, dataConverter?: IEventDataLoaderDataConverter) {\r\n this.config = config;\r\n this.dataConverter = dataConverter ? dataConverter : new DefaultEventDataLoaderDataConverter(config);\r\n\r\n this.eventItemsProvider = new Provider.EventItemsProvider();\r\n this.eventDataProvider = new Provider.EventDataProvider();\r\n this.eventDataSaveProvider = new Provider.EventDataSaveProvider();\r\n\r\n this.changeEvents = {\r\n data: new RxEx.SubjectWithPrevious(),\r\n items: new RxEx.Subject(),\r\n config: new RxEx.Subject(),\r\n ready: new RxEx.Subject(),\r\n loading: new RxEx.Subject(),\r\n };\r\n\r\n this.attributes = {\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 cacheEventItemRequest: false\r\n });\r\n\r\n this.subscriptions = {\r\n items: this.onChangeReady().subscribe(event => {\r\n if (event.data) {\r\n onReady(this);\r\n }\r\n }),\r\n ready: this.onChangeItems().subscribe(event => this.dataConverter.updateItemDictionary(event.data))\r\n }\r\n \r\n this.loadItems();\r\n }\r\n\r\n getData(): DataEntries[] {\r\n return this.attributes.data;\r\n }\r\n\r\n setData(data: DataEntries[], sender: object) {\r\n const previous = this.attributes.data;\r\n this.attributes.data = data;\r\n this.changeEvents.data.onNext({ sender: sender, data: data, previous: previous });\r\n }\r\n\r\n onChangeData(): RxEx.ObservableWithPrevious {\r\n return this.changeEvents.data.asObservable();\r\n }\r\n\r\n getItems(): AppKitchen.Api.Models.EventItemInfo[] {\r\n return this.attributes.items;\r\n }\r\n\r\n setItems(items: AppKitchen.Api.Models.EventItemInfo[], sender: object) {\r\n this.attributes.items = items;\r\n this.attributes.ready = true;\r\n this.changeEvents.items.onNext({ sender: sender, data: items });\r\n this.changeEvents.ready.onNext({ sender: sender, data: true });\r\n }\r\n\r\n onChangeItems(): RxEx.Observable {\r\n return this.changeEvents.items.asObservable();\r\n }\r\n\r\n onChangeReady(): RxEx.Observable {\r\n return this.changeEvents.ready.asObservable();\r\n }\r\n\r\n getLoading(): boolean {\r\n return this.attributes.loading;\r\n }\r\n\r\n setLoading(loading: boolean, sender: object) {\r\n this.attributes.loading = loading;\r\n this.changeEvents.loading.onNext({ sender: sender, data: loading });\r\n }\r\n\r\n onChangeLoading(): RxEx.Observable {\r\n return this.changeEvents.loading.asObservable();\r\n }\r\n\r\n getConfig(): GridConfig {\r\n return this.config;\r\n }\r\n\r\n setConfig(config: GridConfig, sender: object) {\r\n this.config = config;\r\n this.changeEvents.config.onNext({ sender: sender, data: config });\r\n }\r\n\r\n onChangeConfig(): RxEx.Observable {\r\n return this.changeEvents.config.asObservable();\r\n }\r\n\r\n loadItems() {\r\n this.eventItemsProvider.load(this.config, !this.options.cacheEventItemRequest)\r\n .then(items => {\r\n this.setItems(items, this);\r\n })\r\n .fail(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 this.abortDataRequest();\r\n\r\n if (!options.silent) {\r\n this.setLoading(true, this);\r\n }\r\n\r\n const api = options.api || this.options.eventDataApi;\r\n this.eventDataProvider.load(this.config, api)\r\n .then(data => {\r\n this.processLoadedData(data);\r\n options.success(data);\r\n })\r\n .fail(request => {\r\n options.error(request);\r\n })\r\n .always(() => this.setLoading(false, this));\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 this.abortDataSaveRequest();\r\n\r\n if (!options.silent) {\r\n this.setLoading(true, this);\r\n }\r\n\r\n var api = options.api || this.options.eventDataSaveApi;\r\n this.eventDataSaveProvider.save(this.getMultiSaveRequestData(data), api)\r\n .then(saveResult => {\r\n options.success(saveResult);\r\n })\r\n .fail(request => {\r\n options.error(request);\r\n })\r\n .always(() => this.setLoading(false, this));\r\n }\r\n\r\n getMultiSaveRequestData(data: DataEntries[]): AppKitchen.Api.Models.EventDataMultiSaveRequest {\r\n return {\r\n EventDataSaveRequests: this.dataConverter.convertDataToServer(data)\r\n }\r\n }\r\n\r\n abortRequests() {\r\n this.eventItemsProvider.abort();\r\n\r\n this.abortDataRequest();\r\n this.abortDataSaveRequest();\r\n }\r\n\r\n protected abortDataRequest() {\r\n this.eventDataProvider.abort();\r\n this.setLoading(false, this);\r\n }\r\n\r\n protected abortDataSaveRequest() {\r\n this.eventDataSaveProvider.abort();\r\n this.setLoading(false, this);\r\n }\r\n\r\n protected processLoadedData(data: DataEntries[]): void {\r\n var convertedData = this.dataConverter.convertDataFromServer(data);\r\n this.parseData(convertedData);\r\n this.setData(convertedData, this);\r\n }\r\n protected parseData(data: DataEntries[]): void {}\r\n\r\n getSaveRequestData(data: DataEntries): AppKitchen.Api.Models.EventDataSaveRequest {\r\n return this.dataConverter.convertDataToServer([data])[0];\r\n }\r\n\r\n getItemsDict(): FieldToEventItemInfoDictionary {\r\n return this.dataConverter.getItemDictionary();\r\n }\r\n\r\n getEventFieldInfo(field: string): AppKitchen.Api.Models.EventItemInfo {\r\n return this.dataConverter.getItemDictionary()[field];\r\n }\r\n\r\n getTextPoolItemDict(field: string): IdToTextPoolItemDictionary {\r\n return this.dataConverter.getTextPoolItemDictionary(field);\r\n }\r\n\r\n dispose(): void {\r\n if (!this.subscriptions) return;\r\n for (let key in this.subscriptions) {\r\n if (this.subscriptions[key]) {\r\n this.subscriptions[key].dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","namespace 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","namespace 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}","namespace 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 = 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 = 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","namespace 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 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 = 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 = 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 = 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 = 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","namespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export abstract class ProviderBase {\r\n\r\n private request: JQueryXHR;\r\n\r\n protected do(apiName: string, request?: TRequestType): JQueryPromise {\r\n const deferred = $.Deferred();\r\n\r\n this.request = Data.getData(apiName,\r\n request,\r\n (items: TDataType) => {\r\n deferred.resolve(items);\r\n },\r\n (err, xhr) => deferred.reject(xhr.responseText));\r\n\r\n return deferred.promise();\r\n }\r\n\r\n public abort() {\r\n if (this.request) {\r\n this.request.abort();\r\n this.request = null;\r\n }\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export class EventDataProvider extends ProviderBase {\r\n\r\n public load(request: AppKitchen.Api.Models.EventDataRequest, api?: string): JQueryPromise {\r\n return this.do(api || \"EventData\", request);\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export class EventDataSaveProvider extends ProviderBase {\r\n\r\n public save(request: AppKitchen.Api.Models.EventDataMultiSaveRequest, api?: string):\r\n JQueryPromise {\r\n return this.do(api || \"EventDataMultiSave\", request);\r\n }\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export abstract class ProviderMapCachedBase {\r\n\r\n private data: { [key: string]: any } = {};\r\n private request: JQueryXHR;\r\n\r\n protected do(apiName: string, request?: TRequestType, reloadRequest?: boolean):\r\n JQueryPromise {\r\n const deferred = $.Deferred();\r\n const key = this.getKey(request);\r\n\r\n if (!reloadRequest && this.data[key]) {\r\n deferred.resolve(this.data[key]);\r\n } else {\r\n this.request = Data.getData(apiName,\r\n request,\r\n (items: TDataType) => {\r\n this.data[key] = items;\r\n deferred.resolve(items);\r\n },\r\n (err, xhr) => deferred.reject(xhr.responseText));\r\n }\r\n\r\n return deferred.promise();\r\n }\r\n\r\n private getKey(request: TRequestType): string {\r\n return this.getHashCode(request).toString();\r\n }\r\n\r\n private getHashCode(request: TRequestType): number {\r\n return request ? Object.GetHashCode(JSON.stringify(request)) : 0;\r\n }\r\n\r\n public abort() {\r\n if (this.request) {\r\n this.request.abort();\r\n this.request = null;\r\n }\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export class EventItemsProvider extends ProviderMapCachedBase {\r\n\r\n public load(request: AppKitchen.Api.Models.EventDataRequest, reloadRequest?: boolean):\r\n JQueryPromise {\r\n return this.do(\"EventItems\", request, reloadRequest);\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export class LogoutProvider extends ProviderBase {\r\n\r\n public logout(): JQueryPromise {\r\n return this.do(\"Logout\");\r\n }\r\n\r\n public static logout(): JQueryPromise {\r\n return new LogoutProvider().logout();\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n /**\r\n * @deprecated Use AppKitchen.Data.Api.getPasswordChangeInformation method\r\n */\r\n export class PasswordChangeInfoProvider extends ProviderBase {\r\n\r\n public load(): JQueryPromise {\r\n return this.do(\"PasswordChangeInfo\");\r\n }\r\n\r\n public static load(): JQueryPromise {\r\n return new PasswordChangeInfoProvider().load();\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export class PasswordRestrictionInfoProvider extends ProviderBase {\r\n\r\n public load(): JQueryPromise {\r\n return this.do(\"PasswordRestrictionInfo\");\r\n }\r\n\r\n public static load(): JQueryPromise {\r\n return new PasswordRestrictionInfoProvider().load();\r\n }\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export abstract class ProviderCachedBase {\r\n\r\n private static data: any;\r\n private static request: JQueryXHR;\r\n\r\n protected static do(apiName: string,\r\n request?: TRequestType,\r\n reloadRequest?: boolean): JQueryPromise {\r\n const deferred = $.Deferred();\r\n\r\n if (!reloadRequest && this.data) {\r\n deferred.resolve(this.data);\r\n } else {\r\n this.request = Data.getData(apiName,\r\n request,\r\n (items: TDataType) => {\r\n this.data = items;\r\n deferred.resolve(items);\r\n },\r\n (err, xhr) => deferred.reject(xhr.responseText));\r\n }\r\n\r\n return deferred.promise();\r\n }\r\n\r\n public static abort() {\r\n if (this.request) {\r\n this.request.abort();\r\n this.request = null;\r\n }\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nnamespace AppKitchen {\r\n\r\n export module Data.Provider {\r\n\r\n export class TreeViewProvider extends ProviderBase {\r\n\r\n public load(request: AppKitchen.Api.Models.TreeViewRequest):\r\n JQueryPromise {\r\n return this.do(\"TreeView\", request);\r\n }\r\n }\r\n }\r\n}","\r\nnamespace AppKitchen {\r\n\r\n export module FrameManager {\r\n\r\n var mainHeader: HTMLElement;\r\n\r\n export function hideHeader() {\r\n $(mainHeader).hide(0);\r\n $(\"body\").css(\"min-width\", \"auto\");\r\n }\r\n\r\n export enum UserMenuStyle {\r\n Hidden,\r\n Simple,\r\n Extended\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export interface UserMenuOptions extends AppKitchen.AppBaseOptions {\r\n userMenuStyle?: UserMenuStyle;\r\n /**\r\n * @deprecated Use userMenuStyle: 'AppKitchen.FrameManager.UserMenuStyle.Simple' instead.\r\n */\r\n simpleMenu?: boolean;\r\n changePassword?: boolean;\r\n /**\r\n * @deprecated Use userMenuStyle: 'AppKitchen.FrameManager.UserMenuStyle.Extended' instead.\r\n */\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 footerTemplate?: string;\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 footerContainer: HTMLElement;\r\n\r\n constructor(targetContainer: HTMLElement, options?: MainAppOptions) {\r\n options = AppKitchen.OptionsHelper.merge(options, MainApp.getDefaultOptions(options), true);\r\n\r\n super(targetContainer, options);\r\n }\r\n\r\n private static getDefaultOptions(options: MainAppOptions): MainAppOptions {\r\n return {\r\n apps: [],\r\n mainMenu: undefined,\r\n userMenu: {\r\n userMenuStyle: MainApp.checkDeprecatedUserMenuStyleOptions(options),\r\n changePassword: true,\r\n customItems: []\r\n },\r\n helpMenu: {\r\n hide: false,\r\n aboutAppName: AppKitchen.Strings.About +\r\n \" \" +\r\n (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 };\r\n }\r\n\r\n private static checkDeprecatedUserMenuStyleOptions(options: MainAppOptions): UserMenuStyle {\r\n if (!options.userMenu) {\r\n return UserMenuStyle.Simple;\r\n }\r\n if (options.userMenu.simpleMenu) {\r\n return UserMenuStyle.Simple;\r\n }\r\n if (options.userMenu.extendedUserInfo) {\r\n return UserMenuStyle.Extended;\r\n }\r\n return UserMenuStyle.Simple;\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 this.createBurgerMenu(mainMenu, this.burgerMenuContainer);\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\r\n var burgerMenuDataSource = [];\r\n\r\n burgerMenuDataSource.push(this.getBurgerMenuDefinition());\r\n\r\n $(menuContainer).kendoMenu({\r\n dataSource: burgerMenuDataSource,\r\n direction: $(menuContainer).attr(\"data-direction\") || undefined,\r\n openOnClick: true\r\n });\r\n\r\n let dropDownContainer = $(menuContainer).find(\".a-burger-menu ul.k-menu-group\")[0];\r\n let burgerMenuContainer =\r\n $('
          ', { 'class': '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 if (height > screenHight) {\r\n $(burgerMenuContainer).height(screenHight);\r\n }\r\n }).resize();\r\n\r\n this.createMenuIcon($(menuContainer).find(\".a-burger-menu\"), \"menu-32px\");\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 burgerMenuContainer.empty();\r\n let ul = $('
            ', { 'class': '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,\r\n subChild,\r\n \"a-menu-second-items\",\r\n 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,\r\n subSubChild,\r\n \"a-menu-third-items\",\r\n menuContainer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private renderBurgerMenuItem(menuLayerUl: JQuery,\r\n menuItem: MenuItem,\r\n cssClass: string,\r\n menuContainer: HTMLElement): JQuery {\r\n let menuItemLi = $('
              • ', { 'class': `${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 $('

                ', { text: 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-user-menu\")[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 this.footerContainer = this.$el.find(\".a-main > .a-footer\")[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\r\n var userMenuDataSource = [];\r\n if (!this.options.helpMenu.hide) {\r\n userMenuDataSource.push(this.getHelpMenuDefinition());\r\n }\r\n if (this.options.userMenu.userMenuStyle !== UserMenuStyle.Hidden) {\r\n userMenuDataSource.push(this.getUserMenuDefinition());\r\n }\r\n\r\n if (!(this.options.helpMenu.hide && this.options.userMenu.userMenuStyle === UserMenuStyle.Hidden)) {\r\n\r\n $(userMenuContainer).kendoMenu({\r\n dataSource: userMenuDataSource,\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 if (this.options.userMenu.userMenuStyle !== UserMenuStyle.Hidden) {\r\n this.configureUserMenu($(userMenuContainer).find(\".a-user-menu\"));\r\n }\r\n\r\n if (!this.options.helpMenu.hide) {\r\n this.configureHelpMenu($(userMenuContainer).find(\".a-help-menu\"));\r\n }\r\n }\r\n }\r\n\r\n // Footer\r\n if (AppKitchen.GlobalSettings.showFooter) {\r\n this.createFooter();\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() {\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 if (AppKitchen.GlobalSettings.userManualEnabled)\r\n menuDefinition[\"items\"].push(\r\n { text: AppKitchen.Strings.UserManual, cssClass: \"a-user-manual-link\" });\r\n\r\n if (AppKitchen.GlobalSettings.contextSensitiveHelpEnabled && !AppKitchen.BrowserHelper.isIE())\r\n menuDefinition[\"items\"].push({\r\n text: AppKitchen.Strings.ContextSensitiveHelp,\r\n cssClass: \"a-assistant-link\"\r\n });\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.createMenuIcon(menuContainer, \"user\");\r\n\r\n // menu app\r\n if (this.options.userMenu.userMenuStyle === UserMenuStyle.Extended) {\r\n // ReSharper disable once WrongExpressionStatement\r\n new AppKitchen.Apps.ExtendedUserMenuApp(menuContainer.find(\"ul.k-menu-group\")[0],\r\n 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.createMenuIcon(menuContainer, \"help\");\r\n\r\n // about action\r\n menuContainer.find(\".a-about-link\").click(e => {\r\n e.preventDefault();\r\n new 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 title: AppKitchen.Strings.About,\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 ],\r\n modal: true,\r\n easyClose: true,\r\n center: true,\r\n windowCssClass: \"a-about-window\"\r\n });\r\n });\r\n // about action\r\n menuContainer.find(\".a-user-manual-link\").click(e => {\r\n e.preventDefault();\r\n window.open(AppKitchen.GlobalSettings.userManualUrl, \"_blank\");\r\n });\r\n\r\n if (AppKitchen.GlobalSettings.contextSensitiveHelpEnabled && !AppKitchen.BrowserHelper.isIE()) {\r\n\r\n let model = new AppKitchen.Controls.ContextSensitiveHelpModel(RoutedAppHolder.activeApp.route);\r\n let view = new AppKitchen.Controls.ContextSensitiveHelpView(model, $('body').find(\".a-help\")[0]);\r\n menuContainer.find(\".a-assistant-link\").click(e => { e.preventDefault(); model.set({ show: true }); });\r\n }\r\n }\r\n\r\n private createMenuIcon(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\", \"36px\")\r\n .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 private createFooter() {\r\n if (this.options.footerTemplate) {\r\n AppKitchen.UIHelper.renderTemplateTo(this.footerContainer, this.options.footerTemplate);\r\n } else {\r\n AppKitchen.UIHelper.renderTemplateTo(this.footerContainer,\r\n Templates.Footer,\r\n {\r\n copyright: AppKitchen.GlobalSettings.applicationCopyright,\r\n cookieSettings: `${AppKitchen.GlobalSettings.securityTokenServiceOAuthUrl}CookieSettings`,\r\n privacy: `${AppKitchen.GlobalSettings.securityTokenServiceOAuthUrl}Privacy`,\r\n imprint: `${AppKitchen.GlobalSettings.securityTokenServiceOAuthUrl}Imprint`\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?: { [key: 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 let definition: { [key: string]: any } = { text: this.label }\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,\r\n 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 &&\r\n $(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 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 this.runningApp = new this.AppClass(targetContainer, AppKitchen.OptionsHelper.merge(customOptions, this.defaultOptions));\r\n\r\n }\r\n }\r\n }\r\n}","namespace 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('HTMLEvents');\r\n evt.initEvent('resize', true, false);\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 = BrowserHelper.getUserAgent();\r\n return userAgent.indexOf(\"MSIE\") > 0 || !!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 = BrowserHelper.getUserAgent();\r\n var index = userAgent.indexOf(\"MSIE\");\r\n if (index > 0) {\r\n return parseInt(userAgent.substring(index + 5, Math.max(2, userAgent.indexOf(\".\", index))));\r\n } else if (!!navigator.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 // 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 = OptionsHelper.merge(options,\r\n {\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 = OptionsHelper.merge(options,\r\n {\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();\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(),\r\n 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 = 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 = OptionsHelper.merge(options,\r\n {\r\n push: false,\r\n refresh: false\r\n });\r\n\r\n var url = 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 BrowserHelper.setUrl(newUrl, options);\r\n }\r\n\r\n export function removeParameter(key: string, options?: RedirectOptions) {\r\n options = OptionsHelper.merge(options,\r\n {\r\n push: false,\r\n refresh: false\r\n });\r\n\r\n var url = 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 BrowserHelper.setUrl(newUrl, options);\r\n }\r\n\r\n export function clear(options?: RedirectOptions) {\r\n options = OptionsHelper.merge(options,\r\n {\r\n push: false,\r\n refresh: false\r\n });\r\n\r\n var url = BrowserHelper.getUrl();\r\n BrowserHelper.setUrl(url.split(\"?\")[0], options);\r\n }\r\n }\r\n\r\n export function getLanguage() {\r\n\r\n var language =\r\n navigator.language || // All browsers\r\n navigator['userLanguage']; // IE <= 10\r\n return language ? language.substr(0, 2) : undefined;\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(() => WindowResize.trigger());\r\n }\r\n\r\n export function setCustomFunctionsKeyBinding(evt: JQuery.KeyDownEvent, fCode: number, action: () => void) {\r\n\r\n if (evt.keyCode === fCode) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n action();\r\n return false;\r\n }\r\n }\r\n }\r\n}","namespace 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\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 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 //TODO: Verify functionality without session token cookie functionality\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}));\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}","namespace AppKitchen {\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","namespace AppKitchen {\r\n \r\n export module ExportHelper {\r\n\r\n export interface ExportChartDataToExcelDefinition {\r\n timeseriesId: string;\r\n hypothesis: string;\r\n header: string;\r\n color: string;\r\n }\r\n\r\n export function exportChartDataToExcel(chartsData: AppKitchen.Api.Models.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 && cd.hypothesis === def.hypothesis);\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 field: \"timepoint\",\r\n header: AppKitchen.Strings.ExcelExport_DateTimeColumnHeader,\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\r\n ? UIHelper.Colors.lightenHex(exportChartsData[tsIndex].color, .9)\r\n : 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.Api.Models.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}","namespace AppKitchen {\r\n\r\n export module GuidHelper {\r\n\r\n export function newGuid() {\r\n return 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, 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}","namespace AppKitchen {\r\n \r\n export module LocalStorageHelper {\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 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,\r\n (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.toString());\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 export 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}","namespace AppKitchen {\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 UIHelper.DialogBoxes.alert(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}","namespace AppKitchen {\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 {} as TOptions;\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}","namespace AppKitchen {\r\n\r\n export module PasswordHelper {\r\n\r\n export class PasswordStrength {\r\n options: PasswordStrengthOptions;\r\n $object: JQuery;\r\n\r\n constructor($object: JQuery, options: PasswordStrengthOptions) {\r\n var defaults: PasswordStrengthOptions = {\r\n shortPass: Strings.Form_PasswordComplexity_shortPass,\r\n badPass: Strings.Form_PasswordComplexity_badPass,\r\n goodPass: Strings.Form_PasswordComplexity_goodPass,\r\n strongPass: Strings.Form_PasswordComplexity_strongPass,\r\n containsUsername: Strings.Form_PasswordComplexity_containsUsername,\r\n enterPass: Strings.Form_PasswordComplexity_enterPass,\r\n notComplex: Strings.Form_PasswordComplexity_notComplex,\r\n showPercent: true,\r\n showText: true,\r\n animate: true,\r\n animateSpeed: 'fast',\r\n usernamePartialMatch: true,\r\n requiresComplexPassword: false,\r\n minimumLength: 4\r\n };\r\n this.$object = $object;\r\n this.options = $.extend({}, defaults, options);\r\n\r\n return this.init.call(this);\r\n\r\n }\r\n\r\n /**\r\n * Returns strings based on the score given.\r\n *\r\n * @param int score Score base.\r\n * @return string\r\n */\r\n scoreText(score) {\r\n\r\n if (score === -3) {\r\n return this.options.notComplex;\r\n }\r\n if (score === -1) {\r\n return this.options.shortPass;\r\n }\r\n if (score === -2) {\r\n return this.options.containsUsername;\r\n }\r\n\r\n score = score < 0 ? 0 : score;\r\n\r\n if (score < 34) {\r\n return this.options.badPass;\r\n }\r\n if (score < 68) {\r\n return this.options.goodPass;\r\n }\r\n\r\n return this.options.strongPass;\r\n }\r\n\r\n isComplex(password: string): boolean {\r\n var res = 0;\r\n\r\n if (password.match(/^(?=.*[\\d]).*$/)) {\r\n res++;\r\n }\r\n if (password.match(/^(?=.*[^\\w\\d\\s]).*$/)) {\r\n res++;\r\n }\r\n if (password.match(/^(?=.*[a-z]).*$/)) {\r\n res++;\r\n }\r\n if (password.match(/^(?=.*[A-Z]).*$/)) {\r\n res++;\r\n }\r\n\r\n return res < 3 ? false : true;\r\n }\r\n\r\n /**\r\n * Returns a value between -2 and 100 to score\r\n * the user's password.\r\n *\r\n * @param string password The password to be checked.\r\n * @param string username The username set (if options.username).\r\n * @return int\r\n */\r\n calculateScore(password: string, username: string): number {\r\n let score: number = 0;\r\n\r\n // password < options.minimumLength\r\n if (password.length < this.options.minimumLength) {\r\n return -1;\r\n }\r\n\r\n if (this.options.username) {\r\n // password === username\r\n if (password.toLowerCase() === username.toLowerCase()) {\r\n return -2;\r\n }\r\n // password contains username (and usernamePartialMatch is set to true)\r\n if (this.options.usernamePartialMatch && username.length) {\r\n var user = new RegExp(username.toLowerCase());\r\n if (password.toLowerCase().match(user)) {\r\n return -2;\r\n }\r\n }\r\n }\r\n\r\n if (this.options.requiresComplexPassword && !this.isComplex(password)) {\r\n return -3;\r\n }\r\n\r\n // password length\r\n score += password.length * 4;\r\n score += this.checkRepetition(1, password).length - password.length;\r\n score += this.checkRepetition(2, password).length - password.length;\r\n score += this.checkRepetition(3, password).length - password.length;\r\n score += this.checkRepetition(4, password).length - password.length;\r\n\r\n // password has 3 numbers\r\n if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) {\r\n score += 5;\r\n }\r\n\r\n // password has at least 2 sybols\r\n if (password.match(/(.*[^\\w\\d\\s].*[^\\w\\d\\s])/)) {\r\n score += 5;\r\n }\r\n\r\n // password has Upper and Lower chars\r\n if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {\r\n score += 10;\r\n }\r\n\r\n // password has number and chars\r\n if (password.match(/([\\w])/) && password.match(/([\\d])/)) {\r\n score += 15;\r\n }\r\n\r\n // password has number and symbol\r\n if (password.match(/([^\\w\\d\\s])/) && password.match(/([\\d])/)) {\r\n score += 15;\r\n }\r\n\r\n // password has char and symbol\r\n if (password.match(/([^\\w\\d\\s])/) && password.match(/([\\w])/)) {\r\n score += 15;\r\n }\r\n\r\n // password is just numbers or chars\r\n if (password.match(/^\\w+$/) || password.match(/^\\d+$/)) {\r\n score -= 10;\r\n }\r\n\r\n if (score > 100) {\r\n score = 100;\r\n }\r\n\r\n if (score < 0) {\r\n score = 0;\r\n }\r\n\r\n return score;\r\n }\r\n\r\n /**\r\n * Checks for repetition of characters in\r\n * a string\r\n *\r\n * @param int rLen Repetition length.\r\n * @param string str The string to be checked.\r\n * @return string\r\n */\r\n checkRepetition(rLen: number, str: string): string {\r\n var res = \"\", repeated = false;\r\n for (var i = 0; i < str.length; i++) {\r\n repeated = true;\r\n for (var j = 0; j < rLen && (j + i + rLen) < str.length; j++) {\r\n repeated = repeated && (str.charAt(j + i) === str.charAt(j + i + rLen));\r\n }\r\n if (j < rLen) {\r\n repeated = false;\r\n }\r\n if (repeated) {\r\n i += rLen - 1;\r\n repeated = false;\r\n } else {\r\n res += str.charAt(i);\r\n }\r\n }\r\n return res;\r\n }\r\n\r\n /**\r\n * Initializes the plugin creating and binding the\r\n * required layers and events.\r\n *\r\n * @return void\r\n */\r\n init() {\r\n let shown = true;\r\n let $text: JQuery;\r\n let $percentage: JQuery;\r\n var $graybar: JQuery = $('
                ').addClass('pass-graybar');\r\n var $colorbar: JQuery = $('
                ').addClass('pass-colorbar');\r\n var $insert: JQuery =\r\n $('
                ').addClass('pass-wrapper').append($graybar.append($colorbar));\r\n\r\n this.$object.parent().addClass('pass-strength-visible');\r\n if (this.options.animate) {\r\n $insert.css('display', 'none');\r\n shown = false;\r\n this.$object.parent().removeClass('pass-strength-visible');\r\n }\r\n\r\n if (this.options.showPercent) {\r\n $percentage = $('').addClass('pass-percent').text('0%');\r\n $insert.append($percentage);\r\n }\r\n\r\n if (this.options.showText) {\r\n $text = $('').addClass('pass-text').html(this.options.enterPass);\r\n $insert.append($text);\r\n }\r\n\r\n this.$object.after($insert);\r\n\r\n this.$object.keyup(() => {\r\n var username = '';\r\n if (this.options.username) {\r\n username = this.options.username.val().toString();\r\n }\r\n\r\n var score = this.calculateScore(this.$object.val().toString(), username);\r\n //this.$object.trigger('password.score', [score]);\r\n\r\n var perc = score < 0 ? 0 : score;\r\n $colorbar.css({\r\n backgroundColor: (perc < 34) ? 'red' : (perc < 68) ? 'orange' : 'green',\r\n width: perc + '%'\r\n });\r\n\r\n if (this.options.showPercent) {\r\n $percentage.html(perc + '%');\r\n }\r\n\r\n if (this.options.showText) {\r\n var text = this.scoreText(score);\r\n if (!this.$object.val().toString().length && score <= 0) {\r\n text = this.options.enterPass;\r\n }\r\n\r\n if ($text.html() !== $('
                ').html(text).html()) {\r\n $text.html(text);\r\n //this.$object.trigger('password.text', [text, score]);\r\n }\r\n }\r\n }).keyup();\r\n\r\n if (this.options.animate) {\r\n this.$object.focus(() => {\r\n if (!shown) {\r\n $insert.slideDown(this.options.animateSpeed,\r\n () => {\r\n shown = true;\r\n this.$object.parent().addClass('pass-strength-visible');\r\n });\r\n }\r\n });\r\n\r\n this.$object.blur(() => {\r\n if (!this.$object.val().toString().length && shown) {\r\n $insert.slideUp(this.options.animateSpeed,\r\n () => {\r\n shown = false;\r\n this.$object.parent().removeClass('pass-strength-visible');\r\n });\r\n }\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n }\r\n\r\n // Bind to jquery\r\n $.fn.extend({\r\n password: function(options) {\r\n return this.each(function(el) {\r\n new PasswordStrength($(this), options);\r\n });\r\n }\r\n });\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module RxEx {\r\n\r\n export class Subject extends Rx.Subject> {}\r\n\r\n export interface Observable extends Rx.IObservable> {}\r\n\r\n export interface ChangedArgs {\r\n data: T;\r\n sender: any;\r\n }\r\n\r\n export class SubjectWithPrevious extends Rx.Subject> {}\r\n\r\n export interface ObservableWithPrevious extends Rx.IObservable> {}\r\n\r\n export interface ChangedArgsWithPrevious extends ChangedArgs {\r\n previous?: T;\r\n }\r\n }\r\n}\r\n","namespace AppKitchen {\r\n\r\n export module SpreadsheetHelper {\r\n\r\n export function getColumnName(columnNumber: number): string {\r\n let dividend = columnNumber;\r\n let columnName = \"\";\r\n let modulo: number;\r\n\r\n while (dividend > 0) {\r\n modulo = (dividend - 1) % 26;\r\n columnName = String.fromCharCode(65 + modulo) + columnName;\r\n dividend = Math.floor((dividend - modulo) / 26);\r\n }\r\n\r\n return columnName;\r\n }\r\n }\r\n}","namespace AppKitchen {\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 ([\r\n \"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\"\r\n ].indexOf(key) !==\r\n -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}","namespace AppKitchen {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n export module UIHelper {\r\n\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 UIHelper.updateFullHeightGrids(container);\r\n\r\n return $(container);\r\n }\r\n\r\n export function appendTemplateTo(container: HTMLElement, template: string, content?: any): JQuery {\r\n if (content) {\r\n $(container).append(_.template(template)(content));\r\n } else {\r\n $(container).append(template);\r\n }\r\n\r\n 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 BrowserHelper.WindowResize.on(() => 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 = 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(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 = 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 () => {\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,\r\n size: string,\r\n fadeIn?: number,\r\n complete?: () => void,\r\n 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)\r\n .append(UIHelper.renderTemplate(AppKitchen.Templates.LoadingConcentricSpinner, { size: size }));\r\n } else if (loaderType && loaderType === \"circle\") {\r\n $(container).append(UIHelper.renderTemplate(AppKitchen.Templates.LoadingCircleSpinner, { size: size }));\r\n } else {\r\n $(container).append(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 () => {\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 export function number2rgbaString(num: number): string {\r\n num >>>= 0;\r\n var b = num & 0xFF,\r\n g = (num & 0xFF00) >>> 8,\r\n r = (num & 0xFF0000) >>> 16,\r\n a = ((num & 0xFF000000) >>> 24) / 255;\r\n return \"rgba(\" + [r, g, b, a].join(\",\") + \")\";\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): JQuery {\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 () => {\r\n $(targetElement).nanoScroller({ disableResize: true });\r\n });\r\n }\r\n\r\n return $(targetElement).find(\".nano-content\");\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 () => {\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 () => {\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 {\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\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,\r\n fadeOutDuration: number,\r\n fadeInDuration: number,\r\n action: () => void,\r\n after?: () => void) {\r\n $(container).animate({ opacity: 0 },\r\n fadeOutDuration,\r\n () => {\r\n action();\r\n $(container).animate({ opacity: 1 },\r\n fadeInDuration,\r\n () => {\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 = OptionsHelper.merge(options,\r\n {\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 = 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: options.animate ? options.animate : false,\r\n activate: e => {\r\n if (options.opened) {\r\n options.opened(popupWindow);\r\n }\r\n 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 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 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 () => {\r\n Responsive.update();\r\n 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 = $(UIHelper.renderTemplate(AppKitchen.Templates.WindowButton,\r\n {\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 = OptionsHelper.merge(dialogOptions,\r\n {\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 UIHelper.renderTemplateTo(container,\r\n AppKitchen.Templates.DialogBoxAlert,\r\n {\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 = Windows.openWindow(container,\r\n {\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 = OptionsHelper.merge(dialogOptions,\r\n {\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 UIHelper.renderTemplateTo(container,\r\n AppKitchen.Templates.DialogBoxConfirm,\r\n {\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 = Windows.openWindow(container,\r\n {\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 DialogBoxes.confirm(content,\r\n yes,\r\n {\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,\r\n type: AppKitchen.Controls.Popups.NotificationType,\r\n options?: AppKitchen.Controls.Popups.NotificationOptions): AppKitchen.Controls.Popups.Notification {\r\n return new AppKitchen.Controls.Popups.Notification(content,\r\n OptionsHelper.merge(options,\r\n {\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 () => {\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\", 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 BrowserHelper.WindowResize.on(() => Responsive.update());\r\n }\r\n }\r\n}","namespace 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].substring(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 removeCookie(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 sanitize(input: string): string {\r\n const escaped = encodeURIComponent(input);\r\n const decoded = decodeURIComponent(escaped);\r\n const temp = document.createElement('div');\r\n temp.textContent = decoded;\r\n return temp.innerHTML;\r\n }\r\n\r\n function setPingInterval(): void {\r\n if (AppKitchen.GlobalSettings.pingEnabled) {\r\n intervalId = window.setInterval(() =>\r\n AppKitchen.Data.ping(AppKitchen.GlobalSettings.pingTimeout * 1000, (res) => { }, (err) => { redirectToOAuth(false); }),\r\n AppKitchen.GlobalSettings.pingInterval * 1000);\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 function ensureLoginAndStart(start: () => void) {\r\n if (AppKitchen.BrowserHelper.UrlQuery.getParameter(\"claim\") != null && loginEnsured === false) {\r\n\r\n const claim = window.atob(AppKitchen.BrowserHelper.UrlQuery.getParameter(\"claim\"));\r\n const token = getParameterFromQueryString(\"token\", claim);\r\n const username = sanitize(getParameterFromQueryString(\"username\", claim));\r\n\r\n AppKitchen.BrowserHelper.UrlQuery.removeParameter(\"claim\", { refresh: false, push: true });\r\n\r\n AppKitchen.Data.setClaim(token, username, (res) => {\r\n finishLoginProcedure();\r\n start();\r\n },(err) => {\r\n AppKitchen.UIHelper.renderTemplateTo($(\"body\")[0], AppKitchen.Templates.OAuthLink, { href: getOAuthUrl(false), text: err.responseText });\r\n });\r\n\r\n } else if (AppKitchen.Data.hasSessionToken()) {\r\n\r\n AppKitchen.Data.ping(AppKitchen.GlobalSettings.pingTimeout * 1000, (result) => {\r\n if (result) {\r\n finishLoginProcedure();\r\n start();\r\n } else {\r\n redirectToOAuth(false);\r\n }\r\n }, (e) => {\r\n AppKitchen.UIHelper.renderTemplateTo($(\"body\")[0], AppKitchen.Templates.OAuthLink, { href: getOAuthUrl(false), text: e.responseText });\r\n });\r\n\r\n } else {\r\n redirectToOAuth(false);\r\n return;\r\n }\r\n }\r\n\r\n function finishLoginProcedure() {\r\n setPingInterval();\r\n loginEnsured = true;\r\n checkPasswordValidity();\r\n }\r\n\r\n export function logout(redirect: boolean) {\r\n Data.Provider.LogoutProvider.logout().then(logoutResult => {\r\n if (logoutResult && logoutResult.successfullyLoggedOut) {\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 } else {\r\n AppKitchen.UIHelper.Notifications.notify(`Can't logout. Error message: '${logoutResult.errorMessage}'`, \"warning\");\r\n }\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 decodeURIComponent(user);\r\n }\r\n }\r\n return \"-\";\r\n }\r\n\r\n /**\r\n * @deprecated Both cookies are deleted by LogoutController.cs \r\n */\r\n function removeCookie(name: string) {\r\n const domain = window.location.hostname;\r\n Cookies.remove(name);\r\n Cookies.remove(name, { domain: domain });\r\n Cookies.remove(name, { domain: `.${domain}` });\r\n }\r\n\r\n function checkPasswordValidity() {\r\n AppKitchen.Data.Api.getPasswordChangeInformation(passwordChangeInfo => {\r\n if (passwordChangeInfo.showPasswordChangeNotification) {\r\n const day = passwordChangeInfo.daysBeforeExpiring === 1 \r\n ? Strings.CheckPasswordValidity_PasswordExpireInViewDays_Day \r\n : Strings.CheckPasswordValidity_PasswordExpireInViewDays_Days;\r\n\r\n const daysBeforeExpiring = `${passwordChangeInfo.daysBeforeExpiring} ${day}`;\r\n setTimeout(() => renderPasswordExpireNotification(daysBeforeExpiring), 1000);\r\n }\r\n });\r\n }\r\n\r\n function renderPasswordExpireNotification(remainingDays: string) {\r\n const template = AppKitchen.UIHelper.renderTemplate(Templates.PasswordValidityNotification,\r\n {\r\n message: Strings.CheckPasswordValidity_PasswordExpireInViewDays_Message,\r\n subMessage: remainingDays\r\n });\r\n const notification = AppKitchen.UIHelper.Notifications.notify(template, \"info\", { title: Strings.CheckPasswordValidity_PasswordExpireInViewDays_Title });\r\n\r\n $(\".a-password-validity-notification-button\").on(\"click\", () => {\r\n notification.close();\r\n Apps.ChangePasswordApp.startChangePasswordWindow();\r\n });\r\n }\r\n }\r\n}","namespace AppKitchen {\r\n\r\n export module Starter {\r\n \r\n export function startup(targetContainer: HTMLElement, ressourcesLocations: string[], apiUrl: string, appKitchenApiUrl: string, startApp: (container: HTMLElement) => any) {\r\n var appStarted = false;\r\n var startupError = false;\r\n var globalSettingsLoaded = false;\r\n var loadedRessourcesCount = 0;\r\n \r\n // check browser version immediately and throw error if incompatible.\r\n checkBrowser();\r\n // check cookies immediately and throw error if deactivated.\r\n checkCookies();\r\n // cleanup storage immediately\r\n cleanupStorage();\r\n // update colors immediately\r\n updateColors();\r\n\r\n AppKitchen.Data.setAPIs(apiUrl, appKitchenApiUrl);\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,\r\n complete: () => startApp(targetContainer)\r\n });\r\n }\r\n }\r\n\r\n var throwStartupError = (userFriendlyMessage: string, debugMessage: string) => {\r\n startupError = true;\r\n AppKitchen.UIHelper.removeLoader(targetContainer, {fadeOut: 0});\r\n throwInternalStartupError(userFriendlyMessage, 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\";\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(\r\n (serverSettings) => {\r\n if (serverSettings.RequiresAuthentication) {\r\n AppKitchen.GlobalSettings.pingInterval = serverSettings.PingInterval;\r\n AppKitchen.GlobalSettings.pingTimeout = serverSettings.PingTimeout;\r\n AppKitchen.GlobalSettings.pingEnabled = serverSettings.PingEnabled;\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 } else {\r\n AppKitchen.GlobalSettings.requiresLogin = serverSettings.RequiresAuthentication;\r\n }\r\n AppKitchen.GlobalSettings.contextSensitiveHelpEnabled = serverSettings.ContextSensitiveHelpEnabled;\r\n AppKitchen.GlobalSettings.userManualEnabled = serverSettings.UserManualEnabled;\r\n AppKitchen.GlobalSettings.userManualUrl = serverSettings.UserManualUrl;\r\n\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 AppKitchen.GlobalSettings.showFooter = serverSettings.ShowFooter;\r\n globalSettingsLoaded = true;\r\n tryToStartApp();\r\n },\r\n (error) => throwStartupError(\"Server not reachable\", \"Failed to read global settings from server: \" + error.message));\r\n\r\n if (AppKitchen.GlobalSettings.requiresLogin) {\r\n AppKitchen.ChangeManager.startCheckForUpdates();\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\nnamespace 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 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(d => {\r\n Cache.set(key, d);\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(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}","namespace 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\nnamespace 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}","function checkBrowser() {\r\n if (AppKitchen.BrowserHelper.isIE()) {\r\n var ieVersion = AppKitchen.BrowserHelper.IEVersion();\r\n if (ieVersion && ieVersion <= 10) {\r\n throwInternalStartupError(\"Incompatible browser! App requires Internet Explorer 11 or newer.\", `Incompatible IE version ${ieVersion} detected, minimum required version is 11.`);\r\n }\r\n }\r\n}\r\n\r\nfunction checkCookies() {\r\n if (!navigator.cookieEnabled)\r\n throwInternalStartupError(\"Cookies deactivated! Please activate cookies for this session.\", \"Cookies deactivated. Activate cookies or contact your administrator.\");\r\n}\r\n\r\nfunction throwInternalStartupError(userFriendlyMessage: string, debugMessage: string) {\r\n // do not use 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\nfunction cleanupStorage() {\r\n AppKitchen.LocalStorageHelper.cleanUp();\r\n window.addEventListener(\"storage\", (e) => AppKitchen.LocalStorageHelper.storageEventHandler(e), false);\r\n}\r\n\r\nfunction getBrowserCulture() {\r\n const nav = window.navigator;\r\n const userLang = nav.language || (nav.languages ? nav.languages[0] : null);\r\n\r\n const cultures = {\r\n DE: \"de-DE\",\r\n EN: \"en-US\",\r\n FR: \"fr-FR\",\r\n }\r\n\r\n //map languages used in customer projects to load the respective Resources.xx-YY.cvs files\r\n const cultureMap = {\r\n \"de-DE\": cultures.DE,\r\n \"de\": cultures.DE,\r\n \"en-US\": cultures.EN,\r\n \"en\": cultures.EN,\r\n \"fr-FR\": cultures.FR,\r\n \"fr\": cultures.FR\r\n }\r\n\r\n let culture = cultures.EN;\r\n\r\n if (userLang && cultureMap[userLang]) {\r\n culture = cultureMap[userLang];\r\n } else {\r\n const 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\nfunction 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\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\r\n allColors.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\nfunction 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\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","interface 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 format(): 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// do not change signature! This is used in Portal as well!\r\n//TODO: verify changes!\r\nString.prototype.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}"]}