From ce7ba5993fe54d336c933ea4dd340d3275ab2447 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Thu, 14 Jan 2021 10:29:52 +0530 Subject: [PATCH 1/5] feat: add support for long format in multi unit string --- .../common/src/time/time-duration.test.ts | 9 ++++- projects/common/src/time/time-duration.ts | 34 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/projects/common/src/time/time-duration.test.ts b/projects/common/src/time/time-duration.test.ts index c67f1b979..9691829cb 100644 --- a/projects/common/src/time/time-duration.test.ts +++ b/projects/common/src/time/time-duration.test.ts @@ -1,4 +1,4 @@ -import { TimeDuration } from './time-duration'; +import { TimeDuration, UnitStringType } from './time-duration'; import { TimeUnit } from './time-unit.type'; describe('Time duration', () => { @@ -13,6 +13,13 @@ describe('Time duration', () => { TimeUnit.Minute ) ).toBe('4h3m'); + expect( + new TimeDuration(4 * 60 * 60 * 1000 + 3 * 60 * 1000 + 5 * 1000 + 689, TimeUnit.Millisecond).toMultiUnitString( + TimeUnit.Minute, + false, + UnitStringType.Long + ) + ).toBe('4 hours 3minutes'); expect( new TimeDuration(4 * 60 * 60 * 1000 + 5 * 1000 + 689, TimeUnit.Millisecond).toMultiUnitString(TimeUnit.Second) ).toBe('4h5s'); diff --git a/projects/common/src/time/time-duration.ts b/projects/common/src/time/time-duration.ts index 905db8a52..d375074c7 100644 --- a/projects/common/src/time/time-duration.ts +++ b/projects/common/src/time/time-duration.ts @@ -16,20 +16,35 @@ export class TimeDuration { return this.toMillis() / this.unitInMillis(unit); } - public toMultiUnitString(smallestUnit: ConvertibleTimeUnit = TimeUnit.Second, displayZero: boolean = true): string { + public toMultiUnitString( + smallestUnit: ConvertibleTimeUnit = TimeUnit.Second, + displayZero: boolean = true, + unitStringType: UnitStringType = UnitStringType.Short + ): string { const mostSignificantPortion = this.getMostSignificantUnitOnly(); const remainingMillis = this.millis - mostSignificantPortion.toMillis(); if (mostSignificantPortion.getAmountForUnit(smallestUnit) < 1) { - return displayZero ? new TimeDuration(0, smallestUnit).toString() : ''; + return displayZero + ? unitStringType === UnitStringType.Long + ? new TimeDuration(0, smallestUnit).toLongString() + : new TimeDuration(0, smallestUnit).toString() + : ''; } if (mostSignificantPortion.unit === smallestUnit || remainingMillis === 0) { - return mostSignificantPortion.toString(); + return unitStringType === UnitStringType.Long + ? mostSignificantPortion.toLongString() + : mostSignificantPortion.toString(); } - return `${mostSignificantPortion.toString()}${new TimeDuration( - remainingMillis, - TimeUnit.Millisecond - ).toMultiUnitString(smallestUnit, false)}`; + return unitStringType === UnitStringType.Long + ? `${mostSignificantPortion.toLongString()} ${new TimeDuration( + remainingMillis, + TimeUnit.Millisecond + ).toMultiUnitString(smallestUnit, false, unitStringType)}` + : `${mostSignificantPortion.toString()}${new TimeDuration( + remainingMillis, + TimeUnit.Millisecond + ).toMultiUnitString(smallestUnit, false)}`; } public getMostSignificantUnitOnly(): TimeDuration { @@ -141,3 +156,8 @@ type ConvertibleTimeUnit = | TimeUnit.Minute | TimeUnit.Second | TimeUnit.Millisecond; + +export enum UnitStringType { + Long = 'long', + Short = 'short' +} From 39c983db8a9d71d1c57f175abf7c2aa6f2ecdc71 Mon Sep 17 00:00:00 2001 From: Arjunlal B <63222211+arjunlalb@users.noreply.github.com> Date: Thu, 14 Jan 2021 10:44:43 +0530 Subject: [PATCH 2/5] Update test --- projects/common/src/time/time-duration.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/common/src/time/time-duration.test.ts b/projects/common/src/time/time-duration.test.ts index 9691829cb..039591d9c 100644 --- a/projects/common/src/time/time-duration.test.ts +++ b/projects/common/src/time/time-duration.test.ts @@ -19,7 +19,7 @@ describe('Time duration', () => { false, UnitStringType.Long ) - ).toBe('4 hours 3minutes'); + ).toBe('4 hours 3 minutes'); expect( new TimeDuration(4 * 60 * 60 * 1000 + 5 * 1000 + 689, TimeUnit.Millisecond).toMultiUnitString(TimeUnit.Second) ).toBe('4h5s'); From a09098dd6c97b2f9309e9fc7366d1d96bde33b6e Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Fri, 15 Jan 2021 10:30:54 +0530 Subject: [PATCH 3/5] fix: tidy up the method --- projects/common/src/time/time-duration.ts | 29 ++++++++++------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/projects/common/src/time/time-duration.ts b/projects/common/src/time/time-duration.ts index d375074c7..5cf3ac63a 100644 --- a/projects/common/src/time/time-duration.ts +++ b/projects/common/src/time/time-duration.ts @@ -24,27 +24,22 @@ export class TimeDuration { const mostSignificantPortion = this.getMostSignificantUnitOnly(); const remainingMillis = this.millis - mostSignificantPortion.toMillis(); if (mostSignificantPortion.getAmountForUnit(smallestUnit) < 1) { - return displayZero - ? unitStringType === UnitStringType.Long - ? new TimeDuration(0, smallestUnit).toLongString() - : new TimeDuration(0, smallestUnit).toString() - : ''; + return displayZero ? this.toFormattedString(new TimeDuration(0, smallestUnit), unitStringType) : ''; } if (mostSignificantPortion.unit === smallestUnit || remainingMillis === 0) { - return unitStringType === UnitStringType.Long - ? mostSignificantPortion.toLongString() - : mostSignificantPortion.toString(); + return this.toFormattedString(mostSignificantPortion, unitStringType); } - return unitStringType === UnitStringType.Long - ? `${mostSignificantPortion.toLongString()} ${new TimeDuration( - remainingMillis, - TimeUnit.Millisecond - ).toMultiUnitString(smallestUnit, false, unitStringType)}` - : `${mostSignificantPortion.toString()}${new TimeDuration( - remainingMillis, - TimeUnit.Millisecond - ).toMultiUnitString(smallestUnit, false)}`; + const joiningStr = unitStringType === UnitStringType.Long ? ' ' : ''; + + return [ + this.toFormattedString(mostSignificantPortion, unitStringType), + new TimeDuration(remainingMillis, TimeUnit.Millisecond).toMultiUnitString(smallestUnit, false, unitStringType) + ].join(joiningStr); + } + + private toFormattedString(duration: TimeDuration, unitStringType: UnitStringType = UnitStringType.Short): string { + return unitStringType === UnitStringType.Short ? duration.toString() : duration.toLongString(); } public getMostSignificantUnitOnly(): TimeDuration { From ef931541298df3775dd4d0476db233c026b1cba1 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Fri, 15 Jan 2021 10:31:31 +0530 Subject: [PATCH 4/5] fix: address comments --- projects/common/src/time/time-duration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/common/src/time/time-duration.ts b/projects/common/src/time/time-duration.ts index 5cf3ac63a..c2456b459 100644 --- a/projects/common/src/time/time-duration.ts +++ b/projects/common/src/time/time-duration.ts @@ -152,7 +152,7 @@ type ConvertibleTimeUnit = | TimeUnit.Second | TimeUnit.Millisecond; -export enum UnitStringType { +export const enum UnitStringType { Long = 'long', Short = 'short' } From 82573b4a33c9965d4b4cacc514561bb0ac601631 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Sat, 16 Jan 2021 17:26:49 +0530 Subject: [PATCH 5/5] fix: address comments --- projects/common/src/time/time-duration.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/projects/common/src/time/time-duration.ts b/projects/common/src/time/time-duration.ts index c2456b459..a565a4728 100644 --- a/projects/common/src/time/time-duration.ts +++ b/projects/common/src/time/time-duration.ts @@ -24,22 +24,22 @@ export class TimeDuration { const mostSignificantPortion = this.getMostSignificantUnitOnly(); const remainingMillis = this.millis - mostSignificantPortion.toMillis(); if (mostSignificantPortion.getAmountForUnit(smallestUnit) < 1) { - return displayZero ? this.toFormattedString(new TimeDuration(0, smallestUnit), unitStringType) : ''; + return displayZero ? new TimeDuration(0, smallestUnit).toFormattedString(unitStringType) : ''; } if (mostSignificantPortion.unit === smallestUnit || remainingMillis === 0) { - return this.toFormattedString(mostSignificantPortion, unitStringType); + return mostSignificantPortion.toFormattedString(unitStringType); } const joiningStr = unitStringType === UnitStringType.Long ? ' ' : ''; return [ - this.toFormattedString(mostSignificantPortion, unitStringType), + mostSignificantPortion.toFormattedString(unitStringType), new TimeDuration(remainingMillis, TimeUnit.Millisecond).toMultiUnitString(smallestUnit, false, unitStringType) ].join(joiningStr); } - private toFormattedString(duration: TimeDuration, unitStringType: UnitStringType = UnitStringType.Short): string { - return unitStringType === UnitStringType.Short ? duration.toString() : duration.toLongString(); + private toFormattedString(unitStringType: UnitStringType = UnitStringType.Short): string { + return unitStringType === UnitStringType.Short ? this.toString() : this.toLongString(); } public getMostSignificantUnitOnly(): TimeDuration { @@ -152,7 +152,7 @@ type ConvertibleTimeUnit = | TimeUnit.Second | TimeUnit.Millisecond; -export const enum UnitStringType { +export enum UnitStringType { Long = 'long', Short = 'short' }