diff --git a/handlers/dashboard-get/dashboard.js b/handlers/dashboard-get/dashboard.js index ea78d116..491635a5 100644 --- a/handlers/dashboard-get/dashboard.js +++ b/handlers/dashboard-get/dashboard.js @@ -1,6 +1,25 @@ +import { dateToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; +import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; +import { getWorkOrders } from "../../helpers/lotOccupancyDB/getWorkOrders.js"; export const handler = (_request, response) => { + const currentDateString = dateToString(new Date()); + const workOrderMilestones = getWorkOrderMilestones({ + workOrderMilestoneDateFilter: "date", + workOrderMilestoneDateString: currentDateString + }, { + orderBy: "completion", + includeWorkOrders: true + }); + const workOrderCount = getWorkOrders({ + workOrderOpenDateString: currentDateString + }, { + limit: 1, + offset: 0 + }).count; response.render("dashboard", { - headTitle: "Dashboard" + headTitle: "Dashboard", + workOrderMilestones, + workOrderCount }); }; export default handler; diff --git a/handlers/dashboard-get/dashboard.ts b/handlers/dashboard-get/dashboard.ts index 3ef67bf2..a67db931 100644 --- a/handlers/dashboard-get/dashboard.ts +++ b/handlers/dashboard-get/dashboard.ts @@ -1,8 +1,36 @@ import type { RequestHandler } from "express"; +import { dateToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; + +import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; +import {getWorkOrders} from "../../helpers/lotOccupancyDB/getWorkOrders.js"; + export const handler: RequestHandler = (_request, response) => { + + const currentDateString = dateToString(new Date()); + + const workOrderMilestones = getWorkOrderMilestones( + { + workOrderMilestoneDateFilter: "date", + workOrderMilestoneDateString: currentDateString + }, + { + orderBy: "completion", + includeWorkOrders: true + } + ); + + const workOrderCount = getWorkOrders({ + workOrderOpenDateString: currentDateString + }, { + limit: 1, + offset: 0 + }).count; + response.render("dashboard", { - headTitle: "Dashboard" + headTitle: "Dashboard", + workOrderMilestones, + workOrderCount }); }; diff --git a/helpers/lotOccupancyDB/getWorkOrders.d.ts b/helpers/lotOccupancyDB/getWorkOrders.d.ts index f50836ce..e8cdf47f 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.d.ts +++ b/helpers/lotOccupancyDB/getWorkOrders.d.ts @@ -2,6 +2,7 @@ import type * as recordTypes from "../../types/recordTypes"; interface GetWorkOrdersFilters { workOrderTypeId?: number | string; workOrderOpenStatus?: "" | "open" | "closed"; + workOrderOpenDateString?: string; } interface GetWorkOrdersOptions { limit: number; diff --git a/helpers/lotOccupancyDB/getWorkOrders.js b/helpers/lotOccupancyDB/getWorkOrders.js index a2f9babc..e044edf2 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.js +++ b/helpers/lotOccupancyDB/getWorkOrders.js @@ -1,6 +1,6 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; +import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; export const getWorkOrders = (filters, options) => { const database = sqlite(databasePath, { readonly: true @@ -20,6 +20,10 @@ export const getWorkOrders = (filters, options) => { sqlWhereClause += " and w.workOrderCloseDate is not null"; } } + if (filters.workOrderOpenDateString) { + sqlWhereClause += " and w.workOrderOpenDate = ?"; + sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)); + } const count = database .prepare("select count(*) as recordCount" + " from WorkOrders w" + diff --git a/helpers/lotOccupancyDB/getWorkOrders.ts b/helpers/lotOccupancyDB/getWorkOrders.ts index a28d1144..25e59a51 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.ts +++ b/helpers/lotOccupancyDB/getWorkOrders.ts @@ -2,13 +2,14 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; +import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import type * as recordTypes from "../../types/recordTypes"; interface GetWorkOrdersFilters { workOrderTypeId?: number | string; workOrderOpenStatus?: "" | "open" | "closed"; + workOrderOpenDateString?: string; } interface GetWorkOrdersOptions { @@ -45,6 +46,11 @@ export const getWorkOrders = ( } } + if (filters.workOrderOpenDateString) { + sqlWhereClause += " and w.workOrderOpenDate = ?"; + sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)); + } + const count: number = database .prepare( "select count(*) as recordCount" + diff --git a/views/dashboard.ejs b/views/dashboard.ejs index 1b15e14a..d4d0996d 100644 --- a/views/dashboard.ejs +++ b/views/dashboard.ejs @@ -5,126 +5,247 @@
+ <% if (workOrderMilestones.length > 0) { %> +
+ +
+ <% } %>
-
-
-
-
- -
-
-

- <%= configFunctions.getProperty("aliases.lot") %> - <%= configFunctions.getProperty("aliases.occupancies") %> -

-

View and maintain current and past - <%= configFunctions.getProperty("aliases.lot").toLowerCase() %> - <%= configFunctions.getProperty("aliases.occupancies").toLowerCase() %>.

+
+
+
+
+
+
+ +
+
+

+ <%= configFunctions.getProperty("aliases.lot") %> + <%= configFunctions.getProperty("aliases.occupancies") %> +

+

View and maintain current and past + <%= configFunctions.getProperty("aliases.lot").toLowerCase() %> + <%= configFunctions.getProperty("aliases.occupancies").toLowerCase() %>.

+
+
+ <% if (user.userProperties.canUpdate) { %> + + <% } %>
-
-
-
- +
+
+
+
+
+ +
+
+
+
+
+

+ Work Orders +

+
+
+ <% if (workOrderCount > 0) { %> +
+
+ <%= workOrderCount %> Open Today +
+
+ <% } %> +
+

View and maintain work orders.

+
+
-
-

- Work Orders -

-

View and maintain work orders.

+
-
-
-
-
-
-
- +
+
+
+
+
+
+ +
+
+

+ <%= configFunctions.getProperty("aliases.lots") %> +

+

View and maintain <%= configFunctions.getProperty("aliases.lots").toLowerCase() %> within a + <%= configFunctions.getProperty("aliases.map").toLowerCase() %>.

+
+
-
-

- <%= configFunctions.getProperty("aliases.lots") %> -

-

View and maintain <%= configFunctions.getProperty("aliases.lots").toLowerCase() %> within a - <%= configFunctions.getProperty("aliases.map").toLowerCase() %>.

+ <% if (user.userProperties.canUpdate) { %> + + <% } %> +
+
+
+
+
+
+
+ +
+
+

+ <%= configFunctions.getProperty("aliases.maps") %> +

+

View and maintain <%= configFunctions.getProperty("aliases.maps").toLowerCase() %>.

+
+
+
+ <% if (user.userProperties.canUpdate) { %> + + <% } %> +
+
+
+
+
+
+
+
+
+ +
+
+

+ Report Library +

+

Produce reports and export data.

+
+
-
-
-
- +
+
+
+
+
+ +
+
+

+ Help Documentation +

+

Instructions on how to use this application.

+
+
-
-

- <%= configFunctions.getProperty("aliases.maps") %> -

-

View and maintain <%= configFunctions.getProperty("aliases.maps").toLowerCase() %>.

+
-
-
-
-
-
-
-
-
- -
-
-

- Report Library -

-

Produce reports and export data.

-
-
-
-
-
-
-
-
-
-
- -
-
-

- Help Documentation -

-

Instructions on how to use this application.

-
-
-
- -
-
-
- -<% if (user.userProperties.isAdmin) { %> -

Administrator Tools

- -
-
+ + <% if (user.userProperties.isAdmin) { %> +

Administrator Tools

+
@@ -196,9 +317,10 @@
+ <% } %>
-<% } %> + <%- include('_footerA'); -%> <%- include('_footerB'); -%> \ No newline at end of file