Skip to content

Commit 9a23f87

Browse files
committed
move timestamp from stores folder to be an export of the timestamp component
1 parent b64bc48 commit 9a23f87

17 files changed

+64
-88
lines changed

src/lib/components/deployments/version-details.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
2+
import { timestamp } from '$lib/components/timestamp.svelte';
23
import { translate } from '$lib/i18n/translate';
3-
import { timestamp } from '$lib/stores/timestamp';
44
import type { WorkerDeploymentVersionInfo } from '$lib/types/deployments';
55
66
import WorkflowDetail from '../lines-and-dots/workflow-detail.svelte';

src/lib/components/event/event-summary-row.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
55
import { page } from '$app/state';
66
7+
import { timestamp } from '$lib/components/timestamp.svelte';
78
import Badge from '$lib/holocene/badge.svelte';
89
import Copyable from '$lib/holocene/copyable/index.svelte';
910
import Icon from '$lib/holocene/icon/icon.svelte';
@@ -19,7 +20,6 @@
1920
} from '$lib/models/event-groups/get-event-in-group';
2021
import { isCloud } from '$lib/stores/advanced-visibility';
2122
import { authUser } from '$lib/stores/auth-user';
22-
import { timestamp } from '$lib/stores/timestamp';
2323
import type { IterableEvent, WorkflowEvent } from '$lib/types/events';
2424
import { decodeLocalActivity } from '$lib/utilities/decode-local-activity';
2525
import { spaceBetweenCapitalLetters } from '$lib/utilities/format-camel-case';

src/lib/components/event/pending-activity-summary-row.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
44
import { page } from '$app/stores';
55
6+
import { timestamp } from '$lib/components/timestamp.svelte';
67
import Badge from '$lib/holocene/badge.svelte';
78
import Copyable from '$lib/holocene/copyable/index.svelte';
89
import Icon from '$lib/holocene/icon/icon.svelte';
910
import Link from '$lib/holocene/link.svelte';
1011
import { translate } from '$lib/i18n/translate';
1112
import type { EventGroup } from '$lib/models/event-groups/event-groups';
1213
import { isCloud } from '$lib/stores/advanced-visibility';
13-
import { timestamp } from '$lib/stores/timestamp';
1414
import type { PendingActivity } from '$lib/types/events';
1515
import { routeForEventHistoryEvent } from '$lib/utilities/route-for';
1616
import { toTimeDifference } from '$lib/utilities/to-time-difference';

src/lib/components/event/pending-nexus-summary-row.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<script lang="ts">
22
import { page } from '$app/stores';
33
4+
import { timestamp } from '$lib/components/timestamp.svelte';
45
import Badge from '$lib/holocene/badge.svelte';
56
import Copyable from '$lib/holocene/copyable/index.svelte';
67
import Icon from '$lib/holocene/icon/icon.svelte';
78
import Link from '$lib/holocene/link.svelte';
89
import { translate } from '$lib/i18n/translate';
910
import type { EventGroup } from '$lib/models/event-groups/event-groups';
1011
import { isCloud } from '$lib/stores/advanced-visibility';
11-
import { timestamp } from '$lib/stores/timestamp';
1212
import type { PendingNexusOperation } from '$lib/types/events';
1313
import { routeForEventHistoryEvent } from '$lib/utilities/route-for';
1414
import { toTimeDifference } from '$lib/utilities/to-time-difference';

src/lib/components/lines-and-dots/svg/timeline-graph.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script lang="ts">
2+
import { timestamp } from '$lib/components/timestamp.svelte';
23
import type {
34
EventGroup,
45
EventGroups,
@@ -7,7 +8,6 @@
78
import { eventFilterSort } from '$lib/stores/event-view';
89
import { fullEventHistory } from '$lib/stores/events';
910
import { eventStatusFilter } from '$lib/stores/filters';
10-
import { timestamp } from '$lib/stores/timestamp';
1111
import type { WorkflowExecution } from '$lib/types/workflows';
1212
import { isWorkflowDelayed } from '$lib/utilities/delayed-workflows';
1313
import { getFailedOrPendingGroups } from '$lib/utilities/get-failed-or-pending';

src/lib/components/lines-and-dots/workflow-details.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import { page } from '$app/state';
33
4+
import { timestamp } from '$lib/components/timestamp.svelte';
45
import Tooltip from '$lib/holocene/tooltip.svelte';
56
import { translate } from '$lib/i18n/translate';
67
import { fetchWorkflow } from '$lib/services/workflow-service';
@@ -11,7 +12,6 @@
1112
timeFormat,
1213
timestampFormat,
1314
} from '$lib/stores/time-format';
14-
import { timestamp } from '$lib/stores/timestamp';
1515
import type { WorkflowExecution } from '$lib/types/workflows';
1616
import { formatDate } from '$lib/utilities/format-date';
1717
import {

src/lib/components/lines-and-dots/workflow-pending-task.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script lang="ts">
2+
import { timestamp } from '$lib/components/timestamp.svelte';
23
import Accordion from '$lib/holocene/accordion/accordion.svelte';
34
import Badge from '$lib/holocene/badge.svelte';
45
import { translate } from '$lib/i18n/translate';
5-
import { timestamp } from '$lib/stores/timestamp';
66
import type { PendingWorkflowTaskInfo } from '$lib/types';
77
88
export let pendingTask: PendingWorkflowTaskInfo | undefined = undefined;

src/lib/components/timestamp.svelte

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,52 @@
1+
<script lang="ts" module>
2+
import { derived } from 'svelte/store';
3+
4+
import {
5+
relativeTime,
6+
timeFormat,
7+
timestampFormat,
8+
} from '$lib/stores/time-format';
9+
import {
10+
formatDate,
11+
type TimestampFormat,
12+
type ValidTime,
13+
} from '$lib/utilities/format-date';
14+
15+
type TimestampOptions = {
16+
format?: TimestampFormat | 'relative';
17+
relativeLabel?: string;
18+
};
19+
20+
export const timestamp = derived(
21+
[timeFormat, relativeTime, timestampFormat],
22+
([$timeFormat, $relativeTime, $timestampFormat]) => {
23+
return (
24+
date: ValidTime | undefined | null,
25+
options?: TimestampOptions,
26+
): string => {
27+
const isRelativeOverride = options?.format === 'relative';
28+
29+
const format = isRelativeOverride
30+
? $timestampFormat
31+
: (options?.format ?? $timestampFormat);
32+
const relative = isRelativeOverride ? true : $relativeTime;
33+
const relativeLabel = options?.relativeLabel ?? undefined;
34+
35+
return formatDate(date, $timeFormat, {
36+
relative,
37+
format,
38+
relativeLabel,
39+
});
40+
};
41+
},
42+
);
43+
</script>
44+
145
<script lang="ts">
246
import type { SvelteHTMLElements } from 'svelte/elements';
347
448
import type { Snippet } from 'svelte';
549
6-
import { timestamp } from '$lib/stores/timestamp';
7-
import type { TimestampFormat } from '$lib/utilities/format-date';
8-
import type { ValidTime } from '$lib/utilities/format-time';
9-
1050
type T = $$Generic<keyof SvelteHTMLElements>;
1151
type DateTime = ValidTime | null | undefined;
1252
Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
11
import { get } from 'svelte/store';
22

3-
import { beforeEach, describe, expect, it, vi } from 'vitest';
3+
import { beforeEach, describe, expect, it } from 'vitest';
44

55
import {
66
relativeTime,
77
timeFormat,
88
timestampFormat,
99
} from '$lib/stores/time-format';
1010

11-
import { timestamp } from './timestamp';
12-
13-
// Force GH action runners to use en-US and 12-hour clocks starting at 0:00
14-
const DateTimeFormat = Intl.DateTimeFormat;
15-
vi.spyOn(global.Intl, 'DateTimeFormat').mockImplementation(
16-
(_, options) =>
17-
new DateTimeFormat('en-US', { ...options, hour12: true, hourCycle: 'h11' }),
18-
);
11+
import { timestamp } from './timestamp.svelte';
1912

2013
describe('timestamp', () => {
2114
const date = '2022-04-13T16:29:35.630571Z';
@@ -30,12 +23,11 @@ describe('timestamp', () => {
3023
const result = get(timestamp)(date);
3124
expect(result).toContain('Apr 13, 2022');
3225
expect(result).toContain('4:29:35');
33-
expect(result).toContain('PM');
3426
});
3527

3628
it('should accept format override for short', () => {
3729
const result = get(timestamp)(date, { format: 'short' });
38-
expect(result).toContain('4/13/22');
30+
expect(result).toMatch(/\d{2}[-/]\d{2}[-/]\d{2}/); // Matches date formats like 22-04-13 or 4/13/22
3931
expect(result).toContain('4:29:35');
4032
});
4133

@@ -68,14 +60,14 @@ describe('timestamp', () => {
6860
it('should respect timestampFormat store', () => {
6961
timestampFormat.set('short');
7062
const result = get(timestamp)(date);
71-
expect(result).toContain('4/13/22');
63+
expect(result).toMatch(/\d{2}[-/]\d{2}[-/]\d{2}/); // Matches date formats like 22-04-13 or 4/13/22
7264
});
7365

7466
it('should allow format override to take precedence over store', () => {
7567
timestampFormat.set('long');
7668
const result = get(timestamp)(date, { format: 'short' });
77-
expect(result).toContain('4/13/22');
78-
expect(result).not.toContain('April');
69+
expect(result).toMatch(/\d{2}[-/]\d{2}[-/]\d{2}/); // Short format
70+
expect(result).not.toContain('April'); // Long format uses full month name
7971
});
8072

8173
it('should format already formatted strings', () => {

src/lib/components/workflow/filter-bar/dropdown-filter-chip.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import { addHours, addMinutes, addSeconds, startOfDay } from 'date-fns';
55
import { zonedTimeToUtc } from 'date-fns-tz';
66
7+
import { timestamp } from '$lib/components/timestamp.svelte';
78
import Button from '$lib/holocene/button.svelte';
89
import DatePicker from '$lib/holocene/date-picker.svelte';
910
import Icon from '$lib/holocene/icon/icon.svelte';
@@ -32,7 +33,6 @@
3233
timeFormat,
3334
timeFormatType,
3435
} from '$lib/stores/time-format';
35-
import { timestamp } from '$lib/stores/timestamp';
3636
import { getSelectedTimezone } from '$lib/utilities/format-date';
3737
import { isInConditional, isNullConditional } from '$lib/utilities/is';
3838
import {

0 commit comments

Comments
 (0)