Skip to content

Commit cd1d669

Browse files
committed
minor UI improvements
1 parent 53b2c29 commit cd1d669

File tree

9 files changed

+107
-34
lines changed

9 files changed

+107
-34
lines changed

core/pom.xml

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,31 @@
108108

109109
<build>
110110
<plugins>
111+
<plugin>
112+
<artifactId>maven-resources-plugin</artifactId>
113+
<executions>
114+
<execution>
115+
<id>copy-test-resources</id>
116+
<phase>generate-sources</phase>
117+
<goals>
118+
<goal>copy-resources</goal>
119+
</goals>
120+
<configuration>
121+
<outputDirectory>
122+
${project.basedir}/test/src/main/java/org/sterl/spring/persistent_tasks/test/</outputDirectory>
123+
<resources>
124+
<resource>
125+
<directory>
126+
${project.basedir}/core/src/test/java/org/sterl/spring/persistent_tasks/test/</directory>
127+
<includes>
128+
<include>**/*</include>
129+
</includes>
130+
</resource>
131+
</resources>
132+
</configuration>
133+
</execution>
134+
</executions>
135+
</plugin>
111136
<plugin>
112137
<groupId>org.apache.maven.plugins</groupId>
113138
<artifactId>maven-pmd-plugin</artifactId>
@@ -160,7 +185,8 @@
160185
</customTypeMappings>
161186
<classes>
162187
<class>org.springframework.data.web.PagedModel</class>
163-
<class>org.sterl.spring.persistent_tasks.scheduler.entity.SchedulerEntity</class>
188+
<class>
189+
org.sterl.spring.persistent_tasks.scheduler.entity.SchedulerEntity</class>
164190
</classes>
165191
<classPatterns>
166192
<pattern>org.sterl.spring.persistent_tasks.api.**</pattern>

core/src/main/java/org/sterl/spring/persistent_tasks/shared/model/HasTriggerData.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.sterl.spring.persistent_tasks.shared.model;
22

33
import java.io.Serializable;
4-
import java.time.OffsetDateTime;
54

65
import org.sterl.spring.persistent_tasks.api.TaskId;
76
import org.sterl.spring.persistent_tasks.api.TriggerKey;
@@ -30,6 +29,6 @@ default TaskId<Serializable> newTaskId() {
3029

3130
default boolean shouldRunInFuture() {
3231
if (getData().getRunAt() == null) return true;
33-
return getData().getRunAt().toEpochSecond() > OffsetDateTime.now().toEpochSecond();
32+
return getData().getRunAt().toInstant().toEpochMilli() > System.currentTimeMillis();
3433
}
3534
}

core/src/test/java/org/sterl/spring/persistent_tasks/test/PersistentTaskTestService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,19 @@ public Set<TriggerKey> scheduleNextTriggersAndWait(Duration maxWaitTime) {
9797
final var timeOut = System.currentTimeMillis() + maxWaitTime.toMillis();
9898

9999
result.addAll(awaitRunningTriggers(maxWaitTime));
100-
List<Future<TriggerKey>> newTriggers;
100+
List<TriggerKey> newTriggers;
101101
do {
102102

103103
if (System.currentTimeMillis() > timeOut) {
104104
throw new RuntimeException("Timeout waiting for triggers after " + maxWaitTime);
105105
}
106106

107-
newTriggers = scheduleNextTriggers();
107+
newTriggers = awaitTriggers(maxWaitTime, scheduleNextTriggers());
108108
if (newTriggers.isEmpty()) {
109-
Thread.sleep(200);
110-
newTriggers = scheduleNextTriggers();
109+
newTriggers = awaitRunningTriggers(maxWaitTime);
111110
}
112-
result.addAll(awaitTriggers(maxWaitTime, newTriggers));
111+
result.addAll(newTriggers);
112+
113113
} while (newTriggers.size() > 0);
114114

115115
return result;

example/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<spt.version>1.5.6</spt.version>
1818
-->
1919
<properties>
20-
<spt.version>1.6.1-SNAPSHOT</spt.version>
20+
<spt.version>1.6.5-SNAPSHOT</spt.version>
2121
</properties>
2222

2323
<dependencies>

test/src/main/java/org/sterl/spring/persistent_tasks/test/PersistentTaskTestService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,19 @@ public Set<TriggerKey> scheduleNextTriggersAndWait(Duration maxWaitTime) {
9797
final var timeOut = System.currentTimeMillis() + maxWaitTime.toMillis();
9898

9999
result.addAll(awaitRunningTriggers(maxWaitTime));
100-
List<Future<TriggerKey>> newTriggers;
100+
List<TriggerKey> newTriggers;
101101
do {
102102

103103
if (System.currentTimeMillis() > timeOut) {
104104
throw new RuntimeException("Timeout waiting for triggers after " + maxWaitTime);
105105
}
106106

107-
newTriggers = scheduleNextTriggers();
107+
newTriggers = awaitTriggers(maxWaitTime, scheduleNextTriggers());
108108
if (newTriggers.isEmpty()) {
109-
Thread.sleep(200);
110-
newTriggers = scheduleNextTriggers();
109+
newTriggers = awaitRunningTriggers(maxWaitTime);
111110
}
112-
result.addAll(awaitTriggers(maxWaitTime, newTriggers));
111+
result.addAll(newTriggers);
112+
113113
} while (newTriggers.size() > 0);
114114

115115
return result;

ui/src/shared/date.util.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,24 @@ export function formatDateTime(inputDate?: string | Date): string {
4747
export function formatMs(ms?: number) {
4848
if (ms === undefined || ms === null) return "-";
4949
if (ms === 0) return "0ms";
50+
const sign = ms < 0 ? "-" : "";
51+
ms = Math.abs(ms);
5052

51-
if (ms < 9999) return Math.floor(ms) + "ms";
53+
if (ms < 9999) return sign + Math.floor(ms) + "ms";
5254

5355
const inS = Math.floor(ms / 1000);
54-
if (ms < 99999) {
55-
return inS + "s " + (ms - inS * 1000) + "ms";
56+
if (inS < 181) {
57+
return sign + inS + "s " + (ms - inS * 1000) + "ms";
5658
}
59+
5760
const inMin = Math.floor(inS / 60);
58-
return inMin + "min " + (inS - inMin * 60) + "s";
61+
if (inMin < 181) {
62+
return sign + inMin + "min " + (inS - inMin * 60) + "s";
63+
}
64+
65+
const inHours = Math.floor(inMin / 60);
66+
if (inHours < 48) return sign + inHours + "h " + (inMin % 60) + "min";
67+
68+
const inDays = Math.floor(inHours / 24);
69+
return sign + inDays + "d " + (inHours % 24) + "h";
5970
}

ui/src/shared/view/labled-text.view.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Form } from "react-bootstrap";
2-
import React from "react";
2+
import React, { ReactNode } from "react";
33

44
interface Props {
55
label: string;
6-
value?: string | number;
6+
value?: string | number | ReactNode;
77
className?: string;
88
}
99
const LabeledText: React.FC<Props> = ({ label, value, className }) => {

ui/src/shared/view/trigger-list-item.view.tsx

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@ import TriggerHistoryListView from "@src/history/view/trigger-history.view";
22
import { Trigger } from "@src/server-api";
33
import LabeledText from "@src/shared/view/labled-text.view";
44
import JsonView from "@uiw/react-json-view";
5-
import { Accordion, Button, Col, Container, Form, Row } from "react-bootstrap";
5+
import {
6+
Accordion,
7+
Badge,
8+
Button,
9+
Col,
10+
Container,
11+
Form,
12+
Row,
13+
} from "react-bootstrap";
614
import TriggerStatusView from "../../trigger/views/trigger-staus.view";
715
import { formatMs, formatShortDateTime } from "../date.util";
816
import { useServerObject } from "../http-request";
@@ -141,23 +149,49 @@ const TriggerCompactView = ({ trigger }: { trigger: Trigger }) => (
141149
/>
142150
</Col>
143151
<Col className="col-3">
144-
{trigger.runningOn ? (
145-
<LabeledText
146-
label={`Running on (${trigger.executionCount})`}
147-
value={
148-
trigger.runningOn + " " + runningSince(trigger.start)
149-
}
150-
/>
151-
) : (
152-
<LabeledText
153-
label="Executions"
154-
value={trigger.executionCount}
155-
/>
156-
)}
152+
<TriggerExecutiomView trigger={trigger} />
157153
</Col>
158154
</Row>
159155
);
160156

157+
const TriggerExecutiomView = ({ trigger }: { trigger: Trigger }) => {
158+
if (trigger.runningOn) {
159+
return (
160+
<LabeledText
161+
label={`Running on (${trigger.executionCount})`}
162+
value={trigger.runningOn + " " + runningSince(trigger.start)}
163+
/>
164+
);
165+
}
166+
if (trigger.status == "WAITING" && trigger.runAt) {
167+
return (
168+
<LabeledText
169+
label={`Should start in`}
170+
value={formatMs(
171+
new Date(trigger.runAt).getTime() - new Date().getTime()
172+
)}
173+
/>
174+
);
175+
}
176+
return (
177+
<LabeledText
178+
label="Executions"
179+
value={
180+
<div className="d-flex justify-content-start align-items-center">
181+
<Badge
182+
bg={trigger.executionCount > 1 ? "warning" : "success"}
183+
>
184+
{trigger.executionCount}
185+
</Badge>
186+
<span className="ms-2">
187+
{formatMs(trigger.runningDurationInMs)}
188+
</span>
189+
</div>
190+
}
191+
/>
192+
);
193+
};
194+
161195
const TriggerDetailsView = ({
162196
trigger,
163197
history,

ui/test/shared/date.util.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@ describe("Date Util Test", () => {
88
expect(formatMs(59*1000 + 50)).toBe("59s 50ms");
99
expect(formatMs(7*60*1000 + 50)).toBe("7min 0s");
1010
expect(formatMs(3*60*60*1000 + 51000)).toBe("180min 51s");
11+
12+
13+
expect(formatMs(3 * 24 * 60 * 60 * 1000 + 2 * 60 * 60 * 1000 )).toBe("3d 2h");
1114
});
1215
});

0 commit comments

Comments
 (0)