This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch 
gh-readonly-queue/main/pr-8110-0ebf4c6fd4b7ec994f4419344f808c47f9a23174
in repository https://gitbox.apache.org/repos/asf/texera.git

commit 05e1be4c1ccc5893180b5cdd6d8f378b308e94e1
Author: carloea2 <[email protected]>
AuthorDate: Sun Aug 30 01:20:25 2026 +0000

    fix(frontend): use singular relative time units (#8110)
    
    ### What changes were proposed in this PR?
    
    Relative time labels now use singular units when the value is one while
    preserving plural units for every other value.
    
    Before: `1 minutes ago`, `1 hours ago`, `1 days ago`, and `1 weeks ago`.
    After: `1 minute ago`, `1 hour ago`, `1 day ago`, and `1 week ago`.
    
    ### Any related issues, documentation, discussions?
    
    Closes #8108
    
    ### How was this PR tested?
    
    `yarn test --include src/app/common/util/format.util.spec.ts`
    `yarn format:ci`
    
    Manual:
    1. Start Texera locally from this worktree.
    2. Set a local workflow creation and edit time to exactly one hour ago.
    3. Open Your Work, then Workflows in Chrome.
    4. Confirm both labels display `1 hour ago` while older cards retain
    plural units.
    
    ### Was this PR authored or co-authored using generative AI tooling?
    
    Generated-by: Codex
---
 frontend/src/app/common/util/format.util.spec.ts | 7 ++++---
 frontend/src/app/common/util/format.util.ts      | 8 ++++----
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/frontend/src/app/common/util/format.util.spec.ts 
b/frontend/src/app/common/util/format.util.spec.ts
index 6f90683400..479412c5f1 100644
--- a/frontend/src/app/common/util/format.util.spec.ts
+++ b/frontend/src/app/common/util/format.util.spec.ts
@@ -96,6 +96,7 @@ describe("formatRelativeTime", () => {
   });
 
   it("formats sub-hour differences in minutes", () => {
+    expect(formatRelativeTime(NOW - 60 * 1000)).toBe("1 minute ago");
     expect(formatRelativeTime(NOW - 5 * 60 * 1000)).toBe("5 minutes ago");
     expect(formatRelativeTime(NOW - 59 * 60 * 1000)).toBe("59 minutes ago");
     // boundary: just-now floors to 0
@@ -103,17 +104,17 @@ describe("formatRelativeTime", () => {
   });
 
   it("formats sub-day differences in hours", () => {
-    expect(formatRelativeTime(NOW - 60 * 60 * 1000)).toBe("1 hours ago");
+    expect(formatRelativeTime(NOW - 60 * 60 * 1000)).toBe("1 hour ago");
     expect(formatRelativeTime(NOW - 23 * 60 * 60 * 1000)).toBe("23 hours ago");
   });
 
   it("formats sub-week differences in days", () => {
-    expect(formatRelativeTime(NOW - 24 * 60 * 60 * 1000)).toBe("1 days ago");
+    expect(formatRelativeTime(NOW - 24 * 60 * 60 * 1000)).toBe("1 day ago");
     expect(formatRelativeTime(NOW - 6 * 24 * 60 * 60 * 1000)).toBe("6 days 
ago");
   });
 
   it("formats sub-month differences in weeks", () => {
-    expect(formatRelativeTime(NOW - 7 * 24 * 60 * 60 * 1000)).toBe("1 weeks 
ago");
+    expect(formatRelativeTime(NOW - 7 * 24 * 60 * 60 * 1000)).toBe("1 week 
ago");
     expect(formatRelativeTime(NOW - 3 * 7 * 24 * 60 * 60 * 1000)).toBe("3 
weeks ago");
   });
 
diff --git a/frontend/src/app/common/util/format.util.ts 
b/frontend/src/app/common/util/format.util.ts
index 8393559aaa..419a5945af 100644
--- a/frontend/src/app/common/util/format.util.ts
+++ b/frontend/src/app/common/util/format.util.ts
@@ -70,13 +70,13 @@ export const formatRelativeTime = (timestamp: number | 
undefined): string => {
   const weeksAgo = Math.floor(daysAgo / 7);
 
   if (minutesAgo < 60) {
-    return `${minutesAgo} minutes ago`;
+    return `${minutesAgo} minute${minutesAgo === 1 ? "" : "s"} ago`;
   } else if (hoursAgo < 24) {
-    return `${hoursAgo} hours ago`;
+    return `${hoursAgo} hour${hoursAgo === 1 ? "" : "s"} ago`;
   } else if (daysAgo < 7) {
-    return `${daysAgo} days ago`;
+    return `${daysAgo} day${daysAgo === 1 ? "" : "s"} ago`;
   } else if (weeksAgo < 4) {
-    return `${weeksAgo} weeks ago`;
+    return `${weeksAgo} week${weeksAgo === 1 ? "" : "s"} ago`;
   }
   return new Date(timestamp).toLocaleDateString();
 };

Reply via email to