diff --git a/handlers/api-get/milestoneICS.js b/handlers/api-get/milestoneICS.js index ecd4737a..e2989344 100644 --- a/handlers/api-get/milestoneICS.js +++ b/handlers/api-get/milestoneICS.js @@ -14,23 +14,24 @@ export const handler = (request, response) => { configFunctions.getProperty("reverseProxy.urlPrefix"); const workOrderMilestoneFilters = { workOrderTypeIds: request.query.workOrderTypeIds, - workOrderMilestoneTypeIds: request.query - .workOrderMilestoneTypeIds + workOrderMilestoneTypeIds: request.query.workOrderMilestoneTypeIds }; if (request.query.workOrderId) { - workOrderMilestoneFilters.workOrderId = request.query - .workOrderId; + workOrderMilestoneFilters.workOrderId = request.query.workOrderId; } else { workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent"; } - const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, { includeWorkOrders: true, orderBy: "date" }); + const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, { + includeWorkOrders: true, + orderBy: "date" + }); const calendar = ical({ name: "Work Order Milestone Calendar", url: urlRoot + "/workOrders" }); if (request.query.workOrderId && workOrderMilestones.length > 0) { - calendar.name("Work Order #" + workOrderMilestones[0].workOrder.workOrderNumber); + calendar.name("Work Order #" + workOrderMilestones[0].workOrderNumber); calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId); } calendar.prodId({ @@ -42,13 +43,14 @@ export const handler = (request, response) => { " " + milestone.workOrderMilestoneTimeString).split(timeStringSplitRegex); const milestoneDate = new Date(Number.parseInt(milestoneTimePieces[0], 10), Number.parseInt(milestoneTimePieces[1], 10) - 1, Number.parseInt(milestoneTimePieces[2], 10), Number.parseInt(milestoneTimePieces[3], 10), Number.parseInt(milestoneTimePieces[4], 10)); + const milestoneEndDate = new Date(milestoneDate.getTime()); + milestoneEndDate.setHours(milestoneEndDate.getHours() + 1); let summary = (milestone.workOrderMilestoneTypeId ? milestone.workOrderMilestoneType : milestone.workOrderMilestoneDescription).trim(); - if (milestone.workOrder.workOrderLotOccupancies.length > 0) { + if (milestone.workOrderLotOccupancies.length > 0) { let occupantCount = 0; - for (const lotOccupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const lotOccupancy of milestone.workOrderLotOccupancies) { for (const occupant of lotOccupancy.lotOccupancyOccupants) { occupantCount += 1; if (occupantCount === 1) { @@ -68,24 +70,25 @@ export const handler = (request, response) => { start: milestoneDate, created: new Date(milestone.recordCreate_timeMillis), stamp: new Date(milestone.recordCreate_timeMillis), - lastModified: new Date(Math.max(milestone.recordUpdate_timeMillis, milestone.workOrder.recordUpdate_timeMillis)), + lastModified: new Date(Math.max(milestone.recordUpdate_timeMillis, milestone.workOrderRecordUpdate_timeMillis)), allDay: !milestone.workOrderMilestoneTime, summary, url: workOrderURL }; + if (!eventData.allDay) { + eventData.end = milestoneEndDate; + } const calendarEvent = calendar.createEvent(eventData); let descriptionHTML = "

Milestone Description

" + "

" + escapeHTML(milestone.workOrderMilestoneDescription) + "

" + "

Work Order #" + - milestone.workOrder.workOrderNumber + + milestone.workOrderNumber + "

" + - ("

" + - escapeHTML(milestone.workOrder.workOrderDescription) + - "

") + + ("

" + escapeHTML(milestone.workOrderDescription) + "

") + ('

' + workOrderURL + "

"); - if (milestone.workOrder.workOrderLotOccupancies.length > 0) { + if (milestone.workOrderLotOccupancies.length > 0) { descriptionHTML += "

Related " + escapeHTML(configFunctions.getProperty("aliases.occupancies")) + @@ -94,18 +97,13 @@ export const handler = (request, response) => { ("" + escapeHTML(configFunctions.getProperty("aliases.occupancy")) + " Type") + - ("" + - escapeHTML(configFunctions.getProperty("aliases.lot")) + - "") + + ("" + escapeHTML(configFunctions.getProperty("aliases.lot")) + "") + "Start Date" + "End Date" + - ("" + - escapeHTML(configFunctions.getProperty("aliases.occupants")) + - "") + + ("" + escapeHTML(configFunctions.getProperty("aliases.occupants")) + "") + "" + ""; - for (const occupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const occupancy of milestone.workOrderLotOccupancies) { descriptionHTML += "" + ("" + @@ -117,9 +115,7 @@ export const handler = (request, response) => { escapeHTML(occupancy.occupancyType) + "") + ("" + - (occupancy.lotName - ? escapeHTML(occupancy.lotName) - : "(Not Set)") + + (occupancy.lotName ? escapeHTML(occupancy.lotName) : "(Not Set)") + "") + ("" + occupancy.occupancyStartDateString + "") + "" + @@ -129,25 +125,20 @@ export const handler = (request, response) => { "" + ""; for (const occupant of occupancy.lotOccupancyOccupants) { - descriptionHTML += - escapeHTML(occupant.occupantName) + "
"; + descriptionHTML += escapeHTML(occupant.occupantName) + "
"; } descriptionHTML += "" + ""; } descriptionHTML += ""; } - if (milestone.workOrder.workOrderLots.length > 0) { + if (milestone.workOrderLots.length > 0) { descriptionHTML += "

Related " + escapeHTML(configFunctions.getProperty("aliases.lots")) + "

" + '' + - ("") + - ("") + + ("") + + ("") + ("" + "" + ""; - for (const lot of milestone.workOrder.workOrderLots) { + for (const lot of milestone.workOrderLots) { descriptionHTML += "" + ("
" + - escapeHTML(configFunctions.getProperty("aliases.lot")) + - " Type" + - escapeHTML(configFunctions.getProperty("aliases.map")) + - "" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type" + escapeHTML(configFunctions.getProperty("aliases.map")) + "" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type" + @@ -155,7 +146,7 @@ export const handler = (request, response) => { "Status
" + @@ -185,20 +176,19 @@ export const handler = (request, response) => { name: milestone.workOrderMilestoneType }); calendarEvent.createCategory({ - name: milestone.workOrder.workOrderType + name: milestone.workOrderType }); } - if (milestone.workOrder.workOrderLots.length > 0) { + if (milestone.workOrderLots.length > 0) { const lotNames = []; - for (const lot of milestone.workOrder.workOrderLots) { + for (const lot of milestone.workOrderLots) { lotNames.push(lot.mapName + ": " + lot.lotName); } calendarEvent.location(lotNames.join(", ")); } - if (milestone.workOrder.workOrderLotOccupancies.length > 0) { + if (milestone.workOrderLotOccupancies.length > 0) { let organizerSet = false; - for (const lotOccupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const lotOccupancy of milestone.workOrderLotOccupancies) { for (const occupant of lotOccupancy.lotOccupancyOccupants) { if (organizerSet) { calendarEvent.createAttendee({ diff --git a/handlers/api-get/milestoneICS.ts b/handlers/api-get/milestoneICS.ts index cf23a1ae..48e4937c 100644 --- a/handlers/api-get/milestoneICS.ts +++ b/handlers/api-get/milestoneICS.ts @@ -14,10 +14,7 @@ import * as configFunctions from "../../helpers/functions.config.js"; const timeStringSplitRegex = /[ :-]/; function escapeHTML(stringToEscape: string) { - return stringToEscape.replace( - /[^\d A-Za-z]/g, - (c) => "&#" + c.codePointAt(0) + ";" - ); + return stringToEscape.replace(/[^\d A-Za-z]/g, (c) => "&#" + c.codePointAt(0) + ";"); } export const handler: RequestHandler = (request, response) => { @@ -31,21 +28,19 @@ export const handler: RequestHandler = (request, response) => { const workOrderMilestoneFilters: WorkOrderMilestoneFilters = { workOrderTypeIds: request.query.workOrderTypeIds as string, - workOrderMilestoneTypeIds: request.query - .workOrderMilestoneTypeIds as string + workOrderMilestoneTypeIds: request.query.workOrderMilestoneTypeIds as string }; if (request.query.workOrderId) { - workOrderMilestoneFilters.workOrderId = request.query - .workOrderId as string; + workOrderMilestoneFilters.workOrderId = request.query.workOrderId as string; } else { workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent"; } - const workOrderMilestones = getWorkOrderMilestones( - workOrderMilestoneFilters, - { includeWorkOrders: true, orderBy: "date" } - ); + const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, { + includeWorkOrders: true, + orderBy: "date" + }); const calendar = ical({ name: "Work Order Milestone Calendar", @@ -53,7 +48,7 @@ export const handler: RequestHandler = (request, response) => { }); if (request.query.workOrderId && workOrderMilestones.length > 0) { - calendar.name("Work Order #" + workOrderMilestones[0].workOrder.workOrderNumber); + calendar.name("Work Order #" + workOrderMilestones[0].workOrderNumber); calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId); } @@ -77,6 +72,9 @@ export const handler: RequestHandler = (request, response) => { Number.parseInt(milestoneTimePieces[4], 10) ); + const milestoneEndDate = new Date(milestoneDate.getTime()); + milestoneEndDate.setHours(milestoneEndDate.getHours() + 1); + // Build summary (title in Outlook) let summary = ( @@ -85,11 +83,10 @@ export const handler: RequestHandler = (request, response) => { : milestone.workOrderMilestoneDescription ).trim(); - if (milestone.workOrder.workOrderLotOccupancies.length > 0) { + if (milestone.workOrderLotOccupancies.length > 0) { let occupantCount = 0; - for (const lotOccupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const lotOccupancy of milestone.workOrderLotOccupancies) { for (const occupant of lotOccupancy.lotOccupancyOccupants) { occupantCount += 1; @@ -121,7 +118,7 @@ export const handler: RequestHandler = (request, response) => { lastModified: new Date( Math.max( milestone.recordUpdate_timeMillis, - milestone.workOrder.recordUpdate_timeMillis + milestone.workOrderRecordUpdate_timeMillis ) ), allDay: !milestone.workOrderMilestoneTime, @@ -129,6 +126,10 @@ export const handler: RequestHandler = (request, response) => { url: workOrderURL }; + if (!eventData.allDay) { + eventData.end = milestoneEndDate; + } + const calendarEvent = calendar.createEvent(eventData); // Build description @@ -139,39 +140,28 @@ export const handler: RequestHandler = (request, response) => { escapeHTML(milestone.workOrderMilestoneDescription) + "

" + "

Work Order #" + - milestone.workOrder.workOrderNumber + + milestone.workOrderNumber + "

" + - ("

" + - escapeHTML(milestone.workOrder.workOrderDescription) + - "

") + + ("

" + escapeHTML(milestone.workOrderDescription) + "

") + ('

' + workOrderURL + "

"); - if (milestone.workOrder.workOrderLotOccupancies.length > 0) { + if (milestone.workOrderLotOccupancies.length > 0) { descriptionHTML += "

Related " + escapeHTML(configFunctions.getProperty("aliases.occupancies")) + "

" + '' + ("") + - ("") + + ("") + "" + "" + - ("") + + ("") + "" + ""; - for (const occupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const occupancy of milestone.workOrderLotOccupancies) { descriptionHTML += "" + ("") + ("") + ("") + "" + ""; @@ -206,18 +193,14 @@ export const handler: RequestHandler = (request, response) => { descriptionHTML += "
" + - escapeHTML( - configFunctions.getProperty("aliases.occupancy") - ) + + escapeHTML(configFunctions.getProperty("aliases.occupancy")) + " Type" + - escapeHTML(configFunctions.getProperty("aliases.lot")) + - "" + escapeHTML(configFunctions.getProperty("aliases.lot")) + "Start DateEnd Date" + - escapeHTML( - configFunctions.getProperty("aliases.occupants") - ) + - "" + escapeHTML(configFunctions.getProperty("aliases.occupants")) + "
" + @@ -183,9 +173,7 @@ export const handler: RequestHandler = (request, response) => { escapeHTML(occupancy.occupancyType) + "" + - (occupancy.lotName - ? escapeHTML(occupancy.lotName) - : "(Not Set)") + + (occupancy.lotName ? escapeHTML(occupancy.lotName) : "(Not Set)") + "" + occupancy.occupancyStartDateString + "" + @@ -196,8 +184,7 @@ export const handler: RequestHandler = (request, response) => { ""; for (const occupant of occupancy.lotOccupancyOccupants) { - descriptionHTML += - escapeHTML(occupant.occupantName) + "
"; + descriptionHTML += escapeHTML(occupant.occupantName) + "
"; } descriptionHTML += "
"; } - if (milestone.workOrder.workOrderLots.length > 0) { + if (milestone.workOrderLots.length > 0) { descriptionHTML += "

Related " + escapeHTML(configFunctions.getProperty("aliases.lots")) + "

" + '' + - ("") + - ("") + + ("") + + ("") + ("" + ""; - for (const lot of milestone.workOrder.workOrderLots) { + for (const lot of milestone.workOrderLots) { descriptionHTML += "" + ("
" + - escapeHTML(configFunctions.getProperty("aliases.lot")) + - " Type" + - escapeHTML(configFunctions.getProperty("aliases.map")) + - "" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type" + escapeHTML(configFunctions.getProperty("aliases.map")) + "" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type" + @@ -226,7 +209,7 @@ export const handler: RequestHandler = (request, response) => { "
" + @@ -265,16 +248,16 @@ export const handler: RequestHandler = (request, response) => { }); calendarEvent.createCategory({ - name: milestone.workOrder.workOrderType + name: milestone.workOrderType }); } // Set location - if (milestone.workOrder.workOrderLots.length > 0) { + if (milestone.workOrderLots.length > 0) { const lotNames = []; - for (const lot of milestone.workOrder.workOrderLots) { + for (const lot of milestone.workOrderLots) { lotNames.push(lot.mapName + ": " + lot.lotName); } @@ -283,20 +266,23 @@ export const handler: RequestHandler = (request, response) => { // Set organizer / attendees - if (milestone.workOrder.workOrderLotOccupancies.length > 0) { + if (milestone.workOrderLotOccupancies.length > 0) { let organizerSet = false; - for (const lotOccupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const lotOccupancy of milestone.workOrderLotOccupancies) { for (const occupant of lotOccupancy.lotOccupancyOccupants) { if (organizerSet) { calendarEvent.createAttendee({ name: occupant.occupantName, - email: configFunctions.getProperty("settings.workOrders.calendarEmailAddress") + email: configFunctions.getProperty( + "settings.workOrders.calendarEmailAddress" + ) }); } else { calendarEvent.organizer({ name: occupant.occupantName, - email: configFunctions.getProperty("settings.workOrders.calendarEmailAddress") + email: configFunctions.getProperty( + "settings.workOrders.calendarEmailAddress" + ) }); organizerSet = true; } diff --git a/helpers/lotOccupancyDB/getLotOccupancies.js b/helpers/lotOccupancyDB/getLotOccupancies.js index b64e2686..470d359b 100644 --- a/helpers/lotOccupancyDB/getLotOccupancies.js +++ b/helpers/lotOccupancyDB/getLotOccupancies.js @@ -22,9 +22,7 @@ export const getLotOccupancies = (filters, options, connectedDatabase) => { } } if (filters.occupantName) { - const occupantNamePieces = filters.occupantName - .toLowerCase() - .split(" "); + const occupantNamePieces = filters.occupantName.toLowerCase().split(" "); for (const occupantNamePiece of occupantNamePieces) { sqlWhereClause += " and o.lotOccupancyId in (select oo.lotOccupancyId from LotOccupancyOccupants oo where oo.recordDelete_timeMillis is null and instr(lower(oo.occupantName), ?))"; @@ -80,14 +78,17 @@ export const getLotOccupancies = (filters, options, connectedDatabase) => { " and o.lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)"; sqlParameters.push(filters.notWorkOrderId); } - const count = database - .prepare("select count(*) as recordCount" + - " from LotOccupancies o" + - " left join Lots l on o.lotId = l.lotId" + - sqlWhereClause) - .get(sqlParameters).recordCount; + let count; + if (options.limit !== -1) { + count = database + .prepare("select count(*) as recordCount" + + " from LotOccupancies o" + + " left join Lots l on o.lotId = l.lotId" + + sqlWhereClause) + .get(sqlParameters).recordCount; + } let lotOccupancies = []; - if (count > 0) { + if (options.limit === -1 || count > 0) { lotOccupancies = database .prepare("select o.lotOccupancyId," + " o.occupancyTypeId, t.occupancyType," + @@ -102,12 +103,12 @@ export const getLotOccupancies = (filters, options, connectedDatabase) => { sqlWhereClause + " order by o.occupancyStartDate desc, ifnull(o.occupancyEndDate, 99999999) desc, l.lotName, o.lotId" + (options.limit !== -1 - ? " limit " + - options.limit + - " offset " + - options.offset + ? " limit " + options.limit + " offset " + options.offset : "")) .all(sqlParameters); + if (options.limit === -1) { + count = lotOccupancies.length; + } if (options.includeOccupants) { for (const lotOccupancy of lotOccupancies) { lotOccupancy.lotOccupancyOccupants = getLotOccupancyOccupants(lotOccupancy.lotOccupancyId, database); diff --git a/helpers/lotOccupancyDB/getLotOccupancies.ts b/helpers/lotOccupancyDB/getLotOccupancies.ts index 601e1339..9d3f0ea2 100644 --- a/helpers/lotOccupancyDB/getLotOccupancies.ts +++ b/helpers/lotOccupancyDB/getLotOccupancies.ts @@ -65,9 +65,7 @@ export const getLotOccupancies = ( } if (filters.occupantName) { - const occupantNamePieces = filters.occupantName - .toLowerCase() - .split(" "); + const occupantNamePieces = filters.occupantName.toLowerCase().split(" "); for (const occupantNamePiece of occupantNamePieces) { sqlWhereClause += " and o.lotOccupancyId in (select oo.lotOccupancyId from LotOccupancyOccupants oo where oo.recordDelete_timeMillis is null and instr(lower(oo.occupantName), ?))"; @@ -104,9 +102,7 @@ export const getLotOccupancies = ( if (filters.occupancyStartDateString) { sqlWhereClause += " and o.occupancyStartDate = ?"; - sqlParameters.push( - dateStringToInteger(filters.occupancyStartDateString) - ); + sqlParameters.push(dateStringToInteger(filters.occupancyStartDateString)); } if (filters.occupancyEffectiveDateString) { @@ -140,18 +136,22 @@ export const getLotOccupancies = ( sqlParameters.push(filters.notWorkOrderId); } - const count: number = database - .prepare( - "select count(*) as recordCount" + - " from LotOccupancies o" + - " left join Lots l on o.lotId = l.lotId" + - sqlWhereClause - ) - .get(sqlParameters).recordCount; + let count: number; + + if (options.limit !== -1) { + count = database + .prepare( + "select count(*) as recordCount" + + " from LotOccupancies o" + + " left join Lots l on o.lotId = l.lotId" + + sqlWhereClause + ) + .get(sqlParameters).recordCount; + } let lotOccupancies: recordTypes.LotOccupancy[] = []; - if (count > 0) { + if (options.limit === -1 || count > 0) { lotOccupancies = database .prepare( "select o.lotOccupancyId," + @@ -167,14 +167,15 @@ export const getLotOccupancies = ( sqlWhereClause + " order by o.occupancyStartDate desc, ifnull(o.occupancyEndDate, 99999999) desc, l.lotName, o.lotId" + (options.limit !== -1 - ? " limit " + - options.limit + - " offset " + - options.offset + ? " limit " + options.limit + " offset " + options.offset : "") ) .all(sqlParameters); + if (options.limit === -1) { + count = lotOccupancies.length; + } + if (options.includeOccupants) { for (const lotOccupancy of lotOccupancies) { lotOccupancy.lotOccupancyOccupants = getLotOccupancyOccupants( diff --git a/helpers/lotOccupancyDB/getLots.d.ts b/helpers/lotOccupancyDB/getLots.d.ts index b8666d3e..d1e4912d 100644 --- a/helpers/lotOccupancyDB/getLots.d.ts +++ b/helpers/lotOccupancyDB/getLots.d.ts @@ -9,7 +9,7 @@ interface GetLotsFilters { workOrderId?: number | string; } interface GetLotsOptions { - limit: number; + limit: -1 | number; offset: number; } export declare const getLots: (filters: GetLotsFilters, options: GetLotsOptions, connectedDatabase?: sqlite.Database) => { diff --git a/helpers/lotOccupancyDB/getLots.js b/helpers/lotOccupancyDB/getLots.js index 79dd24b2..1fa1b916 100644 --- a/helpers/lotOccupancyDB/getLots.js +++ b/helpers/lotOccupancyDB/getLots.js @@ -43,24 +43,27 @@ export const getLots = (filters, options, connectedDatabase) => { sqlParameters.push(filters.workOrderId); } const currentDate = dateToInteger(new Date()); - const count = database - .prepare("select count(*) as recordCount" + - " from Lots l" + - (" left join (" + - "select lotId, count(lotOccupancyId) as lotOccupancyCount" + - " from LotOccupancies" + - " where recordDelete_timeMillis is null" + - " and occupancyStartDate <= " + - currentDate + - " and (occupancyEndDate is null or occupancyEndDate >= " + - currentDate + - ")" + - " group by lotId" + - ") o on l.lotId = o.lotId") + - sqlWhereClause) - .get(sqlParameters).recordCount; + let count; + if (options.limit !== -1) { + count = database + .prepare("select count(*) as recordCount" + + " from Lots l" + + (" left join (" + + "select lotId, count(lotOccupancyId) as lotOccupancyCount" + + " from LotOccupancies" + + " where recordDelete_timeMillis is null" + + " and occupancyStartDate <= " + + currentDate + + " and (occupancyEndDate is null or occupancyEndDate >= " + + currentDate + + ")" + + " group by lotId" + + ") o on l.lotId = o.lotId") + + sqlWhereClause) + .get(sqlParameters).recordCount; + } let lots = []; - if (count > 0) { + if (options.limit === -1 || count > 0) { database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction")); lots = database .prepare("select l.lotId, l.lotName," + @@ -92,6 +95,9 @@ export const getLots = (filters, options, connectedDatabase) => { options.offset : "")) .all(sqlParameters); + if (options.limit === -1) { + count = lots.length; + } } if (!connectedDatabase) { database.close(); diff --git a/helpers/lotOccupancyDB/getLots.ts b/helpers/lotOccupancyDB/getLots.ts index 8c5ab147..aca3b231 100644 --- a/helpers/lotOccupancyDB/getLots.ts +++ b/helpers/lotOccupancyDB/getLots.ts @@ -18,7 +18,7 @@ interface GetLotsFilters { } interface GetLotsOptions { - limit: number; + limit: -1 | number; offset: number; } @@ -79,7 +79,10 @@ export const getLots = ( const currentDate = dateToInteger(new Date()); - const count: number = database + let count: number; + + if (options.limit !== -1) { + count = database .prepare( "select count(*) as recordCount" + " from Lots l" + @@ -97,10 +100,11 @@ export const getLots = ( sqlWhereClause ) .get(sqlParameters).recordCount; + } let lots: recordTypes.Lot[] = []; - if (count > 0) { + if (options.limit === -1 || count > 0) { database.function( "userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction") @@ -138,6 +142,10 @@ export const getLots = ( : "") ) .all(sqlParameters); + + if (options.limit === -1) { + count = lots.length; + } } if (!connectedDatabase) { diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestones.js b/helpers/lotOccupancyDB/getWorkOrderMilestones.js index 4e61c822..10df39a5 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestones.js +++ b/helpers/lotOccupancyDB/getWorkOrderMilestones.js @@ -1,8 +1,9 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { getWorkOrder } from "./getWorkOrder.js"; import { dateIntegerToString, dateStringToInteger, dateToInteger, timeIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import * as configFunctions from "../functions.config.js"; +import { getLots } from "./getLots.js"; +import { getLotOccupancies } from "./getLotOccupancies.js"; const commaSeparatedNumbersRegex = /^\d+(,\d+)*$/; export const getWorkOrderMilestones = (filters, options, connectedDatabase) => { const database = connectedDatabase || @@ -42,17 +43,13 @@ export const getWorkOrderMilestones = (filters, options, connectedDatabase) => { sqlWhereClause += " and m.workOrderMilestoneDate = ?"; sqlParameters.push(dateStringToInteger(filters.workOrderMilestoneDateString)); } - if (filters.workOrderTypeIds && - commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) { - sqlWhereClause += - " and w.workOrderTypeId in (" + filters.workOrderTypeIds + ")"; + if (filters.workOrderTypeIds && commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) { + sqlWhereClause += " and w.workOrderTypeId in (" + filters.workOrderTypeIds + ")"; } if (filters.workOrderMilestoneTypeIds && commaSeparatedNumbersRegex.test(filters.workOrderMilestoneTypeIds)) { sqlWhereClause += - " and m.workOrderMilestoneTypeId in (" + - filters.workOrderMilestoneTypeIds + - ")"; + " and m.workOrderMilestoneTypeId in (" + filters.workOrderMilestoneTypeIds + ")"; } let orderByClause = ""; switch (options.orderBy) { @@ -68,29 +65,45 @@ export const getWorkOrderMilestones = (filters, options, connectedDatabase) => { " order by m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," + " t.orderNumber, m.workOrderId, m.workOrderMilestoneId"; } - const workOrderMilestones = database - .prepare("select m.workOrderId, m.workOrderMilestoneId," + + const sql = "select m.workOrderMilestoneId," + " m.workOrderMilestoneTypeId, t.workOrderMilestoneType," + " m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," + " m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," + " m.workOrderMilestoneDescription," + " m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString," + " m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString," + + (options.includeWorkOrders + ? " m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription," + + " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + + " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + + " w.recordUpdate_timeMillis as workOrderRecordUpdate_timeMillis," + : "") + " m.recordCreate_userName, m.recordCreate_timeMillis," + " m.recordUpdate_userName, m.recordUpdate_timeMillis" + " from WorkOrderMilestones m" + " left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" + " left join WorkOrders w on m.workOrderId = w.workOrderId" + + " left join WorkOrderTypes wt on w.workOrderTypeId = wt.workOrderTypeId" + sqlWhereClause + - orderByClause) + orderByClause; + const workOrderMilestones = database + .prepare(sql) .all(sqlParameters); if (options.includeWorkOrders) { for (const workOrderMilestone of workOrderMilestones) { - workOrderMilestone.workOrder = getWorkOrder(workOrderMilestone.workOrderId, { - includeLotsAndLotOccupancies: true, - includeComments: false, - includeMilestones: false - }, database); + workOrderMilestone.workOrderLots = getLots({ + workOrderId: workOrderMilestone.workOrderId + }, { + limit: -1, + offset: 0 + }, database).lots; + workOrderMilestone.workOrderLotOccupancies = getLotOccupancies({ + workOrderId: workOrderMilestone.workOrderId + }, { + limit: -1, + offset: 0, + includeOccupants: true + }, database).lotOccupancies; } } if (!connectedDatabase) { diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestones.ts b/helpers/lotOccupancyDB/getWorkOrderMilestones.ts index 05d7fde8..9ce5420d 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestones.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestones.ts @@ -2,8 +2,6 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { getWorkOrder } from "./getWorkOrder.js"; - import { dateIntegerToString, dateStringToInteger, @@ -13,6 +11,9 @@ import { import * as configFunctions from "../functions.config.js"; +import { getLots } from "./getLots.js"; +import { getLotOccupancies } from "./getLotOccupancies.js"; + import type * as recordTypes from "../../types/recordTypes"; export interface WorkOrderMilestoneFilters { @@ -46,7 +47,8 @@ export const getWorkOrderMilestones = ( // Filters - let sqlWhereClause = " where m.recordDelete_timeMillis is null and w.recordDelete_timeMillis is null"; + let sqlWhereClause = + " where m.recordDelete_timeMillis is null and w.recordDelete_timeMillis is null"; const sqlParameters = []; if (filters.workOrderId) { @@ -71,9 +73,7 @@ export const getWorkOrderMilestones = ( configFunctions.getProperty( "settings.workOrders.workOrderMilestoneDateRecentBeforeDays" ) + - configFunctions.getProperty( - "settings.workOrders.workOrderMilestoneDateRecentAfterDays" - ) + configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentAfterDays") ); const recentAfterDateNumber = dateToInteger(date); @@ -94,17 +94,11 @@ export const getWorkOrderMilestones = ( if (filters.workOrderMilestoneDateString) { sqlWhereClause += " and m.workOrderMilestoneDate = ?"; - sqlParameters.push( - dateStringToInteger(filters.workOrderMilestoneDateString) - ); + sqlParameters.push(dateStringToInteger(filters.workOrderMilestoneDateString)); } - if ( - filters.workOrderTypeIds && - commaSeparatedNumbersRegex.test(filters.workOrderTypeIds) - ) { - sqlWhereClause += - " and w.workOrderTypeId in (" + filters.workOrderTypeIds + ")"; + if (filters.workOrderTypeIds && commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) { + sqlWhereClause += " and w.workOrderTypeId in (" + filters.workOrderTypeIds + ")"; } if ( @@ -112,9 +106,7 @@ export const getWorkOrderMilestones = ( commaSeparatedNumbersRegex.test(filters.workOrderMilestoneTypeIds) ) { sqlWhereClause += - " and m.workOrderMilestoneTypeId in (" + - filters.workOrderMilestoneTypeIds + - ")"; + " and m.workOrderMilestoneTypeId in (" + filters.workOrderMilestoneTypeIds + ")"; } // Order By @@ -138,36 +130,57 @@ export const getWorkOrderMilestones = ( // Query + const sql = + "select m.workOrderMilestoneId," + + " m.workOrderMilestoneTypeId, t.workOrderMilestoneType," + + " m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," + + " m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," + + " m.workOrderMilestoneDescription," + + " m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString," + + " m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString," + + (options.includeWorkOrders + ? " m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription," + + " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + + " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + + " w.recordUpdate_timeMillis as workOrderRecordUpdate_timeMillis," + : "") + + " m.recordCreate_userName, m.recordCreate_timeMillis," + + " m.recordUpdate_userName, m.recordUpdate_timeMillis" + + " from WorkOrderMilestones m" + + " left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" + + " left join WorkOrders w on m.workOrderId = w.workOrderId" + + " left join WorkOrderTypes wt on w.workOrderTypeId = wt.workOrderTypeId" + + sqlWhereClause + + orderByClause; + const workOrderMilestones: recordTypes.WorkOrderMilestone[] = database - .prepare( - "select m.workOrderId, m.workOrderMilestoneId," + - " m.workOrderMilestoneTypeId, t.workOrderMilestoneType," + - " m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," + - " m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," + - " m.workOrderMilestoneDescription," + - " m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString," + - " m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString," + - " m.recordCreate_userName, m.recordCreate_timeMillis," + - " m.recordUpdate_userName, m.recordUpdate_timeMillis" + - " from WorkOrderMilestones m" + - " left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" + - " left join WorkOrders w on m.workOrderId = w.workOrderId" + - sqlWhereClause + - orderByClause - ) + .prepare(sql) .all(sqlParameters); if (options.includeWorkOrders) { for (const workOrderMilestone of workOrderMilestones) { - workOrderMilestone.workOrder = getWorkOrder( - workOrderMilestone.workOrderId, + workOrderMilestone.workOrderLots = getLots( { - includeLotsAndLotOccupancies: true, - includeComments: false, - includeMilestones: false + workOrderId: workOrderMilestone.workOrderId + }, + { + limit: -1, + offset: 0 }, database - ); + ).lots; + + workOrderMilestone.workOrderLotOccupancies = getLotOccupancies( + { + workOrderId: workOrderMilestone.workOrderId + }, + { + limit: -1, + offset: 0, + includeOccupants: true + }, + database + ).lotOccupancies; } } diff --git a/public-typescript/workOrderMilestoneCalendar.js b/public-typescript/workOrderMilestoneCalendar.js index d98de1aa..c012c81e 100644 --- a/public-typescript/workOrderMilestoneCalendar.js +++ b/public-typescript/workOrderMilestoneCalendar.js @@ -16,7 +16,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); return; } milestoneCalendarContainerElement.innerHTML = ""; - let currentDate = cityssm.dateToString(new Date()); + const currentDate = cityssm.dateToString(new Date()); let currentPanelElement; let currentPanelDateString = ""; for (const milestone of workOrderMilestones) { @@ -27,18 +27,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); currentPanelElement = document.createElement("div"); currentPanelElement.className = "panel"; currentPanelElement.innerHTML = - '

' + - milestone.workOrderMilestoneDateString + - "

"; + '

' + milestone.workOrderMilestoneDateString + "

"; currentPanelDateString = milestone.workOrderMilestoneDateString; } const panelBlockElement = document.createElement("div"); panelBlockElement.className = "panel-block is-block"; - if (!milestone.workOrderMilestoneCompletionDate && milestone.workOrderMilestoneDateString < currentDate) { + if (!milestone.workOrderMilestoneCompletionDate && + milestone.workOrderMilestoneDateString < currentDate) { panelBlockElement.classList.add("has-background-warning-light"); } let lotOccupancyHTML = ""; - for (const lot of milestone.workOrder.workOrderLots) { + for (const lot of milestone.workOrderLots) { lotOccupancyHTML += '"; } - for (const lotOccupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const lotOccupancy of milestone.workOrderLotOccupancies) { if (lotOccupancy.lotOccupancyOccupants.length > 0) { lotOccupancyHTML += '" + "") + ('
' + - "" + + '' + ' ' + - cityssm.escapeHTML(milestone.workOrder.workOrderNumber) + + cityssm.escapeHTML(milestone.workOrderNumber) + "
" + '' + - cityssm.escapeHTML(milestone.workOrder.workOrderDescription) + + cityssm.escapeHTML(milestone.workOrderDescription) + "" + "
") + - ('
' + - lotOccupancyHTML + - "
") + + ('
' + lotOccupancyHTML + "
") + ""; currentPanelElement.append(panelBlockElement); } diff --git a/public-typescript/workOrderMilestoneCalendar.ts b/public-typescript/workOrderMilestoneCalendar.ts index 4333a35e..9fb70b3e 100644 --- a/public-typescript/workOrderMilestoneCalendar.ts +++ b/public-typescript/workOrderMilestoneCalendar.ts @@ -15,23 +15,19 @@ declare const cityssm: cityssmGlobal; "#form--searchFilters" ) as HTMLFormElement; - const workOrderMilestoneDateFilterElement = - workOrderSearchFiltersFormElement.querySelector( - "#searchFilter--workOrderMilestoneDateFilter" - ) as HTMLSelectElement; + const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector( + "#searchFilter--workOrderMilestoneDateFilter" + ) as HTMLSelectElement; - const workOrderMilestoneDateStringElement = - workOrderSearchFiltersFormElement.querySelector( - "#searchFilter--workOrderMilestoneDateString" - ) as HTMLInputElement; + const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector( + "#searchFilter--workOrderMilestoneDateString" + ) as HTMLInputElement; const milestoneCalendarContainerElement = document.querySelector( "#container--milestoneCalendar" ) as HTMLElement; - const renderMilestones = ( - workOrderMilestones: recordTypes.WorkOrderMilestone[] - ) => { + const renderMilestones = (workOrderMilestones: recordTypes.WorkOrderMilestone[]) => { if (workOrderMilestones.length === 0) { milestoneCalendarContainerElement.innerHTML = '
' + @@ -42,7 +38,7 @@ declare const cityssm: cityssmGlobal; milestoneCalendarContainerElement.innerHTML = ""; - let currentDate = cityssm.dateToString(new Date()); + const currentDate = cityssm.dateToString(new Date()); let currentPanelElement: HTMLElement; let currentPanelDateString = ""; @@ -50,33 +46,32 @@ declare const cityssm: cityssmGlobal; for (const milestone of workOrderMilestones) { if (currentPanelDateString !== milestone.workOrderMilestoneDateString) { if (currentPanelElement) { - milestoneCalendarContainerElement.append( - currentPanelElement - ); + milestoneCalendarContainerElement.append(currentPanelElement); } currentPanelElement = document.createElement("div"); currentPanelElement.className = "panel"; currentPanelElement.innerHTML = - '

' + - milestone.workOrderMilestoneDateString + - "

"; + '

' + milestone.workOrderMilestoneDateString + "

"; - currentPanelDateString = milestone.workOrderMilestoneDateString; + currentPanelDateString = milestone.workOrderMilestoneDateString; } const panelBlockElement = document.createElement("div"); panelBlockElement.className = "panel-block is-block"; - if (!milestone.workOrderMilestoneCompletionDate && milestone.workOrderMilestoneDateString < currentDate) { + if ( + !milestone.workOrderMilestoneCompletionDate && + milestone.workOrderMilestoneDateString < currentDate + ) { panelBlockElement.classList.add("has-background-warning-light"); } let lotOccupancyHTML = ""; - for (const lot of milestone.workOrder.workOrderLots) { + for (const lot of milestone.workOrderLots) { lotOccupancyHTML += '"; } - for (const lotOccupancy of milestone.workOrder - .workOrderLotOccupancies) { + for (const lotOccupancy of milestone.workOrderLotOccupancies) { if (lotOccupancy.lotOccupancyOccupants.length > 0) { lotOccupancyHTML += ' ' + - cityssm.escapeHTML( - lotOccupancy.lotOccupancyOccupants[0].occupantName - ) + + cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) + "
"; } } @@ -118,29 +110,25 @@ declare const cityssm: cityssmGlobal; "
" : "") + '' + - cityssm.escapeHTML( - milestone.workOrderMilestoneDescription - ) + + cityssm.escapeHTML(milestone.workOrderMilestoneDescription) + "" + "
") + ('
' + - "" + + '' + ' ' + - cityssm.escapeHTML(milestone.workOrder.workOrderNumber) + + cityssm.escapeHTML(milestone.workOrderNumber) + "
" + '' + - cityssm.escapeHTML( - milestone.workOrder.workOrderDescription - ) + + cityssm.escapeHTML(milestone.workOrderDescription) + "" + "
") + - ('
' + - lotOccupancyHTML + - "
") + + ('
' + lotOccupancyHTML + "
") + ""; currentPanelElement.append(panelBlockElement); @@ -163,9 +151,7 @@ declare const cityssm: cityssmGlobal; cityssm.postJSON( urlPrefix + "/workOrders/doGetWorkOrderMilestones", workOrderSearchFiltersFormElement, - (responseJSON: { - workOrderMilestones: recordTypes.WorkOrderMilestone[]; - }) => { + (responseJSON: { workOrderMilestones: recordTypes.WorkOrderMilestone[] }) => { renderMilestones(responseJSON.workOrderMilestones); } ); @@ -177,10 +163,7 @@ declare const cityssm: cityssmGlobal; getMilestones(); }); - workOrderMilestoneDateStringElement.addEventListener( - "change", - getMilestones - ); + workOrderMilestoneDateStringElement.addEventListener("change", getMilestones); workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones); getMilestones(); diff --git a/public/javascripts/workOrderMilestoneCalendar.min.js b/public/javascripts/workOrderMilestoneCalendar.min.js index dcfa4244..3572fbb1 100644 --- a/public/javascripts/workOrderMilestoneCalendar.min.js +++ b/public/javascripts/workOrderMilestoneCalendar.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,r=document.querySelector("main").dataset.urlPrefix,s=document.querySelector("#form--searchFilters"),a=s.querySelector("#searchFilter--workOrderMilestoneDateFilter"),t=s.querySelector("#searchFilter--workOrderMilestoneDateString"),i=document.querySelector("#container--milestoneCalendar"),o=a=>{a&&a.preventDefault(),i.innerHTML='

Loading Milestones...
',cityssm.postJSON(r+"/workOrders/doGetWorkOrderMilestones",s,s=>{(s=>{if(0===s.length)return void(i.innerHTML='

There are no milestones that meet the search criteria.

');i.innerHTML="";let a,t=cityssm.dateToString(new Date),o="";for(const n of s){o!==n.workOrderMilestoneDateString&&(a&&i.append(a),(a=document.createElement("div")).className="panel",a.innerHTML='

'+n.workOrderMilestoneDateString+"

",o=n.workOrderMilestoneDateString);const s=document.createElement("div");s.className="panel-block is-block",!n.workOrderMilestoneCompletionDate&&n.workOrderMilestoneDateString
'+cityssm.escapeHTML(e.lotName)+"
";for(const e of n.workOrder.workOrderLotOccupancies)e.lotOccupancyOccupants.length>0&&(c+=' '+cityssm.escapeHTML(e.lotOccupancyOccupants[0].occupantName)+"
");s.innerHTML='
'+(n.workOrderMilestoneCompletionDate?'':'')+'
'+(0===n.workOrderMilestoneTime?"":n.workOrderMilestoneTimeString+"
")+(n.workOrderMilestoneTypeId?""+cityssm.escapeHTML(n.workOrderMilestoneType)+"
":"")+''+cityssm.escapeHTML(n.workOrderMilestoneDescription)+'
'+cityssm.escapeHTML(n.workOrder.workOrderNumber)+'
'+cityssm.escapeHTML(n.workOrder.workOrderDescription)+'
'+c+"
",a.append(s)}i.append(a)})(s.workOrderMilestones)})};a.addEventListener("change",()=>{t.disabled="date"!==a.value,o()}),t.addEventListener("change",o),s.addEventListener("submit",o),o()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,s=document.querySelector("main").dataset.urlPrefix,r=document.querySelector("#form--searchFilters"),a=r.querySelector("#searchFilter--workOrderMilestoneDateFilter"),t=r.querySelector("#searchFilter--workOrderMilestoneDateString"),i=document.querySelector("#container--milestoneCalendar"),o=a=>{a&&a.preventDefault(),i.innerHTML='

Loading Milestones...
',cityssm.postJSON(s+"/workOrders/doGetWorkOrderMilestones",r,r=>{(r=>{if(0===r.length)return void(i.innerHTML='

There are no milestones that meet the search criteria.

');i.innerHTML="";const a=cityssm.dateToString(new Date);let t,o="";for(const n of r){o!==n.workOrderMilestoneDateString&&(t&&i.append(t),(t=document.createElement("div")).className="panel",t.innerHTML='

'+n.workOrderMilestoneDateString+"

",o=n.workOrderMilestoneDateString);const r=document.createElement("div");r.className="panel-block is-block",!n.workOrderMilestoneCompletionDate&&n.workOrderMilestoneDateString
'+cityssm.escapeHTML(e.lotName)+"
";for(const e of n.workOrderLotOccupancies)e.lotOccupancyOccupants.length>0&&(c+=' '+cityssm.escapeHTML(e.lotOccupancyOccupants[0].occupantName)+"
");r.innerHTML='
'+(n.workOrderMilestoneCompletionDate?'':'')+'
'+(0===n.workOrderMilestoneTime?"":n.workOrderMilestoneTimeString+"
")+(n.workOrderMilestoneTypeId?""+cityssm.escapeHTML(n.workOrderMilestoneType)+"
":"")+''+cityssm.escapeHTML(n.workOrderMilestoneDescription)+'
'+cityssm.escapeHTML(n.workOrderNumber)+'
'+cityssm.escapeHTML(n.workOrderDescription)+'
'+c+"
",t.append(r)}i.append(t)})(r.workOrderMilestones)})};a.addEventListener("change",()=>{t.disabled="date"!==a.value,o()}),t.addEventListener("change",o),r.addEventListener("submit",o),o()})(); \ No newline at end of file diff --git a/types/recordTypes.d.ts b/types/recordTypes.d.ts index 18f04941..34f29a90 100644 --- a/types/recordTypes.d.ts +++ b/types/recordTypes.d.ts @@ -206,10 +206,8 @@ export interface WorkOrderComment extends Record { workOrderCommentTimeString?: string; workOrderComment?: string; } -export interface WorkOrderMilestone extends Record { +export interface WorkOrderMilestone extends Record, WorkOrder { workOrderMilestoneId?: number; - workOrderId?: number; - workOrder?: WorkOrder; workOrderMilestoneTypeId?: number; workOrderMilestoneType?: string; workOrderMilestoneDate?: number; @@ -221,6 +219,7 @@ export interface WorkOrderMilestone extends Record { workOrderMilestoneCompletionDateString?: string; workOrderMilestoneCompletionTime?: number; workOrderMilestoneCompletionTimeString?: string; + workOrderRecordUpdate_timeMillis?: number; } export interface WorkOrder extends Record { workOrderId?: number; diff --git a/types/recordTypes.ts b/types/recordTypes.ts index b9e848e5..54934958 100644 --- a/types/recordTypes.ts +++ b/types/recordTypes.ts @@ -277,12 +277,9 @@ export interface WorkOrderComment extends Record { workOrderComment?: string; } -export interface WorkOrderMilestone extends Record { +export interface WorkOrderMilestone extends Record, WorkOrder { workOrderMilestoneId?: number; - workOrderId?: number; - workOrder?: WorkOrder; - workOrderMilestoneTypeId?: number; workOrderMilestoneType?: string; @@ -299,6 +296,8 @@ export interface WorkOrderMilestone extends Record { workOrderMilestoneCompletionTime?: number; workOrderMilestoneCompletionTimeString?: string; + + workOrderRecordUpdate_timeMillis?: number; } export interface WorkOrder extends Record { diff --git a/views/dashboard.ejs b/views/dashboard.ejs index 46bcbd98..df122146 100644 --- a/views/dashboard.ejs +++ b/views/dashboard.ejs @@ -29,18 +29,18 @@ <%= milestone.workOrderMilestoneType %>
<% } %> - <%= milestone.workOrder.workOrderNumber %>
+ <%= milestone.workOrderNumber %>
<% - if (milestone.workOrder.workOrderLots.length > 0) { - for (const lot of milestone.workOrder.workOrderLots) { + if (milestone.workOrderLots.length > 0) { + for (const lot of milestone.workOrderLots) { %> "> <%= lot.lotName %>
<% } } - if (milestone.workOrder.workOrderLotOccupancies.length > 0) { - for (const occupancy of milestone.workOrder.workOrderLotOccupancies) { + if (milestone.workOrderLotOccupancies.length > 0) { + for (const occupancy of milestone.workOrderLotOccupancies) { for (const occupant of occupancy.lotOccupancyOccupants) { %> "> <%= occupant.occupantName %>