{"version":3,"file":"FormattedDuration.min.js","sources":["https:\/\/moodle.sonsbeekmedia.nl\/caie_39\/mod\/teachingtools\/amd\/src\/duration\/FormattedDuration.js"],"sourcesContent":["export default class FormattedDuration {\n\n DEFAULT_HOURS_UNIT = \":\";\n DEFAULT_MINUTES_UNIT = \":\";\n DEFAULT_SECONDS_UNIT = \"\";\n\n SECONDS_IN_HOUR = 3600;\n SECONDS_IN_MINUTE = 60;\n ONE_SECOND = 1;\n\n\n constructor(config = {\n hoursUnitString: \":\",\n minutesUnitString: \":\",\n secondsUnitString: \"\"\n }) {\n this.SECONDS_CHUNK = \"seconds\";\n this.MINUTES_CHUNK = \"minutes\";\n this.HOURS_CHUNK = \"hours\";\n this.CHUNK_OUT_OF_RANGE = \"OutOfRange\";\n\n this._hoursUnit = this.DEFAULT_HOURS_UNIT;\n this._minutesUnit = this.DEFAULT_MINUTES_UNIT;\n this._secondsUnit = this.DEFAULT_SECONDS_UNIT;\n\n if (config.hasOwnProperty(\"hoursUnitString\")) {\n this._hoursUnit = config.hoursUnitString;\n }\n\n if (config.hasOwnProperty(\"minutesUnitString\")) {\n this._minutesUnit = config.minutesUnitString;\n }\n\n if (config.hasOwnProperty(\"secondsUnitString\")) {\n this._secondsUnit = config.secondsUnitString;\n }\n\n this._ValidateInternalStateOrThrow();\n this._seconds = 0;\n this._minutes = 0;\n this._hours = 0;\n this._totalSeconds = 0;\n }\n\n _ValidateInternalStateOrThrow() {\n\n var hourRegex = new RegExp(\"^\\\\D(.*\\\\D)?$\", \"g\");\n var minuteRegex = new RegExp(\"^\\\\D(.*\\\\D)?$\", \"g\");\n\n if (this._hoursUnit.length === 0) {\n throw new Error(\"hour unit cannot be empty\");\n }\n\n if (this._minutesUnit.length === 0) {\n throw new Error(\"minute unit cannot be empty\");\n }\n\n if (!hourRegex.test(this._hoursUnit)) {\n throw new Error(\"invalid hour unit '\" + this._hoursUnit + \"'\");\n }\n\n if (!minuteRegex.test(this._minutesUnit)) {\n throw new Error(\"invalid minute unit '\" + this._minutesUnit + \"'\");\n }\n }\n\n _FormattedHours() {\n return (\"\" + this._hours).padStart(2, \"0\");\n }\n\n _FormattedMinutes() {\n return (\"\" + this._minutes).padStart(2, \"0\");\n }\n\n _FormattedSeconds() {\n return (\"\" + this._seconds).padStart(1, \"0\")\n }\n\n _FormattedHoursWithUnit() {\n return this._FormattedHours() + this._hoursUnit;\n }\n\n _FormattedMinutesWithUnit() {\n return this._FormattedMinutes() + this._minutesUnit;\n }\n\n _FormattedSecondsWithUnit() {\n return this._FormattedSeconds() + this._secondsUnit;\n }\n\n _GetIntegerOrNan(value) {\n if (typeof value === 'string' && value.length === 0) {\n return NaN;\n }\n let n = Number(value);\n if (isNaN(n)) {\n return NaN;\n }\n if (Number.isInteger(n)) {\n return n;\n }\n return NaN;\n }\n\n ToFormattedString() {\n\n let $returnString = this._FormattedSecondsWithUnit();\n\n if (this._minutes > 0) {\n $returnString = this._FormattedMinutesWithUnit() + this._FormattedSecondsWithUnit();\n }\n if (this._hours > 0) {\n $returnString = this._FormattedHoursWithUnit() + this._FormattedMinutesWithUnit() + this._FormattedSecondsWithUnit();\n }\n\n return $returnString;\n }\n\n ToTotalSeconds() {\n return this._totalSeconds;\n }\n\n AddSeconds(seconds) {\n this.SetTotalSeconds(this._totalSeconds + seconds);\n }\n\n SubtractSeconds(seconds) {\n let intSeconds = this._GetIntegerOrNan(seconds);\n if(isNaN(intSeconds) || intSeconds < 0){\n return;\n }\n\n if (this._totalSeconds - intSeconds < 0) {\n return;\n }\n this._totalSeconds -= intSeconds;\n this._ResetFromTotalSeconds();\n }\n\n SetTotalSeconds(seconds) {\n \/\/ todo: what is max value ?\n let intSeconds = this._GetIntegerOrNan(seconds);\n if(isNaN(intSeconds) || intSeconds < 0){\n return;\n }\n\n \/\/ todo , validate input\n \/\/ value must be int and not negative\n \/\/ and not bigger then .. figure out max value\n this._totalSeconds = seconds;\n this._ResetFromTotalSeconds()\n }\n\n _ResetFromTotalSeconds() {\n this._hours = Math.floor(this._totalSeconds \/ this.SECONDS_IN_HOUR);\n this._minutes = Math.floor((this._totalSeconds % this.SECONDS_IN_HOUR) \/ this.SECONDS_IN_MINUTE);\n this._seconds = Math.floor((this._totalSeconds % this.SECONDS_IN_HOUR) % this.SECONDS_IN_MINUTE);\n }\n\n _RecalculateTotalSeconds(hours, minutes, seconds) {\n if (Number.isInteger(hours)) {\n this._hours = hours;\n }\n\n if (Number.isInteger(minutes)) {\n this._minutes = minutes;\n }\n\n if (Number.isInteger(seconds)) {\n this._seconds = seconds;\n }\n\n this._totalSeconds = this._hours * this.SECONDS_IN_HOUR +\n this._minutes * this.SECONDS_IN_MINUTE +\n this._seconds;\n\n \/\/console.log(`Realculated to ${this._hours}:${this._minutes}:${this._seconds}`);\n }\n\n FromFormattedString(formattedString) {\n \/\/ todo: validate if value is not a string\n \/\/ cut the string into pieces\n \/\/ and extract each value from it\n let spitedChunks = this._ExtractTimeValuesFromFormattedString(formattedString);\n let [hours, minutes, seconds] = spitedChunks;\n this._RecalculateTotalSeconds(hours, minutes, seconds);\n }\n\n\n\n \/\/ always return table with thre\n _ExtractTimeValuesFromFormattedString(formattedString) {\n const hoursUnitStringIndex = formattedString.indexOf(this._hoursUnit);\n if (hoursUnitStringIndex < 0) {\n return [NaN, NaN, NaN];\n }\n const hoursAsString = formattedString.substring(0, hoursUnitStringIndex);\n const hoursInt = this._GetIntegerOrNan(hoursAsString);\n\n let minutesTextStartIndex = hoursUnitStringIndex + this._hoursUnit.length;\n const minuteUnitStringIndex = formattedString.indexOf(this._minutesUnit, minutesTextStartIndex);\n\n if (minuteUnitStringIndex < 0) {\n return [hoursInt, NaN, NaN];\n }\n const minuteAsString = formattedString.substring(minutesTextStartIndex, minuteUnitStringIndex);\n\n const minutesInt = this._GetIntegerOrNan(minuteAsString);\n\n\n let secondsTextStartIndex = minuteUnitStringIndex + this._minutesUnit.length;\n\n let secondsAsString = \"\";\n if(this._secondsUnit.length !== 0 ) \/\/ seconds unit can be empty\n {\n const secondUnitStringIndex = formattedString.indexOf(this._secondsUnit, secondsTextStartIndex);\n secondsAsString = formattedString.substring(secondsTextStartIndex,secondUnitStringIndex);\n }\n else{\n secondsAsString = formattedString.substring(secondsTextStartIndex, formattedString.length);\n }\n\n const secondsInt = this._GetIntegerOrNan(secondsAsString);\n return [hoursInt, minutesInt, secondsInt];\n }\n\n IsFormattedStringValid(formattedString){\n let resultArray = this._ExtractTimeValuesFromFormattedString(formattedString);\n let isAllValusNonNaNs = resultArray.every((item)=>{\n return !isNaN(item);\n });\n if(! isAllValusNonNaNs )\n {\n return false;\n }\n\n let hours = resultArray[0];\n let minutes = resultArray[1];\n let seconds = resultArray[2];\n return hours >= 0 && minutes < 60 && minutes >= 0 && seconds < 60 && seconds >= 0;\n\n }\n\n GetSelectedTimeChunk(position) {\n \/\/ todo validate if position is not an int\n if (position < 0) {\n return this.CHUNK_OUT_OF_RANGE\n }\n\n let hourChunkPositionStart = 0;\n let hourChunkLength = this._FormattedHoursWithUnit().length;\n let hourChunkPositionEnd = hourChunkPositionStart + hourChunkLength - 1;\n\n\n if ((position >= hourChunkPositionStart) && (position <= hourChunkPositionEnd)) {\n return this.HOURS_CHUNK;\n }\n\n let minuteChunkPositionStart = hourChunkPositionEnd + 1;\n let minuteChunkLength = this._FormattedMinutesWithUnit().length;\n let minuteChunkPositionEnd = minuteChunkPositionStart + minuteChunkLength - 1;\n\n if ((position >= minuteChunkPositionStart) && (position <= minuteChunkPositionEnd)) {\n return this.MINUTES_CHUNK;\n }\n\n let secondChunkPositionStart = minuteChunkPositionEnd + 1;\n let secondChunkLength = this._FormattedSecondsWithUnit().length;\n let secondChunkPositionEnd = secondChunkPositionStart + secondChunkLength - 1;\n\n if ((position >= secondChunkPositionStart) && (position <= secondChunkPositionEnd + 1)) {\n return this.SECONDS_CHUNK;\n }\n\n return this.CHUNK_OUT_OF_RANGE;\n }\n\n \/\/ returns object with startIndex,endIndex\n \/\/ return -1, -1 if not recognized type\n GetIndexRangeForTimeChunk(chunkName) {\n\n \/\/ todo should throw if chunkName is not known\n let hourChunkEndIndex = this._FormattedHours().length;\n if (chunkName === this.HOURS_CHUNK) {\n return {startIndex: 0, endIndex: hourChunkEndIndex}\n }\n\n let minuteChunkStartIndex = hourChunkEndIndex + this._hoursUnit.length;\n let minuteChunkEndIndex = minuteChunkStartIndex + this._FormattedMinutes().length;\n if (chunkName === this.MINUTES_CHUNK) {\n return {startIndex: minuteChunkStartIndex, endIndex: minuteChunkEndIndex}\n }\n\n let secondChunkStartIndex = minuteChunkEndIndex + this._minutesUnit.length;\n let secondsChunkEndIndex = secondChunkStartIndex + this._FormattedSeconds().length;\n if (chunkName === this.SECONDS_CHUNK) {\n return {startIndex: secondChunkStartIndex, endIndex: secondsChunkEndIndex}\n }\n }\n\n\n GetIndexRangeForSecondsChunk() {\n return this.GetIndexRangeForTimeChunk(this.SECONDS_CHUNK);\n }\n\n GetIndexRangeForMinutesChunk() {\n return this.GetIndexRangeForTimeChunk(this.MINUTES_CHUNK);\n }\n\n GetIndexRangeForHoursChunk() {\n return this.GetIndexRangeForTimeChunk(this.HOURS_CHUNK);\n }\n\n IncrementValueForTimeChunk(chunkName) {\n if (chunkName === this.HOURS_CHUNK) {\n this.AddSeconds(this.SECONDS_IN_HOUR);\n } else if (chunkName === this.MINUTES_CHUNK) {\n this.AddSeconds(this.SECONDS_IN_MINUTE);\n } else if (chunkName === this.SECONDS_CHUNK) {\n this.AddSeconds(this.ONE_SECOND);\n }\n }\n\n DecrementValueTimeChunk(chunkName) {\n if (chunkName === this.HOURS_CHUNK) {\n this.SubtractSeconds(this.SECONDS_IN_HOUR);\n }\n else if(chunkName === this.MINUTES_CHUNK)\n {\n this.SubtractSeconds(this.SECONDS_IN_MINUTE);\n }\n else if(chunkName === this.SECONDS_CHUNK)\n {\n this.SubtractSeconds(this.ONE_SECOND);\n }\n }\n\n \/\/ todo: bug: when user sets e.g. 345 seconds in the input element and then pushes ArrowLeft key, the value stays\n \/\/ todo bug: when user sets e.g. 345 seconds and then pushes key up, some strange value appears\n\n}\n"],"names":["constructor","config","hoursUnitString","minutesUnitString","secondsUnitString","SECONDS_CHUNK","MINUTES_CHUNK","HOURS_CHUNK","CHUNK_OUT_OF_RANGE","_hoursUnit","this","DEFAULT_HOURS_UNIT","_minutesUnit","DEFAULT_MINUTES_UNIT","_secondsUnit","DEFAULT_SECONDS_UNIT","hasOwnProperty","_ValidateInternalStateOrThrow","_seconds","_minutes","_hours","_totalSeconds","hourRegex","RegExp","minuteRegex","length","Error","test","_FormattedHours","padStart","_FormattedMinutes","_FormattedSeconds","_FormattedHoursWithUnit","_FormattedMinutesWithUnit","_FormattedSecondsWithUnit","_GetIntegerOrNan","value","NaN","n","Number","isNaN","isInteger","ToFormattedString","$returnString","ToTotalSeconds","AddSeconds","seconds","SetTotalSeconds","SubtractSeconds","intSeconds","_ResetFromTotalSeconds","Math","floor","SECONDS_IN_HOUR","SECONDS_IN_MINUTE","_RecalculateTotalSeconds","hours","minutes","FromFormattedString","formattedString","spitedChunks","_ExtractTimeValuesFromFormattedString","hoursUnitStringIndex","indexOf","hoursAsString","substring","hoursInt","minutesTextStartIndex","minuteUnitStringIndex","minuteAsString","minutesInt","secondsTextStartIndex","secondsAsString","secondUnitStringIndex","IsFormattedStringValid","resultArray","every","item","GetSelectedTimeChunk","position","hourChunkPositionEnd","minuteChunkPositionStart","minuteChunkPositionEnd","secondChunkPositionStart","secondChunkLength","GetIndexRangeForTimeChunk","chunkName","hourChunkEndIndex","startIndex","endIndex","minuteChunkStartIndex","minuteChunkEndIndex","secondChunkStartIndex","secondsChunkEndIndex","GetIndexRangeForSecondsChunk","GetIndexRangeForMinutesChunk","GetIndexRangeForHoursChunk","IncrementValueForTimeChunk","ONE_SECOND","DecrementValueTimeChunk"],"mappings":"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\/C0F,sCACWrF,KAAK2E,0BAA0B3E,KAAKJ,eAG\/C0F,oCACWtF,KAAK2E,0BAA0B3E,KAAKH,aAG\/C0F,2BAA2BX,WACnBA,YAAc5E,KAAKH,iBACdsC,WAAWnC,KAAK2C,iBACdiC,YAAc5E,KAAKJ,mBACrBuC,WAAWnC,KAAK4C,mBACdgC,YAAc5E,KAAKL,oBACrBwC,WAAWnC,KAAKwF,YAI7BC,wBAAwBb,WAChBA,YAAc5E,KAAKH,iBACdyC,gBAAgBtC,KAAK2C,iBAEtBiC,YAAc5E,KAAKJ,mBAElB0C,gBAAgBtC,KAAK4C,mBAEtBgC,YAAc5E,KAAKL,oBAElB2C,gBAAgBtC,KAAKwF"}