From 7d2583b6f01d0d6e7052d1f022bcb942e9f45d09 Mon Sep 17 00:00:00 2001
From: itwrx <whois@itwrx.org>
Date: Sat, 17 May 2025 07:10:54 -0500
Subject: [PATCH] fix nim compiler warnings and clearAllReminders() after
 updating sendDate

---
 helpers/auth.nim                        |  2 +-
 helpers/reminder.nim                    | 16 +++++++++++++---
 models/reminder.nim                     | 16 +++++++++++++++-
 post_handlers/reminder_post_handler.nim |  4 ++--
 templates/main_template_top.nimf        |  2 +-
 templates/reminder_create.nimf          |  4 ++--
 templates/reminder_update.nimf          |  4 ++--
 templates/reminders.nimf                | 14 +++++++-------
 8 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/helpers/auth.nim b/helpers/auth.nim
index 2998fac..1610b19 100644
--- a/helpers/auth.nim
+++ b/helpers/auth.nim
@@ -3,7 +3,7 @@ This file is part of Simple Site Manager.
 Simple Site Manager is released under the GNU Affero General Public License 3.0.
 See COPYING or <https://www.gnu.org/licenses/> for details.]#
 
-import std/[strutils, cgi, strtabs, cookies, sysrand, base64]
+import std/[cgi, strtabs, cookies, sysrand, base64]
 import guildenstern/[httpserver], sqliteral
 import "../models/session", "db", "global"
 
diff --git a/helpers/reminder.nim b/helpers/reminder.nim
index 9849322..a4eaaa2 100644
--- a/helpers/reminder.nim
+++ b/helpers/reminder.nim
@@ -1,4 +1,4 @@
-import std/[times, osproc, strutils], smtp
+import std/[times, osproc], smtp
 import ../models/reminder, ../models/user, datetime
 
 proc setFutureSendDate(reminderId: int) =
@@ -10,24 +10,33 @@ proc setFutureSendDate(reminderId: int) =
       newSendDate = now() + 1.days
       reminder.sendDate = $format(newSendDate, "yyyy-MM-dd")
       updateReminderSendDate(reminder)
+      clearAllReminders()
     of "week":
       newSendDate = nextWeekday(reminder.weeklyOn)
       reminder.sendDate = $format(newSendDate, "yyyy-MM-dd")
       updateReminderSendDate(reminder)
+      clearAllReminders()
     of "month":
       if reminder.monthlyOnDay > 0:
         #create DateTime with current month and year and reminder.monthlyOnDay
         newSendDate = dateTime(year(now()), month(now()), reminder.monthlyOnDay)
+        echo newSendDate
         #add 1 month only if monthlyOnDay hasn't occured in current month yet.
+        echo reminder.monthlyOnDay
+        echo monthDay(now())
         if reminder.monthlyOnDay < monthDay(now()):
           newSendDate = newSendDate + 1.months
+          echo newSendDate
         reminder.sendDate = $format(newSendDate, "yyyy-MM-dd")
+        echo reminder.sendDate
         updateReminderSendDate(reminder)
+        clearAllReminders()
       else:
         #monthly on week number and weekday. e.g. "third thursday of every month".
         newSendDate = nextMonthlyOnWeekdayOfWeek($reminder.monthlyOnWeekday, $reminder.monthlyOnWeek)
         reminder.sendDate = $format(newSendDate, "yyyy-MM-dd")
         updateReminderSendDate(reminder)
+        clearAllReminders()
     of "year":
       #yearly on month and day.
       #string zeros (db artifacts) have a length of 1...
@@ -35,14 +44,15 @@ proc setFutureSendDate(reminderId: int) =
         newSendDate = nextYearlyDate(reminder.yearlyOnMonth, reminder.yearlyOnDay)
         reminder.sendDate = $format(newSendDate, "yyyy-MM-dd")
         updateReminderSendDate(reminder)
+        clearAllReminders()
       #yearly on weekday of week of month. e.g. third thursday of november of each year.
       else:
         newSendDate = nextYearlyOnWeekdayOfWeekOfMonth($reminder.yearlyOnWeekday, $reminder.yearlyOnWeek, $reminder.yearlyOnMonth2)
         reminder.sendDate = $format(newSendDate, "yyyy-MM-dd")
         updateReminderSendDate(reminder)
+        clearAllReminders()
     else:
-      echo "Invalid value for reminder.repeatFreq in setFutureSendDate()"
-  clearAllReminders()
+      echo "Invalid value for reminder.repeatFreq in setFutureSendDate()"  
 
 proc sendEmail(reminderMsg: string) =
   let userEmailAddress = getEmailByUserId("1")
diff --git a/models/reminder.nim b/models/reminder.nim
index 3fe35e8..d786514 100644
--- a/models/reminder.nim
+++ b/models/reminder.nim
@@ -3,7 +3,8 @@ This file is part of Simple Site Manager.
 Simple Site Manager is released under the GNU Affero General Public License 3.0.
 See COPYING or <https://www.gnu.org/licenses/> for details.]#
 
-import sqliteral, "../helpers/db", "../helpers/global.nim", sequtils
+#import sqliteral, "../helpers/db", "../helpers/global.nim", sequtils, algorithm, times
+import sqliteral, "../helpers/db", algorithm, times
 
 type
   Reminder* = object
@@ -12,11 +13,24 @@ type
 
 var allReminders: seq[Reminder]
 
+#proc myCmp(x, y: Reminder): int =
+#  cmp(x.sendDate, y.sendDate)
+
+proc getReminderSendDatetime*(reminder: Reminder): DateTime =
+  let sendDateDTString = $reminder.sendDate & " " & $reminder.sendTimeHr & ":" & $reminder.sendTimeMin & ":" & $reminder.sendTimeAmPm
+  #single digits for minutes, as db send_time_min is integer and won't use "00", which results in runtime parse error.
+  let sendDateDT = parse(sendDateDTString, "yyyy-M-d h:m:tt")
+  return sendDateDT
+  
+proc myCmp(x, y: Reminder): int =
+  cmp(getReminderSendDatetime(x), getReminderSendDatetime(y))
+
 proc getAllReminders*(): seq[Reminder] =
   {.gcsafe.}:
     if allReminders.len == 0:
       for row in db1.rows(SelectAllReminders):
         allReminders.add(Reminder(id: row.getInt(0), title: row.getString(1), message: row.getString(2), notifyVia: row.getString(3), repeats: row.getInt(4), repeatFreq: row.getString(5), weeklyOn: row.getString(6), monthlyOnDay: row.getInt(7), monthlyOnWeekday: row.getString(8), monthlyOnWeek: row.getString(9), yearlyOnMonth: row.getString(10), yearlyOnDay: row.getInt(11), yearlyOnWeek: row.getString(12), yearlyOnWeekday: row.getString(13), yearlyOnMonth2: row.getString(14), sendDate: row.getString(15), sendTimeHr: row.getInt(16), sendTimeMin: row.getInt(17), sendTimeAmPm: row.getString(18)))
+    allReminders.sort(myCmp)
     return allReminders
 
 proc clearAllReminders*() =
diff --git a/post_handlers/reminder_post_handler.nim b/post_handlers/reminder_post_handler.nim
index 9e207ff..96b6b37 100644
--- a/post_handlers/reminder_post_handler.nim
+++ b/post_handlers/reminder_post_handler.nim
@@ -3,8 +3,8 @@ This file is part of Simple Site Manager.
 Simple Site Manager is released under the GNU Affero General Public License 3.0.
 See COPYING or <https://www.gnu.org/licenses/> for details.]#
 
-import guildenstern/httpserver, jsony
-import "../helpers/form", "../helpers/global", "../helpers/validation", "../helpers/auth"
+import guildenstern/httpserver
+import "../helpers/form", "../helpers/global", "../helpers/validation"
 import "../models/reminder"
 
 proc reminderCreatePostHandler*() =
diff --git a/templates/main_template_top.nimf b/templates/main_template_top.nimf
index 15035b7..31378c7 100644
--- a/templates/main_template_top.nimf
+++ b/templates/main_template_top.nimf
@@ -1,5 +1,5 @@
 #? stdtmpl(subsChar = '$', metaChar = '#')
-#import "../helpers/global", "../models/reminder", "../helpers/auth"
+#import "../helpers/global", "../models/reminder"
 #proc mainTemplateTop*(title, csrfToken: string): string =
 #let sections = getAllReminders()
 # result = ""
diff --git a/templates/reminder_create.nimf b/templates/reminder_create.nimf
index bc0aa3a..c4f93ea 100644
--- a/templates/reminder_create.nimf
+++ b/templates/reminder_create.nimf
@@ -1,5 +1,5 @@
 #? stdtmpl(subsChar = '$', metaChar = '#')
-#import "../helpers/global", "../helpers/form", "../helpers/auth", "../models/reminder"
+#import "../helpers/global", "../helpers/form"
 #import "main_template_top.nimf", "main_template_bottom.nimf"
 #proc reminderCreateTemplate*(csrfToken: string, fr: FormResult): string =
 #let pageTitle = "Create a Reminder"
@@ -12,7 +12,7 @@
       <form id="reminder-create" method="POST" action="${APP_URL}/reminder/create" accept-charset="utf-8">
           <input type="hidden" name="csrf_token" value="${csrfToken}" form="reminder-create"/>
           <label>${fErrorMsg(fr, "title")}
-              <span class="text-2xl text-red-500">*</span><span class="help-text" title="This will be used to generate your reminder's url and meta-title and is very important for SEO, so it should ideally start with your main search target phrase for this reminder, and not have more than one search target phrase, nor be any longer than necessary.">Title</span>:
+              <span class="text-2xl text-red-500">*</span><span class="help-text" title="This is just used as a short way to reference the Reminder in the Upcoming Reminders page.">Title</span>:
               <input type="text" id="title" name="title" value="${fOldInput(fr, "title")}" form="reminder-create" class="w-2/5" required>
           </label>
           <div class="mt-4">
diff --git a/templates/reminder_update.nimf b/templates/reminder_update.nimf
index 21f7676..bb15e3f 100644
--- a/templates/reminder_update.nimf
+++ b/templates/reminder_update.nimf
@@ -1,5 +1,5 @@
 #? stdtmpl(subsChar = '$', metaChar = '#')
-#import "../helpers/global", "../helpers/form", "../helpers/auth", "../models/reminder"
+#import "../helpers/global", "../helpers/form", "../models/reminder"
 #import "main_template_top.nimf", "main_template_bottom.nimf"
 #proc reminderUpdateTemplate*(reminderId:int, csrfToken: string, fr: FormResult): string =
 #let reminder = getReminderById(reminderId)
@@ -21,7 +21,7 @@
             <input type="hidden" name="csrf_token" value="${csrfToken}" form="reminder-update"/>
             <input type="hidden" name="reminder_id" value="${reminder.id}">
             <label>${fErrorMsg(fr, "title")}
-                <span class="text-2xl text-red-500">*</span><span class="help-text" title="This will be used to generate your section's url and meta-title and is very important for SEO, so it should ideally start with your main search target phrase for this section, and not have more than one search target phrase, nor be any longer than necessary.">Title</span>:
+                <span class="text-2xl text-red-500">*</span><span class="help-text" title="This is just used as a short way to reference the Reminder in the Upcoming Reminders page.">Title</span>:
                 <input type="text" name="title" value="${fOldInput(fr, "title", reminder.title)}" form="reminder-update" class="w-2/5" required>
             </label>
             <div class="mt-4">
diff --git a/templates/reminders.nimf b/templates/reminders.nimf
index 6a3ff1c..d9fa3da 100644
--- a/templates/reminders.nimf
+++ b/templates/reminders.nimf
@@ -1,5 +1,5 @@
 #? stdtmpl(subsChar = '$', metaChar = '#')
-#import "../helpers/global", "../helpers/form", "../helpers/auth", "../models/reminder"
+#import "../helpers/form", "../models/reminder", std/times
 #import "main_template_top.nimf", "main_template_bottom.nimf"
 #proc remindersTemplate*(allReminders: seq[Reminder], csrfToken: string, fr: FormResult): string =
 # result = ""
@@ -8,11 +8,11 @@
       <span class="text-2xl">Upcoming Reminders</span><a href="/create-reminder" class="a-btn-grn ml-8">+ New Reminder</a>
   </div>
   #if allReminders.len > 0:
-  <div class="mt-8 flex flex-row p-2 border-b border-indigo-400">
-      <div class="basis-2/4"><span class="text-xl">Title</span></div>
-      <div class="basis-1/12"><span class="text-xl">Repeats?</span></div>
-      <div class="basis-1/4"><span class="text-xl">Next Send Date</span></div>
-      <div class="basis-1/4"><span class="text-xl">Actions</span></div>
+  <div class="mt-8 flex flex-row p-2 border-b border-indigo-400 text-lg">
+      <div class="basis-2/4"><span>Title</span></div>
+      <div class="basis-1/12"><span>Repeats?</span></div>
+      <div class="basis-1/4"><span>Next Send Date &amp; Time</span></div>
+      <div class="basis-1/4"><span>Actions</span></div>
   </div>
   #else:
   <br><br><h2 class="text-lg text-orange-400">You don't have any Reminders yet.</h2>
@@ -27,7 +27,7 @@
         Yes
       #end if
       </span></div>
-      <div class="basis-1/4"><span class="text-lg">${reminder.sendDate}</span></div>
+      <div class="basis-1/4"><span class="text-lg">${$format(getReminderSendDatetime(reminder), "MM-dd-yyyy h:mm:tt")}</span></div>
       <div class="basis-1/4">
           <span><a href="/reminder/${reminder.id}/update" class="a-btn-grn">View/Edit</a></span>
           <form method="POST" action="/reminder/delete" accept-charset="utf-8" class="inline">