{"version":3,"sources":["webpack:///./src/Scripts/components/curves/curve-plot-filters/curve-plot-filters-kognifai.html","webpack:///./src/Scripts/components/curves/curve-points/curve-points.html","webpack:///./src/Scripts/components/curves/curve-plot-filters/curve-plot-filters.html","webpack:///./src/Scripts/viewModels/curves/filter.js","webpack:///./src/Scripts/viewModels/curves/filterGroup.js","webpack:///./src/Scripts/components/variable-select-multi/variable-select-multi-kognifai.html","webpack:///./src/Scripts/components/curves/curve-edit/curve-edit.html","webpack:///./src/Scripts/components/curves/curve-details/curve-details-kognifai.html","webpack:///./src/Scripts/components/curves/curve-data-table/curve-data-table.html","webpack:///./src/Scripts/components/curves/curve-specification/curve-specification.html","webpack:///./src/Scripts/components/curves/curve-edit/curve-edit-kognifai.html","webpack:///./src/Scripts/components/curves/curve-data-table/curve-data-table-kognifai.html","webpack:///./src/Scripts/components/curves/curves/curves-kognifai.html","webpack:///./src/Scripts/components/curves/curve-details/curve-details.js","webpack:///./src/Scripts/utilities/query-string-helper.js","webpack:///./src/Scripts/components/curves/curves/curves.js","webpack:///./src/Scripts/components/variable-select-multi/variable-select-multi.html","webpack:///./src/Scripts/viewModels/curves/curvePlotResult.js","webpack:///./src/Scripts/components/curves/curve-points/curve-points-kognifai.html","webpack:///./src/Scripts/viewModels/curves/curvePlot.js","webpack:///./src/Scripts/components/curves/curve-edit/curve-edit.js","webpack:///./src/Scripts/components/curves/curve-data-table/curve-data-table.js","webpack:///./src/Scripts/components/curves/curve-plot-filters/curve-plot-filters.js","webpack:///./src/Scripts/components/curves/curve-points/curve-points.js","webpack:///./src/Scripts/components/curves/curve-specification/curve-specification.js","webpack:///./src/Scripts/components/variable-select-multi/variable-select-multi.js","webpack:///./src/registerDelayedKnockoutComponents.ts","webpack:///./src/Scripts/components/curves/curves/curves.html","webpack:///./src/Scripts/clients/curve-plots-client.js","webpack:///./src/Scripts/utilities/curve-variable-calculations-helper.js","webpack:///./src/Scripts/viewModels/curves/curveVariable.js","webpack:///./src/Scripts/components/curves/curve-specification/curve-specification-kognifai.html","webpack:///./src/Scripts/utilities/curve-list-helper.js","webpack:///./src/Scripts/utilities/curve-filter-helper.js","webpack:///./src/Scripts/viewModels/curves/cpModule.js","webpack:///./src/Scripts/viewModels/curves/curveTimePeriod.js","webpack:///./src/Scripts/components/curves/curve-details/curve-details.html"],"names":["code","module","exports","ViewModel","availableVariablesMap","curveMode","yAxisLogVariableId","filter","timeRangeFilter","self","this","defaultToDate","moment","utc","defaultFromDate","clone","subtract","operators","variableId","ko","observable","isTimeRangeFilter","operator","value","isContinuous","continuousForInHours","timeRangeFromDateTime","dateHelper","getSubmitDateString","timeRangeToDateTime","fromDate","toDate","timeRangeFromDate","format","getDateFormat","getFormatedDateString","timeRangeToDate","timeRangeFromTime","getTimeFormat","timeRangeToTime","timeRangeComment","isVariableSelected","pureComputed","isTimeRangeFromTimeValid","fromTime","isValidTime","isTimeRangeToTimeValid","toTime","continuousForInMilliseconds","hourInMilliseconds","getFilter","unitName","hasOwnProperty","unit","caption","variableName","name","variable","filterDescription","text","isValueValid","_","isFinite","isContinuousForInHoursValid","parseFloat","isFilterValid","prototype","fromDateTime","getDateTime","toDateTime","fromInMilliseconds","getDateInMilliseconds","toInMilliseconds","formatedStartDate","getFormatedDateTimeString","formatedEndDate","timeRangeFromDateTimeInMillisecs","timeRangeToDateTimeInMillisecs","filterGroup","filterViewModels","map","Filter","push","undefined","observableArray","removeFilter","filterViewModel","remove","length","events","filterGroupEmpty","dispatch","bind","filters","isFiltersValid","every","addFilter","Vessels","getModule","VesselsModule","Store","params","curveModule","curves","currentVessel","variables","millisecondsPerHour","curvePlot","selectedCurve","timeConfigurationType","lastPeriodDays","setPeriodFromDate","setPeriodToDate","setPeriodFromTime","setPeriodToTime","periodStartAt","periodDurationInHours","dataInterval","exclusionFilterGroupViewModels","timePeriods","includedTimePeriods","variableDataList","curveData","curvePointViewModels","graphSeries","curvePlotResult","curvePlotReportResult","selectedTableTab","isInitialized","isLoadError","isVariableDataLoading","canSkipRounding","rendered","tableVisible","tableData","extend","paging","toggleTable","document","activeElement","body","blur","curve","isXAxisTimeVariable","xAxisLogVariableId","referenceCurveDataPoints","curveDataPoints","selectedFromAndToDates","getSelectedFromAndToDates","getTime","firstCurvePoint","secondCurvePoint","x","curvePointViewModel","dataPoint","sort","a","b","selectedTimeInHours","firstTimePeriod","startAt","startDate","fromAndToDates","diff","timePeriodId","selectedFromDate","selectedToDate","currentTimePeriodDate","done","isCurrentTimePeriodFirst","timePeriodEndDate","timePeriodStartDate","initialDates","getInitialTimePeriodDates","endDate","add","isSameOrAfter","TimePeriod","availableVariables","excludedFilterVariableIds","getVariableIdsFromFilters","getters","visibleVariableIds","flatten","String","each","additionaLogVariableIds","filterIds","difference","combinedVariableIds","union","contains","id","visible","filterGroups","viewModel","timeRangeFrom","timeRangeTo","curvePlotSelectedBinding","curvePlotSpecified","initializeCurvePlot","getCurveData","curveDataArray","curvePredictionHelper","getDataArrayFromDataPointObjects","curveDataStatistics","mean","getMean","std","getStd","N","curveDataXMin","isEmpty","min","point","curveDataXMax","max","referenceCurveXMin","referenceCurveXMax","XMin","XMax","curveFit","regressionOrder","curveRegressionData","getRegressionData","timeStringInSeconds","timeString","times","split","hours","Number","minutes","seconds","hoursToSeconds","hour","setSelectedTableTab","data","event","tab","target","showFilterInfoTooltip","vm","e","element","currentTarget","showTooltip","customCssClass","closeToopltip","closeTooltip","variableIds","currentDate","startTimeInSeconds","periodStartAtInSeconds","periodDurationInSeconds","currentTimePeriodDuration","milliseconds","periodStartAtSplit","periodStartAtHours","periodStartAtMinutes","roundDownDate","date","toLowerCase","newDate","second","millisecond","startOf","getCurveVariables","curveVariables","granularity","availableVariable","logVariableId","updateLoaderText","getLogVariableData","pushDataToVariabledataList","updateVariablesWithData","fail","always","setTimeout","dateTimeFormat","isFuelCurveMode","deferred","$","Deferred","curveVariable","logDataClient","findLogData","logData","logVariableName","getVariableName","logVariableDisplayName","getVariableDisplayName","find","CurveVariable","resolve","reject","arguments","promise","updatedVariableDataList","i","updatedVariable","findVariable","extendList","xAxisId","yAxisId","excludedLists","getExcludedTimes","excludedTimes","filterInfoList","visibleVariables","getVisibleVariables","addVariablesToTimePeriods","addVariableData","calculateAverages","pushAveragesToPlotGraph","variableList","filterGroupVariable","excludedData","filterHelper","displayName","calculateAverageData","variableX","variableY","timePeriod","isTimePeriodExcluded","y","yAxisVariable","average","xAxisVariable","Date","CurvePlotResult","isDataIntervalQuarter","isDataIntervalTenMinutes","curveViewModels","curveViewModel","curveId","points","CurvePoint","lastPeriodInSeconds","checkSkipRounding","exclusionFilters","exclusionFilterGroup","FilterGroup","addVariables","granularityAsHours","curveVariableCalculationsHelper","getGranularityAsMillisecond","timeSpanStart","timeSpanEnd","startingIndexFactor","endIndex","Math","ceil","previousDataTime","time","j","dataTime","getStartingIndexFactor","currentTimePeriods","addVariablesToApplicableTimePeriods","timeSpanDuration","dataTimeIntoTimeSpan","getFirstValidDataPoint","getInitialTimePeriod","roundDownTimeInMilliseconds","timePeriodIndex","granularityAsMilliseconds","range","startingIndex","floor","isDataWithinTimePeriod","isExcluded","isDataExcluded","isPartOfDataWithin","isDataOverlappingEntirePeriod","isDataEncompassed","containsExcludedTime","list","startIndex","obj","listToExtend","secondList","getExcelExport","addPredictions","getCurvePlotReportResult","curvesClient","downloadExcelReport","filterDescriptions","getFilterDescriptions","curveName","referenceValue","exponent","descriptions","description","comment","dispose","detach","templateToExport","kognifaiTemplate","template","vesselId","detailsRendered","showLoader","detailsRenderedBinding","subscribe","menuOpen","toggleMenu","curveModes","hasCurveBeenUpdated","isCurvePlotSpecified","getInitialCurveMode","isCurvesLoading","curvesInCurveMode","CurveVM","isVariablesLoading","logVariablesClient","findAvailableLogVariablesExtended","isMassFlowRateVariablesLoading","massFlowRateVariables","findMassFlowRateVariables","isSpeedVariablesLoading","speedVariables","findSpeedVariables","isCurvePlotsLoading","curvePlots","curvePlotsClient","CurvePlot","isLoading","curveCreatedBinding","curveCreated","presetChangedBinding","presetChanged","curveDeletedBinding","curveDeleted","editCurveViewModel","editCurveStartBinding","editCurveStart","editCurveDoneBinding","editCurveDone","specifiedCurvePlot","curvePlotSpecifiedBinding","sum","propertyName","isNaN","isNumber","xAxisVariableId","yAxisVariableId","predictions","getTableData","totalActualFuelConsumption","totalReferenceFuelConsumption","totalDifferenceBetweenConsumptions","totalDistanceTravelled","totalIncludedTimeInHours","totalExcludedTimeInHours","values","dataPoints","prediction","predictRegressionValue","toFixed","save","newCurvePlot","originalCurvePlot","update","create","isKognifai","existingCurves","showDuplicateCurveNameWarning","editCurve","regressionOrders","showConfirmDialog","xAxisSelectError","yAxisSelectError","yAxisSameVariableError","isExponentValid","isReferenceValueValid","hasReferenceValueError","hasExponentError","initialAdditionaLogVariableIds","xAxisVariables","curveFits","curveFitInfoText","axisText","isNegativeValuesAllowed","isReferencePointsEnabled","isXAndYAxisSelected","curveTitle","xAxisLogVariable","yAxisLogVariable","isCurveNameValid","stringHelper","isNullOrWhiteSpace","hasAtLeastTwoCurvePoints","isCurvePointsValid","isValid","isCurveValid","allowedXAxisVariables","allowedYAxisVariables","referenceValueBinding","exponentBinding","tooltips","curveDetails","curvePoints","additionalData","power","hasError","curvesToCheck","forEach","getElementById","scrollIntoView","behavior","block","removeCurveViewModel","confirmDeleteDialog","cancelDeleteDialog","showCurveFitInfoTooltip","isWide","type","title","consumptionHeaderText","yAxisUnitCaption","isUndefined","sumOfVariables","sumOfIncludedTimes","includedTimeInHours","sumOfExcludedTimes","excludedTimeInHours","isVariableDifferentFromXAndY","showExcludedDataTooltip","currentSampleSize","excludedDataInfoText","filterGroupViewModels","timeRangeFilterAdded","removeFilterGroup","filterGroupViewModel","filterGroupEmptyBinding","addFilterGroup","addTimeRangeFilter","atAnchorXAxis","newCurvePointX","newCurvePointY","errorText","isNegativeXValueAllowed","isNegativeYValueAllowed","curvePointWithError","isNewCurvePointValid","curvePoint","isNewCurvePointXValid","isNewCurvePointYValid","tableOverflowCss","cssClass","maxNumberOfRows","reversedCurvePointViewModels","reversed","reverse","removeCurvePoint","isFuelMode","addCurvePoint","months","overwriteCurvePlotName","showDuplicateCurvePlotNameWarning","vesselName","selectedCurvePlot","curvePlotViewModel","selectedDataInterval","selectedModule","isSaveCurvePlotOpen","dataIntervals","curvePlotsInCurveModule","curveInCurvePlot","isCharterPartyModule","curvesLabel","getCurvePlot","availabelVariables","variablesMap","hasSavedCurvePlot","isCurvePlotNameValid","isPeriodStartAtValid","isPeriodDurationInHoursValid","isLastPeriodDaysValid","parseInt","isExclusionFiltersValid","isSetPeriodFromTimeValid","isSetPeriodToTimeValid","hasValidCurve","any","isCurvePlotValid","curvePlotCreatedBinding","curvePlotCreated","curvePlotDeletedBinding","curvePlotDeleted","newCurveAddedBinding","selectedCurvePlotBinding","resetPresets","initializeSavedPlot","updatedCurvePlots","dataAnalysis","timeSpan","toggleSaveCurvePlot","substring","curvePlotModule","plotSpecification","showEditCurve","showAddNewCurve","plot","savePlot","saveAsNewPlot","curvePlotNameAlreadyExists","updatePlot","overwritePlot","curvePlotToOverwrite","curvePlotName","deleteCurvePlotViewModel","deletePlot","initialSelectedVariableIds","utils","unwrapObservable","selectedVariableIds","customCss","variableViewModels","viewModels","isSelected","GraphVariable","onboardSystem","selectedVariables","selectedVariablesByQueue","sortBy","selectedVariable","unselectedVariables","components","register","curveEdit","curveDataTable","curvePlotFilters","curveSpecification","variableSelectMulti","CurvePlotsClient","url","net","get","post","put","curvePlotUpdated","del","getFuelDataFromValues","currentValue","comparableValue","isReferenceData","getReferenceValue","isTimeSpanLessThanDataInterval","currentTime","endTime","timeDifferenceInHours","getTimeDifferenceInHours","timeDifferenceInDays","fuelConsumption","distance","getFuelConsumptionData","variableData","previousValue","fuelData","getWeightedData","offset","getOffset","isLastTimePeriod","weight","weightedAverageValue","calculateWeightedAverage","weightSum","weightedData","weightedAverage","getWeightedAverageOfVariableData","convertDataToReadableList","getAverageText","getIntersectionFromMultidimensionalArray","multidimensionalArray","array","index","intersection","containsTime","excludedVariableList","containsExcluded","filterDataListToSingleList","filterDataList","filterData","dataList","excluded","excludeDataInTimeRange","currentDateIndex","nextDateIndex","excludedDataList","getNextValidDate","limit","compareValueToLimit","isTimeRangeOverTimeLimit","stopIndex","filterContinuousLength","startTime","stopTime","diffTime","isValueBetweenTimeRange","getExcludedDataFromFilter","isFilterContinuous","excludedTimeRange","getExcludedVariableData","filtersContainsTimeRange","variableFilters","selectedVariableId","getExcludedTimesList","timeRangeFilterTimes","tempExcludedList","addTimesFromTimeRangeFilter","timeRangeFilters","listHelper","CpModule","distanceTravelled","actualFuelConsumption","fuelConsumptionData","variableCalculations","referenceFuelConsumption","differenceBetweenConsumptions","actual","reference","consumptionText","getDeviationFromReferenceYAxisString","extrapolatedConsumption","result","xAxisData","yAxisData","extrapolatedData","pow","timeMultiplierInSeconds","timePeriodTimeSpanInSeconds","excludedSampleSize","infoText","filterInfoText","getFilterInfoString","sampleSize","includedDataLength","excludedDataLength","dataLength","formatedTimeRangeString","findVariableById","displayExcludedDataInfo","cpModule","previousTime","simpleDifference","timeMultiplierInHours","timeConverter","secondsToHours","getExcludedDataFromFilterInfo","excludedFilterInfoData","string","filterInfo","filterTimeInHours","deviation","getDeviationFromReferenceYAxis","referenceYAxisValue","getReferenceYAxisValue","getAverageValueString","getAverageValueOfVariable","averageData","deviationFromReferenceYAxis","averageValue","additionalVariables"],"mappings":"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","file":"js/chunk-59a58171.6e1bbbf8.js","sourcesContent":["// Module\nvar code = \"
\\r\\n
\\r\\n \\r\\n

0\\\">Or

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

And

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\\r\\n
\\r\\n

\\r\\n

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

\\r\\n

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n

0\\\">Or

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

And

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\";\n// Exports\nmodule.exports = code;","import ko from \"knockout\";\r\nimport dateHelper from \"Utilities/date-helper\";\r\nimport moment from \"moment\";\r\nimport _ from \"underscore\";\r\n\r\nvar ViewModel = function (availableVariablesMap, curveMode, yAxisLogVariableId, filter, timeRangeFilter) {\r\n var self = this;\r\n var defaultToDate = moment.utc();\r\n var defaultFromDate = defaultToDate.clone().subtract(1, \"days\");\r\n\r\n self.operators = [\">\", \"<\", \"=\"];\r\n self.availableVariablesMap = availableVariablesMap;\r\n self.filter = filter;\r\n self.timeRangeFilter = timeRangeFilter;\r\n self.yAxisLogVariableId = yAxisLogVariableId;\r\n self.curveMode = curveMode;\r\n\r\n self.variableId = ko.observable(filter && !filter.isTimeRangeFilter ? filter.variableId : null);\r\n self.operator = ko.observable(filter ? filter.operator : null);\r\n self.value = ko.observable(filter ? filter.value : 0);\r\n self.isContinuous = ko.observable(filter ? filter.isContinuous : false);\r\n self.continuousForInHours = ko.observable(filter ? filter.continuousForInHours : 0);\r\n\r\n self.timeRangeFromDateTime = ko.observable(filter ? filter.timeRangeFromDateTime : dateHelper.getSubmitDateString(defaultFromDate, \"12:00\"));\r\n self.timeRangeToDateTime = ko.observable(filter ? filter.timeRangeToDateTime : dateHelper.getSubmitDateString(defaultToDate, \"12:00\"));\r\n var fromDate = moment.utc(self.timeRangeFromDateTime(), \"YYYY-MM-DDTHH:mm\");\r\n var toDate = moment.utc(self.timeRangeToDateTime(), \"YYYY-MM-DDTHH:mm\");\r\n\r\n self.timeRangeFromDate = ko.observable(filter ? fromDate.format(dateHelper.getDateFormat()) : dateHelper.getFormatedDateString(defaultFromDate));\r\n self.timeRangeToDate = ko.observable(filter ? toDate.format(dateHelper.getDateFormat()) : dateHelper.getFormatedDateString(defaultToDate));\r\n self.timeRangeFromTime = ko.observable(filter ? fromDate.format(dateHelper.getTimeFormat()) : \"12:00\");\r\n self.timeRangeToTime = ko.observable(filter ? toDate.format(dateHelper.getTimeFormat()) : \"12:00\");\r\n self.timeRangeComment = ko.observable(filter ? filter.timeRangeComment : \"\");\r\n\r\n self.isVariableSelected = ko.pureComputed(function () {\r\n if (self.variableId()) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n\r\n self.isTimeRangeFromTimeValid = ko.pureComputed(function () {\r\n var fromTime = self.timeRangeFromTime();\r\n return dateHelper.isValidTime(fromTime);\r\n });\r\n\r\n self.isTimeRangeToTimeValid = ko.pureComputed(function () {\r\n var toTime = self.timeRangeToTime();\r\n return dateHelper.isValidTime(toTime);\r\n });\r\n\r\n self.continuousForInMilliseconds = ko.pureComputed(function () {\r\n var hourInMilliseconds = 3600000;\r\n\r\n return self.continuousForInHours() * hourInMilliseconds;\r\n });\r\n\r\n self.filter = ko.pureComputed(function() {\r\n return self.getFilter();\r\n });\r\n\r\n self.unitName = ko.pureComputed(function() {\r\n var availableVariablesMap = self.availableVariablesMap();\r\n var variableId = self.variableId();\r\n var curveMode = self.curveMode().value;\r\n var yAxisLogVariableId = self.yAxisLogVariableId();\r\n\r\n if ((curveMode === \"TimeCharter\" || curveMode === \"SpotMarket\") && variableId === yAxisLogVariableId) {\r\n return \"ton/day\";\r\n } else {\r\n return availableVariablesMap.hasOwnProperty(variableId)\r\n ? availableVariablesMap[variableId].unit.caption\r\n : \"\";\r\n }\r\n });\r\n\r\n self.variableName = ko.pureComputed(function () {\r\n var availableVariablesMap = self.availableVariablesMap();\r\n var variableId = self.variableId();\r\n return availableVariablesMap.hasOwnProperty(variableId)\r\n ? availableVariablesMap[variableId].name\r\n : \"\";\r\n });\r\n\r\n self.variable = ko.pureComputed(function () {\r\n var availableVariablesMap = self.availableVariablesMap();\r\n var variableId = self.variableId();\r\n return availableVariablesMap.hasOwnProperty(variableId)\r\n ? availableVariablesMap[variableId]\r\n : null;\r\n });\r\n\r\n self.filterDescription = ko.pureComputed(function () {\r\n if (self.timeRangeFilter) {\r\n return \"Time range filter\";\r\n }\r\n var text = self.variableName() + \" \" + self.operator() + \" \"\r\n + self.value() + \" \" + self.unitName();\r\n\r\n if (self.isContinuous()) {\r\n text += \" for \" + self.continuousForInHours() + \" hours\";\r\n }\r\n return text;\r\n });\r\n\r\n self.isValueValid = ko.pureComputed(function() {\r\n var value = self.value();\r\n return _.isFinite(value);\r\n });\r\n\r\n self.isContinuousForInHoursValid = ko.pureComputed(function() {\r\n var continuousForInHours = self.continuousForInHours();\r\n return parseFloat(continuousForInHours) >= 0;\r\n });\r\n\r\n self.isFilterValid = ko.pureComputed(function() {\r\n var isValueValid = self.isValueValid();\r\n var isContinuousForInHoursValid = self.isContinuousForInHoursValid();\r\n var isTimeRangeFromTimeValid = self.isTimeRangeFromTimeValid();\r\n var isTimeRangeToTimeValid = self.isTimeRangeToTimeValid();\r\n var isVariableSelected = self.isVariableSelected();\r\n\r\n if (self.timeRangeFilter) {\r\n return isTimeRangeFromTimeValid && isTimeRangeToTimeValid;\r\n }\r\n return isValueValid && isContinuousForInHoursValid && isVariableSelected;\r\n });\r\n};\r\n\r\nViewModel.prototype.getFilter = function() {\r\n var fromDateTime = dateHelper.getDateTime(this.timeRangeFromDate(), this.timeRangeFromTime());\r\n var toDateTime = dateHelper.getDateTime(this.timeRangeToDate(), this.timeRangeToTime());\r\n var fromInMilliseconds = dateHelper.getDateInMilliseconds(fromDateTime);\r\n var toInMilliseconds = dateHelper.getDateInMilliseconds(toDateTime);\r\n var formatedStartDate = dateHelper.getFormatedDateTimeString(fromDateTime);\r\n var formatedEndDate = dateHelper.getFormatedDateTimeString(toDateTime);\r\n\r\n var filter = {\r\n variableId: this.variableId(),\r\n operator: this.operator(),\r\n value: parseFloat(this.value()),\r\n isContinuous: this.isContinuous(),\r\n continuousForInHours: parseFloat(this.continuousForInHours()),\r\n continuousForInMilliseconds: parseFloat(this.continuousForInMilliseconds()),\r\n filterDescription: this.filterDescription(),\r\n timeRangeFromDateTime: fromDateTime,\r\n timeRangeToDateTime: toDateTime,\r\n timeRangeFromDateTimeInMillisecs: fromInMilliseconds,\r\n timeRangeToDateTimeInMillisecs: toInMilliseconds,\r\n timeRangeComment: this.timeRangeComment(),\r\n isTimeRangeFilter: this.timeRangeFilter,\r\n formatedStartDate: formatedStartDate,\r\n formatedEndDate: formatedEndDate,\r\n };\r\n\r\n return filter;\r\n};\r\n\r\nexport default ViewModel;","import ko from \"knockout\";\r\nimport _ from \"underscore\";\r\nimport Filter from \"ViewModels/curves/filter\";\r\nimport events from \"App/events\";\r\n\r\nvar ViewModel = function (availableVariablesMap, curveMode, yAxisLogVariableId, filterGroup, timeRangeFilter) {\r\n var self = this;\r\n self.availableVariablesMap = availableVariablesMap;\r\n self.filterGroup = filterGroup;\r\n self.timeRangeFilter = timeRangeFilter;\r\n self.yAxisLogVariableId = yAxisLogVariableId;\r\n self.curveMode = curveMode;\r\n\r\n var filterViewModels = [];\r\n if (self.filterGroup) {\r\n var filterViewModels = _.map(self.filterGroup,\r\n function (filter) {\r\n self.timeRangeFilter = filter.isTimeRangeFilter;\r\n return new Filter(self.availableVariablesMap, curveMode, self.yAxisLogVariableId, filter, self.timeRangeFilter);\r\n });\r\n } else {\r\n filterViewModels.push(new Filter(this.availableVariablesMap, curveMode, self.yAxisLogVariableId, undefined, self.timeRangeFilter));\r\n }\r\n\r\n self.filterViewModels = ko.observableArray(filterViewModels);\r\n\r\n self.removeFilter = function(filterViewModel) {\r\n this.filterViewModels.remove(filterViewModel);\r\n if (this.filterViewModels().length === 0) {\r\n events.filterGroupEmpty.dispatch(self);\r\n }\r\n }.bind(self);\r\n\r\n self.filters = ko.pureComputed(function() {\r\n var filterViewModels = self.filterViewModels();\r\n\r\n var filters = _.map(filterViewModels,\r\n function(filterViewModel) {\r\n return filterViewModel.filter();\r\n });\r\n\r\n return filters;\r\n });\r\n\r\n self.isFiltersValid = ko.pureComputed(function() {\r\n var filterViewModels = self.filterViewModels();\r\n return _.every(filterViewModels, function(filterViewModel) { return filterViewModel.isFilterValid(); });\r\n });\r\n};\r\n\r\nViewModel.prototype.addFilter = function() {\r\n this.filterViewModels.push(new Filter(this.availableVariablesMap, this.curveMode, this.yAxisLogVariableId));\r\n};\r\n\r\nexport default ViewModel;","// Module\nvar code = \"
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\\r\\n
\\r\\n
\\r\\n

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

Curve details

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

Curve with that name already exists

\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n * Please select a variable\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n * Please select a variable\\r\\n
\\r\\n

* Required to be different from X-Axis variable

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

Curve points

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

Extrapolated consumption is based on the following formula


\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n * Please enter the pool reference speed\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n * Please enter an exponent\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n

Curve with that name already exists

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

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\\r\\n
\\r\\n

\\r\\n

\\r\\n - \\r\\n \\r\\n ()\\r\\n

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

No data is available for the selected criteria

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

Summary

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

Charter party data

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

Prediction

\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n first\\r\\n Previous\\r\\n
\\r\\n
\\r\\n

\\r\\n / \\r\\n

\\r\\n
\\r\\n
\\r\\n Next\\r\\n Last\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
From date
To date
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
Included time (hours)
Excluded time (hours)
Excluded data
\\r\\n \\r\\n

Summary

\\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\\r\\n Need help?\\r\\n
\\r\\n
\\r\\n

Saved settings

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

Settings name

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

Setting with that name already exists

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

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

Time span

\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Periods starts at\\r\\n \\r\\n With a duration of\\r\\n \\r\\n hours\\r\\n
\\r\\n
\\r\\n Use one averaged plot per\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n

Exclusion filters

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

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n

Curve details\\r\\n \\r\\n

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

Curve with that name already exists

\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
    \\r\\n
  • \\r\\n
    \\r\\n \\r\\n \\r\\n Linear\\r\\n
    \\r\\n
  • \\r\\n
  • \\r\\n
    \\r\\n \\r\\n \\r\\n Power\\r\\n
    \\r\\n
  • \\r\\n
  • \\r\\n
    \\r\\n \\r\\n \\r\\n Polynomial\\r\\n
    \\r\\n \\r\\n
    \\r\\n \\r\\n \\r\\n
    \\r\\n \\r\\n
  • \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n

Curve points\\r\\n \\r\\n

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

Additional data to display\\r\\n \\r\\n

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

Extrapolated consumption is based on the following formula


\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n * Please enter the pool reference speed\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n * Please enter an\\r\\n exponent\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
From date
To date
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
Included time (hours)
Excluded time (hours)
Excluded data
\\r\\n \\r\\n

Summary

\\r\\n \\r\\n
\\r\\n
\\r\\n first\\r\\n Previous\\r\\n
\\r\\n
\\r\\n

\\r\\n / \\r\\n

\\r\\n
\\r\\n
\\r\\n Next\\r\\n Last\\r\\n
\\r\\n
\\r\\n \\r\\n
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","import template from \"./curve-details.html\";\r\nimport kognifaiTemplate from \"./curve-details-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport _ from \"underscore\";\r\nimport moment from \"moment\";\r\nimport events from \"App/events\";\r\nimport FilterGroup from \"ViewModels/curves/filterGroup\";\r\nimport TimePeriod from \"ViewModels/curves/curveTimePeriod\";\r\nimport CurveVariable from \"ViewModels/curves/curveVariable\";\r\nimport CurvePoint from \"ViewModels/curves/curvePoint\";\r\nimport CurvePlotResult from \"ViewModels/curves/curvePlotResult\";\r\nimport dateHelper from \"Utilities/date-helper\";\r\nimport filterHelper from \"Utilities/curve-filter-helper\";\r\nimport curvesClient from \"Clients/curves-client\";\r\nimport logDataClient from \"Clients/log-data-client\";\r\nimport curvePredictionHelper from \"Utilities/curve-prediction-helper\";\r\nimport curveVariableCalculationsHelper from \"Utilities/curve-variable-calculations-helper\";\r\nimport Store from \"@/store\";\r\nimport { getModule } from \"vuex-module-decorators\";\r\nimport VesselsModule from \"@/store/clients/Vessels.module\";\r\n\r\nconst Vessels = getModule(VesselsModule, Store);\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n self.curveModule = params.curveModule;\r\n\r\n self.curves = Vessels.currentVessel.curves;\r\n self.variables = Vessels.currentVessel.variables;\r\n\r\n self.millisecondsPerHour = 3600000;\r\n\r\n self.curvePlot = ko.observable();\r\n self.name = ko.observable();\r\n self.selectedCurve = ko.observable();\r\n self.timeConfigurationType = ko.observable();\r\n self.lastPeriodDays = ko.observable();\r\n self.setPeriodFromDate = ko.observable();\r\n self.setPeriodToDate = ko.observable();\r\n self.setPeriodFromTime = ko.observable();\r\n self.setPeriodToTime = ko.observable();\r\n self.periodStartAt = ko.observable();\r\n self.periodDurationInHours = ko.observable();\r\n self.dataInterval = ko.observable();\r\n\r\n self.exclusionFilterGroupViewModels = ko.observableArray([]);\r\n self.timePeriods = ko.observableArray([]);\r\n self.includedTimePeriods = ko.observableArray([]);\r\n self.variableDataList = ko.observableArray([]);\r\n self.curveData = ko.observableArray([]);\r\n self.curvePointViewModels = ko.observableArray([]);\r\n self.graphSeries = ko.observableArray([]);\r\n self.curvePlotResult = ko.observable();\r\n self.curvePlotReportResult = ko.observable();\r\n\r\n self.selectedTableTab = ko.observable(0);\r\n self.isInitialized = ko.observable(false);\r\n self.isLoadError = ko.observable(false);\r\n self.isVariableDataLoading = ko.observable(true);\r\n //skip expensive rounding function when it isn't necessary\r\n self.canSkipRounding = true;\r\n //this observable is used by kognifai to animate in curve details after it has been rendered\r\n self.rendered = ko.observable(false);\r\n if (params.rendered)\r\n self.rendered = params.rendered;\r\n\r\n self.tableVisible = ko.observable(true);\r\n //paginated version of includedTimePeriods\r\n self.tableData = ko.observableArray([]).extend({ paging: null });\r\n self.toggleTable = function () {\r\n self.tableVisible(!self.tableVisible());\r\n //blur the button after click\r\n if (document.activeElement != document.body)\r\n document.activeElement.blur();\r\n };\r\n\r\n self.curveMode = ko.pureComputed(function() {\r\n var curveMode = self.selectedCurve().curve().curveMode;\r\n\r\n return curveMode;\r\n });\r\n\r\n self.isXAxisTimeVariable = ko.pureComputed(function () {\r\n var curve = self.selectedCurve().curve();\r\n return curve.xAxisLogVariableId === null && curve.yAxisLogVariableId;\r\n });\r\n\r\n self.referenceCurveDataPoints = ko.pureComputed(function () {\r\n var curvePointViewModels = self.curvePointViewModels();\r\n var curveDataPoints;\r\n\r\n if (self.isXAxisTimeVariable()) {\r\n var selectedFromAndToDates = self.getSelectedFromAndToDates();\r\n var fromDate = selectedFromAndToDates.fromDate.toDate().getTime();\r\n var toDate = selectedFromAndToDates.toDate.toDate().getTime();\r\n var firstCurvePoint = curvePointViewModels[0];\r\n var secondCurvePoint = curvePointViewModels[1];\r\n\r\n curvePointViewModels = [];\r\n firstCurvePoint.x(fromDate);\r\n secondCurvePoint.x(toDate);\r\n curvePointViewModels.push(firstCurvePoint);\r\n curvePointViewModels.push(secondCurvePoint);\r\n }\r\n\r\n curveDataPoints = _.map(curvePointViewModels, function (curvePointViewModel) {\r\n return curvePointViewModel.dataPoint();\r\n });\r\n\r\n curveDataPoints.sort(function (a, b) { return a[0] - b[0]; });\r\n\r\n return curveDataPoints;\r\n });\r\n\r\n self.selectedTimeInHours = ko.pureComputed(function () {\r\n var hours = 0;\r\n var timeConfigurationType = self.timeConfigurationType();\r\n var firstTimePeriod = self.timePeriods()[0];\r\n var startAt = moment.utc(firstTimePeriod.startDate).format(\"hh:mm\");\r\n var fromAndToDates = self.getSelectedFromAndToDates(startAt);\r\n var fromDate = fromAndToDates.fromDate;\r\n var toDate = fromAndToDates.toDate;\r\n\r\n return toDate.diff(fromDate, \"minutes\") / 60;\r\n });\r\n\r\n self.timePeriods = ko.pureComputed(function () {\r\n var timePeriodId = 0;\r\n var timePeriods = [];\r\n var selectedFromAndToDates = self.getSelectedFromAndToDates();\r\n var selectedFromDate = selectedFromAndToDates.fromDate;\r\n var selectedToDate = selectedFromAndToDates.toDate;\r\n var currentTimePeriodDate = selectedFromDate.clone();\r\n\r\n var done = false;\r\n var isCurrentTimePeriodFirst = self.timeConfigurationType() === \"SetPeriod\";\r\n\r\n while (!done) {\r\n var timePeriodStartDate = currentTimePeriodDate.clone();\r\n var timePeriodEndDate;\r\n\r\n if (isCurrentTimePeriodFirst) {\r\n var initialDates = self.getInitialTimePeriodDates(currentTimePeriodDate);\r\n timePeriodStartDate = initialDates.startDate;\r\n timePeriodEndDate = initialDates.endDate;\r\n currentTimePeriodDate = _.clone(timePeriodEndDate);\r\n isCurrentTimePeriodFirst = false;\r\n } else {\r\n timePeriodEndDate = currentTimePeriodDate.add(self.periodDurationInHours(), \"hours\");\r\n }\r\n\r\n if (timePeriodEndDate.isSameOrAfter(selectedToDate)) {\r\n timePeriodEndDate = selectedToDate;\r\n done = true;\r\n }\r\n\r\n if (done) {\r\n timePeriods.push(new TimePeriod(timePeriodId, self.curvePlot(), timePeriodStartDate, timePeriodEndDate,\r\n self.variableDataList(), self.referenceCurveDataPoints(), self.selectedCurve(), true));\r\n } else {\r\n timePeriods.push(new TimePeriod(timePeriodId, self.curvePlot(), timePeriodStartDate, timePeriodEndDate,\r\n self.variableDataList(), self.referenceCurveDataPoints(), self.selectedCurve()));\r\n }\r\n\r\n timePeriodId ++;\r\n }\r\n\r\n return timePeriods;\r\n });\r\n\r\n self.availableVariables = ko.pureComputed(function () {\r\n var variables = self.variables();\r\n var selectedCurve = self.selectedCurve();\r\n if (!selectedCurve) return [];\r\n\r\n var curve = selectedCurve.curve();\r\n\r\n var excludedFilterVariableIds = self.getVariableIdsFromFilters();\r\n\r\n if (Store.getters[\"User/isKognifai\"]) {\r\n var visibleVariableIds = _.flatten([\r\n String(curve.xAxisLogVariableId), String(curve.yAxisLogVariableId), _.each(curve.additionaLogVariableIds, function(variableId) {\r\n variableId = String(variableId);\r\n }),\r\n ]);\r\n } else {\r\n var visibleVariableIds = _.flatten([\r\n curve.xAxisLogVariableId, curve.yAxisLogVariableId, curve.additionaLogVariableIds,\r\n ]);\r\n }\r\n\r\n\r\n var filterIds = _.difference(excludedFilterVariableIds, visibleVariableIds);\r\n var combinedVariableIds = _.union(visibleVariableIds, filterIds);\r\n var availableVariables = [];\r\n\r\n _.each(variables, function (variable) {\r\n if (self.contains(combinedVariableIds, variable.id)) {\r\n var visible = self.contains(filterIds, variable.id);\r\n availableVariables.push({ variable: variable, visible: !visible });\r\n }\r\n });\r\n\r\n return availableVariables;\r\n });\r\n\r\n self.filterGroups = ko.pureComputed(function () {\r\n var filterGroups = [];\r\n _.each(self.exclusionFilterGroupViewModels(), function (viewModel) {\r\n filterGroups.push(viewModel.filterGroup);\r\n });\r\n\r\n return filterGroups;\r\n });\r\n\r\n self.timeRangeFrom = ko.pureComputed(function() {\r\n var fromAndToDates = self.getSelectedFromAndToDates();\r\n return dateHelper.getFormatedDateTimeString(fromAndToDates.fromDate);\r\n });\r\n\r\n self.timeRangeTo = ko.pureComputed(function() {\r\n var fromAndToDates = self.getSelectedFromAndToDates();\r\n return dateHelper.getFormatedDateTimeString(fromAndToDates.toDate);\r\n });\r\n\r\n self.curvePlotSelectedBinding = events.curvePlotSpecified.add(function (curvePlot) {\r\n self.isVariableDataLoading(true);\r\n self.initializeCurvePlot(curvePlot);\r\n self.getCurveData();\r\n self.isInitialized(true);\r\n self.rendered(false);\r\n });\r\n\r\n self.yAxisLogVariableId = ko.pureComputed(function() {\r\n var selectedCurve = self.selectedCurve();\r\n if (!selectedCurve) return null;\r\n\r\n var curve = selectedCurve.curve();\r\n if (!curve) return null;\r\n\r\n return curve.yAxisLogVariableId;\r\n });\r\n\r\n self.curveDataArray = ko.pureComputed(function() {\r\n var curveData = self.curveData();\r\n if (curveData.length === 0) return [];\r\n return curvePredictionHelper.getDataArrayFromDataPointObjects(curveData);\r\n });\r\n\r\n self.curveDataStatistics = ko.pureComputed(function() {\r\n var curveDataArray = self.curveDataArray();\r\n var mean = curvePredictionHelper.getMean(curveDataArray);\r\n var std = curvePredictionHelper.getStd(curveDataArray, mean);\r\n var N = curveDataArray.length;\r\n\r\n var curveDataStatistics = {\r\n mean: mean,\r\n std: std,\r\n N: N,\r\n };\r\n return curveDataStatistics;\r\n });\r\n\r\n self.curveDataXMin = ko.pureComputed(function() {\r\n var curveDataArray = self.curveDataArray();\r\n if (_.isEmpty(curveDataArray)) return null;\r\n\r\n return _.min(curveDataArray, function(point) {\r\n return point[0];\r\n })[0];\r\n });\r\n\r\n self.curveDataXMax = ko.pureComputed(function() {\r\n var curveDataArray = self.curveDataArray();\r\n if (_.isEmpty(curveDataArray)) return null;\r\n\r\n return _.max(curveDataArray, function(point) {\r\n return point[0];\r\n })[0];\r\n });\r\n\r\n self.referenceCurveXMin = ko.pureComputed(function() {\r\n var referenceCurveDataPoints = self.referenceCurveDataPoints();\r\n if (_.isEmpty(referenceCurveDataPoints)) return null;\r\n\r\n return _.min(referenceCurveDataPoints, function(point) {\r\n return point[0];\r\n })[0];\r\n });\r\n\r\n self.referenceCurveXMax = ko.pureComputed(function() {\r\n var referenceCurveDataPoints = self.referenceCurveDataPoints();\r\n if (_.isEmpty(referenceCurveDataPoints)) return null;\r\n\r\n return _.max(referenceCurveDataPoints, function(point) {\r\n return point[0];\r\n })[0];\r\n });\r\n\r\n self.XMin = ko.pureComputed(function() {\r\n var curveDataXMin = self.curveDataXMin();\r\n var referenceCurveXMin = self.referenceCurveXMin();\r\n\r\n if (_.isFinite(curveDataXMin) && !_.isFinite(referenceCurveXMin)) return curveDataXMin;\r\n if (!_.isFinite(curveDataXMin) && _.isFinite(referenceCurveXMin)) return referenceCurveXMin;\r\n\r\n return referenceCurveXMin < curveDataXMin ? referenceCurveXMin : curveDataXMin;\r\n });\r\n\r\n self.XMax = ko.pureComputed(function() {\r\n var curveDataXMax = self.curveDataXMax();\r\n var referenceCurveXMax = self.referenceCurveXMax();\r\n\r\n if (_.isFinite(curveDataXMax) && !_.isFinite(referenceCurveXMax)) return curveDataXMax;\r\n if (!_.isFinite(curveDataXMax) && _.isFinite(referenceCurveXMax)) return referenceCurveXMax;\r\n\r\n return referenceCurveXMax > curveDataXMax ? referenceCurveXMax : curveDataXMax;\r\n });\r\n\r\n self.curveFit = ko.pureComputed(function() {\r\n var selectedCurve = self.selectedCurve();\r\n var curve = selectedCurve.curve();\r\n return curve.curveFit;\r\n });\r\n\r\n self.regressionOrder = ko.pureComputed(function() {\r\n var selectedCurve = self.selectedCurve();\r\n var curve = selectedCurve.curve();\r\n return curve.regressionOrder;\r\n });\r\n\r\n self.curveRegressionData = ko.pureComputed(function() {\r\n var curveDataArray = self.curveDataArray();\r\n var curveFit = self.curveFit();\r\n var regressionOrder = self.regressionOrder();\r\n\r\n if (curveDataArray.length < 2) return null;\r\n\r\n return curvePredictionHelper.getRegressionData(curveDataArray, curveFit, regressionOrder);\r\n });\r\n}\r\n\r\nViewModel.prototype.setSelectedTableTab = function (data, event) {\r\n var tab = this.selectedTableTab();\r\n\r\n if (event.target.id === \"curveTableTab0\") {\r\n tab = 0;\r\n } else if (event.target.id === \"curveTableTab1\") {\r\n tab = 1;\r\n } else if (event.target.id === \"curveTableTab2\") {\r\n tab = 2;\r\n }\r\n\r\n this.selectedTableTab(tab);\r\n};\r\n\r\nViewModel.prototype.showFilterInfoTooltip = function (vm, e) {\r\n var element = e.currentTarget;\r\n events.showTooltip.dispatch(\"tooltip-text\", { text: vm.timeRangeComment, customCssClass: \"\" }, element);\r\n};\r\n\r\nViewModel.prototype.closeToopltip = function () {\r\n events.closeTooltip.dispatch();\r\n};\r\n\r\nViewModel.prototype.getVariableIdsFromFilters = function () {\r\n var self = this;\r\n var variableIds = [];\r\n _.each(this.filterGroups(), function (filterGroup) {\r\n _.each(filterGroup, function (filter) {\r\n if (!filter.timeRangeFilter && !self.contains(variableIds, filter.variableId)) {\r\n if (Store.getters[\"User/isKognifai\"]) {\r\n variableIds.push(String(filter.variableId));\r\n } else {\r\n variableIds.push(filter.variableId);\r\n }\r\n }\r\n });\r\n });\r\n\r\n return variableIds;\r\n};\r\n\r\nViewModel.prototype.getInitialTimePeriodDates = function (currentDate) {\r\n var self = this;\r\n var startDate;\r\n var endDate;\r\n var startTimeInSeconds = timeStringInSeconds(self.setPeriodFromTime());\r\n var periodStartAtInSeconds = timeStringInSeconds(self.periodStartAt());\r\n var difference = periodStartAtInSeconds - startTimeInSeconds;\r\n\r\n startDate = dateHelper\r\n .getDateTime(self.setPeriodFromDate(), self.setPeriodFromTime());\r\n\r\n if (difference > 0) {\r\n endDate = startDate.clone().add(difference, \"seconds\");\r\n } else {\r\n var periodDurationInSeconds = hoursToSeconds(self.periodDurationInHours());\r\n var currentTimePeriodDuration = periodDurationInSeconds + difference;\r\n endDate = startDate.clone().add(currentTimePeriodDuration, \"seconds\");\r\n currentDate.add(self.periodDurationInHours(), \"hours\");\r\n }\r\n\r\n return { startDate: startDate, endDate: endDate };\r\n};\r\n\r\nViewModel.prototype.getSelectedFromAndToDates = function (periodStartAt) {\r\n var fromDate = moment.utc().seconds(0).milliseconds(0);\r\n var toDate = moment.utc().seconds(0).milliseconds(0);\r\n\r\n if (this.timeConfigurationType() === \"SetPeriod\") {\r\n fromDate = dateHelper.getDateTime(this.setPeriodFromDate(), this.setPeriodFromTime());\r\n toDate = dateHelper.getDateTime(this.setPeriodToDate(), this.setPeriodToTime());\r\n } else {\r\n var periodStartAtSplit = this.periodStartAt().split(\":\");\r\n var periodStartAtHours = periodStartAtSplit[0];\r\n var periodStartAtMinutes = periodStartAtSplit[1];\r\n fromDate.hours(periodStartAtHours);\r\n fromDate.minutes(periodStartAtMinutes);\r\n fromDate.subtract(this.lastPeriodDays(), \"days\");\r\n }\r\n\r\n return { fromDate: fromDate, toDate: toDate };\r\n};\r\n\r\nViewModel.prototype.roundDownDate = function(date) {\r\n var dataInterval = this.dataInterval().toLowerCase();\r\n var newDate = date.clone();\r\n\r\n var minutes = newDate.minutes();\r\n if (dataInterval === \"minute\") {\r\n return date;\r\n } else if (dataInterval === \"quarterhour\" || dataInterval === \"quarter\") {\r\n newDate.subtract(minutes % 15, \"minutes\");\r\n newDate.second(0);\r\n newDate.millisecond(0);\r\n } else if (dataInterval === \"tenminutes\") {\r\n newDate.subtract(minutes % 10, \"minutes\");\r\n newDate.second(0);\r\n newDate.millisecond(0);\r\n } else if (dataInterval === \"hour\") {\r\n newDate = newDate.startOf(\"hour\");\r\n }\r\n\r\n return newDate;\r\n};\r\n\r\nViewModel.prototype.getCurveVariables = function () {\r\n var self = this;\r\n var curveVariables = [];\r\n var availableVariables = self.availableVariables();\r\n var granularity = self.dataInterval();\r\n\r\n _.each(availableVariables, function (availableVariable) {\r\n var variable = availableVariable.variable;\r\n var fromAndToDates = self.getSelectedFromAndToDates(self.setPeriodFromTime);\r\n var fromDate = self.roundDownDate(fromAndToDates.fromDate);\r\n\r\n fromDate = fromDate.format(\"YYYY-MM-DDTHH:mm\");\r\n var toDate = fromAndToDates.toDate.format(\"YYYY-MM-DDTHH:mm\");\r\n\r\n curveVariables.push({ logVariableId: variable.id, fromDate: fromDate, toDate: toDate, granularity: granularity });\r\n });\r\n\r\n return curveVariables;\r\n};\r\n\r\nViewModel.prototype.getCurveData = function () {\r\n var self = this;\r\n var curveVariables = this.getCurveVariables();\r\n var xAxisId = this.selectedCurve().curve().xAxisLogVariableId;\r\n var yAxisId = this.selectedCurve().curve().yAxisLogVariableId;\r\n var tmpVariableDataList = [];\r\n events.updateLoaderText.dispatch(\"Loading data\");\r\n this.getLogVariableData(curveVariables).done(function(variableDataList) {\r\n self.pushDataToVariabledataList(variableDataList);\r\n self.updateVariablesWithData();\r\n }).fail(function () {\r\n self.isLoadError(true);\r\n }).always(function() {\r\n self.isVariableDataLoading(false);\r\n //push to bottom of call stack so the animation is triggered after elements are added to dom\r\n setTimeout(function() {\r\n self.rendered(true);\r\n }, 0);\r\n });\r\n};\r\n\r\nViewModel.prototype.getLogVariableData = function(curveVariables) {\r\n var self = this;\r\n var granularity = curveVariables[0].granularity;\r\n var variableDataList = [];\r\n var continuationFilters = [];\r\n var dateTimeFormat = \"UnixEpochMs\";\r\n var yAxisLogVariableId = this.selectedCurve().curve().yAxisLogVariableId;\r\n var curveMode = self.curveMode();\r\n var isFuelCurveMode = curveMode === \"TimeCharter\" || curveMode === \"SpotMarket\";\r\n\r\n var deferred = $.Deferred();\r\n\r\n _.each(curveVariables, function (curveVariable) {\r\n // If curve mode is Time Charter or Spot Market, the y-axis has to be in ton/day unit\r\n var unitName = isFuelCurveMode && curveVariable.logVariableId === yAxisLogVariableId ? \"Ton(m)/Day\" : null;\r\n logDataClient.findLogData(curveVariable.logVariableId, curveVariable.fromDate, curveVariable.toDate, granularity, dateTimeFormat, unitName).done(function(logData) {\r\n var logVariableId = logData.filter.logVariableId;\r\n var logVariableName = self.getVariableName(logVariableId);\r\n var logVariableDisplayName = self.getVariableDisplayName(logVariableId);\r\n var data = logData.data;\r\n\r\n // Update variable's unit\r\n var variable = _.find(self.variables(), function(variable) {\r\n return variable.id === logVariableId;\r\n });\r\n variable.unit = logData.unit;\r\n\r\n variableDataList.push(new CurveVariable(logVariableId, data, [], 0, logVariableName, logVariableDisplayName));\r\n\r\n if (variableDataList.length === curveVariables.length) {\r\n deferred.resolve(variableDataList);\r\n }\r\n }).fail(function() {\r\n deferred.reject(arguments);\r\n });\r\n });\r\n\r\n return deferred.promise();\r\n};\r\n\r\nViewModel.prototype.pushDataToVariabledataList = function (updatedVariableDataList) {\r\n var self = this;\r\n var variableDataList = this.variableDataList();\r\n\r\n if (variableDataList.length === 0) {\r\n this.variableDataList(updatedVariableDataList);\r\n } else {\r\n // TODO: Will we ever go here? Doesn't seem like :/\r\n for (var i = 0; i < updatedVariableDataList.length; i++) {\r\n var updatedVariable = updatedVariableDataList[i];\r\n var variable = self.findVariable(variableDataList, updatedVariable.id);\r\n\r\n if (variable) {\r\n extendList(variable.data, updatedVariable.data);\r\n } else {\r\n variableDataList.push(updatedVariable);\r\n }\r\n }\r\n }\r\n};\r\n\r\nViewModel.prototype.updateVariablesWithData = function () {\r\n var self = this;\r\n var xAxisId = this.selectedCurve().curve().xAxisLogVariableId;\r\n var yAxisId = this.selectedCurve().curve().yAxisLogVariableId;\r\n var excludedLists = self.getExcludedTimes();\r\n var excludedTimes = excludedLists.excludedTimes;\r\n var filterInfoList = excludedLists.filterInfoList;\r\n\r\n var visibleVariables = self.getVisibleVariables();\r\n self.addVariablesToTimePeriods(visibleVariables, filterInfoList);\r\n self.addVariableData(excludedTimes, visibleVariables);\r\n\r\n self.calculateAverages();\r\n self.pushAveragesToPlotGraph(xAxisId, yAxisId);\r\n};\r\n\r\nViewModel.prototype.getVisibleVariables = function () {\r\n var self = this;\r\n var variableList = [];\r\n var variableDataList = this.variableDataList();\r\n var availableVariables = this.availableVariables();\r\n\r\n variableList = _.filter(variableDataList, function (variable) {\r\n var availableVariable = self.findVariable(availableVariables, variable.id);\r\n if (availableVariable && availableVariable.visible) {\r\n variable.unit = availableVariable.variable.unit;\r\n return availableVariable.visible;\r\n }\r\n\r\n });\r\n return variableList;\r\n};\r\n\r\nViewModel.prototype.getExcludedTimes = function () {\r\n var self = this;\r\n var variableDataList = this.variableDataList();\r\n var filterGroups = this.filterGroups();\r\n if (Store.getters[\"User/isKognifai\"]) {\r\n _.each(filterGroups, function (filterGroup) {\r\n _.each(filterGroup, function (filterGroupVariable) {\r\n filterGroupVariable.variableId = String(filterGroupVariable.variableId);\r\n });\r\n });\r\n }\r\n var excludedData = filterHelper.getExcludedTimes(filterGroups, variableDataList);\r\n\r\n return { excludedTimes: excludedData.excludedTimes, filterInfoList: excludedData.filterInfoList };\r\n};\r\n\r\nViewModel.prototype.getVariableName = function(logVariableId) {\r\n var availableVariables = this.availableVariables();\r\n var variable = this.findVariable(availableVariables, logVariableId);\r\n\r\n return variable.variable.name;\r\n};\r\n\r\nViewModel.prototype.getVariableDisplayName = function(logVariableId) {\r\n var availableVariables = this.availableVariables();\r\n var variable = this.findVariable(availableVariables, logVariableId);\r\n\r\n return variable.variable.displayName ?? variable.variable.name;\r\n};\r\n\r\nViewModel.prototype.calculateAverages = function () {\r\n var timePeriods = this.timePeriods();\r\n for (var i = 0; i < timePeriods.length; i++) {\r\n timePeriods[i].calculateAverageData();\r\n }\r\n};\r\n\r\nViewModel.prototype.pushAveragesToPlotGraph = function (variableX, variableY) {\r\n var self = this;\r\n var timePeriods = this.timePeriods();\r\n var curveMode = self.curveMode();\r\n var curveModule = self.curveModule();\r\n var curveData = [];\r\n for (var i = 0; i < timePeriods.length; i++) {\r\n var timePeriod = timePeriods[i];\r\n if (!timePeriod.isTimePeriodExcluded()) {\r\n if (self.isXAxisTimeVariable()) {\r\n curveData.push({ x: timePeriod.startDate, y: timePeriod.yAxisVariable().average, timePeriod: timePeriod });\r\n }\r\n else if (!timePeriod.xAxisVariable()) {\r\n curveData.push({ x: new Date().getTime(), y: timePeriod.yAxisVariable().average, timePeriod: timePeriod });\r\n } else {\r\n curveData.push({ x: timePeriod.xAxisVariable().average, y: timePeriod.yAxisVariable().average, timePeriod: timePeriod });\r\n }\r\n }\r\n self.includedTimePeriods.push(timePeriod);\r\n }\r\n self.tableData(self.includedTimePeriods());\r\n self.curveData(curveData);\r\n\r\n self.curvePlotResult(new CurvePlotResult(self.includedTimePeriods(), self.getVisibleVariables(), curveMode, variableX, variableY, curveModule));\r\n};\r\n\r\nViewModel.prototype.initializeCurvePlot = function (curvePlot) {\r\n var self = this;\r\n var isDataIntervalQuarter = curvePlot.dataInterval === \"Quarter\";\r\n var dataInterval = isDataIntervalQuarter ? \"quarterHour\" : curvePlot.dataInterval;\r\n var isDataIntervalTenMinutes = curvePlot.dataInterval === \"tenminutes\";\r\n dataInterval = isDataIntervalTenMinutes ? \"TenMinutes\" : dataInterval;\r\n self.curveData([]);\r\n self.includedTimePeriods([]);\r\n self.variableDataList([]);\r\n self.selectedTableTab(0);\r\n\r\n self.curvePlot(curvePlot);\r\n self.name(curvePlot.name);\r\n self.dataInterval(dataInterval);\r\n\r\n var curveViewModels = self.curves();\r\n self.selectedCurve(_.find(curveViewModels, function (curveViewModel) {\r\n return curveViewModel.curve().id === curvePlot.curveId;\r\n }));\r\n\r\n var curvePointViewModels = _.map(self.selectedCurve().curve().points, function (point) {\r\n return new CurvePoint(point);\r\n });\r\n self.curvePointViewModels(curvePointViewModels);\r\n\r\n self.timeConfigurationType(curvePlot.timeConfigurationType);\r\n self.lastPeriodDays(curvePlot.lastPeriodInSeconds / 24 / 60 / 60);\r\n\r\n self.setPeriodFromDate(dateHelper.getFormatedDateString(curvePlot.setPeriodFromDate));\r\n self.setPeriodToDate(dateHelper.getFormatedDateString(curvePlot.setPeriodToDate));\r\n\r\n self.setPeriodFromTime(curvePlot.setPeriodFromTime);\r\n self.setPeriodToTime(curvePlot.setPeriodToTime);\r\n\r\n self.periodStartAt(curvePlot.periodStartAt);\r\n self.checkSkipRounding();\r\n self.periodDurationInHours(curvePlot.periodDurationInHours);\r\n //For future reference, in kognifai, we may add one average plot per 6 or 12 hours,\r\n // in that case, we can add autodetect/set dataInterval function here\r\n\r\n var curveMode = self.selectedCurve().curve().curveMode;\r\n var exclusionFilterGroupViewModels = _.map(curvePlot.exclusionFilters,\r\n function (exclusionFilterGroup) {\r\n return new FilterGroup(self.availableVariablesMap, curveMode, self.yAxisLogVariableId, exclusionFilterGroup);\r\n });\r\n self.exclusionFilterGroupViewModels(exclusionFilterGroupViewModels);\r\n};\r\n\r\nViewModel.prototype.addVariablesToTimePeriods = function (variables, filterInfoList) {\r\n var timePeriods = this.timePeriods();\r\n for (var i = 0; i < timePeriods.length; i++) {\r\n timePeriods[i].addVariables(variables, filterInfoList);\r\n }\r\n};\r\n\r\nViewModel.prototype.addVariableData = function (excludedTimes, variableDataList) {\r\n var self = this;\r\n var granularityAsHours = (curveVariableCalculationsHelper.getGranularityAsMillisecond(self.dataInterval())) / self.millisecondsPerHour;\r\n var timeSpanStart = self.timePeriods()[0].startDate;\r\n var timeSpanEnd = self.timePeriods()[self.timePeriods().length - 1].endDate;\r\n\r\n for (var i = 0; i < variableDataList.length; i++) {\r\n var variable = variableDataList[i];\r\n if (variable.data.length > 0) {\r\n var startingIndexFactor = 0;\r\n\r\n var endIndex = Math.ceil(granularityAsHours / self.periodDurationInHours() + 1);\r\n\r\n var previousDataTime = variable.data[0].time;\r\n\r\n for (var j = 0; j < variable.data.length; j++) {\r\n var data = variable.data[j];\r\n var dataTime = data.time;\r\n\r\n //If there's a missing data gap\r\n if (dataTime - previousDataTime > self.periodDurationInHours() * self.millisecondsPerHour) {\r\n endIndex = self.timePeriods().length;\r\n }\r\n\r\n if (j > 0) {\r\n startingIndexFactor = self.getStartingIndexFactor(data.time, timeSpanStart, timeSpanEnd);\r\n }\r\n\r\n var currentTimePeriods = self.addVariablesToApplicableTimePeriods(data, variable.id, self.dataInterval(), startingIndexFactor, endIndex, excludedTimes);\r\n endIndex = currentTimePeriods.endIndex;\r\n previousDataTime = data.time;\r\n }\r\n }\r\n }\r\n};\r\n\r\nViewModel.prototype.getStartingIndexFactor = function (dataTime, timeSpanStart, timeSpanEnd) {\r\n var timeSpanDuration = timeSpanEnd - timeSpanStart;\r\n var dataTimeIntoTimeSpan = dataTime - timeSpanStart;\r\n return dataTimeIntoTimeSpan / timeSpanDuration;\r\n};\r\n\r\nViewModel.prototype.getFirstValidDataPoint = function (data) {\r\n var timePeriod = this.timePeriods()[0];\r\n for (var i = 0; i < data.length; i++) {\r\n if (data[i].time >= timePeriod.startDate) {\r\n return data[i];\r\n }\r\n }\r\n};\r\n\r\nViewModel.prototype.getInitialTimePeriod = function (time) {\r\n var self = this;\r\n var timePeriods = this.timePeriods();\r\n for (var i = 0; i < timePeriods.length; i++) {\r\n var timePeriod = timePeriods[i];\r\n var startDate;\r\n //When period starts at XX:00 and granularity is 1 hour, there is no point\r\n //running the very expensive roundDownTimeInMilliseconds.\r\n //8000 timePeriods takes 16 seconds with and 1 second without this function\r\n if (self.canSkipRounding)\r\n startDate = timePeriod.startDate;\r\n else\r\n startDate = self.roundDownTimeInMilliseconds(timePeriod.startDate);\r\n\r\n if (time >= startDate && time < timePeriod.endDate) {\r\n return {timePeriod: timePeriod, timePeriodIndex: i};\r\n }\r\n }\r\n};\r\n\r\nViewModel.prototype.addVariablesToApplicableTimePeriods = function (data, variableId, granularity, startingIndexFactor, endIndex, excludedTimes) {\r\n var self = this;\r\n var granularityAsHours = (curveVariableCalculationsHelper.getGranularityAsMillisecond(self.dataInterval())) / self.millisecondsPerHour;\r\n var timePeriods = this.timePeriods();\r\n var granularityAsMilliseconds = curveVariableCalculationsHelper.getGranularityAsMillisecond(granularity);\r\n\r\n var range = Math.ceil(granularityAsHours / self.periodDurationInHours() + 1);\r\n\r\n if (endIndex > timePeriods.length) {\r\n endIndex = timePeriods.length;\r\n }\r\n\r\n var startingIndex = Math.floor( startingIndexFactor * ( self.timePeriods().length - 1 ) );\r\n\r\n for (var i = startingIndex; i < endIndex; i++) {\r\n var timePeriod = timePeriods[i];\r\n var dataTime = self.roundDownTimeInMilliseconds(+data.time);\r\n\r\n if (timePeriod) {\r\n var isDataWithinTimePeriod = self.isDataWithinTimePeriod(dataTime, granularityAsMilliseconds, timePeriod);\r\n }\r\n\r\n if (isDataWithinTimePeriod) {\r\n var isExcluded = self.isDataExcluded(excludedTimes, data);\r\n timePeriod.addVariableData(data, variableId, isExcluded);\r\n startingIndex = i;\r\n }\r\n }\r\n\r\n return { endIndex: startingIndex + range };\r\n};\r\n\r\nViewModel.prototype.isDataWithinTimePeriod = function (dataTime, granularityAsMilliseconds, timePeriod) {\r\n var isPartOfDataWithin = dataTime >= timePeriod.startDate && dataTime < timePeriod.endDate;\r\n var isDataOverlappingEntirePeriod = dataTime <= timePeriod.startDate && (+dataTime + granularityAsMilliseconds) >= timePeriod.endDate;\r\n var isDataEncompassed = (dataTime + granularityAsMilliseconds) > timePeriod.startDate && (dataTime + granularityAsMilliseconds) < timePeriod.endDate;\r\n return isPartOfDataWithin || isDataOverlappingEntirePeriod || isDataEncompassed;\r\n};\r\n\r\nViewModel.prototype.roundDownTimeInMilliseconds = function(milliseconds) {\r\n var date = moment.utc(milliseconds);\r\n date = this.roundDownDate(date);\r\n return date.toDate().getTime();\r\n};\r\n\r\nViewModel.prototype.isDataExcluded = function (excludedTimes, value) {\r\n for (var i = 0; i < excludedTimes.length; i++) {\r\n if (excludedTimes[i] === value.time) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nViewModel.prototype.findVariable = function (variables, id) {\r\n for (var i = 0; i < variables.length; i++) {\r\n var variable = variables[i];\r\n if (variable.variable) {\r\n if (variable.variable.id === id) {\r\n return variable;\r\n }\r\n } else {\r\n if (variable[i].id === id) {\r\n return variable;\r\n }\r\n }\r\n }\r\n};\r\n\r\nViewModel.prototype.containsExcludedTime = function (list, time, startIndex, endIndex) {\r\n if (list.length === 0) {\r\n return false;\r\n }\r\n if (startIndex < 0) {\r\n return false;\r\n }\r\n for (var i = startIndex; i < endIndex; i++) {\r\n if (list[i] === time) {\r\n return true;\r\n }\r\n }\r\n};\r\n\r\nViewModel.prototype.contains = function(list, obj) {\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i] === obj) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nViewModel.prototype.extendList = function (listToExtend, secondList) {\r\n for (var i = 0; i < secondList.length; i++) {\r\n listToExtend.push(secondList[i]);\r\n }\r\n};\r\n\r\nViewModel.prototype.getExcelExport = function() {\r\n var curvePlotResult = this.curvePlotResult();\r\n var curveDataArray = this.curveDataArray();\r\n var curve = this.selectedCurve().curve();\r\n\r\n curvePlotResult.addPredictions(curve.points, curveDataArray, curve.curveFit, curve.regressionOrder);\r\n curvePlotResult.curvePlotReportResult = this.getCurvePlotReportResult();\r\n\r\n curvesClient.downloadExcelReport(curvePlotResult);\r\n};\r\n\r\nViewModel.prototype.getCurvePlotReportResult = function () {\r\n var curve = this.selectedCurve().curve();\r\n\r\n var curvePlotReportResult = {\r\n fromDate: this.timeRangeFrom(),\r\n toDate: this.timeRangeTo(),\r\n selectedTimeInHours: this.selectedTimeInHours(),\r\n referenceCurveDataPoints: this.referenceCurveDataPoints(),\r\n graphSeries: this.graphSeries(),\r\n filterDescriptions: this.getFilterDescriptions(),\r\n curveName: curve.name,\r\n referenceValue: curve.referenceValue,\r\n exponent: curve.exponent,\r\n };\r\n\r\n return curvePlotReportResult;\r\n};\r\n\r\nViewModel.prototype.getFilterDescriptions = function() {\r\n var filterGroups = this.filterGroups();\r\n\r\n var filterDescriptions = [];\r\n _.each(filterGroups, function(filterGroup) {\r\n var descriptions = _.map(filterGroup, function (filter) {\r\n if (filter.isTimeRangeFilter) {\r\n var formatedStartDate = filter.formatedStartDate;\r\n var formatedEndDate = filter.formatedEndDate;\r\n\r\n return {\r\n description: \"From date: \" + formatedStartDate + \" To date: \" + formatedEndDate,\r\n comment: filter.timeRangeComment,\r\n };\r\n }\r\n\r\n return { description: filter.filterDescription };\r\n });\r\n\r\n filterDescriptions.push(descriptions);\r\n });\r\n\r\n return filterDescriptions;\r\n};\r\n\r\nViewModel.prototype.checkSkipRounding = function () {\r\n if (this.periodStartAt().split(\":\")[1] !== \"00\"\r\n || this.dataInterval().toLowerCase() !== \"hour\")\r\n this.canSkipRounding = false;\r\n};\r\n\r\nViewModel.prototype.dispose = function () {\r\n this.curvePlotSelectedBinding.detach();\r\n};\r\n\r\nfunction timeStringInSeconds(timeString) {\r\n var times = timeString.split(\":\");\r\n var hours = Number(times[0]);\r\n var minutes = Number(times[1]);\r\n\r\n var seconds = (hours * 60 * 60) + (minutes * 60);\r\n\r\n return seconds;\r\n}\r\n\r\nfunction hoursToSeconds(hour) {\r\n hour = Number(hour);\r\n\r\n return hour * 60 * 60;\r\n}\r\n\r\nvar templateToExport = (Store.getters[\"User/isKognifai\"]) ? kognifaiTemplate : template;\r\n\r\nexport default {viewModel: ViewModel, template: templateToExport};\r\n","function getParameter(name) {\r\n var query = window.location.search.substring(1);\r\n var vars = query.split(\"&\");\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split(\"=\");\r\n if (pair[0] == name) {\r\n return pair[1];\r\n }\r\n }\r\n return (false);\r\n}\r\n\r\nexport default {\r\n getParameter: function(name) {\r\n return getParameter(name);\r\n },\r\n};","import template from \"./curves.html\";\r\nimport kognifaiTemplate from \"./curves-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport _ from \"underscore\";\r\nimport events from \"App/events\";\r\nimport logVariablesClient from \"Clients/log-variables-client\";\r\nimport curvesClient from \"Clients/curves-client\";\r\nimport curvePlotsClient from \"Clients/curve-plots-client\";\r\nimport CurveVM from \"ViewModels/curves/curve\";\r\nimport CurvePlot from \"ViewModels/curves/curvePlot\";\r\nimport queryStringHelper from \"Utilities/query-string-helper\";\r\nimport Store from \"@/store\";\r\nimport { getModule } from \"vuex-module-decorators\";\r\nimport VesselsModule from \"@/store/clients/Vessels.module\";\r\n\r\nconst Vessels = getModule(VesselsModule, Store);\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n var vesselId = Vessels.currentVessel.id;\r\n self.curveModule = ko.observable(params.curveModule);\r\n self.detailsRendered = ko.observable(false);\r\n self.showLoader = ko.observable(false);\r\n self.detailsRenderedBinding = self.detailsRendered.subscribe(function(value) {\r\n if (value)\r\n self.showLoader(false);\r\n });\r\n self.menuOpen = ko.observable(true);\r\n\r\n self.toggleMenu = function () {\r\n self.menuOpen(!self.menuOpen());\r\n //blur the button after click\r\n if (document.activeElement != document.body)\r\n document.activeElement.blur();\r\n };\r\n\r\n self.curveModes = ko.observableArray([\r\n { name: \"Time charter\", value: \"TimeCharter\" }, { name: \"Spot market\", value: \"SpotMarket\" },\r\n ]);\r\n\r\n self.isLoadError = ko.observable(false);\r\n self.hasCurveBeenUpdated = ko.observable(false);\r\n self.isCurvePlotSpecified = ko.observable(false);\r\n\r\n self.curveMode = ko.observable(self.getInitialCurveMode());\r\n\r\n self.isCurvesLoading = ko.observable(true);\r\n Vessels.currentVessel.curves = Vessels.currentVessel.curves || ko.observableArray([]);\r\n self.curves = Vessels.currentVessel.curves;\r\n\r\n self.curvesInCurveMode = ko.pureComputed(function () {\r\n var curves = self.curves();\r\n var curveMode = self.curveMode();\r\n return _.filter(curves, function (curve) {\r\n return curve.curve().curveMode === curveMode.value;\r\n });\r\n });\r\n\r\n curvesClient.find(vesselId).done(function (data) {\r\n if (Store.getters[\"User/isKognifai\"]) {\r\n _.each(data, function (curve) {\r\n curve.vesselId = String(curve.vesselId);\r\n curve.xAxisLogVariableId = String(curve.xAxisLogVariableId);\r\n curve.yAxisLogVariableId = String(curve.yAxisLogVariableId);\r\n });\r\n }\r\n self.curves(_.map(data, function(curve) { return new CurveVM(curve); }));\r\n }).fail(function() {\r\n self.isLoadError(true);\r\n }).always(function() {\r\n self.isCurvesLoading(false);\r\n });\r\n\r\n self.isVariablesLoading = ko.observable(true);\r\n Vessels.currentVessel.variables = Vessels.currentVessel.variables || ko.observableArray([]);\r\n self.variables = Vessels.currentVessel.variables;\r\n\r\n logVariablesClient.findAvailableLogVariablesExtended(vesselId).done(function(data) {\r\n self.variables(data);\r\n }).fail(function () {\r\n self.isLoadError(true);\r\n }).always(function () {\r\n self.isVariablesLoading(false);\r\n });\r\n\r\n self.isMassFlowRateVariablesLoading = ko.observable(true);\r\n Vessels.currentVessel.massFlowRateVariables = Vessels.currentVessel.massFlowRateVariables || ko.observableArray([]);\r\n self.massFlowRateVariables = Vessels.currentVessel.massFlowRateVariables;\r\n\r\n logVariablesClient.findMassFlowRateVariables(vesselId).done(function(data) {\r\n self.massFlowRateVariables(data);\r\n }).fail(function() {\r\n self.isLoadError(true);\r\n }).always(function() {\r\n self.isMassFlowRateVariablesLoading(false);\r\n });\r\n\r\n self.isSpeedVariablesLoading = ko.observable(true);\r\n Vessels.currentVessel.speedVariables = Vessels.currentVessel.speedVariables || ko.observableArray([]);\r\n self.speedVariables = Vessels.currentVessel.speedVariables;\r\n\r\n logVariablesClient.findSpeedVariables(vesselId).done(function (data) {\r\n self.speedVariables(data);\r\n }).fail(function () {\r\n self.isLoadError(true);\r\n }).always(function () {\r\n self.isSpeedVariablesLoading(false);\r\n });\r\n\r\n self.isCurvePlotsLoading = ko.observable(true);\r\n Vessels.currentVessel.curvePlots = Vessels.currentVessel.curvePlots || ko.observableArray([]);\r\n self.curvePlots = Vessels.currentVessel.curvePlots;\r\n\r\n curvePlotsClient.find(vesselId).done(function (data) {\r\n self.curvePlots(_.map(data, function(curvePlot) { return new CurvePlot(curvePlot); }));\r\n }).fail(function() {\r\n self.isLoadError(true);\r\n }).always(function() {\r\n self.isCurvePlotsLoading(false);\r\n });\r\n\r\n self.isLoading = ko.pureComputed(function() {\r\n return self.isVariablesLoading() ||\r\n self.isCurvesLoading() ||\r\n self.isCurvePlotsLoading() ||\r\n self.isMassFlowRateVariablesLoading() ||\r\n self.isSpeedVariablesLoading();\r\n });\r\n\r\n self.curveCreatedBinding = events.curveCreated.add(function(curve) {\r\n self.curves.push(new CurveVM(curve));\r\n });\r\n\r\n self.presetChangedBinding = events.presetChanged.add(function() {\r\n self.hasCurveBeenUpdated(true);\r\n });\r\n\r\n self.curveDeletedBinding = events.curveDeleted.add(function(curve) {\r\n self.curves.remove(function(curveViewModel) {\r\n return curveViewModel.curve().id === curve.id;\r\n });\r\n });\r\n\r\n self.editCurveViewModel = ko.observable();\r\n self.editCurveStartBinding = events.editCurveStart.add(function (curveViewModel) {\r\n self.editCurveViewModel(curveViewModel);\r\n });\r\n\r\n self.editCurveDoneBinding = events.editCurveDone.add(function (curveViewModel) {\r\n if (curveViewModel && self.isCurvePlotSpecified()) {\r\n self.hasCurveBeenUpdated(true);\r\n }\r\n self.editCurveViewModel(null);\r\n });\r\n\r\n self.specifiedCurvePlot = ko.observable();\r\n self.curvePlotSpecifiedBinding = events.curvePlotSpecified.add(function(curvePlot) {\r\n self.specifiedCurvePlot(curvePlot);\r\n self.hasCurveBeenUpdated(false);\r\n self.isCurvePlotSpecified(true);\r\n self.menuOpen(false);\r\n self.showLoader(true);\r\n });\r\n}\r\n\r\nViewModel.prototype.getInitialCurveMode = function () {\r\n var curveModule = this.curveModule();\r\n\r\n if (curveModule === \"DataAnalysis\") {\r\n return { name: \"Custom comparison\", value: \"Custom\" };\r\n }\r\n\r\n return this.curveModes()[0];\r\n};\r\n\r\nViewModel.prototype.dispose = function() {\r\n this.curveCreatedBinding.detach();\r\n this.curveDeletedBinding.detach();\r\n this.presetChangedBinding.detach();\r\n this.curvePlotSpecifiedBinding.detach();\r\n this.editCurveStartBinding.detach();\r\n this.editCurveDoneBinding.detach();\r\n this.detailsRenderedBinding.dispose();\r\n};\r\n\r\n\r\nvar templateToExport = Store.getters[\"User/isKognifai\"] ? kognifaiTemplate : template;\r\n\r\nexport default {viewModel: ViewModel, template: templateToExport};\r\n","// Module\nvar code = \"
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","import _ from \"underscore\";\r\nimport curvePredictionHelper from \"Utilities/curve-prediction-helper\";\r\n\r\nfunction sum(timePeriods, propertyName) {\r\n var sum = 0;\r\n for (var i = 0; i < timePeriods.length; i++) {\r\n var timePeriod = timePeriods[i];\r\n var value = Number(timePeriod[propertyName]);\r\n if (!_.isNaN(value) && _.isNumber(value)) {\r\n sum += value;\r\n }\r\n }\r\n return sum;\r\n}\r\n\r\nvar ViewModel = function (timePeriods, variables, curveMode, xAxisVariableId, yAxisVariableId, curveModule) {\r\n var self = this;\r\n\r\n self.predictions = [];\r\n self.curveMode = curveMode;\r\n self.curveModule = curveModule;\r\n\r\n self.variables = _.map(variables, function(variable) {\r\n return {\r\n id: variable.id,\r\n name: variable.name,\r\n unit: variable.unit,\r\n };\r\n });\r\n self.xAxisVariableId = xAxisVariableId;\r\n self.yAxisVariableId = yAxisVariableId;\r\n self.timePeriods = _.map(timePeriods, function(timePeriod) {\r\n return timePeriod.getTableData();\r\n });\r\n\r\n if (curveMode === \"TimeCharter\") {\r\n self.totalActualFuelConsumption = sum(self.timePeriods, \"actualFuelConsumption\");\r\n self.totalReferenceFuelConsumption = sum(self.timePeriods, \"referenceFuelConsumption\");\r\n self.totalDifferenceBetweenConsumptions = sum(self.timePeriods, \"differenceBetweenConsumptions\");\r\n self.totalDistanceTravelled = sum(self.timePeriods, \"distanceTravelled\");\r\n }\r\n\r\n self.totalIncludedTimeInHours = sum(self.timePeriods, \"includedTimeInHours\");\r\n self.totalExcludedTimeInHours = sum(self.timePeriods, \"excludedTimeInHours\");\r\n};\r\n\r\nViewModel.prototype.addPredictions = function (values, dataPoints, curveFit, regressionOrder) {\r\n var self = this;\r\n var predictions = [];\r\n _.each(values, function (value) {\r\n var prediction = curvePredictionHelper.predictRegressionValue(value.x, dataPoints, curveFit, regressionOrder);\r\n predictions.push([value.x, prediction.toFixed(2)]);\r\n });\r\n\r\n predictions.sort(function (a, b) { return a[0] - b[0]; });\r\n\r\n self.predictions = predictions;\r\n};\r\n\r\n\r\nexport default ViewModel;","// Module\nvar code = \"\\r\\n
\\r\\n

\\r\\n

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

\\r\\n

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;","import ko from \"knockout\";\r\nimport _ from \"underscore\";\r\nimport curvePlotsClient from \"Clients/curve-plots-client\";\r\n\r\nvar ViewModel = function(curvePlot) {\r\n var self = this;\r\n self.curvePlot = ko.observable(curvePlot);\r\n self.name = ko.pureComputed(function() {\r\n var curvePlot = self.curvePlot();\r\n if (!curvePlot) return \"\";\r\n return curvePlot.name;\r\n });\r\n};\r\n\r\nViewModel.prototype.save = function(newCurvePlot) {\r\n var self = this;\r\n var originalCurvePlot = _.clone(self.curvePlot()) || {};\r\n var curvePlot = _.extend(originalCurvePlot, newCurvePlot);\r\n var promise;\r\n if (curvePlot.id) {\r\n promise = curvePlotsClient.update(curvePlot);\r\n } else {\r\n promise = curvePlotsClient.create(curvePlot);\r\n }\r\n promise.done(function(data) {\r\n self.curvePlot(data);\r\n });\r\n return promise;\r\n};\r\n\r\nViewModel.prototype.remove = function() {\r\n return curvePlotsClient.remove(this.curvePlot());\r\n};\r\n\r\nexport default ViewModel;","import template from \"./curve-edit.html\";\r\nimport kognifaiTemplate from \"./curve-edit-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport events from \"App/events\";\r\nimport CurvePoint from \"ViewModels/curves/curvePoint\";\r\nimport stringHelper from \"Utilities/string-helper\";\r\nimport _ from \"underscore\";\r\nimport Store from \"@/store\";\r\nimport { getModule } from \"vuex-module-decorators\";\r\nimport VesselsModule from \"@/store/clients/Vessels.module\";\r\n\r\nconst Vessels = getModule(VesselsModule, Store);\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n self.isKognifai = Store.getters[\"User/isKognifai\"];\r\n self.existingCurves = params.existingCurves;\r\n self.curveViewModel = params.curveViewModel;\r\n self.curveMode = params.curveMode;\r\n self.variables = Vessels.currentVessel.variables;\r\n self.massFlowRateVariables = Vessels.currentVessel.massFlowRateVariables;\r\n self.speedVariables = Vessels.currentVessel.speedVariables;\r\n\r\n self.xAxisLogVariableId = ko.observable();\r\n self.yAxisLogVariableId = ko.observable();\r\n self.showDuplicateCurveNameWarning = ko.observable(false);\r\n self.curveFit = ko.observable(\"Linear\");\r\n self.regressionOrder = ko.observable();\r\n self.additionaLogVariableIds = ko.observable();\r\n self.referenceValue = ko.observable();\r\n self.exponent = ko.observable();\r\n self.editCurve = self.curveViewModel.curve();\r\n\r\n self.name = ko.observable(\"New curve\");\r\n self.regressionOrders = [2, 3, 4];\r\n self.showConfirmDialog = ko.observable(false);\r\n self.xAxisSelectError = ko.observable(false);\r\n self.yAxisSelectError = ko.observable(false);\r\n self.yAxisSameVariableError = ko.observable(false);\r\n self.isExponentValid = ko.observable(true);\r\n self.isReferenceValueValid = ko.observable(true);\r\n self.hasReferenceValueError = ko.observable(false);\r\n self.hasExponentError = ko.observable(false);\r\n\r\n self.initialAdditionaLogVariableIds = [];\r\n self.curvePointViewModels = ko.observableArray([]);\r\n\r\n self.xAxisVariables = _.clone(self.variables());\r\n self.xAxisVariables.push({ id: -1, name: \"Time\", unit: { caption: \"\" } });\r\n\r\n //remove log and exp fits from kognifai but not kyma online to avoid causing errors\r\n if (self.isKognifai)\r\n self.curveFits = [\"Linear\", \"Polynomial\", \"Power\"];\r\n else\r\n self.curveFits = [\"Linear\", \"Polynomial\", \"Power\", \"Exponential\", \"Logarithmic\"];\r\n\r\n self.curveFitInfoText = ko.pureComputed(function () {\r\n var curveFit = self.curveFit();\r\n\r\n var axisText = \"\";\r\n\r\n if (curveFit === \"Power\") {\r\n axisText = \"x and y-values\";\r\n } else if (curveFit === \"Exponential\") {\r\n axisText = \"y-values\";\r\n } else if (curveFit === \"Logarithmic\") {\r\n axisText = \"x-values\";\r\n } else {\r\n return \"\";\r\n }\r\n\r\n return \"Please note that it is not possible to use \" + axisText + \" 0 or less when calculating the best fit curve \" +\r\n \"due to mathematics. Such data points will not be considered\";\r\n });\r\n\r\n self.isNegativeValuesAllowed = ko.pureComputed(function() {\r\n var curveFit = self.curveFit();\r\n\r\n return curveFit === \"Linear\" || curveFit === \"Polynomial\";\r\n });\r\n\r\n self.isReferencePointsEnabled = ko.pureComputed(function() {\r\n var curveMode = self.curveMode();\r\n\r\n if (curveMode.value === \"SpotMarket\") {\r\n return false;\r\n }\r\n\r\n return self.isXAndYAxisSelected();\r\n });\r\n\r\n self.curveTitle = ko.pureComputed(function() {\r\n var editCurve = self.editCurve;\r\n var curveMode = self.curveMode();\r\n\r\n var text = editCurve ? \"Edit \" : \"New \";\r\n\r\n if (curveMode.value === \"Custom\") {\r\n text += \"custom curve\";\r\n } else if (curveMode.value === \"TimeCharter\") {\r\n text += \"time charter curve\";\r\n } else if (curveMode.value === \"SpotMarket\") {\r\n text += \"spot market\";\r\n }\r\n\r\n return text;\r\n });\r\n\r\n self.isXAndYAxisSelected = ko.pureComputed(function () {\r\n if (self.xAxisLogVariable() && self.yAxisLogVariable()) {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n self.isXAxisTimeVariable = ko.pureComputed(function() {\r\n var xAxisLogVariable = self.xAxisLogVariable();\r\n if (xAxisLogVariable && xAxisLogVariable.name === \"Time\") {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n if (self.editCurve) {\r\n self.name(self.editCurve.name);\r\n self.xAxisLogVariableId(self.editCurve.xAxisLogVariableId);\r\n self.yAxisLogVariableId(self.editCurve.yAxisLogVariableId);\r\n self.curveFit(self.editCurve.curveFit);\r\n self.regressionOrder(self.editCurve.regressionOrder);\r\n self.initialAdditionaLogVariableIds = self.editCurve.additionaLogVariableIds;\r\n self.referenceValue(self.editCurve.referenceValue);\r\n self.exponent(self.editCurve.exponent);\r\n\r\n var curvePointViewModels = _.map(self.editCurve.points,\r\n function(point) {\r\n return new CurvePoint(point, self.curveFit);\r\n });\r\n self.curvePointViewModels(curvePointViewModels);\r\n\r\n if (self.xAxisLogVariableId() === null) {\r\n self.xAxisLogVariableId(-1);\r\n }\r\n }\r\n\r\n self.xAxisLogVariable = ko.pureComputed(function () {\r\n self.xAxisSelectError(false);\r\n if (self.xAxisLogVariableId()) {\r\n var variable = _.find(self.xAxisVariables, function (variable) {\r\n return variable.id === self.xAxisLogVariableId();\r\n });\r\n } else if (self.yAxisLogVariableId() && self.xAxisLogVariableId() === -1) {\r\n var variable = _.find(self.xAxisVariables,\r\n function(variable) {\r\n return variable.name === \"Time\";\r\n });\r\n }\r\n return variable;\r\n });\r\n\r\n self.yAxisLogVariable = ko.pureComputed(function () {\r\n self.yAxisSelectError(false);\r\n self.yAxisSameVariableError(false);\r\n var variable = _.find(self.variables(), function (variable) {\r\n return variable.id === self.yAxisLogVariableId();\r\n });\r\n\r\n return variable;\r\n });\r\n\r\n self.referenceCurveDataPoints = ko.pureComputed(function() {\r\n var curvePointViewModels = self.curvePointViewModels();\r\n var curveDataPoints = _.map(curvePointViewModels,\r\n function(curvePointViewModel) {\r\n return curvePointViewModel.dataPoint();\r\n });\r\n\r\n curveDataPoints.sort(function(a, b) { return a[0] - b[0]; });\r\n return curveDataPoints;\r\n });\r\n\r\n self.isCurveNameValid = ko.pureComputed(function() {\r\n return !stringHelper.isNullOrWhiteSpace(self.name());\r\n });\r\n\r\n self.hasAtLeastTwoCurvePoints = ko.pureComputed(function() {\r\n var curvePointViewModels = self.curvePointViewModels();\r\n return curvePointViewModels.length > 1;\r\n });\r\n\r\n self.isCurvePointsValid = ko.pureComputed(function() {\r\n var curvePointViewModels = self.curvePointViewModels();\r\n\r\n return _.every(curvePointViewModels, function(curvePointViewModel) {\r\n return curvePointViewModel.isValid();\r\n });\r\n });\r\n\r\n self.isCurveValid = ko.pureComputed(function() {\r\n var isCurveNameValid = self.isCurveNameValid();\r\n var hasAtLeastTwoCurvePoints = self.hasAtLeastTwoCurvePoints();\r\n var isCurvePointsValid = self.isCurvePointsValid();\r\n var isReferenceValueValid = self.isReferenceValueValid();\r\n var isExponentValid = self.isExponentValid();\r\n var curveMode = self.curveMode();\r\n var referenceValue = self.referenceValue();\r\n var exponent = self.referenceValue();\r\n var isXAndYAxisSelected = self.isXAndYAxisSelected();\r\n\r\n var isCurveValid = isCurveNameValid && hasAtLeastTwoCurvePoints && isCurvePointsValid;\r\n\r\n if (curveMode.value === \"SpotMarket\" ) {\r\n return isCurveNameValid && isReferenceValueValid && isExponentValid;\r\n } else if (curveMode.value === \"Custom\") {\r\n return isCurveNameValid && isXAndYAxisSelected;\r\n }\r\n\r\n return isCurveValid;\r\n });\r\n\r\n self.allowedXAxisVariables = ko.pureComputed(function () {\r\n var curveMode = self.curveMode();\r\n\r\n if (curveMode.value === \"Custom\") {\r\n return self.variables();\r\n }\r\n\r\n return self.speedVariables();\r\n });\r\n\r\n self.allowedYAxisVariables = ko.pureComputed(function () {\r\n var curveMode = self.curveMode();\r\n\r\n if (curveMode.value === \"Custom\") {\r\n return self.variables();\r\n }\r\n\r\n return self.massFlowRateVariables();\r\n });\r\n\r\n self.referenceValueBinding = self.referenceValue.subscribe(function (value) {\r\n var isValid = !stringHelper.isNullOrWhiteSpace(value) && !_.isNaN(Number(value));\r\n self.hasReferenceValueError(false);\r\n self.isReferenceValueValid(isValid);\r\n });\r\n\r\n self.exponentBinding = self.exponent.subscribe(function (value) {\r\n var isValid = !stringHelper.isNullOrWhiteSpace(value) && !_.isNaN(Number(value));\r\n self.hasExponentError(false);\r\n self.isExponentValid(isValid);\r\n });\r\n\r\n self.tooltips = {\r\n curveDetails: \"Enter details for curve Name, X- and Y-axis variables. For curve fit please select the method depending on how detailed you want the curve-interpolation to be between each point.\",\r\n curvePoints: \"Define the curve, which is normally given as a table of values from a Charter Party contract, speed test results, engine shop data or similar.\",\r\n additionalData: \"It is possible to define a few parameters that will be shown both in the table and as additional information in the later plotted graph.\",\r\n power: \"Please note that it is not possible to use x- and y-values 0 or less when calculating the best fit curve due to mathematics. Such data points will not be considered.\",\r\n };\r\n}\r\n\r\nViewModel.prototype.done = function() {\r\n events.editCurveDone.dispatch();\r\n};\r\n\r\nViewModel.prototype.save = function () {\r\n var hasError = false;\r\n var self = this;\r\n\r\n if (this.curveMode().value === \"SpotMarket\") {\r\n if (!this.referenceValue()) {\r\n this.hasReferenceValueError(true);\r\n hasError = true;\r\n }\r\n\r\n if (!this.exponent()) {\r\n this.hasExponentError(true);\r\n hasError = true;\r\n }\r\n }\r\n\r\n var curvesToCheck = self.existingCurves();\r\n if (self.editCurve) {\r\n curvesToCheck = self.existingCurves().filter(function (curve) {\r\n return curve.curve().id !== self.editCurve.id;\r\n });\r\n }\r\n curvesToCheck.forEach(function (curve) {\r\n if (curve.name().toLowerCase() === self.name().toLowerCase()) {\r\n self.showDuplicateCurveNameWarning(true);\r\n hasError = true;\r\n }\r\n });\r\n\r\n if (!this.isXAndYAxisSelected() || hasError) {\r\n if (!this.xAxisLogVariable()) {\r\n this.xAxisSelectError(true);\r\n }\r\n\r\n if (!this.yAxisLogVariable()) {\r\n this.yAxisSelectError(true);\r\n }\r\n } else {\r\n var curve = {};\r\n curve.name = this.name();\r\n curve.xAxisLogVariableId = this.xAxisLogVariableId() === -1 ? null : this.xAxisLogVariableId();\r\n curve.yAxisLogVariableId = this.yAxisLogVariableId();\r\n curve.curveFit = this.curveFit();\r\n curve.regressionOrder = this.regressionOrder();\r\n curve.additionaLogVariableIds = this.additionaLogVariableIds();\r\n curve.referenceValue = this.referenceValue();\r\n curve.exponent = this.exponent();\r\n curve.curveMode = this.curveMode().value;\r\n curve.points = _.map(this.curvePointViewModels(),\r\n function (curvePointViewModel) {\r\n return curvePointViewModel.point();\r\n });\r\n\r\n if (this.xAxisLogVariableId() === this.yAxisLogVariableId()) {\r\n this.yAxisSameVariableError(true);\r\n document.getElementById(\"selectY\").scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n } else {\r\n this.curveViewModel.save(curve)\r\n .done(function () {\r\n events.editCurveDone.dispatch(curve);\r\n });\r\n }\r\n }\r\n};\r\n\r\nViewModel.prototype.remove = function () {\r\n this.showConfirmDialog(true);\r\n};\r\n\r\nViewModel.prototype.removeCurveViewModel = function () {\r\n var self = this;\r\n this.curveViewModel.remove().done(function () {\r\n self.showConfirmDialog(false);\r\n events.editCurveDone.dispatch();\r\n });\r\n};\r\n\r\nViewModel.prototype.confirmDeleteDialog = function () {\r\n this.removeCurveViewModel();\r\n};\r\n\r\nViewModel.prototype.cancelDeleteDialog = function () {\r\n this.showConfirmDialog(false);\r\n};\r\n\r\nViewModel.prototype.showCurveFitInfoTooltip = function (vm, e) {\r\n var element = e.currentTarget;\r\n events.showTooltip.dispatch(\"tooltip-text\", { text: this.curveFitInfoText(), isWide: true }, element);\r\n\r\n};\r\n\r\nViewModel.prototype.showTooltip = function (type, vm, e) {\r\n var element = e.currentTarget;\r\n events.showTooltip.dispatch(\"tooltip-text\", { text: this.tooltips[type], isWide: true }, element);\r\n};\r\n\r\nViewModel.prototype.closeTooltip = function () {\r\n events.closeTooltip.dispatch();\r\n};\r\n\r\nViewModel.prototype.dispose = function () {\r\n this.referenceValueBinding.dispose();\r\n this.exponentBinding.dispose();\r\n};\r\n\r\nvar templateToExport = Store.getters[\"User/isKognifai\"] ? kognifaiTemplate : template;\r\n\r\nexport default { viewModel: ViewModel, template: templateToExport };\r\n","import template from \"./curve-data-table.html\";\r\nimport kognifaiTemplate from \"./curve-data-table-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport _ from \"underscore\";\r\nimport CurvePoint from \"ViewModels/curves/curvePoint\";\r\nimport events from \"App/events\";\r\nimport Store from \"@/store\";\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n\r\n self.variables = params.variables;\r\n self.timePeriods = params.timePeriods;\r\n self.title = params.title;\r\n self.selectedCurve = params.selectedCurve;\r\n self.curveMode = self.selectedCurve().curve().curveMode;\r\n\r\n var curvePointViewModels = _.map(self.selectedCurve().curve().points, function (point) {\r\n return new CurvePoint(point);\r\n });\r\n self.curvePointViewModels = ko.observableArray(curvePointViewModels);\r\n\r\n self.consumptionHeaderText = ko.pureComputed(function() {\r\n var curveMode = self.curveMode;\r\n var yAxisVariable = self.yAxisVariable();\r\n var yAxisUnitCaption = self.yAxisUnitCaption();\r\n\r\n if (curveMode === \"TimeCharter\") {\r\n return yAxisVariable.name + \" Deviation (\" + yAxisUnitCaption + \")\";\r\n } else if (curveMode === \"SpotMarket\") {\r\n return \"Extrapolated \" + yAxisVariable.name + \" (\" + yAxisUnitCaption + \")\";\r\n }\r\n\r\n return \"\";\r\n });\r\n\r\n self.referenceCurveDataPoints = ko.pureComputed(function () {\r\n var curvePointViewModels = self.curvePointViewModels();\r\n var curveDataPoints = _.map(curvePointViewModels,\r\n function (curvePointViewModel) {\r\n return curvePointViewModel.dataPoint();\r\n });\r\n\r\n curveDataPoints.sort(function (a, b) { return a[0] - b[0]; });\r\n\r\n return curveDataPoints;\r\n });\r\n\r\n self.xAxisVariable = ko.pureComputed(function () {\r\n var xAxisVariableId = self.selectedCurve().curve().xAxisLogVariableId;\r\n var variable = _.find(self.variables(), function(variable) {\r\n return variable.id === xAxisVariableId;\r\n });\r\n\r\n return variable;\r\n });\r\n\r\n self.yAxisVariable = ko.pureComputed(function () {\r\n var yAxisVariableId = self.selectedCurve().curve().yAxisLogVariableId;\r\n var variable = _.find(self.variables(), function (variable) {\r\n return variable.id === yAxisVariableId;\r\n });\r\n\r\n return _.isUndefined(variable) ? \"\" : variable;\r\n });\r\n\r\n self.sumOfVariables = ko.pureComputed(function() {\r\n var sumList = {};\r\n });\r\n\r\n self.sumOfIncludedTimes = ko.pureComputed(function() {\r\n var sum = 0;\r\n _.each(self.timePeriods(), function(timePeriod) {\r\n sum += timePeriod.includedTimeInHours();\r\n });\r\n\r\n return sum;\r\n });\r\n\r\n self.sumOfExcludedTimes = ko.pureComputed(function () {\r\n var sum = 0;\r\n _.each(self.timePeriods(), function (timePeriod) {\r\n sum += timePeriod.excludedTimeInHours();\r\n });\r\n\r\n return sum;\r\n });\r\n\r\n self.yAxisUnitCaption = ko.pureComputed(function () {\r\n var curveMode = self.curveMode;\r\n\r\n if (curveMode === \"TimeCharter\" || curveMode === \"SpotMarket\") {\r\n return \"ton/day\";\r\n }\r\n\r\n var yAxisVariable = self.yAxisVariable();\r\n\r\n return yAxisVariable ? yAxisVariable.unit.caption : \"\";\r\n });\r\n}\r\n\r\nViewModel.prototype.isVariableDifferentFromXAndY = function(variable) {\r\n var xAxisVariable = this.xAxisVariable();\r\n var yAxisVariable = this.yAxisVariable();\r\n\r\n //Special case for time on x-axis\r\n if (!xAxisVariable && yAxisVariable) {\r\n if (variable.id !== yAxisVariable.id) {\r\n return true;\r\n }\r\n }\r\n if (variable && xAxisVariable && yAxisVariable) {\r\n return variable.id !== xAxisVariable.id && variable.id !== yAxisVariable.id;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nViewModel.prototype.showExcludedDataTooltip = function (vm, e) {\r\n if (vm.currentSampleSize() < 100) {\r\n var element = e.currentTarget;\r\n events.showTooltip.dispatch(\"tooltip-text\", { text: vm.excludedDataInfoText, customCssClass: \"curveTableTooltip\" }, element);\r\n }\r\n};\r\n\r\nViewModel.prototype.closeToopltip = function () {\r\n events.closeTooltip.dispatch();\r\n};\r\n\r\nvar templateToExport = (Store.getters[\"User/isKognifai\"]) ? kognifaiTemplate : template;\r\n\r\nexport default {viewModel: ViewModel, template: templateToExport};\r\n","import template from \"./curve-plot-filters.html\";\r\nimport kognifaiTemplate from \"./curve-plot-filters-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport FilterGroup from \"ViewModels/curves/filterGroup\";\r\nimport events from \"App/events\";\r\nimport Store from \"@/store\";\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n self.filterGroupViewModels = params.filterGroupViewModels;\r\n self.availableVariables = params.availableVariables;\r\n self.availableVariablesMap = params.availableVariablesMap;\r\n self.yAxisLogVariableId = params.yAxisLogVariableId;\r\n self.curveMode = params.curveMode;\r\n\r\n self.timeRangeFilterAdded = ko.observable(false);\r\n\r\n self.removeFilterGroup = function(filterGroupViewModel) {\r\n this.filterGroupViewModels.remove(filterGroupViewModel);\r\n }.bind(self);\r\n\r\n self.filterGroupEmptyBinding = events.filterGroupEmpty.add(function (filterGroupViewModel) {\r\n if (filterGroupViewModel.timeRangeFilter) {\r\n self.timeRangeFilterAdded(false);\r\n }\r\n self.removeFilterGroup(filterGroupViewModel);\r\n });\r\n}\r\n\r\nViewModel.prototype.addFilterGroup = function() {\r\n this.filterGroupViewModels.push(new FilterGroup(this.availableVariablesMap, this.curveMode, this.yAxisLogVariableId, undefined, false));\r\n};\r\n\r\nViewModel.prototype.addTimeRangeFilter = function () {\r\n this.timeRangeFilterAdded(true);\r\n this.filterGroupViewModels.push(new FilterGroup(this.availableVariablesMap, this.curveMode, this.yAxisLogVariableId, undefined, true));\r\n};\r\n\r\nViewModel.prototype.dispose = function () {\r\n this.filterGroupEmptyBinding.detach();\r\n};\r\n\r\nvar templateToExport = (Store.getters[\"User/isKognifai\"]) ? kognifaiTemplate : template;\r\n\r\nexport default { viewModel: ViewModel, template: templateToExport };\r\n","import template from \"./curve-points.html\";\r\nimport kognifaiTemplate from \"./curve-points-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport moment from \"moment\";\r\nimport _ from \"underscore\";\r\nimport CurvePoint from \"ViewModels/curves/curvePoint\";\r\nimport Store from \"@/store\";\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n self.curvePointViewModels = params.curvePointViewModels;\r\n self.xAxisLogVariable = params.xAxisLogVariable;\r\n self.yAxisLogVariable = params.yAxisLogVariable;\r\n self.fromDate = params.fromDate;\r\n self.toDate = params.toDate;\r\n self.curveMode = params.curveMode;\r\n self.curveFit = params.curveFit;\r\n\r\n self.atAnchorXAxis = ko.observable();\r\n self.newCurvePointX = ko.observable(1);\r\n self.newCurvePointY = ko.observable(1);\r\n\r\n self.errorText = ko.pureComputed(function() {\r\n var isNegativeXValueAllowed = self.isNegativeXValueAllowed();\r\n var isNegativeYValueAllowed = self.isNegativeYValueAllowed();\r\n var newCurvePointX = self.newCurvePointX();\r\n var newCurvePointY = self.newCurvePointY();\r\n var curveFit = self.curveFit();\r\n\r\n var errorText = \"Using values less than 1 is not possible with the \" + curveFit + \" curve fit\";\r\n\r\n if (!isNegativeXValueAllowed && newCurvePointX < 1) {\r\n return errorText;\r\n } else if (!isNegativeYValueAllowed && newCurvePointY < 1) {\r\n return errorText;\r\n } else if (!isNegativeXValueAllowed || !isNegativeYValueAllowed) {\r\n var curvePointWithError = self.curvePointWithError();\r\n\r\n if (!_.isUndefined(curvePointWithError) && !isNegativeXValueAllowed && curvePointWithError.x() < 1) {\r\n return errorText;\r\n } else if (!_.isUndefined(curvePointWithError) && !isNegativeYValueAllowed && curvePointWithError.y() < 1) {\r\n return errorText;\r\n }\r\n }\r\n\r\n return \"The curve point must be a number\";\r\n });\r\n\r\n self.hasError = ko.pureComputed(function() {\r\n var isNewCurvePointValid = self.isNewCurvePointValid();\r\n var curvePointWithError = self.curvePointWithError();\r\n\r\n if (isNewCurvePointValid) {\r\n return _.isUndefined(curvePointWithError);\r\n }\r\n\r\n return isNewCurvePointValid;\r\n });\r\n\r\n self.curvePointWithError = ko.pureComputed(function() {\r\n var curvePointViewModels = self.curvePointViewModels();\r\n\r\n return _.find(curvePointViewModels, function(curvePoint) {\r\n return !curvePoint.isValid();\r\n });\r\n });\r\n\r\n self.isNegativeXValueAllowed = ko.pureComputed(function () {\r\n var curveFit = self.curveFit();\r\n\r\n return curveFit === \"Linear\" || curveFit === \"Polynomial\" || curveFit === \"Exponential\";\r\n });\r\n\r\n self.isNegativeYValueAllowed = ko.pureComputed(function () {\r\n var curveFit = self.curveFit();\r\n\r\n return curveFit === \"Linear\" || curveFit === \"Polynomial\" || curveFit === \"Logarithmic\";\r\n });\r\n\r\n self.isNewCurvePointXValid = ko.pureComputed(function() {\r\n var newCurvePointX = self.newCurvePointX();\r\n var xAxisLogVariable = self.xAxisLogVariable();\r\n var isNegativeXValueAllowed = self.isNegativeXValueAllowed();\r\n var isFinite = _.isFinite(newCurvePointX);\r\n\r\n if (xAxisLogVariable.name === \"time\") {\r\n return true;\r\n }\r\n\r\n if (!isNegativeXValueAllowed) {\r\n return isFinite && newCurvePointX > 0;\r\n }\r\n\r\n return isFinite;\r\n });\r\n\r\n self.isNewCurvePointYValid = ko.pureComputed(function() {\r\n var newCurvePointY = self.newCurvePointY();\r\n var isNegativeYValueAllowed = self.isNegativeYValueAllowed();\r\n var isFinite = _.isFinite(newCurvePointY);\r\n\r\n if (!isNegativeYValueAllowed) {\r\n return isFinite && newCurvePointY > 0;\r\n }\r\n\r\n return isFinite;\r\n });\r\n\r\n self.isNewCurvePointValid = ko.pureComputed(function() {\r\n var isNewCurvePointXValid = self.isNewCurvePointXValid();\r\n var isNewCurvePointYValid = self.isNewCurvePointYValid();\r\n return isNewCurvePointXValid && isNewCurvePointYValid;\r\n });\r\n\r\n self.tableOverflowCss = ko.pureComputed(function() {\r\n var cssClass = \"\";\r\n var maxNumberOfRows = 7;\r\n\r\n if (self.curvePointViewModels().length > maxNumberOfRows) {\r\n cssClass = \"curvePointsOverflow\";\r\n }\r\n\r\n return cssClass;\r\n });\r\n\r\n self.reversedCurvePointViewModels = ko.pureComputed(function () {\r\n var reversed = _.clone(self.curvePointViewModels());\r\n return reversed.reverse();\r\n });\r\n\r\n self.removeCurvePoint = function (curvePointViewModel) {\r\n self.curvePointViewModels.remove(curvePointViewModel);\r\n }.bind(self);\r\n\r\n self.yAxisUnitCaption = ko.pureComputed(function() {\r\n var curveMode = self.curveMode().value;\r\n var isFuelMode = curveMode === \"TimeCharter\" || curveMode === \"SpotMarket\";\r\n return isFuelMode ? \"ton/day\" : self.yAxisLogVariable().unit.caption;\r\n });\r\n}\r\n\r\nViewModel.prototype.addCurvePoint = function() {\r\n var self = this;\r\n var x = parseFloat(self.newCurvePointX());\r\n var y = parseFloat(self.newCurvePointY());\r\n var curveFit = self.curveFit;\r\n\r\n if (this.xAxisLogVariable().name === \"Time\") {\r\n var currentDate = moment.utc();\r\n var months = self.curvePointViewModels().length;\r\n currentDate.subtract(months, \"months\");\r\n x = currentDate.toDate().getTime();\r\n }\r\n var curvePoint = {\r\n x: x,\r\n y: y,\r\n };\r\n self.curvePointViewModels.push(new CurvePoint(curvePoint, curveFit));\r\n self.newCurvePointX(1);\r\n self.newCurvePointY(1);\r\n};\r\n\r\nViewModel.prototype.dispose = function() {\r\n};\r\n\r\nvar templateToExport = (Store.getters[\"User/isKognifai\"]) ? kognifaiTemplate : template;\r\n\r\nexport default { viewModel: ViewModel, template: templateToExport };\r\n","import template from \"./curve-specification.html\";\r\nimport kognifaiTemplate from \"./curve-specification-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport moment from \"moment\";\r\nimport _ from \"underscore\";\r\nimport events from \"App/events\";\r\nimport CurveVM from \"ViewModels/curves/curve\";\r\nimport FilterGroup from \"ViewModels/curves/filterGroup\";\r\nimport CurvePlot from \"ViewModels/curves/curvePlot\";\r\nimport dateHelper from \"Utilities/date-helper\";\r\nimport stringHelper from \"Utilities/string-helper\";\r\nimport Store from \"@/store\";\r\nimport { getModule } from \"vuex-module-decorators\";\r\nimport VesselsModule from \"@/store/clients/Vessels.module\";\r\n\r\nconst Vessels = getModule(VesselsModule, Store);\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n var defaultToDate = moment.utc();\r\n var defaultFromDate = defaultToDate.clone().subtract(1, \"days\");\r\n\r\n self.curveModes = params.curveModes;\r\n self.curveMode = params.curveMode;\r\n self.curveModule = params.curveModule;\r\n\r\n self.hasCurveBeenUpdated = params.hasCurveBeenUpdated;\r\n self.curvePlots = Vessels.currentVessel.curvePlots;\r\n self.curves = Vessels.currentVessel.curves;\r\n self.variables = Vessels.currentVessel.variables;\r\n\r\n self.overwriteCurvePlotName = ko.observable();\r\n self.showDuplicateCurvePlotNameWarning = ko.observable(false);\r\n self.vesselName = ko.observable(Vessels.currentVessel.name);\r\n self.selectedCurvePlot = ko.observable();\r\n self.selectedCurve = ko.observable();\r\n self.curvePlotViewModel = ko.observable(new CurvePlot());\r\n self.setPeriodFromDate = ko.observable(dateHelper.getFormatedDateString(defaultFromDate));\r\n self.setPeriodToDate = ko.observable(dateHelper.getFormatedDateString(defaultToDate));\r\n self.selectedDataInterval = ko.observable(\"Hour\");\r\n self.selectedModule = ko.observable(\"cp\");\r\n self.timeConfigurationType = ko.observable(\"LastPeriod\");\r\n self.name = ko.observable(\"New plot\");\r\n self.setPeriodFromTime = ko.observable(\"12:00\");\r\n self.setPeriodToTime = ko.observable(\"12:00\");\r\n self.periodStartAt = ko.observable(\"12:00\");\r\n self.isSaveCurvePlotOpen = ko.observable(false);\r\n self.showConfirmDialog = ko.observable(false);\r\n self.lastPeriodDays = ko.observable(1);\r\n self.periodDurationInHours = ko.observable(24);\r\n\r\n self.exclusionFilterGroupViewModels = ko.observableArray([]);\r\n var isKognifai = Store.getters[\"User/isKognifai\"];\r\n self.dataIntervals = isKognifai ? ko.observableArray([\"Minute\", \"TenMinutes\", \"Hour\"]) : ko.observableArray([\"Minute\", \"Quarter\", \"Hour\"]);\r\n\r\n self.curvePlotsInCurveModule = ko.pureComputed(function () {\r\n var curvePlots = self.curvePlots();\r\n var curveModule = self.curveModule();\r\n var curves = self.curves();\r\n\r\n return _.filter(curvePlots, function (curvePlot) {\r\n var curveInCurvePlot = _.find(curves, function (curve) {\r\n return curvePlot.curvePlot().curveId === curve.curve().id;\r\n });\r\n\r\n if (!curveInCurvePlot) return false;\r\n\r\n var curveMode = curveInCurvePlot.curve().curveMode;\r\n if (curveModule === \"CharterParty\") {\r\n return curveMode === \"TimeCharter\" || curveMode === \"SpotMarket\";\r\n } else if (curveModule === \"DataAnalysis\") {\r\n return curveMode === \"Custom\";\r\n }\r\n });\r\n });\r\n\r\n self.isCharterPartyModule = ko.pureComputed(function() {\r\n var curveModule = self.curveModule();\r\n\r\n return curveModule === \"CharterParty\";\r\n });\r\n\r\n self.curvesLabel = ko.pureComputed(function() {\r\n var curveMode = self.curveMode();\r\n\r\n if (curveMode.value === \"SpotMarket\") {\r\n return \"Formula\";\r\n }\r\n\r\n return \"Curve\";\r\n });\r\n\r\n self.curvesInCurveMode = ko.pureComputed(function () {\r\n var curves = self.curves();\r\n var curveMode = self.curveMode();\r\n\r\n return _.filter(curves, function (curve) {\r\n return curve.curve().curveMode === curveMode.value;\r\n });\r\n });\r\n\r\n self.curveTitle = ko.pureComputed(function() {\r\n var isCharterPartyModule = self.isCharterPartyModule();\r\n var curveMode = self.curveMode();\r\n\r\n if (isCharterPartyModule) {\r\n if (curveMode.value === \"TimeCharter\") {\r\n return \"Time charter curve\";\r\n } else if (curveMode.value === \"SpotMarket\") {\r\n return \"Spot market\";\r\n }\r\n }\r\n\r\n return \"Data analysis\";\r\n });\r\n\r\n self.curvePlot = ko.pureComputed(function() {\r\n return self.getCurvePlot();\r\n });\r\n\r\n self.exclusionFilters = ko.pureComputed(function() {\r\n var filterGroupViewModels = self.exclusionFilterGroupViewModels();\r\n\r\n var filters = _.map(filterGroupViewModels,\r\n function(filterGroupViewModel) {\r\n return filterGroupViewModel.filters();\r\n });\r\n\r\n return filters;\r\n });\r\n\r\n self.availableVariables = ko.pureComputed(function() {\r\n var variables = self.variables();\r\n var selectedCurve = self.selectedCurve();\r\n if (!selectedCurve) return [];\r\n\r\n var curve = selectedCurve.curve();\r\n\r\n var variableIds = _.flatten([\r\n curve.xAxisLogVariableId, curve.yAxisLogVariableId, curve.additionaLogVariableIds,\r\n ]);\r\n var availabelVariables = _.filter(variables, function(variable) {\r\n return _.contains(variableIds, variable.id);\r\n });\r\n return availabelVariables;\r\n });\r\n\r\n self.availableVariablesMap = ko.pureComputed(function() {\r\n var availableVariables = self.variables();\r\n var variablesMap = {};\r\n _.each(availableVariables, function(variable) { variablesMap[variable.id] = variable; });\r\n return variablesMap;\r\n });\r\n\r\n self.hasSavedCurvePlot = ko.pureComputed(function() {\r\n var curvePlotViewModel = self.curvePlotViewModel();\r\n return curvePlotViewModel.curvePlot();\r\n });\r\n\r\n self.isCurvePlotNameValid = ko.pureComputed(function() {\r\n return !stringHelper.isNullOrWhiteSpace(self.name());\r\n });\r\n\r\n self.isPeriodStartAtValid = ko.pureComputed(function() {\r\n var periodStartAt = self.periodStartAt();\r\n return dateHelper.isValidTime(periodStartAt);\r\n });\r\n\r\n self.isPeriodDurationInHoursValid = ko.pureComputed(function() {\r\n var periodDurationInHours = self.periodDurationInHours();\r\n return parseFloat(periodDurationInHours) > 0;\r\n });\r\n\r\n self.isLastPeriodDaysValid = ko.pureComputed(function() {\r\n var lastPeriodDays = self.lastPeriodDays();\r\n return parseInt(lastPeriodDays) > 0;\r\n });\r\n\r\n self.isExclusionFiltersValid = ko.pureComputed(function() {\r\n var filterGroupViewModels = self.exclusionFilterGroupViewModels();\r\n\r\n return _.every(filterGroupViewModels, function(filterGroupViewModel) {\r\n return filterGroupViewModel.isFiltersValid();\r\n });\r\n });\r\n\r\n self.isSetPeriodFromTimeValid = ko.pureComputed(function() {\r\n var fromTime = self.setPeriodFromTime();\r\n return dateHelper.isValidTime(fromTime);\r\n });\r\n\r\n self.isSetPeriodToTimeValid = ko.pureComputed(function () {\r\n var toTime = self.setPeriodToTime();\r\n return dateHelper.isValidTime(toTime);\r\n });\r\n\r\n self.hasValidCurve = ko.pureComputed(function () {\r\n var curveViewModels = self.curves();\r\n var curveMode = self.curveMode();\r\n\r\n //if no curve is selected\r\n if (!self.selectedCurve()) return false;\r\n\r\n return _.any(curveViewModels, function (curveViewModel) {\r\n return curveViewModel.curve().curveMode === curveMode.value;\r\n });\r\n });\r\n\r\n self.isCurvePlotValid = ko.pureComputed(function () {\r\n var isPeriodStartAtValid = self.isPeriodStartAtValid();\r\n var isPeriodDurationInHoursValid = self.isPeriodDurationInHoursValid();\r\n var isLastPeriodDaysValid = self.isLastPeriodDaysValid();\r\n var isExclusionFiltersValid = self.isExclusionFiltersValid();\r\n var isSetPeriodFromTimeValid = self.isSetPeriodFromTimeValid();\r\n var isSetPeriodToTimeValid = self.isSetPeriodToTimeValid();\r\n var hasValidCurve = self.hasValidCurve();\r\n\r\n return isPeriodStartAtValid &&\r\n isPeriodDurationInHoursValid &&\r\n isLastPeriodDaysValid &&\r\n isExclusionFiltersValid &&\r\n isSetPeriodFromTimeValid &&\r\n isSetPeriodToTimeValid &&\r\n hasValidCurve;\r\n });\r\n\r\n self.curvePlotCreatedBinding = events.curvePlotCreated.add(function (curvePlot) {\r\n var curvePlotViewModel = new CurvePlot(curvePlot);\r\n self.curvePlots.push(curvePlotViewModel);\r\n self.curvePlotViewModel(curvePlotViewModel);\r\n self.selectedCurvePlot(curvePlotViewModel);\r\n });\r\n\r\n self.curvePlotDeletedBinding = events.curvePlotDeleted.add(function (curvePlot) {\r\n self.curvePlots.remove(function (curvePlotViewModel) {\r\n return curvePlotViewModel.curvePlot().id === curvePlot.id;\r\n });\r\n });\r\n\r\n self.newCurveAddedBinding = events.curveCreated.add(function (curve) {\r\n var curveViewModels = self.curves();\r\n self.selectedCurve(_.find(curveViewModels, function (curveViewModel) {\r\n return curveViewModel.curve().id === curve.id;\r\n }));\r\n });\r\n\r\n self.selectedCurvePlotBinding = self.selectedCurvePlot.subscribe(function (curvePlotViewModel) {\r\n events.presetChanged.dispatch();\r\n if (!curvePlotViewModel) {\r\n self.curvePlotViewModel(new CurvePlot());\r\n self.name(\"New plot\");\r\n self.resetPresets();\r\n return;\r\n }\r\n\r\n self.curvePlotViewModel(curvePlotViewModel);\r\n self.initializeSavedPlot();\r\n });\r\n\r\n self.curveDeletedBinding = events.curveDeleted.add(function(curve) {\r\n var curvePlots = self.curvePlots();\r\n var updatedCurvePlots = _.filter(curvePlots, function(curvePlot) {\r\n return curvePlot.curvePlot().curveId !== curve.id;\r\n });\r\n\r\n self.selectedCurvePlot(\"\");\r\n self.curvePlots(updatedCurvePlots);\r\n });\r\n\r\n self.yAxisLogVariableId = ko.pureComputed(function() {\r\n var selectedCurve = self.selectedCurve();\r\n if (!selectedCurve) return null;\r\n\r\n var curve = selectedCurve.curve();\r\n if (!curve) return null;\r\n\r\n return curve.yAxisLogVariableId;\r\n });\r\n\r\n self.tooltips = {\r\n dataAnalysis: \"Input your custom selections for your analysis below and store the settings for later easy retrieval.\",\r\n timeSpan: \"Select the time to analyse, with the period split into length as specified by the ‘Period duration’.\",\r\n exclusionFilters: \"Apply exclusion filtering by exclude time, outliers, bad weather, etc. Use logical expressions to build your custom exclusion filters.\",\r\n curve: \"Specify a baseline curve, against which the data will be compared.\",\r\n };\r\n}\r\n\r\nViewModel.prototype.dispose = function() {\r\n this.curvePlotSelectedBinding.detach();\r\n};\r\n\r\nViewModel.prototype.toggleSaveCurvePlot = function() {\r\n this.showDuplicateCurvePlotNameWarning(false);\r\n this.isSaveCurvePlotOpen(!this.isSaveCurvePlotOpen());\r\n};\r\n\r\n//Selecting nothing (the select line) in the Load presets box resets all settings\r\nViewModel.prototype.resetPresets = function() {\r\n var defaultToDate = moment.utc();\r\n var defaultFromDate = defaultToDate.clone().subtract(1, \"days\");\r\n this.selectedCurve(undefined);\r\n this.setPeriodFromDate(dateHelper.getFormatedDateString(defaultFromDate));\r\n this.setPeriodToDate(dateHelper.getFormatedDateString(defaultToDate));\r\n this.timeConfigurationType(\"LastPeriod\");\r\n this.setPeriodFromTime(\"12:00\");\r\n this.setPeriodToTime(\"12:00\");\r\n this.lastPeriodDays(1);\r\n this.periodDurationInHours(24);\r\n this.exclusionFilterGroupViewModels([]);\r\n};\r\n\r\nViewModel.prototype.initializeSavedPlot = function(curvePlotViewModel) {\r\n var self = this;\r\n var curvePlot = self.curvePlotViewModel().curvePlot();\r\n self.name(curvePlot.name);\r\n\r\n var curveViewModels = self.curves();\r\n var curve = _.find(curveViewModels,\r\n function(curveViewModel) {\r\n return curveViewModel.curve().id === curvePlot.curveId;\r\n });\r\n\r\n self.selectedCurve(curve);\r\n\r\n var curveModule = self.curveModule();\r\n if (curveModule === \"CharterParty\") {\r\n var curveMode = _.find(self.curveModes(),\r\n function(curveMode) { return curveMode.value === curve.curve().curveMode; });\r\n\r\n self.curveMode(curveMode);\r\n }\r\n\r\n var fromTime = curvePlot.setPeriodFromDate.split(\"T\")[1];\r\n var toTime = curvePlot.setPeriodToDate.split(\"T\")[1];\r\n\r\n self.timeConfigurationType(curvePlot.timeConfigurationType);\r\n self.lastPeriodDays(curvePlot.lastPeriodInSeconds / 24 / 60 / 60);\r\n self.setPeriodFromDate(dateHelper.getFormatedDateString(curvePlot.setPeriodFromDate));\r\n self.setPeriodToDate(dateHelper.getFormatedDateString(curvePlot.setPeriodToDate));\r\n self.setPeriodFromTime(fromTime.substring(0, 5));\r\n self.setPeriodToTime(toTime.substring(0, 5));\r\n\r\n self.selectedDataInterval(curvePlot.dataInterval);\r\n self.selectedModule(curvePlot.curvePlotModule);\r\n self.periodStartAt(curvePlot.periodStartAt.substring(0, 5));\r\n self.periodDurationInHours(curvePlot.periodDurationInHours);\r\n\r\n var exclusionFilterGroupViewModels = _.map(curvePlot.exclusionFilters,\r\n function (exclusionFilterGroup) {\r\n return new FilterGroup(self.availableVariablesMap, self.curveMode, self.yAxisLogVariableId, exclusionFilterGroup);\r\n });\r\n self.exclusionFilterGroupViewModels(exclusionFilterGroupViewModels);\r\n};\r\n\r\nViewModel.prototype.getCurvePlot = function() {\r\n var self = this;\r\n var curvePlot = self.curvePlotViewModel().curvePlot();\r\n var id = curvePlot ? curvePlot.id : null;\r\n\r\n var curve = self.selectedCurve();\r\n var curveMode = self.curveMode();\r\n var timeConfigurationType = self.timeConfigurationType();\r\n var setPeriodFromTime = self.setPeriodFromTime();\r\n var setPeriodToTime = self.setPeriodToTime();\r\n var setPeriodFromDate = dateHelper.getSubmitDateString(self.setPeriodFromDate(), setPeriodFromTime);\r\n var setPeriodToDate = dateHelper.getSubmitDateString(self.setPeriodToDate(), setPeriodToTime);\r\n var periodStartAt = self.periodStartAt();\r\n var exclusionFilters = self.exclusionFilters();\r\n var name = self.name();\r\n var dataInterval = self.selectedDataInterval();\r\n\r\n var curvePlotModule = self.selectedModule();\r\n var lastPeriodDays = parseInt(self.lastPeriodDays());\r\n var periodDurationInHours = parseFloat(self.periodDurationInHours());\r\n\r\n var lastPeriodInSeconds = lastPeriodDays * 24 * 60 * 60;\r\n\r\n var plotSpecification = {\r\n id: id,\r\n curveMode: curveMode.value,\r\n curveId: curve.curve().id,\r\n name: name,\r\n timeConfigurationType: timeConfigurationType,\r\n lastPeriodInSeconds: lastPeriodInSeconds,\r\n setPeriodFromDate: setPeriodFromDate,\r\n setPeriodToDate: setPeriodToDate,\r\n periodStartAt: periodStartAt,\r\n periodDurationInHours: periodDurationInHours,\r\n exclusionFilters: exclusionFilters,\r\n dataInterval: dataInterval,\r\n setPeriodFromTime: setPeriodFromTime,\r\n setPeriodToTime: setPeriodToTime,\r\n curvePlotModule: curvePlotModule,\r\n };\r\n return plotSpecification;\r\n};\r\n\r\nViewModel.prototype.showEditCurve = function() {\r\n this.showDuplicateCurvePlotNameWarning(false);\r\n events.editCurveStart.dispatch(this.selectedCurve());\r\n};\r\n\r\nViewModel.prototype.showAddNewCurve = function() {\r\n events.editCurveStart.dispatch(new CurveVM(null));\r\n};\r\n\r\nViewModel.prototype.plot = function() {\r\n var self = this;\r\n self.showDuplicateCurvePlotNameWarning(false);\r\n var curvePlot = self.getCurvePlot();\r\n events.curvePlotSpecified.dispatch(curvePlot);\r\n //blur the button after click\r\n if (document.activeElement != document.body)\r\n document.activeElement.blur();\r\n};\r\n\r\nViewModel.prototype.savePlot = function() {\r\n var self = this;\r\n var curvePlot = self.getCurvePlot();\r\n var curvePlotViewModel = self.curvePlotViewModel();\r\n return curvePlotViewModel.save(curvePlot).done(function() {\r\n self.showDuplicateCurvePlotNameWarning(false);\r\n self.isSaveCurvePlotOpen(false);\r\n });\r\n};\r\n\r\nViewModel.prototype.saveAsNewPlot = function() {\r\n var self = this;\r\n var curvePlotNameAlreadyExists = false;\r\n\r\n self.curvePlots().forEach(function(curvePlot) {\r\n if (curvePlot.name() === self.getCurvePlot().name) {\r\n curvePlotNameAlreadyExists = true;\r\n }\r\n });\r\n\r\n if (curvePlotNameAlreadyExists) {\r\n self.overwriteCurvePlotName = self.getCurvePlot().name;\r\n return self.showDuplicateCurvePlotNameWarning(true);\r\n }\r\n\r\n self.curvePlotViewModel(new CurvePlot());\r\n self.savePlot();\r\n};\r\n\r\nViewModel.prototype.updatePlot = function() {\r\n var self = this;\r\n\r\n var curvePlotNameAlreadyExists;\r\n\r\n self.curvePlots().forEach(function(curvePlot) {\r\n if (curvePlot.name() === self.getCurvePlot().name && curvePlot.curvePlot().id != self.getCurvePlot().id) {\r\n curvePlotNameAlreadyExists = true;\r\n }\r\n });\r\n\r\n if (curvePlotNameAlreadyExists) {\r\n self.overwriteCurvePlotName = self.getCurvePlot().name;\r\n return self.showDuplicateCurvePlotNameWarning(true);\r\n }\r\n\r\n self.savePlot();\r\n};\r\n\r\nViewModel.prototype.overwritePlot = function() {\r\n var self = this;\r\n var curvePlotName = self.overwriteCurvePlotName;\r\n var curvePlotToOverwrite;\r\n\r\n self.curvePlots().forEach(function(curvePlot) {\r\n if (curvePlot.name() === curvePlotName) {\r\n curvePlotToOverwrite = curvePlot;\r\n }\r\n });\r\n\r\n self.curvePlotViewModel(curvePlotToOverwrite);\r\n self.deleteCurvePlotViewModel();\r\n\r\n var updatedCurvePlots = _.filter(self.curvePlots(), function(curvePlot) {\r\n return curvePlot.curvePlot().name !== curvePlotName;\r\n });\r\n self.curvePlots(updatedCurvePlots);\r\n\r\n self.name(curvePlotName);\r\n self.saveAsNewPlot();\r\n self.showDuplicateCurvePlotNameWarning(false);\r\n};\r\n\r\nViewModel.prototype.deletePlot = function () {\r\n this.showConfirmDialog(true);\r\n};\r\n\r\nViewModel.prototype.confirmDeleteDialog = function () {\r\n this.deleteCurvePlotViewModel();\r\n};\r\n\r\nViewModel.prototype.cancelDeleteDialog = function () {\r\n this.showConfirmDialog(false);\r\n};\r\n\r\nViewModel.prototype.deleteCurvePlotViewModel = function() {\r\n var self = this;\r\n var curvePlotViewModel = self.curvePlotViewModel();\r\n curvePlotViewModel.remove().done(function () {\r\n self.showConfirmDialog(false);\r\n self.curvePlotViewModel(new CurvePlot());\r\n self.isSaveCurvePlotOpen(false);\r\n });\r\n};\r\n\r\nViewModel.prototype.showTooltip = function (type, vm, e) {\r\n var element = e.currentTarget;\r\n events.showTooltip.dispatch(\"tooltip-text\", { text: this.tooltips[type], isWide: true }, element);\r\n};\r\n\r\nViewModel.prototype.closeTooltip = function () {\r\n events.closeTooltip.dispatch();\r\n};\r\n\r\nViewModel.prototype.dispose = function () {\r\n this.curvePlotCreatedBinding.detach();\r\n this.curvePlotDeletedBinding.detach();\r\n this.newCurveAddedBinding.detach();\r\n this.curveDeletedBinding.detach();\r\n this.selectedCurvePlotBinding.dispose();\r\n};\r\n\r\nvar templateToExport = (Store.getters[\"User/isKognifai\"]) ? kognifaiTemplate : template;\r\n\r\nexport default { viewModel: ViewModel, template: templateToExport };\r\n","import template from \"./variable-select-multi.html\";\r\nimport kognifaiTemplate from \"./variable-select-multi-kognifai.html\";\r\nimport ko from \"knockout\";\r\nimport _ from \"underscore\";\r\nimport GraphVariable from \"ViewModels/graphVariable\";\r\nimport Store from \"@/store\";\r\n\r\nfunction ViewModel(params) {\r\n var self = this;\r\n self.variables = params.variables;\r\n self.initialSelectedVariableIds = ko.utils.unwrapObservable(params.initialSelectedVariableIds) || [];\r\n self.selectedVariableIds = params.selectedVariableIds;\r\n self.customCss = params.customCss;\r\n\r\n self.variableViewModels = ko.pureComputed(function() {\r\n var variables = self.variables();\r\n var initialSelectedVariableIds = self.initialSelectedVariableIds;\r\n\r\n var viewModels = [];\r\n _.each(variables,\r\n function(variable) {\r\n var variableName = variable.name ? variable.name : variable.description;\r\n var isSelected = _.contains(initialSelectedVariableIds, variable.id);\r\n viewModels.push(new GraphVariable(variableName, variable.id, isSelected, initialSelectedVariableIds, undefined, variable.onboardSystem, variable.displayName));\r\n });\r\n return viewModels;\r\n });\r\n\r\n self.selectedVariables = ko.pureComputed(function() {\r\n var variables = self.variableViewModels();\r\n var selectedVariables = _.filter(variables,\r\n function(variable) {\r\n return variable.isSelected();\r\n });\r\n\r\n //Update \"out\" parameter: selectedVariableIds\r\n if (self.selectedVariableIds) {\r\n var selectedVariablesByQueue = _.sortBy(selectedVariables, \"queue\");\r\n var selectedVariableIds = _.map(selectedVariablesByQueue,\r\n function(selectedVariable) {\r\n return selectedVariable.id;\r\n });\r\n\r\n self.selectedVariableIds(selectedVariableIds);\r\n }\r\n\r\n return _.sortBy(selectedVariables, \"queue\");\r\n });\r\n\r\n self.unselectedVariables = ko.pureComputed(function() {\r\n var variables = self.variableViewModels();\r\n return _.filter(variables,\r\n function(variable) {\r\n return !variable.isSelected();\r\n });\r\n });\r\n}\r\nvar templateToExport = (Store.getters[\"User/isKognifai\"]) ? kognifaiTemplate : template;\r\n\r\nexport default { viewModel: ViewModel, template: templateToExport };\r\n","import ko from \"knockout\";\r\n\r\n//We have to import and register these components after user has been loaded\r\n//because they have to know what template to use based on if user is kognifai\r\n//or not.\r\nimport curves from \"Components/curves/curves/curves\";\r\nimport curveEdit from \"Components/curves/curve-edit/curve-edit\";\r\nimport curveDataTable from \"Components/curves/curve-data-table/curve-data-table\";\r\nimport curveDetails from \"Components/curves/curve-details/curve-details\";\r\nimport curvePlotFilters from \"Components/curves/curve-plot-filters/curve-plot-filters\";\r\nimport curvePoints from \"Components/curves/curve-points/curve-points\";\r\nimport curveSpecification from \"Components/curves/curve-specification/curve-specification\";\r\nimport variableSelectMulti from \"Components/variable-select-multi/variable-select-multi\";\r\n\r\nko.components.register(\"curves\", curves);\r\nko.components.register(\"curve-edit\", curveEdit);\r\nko.components.register(\"curve-data-table\", curveDataTable);\r\nko.components.register(\"curve-details\", curveDetails);\r\nko.components.register(\"curve-plot-filters\", curvePlotFilters);\r\nko.components.register(\"curve-points\", curvePoints);\r\nko.components.register(\"curve-specification\", curveSpecification);\r\nko.components.register(\"variable-select-multi\", variableSelectMulti);\r\n","// Module\nvar code = \"\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\";\n// Exports\nmodule.exports = code;","import net from \"App/net\";\r\nimport events from \"App/events\";\r\nimport Store from \"@/store\";\r\n\r\nvar CurvePlotsClient = function() {\r\n\r\n};\r\n\r\nCurvePlotsClient.prototype.find = function(vesselId) {\r\n var url = Store.getters[\"User/isKognifai\"] ? \"/Kognifai/CurvePlots/Find\" : \"/CurvePlots/Find\";\r\n var filter = {\r\n vesselId: vesselId,\r\n };\r\n\r\n return net.get(url, filter);\r\n};\r\n\r\nCurvePlotsClient.prototype.create = function(curvePlot) {\r\n var url = Store.getters[\"User/isKognifai\"] ? \"/Kognifai/CurvePlots\" : \"/CurvePlots\";\r\n return net.post(url, curvePlot).done(function(data) {\r\n events.curvePlotCreated.dispatch(data);\r\n });\r\n};\r\n\r\nCurvePlotsClient.prototype.update = function (curvePlot) {\r\n var url = Store.getters[\"User/isKognifai\"] ? \"/Kognifai/CurvePlots/\" : \"/CurvePlots/\";\r\n\r\n return net.put(url + curvePlot.id, curvePlot).done(function(data) {\r\n events.curvePlotUpdated.dispatch(data);\r\n });\r\n};\r\n\r\nCurvePlotsClient.prototype.remove = function(curvePlot) {\r\n var url = Store.getters[\"User/isKognifai\"] ? \"/Kognifai/CurvePlots/\" : \"/CurvePlots/\";\r\n\r\n return net.del(url + curvePlot.id).done(function() {\r\n events.curvePlotDeleted.dispatch(curvePlot);\r\n });\r\n};\r\n\r\nexport default new CurvePlotsClient();\r\n","import _ from \"underscore\";\r\n\r\nfunction getFuelDataFromValues(currentValue, comparableValue, isReferenceData, timePeriod) {\r\n var self = this;\r\n var data = isReferenceData ? timePeriod.getReferenceValue(currentValue.data) : currentValue.data;\r\n var isTimeSpanLessThanDataInterval = timePeriod.isTimeSpanLessThanDataInterval();\r\n\r\n var currentTime = isTimeSpanLessThanDataInterval ? timePeriod.startDate : currentValue.time;\r\n var endTime = isTimeSpanLessThanDataInterval ? timePeriod.endDate : comparableValue.time;\r\n\r\n var timeDifferenceInHours = timePeriod.getTimeDifferenceInHours(endTime, currentTime);\r\n var timeDifferenceInDays = timeDifferenceInHours / 24;\r\n\r\n var fuelConsumption = data * timeDifferenceInDays;\r\n\r\n if (isReferenceData) {\r\n var distance = currentValue.data * timeDifferenceInHours;\r\n }\r\n\r\n return { fuelConsumption: fuelConsumption, distance: distance };\r\n}\r\n\r\nfunction getFuelConsumptionData(timePeriod, variable, isReferenceData) {\r\n var variableData = variable.data;\r\n var totalTime = 0;\r\n var fuelConsumption = 0;\r\n var distance = 0;\r\n\r\n if (variableData.length === 1) {\r\n var previousValue = variableData[0];\r\n var comparableValue = { data: null, time: timePeriod.endDate };\r\n\r\n fuelData = getFuelDataFromValues(previousValue, comparableValue, isReferenceData, timePeriod);\r\n\r\n fuelConsumption += fuelData.fuelConsumption;\r\n distance += fuelData.distance;\r\n }\r\n\r\n for (var i = 1; i < variableData.length; i++) {\r\n var previousValue = variableData[i - 1];\r\n var comparableValue = variableData[i];\r\n\r\n if (!_.isNaN(previousValue.time) && !_.isNaN(comparableValue.time)) {\r\n var fuelData = getFuelDataFromValues(previousValue, comparableValue, isReferenceData, timePeriod);\r\n fuelConsumption += fuelData.fuelConsumption;\r\n distance += fuelData.distance;\r\n\r\n if (i === variableData.length - 1 && i > 0) {\r\n previousValue = comparableValue;\r\n comparableValue = { data: null, time: timePeriod.endDate };\r\n fuelData = getFuelDataFromValues(previousValue, comparableValue, isReferenceData, timePeriod);\r\n\r\n fuelConsumption += fuelData.fuelConsumption;\r\n distance += fuelData.distance;\r\n }\r\n }\r\n }\r\n return { fuelConsumption: fuelConsumption, distance: distance };\r\n}\r\n\r\nfunction getWeightedData(currentValue, comparableValue, timePeriod) {\r\n var isTimeSpanLessThanDataInterval = timePeriod.isTimeSpanLessThanDataInterval();\r\n var offset = getOffset(timePeriod, currentValue);\r\n\r\n var endTime = isTimeSpanLessThanDataInterval ? timePeriod.endDate : comparableValue.time;\r\n\r\n if (timePeriod.isLastTimePeriod) {\r\n var currentTime = isTimeSpanLessThanDataInterval ? timePeriod.startDate : (+currentValue.time + offset);\r\n } else if (offset > 0) {\r\n var currentTime = isTimeSpanLessThanDataInterval ? timePeriod.startDate : (+currentValue.time + offset);\r\n endTime = isTimeSpanLessThanDataInterval ? comparableValue.time : comparableValue.time;\r\n } else if (offset < 0) {\r\n var currentTime = isTimeSpanLessThanDataInterval ? currentValue.time : currentValue.time;\r\n } else {\r\n var currentTime = isTimeSpanLessThanDataInterval ? timePeriod.startDate : currentValue.time;\r\n }\r\n\r\n var weight = timePeriod.getTimeDifferenceInHours(endTime, currentTime);\r\n var weightedAverageValue = currentValue.data * weight;\r\n\r\n return { weight: weight, average: weightedAverageValue };\r\n}\r\n\r\nfunction getOffset(timePeriod, data) {\r\n return (timePeriod.startDate - data.time);\r\n}\r\n\r\nfunction calculateWeightedAverage(timePeriod, variableData) {\r\n var self = this;\r\n var average = 0;\r\n var weightSum = 0;\r\n\r\n if (variableData.length === 1) {\r\n var previousValue = variableData[0];\r\n var excludedData = timePeriod.variableDataList()[0].excludedData[0];\r\n\r\n if (timePeriod.variableDataList()[0].excludedData.length !== 0) {\r\n var comparableValue = excludedData.time < previousValue.time ? { data: null, time: timePeriod.endDate } : { data: null, time: excludedData.time };\r\n } else {\r\n var comparableValue = { data: null, time: timePeriod.endDate };\r\n }\r\n\r\n var weightedData = getWeightedData(previousValue, comparableValue, timePeriod);\r\n weightSum += weightedData.weight;\r\n average += weightedData.average;\r\n }\r\n\r\n for (var i = 1; i < variableData.length; i++) {\r\n var previousValue = variableData[i - 1];\r\n var comparableValue = variableData[i];\r\n\r\n if (!_.isNaN(previousValue.time) && !_.isNaN(comparableValue.time)) {\r\n var weightedData = getWeightedData(previousValue, comparableValue, timePeriod);\r\n\r\n weightSum += weightedData.weight;\r\n average += weightedData.average;\r\n \r\n if (i === variableData.length - 1 && i > 0) {\r\n previousValue = comparableValue;\r\n comparableValue = { data: null, time: timePeriod.endDate };\r\n\r\n weightedData = getWeightedData(previousValue, comparableValue, timePeriod);\r\n\r\n weightSum += weightedData.weight;\r\n average += weightedData.average;\r\n }\r\n }\r\n }\r\n\r\n var weightedAverage = average / weightSum;\r\n return {weightedAverage: weightedAverage, includedTimeInHours: weightSum};\r\n}\r\n\r\nfunction getGranularityAsMillisecond(granularity) {\r\n switch (granularity) {\r\n case \"Minute\":\r\n return 60000;\r\n case \"Quarter\":\r\n case \"quarterHour\":\r\n return 900000;\r\n case \"Hour\":\r\n return 3600000;\r\n default:\r\n break;\r\n }\r\n}\r\n\r\nexport default {\r\n getWeightedAverageOfVariableData: function(timePeriod, variableData) {\r\n return calculateWeightedAverage(timePeriod, variableData);\r\n },\r\n getFuelConsumptionData: function (timePeriod, variable, isReferenceData) {\r\n return getFuelConsumptionData(timePeriod, variable, isReferenceData);\r\n },\r\n getGranularityAsMillisecond: function(granularity) {\r\n return getGranularityAsMillisecond(granularity);\r\n },\r\n getWeightedData: function(currentValue, comparableValue, timePeriod) {\r\n return getWeightedData(currentValue, comparableValue, timePeriod);\r\n },\r\n};","import ko from \"knockout\";\r\nimport _ from \"underscore\";\r\n\r\nfunction CurveVariable(id, data, excludedData, average, name, displayName) {\r\n var self = this;\r\n self.id = id;\r\n self.excludedData = excludedData;\r\n self.average = ko.observable(average);\r\n self.data = convertDataToReadableList(data);\r\n self.name = name;\r\n self.displayName = displayName;\r\n}\r\n\r\nfunction convertDataToReadableList(data) {\r\n return _.map(data, function(value, time) {\r\n return { data: value, time: time };\r\n });\r\n}\r\n\r\nCurveVariable.prototype.getAverageText = function () {\r\n return this.average.toFixed(2);\r\n};\r\n\r\nexport default CurveVariable;","// Module\nvar code = \"
\\r\\n
\\r\\n \\r\\n
\\r\\n

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

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

Save/load presets

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

Preset name

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

Preset with that name already exists

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

\\r\\n Curve\\r\\n \\r\\n

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

Mode

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

\\r\\n Time span\\r\\n \\r\\n

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

Or

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

\\r\\n Exclusion filters\\r\\n \\r\\n

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

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

Made by Danelec

\\r\\n
\\r\\n\";\n// Exports\nmodule.exports = code;","import _ from \"underscore\";\r\n\r\nfunction getIntersectionFromMultidimensionalArray(multidimensionalArray) {\r\n var array = [];\r\n\r\n _.each(multidimensionalArray, function (list, index) {\r\n if (index < multidimensionalArray.length - 1) {\r\n array = _.intersection(list, multidimensionalArray[index + 1]);\r\n }\r\n if (array.length === 0) {\r\n array = list;\r\n }\r\n });\r\n\r\n return array;\r\n}\r\n\r\nexport default {\r\n getIntersectionFromMultidimensionalArray: function (multidimensionalArray) {\r\n return getIntersectionFromMultidimensionalArray(multidimensionalArray);\r\n },\r\n};","import _ from \"underscore\";\r\nimport listHelper from \"Utilities/curve-list-helper\";\r\n\r\nfunction containsTime(list, time) {\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i] === time) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction getExcludedTimes(excludedVariableList) {\r\n var excludedTimes = [];\r\n for (var i = 0; i < excludedVariableList.length; i++) {\r\n var variable = excludedVariableList[i];\r\n for (var j = 0; j < variable.excludedData.length; j++) {\r\n var value = variable.excludedData[j];\r\n if (!containsTime(excludedTimes, value)) {\r\n excludedTimes.push(value);\r\n }\r\n }\r\n }\r\n return excludedTimes;\r\n}\r\n\r\nfunction containsExcluded(list, time) {\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i].time === time) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction filterDataListToSingleList(filterDataList) {\r\n var list = [];\r\n\r\n for (var i = 0; i < filterDataList.length; i++) {\r\n var filterData = filterDataList[i];\r\n for (var j = 0; j < filterData.dataList.excluded.length; j++) {\r\n var value = filterData.dataList.excluded[j];\r\n if (!containsExcluded(list, value.time)) {\r\n list.push(value.time);\r\n }\r\n }\r\n }\r\n\r\n return list;\r\n}\r\n\r\nfunction excludeDataInTimeRange(variableData, currentDateIndex, nextDateIndex, excludedDataList) {\r\n for (var i = currentDateIndex; i < nextDateIndex; i++) {\r\n excludedDataList.push(variableData[i]);\r\n }\r\n}\r\n\r\nfunction getNextValidDate(variableData, startIndex, operator, limit) {\r\n for (var i = startIndex; i < variableData.length; i++) {\r\n if (!compareValueToLimit(operator, variableData[i], limit)) {\r\n return i;\r\n }\r\n }\r\n return variableData.length;\r\n}\r\n\r\nfunction isTimeRangeOverTimeLimit(variableData, startIndex, stopIndex, filterContinuousLength) {\r\n var startTime = variableData[startIndex].time;\r\n stopIndex = stopIndex === variableData.length ? stopIndex - 1 : stopIndex;\r\n var stopTime = variableData[stopIndex].time;\r\n var diffTime = stopTime - startTime;\r\n\r\n if (diffTime > filterContinuousLength) {\r\n return true;\r\n }\r\n}\r\n\r\nfunction compareValueToLimit(operator, value, limit) {\r\n if (value) {\r\n limit = Number(limit);\r\n if (operator === \"<\") {\r\n if (value.data < limit) {\r\n return true;\r\n }\r\n\r\n } else if (operator === \">\") {\r\n if (value.data > limit) {\r\n return true;\r\n }\r\n\r\n } else if (operator === \"=\") {\r\n if (value.data === limit) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction isValueBetweenTimeRange(value, filter) {\r\n var fromDate = filter.timeRangeFromDateTimeInMillisecs;\r\n var toDate = filter.timeRangeToDateTimeInMillisecs;\r\n\r\n return value.time >= fromDate && value.time < toDate;\r\n}\r\n\r\nfunction getExcludedDataFromFilter(variableData, filter) {\r\n var limit = filter.value;\r\n var operator = filter.operator;\r\n var isFilterContinuous = filter.isContinuous;\r\n var continuousForInMilliseconds = filter.continuousForInMilliseconds;\r\n var excludedDataList = [];\r\n var nextDateIndex = -1;\r\n var currentDateIndex = 0;\r\n\r\n if (isFilterContinuous) {\r\n for (var i = 0; i < variableData.length; i++) {\r\n var value = variableData[i];\r\n if (compareValueToLimit(operator, value, limit)) {\r\n currentDateIndex = i;\r\n nextDateIndex = getNextValidDate(variableData, (i + 1), operator, limit);\r\n var excludedTimeRange = isTimeRangeOverTimeLimit(variableData, currentDateIndex, nextDateIndex, continuousForInMilliseconds);\r\n if (excludedTimeRange) {\r\n excludeDataInTimeRange(variableData, currentDateIndex, nextDateIndex, excludedDataList);\r\n i = nextDateIndex - 1;\r\n }\r\n }\r\n }\r\n } else {\r\n for (var i = 0; i < variableData.length; i++) {\r\n var value = variableData[i];\r\n if (filter.isTimeRangeFilter) {\r\n if (isValueBetweenTimeRange(value, filter)) {\r\n excludedDataList.push(value);\r\n }\r\n } else {\r\n if (compareValueToLimit(operator, value, limit)) {\r\n excludedDataList.push(value);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { excluded: excludedDataList};\r\n}\r\n\r\nfunction getExcludedVariableData(variableData, variableId, filters, filtersContainsTimeRange) {\r\n var variableFilters = [];\r\n var filterDataList = [];\r\n var filterInfoList = [];\r\n _.each(filters, function (filter) {\r\n if (filter.variableId === variableId) {\r\n variableFilters.push(filter);\r\n } else if (filter.isTimeRangeFilter && !filtersContainsTimeRange) {\r\n variableFilters.push(filter);\r\n filtersContainsTimeRange = true;\r\n }\r\n });\r\n\r\n _.each(variableFilters, function (filter) {\r\n var selectedVariableId = filter ? filter.variableId : -1;\r\n if (selectedVariableId === variableId || filter.isTimeRangeFilter) {\r\n var dataList = getExcludedDataFromFilter(variableData, filter);\r\n filterDataList.push({ dataList: dataList, filter: filter });\r\n }\r\n });\r\n\r\n if (filterDataList.length > 0) {\r\n filterInfoList = filterDataList;\r\n var excludedData = filterDataListToSingleList(filterDataList);\r\n filterDataList = excludedData;\r\n }\r\n\r\n return { data: filterDataList, filterInfoList: filterInfoList, filtersContainsTimeRange: filtersContainsTimeRange };\r\n}\r\n\r\nfunction getExcludedTimesList(filterGroups, variableDataList) {\r\n var excludedTimes = [];\r\n var filterInfoList = [];\r\n var timeRangeFilterTimes = [];\r\n\r\n _.each(filterGroups, function (filters) {\r\n var filtersContainsTimeRange = false;\r\n var timeRangeFilterAdded = false;\r\n var tempExcludedList = [];\r\n _.each(variableDataList, function (variable) {\r\n var excludedDataList = getExcludedVariableData(variable.data, variable.id, filters, filtersContainsTimeRange);\r\n filtersContainsTimeRange = excludedDataList.filtersContainsTimeRange;\r\n filterInfoList.push(excludedDataList.filterInfoList);\r\n if (filtersContainsTimeRange && !timeRangeFilterAdded) {\r\n timeRangeFilterTimes.push(excludedDataList.data);\r\n timeRangeFilterAdded = true;\r\n } else {\r\n tempExcludedList.push({ variable: variable, excludedData: excludedDataList.data });\r\n }\r\n\r\n });\r\n var times = getExcludedTimes(tempExcludedList);\r\n excludedTimes.push(times);\r\n });\r\n\r\n return { excludedTimes: excludedTimes, timeRangeFilterTimes: timeRangeFilterTimes, filterInfoList: filterInfoList};\r\n}\r\n\r\nfunction addTimesFromTimeRangeFilter(excludedTimes, timeRangeFilters) {\r\n var times = excludedTimes;\r\n for (var i = 0; i < timeRangeFilters.length; i++) {\r\n for (var j = 0; j < timeRangeFilters[i].length; j++) {\r\n if (!containsTime(excludedTimes, timeRangeFilters[i][j])) {\r\n times.push(timeRangeFilters[i][j]);\r\n }\r\n }\r\n\r\n }\r\n return times;\r\n}\r\n\r\nexport default {\r\n getExcludedTimes: function (filterGroups, variableDataList) {\r\n var excludedData = getExcludedTimesList(filterGroups, variableDataList);\r\n var excludedTimes = listHelper.getIntersectionFromMultidimensionalArray(excludedData.excludedTimes);\r\n excludedTimes = addTimesFromTimeRangeFilter(excludedTimes, excludedData.timeRangeFilterTimes);\r\n excludedTimes.sort(function (a, b) { return a - b; });\r\n\r\n return { excludedTimes: excludedTimes, filterInfoList: excludedData.filterInfoList };\r\n },\r\n};\r\n\r\n","import ko from \"knockout\";\r\nimport variableCalculations from \"Utilities/curve-variable-calculations-helper\";\r\n\r\nfunction CpModule(timePeriod) {\r\n var self = this;\r\n self.timePeriod = timePeriod;\r\n self.xAxisVariable = self.timePeriod.xAxisVariable;\r\n self.yAxisVariable = self.timePeriod.yAxisVariable;\r\n self.selectedCurve = self.timePeriod.selectedCurve;\r\n\r\n self.distanceTravelled = ko.observable(0);\r\n\r\n self.actualFuelConsumption = ko.pureComputed(function () {\r\n if (!self.xAxisVariable()) {\r\n return parseFloat(\"NaN\");\r\n }\r\n var fuelConsumptionData = variableCalculations.getFuelConsumptionData(self.timePeriod, self.yAxisVariable(), false);\r\n return fuelConsumptionData.fuelConsumption;\r\n });\r\n\r\n self.referenceFuelConsumption = ko.pureComputed(function () {\r\n if (!self.xAxisVariable()) {\r\n return parseFloat(\"NaN\");\r\n }\r\n var fuelConsumptionData = variableCalculations.getFuelConsumptionData(self.timePeriod, self.xAxisVariable(), true);\r\n self.distanceTravelled(fuelConsumptionData.distance);\r\n return fuelConsumptionData.fuelConsumption;\r\n });\r\n\r\n self.differenceBetweenConsumptions = ko.pureComputed(function () {\r\n var actual = self.actualFuelConsumption();\r\n var reference = self.referenceFuelConsumption();\r\n return actual - reference;\r\n });\r\n}\r\n\r\nexport default CpModule;","import ko from \"knockout\";\r\nimport _ from \"underscore\";\r\nimport $ from \"jquery\";\r\nimport dateHelper from \"Utilities/date-helper\";\r\nimport timeConverter from \"Utilities/time-converter-helper\";\r\nimport variableCalculations from \"Utilities/curve-variable-calculations-helper\";\r\nimport curvePredictionHelper from \"Utilities/curve-prediction-helper\";\r\nimport CpModule from \"ViewModels/curves/cpModule\";\r\nimport Store from \"@/store\";\r\n\r\nfunction TimePeriod(id, curvePlot, startDate, endDate, variableDataList, referenceCurveDataPoints, selectedCurve) {\r\n var self = this;\r\n\r\n self.isKognifai = Store.getters[\"User/isKognifai\"];\r\n\r\n self.hourInMilliseconds = 3600000;\r\n\r\n self.selectedCurve = selectedCurve.curve();\r\n self.curvePlot = curvePlot;\r\n self.id = id;\r\n self.startDate = startDate.toDate().getTime();\r\n self.endDate = endDate.toDate().getTime();\r\n self.referenceCurveDataPoints = referenceCurveDataPoints;\r\n\r\n self.dataInterval = curvePlot.dataInterval;\r\n\r\n self.variableDataList = ko.observableArray([]);\r\n self.filterInfoList = ko.observableArray([]);\r\n self.includedTimeInHours = ko.observable(0);\r\n self.excludedTimeInHours = ko.observable(0);\r\n self.distanceTravelled = ko.observable(0);\r\n\r\n self.consumptionText = ko.pureComputed(function () {\r\n var curveMode = self.selectedCurve.curveMode;\r\n\r\n if (curveMode === \"TimeCharter\") {\r\n return self.getDeviationFromReferenceYAxisString();\r\n } else if (curveMode === \"SpotMarket\") {\r\n return self.extrapolatedConsumption();\r\n }\r\n\r\n return \"\";\r\n });\r\n\r\n self.extrapolatedConsumption = ko.pureComputed(function() {\r\n var curve = self.selectedCurve;\r\n var xAxisVariable = self.xAxisVariable();\r\n var yAxisVariable = self.yAxisVariable();\r\n var referenceValue = curve.referenceValue;\r\n var exponent = curve.exponent;\r\n\r\n if (curve.curveMode !== \"SpotMarket\") {\r\n return 0;\r\n }\r\n\r\n var result = 0;\r\n var dataPoints = 0;\r\n\r\n for (var i = 0; i < xAxisVariable.data.length; i++) {\r\n var xAxisData = xAxisVariable.data[i].data;\r\n var yAxisData = yAxisVariable.data[i].data;\r\n\r\n if (xAxisData === 0) {\r\n continue;\r\n }\r\n\r\n var extrapolatedData = yAxisData * Math.pow((referenceValue / xAxisData), exponent);\r\n if (_.isNaN(extrapolatedData)) {\r\n continue;\r\n }\r\n dataPoints ++;\r\n result += extrapolatedData;\r\n }\r\n\r\n result = result / dataPoints;\r\n\r\n return _.isNaN(result) ? \"No data\" : result.toFixed(2);\r\n });\r\n\r\n self.timeMultiplierInSeconds = ko.pureComputed(function () {\r\n var dataInterval = self.dataInterval.toLowerCase();\r\n switch (dataInterval) {\r\n case \"minute\":\r\n return 60;\r\n case \"tenminutes\":\r\n return 60 * 10;\r\n case \"quarter\":\r\n case \"quarterHour\":\r\n return 60 * 15;\r\n case \"hour\":\r\n return 60 * 60;\r\n default:\r\n return 60;\r\n }\r\n });\r\n\r\n self.isTimeSpanLessThanDataInterval = ko.pureComputed(function () {\r\n var timePeriodTimeSpanInSeconds = self.getTimeDifferenceInHours(self.endDate, self.startDate, true) * 60 * 60;\r\n\r\n return timePeriodTimeSpanInSeconds < self.timeMultiplierInSeconds();\r\n });\r\n\r\n self.excludedTimeInHours = ko.pureComputed(function() {\r\n var variable = self.variableDataList()[0];\r\n if (!variable) {\r\n return 0;\r\n }\r\n var time = self.timeMultiplierInSeconds() * variable.excludedData.length;\r\n return time / 3600;\r\n });\r\n\r\n self.excludedDataInfoText = ko.pureComputed(function () {\r\n var currentSampleSize = self.currentSampleSize();\r\n var excludedSampleSize = 100 - currentSampleSize;\r\n var infoText = \"\";\r\n if (currentSampleSize > -1 && excludedSampleSize > 0) {\r\n var filterInfoText = self.getFilterInfoString();\r\n infoText += \"

\" + excludedSampleSize.toFixed(2) + \"% of sample data has been excluded

\\n\";\r\n infoText += filterInfoText;\r\n }\r\n return infoText;\r\n });\r\n\r\n self.currentSampleSize = ko.pureComputed(function () {\r\n var sampleSize = 100;\r\n\r\n var yAxisVariable = self.yAxisVariable();\r\n\r\n if (yAxisVariable) {\r\n if (yAxisVariable.data.length === 0 && yAxisVariable.excludedData.length === 0) {\r\n return -1;\r\n } else {\r\n var includedDataLength = yAxisVariable.data.length;\r\n var excludedDataLength = yAxisVariable.excludedData.length;\r\n var dataLength = includedDataLength + excludedDataLength;\r\n\r\n sampleSize = (includedDataLength / dataLength) * 100;\r\n return sampleSize;\r\n }\r\n }\r\n\r\n return -1;\r\n });\r\n\r\n self.isTimePeriodExcluded = ko.pureComputed(function () {\r\n var excluded = false;\r\n var variableDataList = self.variableDataList();\r\n var currentSampleSize = self.currentSampleSize();\r\n\r\n if (currentSampleSize <= 0 || variableDataList.length === 0) {\r\n excluded = true;\r\n }\r\n\r\n return excluded;\r\n });\r\n\r\n self.formatedTimeRangeString = ko.pureComputed(function () {\r\n var startDate = dateHelper.getFormatedDateTimeString(self.startDate);\r\n var endDate = dateHelper.getFormatedDateTimeString(self.endDate);\r\n var text = startDate + \"
\" + endDate;\r\n return text;\r\n });\r\n\r\n self.formatedStartDate = ko.pureComputed(function () {\r\n var startDate = dateHelper.getFormatedDateTimeString(self.startDate);\r\n return startDate;\r\n });\r\n\r\n self.formatedEndDate = ko.pureComputed(function () {\r\n var endDate = dateHelper.getFormatedDateTimeString(self.endDate);\r\n return endDate;\r\n });\r\n\r\n self.xAxisVariable = ko.pureComputed(function() {\r\n var variableId = self.isKognifai ? String(self.selectedCurve.xAxisLogVariableId) : self.selectedCurve.xAxisLogVariableId;\r\n var variable = self.findVariableById(self.variableDataList(), variableId);\r\n\r\n if (variable) {\r\n variable.id = variableId;\r\n }\r\n\r\n return variable;\r\n });\r\n\r\n self.yAxisVariable = ko.pureComputed(function () {\r\n var variableId = self.isKognifai ? String(self.selectedCurve.yAxisLogVariableId) : self.selectedCurve.yAxisLogVariableId;\r\n var variable = self.findVariableById(self.variableDataList(), variableId);\r\n\r\n if (variable) {\r\n variable.id = variableId;\r\n }\r\n\r\n return variable;\r\n });\r\n\r\n self.displayExcludedDataInfo = ko.pureComputed(function() {\r\n var currentSampleSize = self.currentSampleSize();\r\n\r\n if (currentSampleSize === -1 || currentSampleSize === 100) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n\r\n self.cpModule = ko.pureComputed(function () {\r\n return new CpModule(self);\r\n });\r\n\r\n self.isXAxisTimeVariable = ko.pureComputed(function () {\r\n return !self.xAxisVariable() && self.yAxisVariable();\r\n });\r\n}\r\n\r\nTimePeriod.prototype.getTimeDifferenceInHours = function (currentTime, previousTime, simpleDifference) {\r\n var timeDifferenceInHours = (currentTime - previousTime) / (this.hourInMilliseconds);\r\n var timeMultiplierInHours = timeConverter.secondsToHours(this.timeMultiplierInSeconds());\r\n\r\n if (simpleDifference) {\r\n return timeDifferenceInHours;\r\n }\r\n\r\n if (timeDifferenceInHours > timeMultiplierInHours) {\r\n timeDifferenceInHours = timeMultiplierInHours;\r\n }\r\n\r\n return timeDifferenceInHours;\r\n\r\n};\r\n\r\nTimePeriod.prototype.getReferenceValue = function(value) {\r\n var curveFit = this.selectedCurve.curveFit.toLowerCase();\r\n var regressionOrder = this.selectedCurve.regressionOrder;\r\n var dataPoints = _.clone(this.referenceCurveDataPoints);\r\n\r\n var referenceValue = curvePredictionHelper.predictRegressionValue(Number(value), dataPoints, curveFit, regressionOrder);\r\n\r\n return referenceValue;\r\n};\r\n\r\nTimePeriod.prototype.getExcludedDataFromFilterInfo = function(excludedFilterInfoData, variable) {\r\n var excludedData = variable.excludedData;\r\n var startDate = this.startDate;\r\n var endDate = this.endDate;\r\n var self = this;\r\n var list = [];\r\n for (var i = 0; i < excludedFilterInfoData.length; i++) {\r\n var value = excludedFilterInfoData[i].time;\r\n if (value >= startDate || value < endDate) {\r\n if (self.containsTime(excludedData, value)) {\r\n list.push(value);\r\n }\r\n }\r\n }\r\n\r\n return list;\r\n};\r\n\r\nTimePeriod.prototype.getFilterInfoString = function() {\r\n var self = this;\r\n var string = \"\";\r\n var filterInfoList = this.filterInfoList();\r\n var variableDataList = this.variableDataList();\r\n\r\n for (var i = 0; i < filterInfoList.length; i++) {\r\n for (var j = 0; j < filterInfoList[i].length; j++) {\r\n var filterInfo = filterInfoList[i][j];\r\n var variable = variableDataList[0];\r\n var excludedTimes = self.getExcludedDataFromFilterInfo(filterInfo.dataList.excluded, variable);\r\n\r\n var filterTimeInHours = (self.timeMultiplierInSeconds() * excludedTimes.length) / 3600;\r\n\r\n if (filterTimeInHours > 0) {\r\n string += \"
\" + filterInfo.filter.filterDescription + \": \" + \"\" + filterTimeInHours.toFixed(2) + \" hours
\\n\";\r\n }\r\n }\r\n }\r\n\r\n return string;\r\n};\r\n\r\nTimePeriod.prototype.getDeviationFromReferenceYAxisString = function () {\r\n var deviation = this.getDeviationFromReferenceYAxis();\r\n return deviation ? deviation.toFixed(2) : \"No data\";\r\n};\r\n\r\nTimePeriod.prototype.getDeviationFromReferenceYAxis = function () {\r\n if (this.currentSampleSize() > 0) {\r\n var yAxisVariable = this.yAxisVariable();\r\n var referenceYAxisValue = this.getReferenceYAxisValue();\r\n if (yAxisVariable && referenceYAxisValue) {\r\n return yAxisVariable.average - referenceYAxisValue;\r\n }\r\n }\r\n};\r\n\r\nTimePeriod.prototype.getReferenceYAxisValue = function() {\r\n var xAxisVariable = this.xAxisVariable();\r\n var yAxisVariable = this.yAxisVariable();\r\n\r\n if (this.isXAxisTimeVariable()) {\r\n var dataPoints = _.clone(this.referenceCurveDataPoints);\r\n return dataPoints[0][1];\r\n }\r\n else if (xAxisVariable.data && xAxisVariable.data.length > 0) {\r\n var curveFit = this.selectedCurve.curveFit.toLowerCase();\r\n var regressionOrder = this.selectedCurve.regressionOrder;\r\n var dataPoints = _.clone(this.referenceCurveDataPoints);\r\n\r\n var value = curvePredictionHelper.predictRegressionValue(xAxisVariable.average, dataPoints, curveFit, regressionOrder);\r\n\r\n return value ? value : \"NaN\";\r\n }\r\n};\r\n\r\nTimePeriod.prototype.getAverageValueString = function (variable) {\r\n var average = undefined;\r\n if (variable) {\r\n average = this.getAverageValueOfVariable(variable.id);\r\n }\r\n\r\n if (_.isUndefined(average) || _.isNaN(average)) {\r\n return \"No data\";\r\n } else {\r\n return average.toFixed(2);\r\n }\r\n};\r\n\r\nTimePeriod.prototype.getAverageValueOfVariable = function (variableId) {\r\n var variable = this.findVariableById(this.variableDataList(), variableId);\r\n\r\n if (variable) {\r\n return variable.average;\r\n }\r\n};\r\n\r\nTimePeriod.prototype.addVariables = function(variables, filterInfoList) {\r\n var self = this;\r\n _.each(variables, function (variable) {\r\n self.variableDataList.push({ id: variable.id, data: [], excludedData: [], name: variable.name, unit: variable.unit });\r\n });\r\n self.filterInfoList(filterInfoList);\r\n};\r\n\r\nTimePeriod.prototype.addVariableData = function (value, variableId, excluded) {\r\n var self = this;\r\n var variable = self.findVariableById(self.variableDataList(), variableId);\r\n\r\n if (variable) {\r\n if (excluded) {\r\n variable.excludedData.push(value);\r\n } else {\r\n variable.data.push(value);\r\n }\r\n }\r\n};\r\n\r\nTimePeriod.prototype.calculateAverageData = function () {\r\n var self = this;\r\n var variableDataList = this.variableDataList();\r\n _.each(variableDataList, function (variable) {\r\n var averageData = variableCalculations.getWeightedAverageOfVariableData(self, variable.data);\r\n\r\n variable.average = averageData.weightedAverage;\r\n self.includedTimeInHours(averageData.includedTimeInHours);\r\n });\r\n};\r\n\r\nTimePeriod.prototype.findVariableById = function (array, id) {\r\n for (var i = 0; i < array.length; i++) {\r\n if (array[i].id === id) {\r\n return array[i];\r\n }\r\n }\r\n};\r\n\r\nTimePeriod.prototype.containsTime = function (array, time) {\r\n for (var i = 0; i < array.length; i++) {\r\n if (array[i].time === time) {\r\n return true;\r\n }\r\n }\r\n};\r\n\r\nTimePeriod.prototype.getTableData = function() {\r\n var self = this;\r\n var cpModule = self.cpModule();\r\n var selectedCurve = self.selectedCurve;\r\n var curveMode = self.selectedCurve.curveMode;\r\n var tableData = {\r\n curveMode: curveMode,\r\n startDate: self.formatedStartDate(),\r\n endDate: self.formatedEndDate(),\r\n includedTimeInHours: self.includedTimeInHours(),\r\n excludedTimeInHours: self.excludedTimeInHours(),\r\n };\r\n\r\n if (curveMode === \"TimeCharter\") {\r\n tableData.actualFuelConsumption = cpModule.actualFuelConsumption();\r\n tableData.referenceFuelConsumption = cpModule.referenceFuelConsumption();\r\n tableData.differenceBetweenConsumptions = cpModule.differenceBetweenConsumptions();\r\n tableData.distanceTravelled = cpModule.distanceTravelled();\r\n tableData.deviationFromReferenceYAxis = self.getDeviationFromReferenceYAxis();\r\n } else if (curveMode === \"SpotMarket\") {\r\n var extrapolatedConsumption = self.extrapolatedConsumption();\r\n\r\n if (!_.isNaN(parseFloat(extrapolatedConsumption))) {\r\n tableData.extrapolatedConsumption = self.extrapolatedConsumption();\r\n }\r\n }\r\n\r\n tableData.excludedDataInfoText = $(self.excludedDataInfoText()).text();\r\n\r\n var xAxisVariable = self.xAxisVariable();\r\n if (xAxisVariable) {\r\n tableData.xAxisData = {\r\n variableName: xAxisVariable.name,\r\n averageValue: xAxisVariable.average,\r\n };\r\n }\r\n\r\n var yAxisVariable = self.yAxisVariable();\r\n tableData.yAxisData = {\r\n variableName: yAxisVariable.name,\r\n averageValue: yAxisVariable.average,\r\n };\r\n\r\n var additionalVariables = _.filter(self.variableDataList(), function(variable) {\r\n return variable.id !== yAxisVariable.id && (!xAxisVariable || variable.id !== xAxisVariable.id);\r\n });\r\n tableData.additionalData = _.map(additionalVariables, function(variable) {\r\n return {\r\n variableName: variable.name,\r\n averageValue: variable.average,\r\n };\r\n });\r\n\r\n return tableData;\r\n};\r\n\r\nexport default TimePeriod;\r\n","// Module\nvar code = \"\\r\\n
\\r\\n
\\r\\n

\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n From date\\r\\n \\r\\n
\\r\\n
\\r\\n To date\\r\\n \\r\\n
\\r\\n
\\r\\n Duration\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n

Exclusion filters

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

0\\\">And

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

Or

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

Summary

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

Charter party data

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

Prediction

\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n first_page\\r\\n keyboard_arrow_left\\r\\n
\\r\\n
\\r\\n

\\r\\n / \\r\\n

\\r\\n
\\r\\n
\\r\\n keyboard_arrow_right\\r\\n last_page\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\";\n// Exports\nmodule.exports = code;"],"sourceRoot":""}