From 9eb19d701072d6ce4e9d99c9f1a3782630bc46e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Paul=20Arguill=C3=A8re?=
Date: Wed, 27 Mar 2024 19:06:04 +0100
Subject: [PATCH 1/5] handle AM/PM time in target menu, add
yesterday/today/tomorrow to improve readability
---
apps/elapsed_t/app.js | 121 +++++++++++++++++++++++++++---------------
1 file changed, 79 insertions(+), 42 deletions(-)
diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js
index f799c4f4c..da006c144 100644
--- a/apps/elapsed_t/app.js
+++ b/apps/elapsed_t/app.js
@@ -112,6 +112,13 @@ function formatDateTime(date, dateFormat, time24, showSeconds) {
return formattedDateTime;
}
+function formatHourToAMPM(h){
+ var ampm = (h >= 12 ? 'PM' : 'AM');
+ var h_ampm = h % 12;
+ h_ampm = (h_ampm == 0 ? 12 : h_ampm);
+ return `${h_ampm} ${ampm}`
+}
+
function howManyDaysInMonth(month, year) {
return new Date(year, month, 0).getDate();
}
@@ -125,44 +132,6 @@ function handleExceedingDay() {
}
}
-function setTarget(set) {
- if (set) {
- target = new Date(
- data.target.Y,
- data.target.M - 1,
- data.target.D,
- data.target.h,
- data.target.m,
- data.target.s
- );
- data.target.isSet = true;
- } else {
- target = new Date();
- Object.assign(
- data,
- {
- target: {
- isSet: false,
- Y: now.getFullYear(),
- M: now.getMonth() + 1, // Month is zero-based, so add 1
- D: now.getDate(),
- h: now.getHours(),
- m: now.getMinutes(),
- s: now.getSeconds()
- }
- }
- );
- }
-
- writeData();
-}
-
-var target;
-setTarget(data.target.isSet);
-
-var drawTimeout;
-var queueMillis = 1000;
-
var menu = {
"": {
"title": "Set target",
@@ -202,7 +171,7 @@ var menu = {
onchange: v => {
data.target.h = v;
},
- format: function (v) { return pad2(v); }
+ format: function (v) {return(settings.time24 ? pad2(v) : formatHourToAMPM(v))}
},
'Minutes': {
value: data.target.m,
@@ -240,6 +209,51 @@ var menu = {
}
};
+function setTarget(set) {
+ if (set) {
+ target = new Date(
+ data.target.Y,
+ data.target.M - 1,
+ data.target.D,
+ data.target.h,
+ data.target.m,
+ data.target.s
+ );
+ data.target.isSet = true;
+ } else {
+ target = new Date();
+ Object.assign(
+ data,
+ {
+ target: {
+ isSet: false,
+ Y: now.getFullYear(),
+ M: now.getMonth() + 1, // Month is zero-based, so add 1
+ D: now.getDate(),
+ h: now.getHours(),
+ m: now.getMinutes(),
+ s: 0
+ }
+ }
+ );
+ menu.Day.value = data.target.D;
+ menu.Month.value = data.target.M;
+ menu.Year.value = data.target.Y;
+ menu.Hours.value = data.target.h;
+ menu.Minutes.value = data.target.m;
+ menu.Seconds.value = 0;
+ }
+
+ writeData();
+}
+
+var target;
+setTarget(data.target.isSet);
+
+var drawTimeout;
+var queueMillis = 1000;
+
+
function queueDraw() {
if (drawTimeout) clearTimeout(drawTimeout);
var delay = queueMillis - (Date.now() % queueMillis);
@@ -359,10 +373,19 @@ function diffToTarget() {
}
function draw() {
- var nowFormatted = formatDateTime(new Date(), settings.dateFormat, settings.time24, temp_displaySeconds);
+ var now = new Date();
+ var nowFormatted = formatDateTime(now, settings.dateFormat, settings.time24, temp_displaySeconds);
var targetFormatted = formatDateTime(target, settings.dateFormat, settings.time24, true);
var diff = diffToTarget();
+ const nowY = now.getFullYear();
+ const nowM = now.getMonth();
+ const nowD = now.getDate();
+
+ const targetY = target.getFullYear();
+ const targetM = target.getMonth();
+ const targetD = target.getDate();
+
var diffYMD;
if (settings.displayMonthsYears)
diffYMD = `${diff.sign}${diff.Y}Y ${diff.M}M ${diff.D}D`;
@@ -391,9 +414,23 @@ function draw() {
g.drawString(">", 4, y + 3);
if (data.target.isSet) {
- // draw target date
g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_ORANGE : COLOUR_RED);
- g.drawString(targetFormatted.date, 4 + 16 + 6, y);
+
+ if (nowY == targetY && nowM == targetM && nowD == targetD) {
+ // today
+ g.drawString("TODAY", 4 + 16 + 6, y);
+ } else if (nowY == targetY && nowM == targetM && nowD - targetD == 1) {
+ // yesterday
+ g.drawString("YESTERDAY", 4 + 16 + 6, y);
+ } else if (nowY == targetY && nowM == targetM && targetD - nowD == 1) {
+ // tomorrow
+ g.drawString("TOMORROW", 4 + 16 + 6, y);
+ } else {
+ // general case
+ // draw target date
+ g.drawString(targetFormatted.date, 4 + 16 + 6, y);
+ }
+
y += SMALL_FONT_SIZE;
// draw target time
From 40a29528d236e0f7102109f4cfa4f0f86b0d3258 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Paul=20Arguill=C3=A8re?=
Date: Wed, 27 Mar 2024 19:07:25 +0100
Subject: [PATCH 2/5] update changelog and metadata
---
apps/elapsed_t/ChangeLog | 3 ++-
apps/elapsed_t/metadata.json | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/apps/elapsed_t/ChangeLog b/apps/elapsed_t/ChangeLog
index 2286a7f70..45cb47c9a 100644
--- a/apps/elapsed_t/ChangeLog
+++ b/apps/elapsed_t/ChangeLog
@@ -1 +1,2 @@
-0.01: New App!
\ No newline at end of file
+0.01: New App!
+0.02: Handle AM/PM time in the "set target" menu. Add yesterday/today/tomorrow when showing target date to improve readability.
\ No newline at end of file
diff --git a/apps/elapsed_t/metadata.json b/apps/elapsed_t/metadata.json
index fe9af630f..7f8460e49 100644
--- a/apps/elapsed_t/metadata.json
+++ b/apps/elapsed_t/metadata.json
@@ -3,7 +3,7 @@
"name": "Elapsed Time Clock",
"shortName": "Elapsed Time",
"type": "clock",
- "version":"0.01",
+ "version":"0.02",
"description": "A clock that calculates the time difference between now and any given target date.",
"tags": "clock,tool",
"supports": ["BANGLEJS2"],
From 13b82670a312fdc3c7c3c07061a2d2a55b0364bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Paul=20Arguill=C3=A8re?=
Date: Wed, 27 Mar 2024 19:08:39 +0100
Subject: [PATCH 3/5] add space in AM/PM time
---
apps/elapsed_t/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js
index da006c144..a61eb2176 100644
--- a/apps/elapsed_t/app.js
+++ b/apps/elapsed_t/app.js
@@ -106,7 +106,7 @@ function formatDateTime(date, dateFormat, time24, showSeconds) {
var ampm = (h >= 12 ? 'PM' : 'AM');
var h_ampm = h % 12;
h_ampm = (h_ampm == 0 ? 12 : h_ampm);
- formattedDateTime.time = `${h_ampm}:${mm}${showSeconds ? `:${ss}` : ''}${ampm}`;
+ formattedDateTime.time = `${h_ampm}:${mm}${showSeconds ? `:${ss}` : ''} ${ampm}`;
}
return formattedDateTime;
From df787b6db1d919fd12dabad45c26032a8644f073 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Paul=20Arguill=C3=A8re?=
Date: Wed, 27 Mar 2024 19:11:20 +0100
Subject: [PATCH 4/5] set 0 as default value for seconds
---
apps/elapsed_t/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js
index a61eb2176..b38735a32 100644
--- a/apps/elapsed_t/app.js
+++ b/apps/elapsed_t/app.js
@@ -41,7 +41,7 @@ var data = Object.assign({
D: now.getDate(),
h: now.getHours(),
m: now.getMinutes(),
- s: now.getSeconds()
+ s: 0
}
}, require('Storage').readJSON(APP_NAME + ".data.json", true) || {});
From 71ff4afb39ecbe2c758f6dc3849e3589066136c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Paul=20Arguill=C3=A8re?=
Date: Wed, 27 Mar 2024 19:28:19 +0100
Subject: [PATCH 5/5] Update screenshot2.png
---
apps/elapsed_t/screenshot2.png | Bin 4313 -> 4020 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/apps/elapsed_t/screenshot2.png b/apps/elapsed_t/screenshot2.png
index 67dd4f186dfa32dde31a2a1b4be69d457b45a80d..00ad8aa366434f55b27897511edde9321f28ac27 100644
GIT binary patch
delta 4010
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
QsQ>@~07*qoM6N<$f>ivrqyPW_
delta 4305
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