work order search
parent
679e1e7a55
commit
9af03a05e6
|
|
@ -1,6 +1,10 @@
|
|||
import type { RequestHandler } from "express";
|
||||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import { addLot } from "../../helpers/lotOccupancyDB/addLot.js";
|
||||
import {
|
||||
addLot
|
||||
} from "../../helpers/lotOccupancyDB/addLot.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
import type { RequestHandler } from "express";
|
||||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js";
|
||||
import {
|
||||
getLots
|
||||
} from "../../helpers/lotOccupancyDB/getLots.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
import type { RequestHandler } from "express";
|
||||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import { updateLot } from "../../helpers/lotOccupancyDB/updateLot.js";
|
||||
import {
|
||||
updateLot
|
||||
} from "../../helpers/lotOccupancyDB/updateLot.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
export const handler = (request, response) => {
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
response.render("workOrder-search", {
|
||||
headTitle: "Work Order Search"
|
||||
headTitle: "Work Order Search",
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
|
|||
|
|
@ -2,11 +2,16 @@ import type {
|
|||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = (request, response) => {
|
||||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
|
||||
response.render("workOrder-search", {
|
||||
headTitle: "Work Order Search"
|
||||
headTitle: "Work Order Search",
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import { getWorkOrders } from "../../helpers/lotOccupancyDB/getWorkOrders.js";
|
||||
export const handler = async (request, response) => {
|
||||
const result = getWorkOrders(request.body, {
|
||||
limit: request.body.limit,
|
||||
offset: request.body.offset
|
||||
});
|
||||
response.json({
|
||||
count: result.count,
|
||||
workOrders: result.workOrders
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import {
|
||||
getWorkOrders
|
||||
} from "../../helpers/lotOccupancyDB/getWorkOrders.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
||||
const result = getWorkOrders(request.body, {
|
||||
limit: request.body.limit,
|
||||
offset: request.body.offset
|
||||
});
|
||||
|
||||
response.json({
|
||||
count: result.count,
|
||||
workOrders: result.workOrders
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -1,5 +1,8 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
import type * as recordTypes from "../../types/recordTypes";
|
||||
interface AddWorkOrderForm {
|
||||
workOrderTypeId: number | string;
|
||||
workOrderNumber: string;
|
||||
workOrderDescription: string;
|
||||
workOrderOpenDateString?: string;
|
||||
workOrderCloseDateString?: string;
|
||||
}
|
||||
export declare const addWorkOrder: (workOrderForm: AddWorkOrderForm, requestSession: recordTypes.PartialSession) => number;
|
||||
export default addWorkOrder;
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
import { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
export const addWorkOrder = (workOrderForm, requestSession) => {
|
||||
const database = sqlite(databasePath);
|
||||
const rightNow = new Date();
|
||||
const result = database
|
||||
.prepare("insert into WorkOrders (" +
|
||||
"workOrderTypeId, workOrderNumber, workOrderDescription," +
|
||||
" workOrderOpenDate, workOrderCloseDate," +
|
||||
" recordCreate_userName, recordCreate_timeMillis," +
|
||||
" recordUpdate_userName, recordUpdate_timeMillis)" +
|
||||
" values (?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
||||
.run(workOrderForm.workOrderTypeId, workOrderForm.workOrderNumber, workOrderForm.workOrderDescription, (workOrderForm.workOrderOpenDateString ? dateStringToInteger(workOrderForm.workOrderOpenDateString) : dateToInteger(rightNow)), (workOrderForm.workOrderCloseDateString ? dateStringToInteger(workOrderForm.workOrderCloseDateString) : undefined), requestSession.user.userName, rightNow.getTime(), requestSession.user.userName, rightNow.getTime());
|
||||
database.close();
|
||||
return result.lastInsertRowid;
|
||||
};
|
||||
export default addWorkOrder;
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
import { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
|
||||
|
||||
interface AddWorkOrderForm {
|
||||
workOrderTypeId: number | string;
|
||||
workOrderNumber: string;
|
||||
workOrderDescription: string;
|
||||
workOrderOpenDateString?: string;
|
||||
workOrderCloseDateString?: string;
|
||||
}
|
||||
|
||||
|
||||
export const addWorkOrder =
|
||||
(workOrderForm: AddWorkOrderForm, requestSession: recordTypes.PartialSession): number => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const rightNow = new Date();
|
||||
|
||||
const result = database
|
||||
.prepare("insert into WorkOrders (" +
|
||||
"workOrderTypeId, workOrderNumber, workOrderDescription," +
|
||||
" workOrderOpenDate, workOrderCloseDate," +
|
||||
" recordCreate_userName, recordCreate_timeMillis," +
|
||||
" recordUpdate_userName, recordUpdate_timeMillis)" +
|
||||
" values (?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
||||
.run(workOrderForm.workOrderTypeId,
|
||||
workOrderForm.workOrderNumber,
|
||||
workOrderForm.workOrderDescription,
|
||||
(workOrderForm.workOrderOpenDateString ? dateStringToInteger(workOrderForm.workOrderOpenDateString) : dateToInteger(rightNow)),
|
||||
(workOrderForm.workOrderCloseDateString ? dateStringToInteger(workOrderForm.workOrderCloseDateString) : undefined),
|
||||
requestSession.user.userName,
|
||||
rightNow.getTime(),
|
||||
requestSession.user.userName,
|
||||
rightNow.getTime());
|
||||
|
||||
database.close();
|
||||
|
||||
return result.lastInsertRowid as number;
|
||||
};
|
||||
|
||||
|
||||
export default addWorkOrder;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import type * as recordTypes from "../../types/recordTypes";
|
||||
interface AddWorkOrderLotForm {
|
||||
workOrderId: number | string;
|
||||
lotId: number | string;
|
||||
}
|
||||
export declare const addWorkOrderLot: (workOrderLotForm: AddWorkOrderLotForm, requestSession: recordTypes.PartialSession) => boolean;
|
||||
export default addWorkOrderLot;
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
export const addWorkOrderLot = (workOrderLotForm, requestSession) => {
|
||||
const database = sqlite(databasePath);
|
||||
const rightNowMillis = Date.now();
|
||||
const result = database
|
||||
.prepare("insert into WorkOrderLots (" +
|
||||
"workOrderId, lotId," +
|
||||
" recordCreate_userName, recordCreate_timeMillis," +
|
||||
" recordUpdate_userName, recordUpdate_timeMillis)" +
|
||||
" values (?, ?, ?, ?, ?, ?)")
|
||||
.run(workOrderLotForm.workOrderId, workOrderLotForm.lotId, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
|
||||
database.close();
|
||||
return result.changes > 0;
|
||||
};
|
||||
export default addWorkOrderLot;
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
|
||||
|
||||
interface AddWorkOrderLotForm {
|
||||
workOrderId: number | string;
|
||||
lotId: number | string;
|
||||
}
|
||||
|
||||
|
||||
export const addWorkOrderLot =
|
||||
(workOrderLotForm: AddWorkOrderLotForm, requestSession: recordTypes.PartialSession): boolean => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const rightNowMillis = Date.now();
|
||||
|
||||
const result = database
|
||||
.prepare("insert into WorkOrderLots (" +
|
||||
"workOrderId, lotId," +
|
||||
" recordCreate_userName, recordCreate_timeMillis," +
|
||||
" recordUpdate_userName, recordUpdate_timeMillis)" +
|
||||
" values (?, ?, ?, ?, ?, ?)")
|
||||
.run(workOrderLotForm.workOrderId,
|
||||
workOrderLotForm.lotId,
|
||||
requestSession.user.userName,
|
||||
rightNowMillis,
|
||||
requestSession.user.userName,
|
||||
rightNowMillis);
|
||||
|
||||
database.close();
|
||||
|
||||
return result.changes > 0;
|
||||
};
|
||||
|
||||
|
||||
export default addWorkOrderLot;
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
import type * as recordTypes from "../../types/recordTypes";
|
||||
interface GetWorkOrdersFilters {
|
||||
workOrderTypeId?: number | string;
|
||||
}
|
||||
interface GetWorkOrdersOptions {
|
||||
limit: number;
|
||||
offset: number;
|
||||
}
|
||||
export declare const getWorkOrders: (filters?: GetWorkOrdersFilters, options?: GetWorkOrdersOptions) => {
|
||||
count: number;
|
||||
workOrders: recordTypes.WorkOrder[];
|
||||
};
|
||||
export default getWorkOrders;
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
export const getWorkOrders = (filters, options) => {
|
||||
const database = sqlite(databasePath, {
|
||||
readonly: true
|
||||
});
|
||||
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
||||
let sqlWhereClause = " where w.recordDelete_timeMillis is null";
|
||||
const sqlParameters = [];
|
||||
if (filters.workOrderTypeId) {
|
||||
sqlWhereClause += " and w.workOrderTypeId = ?";
|
||||
sqlParameters.push(filters.workOrderTypeId);
|
||||
}
|
||||
const count = database.prepare("select count(*) as recordCount" +
|
||||
" from WorkOrders w" +
|
||||
sqlWhereClause)
|
||||
.get(sqlParameters)
|
||||
.recordCount;
|
||||
let workOrders = [];
|
||||
if (count > 0) {
|
||||
workOrders = database
|
||||
.prepare("select w.workOrderId," +
|
||||
" w.workOrderTypeId, t.workOrderType," +
|
||||
" w.workOrderNumber, w.workOrderDescription," +
|
||||
" w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," +
|
||||
" w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString" +
|
||||
" from WorkOrders w" +
|
||||
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
|
||||
sqlWhereClause +
|
||||
" order by w.workOrderOpenDate desc, w.workOrderNumber" +
|
||||
(options ?
|
||||
" limit " + options.limit + " offset " + options.offset :
|
||||
""))
|
||||
.all(sqlParameters);
|
||||
}
|
||||
database.close();
|
||||
return {
|
||||
count,
|
||||
workOrders
|
||||
};
|
||||
};
|
||||
export default getWorkOrders;
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import {
|
||||
dateIntegerToString
|
||||
} from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
|
||||
|
||||
interface GetWorkOrdersFilters {
|
||||
workOrderTypeId ? : number | string;
|
||||
}
|
||||
|
||||
interface GetWorkOrdersOptions {
|
||||
limit: number;
|
||||
offset: number;
|
||||
}
|
||||
|
||||
|
||||
export const getWorkOrders = (filters ? : GetWorkOrdersFilters, options ? : GetWorkOrdersOptions): {
|
||||
count: number;
|
||||
workOrders: recordTypes.WorkOrder[];
|
||||
} => {
|
||||
|
||||
const database = sqlite(databasePath, {
|
||||
readonly: true
|
||||
});
|
||||
|
||||
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
||||
|
||||
let sqlWhereClause = " where w.recordDelete_timeMillis is null";
|
||||
const sqlParameters = [];
|
||||
|
||||
if (filters.workOrderTypeId) {
|
||||
sqlWhereClause += " and w.workOrderTypeId = ?";
|
||||
sqlParameters.push(filters.workOrderTypeId);
|
||||
}
|
||||
|
||||
const count: number = database.prepare("select count(*) as recordCount" +
|
||||
" from WorkOrders w" +
|
||||
sqlWhereClause)
|
||||
.get(sqlParameters)
|
||||
.recordCount;
|
||||
|
||||
let workOrders: recordTypes.WorkOrder[] = [];
|
||||
|
||||
if (count > 0) {
|
||||
|
||||
workOrders = database
|
||||
.prepare("select w.workOrderId," +
|
||||
" w.workOrderTypeId, t.workOrderType," +
|
||||
" w.workOrderNumber, w.workOrderDescription," +
|
||||
" w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," +
|
||||
" w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString" +
|
||||
" from WorkOrders w" +
|
||||
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
|
||||
sqlWhereClause +
|
||||
" order by w.workOrderOpenDate desc, w.workOrderNumber" +
|
||||
(options ?
|
||||
" limit " + options.limit + " offset " + options.offset :
|
||||
""))
|
||||
.all(sqlParameters);
|
||||
}
|
||||
|
||||
database.close();
|
||||
|
||||
return {
|
||||
count,
|
||||
workOrders
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
export default getWorkOrders;
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
"bulma": "^0.9.4",
|
||||
"cypress": "^10.6.0",
|
||||
"cypress-axe": "^1.0.0",
|
||||
"eslint": "^8.22.0",
|
||||
"eslint": "^8.23.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^6.0.1",
|
||||
|
|
@ -705,14 +705,14 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@eslint/eslintrc": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
|
||||
"integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
|
||||
"integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"ajv": "^6.12.4",
|
||||
"debug": "^4.3.2",
|
||||
"espree": "^9.3.2",
|
||||
"espree": "^9.4.0",
|
||||
"globals": "^13.15.0",
|
||||
"ignore": "^5.2.0",
|
||||
"import-fresh": "^3.2.1",
|
||||
|
|
@ -722,6 +722,9 @@
|
|||
},
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint"
|
||||
}
|
||||
},
|
||||
"node_modules/@fortawesome/fontawesome-free": {
|
||||
|
|
@ -757,6 +760,19 @@
|
|||
"url": "https://github.com/sponsors/nzakas"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/module-importer": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
|
||||
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=12.22"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/nzakas"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/object-schema": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
|
||||
|
|
@ -3697,14 +3713,15 @@
|
|||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "8.22.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz",
|
||||
"integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==",
|
||||
"version": "8.23.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz",
|
||||
"integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@eslint/eslintrc": "^1.3.0",
|
||||
"@eslint/eslintrc": "^1.3.1",
|
||||
"@humanwhocodes/config-array": "^0.10.4",
|
||||
"@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
|
||||
"@humanwhocodes/module-importer": "^1.0.1",
|
||||
"ajv": "^6.10.0",
|
||||
"chalk": "^4.0.0",
|
||||
"cross-spawn": "^7.0.2",
|
||||
|
|
@ -3714,7 +3731,7 @@
|
|||
"eslint-scope": "^7.1.1",
|
||||
"eslint-utils": "^3.0.0",
|
||||
"eslint-visitor-keys": "^3.3.0",
|
||||
"espree": "^9.3.3",
|
||||
"espree": "^9.4.0",
|
||||
"esquery": "^1.4.0",
|
||||
"esutils": "^2.0.2",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
|
|
@ -3739,8 +3756,7 @@
|
|||
"regexpp": "^3.2.0",
|
||||
"strip-ansi": "^6.0.1",
|
||||
"strip-json-comments": "^3.1.0",
|
||||
"text-table": "^0.2.0",
|
||||
"v8-compile-cache": "^2.0.3"
|
||||
"text-table": "^0.2.0"
|
||||
},
|
||||
"bin": {
|
||||
"eslint": "bin/eslint.js"
|
||||
|
|
@ -4140,9 +4156,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/espree": {
|
||||
"version": "9.3.3",
|
||||
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz",
|
||||
"integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==",
|
||||
"version": "9.4.0",
|
||||
"resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
|
||||
"integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"acorn": "^8.8.0",
|
||||
|
|
@ -5779,9 +5795,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/globals": {
|
||||
"version": "13.16.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz",
|
||||
"integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==",
|
||||
"version": "13.17.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
|
||||
"integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"type-fest": "^0.20.2"
|
||||
|
|
@ -11302,12 +11318,6 @@
|
|||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/v8-compile-cache": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
|
||||
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/v8flags": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
|
||||
|
|
@ -12419,14 +12429,14 @@
|
|||
}
|
||||
},
|
||||
"@eslint/eslintrc": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
|
||||
"integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
|
||||
"integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ajv": "^6.12.4",
|
||||
"debug": "^4.3.2",
|
||||
"espree": "^9.3.2",
|
||||
"espree": "^9.4.0",
|
||||
"globals": "^13.15.0",
|
||||
"ignore": "^5.2.0",
|
||||
"import-fresh": "^3.2.1",
|
||||
|
|
@ -12457,6 +12467,12 @@
|
|||
"integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
|
||||
"dev": true
|
||||
},
|
||||
"@humanwhocodes/module-importer": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
|
||||
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
|
||||
"dev": true
|
||||
},
|
||||
"@humanwhocodes/object-schema": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
|
||||
|
|
@ -14757,14 +14773,15 @@
|
|||
"dev": true
|
||||
},
|
||||
"eslint": {
|
||||
"version": "8.22.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz",
|
||||
"integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==",
|
||||
"version": "8.23.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz",
|
||||
"integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@eslint/eslintrc": "^1.3.0",
|
||||
"@eslint/eslintrc": "^1.3.1",
|
||||
"@humanwhocodes/config-array": "^0.10.4",
|
||||
"@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
|
||||
"@humanwhocodes/module-importer": "^1.0.1",
|
||||
"ajv": "^6.10.0",
|
||||
"chalk": "^4.0.0",
|
||||
"cross-spawn": "^7.0.2",
|
||||
|
|
@ -14774,7 +14791,7 @@
|
|||
"eslint-scope": "^7.1.1",
|
||||
"eslint-utils": "^3.0.0",
|
||||
"eslint-visitor-keys": "^3.3.0",
|
||||
"espree": "^9.3.3",
|
||||
"espree": "^9.4.0",
|
||||
"esquery": "^1.4.0",
|
||||
"esutils": "^2.0.2",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
|
|
@ -14799,8 +14816,7 @@
|
|||
"regexpp": "^3.2.0",
|
||||
"strip-ansi": "^6.0.1",
|
||||
"strip-json-comments": "^3.1.0",
|
||||
"text-table": "^0.2.0",
|
||||
"v8-compile-cache": "^2.0.3"
|
||||
"text-table": "^0.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"eslint-scope": {
|
||||
|
|
@ -15089,9 +15105,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"espree": {
|
||||
"version": "9.3.3",
|
||||
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz",
|
||||
"integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==",
|
||||
"version": "9.4.0",
|
||||
"resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
|
||||
"integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"acorn": "^8.8.0",
|
||||
|
|
@ -16405,9 +16421,9 @@
|
|||
}
|
||||
},
|
||||
"globals": {
|
||||
"version": "13.16.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz",
|
||||
"integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==",
|
||||
"version": "13.17.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
|
||||
"integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"type-fest": "^0.20.2"
|
||||
|
|
@ -20657,12 +20673,6 @@
|
|||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||
"dev": true
|
||||
},
|
||||
"v8-compile-cache": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
|
||||
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
|
||||
"dev": true
|
||||
},
|
||||
"v8flags": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@
|
|||
"bulma": "^0.9.4",
|
||||
"cypress": "^10.6.0",
|
||||
"cypress-axe": "^1.0.0",
|
||||
"eslint": "^8.22.0",
|
||||
"eslint": "^8.23.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^6.0.1",
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
export {};
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
||||
const getWorkOrders = () => {
|
||||
const offset = Number.parseInt(offsetElement.value, 10);
|
||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
||||
"Loading Work Orders..." +
|
||||
"</div>";
|
||||
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, (responseJSON) => {
|
||||
if (responseJSON.workOrders.length === 0) {
|
||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
||||
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
|
||||
"</div>";
|
||||
return;
|
||||
}
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
for (const workOrder of responseJSON.workOrders) {
|
||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||
("<td>" +
|
||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" +
|
||||
cityssm.escapeHTML(workOrder.workOrderNumber) +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(workOrder.workOrderType) +
|
||||
"</td>") +
|
||||
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
|
||||
("<td>" +
|
||||
workOrder.workOrderOpenDateString +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") +
|
||||
"</td>") +
|
||||
"</tr>");
|
||||
}
|
||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
||||
"<thead><tr>" +
|
||||
"<th>Work Order Number</th>" +
|
||||
"<th>Work Order Type</th>" +
|
||||
"<th>Work Order Description</th>" +
|
||||
"<th>Open Date</th>" +
|
||||
"<th>Close Date</th>" +
|
||||
"</tr></thead>" +
|
||||
"<table>" +
|
||||
"<div class=\"level\">" +
|
||||
("<div class=\"level-left\">" +
|
||||
"<div class=\"level-item has-text-weight-bold\">" +
|
||||
"Displaying " + (offset + 1).toString() +
|
||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
||||
" of " + responseJSON.count +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
("<div class=\"level-right\">" +
|
||||
(offset > 0 ?
|
||||
"<div class=\"level-item\">" +
|
||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
||||
"</button>" +
|
||||
"</div>" :
|
||||
"") +
|
||||
(limit + offset < responseJSON.count ?
|
||||
"<div class=\"level-item\">" +
|
||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
||||
"<span>Next</span>" +
|
||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
||||
"</button>" +
|
||||
"</div>" :
|
||||
"") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
if (offset > 0) {
|
||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders);
|
||||
}
|
||||
if (limit + offset < responseJSON.count) {
|
||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders);
|
||||
}
|
||||
});
|
||||
};
|
||||
const resetOffsetAndGetWorkOrders = () => {
|
||||
offsetElement.value = "0";
|
||||
getWorkOrders();
|
||||
};
|
||||
const previousAndGetWorkOrders = () => {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getWorkOrders();
|
||||
};
|
||||
const nextAndGetWorkOrders = () => {
|
||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getWorkOrders();
|
||||
};
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
||||
}
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
getWorkOrders();
|
||||
})();
|
||||
|
|
@ -0,0 +1,146 @@
|
|||
/* eslint-disable unicorn/prefer-module */
|
||||
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
|
||||
import type {
|
||||
cityssmGlobal
|
||||
} from "@cityssm/bulma-webapp-js/src/types";
|
||||
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
|
||||
|
||||
(() => {
|
||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
||||
|
||||
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10);
|
||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
||||
|
||||
|
||||
const getWorkOrders = () => {
|
||||
|
||||
const offset = Number.parseInt(offsetElement.value, 10);
|
||||
|
||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
||||
"Loading Work Orders..." +
|
||||
"</div>";
|
||||
|
||||
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement,
|
||||
(responseJSON: {
|
||||
count: number;
|
||||
workOrders: recordTypes.WorkOrder[];
|
||||
}) => {
|
||||
|
||||
if (responseJSON.workOrders.length === 0) {
|
||||
|
||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
||||
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
|
||||
"</div>";
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
|
||||
for (const workOrder of responseJSON.workOrders) {
|
||||
|
||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||
("<td>" +
|
||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" +
|
||||
cityssm.escapeHTML(workOrder.workOrderNumber) +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(workOrder.workOrderType) +
|
||||
"</td>") +
|
||||
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
|
||||
("<td>" +
|
||||
workOrder.workOrderOpenDateString +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") +
|
||||
"</td>") +
|
||||
"</tr>");
|
||||
|
||||
}
|
||||
|
||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
||||
"<thead><tr>" +
|
||||
"<th>Work Order Number</th>" +
|
||||
"<th>Work Order Type</th>" +
|
||||
"<th>Work Order Description</th>" +
|
||||
"<th>Open Date</th>" +
|
||||
"<th>Close Date</th>" +
|
||||
"</tr></thead>" +
|
||||
"<table>" +
|
||||
"<div class=\"level\">" +
|
||||
("<div class=\"level-left\">" +
|
||||
"<div class=\"level-item has-text-weight-bold\">" +
|
||||
"Displaying " + (offset + 1).toString() +
|
||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
||||
" of " + responseJSON.count +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
("<div class=\"level-right\">" +
|
||||
(offset > 0 ?
|
||||
"<div class=\"level-item\">" +
|
||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
||||
"</button>" +
|
||||
"</div>" :
|
||||
"") +
|
||||
(limit + offset < responseJSON.count ?
|
||||
"<div class=\"level-item\">" +
|
||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
||||
"<span>Next</span>" +
|
||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
||||
"</button>" +
|
||||
"</div>" :
|
||||
"") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
|
||||
if (offset > 0) {
|
||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders);
|
||||
}
|
||||
|
||||
if (limit + offset < responseJSON.count) {
|
||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const resetOffsetAndGetWorkOrders = () => {
|
||||
offsetElement.value = "0";
|
||||
getWorkOrders();
|
||||
}
|
||||
|
||||
const previousAndGetWorkOrders = () => {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getWorkOrders();
|
||||
};
|
||||
|
||||
const nextAndGetWorkOrders = () => {
|
||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getWorkOrders();
|
||||
};
|
||||
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ;
|
||||
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
|
||||
getWorkOrders();
|
||||
})();
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix,t=document.querySelector("#form--searchFilters"),r=document.querySelector("#container--searchResults"),s=Number.parseInt(document.querySelector("#searchFilter--limit").value,10),a=document.querySelector("#searchFilter--offset"),i=()=>{const i=Number.parseInt(a.value,10);r.innerHTML='<div class="has-text-grey has-text-centered"><i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />Loading Work Orders...</div>',cityssm.postJSON(e+"/workOrders/doSearchWorkOrders",t,t=>{if(0===t.workOrders.length)return void(r.innerHTML='<div class="message is-info"><p class="message-body">There are no work orders that meet the search criteria.</p></div>');const a=document.createElement("tbody");for(const r of t.workOrders)a.insertAdjacentHTML("beforeend",'<tr><td><a class="has-text-weight-bold" href="'+e+"/workOrders/"+r.workOrderId+'">'+cityssm.escapeHTML(r.workOrderNumber)+"</a></td><td>"+cityssm.escapeHTML(r.workOrderType)+"</td><td>"+cityssm.escapeHTML(r.workOrderDescription)+"</td><td>"+r.workOrderOpenDateString+"</td><td>"+(r.workOrderCloseDate?r.workOrderCloseDateString:'<span class="has-text-grey">(No Close Date)</span>')+"</td></tr>");r.innerHTML='<table class="table is-fullwidth is-striped is-hoverable"><thead><tr><th>Work Order Number</th><th>Work Order Type</th><th>Work Order Description</th><th>Open Date</th><th>Close Date</th></tr></thead><table><div class="level"><div class="level-left"><div class="level-item has-text-weight-bold">Displaying '+(i+1).toString()+" to "+Math.min(t.count,s+i)+" of "+t.count+'</div></div><div class="level-right">'+(i>0?'<div class="level-item"><button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous"><i class="fas fa-arrow-left" aria-hidden="true"></i></button></div>':"")+(s+i<t.count?'<div class="level-item"><button class="button is-rounded is-link" data-page="next" type="button" title="Next"><span>Next</span><span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span></button></div>':"")+"</div></div>",r.querySelector("table").append(a),i>0&&r.querySelector("button[data-page='previous']").addEventListener("click",d),s+i<t.count&&r.querySelector("button[data-page='next']").addEventListener("click",n)})},o=()=>{a.value="0",i()},d=()=>{a.value=Math.max(Number.parseInt(a.value,10)-s,0).toString(),i()},n=()=>{a.value=(Number.parseInt(a.value,10)+s).toString(),i()},l=t.querySelectorAll("input, select");for(const e of l)e.addEventListener("change",o);t.addEventListener("submit",e=>{e.preventDefault(),o()}),i()})();
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
import { Router } from "express";
|
||||
import handler_search from "../handlers/workOrders-get/search.js";
|
||||
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||
export const router = Router();
|
||||
router.get("/", handler_search);
|
||||
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,13 @@
|
|||
import { Router } from "express";
|
||||
import {
|
||||
Router
|
||||
} from "express";
|
||||
|
||||
import * as permissionHandlers from "../handlers/permissions.js";
|
||||
import * as configFunctions from "../helpers/functions.config.js";
|
||||
|
||||
import handler_search from "../handlers/workOrders-get/search.js";
|
||||
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||
|
||||
|
||||
|
||||
export const router = Router();
|
||||
|
|
@ -12,5 +16,8 @@ export const router = Router();
|
|||
router.get("/",
|
||||
handler_search);
|
||||
|
||||
router.post("/doSearchWorkOrders",
|
||||
handler_doSearchWorkOrders);
|
||||
|
||||
|
||||
export default router;
|
||||
|
|
@ -16,6 +16,8 @@ import { getLots } from "../helpers/lotOccupancyDB/getLots.js";
|
|||
import { getLotOccupancies } from "../helpers/lotOccupancyDB/getLotOccupancies.js";
|
||||
import { addLotOccupancyFee } from "../helpers/lotOccupancyDB/addLotOccupancyFee.js";
|
||||
import { addLotOccupancyTransaction } from "../helpers/lotOccupancyDB/addLotOccupancyTransaction.js";
|
||||
import { addWorkOrder } from "../helpers/lotOccupancyDB/addWorkOrder.js";
|
||||
import { addWorkOrderLot } from "../helpers/lotOccupancyDB/addWorkOrderLot.js";
|
||||
const user = {
|
||||
user: {
|
||||
userName: "import.unix",
|
||||
|
|
@ -207,25 +209,26 @@ function importFromMasterCSV() {
|
|||
lotLongitude: ""
|
||||
}, user);
|
||||
}
|
||||
let preneedOccupancyStartDateString;
|
||||
if (masterRow.CM_PRENEED_ORDER) {
|
||||
let occupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY);
|
||||
preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY);
|
||||
let occupancyEndDateString = "";
|
||||
if (masterRow.CM_INTERMENT_YR !== "" && masterRow.CM_INTERMENT_YR !== "0") {
|
||||
occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
|
||||
}
|
||||
if (occupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") {
|
||||
occupancyStartDateString = occupancyEndDateString;
|
||||
if (preneedOccupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") {
|
||||
preneedOccupancyStartDateString = occupancyEndDateString;
|
||||
}
|
||||
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
||||
if (preneedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
||||
}
|
||||
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") {
|
||||
occupancyStartDateString = "0001-01-01";
|
||||
if (preneedOccupancyStartDateString === "" || preneedOccupancyStartDateString === "0000-00-00") {
|
||||
preneedOccupancyStartDateString = "0001-01-01";
|
||||
}
|
||||
const lotOccupancyId = addLotOccupancy({
|
||||
occupancyTypeId: preneedOccupancyType.occupancyTypeId,
|
||||
lotId,
|
||||
occupancyStartDateString,
|
||||
occupancyStartDateString: preneedOccupancyStartDateString,
|
||||
occupancyEndDateString,
|
||||
occupancyTypeFieldIds: ""
|
||||
}, user);
|
||||
|
|
@ -244,7 +247,7 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK1 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: preneedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK1
|
||||
}, user);
|
||||
|
|
@ -252,7 +255,7 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK2 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: preneedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK2
|
||||
}, user);
|
||||
|
|
@ -261,19 +264,20 @@ function importFromMasterCSV() {
|
|||
updateLotStatus(lotId, reservedLotStatus.lotStatusId, user);
|
||||
}
|
||||
}
|
||||
let deceasedOccupancyStartDateString;
|
||||
if (masterRow.CM_DECEASED_NAME) {
|
||||
let occupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
|
||||
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
|
||||
const occupancyEndDateString = "";
|
||||
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
||||
if (deceasedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
||||
}
|
||||
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") {
|
||||
occupancyStartDateString = "0001-01-01";
|
||||
if (deceasedOccupancyStartDateString === "" || deceasedOccupancyStartDateString === "0000-00-00") {
|
||||
deceasedOccupancyStartDateString = "0001-01-01";
|
||||
}
|
||||
const lotOccupancyId = addLotOccupancy({
|
||||
occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId,
|
||||
lotId,
|
||||
occupancyStartDateString,
|
||||
occupancyStartDateString: deceasedOccupancyStartDateString,
|
||||
occupancyEndDateString,
|
||||
occupancyTypeFieldIds: ""
|
||||
}, user);
|
||||
|
|
@ -361,7 +365,7 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK1 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK1
|
||||
}, user);
|
||||
|
|
@ -369,13 +373,27 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK2 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK2
|
||||
}, user);
|
||||
}
|
||||
updateLotStatus(lotId, takenLotStatus.lotStatusId, user);
|
||||
}
|
||||
if (masterRow.CM_WORK_ORDER) {
|
||||
const workOrderId = addWorkOrder({
|
||||
workOrderNumber: masterRow.CM_WORK_ORDER,
|
||||
workOrderTypeId: 1,
|
||||
workOrderDescription: "",
|
||||
workOrderOpenDateString: deceasedOccupancyStartDateString || preneedOccupancyStartDateString
|
||||
}, user);
|
||||
if (lotId) {
|
||||
addWorkOrderLot({
|
||||
workOrderId,
|
||||
lotId
|
||||
}, user);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import fs from "node:fs";
|
|||
import papa from "papaparse";
|
||||
|
||||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../data/databasePaths.js";
|
||||
|
|
@ -60,6 +61,14 @@ import {
|
|||
addLotOccupancyTransaction
|
||||
} from "../helpers/lotOccupancyDB/addLotOccupancyTransaction.js";
|
||||
|
||||
import {
|
||||
addWorkOrder
|
||||
} from "../helpers/lotOccupancyDB/addWorkOrder.js";
|
||||
|
||||
import {
|
||||
addWorkOrderLot
|
||||
} from "../helpers/lotOccupancyDB/addWorkOrderLot.js";
|
||||
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
|
||||
|
||||
|
|
@ -229,7 +238,8 @@ const cemeteryToMapName = {
|
|||
"PG": "Pine Grove",
|
||||
"UG": "New Greenwood - Urn Garden",
|
||||
"WK": "West Korah"
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const mapCache: Map < string, recordTypes.Map > = new Map();
|
||||
|
||||
|
|
@ -434,9 +444,11 @@ function importFromMasterCSV() {
|
|||
}, user);
|
||||
}
|
||||
|
||||
let preneedOccupancyStartDateString: string;
|
||||
|
||||
if (masterRow.CM_PRENEED_ORDER) {
|
||||
|
||||
let occupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR,
|
||||
preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR,
|
||||
masterRow.CM_PURCHASE_MON,
|
||||
masterRow.CM_PURCHASE_DAY);
|
||||
|
||||
|
|
@ -449,25 +461,25 @@ function importFromMasterCSV() {
|
|||
}
|
||||
|
||||
// if purchase date unavailable
|
||||
if (occupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") {
|
||||
occupancyStartDateString = occupancyEndDateString;
|
||||
if (preneedOccupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") {
|
||||
preneedOccupancyStartDateString = occupancyEndDateString;
|
||||
}
|
||||
|
||||
// if end date unavailable
|
||||
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR,
|
||||
if (preneedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR,
|
||||
masterRow.CM_DEATH_MON,
|
||||
masterRow.CM_DEATH_DAY);
|
||||
}
|
||||
|
||||
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") {
|
||||
occupancyStartDateString = "0001-01-01";
|
||||
if (preneedOccupancyStartDateString === "" || preneedOccupancyStartDateString === "0000-00-00") {
|
||||
preneedOccupancyStartDateString = "0001-01-01";
|
||||
}
|
||||
|
||||
const lotOccupancyId = addLotOccupancy({
|
||||
occupancyTypeId: preneedOccupancyType.occupancyTypeId,
|
||||
lotId,
|
||||
occupancyStartDateString,
|
||||
occupancyStartDateString: preneedOccupancyStartDateString,
|
||||
occupancyEndDateString,
|
||||
occupancyTypeFieldIds: ""
|
||||
}, user);
|
||||
|
|
@ -489,7 +501,7 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK1 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: preneedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK1
|
||||
}, user);
|
||||
|
|
@ -498,7 +510,7 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK2 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: preneedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK2
|
||||
}, user);
|
||||
|
|
@ -509,29 +521,31 @@ function importFromMasterCSV() {
|
|||
}
|
||||
}
|
||||
|
||||
let deceasedOccupancyStartDateString: string;
|
||||
|
||||
if (masterRow.CM_DECEASED_NAME) {
|
||||
|
||||
let occupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR,
|
||||
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR,
|
||||
masterRow.CM_INTERMENT_MON,
|
||||
masterRow.CM_INTERMENT_DAY);
|
||||
|
||||
const occupancyEndDateString = "";
|
||||
|
||||
// if interment date unavailable
|
||||
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR,
|
||||
if (deceasedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
||||
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR,
|
||||
masterRow.CM_DEATH_MON,
|
||||
masterRow.CM_DEATH_DAY);
|
||||
}
|
||||
|
||||
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") {
|
||||
occupancyStartDateString = "0001-01-01";
|
||||
if (deceasedOccupancyStartDateString === "" || deceasedOccupancyStartDateString === "0000-00-00") {
|
||||
deceasedOccupancyStartDateString = "0001-01-01";
|
||||
}
|
||||
|
||||
const lotOccupancyId = addLotOccupancy({
|
||||
occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId,
|
||||
lotId,
|
||||
occupancyStartDateString,
|
||||
occupancyStartDateString: deceasedOccupancyStartDateString,
|
||||
occupancyEndDateString,
|
||||
occupancyTypeFieldIds: ""
|
||||
}, user);
|
||||
|
|
@ -644,7 +658,7 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK1 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK1
|
||||
}, user);
|
||||
|
|
@ -653,7 +667,7 @@ function importFromMasterCSV() {
|
|||
if (masterRow.CM_REMARK2 !== "") {
|
||||
addLotOccupancyComment({
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentDateString: occupancyStartDateString,
|
||||
lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
|
||||
lotOccupancyCommentTimeString: "00:00",
|
||||
lotOccupancyComment: masterRow.CM_REMARK2
|
||||
}, user);
|
||||
|
|
@ -661,6 +675,23 @@ function importFromMasterCSV() {
|
|||
|
||||
updateLotStatus(lotId, takenLotStatus.lotStatusId, user);
|
||||
}
|
||||
|
||||
if (masterRow.CM_WORK_ORDER) {
|
||||
|
||||
const workOrderId = addWorkOrder({
|
||||
workOrderNumber: masterRow.CM_WORK_ORDER,
|
||||
workOrderTypeId: 1,
|
||||
workOrderDescription: "",
|
||||
workOrderOpenDateString: deceasedOccupancyStartDateString || preneedOccupancyStartDateString
|
||||
}, user);
|
||||
|
||||
if (lotId) {
|
||||
addWorkOrderLot({
|
||||
workOrderId,
|
||||
lotId
|
||||
}, user);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
|
|
|
|||
|
|
@ -190,6 +190,18 @@ export interface WorkOrderType extends Record {
|
|||
workOrderType?: string;
|
||||
orderNumber?: number;
|
||||
}
|
||||
export interface WorkOrder extends Record {
|
||||
workOrderId?: number;
|
||||
workOrderTypeId?: number;
|
||||
workOrderType?: string;
|
||||
workOrderNumber?: string;
|
||||
workOrderDescription?: string;
|
||||
workOrderOpenDate?: number;
|
||||
workOrderOpenDateString?: string;
|
||||
workOrderCloseDate?: number;
|
||||
workOrderCloseDateString?: string;
|
||||
workOrderLots?: Lot[];
|
||||
}
|
||||
export interface User {
|
||||
userName: string;
|
||||
userProperties?: UserProperties;
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
export {};
|
||||
|
|
|
|||
|
|
@ -265,7 +265,7 @@ export interface LotOccupancy extends Record {
|
|||
|
||||
|
||||
/*
|
||||
* WORK ORDER TYPES
|
||||
* WORK ORDERS
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -276,6 +276,25 @@ export interface WorkOrderType extends Record {
|
|||
}
|
||||
|
||||
|
||||
export interface WorkOrder extends Record {
|
||||
workOrderId?: number;
|
||||
|
||||
workOrderTypeId?: number;
|
||||
workOrderType?: string;
|
||||
|
||||
workOrderNumber?: string;
|
||||
workOrderDescription?: string;
|
||||
|
||||
workOrderOpenDate?: number;
|
||||
workOrderOpenDateString?: string;
|
||||
|
||||
workOrderCloseDate?: number;
|
||||
workOrderCloseDateString?: string;
|
||||
|
||||
workOrderLots?: Lot[];
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* USER TYPES
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -25,7 +25,34 @@
|
|||
</div>
|
||||
<% } %>
|
||||
|
||||
<div class="box">
|
||||
<form id="form--searchFilters">
|
||||
<input id="searchFilter--limit" name="limit" type="hidden" value="100" />
|
||||
<input id="searchFilter--offset" name="offset" type="hidden" value="0" />
|
||||
|
||||
<div class="field">
|
||||
<label class="label" for="searchFilter--workOrderTypeId">Work Order Type</label>
|
||||
<div class="control has-icons-left">
|
||||
<div class="select is-fullwidth">
|
||||
<select id="searchFilter--workOrderTypeId" name="workOrderTypeId">
|
||||
<option value="">(All Work Order Types Types)</option>
|
||||
<% for (const workOrderType of workOrderTypes) { %>
|
||||
<option value="<%= workOrderType.workOrderTypeId %>"><%= workOrderType.workOrderType || "(No Name)" %></option>
|
||||
<% } %>
|
||||
</select>
|
||||
</div>
|
||||
<span class="icon is-small is-left">
|
||||
<i class="fas fa-search" aria-hidden="true"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="container--searchResults"></div>
|
||||
|
||||
<%- include('_footerA'); -%>
|
||||
|
||||
<script src="<%= urlPrefix %>/javascripts/workOrderSearch.min.js"></script>
|
||||
|
||||
<%- include('_footerB'); -%>
|
||||
Loading…
Reference in New Issue